Blame synfig-osx/launcher/quartz-server.c

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
}