diff options
Diffstat (limited to 'src/actions.c')
-rw-r--r-- | src/actions.c | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/src/actions.c b/src/actions.c index c0fc569..4bfe639 100644 --- a/src/actions.c +++ b/src/actions.c @@ -83,6 +83,7 @@ static cmdret * set_historycompaction (struct cmdarg **args); static cmdret * set_historyexpansion (struct cmdarg **args); static cmdret * set_msgwait(struct cmdarg **args); static cmdret * set_framemsgwait(struct cmdarg **args); +static cmdret * set_confirmquit(struct cmdarg **args); LIST_HEAD(set_vars); @@ -154,6 +155,7 @@ init_set_vars(void) add_set_var ("historyexpansion", set_historyexpansion, 1, "", arg_NUMBER); add_set_var ("msgwait", set_msgwait, 1, "", arg_NUMBER); add_set_var ("framemsgwait", set_framemsgwait, 1, "", arg_NUMBER); + add_set_var ("confirmquit", set_confirmquit, 1, "", arg_NUMBER); } /* rp_keymaps is ratpoison's list of keymaps. */ @@ -188,6 +190,41 @@ add_command (char *name, cmdret * (*fn)(int, struct cmdarg **), int nargs, int i list_add (&cmd->node, &user_commands); } +static void +modify_command (char *name, cmdret * (*fn)(int, struct cmdarg **), int nargs, int i_nrequired, int ni_nrequired, ...) +{ + int i = 0; + struct user_command *cmd; + va_list va; + struct user_command *cur; + + cmd = xmalloc (sizeof (struct user_command)); + cmd->name = name; + cmd->func = fn; + cmd->num_args = nargs; + cmd->ni_required_args = ni_nrequired; + cmd->i_required_args = i_nrequired; + cmd->args = nargs ? xmalloc (nargs * sizeof (struct argspec)) : NULL; + + /* Remove existing command */ + list_for_each_entry (cur, &user_commands, node) + { + if(&cur->func == &cmd->func) + list_del_init(&(cur->node)); + } + + /* Fill cmd->args */ + va_start(va, ni_nrequired); + for (i=0; i<nargs; i++) + { + cmd->args[i].prompt = va_arg(va, char*); + cmd->args[i].type = va_arg(va, int); + } + va_end(va); + + /* Add updated command */ + list_add (&cmd->node, &user_commands); +} static void user_command_free(struct user_command *cmd) @@ -314,7 +351,8 @@ init_user_commands(void) add_command ("other", cmd_other, 0, 0, 0); add_command ("prev", cmd_prev, 0, 0, 0); add_command ("prevscreen", cmd_prevscreen, 0, 0, 0); - add_command ("quit", cmd_quit, 0, 0, 0); + add_command ("quit", cmd_quit, 1, 0, 0, + "Really quit? (yes/no): ", arg_STRING); add_command ("ratinfo", cmd_ratinfo, 0, 0, 0); add_command ("ratrelinfo", cmd_ratrelinfo, 0, 0, 0); add_command ("banishrel", cmd_banishrel, 0, 0, 0); @@ -2747,7 +2785,18 @@ cmd_newwm(int interactive UNUSED, struct cmdarg **args) cmdret * cmd_quit(int interactive UNUSED, struct cmdarg **args UNUSED) { - kill_signalled = 1; + const char *confirm = (args[0] ? ARG_STRING(0) : NULL); + + if(defaults.confirm_on_quit) { + if(str_comp((char *) confirm, "yes", 3) && (strlen(confirm)==3)) { + kill_signalled = 1; + } else { + return cmdret_new (RET_FAILURE, "Aborting quit command."); + } + } else { + kill_signalled = 1; + } + return cmdret_new (RET_SUCCESS, NULL); } @@ -4237,6 +4286,23 @@ set_bwcolor (struct cmdarg **args) return cmdret_new (RET_SUCCESS, NULL); } +static cmdret * +set_confirmquit (struct cmdarg **args) +{ + if (args[0] == NULL) + return cmdret_new (RET_SUCCESS, "%d", defaults.confirm_on_quit); + + if (ARG(0,number) < 0) + return cmdret_new (RET_FAILURE, "confirm_on_quit: %s", invalid_negative_arg); + else + defaults.confirm_on_quit = ARG(0,number); + + modify_command ("quit", cmd_quit, 1, (defaults.confirm_on_quit ? 1 : 0), 0, + "Really quit? (yes/no): ", arg_STRING); + + return cmdret_new (RET_SUCCESS, NULL); +} + cmdret * cmd_setenv (int interactive UNUSED, struct cmdarg **args) { |