xserver: Branch 'mpx' - 3 commits
Peter Hutterer
whot at kemper.freedesktop.org
Fri Apr 13 10:49:19 EEST 2007
dix/events.c | 77 +++++++++++++++++++++++++++++++++++-----------------
dix/main.c | 2 +
dix/window.c | 18 ++++++++++++
include/window.h | 2 +
include/windowstr.h | 1
5 files changed, 75 insertions(+), 25 deletions(-)
New commits:
diff-tree ea27b09d3a973d9a4943f205b24940b8624cf405 (from 2bb3c81fc1ca98c909309f3af7e9c8ca6b695657)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Fri Apr 13 17:15:22 2007 +0930
Deliver FocusIn/FocusOut events for all devices.
Don't use VCK in SetInputFocus and DeliverFocusedEvent.
diff --git a/dix/events.c b/dix/events.c
index 294aa2f..e515f10 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2787,9 +2787,9 @@ CheckDeviceGrabs(DeviceIntPtr device, xE
void
DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count)
{
+ DeviceIntPtr pointer;
WindowPtr focus = keybd->focus->win;
int mskidx = 0;
-
if (focus == FollowKeyboardWin)
focus = inputInfo.keyboard->focus->win;
if (!focus)
@@ -2804,8 +2804,11 @@ DeliverFocusedEvent(DeviceIntPtr keybd,
if (DeliverDeviceEvents(window, xE, NullGrab, focus, keybd, count))
return;
}
+ pointer = GetPairedPointer(keybd);
+ if (!pointer)
+ pointer = inputInfo.pointer;
/* just deliver it to the focus window */
- FixUpEventFromWindow(inputInfo.pointer, xE, focus, None, FALSE);
+ FixUpEventFromWindow(pointer, xE, focus, None, FALSE);
if (xE->u.u.type & EXTENSION_EVENT_BASE)
mskidx = keybd->id;
(void)DeliverEventsToWindow(keybd, focus, xE, count, filters[xE->u.u.type],
@@ -3632,13 +3635,8 @@ FocusEvent(DeviceIntPtr dev, int type, i
{
xEvent event;
-#ifdef XINPUT
if (dev != inputInfo.keyboard)
- {
DeviceFocusEvent(dev, type, mode, detail, pWin);
- return;
- }
-#endif
event.u.focus.mode = mode;
event.u.u.type = type;
event.u.u.detail = detail;
@@ -3846,6 +3844,8 @@ SetInputFocus(
WindowPtr focusWin;
int mode, rc;
TimeStamp time;
+ DeviceIntPtr keybd; /* used for FollowKeyboard or FollowKeyboardWin */
+
UpdateCurrentTime();
if ((revertTo != RevertToParent) &&
@@ -3857,10 +3857,22 @@ SetInputFocus(
return BadValue;
}
time = ClientTimeToServerTime(ctime);
+
+ if (IsKeyboardDevice(dev))
+ keybd = dev;
+ else
+ {
+ keybd = GetPairedKeyboard(dev);
+ if (!keybd)
+ keybd = inputInfo.keyboard;
+ }
+
if ((focusID == None) || (focusID == PointerRoot))
focusWin = (WindowPtr)(long)focusID;
else if ((focusID == FollowKeyboard) && followOK)
- focusWin = inputInfo.keyboard->focus->win;
+ {
+ focusWin = keybd->focus->win;
+ }
else {
rc = dixLookupWindow(&focusWin, focusID, client, DixReadAccess);
if (rc != Success)
@@ -3876,7 +3888,7 @@ SetInputFocus(
return Success;
mode = (dev->coreGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
if (focus->win == FollowKeyboardWin)
- DoFocusEvents(dev, inputInfo.keyboard->focus->win, focusWin, mode);
+ DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
else
DoFocusEvents(dev, focus->win, focusWin, mode);
focus->time = time;
diff-tree 2bb3c81fc1ca98c909309f3af7e9c8ca6b695657 (from e7b47b1758ed20e75ee267b3a09e91bf2861f6fd)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Thu Apr 12 16:35:43 2007 +0930
Use paired kbd instead of VCK for EnterLeaveEvents, sanitize variable naming.
diff --git a/dix/events.c b/dix/events.c
index 444c103..294aa2f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3436,7 +3436,7 @@ CommonAncestor(
static void
EnterLeaveEvent(
- DeviceIntPtr pDev,
+ DeviceIntPtr mouse,
int type,
int mode,
int detail,
@@ -3444,9 +3444,8 @@ EnterLeaveEvent(
Window child)
{
xEvent event;
- DeviceIntPtr keybd = inputInfo.keyboard;
WindowPtr focus;
- DeviceIntPtr mouse = pDev;
+ DeviceIntPtr keybd;
GrabPtr grab = mouse->coreGrab.grab;
GrabPtr devgrab = mouse->deviceGrab.grab;
Mask mask;
@@ -3456,6 +3455,9 @@ EnterLeaveEvent(
int mskidx;
OtherInputMasks *inputMasks;
+ if (!(keybd = GetPairedKeyboard(mouse)))
+ keybd = inputInfo.keyboard;
+
if ((pWin == mouse->valuator->motionHintWindow) &&
(detail != NotifyInferior))
mouse->valuator->motionHintWindow = NullWindow;
@@ -3473,8 +3475,8 @@ EnterLeaveEvent(
event.u.u.type = type;
event.u.u.detail = detail;
event.u.enterLeave.time = currentTime.milliseconds;
- event.u.enterLeave.rootX = pDev->spriteInfo->sprite->hot.x;
- event.u.enterLeave.rootY = pDev->spriteInfo->sprite->hot.y;
+ event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
+ event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
/* Counts on the same initial structure of crossing & button events! */
FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
/* Enter/Leave events always set child */
@@ -3510,7 +3512,7 @@ EnterLeaveEvent(
(void)TryClientEvents(rClient(grab), &event, 1, mask,
filters[type], grab);
else
- (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
+ (void)DeliverEventsToWindow(mouse, pWin, &event, 1, filters[type],
NullGrab, 0);
}
}
@@ -3520,8 +3522,8 @@ EnterLeaveEvent(
DeviceLeaveNotify;
devEnterLeave->type = (type == EnterNotify) ? DeviceEnterNotify :
DeviceLeaveNotify;
- devEnterLeave->deviceid = pDev->id;
- mskidx = pDev->id;
+ devEnterLeave->deviceid = mouse->id;
+ mskidx = mouse->id;
inputMasks = wOtherInputMasks(pWin);
if (inputMasks &&
(filters[devEnterLeave->type] & inputMasks->deliverableEvents[mskidx]))
@@ -3530,9 +3532,9 @@ EnterLeaveEvent(
(void)TryClientEvents(rClient(devgrab), (xEvent*)devEnterLeave, 1,
mask, filters[devEnterLeave->type], devgrab);
else
- (void)DeliverEventsToWindow(pDev, pWin, (xEvent*)devEnterLeave,
+ (void)DeliverEventsToWindow(mouse, pWin, (xEvent*)devEnterLeave,
1, filters[devEnterLeave->type],
- NullGrab, pDev->id);
+ NullGrab, mouse->id);
}
if ((type == EnterNotify) && (mask & KeymapStateMask))
@@ -3550,7 +3552,7 @@ EnterLeaveEvent(
(void)TryClientEvents(rClient(grab), (xEvent *)&ke, 1, mask,
KeymapStateMask, grab);
else
- (void)DeliverEventsToWindow(pDev, pWin, (xEvent *)&ke, 1,
+ (void)DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
KeymapStateMask, NullGrab, 0);
}
}
diff-tree e7b47b1758ed20e75ee267b3a09e91bf2861f6fd (from 547d720938b3668666d60110d79b150b1e9325c6)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Thu Apr 12 16:24:42 2007 +0930
Change core enter/leave semantics for multiple pointers.
Send EnterNotify when first device enters the window, LeaveNotify when the
last device leaves the window. Additional devices will not cause additional
Enter/LeaveNotifies.
diff --git a/dix/events.c b/dix/events.c
index 46905aa..444c103 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2270,7 +2270,10 @@ DefineInitialRootWindow(WindowPtr win)
while (pDev)
{
if (DevHasCursor(pDev))
+ {
InitializeSprite(pDev, win);
+ win->devPrivates[EnterLeavePrivatesIndex].val++;
+ }
pDev = pDev->next;
}
}
@@ -3447,6 +3450,7 @@ EnterLeaveEvent(
GrabPtr grab = mouse->coreGrab.grab;
GrabPtr devgrab = mouse->deviceGrab.grab;
Mask mask;
+ long* inWindow; /* no of sprites inside pWin */
deviceEnterNotify *devEnterLeave;
int mskidx;
@@ -3492,14 +3496,23 @@ EnterLeaveEvent(
IsParent(focus, pWin)))
event.u.enterLeave.flags |= ELFlagFocus;
+ inWindow = &pWin->devPrivates[EnterLeavePrivatesIndex].val;
+
+ (type == EnterNotify) ? (*inWindow)++ : (*inWindow)--;
+
if (mask & filters[type])
{
- if (grab)
- (void)TryClientEvents(rClient(grab), &event, 1, mask,
- filters[type], grab);
- else
- (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
- NullGrab, 0);
+ /* only send core events for the first device to enter and the last
+ one to leave */
+ if ((*inWindow) == (LeaveNotify - type))
+ {
+ if (grab)
+ (void)TryClientEvents(rClient(grab), &event, 1, mask,
+ filters[type], grab);
+ else
+ (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
+ NullGrab, 0);
+ }
}
devEnterLeave = (deviceEnterNotify*)&event;
diff --git a/dix/main.c b/dix/main.c
index ac3bfad..f5b89ba 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -391,6 +391,8 @@ main(int argc, char *argv[], char *envp[
FatalError("failed to create scratch GCs");
if (!CreateDefaultStipple(i))
FatalError("failed to create default stipple");
+ if (!InitWindowPrivates(pScreen))
+ FatalError("Failed to init window privates.");
if (!CreateRootWindow(pScreen))
FatalError("failed to create root window");
}
diff --git a/dix/window.c b/dix/window.c
index 4e55319..5a03642 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -155,6 +155,8 @@ _X_EXPORT int screenIsSaved = SCREEN_SAV
_X_EXPORT ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
+_X_EXPORT int EnterLeavePrivatesIndex = -1;
+
#if 0
extern void DeleteWindowFromAnyEvents();
extern Mask EventMaskForClient();
@@ -3969,6 +3971,22 @@ WindowParentHasDeviceCursor(WindowPtr pW
return FALSE;
}
+/**
+ * Initialize some mandatory devPrivates for windows.
+ *
+ * At the moment, this includes only the enter/leave semaphore.
+ *
+ * Returns TRUE on success.
+ */
+_X_EXPORT Bool
+InitWindowPrivates(ScreenPtr screen)
+{
+ if (EnterLeavePrivatesIndex == -1)
+ EnterLeavePrivatesIndex = AllocateWindowPrivateIndex();
+
+ return AllocateWindowPrivate(screen, EnterLeavePrivatesIndex, 0);
+}
+
#ifndef NOLOGOHACK
static void
DrawLogo(WindowPtr pWin)
diff --git a/include/window.h b/include/window.h
index 87118e3..707272a 100644
--- a/include/window.h
+++ b/include/window.h
@@ -268,4 +268,6 @@ extern void DisableMapUnmapEvents(
extern void EnableMapUnmapEvents(
WindowPtr /* pWin */ );
+Bool InitWindowPrivates(
+ ScreenPtr /* screen */);
#endif /* WINDOW_H */
diff --git a/include/windowstr.h b/include/windowstr.h
index 95954a7..4683abe 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -216,6 +216,7 @@ typedef struct _ScreenSaverStuff {
extern int screenIsSaved;
extern ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
+extern int EnterLeavePrivatesIndex;
/*
* this is the configuration parameter "NO_BACK_SAVE"
More information about the xorg-commit
mailing list