xserver: Branch 'server-1.10-branch' - 2 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Mon Jun 20 00:30:31 PDT 2011


 Xi/xichangehierarchy.c |    2 ++
 dix/devices.c          |   40 ++++++++++++++++++++++++++++++++++++++++
 include/input.h        |    2 ++
 3 files changed, 44 insertions(+)

New commits:
commit 9fab8b475de99848866c07bde962a5f6ed01b987
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Apr 15 14:06:20 2011 +1000

    input: Only release SD buttons for explicit floating/reattachment (#36146)
    
    Grabbing an SD device temporary floats the device but we must not release
    the buttons. Introduced in
    
        commit 9d23459415b84606ee4f38bb2d19054c432c8552
        Author: Peter Hutterer <peter.hutterer at who-t.net>
        Date:   Fri Feb 25 11:08:19 2011 +1000
    
        dix: release all buttons and keys before reattaching a device (#34182)
    
    X.Org Bug 36146 <http://bugs.freedesktop.org/show_bug.cgi?id=36146>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    (cherry picked from commit bf2059b07a97e5e579c13c2c9d49707093427dc2)
    
    Conflicts:
    
    	dix/devices.c

diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 21c74ed..15eb5c9 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -353,6 +353,7 @@ detach_slave(ClientPtr client, xXIDetachSlaveInfo *c, int flags[MAXDEVICES])
         goto unwind;
     }
 
+    ReleaseButtonsAndKeys(dev);
     AttachDevice(client, dev, NULL);
     flags[dev->id] |= XISlaveDetached;
 
@@ -404,6 +405,7 @@ attach_slave(ClientPtr client, xXIAttachSlaveInfo *c,
         goto unwind;
     }
 
+    ReleaseButtonsAndKeys(dev);
     AttachDevice(client, dev, newmaster);
     flags[dev->id] |= XISlaveAttached;
 
diff --git a/dix/devices.c b/dix/devices.c
index 827c328..aa391a1 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2410,7 +2410,7 @@ RecalculateMasterButtons(DeviceIntPtr slave)
  * Generate release events for all keys/button currently down on this
  * device.
  */
-static void
+void
 ReleaseButtonsAndKeys(DeviceIntPtr dev)
 {
     EventListPtr        eventlist = InitEventList(GetMaximumEventsNum());
@@ -2479,8 +2479,6 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         free(dev->spriteInfo->sprite);
     }
 
-    ReleaseButtonsAndKeys(dev);
-
     oldmaster = dev->u.master;
     dev->u.master = master;
 
diff --git a/include/input.h b/include/input.h
index 908e595..95aae43 100644
--- a/include/input.h
+++ b/include/input.h
@@ -495,6 +495,8 @@ extern _X_EXPORT int GetMotionHistory(
     ScreenPtr pScreen,
     BOOL core);
 
+extern void ReleaseButtonsAndKeys(DeviceIntPtr dev);
+
 extern int AttachDevice(ClientPtr client,
                         DeviceIntPtr slave,
                         DeviceIntPtr master);
commit 160a412e36fd945119e4c10f5d22682fcd0cc637
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 25 11:08:19 2011 +1000

    dix: release all buttons and keys before reattaching a device (#34182)
    
    Testcase:
      xinput float <keyboard name>
    
    results in the keyboard's enter key being repeated as the device is detached
    while the key is still physically down. To avoid this, release all keys and
    buttons before reattaching the device.
    
    X.Org Bug 34182 <http://bugs.freedesktop.org/show_bug.cgi?id=34182>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Fernando Carrijo <fcarrijo at freedesktop.org>
    (cherry picked from commit 9d23459415b84606ee4f38bb2d19054c432c8552)
    (cherry picked from commit 81fbb96c54f78a7cd96433294ee003c7ef6a772a)

diff --git a/dix/devices.c b/dix/devices.c
index fed05f5..827c328 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2407,6 +2407,46 @@ RecalculateMasterButtons(DeviceIntPtr slave)
 }
 
 /**
+ * Generate release events for all keys/button currently down on this
+ * device.
+ */
+static void
+ReleaseButtonsAndKeys(DeviceIntPtr dev)
+{
+    EventListPtr        eventlist = InitEventList(GetMaximumEventsNum());
+    ButtonClassPtr      b = dev->button;
+    KeyClassPtr         k = dev->key;
+    int                 i, j, nevents;
+
+    if (!eventlist) /* no release events for you */
+        return;
+
+    /* Release all buttons */
+    for (i = 0; b && i < b->numButtons; i++)
+    {
+        if (BitIsOn(b->down, i))
+        {
+            nevents = GetPointerEvents(eventlist, dev, ButtonRelease, i, 0, NULL);
+            for (j = 0; j < nevents; j++)
+                mieqProcessDeviceEvent(dev, (InternalEvent*)(eventlist+j)->event, NULL);
+        }
+    }
+
+    /* Release all keys */
+    for (i = 0; k && i < MAP_LENGTH; i++)
+    {
+        if (BitIsOn(k->down, i))
+        {
+            nevents = GetKeyboardEvents(eventlist, dev, KeyRelease, i);
+            for (j = 0; j < nevents; j++)
+                mieqProcessDeviceEvent(dev, (InternalEvent*)(eventlist+j)->event, NULL);
+        }
+    }
+
+    FreeEventList(eventlist, GetMaximumEventsNum());
+}
+
+/**
  * Attach device 'dev' to device 'master'.
  * Client is set to the client that issued the request, or NULL if it comes
  * from some internal automatic pairing.
@@ -2439,6 +2479,8 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         free(dev->spriteInfo->sprite);
     }
 
+    ReleaseButtonsAndKeys(dev);
+
     oldmaster = dev->u.master;
     dev->u.master = master;
 


More information about the xorg-commit mailing list