diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-04-12 16:24:42 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-04-12 16:24:42 +0930 |
commit | e7b47b1758ed20e75ee267b3a09e91bf2861f6fd (patch) | |
tree | 71e9b7c886d232b560eaf10483a30839c7c31574 | |
parent | 547d720938b3668666d60110d79b150b1e9325c6 (diff) |
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.
-rw-r--r-- | dix/events.c | 25 | ||||
-rw-r--r-- | dix/main.c | 2 | ||||
-rw-r--r-- | dix/window.c | 18 | ||||
-rw-r--r-- | include/window.h | 2 | ||||
-rw-r--r-- | include/windowstr.h | 1 |
5 files changed, 42 insertions, 6 deletions
diff --git a/dix/events.c b/dix/events.c index 46905aa30..444c1032a 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 ac3bfad64..f5b89ba05 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 4e553193e..5a03642d8 100644 --- a/dix/window.c +++ b/dix/window.c @@ -155,6 +155,8 @@ _X_EXPORT int screenIsSaved = SCREEN_SAVER_OFF; _X_EXPORT ScreenSaverStuffRec savedScreenInfo[MAXSCREENS]; +_X_EXPORT int EnterLeavePrivatesIndex = -1; + #if 0 extern void DeleteWindowFromAnyEvents(); extern Mask EventMaskForClient(); @@ -3969,6 +3971,22 @@ WindowParentHasDeviceCursor(WindowPtr pWin, 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 87118e3b0..707272a6e 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 95954a7c3..4683abeaa 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" |