Remove buggy xterm workaround in tui_dispatch_ctrl_char()
authorPatrick Palka <patrick@parcs.ath.cx>
Wed, 13 May 2015 20:26:48 +0000 (16:26 -0400)
committerPatrick Palka <patrick@parcs.ath.cx>
Thu, 14 May 2015 12:18:06 +0000 (08:18 -0400)
The function tui_dispatch_ctrl_char() has an old workaround (from 1999)
for buggy terminals and/or ncurses library that don't return page
up/down keys as single characters.  Because the workaround is so old, I
think the bug it is targetting is no longer relevant anymore.

But more importantly, the workaround is itself buggy: it 1) performs a
blocking call to wgetch() and 2) if the key returned by wgetch() does
not make up a relevant key sequence it throws away the input instead of
pushing it back via ungetch().  And indeed the workaround breaks Alt-key
sequences under TERM=xterm because of bug #2.

So this patch removes the buggy workaround and tidies up the function
accordingly.

I personally tested this change on a recent xterm (with TERM=xterm) in
Fedora 20 and had no problems with having ncurses properly interpret
page up/down keys.  And Alt-key sequences now work when TERM=xterm too.

gdb/ChangeLog:

* tui/tui-command.c: Remove include of <ctype.h>.
(tui_dispatch_ctrl_char): Remove workaround for xterm terminals.

gdb/ChangeLog
gdb/tui/tui-command.c

index b645eba..5fd5686 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-14  Patrick Palka  <patrick@parcs.ath.cx>
+
+       * tui/tui-command.c: Remove include of <ctype.h>.
+       (tui_dispatch_ctrl_char): Remove workaround for xterm terminals.
+
 2015-05-13  Martin Galvan  <martin.galvan@tallertechnologies.com>
 
        * dwarf2read.c (die_needs_namespace): Return 1 for
@@ -87,7 +92,7 @@
 
        * tui/tui-win.c (tui_async_resize_screen): Clear win_resized
        first before resizing the window.
-       * tui.c (tui_enable): Likewise.
+       * tui/tui.c (tui_enable): Likewise.
 
 2015-05-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
index 3551063..03ec076 100644 (file)
@@ -20,7 +20,6 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include <ctype.h>
 #include "tui/tui.h"
 #include "tui/tui-data.h"
 #include "tui/tui-win.h"
@@ -54,80 +53,40 @@ tui_dispatch_ctrl_char (unsigned int ch)
      on through and do nothing here.  */
   if (win_info == NULL || win_info == TUI_CMD_WIN)
     return ch;
-  else
+
+  switch (ch)
     {
-      unsigned int c = 0, ch_copy = ch;
-      int i;
-      char *term;
-
-      /* If this is an xterm, page next/prev keys aren't returned by
-         keypad as a single char, so we must handle them here.  Seems
-         like a bug in the curses library?  */
-      term = (char *) getenv ("TERM");
-      if (term)
-       {
-         for (i = 0; term[i]; i++)
-           term[i] = toupper (term[i]);
-         if ((strcmp (term, "XTERM") == 0) 
-             && key_is_start_sequence (ch))
-           {
-             unsigned int page_ch = 0;
-             unsigned int tmp_char;
-              WINDOW *w = TUI_CMD_WIN->generic.handle;
-
-             tmp_char = 0;
-             while (!key_is_end_sequence (tmp_char))
-               {
-                 tmp_char = (int) wgetch (w);
-                 if (tmp_char == ERR)
-                   {
-                     return ch;
-                   }
-                 if (!tmp_char)
-                   break;
-                 if (tmp_char == 53)
-                   page_ch = KEY_PPAGE;
-                 else if (tmp_char == 54)
-                   page_ch = KEY_NPAGE;
-                 else
-                   {
-                     return 0;
-                   }
-               }
-             ch_copy = page_ch;
-           }
-       }
-
-      switch (ch_copy)
-       {
-       case KEY_NPAGE:
-         tui_scroll_forward (win_info, 0);
-         break;
-       case KEY_PPAGE:
-         tui_scroll_backward (win_info, 0);
-         break;
-       case KEY_DOWN:
-       case KEY_SF:
-         tui_scroll_forward (win_info, 1);
-         break;
-       case KEY_UP:
-       case KEY_SR:
-         tui_scroll_backward (win_info, 1);
-         break;
-       case KEY_RIGHT:
-         tui_scroll_left (win_info, 1);
-         break;
-       case KEY_LEFT:
-         tui_scroll_right (win_info, 1);
-         break;
-       case '\f':
-          break;
-       default:
-         c = ch_copy;
-         break;
-       }
-      return c;
+    case KEY_NPAGE:
+      tui_scroll_forward (win_info, 0);
+      break;
+    case KEY_PPAGE:
+      tui_scroll_backward (win_info, 0);
+      break;
+    case KEY_DOWN:
+    case KEY_SF:
+      tui_scroll_forward (win_info, 1);
+      break;
+    case KEY_UP:
+    case KEY_SR:
+      tui_scroll_backward (win_info, 1);
+      break;
+    case KEY_RIGHT:
+      tui_scroll_left (win_info, 1);
+      break;
+    case KEY_LEFT:
+      tui_scroll_right (win_info, 1);
+      break;
+    case '\f':
+      break;
+    default:
+      /* We didn't recognize the character as a control character, so pass it
+         through.  */
+      return ch;
     }
+
+  /* We intercepted the control character, so return 0 (which readline
+     will interpret as a no-op).  */
+  return 0;
 }
 
 /* See tui-command.h.  */