summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-04-12 16:24:42 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-04-12 16:24:42 +0930
commite7b47b1758ed20e75ee267b3a09e91bf2861f6fd (patch)
tree71e9b7c886d232b560eaf10483a30839c7c31574
parent547d720938b3668666d60110d79b150b1e9325c6 (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.c25
-rw-r--r--dix/main.c2
-rw-r--r--dix/window.c18
-rw-r--r--include/window.h2
-rw-r--r--include/windowstr.h1
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"