summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac3
-rw-r--r--dix/events.c7
-rw-r--r--dix/window.c3
-rw-r--r--hw/xquartz/darwinEvents.c6
-rw-r--r--hw/xquartz/quartz.c1
-rw-r--r--include/windowstr.h3
-rw-r--r--miext/rootless/rootlessWindow.c14
-rw-r--r--miext/rootless/rootlessWindow.h4
8 files changed, 29 insertions, 12 deletions
diff --git a/configure.ac b/configure.ac
index c2109633d..94151ded1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1732,7 +1732,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 4a8e480c8..aef333ede 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2171,6 +2171,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 9975b5eec..499f58e7a 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -292,6 +292,9 @@ SetWindowToDefaults(WindowPtr pWin)
pWin->forcedBS = FALSE;
pWin->redirectDraw = RedirectDrawNone;
pWin->forcedBG = FALSE;
+#ifdef ROOTLESS
+ pWin->rootlessUnhittable = FALSE;
+#endif
}
static void
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 3afbaf890..410acdd76 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 96dc021a6..6a8cf7c12 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 e06a2f1bd..99bd640cc 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -160,6 +160,9 @@ typedef struct _Window {
unsigned forcedBS:1; /* system-supplied backingStore */
unsigned redirectDraw:2; /* COMPOSITE rendering redirect */
unsigned forcedBG:1; /* must have an opaque background */
+#ifdef ROOTLESS
+ unsigned rootlessUnhittable:1; /* doesn't hit-test */
+#endif
} WindowRec;
/*
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index 0dad44a99..17fe69085 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;
@@ -1426,6 +1424,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. */
@@ -1482,7 +1484,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 055589e79..45bc4c202 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);
@@ -57,6 +55,6 @@ void RootlessResizeWindow(WindowPtr pWin, int x, int y,
void RootlessReparentWindow(WindowPtr pWin, WindowPtr pPriorParent);
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