all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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


  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.