Merge remote-tracking branch 'whot/for-keith'
This commit is contained in:
commit
7da7aa96a0
143
Xi/exevents.c
143
Xi/exevents.c
|
@ -703,6 +703,55 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
|
|||
XISendDeviceChangedEvent(device, dce);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add state and motionMask to the filter for this event. The protocol
|
||||
* supports some extra masks for motion when a button is down:
|
||||
* ButtonXMotionMask and the DeviceButtonMotionMask to trigger only when at
|
||||
* least one button (or that specific button is down). These masks need to
|
||||
* be added to the filters for core/XI motion events.
|
||||
*
|
||||
* @param device The device to update the mask for
|
||||
* @param state The current button state mask
|
||||
* @param motion_mask The motion mask (DeviceButtonMotionMask or 0)
|
||||
*/
|
||||
static void
|
||||
UpdateDeviceMotionMask(DeviceIntPtr device, unsigned short state,
|
||||
Mask motion_mask)
|
||||
{
|
||||
Mask mask;
|
||||
|
||||
mask = DevicePointerMotionMask | state | motion_mask;
|
||||
SetMaskForEvent(device->id, mask, DeviceMotionNotify);
|
||||
mask = PointerMotionMask | state | motion_mask;
|
||||
SetMaskForEvent(device->id, mask, MotionNotify);
|
||||
}
|
||||
|
||||
static void
|
||||
IncreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
|
||||
Mask *motion_mask, unsigned short *state)
|
||||
{
|
||||
if (dev->valuator)
|
||||
dev->valuator->motionHintWindow = NullWindow;
|
||||
|
||||
(*buttons_down)++;
|
||||
*motion_mask = DeviceButtonMotionMask;
|
||||
if (dev->button->map[key] <= 5)
|
||||
*state |= (Button1Mask >> 1) << dev->button->map[key];
|
||||
}
|
||||
|
||||
static void
|
||||
DecreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
|
||||
Mask *motion_mask, unsigned short *state)
|
||||
{
|
||||
if (dev->valuator)
|
||||
dev->valuator->motionHintWindow = NullWindow;
|
||||
|
||||
if (*buttons_down >= 1 && !--(*buttons_down))
|
||||
*motion_mask = 0;
|
||||
if (dev->button->map[key] <= 5)
|
||||
*state &= ~((Button1Mask >> 1) << dev->button->map[key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the device state according to the data in the event.
|
||||
*
|
||||
|
@ -801,7 +850,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
device->valuator->motionHintWindow = NullWindow;
|
||||
set_key_up(device, key, KEY_PROCESSED);
|
||||
} else if (event->type == ET_ButtonPress) {
|
||||
Mask mask;
|
||||
if (!b)
|
||||
return DONT_PROCESS;
|
||||
|
||||
|
@ -809,22 +857,13 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
return DONT_PROCESS;
|
||||
|
||||
set_button_down(device, key, BUTTON_PROCESSED);
|
||||
if (device->valuator)
|
||||
device->valuator->motionHintWindow = NullWindow;
|
||||
|
||||
if (!b->map[key])
|
||||
return DONT_PROCESS;
|
||||
b->buttonsDown++;
|
||||
b->motionMask = DeviceButtonMotionMask;
|
||||
if (b->map[key] <= 5)
|
||||
b->state |= (Button1Mask >> 1) << b->map[key];
|
||||
|
||||
/* Add state and motionMask to the filter for this event */
|
||||
mask = DevicePointerMotionMask | b->state | b->motionMask;
|
||||
SetMaskForEvent(device->id, mask, DeviceMotionNotify);
|
||||
mask = PointerMotionMask | b->state | b->motionMask;
|
||||
SetMaskForEvent(device->id, mask, MotionNotify);
|
||||
IncreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
|
||||
UpdateDeviceMotionMask(device, b->state, b->motionMask);
|
||||
} else if (event->type == ET_ButtonRelease) {
|
||||
Mask mask;
|
||||
if (!b)
|
||||
return DONT_PROCESS;
|
||||
|
||||
|
@ -850,20 +889,11 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
}
|
||||
}
|
||||
set_button_up(device, key, BUTTON_PROCESSED);
|
||||
if (device->valuator)
|
||||
device->valuator->motionHintWindow = NullWindow;
|
||||
if (!b->map[key])
|
||||
return DONT_PROCESS;
|
||||
if (b->buttonsDown >= 1 && !--b->buttonsDown)
|
||||
b->motionMask = 0;
|
||||
if (b->map[key] <= 5)
|
||||
b->state &= ~((Button1Mask >> 1) << b->map[key]);
|
||||
|
||||
/* Add state and motionMask to the filter for this event */
|
||||
mask = DevicePointerMotionMask | b->state | b->motionMask;
|
||||
SetMaskForEvent(device->id, mask, DeviceMotionNotify);
|
||||
mask = PointerMotionMask | b->state | b->motionMask;
|
||||
SetMaskForEvent(device->id, mask, MotionNotify);
|
||||
DecreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
|
||||
UpdateDeviceMotionMask(device, b->state, b->motionMask);
|
||||
} else if (event->type == ET_ProximityIn)
|
||||
device->proximity->in_proximity = TRUE;
|
||||
else if (event->type == ET_ProximityOut)
|
||||
|
@ -885,7 +915,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
|||
int key = 0, rootX, rootY;
|
||||
ButtonClassPtr b;
|
||||
int ret = 0;
|
||||
int corestate, i;
|
||||
int corestate;
|
||||
DeviceIntPtr mouse = NULL, kbd = NULL;
|
||||
DeviceEvent *event = &ev->device_event;
|
||||
|
||||
|
@ -915,33 +945,8 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
|||
mouse = NULL;
|
||||
}
|
||||
|
||||
/* core state needs to be assembled BEFORE the device is updated. */
|
||||
corestate = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
|
||||
corestate |= (mouse && mouse->button) ? (mouse->button->state) : 0;
|
||||
|
||||
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
||||
if (BitIsOn(mouse->button->down, i))
|
||||
SetBit(event->buttons, i);
|
||||
|
||||
if (kbd && kbd->key)
|
||||
{
|
||||
XkbStatePtr state;
|
||||
/* we need the state before the event happens */
|
||||
if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
|
||||
state = &kbd->key->xkbInfo->prev_state;
|
||||
else
|
||||
state = &kbd->key->xkbInfo->state;
|
||||
|
||||
event->mods.base = state->base_mods;
|
||||
event->mods.latched = state->latched_mods;
|
||||
event->mods.locked = state->locked_mods;
|
||||
event->mods.effective = state->mods;
|
||||
|
||||
event->group.base = state->base_group;
|
||||
event->group.latched = state->latched_group;
|
||||
event->group.locked = state->locked_group;
|
||||
event->group.effective = state->group;
|
||||
}
|
||||
corestate = event_get_corestate(mouse, kbd);
|
||||
event_set_state(mouse, kbd, event);
|
||||
|
||||
ret = UpdateDeviceState(device, event);
|
||||
if (ret == DONT_PROCESS)
|
||||
|
@ -996,9 +1001,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
|||
case ET_KeyRelease:
|
||||
if (grab && device->deviceGrab.fromPassiveGrab &&
|
||||
(key == device->deviceGrab.activatingKey) &&
|
||||
(device->deviceGrab.grab->type == KeyPress ||
|
||||
device->deviceGrab.grab->type == DeviceKeyPress ||
|
||||
device->deviceGrab.grab->type == XI_KeyPress))
|
||||
GrabIsKeyboardGrab(device->deviceGrab.grab))
|
||||
deactivateDeviceGrab = TRUE;
|
||||
break;
|
||||
case ET_ButtonPress:
|
||||
|
@ -1018,9 +1021,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
|||
event->detail.button = b->map[key];
|
||||
if (grab && !b->buttonsDown &&
|
||||
device->deviceGrab.fromPassiveGrab &&
|
||||
(device->deviceGrab.grab->type == ButtonPress ||
|
||||
device->deviceGrab.grab->type == DeviceButtonPress ||
|
||||
device->deviceGrab.grab->type == XI_ButtonPress))
|
||||
GrabIsPointerGrab(device->deviceGrab.grab))
|
||||
deactivateDeviceGrab = TRUE;
|
||||
default:
|
||||
break;
|
||||
|
@ -1388,9 +1389,9 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
|
|||
int
|
||||
CheckGrabValues(ClientPtr client, GrabParameters* param)
|
||||
{
|
||||
if (param->grabtype != GRABTYPE_CORE &&
|
||||
param->grabtype != GRABTYPE_XI &&
|
||||
param->grabtype != GRABTYPE_XI2)
|
||||
if (param->grabtype != CORE &&
|
||||
param->grabtype != XI &&
|
||||
param->grabtype != XI2)
|
||||
{
|
||||
ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
|
||||
return BadImplementation;
|
||||
|
@ -1407,7 +1408,7 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
|
|||
return BadValue;
|
||||
}
|
||||
|
||||
if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
|
||||
if (param->grabtype != XI2 && (param->modifiers != AnyModifier) &&
|
||||
(param->modifiers & ~AllModifiersMask)) {
|
||||
client->errorValue = param->modifiers;
|
||||
return BadValue;
|
||||
|
@ -1422,7 +1423,7 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
|
|||
|
||||
int
|
||||
GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
||||
int button, GrabParameters *param, GrabType grabtype,
|
||||
int button, GrabParameters *param, enum InputLevel grabtype,
|
||||
GrabMask *mask)
|
||||
{
|
||||
WindowPtr pWin, confineTo;
|
||||
|
@ -1462,9 +1463,9 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
|||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if (grabtype == GRABTYPE_XI)
|
||||
if (grabtype == XI)
|
||||
type = DeviceButtonPress;
|
||||
else if (grabtype == GRABTYPE_XI2)
|
||||
else if (grabtype == XI2)
|
||||
type = XI_ButtonPress;
|
||||
|
||||
grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
|
||||
|
@ -1475,12 +1476,12 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
|||
}
|
||||
|
||||
/**
|
||||
* Grab the given key. If grabtype is GRABTYPE_XI, the key is a keycode. If
|
||||
* grabtype is GRABTYPE_XI2, the key is a keysym.
|
||||
* Grab the given key. If grabtype is XI, the key is a keycode. If
|
||||
* grabtype is XI2, the key is a keysym.
|
||||
*/
|
||||
int
|
||||
GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
||||
int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
|
||||
int key, GrabParameters *param, enum InputLevel grabtype, GrabMask *mask)
|
||||
{
|
||||
WindowPtr pWin;
|
||||
GrabPtr grab;
|
||||
|
@ -1493,7 +1494,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
|||
return rc;
|
||||
if ((dev->id != XIAllDevices && dev->id != XIAllMasterDevices) && k == NULL)
|
||||
return BadMatch;
|
||||
if (grabtype == GRABTYPE_XI)
|
||||
if (grabtype == XI)
|
||||
{
|
||||
if ((key > k->xkbInfo->desc->max_key_code ||
|
||||
key < k->xkbInfo->desc->min_key_code)
|
||||
|
@ -1502,7 +1503,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
|||
return BadValue;
|
||||
}
|
||||
type = DeviceKeyPress;
|
||||
} else if (grabtype == GRABTYPE_XI2)
|
||||
} else if (grabtype == XI2)
|
||||
type = XI_KeyPress;
|
||||
|
||||
rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
|
||||
|
@ -1557,7 +1558,7 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
|
|||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
grab = CreateGrab(client->index, dev, dev, pWin, GRABTYPE_XI2,
|
||||
grab = CreateGrab(client->index, dev, dev, pWin, XI2,
|
||||
mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
|
||||
0, NULL, cursor);
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ ProcXGrabDevice(ClientPtr client)
|
|||
rc = GrabDevice(client, dev, stuff->other_devices_mode,
|
||||
stuff->this_device_mode, stuff->grabWindow,
|
||||
stuff->ownerEvents, stuff->time,
|
||||
&mask, GRABTYPE_XI, None, None,
|
||||
&mask, XI, None, None,
|
||||
&rep.status);
|
||||
|
||||
if (rc != Success)
|
||||
|
|
|
@ -137,7 +137,7 @@ ProcXGrabDeviceButton(ClientPtr client)
|
|||
return ret;
|
||||
|
||||
memset(¶m, 0, sizeof(param));
|
||||
param.grabtype = GRABTYPE_XI;
|
||||
param.grabtype = XI;
|
||||
param.ownerEvents = stuff->ownerEvents;
|
||||
param.this_device_mode = stuff->this_device_mode;
|
||||
param.other_devices_mode = stuff->other_devices_mode;
|
||||
|
@ -146,7 +146,7 @@ ProcXGrabDeviceButton(ClientPtr client)
|
|||
mask.xi = tmp[stuff->grabbed_device].mask;
|
||||
|
||||
ret = GrabButton(client, dev, mdev, stuff->button, ¶m,
|
||||
GRABTYPE_XI, &mask);
|
||||
XI, &mask);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ ProcXGrabDeviceKey(ClientPtr client)
|
|||
|
||||
|
||||
memset(¶m, 0, sizeof(param));
|
||||
param.grabtype = GRABTYPE_XI;
|
||||
param.grabtype = XI;
|
||||
param.ownerEvents = stuff->ownerEvents;
|
||||
param.this_device_mode = stuff->this_device_mode;
|
||||
param.other_devices_mode = stuff->other_devices_mode;
|
||||
|
@ -143,7 +143,7 @@ ProcXGrabDeviceKey(ClientPtr client)
|
|||
param.modifiers = stuff->modifiers;
|
||||
mask.xi = tmp[stuff->grabbed_device].mask;
|
||||
|
||||
ret = GrabKey(client, dev, mdev, stuff->key, ¶m, GRABTYPE_XI, &mask);
|
||||
ret = GrabKey(client, dev, mdev, stuff->key, ¶m, XI, &mask);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@ ProcXUngrabDevice(ClientPtr client)
|
|||
time = ClientTimeToServerTime(stuff->time);
|
||||
if ((CompareTimeStamps(time, currentTime) != LATER) &&
|
||||
(CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
|
||||
(grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI)
|
||||
(grab) && SameClient(grab, client) && grab->grabtype == XI)
|
||||
(*dev->deviceGrab.DeactivateGrab) (dev);
|
||||
return Success;
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ ProcXUngrabDeviceButton(ClientPtr client)
|
|||
temporaryGrab->device = dev;
|
||||
temporaryGrab->window = pWin;
|
||||
temporaryGrab->type = DeviceButtonPress;
|
||||
temporaryGrab->grabtype = GRABTYPE_XI;
|
||||
temporaryGrab->grabtype = XI;
|
||||
temporaryGrab->modifierDevice = mdev;
|
||||
temporaryGrab->modifiersDetail.exact = stuff->modifiers;
|
||||
temporaryGrab->modifiersDetail.pMask = NULL;
|
||||
|
|
|
@ -141,7 +141,7 @@ ProcXUngrabDeviceKey(ClientPtr client)
|
|||
temporaryGrab->device = dev;
|
||||
temporaryGrab->window = pWin;
|
||||
temporaryGrab->type = DeviceKeyPress;
|
||||
temporaryGrab->grabtype = GRABTYPE_XI;
|
||||
temporaryGrab->grabtype = XI;
|
||||
temporaryGrab->modifierDevice = mdev;
|
||||
temporaryGrab->modifiersDetail.exact = stuff->modifiers;
|
||||
temporaryGrab->modifiersDetail.pMask = NULL;
|
||||
|
|
|
@ -96,7 +96,7 @@ ProcXIGrabDevice(ClientPtr client)
|
|||
stuff->owner_events,
|
||||
stuff->time,
|
||||
&mask,
|
||||
GRABTYPE_XI2,
|
||||
XI2,
|
||||
stuff->cursor,
|
||||
None /* confineTo */,
|
||||
&status);
|
||||
|
@ -148,7 +148,7 @@ ProcXIUngrabDevice(ClientPtr client)
|
|||
time = ClientTimeToServerTime(stuff->time);
|
||||
if ((CompareTimeStamps(time, currentTime) != LATER) &&
|
||||
(CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
|
||||
(grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI2)
|
||||
(grab) && SameClient(grab, client) && grab->grabtype == XI2)
|
||||
(*dev->deviceGrab.DeactivateGrab) (dev);
|
||||
|
||||
return Success;
|
||||
|
|
|
@ -139,7 +139,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
|||
rep.num_modifiers = 0;
|
||||
|
||||
memset(¶m, 0, sizeof(param));
|
||||
param.grabtype = GRABTYPE_XI2;
|
||||
param.grabtype = XI2;
|
||||
param.ownerEvents = stuff->owner_events;
|
||||
param.this_device_mode = stuff->grab_mode;
|
||||
param.other_devices_mode = stuff->paired_device_mode;
|
||||
|
@ -183,11 +183,11 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
|||
{
|
||||
case XIGrabtypeButton:
|
||||
status = GrabButton(client, dev, mod_dev, stuff->detail,
|
||||
¶m, GRABTYPE_XI2, &mask);
|
||||
¶m, XI2, &mask);
|
||||
break;
|
||||
case XIGrabtypeKeycode:
|
||||
status = GrabKey(client, dev, mod_dev, stuff->detail,
|
||||
¶m, GRABTYPE_XI2, &mask);
|
||||
¶m, XI2, &mask);
|
||||
break;
|
||||
case XIGrabtypeEnter:
|
||||
case XIGrabtypeFocusIn:
|
||||
|
@ -313,7 +313,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
|
|||
case XIGrabtypeEnter: tempGrab->type = XI_Enter; break;
|
||||
case XIGrabtypeFocusIn: tempGrab->type = XI_FocusIn; break;
|
||||
}
|
||||
tempGrab->grabtype = GRABTYPE_XI2;
|
||||
tempGrab->grabtype = XI2;
|
||||
tempGrab->modifierDevice = mod_dev;
|
||||
tempGrab->modifiersDetail.pMask = NULL;
|
||||
tempGrab->detail.exact = stuff->detail;
|
||||
|
|
|
@ -275,6 +275,7 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
|
|||
dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
|
||||
dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
|
||||
dev->deviceGrab.activeGrab = AllocGrab();
|
||||
dev->deviceGrab.sync.event = calloc(1, sizeof(DeviceEvent));
|
||||
|
||||
XkbSetExtension(dev, ProcessKeyboardEvent);
|
||||
|
||||
|
|
|
@ -647,7 +647,7 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
|
|||
xde = (xXIDeviceEvent*)*xi;
|
||||
xde->type = GenericEvent;
|
||||
xde->extension = IReqCode;
|
||||
xde->evtype = GetXI2Type((InternalEvent*)ev);
|
||||
xde->evtype = GetXI2Type(ev->type);
|
||||
xde->time = ev->time;
|
||||
xde->length = bytes_to_int32(len - sizeof(xEvent));
|
||||
xde->detail = ev->detail.button;
|
||||
|
@ -714,7 +714,7 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
|
|||
raw = (xXIRawEvent*)*xi;
|
||||
raw->type = GenericEvent;
|
||||
raw->extension = IReqCode;
|
||||
raw->evtype = GetXI2Type((InternalEvent*)ev);
|
||||
raw->evtype = GetXI2Type(ev->type);
|
||||
raw->time = ev->time;
|
||||
raw->length = bytes_to_int32(len - sizeof(xEvent));
|
||||
raw->detail = ev->detail.button;
|
||||
|
@ -746,10 +746,10 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
|
|||
* equivalent exists.
|
||||
*/
|
||||
int
|
||||
GetCoreType(InternalEvent *event)
|
||||
GetCoreType(enum EventType type)
|
||||
{
|
||||
int coretype = 0;
|
||||
switch(event->any.type)
|
||||
switch(type)
|
||||
{
|
||||
case ET_Motion: coretype = MotionNotify; break;
|
||||
case ET_ButtonPress: coretype = ButtonPress; break;
|
||||
|
@ -767,10 +767,10 @@ GetCoreType(InternalEvent *event)
|
|||
* equivalent exists.
|
||||
*/
|
||||
int
|
||||
GetXIType(InternalEvent *event)
|
||||
GetXIType(enum EventType type)
|
||||
{
|
||||
int xitype = 0;
|
||||
switch(event->any.type)
|
||||
switch(type)
|
||||
{
|
||||
case ET_Motion: xitype = DeviceMotionNotify; break;
|
||||
case ET_ButtonPress: xitype = DeviceButtonPress; break;
|
||||
|
@ -790,11 +790,11 @@ GetXIType(InternalEvent *event)
|
|||
* equivalent exists.
|
||||
*/
|
||||
int
|
||||
GetXI2Type(InternalEvent *event)
|
||||
GetXI2Type(enum EventType type)
|
||||
{
|
||||
int xi2type = 0;
|
||||
|
||||
switch(event->any.type)
|
||||
switch(type)
|
||||
{
|
||||
case ET_Motion: xi2type = XI_Motion; break;
|
||||
case ET_ButtonPress: xi2type = XI_ButtonPress; break;
|
||||
|
|
792
dix/events.c
792
dix/events.c
File diff suppressed because it is too large
Load Diff
|
@ -61,7 +61,6 @@ SOFTWARE.
|
|||
#include "registry.h"
|
||||
#include "xace.h"
|
||||
|
||||
#define LAST_EVENT 128
|
||||
#define LAST_ERROR 255
|
||||
|
||||
static ExtensionEntry **extensions = (ExtensionEntry **)NULL;
|
||||
|
@ -82,7 +81,7 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
|
|||
|
||||
if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
|
||||
return((ExtensionEntry *) NULL);
|
||||
if ((lastEvent + NumEvents > LAST_EVENT) ||
|
||||
if ((lastEvent + NumEvents > MAXEVENTS) ||
|
||||
(unsigned)(lastError + NumErrors > LAST_ERROR)) {
|
||||
LogMessage(X_ERROR, "Not enabling extension %s: maximum number of "
|
||||
"events or errors exceeded.\n", name);
|
||||
|
|
|
@ -1094,6 +1094,30 @@ transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
|
|||
valuator_mask_set_double(mask, 1, y);
|
||||
}
|
||||
|
||||
static void
|
||||
storeLastValuators(DeviceIntPtr dev, ValuatorMask *mask,
|
||||
int xaxis, int yaxis,
|
||||
double devx, double devy)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* store desktop-wide in last.valuators */
|
||||
if (valuator_mask_isset(mask, xaxis))
|
||||
dev->last.valuators[0] = devx;
|
||||
if (valuator_mask_isset(mask, yaxis))
|
||||
dev->last.valuators[1] = devy;
|
||||
|
||||
for (i = 0; i < valuator_mask_size(mask); i++)
|
||||
{
|
||||
if (i == xaxis || i == yaxis)
|
||||
continue;
|
||||
|
||||
if (valuator_mask_isset(mask, i))
|
||||
dev->last.valuators[i] = valuator_mask_get_double(mask, i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate internal events representing this pointer event and enqueue them
|
||||
* on the event queue.
|
||||
|
@ -1162,7 +1186,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
|||
int buttons, CARD32 ms, int flags,
|
||||
const ValuatorMask *mask_in)
|
||||
{
|
||||
int num_events = 1, i;
|
||||
int num_events = 1;
|
||||
DeviceEvent *event;
|
||||
RawDeviceEvent *raw;
|
||||
double screenx = 0.0, screeny = 0.0; /* desktop coordinate system */
|
||||
|
@ -1237,17 +1261,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
|||
|
||||
clipValuators(pDev, &mask);
|
||||
|
||||
/* store desktop-wide in last.valuators */
|
||||
if (valuator_mask_isset(&mask, 0))
|
||||
pDev->last.valuators[0] = devx;
|
||||
if (valuator_mask_isset(&mask, 1))
|
||||
pDev->last.valuators[1] = devy;
|
||||
|
||||
for (i = 2; i < valuator_mask_size(&mask); i++)
|
||||
{
|
||||
if (valuator_mask_isset(&mask, i))
|
||||
pDev->last.valuators[i] = valuator_mask_get_double(&mask, i);
|
||||
}
|
||||
storeLastValuators(pDev, &mask, 0, 1, devx, devy);
|
||||
|
||||
/* Update the MD's co-ordinates, which are always in desktop space. */
|
||||
if (!IsMaster(pDev) || !IsFloating(pDev)) {
|
||||
|
|
72
dix/grabs.c
72
dix/grabs.c
|
@ -60,7 +60,9 @@ SOFTWARE.
|
|||
#include "dixgrabs.h"
|
||||
#include "xace.h"
|
||||
#include "exevents.h"
|
||||
#include "exglobals.h"
|
||||
#include "inpututils.h"
|
||||
#include "client.h"
|
||||
|
||||
#define BITMASK(i) (((Mask)1) << ((i) & 31))
|
||||
#define MASKIDX(i) ((i) >> 5)
|
||||
|
@ -77,25 +79,41 @@ PrintDeviceGrabInfo(DeviceIntPtr dev)
|
|||
int i, j;
|
||||
GrabInfoPtr devGrab = &dev->deviceGrab;
|
||||
GrabPtr grab = devGrab->grab;
|
||||
Bool clientIdPrinted = FALSE;
|
||||
|
||||
ErrorF("Active grab 0x%lx (%s) on device '%s' (%d):",
|
||||
ErrorF("Active grab 0x%lx (%s) on device '%s' (%d):\n",
|
||||
(unsigned long) grab->resource,
|
||||
(grab->grabtype == GRABTYPE_XI2) ? "xi2" :
|
||||
((grab->grabtype == GRABTYPE_CORE) ? "core" : "xi1"),
|
||||
(grab->grabtype == XI2) ? "xi2" :
|
||||
((grab->grabtype == CORE) ? "core" : "xi1"),
|
||||
dev->name, dev->id);
|
||||
|
||||
client = clients[CLIENT_ID(grab->resource)];
|
||||
if (client && GetLocalClientCreds(client, &lcc) != -1)
|
||||
if (client)
|
||||
{
|
||||
pid_t clientpid = GetClientPid(client);
|
||||
const char *cmdname = GetClientCmdName(client);
|
||||
const char *cmdargs = GetClientCmdArgs(client);
|
||||
|
||||
if ((clientpid > 0) && (cmdname != NULL))
|
||||
{
|
||||
ErrorF(" client pid %ld %s %s\n",
|
||||
(long) clientpid, cmdname, cmdargs ? cmdargs : "");
|
||||
clientIdPrinted = TRUE;
|
||||
}
|
||||
else if (GetLocalClientCreds(client, &lcc) != -1)
|
||||
{
|
||||
ErrorF(" client pid %ld uid %ld gid %ld\n",
|
||||
(lcc->fieldsSet & LCC_PID_SET) ? (long) lcc->pid : 0,
|
||||
(lcc->fieldsSet & LCC_UID_SET) ? (long) lcc->euid : 0,
|
||||
(lcc->fieldsSet & LCC_GID_SET) ? (long) lcc->egid : 0);
|
||||
FreeLocalClientCreds(lcc);
|
||||
clientIdPrinted = TRUE;
|
||||
}
|
||||
else
|
||||
}
|
||||
if (!clientIdPrinted)
|
||||
{
|
||||
ErrorF(" (no client information available)\n");
|
||||
ErrorF(" (no client information available for client %d)\n",
|
||||
CLIENT_ID(grab->resource));
|
||||
}
|
||||
|
||||
/* XXX is this even correct? */
|
||||
|
@ -110,18 +128,18 @@ PrintDeviceGrabInfo(DeviceIntPtr dev)
|
|||
devGrab->sync.frozen ? "frozen" : "thawed",
|
||||
devGrab->sync.state);
|
||||
|
||||
if (grab->grabtype == GRABTYPE_CORE)
|
||||
if (grab->grabtype == CORE)
|
||||
{
|
||||
ErrorF(" core event mask 0x%lx\n",
|
||||
(unsigned long) grab->eventMask);
|
||||
}
|
||||
else if (grab->grabtype == GRABTYPE_XI)
|
||||
else if (grab->grabtype == XI)
|
||||
{
|
||||
ErrorF(" xi1 event mask 0x%lx\n",
|
||||
devGrab->implicitGrab ? (unsigned long) grab->deviceMask :
|
||||
(unsigned long) grab->eventMask);
|
||||
}
|
||||
else if (grab->grabtype == GRABTYPE_XI2)
|
||||
else if (grab->grabtype == XI2)
|
||||
{
|
||||
for (i = 0; i < xi2mask_num_masks(grab->xi2mask); i++)
|
||||
{
|
||||
|
@ -205,7 +223,7 @@ CreateGrab(
|
|||
DeviceIntPtr device,
|
||||
DeviceIntPtr modDevice,
|
||||
WindowPtr window,
|
||||
GrabType grabtype,
|
||||
enum InputLevel grabtype,
|
||||
GrabMask *mask,
|
||||
GrabParameters *param,
|
||||
int type,
|
||||
|
@ -237,7 +255,7 @@ CreateGrab(
|
|||
grab->cursor = cursor;
|
||||
grab->next = NULL;
|
||||
|
||||
if (grabtype == GRABTYPE_XI2)
|
||||
if (grabtype == XI2)
|
||||
xi2mask_merge(grab->xi2mask, mask->xi2mask);
|
||||
if (cursor)
|
||||
cursor->refcnt++;
|
||||
|
@ -409,7 +427,7 @@ DetailSupersedesSecond(
|
|||
static Bool
|
||||
GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
|
||||
{
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == XI2) ?
|
||||
(unsigned int)XIAnyModifier :
|
||||
(unsigned int)AnyModifier;
|
||||
if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
|
||||
|
@ -440,14 +458,14 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
|
|||
Bool
|
||||
GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
|
||||
{
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == XI2) ?
|
||||
(unsigned int)XIAnyModifier :
|
||||
(unsigned int)AnyModifier;
|
||||
|
||||
if (pFirstGrab->grabtype != pSecondGrab->grabtype)
|
||||
return FALSE;
|
||||
|
||||
if (pFirstGrab->grabtype == GRABTYPE_XI2)
|
||||
if (pFirstGrab->grabtype == XI2)
|
||||
{
|
||||
if (pFirstGrab->device == inputInfo.all_devices ||
|
||||
pSecondGrab->device == inputInfo.all_devices)
|
||||
|
@ -499,7 +517,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
|
|||
static Bool
|
||||
GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
|
||||
{
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
|
||||
unsigned int any_modifier = (pFirstGrab->grabtype == XI2) ?
|
||||
(unsigned int)XIAnyModifier :
|
||||
(unsigned int)AnyModifier;
|
||||
|
||||
|
@ -549,7 +567,7 @@ AddPassiveGrabToList(ClientPtr client, GrabPtr pGrab)
|
|||
|
||||
for (grab = wPassiveGrabs(pGrab->window); grab; grab = grab->next)
|
||||
{
|
||||
if (GrabMatchesSecond(pGrab, grab, (pGrab->grabtype == GRABTYPE_CORE)))
|
||||
if (GrabMatchesSecond(pGrab, grab, (pGrab->grabtype == CORE)))
|
||||
{
|
||||
if (CLIENT_BITS(pGrab->resource) != CLIENT_BITS(grab->resource))
|
||||
{
|
||||
|
@ -627,9 +645,9 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
any_modifier = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
|
||||
any_modifier = (pMinuendGrab->grabtype == XI2) ?
|
||||
(unsigned int)XIAnyModifier : (unsigned int)AnyModifier;
|
||||
any_key = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
|
||||
any_key = (pMinuendGrab->grabtype == XI2) ?
|
||||
(unsigned int)XIAnyKeycode : (unsigned int)AnyKey;
|
||||
ndels = nadds = nups = 0;
|
||||
ok = TRUE;
|
||||
|
@ -639,7 +657,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
|
|||
{
|
||||
if ((CLIENT_BITS(grab->resource) != CLIENT_BITS(pMinuendGrab->resource)) ||
|
||||
!GrabMatchesSecond(grab, pMinuendGrab,
|
||||
(grab->grabtype == GRABTYPE_CORE)))
|
||||
(grab->grabtype == CORE)))
|
||||
continue;
|
||||
if (GrabSupersedesSecond(pMinuendGrab, grab))
|
||||
{
|
||||
|
@ -737,3 +755,19 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
|
|||
|
||||
#undef UPDATE
|
||||
}
|
||||
|
||||
Bool
|
||||
GrabIsPointerGrab(GrabPtr grab)
|
||||
{
|
||||
return (grab->type == ButtonPress ||
|
||||
grab->type == DeviceButtonPress ||
|
||||
grab->type == XI_ButtonPress);
|
||||
}
|
||||
|
||||
Bool
|
||||
GrabIsKeyboardGrab(GrabPtr grab)
|
||||
{
|
||||
return (grab->type == KeyPress ||
|
||||
grab->type == DeviceKeyPress ||
|
||||
grab->type == XI_KeyPress);
|
||||
}
|
||||
|
|
|
@ -626,7 +626,7 @@ void verify_internal_event(const InternalEvent *ev)
|
|||
if (ev && ev->any.header != ET_Internal)
|
||||
{
|
||||
int i;
|
||||
unsigned char *data = (unsigned char*)ev;
|
||||
const unsigned char *data = (const unsigned char*)ev;
|
||||
|
||||
ErrorF("dix: invalid event type %d\n", ev->any.header);
|
||||
|
||||
|
@ -657,6 +657,64 @@ void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms)
|
|||
event->sourceid = dev->id;
|
||||
}
|
||||
|
||||
int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd)
|
||||
{
|
||||
int corestate;
|
||||
/* core state needs to be assembled BEFORE the device is updated. */
|
||||
corestate = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
|
||||
corestate |= (mouse && mouse->button) ? (mouse->button->state) : 0;
|
||||
return corestate;
|
||||
}
|
||||
|
||||
void event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
||||
if (BitIsOn(mouse->button->down, i))
|
||||
SetBit(event->buttons, i);
|
||||
|
||||
if (kbd && kbd->key)
|
||||
{
|
||||
XkbStatePtr state;
|
||||
/* we need the state before the event happens */
|
||||
if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
|
||||
state = &kbd->key->xkbInfo->prev_state;
|
||||
else
|
||||
state = &kbd->key->xkbInfo->state;
|
||||
|
||||
event->mods.base = state->base_mods;
|
||||
event->mods.latched = state->latched_mods;
|
||||
event->mods.locked = state->locked_mods;
|
||||
event->mods.effective = state->mods;
|
||||
|
||||
event->group.base = state->base_group;
|
||||
event->group.latched = state->latched_group;
|
||||
event->group.locked = state->locked_group;
|
||||
event->group.effective = state->group;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the event filter mask for the given device and the given core or
|
||||
* XI1 protocol type.
|
||||
*/
|
||||
Mask
|
||||
event_get_filter_from_type(DeviceIntPtr dev, int evtype)
|
||||
{
|
||||
return event_filters[dev ? dev->id : 0][evtype];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the event filter mask for the given device and the given core or
|
||||
* XI2 protocol type.
|
||||
*/
|
||||
Mask
|
||||
event_get_filter_from_xi2type(int evtype)
|
||||
{
|
||||
return (1 << (evtype % 8));
|
||||
}
|
||||
|
||||
Bool
|
||||
point_on_screen(ScreenPtr pScreen, int x, int y)
|
||||
{
|
||||
|
|
|
@ -592,7 +592,7 @@ int (* SwappedProcVector[256]) (
|
|||
ProcBadRequest
|
||||
};
|
||||
|
||||
EventSwapPtr EventSwapVector[128] =
|
||||
EventSwapPtr EventSwapVector[MAXEVENTS] =
|
||||
{
|
||||
(EventSwapPtr)SErrorEvent,
|
||||
NotImplemented,
|
||||
|
|
|
@ -1037,7 +1037,7 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr keybd)
|
|||
if (pScreenPriv->client)
|
||||
{
|
||||
dgaEvent de;
|
||||
de.u.u.type = *XDGAEventBase + GetCoreType((InternalEvent*)&ev);
|
||||
de.u.u.type = *XDGAEventBase + GetCoreType(ev.type);
|
||||
de.u.u.detail = event->detail;
|
||||
de.u.event.time = event->time;
|
||||
de.u.event.dx = event->dx;
|
||||
|
@ -1091,7 +1091,7 @@ DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse)
|
|||
dgaEvent de;
|
||||
int coreEquiv;
|
||||
|
||||
coreEquiv = GetCoreType((InternalEvent*)&ev);
|
||||
coreEquiv = GetCoreType(ev.type);
|
||||
|
||||
de.u.u.type = *XDGAEventBase + coreEquiv;
|
||||
de.u.u.detail = event->detail;
|
||||
|
|
|
@ -400,6 +400,11 @@ extern int DeliverDeviceEvents(
|
|||
WindowPtr /* stopAt */,
|
||||
DeviceIntPtr /* dev */);
|
||||
|
||||
extern int DeliverOneGrabbedEvent(
|
||||
InternalEvent* /* event*/,
|
||||
DeviceIntPtr /* dev */,
|
||||
enum InputLevel /* level */);
|
||||
|
||||
extern void InitializeSprite(
|
||||
DeviceIntPtr /* pDev */,
|
||||
WindowPtr /* pWin */);
|
||||
|
|
|
@ -40,7 +40,7 @@ extern GrabPtr CreateGrab(
|
|||
DeviceIntPtr /* device */,
|
||||
DeviceIntPtr /* modDevice */,
|
||||
WindowPtr /* window */,
|
||||
GrabType /* grabtype */,
|
||||
enum InputLevel /* grabtype */,
|
||||
GrabMask * /* mask */,
|
||||
struct _GrabParameters * /* param */,
|
||||
int /* type */,
|
||||
|
@ -64,4 +64,6 @@ extern _X_EXPORT int AddPassiveGrabToList(
|
|||
extern _X_EXPORT Bool DeletePassiveGrabFromList(
|
||||
GrabPtr /* pMinuendGrab */);
|
||||
|
||||
extern Bool GrabIsPointerGrab(GrabPtr grab);
|
||||
extern Bool GrabIsKeyboardGrab(GrabPtr grab);
|
||||
#endif /* DIXGRABS_H */
|
||||
|
|
|
@ -27,14 +27,15 @@
|
|||
#include <X11/extensions/XIproto.h>
|
||||
#include "input.h"
|
||||
#include "events.h"
|
||||
#include "eventstr.h"
|
||||
|
||||
#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
|
||||
|
||||
_X_EXPORT int EventToCore(InternalEvent *event, xEvent **core, int *count);
|
||||
_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
|
||||
_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
|
||||
_X_INTERNAL int GetCoreType(InternalEvent* ev);
|
||||
_X_INTERNAL int GetXIType(InternalEvent* ev);
|
||||
_X_INTERNAL int GetXI2Type(InternalEvent* ev);
|
||||
_X_INTERNAL int GetCoreType(enum EventType type);
|
||||
_X_INTERNAL int GetXIType(enum EventType type);
|
||||
_X_INTERNAL int GetXI2Type(enum EventType type);
|
||||
|
||||
#endif /* _EVENTCONVERT_H_ */
|
||||
|
|
|
@ -159,7 +159,7 @@ typedef struct _XIClientRec {
|
|||
|
||||
|
||||
typedef struct _GrabParameters {
|
||||
int grabtype; /* GRABTYPE_CORE, etc. */
|
||||
int grabtype; /* CORE, etc. */
|
||||
unsigned int ownerEvents;
|
||||
unsigned int this_device_mode;
|
||||
unsigned int other_devices_mode;
|
||||
|
@ -200,7 +200,7 @@ GrabButton(
|
|||
DeviceIntPtr /* modifier_device */,
|
||||
int /* button */,
|
||||
GrabParameters* /* param */,
|
||||
GrabType /* grabtype */,
|
||||
enum InputLevel /* grabtype */,
|
||||
GrabMask* /* eventMask */);
|
||||
|
||||
extern int
|
||||
|
@ -210,7 +210,7 @@ GrabKey(
|
|||
DeviceIntPtr /* modifier_device */,
|
||||
int /* key */,
|
||||
GrabParameters* /* param */,
|
||||
GrabType /* grabtype */,
|
||||
enum InputLevel /* grabtype */,
|
||||
GrabMask* /* eventMask */);
|
||||
|
||||
extern int
|
||||
|
|
|
@ -57,6 +57,7 @@ SOFTWARE.
|
|||
#include "xkbrules.h"
|
||||
#include "events.h"
|
||||
#include "list.h"
|
||||
#include <X11/extensions/XI2.h>
|
||||
|
||||
#define DEVICE_INIT 0
|
||||
#define DEVICE_ON 1
|
||||
|
@ -101,6 +102,12 @@ SOFTWARE.
|
|||
#define RevertToFollowKeyboard 3
|
||||
#endif
|
||||
|
||||
enum InputLevel {
|
||||
CORE,
|
||||
XI,
|
||||
XI2,
|
||||
};
|
||||
|
||||
typedef unsigned long Leds;
|
||||
typedef struct _OtherClients *OtherClientsPtr;
|
||||
typedef struct _InputClients *InputClientsPtr;
|
||||
|
@ -537,14 +544,16 @@ extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
|
|||
extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients);
|
||||
extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
|
||||
extern Bool WindowXI2MaskIsset(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
|
||||
extern int GetXI2MaskByte(XI2Mask *mask, DeviceIntPtr dev, int event_type);
|
||||
void FixUpEventFromWindow(SpritePtr pSprite,
|
||||
xEvent *xE,
|
||||
WindowPtr pWin,
|
||||
Window child,
|
||||
Bool calcChild);
|
||||
extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y);
|
||||
extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event,
|
||||
WindowPtr win);
|
||||
extern int EventIsDeliverable(DeviceIntPtr dev, int evtype, WindowPtr win);
|
||||
extern Bool ActivatePassiveGrab(DeviceIntPtr dev, GrabPtr grab,
|
||||
InternalEvent *ev);
|
||||
/**
|
||||
* Masks specifying the type of event to deliver for an InternalEvent; used
|
||||
* by EventIsDeliverable.
|
||||
|
@ -557,6 +566,13 @@ extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event,
|
|||
#define EVENT_XI2_MASK (1 << 3) /**< XI2 mask set on window */
|
||||
/* @} */
|
||||
|
||||
enum EventDeliveryState {
|
||||
EVENT_DELIVERED, /**< Event has been delivered to a client */
|
||||
EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */
|
||||
EVENT_SKIP, /**< Event can be discarded by the caller */
|
||||
EVENT_REJECTED, /**< Event was rejected for delivery to the client */
|
||||
};
|
||||
|
||||
/* Implemented by the DDX. */
|
||||
extern _X_EXPORT int NewInputDeviceRequest(
|
||||
InputOption *options,
|
||||
|
|
|
@ -57,7 +57,7 @@ SOFTWARE.
|
|||
#include "geext.h"
|
||||
#include "privates.h"
|
||||
|
||||
#define BitIsOn(ptr, bit) (!!(((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7))))
|
||||
#define BitIsOn(ptr, bit) (!!(((const BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7))))
|
||||
#define SetBit(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
|
||||
#define ClearBit(ptr, bit) (((BYTE *)(ptr))[(bit)>>3] &= ~(1 << ((bit) & 7)))
|
||||
extern _X_EXPORT int CountBits(const uint8_t *mask, int len);
|
||||
|
@ -167,12 +167,6 @@ typedef struct _DetailRec { /* Grab details may be bit masks */
|
|||
Mask *pMask;
|
||||
} DetailRec;
|
||||
|
||||
typedef enum {
|
||||
GRABTYPE_CORE,
|
||||
GRABTYPE_XI,
|
||||
GRABTYPE_XI2
|
||||
} GrabType;
|
||||
|
||||
union _GrabMask {
|
||||
Mask core;
|
||||
Mask xi;
|
||||
|
@ -200,7 +194,7 @@ typedef struct _GrabRec {
|
|||
unsigned ownerEvents:1;
|
||||
unsigned keyboardMode:1;
|
||||
unsigned pointerMode:1;
|
||||
GrabType grabtype;
|
||||
enum InputLevel grabtype;
|
||||
CARD8 type; /* event type */
|
||||
DetailRec modifiersDetail;
|
||||
DeviceIntPtr modifierDevice;
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include "input.h"
|
||||
#include <X11/extensions/XI2proto.h>
|
||||
|
||||
extern Mask event_filters[MAXDEVICES][MAXEVENTS];
|
||||
|
||||
struct _ValuatorMask {
|
||||
int8_t last_bit; /* highest bit set in mask */
|
||||
uint8_t mask[(MAX_VALUATORS + 7)/8];
|
||||
|
@ -40,6 +42,10 @@ struct _ValuatorMask {
|
|||
|
||||
extern void verify_internal_event(const InternalEvent *ev);
|
||||
extern void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms);
|
||||
extern int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd);
|
||||
extern void event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event);
|
||||
extern Mask event_get_filter_from_type(DeviceIntPtr dev, int evtype);
|
||||
extern Mask event_get_filter_from_xi2type(int evtype);
|
||||
|
||||
FP3232 double_to_fp3232(double in);
|
||||
FP1616 double_to_fp1616(double in);
|
||||
|
|
|
@ -89,6 +89,8 @@ OF THIS SOFTWARE.
|
|||
#define MAXFORMATS 8
|
||||
#define MAXDEVICES 40 /* input devices */
|
||||
|
||||
/* 128 event opcodes for core + extension events, excluding GE */
|
||||
#define MAXEVENTS 128
|
||||
#define EXTENSION_EVENT_BASE 64
|
||||
#define EXTENSION_BASE 128
|
||||
|
||||
|
|
130
test/input.c
130
test/input.c
|
@ -148,7 +148,7 @@ static void dix_check_grab_values(void)
|
|||
|
||||
memset(&client, 0, sizeof(client));
|
||||
|
||||
param.grabtype = GRABTYPE_CORE;
|
||||
param.grabtype = CORE;
|
||||
param.this_device_mode = GrabModeSync;
|
||||
param.other_devices_mode = GrabModeSync;
|
||||
param.modifiers = AnyModifier;
|
||||
|
@ -531,22 +531,22 @@ static void dix_grab_matching(void)
|
|||
memset(&b, 0, sizeof(b));
|
||||
|
||||
/* different grabtypes must fail */
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = XI2;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI2;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = CORE;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
|
@ -568,8 +568,8 @@ static void dix_grab_matching(void)
|
|||
|
||||
inputInfo.all_devices = &xi_all_devices;
|
||||
inputInfo.all_master_devices = &xi_all_master_devices;
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.device = &dev1;
|
||||
b.device = &dev2;
|
||||
|
||||
|
@ -598,8 +598,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == FALSE);
|
||||
|
||||
/* ignoreDevice FALSE must fail for different devices for CORE and XI */
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.device = &dev1;
|
||||
b.device = &dev2;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -607,8 +607,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.device = &dev1;
|
||||
b.device = &dev2;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -618,8 +618,8 @@ static void dix_grab_matching(void)
|
|||
|
||||
/* ignoreDevice FALSE must fail for different modifier devices for CORE
|
||||
* and XI */
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -627,8 +627,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -637,8 +637,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == FALSE);
|
||||
|
||||
/* different event type must fail */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -650,8 +650,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&a, &b, TRUE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -663,8 +663,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&a, &b, TRUE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -677,8 +677,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == FALSE);
|
||||
|
||||
/* different modifiers must fail */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.device = &dev1;
|
||||
b.device = &dev1;
|
||||
a.modifierDevice = &dev1;
|
||||
|
@ -692,23 +692,23 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
/* AnyModifier must fail for XI2 */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.modifiersDetail.exact = AnyModifier;
|
||||
b.modifiersDetail.exact = 1;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
|
@ -717,8 +717,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == FALSE);
|
||||
|
||||
/* XIAnyModifier must fail for CORE and XI */
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.modifiersDetail.exact = XIAnyModifier;
|
||||
b.modifiersDetail.exact = 1;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
|
@ -726,8 +726,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.modifiersDetail.exact = XIAnyModifier;
|
||||
b.modifiersDetail.exact = 1;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
|
@ -736,8 +736,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == FALSE);
|
||||
|
||||
/* different detail must fail */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.detail.exact = 1;
|
||||
b.detail.exact = 2;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
@ -747,23 +747,23 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
/* detail of AnyModifier must fail */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.detail.exact = AnyModifier;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
@ -773,23 +773,23 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
/* detail of XIAnyModifier must fail */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.detail.exact = XIAnyModifier;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
@ -799,23 +799,23 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
rc = GrabMatchesSecond(&a, &b, FALSE);
|
||||
assert(rc == FALSE);
|
||||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == FALSE);
|
||||
|
||||
/* XIAnyModifier or AnyModifer must succeed */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.detail.exact = 1;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = XIAnyModifier;
|
||||
|
@ -825,8 +825,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == TRUE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.detail.exact = 1;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = AnyModifier;
|
||||
|
@ -836,8 +836,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == TRUE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.detail.exact = 1;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = AnyModifier;
|
||||
|
@ -848,8 +848,8 @@ static void dix_grab_matching(void)
|
|||
assert(rc == TRUE);
|
||||
|
||||
/* AnyKey or XIAnyKeycode must succeed */
|
||||
a.grabtype = GRABTYPE_XI2;
|
||||
b.grabtype = GRABTYPE_XI2;
|
||||
a.grabtype = XI2;
|
||||
b.grabtype = XI2;
|
||||
a.detail.exact = XIAnyKeycode;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
@ -859,8 +859,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == TRUE);
|
||||
|
||||
a.grabtype = GRABTYPE_CORE;
|
||||
b.grabtype = GRABTYPE_CORE;
|
||||
a.grabtype = CORE;
|
||||
b.grabtype = CORE;
|
||||
a.detail.exact = AnyKey;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
@ -870,8 +870,8 @@ static void dix_grab_matching(void)
|
|||
rc = GrabMatchesSecond(&b, &a, FALSE);
|
||||
assert(rc == TRUE);
|
||||
|
||||
a.grabtype = GRABTYPE_XI;
|
||||
b.grabtype = GRABTYPE_XI;
|
||||
a.grabtype = XI;
|
||||
b.grabtype = XI;
|
||||
a.detail.exact = AnyKey;
|
||||
b.detail.exact = 1;
|
||||
a.modifiersDetail.exact = 1;
|
||||
|
|
|
@ -59,7 +59,7 @@ static void test_values_XIRawEvent(RawDeviceEvent *in, xXIRawEvent *out,
|
|||
|
||||
assert(out->type == GenericEvent);
|
||||
assert(out->extension == 0); /* IReqCode defaults to 0 */
|
||||
assert(out->evtype == GetXI2Type((InternalEvent*)in));
|
||||
assert(out->evtype == GetXI2Type(in->type));
|
||||
assert(out->time == in->time);
|
||||
assert(out->detail == in->detail.button);
|
||||
assert(out->deviceid == in->deviceid);
|
||||
|
@ -305,7 +305,7 @@ static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out,
|
|||
}
|
||||
|
||||
assert(out->extension == 0); /* IReqCode defaults to 0 */
|
||||
assert(out->evtype == GetXI2Type((InternalEvent*)in));
|
||||
assert(out->evtype == GetXI2Type(in->type));
|
||||
assert(out->time == in->time);
|
||||
assert(out->detail == in->detail.button);
|
||||
assert(out->length >= 12);
|
||||
|
@ -662,7 +662,7 @@ static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
|
|||
|
||||
assert(out->type == GenericEvent);
|
||||
assert(out->extension == 0); /* IReqCode defaults to 0 */
|
||||
assert(out->evtype == GetXI2Type((InternalEvent*)in));
|
||||
assert(out->evtype == GetXI2Type(in->type));
|
||||
assert(out->time == in->time);
|
||||
assert(out->deviceid == in->deviceid);
|
||||
assert(out->sourceid == in->sourceid);
|
||||
|
|
|
@ -49,7 +49,7 @@ struct test_data {
|
|||
} testdata;
|
||||
|
||||
int __wrap_GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
||||
int button, GrabParameters *param, GrabType grabtype,
|
||||
int button, GrabParameters *param, enum InputLevel grabtype,
|
||||
GrabMask *mask);
|
||||
static void reply_XIPassiveGrabDevice_data(ClientPtr client, int len, char *data, void *userdata);
|
||||
|
||||
|
@ -69,7 +69,7 @@ int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access
|
|||
}
|
||||
|
||||
int __wrap_GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
|
||||
int button, GrabParameters *param, GrabType grabtype,
|
||||
int button, GrabParameters *param, enum InputLevel grabtype,
|
||||
GrabMask *mask)
|
||||
{
|
||||
/* Fail every odd modifier */
|
||||
|
|
Loading…
Reference in New Issue