From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8341 invoked by alias); 25 Aug 2002 22:24:10 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 8269 invoked from network); 25 Aug 2002 22:24:09 -0000 Received: from unknown (HELO mallaury.noc.nerim.net) (62.4.17.82) by sources.redhat.com with SMTP; 25 Aug 2002 22:24:09 -0000 Received: from nerim.fr (stcarrez.net1.nerim.net [62.212.108.40]) by mallaury.noc.nerim.net (Postfix) with ESMTP id 97CC962E6A; Mon, 26 Aug 2002 00:21:52 +0200 (CEST) Message-ID: <3D69749F.6070101@nerim.fr> Date: Sun, 25 Aug 2002 15:25:00 -0000 From: Stephane Carrez User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 X-Accept-Language: en-us MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [PATCH]: Provide TUI fast key action with specific readline keymap Content-Type: multipart/mixed; boundary="------------060103080801080700010704" X-SW-Source: 2002-08/txt/msg00841.txt.bz2 This is a multi-part message in MIME format. --------------060103080801080700010704 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1687 Hi! This patch improves the TUI mode by creating a specific readline keymap that can be installed to bind a single key to a gdb command. The fast key mode is entered when CTRL-X CTRL-O is entered. Then, the keys are bound as follows: c continue d down f finish n next r run s step u up v info locals w where x exit the fast key mode, go back to normal readline+gdb prompt Hitting a single key will execute the gdb command. Other keys temporarily switch the keymap to use the readline+gdb prompt so that a full gdb command can be entered. Once the command is entered (\n) the fast key mode is restored. I'll commit this patch in a few days unless there is some objection. Stephane 2002-08-26 Stephane Carrez * tui.c (tui_commands): Table of single key commands. (tui_rl_command_key): New function to execute gdb command. (tui_rl_command_mode): New function to leave fast key mode temporarily. (tui_rl_next_keymap): New function to enter/leave the fast key mode. (tui_rl_startup_hook): New function to avoid prompt display by readline functions. (tui_enter_key_mode): New function to enter fast key. (tui_leave_key_mode): New function to leave it. (tui_initialize_readline): Create TUI fast key readline map. (tui_enable): Install rl_startup_hook. (tui_disable): Remove it. * tui.h (tui_leave_key_mode): Declare. (tui_enter_key_mode): Declare. (tui_single_key_mode): Declare. * tuiIO.c (tui_after_char_processing_restart_key_mode): New function. (tui_redisplay_readline): Don't display the prompt in fast key mode. (tui_getc): When \n is received, re-enter fast key mode if we left it temporarily. --------------060103080801080700010704 Content-Type: text/plain; name="tui-readline.diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tui-readline.diffs" Content-length: 7368 Index: tui.c =================================================================== RCS file: /cvs/src/src/gdb/tui/tui.c,v retrieving revision 1.21 diff -u -p -r1.21 tui.c --- tui.c 25 Aug 2002 21:44:41 -0000 1.21 +++ tui.c 25 Aug 2002 22:02:55 -0000 @@ -72,7 +72,35 @@ int tui_active = 0; static int tui_finish_init = 1; -/* Switch the output mode between TUI/standard gdb. */ +int tui_single_key_mode = 0; + +struct tui_char_command +{ + unsigned char key; + char* cmd; +}; + +/* Key mapping to gdb commands when the TUI is using the single key mode. */ +struct tui_char_command tui_commands[] = { + { 's', "step" }, + { 'n', "next" }, + { 'c', "continue" }, + { 'u', "up" }, + { 'd', "down" }, + { 'f', "finish" }, + { 'r', "run" }, + { 'v', "info locals" }, + { 'w', "where" }, + { 0, 0 }, +}; + +static Keymap tui_keymap; +static Keymap tui_ctlx_keymap; +static Keymap tui_readline_standard_keymap; +static Keymap tui_readline_ctrlx_keymap; + +/* TUI readline command. + Switch the output mode between TUI/standard gdb. */ static int tui_rl_switch_mode (void) { @@ -193,19 +221,132 @@ tui_rl_delete_other_windows (void) return 0; } +/* TUI readline command. + Execute the gdb command bound to the specified key. */ +static int +tui_rl_command_key (int count, int key) +{ + int i; + + reinitialize_more_filter (); + for (i = 0; tui_commands[i].cmd; i++) + { + if (tui_commands[i].key == key) + { + execute_command (tui_commands[i].cmd, TRUE); + return 0; + } + } + return 0; +} + +/* TUI readline command. + Temporarily leave the TUI fast key mode to allow editing + of a gdb command with the normal readline. Once the command + is executed, the TUI fast key mode is installed back. */ +static int +tui_rl_command_mode (int count, int key) +{ + tui_single_key_mode = 2; + rl_set_keymap (tui_readline_standard_keymap); + tuiShowLocatorContent (); + return rl_insert (count, key); +} + + +/* TUI readline command. + Switch between TUI fast key mode and gdb readline editing. */ +static int +tui_rl_next_keymap (void) +{ + if (tui_single_key_mode == 0) + tui_enter_key_mode (); + else + tui_leave_key_mode (); + tuiShowLocatorContent (); + return 0; +} + +int +tui_rl_startup_hook () +{ + rl_already_prompted = (tui_single_key_mode != 0); + if (rl_already_prompted) + { + tui_single_key_mode = 1; + tui_redisplay_readline (); + } + return 0; +} + +/* Enter in the TUI fast key mode. */ +void +tui_enter_key_mode () +{ + tui_single_key_mode = 1; + rl_set_keymap (tui_keymap); + tuiShowLocatorContent (); +} + +/* Leave the TUI fast key mode to use the gdb plain readline. */ +void +tui_leave_key_mode () +{ + tui_single_key_mode = 0; + rl_set_keymap (tui_readline_standard_keymap); +} + /* Initialize readline and configure the keymap for the switching key shortcut. */ void tui_initialize_readline () { + int i; + rl_initialize (); rl_add_defun ("tui-switch-mode", tui_rl_switch_mode, -1); + rl_add_defun ("gdb-command", tui_rl_command_key, -1); + rl_add_defun ("next-keymap", tui_rl_next_keymap, -1); + + tui_keymap = rl_make_bare_keymap (); + tui_ctlx_keymap = rl_make_bare_keymap (); + + for (i = 0; tui_commands[i].cmd; i++) + rl_bind_key_in_map (tui_commands[i].key, tui_rl_command_key, tui_keymap); + + rl_generic_bind (ISKMAP, "\\C-x", (char*) tui_ctlx_keymap, tui_keymap); + + for (i = ' ' + 1; i < 0x7f; i++) + { + int j; + + for (j = 0; tui_commands[j].cmd; j++) + if (tui_commands[j].key == i) + break; + + if (tui_commands[j].cmd) + continue; + + rl_bind_key_in_map (i, tui_rl_command_mode, tui_keymap); + } + rl_bind_key_in_map ('a', tui_rl_switch_mode, emacs_ctlx_keymap); + rl_bind_key_in_map ('a', tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map ('A', tui_rl_switch_mode, emacs_ctlx_keymap); + rl_bind_key_in_map ('A', tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, emacs_ctlx_keymap); + rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map ('1', tui_rl_delete_other_windows, emacs_ctlx_keymap); + rl_bind_key_in_map ('1', tui_rl_delete_other_windows, tui_ctlx_keymap); rl_bind_key_in_map ('2', tui_rl_change_windows, emacs_ctlx_keymap); + rl_bind_key_in_map ('2', tui_rl_change_windows, tui_ctlx_keymap); + + tui_readline_standard_keymap = rl_get_keymap (); + tui_readline_ctrlx_keymap = rl_make_bare_keymap (); + + rl_bind_key_in_map ('x', tui_rl_next_keymap, tui_keymap); + rl_bind_key_in_map (CTRL ('O'), tui_rl_next_keymap, emacs_ctlx_keymap); } /* Enter in the tui mode (curses). @@ -255,6 +396,7 @@ tui_enable (void) /* Install the TUI specific hooks. */ tui_install_hooks (); + rl_startup_hook = tui_rl_startup_hook; tui_update_variables (); @@ -281,6 +423,8 @@ tui_disable (void) /* Remove TUI hooks. */ tui_remove_hooks (); + rl_startup_hook = 0; + rl_already_prompted = 0; /* Leave curses and restore previous gdb terminal setting. */ endwin (); Index: tui.h =================================================================== RCS file: /cvs/src/src/gdb/tui/tui.h,v retrieving revision 1.14 diff -u -p -r1.14 tui.h --- tui.h 25 Aug 2002 19:19:50 -0000 1.14 +++ tui.h 25 Aug 2002 22:02:55 -0000 @@ -84,6 +84,8 @@ TuiWinType, *TuiWinTypePtr; } TuiPoint, *TuiPointPtr; +extern int tui_single_key_mode; + /* GENERAL TUI FUNCTIONS */ /* tui.c */ extern void tuiFree (char *); @@ -101,6 +103,12 @@ extern void tui_enable (void); /* Leave the tui mode. */ extern void tui_disable (void); + +/* Leave the TUI fast key mode to use the gdb plain readline. */ +extern void tui_leave_key_mode (void); + +/* Enter in the TUI fast key mode. */ +extern void tui_enter_key_mode (void); extern void tui_initialize_io (void); Index: tuiIO.c =================================================================== RCS file: /cvs/src/src/gdb/tui/tuiIO.c,v retrieving revision 1.12 diff -u -p -r1.12 tuiIO.c --- tuiIO.c 1 Mar 2002 06:19:28 -0000 1.12 +++ tuiIO.c 25 Aug 2002 22:02:55 -0000 @@ -55,6 +55,7 @@ #include "tuiGeneralWin.h" #include "tui-file.h" #include "ui-out.h" +#include "event-top.h" #include "cli-out.h" #include #include @@ -144,10 +145,17 @@ tui_puts (const char *string) fflush (stdout); } +static void +tui_after_char_processing_restart_key_mode (void) +{ + after_char_processing_hook = 0; + tui_enter_key_mode (); +} + /* Readline callback. Redisplay the command line with its prompt after readline has changed the edited text. */ -static void +void tui_redisplay_readline (void) { int prev_col; @@ -160,7 +168,10 @@ tui_redisplay_readline (void) char *prompt; int start_line; - prompt = get_prompt (); + if (tui_single_key_mode == 1) + prompt = ""; + else + prompt = get_prompt (); c_pos = -1; c_line = -1; @@ -432,7 +443,10 @@ tui_getc (FILE *fp) { /* Handle prev/next/up/down here */ ch = tuiDispatchCtrlChar (ch); } - + + if (ch == '\n' && tui_single_key_mode == 2) + after_char_processing_hook = tui_after_char_processing_restart_key_mode; + if (ch == '\n' || ch == '\r' || ch == '\f') cmdWin->detail.commandInfo.curch = 0; #if 0 --------------060103080801080700010704--