[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