XQuartz: Initial framework for dealing with spaces on OS-X

This commit is contained in:
Jeremy Huddleston 2008-03-21 18:07:38 -07:00
parent 7aacc7bb3f
commit 9831324998
3 changed files with 25 additions and 3 deletions

View File

@ -105,6 +105,7 @@ enum {
kXDarwinBringAllToFront, // bring all X windows to front
kXDarwinToggleFullscreen, // Enable/Disable fullscreen mode
kXDarwinSetRootless, // Set rootless mode
kXDarwinSpaceChanged, // Spaces changed
/*
* AppleWM events
*/
@ -115,7 +116,7 @@ enum {
*/
kXDarwinDisplayChanged, // display configuration has changed
kXDarwinWindowState, // window visibility state has changed
kXDarwinWindowMoved // window has moved on screen
kXDarwinWindowMoved, // window has moved on screen
};
#define ENABLE_DEBUG_LOG 1

View File

@ -274,7 +274,7 @@ static void QuartzUpdateScreens(void)
#ifndef FAKE_RANDR
if(!QuartzRandRInit(pScreen))
FatalError("Failed to init RandR extension.\n");
FatalError("Failed to init RandR extension.\n");
#endif
DarwinAdjustScreenOrigins(&screenInfo);
@ -372,6 +372,14 @@ static void QuartzSetRootClip(
}
}
/*
* QuartzSpaceChanged
* Unmap offscreen windows, map onscreen windows
*/
static void QuartzSpaceChanged(uint32_t space_id) {
/* Do something special here, so we don't depend on quartz-wm for spaces to work... */
DEBUG_LOG("Space Changed (%u) ... do something interesting...\n", space_id);
}
/*
* QuartzMessageServerThread
@ -502,6 +510,10 @@ void QuartzProcessEvent(xEvent *xe) {
RootlessOrderAllWindows();
break;
case kXDarwinSpaceChanged:
DEBUG_LOG("kXDarwinSpaceChanged\n");
QuartzSpaceChanged(xe->u.clientMessage.u.l.longs0);
break;
default:
ErrorF("Unknown application defined event type %d.\n", xe->u.u.type);
}

View File

@ -63,6 +63,7 @@ static const char *xprOpenGLBundle = "glxCGL.bundle";
*/
static void eventHandler(unsigned int type, const void *arg,
unsigned int arg_size, void *data) {
switch (type) {
case XP_EVENT_DISPLAY_CHANGED:
DEBUG_LOG("XP_EVENT_DISPLAY_CHANGED\n");
@ -105,6 +106,13 @@ static void eventHandler(unsigned int type, const void *arg,
DRISurfaceNotify(*(xp_surface_id *) arg, kind);
}
break;
case XP_EVENT_SPACE_CHANGED:
ErrorF("XP_EVENT_SPACE_CHANGED\n");
if(arg_size == sizeof(uint32_t)) {
uint32_t space_id = *(uint32_t *)arg;
QuartzMessageServerThread(kXDarwinSpaceChanged, 1, space_id);
}
break;
default:
ErrorF("Unknown XP_EVENT type (%d) in xprScreen:eventHandler\n", type);
}
@ -233,7 +241,8 @@ xprDisplayInit(void)
| XP_EVENT_WINDOW_STATE_CHANGED
| XP_EVENT_WINDOW_MOVED
| XP_EVENT_SURFACE_CHANGED
| XP_EVENT_SURFACE_DESTROYED,
| XP_EVENT_SURFACE_DESTROYED
| XP_EVENT_SPACE_CHANGED,
eventHandler, NULL);
AppleDRIExtensionInit();