From 646d6a929c81adbb978f88e14ff9b27dee0463d0 Mon Sep 17 00:00:00 2001
From: Tiago Cunha <tcunha@gmx.com>
Date: Sun, 16 Aug 2009 19:29:24 +0000
Subject: [PATCH] Sync OpenBSD patchset 261:

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 |  4 ++--
 cmd-confirm-before.c |  6 ++++--
 cmd-select-prompt.c  |  4 ++--
 mode-key.c           |  4 +++-
 status.c             | 13 +++++--------
 5 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index c7da9a2f..6d76b315 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-command-prompt.c,v 1.21 2009-07-28 22:12:16 tcunha Exp $ */
+/* $Id: cmd-command-prompt.c,v 1.22 2009-08-16 19:29:24 tcunha Exp $ */
 
 /*
  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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 e1db383e..eca42b39 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-confirm-before.c,v 1.9 2009-07-28 22:12:16 tcunha Exp $ */
+/* $Id: cmd-confirm-before.c,v 1.10 2009-08-16 19:29:24 tcunha Exp $ */
 
 /*
  * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -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 182fef92..6f868252 100644
--- a/cmd-select-prompt.c
+++ b/cmd-select-prompt.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-select-prompt.c,v 1.11 2009-07-28 22:12:16 tcunha Exp $ */
+/* $Id: cmd-select-prompt.c,v 1.12 2009-08-16 19:29:24 tcunha Exp $ */
 
 /*
  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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 f4a93cad..05804de2 100644
--- a/mode-key.c
+++ b/mode-key.c
@@ -1,4 +1,4 @@
-/* $Id: mode-key.c,v 1.24 2009-08-16 19:26:49 tcunha Exp $ */
+/* $Id: mode-key.c,v 1.25 2009-08-16 19:29:24 tcunha Exp $ */
 
 /*
  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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 850c513a..a8a7f34b 100644
--- a/status.c
+++ b/status.c
@@ -1,4 +1,4 @@
-/* $Id: status.c,v 1.109 2009-08-09 17:40:17 tcunha Exp $ */
+/* $Id: status.c,v 1.110 2009-08-16 19:29:24 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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);