[PATCH 1/3] dix: Move DeviceFocusEvent from Xi into enterleave.c
Jeremy Huddleston
jeremyhu at apple.com
Wed May 16 11:21:23 PDT 2012
Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
On May 16, 2012, at 12:09 AM, Peter Hutterer <peter.hutterer at 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 at 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 at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list