diff options
author | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
commit | f4092abdf94af6a99aff944d6264bc1284e8bdd4 (patch) | |
tree | 2ac1c9cc16ceb93edb2c4382c088dac5aeafdf0f /nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c | |
parent | a840692edc9c6d19cd7c057f68e39c7d95eb767d (diff) | |
download | nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.gz nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.bz2 nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.zip |
Imported nx-X11-3.1.0-1.tar.gznx-X11/3.1.0-1
Summary: Imported nx-X11-3.1.0-1.tar.gz
Keywords:
Imported nx-X11-3.1.0-1.tar.gz
into Git repository
Diffstat (limited to 'nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c | 648 |
1 files changed, 648 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c b/nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c new file mode 100644 index 000000000..941b363eb --- /dev/null +++ b/nx-X11/programs/Xserver/hw/sunLynx/sunLyInit.c @@ -0,0 +1,648 @@ +/* $Xorg: sunLyInit.c,v 1.3 2000/08/17 19:48:36 cpqbld Exp $ */ +/* + * This is sunInit.c modified for LynxOS + * Copyright 1996 by Thomas Mueller + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Thomas Mueller not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Thomas Mueller makes no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * THOMAS MUELLER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THOMAS MUELLER BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + */ +/* $XFree86: xc/programs/Xserver/hw/sunLynx/sunLyInit.c,v 3.8 2001/01/17 22:36:53 dawes Exp $ */ + +/* + * Copyright 1987 by the Regents of the University of California + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies. The University of California + * makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without + * express or implied warranty. + * + * + */ + +/************************************************************ +Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright no- +tice appear in all copies and that both that copyright no- +tice and this permission notice appear in supporting docu- +mentation, and that the names of Sun or The Open Group +not be used in advertising or publicity pertaining to +distribution of the software without specific prior +written permission. Sun and The Open Group make no +representations about the suitability of this software for +any purpose. It is provided "as is" without any express or +implied warranty. + +SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +*******************************************************/ + +#include "sun.h" +#include "gcstruct.h" +#include "mi.h" +#include "mibstore.h" +#include "cfb.h" + +Bool onConsole = FALSE; /* wether stdin is /dev/con */ + +/* maximum pixmap depth */ +#ifndef SUNMAXDEPTH +#define SUNMAXDEPTH 8 +#endif + +extern Bool sunBW2Init( + int /* screen */, + ScreenPtr /* pScreen */, + int /* argc */, + char** /* argv */ +); +#define BW2I sunBW2Init +#if SUNMAXDEPTH == 1 /* { */ +#define CG3I NULL +#define CG6I NULL +#else /* }{ */ +extern Bool sunCG3Init( + int /* screen */, + ScreenPtr /* pScreen */, + int /* argc */, + char** /* argv */ +); +#define CG3I sunCG3Init +#ifdef FBTYPE_SUNFAST_COLOR /* { */ +extern Bool sunCG6Init( + int /* screen */, + ScreenPtr /* pScreen */, + int /* argc */, + char** /* argv */ +); +#define CG6I sunCG6Init +#else /* }{ */ +#define CG6I NULL +#endif /* } */ +#endif /* } */ + +extern KeySymsRec sunKeySyms[]; +extern SunModmapRec *sunModMaps[]; +extern int sunMaxLayout; +extern KeySym* sunType4KeyMaps[]; +extern SunModmapRec* sunType4ModMaps[]; + +static Bool sunDevsInited = FALSE; + +Bool sunAutoRepeatHandlersInstalled; /* FALSE each time InitOutput called */ +Bool sunSwapLkeys = FALSE; +Bool sunFlipPixels = FALSE; +Bool sunFbInfo = FALSE; +Bool sunCG4Frob = FALSE; +Bool sunNoGX = FALSE; + +sunKbdPrivRec sunKbdPriv = { + -1, /* fd */ + -1, /* type */ + -1, /* layout */ + 0, /* click */ + (Leds)0, /* leds */ +}; + +sunPtrPrivRec sunPtrPriv = { + -1, /* fd */ + 0 /* Current button state */ +}; + +/* + * The name member in the following table corresponds to the + * FBTYPE_* macros defined in /usr/include/sun/fbio.h file + */ +sunFbDataRec sunFbData[FBTYPE_LASTPLUSONE] = { + { NULL, "SUN1BW (bw1)" }, + { NULL, "SUN1COLOR (cg1)" }, + { BW2I, "SUN2BW (bw2)" }, + { NULL, "SUN2COLOR (cg2)" }, + { NULL, "SUN2GP (gp1/gp2)" }, + { NULL, "SUN5COLOR (cg5/386i accel)" }, + { CG3I, "SUN3COLOR (cg3)" }, + { NULL, "MEMCOLOR (cg8)" }, + { NULL, "SUN4COLOR (cg4)" }, + { NULL, "NOTSUN1" }, + { NULL, "NOTSUN2" }, + { NULL, "NOTSUN3" }, + { CG6I, "SUNFAST_COLOR (cg6/gx)" }, /* last we need */ +}; + +/* + * a list of devices to try if there is no environment or command + * line list of devices + */ +#if SUNMAXDEPTH == 1 /* { */ +static char *fallbackList[] = { + "/dev/bwtwo", +}; +#else /* }{ */ +static char *fallbackList[] = { + "/dev/bwtwo", "/dev/cgthree", "/dev/cgsix", +}; +#endif /* } */ + +#define FALLBACK_LIST_LEN sizeof fallbackList / sizeof fallbackList[0] + +fbFd sunFbs[MAXSCREENS]; + +static PixmapFormatRec formats[] = { + { 1, 1, BITMAP_SCANLINE_PAD } /* 1-bit deep */ +#if SUNMAXDEPTH > 1 + ,{ 8, 8, BITMAP_SCANLINE_PAD} /* 8-bit deep */ +#endif +}; +#define NUMFORMATS (sizeof formats)/(sizeof formats[0]) + +/* + * OpenFrameBuffer -- + * Open a frame buffer according to several rules. + * Find the device to use by looking in the sunFbData table, + * an XDEVICE envariable, a -dev switch or using /dev/fb if trying + * to open screen 0 and all else has failed. + * + * Results: + * The fd of the framebuffer. + */ +static int OpenFrameBuffer(device, screen) + char *device; /* e.g. "/dev/cgtwo0" */ + int screen; /* what screen am I going to be */ +{ + int ret; + unsigned long dacoffset; + struct fbgattr *fbattr = NULL; + static int devFbUsed; + static struct fbgattr bw2 = { + 0, 0, + { FBTYPE_SUN2BW, 900, 1152, 1, 0, 0x00100000 }, + { 0, -1}, + -1 + }; + static struct fbgattr cg3 = { + 0, 0, + { FBTYPE_SUN3COLOR, 900, 1152, 8, 256, 0x00100000 }, + { 0, -1}, + -1 + }; + static struct fbgattr cg6 = { + 0, 0, + { FBTYPE_SUNFAST_COLOR, 900, 1152, 8, 256, 0x00100000 }, + { 0, -1}, + -1 + }; + + + sunFbs[screen].fd = sunKbdPriv.fd; /* /dev/con or /dev/kbd */ + devFbUsed = TRUE; + /* apply some magic to work out what we're running on. + * why couldn't they just spend some time on a little + * FBIOGATTR ioctl() + */ + + ret = FALSE; + if (ioctl(sunFbs[screen].fd, TIO_QUERYRAMDAC, &dacoffset) < 0) + FatalError("can't query DAC addr\n"); + if (dacoffset == 0x400000) { + if (strcmp(device, "/dev/cgthree") == 0) + fbattr = &cg3; + } + else if (dacoffset == 0x200000) { + if (strcmp(device, "/dev/cgsix") == 0) + fbattr = &cg6; + } +#ifdef PATCHED_CONSOLE + else if (dacoffset == 0) { + if (strcmp(device, "/dev/bw2") == 0) + fbattr = &bw2; + } +#endif + else + ErrorF("bogus DAC addr 0x%x, maybe it's the silly BWTWO bug\n", dacoffset); + + if (fbattr) { + ret = TRUE; + sunFbs[screen].info = fbattr->fbtype; + } + sunFbs[screen].fbPriv = (pointer) fbattr; + if (fbattr && fbattr->fbtype.fb_type < FBTYPE_LASTPLUSONE && + !sunFbData[fbattr->fbtype.fb_type].init) { + int _i; + + ret = FALSE; + for (_i = 0; _i < FB_ATTR_NEMUTYPES; _i++) { + if (sunFbData[fbattr->emu_types[_i]].init) { + sunFbs[screen].info.fb_type = fbattr->emu_types[_i]; + ret = TRUE; + if (sunFbInfo) + ErrorF ("%s is emulating a %s\n", device, + sunFbData[fbattr->fbtype.fb_type].name); + break; + } + } + } + if (sunFbInfo) + ErrorF ("%s is really a %s\n", device, + sunFbData[fbattr ? fbattr->fbtype.fb_type : sunFbs[screen].info.fb_type].name); + if (!ret) + sunFbs[screen].fd = -1; + return ret; +} + +/*- + *----------------------------------------------------------------------- + * SigIOHandler -- + * Signal handler for SIGIO - input is available. + * + * Results: + * sunSigIO is set - ProcessInputEvents() will be called soon. + * + * Side Effects: + * None + * + *----------------------------------------------------------------------- + */ +/*ARGSUSED*/ +/*static*/ void SigIOHandler(sig) + int sig; +{ + int olderrno = errno; + sunEnqueueEvents(); + errno = olderrno; +} + +/*- + *----------------------------------------------------------------------- + * sunNonBlockConsoleOff -- + * Turn non-blocking mode on the console off, so you don't get logged + * out when the server exits. + * + * Results: + * None. + * + * Side Effects: + * None. + * + *----------------------------------------------------------------------- + */ +void sunNonBlockConsoleOff( + void +) +{ + int i; + +#if 0 + if (sunKbdPriv.fd >= 0) + { + i = fcntl(sunKbdPriv.fd, F_GETFL, 0); + if (i >= 0 && (i & FNDELAY)) { + (void) fcntl(sunKbdPriv.fd, F_SETFL, i & ~FNDELAY); + } + } +#endif + for (i = 0; i < MAXSCREENS; i++) { + if (sunFbs[i].fbuf) { + smem_create(NULL, (char*)sunFbs[i].fbuf, 0, SM_DETACH); + smem_remove("FB"); + sunFbs[i].fbuf = NULL; + } + if (sunFbs[i].ramdac) { + smem_create(NULL, (char*)sunFbs[i].ramdac, 0, SM_DETACH); + smem_remove("DAC"); + sunFbs[i].ramdac = NULL; + } + if (sunFbs[i].fhc) { + smem_create(NULL, (char*)sunFbs[i].fhc, 0, SM_DETACH); + smem_remove("FHC_THC"); + sunFbs[i].fhc = NULL; + sunFbs[i].thc = NULL; + } + if (sunFbs[i].fb) { + smem_create(NULL, (char*)sunFbs[i].fb, 0, SM_DETACH); + smem_remove("FBC_TEC"); + sunFbs[i].fb = NULL; + sunFbs[i].tec = NULL; + } + } +} + +static char** GetDeviceList (argc, argv) + int argc; + char **argv; +{ + int i; + char *envList = NULL; + char *cmdList = NULL; + char **deviceList = (char **)NULL; + + for (i = 1; i < argc; i++) + if (strcmp (argv[i], "-dev") == 0 && i+1 < argc) { + cmdList = argv[i + 1]; + break; + } + if (!cmdList) + envList = getenv ("XDEVICE"); + + if (cmdList || envList) { + char *_tmpa; + char *_tmpb; + int _i1; + deviceList = (char **) xalloc ((MAXSCREENS + 1) * sizeof (char *)); + _tmpa = (cmdList) ? cmdList : envList; + for (_i1 = 0; _i1 < MAXSCREENS; _i1++) { + _tmpb = strtok (_tmpa, ":"); + if (_tmpb) + deviceList[_i1] = _tmpb; + else + deviceList[_i1] = NULL; + _tmpa = NULL; + } + deviceList[MAXSCREENS] = NULL; + } + if (!deviceList) { + /* no environment and no cmdline, so default */ + deviceList = + (char **) xalloc ((FALLBACK_LIST_LEN + 1) * sizeof (char *)); + for (i = 0; i < FALLBACK_LIST_LEN; i++) + deviceList[i] = fallbackList[i]; + deviceList[FALLBACK_LIST_LEN] = NULL; + } + return deviceList; +} + +static void getKbdType() +{ +#if defined(PATCHED_CONSOLE) + int ii; + + for (ii = 0; ii < 3; ii++) { +#if 0 + sunKbdWait(); +#endif + if (ioctl (sunKbdPriv.fd, KIOCTYPE, &sunKbdPriv.type) < 0 && errno == EINVAL) { + ErrorF("failed to get keyboard type, maybe wrong console driver:"); + ErrorF(" assuming Type 4 keyboard\n"); + sunKbdPriv.type = KB_SUN4; + return; + } + switch (sunKbdPriv.type) { + case KB_SUN2: + case KB_SUN3: + case KB_SUN4: + return; + default: + sunChangeKbdTranslation(sunKbdPriv.fd, FALSE); + continue; + } + } + FatalError ("Unsupported keyboard type %d\n", sunKbdPriv.type); +#else + sunKbdPriv.type = KB_SUN4; +#endif +} + +void OsVendorInit( + void +) +{ + static int inited; + if (!inited) { + /* weird hack to prevent logout on X server shutdown */ + if (onConsole) + sunKbdPriv.fd = open ("/dev/con", O_RDWR, 0); + else + sunKbdPriv.fd = open ("/dev/kbd", O_RDWR, 0); + sunPtrPriv.fd = open ("/dev/mouse", O_RDWR, 0); + + getKbdType (); + if (sunKbdPriv.type == KB_SUN4) { +#if defined(PATCHED_CONSOLE) + if ( ioctl (sunKbdPriv.fd, KIOCLAYOUT, &sunKbdPriv.layout) < 0 && errno == EINVAL) { + ErrorF("failed to get keyboard layout, maybe wrong console driver:"); + ErrorF(" assuming layout 0\n"); + sunKbdPriv.layout = 0; + } + if (sunKbdPriv.layout < 0 || + sunKbdPriv.layout > sunMaxLayout || + sunType4KeyMaps[sunKbdPriv.layout] == NULL) + FatalError ("Unsupported keyboard type 4 layout %d\n", + sunKbdPriv.layout); +#else + sunKbdPriv.layout = 0; /* default: Type 4 */ +#endif + sunKeySyms[KB_SUN4].map = sunType4KeyMaps[sunKbdPriv.layout]; + sunModMaps[KB_SUN4] = sunType4ModMaps[sunKbdPriv.layout]; + } + inited = 1; + } +} + +/*- + *----------------------------------------------------------------------- + * InitOutput -- + * Initialize screenInfo for all actually accessible framebuffers. + * The + * + * Results: + * screenInfo init proc field set + * + * Side Effects: + * None + * + *----------------------------------------------------------------------- + */ + +void InitOutput(pScreenInfo, argc, argv) + ScreenInfo *pScreenInfo; + int argc; + char **argv; +{ + int i, scr; + char **devList; + static int setup_on_exit = 0; + extern Bool RunFromSmartParent; + + if (!monitorResolution) + monitorResolution = 90; + + pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER; + pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT; + pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD; + pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER; + + pScreenInfo->numPixmapFormats = NUMFORMATS; + for (i=0; i< NUMFORMATS; i++) + pScreenInfo->formats[i] = formats[i]; +#ifdef XKB + if (noXkbExtension) +#endif + sunAutoRepeatHandlersInstalled = FALSE; + if (!sunDevsInited) { + /* first time ever */ + for (scr = 0; scr < MAXSCREENS; scr++) + sunFbs[scr].fd = -1; + devList = GetDeviceList (argc, argv); + for (i = 0, scr = 0; devList[i] != NULL && scr < MAXSCREENS; i++) + if (OpenFrameBuffer (devList[i], scr)) + scr++; + sunDevsInited = TRUE; + xfree (devList); + } + for (scr = 0; scr < MAXSCREENS; scr++) + if (sunFbs[scr].fd != -1) + (void) AddScreen (sunFbData[sunFbs[scr].info.fb_type].init, + argc, argv); + (void) OsSignal(SIGWINCH, SIG_IGN); +} + +/*- + *----------------------------------------------------------------------- + * InitInput -- + * Initialize all supported input devices...what else is there + * besides pointer and keyboard? + * + * Results: + * None. + * + * Side Effects: + * Two DeviceRec's are allocated and registered as the system pointer + * and keyboard devices. + * + *----------------------------------------------------------------------- + */ +void InitInput(argc, argv) + int argc; + char **argv; +{ + DevicePtr p, k; + extern Bool mieqInit(); + + k = AddInputDevice(sunKbdProc, TRUE); + p = AddInputDevice(sunMouseProc, TRUE); + if (!p || !k) + FatalError("failed to create input devices in InitInput"); + + RegisterPointerDevice(p); + RegisterKeyboardDevice(k); + miRegisterPointerDevice(screenInfo.screens[0], p); + (void) mieqInit (k, p); + +#define SET_FLOW(fd) fcntl(fd, F_SETFL, FASYNC) + (void) OsSignal(SIGIO, SigIOHandler); +#define WANT_SIGNALS(fd) fcntl(fd, F_SETOWN, getpid()) + if (sunKbdPriv.fd >= 0) { + if (SET_FLOW(sunKbdPriv.fd) == -1 || WANT_SIGNALS(sunKbdPriv.fd) == -1) { + (void) close (sunKbdPriv.fd); + sunKbdPriv.fd = -1; + FatalError("Async kbd I/O failed in InitInput"); + } + } + /* SIGIO doesn't work reliable for the mouse device, + * esp. for the first server after a reboot. We enable it + * anyway, gives smoother movements + */ + if (sunPtrPriv.fd >= 0) { + if (SET_FLOW(sunPtrPriv.fd) == -1 || WANT_SIGNALS(sunPtrPriv.fd) == -1) { + (void) close (sunPtrPriv.fd); + sunPtrPriv.fd = -1; + FatalError("ASYNC mouse I/O failed in InitInput"); + } + } +} + + +#if SUNMAXDEPTH == 8 + +Bool +sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp) + register ScreenPtr pScreen; + pointer pbits; /* pointer to screen bitmap */ + int xsize, ysize; /* in pixels */ + int dpix, dpiy; /* dots per inch */ + int width; /* pixel width of frame buffer */ + int bpp; /* bits per pixel of root */ +{ + return cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, + width); +} + +Bool +sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp) + register ScreenPtr pScreen; + pointer pbits; /* pointer to screen bitmap */ + int xsize, ysize; /* in pixels */ + int dpix, dpiy; /* dots per inch */ + int width; /* pixel width of frame buffer */ + int bpp; /* bits per pixel of root */ +{ + return cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, + width); +} + +Bool +sunCfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp) + register ScreenPtr pScreen; + pointer pbits; /* pointer to screen bitmap */ + int xsize, ysize; /* in pixels */ + int dpix, dpiy; /* dots per inch */ + int width; /* pixel width of frame buffer */ + int bpp; /* bits per pixel of root */ +{ + return cfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width); +} +#endif /* SUNMAXDEPTH */ + +#ifdef DPMSExtension +/************************************************************** + * DPMSSet(), DPMSGet(), DPMSSupported() + * + * stubs + * + ***************************************************************/ + +void DPMSSet (level) + int level; +{ +} + +int DPMSGet (level) + int* level; +{ + return -1; +} + +Bool DPMSSupported () +{ + return FALSE; +} +#endif |