summaryrefslogtreecommitdiff
path: root/hw/xquartz/quartz.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xquartz/quartz.c')
-rw-r--r--hw/xquartz/quartz.c220
1 files changed, 118 insertions, 102 deletions
diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c
index c395b42e6..e4578cc3e 100644
--- a/hw/xquartz/quartz.c
+++ b/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();