* tuiWin.c, tuiWin.h, tui.c, tui.h, tuiCommand.c: Add FSF copyright.
tuiCommand.h, tuiIO.c, tuiIO.h, tuiData.h, tuiData.c: Likewise.
tuiDataWin.c, tuiDataWin.h, tuiDisassem.c, tuiDisassem.h: Likewise.
tuiGeneralWin.c, tuiGeneralWin.h, tuiLayout.c, tuiLayout.h: Likewise.
tuiRegs.c, tuiRegs.h, tuiSource.c, tuiSource.h: Likewise.
tuiSouceWin.c, tuiSourceWin.h, tuiStack.c, tuiStack.h: Likewise.
2001-07-15 03:01:25 +08:00
|
|
|
/* General functions for the WDB TUI.
|
2002-03-01 14:19:28 +08:00
|
|
|
|
2015-01-01 17:32:14 +08:00
|
|
|
Copyright (C) 1998-2015 Free Software Foundation, Inc.
|
2002-03-01 14:19:28 +08:00
|
|
|
|
* tuiWin.c, tuiWin.h, tui.c, tui.h, tuiCommand.c: Add FSF copyright.
tuiCommand.h, tuiIO.c, tuiIO.h, tuiData.h, tuiData.c: Likewise.
tuiDataWin.c, tuiDataWin.h, tuiDisassem.c, tuiDisassem.h: Likewise.
tuiGeneralWin.c, tuiGeneralWin.h, tuiLayout.c, tuiLayout.h: Likewise.
tuiRegs.c, tuiRegs.h, tuiSource.c, tuiSource.h: Likewise.
tuiSouceWin.c, tuiSourceWin.h, tuiStack.c, tuiStack.h: Likewise.
2001-07-15 03:01:25 +08:00
|
|
|
Contributed by Hewlett-Packard Company.
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-08-24 02:08:50 +08:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
* tuiWin.c, tuiWin.h, tui.c, tui.h, tuiCommand.c: Add FSF copyright.
tuiCommand.h, tuiIO.c, tuiIO.h, tuiData.h, tuiData.c: Likewise.
tuiDataWin.c, tuiDataWin.h, tuiDisassem.c, tuiDisassem.h: Likewise.
tuiGeneralWin.c, tuiGeneralWin.h, tuiLayout.c, tuiLayout.h: Likewise.
tuiRegs.c, tuiRegs.h, tuiSource.c, tuiSource.h: Likewise.
tuiSouceWin.c, tuiSourceWin.h, tuiStack.c, tuiStack.h: Likewise.
2001-07-15 03:01:25 +08:00
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2007-08-24 02:08:50 +08:00
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "gdbcmd.h"
|
2004-01-19 12:31:53 +08:00
|
|
|
#include "tui/tui.h"
|
2004-02-10 Andrew Cagney <cagney@redhat.com>
* defs.h: Do not include "tui.h".
* gdb_curses.h: New file.
* tui/tui-hooks.h: New file.
* tui/tui.h (tui_update_all_exec_infos): Delete declaration.
(tui_install_hooks, tui_remove_hooks): Delete declarations.
(tui_initialize_io): Delete declaration.
(tui_initialize_readline: Delete redundant declaration.
(struct tui_point): Delete definition.
* tui/tui-data.h (struct tui_point): Define.
* cli/cli-decode.c [TUI]: Include "tui/tui.h".
* utils.c: Include "tui/tui.h".
* tui/tui-data.h: Include "tui/tui.h" and "gdb_curses.h".
* printcmd.c [TUI]: Include "tui/tui.h".
* cli/cli-cmds.c [TUI]: Include "tui/tui.h".
* tui/tui-command.c: Include "gdb_curses.h".
* tui/tui.c, tui/tui-winsource.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-windata.c, tui/tui-win.c, tui/tui-stack.c: Ditto.
* tui/tui-source.c, tui/tui-regs.c, tui/tui-layout.c: Ditto.
* tui/tui-io.c, tui/tui-disasm.c, tui/tui-data.c: : Ditto.
* tui/tui-hooks.c: Include "tui-hooks.h" and "gdb_curses.h".
* Makefile.in: Update all dependencies.
(tui_hooks_h, gdb_curses_h): Define.
(SUBDIR_TUI_CFLAGS): Remove -I${srcdir}/tui.
2004-02-11 03:08:19 +08:00
|
|
|
#include "tui/tui-hooks.h"
|
2004-01-19 12:31:53 +08:00
|
|
|
#include "tui/tui-data.h"
|
|
|
|
#include "tui/tui-layout.h"
|
|
|
|
#include "tui/tui-io.h"
|
|
|
|
#include "tui/tui-regs.h"
|
|
|
|
#include "tui/tui-stack.h"
|
|
|
|
#include "tui/tui-win.h"
|
|
|
|
#include "tui/tui-winsource.h"
|
|
|
|
#include "tui/tui-windata.h"
|
2001-07-22 03:59:14 +08:00
|
|
|
#include "target.h"
|
|
|
|
#include "frame.h"
|
|
|
|
#include "breakpoint.h"
|
2001-07-24 05:13:57 +08:00
|
|
|
#include "inferior.h"
|
2002-09-30 08:52:27 +08:00
|
|
|
#include "symtab.h"
|
|
|
|
#include "source.h"
|
2014-08-25 22:40:32 +08:00
|
|
|
#include "terminal.h"
|
2001-07-22 03:59:14 +08:00
|
|
|
|
2004-02-26 10:08:04 +08:00
|
|
|
#include <ctype.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#if 0
|
|
|
|
#include <termio.h>
|
|
|
|
#endif
|
|
|
|
#include <setjmp.h>
|
|
|
|
|
2004-02-10 Andrew Cagney <cagney@redhat.com>
* defs.h: Do not include "tui.h".
* gdb_curses.h: New file.
* tui/tui-hooks.h: New file.
* tui/tui.h (tui_update_all_exec_infos): Delete declaration.
(tui_install_hooks, tui_remove_hooks): Delete declarations.
(tui_initialize_io): Delete declaration.
(tui_initialize_readline: Delete redundant declaration.
(struct tui_point): Delete definition.
* tui/tui-data.h (struct tui_point): Define.
* cli/cli-decode.c [TUI]: Include "tui/tui.h".
* utils.c: Include "tui/tui.h".
* tui/tui-data.h: Include "tui/tui.h" and "gdb_curses.h".
* printcmd.c [TUI]: Include "tui/tui.h".
* cli/cli-cmds.c [TUI]: Include "tui/tui.h".
* tui/tui-command.c: Include "gdb_curses.h".
* tui/tui.c, tui/tui-winsource.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-windata.c, tui/tui-win.c, tui/tui-stack.c: Ditto.
* tui/tui-source.c, tui/tui-regs.c, tui/tui-layout.c: Ditto.
* tui/tui-io.c, tui/tui-disasm.c, tui/tui-data.c: : Ditto.
* tui/tui-hooks.c: Include "tui-hooks.h" and "gdb_curses.h".
* Makefile.in: Update all dependencies.
(tui_hooks_h, gdb_curses_h): Define.
(SUBDIR_TUI_CFLAGS): Remove -I${srcdir}/tui.
2004-02-11 03:08:19 +08:00
|
|
|
#include "gdb_curses.h"
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
#include "interps.h"
|
2003-06-22 23:21:39 +08:00
|
|
|
|
2004-02-28 23:02:35 +08:00
|
|
|
/* This redefines CTRL if it is not already defined, so it must come
|
|
|
|
after terminal state releated include files like <term.h> and
|
2004-04-09 21:44:02 +08:00
|
|
|
"gdb_curses.h". */
|
2004-02-28 Andrew Cagney <cagney@redhat.com>
* utils.c: Use "", instead of <>, to include readline.
tui/tui-win.c, tui/tui.c, tui/tui-hooks.c: Ditto.
* tracepoint.c, top.c, symmisc.c, symfile.c: Ditto.
* source.c, solib.c, exec.c, event-top.c: Ditto.
* corelow.c, completer.c, cli/cli-setshow.c: Ditto.
* cli/cli-dump.c, cli/cli-cmds.c: Ditto.
* Makefile.in: Update all dependencies.
(readline_tilde_h, readline_history_h): Define.
(readline_headers): Delete.
2004-02-29 02:04:37 +08:00
|
|
|
#include "readline/readline.h"
|
2004-02-28 23:02:35 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Tells whether the TUI is active or not. */
|
|
|
|
int tui_active = 0;
|
|
|
|
static int tui_finish_init = 1;
|
|
|
|
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE;
|
2002-08-31 20:02:14 +08:00
|
|
|
|
|
|
|
struct tui_char_command
|
|
|
|
{
|
|
|
|
unsigned char key;
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-data.c, tui-data.h, tui-disasm.c, tui-hooks.c, tui-layout.c,
tui-regs.c, tui-source.c, tui-stack.c, tui-win.c, tui-windata.c,
tui-wingeneral.c, tui-wingeneral.h, tui-winsource.c, tui.c,
tui-winsource.h: Whitespace changes, fix pointer declarations
to be consistant.
2007-08-15 04:23:29 +08:00
|
|
|
const char *cmd;
|
2002-08-31 20:02:14 +08:00
|
|
|
};
|
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Key mapping to gdb commands when the TUI is using the single key
|
|
|
|
mode. */
|
2002-08-31 20:02:14 +08:00
|
|
|
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. */
|
2001-07-22 03:59:14 +08:00
|
|
|
static int
|
2003-02-12 23:14:36 +08:00
|
|
|
tui_rl_switch_mode (int notused1, int notused2)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
TUI: don't let exceptions escape while handling readline key bindings
I noticed that with:
$ TERM=dumb ./gdb -q -nx
<c-x,a>
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
The next key the user types is silently eaten.
The problem is that we're throwing an exception while in a readline
callback that isn't prepared for that:
(top-gdb) bt
#0 tui_enable () at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:388
#1 0x000000000051f47b in tui_rl_switch_mode (notused1=1, notused2=1) at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:101
#2 0x0000000000768d6f in _rl_dispatch_subseq (key=1, map=0xd069c0 <emacs_ctlx_keymap>, got_subseq=0) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:774
#3 0x0000000000768acb in _rl_dispatch_callback (cxt=0x1ce6190) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:686
#4 0x000000000078120b in rl_callback_read_char () at /home/pedro/gdb/mygit/build/../src/readline/callback.c:170
#5 0x0000000000619445 in rl_callback_read_char_wrapper (client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:166
#6 0x000000000061981b in stdin_event_handler (error=0, client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:372
#7 0x000000000061840e in handle_file_event (data=...) at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:762
#8 0x00000000006178f5 in process_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:339
#9 0x00000000006179bc in gdb_do_one_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:403
#10 0x0000000000617a0c in start_event_loop () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:428
Here, in _rl_dispatch_subseq:
769
770 rl_executing_keymap = map;
771
772 rl_dispatching = 1;
773 RL_SETSTATE(RL_STATE_DISPATCHING);
774 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775 RL_UNSETSTATE(RL_STATE_DISPATCHING);
776 rl_dispatching = 0;
777
778 /* If we have input pending, then the last command was a prefix
779 command. Don't change the state of rl_last_func. Otherwise,
GDB is called from line 774, but longjmp'ing at that point leaves
rl_dispatching and RL_STATE_DISPATCHING set.
Fix this by wrapping tui_rl_switch_mode in a TRY_CATCH.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
* tui/tui.c (tui_rl_switch_mode): Wrap tui_enable/tui_disable in
TRY_CATCH.
2014-10-29 19:58:12 +08:00
|
|
|
volatile struct gdb_exception ex;
|
|
|
|
|
|
|
|
/* Don't let exceptions escape. We're in the middle of a readline
|
|
|
|
callback that isn't prepared for that. */
|
|
|
|
TRY_CATCH (ex, RETURN_MASK_ALL)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
TUI: don't let exceptions escape while handling readline key bindings
I noticed that with:
$ TERM=dumb ./gdb -q -nx
<c-x,a>
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
The next key the user types is silently eaten.
The problem is that we're throwing an exception while in a readline
callback that isn't prepared for that:
(top-gdb) bt
#0 tui_enable () at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:388
#1 0x000000000051f47b in tui_rl_switch_mode (notused1=1, notused2=1) at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:101
#2 0x0000000000768d6f in _rl_dispatch_subseq (key=1, map=0xd069c0 <emacs_ctlx_keymap>, got_subseq=0) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:774
#3 0x0000000000768acb in _rl_dispatch_callback (cxt=0x1ce6190) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:686
#4 0x000000000078120b in rl_callback_read_char () at /home/pedro/gdb/mygit/build/../src/readline/callback.c:170
#5 0x0000000000619445 in rl_callback_read_char_wrapper (client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:166
#6 0x000000000061981b in stdin_event_handler (error=0, client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:372
#7 0x000000000061840e in handle_file_event (data=...) at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:762
#8 0x00000000006178f5 in process_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:339
#9 0x00000000006179bc in gdb_do_one_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:403
#10 0x0000000000617a0c in start_event_loop () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:428
Here, in _rl_dispatch_subseq:
769
770 rl_executing_keymap = map;
771
772 rl_dispatching = 1;
773 RL_SETSTATE(RL_STATE_DISPATCHING);
774 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775 RL_UNSETSTATE(RL_STATE_DISPATCHING);
776 rl_dispatching = 0;
777
778 /* If we have input pending, then the last command was a prefix
779 command. Don't change the state of rl_last_func. Otherwise,
GDB is called from line 774, but longjmp'ing at that point leaves
rl_dispatching and RL_STATE_DISPATCHING set.
Fix this by wrapping tui_rl_switch_mode in a TRY_CATCH.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
* tui/tui.c (tui_rl_switch_mode): Wrap tui_enable/tui_disable in
TRY_CATCH.
2014-10-29 19:58:12 +08:00
|
|
|
if (tui_active)
|
|
|
|
{
|
|
|
|
tui_disable ();
|
|
|
|
rl_prep_terminal (0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* If tui_enable throws, we'll re-prep below. */
|
|
|
|
rl_deprep_terminal ();
|
|
|
|
tui_enable ();
|
|
|
|
}
|
2001-07-22 03:59:14 +08:00
|
|
|
}
|
TUI: don't let exceptions escape while handling readline key bindings
I noticed that with:
$ TERM=dumb ./gdb -q -nx
<c-x,a>
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
The next key the user types is silently eaten.
The problem is that we're throwing an exception while in a readline
callback that isn't prepared for that:
(top-gdb) bt
#0 tui_enable () at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:388
#1 0x000000000051f47b in tui_rl_switch_mode (notused1=1, notused2=1) at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:101
#2 0x0000000000768d6f in _rl_dispatch_subseq (key=1, map=0xd069c0 <emacs_ctlx_keymap>, got_subseq=0) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:774
#3 0x0000000000768acb in _rl_dispatch_callback (cxt=0x1ce6190) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:686
#4 0x000000000078120b in rl_callback_read_char () at /home/pedro/gdb/mygit/build/../src/readline/callback.c:170
#5 0x0000000000619445 in rl_callback_read_char_wrapper (client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:166
#6 0x000000000061981b in stdin_event_handler (error=0, client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:372
#7 0x000000000061840e in handle_file_event (data=...) at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:762
#8 0x00000000006178f5 in process_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:339
#9 0x00000000006179bc in gdb_do_one_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:403
#10 0x0000000000617a0c in start_event_loop () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:428
Here, in _rl_dispatch_subseq:
769
770 rl_executing_keymap = map;
771
772 rl_dispatching = 1;
773 RL_SETSTATE(RL_STATE_DISPATCHING);
774 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775 RL_UNSETSTATE(RL_STATE_DISPATCHING);
776 rl_dispatching = 0;
777
778 /* If we have input pending, then the last command was a prefix
779 command. Don't change the state of rl_last_func. Otherwise,
GDB is called from line 774, but longjmp'ing at that point leaves
rl_dispatching and RL_STATE_DISPATCHING set.
Fix this by wrapping tui_rl_switch_mode in a TRY_CATCH.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
* tui/tui.c (tui_rl_switch_mode): Wrap tui_enable/tui_disable in
TRY_CATCH.
2014-10-29 19:58:12 +08:00
|
|
|
if (ex.reason < 0)
|
2001-07-22 03:59:14 +08:00
|
|
|
{
|
TUI: don't let exceptions escape while handling readline key bindings
I noticed that with:
$ TERM=dumb ./gdb -q -nx
<c-x,a>
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
The next key the user types is silently eaten.
The problem is that we're throwing an exception while in a readline
callback that isn't prepared for that:
(top-gdb) bt
#0 tui_enable () at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:388
#1 0x000000000051f47b in tui_rl_switch_mode (notused1=1, notused2=1) at /home/pedro/gdb/mygit/build/../src/gdb/tui/tui.c:101
#2 0x0000000000768d6f in _rl_dispatch_subseq (key=1, map=0xd069c0 <emacs_ctlx_keymap>, got_subseq=0) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:774
#3 0x0000000000768acb in _rl_dispatch_callback (cxt=0x1ce6190) at /home/pedro/gdb/mygit/build/../src/readline/readline.c:686
#4 0x000000000078120b in rl_callback_read_char () at /home/pedro/gdb/mygit/build/../src/readline/callback.c:170
#5 0x0000000000619445 in rl_callback_read_char_wrapper (client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:166
#6 0x000000000061981b in stdin_event_handler (error=0, client_data=0x0) at /home/pedro/gdb/mygit/build/../src/gdb/event-top.c:372
#7 0x000000000061840e in handle_file_event (data=...) at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:762
#8 0x00000000006178f5 in process_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:339
#9 0x00000000006179bc in gdb_do_one_event () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:403
#10 0x0000000000617a0c in start_event_loop () at /home/pedro/gdb/mygit/build/../src/gdb/event-loop.c:428
Here, in _rl_dispatch_subseq:
769
770 rl_executing_keymap = map;
771
772 rl_dispatching = 1;
773 RL_SETSTATE(RL_STATE_DISPATCHING);
774 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775 RL_UNSETSTATE(RL_STATE_DISPATCHING);
776 rl_dispatching = 0;
777
778 /* If we have input pending, then the last command was a prefix
779 command. Don't change the state of rl_last_func. Otherwise,
GDB is called from line 774, but longjmp'ing at that point leaves
rl_dispatching and RL_STATE_DISPATCHING set.
Fix this by wrapping tui_rl_switch_mode in a TRY_CATCH.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
* tui/tui.c (tui_rl_switch_mode): Wrap tui_enable/tui_disable in
TRY_CATCH.
2014-10-29 19:58:12 +08:00
|
|
|
exception_print (gdb_stderr, ex);
|
|
|
|
|
|
|
|
if (!tui_active)
|
|
|
|
rl_prep_terminal (0);
|
1999-04-16 09:35:26 +08:00
|
|
|
}
|
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Clear the readline in case switching occurred in middle of
|
|
|
|
something. */
|
2001-07-22 03:59:14 +08:00
|
|
|
if (rl_end)
|
|
|
|
rl_kill_text (0, rl_end);
|
|
|
|
|
|
|
|
/* Since we left the curses mode, the terminal mode is restored to
|
|
|
|
some previous state. That state may not be suitable for readline
|
|
|
|
to work correctly (it may be restored in line mode). We force an
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
exit of the current readline so that readline is re-entered and
|
|
|
|
it will be able to setup the terminal for its needs. By
|
|
|
|
re-entering in readline, we also redisplay its prompt in the
|
|
|
|
non-curses mode. */
|
2001-07-22 03:59:14 +08:00
|
|
|
rl_newline (1, '\n');
|
2001-07-24 05:13:57 +08:00
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Make sure the \n we are returning does not repeat the last
|
|
|
|
command. */
|
2001-07-24 05:13:57 +08:00
|
|
|
dont_repeat ();
|
2001-07-22 03:59:14 +08:00
|
|
|
return 0;
|
|
|
|
}
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2002-08-26 05:44:41 +08:00
|
|
|
/* TUI readline command.
|
|
|
|
Change the TUI layout to show a next layout.
|
2001-07-22 04:49:56 +08:00
|
|
|
This function is bound to CTRL-X 2. It is intended to provide
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
a functionality close to the Emacs split-window command. We
|
|
|
|
always show two windows (src+asm), (src+regs) or (asm+regs). */
|
2001-07-22 04:49:56 +08:00
|
|
|
static int
|
2003-02-12 23:14:36 +08:00
|
|
|
tui_rl_change_windows (int notused1, int notused2)
|
2001-07-22 04:49:56 +08:00
|
|
|
{
|
|
|
|
if (!tui_active)
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
|
2001-07-22 04:49:56 +08:00
|
|
|
|
|
|
|
if (tui_active)
|
|
|
|
{
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui-data.h (tui_win_element): Rename TuiWinElement.
(tui_exec_info_content): Rename TuiExecInfoContent.
(TuiGenWinInfo, TuiGenWinInfoPtr): Delete definitions.
(TuiWinInfo, TuiWinInfoPtr): Ditto.
(TuiScrollDirection, TuiScrollDirectionPtr): Ditto.
(TuiList, TuiListPtr): Ditto.
(TuiLayoutType, TuiLayoutTypePtr): Ditto.
(TuiDataType, TuiDataTypePtr): Ditto.
(TuiRegisterDisplayType, TuiRegisterDisplayTypePtr): Ditto.
(TuiLineOrAddress, TuiLineOrAddressPtr): Ditto.
(TuiLayoutDef, TuiLayoutDefPtr): Ditto.
(TuiSourceElement, TuiSourceElementPtr): Ditto.
(TuiDataElement, TuiDataElementPtr): Ditto.
(TuiWinElement, TuiWinElementPtr): Ditto.
(TuiDataInfo, TuiDataInfoPtr): Ditto.
(TuiCommandElement, TuiCommandElementPtr): Ditto.
(TuiLocatorElement, TuiLocatorElementPtr): Ditto.
(TuiWhichElement, TuiWhichElementPtr): Ditto.
(TuiSourceInfo, TuiSourceInfoPtr): Ditto.
(TuiCommandInfo, TuiCommandInfoPtr): Ditto.
* tui/tui-command.c, tui/tui-data.c: Update references.
* tui/tui-data.h, tui/tui-disasm.c, tui/tui-layout.c: Ditto.
* tui/tui-regs.c, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 00:31:22 +08:00
|
|
|
enum tui_layout_type new_layout;
|
|
|
|
enum tui_register_display_type regs_type = TUI_UNDEFINED_REGS;
|
2001-07-22 04:49:56 +08:00
|
|
|
|
2004-02-07 12:40:36 +08:00
|
|
|
new_layout = tui_current_layout ();
|
2001-07-22 04:49:56 +08:00
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Select a new layout to have a rolling layout behavior with
|
|
|
|
always two windows (except when undefined). */
|
2001-07-22 04:49:56 +08:00
|
|
|
switch (new_layout)
|
|
|
|
{
|
|
|
|
case SRC_COMMAND:
|
|
|
|
new_layout = SRC_DISASSEM_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
new_layout = SRC_DISASSEM_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SRC_DATA_COMMAND:
|
|
|
|
new_layout = SRC_DISASSEM_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
new_layout = DISASSEM_DATA_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DISASSEM_DATA_COMMAND:
|
|
|
|
new_layout = SRC_DATA_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
new_layout = SRC_COMMAND;
|
|
|
|
break;
|
|
|
|
}
|
2004-01-24 07:25:17 +08:00
|
|
|
tui_set_layout (new_layout, regs_type);
|
2001-07-22 04:49:56 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-08-26 05:44:41 +08:00
|
|
|
/* TUI readline command.
|
|
|
|
Delete the second TUI window to only show one. */
|
2001-07-22 04:49:56 +08:00
|
|
|
static int
|
2003-02-12 23:14:36 +08:00
|
|
|
tui_rl_delete_other_windows (int notused1, int notused2)
|
2001-07-22 04:49:56 +08:00
|
|
|
{
|
|
|
|
if (!tui_active)
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
|
2001-07-22 04:49:56 +08:00
|
|
|
|
|
|
|
if (tui_active)
|
|
|
|
{
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui-data.h (tui_win_element): Rename TuiWinElement.
(tui_exec_info_content): Rename TuiExecInfoContent.
(TuiGenWinInfo, TuiGenWinInfoPtr): Delete definitions.
(TuiWinInfo, TuiWinInfoPtr): Ditto.
(TuiScrollDirection, TuiScrollDirectionPtr): Ditto.
(TuiList, TuiListPtr): Ditto.
(TuiLayoutType, TuiLayoutTypePtr): Ditto.
(TuiDataType, TuiDataTypePtr): Ditto.
(TuiRegisterDisplayType, TuiRegisterDisplayTypePtr): Ditto.
(TuiLineOrAddress, TuiLineOrAddressPtr): Ditto.
(TuiLayoutDef, TuiLayoutDefPtr): Ditto.
(TuiSourceElement, TuiSourceElementPtr): Ditto.
(TuiDataElement, TuiDataElementPtr): Ditto.
(TuiWinElement, TuiWinElementPtr): Ditto.
(TuiDataInfo, TuiDataInfoPtr): Ditto.
(TuiCommandElement, TuiCommandElementPtr): Ditto.
(TuiLocatorElement, TuiLocatorElementPtr): Ditto.
(TuiWhichElement, TuiWhichElementPtr): Ditto.
(TuiSourceInfo, TuiSourceInfoPtr): Ditto.
(TuiCommandInfo, TuiCommandInfoPtr): Ditto.
* tui/tui-command.c, tui/tui-data.c: Update references.
* tui/tui-data.h, tui/tui-disasm.c, tui/tui-layout.c: Ditto.
* tui/tui-regs.c, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 00:31:22 +08:00
|
|
|
enum tui_layout_type new_layout;
|
|
|
|
enum tui_register_display_type regs_type = TUI_UNDEFINED_REGS;
|
2001-07-22 04:49:56 +08:00
|
|
|
|
2004-02-07 12:40:36 +08:00
|
|
|
new_layout = tui_current_layout ();
|
2001-07-22 04:49:56 +08:00
|
|
|
|
|
|
|
/* Kill one window. */
|
|
|
|
switch (new_layout)
|
|
|
|
{
|
|
|
|
case SRC_COMMAND:
|
|
|
|
case SRC_DATA_COMMAND:
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
default:
|
|
|
|
new_layout = SRC_COMMAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
case DISASSEM_DATA_COMMAND:
|
|
|
|
new_layout = DISASSEM_COMMAND;
|
|
|
|
break;
|
|
|
|
}
|
2004-01-24 07:25:17 +08:00
|
|
|
tui_set_layout (new_layout, regs_type);
|
2001-07-22 04:49:56 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-07-25 04:23:17 +08:00
|
|
|
/* TUI readline command.
|
|
|
|
Switch the active window to give the focus to a next window. */
|
|
|
|
static int
|
|
|
|
tui_rl_other_window (int count, int key)
|
|
|
|
{
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-data.c, tui-data.h, tui-disasm.c, tui-hooks.c, tui-layout.c,
tui-regs.c, tui-source.c, tui-stack.c, tui-win.c, tui-windata.c,
tui-wingeneral.c, tui-wingeneral.h, tui-winsource.c, tui.c,
tui-winsource.h: Whitespace changes, fix pointer declarations
to be consistant.
2007-08-15 04:23:29 +08:00
|
|
|
struct tui_win_info *win_info;
|
2003-07-25 04:23:17 +08:00
|
|
|
|
|
|
|
if (!tui_active)
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
|
2003-07-25 04:23:17 +08:00
|
|
|
|
2004-02-08 08:05:16 +08:00
|
|
|
win_info = tui_next_win (tui_win_with_focus ());
|
|
|
|
if (win_info)
|
2003-07-25 04:23:17 +08:00
|
|
|
{
|
2004-02-08 08:05:16 +08:00
|
|
|
tui_set_win_focus_to (win_info);
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible)
|
2004-02-07 08:23:56 +08:00
|
|
|
tui_refresh_data_win ();
|
2004-02-08 08:05:16 +08:00
|
|
|
keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN));
|
2003-07-25 04:23:17 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-08-31 20:02:14 +08:00
|
|
|
/* 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)
|
|
|
|
{
|
2012-11-10 20:25:07 +08:00
|
|
|
/* Insert the command in the readline buffer.
|
|
|
|
Avoid calling the gdb command here since it creates
|
|
|
|
a possible recursion on readline if prompt_for_continue
|
|
|
|
is called (See PR 9584). The command will also appear
|
|
|
|
in the readline history which turns out to be better. */
|
|
|
|
rl_insert_text (tui_commands[i].cmd);
|
|
|
|
rl_newline (1, '\n');
|
2012-11-10 21:12:18 +08:00
|
|
|
|
|
|
|
/* Switch to gdb command mode while executing the command.
|
|
|
|
This way the gdb's continue prompty will be displayed. */
|
|
|
|
tui_set_key_mode (TUI_ONE_COMMAND_MODE);
|
2002-08-31 20:02:14 +08:00
|
|
|
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)
|
|
|
|
{
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
tui_set_key_mode (TUI_ONE_COMMAND_MODE);
|
2002-08-31 20:02:14 +08:00
|
|
|
return rl_insert (count, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* TUI readline command.
|
|
|
|
Switch between TUI SingleKey mode and gdb readline editing. */
|
|
|
|
static int
|
2003-02-12 23:14:36 +08:00
|
|
|
tui_rl_next_keymap (int notused1, int notused2)
|
2002-08-31 20:02:14 +08:00
|
|
|
{
|
2003-07-25 04:23:17 +08:00
|
|
|
if (!tui_active)
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
|
2003-07-25 04:23:17 +08:00
|
|
|
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
tui_set_key_mode (tui_current_key_mode == TUI_COMMAND_MODE
|
|
|
|
? TUI_SINGLE_KEY_MODE : TUI_COMMAND_MODE);
|
2002-08-31 20:02:14 +08:00
|
|
|
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
|
2004-02-08 09:32:26 +08:00
|
|
|
tui_rl_startup_hook (void)
|
2002-08-31 20:02:14 +08:00
|
|
|
{
|
2002-09-04 04:47:48 +08:00
|
|
|
rl_already_prompted = 1;
|
2012-11-10 21:12:18 +08:00
|
|
|
if (tui_current_key_mode != TUI_COMMAND_MODE && immediate_quit == 0)
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
tui_set_key_mode (TUI_SINGLE_KEY_MODE);
|
2002-09-04 04:47:48 +08:00
|
|
|
tui_redisplay_readline ();
|
2002-08-31 20:02:14 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Change the TUI key mode by installing the appropriate readline
|
|
|
|
keymap. */
|
2002-08-31 20:02:14 +08:00
|
|
|
void
|
|
|
|
tui_set_key_mode (enum tui_key_mode mode)
|
|
|
|
{
|
|
|
|
tui_current_key_mode = mode;
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
rl_set_keymap (mode == TUI_SINGLE_KEY_MODE
|
2002-08-31 20:02:14 +08:00
|
|
|
? tui_keymap : tui_readline_standard_keymap);
|
2004-01-29 07:16:50 +08:00
|
|
|
tui_show_locator_content ();
|
2002-08-31 20:02:14 +08:00
|
|
|
}
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Initialize readline and configure the keymap for the switching
|
|
|
|
key shortcut. */
|
1999-04-16 09:35:26 +08:00
|
|
|
void
|
2004-02-08 09:32:26 +08:00
|
|
|
tui_initialize_readline (void)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
2002-08-31 20:02:14 +08:00
|
|
|
int i;
|
|
|
|
Keymap tui_ctlx_keymap;
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
rl_initialize ();
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_add_defun ("tui-switch-mode", tui_rl_switch_mode, -1);
|
2002-08-31 20:02:14 +08:00
|
|
|
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. */
|
2002-09-14 04:06:56 +08:00
|
|
|
for (i = ' '; i < 0x7f; i++)
|
2002-08-31 20:02:14 +08:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_bind_key_in_map ('a', tui_rl_switch_mode, emacs_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_bind_key_in_map ('a', tui_rl_switch_mode, tui_ctlx_keymap);
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_bind_key_in_map ('A', tui_rl_switch_mode, emacs_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_bind_key_in_map ('A', tui_rl_switch_mode, tui_ctlx_keymap);
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, emacs_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, tui_ctlx_keymap);
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_bind_key_in_map ('1', tui_rl_delete_other_windows, emacs_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_bind_key_in_map ('1', tui_rl_delete_other_windows, tui_ctlx_keymap);
|
2002-08-26 05:44:41 +08:00
|
|
|
rl_bind_key_in_map ('2', tui_rl_change_windows, emacs_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_bind_key_in_map ('2', tui_rl_change_windows, tui_ctlx_keymap);
|
2003-07-25 04:23:17 +08:00
|
|
|
rl_bind_key_in_map ('o', tui_rl_other_window, emacs_ctlx_keymap);
|
|
|
|
rl_bind_key_in_map ('o', tui_rl_other_window, tui_ctlx_keymap);
|
2002-08-31 20:02:14 +08:00
|
|
|
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);
|
2001-07-22 03:59:14 +08:00
|
|
|
}
|
1999-04-16 09:35:26 +08:00
|
|
|
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
/* Return the TERM variable from the environment, or "<unset>"
|
|
|
|
if not set. */
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
gdb_getenv_term (void)
|
|
|
|
{
|
|
|
|
const char *term;
|
|
|
|
|
|
|
|
term = getenv ("TERM");
|
|
|
|
if (term != NULL)
|
|
|
|
return term;
|
|
|
|
return "<unset>";
|
|
|
|
}
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Enter in the tui mode (curses).
|
|
|
|
When in normal mode, it installs the tui hooks in gdb, redirects
|
|
|
|
the gdb output, configures the readline to work in tui mode.
|
|
|
|
When in curses mode, it does nothing. */
|
1999-04-16 09:35:26 +08:00
|
|
|
void
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_enable (void)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
struct interp *interp;
|
2010-03-31 06:21:34 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
if (tui_active)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* To avoid to initialize curses when gdb starts, there is a defered
|
|
|
|
curses initialization. This initialization is made only once
|
|
|
|
and the first time the curses mode is entered. */
|
|
|
|
if (tui_finish_init)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
2001-07-22 03:59:14 +08:00
|
|
|
WINDOW *w;
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
SCREEN *s;
|
|
|
|
const char *cap;
|
|
|
|
const char *interp;
|
|
|
|
|
|
|
|
/* If the top level interpreter is not the console/tui (e.g.,
|
|
|
|
MI), enabling curses will certainly lose. */
|
|
|
|
interp = interp_name (top_level_interpreter ());
|
|
|
|
if (strcmp (interp, INTERP_TUI) != 0)
|
|
|
|
error (_("Cannot enable the TUI when the interpreter is '%s'"), interp);
|
|
|
|
|
|
|
|
/* Don't try to setup curses (and print funny control
|
|
|
|
characters) if we're not outputting to a terminal. */
|
|
|
|
if (!ui_file_isatty (gdb_stdout))
|
|
|
|
error (_("Cannot enable the TUI when output is not a terminal"));
|
|
|
|
|
2014-11-04 21:27:06 +08:00
|
|
|
s = newterm (NULL, stdout, stdin);
|
2015-01-23 02:23:12 +08:00
|
|
|
#ifdef __MINGW32__
|
|
|
|
/* The MinGW port of ncurses requires $TERM to be unset in order
|
|
|
|
to activate the Windows console driver. */
|
|
|
|
if (s == NULL)
|
|
|
|
s = newterm ("unknown", stdout, stdin);
|
|
|
|
#endif
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
if (s == NULL)
|
|
|
|
{
|
|
|
|
error (_("Cannot enable the TUI: error opening terminal [TERM=%s]"),
|
|
|
|
gdb_getenv_term ());
|
|
|
|
}
|
|
|
|
w = stdscr;
|
|
|
|
|
2015-01-23 02:23:12 +08:00
|
|
|
/* Check required terminal capabilities. The MinGW port of
|
|
|
|
ncurses does have them, but doesn't expose them through "cup". */
|
|
|
|
#ifndef __MINGW32__
|
PR tui/16138, PR tui/17519, and misc failures to initialize the terminal
PR tui/16138 is about failure to initialize curses resulting in GDB
exiting instead of throwing an error. E.g.:
$ TERM=foo gdb
(gdb) layout asm
Error opening terminal: foo.
$
The problem is that we're calling initscr to initialize the screen.
As mentioned in
http://pubs.opengroup.org/onlinepubs/7908799/xcurses/initscr.html:
If errors occur, initscr() writes an appropriate error message to
standard error and exits.
^^^^^
Instead, we should use newterm:
"A program that needs an indication of error conditions, so it can
continue to run in a line-oriented mode if the terminal cannot support
a screen-oriented program, would also use this function."
After the patch:
$ TERM=foo gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: error opening terminal [TERM=foo]
(gdb)
And then PR tui/17519 is about GDB not validating whether the terminal
has the necessary capabilities when enabling the TUI. If one tries to
enable the TUI with TERM=dumb (and e.g., from a shell within emacs),
GDB ends up with a clear screen, the cursor is placed at the
bottom/right corner of the screen, there's no prompt, typing shows no
echo, and there's no indication of what's going on. c-x,a gets you
out of the TUI, but it's completely non-obvious.
After the patch, we get:
$ TERM=dumb gdb -q -nx
(gdb) layout asm
Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb]
(gdb)
While at it, I've moved all the tui_allowed_p validation to
tui_enable, and expanded the error messages. Previously we'd get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"TUI mode not allowed\n"
^error,msg="TUI mode not allowed"
and:
$ gdb -q -nx -ex "layout asm" > foo
TUI mode not allowed
While now we get:
$ gdb -q -nx -i=mi
(gdb)
layout asm
&"layout asm\n"
&"Cannot enable the TUI when the interpreter is 'mi'\n"
^error,msg="Cannot enable the TUI when the interpreter is 'mi'"
(gdb)
and:
$ gdb -q -nx -ex "layout asm" > foo
Cannot enable the TUI when output is not a terminal
Tested on x86_64 Fedora 20.
gdb/
2014-10-29 Pedro Alves <palves@redhat.com>
PR tui/16138
PR tui/17519
* tui/tui-interp.c (tui_is_toplevel): Delete global.
(tui_allowed_p): Delete function.
* tui/tui.c: Include "interps.h".
(tui_enable): Don't use tui_allowed_p. Error out here with
detailed error messages if the TUI is the top level interpreter,
or if output is not a terminal. Use newterm instead of initscr,
and error out if initializing the terminal fails. Also error out if
the terminal doesn't support cursor addressing.
* tui/tui.h (tui_allowed_p): Delete declaration.
2014-10-29 22:23:57 +08:00
|
|
|
cap = tigetstr ("cup");
|
|
|
|
if (cap == NULL || cap == (char *) -1 || *cap == '\0')
|
|
|
|
{
|
|
|
|
endwin ();
|
|
|
|
delscreen (s);
|
|
|
|
error (_("Cannot enable the TUI: "
|
|
|
|
"terminal doesn't support cursor addressing [TERM=%s]"),
|
|
|
|
gdb_getenv_term ());
|
|
|
|
}
|
2015-01-23 02:23:12 +08:00
|
|
|
#endif
|
2001-07-22 03:59:14 +08:00
|
|
|
|
2001-07-22 04:49:56 +08:00
|
|
|
cbreak ();
|
|
|
|
noecho ();
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* timeout (1); */
|
2001-07-22 03:59:14 +08:00
|
|
|
nodelay(w, FALSE);
|
|
|
|
nl();
|
|
|
|
keypad (w, TRUE);
|
|
|
|
rl_initialize ();
|
2004-02-07 12:40:36 +08:00
|
|
|
tui_set_term_height_to (LINES);
|
|
|
|
tui_set_term_width_to (COLS);
|
2001-07-22 03:59:14 +08:00
|
|
|
def_prog_mode ();
|
|
|
|
|
2004-01-29 07:16:50 +08:00
|
|
|
tui_show_frame_info (0);
|
2004-01-24 07:25:17 +08:00
|
|
|
tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS);
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
tui_set_win_focus_to (TUI_SRC_WIN);
|
|
|
|
keypad (TUI_CMD_WIN->generic.handle, TRUE);
|
|
|
|
wrefresh (TUI_CMD_WIN->generic.handle);
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_finish_init = 0;
|
1999-04-16 09:35:26 +08:00
|
|
|
}
|
2001-07-22 03:59:14 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Save the current gdb setting of the terminal.
|
|
|
|
Curses will restore this state when endwin() is called. */
|
|
|
|
def_shell_mode ();
|
|
|
|
clearok (stdscr, TRUE);
|
|
|
|
}
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Install the TUI specific hooks. */
|
|
|
|
tui_install_hooks ();
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_startup_hook = tui_rl_startup_hook;
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 04:49:56 +08:00
|
|
|
tui_update_variables ();
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_setup_io (1);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_active = 1;
|
* frame.c (deprecated_selected_frame): Rename to...
(selected_frame): ...this. Make static.
(get_selected_frame, select_frame): Update.
* frame.h (deprected_select_frame): Delete.
(deprecated_safe_get_selected_frame): Update comments.
* breakpoint.c, cli/cli-cmds.c, f-valprint.c, infcmd.c, inflow.c,
infrun.c, stack.c, tui/tui-disasm.c, tui/tui-source.c,
tui/tui-winsource.c, valops.c, varobj.c, findvar.c, macroscope.c,
parse.c, regcache.h, sh64-tdep.c, tui/tui-hooks.c, tui/tui-win.c,
tui/tui.c: Replace references to deprecated_selected_frame.
2007-02-28 03:46:04 +08:00
|
|
|
if (deprecated_safe_get_selected_frame ())
|
|
|
|
tui_show_frame_info (deprecated_safe_get_selected_frame ());
|
2002-08-25 01:04:33 +08:00
|
|
|
|
2002-09-14 04:06:56 +08:00
|
|
|
/* Restore TUI keymap. */
|
|
|
|
tui_set_key_mode (tui_current_key_mode);
|
2015-02-11 07:45:10 +08:00
|
|
|
|
|
|
|
/* Resize and refresh the screen. */
|
|
|
|
if (tui_win_resized ())
|
|
|
|
{
|
|
|
|
tui_resize_all ();
|
|
|
|
tui_set_win_resized_to (FALSE);
|
|
|
|
}
|
2004-02-07 09:02:54 +08:00
|
|
|
tui_refresh_all_win ();
|
2002-08-27 03:35:37 +08:00
|
|
|
|
|
|
|
/* Update gdb's knowledge of its terminal. */
|
2014-08-25 22:40:32 +08:00
|
|
|
gdb_save_tty_state ();
|
2002-08-25 00:43:08 +08:00
|
|
|
tui_update_gdb_sizes ();
|
2001-07-22 03:59:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Leave the tui mode.
|
|
|
|
Remove the tui hooks and configure the gdb output and readline
|
|
|
|
back to their original state. The curses mode is left so that
|
|
|
|
the terminal setting is restored to the point when we entered. */
|
1999-04-16 09:35:26 +08:00
|
|
|
void
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_disable (void)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
2001-07-22 03:59:14 +08:00
|
|
|
if (!tui_active)
|
|
|
|
return;
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2002-09-14 04:06:56 +08:00
|
|
|
/* Restore initial readline keymap. */
|
|
|
|
rl_set_keymap (tui_readline_standard_keymap);
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Remove TUI hooks. */
|
|
|
|
tui_remove_hooks ();
|
2002-08-31 20:02:14 +08:00
|
|
|
rl_startup_hook = 0;
|
|
|
|
rl_already_prompted = 0;
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* Leave curses and restore previous gdb terminal setting. */
|
|
|
|
endwin ();
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
/* gdb terminal has changed, update gdb internal copy of it
|
|
|
|
so that terminal management with the inferior works. */
|
|
|
|
tui_setup_io (0);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2002-08-27 03:35:37 +08:00
|
|
|
/* Update gdb's knowledge of its terminal. */
|
2014-08-25 22:40:32 +08:00
|
|
|
gdb_save_tty_state ();
|
2002-08-27 03:35:37 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
tui_active = 0;
|
2002-08-25 00:43:08 +08:00
|
|
|
tui_update_gdb_sizes ();
|
2001-07-22 03:59:14 +08:00
|
|
|
}
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
void
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-data.c, tui-data.h, tui-disasm.c, tui-disasm.h, tui-hooks.c,
tui-io.c, tui-layout.c, tui-layout.h, tui-out.c, tui-regs.c,
tui-source.c, tui-source.h, tui-stack.c, tui-win.c, tui-win.h,
tui-windata.c, tui-windata.h, tui-wingeneral.c, tui-winsource.c,
tui-winsource.h, tui.c, tui.h: Function declarations and
definitions, wrap long lines.
2007-08-15 07:50:39 +08:00
|
|
|
strcat_to_buf (char *buf, int buflen,
|
|
|
|
const char *item_to_add)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
2004-02-08 08:05:16 +08:00
|
|
|
if (item_to_add != (char *) NULL && buf != (char *) NULL)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
2004-02-08 08:05:16 +08:00
|
|
|
if ((strlen (buf) + strlen (item_to_add)) <= buflen)
|
|
|
|
strcat (buf, item_to_add);
|
1999-04-16 09:35:26 +08:00
|
|
|
else
|
2004-02-08 08:05:16 +08:00
|
|
|
strncat (buf, item_to_add, (buflen - strlen (buf)));
|
1999-04-16 09:35:26 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
#if 0
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Solaris <sys/termios.h> defines CTRL. */
|
2001-07-22 03:59:14 +08:00
|
|
|
#ifndef CTRL
|
|
|
|
#define CTRL(x) (x & ~0140)
|
|
|
|
#endif
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-07-22 03:59:14 +08:00
|
|
|
#define FILEDES 2
|
|
|
|
#define CHK(val, dft) (val<=0 ? dft : val)
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
static void
|
2004-02-08 08:05:16 +08:00
|
|
|
tui_reset (void)
|
1999-04-16 09:35:26 +08:00
|
|
|
{
|
|
|
|
struct termio mode;
|
|
|
|
|
2007-08-15 05:39:22 +08:00
|
|
|
/* Reset the teletype mode bits to a sensible state.
|
|
|
|
Copied tset.c. */
|
2004-09-08 05:55:12 +08:00
|
|
|
#if defined (TIOCGETC)
|
1999-04-16 09:35:26 +08:00
|
|
|
struct tchars tbuf;
|
2004-09-08 05:55:12 +08:00
|
|
|
#endif /* TIOCGETC */
|
1999-04-16 09:35:26 +08:00
|
|
|
#ifdef UCB_NTTY
|
|
|
|
struct ltchars ltc;
|
|
|
|
|
|
|
|
if (ldisc == NTTYDISC)
|
|
|
|
{
|
|
|
|
ioctl (FILEDES, TIOCGLTC, <c);
|
|
|
|
ltc.t_suspc = CHK (ltc.t_suspc, CTRL ('Z'));
|
|
|
|
ltc.t_dsuspc = CHK (ltc.t_dsuspc, CTRL ('Y'));
|
|
|
|
ltc.t_rprntc = CHK (ltc.t_rprntc, CTRL ('R'));
|
|
|
|
ltc.t_flushc = CHK (ltc.t_flushc, CTRL ('O'));
|
|
|
|
ltc.t_werasc = CHK (ltc.t_werasc, CTRL ('W'));
|
|
|
|
ltc.t_lnextc = CHK (ltc.t_lnextc, CTRL ('V'));
|
|
|
|
ioctl (FILEDES, TIOCSLTC, <c);
|
|
|
|
}
|
|
|
|
#endif /* UCB_NTTY */
|
|
|
|
#ifdef TIOCGETC
|
|
|
|
ioctl (FILEDES, TIOCGETC, &tbuf);
|
|
|
|
tbuf.t_intrc = CHK (tbuf.t_intrc, CTRL ('?'));
|
|
|
|
tbuf.t_quitc = CHK (tbuf.t_quitc, CTRL ('\\'));
|
|
|
|
tbuf.t_startc = CHK (tbuf.t_startc, CTRL ('Q'));
|
|
|
|
tbuf.t_stopc = CHK (tbuf.t_stopc, CTRL ('S'));
|
|
|
|
tbuf.t_eofc = CHK (tbuf.t_eofc, CTRL ('D'));
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* brkc is left alone. */
|
1999-04-16 09:35:26 +08:00
|
|
|
ioctl (FILEDES, TIOCSETC, &tbuf);
|
|
|
|
#endif /* TIOCGETC */
|
|
|
|
mode.sg_flags &= ~(RAW
|
|
|
|
#ifdef CBREAK
|
|
|
|
| CBREAK
|
|
|
|
#endif /* CBREAK */
|
|
|
|
| VTDELAY | ALLDELAY);
|
|
|
|
mode.sg_flags |= XTABS | ECHO | CRMOD | ANYP;
|
|
|
|
|
|
|
|
return;
|
2004-02-08 08:05:16 +08:00
|
|
|
}
|
2001-07-22 03:59:14 +08:00
|
|
|
#endif
|
|
|
|
|
2001-07-24 05:13:57 +08:00
|
|
|
void
|
2013-02-04 00:16:42 +08:00
|
|
|
tui_show_source (const char *fullname, int line)
|
2001-07-24 05:13:57 +08:00
|
|
|
{
|
2002-09-30 08:52:27 +08:00
|
|
|
struct symtab_and_line cursal = get_current_source_symtab_and_line ();
|
2010-05-18 06:21:43 +08:00
|
|
|
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-command.c, tui-data.c, tui-data.h, tui-disasm.c, tui-file.c,
tui-hooks.c, tui-interp.c, tui-io.c, tui-layout.c, tui-out.c,
tui-regs.c, tui-regs.h, tui-source.c, tui-stack.c, tui-win.c,
tui-windata.c, tui-wingeneral.c, tui-winsource.c, tui-winsource.h,
tui.c, tui.h: Comment reformatting to coding standard (capitals,
spaces after periods, etc).
2007-08-15 05:20:09 +08:00
|
|
|
/* Make sure that the source window is displayed. */
|
2004-01-24 07:25:17 +08:00
|
|
|
tui_add_win_to_layout (SRC_WIN);
|
2001-07-24 05:13:57 +08:00
|
|
|
|
2004-02-07 06:42:18 +08:00
|
|
|
tui_update_source_windows_with_line (cursal.symtab, line);
|
2013-02-04 00:16:42 +08:00
|
|
|
tui_update_locator_fullname (fullname);
|
2001-07-24 05:13:57 +08:00
|
|
|
}
|
2001-07-22 06:24:44 +08:00
|
|
|
|
|
|
|
void
|
2009-07-03 01:17:42 +08:00
|
|
|
tui_show_assembly (struct gdbarch *gdbarch, CORE_ADDR addr)
|
2001-07-22 06:24:44 +08:00
|
|
|
{
|
2004-01-24 07:25:17 +08:00
|
|
|
tui_add_win_to_layout (DISASSEM_WIN);
|
2009-07-03 01:17:42 +08:00
|
|
|
tui_update_source_windows_with_addr (gdbarch, addr);
|
2001-07-22 06:24:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h (Opaque, OpaquePtr OpaqueList): Delete definition.
(TuiPoint, TuiPointPtr): Ditto.
(TuiStatus, TuiStatusPtr): Ditto.
(TuiWinType, TuiWinTypePtr): Ditto.
(struct tui_point): Rename _TuiPoint.
(tui_get_low_disassembly_address): Rename
tuiGetLowDisassemblyAddress.
(tui_update_all_exec_infos): Rename tuiUpdateAllExecInfos.
(tuiFree): Delete declaration.
(OpaqueFuncPtr, TuiOpaqueFuncPtr): Delete definitions.
(TuiVoidFuncPtr, TuiIntFuncPtr): Delete definitions.
* tui/tui.c (tuiFree): Delete function.
* cli/cli-cmds.c (disassemble_command): Update references.
* tui/tui-data.c, tui/tui-data.h, tui/tui-disasm.c: Ditto.
* tui/tui-layout.c, tui/tui-regs.c, tui/tui-source.c: Ditto.
* tui/tui-stack.c, tui/tui-win.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c: Ditto.
2004-02-08 01:46:14 +08:00
|
|
|
tui_is_window_visible (enum tui_win_type type)
|
2001-07-22 06:24:44 +08:00
|
|
|
{
|
2003-02-14 21:58:06 +08:00
|
|
|
if (tui_active == 0)
|
2001-07-22 06:24:44 +08:00
|
|
|
return 0;
|
|
|
|
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
if (tui_win_list[type] == 0)
|
2001-07-22 06:24:44 +08:00
|
|
|
return 0;
|
|
|
|
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
return tui_win_list[type]->generic.is_visible;
|
2001-07-22 06:24:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2007-08-14 Michael Snyder <msnyder@access-company.com>
* tui-data.c, tui-data.h, tui-disasm.c, tui-disasm.h, tui-hooks.c,
tui-io.c, tui-layout.c, tui-layout.h, tui-out.c, tui-regs.c,
tui-source.c, tui-source.h, tui-stack.c, tui-win.c, tui-win.h,
tui-windata.c, tui-windata.h, tui-wingeneral.c, tui-winsource.c,
tui-winsource.h, tui.c, tui.h: Function declarations and
definitions, wrap long lines.
2007-08-15 07:50:39 +08:00
|
|
|
tui_get_command_dimension (unsigned int *width,
|
|
|
|
unsigned int *height)
|
2001-07-22 06:24:44 +08:00
|
|
|
{
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
if (!tui_active || (TUI_CMD_WIN == NULL))
|
2001-07-22 06:24:44 +08:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-02-07 Andrew Cagney <cagney@redhat.com>
* tui/tui.h: Do not include <stdarg.h>, <string.h>, and
"ansidecl.h". Do not undef "reg" and "chtype". Fix case of
fields and variables.
* tui/tui-wingeneral.h (m_beVisible): Delete macro.
(m_beInvisible): Delete macro.
* tui/tui-data.h: Fix case case fields and variables.
(m_genWinPtrIsNull): Delete macro.
(tui_win_list): Rename winList.
(TUI_SRC_WIN): Rename srcWin.
(TUI_DISASM_WIN): Rename disassemWin.
(TUI_DATA_WIN): Rename dataWin.
(TUI_CMD_WIN): Rename cmdWin.
(m_genWinPtrNotNull): Delete macro.
(m_winPtrIsNull): Delete macro.
(m_winPtrNotNull): Delete macro.
(tui_win_is_source_type): Replace m_winIsSourceType
(tui_win_is_auxillary): Replace m_winIsAuzillary.
(tui_win_has_locator): Replace m_hasLocator.
(tui_set_win_highlight): Replace m_setWinHighlightOn and
m_setWinHighlightOff.
* tui/tui-data.c: Update references.
(tui_win_is_source_type, tui_set_win_highlight): New functions.
(tui_win_has_locator, tui_win_is_auxillary): New functions.
* tui/tui-command.c, tui/tui-disasm.c: Update references.
* tui/tui-io.c, tui/tui-layout.c, tui/tui-regs.c: Ditto.
* tui/tui-regs.h, tui/tui-source.c, tui/tui-stack.c: Ditto.
* tui/tui-win.c, tui/tui-windata.c, tui/tui-wingeneral.c: Ditto.
* tui/tui-winsource.c, tui/tui.c: Ditto.
2004-02-08 04:57:02 +08:00
|
|
|
*width = TUI_CMD_WIN->generic.width;
|
|
|
|
*height = TUI_CMD_WIN->generic.height;
|
2001-07-22 06:24:44 +08:00
|
|
|
return 1;
|
|
|
|
}
|