emacs-diffs
[Top][All Lists]
Advanced

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

master 54474a6db2: Avoid duplicate wheel and button events on non-toolki


From: Po Lu
Subject: master 54474a6db2: Avoid duplicate wheel and button events on non-toolkit scroll bars
Date: Tue, 1 Mar 2022 02:00:21 -0500 (EST)

branch: master
commit 54474a6db2bccdfe862307bf343af44ab3c79829
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Avoid duplicate wheel and button events on non-toolkit scroll bars
    
    * src/xterm.c (x_scroll_bar_create): Set appropriate input
    extension event mask.
    (handle_one_xevent): Move some ifdefs around and handle input
    extension button events on scroll bars.
---
 src/xterm.c | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/xterm.c b/src/xterm.c
index 3e35ae50b8..ec17203fcd 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -8489,6 +8489,30 @@ x_scroll_bar_create (struct window *w, int top, int left,
                            CopyFromParent,
                             /* Attributes.  */
                            mask, &a);
+
+#ifdef HAVE_XINPUT2
+  /* Ask for input extension button and motion events.  This lets us
+     send the proper `wheel-up' or `wheel-down' events to Emacs.  */
+  if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+    {
+      XIEventMask mask;
+      ptrdiff_t l = XIMaskLen (XI_LASTEVENT);
+      unsigned char *m;
+
+      mask.mask = m = alloca (l);
+      memset (m, 0, l);
+      mask.mask_len = l;
+
+      mask.deviceid = XIAllMasterDevices;
+      XISetMask (m, XI_ButtonPress);
+      XISetMask (m, XI_ButtonRelease);
+      XISetMask (m, XI_Motion);
+      XISetMask (m, XI_Enter);
+      XISetMask (m, XI_Leave);
+
+      XISelectEvents (FRAME_X_DISPLAY (f), window, &mask, 1);
+    }
+#endif
     bar->x_window = window;
   }
 #endif /* not USE_TOOLKIT_SCROLL_BARS */
@@ -11725,7 +11749,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
                              if (!f)
                                {
-#if defined USE_MOTIF && defined USE_TOOLKIT_SCROLL_BARS
+#if defined USE_MOTIF || !defined USE_TOOLKIT_SCROLL_BARS
                                  struct scroll_bar *bar
                                    = x_window_to_scroll_bar (xi_event->display,
                                                              xev->event, 2);
@@ -12207,6 +12231,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    xembed_send_message (f, xev->time,
                                         XEMBED_REQUEST_FOCUS, 0, 0, 0);
                }
+#ifndef USE_TOOLKIT_SCROLL_BARS
+             else
+               {
+                 struct scroll_bar *bar
+                   = x_window_to_scroll_bar (dpyinfo->display,
+                                             xev->event, 2);
+
+                 if (bar)
+                   x_scroll_bar_handle_click (bar, (XEvent *) &bv, &inev.ie);
+               }
+#endif
 
              if (xev->evtype == XI_ButtonPress)
                {



reply via email to

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