merge latest (4.3.99.16) from XFree86 (vendor) branch

This commit is contained in:
Kaleb Keithley
2003-11-26 22:49:07 +00:00
parent c57959ad6a
commit 0097b6fe2d
796 changed files with 58012 additions and 26524 deletions

View File

@@ -29,16 +29,16 @@
* holders shall not be used in advertising or otherwise to promote the sale,
* use or other dealings in this Software without prior written authorization.
*/
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/quartz.c,v 1.7 2003/01/23 00:34:26 torrey Exp $ */
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/quartz.c,v 1.13 2003/11/12 20:21:51 torrey Exp $ */
#include "quartzCommon.h"
#include "quartz.h"
#include "darwin.h"
#include "quartzAudio.h"
#include "quartzCursor.h"
#include "fullscreen.h"
#include "rootlessAqua.h"
#include "pseudoramiX.h"
#define _APPLEWM_SERVER_
#include "applewm.h"
#include "applewmExt.h"
// X headers
#include "scrnintstr.h"
@@ -61,8 +61,8 @@ int quartzServerQuitting = FALSE;
int quartzScreenIndex = 0;
int aquaMenuBarHeight = 0;
int noPseudoramiXExtension = TRUE;
int aquaNumScreens = 0;
QuartzModeProcsPtr quartzProcs = NULL;
const char *quartzOpenGLBundle = NULL;
/*
===========================================================================
@@ -73,10 +73,10 @@ int aquaNumScreens = 0;
*/
/*
* QuartzAddScreen
* DarwinModeAddScreen
* Do mode dependent initialization of each screen for Quartz.
*/
Bool QuartzAddScreen(
Bool DarwinModeAddScreen(
int index,
ScreenPtr pScreen)
{
@@ -84,34 +84,25 @@ Bool QuartzAddScreen(
QuartzScreenPtr displayInfo = xcalloc(sizeof(QuartzScreenRec), 1);
QUARTZ_PRIV(pScreen) = displayInfo;
// do full screen or rootless specific initialization
if (quartzRootless) {
return AquaAddScreen(index, pScreen);
} else {
return QuartzFSAddScreen(index, pScreen);
}
// do Quartz mode specific initialization
return quartzProcs->AddScreen(index, pScreen);
}
/*
* QuartzSetupScreen
* DarwinModeSetupScreen
* Finalize mode specific setup of each screen.
*/
Bool QuartzSetupScreen(
Bool DarwinModeSetupScreen(
int index,
ScreenPtr pScreen)
{
// do full screen or rootless specific setup
if (quartzRootless) {
if (! AquaSetupScreen(index, pScreen))
return FALSE;
} else {
if (! QuartzFSSetupScreen(index, pScreen))
return FALSE;
}
// do Quartz mode specific setup
if (! quartzProcs->SetupScreen(index, pScreen))
return FALSE;
// setup cursor support
if (! QuartzInitCursor(pScreen))
if (! quartzProcs->InitCursor(pScreen))
return FALSE;
return TRUE;
@@ -119,10 +110,10 @@ Bool QuartzSetupScreen(
/*
* QuartzInitOutput
* DarwinModeInitOutput
* Quartz display initialization.
*/
void QuartzInitOutput(
void DarwinModeInitOutput(
int argc,
char **argv )
{
@@ -145,13 +136,8 @@ void QuartzInitOutput(
FatalError("Could not register block and wakeup handlers.");
}
if (quartzRootless) {
ErrorF("Display mode: Rootless Quartz\n");
AquaDisplayInit();
} else {
ErrorF("Display mode: Full screen Quartz\n");
QuartzFSDisplayInit();
}
// Do display mode specific initialization
quartzProcs->DisplayInit();
// Init PseudoramiX implementation of Xinerama.
// This should be in InitExtensions, but that causes link errors
@@ -163,21 +149,28 @@ void QuartzInitOutput(
/*
* QuartzInitInput
* DarwinModeInitInput
* Inform the main thread the X server is ready to handle events.
*/
void QuartzInitInput(
void DarwinModeInitInput(
int argc,
char **argv )
{
QuartzMessageMainThread(kQuartzServerStarted, NULL, 0);
if (serverGeneration == 1) {
QuartzMessageMainThread(kQuartzServerStarted, NULL, 0);
}
// Do final display mode specific initialization before handling events
if (quartzProcs->InitInput)
quartzProcs->InitInput(argc, argv);
}
/*
* QuartzShow
* Show the X server on screen. Does nothing if already shown.
* Restore the X clip regions and the X server cursor state.
* Calls mode specific screen resume to restore the X clip regions
* (if needed) and the X server cursor state.
*/
static void QuartzShow(
int x, // cursor location
@@ -189,9 +182,7 @@ static void QuartzShow(
quartzServerVisible = TRUE;
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
QuartzResumeXCursor(screenInfo.screens[i], x, y);
if (!quartzRootless)
xf86SetRootClip(screenInfo.screens[i], TRUE);
quartzProcs->ResumeScreen(screenInfo.screens[i], x, y);
}
}
}
@@ -201,8 +192,8 @@ static void QuartzShow(
/*
* QuartzHide
* Remove the X server display from the screen. Does nothing if already
* hidden. Set X clip regions to prevent drawing, and restore the Aqua
* cursor.
* hidden. Calls mode specific screen suspend to set X clip regions to
* prevent drawing (if needed) and restore the Aqua cursor.
*/
static void QuartzHide(void)
{
@@ -211,9 +202,7 @@ static void QuartzHide(void)
if (quartzServerVisible) {
for (i = 0; i < screenInfo.numScreens; i++) {
if (screenInfo.screens[i]) {
QuartzSuspendXCursor(screenInfo.screens[i]);
if (!quartzRootless)
xf86SetRootClip(screenInfo.screens[i], FALSE);
quartzProcs->SuspendScreen(screenInfo.screens[i]);
}
}
}
@@ -243,20 +232,58 @@ static void QuartzSetRootClip(
/*
* QuartzProcessEvent
* QuartzMessageServerThread
* Send the X server thread a message by placing it on the event queue.
*/
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);
}
/*
* DarwinModeProcessEvent
* Process Quartz specific events.
*/
void QuartzProcessEvent(
void DarwinModeProcessEvent(
xEvent *xe)
{
switch (xe->u.u.type) {
case kXDarwinShow:
case kXDarwinActivate:
QuartzShow(xe->u.keyButtonPointer.rootX,
xe->u.keyButtonPointer.rootY);
AppleWMSendEvent(AppleWMActivationNotify,
AppleWMActivationNotifyMask,
AppleWMIsActive, 0);
break;
case kXDarwinHide:
case kXDarwinDeactivate:
AppleWMSendEvent(AppleWMActivationNotify,
AppleWMActivationNotifyMask,
AppleWMIsInactive, 0);
QuartzHide();
break;
@@ -276,18 +303,42 @@ void QuartzProcessEvent(
QuartzWritePasteboard();
break;
/*
* AppleWM events
*/
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:
// FIXME: Not implemented yet
break;
default:
ErrorF("Unknown application defined event.\n");
ErrorF("Unknown application defined event type %d.\n",
xe->u.u.type);
}
}
/*
* QuartzGiveUp
* DarwinModeGiveUp
* Cleanup before X server shutdown
* Release the screen and restore the Aqua cursor.
*/
void QuartzGiveUp(void)
void DarwinModeGiveUp(void)
{
#if 0
// Trying to switch cursors when quitting causes deadlock
@@ -301,5 +352,5 @@ void QuartzGiveUp(void)
#endif
if (!quartzRootless)
QuartzFSRelease();
quartzProcs->ReleaseScreens();
}