xserver: Branch 'xorg-server-1.4-apple'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Tue Apr 8 17:00:17 PDT 2008


 configure.ac                    |    3 ++-
 dix/events.c                    |    7 +++++++
 dix/window.c                    |    3 +++
 hw/xquartz/darwinEvents.c       |    6 +++++-
 hw/xquartz/quartz.c             |    1 -
 include/windowstr.h             |    3 +++
 miext/rootless/rootlessWindow.c |   14 ++++++++------
 miext/rootless/rootlessWindow.h |    4 +---
 8 files changed, 29 insertions(+), 12 deletions(-)

New commits:
commit df21312c8b0e9ef0c809bfc57cdf64f27db0d8a7
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Apr 8 16:59:56 2008 -0700

    XQuartz: Fix issue where clicking on an X11 window might send that event to an X11 window in another space.
    (cherry picked from commit 2e78818232314908a73113b1d46c2420d9d4fcbf)

diff --git a/configure.ac b/configure.ac
index 427a951..1a10875 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1730,7 +1730,8 @@ if test "X$XQUARTZ" = Xauto; then
 fi
 
 if test "x$XQUARTZ" = xyes; then
-	AC_DEFINE([XQUARTZ],[1],[Have Quartz])
+	AC_DEFINE(XQUARTZ,1,[Have Quartz])
+	AC_DEFINE(ROOTLESS,1,[Build Rootless code])
 
 #glxAGL / glxCGL don't work yet
 #	AC_CACHE_CHECK([for AGL framework],xorg_cv_AGL_framework,[
diff --git a/dix/events.c b/dix/events.c
index 5bd67e3..5930ead 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2158,6 +2158,13 @@ XYToWindow(int x, int y)
 				x - pWin->drawable.x,
 				y - pWin->drawable.y, &box))
 #endif
+#ifdef ROOTLESS
+    /* In rootless mode windows may be offscreen, even when
+     * they're in X's stack. (E.g. if the native window system
+     * implements some form of virtual desktop system).
+     */
+		&& !pWin->rootlessUnhittable
+#endif
 	    )
 	{
 	    if (spriteTraceGood >= spriteTraceSize)
diff --git a/dix/window.c b/dix/window.c
index 961c02a..f5a6a4b 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -300,6 +300,9 @@ SetWindowToDefaults(WindowPtr pWin)
 #ifdef COMPOSITE
     pWin->redirectDraw = RedirectDrawNone;
 #endif
+#ifdef ROOTLESS
+    pWin->rootlessUnhittable = FALSE;
+#endif
 }
 
 static void
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 3afbaf8..410acdd 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -56,6 +56,10 @@ in this Software without prior written authorization from The Open Group.
 #include "applewmExt.h"
 #include <X11/extensions/applewm.h>
 
+/* FIXME: Abstract this away into xpr */
+#include <Xplugin.h>
+#include "rootlessWindow.h"
+WindowPtr xprGetXWindow(xp_window_id wid);
 
 /* Fake button press/release for scroll wheel move. */
 #define SCROLLWHEELUPFAKE   4
@@ -228,7 +232,7 @@ void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int neven
 
         case kXquartzWindowState:
             DEBUG_LOG("kXquartzWindowState\n");
-            RootlessNativeWindowStateChanged(xe[i].u.clientMessage.u.l.longs0,
+            RootlessNativeWindowStateChanged(xprGetXWindow(xe[i].u.clientMessage.u.l.longs0),
                                              xe[i].u.clientMessage.u.l.longs1);
             break;
 
diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c
index 7f600ab..45ec9f3 100644
--- a/hw/xquartz/quartz.c
+++ b/hw/xquartz/quartz.c
@@ -52,7 +52,6 @@
 #include "windowstr.h"
 #include "colormapst.h"
 #include "globals.h"
-#include "rootlessWindow.h"
 
 // System headers
 #include <sys/types.h>
diff --git a/include/windowstr.h b/include/windowstr.h
index 6d874ae..d9b839b 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -159,6 +159,9 @@ typedef struct _Window {
 #ifdef COMPOSITE
     unsigned		redirectDraw:2;	/* rendering is redirected from here */
 #endif
+#ifdef ROOTLESS
+    unsigned		rootlessUnhittable:1;	/* doesn't hit-test */
+#endif
     DevUnion		*devPrivates;
 } WindowRec;
 
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index bf0380f..453f7d1 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -117,12 +117,10 @@ rootlessHasRoot (ScreenPtr pScreen)
 }
 
 void
-RootlessNativeWindowStateChanged (xp_window_id id, unsigned int state)
+RootlessNativeWindowStateChanged (WindowPtr pWin, unsigned int state)
 {
-  WindowPtr pWin;
   RootlessWindowRec *winRec;
 
-  pWin = xprGetXWindow (id);
   if (pWin == NULL) return;
 
   winRec = WINREC (pWin);
@@ -130,7 +128,7 @@ RootlessNativeWindowStateChanged (xp_window_id id, unsigned int state)
 
   winRec->is_offscreen = ((state & XP_WINDOW_STATE_OFFSCREEN) != 0);
   winRec->is_obscured = ((state & XP_WINDOW_STATE_OBSCURED) != 0);
-  //  pWin->rootlessUnhittable = winRec->is_offscreen;
+  pWin->rootlessUnhittable = winRec->is_offscreen;
 }
 
 void
@@ -143,7 +141,7 @@ RootlessNativeWindowMoved (WindowPtr pWin)
   ClientPtr client;
   RootlessWindowRec *winRec = WINREC(pWin);
 
-  if (xp_get_window_bounds (winRec->wid, &bounds) != Success) return;
+  if (xp_get_window_bounds ((xp_window_id)winRec->wid, &bounds) != Success) return;
 
   sx = dixScreenOrigins[pWin->drawable.pScreen->myNum].x + darwinMainScreenX;
   sy = dixScreenOrigins[pWin->drawable.pScreen->myNum].y + darwinMainScreenY;
@@ -1428,6 +1426,10 @@ RootlessReparentWindow(WindowPtr pWin, WindowPtr pPriorParent)
 
     pTopWin = TopLevelParent(pWin);
     assert(pTopWin != pWin);
+    
+    pWin->rootlessUnhittable = FALSE;
+    
+    DeleteProperty (pWin, xa_native_window_id ());
 
     if (WINREC(pTopWin) != NULL) {
         /* We're screwed. */
@@ -1484,7 +1486,7 @@ RootlessFlushWindowColormap (WindowPtr pWin)
   wc.colormap = RootlessColormapCallback;
   wc.colormap_data = pWin->drawable.pScreen;
 
-  configure_window (winRec->wid, XP_COLORMAP, &wc);
+  configure_window ((xp_window_id)winRec->wid, XP_COLORMAP, &wc);
 }
 
 /*
diff --git a/miext/rootless/rootlessWindow.h b/miext/rootless/rootlessWindow.h
index ad876e5..3bdb3bd 100644
--- a/miext/rootless/rootlessWindow.h
+++ b/miext/rootless/rootlessWindow.h
@@ -36,8 +36,6 @@
 
 #include "rootlessCommon.h"
 
-#include <Xplugin.h>
-
 Bool RootlessCreateWindow(WindowPtr pWin);
 Bool RootlessDestroyWindow(WindowPtr pWin);
 
@@ -61,6 +59,6 @@ void RootlessPaintWindowBorder(WindowPtr pWin, RegionPtr pRegion,
                                int what);
 void RootlessChangeBorderWidth(WindowPtr pWin, unsigned int width);
 void RootlessNativeWindowMoved (WindowPtr pWin);
-void RootlessNativeWindowStateChanged (xp_window_id id, unsigned int state); 
+void RootlessNativeWindowStateChanged (WindowPtr pWin, unsigned int state); 
 
 #endif


More information about the xorg-commit mailing list