public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
@ 2023-01-28  0:42 strager
  2023-01-28  8:35 ` Eli Zaretskii
  2023-02-02  9:33 ` Lancelot SIX
  0 siblings, 2 replies; 13+ messages in thread
From: strager @ 2023-01-28  0:42 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 6504 bytes --]

From 991bf4f7c3d58cb8d8858cf4284c360719843350 Mon Sep 17 00:00:00 2001
From: "Matthew \"strager\" Glazar" <strager.nds@gmail.com>
Date: Fri, 27 Jan 2023 16:19:45 -0800
Subject: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse
 selection

Rationale:
I use the mouse with my terminal to select and copy text. In gdb, I use
the mouse to select a function name to set a breakpoint, or a variable
name to print, for example.

When gdb is compiled with ncurses mouse support, gdb's TUI mode
intercepts mouse events. Left-clicking and dragging, which would
normally select text, seems to do nothing. This means I cannot select
text using my mouse anymore. This makes it harder to set breakpoints,
print variables, etc.

Solution:
I tried to fix this issue by editing the 'mousemask' call to only enable
buttons 4 and 5. However, this still caused my terminal (gnome-terminal)
to not allow text to be selected. The only way I could make it work is
by calling 'mousemask (0, NULL);'. But doing so disables the mouse code
entirely, which other people might want.

I therefore decided to make a setting in gdb called 'tui mouse-events'.
If enabled (the default), the behavior is as it is now: terminal mouse
events are given to gdb, disabling the terminal's default behavior.
If disabled (opt-in), the behavior is as it was before the year 2020:
terminal mouse events are not given to gdb, therefore the mouse can be
used to select and copy text.

Notes:
I am not attached to the setting name or its description. Feel free to
suggest better wording.

Testing:
I tested this change in gnome-terminal by performing the following steps
manually:

1. Run: gdb --args ./myprogram
2. Enable TUI: press ctrl-x ctrl-a
3. Click and drag text with the mouse. Observe no selection.
4. Input: set tui mouse-events off
5. Click and drag text with the mouse. Observe that selection works now.
6. Input: set tui mouse-events on
7. Click and drag text with the mouse Observe no selection.
---
 gdb/NEWS            |  7 +++++++
 gdb/doc/gdb.texinfo | 13 +++++++++++++
 gdb/tui/tui-io.c    |  3 ++-
 gdb/tui/tui-win.c   | 24 ++++++++++++++++++++++++
 gdb/tui/tui-win.h   |  3 +++
 5 files changed, 49 insertions(+), 1 deletion(-)

diff --git gdb/NEWS gdb/NEWS
index 2bc1672632a..c14158e41b5 100644
--- gdb/NEWS
+++ gdb/NEWS
@@ -17,6 +17,13 @@ maintenance print record-instruction [ N ]
   prints how GDB would undo the N-th previous instruction, and if N is
   positive, it prints how GDB will redo the N-th following instruction.

+set tui mouse-events [on|off]
+show tui mouse-events
+  When on (default), the TUI will interpret mouse clicks (including
scroll wheel
+  presses), overwriting the terminal's default behavior (usually text
+  selection). When off, the TUI will preserve the terminal's default behavior
+  for mouse events.
+
 * MI changes

 ** mi now reports 'no-history' as a stop reason when hitting the end of the
diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
index b5fad2cb16e..c36c24273d3 100644
--- gdb/doc/gdb.texinfo
+++ gdb/doc/gdb.texinfo
@@ -29867,6 +29867,19 @@ source text at the next tab stop; the compact
display uses only as
 much space as is needed for the line numbers in the current file, and
 only a single space to separate the line numbers from the source.

+@item set tui mouse-events @r{[}on@r{|}off@r{]}
+@kindex set tui mouse-events
+When on (default), the TUI will interpret mouse clicks (including scroll wheel
+presses), overwriting the terminal's default behavior (usually text selection).
+When off, the TUI will preserve the terminal's default behavior for mouse
+events.
+
+Set whether the TUI source window is displayed in ``compact'' form.
+The default display uses more space for line numbers and starts the
+source text at the next tab stop; the compact display uses only as
+much space as is needed for the line numbers in the current file, and
+only a single space to separate the line numbers from the source.
+
 @kindex set debug tui
 @item set debug tui @r{[}on|off@r{]}
 Turn on or off display of @value{GDBN} internal debug messages relating
diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
index a17cf38a1f2..45ef34aeab5 100644
--- gdb/tui/tui-io.c
+++ gdb/tui/tui-io.c
@@ -655,7 +655,8 @@ static void
 tui_prep_terminal (int notused1)
 {
 #ifdef NCURSES_MOUSE_VERSION
-  mousemask (ALL_MOUSE_EVENTS, NULL);
+  if (tui_enable_mouse)
+    mousemask (ALL_MOUSE_EVENTS, NULL);
 #endif
 }

diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
index 008189eb99b..5709bfcbac1 100644
--- gdb/tui/tui-win.c
+++ gdb/tui/tui-win.c
@@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file,
int from_tty,
   gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
 }

+bool tui_enable_mouse = true;
+
+/* Implement 'show tui mouse-events'.  */
+
+static void
+show_tui_mouse_events (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c, const char *value)
+{
+  gdb_printf (file, _("TUI mouse events is %s.\n"), value);
+}
+
 /* Set the tab width of the specified window.  */
 static void
 tui_set_tab_width_command (const char *arg, int from_tty)
@@ -1284,6 +1295,19 @@ position indicator is styled."),
                &style_set_list,
                &style_show_list);

+  add_setshow_boolean_cmd ("mouse-events", class_tui,
+               &tui_enable_mouse, _("\
+Set whether TUI mode handles mouse clicks."), _("\
+Show whether TUI mode handles mouse clicks."), _("\
+When on, the TUI will interpret mouse clicks (including scroll wheel
presses),\n\
+overwriting the terminal's default behavior (usually text selection).\n\
+When off, the TUI will preserve the terminal's default behavior for mouse\n\
+events."),
+
+               NULL,
+               show_tui_mouse_events,
+               &tui_setlist, &tui_showlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
index 4b33f1f2b54..039993fba34 100644
--- gdb/tui/tui-win.h
+++ gdb/tui/tui-win.h
@@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
 /* Whether compact source display should be used.  */
 extern bool compact_source;

+/* Whether the TUI should intercept terminal mouse events.  */
+extern bool tui_enable_mouse;
+
 /* Whether to style the source and assembly code highlighted by the TUI's
    current position indicator.  */
 extern bool style_tui_current_position;
-- 
2.29.2

[-- Attachment #2: 0001-gdb-tui-add-set-tui-mouse-events-off-to-restore-mous.patch --]
[-- Type: application/octet-stream, Size: 6452 bytes --]

From 991bf4f7c3d58cb8d8858cf4284c360719843350 Mon Sep 17 00:00:00 2001
From: "Matthew \"strager\" Glazar" <strager.nds@gmail.com>
Date: Fri, 27 Jan 2023 16:19:45 -0800
Subject: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse
 selection

Rationale:
I use the mouse with my terminal to select and copy text. In gdb, I use
the mouse to select a function name to set a breakpoint, or a variable
name to print, for example.

When gdb is compiled with ncurses mouse support, gdb's TUI mode
intercepts mouse events. Left-clicking and dragging, which would
normally select text, seems to do nothing. This means I cannot select
text using my mouse anymore. This makes it harder to set breakpoints,
print variables, etc.

Solution:
I tried to fix this issue by editing the 'mousemask' call to only enable
buttons 4 and 5. However, this still caused my terminal (gnome-terminal)
to not allow text to be selected. The only way I could make it work is
by calling 'mousemask (0, NULL);'. But doing so disables the mouse code
entirely, which other people might want.

I therefore decided to make a setting in gdb called 'tui mouse-events'.
If enabled (the default), the behavior is as it is now: terminal mouse
events are given to gdb, disabling the terminal's default behavior.
If disabled (opt-in), the behavior is as it was before the year 2020:
terminal mouse events are not given to gdb, therefore the mouse can be
used to select and copy text.

Notes:
I am not attached to the setting name or its description. Feel free to
suggest better wording.

Testing:
I tested this change in gnome-terminal by performing the following steps
manually:

1. Run: gdb --args ./myprogram
2. Enable TUI: press ctrl-x ctrl-a
3. Click and drag text with the mouse. Observe no selection.
4. Input: set tui mouse-events off
5. Click and drag text with the mouse. Observe that selection works now.
6. Input: set tui mouse-events on
7. Click and drag text with the mouse Observe no selection.
---
 gdb/NEWS            |  7 +++++++
 gdb/doc/gdb.texinfo | 13 +++++++++++++
 gdb/tui/tui-io.c    |  3 ++-
 gdb/tui/tui-win.c   | 24 ++++++++++++++++++++++++
 gdb/tui/tui-win.h   |  3 +++
 5 files changed, 49 insertions(+), 1 deletion(-)

diff --git gdb/NEWS gdb/NEWS
index 2bc1672632a..c14158e41b5 100644
--- gdb/NEWS
+++ gdb/NEWS
@@ -17,6 +17,13 @@ maintenance print record-instruction [ N ]
   prints how GDB would undo the N-th previous instruction, and if N is
   positive, it prints how GDB will redo the N-th following instruction.
 
+set tui mouse-events [on|off]
+show tui mouse-events
+  When on (default), the TUI will interpret mouse clicks (including scroll wheel
+  presses), overwriting the terminal's default behavior (usually text
+  selection). When off, the TUI will preserve the terminal's default behavior
+  for mouse events.
+
 * MI changes
 
 ** mi now reports 'no-history' as a stop reason when hitting the end of the
diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
index b5fad2cb16e..c36c24273d3 100644
--- gdb/doc/gdb.texinfo
+++ gdb/doc/gdb.texinfo
@@ -29867,6 +29867,19 @@ source text at the next tab stop; the compact display uses only as
 much space as is needed for the line numbers in the current file, and
 only a single space to separate the line numbers from the source.
 
+@item set tui mouse-events @r{[}on@r{|}off@r{]}
+@kindex set tui mouse-events
+When on (default), the TUI will interpret mouse clicks (including scroll wheel
+presses), overwriting the terminal's default behavior (usually text selection).
+When off, the TUI will preserve the terminal's default behavior for mouse
+events.
+
+Set whether the TUI source window is displayed in ``compact'' form.
+The default display uses more space for line numbers and starts the
+source text at the next tab stop; the compact display uses only as
+much space as is needed for the line numbers in the current file, and
+only a single space to separate the line numbers from the source.
+
 @kindex set debug tui
 @item set debug tui @r{[}on|off@r{]}
 Turn on or off display of @value{GDBN} internal debug messages relating
diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
index a17cf38a1f2..45ef34aeab5 100644
--- gdb/tui/tui-io.c
+++ gdb/tui/tui-io.c
@@ -655,7 +655,8 @@ static void
 tui_prep_terminal (int notused1)
 {
 #ifdef NCURSES_MOUSE_VERSION
-  mousemask (ALL_MOUSE_EVENTS, NULL);
+  if (tui_enable_mouse)
+    mousemask (ALL_MOUSE_EVENTS, NULL);
 #endif
 }
 
diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
index 008189eb99b..5709bfcbac1 100644
--- gdb/tui/tui-win.c
+++ gdb/tui/tui-win.c
@@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file, int from_tty,
   gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
 }
 
+bool tui_enable_mouse = true;
+
+/* Implement 'show tui mouse-events'.  */
+
+static void
+show_tui_mouse_events (struct ui_file *file, int from_tty,
+		       struct cmd_list_element *c, const char *value)
+{
+  gdb_printf (file, _("TUI mouse events is %s.\n"), value);
+}
+
 /* Set the tab width of the specified window.  */
 static void
 tui_set_tab_width_command (const char *arg, int from_tty)
@@ -1284,6 +1295,19 @@ position indicator is styled."),
 			   &style_set_list,
 			   &style_show_list);
 
+  add_setshow_boolean_cmd ("mouse-events", class_tui,
+			   &tui_enable_mouse, _("\
+Set whether TUI mode handles mouse clicks."), _("\
+Show whether TUI mode handles mouse clicks."), _("\
+When on, the TUI will interpret mouse clicks (including scroll wheel presses),\n\
+overwriting the terminal's default behavior (usually text selection).\n\
+When off, the TUI will preserve the terminal's default behavior for mouse\n\
+events."),
+
+			   NULL,
+			   show_tui_mouse_events,
+			   &tui_setlist, &tui_showlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
index 4b33f1f2b54..039993fba34 100644
--- gdb/tui/tui-win.h
+++ gdb/tui/tui-win.h
@@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
 /* Whether compact source display should be used.  */
 extern bool compact_source;
 
+/* Whether the TUI should intercept terminal mouse events.  */
+extern bool tui_enable_mouse;
+
 /* Whether to style the source and assembly code highlighted by the TUI's
    current position indicator.  */
 extern bool style_tui_current_position;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-01-28  0:42 [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection strager
@ 2023-01-28  8:35 ` Eli Zaretskii
  2023-02-01  8:35   ` strager
  2023-02-02  9:33 ` Lancelot SIX
  1 sibling, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2023-01-28  8:35 UTC (permalink / raw)
  To: strager; +Cc: gdb-patches

> Date: Fri, 27 Jan 2023 16:42:58 -0800
> From: strager via Gdb-patches <gdb-patches@sourceware.org>
> 
> Rationale:
> I use the mouse with my terminal to select and copy text. In gdb, I use
> the mouse to select a function name to set a breakpoint, or a variable
> name to print, for example.
> 
> When gdb is compiled with ncurses mouse support, gdb's TUI mode
> intercepts mouse events. Left-clicking and dragging, which would
> normally select text, seems to do nothing. This means I cannot select
> text using my mouse anymore. This makes it harder to set breakpoints,
> print variables, etc.
> 
> Solution:
> I tried to fix this issue by editing the 'mousemask' call to only enable
> buttons 4 and 5. However, this still caused my terminal (gnome-terminal)
> to not allow text to be selected. The only way I could make it work is
> by calling 'mousemask (0, NULL);'. But doing so disables the mouse code
> entirely, which other people might want.
> 
> I therefore decided to make a setting in gdb called 'tui mouse-events'.
> If enabled (the default), the behavior is as it is now: terminal mouse
> events are given to gdb, disabling the terminal's default behavior.
> If disabled (opt-in), the behavior is as it was before the year 2020:
> terminal mouse events are not given to gdb, therefore the mouse can be
> used to select and copy text.

Thanks.

> --- gdb/NEWS
> +++ gdb/NEWS
> @@ -17,6 +17,13 @@ maintenance print record-instruction [ N ]
>    prints how GDB would undo the N-th previous instruction, and if N is
>    positive, it prints how GDB will redo the N-th following instruction.
> 
> +set tui mouse-events [on|off]
> +show tui mouse-events
> +  When on (default), the TUI will interpret mouse clicks (including
> scroll wheel
> +  presses), overwriting the terminal's default behavior (usually text
> +  selection). When off, the TUI will preserve the terminal's default behavior
> +  for mouse events.

Instead of talking about overriding the terminal's behavior, this text
should say that the mouse events are interpreted either by GDB or by
the terminal.

> +Set whether the TUI source window is displayed in ``compact'' form.
> +The default display uses more space for line numbers and starts the
> +source text at the next tab stop; the compact display uses only as
> +much space as is needed for the line numbers in the current file, and
> +only a single space to separate the line numbers from the source.

This part sounds unrelated?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-01-28  8:35 ` Eli Zaretskii
@ 2023-02-01  8:35   ` strager
  2023-02-01 12:41     ` Eli Zaretskii
  2023-02-01 13:27     ` Andrew Burgess
  0 siblings, 2 replies; 13+ messages in thread
From: strager @ 2023-02-01  8:35 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 4478 bytes --]

Oops, I forgot to cc gdb-patches@.

> Instead of talking about overriding the terminal's behavior, this text
> should say that the mouse events are interpreted either by GDB or by
> the terminal.

Thanks for the feedback. I removed the duplicate copy of 'set tui
compact-source' documentation. I rewrote the 'set tui mouse-events'
documentation to avoid mentioning 'overriding'. I also fixed a typo in
the 'show tui mouse-events' command and fixed a typo in the commit
message (see attached).

---
 gdb/NEWS            |  6 ++++++
 gdb/doc/gdb.texinfo |  6 ++++++
 gdb/tui/tui-io.c    |  3 ++-
 gdb/tui/tui-win.c   | 23 +++++++++++++++++++++++
 gdb/tui/tui-win.h   |  3 +++
 5 files changed, 40 insertions(+), 1 deletion(-)

diff --git gdb/NEWS gdb/NEWS
index 445d28efed9..21399e86caa 100644
--- gdb/NEWS
+++ gdb/NEWS
@@ -38,6 +38,12 @@ maintenance print record-instruction [ N ]
   prints how GDB would undo the N-th previous instruction, and if N is
   positive, it prints how GDB will redo the N-th following instruction.

+set tui mouse-events [on|off]
+show tui mouse-events
+  When on (default), mouse clicks control the TUI and can be accessed by
+  plugins.  When off, mouse clicks are handled by the terminal.  This enables
+  terminal-native text selection.
+
 * MI changes

 ** mi now reports 'no-history' as a stop reason when hitting the end of the
diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
index 03033c7f9e3..02de9ad753a 100644
--- gdb/doc/gdb.texinfo
+++ gdb/doc/gdb.texinfo
@@ -29888,6 +29888,12 @@ source text at the next tab stop; the compact
display uses only as
 much space as is needed for the line numbers in the current file, and
 only a single space to separate the line numbers from the source.

+@item set tui mouse-events @r{[}on@r{|}off@r{]}
+@kindex set tui mouse-events
+When on (default), mouse clicks control the TUI and can be accessed by plugins.
+When off, mouse clicks are handled by the terminal. This enables
terminal-native
+text selection.
+
 @kindex set debug tui
 @item set debug tui @r{[}on|off@r{]}
 Turn on or off display of @value{GDBN} internal debug messages relating
diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
index a17cf38a1f2..45ef34aeab5 100644
--- gdb/tui/tui-io.c
+++ gdb/tui/tui-io.c
@@ -655,7 +655,8 @@ static void
 tui_prep_terminal (int notused1)
 {
 #ifdef NCURSES_MOUSE_VERSION
-  mousemask (ALL_MOUSE_EVENTS, NULL);
+  if (tui_enable_mouse)
+    mousemask (ALL_MOUSE_EVENTS, NULL);
 #endif
 }

diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
index 008189eb99b..d7124592ca4 100644
--- gdb/tui/tui-win.c
+++ gdb/tui/tui-win.c
@@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file,
int from_tty,
   gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
 }

+bool tui_enable_mouse = true;
+
+/* Implement 'show tui mouse-events'.  */
+
+static void
+show_tui_mouse_events (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c, const char *value)
+{
+  gdb_printf (file, _("TUI mouse events are %s.\n"), value);
+}
+
 /* Set the tab width of the specified window.  */
 static void
 tui_set_tab_width_command (const char *arg, int from_tty)
@@ -1284,6 +1295,18 @@ position indicator is styled."),
                &style_set_list,
                &style_show_list);

+  add_setshow_boolean_cmd ("mouse-events", class_tui,
+               &tui_enable_mouse, _("\
+Set whether TUI mode handles mouse clicks."), _("\
+Show whether TUI mode handles mouse clicks."), _("\
+When on (default), mouse clicks control the TUI and can be accessed
by plugins.\n\
+When off, mouse clicks are handled by the terminal. This enables
terminal-native\n\
+text selection."),
+
+               NULL,
+               show_tui_mouse_events,
+               &tui_setlist, &tui_showlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
index 4b33f1f2b54..039993fba34 100644
--- gdb/tui/tui-win.h
+++ gdb/tui/tui-win.h
@@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
 /* Whether compact source display should be used.  */
 extern bool compact_source;

+/* Whether the TUI should intercept terminal mouse events.  */
+extern bool tui_enable_mouse;
+
 /* Whether to style the source and assembly code highlighted by the TUI's
    current position indicator.  */
 extern bool style_tui_current_position;
-- 
2.29.2

[-- Attachment #2: 0001-gdb-tui-add-set-tui-mouse-events-off-to-restore-mous.patch --]
[-- Type: application/octet-stream, Size: 5911 bytes --]

From 3ee6bc8ad0b5ac17725233ba88aa4d12167df4f7 Mon Sep 17 00:00:00 2001
From: "Matthew \"strager\" Glazar" <strager.nds@gmail.com>
Date: Fri, 27 Jan 2023 16:19:45 -0800
Subject: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse
 selection

Rationale:
I use the mouse with my terminal to select and copy text. In gdb, I use
the mouse to select a function name to set a breakpoint, or a variable
name to print, for example.

When gdb is compiled with ncurses mouse support, gdb's TUI mode
intercepts mouse events. Left-clicking and dragging, which would
normally select text, seems to do nothing. This means I cannot select
text using my mouse anymore. This makes it harder to set breakpoints,
print variables, etc.

Solution:
I tried to fix this issue by editing the 'mousemask' call to only enable
buttons 4 and 5. However, this still caused my terminal (gnome-terminal)
to not allow text to be selected. The only way I could make it work is
by calling 'mousemask (0, NULL);'. But doing so disables the mouse code
entirely, which other people might want.

I therefore decided to make a setting in gdb called 'tui mouse-events'.
If enabled (the default), the behavior is as it is now: terminal mouse
events are given to gdb, disabling the terminal's default behavior.
If disabled (opt-in), the behavior is as it was before the year 2020:
terminal mouse events are not given to gdb, therefore the mouse can be
used to select and copy text.

Notes:
I am not attached to the setting name or its description. Feel free to
suggest better wording.

Testing:
I tested this change in gnome-terminal by performing the following steps
manually:

1. Run: gdb --args ./myprogram
2. Enable TUI: press ctrl-x ctrl-a
3. Click and drag text with the mouse. Observe no selection.
4. Input: set tui mouse-events off
5. Click and drag text with the mouse. Observe that selection works now.
6. Input: set tui mouse-events on.
7. Click and drag text with the mouse Observe no selection.
---
 gdb/NEWS            |  6 ++++++
 gdb/doc/gdb.texinfo |  6 ++++++
 gdb/tui/tui-io.c    |  3 ++-
 gdb/tui/tui-win.c   | 23 +++++++++++++++++++++++
 gdb/tui/tui-win.h   |  3 +++
 5 files changed, 40 insertions(+), 1 deletion(-)

diff --git gdb/NEWS gdb/NEWS
index 445d28efed9..21399e86caa 100644
--- gdb/NEWS
+++ gdb/NEWS
@@ -38,6 +38,12 @@ maintenance print record-instruction [ N ]
   prints how GDB would undo the N-th previous instruction, and if N is
   positive, it prints how GDB will redo the N-th following instruction.
 
+set tui mouse-events [on|off]
+show tui mouse-events
+  When on (default), mouse clicks control the TUI and can be accessed by
+  plugins.  When off, mouse clicks are handled by the terminal.  This enables
+  terminal-native text selection.
+
 * MI changes
 
 ** mi now reports 'no-history' as a stop reason when hitting the end of the
diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
index 03033c7f9e3..02de9ad753a 100644
--- gdb/doc/gdb.texinfo
+++ gdb/doc/gdb.texinfo
@@ -29888,6 +29888,12 @@ source text at the next tab stop; the compact display uses only as
 much space as is needed for the line numbers in the current file, and
 only a single space to separate the line numbers from the source.
 
+@item set tui mouse-events @r{[}on@r{|}off@r{]}
+@kindex set tui mouse-events
+When on (default), mouse clicks control the TUI and can be accessed by plugins.
+When off, mouse clicks are handled by the terminal. This enables terminal-native
+text selection.
+
 @kindex set debug tui
 @item set debug tui @r{[}on|off@r{]}
 Turn on or off display of @value{GDBN} internal debug messages relating
diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
index a17cf38a1f2..45ef34aeab5 100644
--- gdb/tui/tui-io.c
+++ gdb/tui/tui-io.c
@@ -655,7 +655,8 @@ static void
 tui_prep_terminal (int notused1)
 {
 #ifdef NCURSES_MOUSE_VERSION
-  mousemask (ALL_MOUSE_EVENTS, NULL);
+  if (tui_enable_mouse)
+    mousemask (ALL_MOUSE_EVENTS, NULL);
 #endif
 }
 
diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
index 008189eb99b..d7124592ca4 100644
--- gdb/tui/tui-win.c
+++ gdb/tui/tui-win.c
@@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file, int from_tty,
   gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
 }
 
+bool tui_enable_mouse = true;
+
+/* Implement 'show tui mouse-events'.  */
+
+static void
+show_tui_mouse_events (struct ui_file *file, int from_tty,
+		       struct cmd_list_element *c, const char *value)
+{
+  gdb_printf (file, _("TUI mouse events are %s.\n"), value);
+}
+
 /* Set the tab width of the specified window.  */
 static void
 tui_set_tab_width_command (const char *arg, int from_tty)
@@ -1284,6 +1295,18 @@ position indicator is styled."),
 			   &style_set_list,
 			   &style_show_list);
 
+  add_setshow_boolean_cmd ("mouse-events", class_tui,
+			   &tui_enable_mouse, _("\
+Set whether TUI mode handles mouse clicks."), _("\
+Show whether TUI mode handles mouse clicks."), _("\
+When on (default), mouse clicks control the TUI and can be accessed by plugins.\n\
+When off, mouse clicks are handled by the terminal. This enables terminal-native\n\
+text selection."),
+
+			   NULL,
+			   show_tui_mouse_events,
+			   &tui_setlist, &tui_showlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
index 4b33f1f2b54..039993fba34 100644
--- gdb/tui/tui-win.h
+++ gdb/tui/tui-win.h
@@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
 /* Whether compact source display should be used.  */
 extern bool compact_source;
 
+/* Whether the TUI should intercept terminal mouse events.  */
+extern bool tui_enable_mouse;
+
 /* Whether to style the source and assembly code highlighted by the TUI's
    current position indicator.  */
 extern bool style_tui_current_position;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-01  8:35   ` strager
@ 2023-02-01 12:41     ` Eli Zaretskii
  2023-02-01 13:27     ` Andrew Burgess
  1 sibling, 0 replies; 13+ messages in thread
From: Eli Zaretskii @ 2023-02-01 12:41 UTC (permalink / raw)
  To: strager; +Cc: gdb-patches

> From: strager <strager.nds@gmail.com>
> Date: Wed, 1 Feb 2023 00:35:47 -0800
> Cc: gdb-patches@sourceware.org
> 
> +set tui mouse-events [on|off]
> +show tui mouse-events
> +  When on (default), mouse clicks control the TUI and can be accessed by
> +  plugins.  When off, mouse clicks are handled by the terminal.  This enables
> +  terminal-native text selection.

This is OK, except that I don't think we use the term "plug-in" in our
documentation.  I suggest to use "Python extensions" instead.

> +@item set tui mouse-events @r{[}on@r{|}off@r{]}
> +@kindex set tui mouse-events
> +When on (default), mouse clicks control the TUI and can be accessed by plugins.
> +When off, mouse clicks are handled by the terminal. This enables
> terminal-native
> +text selection.

Likewise here, and also please leave 2 spaces between sentences, per
US English conventions we use in our documentation.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-01  8:35   ` strager
  2023-02-01 12:41     ` Eli Zaretskii
@ 2023-02-01 13:27     ` Andrew Burgess
  2023-02-02  1:08       ` strager
  1 sibling, 1 reply; 13+ messages in thread
From: Andrew Burgess @ 2023-02-01 13:27 UTC (permalink / raw)
  To: strager, Eli Zaretskii; +Cc: gdb-patches

strager via Gdb-patches <gdb-patches@sourceware.org> writes:

> Oops, I forgot to cc gdb-patches@.
>
>> Instead of talking about overriding the terminal's behavior, this text
>> should say that the mouse events are interpreted either by GDB or by
>> the terminal.
>
> Thanks for the feedback. I removed the duplicate copy of 'set tui
> compact-source' documentation. I rewrote the 'set tui mouse-events'
> documentation to avoid mentioning 'overriding'. I also fixed a typo in
> the 'show tui mouse-events' command and fixed a typo in the commit
> message (see attached).
>
> ---
>  gdb/NEWS            |  6 ++++++
>  gdb/doc/gdb.texinfo |  6 ++++++
>  gdb/tui/tui-io.c    |  3 ++-
>  gdb/tui/tui-win.c   | 23 +++++++++++++++++++++++
>  gdb/tui/tui-win.h   |  3 +++
>  5 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git gdb/NEWS gdb/NEWS
> index 445d28efed9..21399e86caa 100644
> --- gdb/NEWS
> +++ gdb/NEWS
> @@ -38,6 +38,12 @@ maintenance print record-instruction [ N ]
>    prints how GDB would undo the N-th previous instruction, and if N is
>    positive, it prints how GDB will redo the N-th following instruction.
>
> +set tui mouse-events [on|off]
> +show tui mouse-events
> +  When on (default), mouse clicks control the TUI and can be accessed by
> +  plugins.  When off, mouse clicks are handled by the terminal.  This enables
> +  terminal-native text selection.
> +
>  * MI changes
>
>  ** mi now reports 'no-history' as a stop reason when hitting the end of the
> diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
> index 03033c7f9e3..02de9ad753a 100644
> --- gdb/doc/gdb.texinfo
> +++ gdb/doc/gdb.texinfo
> @@ -29888,6 +29888,12 @@ source text at the next tab stop; the compact
> display uses only as
>  much space as is needed for the line numbers in the current file, and
>  only a single space to separate the line numbers from the source.
>
> +@item set tui mouse-events @r{[}on@r{|}off@r{]}
> +@kindex set tui mouse-events
> +When on (default), mouse clicks control the TUI and can be accessed by plugins.
> +When off, mouse clicks are handled by the terminal. This enables
> terminal-native
> +text selection.
> +
>  @kindex set debug tui
>  @item set debug tui @r{[}on|off@r{]}
>  Turn on or off display of @value{GDBN} internal debug messages relating
> diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
> index a17cf38a1f2..45ef34aeab5 100644
> --- gdb/tui/tui-io.c
> +++ gdb/tui/tui-io.c
> @@ -655,7 +655,8 @@ static void
>  tui_prep_terminal (int notused1)
>  {
>  #ifdef NCURSES_MOUSE_VERSION
> -  mousemask (ALL_MOUSE_EVENTS, NULL);
> +  if (tui_enable_mouse)
> +    mousemask (ALL_MOUSE_EVENTS, NULL);
>  #endif
>  }
>
> diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
> index 008189eb99b..d7124592ca4 100644
> --- gdb/tui/tui-win.c
> +++ gdb/tui/tui-win.c
> @@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file,
> int from_tty,
>    gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
>  }
>
> +bool tui_enable_mouse = true;
> +
> +/* Implement 'show tui mouse-events'.  */
> +
> +static void
> +show_tui_mouse_events (struct ui_file *file, int from_tty,
> +               struct cmd_list_element *c, const char *value)
> +{
> +  gdb_printf (file, _("TUI mouse events are %s.\n"), value);
> +}
> +
>  /* Set the tab width of the specified window.  */
>  static void
>  tui_set_tab_width_command (const char *arg, int from_tty)
> @@ -1284,6 +1295,18 @@ position indicator is styled."),
>                 &style_set_list,
>                 &style_show_list);
>
> +  add_setshow_boolean_cmd ("mouse-events", class_tui,
> +               &tui_enable_mouse, _("\
> +Set whether TUI mode handles mouse clicks."), _("\
> +Show whether TUI mode handles mouse clicks."), _("\
> +When on (default), mouse clicks control the TUI and can be accessed
> by plugins.\n\
> +When off, mouse clicks are handled by the terminal. This enables
> terminal-native\n\
> +text selection."),
> +
> +               NULL,
> +               show_tui_mouse_events,
> +               &tui_setlist, &tui_showlist);
> +
>    tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>    tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>  }
> diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
> index 4b33f1f2b54..039993fba34 100644
> --- gdb/tui/tui-win.h
> +++ gdb/tui/tui-win.h
> @@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
>  /* Whether compact source display should be used.  */
>  extern bool compact_source;
>
> +/* Whether the TUI should intercept terminal mouse events.  */
> +extern bool tui_enable_mouse;
> +
>  /* Whether to style the source and assembly code highlighted by the TUI's
>     current position indicator.  */
>  extern bool style_tui_current_position;
> -- 
> 2.29.2
> From 3ee6bc8ad0b5ac17725233ba88aa4d12167df4f7 Mon Sep 17 00:00:00 2001
> From: "Matthew \"strager\" Glazar" <strager.nds@gmail.com>
> Date: Fri, 27 Jan 2023 16:19:45 -0800
> Subject: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse
>  selection
>
> Rationale:
> I use the mouse with my terminal to select and copy text. In gdb, I use
> the mouse to select a function name to set a breakpoint, or a variable
> name to print, for example.
>
> When gdb is compiled with ncurses mouse support, gdb's TUI mode
> intercepts mouse events. Left-clicking and dragging, which would
> normally select text, seems to do nothing. This means I cannot select
> text using my mouse anymore. This makes it harder to set breakpoints,
> print variables, etc.
>
> Solution:
> I tried to fix this issue by editing the 'mousemask' call to only enable
> buttons 4 and 5. However, this still caused my terminal (gnome-terminal)
> to not allow text to be selected. The only way I could make it work is
> by calling 'mousemask (0, NULL);'. But doing so disables the mouse code
> entirely, which other people might want.
>
> I therefore decided to make a setting in gdb called 'tui mouse-events'.
> If enabled (the default), the behavior is as it is now: terminal mouse
> events are given to gdb, disabling the terminal's default behavior.
> If disabled (opt-in), the behavior is as it was before the year 2020:
> terminal mouse events are not given to gdb, therefore the mouse can be
> used to select and copy text.
>
> Notes:
> I am not attached to the setting name or its description. Feel free to
> suggest better wording.
>
> Testing:
> I tested this change in gnome-terminal by performing the following steps
> manually:
>
> 1. Run: gdb --args ./myprogram
> 2. Enable TUI: press ctrl-x ctrl-a
> 3. Click and drag text with the mouse. Observe no selection.
> 4. Input: set tui mouse-events off
> 5. Click and drag text with the mouse. Observe that selection works now.
> 6. Input: set tui mouse-events on.
> 7. Click and drag text with the mouse Observe no selection.
> ---
>  gdb/NEWS            |  6 ++++++
>  gdb/doc/gdb.texinfo |  6 ++++++
>  gdb/tui/tui-io.c    |  3 ++-
>  gdb/tui/tui-win.c   | 23 +++++++++++++++++++++++
>  gdb/tui/tui-win.h   |  3 +++
>  5 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git gdb/NEWS gdb/NEWS
> index 445d28efed9..21399e86caa 100644
> --- gdb/NEWS
> +++ gdb/NEWS
> @@ -38,6 +38,12 @@ maintenance print record-instruction [ N ]
>    prints how GDB would undo the N-th previous instruction, and if N is
>    positive, it prints how GDB will redo the N-th following instruction.
>  
> +set tui mouse-events [on|off]
> +show tui mouse-events
> +  When on (default), mouse clicks control the TUI and can be accessed by
> +  plugins.  When off, mouse clicks are handled by the terminal.  This enables
> +  terminal-native text selection.
> +
>  * MI changes
>  
>  ** mi now reports 'no-history' as a stop reason when hitting the end of the
> diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
> index 03033c7f9e3..02de9ad753a 100644
> --- gdb/doc/gdb.texinfo
> +++ gdb/doc/gdb.texinfo
> @@ -29888,6 +29888,12 @@ source text at the next tab stop; the compact display uses only as
>  much space as is needed for the line numbers in the current file, and
>  only a single space to separate the line numbers from the source.
>  
> +@item set tui mouse-events @r{[}on@r{|}off@r{]}
> +@kindex set tui mouse-events
> +When on (default), mouse clicks control the TUI and can be accessed by plugins.
> +When off, mouse clicks are handled by the terminal. This enables terminal-native
> +text selection.

I think it would be worth adding some text to the description of
Window.click in doc/python.texi, along with a cross-reference back to
this setting, as the Window.click is not going to work when this setting
is off.

Thanks,
Andrew

> +
>  @kindex set debug tui
>  @item set debug tui @r{[}on|off@r{]}
>  Turn on or off display of @value{GDBN} internal debug messages relating
> diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
> index a17cf38a1f2..45ef34aeab5 100644
> --- gdb/tui/tui-io.c
> +++ gdb/tui/tui-io.c
> @@ -655,7 +655,8 @@ static void
>  tui_prep_terminal (int notused1)
>  {
>  #ifdef NCURSES_MOUSE_VERSION
> -  mousemask (ALL_MOUSE_EVENTS, NULL);
> +  if (tui_enable_mouse)
> +    mousemask (ALL_MOUSE_EVENTS, NULL);
>  #endif
>  }
>  
> diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
> index 008189eb99b..d7124592ca4 100644
> --- gdb/tui/tui-win.c
> +++ gdb/tui/tui-win.c
> @@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file, int from_tty,
>    gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
>  }
>  
> +bool tui_enable_mouse = true;
> +
> +/* Implement 'show tui mouse-events'.  */
> +
> +static void
> +show_tui_mouse_events (struct ui_file *file, int from_tty,
> +		       struct cmd_list_element *c, const char *value)
> +{
> +  gdb_printf (file, _("TUI mouse events are %s.\n"), value);
> +}
> +
>  /* Set the tab width of the specified window.  */
>  static void
>  tui_set_tab_width_command (const char *arg, int from_tty)
> @@ -1284,6 +1295,18 @@ position indicator is styled."),
>  			   &style_set_list,
>  			   &style_show_list);
>  
> +  add_setshow_boolean_cmd ("mouse-events", class_tui,
> +			   &tui_enable_mouse, _("\
> +Set whether TUI mode handles mouse clicks."), _("\
> +Show whether TUI mode handles mouse clicks."), _("\
> +When on (default), mouse clicks control the TUI and can be accessed by plugins.\n\
> +When off, mouse clicks are handled by the terminal. This enables terminal-native\n\
> +text selection."),
> +
> +			   NULL,
> +			   show_tui_mouse_events,
> +			   &tui_setlist, &tui_showlist);
> +
>    tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>    tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>  }
> diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
> index 4b33f1f2b54..039993fba34 100644
> --- gdb/tui/tui-win.h
> +++ gdb/tui/tui-win.h
> @@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
>  /* Whether compact source display should be used.  */
>  extern bool compact_source;
>  
> +/* Whether the TUI should intercept terminal mouse events.  */
> +extern bool tui_enable_mouse;
> +
>  /* Whether to style the source and assembly code highlighted by the TUI's
>     current position indicator.  */
>  extern bool style_tui_current_position;
> -- 
> 2.29.2


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-01 13:27     ` Andrew Burgess
@ 2023-02-02  1:08       ` strager
  2023-02-02  7:18         ` Eli Zaretskii
  2023-02-02 19:50         ` Pedro Alves
  0 siblings, 2 replies; 13+ messages in thread
From: strager @ 2023-02-02  1:08 UTC (permalink / raw)
  To: Andrew Burgess, Eli Zaretskii; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 6598 bytes --]

On Wed, Feb 1, 2023 at 4:41 AM Eli Zaretskii <eliz@gnu.org> wrote:
> This is OK, except that I don't think we use the term "plug-in" in our
> documentation.  I suggest to use "Python extensions" instead.

Fixed!

On Wed, Feb 1, 2023 at 4:41 AM Eli Zaretskii <eliz@gnu.org> wrote:
> Likewise here, and also please leave 2 spaces between sentences, per
> US English conventions we use in our documentation.
Fixed!

On Wed, Feb 1, 2023 at 5:27 AM Andrew Burgess <aburgess@redhat.com> wrote:
> I think it would be worth adding some text to the description of
> Window.click in doc/python.texi, along with a cross-reference back to
> this setting, as the Window.click is not going to work when this setting
> is off.

Great idea! I also found the "TUI Mouse Support" section and included
a few links in there too.

This is my first time using texinfo, so let me know if I made any mistakes.

Updated patch is attached.

---
 gdb/NEWS            |  6 ++++++
 gdb/doc/gdb.texinfo | 15 ++++++++++++++-
 gdb/doc/python.texi |  5 +++++
 gdb/tui/tui-io.c    |  3 ++-
 gdb/tui/tui-win.c   | 22 ++++++++++++++++++++++
 gdb/tui/tui-win.h   |  3 +++
 6 files changed, 52 insertions(+), 2 deletions(-)

diff --git gdb/NEWS gdb/NEWS
index 445d28efed9..1a00a6bd799 100644
--- gdb/NEWS
+++ gdb/NEWS
@@ -38,6 +38,12 @@ maintenance print record-instruction [ N ]
   prints how GDB would undo the N-th previous instruction, and if N is
   positive, it prints how GDB will redo the N-th following instruction.

+set tui mouse-events [on|off]
+show tui mouse-events
+  When on (default), mouse clicks control the TUI and can be accessed by
+  Python extensions.  When off, mouse clicks are handled by the terminal,
+  enabling terminal-native text selection.
+
 * MI changes

 ** mi now reports 'no-history' as a stop reason when hitting the end of the
diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
index 03033c7f9e3..65e85c7f8a1 100644
--- gdb/doc/gdb.texinfo
+++ gdb/doc/gdb.texinfo
@@ -29606,7 +29606,13 @@ the @key{SHIFT} key on your keyboard to
temporarily bypass
 @value{GDBN}'s TUI and access the terminal's native mouse copy/paste
 functionality (commonly, click-drag-release or double-click to select
 text, middle-click to paste).  This copy/paste works with the
-terminal's selection buffer, as opposed to the TUI's buffer.
+terminal's selection buffer, as opposed to the TUI's buffer.  Alternatively, to
+disable mouse support in the TUI entirely and give the terminal control over
+mouse clicks, turn off the @code{tui mouse-events} setting
+(@pxref{tui-mouse-events,,set tui mouse-events}).
+
+Python extensions can react to mouse clicks
+(@pxref{python-window-click,,Window.click}).

 @node TUI Commands
 @section TUI-specific Commands
@@ -29888,6 +29894,13 @@ source text at the next tab stop; the compact
display uses only as
 much space as is needed for the line numbers in the current file, and
 only a single space to separate the line numbers from the source.

+@anchor{tui-mouse-events}
+@item set tui mouse-events @r{[}on@r{|}off@r{]}
+@kindex set tui mouse-events
+When on (default), mouse clicks control the TUI (@pxref{TUI Mouse Support}).
+When off, mouse clicks are handled by the terminal, enabling terminal-native
+text selection.
+
 @kindex set debug tui
 @item set debug tui @r{[}on|off@r{]}
 Turn on or off display of @value{GDBN} internal debug messages relating
diff --git gdb/doc/python.texi gdb/doc/python.texi
index b04f1de2ddf..ab3050ca15c 100644
--- gdb/doc/python.texi
+++ gdb/doc/python.texi
@@ -6722,11 +6722,16 @@ contents.  A positive argument should cause
the viewport to move down,
 and so the content should appear to move up.
 @end defun

+@anchor{python-window-click}
 @defun Window.click (@var{x}, @var{y}, @var{button})
 This is called on a mouse click in this window.  @var{x} and @var{y} are
 the mouse coordinates inside the window (0-based, from the top left
 corner), and @var{button} specifies which mouse button was used, whose
 values can be 1 (left), 2 (middle), or 3 (right).
+
+When TUI mouse events are disabled by turning off the @code{tui mouse-events}
+setting (@pxref{tui-mouse-events,,set tui mouse-events}), then
@code{click} will
+not be called.
 @end defun

 @node Disassembly In Python
diff --git gdb/tui/tui-io.c gdb/tui/tui-io.c
index a17cf38a1f2..45ef34aeab5 100644
--- gdb/tui/tui-io.c
+++ gdb/tui/tui-io.c
@@ -655,7 +655,8 @@ static void
 tui_prep_terminal (int notused1)
 {
 #ifdef NCURSES_MOUSE_VERSION
-  mousemask (ALL_MOUSE_EVENTS, NULL);
+  if (tui_enable_mouse)
+    mousemask (ALL_MOUSE_EVENTS, NULL);
 #endif
 }

diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
index 008189eb99b..101fefcfe0a 100644
--- gdb/tui/tui-win.c
+++ gdb/tui/tui-win.c
@@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file,
int from_tty,
   gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
 }

+bool tui_enable_mouse = true;
+
+/* Implement 'show tui mouse-events'.  */
+
+static void
+show_tui_mouse_events (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c, const char *value)
+{
+  gdb_printf (file, _("TUI mouse events are %s.\n"), value);
+}
+
 /* Set the tab width of the specified window.  */
 static void
 tui_set_tab_width_command (const char *arg, int from_tty)
@@ -1284,6 +1295,17 @@ position indicator is styled."),
                &style_set_list,
                &style_show_list);

+  add_setshow_boolean_cmd ("mouse-events", class_tui,
+               &tui_enable_mouse, _("\
+Set whether TUI mode handles mouse clicks."), _("\
+Show whether TUI mode handles mouse clicks."), _("\
+When on (default), mouse clicks control the TUI and can be accessed
by Python\n\
+extensions.  When off, mouse clicks are handled by the terminal, enabling\n\
+terminal-native text selection."),
+               NULL,
+               show_tui_mouse_events,
+               &tui_setlist, &tui_showlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
diff --git gdb/tui/tui-win.h gdb/tui/tui-win.h
index 4b33f1f2b54..039993fba34 100644
--- gdb/tui/tui-win.h
+++ gdb/tui/tui-win.h
@@ -51,6 +51,9 @@ struct cmd_list_element **tui_get_cmd_list (void);
 /* Whether compact source display should be used.  */
 extern bool compact_source;

+/* Whether the TUI should intercept terminal mouse events.  */
+extern bool tui_enable_mouse;
+
 /* Whether to style the source and assembly code highlighted by the TUI's
    current position indicator.  */
 extern bool style_tui_current_position;
-- 
2.29.2

[-- Attachment #2: 0001-gdb-tui-add-set-tui-mouse-events-off-to-restore-mous.patch --]
[-- Type: application/x-patch, Size: 7614 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-02  1:08       ` strager
@ 2023-02-02  7:18         ` Eli Zaretskii
  2023-02-02 19:50         ` Pedro Alves
  1 sibling, 0 replies; 13+ messages in thread
From: Eli Zaretskii @ 2023-02-02  7:18 UTC (permalink / raw)
  To: strager; +Cc: aburgess, gdb-patches

> From: strager <strager.nds@gmail.com>
> Date: Wed, 1 Feb 2023 17:08:55 -0800
> Cc: gdb-patches@sourceware.org
> 
> ---
>  gdb/NEWS            |  6 ++++++
>  gdb/doc/gdb.texinfo | 15 ++++++++++++++-
>  gdb/doc/python.texi |  5 +++++
>  gdb/tui/tui-io.c    |  3 ++-
>  gdb/tui/tui-win.c   | 22 ++++++++++++++++++++++
>  gdb/tui/tui-win.h   |  3 +++
>  6 files changed, 52 insertions(+), 2 deletions(-)

The documentation parts of this version are OK, thanks.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-01-28  0:42 [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection strager
  2023-01-28  8:35 ` Eli Zaretskii
@ 2023-02-02  9:33 ` Lancelot SIX
  2023-02-02 11:11   ` strager
  1 sibling, 1 reply; 13+ messages in thread
From: Lancelot SIX @ 2023-02-02  9:33 UTC (permalink / raw)
  To: strager; +Cc: gdb-patches

Hi,

Thanks for working on this!  I think I got used to use the "shift" key
when I try to select, but soon might soon have "set tui mouse-events
off" in my rc file.

I have some code formatting remarks:

  -  In GDB codebase, we use tab for indentation[1]:

      Lines should be indented with a mix of tabs and spaces.  8 spaces
      should be replaced with Tab.

      It looks like you patch uses spaces for indentation.

  -GDB prefers "nullptr" instead of "NULL".

I have inlined in the patch below where this is relevant.

Otherwise, and for what this is worth (I am not a maintainer), the change
looks reasonable to me.

Best,
Lancelot.

[1] https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#Code_indentation

> diff --git gdb/tui/tui-win.c gdb/tui/tui-win.c
> index 008189eb99b..5709bfcbac1 100644
> --- gdb/tui/tui-win.c
> +++ gdb/tui/tui-win.c
> @@ -897,6 +897,17 @@ tui_show_compact_source (struct ui_file *file,
> int from_tty,
>    gdb_printf (file, _("TUI source window compactness is %s.\n"), value);
>  }
> 
> +bool tui_enable_mouse = true;
> +
> +/* Implement 'show tui mouse-events'.  */
> +
> +static void
> +show_tui_mouse_events (struct ui_file *file, int from_tty,
> +               struct cmd_list_element *c, const char *value)

Use tabs here.

> +{
> +  gdb_printf (file, _("TUI mouse events is %s.\n"), value);
> +}
> +
>  /* Set the tab width of the specified window.  */
>  static void
>  tui_set_tab_width_command (const char *arg, int from_tty)
> @@ -1284,6 +1295,19 @@ position indicator is styled."),
>                 &style_set_list,
>                 &style_show_list);
> 
> +  add_setshow_boolean_cmd ("mouse-events", class_tui,
> +               &tui_enable_mouse, _("\

Same

> +Set whether TUI mode handles mouse clicks."), _("\
> +Show whether TUI mode handles mouse clicks."), _("\
> +When on, the TUI will interpret mouse clicks (including scroll wheel
> presses),\n\
> +overwriting the terminal's default behavior (usually text selection).\n\
> +When off, the TUI will preserve the terminal's default behavior for mouse\n\
> +events."),
> +

Extra empty line here could be removed.

> +               NULL,

s/NULL/nullptr/

> +               show_tui_mouse_events,
> +               &tui_setlist, &tui_showlist);

and tabs instead of spaces for the above lines.

> +
>    tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>    tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
>  }

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-02  9:33 ` Lancelot SIX
@ 2023-02-02 11:11   ` strager
  0 siblings, 0 replies; 13+ messages in thread
From: strager @ 2023-02-02 11:11 UTC (permalink / raw)
  To: Lancelot SIX; +Cc: gdb-patches

On Thu, Feb 2, 2023 at 1:33 AM Lancelot SIX <lsix@lancelotsix.com> wrote:
>
> Hi,
>
> Thanks for working on this!  I think I got used to use the "shift" key
> when I try to select, but soon might soon have "set tui mouse-events
> off" in my rc file.

I'm glad to hear my patch is useful to someone else!

I didn't know about the shift trick until *after* I submitted this patch. 😳

On Thu, Feb 2, 2023 at 1:33 AM Lancelot SIX <lsix@lancelotsix.com> wrote:
>   -  In GDB codebase, we use tab for indentation[1]:
>
>       Lines should be indented with a mix of tabs and spaces.  8 spaces
>       should be replaced with Tab.
>
>       It looks like you patch uses spaces for indentation.

That's probably an issue with my mail client. The email attachment
patch file should have the proper tabs.

On Thu, Feb 2, 2023 at 1:33 AM Lancelot SIX <lsix@lancelotsix.com> wrote:
>   -GDB prefers "nullptr" instead of "NULL".

I copied NULL from some other code in gdb, but I can change it if needed.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-02  1:08       ` strager
  2023-02-02  7:18         ` Eli Zaretskii
@ 2023-02-02 19:50         ` Pedro Alves
  2023-02-02 19:59           ` strager
  1 sibling, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2023-02-02 19:50 UTC (permalink / raw)
  To: strager, Andrew Burgess, Eli Zaretskii; +Cc: gdb-patches

On 2023-02-02 1:08 a.m., strager via Gdb-patches wrote:
> --- gdb/doc/gdb.texinfo
> +++ gdb/doc/gdb.texinfo
> @@ -29606,7 +29606,13 @@ the @key{SHIFT} key on your keyboard to
> temporarily bypass
>  @value{GDBN}'s TUI and access the terminal's native mouse copy/paste
>  functionality (commonly, click-drag-release or double-click to select
>  text, middle-click to paste).  This copy/paste works with the
> -terminal's selection buffer, as opposed to the TUI's buffer.
> +terminal's selection buffer, as opposed to the TUI's buffer.  Alternatively, to
> +disable mouse support in the TUI entirely and give the terminal control over
> +mouse clicks, turn off the @code{tui mouse-events} setting
> +(@pxref{tui-mouse-events,,set tui mouse-events}).
> +

I noticed the new command doesn't have a "set" callback, so I guess this means
that you have to disable and re-enable the TUI for the setting to take effect?
Or does it take effect immediately somehow?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-02 19:50         ` Pedro Alves
@ 2023-02-02 19:59           ` strager
  2023-09-14  8:05             ` strager
  0 siblings, 1 reply; 13+ messages in thread
From: strager @ 2023-02-02 19:59 UTC (permalink / raw)
  To: Pedro Alves; +Cc: Andrew Burgess, Eli Zaretskii, gdb-patches

On Thu, Feb 2, 2023 at 11:50 AM Pedro Alves <pedro@palves.net> wrote:
> I noticed the new command doesn't have a "set" callback, so I guess this means
> that you have to disable and re-enable the TUI for the setting to take effect?
> Or does it take effect immediately somehow?

I tested it and it does take effect immediately. (I was surprised
too.) I think it's because you enter readline after you type the 'set'
command, and the mousemask code runs every readline.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-02-02 19:59           ` strager
@ 2023-09-14  8:05             ` strager
  2023-09-20 15:39               ` Pedro Alves
  0 siblings, 1 reply; 13+ messages in thread
From: strager @ 2023-09-14  8:05 UTC (permalink / raw)
  To: Pedro Alves, Eli Zaretskii, gdb-patches; +Cc: Andrew Burgess

It looks like my patch hasn't landed in GDB. Did it slip through the cracks?

On Thu, Feb 2, 2023 at 11:59 AM strager <strager.nds@gmail.com> wrote:
>
> On Thu, Feb 2, 2023 at 11:50 AM Pedro Alves <pedro@palves.net> wrote:
> > I noticed the new command doesn't have a "set" callback, so I guess this means
> > that you have to disable and re-enable the TUI for the setting to take effect?
> > Or does it take effect immediately somehow?
>
> I tested it and it does take effect immediately. (I was surprised
> too.) I think it's because you enter readline after you type the 'set'
> command, and the mousemask code runs every readline.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection
  2023-09-14  8:05             ` strager
@ 2023-09-20 15:39               ` Pedro Alves
  0 siblings, 0 replies; 13+ messages in thread
From: Pedro Alves @ 2023-09-20 15:39 UTC (permalink / raw)
  To: strager, Eli Zaretskii, gdb-patches; +Cc: Andrew Burgess

Hi!

On 2023-09-14 09:05, strager wrote:
> It looks like my patch hasn't landed in GDB. Did it slip through the cracks?

I pushed it now.  Thanks for the patch, and for the patience!

Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2023-09-20 15:39 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-28  0:42 [PATCH] gdb/tui: add 'set tui mouse-events off' to restore mouse selection strager
2023-01-28  8:35 ` Eli Zaretskii
2023-02-01  8:35   ` strager
2023-02-01 12:41     ` Eli Zaretskii
2023-02-01 13:27     ` Andrew Burgess
2023-02-02  1:08       ` strager
2023-02-02  7:18         ` Eli Zaretskii
2023-02-02 19:50         ` Pedro Alves
2023-02-02 19:59           ` strager
2023-09-14  8:05             ` strager
2023-09-20 15:39               ` Pedro Alves
2023-02-02  9:33 ` Lancelot SIX
2023-02-02 11:11   ` strager

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).