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

This commit is contained in:
Jeremy Huddleston 2008-04-08 16:53:50 -07:00
parent cdb4c291d8
commit 2e78818232
7 changed files with 30 additions and 12 deletions

View File

@ -1635,7 +1635,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

@ -1969,6 +1969,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

@ -305,6 +305,9 @@ SetWindowToDefaults(register WindowPtr pWin)
#ifdef COMPOSITE
pWin->redirectDraw = 0;
#endif
#ifdef ROOTLESS
pWin->rootlessUnhittable = FALSE;
#endif
}
static void

View File

@ -51,7 +51,6 @@
#include "windowstr.h"
#include "colormapst.h"
#include "globals.h"
#include "rootlessWindow.h"
// System headers
#include <sys/types.h>
@ -61,6 +60,11 @@
#define FAKE_RANDR 1
/* FIXME: Abstract this away into xpr */
#include <Xplugin.h>
#include "rootlessWindow.h"
WindowPtr xprGetXWindow(xp_window_id wid);
// Shared global variables for Quartz modes
int quartzEventWriteFD = -1;
int quartzRootless = -1;
@ -459,7 +463,7 @@ void QuartzProcessEvent(xEvent *xe) {
case kXquartzWindowState:
DEBUG_LOG("kXquartzWindowState\n");
RootlessNativeWindowStateChanged(xe->u.clientMessage.u.l.longs0,
RootlessNativeWindowStateChanged(xprGetXWindow(xe->u.clientMessage.u.l.longs0),
xe->u.clientMessage.u.l.longs1);
break;

View File

@ -137,6 +137,9 @@ typedef struct _Window {
#endif
#ifdef COMPOSITE
unsigned redirectDraw:1; /* rendering is redirected from here */
#endif
#ifdef ROOTLESS
unsigned rootlessUnhittable:1; /* doesn't hit-test */
#endif
DevUnion *devPrivates;
} 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;
@ -1429,6 +1427,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. */
RootlessDestroyFrame(pWin, winRec);
@ -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);
}
/*

View File

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