From: Jared Finder <jared@finder.org>
To: "Gerd Möllmann" <gerd.moellmann@gmail.com>
Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, rudalics@gmx.at
Subject: Re: "Final" version of tty child frames
Date: Sat, 04 Jan 2025 14:12:00 -0800 [thread overview]
Message-ID: <23dfc3fde8677a984b4c37a40d09d83b@finder.org> (raw)
In-Reply-To: <m2ttb1se20.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 669 bytes --]
On 2024-12-17 22:25, Gerd Möllmann wrote:
> WRT GPM: Sounds to me like this is because GPM hasn't been changes to
> act analogous to xt-mouse. I think there only two commits to
> xt-mouse.el
> in the branch. It's not much, if you look at the diffs, basically only
>
> - determine the frame F under (x, y) as reported by the terminal
>
> - Give Emacs (F, x', y'), where x' and y' are the coordinates
> relative to F
>
> That was all I needed, in principle, at least for xterm-mouse, to make
> things work. Don't know if that also fits for GPm.
It was that easy to do. Attached is a patch that adds support for TTY
child frames to a GPM mouse.
-- MJF
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Support-TTY-child-frames-with-GPM-mouse.patch --]
[-- Type: text/x-diff; name=0001-Support-TTY-child-frames-with-GPM-mouse.patch, Size: 4948 bytes --]
From 4d17c5ab27be6adb8437d7a685b1a9f8fee0ade5 Mon Sep 17 00:00:00 2001
From: Jared Finder <jared@finder.org>
Date: Sat, 4 Jan 2025 13:55:05 -0800
Subject: [PATCH] Support TTY child frames with GPM mouse
* src/term.c (frame_at): New C function, wraps Lisp `frame-at'.
(handle_one_term_event): Call frame_at to get frame under mouse,
store it in last_mouse_frame. Alter event coordinates based on
mouse frame.
(term_mouse_position): Use last_mouse_frame when it is set.
(syms_of_term): Add Qframe_at.
* src/termhooks.h: Make Gpm_Event parameter const.
---
src/term.c | 52 +++++++++++++++++++++++++++++++++++++------------
src/termhooks.h | 2 +-
2 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/src/term.c b/src/term.c
index 368e20803e1..bbf0bafb93f 100644
--- a/src/term.c
+++ b/src/term.c
@@ -141,6 +141,7 @@ #define OUTPUT1_IF(tty, a) \
struct tty_display_info *gpm_tty = NULL;
/* Last recorded mouse coordinates. */
+static Lisp_Object last_mouse_frame;
static int last_mouse_x, last_mouse_y;
#endif /* HAVE_GPM */
@@ -2638,7 +2639,11 @@ term_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x,
Lisp_Object *y, Time *timeptr)
{
- *fp = SELECTED_FRAME ();
+ /* This code runs even when `gpm-mouse-mode' was never active, like
+ inside an xterm. In such cases, last_mouse_frame will never be
+ set, so fallback to SELECTED_FRAME. */
+ *fp = FRAMEP (last_mouse_frame) ? XFRAME (last_mouse_frame)
+ : SELECTED_FRAME ();
(*fp)->mouse_moved = 0;
*bar_window = Qnil;
@@ -2712,10 +2717,28 @@ term_mouse_click (struct input_event *result, Gpm_Event *event,
return Qnil;
}
+static Lisp_Object
+frame_at(int x, int y)
+{
+ Lisp_Object frame = CALLN (Ffuncall, Qframe_at,
+ make_fixnum (x), make_fixnum (y));
+ if (NILP (frame))
+ {
+ frame = selected_frame;
+ }
+
+ return frame;
+}
+
int
-handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event)
+handle_one_term_event (struct tty_display_info *tty, const Gpm_Event *event_in)
{
- struct frame *f = XFRAME (tty->top_frame);
+ Lisp_Object frame = frame_at(event_in->x, event_in->y);
+ struct frame *f = XFRAME (frame);
+ Gpm_Event event = *event_in;
+ event.x -= f->left_pos;
+ event.y -= f->top_pos;
+
struct input_event ie;
int count = 0;
@@ -2723,30 +2746,34 @@ handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event)
ie.kind = NO_EVENT;
ie.arg = Qnil;
- if (event->type & (GPM_MOVE | GPM_DRAG))
+ if (event.type & (GPM_MOVE | GPM_DRAG))
{
- Gpm_DrawPointer (event->x, event->y, fileno (tty->output));
+ /* The pointer must be drawn using screen coordinates (x,y), not
+ frame coordinates. Use event_in which has an unmodified event
+ directly from GPM. */
+ Gpm_DrawPointer (event_in->x, event_in->y, fileno (tty->output));
/* Has the mouse moved off the glyph it was on at the last
sighting? */
- if (event->x != last_mouse_x || event->y != last_mouse_y)
+ if (event.x != last_mouse_x || event.y != last_mouse_y)
{
- /* FIXME: These three lines can not be moved into
+ /* FIXME: These four lines can not be moved into
update_mouse_position unless xterm-mouse gets updated to
generate mouse events via C code. See
https://lists.gnu.org/archive/html/emacs-devel/2020-11/msg00163.html */
- last_mouse_x = event->x;
- last_mouse_y = event->y;
+ last_mouse_frame = frame;
+ last_mouse_x = event.x;
+ last_mouse_y = event.y;
f->mouse_moved = 1;
- count += update_mouse_position (f, event->x, event->y);
+ count += update_mouse_position (f, event.x, event.y);
}
}
else
{
f->mouse_moved = 0;
- term_mouse_click (&ie, event, f);
- ie.arg = tty_handle_tab_bar_click (f, event->x, event->y,
+ term_mouse_click (&ie, &event, f);
+ ie.arg = tty_handle_tab_bar_click (f, event.x, event.y,
(ie.modifiers & down_modifier) != 0, &ie);
kbd_buffer_store_event (&ie);
count++;
@@ -4970,6 +4997,7 @@ syms_of_term (void)
#ifdef HAVE_GPM
defsubr (&Sgpm_mouse_start);
defsubr (&Sgpm_mouse_stop);
+ DEFSYM (Qframe_at, "frame-at");
#endif /* HAVE_GPM */
defsubr (&Stty_frame_geometry);
diff --git a/src/termhooks.h b/src/termhooks.h
index b32804a57b3..0795148f1af 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -458,7 +458,7 @@ #define EVENT_INIT(event) (memset (&(event), 0, sizeof (struct input_event)), \
#ifdef HAVE_GPM
#include <gpm.h>
-extern int handle_one_term_event (struct tty_display_info *, Gpm_Event *);
+extern int handle_one_term_event (struct tty_display_info *, const Gpm_Event *);
extern void term_mouse_moveto (int, int);
/* The device for which we have enabled gpm support. */
--
2.39.5
next prev parent reply other threads:[~2025-01-04 22:12 UTC|newest]
Thread overview: 194+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-22 4:46 "Final" version of tty child frames Gerd Möllmann
2024-10-22 5:29 ` Eli Zaretskii
2024-10-22 9:58 ` martin rudalics
2024-10-22 10:20 ` Eli Zaretskii
2024-10-22 14:01 ` martin rudalics
2024-10-22 14:23 ` Eli Zaretskii
2024-10-22 10:40 ` Gerd Möllmann
2024-10-22 11:43 ` Po Lu
2024-10-22 13:44 ` Eli Zaretskii
2024-10-22 14:01 ` Gerd Möllmann
2024-10-22 14:02 ` martin rudalics
2024-10-28 4:35 ` Jared Finder
2024-10-28 5:57 ` Gerd Möllmann
2024-11-30 11:25 ` Eli Zaretskii
2024-12-05 3:49 ` Jared Finder
2024-12-11 7:31 ` Jared Finder
2024-12-11 7:59 ` Gerd Möllmann
2024-12-12 5:11 ` Jared Finder
2024-12-12 6:20 ` Gerd Möllmann
2024-12-12 6:48 ` Gerd Möllmann
2024-12-12 6:30 ` Eli Zaretskii
2024-12-12 7:04 ` Gerd Möllmann
2024-12-18 5:35 ` Jared Finder
2024-12-18 6:25 ` Gerd Möllmann
2025-01-04 22:12 ` Jared Finder [this message]
2025-01-05 4:03 ` Gerd Möllmann
2025-01-05 7:07 ` Eli Zaretskii
2025-01-06 0:05 ` Jared Finder
2025-01-06 4:27 ` Gerd Möllmann
2025-01-06 13:30 ` Eli Zaretskii
2025-01-07 5:40 ` Jared Finder
2025-01-07 7:36 ` Gerd Möllmann
2024-12-18 13:54 ` Eli Zaretskii
2024-12-18 16:01 ` Gerd Möllmann
2024-12-18 16:29 ` Eli Zaretskii
2024-12-18 16:39 ` Gerd Möllmann
2024-12-18 17:02 ` Eli Zaretskii
2024-12-18 17:22 ` Gerd Möllmann
2024-12-19 5:17 ` Jared Finder
2024-12-19 5:30 ` Gerd Möllmann
2024-12-19 7:44 ` Gerd Möllmann
2024-12-19 8:36 ` Eli Zaretskii
2024-12-19 9:04 ` Gerd Möllmann
2024-12-19 9:17 ` Gerd Möllmann
2024-12-19 10:34 ` Robert Pluim
2024-12-19 10:40 ` Gerd Möllmann
2024-12-18 21:06 ` Stefan Kangas
2024-12-19 8:00 ` Andrea Corallo
2024-12-11 9:39 ` martin rudalics
2025-01-04 22:09 ` Jared Finder
2025-01-05 3:48 ` Gerd Möllmann
2025-01-13 6:32 ` Jared Finder
2025-01-13 7:13 ` Gerd Möllmann
2025-01-13 13:13 ` Eli Zaretskii
2025-01-14 9:11 ` martin rudalics
2025-01-14 9:37 ` Gerd Möllmann
2025-01-14 9:55 ` martin rudalics
2025-01-14 10:12 ` Gerd Möllmann
2025-01-14 13:58 ` Eli Zaretskii
2025-01-14 17:33 ` martin rudalics
2025-01-14 19:25 ` Gerd Möllmann
2025-01-15 4:29 ` Gerd Möllmann
2025-01-15 8:41 ` martin rudalics
2025-01-15 8:58 ` Gerd Möllmann
2025-01-15 15:29 ` Eli Zaretskii
2025-01-15 15:38 ` Gerd Möllmann
2025-01-15 15:27 ` Eli Zaretskii
2025-01-15 17:01 ` martin rudalics
2025-01-15 17:29 ` Gerd Möllmann
2025-01-15 17:35 ` Gerd Möllmann
2025-01-15 19:43 ` Eli Zaretskii
2025-01-16 4:35 ` Gerd Möllmann
2025-01-16 8:16 ` Eli Zaretskii
2025-01-16 8:42 ` Gerd Möllmann
2025-01-16 9:47 ` Eli Zaretskii
2025-01-16 10:22 ` Gerd Möllmann
2025-01-16 11:24 ` Eli Zaretskii
2025-01-16 10:02 ` martin rudalics
2025-01-16 10:23 ` Gerd Möllmann
2025-01-16 10:50 ` martin rudalics
2025-01-16 10:55 ` Gerd Möllmann
2025-01-16 11:42 ` Eli Zaretskii
2025-01-16 12:15 ` Gerd Möllmann
2025-01-16 12:50 ` Eli Zaretskii
2025-01-16 13:41 ` Gerd Möllmann
2025-01-16 15:22 ` Eli Zaretskii
2025-01-16 15:46 ` Gerd Möllmann
2025-01-16 16:50 ` Eli Zaretskii
2025-01-16 18:00 ` martin rudalics
2025-01-16 19:05 ` Gerd Möllmann
2025-01-17 9:08 ` martin rudalics
2025-01-17 9:35 ` Gerd Möllmann
2025-01-17 12:29 ` Eli Zaretskii
2025-01-17 15:08 ` martin rudalics
2025-01-17 19:58 ` Eli Zaretskii
2025-01-18 9:04 ` martin rudalics
2025-01-18 11:40 ` Eli Zaretskii
2025-01-16 19:22 ` Eli Zaretskii
2025-01-16 19:32 ` Gerd Möllmann
2025-01-16 19:55 ` Eli Zaretskii
2025-01-16 21:03 ` Gerd Möllmann
2025-01-17 6:48 ` Eli Zaretskii
2025-01-17 7:50 ` Gerd Möllmann
2025-01-17 8:34 ` Eli Zaretskii
2025-01-17 8:50 ` Gerd Möllmann
2025-01-17 12:14 ` Eli Zaretskii
2025-01-17 13:21 ` Eli Zaretskii
2025-01-17 15:14 ` Gerd Möllmann
2025-01-17 9:09 ` martin rudalics
2025-01-17 12:44 ` Eli Zaretskii
2025-01-17 15:09 ` martin rudalics
2025-01-17 16:51 ` Eli Zaretskii
2025-01-17 18:25 ` martin rudalics
2025-01-17 9:09 ` martin rudalics
2025-01-17 12:40 ` Eli Zaretskii
2025-01-17 15:09 ` martin rudalics
2025-01-17 20:02 ` Eli Zaretskii
2025-01-18 9:04 ` martin rudalics
2025-01-18 11:53 ` Eli Zaretskii
2025-01-17 9:08 ` martin rudalics
2025-01-17 12:26 ` Eli Zaretskii
2025-01-17 15:08 ` martin rudalics
2025-01-17 19:56 ` Eli Zaretskii
2025-01-18 9:03 ` martin rudalics
2025-01-16 11:19 ` Eli Zaretskii
2025-01-14 20:29 ` Eli Zaretskii
2025-01-14 13:38 ` Eli Zaretskii
2025-01-05 6:46 ` Eli Zaretskii
2025-01-06 0:18 ` Jared Finder
2025-01-06 13:35 ` Eli Zaretskii
2025-01-08 9:56 ` martin rudalics
2025-01-08 10:29 ` Gerd Möllmann
2025-01-09 10:24 ` martin rudalics
2025-01-09 10:45 ` Gerd Möllmann
2025-01-11 10:13 ` martin rudalics
2025-01-11 12:52 ` Gerd Möllmann
2025-01-11 17:23 ` martin rudalics
2025-01-11 17:57 ` Gerd Möllmann
2025-01-12 5:26 ` Gerd Möllmann
2025-01-12 6:49 ` Gerd Möllmann
2025-01-12 7:36 ` Gerd Möllmann
2025-01-12 8:14 ` Eli Zaretskii
2025-01-12 8:27 ` martin rudalics
2025-01-12 8:59 ` Gerd Möllmann
2025-01-12 8:57 ` Gerd Möllmann
2025-01-12 8:22 ` martin rudalics
2025-01-12 9:03 ` Gerd Möllmann
2025-01-12 9:45 ` martin rudalics
2025-01-12 10:31 ` Gerd Möllmann
2025-01-14 9:11 ` martin rudalics
2025-01-14 9:25 ` Gerd Möllmann
2025-01-14 9:10 ` martin rudalics
2025-01-14 9:24 ` Gerd Möllmann
2025-01-11 10:51 ` Eli Zaretskii
2025-01-11 15:55 ` martin rudalics
2024-10-22 7:34 ` Dr. Arne Babenhauserheide
2024-10-22 7:49 ` Gerd Möllmann
2024-10-22 7:49 ` Eli Zaretskii
2024-10-22 8:01 ` Eli Zaretskii
2024-10-22 8:21 ` Gerd Möllmann
2024-10-22 8:57 ` Eli Zaretskii
2024-10-22 9:42 ` Eli Zaretskii
2024-10-22 10:23 ` Gerd Möllmann
2024-10-22 13:35 ` Eli Zaretskii
2024-10-22 13:43 ` Gerd Möllmann
2024-10-22 13:55 ` Eli Zaretskii
2024-10-22 14:02 ` Gerd Möllmann
2024-10-22 14:40 ` Eli Zaretskii
2024-10-22 19:19 ` Paul Eggert
2024-10-23 3:18 ` Gerd Möllmann
2024-10-22 10:43 ` Gerd Möllmann
2024-10-23 3:05 ` Feng Shu
2024-10-23 3:13 ` Gerd Möllmann
2024-10-23 3:25 ` Feng Shu
2024-10-23 3:36 ` Gerd Möllmann
2024-10-23 3:44 ` Feng Shu
2024-10-23 4:09 ` Gerd Möllmann
2024-10-23 4:40 ` Gerd Möllmann
2024-10-23 5:00 ` Gerd Möllmann
2024-10-23 7:49 ` Eli Zaretskii
2024-10-23 8:12 ` Gerd Möllmann
2024-10-23 11:04 ` Gerd Möllmann
2024-10-23 17:23 ` Eli Zaretskii
2024-10-23 17:52 ` Gerd Möllmann
2024-10-23 6:54 ` Feng Shu
2024-10-23 7:25 ` Gerd Möllmann
2024-10-23 7:28 ` Eli Zaretskii
2024-10-23 7:37 ` Gerd Möllmann
2024-10-23 7:52 ` Feng Shu
2024-10-23 8:07 ` Gerd Möllmann
2024-10-23 9:07 ` Feng Shu
2024-10-23 9:58 ` Gerd Möllmann
2024-10-23 7:11 ` Eli Zaretskii
2024-10-26 8:15 ` Gerd Möllmann
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=23dfc3fde8677a984b4c37a40d09d83b@finder.org \
--to=jared@finder.org \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=gerd.moellmann@gmail.com \
--cc=rudalics@gmx.at \
/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.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.