This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Remove buggy xterm workaround in tui_dispatch_ctrl_char()


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e3555239e04fa6dba2a165b3b52598a880474a22

commit e3555239e04fa6dba2a165b3b52598a880474a22
Author: Patrick Palka <patrick@parcs.ath.cx>
Date:   Wed May 13 16:26:48 2015 -0400

    Remove buggy xterm workaround in tui_dispatch_ctrl_char()
    
    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.

Diff:
---
 gdb/ChangeLog         |   7 +++-
 gdb/tui/tui-command.c | 105 +++++++++++++++-----------------------------------
 2 files changed, 38 insertions(+), 74 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b645eba..5fd5686 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
 
diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c
index 3551063..03ec076 100644
--- a/gdb/tui/tui-command.c
+++ b/gdb/tui/tui-command.c
@@ -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.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]