summaryrefslogtreecommitdiff
path: root/dix/events.c
diff options
context:
space:
mode:
Diffstat (limited to 'dix/events.c')
-rw-r--r--dix/events.c25
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;