diff --git a/hw/xquartz/darwin.h b/hw/xquartz/darwin.h index c5e2ed80d..325122dfd 100644 --- a/hw/xquartz/darwin.h +++ b/hw/xquartz/darwin.h @@ -106,6 +106,7 @@ enum { kXDarwinBringAllToFront, // bring all X windows to front kXDarwinToggleFullscreen, // Enable/Disable fullscreen mode kXDarwinSetRootless, // Set rootless mode + kXDarwinSpaceChanged, // Spaces changed /* * AppleWM events */ @@ -116,7 +117,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 diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c index 6f42c538f..a034c9fac 100644 --- a/hw/xquartz/quartz.c +++ b/hw/xquartz/quartz.c @@ -266,7 +266,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); @@ -364,6 +364,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 @@ -494,6 +502,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); } diff --git a/hw/xquartz/xpr/xprScreen.c b/hw/xquartz/xpr/xprScreen.c index db36403df..4dc5846d5 100644 --- a/hw/xquartz/xpr/xprScreen.c +++ b/hw/xquartz/xpr/xprScreen.c @@ -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();