[PATCH] dix: don't store enter/leave and focus semaphores in a devPrivate.

Peter Hutterer peter.hutterer at who-t.net
Wed Nov 12 21:11:45 PST 2008


From: Peter Hutterer <peter.hutterer at redhat.com>

We need them for each window, every time a window is allocated. Storing them
in a devPrivate is the wrong thing to do.

This also removes the unused ENTER_LEAVE_SEMAPHORE_ISSET macro.

Signed-off-by: Peter Hutterer <peter.hutterer at redhat.com>
---
 dix/events.c        |    8 ++------
 dix/window.c        |    6 ++----
 include/input.h     |   17 +++--------------
 include/windowstr.h |   18 ++++++------------
 4 files changed, 13 insertions(+), 36 deletions(-)

diff --git a/dix/events.c b/dix/events.c
index 33936bd..ae38f24 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -6266,13 +6266,11 @@ ExtGrabDevice(ClientPtr client,
 int
 EnterLeaveSemaphoresIsset(WindowPtr win)
 {
-    FocusSemaphoresPtr sem;
     int set = 0;
     int i;
 
-    sem = (FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey);
     for (i = 0; i < (MAXDEVICES + 7)/8; i++)
-        set += sem->enterleave[i];
+        set += win->enterleave[i];
 
     return set;
 }
@@ -6283,13 +6281,11 @@ EnterLeaveSemaphoresIsset(WindowPtr win)
 int
 FocusSemaphoresIsset(WindowPtr win)
 {
-    FocusSemaphoresPtr sem;
     int set = 0;
     int i;
 
-    sem = (FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey);
     for (i = 0; i < (MAXDEVICES + 7)/8; i++)
-        set += sem->focusinout[i];
+        set += win->focusinout[i];
 
     return set;
 }
diff --git a/dix/window.c b/dix/window.c
index 1a28d27..ff5ba4a 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -271,8 +271,6 @@ Bool	enableBackingStore = FALSE;
 static void
 SetWindowToDefaults(WindowPtr pWin)
 {
-    FocusSemaphoresPtr sem;
-
     pWin->prevSib = NullWindow;
     pWin->firstChild = NullWindow;
     pWin->lastChild = NullWindow;
@@ -302,8 +300,8 @@ SetWindowToDefaults(WindowPtr pWin)
     pWin->redirectDraw = RedirectDrawNone;
     pWin->forcedBG = FALSE;
 
-    sem = xcalloc(1, sizeof(FocusSemaphoresRec));
-    dixSetPrivate(&pWin->devPrivates, FocusPrivatesKey, sem);
+    memset(pWin->enterleave, 0, sizeof(pWin->enterleave));
+    memset(pWin->focusinout, 0, sizeof(pWin->focusinout));
 
 #ifdef ROOTLESS
     pWin->rootlessUnhittable = FALSE;
diff --git a/include/input.h b/include/input.h
index 0d348ec..a41affd 100644
--- a/include/input.h
+++ b/include/input.h
@@ -92,18 +92,10 @@ SOFTWARE.
 
 /* Used for enter/leave and focus in/out semaphores */
 #define SEMAPHORE_FIELD_SET(win, dev, field) \
-{ \
-    FocusSemaphoresPtr sem; \
-    sem = (FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey); \
-    sem->field[dev->id/8] |= (1 << (dev->id % 8)); \
-}
+    (win)->field[(dev)->id/8] |= (1 << ((dev)->id % 8)); \
 
 #define SEMAPHORE_FIELD_UNSET(win, dev, field) \
-{ \
-    FocusSemaphoresPtr sem; \
-    sem = (FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey); \
-    sem->field[dev->id/8] &= ~(1 << (dev->id % 8)); \
-}
+    (win)->field[(dev)->id/8] &= ~(1 << ((dev)->id % 8));
 
 #define ENTER_LEAVE_SEMAPHORE_SET(win, dev) \
         SEMAPHORE_FIELD_SET(win, dev, enterleave);
@@ -111,9 +103,6 @@ SOFTWARE.
 #define ENTER_LEAVE_SEMAPHORE_UNSET(win, dev) \
         SEMAPHORE_FIELD_UNSET(win, dev, enterleave);
 
-#define ENTER_LEAVE_SEMAPHORE_ISSET(win, dev) \
-    ((FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey))->enterleave[dev->id/8] & (1 << (dev->id % 8))
-
 #define FOCUS_SEMAPHORE_SET(win, dev) \
         SEMAPHORE_FIELD_SET(win, dev, focusinout);
 
@@ -121,7 +110,7 @@ SOFTWARE.
         SEMAPHORE_FIELD_UNSET(win, dev, focusinout);
 
 #define FOCUS_SEMAPHORE_ISSET(win, dev) \
-    ((FocusSemaphoresPtr)dixLookupPrivate(&win->devPrivates, FocusPrivatesKey))->focusinout[dev->id/8] & (1 << (dev->id % 8))
+        (win)->focusinout[(dev)->id/8] & (1 << ((dev)->id % 8))
 
 typedef unsigned long Leds;
 typedef struct _OtherClients *OtherClientsPtr;
diff --git a/include/windowstr.h b/include/windowstr.h
index 3beb01c..159ee36 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -188,6 +188,12 @@ typedef struct _Window {
 #ifdef ROOTLESS
     unsigned		rootlessUnhittable:1;	/* doesn't hit-test */
 #endif
+    /* Used to maintain semantics of core protocol for Enter/LeaveNotifies and
+     * FocusIn/Out events for multiple pointers/keyboards. Each device ID
+     * corresponds to one bit. If set, the device is in the window/has focus.
+     */
+    char                enterleave[(MAXDEVICES + 7)/8];
+    char                focusinout[(MAXDEVICES + 7)/8];
 } WindowRec;
 
 /*
@@ -244,17 +250,5 @@ typedef struct _ScreenSaverStuff {
 
 extern int screenIsSaved;
 extern ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
-extern DevPrivateKey FocusPrivatesKey;
-
-/* Used to maintain semantics of core protocol for Enter/LeaveNotifies and
- * FocusIn/Out events for multiple pointers/keyboards.
- *
- * Each device ID corresponds to one bit. If set, the device is in the
- * window/has focus.
- */
-typedef struct _FocusSemaphores {
-    char                enterleave[(MAXDEVICES + 7)/8];
-    char                focusinout[(MAXDEVICES + 7)/8];
-} FocusSemaphoresRec, *FocusSemaphoresPtr;
 
 #endif /* WINDOWSTRUCT_H */
-- 
1.6.0.3




More information about the xorg mailing list