Fixed Spaces issue, correctly -- dragging an X window from one
Space to another in Expose mode now works.
This commit is contained in:
parent
ce7cfbe261
commit
50dac9b2cb
|
@ -131,7 +131,6 @@ enum {
|
||||||
= LASTEvent+1, // (from X.h list of event names)
|
= LASTEvent+1, // (from X.h list of event names)
|
||||||
kXDarwinUpdateButtons, // update state of mouse buttons 2 and up
|
kXDarwinUpdateButtons, // update state of mouse buttons 2 and up
|
||||||
kXDarwinScrollWheel, // scroll wheel event
|
kXDarwinScrollWheel, // scroll wheel event
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Quartz-specific events -- not used in IOKit mode
|
* Quartz-specific events -- not used in IOKit mode
|
||||||
*/
|
*/
|
||||||
|
@ -142,6 +141,8 @@ enum {
|
||||||
kXDarwinReadPasteboard, // copy Mac OS X pasteboard into X cut buffer
|
kXDarwinReadPasteboard, // copy Mac OS X pasteboard into X cut buffer
|
||||||
kXDarwinWritePasteboard, // copy X cut buffer onto Mac OS X pasteboard
|
kXDarwinWritePasteboard, // copy X cut buffer onto Mac OS X pasteboard
|
||||||
kXDarwinBringAllToFront, // bring all X windows to front
|
kXDarwinBringAllToFront, // bring all X windows to front
|
||||||
|
kXDarwinToggleFullscreen, // Enable/Disable fullscreen mode
|
||||||
|
kXDarwinSetRootless, // Set rootless mode
|
||||||
/*
|
/*
|
||||||
* AppleWM events
|
* AppleWM events
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -342,8 +342,22 @@ void DarwinModeProcessEvent(
|
||||||
xEvent *xe)
|
xEvent *xe)
|
||||||
{
|
{
|
||||||
switch (xe->u.u.type) {
|
switch (xe->u.u.type) {
|
||||||
|
case kXDarwinControllerNotify:
|
||||||
|
AppleWMSendEvent(AppleWMControllerNotify,
|
||||||
|
AppleWMControllerNotifyMask,
|
||||||
|
xe->u.clientMessage.u.l.longs0,
|
||||||
|
xe->u.clientMessage.u.l.longs1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kXDarwinPasteboardNotify:
|
||||||
|
AppleWMSendEvent(AppleWMPasteboardNotify,
|
||||||
|
AppleWMPasteboardNotifyMask,
|
||||||
|
xe->u.clientMessage.u.l.longs0,
|
||||||
|
xe->u.clientMessage.u.l.longs1);
|
||||||
|
break;
|
||||||
|
|
||||||
case kXDarwinActivate:
|
case kXDarwinActivate:
|
||||||
|
ErrorF("kXDarwinActivate\n");
|
||||||
QuartzShow(xe->u.keyButtonPointer.rootX,
|
QuartzShow(xe->u.keyButtonPointer.rootX,
|
||||||
xe->u.keyButtonPointer.rootY);
|
xe->u.keyButtonPointer.rootY);
|
||||||
AppleWMSendEvent(AppleWMActivationNotify,
|
AppleWMSendEvent(AppleWMActivationNotify,
|
||||||
|
@ -352,12 +366,48 @@ void DarwinModeProcessEvent(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kXDarwinDeactivate:
|
case kXDarwinDeactivate:
|
||||||
|
ErrorF("kXDarwinDeactivate\n");
|
||||||
AppleWMSendEvent(AppleWMActivationNotify,
|
AppleWMSendEvent(AppleWMActivationNotify,
|
||||||
AppleWMActivationNotifyMask,
|
AppleWMActivationNotifyMask,
|
||||||
AppleWMIsInactive, 0);
|
AppleWMIsInactive, 0);
|
||||||
QuartzHide();
|
QuartzHide();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kXDarwinDisplayChanged:
|
||||||
|
ErrorF("kXDarwinDisplayChanged\n");
|
||||||
|
QuartzUpdateScreens();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kXDarwinWindowState:
|
||||||
|
ErrorF("kXDarwinWindowState\n");
|
||||||
|
RootlessNativeWindowStateChanged(xe->u.clientMessage.u.l.longs0,
|
||||||
|
xe->u.clientMessage.u.l.longs1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kXDarwinWindowMoved:
|
||||||
|
ErrorF("kXDarwinWindowMoved\n");
|
||||||
|
RootlessNativeWindowMoved (xe->u.clientMessage.u.l.longs0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kXDarwinToggleFullscreen:
|
||||||
|
#ifdef DARWIN_DDX_MISSING
|
||||||
|
if (quartzEnableRootless) QuartzSetFullscreen(!quartzHasRoot);
|
||||||
|
else if (quartzHasRoot) QuartzHide();
|
||||||
|
else QuartzShow();
|
||||||
|
#else
|
||||||
|
ErrorF("kXDarwinToggleFullscreen not implemented\n");
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kXDarwinSetRootless:
|
||||||
|
#ifdef DARWIN_DDX_MISSING
|
||||||
|
QuartzSetRootless(xe->u.clientMessage.u.l.longs0);
|
||||||
|
if (!quartzEnableRootless && !quartzHasRoot) QuartzHide();
|
||||||
|
#else
|
||||||
|
ErrorF("kXDarwinSetRootless not implemented\n");
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
case kXDarwinSetRootClip:
|
case kXDarwinSetRootClip:
|
||||||
QuartzSetRootClip((BOOL)xe->u.clientMessage.u.l.longs0);
|
QuartzSetRootClip((BOOL)xe->u.clientMessage.u.l.longs0);
|
||||||
break;
|
break;
|
||||||
|
@ -374,46 +424,13 @@ void DarwinModeProcessEvent(
|
||||||
QuartzWritePasteboard();
|
QuartzWritePasteboard();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
|
||||||
* AppleWM events
|
|
||||||
*/
|
|
||||||
case kXDarwinControllerNotify:
|
|
||||||
AppleWMSendEvent(AppleWMControllerNotify,
|
|
||||||
AppleWMControllerNotifyMask,
|
|
||||||
xe->u.clientMessage.u.l.longs0,
|
|
||||||
xe->u.clientMessage.u.l.longs1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kXDarwinPasteboardNotify:
|
|
||||||
AppleWMSendEvent(AppleWMPasteboardNotify,
|
|
||||||
AppleWMPasteboardNotifyMask,
|
|
||||||
xe->u.clientMessage.u.l.longs0,
|
|
||||||
xe->u.clientMessage.u.l.longs1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kXDarwinDisplayChanged:
|
|
||||||
QuartzUpdateScreens();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kXDarwinBringAllToFront:
|
case kXDarwinBringAllToFront:
|
||||||
|
ErrorF("kXDarwinBringAllToFront\n");
|
||||||
RootlessOrderAllWindows();
|
RootlessOrderAllWindows();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kXDarwinWindowState:
|
|
||||||
ErrorF("kXDarwinWindowState\n");
|
|
||||||
break;
|
|
||||||
case kXDarwinWindowMoved: {
|
|
||||||
WindowPtr pWin = (WindowPtr)xe->u.clientMessage.u.l.longs0;
|
|
||||||
short x = xe->u.clientMessage.u.l.longs1,
|
|
||||||
y = xe->u.clientMessage.u.l.longs2;
|
|
||||||
ErrorF("kXDarwinWindowMoved(%p, %hd, %hd)\n", pWin, x, y);
|
|
||||||
RootlessMoveWindow(pWin, x, y, pWin->nextSib, VTMove);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ErrorF("Unknown application defined event type %d.\n",
|
ErrorF("Unknown application defined event type %d.\n", xe->u.u.type);
|
||||||
xe->u.u.type);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,7 @@ typedef struct _QuartzModeProcs {
|
||||||
} QuartzModeProcsRec, *QuartzModeProcsPtr;
|
} QuartzModeProcsRec, *QuartzModeProcsPtr;
|
||||||
|
|
||||||
extern QuartzModeProcsPtr quartzProcs;
|
extern QuartzModeProcsPtr quartzProcs;
|
||||||
|
extern int quartzHasRoot, quartzEnableRootless;
|
||||||
|
|
||||||
Bool QuartzLoadDisplayBundle(const char *dpyBundleName);
|
Bool QuartzLoadDisplayBundle(const char *dpyBundleName);
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,8 @@ typedef struct _RootlessWindowRec {
|
||||||
|
|
||||||
unsigned int is_drawing :1; // Currently drawing?
|
unsigned int is_drawing :1; // Currently drawing?
|
||||||
unsigned int is_reorder_pending :1;
|
unsigned int is_reorder_pending :1;
|
||||||
|
unsigned int is_offscreen :1;
|
||||||
|
unsigned int is_obscured :1;
|
||||||
} RootlessWindowRec, *RootlessWindowPtr;
|
} RootlessWindowRec, *RootlessWindowPtr;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,13 +36,23 @@
|
||||||
#include <stddef.h> /* For NULL */
|
#include <stddef.h> /* For NULL */
|
||||||
#include <limits.h> /* For CHAR_BIT */
|
#include <limits.h> /* For CHAR_BIT */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#ifdef __APPLE__
|
||||||
|
//#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include "mi.h"
|
||||||
|
#include "pixmapstr.h"
|
||||||
|
#include "windowstr.h"
|
||||||
|
#include <Xplugin.h>
|
||||||
|
//#include <X11/extensions/applewm.h>
|
||||||
|
extern int darwinMainScreenX, darwinMainScreenY;
|
||||||
|
#endif
|
||||||
|
#include "fb.h"
|
||||||
|
|
||||||
|
#define AppleWMNumWindowLevels 5
|
||||||
|
|
||||||
#include "rootlessCommon.h"
|
#include "rootlessCommon.h"
|
||||||
#include "rootlessWindow.h"
|
#include "rootlessWindow.h"
|
||||||
|
|
||||||
#include "fb.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef ROOTLESS_GLOBAL_COORDS
|
#ifdef ROOTLESS_GLOBAL_COORDS
|
||||||
#define SCREEN_TO_GLOBAL_X \
|
#define SCREEN_TO_GLOBAL_X \
|
||||||
(dixScreenOrigins[pScreen->myNum].x + rootlessGlobalOffsetX)
|
(dixScreenOrigins[pScreen->myNum].x + rootlessGlobalOffsetX)
|
||||||
|
@ -53,6 +63,127 @@
|
||||||
#define SCREEN_TO_GLOBAL_Y 0
|
#define SCREEN_TO_GLOBAL_Y 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DEFINE_ATOM_HELPER(func,atom_name) \
|
||||||
|
static Atom func (void) { \
|
||||||
|
static unsigned int generation; \
|
||||||
|
static Atom atom; \
|
||||||
|
if (generation != serverGeneration) { \
|
||||||
|
generation = serverGeneration; \
|
||||||
|
atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
|
||||||
|
} \
|
||||||
|
return atom; \
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_ATOM_HELPER (xa_native_screen_origin, "_NATIVE_SCREEN_ORIGIN")
|
||||||
|
DEFINE_ATOM_HELPER (xa_native_window_id, "_NATIVE_WINDOW_ID")
|
||||||
|
DEFINE_ATOM_HELPER (xa_apple_no_order_in, "_APPLE_NO_ORDER_IN")
|
||||||
|
|
||||||
|
static Bool no_configure_window;
|
||||||
|
static Bool windows_hidden;
|
||||||
|
// TODO - abstract xp functions
|
||||||
|
|
||||||
|
static const int normal_window_levels[AppleWMNumWindowLevels+1] = {
|
||||||
|
0, 3, 4, 5, LONG_MIN + 30, LONG_MIN + 29,
|
||||||
|
};
|
||||||
|
static const int rooted_window_levels[AppleWMNumWindowLevels+1] = {
|
||||||
|
202, 203, 204, 205, 201, 200
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
configure_window (xp_window_id id, unsigned int mask,
|
||||||
|
const xp_window_changes *values)
|
||||||
|
{
|
||||||
|
if (!no_configure_window)
|
||||||
|
return xp_configure_window (id, mask, values);
|
||||||
|
else
|
||||||
|
return XP_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*static inline unsigned long
|
||||||
|
current_time_in_seconds (void)
|
||||||
|
{
|
||||||
|
unsigned long t = 0;
|
||||||
|
|
||||||
|
t += currentTime.milliseconds / 1000;
|
||||||
|
t += currentTime.months * 4294967;
|
||||||
|
|
||||||
|
return t;
|
||||||
|
} */
|
||||||
|
|
||||||
|
static inline Bool
|
||||||
|
rootlessHasRoot (ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
return WINREC (WindowTable[pScreen->myNum]) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RootlessNativeWindowStateChanged (xp_window_id id, unsigned int state)
|
||||||
|
{
|
||||||
|
WindowPtr pWin;
|
||||||
|
RootlessWindowRec *winRec;
|
||||||
|
|
||||||
|
pWin = xprGetXWindow (id);
|
||||||
|
if (pWin == NULL) return;
|
||||||
|
|
||||||
|
winRec = WINREC (pWin);
|
||||||
|
if (winRec == NULL) return;
|
||||||
|
|
||||||
|
winRec->is_offscreen = ((state & XP_WINDOW_STATE_OFFSCREEN) != 0);
|
||||||
|
winRec->is_obscured = ((state & XP_WINDOW_STATE_OBSCURED) != 0);
|
||||||
|
// pWin->rootlessUnhittable = winRec->is_offscreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RootlessNativeWindowMoved (WindowPtr pWin)
|
||||||
|
{
|
||||||
|
xp_box bounds;
|
||||||
|
int sx, sy;
|
||||||
|
XID vlist[2];
|
||||||
|
Mask mask;
|
||||||
|
ClientPtr client;
|
||||||
|
RootlessWindowRec *winRec = WINREC(pWin);
|
||||||
|
|
||||||
|
if (xp_get_window_bounds (winRec->wid, &bounds) != Success) return;
|
||||||
|
|
||||||
|
sx = dixScreenOrigins[pWin->drawable.pScreen->myNum].x + darwinMainScreenX;
|
||||||
|
sy = dixScreenOrigins[pWin->drawable.pScreen->myNum].y + darwinMainScreenY;
|
||||||
|
|
||||||
|
/* Fake up a ConfigureWindow packet to resize the window to the current bounds. */
|
||||||
|
|
||||||
|
vlist[0] = (INT16) bounds.x1 - sx;
|
||||||
|
vlist[1] = (INT16) bounds.y1 - sy;
|
||||||
|
mask = CWX | CWY;
|
||||||
|
|
||||||
|
/* pretend we're the owner of the window! */
|
||||||
|
client = LookupClient (pWin->drawable.id, NullClient);
|
||||||
|
|
||||||
|
/* Don't want to do anything to the physical window (avoids
|
||||||
|
notification-response feedback loops) */
|
||||||
|
|
||||||
|
no_configure_window = TRUE;
|
||||||
|
ConfigureWindow (pWin, mask, vlist, client);
|
||||||
|
no_configure_window = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Updates the _NATIVE_SCREEN_ORIGIN property on the given root window. */
|
||||||
|
static void
|
||||||
|
set_screen_origin (WindowPtr pWin)
|
||||||
|
{
|
||||||
|
long data[2];
|
||||||
|
|
||||||
|
if (!IsRoot (pWin))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* FIXME: move this to an extension? */
|
||||||
|
|
||||||
|
data[0] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].x
|
||||||
|
+ darwinMainScreenX);
|
||||||
|
data[1] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].y
|
||||||
|
+ darwinMainScreenY);
|
||||||
|
|
||||||
|
ChangeWindowProperty (pWin, xa_native_screen_origin (), XA_INTEGER,
|
||||||
|
32, PropModeReplace, 2, data, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RootlessCreateWindow
|
* RootlessCreateWindow
|
||||||
|
@ -565,7 +696,6 @@ RootlessRestackWindow(WindowPtr pWin, WindowPtr pOldNextSib)
|
||||||
RL_DEBUG_MSG("restackwindow end\n");
|
RL_DEBUG_MSG("restackwindow end\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Specialized window copy procedures
|
* Specialized window copy procedures
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue