Signed-off-by: Peter Hutterer <[email protected]>
---
 Xi/exevents.c |  202 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 104 insertions(+), 98 deletions(-)

diff --git a/Xi/exevents.c b/Xi/exevents.c
index d48d397..c6f9d46 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1189,6 +1189,108 @@ FixDeviceValuator(DeviceIntPtr dev, deviceValuator * 
ev, ValuatorClassPtr v,
     first += ev->num_valuators;
 }
 
+static void
+DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
+{
+    int evcount = 1;
+    deviceStateNotify *ev, *sev;
+    deviceKeyStateNotify *kev;
+    deviceButtonStateNotify *bev;
+
+    KeyClassPtr k;
+    ButtonClassPtr b;
+    ValuatorClassPtr v;
+    int nval = 0, nkeys = 0, nbuttons = 0, first = 0;
+
+    if (!(wOtherInputMasks(win)) ||
+        !(wOtherInputMasks(win)->inputEvents[dev->id] & DeviceStateNotifyMask))
+        return;
+
+    if ((b = dev->button) != NULL) {
+        nbuttons = b->numButtons;
+        if (nbuttons > 32)
+            evcount++;
+    }
+    if ((k = dev->key) != NULL) {
+        nkeys = k->xkbInfo->desc->max_key_code -
+            k->xkbInfo->desc->min_key_code;
+        if (nkeys > 32)
+            evcount++;
+        if (nbuttons > 0) {
+            evcount++;
+        }
+    }
+    if ((v = dev->valuator) != NULL) {
+        nval = v->numAxes;
+
+        if (nval > 3)
+            evcount++;
+        if (nval > 6) {
+            if (!(k && b))
+                evcount++;
+            if (nval > 9)
+                evcount += ((nval - 7) / 3);
+        }
+    }
+
+    sev = ev = (deviceStateNotify *) malloc(evcount * sizeof(xEvent));
+    FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
+
+    if (b != NULL) {
+        FixDeviceStateNotify(dev, ev++, NULL, b, v, first);
+        first += 3;
+        nval -= 3;
+        if (nbuttons > 32) {
+            (ev - 1)->deviceid |= MORE_EVENTS;
+            bev = (deviceButtonStateNotify *) ev++;
+            bev->type = DeviceButtonStateNotify;
+            bev->deviceid = dev->id;
+            memcpy((char*)&bev->buttons[4], (char*)&b->down[4], DOWN_LENGTH - 
4);
+        }
+        if (nval > 0) {
+            (ev - 1)->deviceid |= MORE_EVENTS;
+            FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+            first += 3;
+            nval -= 3;
+        }
+    }
+
+    if (k != NULL) {
+        FixDeviceStateNotify(dev, ev++, k, NULL, v, first);
+        first += 3;
+        nval -= 3;
+        if (nkeys > 32) {
+            (ev - 1)->deviceid |= MORE_EVENTS;
+            kev = (deviceKeyStateNotify *) ev++;
+            kev->type = DeviceKeyStateNotify;
+            kev->deviceid = dev->id;
+            memmove((char *)&kev->keys[0], (char *)&k->down[4], 28);
+        }
+        if (nval > 0) {
+            (ev - 1)->deviceid |= MORE_EVENTS;
+            FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+            first += 3;
+            nval -= 3;
+        }
+    }
+
+    while (nval > 0) {
+        FixDeviceStateNotify(dev, ev++, NULL, NULL, v, first);
+        first += 3;
+        nval -= 3;
+        if (nval > 0) {
+            (ev - 1)->deviceid |= MORE_EVENTS;
+            FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+            first += 3;
+            nval -= 3;
+        }
+    }
+
+    DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount,
+                          DeviceStateNotifyMask, NullGrab);
+    free(sev);
+}
+
 void
 DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
                 WindowPtr pWin)
@@ -1255,104 +1357,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, 
int detail,
     DeliverEventsToWindow(dev, pWin, (xEvent *) & event, 1,
                                DeviceFocusChangeMask, NullGrab);
 
-    if ((event.type == DeviceFocusIn) &&
-       (wOtherInputMasks(pWin)) &&
-       (wOtherInputMasks(pWin)->inputEvents[dev->id] & DeviceStateNotifyMask))
-    {
-       int evcount = 1;
-       deviceStateNotify *ev, *sev;
-       deviceKeyStateNotify *kev;
-       deviceButtonStateNotify *bev;
-
-       KeyClassPtr k;
-       ButtonClassPtr b;
-       ValuatorClassPtr v;
-       int nval = 0, nkeys = 0, nbuttons = 0, first = 0;
-
-       if ((b = dev->button) != NULL) {
-           nbuttons = b->numButtons;
-           if (nbuttons > 32)
-               evcount++;
-       }
-       if ((k = dev->key) != NULL) {
-           nkeys = k->xkbInfo->desc->max_key_code -
-                    k->xkbInfo->desc->min_key_code;
-           if (nkeys > 32)
-               evcount++;
-           if (nbuttons > 0) {
-               evcount++;
-           }
-       }
-       if ((v = dev->valuator) != NULL) {
-           nval = v->numAxes;
-
-           if (nval > 3)
-               evcount++;
-           if (nval > 6) {
-               if (!(k && b))
-                   evcount++;
-               if (nval > 9)
-                   evcount += ((nval - 7) / 3);
-           }
-       }
-
-       sev = ev = (deviceStateNotify *) malloc(evcount * sizeof(xEvent));
-       FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
-
-       if (b != NULL) {
-           FixDeviceStateNotify(dev, ev++, NULL, b, v, first);
-           first += 3;
-           nval -= 3;
-           if (nbuttons > 32) {
-               (ev - 1)->deviceid |= MORE_EVENTS;
-               bev = (deviceButtonStateNotify *) ev++;
-               bev->type = DeviceButtonStateNotify;
-               bev->deviceid = dev->id;
-               memcpy((char*)&bev->buttons[4], (char*)&b->down[4], DOWN_LENGTH 
- 4);
-           }
-           if (nval > 0) {
-               (ev - 1)->deviceid |= MORE_EVENTS;
-               FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
-               first += 3;
-               nval -= 3;
-           }
-       }
-
-       if (k != NULL) {
-           FixDeviceStateNotify(dev, ev++, k, NULL, v, first);
-           first += 3;
-           nval -= 3;
-           if (nkeys > 32) {
-               (ev - 1)->deviceid |= MORE_EVENTS;
-               kev = (deviceKeyStateNotify *) ev++;
-               kev->type = DeviceKeyStateNotify;
-               kev->deviceid = dev->id;
-               memmove((char *)&kev->keys[0], (char *)&k->down[4], 28);
-           }
-           if (nval > 0) {
-               (ev - 1)->deviceid |= MORE_EVENTS;
-               FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
-               first += 3;
-               nval -= 3;
-           }
-       }
-
-       while (nval > 0) {
-           FixDeviceStateNotify(dev, ev++, NULL, NULL, v, first);
-           first += 3;
-           nval -= 3;
-           if (nval > 0) {
-               (ev - 1)->deviceid |= MORE_EVENTS;
-               FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
-               first += 3;
-               nval -= 3;
-           }
-       }
-
-       DeliverEventsToWindow(dev, pWin, (xEvent *) sev, evcount,
-                                   DeviceStateNotifyMask, NullGrab);
-       free(sev);
-    }
+    if (event.type == DeviceFocusIn)
+        DeliverStateNotifyEvent(dev, pWin);
 }
 
 int
-- 
1.7.4.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to