XQuartz: Fix issue where clicking on an X11 window might send that event to an X11 window in another space.

(cherry picked from commit df21312c8b)
(cherry picked from commit 2d4194a8d1)
This commit is contained in:
Jeremy Huddleston 2008-04-08 17:02:56 -07:00
parent 08073862f8
commit 3f51f493b6
8 changed files with 29 additions and 12 deletions

View File

@ -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,[

View File

@ -2170,6 +2170,13 @@ XYToWindow(int x, int y)
wInputShape(pWin),
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
)
{

View File

@ -292,6 +292,9 @@ SetWindowToDefaults(WindowPtr pWin)
pWin->forcedBS = FALSE;
pWin->redirectDraw = RedirectDrawNone;
pWin->forcedBG = FALSE;
#ifdef ROOTLESS
pWin->rootlessUnhittable = FALSE;
#endif
}
static void

View File

@ -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;

View File

@ -52,7 +52,6 @@
#include "windowstr.h"
#include "colormapst.h"
#include "globals.h"
#include "rootlessWindow.h"
// System headers
#include <sys/types.h>

View File

@ -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;
/*

View File

@ -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);
}
/*

View File

@ -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