Alexandre Julliard : winex11: Merge consecutive RawMotion events.

Alexandre Julliard julliard at winehq.org
Wed Apr 27 12:47:27 CDT 2011


Module: wine
Branch: master
Commit: bab850389ae88681f9eaced94fe97469e1fc1d44
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bab850389ae88681f9eaced94fe97469e1fc1d44

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 27 16:00:50 2011 +0200

winex11: Merge consecutive RawMotion events.

---

 dlls/winex11.drv/event.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 30d8553..acaf49c 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -246,6 +246,46 @@ enum event_merge_action
 };
 
 /***********************************************************************
+ *           merge_raw_motion_events
+ */
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+static enum event_merge_action merge_raw_motion_events( XIRawEvent *prev, XIRawEvent *next )
+{
+    int i, j, k;
+    unsigned char mask;
+
+    if (!prev->valuators.mask_len) return MERGE_HANDLE;
+    if (!next->valuators.mask_len) return MERGE_HANDLE;
+
+    mask = prev->valuators.mask[0] | next->valuators.mask[0];
+    if (mask == next->valuators.mask[0])  /* keep next */
+    {
+        for (i = j = k = 0; i < 8; i++)
+        {
+            if (XIMaskIsSet( prev->valuators.mask, i ))
+                next->valuators.values[j] += prev->valuators.values[k++];
+            if (XIMaskIsSet( next->valuators.mask, i )) j++;
+        }
+        TRACE( "merging duplicate GenericEvent\n" );
+        return MERGE_DISCARD;
+    }
+    if (mask == prev->valuators.mask[0])  /* keep prev */
+    {
+        for (i = j = k = 0; i < 8; i++)
+        {
+            if (XIMaskIsSet( next->valuators.mask, i ))
+                prev->valuators.values[j] += next->valuators.values[k++];
+            if (XIMaskIsSet( prev->valuators.mask, i )) j++;
+        }
+        TRACE( "merging duplicate GenericEvent\n" );
+        return MERGE_IGNORE;
+    }
+    /* can't merge events with disjoint masks */
+    return MERGE_HANDLE;
+}
+#endif
+
+/***********************************************************************
  *           merge_events
  *
  * Try to merge 2 consecutive events.
@@ -289,6 +329,10 @@ static enum event_merge_action merge_events( XEvent *prev, XEvent *next )
                 return MERGE_IGNORE;
             }
             break;
+        case GenericEvent:
+            if (next->xcookie.extension != xinput2_opcode) break;
+            if (next->xcookie.evtype != XI_RawMotion) break;
+            return merge_raw_motion_events( prev->xcookie.data, next->xcookie.data );
         }
         break;
 #endif




More information about the wine-cvs mailing list