Merge remote branch 'jeremyhu/master'
This commit is contained in:
commit
0bc95d5b06
|
@ -1923,7 +1923,7 @@ if test "x$XQUARTZ" = xyes; then
|
|||
|
||||
AC_CHECK_LIB([Xplugin],[xp_init],[:])
|
||||
|
||||
CFLAGS="${CFLAGS} -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
|
||||
CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
|
||||
|
||||
PKG_CHECK_MODULES(XPBPROXY, $APPLEWMPROTO $LIBAPPLEWM xfixes x11)
|
||||
|
||||
|
|
|
@ -73,6 +73,8 @@ void X11ApplicationServerReady (void);
|
|||
void X11ApplicationShowHideMenubar (int state);
|
||||
void X11ApplicationLaunchClient (const char *cmd);
|
||||
|
||||
Bool X11ApplicationCanEnterRandR (void);
|
||||
|
||||
void X11ApplicationMain(int argc, char **argv, char **envp);
|
||||
|
||||
#define PREFS_APPSMENU "apps_menu"
|
||||
|
@ -86,6 +88,7 @@ void X11ApplicationMain(int argc, char **argv, char **envp);
|
|||
#define PREFS_NO_TCP "nolisten_tcp"
|
||||
#define PREFS_DONE_XINIT_CHECK "done_xinit_check"
|
||||
#define PREFS_NO_QUIT_ALERT "no_quit_alert"
|
||||
#define PREFS_NO_RANDR_ALERT "no_randr_alert"
|
||||
#define PREFS_OPTION_SENDS_ALT "option_sends_alt"
|
||||
#define PREFS_FAKE_BUTTON2 "fake_button2"
|
||||
#define PREFS_FAKE_BUTTON3 "fake_button3"
|
||||
|
|
|
@ -883,6 +883,35 @@ void X11ApplicationLaunchClient (const char *cmd) {
|
|||
[string release];
|
||||
}
|
||||
|
||||
/* This is a special function in that it is run from the *SERVER* thread and
|
||||
* not the AppKit thread. We want to block entering a screen-capturing RandR
|
||||
* mode until we notify the user about how to get out if the X11 client crashes.
|
||||
*/
|
||||
Bool X11ApplicationCanEnterRandR(void) {
|
||||
NSString *title, *msg;
|
||||
|
||||
if([X11App prefs_get_boolean:@PREFS_NO_RANDR_ALERT default:NO] || XQuartzShieldingWindowLevel != 0)
|
||||
return TRUE;
|
||||
|
||||
title = NSLocalizedString(@"Enter RandR mode?", @"Dialog title when switching to RandR");
|
||||
msg = NSLocalizedString(@"An application has requested X11 to change the resolution of your display. X11 will restore the display to its previous state when the requesting application requests to return to the previous state. Alternatively, you can use the ⌥⌘A key sequence to force X11 to return to the previous state.",
|
||||
@"Dialog when switching to RandR");
|
||||
|
||||
if(!XQuartzIsRootless)
|
||||
QuartzShowFullscreen(FALSE);
|
||||
|
||||
switch(NSRunAlertPanel(title, msg, NSLocalizedString(@"Allow", @""), NSLocalizedString (@"Cancel", @""), NSLocalizedString (@"Always Allow", @""))) {
|
||||
case NSAlertOtherReturn:
|
||||
[X11App prefs_set_boolean:@PREFS_NO_RANDR_ALERT value:YES];
|
||||
[X11App prefs_synchronize];
|
||||
case NSAlertDefaultReturn:
|
||||
return YES;
|
||||
|
||||
default:
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
static void check_xinitrc (void) {
|
||||
char *tem, buf[1024];
|
||||
NSString *msg;
|
||||
|
|
Binary file not shown.
|
@ -33,7 +33,9 @@
|
|||
|
||||
#include "pbproxy.h"
|
||||
|
||||
#define Cursor X_Cursor
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#undef Cursor
|
||||
|
||||
#include <AppKit/NSPasteboard.h>
|
||||
|
||||
|
|
|
@ -82,6 +82,8 @@ Bool XQuartzIsRootless = TRUE;
|
|||
Bool XQuartzServerVisible = 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 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);
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
#include "quartz.h"
|
||||
#include "darwin.h"
|
||||
|
||||
#include "X11Application.h"
|
||||
|
||||
#include <AvailabilityMacros.h>
|
||||
|
||||
#include <X11/extensions/randr.h>
|
||||
|
@ -346,6 +348,16 @@ 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) {
|
||||
if(!X11ApplicationCanEnterRandR())
|
||||
return FALSE;
|
||||
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 +381,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;
|
||||
}
|
||||
|
||||
|
@ -396,16 +413,6 @@ static Bool QuartzRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) {
|
|||
if (pQuartzScreen->displayCount == 0)
|
||||
return FALSE;
|
||||
|
||||
if (pQuartzScreen->displayCount > 1) {
|
||||
/* RandR operations are not well-defined for an X11 screen spanning
|
||||
multiple CG displays. Create two entries for the current virtual
|
||||
resolution including/excluding the menu bar. */
|
||||
|
||||
QuartzRandRRegisterMode(pScreen, &pQuartzScreen->rootlessMode);
|
||||
QuartzRandRRegisterMode(pScreen, &pQuartzScreen->fullscreenMode);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return QuartzRandREnumerateModes(pScreen, QuartzRandRRegisterModeCallback, NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -196,6 +196,13 @@ xprAddPseudoramiXScreens(int *x, int *y, int *width, int *height, ScreenPtr pScr
|
|||
return;
|
||||
}
|
||||
|
||||
/* If the displays are captured, we are in a RandR game mode
|
||||
* on the primary display, so we only want to include the first
|
||||
* display. The others are covered by the shield window.
|
||||
*/
|
||||
if (CGDisplayIsCaptured(kCGDirectMainDisplay))
|
||||
displayCount = 1;
|
||||
|
||||
displayList = malloc(displayCount * sizeof(CGDirectDisplayID));
|
||||
if(!displayList)
|
||||
FatalError("Unable to allocate memory for list of displays.\n");
|
||||
|
@ -292,9 +299,34 @@ xprAddScreen(int index, ScreenPtr pScreen)
|
|||
DEBUG_LOG("index=%d depth=%d\n", index, depth);
|
||||
|
||||
if(depth == -1) {
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
depth = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * CGDisplayBitsPerSample(kCGDirectMainDisplay);
|
||||
#else
|
||||
CGDisplayModeRef modeRef;
|
||||
CFStringRef encStrRef;
|
||||
|
||||
modeRef = CGDisplayCopyDisplayMode(kCGDirectMainDisplay);
|
||||
if(!modeRef)
|
||||
goto have_depth;
|
||||
|
||||
encStrRef = CGDisplayModeCopyPixelEncoding(modeRef);
|
||||
CFRelease(modeRef);
|
||||
if(!encStrRef)
|
||||
goto have_depth;
|
||||
|
||||
if(CFStringCompare(encStrRef, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
depth = 24;
|
||||
} else if(CFStringCompare(encStrRef, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
depth = 15;
|
||||
} else if(CFStringCompare(encStrRef, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
depth = 8;
|
||||
}
|
||||
|
||||
CFRelease(encStrRef);
|
||||
#endif
|
||||
}
|
||||
|
||||
have_depth:
|
||||
switch(depth) {
|
||||
case 8: // pseudo-working
|
||||
dfb->visuals = PseudoColorMask;
|
||||
|
@ -319,7 +351,7 @@ xprAddScreen(int index, ScreenPtr pScreen)
|
|||
// case 24:
|
||||
default:
|
||||
if(depth != 24)
|
||||
ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d CGDisplaySamplesPerPixel=%d CGDisplayBitsPerSample=%d)\n", darwinDesiredDepth, depth, (int)CGDisplaySamplesPerPixel(kCGDirectMainDisplay), (int)CGDisplayBitsPerSample(kCGDirectMainDisplay));
|
||||
ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d)\n", depth, darwinDesiredDepth);
|
||||
dfb->visuals = TrueColorMask; //LARGE_VISUALS;
|
||||
dfb->preferredCVC = TrueColor;
|
||||
dfb->depth = 24;
|
||||
|
|
|
@ -89,7 +89,11 @@ getDrawableDamageRef (DrawablePtr pDrawable)
|
|||
ScreenPtr pScreen = pDrawable->pScreen;
|
||||
|
||||
pPixmap = 0;
|
||||
if (pScreen->GetWindowPixmap)
|
||||
if (pScreen->GetWindowPixmap
|
||||
#ifdef ROOTLESS_WORKAROUND
|
||||
&& ((WindowPtr)pDrawable)->viewable
|
||||
#endif
|
||||
)
|
||||
pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr)pDrawable);
|
||||
|
||||
if (!pPixmap)
|
||||
|
|
Loading…
Reference in New Issue
Block a user