emacs-diffs
[Top][All Lists]
Advanced

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

master deab5f413f 1/3: Coalesce pinch gestures in the keyboard buffer


From: Po Lu
Subject: master deab5f413f 1/3: Coalesce pinch gestures in the keyboard buffer
Date: Sun, 26 Dec 2021 07:12:31 -0500 (EST)

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

    Coalesce pinch gestures in the keyboard buffer
    
    * src/keyboard.c (kbd_buffer_get_event): Coalesce consecutive
    pinch gesture events.
---
 src/keyboard.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/src/keyboard.c b/src/keyboard.c
index 5453811406..304dff4a91 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -4037,6 +4037,42 @@ kbd_buffer_get_event (KBOARD **kbp,
             and build a real event from the queue entry.  */
          if (NILP (obj))
            {
+             /* Pinch events are often sent in rapid succession, so
+                large amounts of such events have the potential to
+                queue up inside the keyboard buffer.  In that case,
+                find the last pinch event in succession on the same
+                frame with the same modifiers, and send that instead.  */
+
+             if (event->ie.kind == PINCH_EVENT
+                 /* Ignore if this is the start of a pinch sequence.
+                    These events should always be sent so that we
+                    never miss a sequence starting, and they don't
+                    have the potential to queue up.  */
+                 && (XFLOAT_DATA (XCAR (event->ie.arg)) != 0.0
+                     || XFLOAT_DATA (XCAR (XCDR (event->ie.arg))) != 0.0
+                     || XFLOAT_DATA (XCAR (XCDR (XCDR (event->ie.arg)))) != 
1.0))
+               {
+                 union buffered_input_event *maybe_event = next_kbd_event 
(event);
+                 while (maybe_event != kbd_store_ptr
+                        && maybe_event->ie.kind == PINCH_EVENT
+                        /* Make sure we never miss an event that has
+                           different modifiers.  */
+                        && maybe_event->ie.modifiers == event->ie.modifiers
+                        /* Make sure that the event is for the same
+                           frame.  */
+                        && EQ (maybe_event->ie.frame_or_window,
+                               event->ie.frame_or_window)
+                        /* Make sure that the event isn't the start
+                           of a new pinch gesture sequence.  */
+                        && (XFLOAT_DATA (XCAR (maybe_event->ie.arg)) != 0.0
+                            || XFLOAT_DATA (XCAR (XCDR (maybe_event->ie.arg))) 
!= 0.0
+                            || XFLOAT_DATA (XCAR (XCDR (XCDR 
(maybe_event->ie.arg)))) != 1.0))
+                   {
+                     event = maybe_event;
+                     maybe_event = next_kbd_event (event);
+                   }
+               }
+
              obj = make_lispy_event (&event->ie);
 
 #ifdef HAVE_EXT_MENU_BAR



reply via email to

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