diff options
Diffstat (limited to 'dix/events.c')
-rw-r--r-- | dix/events.c | 25 |
1 files changed, 19 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; |