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>
This commit is contained in:
parent
f3d19c0cf3
commit
13578b852b
|
@ -82,6 +82,8 @@ Bool XQuartzIsRootless = TRUE;
|
||||||
Bool XQuartzServerVisible = FALSE;
|
Bool XQuartzServerVisible = FALSE;
|
||||||
Bool XQuartzFullscreenMenu = FALSE;
|
Bool XQuartzFullscreenMenu = FALSE;
|
||||||
|
|
||||||
|
int32_t XQuartzShieldingWindowLevel = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===========================================================================
|
===========================================================================
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,8 @@ extern Bool XQuartzFullscreenMenu; /* Show the menu bar (autohide) while in FS
|
||||||
extern Bool XQuartzFullscreenDisableHotkeys;
|
extern Bool XQuartzFullscreenDisableHotkeys;
|
||||||
extern Bool XQuartzOptionSendsAlt; /* Alt or Mode_switch? */
|
extern Bool XQuartzOptionSendsAlt; /* Alt or Mode_switch? */
|
||||||
|
|
||||||
|
extern int32_t XQuartzShieldingWindowLevel; /* CGShieldingWindowLevel() or 0 */
|
||||||
|
|
||||||
Bool QuartzAddScreen(int index, ScreenPtr pScreen);
|
Bool QuartzAddScreen(int index, ScreenPtr pScreen);
|
||||||
Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
|
Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
|
||||||
void QuartzInitOutput(int argc,char **argv);
|
void QuartzInitOutput(int argc,char **argv);
|
||||||
|
|
|
@ -346,6 +346,14 @@ static int QuartzRandRRegisterModeCallback (ScreenPtr pScreen,
|
||||||
static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL doRegister) {
|
static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL doRegister) {
|
||||||
QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
|
QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
|
||||||
CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0];
|
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)) {
|
if (pQuartzScreen->currentMode.ref && CFEqual(pMode->ref, pQuartzScreen->currentMode.ref)) {
|
||||||
DEBUG_LOG("Requested RandR resolution matches current CG mode\n");
|
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;
|
pQuartzScreen->currentMode = *pMode;
|
||||||
CFRetain(pQuartzScreen->currentMode.ref);
|
CFRetain(pQuartzScreen->currentMode.ref);
|
||||||
|
|
||||||
|
if(XQuartzShieldingWindowLevel != 0 && !captureDisplay) {
|
||||||
|
CGReleaseAllDisplays();
|
||||||
|
XQuartzShieldingWindowLevel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,8 @@ static int xprSetWindowLevel(
|
||||||
|
|
||||||
if(XQuartzIsRootless)
|
if(XQuartzIsRootless)
|
||||||
wc.window_level = normal_window_levels[level];
|
wc.window_level = normal_window_levels[level];
|
||||||
|
else if(XQuartzShieldingWindowLevel)
|
||||||
|
wc.window_level = XQuartzShieldingWindowLevel + 1;
|
||||||
else
|
else
|
||||||
wc.window_level = rooted_window_levels[level];
|
wc.window_level = rooted_window_levels[level];
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,8 @@ xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen,
|
||||||
|
|
||||||
if(XQuartzIsRootless)
|
if(XQuartzIsRootless)
|
||||||
wc.window_level = normal_window_levels[pFrame->level];
|
wc.window_level = normal_window_levels[pFrame->level];
|
||||||
|
else if(XQuartzShieldingWindowLevel)
|
||||||
|
wc.window_level = XQuartzShieldingWindowLevel + 1;
|
||||||
else
|
else
|
||||||
wc.window_level = rooted_window_levels[pFrame->level];
|
wc.window_level = rooted_window_levels[pFrame->level];
|
||||||
mask |= XP_WINDOW_LEVEL;
|
mask |= XP_WINDOW_LEVEL;
|
||||||
|
@ -287,6 +289,8 @@ static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid) {
|
||||||
if(winRec) {
|
if(winRec) {
|
||||||
if(XQuartzIsRootless)
|
if(XQuartzIsRootless)
|
||||||
wc.window_level = normal_window_levels[winRec->level];
|
wc.window_level = normal_window_levels[winRec->level];
|
||||||
|
else if(XQuartzShieldingWindowLevel)
|
||||||
|
wc.window_level = XQuartzShieldingWindowLevel + 1;
|
||||||
else
|
else
|
||||||
wc.window_level = rooted_window_levels[winRec->level];
|
wc.window_level = rooted_window_levels[winRec->level];
|
||||||
mask |= XP_WINDOW_LEVEL;
|
mask |= XP_WINDOW_LEVEL;
|
||||||
|
|
Loading…
Reference in New Issue