|
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
|