From 09cbd0c695cdd953834a46d161f6d3b0bf385c1c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 13 Aug 2009 23:44:18 +0000 Subject: [PATCH] Switch the prompt code to return an empty string when the user enters no response and reserve NULL for an explicit cancel. Change all callbacks to treat them the same so no functional change. Also add cancel key bindings to emacs mode which were missing. --- cmd-command-prompt.c | 2 +- cmd-confirm-before.c | 4 +++- cmd-select-prompt.c | 2 +- mode-key.c | 2 ++ status.c | 11 ++++------- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c index f729a66e..dac334b2 100644 --- a/cmd-command-prompt.c +++ b/cmd-command-prompt.c @@ -112,7 +112,7 @@ cmd_command_prompt_callback(void *data, const char *s) char *cause, *ptr, *buf, ch; size_t len, slen; - if (s == NULL) + if (s == NULL || *s == '\0') return (0); slen = strlen(s); diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index db799a4b..fd366b9b 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -107,7 +107,9 @@ cmd_confirm_before_callback(void *data, const char *s) struct cmd_ctx ctx; char *cause; - if (s == NULL || tolower((u_char) s[0]) != 'y' || s[1] != '\0') + if (s == NULL || *s == '\0') + return (0); + if (tolower((u_char) s[0]) != 'y' || s[1] != '\0') return (0); if (cmd_string_parse(cdata->cmd, &cmdlist, &cause) != 0) { diff --git a/cmd-select-prompt.c b/cmd-select-prompt.c index a7965e29..bead0619 100644 --- a/cmd-select-prompt.c +++ b/cmd-select-prompt.c @@ -66,7 +66,7 @@ cmd_select_prompt_callback(void *data, const char *s) char msg[128]; u_int idx; - if (s == NULL) + if (s == NULL || *s == '\0') return (0); idx = strtonum(s, 0, UINT_MAX, &errstr); diff --git a/mode-key.c b/mode-key.c index 6ceb01b6..d36504fd 100644 --- a/mode-key.c +++ b/mode-key.c @@ -181,6 +181,7 @@ struct mode_key_tree mode_key_tree_vi_copy; const struct mode_key_entry mode_key_emacs_edit[] = { { '\001' /* C-a */, 0, MODEKEYEDIT_STARTOFLINE }, { '\002' /* C-p */, 0, MODEKEYEDIT_CURSORLEFT }, + { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL }, { '\004' /* C-d */, 0, MODEKEYEDIT_DELETE }, { '\005' /* C-e */, 0, MODEKEYEDIT_ENDOFLINE }, { '\006' /* C-f */, 0, MODEKEYEDIT_CURSORRIGHT }, @@ -190,6 +191,7 @@ const struct mode_key_entry mode_key_emacs_edit[] = { { '\016' /* C-n */, 0, MODEKEYEDIT_HISTORYDOWN }, { '\020' /* C-p */, 0, MODEKEYEDIT_HISTORYUP }, { '\031' /* C-y */, 0, MODEKEYEDIT_PASTE }, + { '\033' /* Escape */, 0, MODEKEYEDIT_CANCEL }, { '\r', 0, MODEKEYEDIT_ENTER }, { 'm' | KEYC_ESCAPE, 0, MODEKEYEDIT_STARTOFLINE }, { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE }, diff --git a/status.c b/status.c index 47a5d8e4..c42dc896 100644 --- a/status.c +++ b/status.c @@ -920,14 +920,11 @@ status_prompt_key(struct client *c, int key) c->flags |= CLIENT_STATUS; break; case MODEKEYEDIT_ENTER: - if (*c->prompt_buffer != '\0') { + if (*c->prompt_buffer != '\0') status_prompt_add_history(c); - if (c->prompt_callbackfn( - c->prompt_data, c->prompt_buffer) == 0) - status_prompt_clear(c); - break; - } - /* FALLTHROUGH */ + if (c->prompt_callbackfn(c->prompt_data, c->prompt_buffer) == 0) + status_prompt_clear(c); + break; case MODEKEYEDIT_CANCEL: if (c->prompt_callbackfn(c->prompt_data, NULL) == 0) status_prompt_clear(c);