|
Carlos Lopez |
a09598 |
//
|
|
Carlos Lopez |
a09598 |
// quartzServer.c
|
|
Carlos Lopez |
a09598 |
//
|
|
Carlos Lopez |
a09598 |
// This class handles the interaction between CG and the X server thread
|
|
Carlos Lopez |
a09598 |
//
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2001 Andreas Monitzer. All Rights Reserved.
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2002 Torrey T. Lyons. All Rights Reserved.
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2002 Apple Software, Inc. All Rights Reserved.
|
|
Carlos Lopez |
a09598 |
* Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
Carlos Lopez |
a09598 |
* copy of this software and associated documentation files (the
|
|
Carlos Lopez |
a09598 |
* "Software"), to deal in the Software without restriction, including
|
|
Carlos Lopez |
a09598 |
* without limitation the rights to use, copy, modify, merge, publish,
|
|
Carlos Lopez |
a09598 |
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
Carlos Lopez |
a09598 |
* permit persons to whom the Software is furnished to do so, subject to
|
|
Carlos Lopez |
a09598 |
* the following conditions:
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* The above copyright notice and this permission notice shall be included
|
|
Carlos Lopez |
a09598 |
* in all copies or substantial portions of the Software.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
Carlos Lopez |
a09598 |
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Carlos Lopez |
a09598 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
Carlos Lopez |
a09598 |
* IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
|
|
Carlos Lopez |
a09598 |
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
Carlos Lopez |
a09598 |
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
Carlos Lopez |
a09598 |
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* Except as contained in this notice, the name(s) of the above copyright
|
|
Carlos Lopez |
a09598 |
* holders shall not be used in advertising or otherwise to promote the
|
|
Carlos Lopez |
a09598 |
* sale, use or other dealings in this Software without prior written
|
|
Carlos Lopez |
a09598 |
* authorization.
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/XServer.m,v 1.3 2002/07/15 18:57:44 torrey Exp $ */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#include "quartz.h"
|
|
Carlos Lopez |
a09598 |
#include "Xplugin.h"
|
|
Carlos Lopez |
a09598 |
#include "X11Controller.h"
|
|
Carlos Lopez |
a09598 |
#define _APPLEDRI_SERVER_
|
|
Carlos Lopez |
a09598 |
#include "appledri.h"
|
|
Carlos Lopez |
a09598 |
#include "dri-surface.h"
|
|
Carlos Lopez |
a09598 |
#include "opaque.h"
|
|
Carlos Lopez |
a09598 |
#include "globals.h"
|
|
Carlos Lopez |
a09598 |
#include <fcntl.h></fcntl.h>
|
|
Carlos Lopez |
a09598 |
#include <stdarg.h></stdarg.h>
|
|
Carlos Lopez |
a09598 |
#include <unistd.h></unistd.h>
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
char **envpGlobal; // argcGlobal and argvGlobal
|
|
Carlos Lopez |
a09598 |
// are from dix/globals.c
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
QuartzMessageMainThread (int type, int argc, ...)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xEvent xe;
|
|
Carlos Lopez |
a09598 |
INT32 *argv;
|
|
Carlos Lopez |
a09598 |
int i, max_args;
|
|
Carlos Lopez |
a09598 |
va_list args;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
memset (&xe, 0, sizeof (xe));
|
|
Carlos Lopez |
a09598 |
xe.u.u.type = ClientMessage;
|
|
Carlos Lopez |
a09598 |
xe.u.clientMessage.u.l.type = type;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
argv = &xe.u.clientMessage.u.l.longs0;
|
|
Carlos Lopez |
a09598 |
max_args = 4;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (argc > 0 && argc <= max_args)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
va_start (args, argc);
|
|
Carlos Lopez |
a09598 |
for (i = 0; i < argc; i++)
|
|
Carlos Lopez |
a09598 |
argv[i] = (int) va_arg (args, int);
|
|
Carlos Lopez |
a09598 |
va_end (args);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DarwinEnqueueEvent (&xe);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static void
|
|
Carlos Lopez |
a09598 |
event_handler (unsigned int type, const void *arg,
|
|
Carlos Lopez |
a09598 |
unsigned int arg_size, void *data)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
switch (type)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
case XP_EVENT_DISPLAY_CHANGED:
|
|
Carlos Lopez |
a09598 |
QuartzMessageMainThread (kXquartzDisplayChanged, 0);
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case XP_EVENT_WINDOW_STATE_CHANGED:
|
|
Carlos Lopez |
a09598 |
if (arg_size >= sizeof (xp_window_state_event))
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
const xp_window_state_event *ws_arg = arg;
|
|
Carlos Lopez |
a09598 |
QuartzMessageMainThread (kXquartzWindowState, 2,
|
|
Carlos Lopez |
a09598 |
ws_arg->id, ws_arg->state);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case XP_EVENT_WINDOW_MOVED:
|
|
Carlos Lopez |
a09598 |
if (arg_size == sizeof (xp_window_id))
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xp_window_id id = * (xp_window_id *) arg;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
QuartzMessageMainThread (kXquartzWindowMoved, 1, id);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
case XP_EVENT_SURFACE_DESTROYED:
|
|
Carlos Lopez |
a09598 |
case XP_EVENT_SURFACE_CHANGED:
|
|
Carlos Lopez |
a09598 |
if (arg_size == sizeof (xp_surface_id))
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
int kind;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (type == XP_EVENT_SURFACE_DESTROYED)
|
|
Carlos Lopez |
a09598 |
kind = AppleDRISurfaceNotifyDestroyed;
|
|
Carlos Lopez |
a09598 |
else
|
|
Carlos Lopez |
a09598 |
kind = AppleDRISurfaceNotifyChanged;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DRISurfaceNotify (*(xp_surface_id *) arg, kind);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
break;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static void
|
|
Carlos Lopez |
a09598 |
server_thread (void *arg)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
extern int main (int argc, char **argv, char **envp);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Xinerama defaults to enabled */
|
|
Carlos Lopez |
a09598 |
noPanoramiXExtension = FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (xp_init (XP_BACKGROUND_EVENTS | quartzXpluginOptions) != Success)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
fprintf (stderr, "can't initialize window system\n");
|
|
Carlos Lopez |
a09598 |
exit (1);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xp_select_events (XP_EVENT_DISPLAY_CHANGED
|
|
Carlos Lopez |
a09598 |
| XP_EVENT_WINDOW_STATE_CHANGED
|
|
Carlos Lopez |
a09598 |
| XP_EVENT_WINDOW_MOVED
|
|
Carlos Lopez |
a09598 |
| XP_EVENT_SURFACE_CHANGED
|
|
Carlos Lopez |
a09598 |
| XP_EVENT_SURFACE_DESTROYED,
|
|
Carlos Lopez |
a09598 |
event_handler, NULL);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
exit (main (argcGlobal, argvGlobal, envpGlobal));
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* DarwinHandleGUI
|
|
Carlos Lopez |
a09598 |
* This function is called first from main(). We use it to connect to
|
|
Carlos Lopez |
a09598 |
* the cg window server and spawn the the thread that will listen for
|
|
Carlos Lopez |
a09598 |
* cg events
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
void DarwinHandleGUI(
|
|
Carlos Lopez |
a09598 |
int argc,
|
|
Carlos Lopez |
a09598 |
char *argv[],
|
|
Carlos Lopez |
a09598 |
char *envp[] )
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
static Bool here_before;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
extern void _InitHLTB (void);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (here_before)
|
|
Carlos Lopez |
a09598 |
return;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
here_before = TRUE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DarwinInputPreInit ();
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
// Store command line arguments to pass back to main()
|
|
Carlos Lopez |
a09598 |
argcGlobal = argc;
|
|
Carlos Lopez |
a09598 |
argvGlobal = argv;
|
|
Carlos Lopez |
a09598 |
envpGlobal = envp;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Initially I ran the X server on the main thread, and received
|
|
Carlos Lopez |
a09598 |
events on the second thread. But now we may be using Carbon,
|
|
Carlos Lopez |
a09598 |
that needs to run on the main thread. (Otherwise, when it's
|
|
Carlos Lopez |
a09598 |
prebound, it will initialize itself on the wrong thread)
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
grr.. but doing that means that if the X thread gets scheduled
|
|
Carlos Lopez |
a09598 |
before the main thread when we're _not_ prebound, things fail,
|
|
Carlos Lopez |
a09598 |
so initialize by hand. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
_InitHLTB ();
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
X11ControllerMain (argc, argv, server_thread, NULL);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* not reached */
|
|
Carlos Lopez |
a09598 |
exit (1);
|
|
Carlos Lopez |
a09598 |
}
|