Blame synfig-osx/launcher/darwin.c

Carlos Lopez a09598
/**************************************************************
Carlos Lopez a09598
 *
Carlos Lopez a09598
 * Shared code for the Darwin X Server
Carlos Lopez a09598
 * running with Quartz or the IOKit
Carlos Lopez a09598
 *
Carlos Lopez a09598
 **************************************************************/
Carlos Lopez a09598
/*
Carlos Lopez a09598
 * Copyright (c) 2001-2002 Torrey T. Lyons. 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 "Software"),
Carlos Lopez a09598
 * to deal in the Software without restriction, including without limitation
Carlos Lopez a09598
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Carlos Lopez a09598
 * and/or sell copies of the Software, and to permit persons to whom the
Carlos Lopez a09598
 * Software is furnished to do so, subject to the following conditions:
Carlos Lopez a09598
 *
Carlos Lopez a09598
 * The above copyright notice and this permission notice shall be included in
Carlos Lopez a09598
 * 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 OR
Carlos Lopez a09598
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Carlos Lopez a09598
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
Carlos Lopez a09598
 * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
Carlos Lopez a09598
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Carlos Lopez a09598
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Carlos Lopez a09598
 * 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 sale,
Carlos Lopez a09598
 * use or other dealings in this Software without prior written authorization.
Carlos Lopez a09598
 */
Carlos Lopez a09598
/* $XFree86: xc/programs/Xserver/hw/darwin/darwin.c,v 1.45 2002/03/28 02:21:08 torrey Exp $ */
Carlos Lopez a09598
Carlos Lopez a09598
#include <coregraphics coregraphics.h=""></coregraphics>
Carlos Lopez a09598
Carlos Lopez a09598
#include "X.h"
Carlos Lopez a09598
#include "Xproto.h"
Carlos Lopez a09598
#include "os.h"
Carlos Lopez a09598
#include "servermd.h"
Carlos Lopez a09598
#include "inputstr.h"
Carlos Lopez a09598
#include "scrnintstr.h"
Carlos Lopez a09598
#include "mibstore.h"		// mi backing store implementation
Carlos Lopez a09598
#include "mipointer.h"		// mi software cursor
Carlos Lopez a09598
#include "micmap.h"		// mi colormap code
Carlos Lopez a09598
#include "fb.h"			// fb framebuffer code
Carlos Lopez a09598
#include "site.h"
Carlos Lopez a09598
#include "globals.h"
Carlos Lopez a09598
#include "xf86Version.h"
Carlos Lopez a09598
#include "dix.h"
Carlos Lopez a09598
#include "dri-surface.h"
Carlos Lopez a09598
#define _APPLEDRI_SERVER_
Carlos Lopez a09598
#include "appledristr.h"
Carlos Lopez a09598
Carlos Lopez a09598
#include <sys types.h=""></sys>
Carlos Lopez a09598
#include <sys time.h=""></sys>
Carlos Lopez a09598
#include <sys syslimits.h=""></sys>
Carlos Lopez a09598
#include <stdio.h></stdio.h>
Carlos Lopez a09598
#include <fcntl.h></fcntl.h>
Carlos Lopez a09598
#include <unistd.h></unistd.h>
Carlos Lopez a09598
#include <dirent.h></dirent.h>
Carlos Lopez a09598
Carlos Lopez a09598
#define NO_CFPLUGIN
Carlos Lopez a09598
#include <iokit iokitlib.h=""></iokit>
Carlos Lopez a09598
#include <iokit hidsystem="" iohidlib.h=""></iokit>
Carlos Lopez a09598
#include <iokit ev_keymap.h="" hidsystem=""></iokit>
Carlos Lopez a09598
Carlos Lopez a09598
#include "darwin.h"
Carlos Lopez a09598
#include "quartz.h"
Carlos Lopez a09598
#include "rootless-common.h"
Carlos Lopez a09598
#include "pseudoramiX.h"
Carlos Lopez a09598
#include "X11Application.h"
Carlos Lopez a09598
Carlos Lopez a09598
/* Fake button press/release for scroll wheel move. */
Carlos Lopez a09598
#define SCROLLWHEELUPFAKE	4
Carlos Lopez a09598
#define SCROLLWHEELDOWNFAKE	5
Carlos Lopez a09598
Carlos Lopez a09598
/* X server shared global variables */
Carlos Lopez a09598
int darwinScreensFound = 0;
Carlos Lopez a09598
int darwinScreenIndex = 0;
Carlos Lopez a09598
int darwinFakeButtons = 1;
Carlos Lopez a09598
Bool darwinSwapAltMeta = FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
/* location of X11's (0,0) point in global screen coordinates */
Carlos Lopez a09598
int darwinMainScreenX = 0;
Carlos Lopez a09598
int darwinMainScreenY = 0;
Carlos Lopez a09598
Carlos Lopez a09598
/* parameters read from the command line or user preferences */
Carlos Lopez a09598
char *darwinKeymapFile;
Carlos Lopez a09598
Bool darwinSyncKeymap = TRUE;
Carlos Lopez a09598
Carlos Lopez a09598
/* modifier masks for faking mouse buttons */
Carlos Lopez a09598
static int darwinFakeMouse2Mask = Mod1Mask;	/* option */
Carlos Lopez a09598
static int darwinFakeMouse3Mask = Mod2Mask;	/* command */
Carlos Lopez a09598
Carlos Lopez a09598
static DeviceIntPtr darwinPointer;
Carlos Lopez a09598
static DeviceIntPtr darwinKeyboard;
Carlos Lopez a09598
Carlos Lopez a09598
/* Track our view of the keyboard state. Everything we sent to dix will
Carlos Lopez a09598
   be represented here until released. */
Carlos Lopez a09598
static CARD8 keysDown[DOWN_LENGTH];
Carlos Lopez a09598
static int lockMods;
Carlos Lopez a09598
Carlos Lopez a09598
#define SetBit(ptr,bit) \
Carlos Lopez a09598
    do {((BYTE *) ptr)[(bit) >> 3] |= (1 << ((bit) & 7));} while (0)
Carlos Lopez a09598
Carlos Lopez a09598
#define ClearBit(ptr,bit) \
Carlos Lopez a09598
    do {((BYTE *) ptr)[(bit) >> 3] &= ~(1 << ((bit) & 7));} while (0)
Carlos Lopez a09598
Carlos Lopez a09598
/* Common pixmap formats */
Carlos Lopez a09598
static PixmapFormatRec formats[] = {
Carlos Lopez a09598
        { 1,    1,      BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 4,    8,      BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 8,    8,      BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 15,   16,     BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 16,   16,     BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 24,   32,     BITMAP_SCANLINE_PAD },
Carlos Lopez a09598
        { 32,   32,     BITMAP_SCANLINE_PAD }
Carlos Lopez a09598
};
Carlos Lopez a09598
const int NUMFORMATS = sizeof(formats)/sizeof(formats[0]);
Carlos Lopez a09598
Carlos Lopez a09598
#ifndef OSNAME
Carlos Lopez a09598
#define OSNAME " Mac OS X"
Carlos Lopez a09598
#endif
Carlos Lopez a09598
#ifndef OSVENDOR
Carlos Lopez a09598
#define OSVENDOR " Apple"
Carlos Lopez a09598
#endif
Carlos Lopez a09598
#ifndef PRE_RELEASE
Carlos Lopez a09598
#define PRE_RELEASE XF86_VERSION_SNAP
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
extern void AppleDRIExtensionInit(void);
Carlos Lopez a09598
extern void AppleWMExtensionInit(void);
Carlos Lopez a09598
Carlos Lopez a09598
static void
Carlos Lopez a09598
DarwinPrintBanner (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
  ErrorF("\nXFree86 Version %d.%d.%d", XF86_VERSION_MAJOR, XF86_VERSION_MINOR,
Carlos Lopez a09598
                                    XF86_VERSION_PATCH);
Carlos Lopez a09598
#if XF86_VERSION_SNAP > 0
Carlos Lopez a09598
  ErrorF(".%d", XF86_VERSION_SNAP);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#if XF86_VERSION_SNAP >= 900
Carlos Lopez a09598
  ErrorF(" (%d.%d.0 RC %d)", XF86_VERSION_MAJOR, XF86_VERSION_MINOR + 1,
Carlos Lopez a09598
				XF86_VERSION_SNAP - 900);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef XF86_CUSTOM_VERSION
Carlos Lopez a09598
  ErrorF(" (%s)", XF86_CUSTOM_VERSION);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
  ErrorF(" / X Window System\n");
Carlos Lopez a09598
  ErrorF("(protocol Version %d, revision %d, vendor release %d)\n",
Carlos Lopez a09598
         X_PROTOCOL, X_PROTOCOL_REVISION, VENDOR_RELEASE );
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* X screensaver support. Not implemented. */
Carlos Lopez a09598
static Bool
Carlos Lopez a09598
DarwinSaveScreen (ScreenPtr pScreen, int on)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* This is a callback from dix during AddScreen() from InitOutput().
Carlos Lopez a09598
   Initialize the screen and communicate information about it back to dix. */
Carlos Lopez a09598
static Bool
Carlos Lopez a09598
DarwinAddScreen (int index, ScreenPtr pScreen, int argc, char **argv)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int         i, dpi;
Carlos Lopez a09598
    static int  foundIndex = 0;
Carlos Lopez a09598
    Bool        ret;
Carlos Lopez a09598
    VisualPtr   visual;
Carlos Lopez a09598
    DarwinFramebufferPtr dfb;
Carlos Lopez a09598
Carlos Lopez a09598
    /* reset index of found screens for each server generation */
Carlos Lopez a09598
    if (index == 0)
Carlos Lopez a09598
	foundIndex = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    /* allocate space for private per screen storage */
Carlos Lopez a09598
    dfb = xalloc (sizeof (DarwinFramebufferRec));
Carlos Lopez a09598
    SCREEN_PRIV(pScreen) = dfb;
Carlos Lopez a09598
Carlos Lopez a09598
    /* setup hardware/mode specific details */
Carlos Lopez a09598
    ret = QuartzAddScreen (foundIndex, pScreen);
Carlos Lopez a09598
    foundIndex++;
Carlos Lopez a09598
    if (!ret)
Carlos Lopez a09598
        return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    /* reset the visual list */
Carlos Lopez a09598
    miClearVisualTypes();
Carlos Lopez a09598
Carlos Lopez a09598
    /* setup a single visual appropriate for our pixel type. Note: we use
Carlos Lopez a09598
       TrueColor, not DirectColor */
Carlos Lopez a09598
    if (dfb->componentCount != 1)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	if (!miSetVisualTypes (dfb->colorBitsPerPixel, TrueColorMask,
Carlos Lopez a09598
			       dfb->bitsPerComponent, TrueColor))
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
#ifdef ENABLE_PSEUDOCOLOR
Carlos Lopez a09598
	/* FIXME: currently we can't handle pseudocolor windows
Carlos Lopez a09598
	   inside truecolor top-level windows, so disable this. */
Carlos Lopez a09598
	if (!miSetVisualTypes (8, PseudoColorMask, 8, PseudoColor))
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else
Carlos Lopez a09598
    {
Carlos Lopez a09598
	if (!miSetVisualTypes (8, PseudoColorMask, 8, PseudoColor))
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* create the common 8 bit PseudoColor visual; do this last to prevent
Carlos Lopez a09598
       it becoming the root visual. */
Carlos Lopez a09598
Carlos Lopez a09598
    miSetPixmapDepths();
Carlos Lopez a09598
Carlos Lopez a09598
    /* Machine independent screen init */
Carlos Lopez a09598
    if (monitorResolution)
Carlos Lopez a09598
        dpi = monitorResolution;
Carlos Lopez a09598
    else
Carlos Lopez a09598
        dpi = 75;
Carlos Lopez a09598
Carlos Lopez a09598
    /* initialize fb */
Carlos Lopez a09598
    if (!fbScreenInit (pScreen, dfb->framebuffer, dfb->width,
Carlos Lopez a09598
		       dfb->height, dpi, dpi,
Carlos Lopez a09598
		       dfb->pitch/(dfb->bitsPerPixel/8), dfb->bitsPerPixel))
Carlos Lopez a09598
    {
Carlos Lopez a09598
        return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* set the RGB order correctly for TrueColor */
Carlos Lopez a09598
    if (dfb->bitsPerPixel > 8)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	int bitsPerRGB = dfb->bitsPerComponent;
Carlos Lopez a09598
Carlos Lopez a09598
        for (i = 0, visual = pScreen->visuals;
Carlos Lopez a09598
            i < pScreen->numVisuals; i++, visual++)
Carlos Lopez a09598
	{
Carlos Lopez a09598
            if (visual->class == TrueColor) {
Carlos Lopez a09598
                visual->offsetRed = bitsPerRGB * 2;
Carlos Lopez a09598
                visual->offsetGreen = bitsPerRGB;
Carlos Lopez a09598
                visual->offsetBlue = 0;
Carlos Lopez a09598
                visual->redMask = ((1<<bitsperrgb)-1) <<="" visual-="">offsetRed;</bitsperrgb)-1)>
Carlos Lopez a09598
                visual->greenMask = ((1<<bitsperrgb)-1) <<="" visual-="">offsetGreen;</bitsperrgb)-1)>
Carlos Lopez a09598
                visual->blueMask = ((1<<bitsperrgb)-1) <<="" visual-="">offsetBlue;</bitsperrgb)-1)>
Carlos Lopez a09598
            }
Carlos Lopez a09598
        }
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef RENDER
Carlos Lopez a09598
    if (! fbPictureInit (pScreen, 0, 0))
Carlos Lopez a09598
        return FALSE;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef MITSHM
Carlos Lopez a09598
    ShmRegisterFbFuncs (pScreen);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
    /* this must be initialized (why doesn't X have a default?) */
Carlos Lopez a09598
    pScreen->SaveScreen = DarwinSaveScreen;
Carlos Lopez a09598
Carlos Lopez a09598
    /* finish mode dependent screen setup including cursor support */
Carlos Lopez a09598
    if (!QuartzSetupScreen (index, pScreen))
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    /* create and install the default colormap and set black / white pixels */
Carlos Lopez a09598
    if (!miCreateDefColormap (pScreen))
Carlos Lopez a09598
        return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    dixScreenOrigins[index].x = dfb->x;
Carlos Lopez a09598
    dixScreenOrigins[index].y = dfb->y;
Carlos Lopez a09598
Carlos Lopez a09598
    ErrorF("Screen %d added: %dx%d @ (%d,%d)\n",
Carlos Lopez a09598
            index, dfb->width, dfb->height, dfb->x, dfb->y);
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Search for a file in the standard Library paths, which are (in order):
Carlos Lopez a09598
Carlos Lopez a09598
      ~/Library/              user specific
Carlos Lopez a09598
      /Library/               host specific
Carlos Lopez a09598
      /Network/Library/       LAN specific
Carlos Lopez a09598
      /System/Library/        OS specific
Carlos Lopez a09598
Carlos Lopez a09598
   A sub-path can be specified to search in below the various Library
Carlos Lopez a09598
   directories. Returns a new character string (owned by the caller)
Carlos Lopez a09598
   containing the full path to the first file found. */
Carlos Lopez a09598
Carlos Lopez a09598
/* Library search paths */
Carlos Lopez a09598
static const char *libraryPathList[] = {
Carlos Lopez a09598
    "",
Carlos Lopez a09598
    "/Network",
Carlos Lopez a09598
    "/System",
Carlos Lopez a09598
    NULL
Carlos Lopez a09598
};
Carlos Lopez a09598
Carlos Lopez a09598
char *
Carlos Lopez a09598
DarwinFindLibraryFile (const char *file, const char *pathext)
Carlos Lopez a09598
{
Carlos Lopez a09598
    char *home;
Carlos Lopez a09598
    char *fullPath;
Carlos Lopez a09598
    int i = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    // Return the file name as is if it is already a fully qualified path.
Carlos Lopez a09598
    if (!access(file, F_OK)) {
Carlos Lopez a09598
        fullPath = xalloc(strlen(file)+1);
Carlos Lopez a09598
        strcpy(fullPath, file);
Carlos Lopez a09598
        return fullPath;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    fullPath = xalloc(PATH_MAX);
Carlos Lopez a09598
Carlos Lopez a09598
    home = getenv("HOME");
Carlos Lopez a09598
    if (home) {
Carlos Lopez a09598
        snprintf(fullPath, PATH_MAX, "%s/Library/%s/%s", home, pathext, file);
Carlos Lopez a09598
        if (!access(fullPath, F_OK))
Carlos Lopez a09598
            return fullPath;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    while (libraryPathList[i]) {
Carlos Lopez a09598
        snprintf(fullPath, PATH_MAX, "%s/Library/%s/%s", libraryPathList[i++],
Carlos Lopez a09598
                 pathext, file);
Carlos Lopez a09598
        if (!access(fullPath, F_OK))
Carlos Lopez a09598
            return fullPath;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    xfree(fullPath);
Carlos Lopez a09598
    return NULL;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Press or release the given key, specified by NX keycode. xe must already
Carlos Lopez a09598
   have event time and mouse location filled in. pressed is KeyPress or
Carlos Lopez a09598
   KeyRelease. keycode is NX keycode without MIN_KEYCODE adjustment. */
Carlos Lopez a09598
static inline void
Carlos Lopez a09598
DarwinPressKeycode (xEvent *xe, int pressed, int keycode)
Carlos Lopez a09598
{
Carlos Lopez a09598
    if (pressed == KeyRelease && !BitIsOn (keysDown, keycode + MIN_KEYCODE))
Carlos Lopez a09598
    {
Carlos Lopez a09598
	/* Don't release keys that aren't pressed. It generates extra
Carlos Lopez a09598
	   KeyPress events instead of just discarding them. */
Carlos Lopez a09598
Carlos Lopez a09598
	return;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pressed == KeyPress)
Carlos Lopez a09598
	SetBit (keysDown, keycode + MIN_KEYCODE);
Carlos Lopez a09598
    else
Carlos Lopez a09598
	ClearBit (keysDown, keycode + MIN_KEYCODE);
Carlos Lopez a09598
Carlos Lopez a09598
    xe->u.u.type = pressed;
Carlos Lopez a09598
    xe->u.u.detail = keycode + MIN_KEYCODE;
Carlos Lopez a09598
    (darwinKeyboard->public.processInputProc) (xe, darwinKeyboard, 1);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Ensure that X's idea of what modifiers are down matches the real
Carlos Lopez a09598
   window server's. Do this by looking at what keys we previously sent
Carlos Lopez a09598
   X and deciding if they need to be released/toggled yet to make FLAGS
Carlos Lopez a09598
   become X's current modifier state. */
Carlos Lopez a09598
static void
Carlos Lopez a09598
DarwinUpdateModifiers (xEvent xe, unsigned int flags)
Carlos Lopez a09598
{
Carlos Lopez a09598
    static const struct {int mask; int nxkey;} pairs[] = {
Carlos Lopez a09598
	{ShiftMask, NX_MODIFIERKEY_SHIFT},
Carlos Lopez a09598
	{ControlMask, NX_MODIFIERKEY_CONTROL},
Carlos Lopez a09598
	{Mod1Mask, NX_MODIFIERKEY_ALTERNATE},
Carlos Lopez a09598
	{Mod2Mask, NX_MODIFIERKEY_COMMAND},
Carlos Lopez a09598
	{Mod3Mask, NX_MODIFIERKEY_SECONDARYFN}
Carlos Lopez a09598
    };
Carlos Lopez a09598
Carlos Lopez a09598
    int i, keycode;
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < (int) (sizeof (pairs) / sizeof (pairs[0])); i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	keycode = DarwinModifierNXKeyToNXKeycode (pairs[i].nxkey, 0);
Carlos Lopez a09598
Carlos Lopez a09598
	if (keycode == 0)
Carlos Lopez a09598
	    continue;
Carlos Lopez a09598
Carlos Lopez a09598
	/* For each known modifier, sync up the state of the key X thinks
Carlos Lopez a09598
	   it's bound to and the real value of the flag. */
Carlos Lopez a09598
Carlos Lopez a09598
	if ((flags & pairs[i].mask)
Carlos Lopez a09598
	    && !BitIsOn (keysDown, keycode + MIN_KEYCODE))
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, KeyPress, keycode);
Carlos Lopez a09598
	}
Carlos Lopez a09598
	else if (!(flags & pairs[i].mask)
Carlos Lopez a09598
		 && BitIsOn (keysDown, keycode + MIN_KEYCODE))
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, KeyRelease, keycode);
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* Do the same for Lock, but need both press and release to toggle it. */
Carlos Lopez a09598
Carlos Lopez a09598
    if ((flags ^ lockMods) & LockMask)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	keycode = DarwinModifierNXKeyToNXKeycode (NX_MODIFIERKEY_ALPHALOCK, 0);
Carlos Lopez a09598
Carlos Lopez a09598
	if (keycode != 0)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, KeyPress, keycode);
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, KeyRelease, keycode);
Carlos Lopez a09598
Carlos Lopez a09598
	    lockMods ^= LockMask;
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Release all non-modifier keys that we think are currently pressed.
Carlos Lopez a09598
   Usually this is done when X becomes inactive to avoid leaving keys
Carlos Lopez a09598
   stuck down when we become active again. Modifiers are handled separately
Carlos Lopez a09598
   in the function above. */
Carlos Lopez a09598
static void
Carlos Lopez a09598
DarwinReleaseKeys (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    KeyClassPtr keyc = darwinKeyboard->key;
Carlos Lopez a09598
    xEvent xe;
Carlos Lopez a09598
    int i, x, y;
Carlos Lopez a09598
Carlos Lopez a09598
    memset (&xe, 0, sizeof (xe));
Carlos Lopez a09598
    xe.u.keyButtonPointer.time = GetTimeInMillis ();
Carlos Lopez a09598
    xe.u.keyButtonPointer.state = darwinKeyboard->key->state;
Carlos Lopez a09598
    GetSpritePosition (&x, &y);
Carlos Lopez a09598
    xe.u.keyButtonPointer.rootX = x;
Carlos Lopez a09598
    xe.u.keyButtonPointer.rootY = y;
Carlos Lopez a09598
    
Carlos Lopez a09598
    for (i = 0; i < DOWN_LENGTH * 8; i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	if (!keyc->modifierMap[i] && BitIsOn (keysDown, i))
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, KeyRelease, i - MIN_KEYCODE);
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
parseModifierString (const char *str)
Carlos Lopez a09598
{
Carlos Lopez a09598
    if (strcasecmp (str, "shift") == 0)
Carlos Lopez a09598
	return ShiftMask;
Carlos Lopez a09598
    else if (strcasecmp (str, "control") == 0)
Carlos Lopez a09598
	return ControlMask;
Carlos Lopez a09598
    else if (strcasecmp (str, "option") == 0)
Carlos Lopez a09598
	return Mod1Mask;
Carlos Lopez a09598
    else if (strcasecmp (str, "command") == 0)
Carlos Lopez a09598
	return Mod2Mask;
Carlos Lopez a09598
    else if (strcasecmp (str, "fn") == 0)
Carlos Lopez a09598
	return Mod3Mask;
Carlos Lopez a09598
    else
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Parse a list of modifier names and return a corresponding modifier mask */
Carlos Lopez a09598
static int
Carlos Lopez a09598
DarwinParseModifierList (const char *constmodifiers)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int result, mask;
Carlos Lopez a09598
    char *modifiers, *modifier, *p;
Carlos Lopez a09598
Carlos Lopez a09598
    if (constmodifiers == NULL
Carlos Lopez a09598
	|| strlen (constmodifiers) == 0
Carlos Lopez a09598
	|| strcasecmp (constmodifiers, "none") == 0)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    modifiers = strdup (constmodifiers);
Carlos Lopez a09598
    p = modifiers;
Carlos Lopez a09598
    result = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    while (p != NULL)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	modifier = strsep (&p, " ,+&|/"); /* allow lots of separators */
Carlos Lopez a09598
	mask = parseModifierString (modifier);
Carlos Lopez a09598
	if (mask != 0)
Carlos Lopez a09598
	    result |= mask;
Carlos Lopez a09598
	else
Carlos Lopez a09598
	    ErrorF ("fakebuttons: Unknown modifier \"%s\"\n", modifier);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    free (modifiers);
Carlos Lopez a09598
    return result;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DarwinSetFakeButtons (const char *mod2, const char *mod3)
Carlos Lopez a09598
{
Carlos Lopez a09598
    if (mod2 != NULL)
Carlos Lopez a09598
	darwinFakeMouse2Mask = DarwinParseModifierList (mod2);
Carlos Lopez a09598
    if (mod3 != NULL)
Carlos Lopez a09598
	darwinFakeMouse3Mask = DarwinParseModifierList (mod3);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Read and process events from the event pipe until it is empty. */
Carlos Lopez a09598
void
Carlos Lopez a09598
ProcessInputEvents (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    static int here_before = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    /* last known modifier state */
Carlos Lopez a09598
    static unsigned int current_flags = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    /* button number and modifier mask of currently pressed fake button */
Carlos Lopez a09598
    static int fake_button;
Carlos Lopez a09598
    static unsigned int fake_button_mask, fake_button_modifier;
Carlos Lopez a09598
Carlos Lopez a09598
    xEvent xe;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!here_before)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	X11ApplicationServerReady ();
Carlos Lopez a09598
	here_before = TRUE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    while (DarwinDequeueEvent (&xe))
Carlos Lopez a09598
    {
Carlos Lopez a09598
	unsigned int real_state;
Carlos Lopez a09598
Carlos Lopez a09598
	real_state = xe.u.keyButtonPointer.state;
Carlos Lopez a09598
	xe.u.keyButtonPointer.state |= fake_button_modifier;
Carlos Lopez a09598
Carlos Lopez a09598
	/* Filter event for faked mouse button presses. */
Carlos Lopez a09598
	if (darwinFakeButtons)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    switch (xe.u.u.type)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
	    case ButtonPress:
Carlos Lopez a09598
		if (xe.u.u.detail != 1)
Carlos Lopez a09598
		    break;
Carlos Lopez a09598
		if ((xe.u.keyButtonPointer.state & darwinFakeMouse2Mask)
Carlos Lopez a09598
		    == darwinFakeMouse2Mask)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    fake_button = 2;
Carlos Lopez a09598
		    fake_button_modifier = Button2Mask;
Carlos Lopez a09598
		    fake_button_mask = darwinFakeMouse2Mask;
Carlos Lopez a09598
		    xe.u.u.detail = 2;
Carlos Lopez a09598
		}
Carlos Lopez a09598
		else if ((xe.u.keyButtonPointer.state & darwinFakeMouse3Mask)
Carlos Lopez a09598
			 == darwinFakeMouse3Mask)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    fake_button = 3;
Carlos Lopez a09598
		    fake_button_modifier = Button3Mask;
Carlos Lopez a09598
		    fake_button_mask = darwinFakeMouse3Mask;
Carlos Lopez a09598
		    xe.u.u.detail = 3;
Carlos Lopez a09598
		}
Carlos Lopez a09598
		break;
Carlos Lopez a09598
Carlos Lopez a09598
	    case ButtonRelease:
Carlos Lopez a09598
		if (fake_button != 0 && xe.u.u.detail == 1)
Carlos Lopez a09598
		    xe.u.u.detail = fake_button;
Carlos Lopez a09598
		break;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	xe.u.keyButtonPointer.state &= ~fake_button_mask;
Carlos Lopez a09598
Carlos Lopez a09598
	switch (xe.u.u.type)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	case 0: /* flags-changed */
Carlos Lopez a09598
	case KeyPress:
Carlos Lopez a09598
	    if (current_flags == 0
Carlos Lopez a09598
		&& darwinSyncKeymap && darwinKeymapFile == NULL)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		/* See if keymap has changed. */
Carlos Lopez a09598
Carlos Lopez a09598
		static unsigned int last_seed;
Carlos Lopez a09598
		unsigned int this_seed;
Carlos Lopez a09598
Carlos Lopez a09598
		this_seed = DarwinSystemKeymapSeed ();
Carlos Lopez a09598
		if (this_seed != last_seed)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    last_seed = this_seed;
Carlos Lopez a09598
		    DarwinKeyboardReload (darwinKeyboard);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	    /* fall through */
Carlos Lopez a09598
Carlos Lopez a09598
	case KeyRelease:
Carlos Lopez a09598
	case ButtonPress:
Carlos Lopez a09598
	case ButtonRelease:
Carlos Lopez a09598
	case MotionNotify:
Carlos Lopez a09598
Carlos Lopez a09598
	    /* Initialize time field. */
Carlos Lopez a09598
Carlos Lopez a09598
	    xe.u.keyButtonPointer.time = GetTimeInMillis ();
Carlos Lopez a09598
Carlos Lopez a09598
	    /* Update X's idea of what modifiers are set. */
Carlos Lopez a09598
Carlos Lopez a09598
	    if (xe.u.keyButtonPointer.state != 0xffff
Carlos Lopez a09598
		&& current_flags != xe.u.keyButtonPointer.state)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		current_flags = xe.u.keyButtonPointer.state;
Carlos Lopez a09598
		DarwinUpdateModifiers (xe, current_flags);
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
        switch (xe.u.u.type)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	case 0:
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
Carlos Lopez a09598
	case MotionNotify:
Carlos Lopez a09598
	    if (!quartzServerVisible)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		xp_window_id wid;
Carlos Lopez a09598
Carlos Lopez a09598
		/* Sigh. Need to check that we're really over one of
Carlos Lopez a09598
		   our windows. (We need to receive pointer events while
Carlos Lopez a09598
		   not in the foreground, and the only way to do that
Carlos Lopez a09598
		   right now is to ask for _all_ pointer events..) */
Carlos Lopez a09598
Carlos Lopez a09598
		wid = 0;
Carlos Lopez a09598
		xp_find_window (xe.u.keyButtonPointer.rootX,
Carlos Lopez a09598
				xe.u.keyButtonPointer.rootY, 0, &wid);
Carlos Lopez a09598
		if (wid == 0)
Carlos Lopez a09598
		    break;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* Shift from global screen coordinates to coordinates
Carlos Lopez a09598
	       relative to the origin of the current screen. */
Carlos Lopez a09598
Carlos Lopez a09598
	    xe.u.keyButtonPointer.rootX -= darwinMainScreenX -
Carlos Lopez a09598
		    dixScreenOrigins[miPointerCurrentScreen()->myNum].x;
Carlos Lopez a09598
	    xe.u.keyButtonPointer.rootY -= darwinMainScreenY -
Carlos Lopez a09598
		    dixScreenOrigins[miPointerCurrentScreen()->myNum].y;
Carlos Lopez a09598
Carlos Lopez a09598
	    miPointerAbsoluteCursor (xe.u.keyButtonPointer.rootX,
Carlos Lopez a09598
				     xe.u.keyButtonPointer.rootY,
Carlos Lopez a09598
				     xe.u.keyButtonPointer.time);
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
Carlos Lopez a09598
	case ButtonPress:
Carlos Lopez a09598
	case ButtonRelease:
Carlos Lopez a09598
	    darwinPointer->public.processInputProc (&xe, darwinPointer, 1);
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
Carlos Lopez a09598
	case KeyPress:
Carlos Lopez a09598
	case KeyRelease:
Carlos Lopez a09598
	    DarwinPressKeycode (&xe, xe.u.u.type, xe.u.u.detail);
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
Carlos Lopez a09598
	case ClientMessage:
Carlos Lopez a09598
	    /* Update server's current time, since we may generate
Carlos Lopez a09598
	       events, and it's nice if the timestamps are correct. */
Carlos Lopez a09598
	    currentTime.milliseconds = GetTimeInMillis ();
Carlos Lopez a09598
Carlos Lopez a09598
	    switch (xe.u.clientMessage.u.l.type)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
	    case kXdarwinQuit:
Carlos Lopez a09598
		GiveUp (0);
Carlos Lopez a09598
		break;
Carlos Lopez a09598
Carlos Lopez a09598
	    case kXquartzDeactivate:
Carlos Lopez a09598
		DarwinReleaseKeys ();
Carlos Lopez a09598
		/* fall through */
Carlos Lopez a09598
Carlos Lopez a09598
	    default:
Carlos Lopez a09598
		if (xe.u.clientMessage.u.l.type >= kXquartzFirstEvent
Carlos Lopez a09598
		    && xe.u.clientMessage.u.l.type <= kXquartzLastEvent)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    QuartzClientMessage (&xe);
Carlos Lopez a09598
		}
Carlos Lopez a09598
		else
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    ErrorF ("Unknown application defined event: %d.\n",
Carlos Lopez a09598
			    xe.u.clientMessage.u.l.longs0);
Carlos Lopez a09598
		}
Carlos Lopez a09598
		break;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
Carlos Lopez a09598
	default:
Carlos Lopez a09598
	    ErrorF("Unknown event caught: %d\n", xe.u.u.type);
Carlos Lopez a09598
	    break;
Carlos Lopez a09598
        }
Carlos Lopez a09598
Carlos Lopez a09598
	/* Filter event for faked mouse button releases. */
Carlos Lopez a09598
	if (fake_button != 0 && xe.u.u.type == ButtonRelease)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    current_flags |= (real_state & fake_button_mask);
Carlos Lopez a09598
	    DarwinUpdateModifiers (xe, current_flags);
Carlos Lopez a09598
Carlos Lopez a09598
	    fake_button = 0;
Carlos Lopez a09598
	    fake_button_modifier = 0;
Carlos Lopez a09598
	    fake_button_mask = 0;
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    miPointerUpdate ();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DarwinEnqueuePointerEvent (xEvent *xe)
Carlos Lopez a09598
{
Carlos Lopez a09598
    darwinPointer->public.processInputProc (xe, darwinPointer, 1);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Register the keyboard and mouse devices */
Carlos Lopez a09598
void
Carlos Lopez a09598
InitInput (int argc, char **argv)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DarwinInputInit ();
Carlos Lopez a09598
Carlos Lopez a09598
    darwinPointer = AddInputDevice(DarwinMouseProc, TRUE);
Carlos Lopez a09598
    RegisterPointerDevice( darwinPointer );
Carlos Lopez a09598
Carlos Lopez a09598
    darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE);
Carlos Lopez a09598
    RegisterKeyboardDevice( darwinKeyboard );
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DarwinAdjustScreenOrigins (ScreenInfo *pScreenInfo)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int i, left, top;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Shift all screens so the X11 (0, 0) coordinate is at the top
Carlos Lopez a09598
       left of the global screen coordinates.
Carlos Lopez a09598
Carlos Lopez a09598
       Screens can be arranged so the top left isn't on any screen, so
Carlos Lopez a09598
       instead use the top left of the leftmost screen as (0,0). This
Carlos Lopez a09598
       may mean some screen space is in -y, but it's better that (0,0)
Carlos Lopez a09598
       be onscreen, or else default xterms disappear. It's better that
Carlos Lopez a09598
       -y be used than -x, because when popup menus are forced
Carlos Lopez a09598
       "onscreen" by dumb window managers like twm, they'll shift the
Carlos Lopez a09598
       menus down instead of left, which still looks funny but is an
Carlos Lopez a09598
       easier target to hit. */
Carlos Lopez a09598
Carlos Lopez a09598
    left = dixScreenOrigins[0].x;
Carlos Lopez a09598
    top  = dixScreenOrigins[0].y;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Find leftmost screen. If there's a tie, take the topmost of the two. */
Carlos Lopez a09598
    for (i = 1; i < pScreenInfo->numScreens; i++) {
Carlos Lopez a09598
        if (dixScreenOrigins[i].x < left  ||
Carlos Lopez a09598
            (dixScreenOrigins[i].x == left &&
Carlos Lopez a09598
             dixScreenOrigins[i].y < top))
Carlos Lopez a09598
        {
Carlos Lopez a09598
            left = dixScreenOrigins[i].x;
Carlos Lopez a09598
            top = dixScreenOrigins[i].y;
Carlos Lopez a09598
        }
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    darwinMainScreenX = left;
Carlos Lopez a09598
    darwinMainScreenY = top;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Shift all screens so that there is a screen whose top left
Carlos Lopez a09598
       is at X11 (0,0) and at global screen coordinate
Carlos Lopez a09598
       (darwinMainScreenX, darwinMainScreenY). */
Carlos Lopez a09598
Carlos Lopez a09598
    if (darwinMainScreenX != 0 || darwinMainScreenY != 0) {
Carlos Lopez a09598
        for (i = 0; i < pScreenInfo->numScreens; i++) {
Carlos Lopez a09598
            dixScreenOrigins[i].x -= darwinMainScreenX;
Carlos Lopez a09598
            dixScreenOrigins[i].y -= darwinMainScreenY;
Carlos Lopez a09598
            ErrorF("Screen %d placed at X11 coordinate (%d,%d).\n",
Carlos Lopez a09598
                   i, dixScreenOrigins[i].x, dixScreenOrigins[i].y);
Carlos Lopez a09598
        }
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Initialize screenInfo for all actually accessible framebuffers.
Carlos Lopez a09598
Carlos Lopez a09598
   The display mode dependent code gets called three times. The mode
Carlos Lopez a09598
   specific InitOutput routines are expected to discover the number of
Carlos Lopez a09598
   potentially useful screens and cache routes to them internally.
Carlos Lopez a09598
   Inside DarwinAddScreen are two other mode specific calls. A mode
Carlos Lopez a09598
   specific AddScreen routine is called for each screen to actually
Carlos Lopez a09598
   initialize the screen with the ScreenPtr structure. After other
Carlos Lopez a09598
   screen setup has been done, a mode specific SetupScreen function can
Carlos Lopez a09598
   be called to finalize screen setup. */
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int i;
Carlos Lopez a09598
    static unsigned long generation = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
Carlos Lopez a09598
    pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
Carlos Lopez a09598
    pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
Carlos Lopez a09598
    pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
Carlos Lopez a09598
Carlos Lopez a09598
    /* List how we want common pixmap formats to be padded */
Carlos Lopez a09598
    pScreenInfo->numPixmapFormats = NUMFORMATS;
Carlos Lopez a09598
    for (i = 0; i < NUMFORMATS; i++)
Carlos Lopez a09598
        pScreenInfo->formats[i] = formats[i];
Carlos Lopez a09598
Carlos Lopez a09598
    /* Allocate private storage for each screen's Darwin specific info */
Carlos Lopez a09598
    if (generation != serverGeneration) {
Carlos Lopez a09598
        darwinScreenIndex = AllocateScreenPrivateIndex();
Carlos Lopez a09598
        generation = serverGeneration;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* Discover screens and do mode specific initialization */
Carlos Lopez a09598
    QuartzInitOutput(argc, argv);
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < darwinScreensFound; i++)
Carlos Lopez a09598
        AddScreen( DarwinAddScreen, argc, argv );
Carlos Lopez a09598
Carlos Lopez a09598
    DarwinAdjustScreenOrigins (pScreenInfo);
Carlos Lopez a09598
Carlos Lopez a09598
    PseudoramiXExtensionInit (argc, argv);
Carlos Lopez a09598
    AppleDRIExtensionInit ();
Carlos Lopez a09598
    AppleWMExtensionInit ();
Carlos Lopez a09598
Carlos Lopez a09598
    DRIExtensionInit ();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
OsVendorFatalError (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ErrorF( "   OsVendorFatalError\n" );
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
OsVendorInit (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    if (serverGeneration == 1)
Carlos Lopez a09598
        DarwinPrintBanner();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Process device-dependent command line args. Returns 0 if argument is
Carlos Lopez a09598
   not device dependent, otherwise Count of number of elements of argv
Carlos Lopez a09598
   that are part of a device dependent commandline option. */
Carlos Lopez a09598
int
Carlos Lopez a09598
ddxProcessArgument (int argc, char *argv[], int i)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int numDone;
Carlos Lopez a09598
Carlos Lopez a09598
    if ((numDone = QuartzProcessArgument( argc, argv, i )))
Carlos Lopez a09598
        return numDone;
Carlos Lopez a09598
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-fakebuttons" ) ) {
Carlos Lopez a09598
        darwinFakeButtons = TRUE;
Carlos Lopez a09598
        ErrorF( "Faking a three button mouse\n" );
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-nofakebuttons" ) ) {
Carlos Lopez a09598
        darwinFakeButtons = FALSE;
Carlos Lopez a09598
        ErrorF( "Not faking a three button mouse\n" );
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!strcmp( argv[i], "-fakemouse2" ) ) {
Carlos Lopez a09598
        if ( i == argc-1 ) {
luz.paz 7040b8
            FatalError( "-fakemouse2 must be followed by a modifier list\n" );
Carlos Lopez a09598
        }
Carlos Lopez a09598
	darwinFakeMouse2Mask = DarwinParseModifierList(argv[i+1]);
Carlos Lopez a09598
        return 2;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!strcmp( argv[i], "-fakemouse3" ) ) {
Carlos Lopez a09598
        if ( i == argc-1 ) {
luz.paz 7040b8
            FatalError( "-fakemouse3 must be followed by a modifier list\n" );
Carlos Lopez a09598
        }
Carlos Lopez a09598
	darwinFakeMouse3Mask = DarwinParseModifierList(argv[i+1]);
Carlos Lopez a09598
        return 2;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-keymap" ) ) {
Carlos Lopez a09598
        if ( i == argc-1 ) {
Carlos Lopez a09598
            FatalError( "-keymap must be followed by a filename\n" );
Carlos Lopez a09598
        }
Carlos Lopez a09598
        darwinKeymapFile = argv[i+1];
Carlos Lopez a09598
        return 2;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-nokeymap" ) ) {
Carlos Lopez a09598
        darwinKeymapFile = NULL;
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if ( !strcmp( argv[i], "+synckeymap" ) ) {
Carlos Lopez a09598
        darwinSyncKeymap = TRUE;
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-synckeymap" ) ) {
Carlos Lopez a09598
        darwinSyncKeymap = FALSE;
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (strcmp (argv[i], "-swapAltMeta") == 0) {
Carlos Lopez a09598
	darwinSwapAltMeta = TRUE;
Carlos Lopez a09598
	return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
Carlos Lopez a09598
        DarwinPrintBanner();
Carlos Lopez a09598
        exit(0);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* XDarwinStartup uses this argument to indicate the IOKit X server
Carlos Lopez a09598
       should be started. Ignore it here. */
Carlos Lopez a09598
    if ( !strcmp( argv[i], "-iokit" ) ) {
Carlos Lopez a09598
        return 1;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return 0;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Print out correct use of device dependent commandline options.
Carlos Lopez a09598
   Maybe the user now knows what really to do ... */
Carlos Lopez a09598
void
Carlos Lopez a09598
ddxUseMsg (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ErrorF("\n");
Carlos Lopez a09598
    ErrorF("\n");
Carlos Lopez a09598
    ErrorF("Device Dependent Usage:\n");
Carlos Lopez a09598
    ErrorF("\n");
Carlos Lopez a09598
    ErrorF("-depth <depth>         use <depth> bits per pixel. Options: 8, 15, 24\b\n");</depth></depth>
Carlos Lopez a09598
    ErrorF("-fakebuttons           fake a 3 button mouse with Command and Option\n");
Carlos Lopez a09598
    ErrorF("-nofakebuttons\n");
Carlos Lopez a09598
    ErrorF("-fakemouse2 <keys>     fake middle mouse button with modifier keys\n");</keys>
Carlos Lopez a09598
    ErrorF("-fakemouse3 <keys>     fake right mouse button with modifier keys\n");</keys>
Carlos Lopez a09598
    ErrorF("                         e.g.: -fakemouse2 \"option,shift\"\n");
Carlos Lopez a09598
    ErrorF("-keymap <file>         read the keymap from <file>\n");</file></file>
Carlos Lopez a09598
    ErrorF("-nokeymap\n");
Carlos Lopez a09598
    ErrorF("+synckeymap            synchronize X keymap with system keymap\n");
Carlos Lopez a09598
    ErrorF("-synckeymap            only set X keymap on server startup\n");
Carlos Lopez a09598
    ErrorF("-swapAltMeta           swap meaning of Alt and Meta modifiers\n");
Carlos Lopez a09598
    ErrorF("-version               show server version.\n");
Carlos Lopez a09598
    ErrorF("\n");
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Device dependent cleanup. Called by dix before normal server death. */
Carlos Lopez a09598
void
Carlos Lopez a09598
ddxGiveUp (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ErrorF( "Quitting XDarwin...\n" );
Carlos Lopez a09598
    QuartzGiveUp();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* DDX - specific abort routine.  Called by AbortServer(). The attempt is
Carlos Lopez a09598
   made to restore all original setting of the displays. Also all devices
Carlos Lopez a09598
   are closed. */
Carlos Lopez a09598
void
Carlos Lopez a09598
AbortDDX (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ErrorF( "   AbortDDX\n" );
Carlos Lopez a09598
Carlos Lopez a09598
    /* This is needed for a abnormal server exit, since the normal exit stuff
Carlos Lopez a09598
       MUST also be performed (i.e. the vt must be left in a defined state) */
Carlos Lopez a09598
    ddxGiveUp();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
extern void GlxExtensionInit();
Carlos Lopez a09598
extern void GlxWrapInitVisuals(void *procPtr);
Carlos Lopez a09598
void DarwinGlxExtensionInit (void) { GlxExtensionInit (); }
Carlos Lopez a09598
void DarwinGlxWrapInitVisuals (void *ptr) { GlxWrapInitVisuals (ptr); }
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef DPMSExtension
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DPMSSupported (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return FALSE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DPMSSet (int level)
Carlos Lopez a09598
{
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
int
Carlos Lopez a09598
DPMSGet (int *level)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return -1;
Carlos Lopez a09598
}
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef DDXTIME
Carlos Lopez a09598
CARD32
Carlos Lopez a09598
GetTimeInMillis (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    extern void Microseconds ();
Carlos Lopez a09598
    UnsignedWide usec;
Carlos Lopez a09598
Carlos Lopez a09598
    /* This doesn't involve trapping into the kernel, unlike gettimeofday. */
Carlos Lopez a09598
    Microseconds (&usec);
Carlos Lopez a09598
Carlos Lopez a09598
    /* Should be good enough? (-2% error) */
Carlos Lopez a09598
    return (usec.hi << 22) | (usec.lo >> 10);
Carlos Lopez a09598
}
Carlos Lopez a09598
#endif