From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28587 invoked by alias); 31 Aug 2002 12:05:00 -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 28580 invoked from network); 31 Aug 2002 12:04:58 -0000 Received: from unknown (HELO mallaury.noc.nerim.net) (62.4.17.82) by sources.redhat.com with SMTP; 31 Aug 2002 12:04:58 -0000 Received: from nerim.fr (stcarrez.net1.nerim.net [62.212.108.40]) by mallaury.noc.nerim.net (Postfix) with ESMTP id C9294636B8; Sat, 31 Aug 2002 14:03:39 +0200 (CEST) Message-ID: <3D70CCBD.2000903@nerim.fr> Date: Sat, 31 Aug 2002 05:34:00 -0000 From: Stephane Carrez User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 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="------------070801060203010506020305" X-SW-Source: 2002-08/txt/msg01063.txt.bz2 This is a multi-part message in MIME format. --------------070801060203010506020305 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1391 Hi! I've committed this patch to improve the TUI as explained in http://sources.redhat.com/ml/gdb-patches/2002-08/msg00840.html. I changed a little bit the patch to simplify and use an enum to represent the 3 key-mode states (command, SingleKey, one-command then SingleKey). To activate SingleKey, it is bound to C-X S. To leave it, both C-X S and 'q' work. Note: In http://sources.redhat.com/ml/gdb-patches/2002-08/msg00907.html I proposed to use C-X C-S to activate; but C-S is very bad as it's used to stop the terminal output... Stephane 2002-08-31 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 temporarily leave SingleKey. (tui_rl_next_keymap): New function to enter/leave the SingleKey mode. (tui_rl_startup_hook): New function to avoid prompt display by readline functions. (tui_set_key_mode): New function to set the key mode and install the readline keymap. (tui_initialize_readline): Create TUI SingleKey readline map. (tui_enable): Install rl_startup_hook. (tui_disable): Remove it. * tui.h (enum tui_key_mode): Declare. (tui_set_key_mode, tui_current_key_mode): Declare. * tuiIO.c (tui_redisplay_readline): Don't display the prompt in SingleKey mode. * tuiIO.h (tui_redisplay_readline): Declare. --------------070801060203010506020305 Content-Type: text/plain; name="tui-readline-2.diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tui-readline-2.diffs" Content-length: 8387 Index: tui.c =================================================================== RCS file: /cvs/src/src/gdb/tui/tui.c,v retrieving revision 1.23 diff -u -p -r1.23 tui.c --- tui.c 28 Aug 2002 20:33:27 -0000 1.23 +++ tui.c 31 Aug 2002 12:00:44 -0000 @@ -72,7 +72,33 @@ int tui_active = 0; static int tui_finish_init = 1; -/* Switch the output mode between TUI/standard gdb. */ +enum tui_key_mode tui_current_key_mode = tui_command_mode; + +struct tui_char_command +{ + unsigned char key; + const char* cmd; +}; + +/* Key mapping to gdb commands when the TUI is using the single key mode. */ +static const struct tui_char_command tui_commands[] = { + { 'c', "continue" }, + { 'd', "down" }, + { 'f', "finish" }, + { 'n', "next" }, + { 'r', "run" }, + { 's', "step" }, + { 'u', "up" }, + { 'v', "info locals" }, + { 'w', "where" }, + { 0, 0 }, +}; + +static Keymap tui_keymap; +static Keymap tui_readline_standard_keymap; + +/* TUI readline command. + Switch the output mode between TUI/standard gdb. */ static int tui_rl_switch_mode (void) { @@ -193,19 +219,128 @@ 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) + { + /* Must save the command because it can be modified + by execute_command. */ + char* cmd = alloca (strlen (tui_commands[i].cmd) + 1); + strcpy (cmd, tui_commands[i].cmd); + execute_command (cmd, TRUE); + return 0; + } + } + return 0; +} + +/* TUI readline command. + Temporarily leave the TUI SingleKey mode to allow editing + a gdb command with the normal readline. Once the command + is executed, the TUI SingleKey mode is installed back. */ +static int +tui_rl_command_mode (int count, int key) +{ + tui_set_key_mode (tui_one_command_mode); + return rl_insert (count, key); +} + +/* TUI readline command. + Switch between TUI SingleKey mode and gdb readline editing. */ +static int +tui_rl_next_keymap (void) +{ + tui_set_key_mode (tui_current_key_mode == tui_command_mode + ? tui_single_key_mode : tui_command_mode); + return 0; +} + +/* Readline hook to redisplay ourself the gdb prompt. + In the SingleKey mode, the prompt is not printed so that + the command window is cleaner. It will be displayed if + we temporarily leave the SingleKey mode. */ +static int +tui_rl_startup_hook () +{ + rl_already_prompted = (tui_current_key_mode != tui_command_mode); + if (rl_already_prompted) + { + tui_set_key_mode (tui_single_key_mode); + tui_redisplay_readline (); + } + return 0; +} + +/* Change the TUI key mode by installing the appropriate readline keymap. */ +void +tui_set_key_mode (enum tui_key_mode mode) +{ + tui_current_key_mode = mode; + rl_set_keymap (mode == tui_single_key_mode + ? tui_keymap : tui_readline_standard_keymap); + tuiShowLocatorContent (); +} + /* Initialize readline and configure the keymap for the switching key shortcut. */ void tui_initialize_readline () { + int i; + Keymap tui_ctlx_keymap; + 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 (); + tui_readline_standard_keymap = rl_get_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); + + /* Bind all other keys to tui_rl_command_mode so that we switch + temporarily from SingleKey mode and can enter a gdb command. */ + 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); + rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap); + rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap); + rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap); } /* Enter in the tui mode (curses). @@ -255,6 +390,7 @@ tui_enable (void) /* Install the TUI specific hooks. */ tui_install_hooks (); + rl_startup_hook = tui_rl_startup_hook; tui_update_variables (); @@ -284,6 +420,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 31 Aug 2002 12:00:44 -0000 @@ -102,6 +102,23 @@ extern void tui_enable (void); /* Leave the tui mode. */ extern void tui_disable (void); +enum tui_key_mode +{ + /* Plain command mode to enter gdb commands. */ + tui_command_mode, + + /* SingleKey mode with some keys bound to gdb commands. */ + tui_single_key_mode, + + /* Read/edit one command and return to SingleKey after it's processed. */ + tui_one_command_mode +}; + +extern enum tui_key_mode tui_current_key_mode; + +/* Change the TUI key mode by installing the appropriate readline keymap. */ +extern void tui_set_key_mode (enum tui_key_mode mode); + extern void tui_initialize_io (void); extern void tui_initialize_readline (void); Index: tuiIO.c =================================================================== RCS file: /cvs/src/src/gdb/tui/tuiIO.c,v retrieving revision 1.13 diff -u -p -r1.13 tuiIO.c --- tuiIO.c 27 Aug 2002 20:58:27 -0000 1.13 +++ tuiIO.c 31 Aug 2002 12:00:44 -0000 @@ -44,6 +44,7 @@ #include "terminal.h" #include "target.h" #include "event-loop.h" +#include "event-top.h" #include "command.h" #include "top.h" #include "readline/readline.h" @@ -151,7 +152,7 @@ tui_puts (const char *string) /* 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; @@ -164,7 +165,10 @@ tui_redisplay_readline (void) char *prompt; int start_line; - prompt = get_prompt (); + if (tui_current_key_mode == tui_single_key_mode) + prompt = ""; + else + prompt = get_prompt (); c_pos = -1; c_line = -1; Index: tuiIO.h =================================================================== RCS file: /cvs/src/src/gdb/tui/tuiIO.h,v retrieving revision 1.4 diff -u -p -r1.4 tuiIO.h --- tuiIO.h 21 Jul 2001 19:56:54 -0000 1.4 +++ tuiIO.h 31 Aug 2002 12:00:44 -0000 @@ -1,5 +1,5 @@ /* TUI support I/O functions. - Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. This file is part of GDB. @@ -35,6 +35,11 @@ extern void tui_initialize_io (void); /* Get a character from the command window. */ extern int tui_getc (FILE*); + +/* Readline callback. + Redisplay the command line with its prompt after readline has + changed the edited text. */ +extern void tui_redisplay_readline (void); #define m_tuiStartNewLine tuiStartNewLines(1) --------------070801060203010506020305--