| Message ID | 1337152173-24553-1-git-send-email-peter.hutterer@who-t.net |
|---|---|
| State | Accepted |
| Commit | ca6d25ad2d1fb4efae9d40c7e74c8494f9918625 |
| Headers | show |
diff --git a/Xi/exevents.c b/Xi/exevents.c index e9f0207..d578758 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -2114,240 +2114,6 @@ SetScrollValuator(DeviceIntPtr dev, int axnum, enum ScrollType type, return TRUE; } -static void -FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k, - ButtonClassPtr b, ValuatorClassPtr v, int first) -{ - ev->type = DeviceStateNotify; - ev->deviceid = dev->id; - ev->time = currentTime.milliseconds; - ev->classes_reported = 0; - ev->num_keys = 0; - ev->num_buttons = 0; - ev->num_valuators = 0; - - if (b) { - ev->classes_reported |= (1 << ButtonClass); - ev->num_buttons = b->numButtons; - memcpy((char *) ev->buttons, (char *) b->down, 4); - } - else if (k) { - ev->classes_reported |= (1 << KeyClass); - ev->num_keys = k->xkbInfo->desc->max_key_code - - k->xkbInfo->desc->min_key_code; - memmove((char *) &ev->keys[0], (char *) k->down, 4); - } - if (v) { - int nval = v->numAxes - first; - - ev->classes_reported |= (1 << ValuatorClass); - ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift; - ev->num_valuators = nval < 3 ? nval : 3; - switch (ev->num_valuators) { - case 3: - ev->valuator2 = v->axisVal[first + 2]; - case 2: - ev->valuator1 = v->axisVal[first + 1]; - case 1: - ev->valuator0 = v->axisVal[first]; - break; - } - } -} - -static void -FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v, - int first) -{ - int nval = v->numAxes - first; - - ev->type = DeviceValuator; - ev->deviceid = dev->id; - ev->num_valuators = nval < 3 ? nval : 3; - ev->first_valuator = first; - switch (ev->num_valuators) { - case 3: - ev->valuator2 = v->axisVal[first + 2]; - case 2: - ev->valuator1 = v->axisVal[first + 1]; - case 1: - ev->valuator0 = v->axisVal[first]; - break; - } - 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) -{ - deviceFocus event; - xXIFocusInEvent *xi2event; - DeviceIntPtr mouse; - int btlen, len, i; - - mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER); - - /* XI 2 event */ - btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0; - btlen = bytes_to_int32(btlen); - len = sizeof(xXIFocusInEvent) + btlen * 4; - - xi2event = calloc(1, len); - xi2event->type = GenericEvent; - xi2event->extension = IReqCode; - xi2event->evtype = type; - xi2event->length = bytes_to_int32(len - sizeof(xEvent)); - xi2event->buttons_len = btlen; - xi2event->detail = detail; - xi2event->time = currentTime.milliseconds; - xi2event->deviceid = dev->id; - xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */ - xi2event->mode = mode; - xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0); - xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0); - - for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++) - if (BitIsOn(mouse->button->down, i)) - SetBit(&xi2event[1], mouse->button->map[i]); - - if (dev->key) { - xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods; - xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods; - xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods; - xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods; - - xi2event->group.base_group = dev->key->xkbInfo->state.base_group; - xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group; - xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group; - xi2event->group.effective_group = dev->key->xkbInfo->state.group; - } - - FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent *) xi2event, pWin, - None, FALSE); - - DeliverEventsToWindow(dev, pWin, (xEvent *) xi2event, 1, - GetEventFilter(dev, (xEvent *) xi2event), NullGrab); - - free(xi2event); - - /* XI 1.x event */ - event.deviceid = dev->id; - event.mode = mode; - event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut; - event.detail = detail; - event.window = pWin->drawable.id; - event.time = currentTime.milliseconds; - - DeliverEventsToWindow(dev, pWin, (xEvent *) &event, 1, - DeviceFocusChangeMask, NullGrab); - - if (event.type == DeviceFocusIn) - DeliverStateNotifyEvent(dev, pWin); -} - int CheckGrabValues(ClientPtr client, GrabParameters *param) { diff --git a/dix/enterleave.c b/dix/enterleave.c index 725080a..761ab3b 100644 --- a/dix/enterleave.c +++ b/dix/enterleave.c @@ -30,11 +30,15 @@ #include <X11/X.h> #include <X11/extensions/XI2.h> +#include <X11/extensions/XIproto.h> +#include <X11/extensions/XI2proto.h> #include "inputstr.h" #include "windowstr.h" #include "scrnintstr.h" #include "exglobals.h" #include "enterleave.h" +#include "eventconvert.h" +#include "xkbsrv.h" /** * @file @@ -602,6 +606,241 @@ DoEnterLeaveEvents(DeviceIntPtr pDev, DeviceEnterLeaveEvents(pDev, sourceid, fromWin, toWin, mode); } +static void +FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v, + int first) +{ + int nval = v->numAxes - first; + + ev->type = DeviceValuator; + ev->deviceid = dev->id; + ev->num_valuators = nval < 3 ? nval : 3; + ev->first_valuator = first; + switch (ev->num_valuators) { + case 3: + ev->valuator2 = v->axisVal[first + 2]; + case 2: + ev->valuator1 = v->axisVal[first + 1]; + case 1: + ev->valuator0 = v->axisVal[first]; + break; + } + first += ev->num_valuators; +} + +static void +FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k, + ButtonClassPtr b, ValuatorClassPtr v, int first) +{ + ev->type = DeviceStateNotify; + ev->deviceid = dev->id; + ev->time = currentTime.milliseconds; + ev->classes_reported = 0; + ev->num_keys = 0; + ev->num_buttons = 0; + ev->num_valuators = 0; + + if (b) { + ev->classes_reported |= (1 << ButtonClass); + ev->num_buttons = b->numButtons; + memcpy((char *) ev->buttons, (char *) b->down, 4); + } + else if (k) { + ev->classes_reported |= (1 << KeyClass); + ev->num_keys = k->xkbInfo->desc->max_key_code - + k->xkbInfo->desc->min_key_code; + memmove((char *) &ev->keys[0], (char *) k->down, 4); + } + if (v) { + int nval = v->numAxes - first; + + ev->classes_reported |= (1 << ValuatorClass); + ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift; + ev->num_valuators = nval < 3 ? nval : 3; + switch (ev->num_valuators) { + case 3: + ev->valuator2 = v->axisVal[first + 2]; + case 2: + ev->valuator1 = v->axisVal[first + 1]; + case 1: + ev->valuator0 = v->axisVal[first]; + break; + } + } +} + + +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) +{ + deviceFocus event; + xXIFocusInEvent *xi2event; + DeviceIntPtr mouse; + int btlen, len, i; + + mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER); + + /* XI 2 event */ + btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0; + btlen = bytes_to_int32(btlen); + len = sizeof(xXIFocusInEvent) + btlen * 4; + + xi2event = calloc(1, len); + xi2event->type = GenericEvent; + xi2event->extension = IReqCode; + xi2event->evtype = type; + xi2event->length = bytes_to_int32(len - sizeof(xEvent)); + xi2event->buttons_len = btlen; + xi2event->detail = detail; + xi2event->time = currentTime.milliseconds; + xi2event->deviceid = dev->id; + xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */ + xi2event->mode = mode; + xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0); + xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0); + + for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++) + if (BitIsOn(mouse->button->down, i)) + SetBit(&xi2event[1], mouse->button->map[i]); + + if (dev->key) { + xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods; + xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods; + xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods; + xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods; + + xi2event->group.base_group = dev->key->xkbInfo->state.base_group; + xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group; + xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group; + xi2event->group.effective_group = dev->key->xkbInfo->state.group; + } + + FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent *) xi2event, pWin, + None, FALSE); + + DeliverEventsToWindow(dev, pWin, (xEvent *) xi2event, 1, + GetEventFilter(dev, (xEvent *) xi2event), NullGrab); + + free(xi2event); + + /* XI 1.x event */ + event.deviceid = dev->id; + event.mode = mode; + event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut; + event.detail = detail; + event.window = pWin->drawable.id; + event.time = currentTime.milliseconds; + + DeliverEventsToWindow(dev, pWin, (xEvent *) &event, 1, + DeviceFocusChangeMask, NullGrab); + + if (event.type == DeviceFocusIn) + DeliverStateNotifyEvent(dev, pWin); +} + /** * Send focus out events to all windows between 'child' and 'ancestor'. * Events are sent running up the hierarchy. diff --git a/dix/enterleave.h b/dix/enterleave.h index c937c0e..a59d057 100644 --- a/dix/enterleave.h +++ b/dix/enterleave.h @@ -52,6 +52,11 @@ extern void DeviceEnterLeaveEvent(DeviceIntPtr mouse, int type, int mode, int detail, WindowPtr pWin, Window child); +extern void DeviceFocusEvent(DeviceIntPtr dev, + int type, + int mode, + int detail , + WindowPtr pWin); extern void EnterWindow(DeviceIntPtr dev, WindowPtr win, int mode); diff --git a/include/exevents.h b/include/exevents.h index feea170..321fc42 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -162,13 +162,6 @@ extern void ProcessOtherEvent(InternalEvent * /* ev */ , DeviceIntPtr /* other */ ); -extern void - DeviceFocusEvent(DeviceIntPtr /* dev */ , - int /* type */ , - int /* mode */ , - int /* detail */ , - WindowPtr /* pWin */ ); - extern int CheckGrabValues(ClientPtr /* client */ , GrabParameters * /* param */ );
On Wed, May 16, 2012 at 8:09 AM, Peter Hutterer <peter.hutterer@who-t.net> wrote: > This is only called from the enterleave implementation, so move it and its > helper functions to there. No functional changes. > > Fixes build error introduced in 31174565ec0090b4c03c9334c82878be2455f938 if > building with '-Werror=implicit-function-declaration' > > Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> seems like the best solution. Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> On May 16, 2012, at 12:09 AM, Peter Hutterer <peter.hutterer@who-t.net> wrote: > This is only called from the enterleave implementation, so move it and its > helper functions to there. No functional changes. > > Fixes build error introduced in 31174565ec0090b4c03c9334c82878be2455f938 if > building with '-Werror=implicit-function-declaration' > > Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> > --- > Xi/exevents.c | 234 -------------------------------------------------- > dix/enterleave.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > dix/enterleave.h | 5 ++ > include/exevents.h | 7 -- > 4 files changed, 244 insertions(+), 241 deletions(-) > > diff --git a/Xi/exevents.c b/Xi/exevents.c > index e9f0207..d578758 100644 > --- a/Xi/exevents.c > +++ b/Xi/exevents.c > @@ -2114,240 +2114,6 @@ SetScrollValuator(DeviceIntPtr dev, int axnum, enum ScrollType type, > return TRUE; > } > > -static void > -FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k, > - ButtonClassPtr b, ValuatorClassPtr v, int first) > -{ > - ev->type = DeviceStateNotify; > - ev->deviceid = dev->id; > - ev->time = currentTime.milliseconds; > - ev->classes_reported = 0; > - ev->num_keys = 0; > - ev->num_buttons = 0; > - ev->num_valuators = 0; > - > - if (b) { > - ev->classes_reported |= (1 << ButtonClass); > - ev->num_buttons = b->numButtons; > - memcpy((char *) ev->buttons, (char *) b->down, 4); > - } > - else if (k) { > - ev->classes_reported |= (1 << KeyClass); > - ev->num_keys = k->xkbInfo->desc->max_key_code - > - k->xkbInfo->desc->min_key_code; > - memmove((char *) &ev->keys[0], (char *) k->down, 4); > - } > - if (v) { > - int nval = v->numAxes - first; > - > - ev->classes_reported |= (1 << ValuatorClass); > - ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift; > - ev->num_valuators = nval < 3 ? nval : 3; > - switch (ev->num_valuators) { > - case 3: > - ev->valuator2 = v->axisVal[first + 2]; > - case 2: > - ev->valuator1 = v->axisVal[first + 1]; > - case 1: > - ev->valuator0 = v->axisVal[first]; > - break; > - } > - } > -} > - > -static void > -FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v, > - int first) > -{ > - int nval = v->numAxes - first; > - > - ev->type = DeviceValuator; > - ev->deviceid = dev->id; > - ev->num_valuators = nval < 3 ? nval : 3; > - ev->first_valuator = first; > - switch (ev->num_valuators) { > - case 3: > - ev->valuator2 = v->axisVal[first + 2]; > - case 2: > - ev->valuator1 = v->axisVal[first + 1]; > - case 1: > - ev->valuator0 = v->axisVal[first]; > - break; > - } > - 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) > -{ > - deviceFocus event; > - xXIFocusInEvent *xi2event; > - DeviceIntPtr mouse; > - int btlen, len, i; > - > - mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER); > - > - /* XI 2 event */ > - btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0; > - btlen = bytes_to_int32(btlen); > - len = sizeof(xXIFocusInEvent) + btlen * 4; > - > - xi2event = calloc(1, len); > - xi2event->type = GenericEvent; > - xi2event->extension = IReqCode; > - xi2event->evtype = type; > - xi2event->length = bytes_to_int32(len - sizeof(xEvent)); > - xi2event->buttons_len = btlen; > - xi2event->detail = detail; > - xi2event->time = currentTime.milliseconds; > - xi2event->deviceid = dev->id; > - xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */ > - xi2event->mode = mode; > - xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0); > - xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0); > - > - for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++) > - if (BitIsOn(mouse->button->down, i)) > - SetBit(&xi2event[1], mouse->button->map[i]); > - > - if (dev->key) { > - xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods; > - xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods; > - xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods; > - xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods; > - > - xi2event->group.base_group = dev->key->xkbInfo->state.base_group; > - xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group; > - xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group; > - xi2event->group.effective_group = dev->key->xkbInfo->state.group; > - } > - > - FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent *) xi2event, pWin, > - None, FALSE); > - > - DeliverEventsToWindow(dev, pWin, (xEvent *) xi2event, 1, > - GetEventFilter(dev, (xEvent *) xi2event), NullGrab); > - > - free(xi2event); > - > - /* XI 1.x event */ > - event.deviceid = dev->id; > - event.mode = mode; > - event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut; > - event.detail = detail; > - event.window = pWin->drawable.id; > - event.time = currentTime.milliseconds; > - > - DeliverEventsToWindow(dev, pWin, (xEvent *) &event, 1, > - DeviceFocusChangeMask, NullGrab); > - > - if (event.type == DeviceFocusIn) > - DeliverStateNotifyEvent(dev, pWin); > -} > - > int > CheckGrabValues(ClientPtr client, GrabParameters *param) > { > diff --git a/dix/enterleave.c b/dix/enterleave.c > index 725080a..761ab3b 100644 > --- a/dix/enterleave.c > +++ b/dix/enterleave.c > @@ -30,11 +30,15 @@ > > #include <X11/X.h> > #include <X11/extensions/XI2.h> > +#include <X11/extensions/XIproto.h> > +#include <X11/extensions/XI2proto.h> > #include "inputstr.h" > #include "windowstr.h" > #include "scrnintstr.h" > #include "exglobals.h" > #include "enterleave.h" > +#include "eventconvert.h" > +#include "xkbsrv.h" > > /** > * @file > @@ -602,6 +606,241 @@ DoEnterLeaveEvents(DeviceIntPtr pDev, > DeviceEnterLeaveEvents(pDev, sourceid, fromWin, toWin, mode); > } > > +static void > +FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v, > + int first) > +{ > + int nval = v->numAxes - first; > + > + ev->type = DeviceValuator; > + ev->deviceid = dev->id; > + ev->num_valuators = nval < 3 ? nval : 3; > + ev->first_valuator = first; > + switch (ev->num_valuators) { > + case 3: > + ev->valuator2 = v->axisVal[first + 2]; > + case 2: > + ev->valuator1 = v->axisVal[first + 1]; > + case 1: > + ev->valuator0 = v->axisVal[first]; > + break; > + } > + first += ev->num_valuators; > +} > + > +static void > +FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k, > + ButtonClassPtr b, ValuatorClassPtr v, int first) > +{ > + ev->type = DeviceStateNotify; > + ev->deviceid = dev->id; > + ev->time = currentTime.milliseconds; > + ev->classes_reported = 0; > + ev->num_keys = 0; > + ev->num_buttons = 0; > + ev->num_valuators = 0; > + > + if (b) { > + ev->classes_reported |= (1 << ButtonClass); > + ev->num_buttons = b->numButtons; > + memcpy((char *) ev->buttons, (char *) b->down, 4); > + } > + else if (k) { > + ev->classes_reported |= (1 << KeyClass); > + ev->num_keys = k->xkbInfo->desc->max_key_code - > + k->xkbInfo->desc->min_key_code; > + memmove((char *) &ev->keys[0], (char *) k->down, 4); > + } > + if (v) { > + int nval = v->numAxes - first; > + > + ev->classes_reported |= (1 << ValuatorClass); > + ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift; > + ev->num_valuators = nval < 3 ? nval : 3; > + switch (ev->num_valuators) { > + case 3: > + ev->valuator2 = v->axisVal[first + 2]; > + case 2: > + ev->valuator1 = v->axisVal[first + 1]; > + case 1: > + ev->valuator0 = v->axisVal[first]; > + break; > + } > + } > +} > + > + > +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) > +{ > + deviceFocus event; > + xXIFocusInEvent *xi2event; > + DeviceIntPtr mouse; > + int btlen, len, i; > + > + mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER); > + > + /* XI 2 event */ > + btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0; > + btlen = bytes_to_int32(btlen); > + len = sizeof(xXIFocusInEvent) + btlen * 4; > + > + xi2event = calloc(1, len); > + xi2event->type = GenericEvent; > + xi2event->extension = IReqCode; > + xi2event->evtype = type; > + xi2event->length = bytes_to_int32(len - sizeof(xEvent)); > + xi2event->buttons_len = btlen; > + xi2event->detail = detail; > + xi2event->time = currentTime.milliseconds; > + xi2event->deviceid = dev->id; > + xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */ > + xi2event->mode = mode; > + xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0); > + xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0); > + > + for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++) > + if (BitIsOn(mouse->button->down, i)) > + SetBit(&xi2event[1], mouse->button->map[i]); > + > + if (dev->key) { > + xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods; > + xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods; > + xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods; > + xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods; > + > + xi2event->group.base_group = dev->key->xkbInfo->state.base_group; > + xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group; > + xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group; > + xi2event->group.effective_group = dev->key->xkbInfo->state.group; > + } > + > + FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent *) xi2event, pWin, > + None, FALSE); > + > + DeliverEventsToWindow(dev, pWin, (xEvent *) xi2event, 1, > + GetEventFilter(dev, (xEvent *) xi2event), NullGrab); > + > + free(xi2event); > + > + /* XI 1.x event */ > + event.deviceid = dev->id; > + event.mode = mode; > + event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut; > + event.detail = detail; > + event.window = pWin->drawable.id; > + event.time = currentTime.milliseconds; > + > + DeliverEventsToWindow(dev, pWin, (xEvent *) &event, 1, > + DeviceFocusChangeMask, NullGrab); > + > + if (event.type == DeviceFocusIn) > + DeliverStateNotifyEvent(dev, pWin); > +} > + > /** > * Send focus out events to all windows between 'child' and 'ancestor'. > * Events are sent running up the hierarchy. > diff --git a/dix/enterleave.h b/dix/enterleave.h > index c937c0e..a59d057 100644 > --- a/dix/enterleave.h > +++ b/dix/enterleave.h > @@ -52,6 +52,11 @@ extern void DeviceEnterLeaveEvent(DeviceIntPtr mouse, > int type, > int mode, > int detail, WindowPtr pWin, Window child); > +extern void DeviceFocusEvent(DeviceIntPtr dev, > + int type, > + int mode, > + int detail , > + WindowPtr pWin); > > extern void EnterWindow(DeviceIntPtr dev, WindowPtr win, int mode); > > diff --git a/include/exevents.h b/include/exevents.h > index feea170..321fc42 100644 > --- a/include/exevents.h > +++ b/include/exevents.h > @@ -162,13 +162,6 @@ extern void > ProcessOtherEvent(InternalEvent * /* ev */ , > DeviceIntPtr /* other */ ); > > -extern void > - DeviceFocusEvent(DeviceIntPtr /* dev */ , > - int /* type */ , > - int /* mode */ , > - int /* detail */ , > - WindowPtr /* pWin */ ); > - > extern int > CheckGrabValues(ClientPtr /* client */ , > GrabParameters * /* param */ ); > -- > 1.7.10.1 > > _______________________________________________ > xorg-devel@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel >
This is only called from the enterleave implementation, so move it and its helper functions to there. No functional changes. Fixes build error introduced in 31174565ec0090b4c03c9334c82878be2455f938 if building with '-Werror=implicit-function-declaration' Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> --- Xi/exevents.c | 234 -------------------------------------------------- dix/enterleave.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++ dix/enterleave.h | 5 ++ include/exevents.h | 7 -- 4 files changed, 244 insertions(+), 241 deletions(-)