emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 2e595b3: Fix tab-bar scrolling for mice that report mouse-wheel e


From: Eli Zaretskii
Subject: master 2e595b3: Fix tab-bar scrolling for mice that report mouse-wheel events
Date: Sat, 11 Sep 2021 06:59:49 -0400 (EDT)

branch: master
commit 2e595b3e8b887068e47e64116d5a910c1045a229
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>

    Fix tab-bar scrolling for mice that report mouse-wheel events
    
    * src/keyboard.c (make_lispy_position): Call
    'window_from_coordinates' with last 2 arguments non-zero, to have
    it report on tool-bar and tab-bar positions.  Tweak the return
    value according to the expectations of 'make_lispy_event'.
    (make_lispy_event): No more need to inject "tab-bar" into a click
    event on the tab bar: it's already there.
---
 src/keyboard.c | 49 +++++++++++++++++++++++++++++++++++++------------
 1 file changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/keyboard.c b/src/keyboard.c
index ac8c6b0..9d435b7 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -5092,13 +5092,39 @@ make_lispy_position (struct frame *f, Lisp_Object x, 
Lisp_Object y,
   enum window_part part;
   Lisp_Object posn = Qnil;
   Lisp_Object extra_info = Qnil;
+  int mx = XFIXNUM (x), my = XFIXNUM (y);
   /* Coordinate pixel positions to return.  */
   int xret = 0, yret = 0;
   /* The window or frame under frame pixel coordinates (x,y)  */
   Lisp_Object window_or_frame = f
-    ? window_from_coordinates (f, XFIXNUM (x), XFIXNUM (y), &part, 0, 0)
+    ? window_from_coordinates (f, mx, my, &part, true, true)
     : Qnil;
 
+  /* Report mouse events on the tab bar and (on GUI frames) on the
+     tool bar.  */
+#ifdef HAVE_WINDOW_SYSTEM
+  if ((WINDOWP (f->tab_bar_window)
+       && EQ (window_or_frame, f->tab_bar_window))
+      || (WINDOWP (f->tool_bar_window)
+         && EQ (window_or_frame, f->tool_bar_window)))
+    {
+      posn = EQ (window_or_frame, f->tab_bar_window) ? Qtab_bar : Qtool_bar;
+      /* Kludge alert: for mouse events on the tab bar and tool bar,
+        keyboard.c wants the frame, not the special-purpose window
+        we use to display those, and it wants frame-relative
+        coordinates.  FIXME!  */
+      window_or_frame = Qnil;
+    }
+#endif
+  if (!FRAME_WINDOW_P (f)
+      && FRAME_TAB_BAR_LINES (f) > 0
+      && my >= FRAME_MENU_BAR_LINES (f)
+      && my < FRAME_MENU_BAR_LINES (f) + FRAME_TAB_BAR_LINES (f))
+    {
+      posn = Qtab_bar;
+      window_or_frame = Qnil;  /* see above */
+    }
+
   if (WINDOWP (window_or_frame))
     {
       /* It's a click in window WINDOW at frame coordinates (X,Y)  */
@@ -5111,15 +5137,15 @@ make_lispy_position (struct frame *f, Lisp_Object x, 
Lisp_Object y,
       Lisp_Object object = Qnil;
 
       /* Pixel coordinates relative to the window corner.  */
-      int wx = XFIXNUM (x) - WINDOW_LEFT_EDGE_X (w);
-      int wy = XFIXNUM (y) - WINDOW_TOP_EDGE_Y (w);
+      int wx = mx - WINDOW_LEFT_EDGE_X (w);
+      int wy = my - WINDOW_TOP_EDGE_Y (w);
 
       /* For text area clicks, return X, Y relative to the corner of
         this text area.  Note that dX, dY etc are set below, by
         buffer_posn_from_coords.  */
       if (part == ON_TEXT)
        {
-         xret = XFIXNUM (x) - window_box_left (w, TEXT_AREA);
+         xret = mx - window_box_left (w, TEXT_AREA);
          yret = wy - WINDOW_TAB_LINE_HEIGHT (w) - WINDOW_HEADER_LINE_HEIGHT 
(w);
        }
       /* For mode line and header line clicks, return X, Y relative to
@@ -5243,7 +5269,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, 
Lisp_Object y,
            : (part == ON_RIGHT_FRINGE || part == ON_RIGHT_MARGIN
               || (part == ON_VERTICAL_SCROLL_BAR
                   && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)))
-           ? (XFIXNUM (x) - window_box_left (w, TEXT_AREA))
+           ? (mx - window_box_left (w, TEXT_AREA))
            : 0;
          int y2 = wy;
 
@@ -5295,17 +5321,17 @@ make_lispy_position (struct frame *f, Lisp_Object x, 
Lisp_Object y,
                                               make_fixnum (row)),
                                        extra_info)));
     }
-
   else if (f)
     {
       /* Return mouse pixel coordinates here.  */
       XSETFRAME (window_or_frame, f);
-      xret = XFIXNUM (x);
-      yret = XFIXNUM (y);
+      xret = mx;
+      yret = my;
 
 #ifdef HAVE_WINDOW_SYSTEM
       if (FRAME_WINDOW_P (f)
          && FRAME_LIVE_P (f)
+         && NILP (posn)
          && FRAME_INTERNAL_BORDER_WIDTH (f) > 0
          && !NILP (get_frame_param (f, Qdrag_internal_border)))
        {
@@ -5655,11 +5681,10 @@ make_lispy_event (struct input_event *event)
            position = make_lispy_position (f, event->x, event->y,
                                            event->timestamp);
 
+           /* For tab-bar clicks, add the propertized string with
+              button information as OBJECT member of POSITION.  */
            if (CONSP (event->arg) && EQ (XCAR (event->arg), Qtab_bar))
-             {
-               XSETCAR (XCDR (position), Qtab_bar);
-               position = nconc2 (position, Fcons (XCDR (event->arg), Qnil));
-             }
+             position = nconc2 (position, Fcons (XCDR (event->arg), Qnil));
          }
 #ifndef USE_TOOLKIT_SCROLL_BARS
        else



reply via email to

[Prev in Thread] Current Thread [Next in Thread]