#include "sanitizedCarbon.h"
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "quartzCommon.h"
#include "inputstr.h"
#include "quartz.h"
#include "darwin.h"
#include "darwinEvents.h"
#include "pseudoramiX.h"
#define _APPLEWM_SERVER_
#include "applewmExt.h"
#include "X11Application.h"
#include <X11/extensions/applewmconst.h>
#include <X11/extensions/randr.h>
#include "scrnintstr.h"
#include "windowstr.h"
#include "colormapst.h"
#include "globals.h"
#include "mi.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <rootlessCommon.h>
#include <Xplugin.h>
#define FAKE_RANDR 1
int quartzEventWriteFD = -1;
int quartzUseSysBeep = 0;
int quartzUseAGL = 1;
int quartzEnableKeyEquivalents = 1;
int quartzServerVisible = FALSE;
int quartzServerQuitting = FALSE;
static int quartzScreenKeyIndex;
DevPrivateKey quartzScreenKey = &quartzScreenKeyIndex;
int aquaMenuBarHeight = 0;
QuartzModeProcsPtr quartzProcs = NULL;
const char *quartzOpenGLBundle = NULL;
int quartzFullscreenDisableHotkeys = TRUE;
#if defined(RANDR) && !defined(FAKE_RANDR)
Bool QuartzRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) {
return FALSE;
}
Bool QuartzRandRSetConfig (ScreenPtr pScreen,
Rotation randr,
int rate,
RRScreenSizePtr pSize) {
return FALSE;
}
Bool QuartzRandRInit (ScreenPtr pScreen) {
rrScrPrivPtr pScrPriv;
if (!RRScreenInit (pScreen)) return FALSE;
pScrPriv = rrGetScrPriv(pScreen);
pScrPriv->rrGetInfo = QuartzRandRGetInfo;
pScrPriv->rrSetConfig = QuartzRandRSetConfig;
return TRUE;
}
#endif
Bool QuartzAddScreen(
int index,
ScreenPtr pScreen)
{
QuartzScreenPtr displayInfo = xcalloc(sizeof(QuartzScreenRec), 1);
dixSetPrivate(&pScreen->devPrivates, quartzScreenKey, displayInfo);
return quartzProcs->AddScreen(index, pScreen);
}
Bool QuartzSetupScreen(
int index,
ScreenPtr pScreen)
{
if (! quartzProcs->SetupScreen(index, pScreen))
return FALSE;
if (! quartzProcs->InitCursor(pScreen))
return FALSE;
return TRUE;
}
void QuartzInitOutput(
int argc,
char **argv )
{
if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
QuartzWakeupHandler,
NULL))
{
FatalError("Could not register block and wakeup handlers.");
}
quartzProcs->DisplayInit();
}
void QuartzInitInput(
int argc,
char **argv )
{
X11ApplicationSetCanQuit(0);
X11ApplicationServerReady();
if (quartzProcs->InitInput)
quartzProcs->InitInput(argc, argv);
}
#ifdef FAKE_RANDR
static const int padlength[4] = {0, 3, 2, 1};
static void
RREditConnectionInfo (ScreenPtr pScreen)
{
xConnSetup *connSetup;
char *vendor;
xPixmapFormat *formats;
xWindowRoot *root;
xDepth *depth;
xVisualType *visual;
int screen = 0;
int d;
connSetup = (xConnSetup *) ConnectionInfo;
vendor = (char *) connSetup + sizeof (xConnSetup);
formats = (xPixmapFormat *) ((char *) vendor +
connSetup->nbytesVendor +
padlength[connSetup->nbytesVendor & 3]);
root = (xWindowRoot *) ((char *) formats +
sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
while (screen != pScreen->myNum)
{
depth = (xDepth *) ((char *) root +
sizeof (xWindowRoot));
for (d = 0; d < root->nDepths; d++)
{
visual = (xVisualType *) ((char *) depth +
sizeof (xDepth));
depth = (xDepth *) ((char *) visual +
depth->nVisuals * sizeof (xVisualType));
}
root = (xWindowRoot *) ((char *) depth);
screen++;
}
root->pixWidth = pScreen->width;
root->pixHeight = pScreen->height;
root->mmWidth = pScreen->mmWidth;
root->mmHeight = pScreen->mmHeight;
}
#endif
static void QuartzUpdateScreens(void) {
ScreenPtr pScreen;
WindowPtr pRoot;
int x, y, width, height, sx, sy;
xEvent e;
if (noPseudoramiXExtension || screenInfo.numScreens != 1)
{
return;
}
pScreen = screenInfo.screens[0];
PseudoramiXResetScreens();
quartzProcs->AddPseudoramiXScreens(&x, &y, &width, &height);
dixScreenOrigins[pScreen->myNum].x = x;
dixScreenOrigins[pScreen->myNum].y = y;
pScreen->mmWidth = pScreen->mmWidth * ((double) width / pScreen->width);
pScreen->mmHeight = pScreen->mmHeight * ((double) height / pScreen->height);
pScreen->width = width;
pScreen->height = height;
#ifndef FAKE_RANDR
if(!QuartzRandRInit(pScreen))
FatalError("Failed to init RandR extension.\n");
#endif
DarwinAdjustScreenOrigins(&screenInfo);
quartzProcs->UpdateScreen(pScreen);
sx = dixScreenOrigins[pScreen->myNum].x + darwinMainScreenX;
sy = dixScreenOrigins[pScreen->myNum].y + darwinMainScreenY;
pRoot = WindowTable[pScreen->myNum];
AppleWMSetScreenOrigin(pRoot);
pScreen->ResizeWindow(pRoot, x - sx, y - sy, width, height, NULL);
miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
DefineInitialRootWindow(pRoot);
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, dixScreenOrigins[pScreen->myNum].x, dixScreenOrigins[pScreen->myNum].y);
e.u.u.type = ConfigureNotify;
e.u.configureNotify.window = pRoot->drawable.id;
e.u.configureNotify.aboveSibling = None;
e.u.configureNotify.x = x - sx;
e.u.configureNotify.y = y - sy;
e.u.configureNotify.width = width;
e.u.configureNotify.height = height;
e.u.configureNotify.borderWidth = wBorderWidth(pRoot);
e.u.configureNotify.override = pRoot->overrideRedirect;
DeliverEvents(pRoot, &e, 1, NullWindow);
#ifdef FAKE_RANDR
RREditConnectionInfo(pScreen);
#endif
}
void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents) {
QuartzUpdateScreens();
}
void QuartzSetFullscreen(Bool state) {
DEBUG_LOG("QuartzSetFullscreen: state=%d\n", state);
if(quartzHasRoot == state)
return;
quartzHasRoot = state;
xp_disable_update ();
if (!quartzHasRoot && !quartzEnableRootless)
RootlessHideAllWindows();
RootlessUpdateRooted(quartzHasRoot);
if (quartzHasRoot && !quartzEnableRootless)
RootlessShowAllWindows ();
if (quartzHasRoot || quartzEnableRootless) {
RootlessRepositionWindows(screenInfo.screens[0]);
}
X11ApplicationShowHideMenubar(!quartzHasRoot);
xp_reenable_update ();
if (quartzFullscreenDisableHotkeys)
xp_disable_hot_keys(quartzHasRoot);
}
void QuartzSetRootless(Bool state) {
if(quartzEnableRootless == state)
return;
quartzEnableRootless = state;
xp_disable_update();
QuartzUpdateScreens();
if(!quartzHasRoot) {
if(!quartzEnableRootless) {
RootlessHideAllWindows();
} else {
RootlessShowAllWindows();
}
}
X11ApplicationShowHideMenubar(!quartzHasRoot);
xp_reenable_update();
if (!quartzEnableRootless && quartzFullscreenDisableHotkeys)
xp_disable_hot_keys(quartzHasRoot);
}
void QuartzShow(
int x, int y )
{
int i;
if (quartzServerVisible)
return;
quartzServerVisible = TRUE;
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
quartzProcs->ResumeScreen(screenInfo.screens[i], x, y);
}
}
if (!quartzEnableRootless)
QuartzSetFullscreen(TRUE);
}
void QuartzHide(void)
{
int i;
if (quartzServerVisible) {
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
quartzProcs->SuspendScreen(screenInfo.screens[i]);
}
}
}
QuartzSetFullscreen(FALSE);
quartzServerVisible = FALSE;
}
void QuartzSetRootClip(
BOOL enable)
{
int i;
if (!quartzServerVisible)
return;
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
xf86SetRootClip(screenInfo.screens[i], enable);
}
}
}
void QuartzSpaceChanged(uint32_t space_id) {
DEBUG_LOG("Space Changed (%u) ... do something interesting...\n", space_id);
}