#include "quartzCommon.h"
#include "quartz.h"
#include "darwin.h"
#include "quartzAudio.h"
#include "pseudoramiX.h"
#define _APPLEWM_SERVER_
#include "applewm.h"
#include "applewmExt.h"
#include "scrnintstr.h"
#include "colormapst.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <IOKit/pwr_mgt/IOPMLib.h>
int quartzEventWriteFD = -1;
int quartzStartClients = 1;
int quartzRootless = -1;
int quartzUseSysBeep = 0;
int quartzUseAGL = 1;
int quartzServerVisible = TRUE;
int quartzServerQuitting = FALSE;
int quartzScreenIndex = 0;
int aquaMenuBarHeight = 0;
int noPseudoramiXExtension = TRUE;
QuartzModeProcsPtr quartzProcs = NULL;
const char *quartzOpenGLBundle = NULL;
Bool DarwinModeAddScreen(
int index,
ScreenPtr pScreen)
{
QuartzScreenPtr displayInfo = xcalloc(sizeof(QuartzScreenRec), 1);
QUARTZ_PRIV(pScreen) = displayInfo;
return quartzProcs->AddScreen(index, pScreen);
}
Bool DarwinModeSetupScreen(
int index,
ScreenPtr pScreen)
{
if (! quartzProcs->SetupScreen(index, pScreen))
return FALSE;
if (! quartzProcs->InitCursor(pScreen))
return FALSE;
return TRUE;
}
void DarwinModeInitOutput(
int argc,
char **argv )
{
static unsigned long generation = 0;
if (generation != serverGeneration) {
quartzScreenIndex = AllocateScreenPrivateIndex();
generation = serverGeneration;
}
if (serverGeneration == 0) {
QuartzAudioInit();
}
if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
QuartzWakeupHandler,
NULL))
{
FatalError("Could not register block and wakeup handlers.");
}
quartzProcs->DisplayInit();
if (!noPseudoramiXExtension) {
PseudoramiXExtensionInit(argc, argv);
}
}
void DarwinModeInitInput(
int argc,
char **argv )
{
QuartzMessageMainThread(kQuartzServerStarted, NULL, 0);
if (quartzProcs->InitInput)
quartzProcs->InitInput(argc, argv);
}
static void QuartzShow(
int x, int y )
{
int i;
if (!quartzServerVisible) {
quartzServerVisible = TRUE;
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
quartzProcs->ResumeScreen(screenInfo.screens[i], x, y);
}
}
}
}
static void QuartzHide(void)
{
int i;
if (quartzServerVisible) {
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
quartzProcs->SuspendScreen(screenInfo.screens[i]);
}
}
}
quartzServerVisible = FALSE;
QuartzMessageMainThread(kQuartzServerHidden, NULL, 0);
}
static 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
QuartzMessageServerThread(
int type,
int argc, ...)
{
xEvent xe;
INT32 *argv;
int i, max_args;
va_list args;
memset(&xe, 0, sizeof(xe));
xe.u.u.type = type;
xe.u.clientMessage.u.l.type = type;
argv = &xe.u.clientMessage.u.l.longs0;
max_args = 4;
if (argc > 0 && argc <= max_args) {
va_start (args, argc);
for (i = 0; i < argc; i++)
argv[i] = (int) va_arg (args, int);
va_end (args);
}
DarwinEQEnqueue(&xe);
}
void DarwinModeProcessEvent(
xEvent *xe)
{
switch (xe->u.u.type) {
case kXDarwinActivate:
QuartzShow(xe->u.keyButtonPointer.rootX,
xe->u.keyButtonPointer.rootY);
AppleWMSendEvent(AppleWMActivationNotify,
AppleWMActivationNotifyMask,
AppleWMIsActive, 0);
break;
case kXDarwinDeactivate:
AppleWMSendEvent(AppleWMActivationNotify,
AppleWMActivationNotifyMask,
AppleWMIsInactive, 0);
QuartzHide();
break;
case kXDarwinSetRootClip:
QuartzSetRootClip((BOOL)xe->u.clientMessage.u.l.longs0);
break;
case kXDarwinQuit:
GiveUp(0);
break;
case kXDarwinReadPasteboard:
QuartzReadPasteboard();
break;
case kXDarwinWritePasteboard:
QuartzWritePasteboard();
break;
case kXDarwinControllerNotify:
AppleWMSendEvent(AppleWMControllerNotify,
AppleWMControllerNotifyMask,
xe->u.clientMessage.u.l.longs0,
xe->u.clientMessage.u.l.longs1);
break;
case kXDarwinPasteboardNotify:
AppleWMSendEvent(AppleWMPasteboardNotify,
AppleWMPasteboardNotifyMask,
xe->u.clientMessage.u.l.longs0,
xe->u.clientMessage.u.l.longs1);
break;
case kXDarwinDisplayChanged:
case kXDarwinWindowState:
case kXDarwinWindowMoved:
break;
default:
ErrorF("Unknown application defined event type %d.\n",
xe->u.u.type);
}
}
void DarwinModeGiveUp(void)
{
#if 0
int i;
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
QuartzSuspendXCursor(screenInfo.screens[i]);
}
}
#endif
if (!quartzRootless)
quartzProcs->ReleaseScreens();
}