Intercept and handle Delete/Home/End keys in the TUI

Message ID 1433374131-30902-1-git-send-email-patrick@parcs.ath.cx
State New, archived
Headers

Commit Message

Patrick Palka June 3, 2015, 11:28 p.m. UTC
  These keys are mapped by wgetch() to special ncurses-specific values and
are otherwise passed through to readline, to no useful effect.

This patch intercepts these keys in the TUI and gives them their
expected function.

gdb/ChangeLog:

	* tui/tui-command.c: Include "readline/readline.h".
	(tui_dispatch_ctrl_char): Handle KEY_DC, KEY_HOME and KEY_END.
---
 gdb/tui/tui-command.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
  

Comments

Patrick Palka June 3, 2015, 11:55 p.m. UTC | #1
On Wed, Jun 3, 2015 at 7:28 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
> These keys are mapped by wgetch() to special ncurses-specific values and
> are otherwise passed through to readline, to no useful effect.
>
> This patch intercepts these keys in the TUI and gives them their
> expected function.

The commit message is slightly misleading.  These keys work as
expected when the command window is in focus.  But when another window
is in focus, these keys currently have no function.  This patch gives
them their expected function when the command window is not in focus.

Alternatively when the command window is not in focus the Home and
Delete keys could be given the function of scrolling the source/disasm
windows all the way up or down.  Personally I don't think that is very
useful.  I think the traditional binding would probably see more use.

Nonetheless I will reword the commit message to mention the focus aspect.

>
> gdb/ChangeLog:
>
>         * tui/tui-command.c: Include "readline/readline.h".
>         (tui_dispatch_ctrl_char): Handle KEY_DC, KEY_HOME and KEY_END.
> ---
>  gdb/tui/tui-command.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c
> index 03ec076..84ba2b7 100644
> --- a/gdb/tui/tui-command.c
> +++ b/gdb/tui/tui-command.c
> @@ -27,6 +27,7 @@
>  #include "tui/tui-command.h"
>
>  #include "gdb_curses.h"
> +#include "readline/readline.h"
>  /*****************************************
>  ** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
>  ******************************************/
> @@ -76,6 +77,15 @@ tui_dispatch_ctrl_char (unsigned int ch)
>      case KEY_LEFT:
>        tui_scroll_right (win_info, 1);
>        break;
> +    case KEY_DC:
> +      rl_delete (1, ch);
> +      break;
> +    case KEY_HOME:
> +      rl_point = 0;
> +      break;
> +    case KEY_END:
> +      rl_point = rl_end;
> +      break;
>      case '\f':
>        break;
>      default:
> --
> 2.4.2.387.gf86f31a.dirty
>
  
Pedro Alves June 10, 2015, 3:28 p.m. UTC | #2
On 06/04/2015 12:55 AM, Patrick Palka wrote:
> On Wed, Jun 3, 2015 at 7:28 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
>> These keys are mapped by wgetch() to special ncurses-specific values and
>> are otherwise passed through to readline, to no useful effect.
>>
>> This patch intercepts these keys in the TUI and gives them their
>> expected function.
> 
> The commit message is slightly misleading.  These keys work as
> expected when the command window is in focus.  But when another window
> is in focus, these keys currently have no function.  This patch gives
> them their expected function when the command window is not in focus.

I'd think it very natural that given that Up, Down, Left, Right, PageUp/PageDown
all scroll the source window, so should Home/End.  When the console window is
not on focus, we can use ctrl-a / ctrl-e to move to start/end of line,
just like we use ctrl-p/ctrl-n to go "up/down" in history.

> 
> Alternatively when the command window is not in focus the Home and
> Delete keys could be given the function of scrolling the source/disasm
> windows all the way up or down.

Yes, that.

> Personally I don't think that is very useful.  I think the traditional binding
> would probably see more use.

I do not agree.  I know I'd give lots of use to Home jumping to the
start of the file myself.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c
index 03ec076..84ba2b7 100644
--- a/gdb/tui/tui-command.c
+++ b/gdb/tui/tui-command.c
@@ -27,6 +27,7 @@ 
 #include "tui/tui-command.h"
 
 #include "gdb_curses.h"
+#include "readline/readline.h"
 /*****************************************
 ** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
 ******************************************/
@@ -76,6 +77,15 @@  tui_dispatch_ctrl_char (unsigned int ch)
     case KEY_LEFT:
       tui_scroll_right (win_info, 1);
       break;
+    case KEY_DC:
+      rl_delete (1, ch);
+      break;
+    case KEY_HOME:
+      rl_point = 0;
+      break;
+    case KEY_END:
+      rl_point = rl_end;
+      break;
     case '\f':
       break;
     default: