Xi: send XI2 focus events.

This commit is contained in:
Peter Hutterer 2009-02-23 16:12:25 +10:00
parent daf7dd3bfe
commit 3f37923a72
3 changed files with 62 additions and 19 deletions

View File

@ -1164,15 +1164,58 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
WindowPtr pWin) WindowPtr pWin)
{ {
deviceFocus event; deviceFocus event;
xXIFocusInEvent *xi2event;
DeviceIntPtr mouse;
int btlen, len, i;
if (type == FocusIn) mouse = (dev->isMaster || dev->u.master) ? GetPairedDevice(dev) : NULL;
type = DeviceFocusIn;
else
type = DeviceFocusOut;
/* XI 2 event */
btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
btlen = (btlen + 3)/4;
len = sizeof(xXIFocusInEvent) + btlen * 4;
xi2event = xcalloc(1, len);
xi2event->type = GenericEvent;
xi2event->extension = IReqCode;
xi2event->evtype = type;
xi2event->length = (len - sizeof(xEvent))/4;
xi2event->buttons_len = btlen;
xi2event->detail = detail;
xi2event->time = currentTime.milliseconds;
xi2event->deviceid = dev->id;
xi2event->sourceid = 0; /*XXX */
xi2event->mode = mode;
xi2event->root_x.integral = mouse->spriteInfo->sprite->hot.x;
xi2event->root_y.integral = mouse->spriteInfo->sprite->hot.y;
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
if (BitIsOn(mouse->button->down, i))
SetBit(&xi2event[1], 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->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;
}
FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
GetWindowXI2Mask(dev, pWin, xi2event), NullGrab,
dev->id);
xfree(xi2event);
/* XI 1.x event */
event.deviceid = dev->id; event.deviceid = dev->id;
event.mode = mode; event.mode = mode;
event.type = type; event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut;
event.detail = detail; event.detail = detail;
event.window = pWin->drawable.id; event.window = pWin->drawable.id;
event.time = currentTime.milliseconds; event.time = currentTime.milliseconds;

View File

@ -629,7 +629,7 @@ DeviceFocusOutEvents(DeviceIntPtr dev,
if (ancestor == child) if (ancestor == child)
return; return;
for (win = child->parent; win != ancestor; win = win->parent) for (win = child->parent; win != ancestor; win = win->parent)
DeviceFocusEvent(dev, DeviceFocusOut, mode, detail, win); DeviceFocusEvent(dev, XI_FocusOut, mode, detail, win);
} }
@ -650,7 +650,7 @@ DeviceFocusInEvents(DeviceIntPtr dev,
if (ancestor == parent || !parent) if (ancestor == parent || !parent)
return; return;
DeviceFocusInEvents(dev, ancestor, parent, mode, detail); DeviceFocusInEvents(dev, ancestor, parent, mode, detail);
DeviceFocusEvent(dev, DeviceFocusIn, mode, detail, parent); DeviceFocusEvent(dev, XI_FocusIn, mode, detail, parent);
} }
/** /**
@ -1275,21 +1275,21 @@ DeviceFocusEvents(DeviceIntPtr dev,
NotifyPointer); NotifyPointer);
/* Notify all the roots */ /* Notify all the roots */
for (i = 0; i < nscreens; i++) for (i = 0; i < nscreens; i++)
DeviceFocusEvent(dev, FocusOut, mode, out, WindowTable[i]); DeviceFocusEvent(dev, XI_FocusOut, mode, out, WindowTable[i]);
} }
else else
{ {
if (IsParent(from, sprite->win)) if (IsParent(from, sprite->win))
DeviceFocusOutEvents(dev, sprite->win, from, mode, DeviceFocusOutEvents(dev, sprite->win, from, mode,
NotifyPointer); NotifyPointer);
DeviceFocusEvent(dev, FocusOut, mode, NotifyNonlinear, from); DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from);
/* next call catches the root too, if the screen changed */ /* next call catches the root too, if the screen changed */
DeviceFocusOutEvents(dev, from->parent, NullWindow, mode, DeviceFocusOutEvents(dev, from->parent, NullWindow, mode,
NotifyNonlinearVirtual); NotifyNonlinearVirtual);
} }
/* Notify all the roots */ /* Notify all the roots */
for (i = 0; i < nscreens; i++) for (i = 0; i < nscreens; i++)
DeviceFocusEvent(dev, FocusIn, mode, in, WindowTable[i]); DeviceFocusEvent(dev, XI_FocusIn, mode, in, WindowTable[i]);
if (to == PointerRootWin) if (to == PointerRootWin)
DeviceFocusInEvents(dev, RootWindow(dev), sprite->win, mode, NotifyPointer); DeviceFocusInEvents(dev, RootWindow(dev), sprite->win, mode, NotifyPointer);
} }
@ -1301,10 +1301,10 @@ DeviceFocusEvents(DeviceIntPtr dev,
DeviceFocusOutEvents(dev, sprite->win, RootWindow(dev), mode, DeviceFocusOutEvents(dev, sprite->win, RootWindow(dev), mode,
NotifyPointer); NotifyPointer);
for (i = 0; i < nscreens; i++) for (i = 0; i < nscreens; i++)
DeviceFocusEvent(dev, FocusOut, mode, out, WindowTable[i]); DeviceFocusEvent(dev, XI_FocusOut, mode, out, WindowTable[i]);
if (to->parent != NullWindow) if (to->parent != NullWindow)
DeviceFocusInEvents(dev, RootWindow(dev), to, mode, NotifyNonlinearVirtual); DeviceFocusInEvents(dev, RootWindow(dev), to, mode, NotifyNonlinearVirtual);
DeviceFocusEvent(dev, FocusIn, mode, NotifyNonlinear, to); DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyNonlinear, to);
if (IsParent(to, sprite->win)) if (IsParent(to, sprite->win))
DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer); DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer);
} }
@ -1312,10 +1312,10 @@ DeviceFocusEvents(DeviceIntPtr dev,
{ {
if (IsParent(to, from)) if (IsParent(to, from))
{ {
DeviceFocusEvent(dev, FocusOut, mode, NotifyAncestor, from); DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyAncestor, from);
DeviceFocusOutEvents(dev, from->parent, to, mode, DeviceFocusOutEvents(dev, from->parent, to, mode,
NotifyVirtual); NotifyVirtual);
DeviceFocusEvent(dev, FocusIn, mode, NotifyInferior, to); DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyInferior, to);
if ((IsParent(to, sprite->win)) && if ((IsParent(to, sprite->win)) &&
(sprite->win != from) && (sprite->win != from) &&
(!IsParent(from, sprite->win)) && (!IsParent(from, sprite->win)) &&
@ -1331,9 +1331,9 @@ DeviceFocusEvents(DeviceIntPtr dev,
(!IsParent(sprite->win, to))) (!IsParent(sprite->win, to)))
DeviceFocusOutEvents(dev, sprite->win, from, mode, DeviceFocusOutEvents(dev, sprite->win, from, mode,
NotifyPointer); NotifyPointer);
DeviceFocusEvent(dev, FocusOut, mode, NotifyInferior, from); DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyInferior, from);
DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual); DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual);
DeviceFocusEvent(dev, FocusIn, mode, NotifyAncestor, to); DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyAncestor, to);
} }
else else
{ {
@ -1343,13 +1343,13 @@ DeviceFocusEvents(DeviceIntPtr dev,
if (IsParent(from, sprite->win)) if (IsParent(from, sprite->win))
DeviceFocusOutEvents(dev, sprite->win, from, mode, DeviceFocusOutEvents(dev, sprite->win, from, mode,
NotifyPointer); NotifyPointer);
DeviceFocusEvent(dev, FocusOut, mode, NotifyNonlinear, from); DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from);
if (from->parent != NullWindow) if (from->parent != NullWindow)
DeviceFocusOutEvents(dev, from->parent, common, mode, DeviceFocusOutEvents(dev, from->parent, common, mode,
NotifyNonlinearVirtual); NotifyNonlinearVirtual);
if (to->parent != NullWindow) if (to->parent != NullWindow)
DeviceFocusInEvents(dev, common, to, mode, NotifyNonlinearVirtual); DeviceFocusInEvents(dev, common, to, mode, NotifyNonlinearVirtual);
DeviceFocusEvent(dev, FocusIn, mode, NotifyNonlinear, to); DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyNonlinear, to);
if (IsParent(to, sprite->win)) if (IsParent(to, sprite->win))
DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer); DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer);
} }

View File

@ -2160,7 +2160,7 @@ static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
* @param child Child window setting for event (if applicable) * @param child Child window setting for event (if applicable)
* @param calcChild If True, calculate the child window. * @param calcChild If True, calculate the child window.
*/ */
static void void
FixUpEventFromWindow( FixUpEventFromWindow(
DeviceIntPtr pDev, DeviceIntPtr pDev,
xEvent *xE, xEvent *xE,