diff options
author | Jeremy Huddleston <jeremyhu@apple.com> | 2011-02-08 11:37:52 -0800 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@apple.com> | 2011-02-27 15:46:22 -0800 |
commit | 13578b852b7631f99cf1fd5e2e5469edc5aae369 (patch) | |
tree | 20f3e9c9cc7c0e6786d53ab3430ea9581c3927f7 | |
parent | f3d19c0cf3327cceb90f7378f5d8fc0c3e327400 (diff) |
XQuartz: RandR: Capture the display when switching modes with RandR
This will prevent native windows from resizing as we change resolutions.
Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
-rw-r--r-- | hw/xquartz/quartz.c | 2 | ||||
-rw-r--r-- | hw/xquartz/quartz.h | 2 | ||||
-rw-r--r-- | hw/xquartz/quartzRandR.c | 13 | ||||
-rw-r--r-- | hw/xquartz/xpr/xprAppleWM.c | 2 | ||||
-rw-r--r-- | hw/xquartz/xpr/xprFrame.c | 4 |
5 files changed, 23 insertions, 0 deletions
diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c index 222a5eab0..11e5a74d7 100644 --- a/hw/xquartz/quartz.c +++ b/hw/xquartz/quartz.c @@ -82,6 +82,8 @@ Bool XQuartzIsRootless = TRUE; Bool XQuartzServerVisible = FALSE; Bool XQuartzFullscreenMenu = FALSE; +int32_t XQuartzShieldingWindowLevel = 0; + /* =========================================================================== diff --git a/hw/xquartz/quartz.h b/hw/xquartz/quartz.h index b83391db9..67a7919b2 100644 --- a/hw/xquartz/quartz.h +++ b/hw/xquartz/quartz.h @@ -124,6 +124,8 @@ extern Bool XQuartzFullscreenMenu; /* Show the menu bar (autohide) while in FS extern Bool XQuartzFullscreenDisableHotkeys; extern Bool XQuartzOptionSendsAlt; /* Alt or Mode_switch? */ +extern int32_t XQuartzShieldingWindowLevel; /* CGShieldingWindowLevel() or 0 */ + Bool QuartzAddScreen(int index, ScreenPtr pScreen); Bool QuartzSetupScreen(int index, ScreenPtr pScreen); void QuartzInitOutput(int argc,char **argv); diff --git a/hw/xquartz/quartzRandR.c b/hw/xquartz/quartzRandR.c index 296f9b669..57e975550 100644 --- a/hw/xquartz/quartzRandR.c +++ b/hw/xquartz/quartzRandR.c @@ -346,6 +346,14 @@ static int QuartzRandRRegisterModeCallback (ScreenPtr pScreen, static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL doRegister) { QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen); CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0]; + Bool captureDisplay = (pMode->refresh != FAKE_REFRESH_FULLSCREEN && pMode->refresh != FAKE_REFRESH_ROOTLESS); + + if(XQuartzShieldingWindowLevel == 0 && captureDisplay) { + CGCaptureAllDisplays(); + XQuartzShieldingWindowLevel = CGShieldingWindowLevel(); // 2147483630 + DEBUG_LOG("Display captured. ShieldWindowID: %u, Shield level: %d\n", + CGShieldingWindowID(screenId), XQuartzShieldingWindowLevel); + } if (pQuartzScreen->currentMode.ref && CFEqual(pMode->ref, pQuartzScreen->currentMode.ref)) { DEBUG_LOG("Requested RandR resolution matches current CG mode\n"); @@ -369,6 +377,11 @@ static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL pQuartzScreen->currentMode = *pMode; CFRetain(pQuartzScreen->currentMode.ref); + if(XQuartzShieldingWindowLevel != 0 && !captureDisplay) { + CGReleaseAllDisplays(); + XQuartzShieldingWindowLevel = 0; + } + return TRUE; } diff --git a/hw/xquartz/xpr/xprAppleWM.c b/hw/xquartz/xpr/xprAppleWM.c index 1a3d427b7..21e6f98fa 100644 --- a/hw/xquartz/xpr/xprAppleWM.c +++ b/hw/xquartz/xpr/xprAppleWM.c @@ -69,6 +69,8 @@ static int xprSetWindowLevel( if(XQuartzIsRootless) wc.window_level = normal_window_levels[level]; + else if(XQuartzShieldingWindowLevel) + wc.window_level = XQuartzShieldingWindowLevel + 1; else wc.window_level = rooted_window_levels[level]; diff --git a/hw/xquartz/xpr/xprFrame.c b/hw/xquartz/xpr/xprFrame.c index 8ee3a28a6..15598e942 100644 --- a/hw/xquartz/xpr/xprFrame.c +++ b/hw/xquartz/xpr/xprFrame.c @@ -173,6 +173,8 @@ xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen, if(XQuartzIsRootless) wc.window_level = normal_window_levels[pFrame->level]; + else if(XQuartzShieldingWindowLevel) + wc.window_level = XQuartzShieldingWindowLevel + 1; else wc.window_level = rooted_window_levels[pFrame->level]; mask |= XP_WINDOW_LEVEL; @@ -287,6 +289,8 @@ static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid) { if(winRec) { if(XQuartzIsRootless) wc.window_level = normal_window_levels[winRec->level]; + else if(XQuartzShieldingWindowLevel) + wc.window_level = XQuartzShieldingWindowLevel + 1; else wc.window_level = rooted_window_levels[winRec->level]; mask |= XP_WINDOW_LEVEL; |