From 1bace02a96a7124accf7910f271663b0b7e8754b Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Sun, 20 Dec 2020 16:45:57 +0100 Subject: [PATCH] Initial TUI mouse support Implements an overridable tui_win_info::click method whose arguments are the mouse coordinates inside the specific window, and the mouse button clicked. And if the curses implementation supports 5 buttons, the 4th and 5th buttons are used for scrolling. gdb/ChangeLog: 2021-06-04 Hannes Domani * ser-mingw.c (console_select_thread): Handle MOUSE_EVENT. * tui/tui-data.h (struct tui_win_info): Add click function. * tui/tui-io.c (tui_prep_terminal): Enable mouse events. (tui_deprep_terminal): Disable mouse events. (tui_dispatch_ctrl_char): Handle KEY_MOUSE. * tui/tui.c (tui_disable): Disable mouse events. --- gdb/ChangeLog | 9 +++++++++ gdb/ser-mingw.c | 5 +++++ gdb/tui/tui-data.h | 7 +++++++ gdb/tui/tui-io.c | 37 +++++++++++++++++++++++++++++++++++++ gdb/tui/tui.c | 4 ++++ 5 files changed, 62 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1dd4d3e76f1..fca6750de38 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2021-06-04 Hannes Domani + + * ser-mingw.c (console_select_thread): Handle MOUSE_EVENT. + * tui/tui-data.h (struct tui_win_info): Add click function. + * tui/tui-io.c (tui_prep_terminal): Enable mouse events. + (tui_deprep_terminal): Disable mouse events. + (tui_dispatch_ctrl_char): Handle KEY_MOUSE. + * tui/tui.c (tui_disable): Disable mouse events. + 2021-06-03 Magne Hov PR python/27841 diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 043bb50b577..2bad51310f6 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -599,6 +599,11 @@ console_select_thread (void *arg) break; } } + else if (record.EventType == MOUSE_EVENT) + { + SetEvent (state->read_event); + break; + } /* Otherwise discard it and wait again. */ ReadConsoleInput (h, &record, 1, &n_records); diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index b4d788dd0a4..9fa39fa58f3 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -137,6 +137,13 @@ public: return true; } + /* Called for each mouse click inside this window. Coordinates MOUSE_X + and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can + be 1 (left), 2 (middle), or 3 (right). */ + virtual void click (int mouse_x, int mouse_y, int mouse_button) + { + } + void check_and_display_highlight_if_needed (); /* Window handle. */ diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index a2be4d4353e..7df0e2f1bd3 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -639,6 +639,9 @@ tui_redisplay_readline (void) static void tui_prep_terminal (int notused1) { +#ifdef NCURSES_MOUSE_VERSION + mousemask (ALL_MOUSE_EVENTS, NULL); +#endif } /* Readline callback to restore the terminal. It is called once each @@ -646,6 +649,9 @@ tui_prep_terminal (int notused1) static void tui_deprep_terminal (void) { +#ifdef NCURSES_MOUSE_VERSION + mousemask (0, NULL); +#endif } #ifdef TUI_USE_PIPE_FOR_READLINE @@ -978,6 +984,37 @@ tui_dispatch_ctrl_char (unsigned int ch) case KEY_LEFT: win_info->right_scroll (1); break; +#ifdef NCURSES_MOUSE_VERSION + case KEY_MOUSE: + { + MEVENT mev; + if (getmouse (&mev) != OK) + break; + + for (tui_win_info *wi : all_tui_windows ()) + if (mev.x > wi->x && mev.x < wi->x + wi->width - 1 + && mev.y > wi->y && mev.y < wi->y + wi->height - 1) + { + if ((mev.bstate & BUTTON1_CLICKED) != 0 + || (mev.bstate & BUTTON2_CLICKED) != 0 + || (mev.bstate & BUTTON3_CLICKED) != 0) + { + int button = (mev.bstate & BUTTON1_CLICKED) != 0 ? 1 + : ((mev.bstate & BUTTON2_CLICKED) != 0 ? 2 + : 3); + wi->click (mev.x - wi->x - 1, mev.y - wi->y - 1, button); + } +#ifdef BUTTON5_PRESSED + else if ((mev.bstate & BUTTON4_PRESSED) != 0) + wi->backward_scroll (3); + else if ((mev.bstate & BUTTON5_PRESSED) != 0) + wi->forward_scroll (3); +#endif + break; + } + } + break; +#endif case '\f': break; default: diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c index af92b2a8042..529fc62c9ac 100644 --- a/gdb/tui/tui.c +++ b/gdb/tui/tui.c @@ -508,6 +508,10 @@ tui_disable (void) rl_startup_hook = 0; rl_already_prompted = 0; +#ifdef NCURSES_MOUSE_VERSION + mousemask (0, NULL); +#endif + /* Leave curses and restore previous gdb terminal setting. */ endwin (); -- 2.30.2