From: Hannes Domani via Gdb-patches <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Subject: [PATCHv2 1/2] Initial TUI mouse support
Date: Sat, 29 May 2021 16:26:35 +0200 [thread overview]
Message-ID: <20210529142636.11432-1-ssbssa@yahoo.de> (raw)
In-Reply-To: <20210529142636.11432-1-ssbssa.ref@yahoo.de>
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.
2021-05-29 Hannes Domani <ssbssa@yahoo.de>
* 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.
---
Should there be a configure option for this at build time?
I don't know if the mousemask/getmouse functions are available for
all curses variants, so I would imagine an option --enable-mouse:
- yes -> error if getmouse can't be linked
- no -> just disable
- auto -> enable if getmouse can be linked
v2:
- Added ChangeLog.
---
gdb/ser-mingw.c | 5 +++++
gdb/tui/tui-data.h | 5 +++++
gdb/tui/tui-io.c | 32 ++++++++++++++++++++++++++++++++
gdb/tui/tui.c | 2 ++
4 files changed, 44 insertions(+)
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..74a8b78395b 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -137,6 +137,11 @@ struct tui_win_info
return true;
}
+ /* Called for each mouse click inside this window. */
+ 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..7787789f0c7 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -33,6 +33,7 @@
#include "tui/tui-wingeneral.h"
#include "tui/tui-file.h"
#include "tui/tui-out.h"
+#include "tui/tui-source.h"
#include "ui-out.h"
#include "cli-out.h"
#include <fcntl.h>
@@ -639,6 +640,7 @@ tui_redisplay_readline (void)
static void
tui_prep_terminal (int notused1)
{
+ mousemask (ALL_MOUSE_EVENTS, NULL);
}
/* Readline callback to restore the terminal. It is called once each
@@ -646,6 +648,7 @@ tui_prep_terminal (int notused1)
static void
tui_deprep_terminal (void)
{
+ mousemask (0, NULL);
}
#ifdef TUI_USE_PIPE_FOR_READLINE
@@ -978,6 +981,35 @@ tui_dispatch_ctrl_char (unsigned int ch)
case KEY_LEFT:
win_info->right_scroll (1);
break;
+ 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)
+ || (mev.bstate & BUTTON2_CLICKED)
+ || (mev.bstate & BUTTON3_CLICKED))
+ {
+ int button = (mev.bstate & BUTTON1_CLICKED) ? 1
+ : (mev.bstate & BUTTON2_CLICKED) ? 2
+ : 3;
+ wi->click (mev.x - wi->x - 1, mev.y - wi->y - 1, button);
+ }
+#ifdef BUTTON5_PRESSED
+ else if (mev.bstate & BUTTON4_PRESSED)
+ wi->backward_scroll (3);
+ else if (mev.bstate & BUTTON5_PRESSED)
+ wi->forward_scroll (3);
+#endif
+ break;
+ }
+ }
+ break;
case '\f':
break;
default:
diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c
index af92b2a8042..a2654a2e5a4 100644
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -508,6 +508,8 @@ tui_disable (void)
rl_startup_hook = 0;
rl_already_prompted = 0;
+ mousemask (0, NULL);
+
/* Leave curses and restore previous gdb terminal setting. */
endwin ();
--
2.31.1
next parent reply other threads:[~2021-05-29 14:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20210529142636.11432-1-ssbssa.ref@yahoo.de>
2021-05-29 14:26 ` Hannes Domani via Gdb-patches [this message]
2021-05-29 14:26 ` [PATCHv2 2/2] Forward mouse click to python TUI window Hannes Domani via Gdb-patches
2021-05-29 14:49 ` Eli Zaretskii via Gdb-patches
2021-06-02 18:49 ` Tom Tromey
2021-06-02 18:48 ` [PATCHv2 1/2] Initial TUI mouse support Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210529142636.11432-1-ssbssa@yahoo.de \
--to=gdb-patches@sourceware.org \
--cc=ssbssa@yahoo.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox