diff options
Diffstat (limited to 'xorg-server/hw/xquartz/quartz.c')
-rw-r--r-- | xorg-server/hw/xquartz/quartz.c | 220 |
1 files changed, 118 insertions, 102 deletions
diff --git a/xorg-server/hw/xquartz/quartz.c b/xorg-server/hw/xquartz/quartz.c index c395b42e6..e4578cc3e 100644 --- a/xorg-server/hw/xquartz/quartz.c +++ b/xorg-server/hw/xquartz/quartz.c @@ -68,10 +68,10 @@ #include <rootlessCommon.h> #include <Xplugin.h> -DevPrivateKeyRec quartzScreenKeyRec; -int aquaMenuBarHeight = 0; -QuartzModeProcsPtr quartzProcs = NULL; -const char *quartzOpenGLBundle = NULL; +DevPrivateKeyRec quartzScreenKeyRec; +int aquaMenuBarHeight = 0; +QuartzModeProcsPtr quartzProcs = NULL; +const char *quartzOpenGLBundle = NULL; Bool XQuartzFullscreenDisableHotkeys = TRUE; Bool XQuartzOptionSendsAlt = FALSE; @@ -96,9 +96,8 @@ int32_t XQuartzShieldingWindowLevel = 0; * QuartzAddScreen * Do mode dependent initialization of each screen for Quartz. */ -Bool QuartzAddScreen( - int index, - ScreenPtr pScreen) +Bool +QuartzAddScreen(int index, ScreenPtr pScreen) { // allocate space for private per screen Quartz specific storage QuartzScreenPtr displayInfo = calloc(sizeof(QuartzScreenRec), 1); @@ -110,25 +109,23 @@ Bool QuartzAddScreen( return quartzProcs->AddScreen(index, pScreen); } - /* * QuartzSetupScreen * Finalize mode specific setup of each screen. */ -Bool QuartzSetupScreen( - int index, - ScreenPtr pScreen) +Bool +QuartzSetupScreen(int index, ScreenPtr pScreen) { // do Quartz mode specific setup - if (! quartzProcs->SetupScreen(index, pScreen)) + if (!quartzProcs->SetupScreen(index, pScreen)) return FALSE; // setup cursor support - if (! quartzProcs->InitCursor(pScreen)) + if (!quartzProcs->InitCursor(pScreen)) return FALSE; #if defined(RANDR) - if(!QuartzRandRInit(pScreen)) { + if (!QuartzRandRInit(pScreen)) { DEBUG_LOG("Failed to init RandR extension.\n"); return FALSE; } @@ -137,14 +134,12 @@ Bool QuartzSetupScreen( return TRUE; } - /* * QuartzInitOutput * Quartz display initialization. */ -void QuartzInitOutput( - int argc, - char **argv ) +void +QuartzInitOutput(int argc, char **argv) { /* For XQuartz, we want to just use the default signal handler to work better with CrashTracer */ signal(SIGSEGV, SIG_DFL); @@ -167,27 +162,23 @@ void QuartzInitOutput( #endif if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler, - QuartzWakeupHandler, - NULL)) - { + QuartzWakeupHandler, NULL)) { FatalError("Could not register block and wakeup handlers."); } if (!dixRegisterPrivateKey(&quartzScreenKeyRec, PRIVATE_SCREEN, 0)) - FatalError("Failed to alloc quartz screen private.\n"); + FatalError("Failed to alloc quartz screen private.\n"); // Do display mode specific initialization quartzProcs->DisplayInit(); } - /* * QuartzInitInput * Inform the main thread the X server is ready to handle events. */ -void QuartzInitInput( - int argc, - char **argv ) +void +QuartzInitInput(int argc, char **argv) { X11ApplicationSetCanQuit(0); X11ApplicationServerReady(); @@ -196,44 +187,44 @@ void QuartzInitInput( quartzProcs->InitInput(argc, argv); } - -void QuartzUpdateScreens(void) { +void +QuartzUpdateScreens(void) +{ ScreenPtr pScreen; WindowPtr pRoot; int x, y, width, height, sx, sy; xEvent e; BoxRec bounds; - - if (noPseudoramiXExtension || screenInfo.numScreens != 1) - { + + if (noPseudoramiXExtension || screenInfo.numScreens != 1) { /* FIXME: if not using Xinerama, we have multiple screens, and - to do this properly may need to add or remove screens. Which - isn't possible. So don't do anything. Another reason why - we default to running with Xinerama. */ - + to do this properly may need to add or remove screens. Which + isn't possible. So don't do anything. Another reason why + we default to running with Xinerama. */ + return; } - + pScreen = screenInfo.screens[0]; - + PseudoramiXResetScreens(); quartzProcs->AddPseudoramiXScreens(&x, &y, &width, &height, pScreen); - + pScreen->x = x; pScreen->y = y; pScreen->mmWidth = pScreen->mmWidth * ((double) width / pScreen->width); pScreen->mmHeight = pScreen->mmHeight * ((double) height / pScreen->height); pScreen->width = width; pScreen->height = height; - + DarwinAdjustScreenOrigins(&screenInfo); - + /* DarwinAdjustScreenOrigins or UpdateScreen may change pScreen->x/y, * so use it rather than x/y */ sx = pScreen->x + darwinMainScreenX; sy = pScreen->y + darwinMainScreenY; - + /* Adjust the root window. */ pRoot = pScreen->root; AppleWMSetScreenOrigin(pRoot); @@ -250,7 +241,10 @@ void QuartzUpdateScreens(void) { inputInfo.pointer->spriteInfo->sprite->physLimits = bounds; inputInfo.pointer->spriteInfo->sprite->hotLimits = bounds; - DEBUG_LOG("Root Window: %dx%d @ (%d, %d) darwinMainScreen (%d, %d) xy (%d, %d) dixScreenOrigins (%d, %d)\n", width, height, x - sx, y - sy, darwinMainScreenX, darwinMainScreenY, x, y, pScreen->x, pScreen->y); + DEBUG_LOG + ("Root Window: %dx%d @ (%d, %d) darwinMainScreen (%d, %d) xy (%d, %d) dixScreenOrigins (%d, %d)\n", + width, height, x - sx, y - sy, darwinMainScreenX, darwinMainScreenY, x, + y, pScreen->x, pScreen->y); /* Send an event for the root reconfigure */ e.u.u.type = ConfigureNotify; @@ -267,74 +261,86 @@ void QuartzUpdateScreens(void) { quartzProcs->UpdateScreen(pScreen); /* miPaintWindow needs to be called after RootlessUpdateScreenPixmap (from xprUpdateScreen) */ - miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND); + miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND); /* Tell RandR about the new size, so new connections get the correct info */ RRScreenSizeNotify(pScreen); } -static void pokeActivityCallback(CFRunLoopTimerRef timer, void *info) { +static void +pokeActivityCallback(CFRunLoopTimerRef timer, void *info) +{ UpdateSystemActivity(OverallAct); } -static void QuartzScreenSaver(int state) { +static void +QuartzScreenSaver(int state) +{ static CFRunLoopTimerRef pokeActivityTimer = NULL; - static CFRunLoopTimerContext pokeActivityContext = { 0, NULL, NULL, NULL, NULL }; + static CFRunLoopTimerContext pokeActivityContext = + { 0, NULL, NULL, NULL, NULL }; static OSSpinLock pokeActivitySpinLock = OS_SPINLOCK_INIT; OSSpinLockLock(&pokeActivitySpinLock); - if(state) { - if(pokeActivityTimer == NULL) + if (state) { + if (pokeActivityTimer == NULL) goto QuartzScreenSaverEnd; CFRunLoopTimerInvalidate(pokeActivityTimer); CFRelease(pokeActivityTimer); pokeActivityTimer = NULL; - } else { - if(pokeActivityTimer != NULL) + } + else { + if (pokeActivityTimer != NULL) goto QuartzScreenSaverEnd; - - pokeActivityTimer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, pokeActivityCallback, &pokeActivityContext); - if(pokeActivityTimer == NULL) { + + pokeActivityTimer = + CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, + pokeActivityCallback, &pokeActivityContext); + if (pokeActivityTimer == NULL) { ErrorF("Unable to create pokeActivityTimer.\n"); goto QuartzScreenSaverEnd; } - CFRunLoopAddTimer(CFRunLoopGetMain(), pokeActivityTimer, kCFRunLoopCommonModes); + CFRunLoopAddTimer(CFRunLoopGetMain(), pokeActivityTimer, + kCFRunLoopCommonModes); } -QuartzScreenSaverEnd: + QuartzScreenSaverEnd: OSSpinLockUnlock(&pokeActivitySpinLock); } -void QuartzShowFullscreen(int state) { +void +QuartzShowFullscreen(int state) +{ int i; - + DEBUG_LOG("QuartzShowFullscreen: state=%d\n", state); - - if(XQuartzIsRootless) { + + if (XQuartzIsRootless) { ErrorF("QuartzShowFullscreen called while in rootless mode.\n"); return; } - + QuartzScreenSaver(!state); - - if(XQuartzFullscreenVisible == state) + + if (XQuartzFullscreenVisible == state) return; - + XQuartzFullscreenVisible = state; - - xp_disable_update (); - + + xp_disable_update(); + if (!XQuartzFullscreenVisible) RootlessHideAllWindows(); - + RootlessUpdateRooted(XQuartzFullscreenVisible); - + if (XQuartzFullscreenVisible) { - RootlessShowAllWindows (); - for (i=0; i < screenInfo.numScreens; i++) { - ScreenPtr pScreen = screenInfo.screens[i]; + RootlessShowAllWindows(); + for (i = 0; i < screenInfo.numScreens; i++) { + ScreenPtr pScreen = screenInfo.screens[i]; + RootlessRepositionWindows(pScreen); // JH: I don't think this is necessary, but keeping it here as a reminder //RootlessUpdateScreenPixmap(pScreen); @@ -345,32 +351,35 @@ void QuartzShowFullscreen(int state) { * in fullscreen mode, even though it's not visible. */ X11ApplicationShowHideMenubar(!XQuartzFullscreenVisible); - - xp_reenable_update (); - + + xp_reenable_update(); + if (XQuartzFullscreenDisableHotkeys) xp_disable_hot_keys(XQuartzFullscreenVisible); } -void QuartzSetRootless(Bool state) { +void +QuartzSetRootless(Bool state) +{ DEBUG_LOG("QuartzSetRootless state=%d\n", state); - - if(XQuartzIsRootless == state) + + if (XQuartzIsRootless == state) return; - - if(state) + + if (state) QuartzShowFullscreen(FALSE); - + XQuartzIsRootless = state; xp_disable_update(); - /* When in rootless, the menubar is not part of the screen, so we need to update our screens on toggle */ + /* When in rootless, the menubar is not part of the screen, so we need to update our screens on toggle */ QuartzUpdateScreens(); - if(XQuartzIsRootless) { + if (XQuartzIsRootless) { RootlessShowAllWindows(); - } else { + } + else { RootlessHideAllWindows(); } @@ -387,31 +396,33 @@ void QuartzSetRootless(Bool state) { * Calls mode specific screen resume to restore the X clip regions * (if needed) and the X server cursor state. */ -void QuartzShow(void) { +void +QuartzShow(void) +{ int i; if (XQuartzServerVisible) return; - + XQuartzServerVisible = TRUE; for (i = 0; i < screenInfo.numScreens; i++) { if (screenInfo.screens[i]) { quartzProcs->ResumeScreen(screenInfo.screens[i]); } } - + if (!XQuartzIsRootless) QuartzShowFullscreen(TRUE); } - /* * QuartzHide * Remove the X server display from the screen. Does nothing if already * hidden. Calls mode specific screen suspend to set X clip regions to * prevent drawing (if needed) and restore the Aqua cursor. */ -void QuartzHide(void) +void +QuartzHide(void) { int i; @@ -423,18 +434,17 @@ void QuartzHide(void) } } - if(!XQuartzIsRootless) + if (!XQuartzIsRootless) QuartzShowFullscreen(FALSE); XQuartzServerVisible = FALSE; } - /* * QuartzSetRootClip * Enable or disable rendering to the X screen. */ -void QuartzSetRootClip( - BOOL enable) +void +QuartzSetRootClip(BOOL enable) { int i; @@ -452,7 +462,9 @@ void QuartzSetRootClip( * QuartzSpaceChanged * Unmap offscreen windows, map onscreen windows */ -void QuartzSpaceChanged(uint32_t space_id) { +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); } @@ -462,26 +474,30 @@ void QuartzSpaceChanged(uint32_t space_id) { * Associate an X11 screen with one or more CoreGraphics display IDs by copying * the list into a private array. Free the previously copied array, if present. */ -void QuartzCopyDisplayIDs(ScreenPtr pScreen, - int displayCount, CGDirectDisplayID *displayIDs) { +void +QuartzCopyDisplayIDs(ScreenPtr pScreen, + int displayCount, CGDirectDisplayID * displayIDs) +{ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen); free(pQuartzScreen->displayIDs); - if(displayCount) { + if (displayCount) { size_t size = displayCount * sizeof(CGDirectDisplayID); + pQuartzScreen->displayIDs = malloc(size); memcpy(pQuartzScreen->displayIDs, displayIDs, size); - } else { - pQuartzScreen->displayIDs = NULL; + } + else { + pQuartzScreen->displayIDs = NULL; } pQuartzScreen->displayCount = displayCount; } void NSBeep(void); -void DDXRingBell( - int volume, // volume is % of max - int pitch, // pitch is Hz - int duration) // duration is milliseconds +void +DDXRingBell(int volume, // volume is % of max + int pitch, // pitch is Hz + int duration) // duration is milliseconds { if (volume) NSBeep(); |