dix: Move DeviceFocusEvent from Xi into enterleave.c
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 31174565ec
if
building with '-Werror=implicit-function-declaration'
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
parent
749a593e49
commit
ca6d25ad2d
234
Xi/exevents.c
234
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)
|
||||
{
|
||||
|
|
239
dix/enterleave.c
239
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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */ );
|
||||
|
|
Loading…
Reference in New Issue
Block a user