See ChangeLog entry 2005-11-07 for details.
This commit is contained in:
parent
f5814bf3ff
commit
5390c7ab05
|
@ -51,7 +51,7 @@
|
|||
#ifdef SVR4
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
#if defined(ISC) || defined(__CYGWIN__) || defined(SCO) || defined(SCO325)
|
||||
#if defined(ISC) || defined(__CYGWIN__) || defined(__SCO__)
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
|
|
|
@ -61,7 +61,7 @@ copyright holders.
|
|||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if (defined(sun) && defined(SVR4)) || (defined(SCO))
|
||||
#if (defined(sun) && defined(SVR4)) || defined(__SCO__) || defined(__UNIXWARE__)
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
#include "scrnintstr.h"
|
||||
|
@ -1377,7 +1377,7 @@ ReplaceAllKeywords(
|
|||
defined(linux) || \
|
||||
defined(__CYGWIN__) || \
|
||||
(defined(sun) && !defined(SVR4)) || \
|
||||
(defined(SVR4) && !defined(sun) && !defined(USL)) || \
|
||||
(defined(SVR4) && !defined(sun) && !defined(__UNIXWARE__)) || \
|
||||
defined(__UNIXOS2__) || \
|
||||
defined(ISC) || \
|
||||
defined(Lynx) || \
|
||||
|
|
|
@ -1604,18 +1604,8 @@ extern void outl(unsigned int a, unsigned int l);
|
|||
# define asm __asm
|
||||
# endif
|
||||
# endif
|
||||
# ifdef SVR4
|
||||
#if 0
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
# ifndef __HIGHC__
|
||||
# if !defined(__USLC__) && !defined(__SUNPRO_C)
|
||||
# define __USLC__
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# ifndef SCO325
|
||||
# if defined(USL)
|
||||
# if defined(__UNIXWARE__)
|
||||
# if defined(IN_MODULE)
|
||||
# /* avoid including <sys/types.h> for <sys/inline.h> on UnixWare */
|
||||
# define ushort unsigned short
|
||||
|
@ -1627,15 +1617,15 @@ extern void outl(unsigned int a, unsigned int l);
|
|||
# else
|
||||
# include <sys/types.h>
|
||||
# endif /* IN_MODULE */
|
||||
# endif /* USL */
|
||||
# endif /* __UNIXWARE__ */
|
||||
# if !defined(sgi) && !defined(__SUNPRO_C)
|
||||
# include <sys/inline.h>
|
||||
# endif
|
||||
# else
|
||||
# include "scoasm.h"
|
||||
# endif
|
||||
# if !defined(__HIGHC__) && !defined(SCO325) && !defined(sgi) && \
|
||||
!defined(__SUNPRO_C)
|
||||
# if (!defined(__HIGHC__) && !defined(sgi) && !defined(__SUNPRO_C)) || \
|
||||
defined(__USLC__)
|
||||
# pragma asm partial_optimization outl
|
||||
# pragma asm partial_optimization outw
|
||||
# pragma asm partial_optimization outb
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#ifdef SCO325
|
||||
#if defined(__SCO__) && defined(__USLC__)
|
||||
#ifndef _SCOASM_HDR_INC
|
||||
#define _SCOASM_HDR_INC
|
||||
|
||||
|
@ -140,4 +140,4 @@ asm int inb(port)
|
|||
}
|
||||
|
||||
#endif /* _SCOASM_HDR_INC */
|
||||
#endif /* SCO325 */
|
||||
#endif /* __SCO__ && __USLC__ */
|
||||
|
|
|
@ -1106,6 +1106,11 @@ configInputKbd(IDevPtr inputp)
|
|||
MessageType from = X_DEFAULT;
|
||||
Bool customKeycodesDefault = FALSE;
|
||||
int verb = 0;
|
||||
#if defined(XQUEUE)
|
||||
char *kbdproto = "Xqueue";
|
||||
#else
|
||||
char *kbdproto = "standard";
|
||||
#endif
|
||||
|
||||
/* Initialize defaults */
|
||||
xf86Info.xleds = 0L;
|
||||
|
@ -1146,16 +1151,25 @@ configInputKbd(IDevPtr inputp)
|
|||
xf86Info.xkbgeometry = NULL;
|
||||
#endif
|
||||
|
||||
s = xf86SetStrOption(inputp->commonOptions, "Protocol", "standard");
|
||||
s = xf86SetStrOption(inputp->commonOptions, "Protocol", kbdproto);
|
||||
if (xf86NameCmp(s, "standard") == 0) {
|
||||
xf86Info.kbdProc = xf86KbdProc;
|
||||
xf86Info.kbdEvents = xf86KbdEvents;
|
||||
xfree(s);
|
||||
} else if (xf86NameCmp(s, "xqueue") == 0) {
|
||||
#ifdef __UNIXWARE__
|
||||
/*
|
||||
* To retain compatibility with older config files, on UnixWare, we
|
||||
* accept the xqueue protocol but use the normal keyboard procs.
|
||||
*/
|
||||
xf86Info.kbdProc = xf86KbdProc;
|
||||
xf86Info.kbdEvents = xf86KbdEvents;
|
||||
#else
|
||||
#ifdef XQUEUE
|
||||
xf86Info.kbdProc = xf86XqueKbdProc;
|
||||
xf86Info.kbdEvents = xf86XqueEvents;
|
||||
xf86Msg(X_CONFIG, "Xqueue selected for keyboard input\n");
|
||||
#endif
|
||||
#endif
|
||||
xfree(s);
|
||||
#ifdef WSCONS_SUPPORT
|
||||
|
|
|
@ -76,8 +76,11 @@ Bool foundMouse = FALSE;
|
|||
#if defined(__UNIXOS2__)
|
||||
#define DFLT_MOUSE_DEV "mouse$"
|
||||
#define DFLT_MOUSE_PROTO "OS2Mouse"
|
||||
#elif defined(SCO)
|
||||
#elif defined(__SCO__)
|
||||
static char *DFLT_MOUSE_PROTO = "OSMouse";
|
||||
#elif defined(__UNIXWARE__)
|
||||
static char *DFLT_MOUSE_PROTO = "Xqueue";
|
||||
static char *DFLT_MOUSE_DEV = "/dev/mouse";
|
||||
#elif defined(QNX4)
|
||||
static char *DFLT_MOUSE_PROTO = "OSMouse";
|
||||
static char *DFLT_MOUSE_DEV = "/dev/mouse";
|
||||
|
@ -294,7 +297,7 @@ configureInputSection (void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef SCO
|
||||
#ifndef __SCO__
|
||||
fd = open(DFLT_MOUSE_DEV, 0);
|
||||
if (fd != -1) {
|
||||
foundMouse = TRUE;
|
||||
|
@ -311,12 +314,14 @@ configureInputSection (void)
|
|||
mouse->inp_driver = "mouse";
|
||||
mouse->inp_option_lst =
|
||||
xf86addNewOption(mouse->inp_option_lst, "Protocol", DFLT_MOUSE_PROTO);
|
||||
#ifndef SCO
|
||||
#ifndef __SCO__
|
||||
mouse->inp_option_lst =
|
||||
xf86addNewOption(mouse->inp_option_lst, "Device", DFLT_MOUSE_DEV);
|
||||
#endif
|
||||
#ifndef __UNIXWARE__
|
||||
mouse->inp_option_lst =
|
||||
xf86addNewOption(mouse->inp_option_lst, "ZAxisMapping", "4 5 6 7");
|
||||
#endif
|
||||
#endif
|
||||
ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse);
|
||||
return ptr;
|
||||
}
|
||||
|
@ -885,7 +890,7 @@ DoConfigure()
|
|||
#ifdef __UNIXOS2__
|
||||
#define PATH_MAX 2048
|
||||
#endif
|
||||
#if defined(SCO) || defined(SCO325)
|
||||
#if !defined(PATH_MAX)
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
const char* configfile = XF86CONFIGFILE".new";
|
||||
|
@ -1009,13 +1014,13 @@ DoConfigure()
|
|||
|
||||
ErrorF("\n");
|
||||
|
||||
#ifdef SCO
|
||||
#ifdef __SCO__
|
||||
ErrorF("\n"__XSERVERNAME__
|
||||
" is using the kernel event driver to access the mouse.\n"
|
||||
"If you wish to use the internal "__XSERVERNAME__
|
||||
"mouse drivers, please\n"
|
||||
" mouse drivers, please\n"
|
||||
"edit the file and correct the Device.\n");
|
||||
#else /* !SCO */
|
||||
#else /* !__SCO__ */
|
||||
if (!foundMouse) {
|
||||
ErrorF("\n"__XSERVERNAME__" is not able to detect your mouse.\n"
|
||||
"Edit the file and correct the Device.\n");
|
||||
|
@ -1028,7 +1033,7 @@ DoConfigure()
|
|||
"the protocol.\n",DFLT_MOUSE_DEV);
|
||||
#endif
|
||||
}
|
||||
#endif /* !SCO */
|
||||
#endif /* !__SCO__ */
|
||||
|
||||
if (xf86NumScreens > 1) {
|
||||
ErrorF("\n"__XSERVERNAME__
|
||||
|
|
|
@ -364,7 +364,7 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
|
|||
case ACTION_SWITCHSCREEN:
|
||||
if (VTSwitchEnabled && !xf86Info.dontVTSwitch && arg) {
|
||||
int vtno = *((int *) arg);
|
||||
#ifdef SCO
|
||||
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||
vtno--;
|
||||
#endif
|
||||
#if defined(QNX4)
|
||||
|
@ -377,12 +377,13 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
|
|||
break;
|
||||
case ACTION_SWITCHSCREEN_NEXT:
|
||||
if (VTSwitchEnabled && !xf86Info.dontVTSwitch) {
|
||||
#if defined(SCO) /* Shouldn't this be true for (sun) && (i386) && (SVR4) ? */
|
||||
/* Shouldn't this be true for (sun) && (i386) && (SVR4) ? */
|
||||
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0)
|
||||
#else
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno + 1) < 0)
|
||||
#endif
|
||||
#if defined (SCO) || (defined(sun) && defined (i386) && defined (SVR4))
|
||||
#if defined (__SCO__) || (defined(sun) && defined (i386) && defined (SVR4)) || defined(__UNIXWARE__)
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 0) < 0)
|
||||
#else
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) < 0)
|
||||
|
@ -784,7 +785,7 @@ special:
|
|||
break;
|
||||
#endif
|
||||
|
||||
#if defined(linux) || (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) || defined(SCO)
|
||||
#if defined(linux) || (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) || defined(__SCO__) || defined(__UNIXWARE__)
|
||||
/*
|
||||
* Under Linux, the raw keycodes are consumed before the kernel
|
||||
* does any processing on them, so we must emulate the vt switching
|
||||
|
@ -923,7 +924,7 @@ special:
|
|||
|
||||
#endif /* USE_VT_SYSREQ */
|
||||
|
||||
#ifdef SCO
|
||||
#ifdef __SCO__
|
||||
/*
|
||||
* With the console in raw mode, SCO will not switch consoles,
|
||||
* you get around this by activating the next console along, if
|
||||
|
@ -938,7 +939,7 @@ special:
|
|||
xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
|
||||
return;
|
||||
}
|
||||
#endif /* SCO */
|
||||
#endif /* __SCO__ */
|
||||
#ifdef XKB
|
||||
}
|
||||
#endif
|
||||
|
@ -1104,8 +1105,9 @@ special:
|
|||
Bool
|
||||
xf86CommonSpecialKey(int key, Bool down, int modifiers)
|
||||
{
|
||||
if ((ModifierIsSet(ControlMask | AltMask)) ||
|
||||
(ModifierIsSet(ControlMask | AltLangMask))) {
|
||||
if ((!ModifierIsSet(ShiftMask)) &&
|
||||
(((ModifierIsSet(ControlMask | AltMask)) ||
|
||||
(ModifierIsSet(ControlMask | AltLangMask))))) {
|
||||
switch (key) {
|
||||
|
||||
case KEY_BackSpace:
|
||||
|
|
|
@ -906,7 +906,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
|
|||
xf86EnterServerState(SETUP);
|
||||
}
|
||||
}
|
||||
#ifdef SCO
|
||||
#ifdef SCO325
|
||||
else {
|
||||
/*
|
||||
* Under SCO we must ack that we got the console at startup,
|
||||
|
@ -919,7 +919,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
|
|||
xf86Msg(X_WARNING, "VT_ACKACQ failed");
|
||||
}
|
||||
}
|
||||
#endif /* SCO */
|
||||
#endif /* SCO325 */
|
||||
|
||||
for (i = 0; i < xf86NumScreens; i++) {
|
||||
xf86EnableAccess(xf86Screens[i]);
|
||||
|
|
|
@ -402,6 +402,26 @@ LoaderInit(void)
|
|||
*/
|
||||
mallopt(M_MMAP_MAX, 0);
|
||||
#endif
|
||||
#if defined(__UNIXWARE__) && !defined(__GNUC__)
|
||||
/* For UnixWare we need to load the C Runtime libraries which are
|
||||
* normally auto-linked by the compiler. Otherwise we are bound to
|
||||
* see unresolved symbols when trying to use the type "long long".
|
||||
* Obviously, this does not apply if the GNU C compiler is used.
|
||||
*/
|
||||
{
|
||||
int errmaj, errmin, wasLoaded; /* place holders */
|
||||
char *xcrtpath = DEFAULT_MODULE_PATH "/libcrt.a";
|
||||
char *uwcrtpath = "/usr/ccs/lib/libcrt.a";
|
||||
char *path;
|
||||
struct stat st;
|
||||
|
||||
if(stat(xcrtpath, &st) < 0)
|
||||
path = uwcrtpath; /* fallback: try to get libcrt.a from the uccs */
|
||||
else
|
||||
path = xcrtpath; /* get the libcrt.a we compiled with */
|
||||
LoaderOpen (path, "libcrt", 0, &errmaj, &errmin, &wasLoaded);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
#define OSNAME "lynxos"
|
||||
#elif defined(__GNU__)
|
||||
#define OSNAME "hurd"
|
||||
#elif defined(SCO)
|
||||
#elif defined(__SCO__)
|
||||
#define OSNAME "sco"
|
||||
#elif defined(DGUX)
|
||||
#define OSNAME "dgux"
|
||||
|
@ -58,6 +58,8 @@
|
|||
#define OSNAME "isc"
|
||||
#elif defined(SVR4) && defined(sun)
|
||||
#define OSNAME "solaris"
|
||||
#elif defined(SVR5)
|
||||
#define OSNAME "svr5"
|
||||
#elif defined(SVR4)
|
||||
#define OSNAME "svr4"
|
||||
#elif defined(__UNIXOS2__)
|
||||
|
|
|
@ -58,7 +58,7 @@ xf86VTRequest(int sig)
|
|||
}
|
||||
|
||||
Bool
|
||||
xf86VTSwitchPending()
|
||||
xf86VTSwitchPending(void)
|
||||
{
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ static int sco_ledstatus = -1;
|
|||
static unsigned int sco_ledstate = 0;
|
||||
|
||||
Bool
|
||||
xf86VTSwitchAway()
|
||||
xf86VTSwitchAway(void)
|
||||
{
|
||||
ev_flush();
|
||||
ev_suspend();
|
||||
|
@ -93,7 +93,7 @@ xf86VTSwitchAway()
|
|||
* switched away.
|
||||
*/
|
||||
Bool
|
||||
xf86VTSwitchTo()
|
||||
xf86VTSwitchTo(void)
|
||||
{
|
||||
ev_resume();
|
||||
|
||||
|
|
304
hw/xfree86/os-support/sco/sco_KbdMap.c
Normal file
304
hw/xfree86/os-support/sco/sco_KbdMap.c
Normal file
|
@ -0,0 +1,304 @@
|
|||
/* $XFree86$ */
|
||||
/*
|
||||
* Copyright 2005 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* 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 J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Based on xf86KbdMap.c, which is
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
|
||||
* Copyright (c) 1992-2003 by The XFree86 Project, Inc.
|
||||
*/
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSKbd.h"
|
||||
#include "atKeynames.h"
|
||||
#include "xf86Keymap.h"
|
||||
|
||||
#include "sco_kbd.h"
|
||||
|
||||
#define KD_GET_ENTRY(i,n) \
|
||||
eascii_to_x[((priv->keymap.key[i].spcl << (n+1)) & 0x100) + priv->keymap.key[i].map[n]]
|
||||
|
||||
/*
|
||||
* NOTE: Not all possible remappable symbols are remapped. There are two main
|
||||
* reasons:
|
||||
* a) The mapping between scancode and SYSV/386 - symboltable
|
||||
* is inconsistent between different versions and has some
|
||||
* BIG mistakes.
|
||||
* b) In X-Windows there is a difference between numpad-keys
|
||||
* and normal keys. SYSV/386 uses for both kinds of keys
|
||||
* the same symbol.
|
||||
*
|
||||
* Thus only the alpha keypad and the function keys are translated.
|
||||
* Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
|
||||
*/
|
||||
|
||||
static unsigned char remap[128] = {
|
||||
0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00 - 0x07 */
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08 - 0x0f */
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10 - 0x17 */
|
||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18 - 0x1f */
|
||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20 - 0x27 */
|
||||
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28 - 0x2f */
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0, /* 0x30 - 0x37 */
|
||||
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38 - 0x3f */
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0, /* 0x40 - 0x47 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x48 - 0x4f */
|
||||
0, 0, 0, 0, 0, 0, 0x56, 0x57, /* 0x50 - 0x57 */
|
||||
0x58, 0, 0, 0, 0, 0, 0, 0, /* 0x58 - 0x5f */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x67 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x68 - 0x6f */
|
||||
0, 0, 0x69, 0x65, 0, 0, 0, 0, /* 0x70 - 0x77 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x78 - 0x7f */
|
||||
};
|
||||
|
||||
static KeySym eascii_to_x[512] = {
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_BackSpace, XK_Tab, XK_Linefeed, NoSymbol,
|
||||
NoSymbol, XK_Return, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, XK_Escape,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_space, XK_exclam, XK_quotedbl, XK_numbersign,
|
||||
XK_dollar, XK_percent, XK_ampersand, XK_apostrophe,
|
||||
XK_parenleft, XK_parenright, XK_asterisk, XK_plus,
|
||||
XK_comma, XK_minus, XK_period, XK_slash,
|
||||
XK_0, XK_1, XK_2, XK_3,
|
||||
XK_4, XK_5, XK_6, XK_7,
|
||||
XK_8, XK_9, XK_colon, XK_semicolon,
|
||||
XK_less, XK_equal, XK_greater, XK_question,
|
||||
XK_at, XK_A, XK_B, XK_C,
|
||||
XK_D, XK_E, XK_F, XK_G,
|
||||
XK_H, XK_I, XK_J, XK_K,
|
||||
XK_L, XK_M, XK_N, XK_O,
|
||||
XK_P, XK_Q, XK_R, XK_S,
|
||||
XK_T, XK_U, XK_V, XK_W,
|
||||
XK_X, XK_Y, XK_Z, XK_bracketleft,
|
||||
XK_backslash, XK_bracketright,XK_asciicircum, XK_underscore,
|
||||
XK_grave, XK_a, XK_b, XK_c,
|
||||
XK_d, XK_e, XK_f, XK_g,
|
||||
XK_h, XK_i, XK_j, XK_k,
|
||||
XK_l, XK_m, XK_n, XK_o,
|
||||
XK_p, XK_q, XK_r, XK_s,
|
||||
XK_t, XK_u, XK_v, XK_w,
|
||||
XK_x, XK_y, XK_z, XK_braceleft,
|
||||
XK_bar, XK_braceright, XK_asciitilde, XK_Delete,
|
||||
XK_Ccedilla, XK_udiaeresis, XK_eacute, XK_acircumflex,
|
||||
XK_adiaeresis, XK_agrave, XK_aring, XK_ccedilla,
|
||||
XK_ecircumflex, XK_ediaeresis, XK_egrave, XK_idiaeresis,
|
||||
XK_icircumflex, XK_igrave, XK_Adiaeresis, XK_Aring,
|
||||
XK_Eacute, XK_ae, XK_AE, XK_ocircumflex,
|
||||
XK_odiaeresis, XK_ograve, XK_ucircumflex, XK_ugrave,
|
||||
XK_ydiaeresis, XK_Odiaeresis, XK_Udiaeresis, XK_cent,
|
||||
XK_sterling, XK_yen, XK_paragraph, XK_section,
|
||||
XK_aacute, XK_iacute, XK_oacute, XK_uacute,
|
||||
XK_ntilde, XK_Ntilde, XK_ordfeminine, XK_masculine,
|
||||
XK_questiondown,XK_hyphen, XK_notsign, XK_onehalf,
|
||||
XK_onequarter, XK_exclamdown, XK_guillemotleft,XK_guillemotright,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_Greek_alpha, XK_ssharp, XK_Greek_GAMMA, XK_Greek_pi,
|
||||
XK_Greek_SIGMA, XK_Greek_sigma, XK_mu, XK_Greek_tau,
|
||||
XK_Greek_PHI, XK_Greek_THETA, XK_Greek_OMEGA, XK_Greek_delta,
|
||||
XK_infinity, XK_Ooblique, XK_Greek_epsilon, XK_intersection,
|
||||
XK_identical, XK_plusminus, XK_greaterthanequal, XK_lessthanequal,
|
||||
XK_topintegral, XK_botintegral, XK_division, XK_similarequal,
|
||||
XK_degree, NoSymbol, NoSymbol, XK_radical,
|
||||
XK_Greek_eta, XK_twosuperior, XK_periodcentered, NoSymbol,
|
||||
|
||||
/*
|
||||
* special marked entries (256 + x)
|
||||
*/
|
||||
|
||||
NoSymbol, NoSymbol, XK_Shift_L, XK_Shift_R,
|
||||
XK_Caps_Lock, XK_Num_Lock, XK_Scroll_Lock, XK_Alt_L,
|
||||
NoSymbol, XK_Control_L, XK_Alt_L, XK_Alt_R,
|
||||
XK_Control_L, XK_Control_R, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, XK_F1,
|
||||
XK_F2, XK_F3, XK_F4, XK_F5,
|
||||
XK_F6, XK_F7, XK_F8, XK_F9,
|
||||
XK_F10, XK_F11, XK_F12, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
};
|
||||
|
||||
/*
|
||||
* KbdGetMapping --
|
||||
* Get the national keyboard mapping. The keyboard type is set, a new map
|
||||
* and the modifiermap is computed.
|
||||
*/
|
||||
|
||||
void
|
||||
KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
|
||||
KeySym *k;
|
||||
int i;
|
||||
KeySym *pMap = map;
|
||||
|
||||
for (i = 0; i < priv->keymap.n_keys && i < NUM_KEYCODES; i++) {
|
||||
if (remap[i]) {
|
||||
k = pMap + (remap[i] << 2);
|
||||
|
||||
k[0] = KD_GET_ENTRY(i,0); /* non-shifed */
|
||||
k[1] = KD_GET_ENTRY(i,1); /* shifted */
|
||||
k[2] = KD_GET_ENTRY(i,4); /* alt */
|
||||
k[3] = KD_GET_ENTRY(i,5); /* alt - shifted */
|
||||
|
||||
if (k[3] == k[2]) k[3] = NoSymbol;
|
||||
if (k[2] == k[1]) k[2] = NoSymbol;
|
||||
if (k[1] == k[0]) k[1] = NoSymbol;
|
||||
if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* compute the modifier map
|
||||
*/
|
||||
for (i = 0; i < MAP_LENGTH; i++)
|
||||
pModMap[i] = NoSymbol; /* make sure it is restored */
|
||||
|
||||
for (k = pMap, i = MIN_KEYCODE;
|
||||
i < (NUM_KEYCODES + MIN_KEYCODE);
|
||||
i++, k += GLYPHS_PER_KEY) {
|
||||
|
||||
switch(*k) {
|
||||
case XK_Shift_L:
|
||||
case XK_Shift_R:
|
||||
pModMap[i] = ShiftMask;
|
||||
break;
|
||||
|
||||
case XK_Control_L:
|
||||
case XK_Control_R:
|
||||
pModMap[i] = ControlMask;
|
||||
break;
|
||||
|
||||
case XK_Caps_Lock:
|
||||
pModMap[i] = LockMask;
|
||||
break;
|
||||
|
||||
case XK_Alt_L:
|
||||
case XK_Alt_R:
|
||||
pModMap[i] = AltMask;
|
||||
break;
|
||||
|
||||
case XK_Num_Lock:
|
||||
pModMap[i] = NumLockMask;
|
||||
break;
|
||||
|
||||
case XK_Scroll_Lock:
|
||||
pModMap[i] = ScrollLockMask;
|
||||
break;
|
||||
|
||||
/* kana support */
|
||||
case XK_Kana_Lock:
|
||||
case XK_Kana_Shift:
|
||||
pModMap[i] = KanaMask;
|
||||
break;
|
||||
|
||||
/* alternate toggle for multinational support */
|
||||
case XK_Mode_switch:
|
||||
pModMap[i] = AltLangMask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pKeySyms->map = pMap;
|
||||
pKeySyms->mapWidth = GLYPHS_PER_KEY;
|
||||
pKeySyms->minKeyCode = MIN_KEYCODE;
|
||||
pKeySyms->maxKeyCode = MAX_KEYCODE;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_init.c,v 3.13 2002/06/03 21:22:10 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 2001 by J. Kean Johnston <jkj@sco.com>
|
||||
* Copyright 2001-2005 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
@ -39,19 +39,19 @@
|
|||
|
||||
static Bool KeepTty = FALSE;
|
||||
static int VTnum = -1;
|
||||
static char *vtdevice = NULL;
|
||||
static char vtdevice[48];
|
||||
static int sco_console_mode = -1;
|
||||
|
||||
extern Bool mpxLock;
|
||||
|
||||
void
|
||||
xf86OpenConsole()
|
||||
xf86OpenConsole(void)
|
||||
{
|
||||
int fd,i, ioctl_ret;
|
||||
int i, ioctl_ret;
|
||||
struct vt_mode VT;
|
||||
static char vtname[32];
|
||||
struct vid_info vidinf;
|
||||
struct sigaction sigvtsw;
|
||||
char *ttn;
|
||||
|
||||
if (serverGeneration == 1) {
|
||||
/* check if we're run with euid==0 */
|
||||
|
@ -59,6 +59,9 @@ xf86OpenConsole()
|
|||
FatalError("xf86OpenConsole: Server must be setuid root\n");
|
||||
}
|
||||
|
||||
/* If we are run in the background we will get SIGTTOU. Ignore it. */
|
||||
OsSignal (SIGTTOU, SIG_IGN);
|
||||
|
||||
/*
|
||||
* Set up the virtual terminal (multiscreen in SCO parlance).
|
||||
* For the actual console itself, screens are numbered from
|
||||
|
@ -67,75 +70,37 @@ xf86OpenConsole()
|
|||
* system such as MaxSpeed or SunRiver. Therefore, we should
|
||||
* not make any assumptions about the TTY name we are on, and
|
||||
* instead we rely on ttyname() to give us the real TTY name.
|
||||
* Previously, XFree86 tried to determine the TTY name manually.
|
||||
* Previously, we tried to determine the TTY name manually.
|
||||
* This is wrong. The only time we need to futz with the TTY name
|
||||
* if if we were given the name of a TTY to run on explicity on
|
||||
* is if we were given the name of a TTY to run on explicity on
|
||||
* the command line.
|
||||
*/
|
||||
|
||||
if (VTnum == -1) {
|
||||
/*
|
||||
* We can query the current VT number using CONS_GETINFO.
|
||||
* No device was specified. We need to query the kernel to see which
|
||||
* console device we are on (and in fact if we are on a console at all).
|
||||
*/
|
||||
char *ttn;
|
||||
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (0, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: Not on a console device "
|
||||
"or error querying device (%s)\n", strerror (errno));
|
||||
}
|
||||
|
||||
VTnum = vidinf.m_num + 1; /* 0-based */
|
||||
ttn = ttyname (0);
|
||||
ttn = ttyname (1);
|
||||
|
||||
if (ttn == (char *)0) {
|
||||
ErrorF ("xf86OpenConsole: Error determining TTY name (%s)\n",
|
||||
strerror(errno));
|
||||
snprintf (vtname, sizeof(vtname)-1, "/dev/tty%02d", VTnum);
|
||||
} else {
|
||||
strlcpy (vtname, ttn, sizeof(vtname));
|
||||
FatalError ("xf86OpenConsole: Could not determine TTY name: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
vtdevice = vtname;
|
||||
} else if (VTnum == -2 || VTnum >= 0) {
|
||||
/*
|
||||
* An explicit device was specified. Make sure its a console device.
|
||||
*/
|
||||
if (VTnum != -2) {
|
||||
snprintf (vtname, sizeof(vtname)-1, "/dev/tty%02d", VTnum);
|
||||
vtdevice = vtname;
|
||||
}
|
||||
|
||||
fd = open (vtdevice, O_RDWR | O_NDELAY, 0);
|
||||
if (fd < 0) {
|
||||
FatalError ("xf86OpenConsole: Can not open device '%s' (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
}
|
||||
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (fd, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: '%s' is not a console device "
|
||||
"or error querying device (%s)\n", vtname, strerror (errno));
|
||||
}
|
||||
VTnum = vidinf.m_num + 1; /* 0-based */
|
||||
close (fd); /* We're done with it for now */
|
||||
strlcpy (vtdevice, ttn, sizeof(vtdevice));
|
||||
} else if (VTnum >= 0) {
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/tty%02d", VTnum);
|
||||
}
|
||||
|
||||
ErrorF("(using VT%02d device %s)\n\n", VTnum, vtdevice);
|
||||
/*
|
||||
* Now we can dispose of stdin/stdout
|
||||
*/
|
||||
fclose (stdin);
|
||||
fclose (stdout);
|
||||
|
||||
if ((xf86Info.consoleFd = open(vtdevice, O_RDWR | O_NDELAY, 0)) < 0) {
|
||||
FatalError("xf86OpenConsole: Cannot open %s (%s)\n", vtdevice,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/* Dispose of stdin and stdout */
|
||||
if (freopen(vtdevice, "r+", stdin) == (FILE *) NULL) {
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdin as %s (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
}
|
||||
|
||||
if (freopen(vtname, "r+", stdout) == (FILE *) NULL) {
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdout as %s (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
FatalError("xf86OpenConsole: Cannot open %s: %s\n", vtdevice,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -145,10 +110,13 @@ xf86OpenConsole()
|
|||
*/
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (xf86Info.consoleFd, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: Failed to query console number (%s)\n",
|
||||
strerror (errno));
|
||||
FatalError ("xf86OpenConsole: %s not a console device "
|
||||
"or error querying device: %s\n", vtdevice, strerror (errno));
|
||||
}
|
||||
xf86Info.vtno = vidinf.m_num;
|
||||
VTnum = vidinf.m_num + 1; /* 0-based */
|
||||
|
||||
ErrorF("(using VT%02d device %s)\n\n", VTnum, vtdevice);
|
||||
|
||||
/* We activate the console just in case its not the one we are on */
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
||||
|
@ -161,7 +129,7 @@ xf86OpenConsole()
|
|||
}
|
||||
|
||||
/*
|
||||
* Now we get the current mode that the console device is on. We will
|
||||
* Now we get the current mode that the console device is in. We will
|
||||
* use this later when we close the console device to restore it to
|
||||
* that same mode.
|
||||
*/
|
||||
|
@ -227,7 +195,7 @@ xf86OpenConsole()
|
|||
* video card down again after coming out of Xfree86.
|
||||
*/
|
||||
void
|
||||
xf86CloseConsole()
|
||||
xf86CloseConsole(void)
|
||||
{
|
||||
struct vt_mode VT;
|
||||
struct sigaction sigvtsw;
|
||||
|
@ -310,7 +278,7 @@ xf86ProcessArgument(int argc, char *argv[], int i)
|
|||
return(0);
|
||||
} else {
|
||||
VTnum = -2;
|
||||
vtdevice = argv[i];
|
||||
strlcpy (vtdevice, argv[i], sizeof(vtdevice));
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
|
@ -318,7 +286,7 @@ xf86ProcessArgument(int argc, char *argv[], int i)
|
|||
}
|
||||
|
||||
void
|
||||
xf86UseMsg()
|
||||
xf86UseMsg(void)
|
||||
{
|
||||
ErrorF("vtXX use the specified VT number\n");
|
||||
ErrorF("-crt DEVICE use the specified VT device\n");
|
||||
|
|
|
@ -73,7 +73,7 @@ xf86SetKbdLeds(int leds)
|
|||
}
|
||||
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
xf86GetKbdLeds(void)
|
||||
{
|
||||
int leds;
|
||||
|
||||
|
@ -140,7 +140,7 @@ static uchar_t *sc_mapbuf;
|
|||
static uchar_t *sc_mapbuf2;
|
||||
|
||||
void
|
||||
xf86KbdInit()
|
||||
xf86KbdInit(void)
|
||||
{
|
||||
orig_getsc = 0;
|
||||
if (ioctl (xf86Info.consoleFd, TCGETSC, &orig_getsc) < 0)
|
||||
|
@ -214,7 +214,7 @@ xf86KbdInit()
|
|||
}
|
||||
|
||||
int
|
||||
xf86KbdOn()
|
||||
xf86KbdOn(void)
|
||||
{
|
||||
struct termios newtio;
|
||||
|
||||
|
@ -248,7 +248,7 @@ xf86KbdOn()
|
|||
}
|
||||
|
||||
int
|
||||
xf86KbdOff()
|
||||
xf86KbdOff(void)
|
||||
{
|
||||
/* Revert back to original translate scancode mode */
|
||||
if (use_tcs)
|
||||
|
@ -267,11 +267,3 @@ xf86KbdOff()
|
|||
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
#include "xf86OSKbd.h"
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -66,7 +66,8 @@ extern long sysi86 (int cmd, ...);
|
|||
|
||||
static Bool IOEnabled = FALSE;
|
||||
|
||||
Bool xf86EnableIO(void)
|
||||
Bool
|
||||
xf86EnableIO(void)
|
||||
{
|
||||
if (IOEnabled)
|
||||
return TRUE;
|
||||
|
@ -80,7 +81,8 @@ Bool xf86EnableIO(void)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void xf86DisableIO(void)
|
||||
void
|
||||
xf86DisableIO(void)
|
||||
{
|
||||
if (!IOEnabled)
|
||||
return;
|
||||
|
@ -93,7 +95,8 @@ void xf86DisableIO(void)
|
|||
/* Interrupt Handling section */
|
||||
/***************************************************************************/
|
||||
|
||||
Bool xf86DisableInterrupts()
|
||||
Bool
|
||||
xf86DisableInterrupts(void)
|
||||
{
|
||||
if (!IOEnabled) {
|
||||
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
||||
|
@ -113,7 +116,8 @@ Bool xf86DisableInterrupts()
|
|||
return(TRUE);
|
||||
}
|
||||
|
||||
void xf86EnableInterrupts()
|
||||
void
|
||||
xf86EnableInterrupts(void)
|
||||
{
|
||||
if (!IOEnabled) {
|
||||
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
||||
|
|
530
hw/xfree86/os-support/sco/sco_kbd.c
Normal file
530
hw/xfree86/os-support/sco/sco_kbd.c
Normal file
|
@ -0,0 +1,530 @@
|
|||
/* $XFree86$ */
|
||||
/*
|
||||
* Copyright 2005 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* 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 J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON 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.
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
/*
|
||||
* Based on sco_io.c which is
|
||||
* (C) Copyright 2003 J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Based on lnx_kbd.c which is
|
||||
* Copyright (c) 2002 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Based on the code from lnx_io.c which is
|
||||
* Copyright 1992 by Orest Zborowski <obz@Kodak.com>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*/
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86OSpriv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSKbd.h"
|
||||
#include "atKeynames.h"
|
||||
#include "sco_kbd.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/emap.h>
|
||||
#include <sys/nmap.h>
|
||||
|
||||
static KbdProtocolRec protocols[] = {
|
||||
{ "standard", PROT_STD },
|
||||
{ NULL, PROT_UNKNOWN_KBD }
|
||||
};
|
||||
|
||||
extern Bool VTSwitchEnabled;
|
||||
#ifdef USE_VT_SYSREQ
|
||||
extern Bool VTSysreqToggle;
|
||||
#endif
|
||||
|
||||
static void
|
||||
SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch) {
|
||||
ioctl(pInfo->fd, KIOCSOUND, 1193180 / pitch);
|
||||
usleep(duration * loudness * 20);
|
||||
ioctl(pInfo->fd, KIOCSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SetKbdLeds(InputInfoPtr pInfo, int leds)
|
||||
{
|
||||
int real_leds = 0;
|
||||
static int once = 1;
|
||||
|
||||
/*
|
||||
* sleep the first time through under SCO. There appears to be a
|
||||
* timing problem in the driver which causes the keyboard to be lost.
|
||||
* This usleep stops it from occurring. NOTE: this was in the old code.
|
||||
* I am not convinced it is true any longer, but it doesn't hurt to
|
||||
* leave this in here.
|
||||
*/
|
||||
if (once) {
|
||||
usleep(100);
|
||||
once = 0;
|
||||
}
|
||||
|
||||
#ifdef LED_CAP
|
||||
if (leds & XLED1)
|
||||
real_leds |= LED_CAP;
|
||||
if (leds & XLED2)
|
||||
real_leds |= LED_NUM;
|
||||
if (leds & XLED3)
|
||||
real_leds |= LED_SCR;
|
||||
#ifdef LED_COMP
|
||||
if (leds & XLED4)
|
||||
real_leds |= LED_COMP;
|
||||
#else
|
||||
if (leds & XLED4)
|
||||
real_leds |= LED_SCR;
|
||||
#endif
|
||||
#endif
|
||||
ioctl(pInfo->fd, KDSETLED, real_leds);
|
||||
}
|
||||
|
||||
static int
|
||||
GetKbdLeds(InputInfoPtr pInfo)
|
||||
{
|
||||
int real_leds, leds = 0;
|
||||
|
||||
ioctl(pInfo->fd, KDGETLED, &real_leds);
|
||||
|
||||
if (real_leds & LED_CAP) leds |= XLED1;
|
||||
if (real_leds & LED_NUM) leds |= XLED2;
|
||||
if (real_leds & LED_SCR) leds |= XLED3;
|
||||
|
||||
return(leds);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: Only OpenServer Release 5.0.6 with Release Supplement 5.0.6A
|
||||
* and later have the required ioctl. 5.0.6A or higher is HIGHLY
|
||||
* recommended. The console driver is quite a different beast on that OS.
|
||||
*/
|
||||
#undef rate
|
||||
|
||||
static void
|
||||
SetKbdRepeat(InputInfoPtr pInfo, char rad)
|
||||
{
|
||||
#if defined(KBIO_SETRATE)
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
int i;
|
||||
int value = 0x7f; /* Maximum delay with slowest rate */
|
||||
int delay = 250; /* Default delay */
|
||||
int rate = 300; /* Default repeat rate */
|
||||
|
||||
static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
|
||||
133, 120, 109, 100, 92, 86, 80, 75, 67,
|
||||
60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
|
||||
25, 23, 21, 20 };
|
||||
#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
|
||||
|
||||
static int valid_delays[] = { 250, 500, 750, 1000 };
|
||||
#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
|
||||
|
||||
if (pKbd->rate >= 0)
|
||||
rate = pKbd->rate * 10;
|
||||
if (pKbd->delay >= 0)
|
||||
delay = pKbd->delay;
|
||||
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
if (rate >= valid_rates[i]) {
|
||||
value &= 0x60;
|
||||
value |= i;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < DELAY_COUNT; i++)
|
||||
if (delay <= valid_delays[i]) {
|
||||
value &= 0x1f;
|
||||
value |= i << 5;
|
||||
break;
|
||||
}
|
||||
|
||||
ioctl (pInfo->fd, KBIO_SETRATE, value);
|
||||
#endif /* defined(KBIO_SETRATE) */
|
||||
}
|
||||
|
||||
static int
|
||||
KbdInit(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
priv->use_tcs = 1;
|
||||
priv->use_kd = 1;
|
||||
priv->no_nmap = 1;
|
||||
priv->no_emap = 1;
|
||||
priv->orig_getsc = 0;
|
||||
|
||||
if (ioctl (pInfo->fd, TCGETSC, &priv->orig_getsc) < 0)
|
||||
priv->use_tcs = 0;
|
||||
if (ioctl (pInfo->fd, KDGKBMODE, &priv->orig_kbm) < 0)
|
||||
priv->use_kd = 0;
|
||||
|
||||
if (!priv->use_tcs && !priv->use_kd) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Could not determine keyboard mode\n");
|
||||
return !Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* One day this should be fixed to translate normal ASCII characters
|
||||
* back into scancodes or into events that XFree86 wants, but not
|
||||
* now. For the time being, we only support scancode mode screens.
|
||||
*/
|
||||
if (priv->use_tcs && !(priv->orig_getsc & KB_ISSCANCODE)) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Keyboard can not send scancodes\n");
|
||||
return !Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to get the original keyboard map and NUL out the lock
|
||||
* modifiers. This prevents the scancode API from messing with
|
||||
* the keyboard LED's. We restore the original map when we exit.
|
||||
*/
|
||||
if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->keymap) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
}
|
||||
if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->noledmap) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
} else {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < priv->noledmap.n_keys; i++) {
|
||||
for (j = 0; j < NUM_STATES; j++) {
|
||||
if (IS_SPECIAL(priv->noledmap, i, j) &&
|
||||
((priv->noledmap.key[i].map[j] == K_CLK) ||
|
||||
(priv->noledmap.key[i].map[j] == K_NLK) ||
|
||||
(priv->noledmap.key[i].map[j] == K_SLK))) {
|
||||
priv->noledmap.key[i].map[j] = K_NOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ioctl (pInfo->fd, XCGETA, &priv->kbdtty) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get terminal modes (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
}
|
||||
|
||||
priv->sc_mapbuf = xalloc (10*BSIZE);
|
||||
priv->sc_mapbuf2 = xalloc(10*BSIZE);
|
||||
|
||||
/* Get the emap */
|
||||
if (ioctl (pInfo->fd, LDGMAP, priv->sc_mapbuf) < 0) {
|
||||
if (errno != ENAVAIL) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to retrieve e-map (%s)\n",
|
||||
strerror (errno));
|
||||
return !Success;
|
||||
}
|
||||
priv->no_emap = 0;
|
||||
}
|
||||
|
||||
/* Get the nmap */
|
||||
if (ioctl (pInfo->fd, NMGMAP, priv->sc_mapbuf2) < 0) {
|
||||
if (errno != ENAVAIL) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to retrieve n-map (%s)\n",
|
||||
strerror (errno));
|
||||
return !Success;
|
||||
}
|
||||
priv->no_nmap = 0;
|
||||
}
|
||||
} /* End of if we are on a console */
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
KbdOn(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
|
||||
struct termios newtio;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
ioctl (pInfo->fd, LDNMAP); /* Turn e-mapping off */
|
||||
ioctl (pInfo->fd, NMNMAP); /* Turn n-mapping off */
|
||||
|
||||
newtio = priv->kbdtty; /* structure copy */
|
||||
newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
|
||||
newtio.c_oflag = 0;
|
||||
newtio.c_cflag = CREAD | CS8 | B9600;
|
||||
newtio.c_lflag = 0;
|
||||
newtio.c_cc[VTIME]=0;
|
||||
newtio.c_cc[VMIN]=1;
|
||||
cfsetispeed(&newtio, 9600);
|
||||
cfsetospeed(&newtio, 9600);
|
||||
ioctl(pInfo->fd, XCSETA, &newtio);
|
||||
|
||||
/* Now tell the keyboard driver to send us raw scancodes */
|
||||
if (priv->use_tcs) {
|
||||
int nm = priv->orig_getsc;
|
||||
nm &= ~KB_XSCANCODE;
|
||||
ioctl (pInfo->fd, TCSETSC, &nm);
|
||||
}
|
||||
|
||||
if (priv->use_kd)
|
||||
ioctl (pInfo->fd, KDSKBMODE, K_RAW);
|
||||
|
||||
ioctl (pInfo->fd, PIO_KEYMAP, &priv->noledmap);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
KbdOff(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
/* Revert back to original translate scancode mode */
|
||||
if (priv->use_tcs)
|
||||
ioctl (pInfo->fd, TCSETSC, &priv->orig_getsc);
|
||||
if (priv->use_kd)
|
||||
ioctl (pInfo->fd, KDSKBMODE, priv->orig_kbm);
|
||||
|
||||
ioctl (pInfo->fd, PIO_KEYMAP, &priv->keymap);
|
||||
|
||||
if (priv->no_emap)
|
||||
ioctl (pInfo->fd, LDSMAP, priv->sc_mapbuf);
|
||||
if (priv->no_nmap)
|
||||
ioctl (pInfo->fd, NMSMAP, priv->sc_mapbuf2);
|
||||
|
||||
ioctl(pInfo->fd, XCSETA, &priv->kbdtty);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
GetSpecialKey(InputInfoPtr pInfo, int scanCode)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
int specialkey = scanCode;
|
||||
|
||||
if (pKbd->CustomKeycodes) {
|
||||
specialkey = pKbd->specialMap->map[scanCode];
|
||||
}
|
||||
return specialkey;
|
||||
}
|
||||
|
||||
#define ModifierSet(k) ((modifiers & (k)) == (k))
|
||||
|
||||
static Bool
|
||||
SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
|
||||
if(!pKbd->vtSwitchSupported)
|
||||
return FALSE;
|
||||
|
||||
if ((!ModifierSet(ShiftMask)) && ((ModifierSet(ControlMask | AltMask)) ||
|
||||
(ModifierSet(ControlMask | AltLangMask)))) {
|
||||
if (VTSwitchEnabled && !xf86Info.vtSysreq) {
|
||||
switch (key) {
|
||||
case KEY_F1:
|
||||
case KEY_F2:
|
||||
case KEY_F3:
|
||||
case KEY_F4:
|
||||
case KEY_F5:
|
||||
case KEY_F6:
|
||||
case KEY_F7:
|
||||
case KEY_F8:
|
||||
case KEY_F9:
|
||||
case KEY_F10:
|
||||
if (down) {
|
||||
int sts = key - KEY_F1;
|
||||
if (sts != xf86Info.vtno) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, sts);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case KEY_F11:
|
||||
case KEY_F12:
|
||||
if (down) {
|
||||
int sts = key - KEY_F11 + 10;
|
||||
if (sts != xf86Info.vtno) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, sts);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef USE_VT_SYSREQ
|
||||
if (VTSwitchEnabled && xf86Info.vtSysreq) {
|
||||
switch (key) {
|
||||
case KEY_F1:
|
||||
case KEY_F2:
|
||||
case KEY_F3:
|
||||
case KEY_F4:
|
||||
case KEY_F5:
|
||||
case KEY_F6:
|
||||
case KEY_F7:
|
||||
case KEY_F8:
|
||||
case KEY_F9:
|
||||
case KEY_F10:
|
||||
if (VTSysreqToggle && down) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F1);
|
||||
VTSysreqToggle = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
case KEY_F11:
|
||||
case KEY_F12:
|
||||
if (VTSysreqToggle && down) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F11 + 10);
|
||||
VTSysreqToggle = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
/* Ignore these keys -- ie don't let them cancel an alt-sysreq */
|
||||
case KEY_Alt:
|
||||
case KEY_AltLang:
|
||||
break;
|
||||
case KEY_SysReqest:
|
||||
if (!(ModifierSet(ShiftMask) || ModifierSet(ControlMask))) {
|
||||
if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
|
||||
VTSysreqToggle = TRUE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* We only land here when Alt-SysReq is followed by a
|
||||
* non-switching key.
|
||||
*/
|
||||
if (VTSysreqToggle)
|
||||
VTSysreqToggle = FALSE;
|
||||
}
|
||||
}
|
||||
#endif /* USE_VT_SYSREQ */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
stdReadInput(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
unsigned char rBuf[64];
|
||||
int nBytes, i;
|
||||
|
||||
if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
|
||||
for (i = 0; i < nBytes; i++) {
|
||||
pKbd->PostEvent(pInfo, rBuf[i] & 0x7f, rBuf[i] & 0x80 ? FALSE : TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
OpenKeyboard(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
int i;
|
||||
KbdProtocolId prot = PROT_UNKNOWN_KBD;
|
||||
char *s;
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
|
||||
for (i = 0; protocols[i].name; i++) {
|
||||
if (xf86NameCmp(s, protocols[i].name) == 0) {
|
||||
prot = protocols[i].id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (prot) {
|
||||
case PROT_STD:
|
||||
pInfo->read_input = stdReadInput;
|
||||
break;
|
||||
default:
|
||||
xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
|
||||
xfree(s);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
|
||||
xfree(s);
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "Device", NULL);
|
||||
if (s == NULL) {
|
||||
pInfo->fd = xf86Info.consoleFd;
|
||||
pKbd->isConsole = TRUE;
|
||||
} else {
|
||||
pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
|
||||
if (pInfo->fd == -1) {
|
||||
xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
|
||||
xfree(s);
|
||||
return FALSE;
|
||||
}
|
||||
pKbd->isConsole = FALSE;
|
||||
xfree(s);
|
||||
}
|
||||
|
||||
if (pKbd->isConsole)
|
||||
pKbd->vtSwitchSupported = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = pInfo->private;
|
||||
|
||||
pKbd->KbdInit = KbdInit;
|
||||
pKbd->KbdOn = KbdOn;
|
||||
pKbd->KbdOff = KbdOff;
|
||||
pKbd->Bell = SoundBell;
|
||||
pKbd->SetLeds = SetKbdLeds;
|
||||
pKbd->GetLeds = GetKbdLeds;
|
||||
pKbd->SetKbdRepeat = SetKbdRepeat;
|
||||
pKbd->KbdGetMapping = KbdGetMapping;
|
||||
pKbd->SpecialKey = SpecialKey;
|
||||
pKbd->GetSpecialKey = GetSpecialKey;
|
||||
pKbd->OpenKeyboard = OpenKeyboard;
|
||||
pKbd->RemapScanCode = ATScancode;
|
||||
pKbd->vtSwitchSupported = FALSE;
|
||||
|
||||
pKbd->private = xcalloc(sizeof(ScoKbdPrivRec), 1);
|
||||
if (pKbd->private == NULL) {
|
||||
xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
20
hw/xfree86/os-support/sco/sco_kbd.h
Normal file
20
hw/xfree86/os-support/sco/sco_kbd.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* $XFree86$ */
|
||||
#ifndef SCO_KBD_HDR
|
||||
#define SCO_KBD_HDR
|
||||
|
||||
typedef struct {
|
||||
int use_tcs;
|
||||
int use_kd;
|
||||
int no_nmap;
|
||||
int no_emap;
|
||||
int orig_getsc;
|
||||
int orig_kbm;
|
||||
struct termios kbdtty;
|
||||
keymap_t keymap, noledmap;
|
||||
uchar_t *sc_mapbuf;
|
||||
uchar_t *sc_mapbuf2;
|
||||
} ScoKbdPrivRec, *ScoKbdPrivPtr;
|
||||
|
||||
extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
|
||||
CARD8 *pModMap);
|
||||
#endif /* SCO_KBD_HDR */
|
|
@ -42,8 +42,7 @@
|
|||
static int
|
||||
SupportedInterfaces (void)
|
||||
{
|
||||
/* FIXME: Is this correct? Should we just return MSE_MISC? */
|
||||
return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_MISC | MSE_AUTO;
|
||||
return MSE_MISC;
|
||||
}
|
||||
|
||||
static const char *internalNames[] = {
|
||||
|
@ -107,8 +106,8 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
|||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
dmask = D_REL | D_BUTTON;
|
||||
if ((evi = ev_init()) < 0) {
|
||||
dmask = D_ABS | D_REL | D_BUTTON;
|
||||
if ((evi = ev_initf(xf86Info.consoleFd)) < 0) {
|
||||
FatalError ("OsMouseProc: Event driver initialization failed (%s)\n",
|
||||
evtErrStr(evi));
|
||||
}
|
||||
|
@ -127,9 +126,9 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
|||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
map[4] = 6;
|
||||
map[5] = 7;
|
||||
map[6] = 8;
|
||||
map[4] = 7;
|
||||
map[5] = 8;
|
||||
map[6] = 6;
|
||||
map[7] = 4;
|
||||
map[8] = 5; /* Compatibile with SCO X server */
|
||||
|
||||
|
@ -161,7 +160,7 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
|||
|
||||
case DEVICE_OFF:
|
||||
case DEVICE_CLOSE:
|
||||
pPointer->public.on = TRUE;
|
||||
pPointer->public.on = FALSE;
|
||||
RemoveEnabledDevice (pInfo->fd);
|
||||
if (what == DEVICE_CLOSE) {
|
||||
ev_close();
|
||||
|
@ -185,18 +184,15 @@ OsMouseReadInput (InputInfoPtr pInfo)
|
|||
|
||||
while ((evp = ev_read()) != (EVENT *)0) {
|
||||
int buttons = EV_BUTTONS(*evp);
|
||||
int dx = EV_DX(*evp), dy = -(EV_DY(*evp)), dz = 0, dw = 0;
|
||||
int dx = EV_DX(*evp), dy = -(EV_DY(*evp));
|
||||
|
||||
if (EV_TAG(*evp) & T_WHEEL) {
|
||||
dz = (dy & 0x08) ? (dy & 0x0f) - 16 : (dy & 0x0f);
|
||||
dx = dy = 0;
|
||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
||||
pMse->PostEvent (pInfo, buttons, 0, 0, 0, 0);
|
||||
/* Simulate button release */
|
||||
dz = 0;
|
||||
buttons &= ~(WHEEL_FWD | WHEEL_BACK);
|
||||
}
|
||||
|
||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
||||
pMse->PostEvent (pInfo, buttons, dx, dy, 0, 0);
|
||||
ev_pop();
|
||||
}
|
||||
}
|
||||
|
@ -217,9 +213,9 @@ OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
|
|||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||
|
||||
/* Check if the device can be opened. */
|
||||
pInfo->fd = ev_init();
|
||||
pInfo->fd = ev_initf(xf86Info.consoleFd);
|
||||
if (pInfo->fd != -1) {
|
||||
dmask_t dmask = (D_REL | D_BUTTON);
|
||||
dmask_t dmask = (D_ABS | D_REL | D_BUTTON);
|
||||
pInfo->fd = ev_open(&dmask);
|
||||
} else {
|
||||
pInfo->fd = -999;
|
||||
|
|
|
@ -65,7 +65,7 @@ xf86KbdInit()
|
|||
ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
|
||||
#endif
|
||||
ioctl (xf86Info.consoleFd, TCGETA, &kbdtty);
|
||||
#if defined(E_TABSZ) && !defined(SCO325)
|
||||
#if defined(E_TABSZ)
|
||||
kbdemap = xalloc(E_TABSZ);
|
||||
if (ioctl(xf86Info.consoleFd, LDGMAP, kbdemap) < 0)
|
||||
{
|
||||
|
|
304
hw/xfree86/os-support/usl/usl_KbdMap.c
Normal file
304
hw/xfree86/os-support/usl/usl_KbdMap.c
Normal file
|
@ -0,0 +1,304 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2005 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* 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 J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Based on xf86KbdMap.c, which is
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
|
||||
* Copyright (c) 1992-2003 by The XFree86 Project, Inc.
|
||||
*/
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSKbd.h"
|
||||
#include "atKeynames.h"
|
||||
#include "xf86Keymap.h"
|
||||
|
||||
#include "usl_kbd.h"
|
||||
|
||||
#define KD_GET_ENTRY(i,n) \
|
||||
eascii_to_x[((priv->keymap.key[i].spcl << (n+1)) & 0x100) + priv->keymap.key[i].map[n]]
|
||||
|
||||
/*
|
||||
* NOTE: Not all possible remappable symbols are remapped. There are two main
|
||||
* reasons:
|
||||
* a) The mapping between scancode and SYSV/386 - symboltable
|
||||
* is inconsistent between different versions and has some
|
||||
* BIG mistakes.
|
||||
* b) In X-Windows there is a difference between numpad-keys
|
||||
* and normal keys. SYSV/386 uses for both kinds of keys
|
||||
* the same symbol.
|
||||
*
|
||||
* Thus only the alpha keypad and the function keys are translated.
|
||||
* Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
|
||||
*/
|
||||
|
||||
static unsigned char remap[128] = {
|
||||
0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00 - 0x07 */
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08 - 0x0f */
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10 - 0x17 */
|
||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18 - 0x1f */
|
||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20 - 0x27 */
|
||||
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28 - 0x2f */
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0, /* 0x30 - 0x37 */
|
||||
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38 - 0x3f */
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0, /* 0x40 - 0x47 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x48 - 0x4f */
|
||||
0, 0, 0, 0, 0, 0, 0x56, 0x57, /* 0x50 - 0x57 */
|
||||
0x58, 0, 0, 0, 0, 0, 0, 0, /* 0x58 - 0x5f */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x67 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x68 - 0x6f */
|
||||
0, 0, 0x69, 0x65, 0, 0, 0, 0, /* 0x70 - 0x77 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, /* 0x78 - 0x7f */
|
||||
};
|
||||
|
||||
static KeySym eascii_to_x[512] = {
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_BackSpace, XK_Tab, XK_Linefeed, NoSymbol,
|
||||
NoSymbol, XK_Return, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, XK_Escape,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_space, XK_exclam, XK_quotedbl, XK_numbersign,
|
||||
XK_dollar, XK_percent, XK_ampersand, XK_apostrophe,
|
||||
XK_parenleft, XK_parenright, XK_asterisk, XK_plus,
|
||||
XK_comma, XK_minus, XK_period, XK_slash,
|
||||
XK_0, XK_1, XK_2, XK_3,
|
||||
XK_4, XK_5, XK_6, XK_7,
|
||||
XK_8, XK_9, XK_colon, XK_semicolon,
|
||||
XK_less, XK_equal, XK_greater, XK_question,
|
||||
XK_at, XK_A, XK_B, XK_C,
|
||||
XK_D, XK_E, XK_F, XK_G,
|
||||
XK_H, XK_I, XK_J, XK_K,
|
||||
XK_L, XK_M, XK_N, XK_O,
|
||||
XK_P, XK_Q, XK_R, XK_S,
|
||||
XK_T, XK_U, XK_V, XK_W,
|
||||
XK_X, XK_Y, XK_Z, XK_bracketleft,
|
||||
XK_backslash, XK_bracketright,XK_asciicircum, XK_underscore,
|
||||
XK_grave, XK_a, XK_b, XK_c,
|
||||
XK_d, XK_e, XK_f, XK_g,
|
||||
XK_h, XK_i, XK_j, XK_k,
|
||||
XK_l, XK_m, XK_n, XK_o,
|
||||
XK_p, XK_q, XK_r, XK_s,
|
||||
XK_t, XK_u, XK_v, XK_w,
|
||||
XK_x, XK_y, XK_z, XK_braceleft,
|
||||
XK_bar, XK_braceright, XK_asciitilde, XK_Delete,
|
||||
XK_Ccedilla, XK_udiaeresis, XK_eacute, XK_acircumflex,
|
||||
XK_adiaeresis, XK_agrave, XK_aring, XK_ccedilla,
|
||||
XK_ecircumflex, XK_ediaeresis, XK_egrave, XK_idiaeresis,
|
||||
XK_icircumflex, XK_igrave, XK_Adiaeresis, XK_Aring,
|
||||
XK_Eacute, XK_ae, XK_AE, XK_ocircumflex,
|
||||
XK_odiaeresis, XK_ograve, XK_ucircumflex, XK_ugrave,
|
||||
XK_ydiaeresis, XK_Odiaeresis, XK_Udiaeresis, XK_cent,
|
||||
XK_sterling, XK_yen, XK_paragraph, XK_section,
|
||||
XK_aacute, XK_iacute, XK_oacute, XK_uacute,
|
||||
XK_ntilde, XK_Ntilde, XK_ordfeminine, XK_masculine,
|
||||
XK_questiondown,XK_hyphen, XK_notsign, XK_onehalf,
|
||||
XK_onequarter, XK_exclamdown, XK_guillemotleft,XK_guillemotright,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
XK_Greek_alpha, XK_ssharp, XK_Greek_GAMMA, XK_Greek_pi,
|
||||
XK_Greek_SIGMA, XK_Greek_sigma, XK_mu, XK_Greek_tau,
|
||||
XK_Greek_PHI, XK_Greek_THETA, XK_Greek_OMEGA, XK_Greek_delta,
|
||||
XK_infinity, XK_Ooblique, XK_Greek_epsilon, XK_intersection,
|
||||
XK_identical, XK_plusminus, XK_greaterthanequal, XK_lessthanequal,
|
||||
XK_topintegral, XK_botintegral, XK_division, XK_similarequal,
|
||||
XK_degree, NoSymbol, NoSymbol, XK_radical,
|
||||
XK_Greek_eta, XK_twosuperior, XK_periodcentered, NoSymbol,
|
||||
|
||||
/*
|
||||
* special marked entries (256 + x)
|
||||
*/
|
||||
|
||||
NoSymbol, NoSymbol, XK_Shift_L, XK_Shift_R,
|
||||
XK_Caps_Lock, XK_Num_Lock, XK_Scroll_Lock, XK_Alt_L,
|
||||
NoSymbol, XK_Control_L, XK_Alt_L, XK_Alt_R,
|
||||
XK_Control_L, XK_Control_R, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, XK_F1,
|
||||
XK_F2, XK_F3, XK_F4, XK_F5,
|
||||
XK_F6, XK_F7, XK_F8, XK_F9,
|
||||
XK_F10, XK_F11, XK_F12, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
};
|
||||
|
||||
/*
|
||||
* KbdGetMapping --
|
||||
* Get the national keyboard mapping. The keyboard type is set, a new map
|
||||
* and the modifiermap is computed.
|
||||
*/
|
||||
|
||||
void
|
||||
KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
|
||||
KeySym *k;
|
||||
int i;
|
||||
KeySym *pMap = map;
|
||||
|
||||
for (i = 0; i < priv->keymap.n_keys && i < NUM_KEYCODES; i++) {
|
||||
if (remap[i]) {
|
||||
k = pMap + (remap[i] << 2);
|
||||
|
||||
k[0] = KD_GET_ENTRY(i,0); /* non-shifed */
|
||||
k[1] = KD_GET_ENTRY(i,1); /* shifted */
|
||||
k[2] = KD_GET_ENTRY(i,4); /* alt */
|
||||
k[3] = KD_GET_ENTRY(i,5); /* alt - shifted */
|
||||
|
||||
if (k[3] == k[2]) k[3] = NoSymbol;
|
||||
if (k[2] == k[1]) k[2] = NoSymbol;
|
||||
if (k[1] == k[0]) k[1] = NoSymbol;
|
||||
if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* compute the modifier map
|
||||
*/
|
||||
for (i = 0; i < MAP_LENGTH; i++)
|
||||
pModMap[i] = NoSymbol; /* make sure it is restored */
|
||||
|
||||
for (k = pMap, i = MIN_KEYCODE;
|
||||
i < (NUM_KEYCODES + MIN_KEYCODE);
|
||||
i++, k += 4) {
|
||||
|
||||
switch(*k) {
|
||||
case XK_Shift_L:
|
||||
case XK_Shift_R:
|
||||
pModMap[i] = ShiftMask;
|
||||
break;
|
||||
|
||||
case XK_Control_L:
|
||||
case XK_Control_R:
|
||||
pModMap[i] = ControlMask;
|
||||
break;
|
||||
|
||||
case XK_Caps_Lock:
|
||||
pModMap[i] = LockMask;
|
||||
break;
|
||||
|
||||
case XK_Alt_L:
|
||||
case XK_Alt_R:
|
||||
pModMap[i] = AltMask;
|
||||
break;
|
||||
|
||||
case XK_Num_Lock:
|
||||
pModMap[i] = NumLockMask;
|
||||
break;
|
||||
|
||||
case XK_Scroll_Lock:
|
||||
pModMap[i] = ScrollLockMask;
|
||||
break;
|
||||
|
||||
/* kana support */
|
||||
case XK_Kana_Lock:
|
||||
case XK_Kana_Shift:
|
||||
pModMap[i] = KanaMask;
|
||||
break;
|
||||
|
||||
/* alternate toggle for multinational support */
|
||||
case XK_Mode_switch:
|
||||
pModMap[i] = AltLangMask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pKeySyms->map = pMap;
|
||||
pKeySyms->mapWidth = GLYPHS_PER_KEY;
|
||||
pKeySyms->minKeyCode = MIN_KEYCODE;
|
||||
pKeySyms->maxKeyCode = MAX_KEYCODE;
|
||||
}
|
359
hw/xfree86/os-support/usl/usl_init.c
Normal file
359
hw/xfree86/os-support/usl/usl_init.c
Normal file
|
@ -0,0 +1,359 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2001-2005 by Kean Johnston <jkj@sco.com>
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
*
|
||||
* 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 names of Thomas Roell, David Wexelblat
|
||||
* and Kean Johnston not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior permission.
|
||||
* Thomas Roell, David Wexelblat and Kean Johnston make no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
*
|
||||
* THOMAS ROELL, DAVID WEXELBLAT AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
|
||||
* OR KEAN JOHNSTON 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.
|
||||
*
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
#include <sys/utsname.h>
|
||||
|
||||
static Bool KeepTty = FALSE;
|
||||
static Bool Protect0 = FALSE;
|
||||
static Bool CRTSpecified = FALSE;
|
||||
static int VTnum = -1;
|
||||
static char vtdevice[48];
|
||||
|
||||
int usl_is_osr6 = -1;
|
||||
|
||||
static Bool
|
||||
IsConsoleDevice(const char *dev)
|
||||
{
|
||||
if ((!strcmp (dev, "/dev/console")) ||
|
||||
(!strcmp (dev, "/dev/syscon")) ||
|
||||
(!strcmp (dev, "/dev/systty")))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
is_osr6 (void)
|
||||
{
|
||||
struct utsname uts;
|
||||
|
||||
if (usl_is_osr6 == -1) {
|
||||
if (uname (&uts) < 0) {
|
||||
FatalError ("get_usl_ver: Failed to determine UNIX name (%s)\n",
|
||||
strerror (errno));
|
||||
}
|
||||
|
||||
if (uts.version[0] == '6')
|
||||
usl_is_osr6 = 1;
|
||||
else
|
||||
usl_is_osr6 = 0;
|
||||
}
|
||||
|
||||
return usl_is_osr6;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
xf86OpenConsole(void)
|
||||
{
|
||||
int fd, i, ioctl_ret;
|
||||
struct vt_mode VT;
|
||||
struct vt_stat vts;
|
||||
MessageType from = X_PROBED;
|
||||
struct sigaction sigvtsw;
|
||||
char *ttn;
|
||||
|
||||
if (serverGeneration == 1) {
|
||||
int isconsole = 0, consdev = 0;
|
||||
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0) {
|
||||
FatalError("xf86OpenConsole: Server must be suid root\n");
|
||||
}
|
||||
|
||||
/* If we are run in the background we will get SIGTTOU. Ignore it. */
|
||||
OsSignal (SIGTTOU, SIG_IGN);
|
||||
|
||||
/* Protect page 0 to help find NULL dereferencing */
|
||||
/* mprotect() doesn't seem to work */
|
||||
if (Protect0) {
|
||||
int fd = -1;
|
||||
|
||||
if ((fd = open("/dev/zero", O_RDONLY, 0)) < 0) {
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: cannot open /dev/zero (%s)\n",
|
||||
strerror(errno));
|
||||
} else {
|
||||
if ((int)mmap(0, 0x1000, PROT_NONE,
|
||||
MAP_FIXED | MAP_SHARED, fd, 0) == -1) {
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: failed to protect page 0 (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* setup the virtual terminal manager
|
||||
*/
|
||||
if (VTnum == -1) {
|
||||
/*
|
||||
* No device was specified. We need to query the kernel to see which
|
||||
* console device we are on (and in fact if we are on a console at all).
|
||||
*/
|
||||
if (ioctl (0, VT_GETSTATE, &vts) < 0) {
|
||||
FatalError("xf86OpenConsole: Could not query active VT: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
VTnum = vts.v_active;
|
||||
if (is_osr6())
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/tty%02d", VTnum + 1);
|
||||
else
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/vt%02d", VTnum);
|
||||
} else {
|
||||
from = X_CMDLINE;
|
||||
if (is_osr6())
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/tty%02d", VTnum + 1);
|
||||
else
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/vt%02d", VTnum);
|
||||
}
|
||||
|
||||
if (IsConsoleDevice(vtdevice)) {
|
||||
isconsole = 1;
|
||||
CRTSpecified = FALSE; /* Dont honour -crt /dev/console */
|
||||
}
|
||||
|
||||
if (ioctl (0, KIOCINFO, 0) >= 0)
|
||||
consdev = 1 + isconsole;
|
||||
|
||||
if ((!CRTSpecified) && (isconsole || (!consdev))) {
|
||||
/*
|
||||
* Need to find a free VT
|
||||
*/
|
||||
if ((fd = open ("/dev/console", O_WRONLY | O_NOCTTY)) < 0) {
|
||||
FatalError ("xf86OpenConsole: Could not open /dev/console: %s\n",
|
||||
strerror (errno));
|
||||
}
|
||||
|
||||
if (ioctl (fd, VT_OPENQRY, &VTnum) < 0) {
|
||||
FatalError ("xf86OpenConsole: Cannot find a free VT: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
close (fd);
|
||||
if (usl_is_osr6)
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/tty%02d", VTnum + 1);
|
||||
else
|
||||
snprintf (vtdevice, sizeof(vtdevice), "/dev/vt%02d", VTnum);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we can dispose of stdin/stdout
|
||||
*/
|
||||
fclose (stdin);
|
||||
fclose (stdout);
|
||||
|
||||
if (CRTSpecified || isconsole || consdev != 1) {
|
||||
if (!KeepTty) {
|
||||
setpgrp();
|
||||
}
|
||||
}
|
||||
|
||||
if ((xf86Info.consoleFd = open(vtdevice, O_RDWR | O_NONBLOCK, 0)) < 0) {
|
||||
FatalError("xf86OpenConsole: Cannot open %s: %s\n", vtdevice,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
xf86Msg (from, "using VT number %d (%s)\n\n", VTnum, vtdevice);
|
||||
xf86Info.vtno = VTnum;
|
||||
|
||||
/* change ownership of the vt */
|
||||
chown(vtdevice, getuid(), getgid());
|
||||
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
||||
FatalError("xf86OpenConsole: VT_ACTIVATE failed: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0) {
|
||||
FatalError("xf86OpenConsole: VT_WAITACTIVE failed: %s\n",strerror(errno));
|
||||
}
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) {
|
||||
FatalError("xf86OpenConsole: VT_GETMODE failed: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
sigvtsw.sa_handler = xf86VTRequest;
|
||||
sigfillset(&sigvtsw.sa_mask);
|
||||
sigvtsw.sa_flags = 0;
|
||||
sigaction(SIGUSR1, &sigvtsw, NULL);
|
||||
|
||||
VT.mode = VT_PROCESS;
|
||||
VT.relsig = SIGUSR1;
|
||||
VT.acqsig = SIGUSR1;
|
||||
|
||||
ioctl_ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT);
|
||||
if (ioctl_ret < 0) {
|
||||
FatalError("xf86OpenConsole: VT_SETMODE failed: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||
FatalError("xf86OpenConsole: KD_GRAPHICS failed: %s\n", strerror(errno));
|
||||
}
|
||||
} else { /* serverGeneration != 1 */
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
||||
FatalError("xf86OpenConsole: VT_ACTIVATE failed: %s\n", strerror(errno));
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0) {
|
||||
FatalError("xf86OpenConsole: VT_WAITACTIVE failed: %s\n",strerror(errno));
|
||||
}
|
||||
/*
|
||||
* If the server doesn't have the VT when the reset occurs,
|
||||
* this is to make sure we don't continue until the activate
|
||||
* signal is received.
|
||||
*/
|
||||
if (!xf86Screens[0]->vtSema)
|
||||
sleep(5);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
xf86CloseConsole(void)
|
||||
{
|
||||
struct vt_mode VT;
|
||||
struct sigaction sigvtsw;
|
||||
|
||||
ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode ... */
|
||||
|
||||
sigvtsw.sa_handler = SIG_DFL;
|
||||
sigfillset(&sigvtsw.sa_mask);
|
||||
sigvtsw.sa_flags = 0;
|
||||
sigaction(SIGUSR1, &sigvtsw, NULL);
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1) {
|
||||
VT.mode = VT_AUTO;
|
||||
VT.waitv = 0;
|
||||
ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
|
||||
}
|
||||
close(xf86Info.consoleFd); /* make the vt-manager happy */
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
* when debugging (so the server can receive keyboard signals.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-keeptty")) {
|
||||
KeepTty = TRUE;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Undocumented flag to protect page 0 from read/write to help
|
||||
* catch NULL pointer dereferences. This is purely a debugging
|
||||
* flag.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-protect0")) {
|
||||
Protect0 = TRUE;
|
||||
return(1);
|
||||
}
|
||||
|
||||
if ((argv[i][0] == 'v') && (argv[i][1] == 't')) {
|
||||
if (sscanf(argv[i], "vt%2d", &VTnum) == 0) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
VTnum -= is_osr6();
|
||||
CRTSpecified = TRUE;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use a device the user specifies.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-crt")) {
|
||||
if (++i > argc) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
} else {
|
||||
char *mytty = ttyname(0);
|
||||
char *arg = argv[i];
|
||||
|
||||
if (!mytty)
|
||||
mytty = "\1";
|
||||
if (!arg[0])
|
||||
arg = "\2"; /* Prevent idiots from using -crt "" */
|
||||
|
||||
if (strcmp (mytty, arg) != 0) {
|
||||
char *fmt;
|
||||
|
||||
if (is_osr6())
|
||||
fmt = "/dev/tty%02d";
|
||||
else
|
||||
fmt = "/dev/vt%02d";
|
||||
|
||||
if (sscanf(arg, fmt, &VTnum) == 0) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* OSR6 devices start names at 1, UW7 starts at 0 */
|
||||
VTnum -= is_osr6();
|
||||
CRTSpecified = TRUE;
|
||||
}
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
void
|
||||
xf86UseMsg(void)
|
||||
{
|
||||
if (is_osr6()) {
|
||||
ErrorF("-crt /dev/ttyXX use the specified VT device\n");
|
||||
ErrorF("vtXX use the specified VT number (01-16)\n");
|
||||
} else {
|
||||
ErrorF("-crt /dev/vtXX use the specified VT device\n");
|
||||
ErrorF("vtXX use the specified VT number (00-15)\n");
|
||||
}
|
||||
|
||||
ErrorF("-keeptty ");
|
||||
ErrorF("don't detach controlling tty (for debugging only)\n");
|
||||
return;
|
||||
}
|
172
hw/xfree86/os-support/usl/usl_io.c
Normal file
172
hw/xfree86/os-support/usl/usl_io.c
Normal file
|
@ -0,0 +1,172 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2001-2005 by Kean Johnston <jkj@sco.com>
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*
|
||||
* 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 names of Thomas Roell, David Dawes
|
||||
* and Kean Johnston not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior permission.
|
||||
* Thomas Roell, David Dawes and Kean Johnston make no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
*
|
||||
* THOMAS ROELL, DAVID DAWES AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
|
||||
* OR KEAN JOHNSTON 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.
|
||||
*
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
#include "X.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch) {
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
|
||||
usleep(xf86Info.bell_duration * loudness * 20);
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds);
|
||||
}
|
||||
|
||||
int
|
||||
xf86GetKbdLeds(void)
|
||||
{
|
||||
int leds;
|
||||
|
||||
ioctl(xf86Info.consoleFd, KDGETLED, &leds);
|
||||
return(leds);
|
||||
}
|
||||
|
||||
/*
|
||||
* Much of the code in this function is duplicated from the Linux code
|
||||
* by Orest Zborowski <obz@Kodak.com> and David Dawes <dawes@xfree86.org>.
|
||||
* Please see the file ../linux/lnx_io.c for full copyright information.
|
||||
*/
|
||||
void
|
||||
xf86SetKbdRepeat(char rad)
|
||||
{
|
||||
int i;
|
||||
int value = 0x7f; /* Maximum delay with slowest rate */
|
||||
int delay = 250; /* Default delay */
|
||||
int rate = 300; /* Default repeat rate */
|
||||
|
||||
static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
|
||||
133, 120, 109, 100, 92, 86, 80, 75, 67,
|
||||
60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
|
||||
25, 23, 21, 20 };
|
||||
#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
|
||||
|
||||
static int valid_delays[] = { 250, 500, 750, 1000 };
|
||||
#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
|
||||
|
||||
if (xf86Info.kbdRate >= 0)
|
||||
rate = xf86Info.kbdRate * 10;
|
||||
if (xf86Info.kbdDelay >= 0)
|
||||
delay = xf86Info.kbdDelay;
|
||||
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
if (rate >= valid_rates[i]) {
|
||||
value &= 0x60;
|
||||
value |= i;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < DELAY_COUNT; i++)
|
||||
if (delay <= valid_delays[i]) {
|
||||
value &= 0x1f;
|
||||
value |= i << 5;
|
||||
break;
|
||||
}
|
||||
|
||||
ioctl (xf86Info.consoleFd, KDSETTYPEMATICS, value);
|
||||
}
|
||||
|
||||
static int orig_kbm;
|
||||
static struct termio orig_termio;
|
||||
static keymap_t keymap, noledmap;
|
||||
|
||||
void
|
||||
xf86KbdInit(void)
|
||||
{
|
||||
ioctl (xf86Info.consoleFd, KDGKBMODE, &orig_kbm);
|
||||
ioctl (xf86Info.consoleFd, TCGETA, &orig_termio);
|
||||
/*
|
||||
* We need to get the original keyboard map and NUL out the lock
|
||||
* modifiers. This prevents the scancode API from messing with
|
||||
* the keyboard LED's. We restore the original map when we exit.
|
||||
*/
|
||||
if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &keymap) < 0) {
|
||||
FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &noledmap) < 0) {
|
||||
FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
} else {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < noledmap.n_keys; i++) {
|
||||
for (j = 0; j < NUM_STATES; j++) {
|
||||
if (IS_SPECKEY(&noledmap, i, j) &&
|
||||
((noledmap.key[i].map[j] == K_CLK) ||
|
||||
(noledmap.key[i].map[j] == K_NLK) ||
|
||||
(noledmap.key[i].map[j] == K_SLK))) {
|
||||
noledmap.key[i].map[j] = K_NOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
xf86KbdOn(void)
|
||||
{
|
||||
struct termio newtio;
|
||||
|
||||
newtio = orig_termio; /* structure copy */
|
||||
newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
|
||||
newtio.c_oflag = 0;
|
||||
newtio.c_cflag = CREAD | CS8 | B9600;
|
||||
newtio.c_lflag = 0;
|
||||
newtio.c_cc[VTIME]=0;
|
||||
newtio.c_cc[VMIN]=1;
|
||||
ioctl(xf86Info.consoleFd, TCSETA, &newtio);
|
||||
|
||||
ioctl (xf86Info.consoleFd, KDSKBMODE, K_RAW);
|
||||
ioctl (xf86Info.consoleFd, PIO_KEYMAP, &noledmap);
|
||||
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int
|
||||
xf86KbdOff(void)
|
||||
{
|
||||
ioctl (xf86Info.consoleFd, KDSKBMODE, orig_kbm);
|
||||
ioctl (xf86Info.consoleFd, PIO_KEYMAP, &keymap);
|
||||
ioctl(xf86Info.consoleFd, TCSETA, &orig_termio);
|
||||
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
108
hw/xfree86/os-support/usl/usl_iop.c
Normal file
108
hw/xfree86/os-support/usl/usl_iop.c
Normal file
|
@ -0,0 +1,108 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2001,2005 by Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* 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 Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL KEAN JOHNSTON 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.
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
|
||||
#include "X.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86OSpriv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* I/O Permissions section */
|
||||
/***************************************************************************/
|
||||
|
||||
static Bool IOEnabled = FALSE;
|
||||
|
||||
Bool
|
||||
xf86EnableIO(void)
|
||||
{
|
||||
if (IOEnabled)
|
||||
return TRUE;
|
||||
|
||||
if (sysi86(SI86IOPL, 3) < 0)
|
||||
FatalError("Failed to set IOPL for extended I/O\n");
|
||||
IOEnabled = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
xf86DisableIO(void)
|
||||
{
|
||||
if (!IOEnabled)
|
||||
return;
|
||||
|
||||
sysi86(SI86IOPL, 0);
|
||||
IOEnabled = FALSE;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* Interrupt Handling section */
|
||||
/***************************************************************************/
|
||||
|
||||
Bool
|
||||
xf86DisableInterrupts(void)
|
||||
{
|
||||
if (!IOEnabled) {
|
||||
if (sysi86(SI86IOPL, 3) < 0)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__("cli");
|
||||
#else
|
||||
asm("cli");
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
if (!IOEnabled) {
|
||||
sysi86(SI86IOPL, 0);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
xf86EnableInterrupts(void)
|
||||
{
|
||||
if (!IOEnabled) {
|
||||
if (sysi86(SI86IOPL, 3) < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__("sti");
|
||||
#else
|
||||
asm("sti");
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
if (!IOEnabled) {
|
||||
sysi86(SI86IOPL, 0);
|
||||
}
|
||||
}
|
||||
|
456
hw/xfree86/os-support/usl/usl_kbd.c
Normal file
456
hw/xfree86/os-support/usl/usl_kbd.c
Normal file
|
@ -0,0 +1,456 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2005 by Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* 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 Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL KEAN JOHNSTON 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.
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
/*
|
||||
* Based on sco_io.c which is
|
||||
* (C) Copyright 2003 Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Based on lnx_kbd.c which is
|
||||
* Copyright (c) 2002 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Based on the code from lnx_io.c which is
|
||||
* Copyright 1992 by Orest Zborowski <obz@Kodak.com>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*/
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86OSpriv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSKbd.h"
|
||||
#include "atKeynames.h"
|
||||
#include "usl_kbd.h"
|
||||
#include "usl_xqueue.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
static KbdProtocolRec protocols[] = {
|
||||
{ "standard", PROT_STD },
|
||||
{ "Xqueue", PROT_XQUEUE },
|
||||
{ NULL, PROT_UNKNOWN_KBD }
|
||||
};
|
||||
|
||||
extern Bool VTSwitchEnabled;
|
||||
#ifdef USE_VT_SYSREQ
|
||||
extern Bool VTSysreqToggle;
|
||||
#endif
|
||||
|
||||
static void
|
||||
SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch) {
|
||||
ioctl(pInfo->fd, KIOCSOUND, 1193180 / pitch);
|
||||
usleep(duration * loudness * 20);
|
||||
ioctl(pInfo->fd, KIOCSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SetKbdLeds(InputInfoPtr pInfo, int leds)
|
||||
{
|
||||
int real_leds = 0;
|
||||
|
||||
if (leds & XLED1)
|
||||
real_leds |= LED_CAP;
|
||||
if (leds & XLED2)
|
||||
real_leds |= LED_NUM;
|
||||
if (leds & XLED3)
|
||||
real_leds |= LED_SCR;
|
||||
ioctl(pInfo->fd, KDSETLED, real_leds);
|
||||
}
|
||||
|
||||
static int
|
||||
GetKbdLeds(InputInfoPtr pInfo)
|
||||
{
|
||||
int real_leds, leds = 0;
|
||||
|
||||
ioctl(pInfo->fd, KDGETLED, &real_leds);
|
||||
|
||||
if (real_leds & LED_CAP) leds |= XLED1;
|
||||
if (real_leds & LED_NUM) leds |= XLED2;
|
||||
if (real_leds & LED_SCR) leds |= XLED3;
|
||||
|
||||
return(leds);
|
||||
}
|
||||
|
||||
static void
|
||||
SetKbdRepeat(InputInfoPtr pInfo, char rad)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
int i;
|
||||
int value = 0x7f; /* Maximum delay with slowest rate */
|
||||
int delay = 250; /* Default delay */
|
||||
int rate = 300; /* Default repeat rate */
|
||||
|
||||
static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
|
||||
133, 120, 109, 100, 92, 86, 80, 75, 67,
|
||||
60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
|
||||
25, 23, 21, 20 };
|
||||
#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
|
||||
|
||||
static int valid_delays[] = { 250, 500, 750, 1000 };
|
||||
#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
|
||||
|
||||
if (pKbd->rate >= 0)
|
||||
rate = pKbd->rate * 10;
|
||||
if (pKbd->delay >= 0)
|
||||
delay = pKbd->delay;
|
||||
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
if (rate >= valid_rates[i]) {
|
||||
value &= 0x60;
|
||||
value |= i;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < DELAY_COUNT; i++)
|
||||
if (delay <= valid_delays[i]) {
|
||||
value &= 0x1f;
|
||||
value |= i << 5;
|
||||
break;
|
||||
}
|
||||
|
||||
ioctl (pInfo->fd, KDSETTYPEMATICS, value);
|
||||
}
|
||||
|
||||
static int
|
||||
KbdInit(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
if (ioctl (pInfo->fd, KDGKBMODE, &priv->orig_kbm) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Could not determine keyboard mode\n");
|
||||
return !Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to get the original keyboard map and NUL out the lock
|
||||
* modifiers. This prevents the kernel from messing with
|
||||
* the keyboard LED's. We restore the original map when we exit.
|
||||
* Note that we also have to eliminate screen switch sequences
|
||||
* else the VT manager will switch for us, which we don't want.
|
||||
* For example, lets say you had changed the VT manager to switch
|
||||
* on Alt-Fx instead of Ctrl-Alt-Fx. This means that while inside
|
||||
* X, you cant use, for example, Alt-F4, which is a pain in the
|
||||
* fundamental when you're using CDE-like thingies.
|
||||
*/
|
||||
if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->keymap) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
}
|
||||
if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->noledmap) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
} else {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < priv->noledmap.n_keys; i++) {
|
||||
for (j = 0; j < NUM_STATES; j++) {
|
||||
if (IS_SPECKEY(&priv->noledmap, i, j) &&
|
||||
((priv->noledmap.key[i].map[j] == K_CLK) ||
|
||||
(priv->noledmap.key[i].map[j] == K_NLK) ||
|
||||
(priv->noledmap.key[i].map[j] == K_SLK) ||
|
||||
(priv->noledmap.key[i].map[j] == K_FRCNEXT) ||
|
||||
(priv->noledmap.key[i].map[j] == K_FRCPREV) ||
|
||||
((priv->noledmap.key[i].map[j] >= K_VTF) &&
|
||||
(priv->noledmap.key[i].map[j] <= K_VTL)) )) {
|
||||
priv->noledmap.key[i].map[j] = K_NOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ioctl (pInfo->fd, TCGETA, &priv->kbdtty) < 0) {
|
||||
xf86Msg (X_ERROR, "KbdInit: Failed to get terminal modes (%s)\n",
|
||||
strerror(errno));
|
||||
return !Success;
|
||||
}
|
||||
} /* End of if we are on a console */
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
KbdOn(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
|
||||
struct termio newtio;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
/*
|
||||
* Use the calculated keyboard map that does not have active
|
||||
* LED lock handling (we track LEDs ourselves).
|
||||
*/
|
||||
ioctl (pInfo->fd, PIO_KEYMAP, &priv->noledmap);
|
||||
|
||||
#ifdef NOTYET
|
||||
newtio = priv->kbdtty; /* structure copy */
|
||||
newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
|
||||
newtio.c_oflag = 0;
|
||||
newtio.c_cflag = CREAD | CS8 | B9600;
|
||||
newtio.c_lflag = 0;
|
||||
newtio.c_cc[VTIME]=0;
|
||||
newtio.c_cc[VMIN]=1;
|
||||
ioctl(pInfo->fd, TCSETA, &newtio);
|
||||
|
||||
if (priv->xq == 0)
|
||||
ioctl (pInfo->fd, KDSKBMODE, K_RAW);
|
||||
else
|
||||
#endif
|
||||
XqKbdOnOff (pInfo, 1);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
KbdOff(InputInfoPtr pInfo, int what)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
|
||||
|
||||
if (pKbd->isConsole) {
|
||||
/* Revert back to original translate scancode mode */
|
||||
#ifdef NOTYET
|
||||
if (priv->xq == 0)
|
||||
ioctl (pInfo->fd, KDSKBMODE, priv->orig_kbm);
|
||||
else
|
||||
#endif
|
||||
XqKbdOnOff (pInfo, 0);
|
||||
|
||||
ioctl (pInfo->fd, PIO_KEYMAP, &priv->keymap);
|
||||
ioctl(pInfo->fd, TCSETA, &priv->kbdtty);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
#define ModifierSet(k) ((modifiers & (k)) == (k))
|
||||
|
||||
static Bool
|
||||
SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
|
||||
if(!pKbd->vtSwitchSupported)
|
||||
return FALSE;
|
||||
|
||||
if ((!ModifierSet(ShiftMask)) && ((ModifierSet(ControlMask | AltMask)) ||
|
||||
(ModifierSet(ControlMask | AltLangMask)))) {
|
||||
if (VTSwitchEnabled && !xf86Info.vtSysreq) {
|
||||
switch (key) {
|
||||
case KEY_F1:
|
||||
case KEY_F2:
|
||||
case KEY_F3:
|
||||
case KEY_F4:
|
||||
case KEY_F5:
|
||||
case KEY_F6:
|
||||
case KEY_F7:
|
||||
case KEY_F8:
|
||||
case KEY_F9:
|
||||
case KEY_F10:
|
||||
if (down) {
|
||||
int sts = key - KEY_F1;
|
||||
if (sts != xf86Info.vtno) {
|
||||
ioctl(pInfo->fd, VT_SWITCH, sts);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case KEY_F11:
|
||||
case KEY_F12:
|
||||
if (down) {
|
||||
int sts = key - KEY_F11 + 10;
|
||||
if (sts != xf86Info.vtno) {
|
||||
ioctl(pInfo->fd, VT_SWITCH, sts);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef USE_VT_SYSREQ
|
||||
if (VTSwitchEnabled && xf86Info.vtSysreq) {
|
||||
switch (key) {
|
||||
case KEY_F1:
|
||||
case KEY_F2:
|
||||
case KEY_F3:
|
||||
case KEY_F4:
|
||||
case KEY_F5:
|
||||
case KEY_F6:
|
||||
case KEY_F7:
|
||||
case KEY_F8:
|
||||
case KEY_F9:
|
||||
case KEY_F10:
|
||||
if (VTSysreqToggle && down) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F1);
|
||||
VTSysreqToggle = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
case KEY_F11:
|
||||
case KEY_F12:
|
||||
if (VTSysreqToggle && down) {
|
||||
ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F11 + 10);
|
||||
VTSysreqToggle = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
/* Ignore these keys -- ie don't let them cancel an alt-sysreq */
|
||||
case KEY_Alt:
|
||||
case KEY_AltLang:
|
||||
break;
|
||||
case KEY_SysReqest:
|
||||
if (!(ModifierSet(ShiftMask) || ModifierSet(ControlMask))) {
|
||||
if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
|
||||
VTSysreqToggle = TRUE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* We only land here when Alt-SysReq is followed by a
|
||||
* non-switching key.
|
||||
*/
|
||||
if (VTSysreqToggle)
|
||||
VTSysreqToggle = FALSE;
|
||||
}
|
||||
}
|
||||
#endif /* USE_VT_SYSREQ */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef NOTYET
|
||||
static void
|
||||
stdReadInput(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
unsigned char rBuf[64];
|
||||
int nBytes, i;
|
||||
|
||||
if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
|
||||
for (i = 0; i < nBytes; i++) {
|
||||
pKbd->PostEvent(pInfo, rBuf[i] & 0x7f, rBuf[i] & 0x80 ? FALSE : TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static Bool
|
||||
OpenKeyboard(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
|
||||
USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
|
||||
int i;
|
||||
KbdProtocolId prot = PROT_UNKNOWN_KBD;
|
||||
char *s;
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
|
||||
for (i = 0; protocols[i].name; i++) {
|
||||
if (xf86NameCmp(s, protocols[i].name) == 0) {
|
||||
prot = protocols[i].id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (prot) {
|
||||
case PROT_STD:
|
||||
#ifdef NOTYET
|
||||
pInfo->read_input = stdReadInput;
|
||||
priv->xq = 0;
|
||||
break;
|
||||
#endif
|
||||
case PROT_XQUEUE:
|
||||
pInfo->read_input = NULL; /* Handled by the XQUEUE signal handler */
|
||||
priv->xq = 1;
|
||||
break;
|
||||
default:
|
||||
xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
|
||||
xfree(s);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
|
||||
xfree(s);
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "Device", NULL);
|
||||
if (s == NULL) {
|
||||
pInfo->fd = xf86Info.consoleFd;
|
||||
pKbd->isConsole = TRUE;
|
||||
} else {
|
||||
pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
|
||||
if (pInfo->fd == -1) {
|
||||
xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
|
||||
xfree(s);
|
||||
return FALSE;
|
||||
}
|
||||
pKbd->isConsole = FALSE;
|
||||
xfree(s);
|
||||
}
|
||||
|
||||
if (pKbd->isConsole)
|
||||
pKbd->vtSwitchSupported = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
KbdDevPtr pKbd = pInfo->private;
|
||||
|
||||
pKbd->KbdInit = KbdInit;
|
||||
pKbd->KbdOn = KbdOn;
|
||||
pKbd->KbdOff = KbdOff;
|
||||
pKbd->Bell = SoundBell;
|
||||
pKbd->SetLeds = SetKbdLeds;
|
||||
pKbd->GetLeds = GetKbdLeds;
|
||||
pKbd->SetKbdRepeat = SetKbdRepeat;
|
||||
pKbd->KbdGetMapping = KbdGetMapping;
|
||||
pKbd->SpecialKey = SpecialKey;
|
||||
pKbd->OpenKeyboard = OpenKeyboard;
|
||||
|
||||
pKbd->GetSpecialKey = NULL;
|
||||
pKbd->RemapScanCode = ATScancode;
|
||||
pKbd->vtSwitchSupported = FALSE;
|
||||
|
||||
pKbd->private = xcalloc(sizeof(USLKbdPrivRec), 1);
|
||||
if (pKbd->private == NULL) {
|
||||
xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
14
hw/xfree86/os-support/usl/usl_kbd.h
Normal file
14
hw/xfree86/os-support/usl/usl_kbd.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
/* $XdotOrg$ */
|
||||
#ifndef SCO_KBD_HDR
|
||||
#define SCO_KBD_HDR
|
||||
|
||||
typedef struct {
|
||||
int orig_kbm;
|
||||
struct termio kbdtty;
|
||||
keymap_t keymap, noledmap;
|
||||
int xq;
|
||||
} USLKbdPrivRec, *USLKbdPrivPtr;
|
||||
|
||||
extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
|
||||
CARD8 *pModMap);
|
||||
#endif /* SCO_KBD_HDR */
|
187
hw/xfree86/os-support/usl/usl_mouse.c
Normal file
187
hw/xfree86/os-support/usl/usl_mouse.c
Normal file
|
@ -0,0 +1,187 @@
|
|||
/* $XdotOrg$ */
|
||||
|
||||
/*
|
||||
* Copyright 2005 Kean Johnston
|
||||
* Copyright 1999 by The XFree86 Project, Inc.
|
||||
*
|
||||
* 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 names of The XFree86 Project, Inc
|
||||
* and Kean Johnston not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior permission.
|
||||
* The XFree86 Project, Inc and Kean Johnston make no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
*
|
||||
* THE XFREE86 PROJECT, INC AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
|
||||
* OR KEAN JOHNSTON 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "X.h"
|
||||
#include "compiler.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSmouse.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "mipointer.h"
|
||||
#include "usl_xqueue.h"
|
||||
|
||||
static int
|
||||
SupportedInterfaces(void)
|
||||
{
|
||||
return MSE_MISC;
|
||||
}
|
||||
|
||||
static const char *internalNames[] = {
|
||||
"Xqueue",
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char **
|
||||
BuiltinNames(void)
|
||||
{
|
||||
return internalNames;
|
||||
}
|
||||
|
||||
static const char *
|
||||
DefaultProtocol (void)
|
||||
{
|
||||
return "Xqueue";
|
||||
}
|
||||
|
||||
static Bool
|
||||
CheckProtocol(const char *protocol)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; internalNames[i]; i++)
|
||||
if (xf86NameCmp(protocol, internalNames[i]) == 0)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
OsMouseProc(DeviceIntPtr pPointer, int what)
|
||||
{
|
||||
InputInfoPtr pInfo;
|
||||
MouseDevPtr pMse;
|
||||
unsigned char map[9];
|
||||
int ret;
|
||||
|
||||
pInfo = pPointer->public.devicePrivate;
|
||||
pMse = pInfo->private;
|
||||
pMse->device = pPointer;
|
||||
|
||||
switch (what) {
|
||||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
map[4] = 7;
|
||||
map[5] = 8;
|
||||
map[6] = 6;
|
||||
map[7] = 4;
|
||||
map[8] = 5;
|
||||
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer, map, 8,
|
||||
miPointerGetMotionEvents, pMse->Ctrl,
|
||||
miPointerGetMotionBufferSize());
|
||||
/* X valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 0);
|
||||
|
||||
/* Y valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 1);
|
||||
|
||||
xf86MotionHistoryAllocate(pInfo);
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
pMse->lastButtons = 0;
|
||||
pMse->emulateState = 0;
|
||||
pPointer->public.on = TRUE;
|
||||
XqMseOnOff (pInfo, 1);
|
||||
break;
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
XqMseOnOff (pInfo, 0);
|
||||
break;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
static Bool
|
||||
OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
|
||||
{
|
||||
/* This is called when the protocol is "Xqueue" */
|
||||
MouseDevPtr pMse;
|
||||
|
||||
pMse = pInfo->private;
|
||||
pMse->protocol = protocol;
|
||||
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
|
||||
|
||||
/* Collect the options, and process the common options. */
|
||||
xf86CollectInputOptions(pInfo, NULL, NULL);
|
||||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||
|
||||
pInfo->fd = -1;
|
||||
#if 0
|
||||
/* Make sure we can open the mouse */
|
||||
pInfo->fd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK);
|
||||
|
||||
if (pInfo->fd < 0) {
|
||||
if (xf86GetAllowMouseOpenFail()) {
|
||||
xf86Msg(X_WARNING, "%s: cannot open /dev/mouse (%s)\n",
|
||||
pInfo->name, strerror(errno));
|
||||
} else {
|
||||
xf86Msg(X_ERROR, "%s: cannot open /dev/mouse (%s)\n",
|
||||
pInfo->name, strerror(errno));
|
||||
xfree(pMse);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Process common mouse options (like Emulate3Buttons, etc). */
|
||||
pMse->CommonOptions(pInfo);
|
||||
|
||||
/* Setup the local procs. */
|
||||
pInfo->device_control = OsMouseProc;
|
||||
pInfo->read_input = NULL; /* Handled by the XQUEUE signal handler */
|
||||
|
||||
pInfo->flags |= XI86_CONFIGURED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
OSMouseInfoPtr
|
||||
xf86OSMouseInit(int flags)
|
||||
{
|
||||
OSMouseInfoPtr p;
|
||||
|
||||
p = xcalloc(sizeof(OSMouseInfoRec), 1);
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
p->SupportedInterfaces = SupportedInterfaces;
|
||||
p->BuiltinNames = BuiltinNames;
|
||||
p->DefaultProtocol = DefaultProtocol;
|
||||
p->CheckProtocol = CheckProtocol;
|
||||
p->PreInit = OsMousePreInit;
|
||||
return p;
|
||||
}
|
||||
|
111
hw/xfree86/os-support/usl/usl_video.c
Normal file
111
hw/xfree86/os-support/usl/usl_video.c
Normal file
|
@ -0,0 +1,111 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyrught 2005 Kean Johnston <jkj@sco.com>
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
*
|
||||
* 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 names of Thomas Roell, David Dawes
|
||||
* and Kean Johnston not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior permission.
|
||||
* Thomas Roell, David Dawes and Kean Johnston make no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
*
|
||||
* THOMAS ROELL, DAVID DAWES AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
|
||||
* OR KEAN JOHNSTON 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.
|
||||
*
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
#include "X.h"
|
||||
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86OSpriv.h"
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
static Bool
|
||||
linearVidMem(void)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static pointer
|
||||
mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
pointer base;
|
||||
int fd;
|
||||
|
||||
fd = open(DEV_MEM, (flags & VIDMEM_READONLY) ? O_RDONLY : O_RDWR);
|
||||
if (fd < 0) {
|
||||
FatalError("xf86MapVidMem: failed to open %s (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
}
|
||||
base = mmap((caddr_t)0, Size, (flags & VIDMEM_READONLY) ?
|
||||
PROT_READ : (PROT_READ | PROT_WRITE),
|
||||
MAP_SHARED, fd, (off_t)Base);
|
||||
close(fd);
|
||||
|
||||
if (base == MAP_FAILED) {
|
||||
FatalError("%s: Could not mmap framebuffer [s=%x,a=%x] (%s)\n",
|
||||
"xf86MapVidMem", Size, Base, strerror(errno));
|
||||
}
|
||||
return(base);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
unmapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
munmap(Base, Size);
|
||||
}
|
||||
|
||||
/*
|
||||
* For some SVR4 versions, a 32-bit read is done for the first location
|
||||
* in each page when the page is first mapped. If this is done while
|
||||
* memory access is enabled for regions that have read side-effects,
|
||||
* this can cause unexpected results, including lockups on some hardware.
|
||||
* This function is called to make sure each page is mapped while it is
|
||||
* safe to do so.
|
||||
*/
|
||||
|
||||
#define X_PAGE_SIZE 4096
|
||||
|
||||
static void
|
||||
readSideEffects(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
unsigned long base, end, addr;
|
||||
CARD32 val;
|
||||
|
||||
base = (unsigned long)Base;
|
||||
end = base + Size;
|
||||
|
||||
for (addr = base; addr < end; addr += X_PAGE_SIZE)
|
||||
val = *(volatile CARD32 *)addr;
|
||||
}
|
||||
|
||||
void
|
||||
xf86OSInitVidMem(VidMemInfoPtr pVidMem)
|
||||
{
|
||||
pVidMem->linearSupported = linearVidMem();
|
||||
pVidMem->mapMem = mapVidMem;
|
||||
pVidMem->unmapMem = unmapVidMem;
|
||||
pVidMem->readSideEffects = readSideEffects;
|
||||
pVidMem->initialised = TRUE;
|
||||
}
|
||||
|
97
hw/xfree86/os-support/usl/usl_vtsw.c
Normal file
97
hw/xfree86/os-support/usl/usl_vtsw.c
Normal file
|
@ -0,0 +1,97 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2005 by Kean Johnston <jkj@sco.com>
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
* Copyright 1993 by David McCullough <davidm@stallion.oz.au>
|
||||
*
|
||||
* 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 David Wexelblat not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. David Wexelblat makes no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
*
|
||||
* DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL DAVID WEXELBLAT 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.
|
||||
*
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
#include "X.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
/*
|
||||
* Handle the VT-switching interface for SCO UnixWare / OpenServer 6
|
||||
*/
|
||||
|
||||
/*
|
||||
* This function is the signal handler for the VT-switching signal. It
|
||||
* is only referenced inside the OS-support layer. NOTE: we do NOT need
|
||||
* to re-arm the signal here, since we used sigaction() to set the signal
|
||||
* disposition in usl_init.c. If we had used signal(), we would need to
|
||||
* re-arm the signal here. All we need to do now is record the fact that
|
||||
* we got the signal. XFree86 handles the rest.
|
||||
*/
|
||||
void
|
||||
xf86VTRequest(int sig)
|
||||
{
|
||||
xf86Info.vtRequestsPending = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
Bool
|
||||
xf86VTSwitchPending(void)
|
||||
{
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
static int usl_ledstatus = -1;
|
||||
static unsigned int usl_ledstate = 0;
|
||||
|
||||
Bool
|
||||
xf86VTSwitchAway(void)
|
||||
{
|
||||
usl_ledstatus = ioctl(xf86Info.consoleFd, KDGETLED, &usl_ledstate);
|
||||
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, 1) < 0) {
|
||||
return(FALSE);
|
||||
} else {
|
||||
return(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
Bool
|
||||
xf86VTSwitchTo(void)
|
||||
{
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0) {
|
||||
return(FALSE);
|
||||
} else {
|
||||
if (usl_ledstatus >= 0) {
|
||||
ioctl (xf86Info.consoleFd, KDSETLED, usl_ledstate);
|
||||
}
|
||||
usl_ledstatus = -1;
|
||||
|
||||
/*
|
||||
* Convince the console driver this screen is in graphics mode,
|
||||
* otherwise it assumes it can do more to the screen than it should.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||
ErrorF("Failed to set graphics mode (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
363
hw/xfree86/os-support/usl/usl_xqueue.c
Normal file
363
hw/xfree86/os-support/usl/usl_xqueue.c
Normal file
|
@ -0,0 +1,363 @@
|
|||
/* $XdotOrg$ */
|
||||
/*
|
||||
* Copyright 2005 by Kean Johnston <jkj@sco.com>
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993-1999 by The XFree86 Project, Inc.
|
||||
*
|
||||
* 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 the copyright holders not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. The copyright holders make no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* THE COPYRIGHT HOLDERS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS 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.
|
||||
*
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
#include "X.h"
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSmouse.h"
|
||||
#include "xf86OSKbd.h"
|
||||
#include "usl_xqueue.h"
|
||||
|
||||
#ifdef XKB
|
||||
#include "inputstr.h"
|
||||
#include <X11/extensions/XKB.h>
|
||||
#include <X11/extensions/XKBstr.h>
|
||||
#include <X11/extensions/XKBsrv.h>
|
||||
extern Bool noXkbExtension;
|
||||
#endif
|
||||
|
||||
#include "xf86Xinput.h"
|
||||
#include "mipointer.h"
|
||||
|
||||
#if !defined(XQ_WHEEL)
|
||||
# define XQ_WHEEL 4
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Implementation notes
|
||||
*
|
||||
* This code is based on a mixture of the original XFree86 sysv/xqueue.c
|
||||
* and information gathered from the SCO X server code (no actual code
|
||||
* was used, just the principles).
|
||||
*
|
||||
* The XFree86 XQUEUE code went to some considerable lengths to implement
|
||||
* what it calls "asynchronous XQUEUE". This involved creating a pipe,
|
||||
* and writing to that pipe each time an XQUEUE signal is received. The
|
||||
* one end of that pipe was then added to the list of selectable file
|
||||
* descriptors with AddEnabledDevice(). I completely fail to see the need
|
||||
* for this, and this code does not implement that mechanism. The server
|
||||
* will be interrupted anyway by the XQUEUE driver, so whether we pull the
|
||||
* events off the queue at the time we receive the signal or whether we
|
||||
* write to a pipe and then have the main select() loop stop and call us,
|
||||
* it makes no difference I can fathom.
|
||||
*
|
||||
* The code also differs from the original XFree86 code in that it maintains
|
||||
* local variables for the number of devices initialized. The original code
|
||||
* stored that information in the private data pointer of the mouse structure,
|
||||
* but this same code is used for both the keyboard and the mouse, so that
|
||||
* was changed.
|
||||
*
|
||||
* Part of the difficulty in dealing with XQUEUE is that it is a single
|
||||
* interface to two devices. The recent changes in XFree86/Xorg try to
|
||||
* treat the mouse and keyboard as discrete devices, and the code is
|
||||
* structured in such a way that they should be able to be independently
|
||||
* opened and closed. But we can't do that with XQUEUE, so we have to
|
||||
* centralize XQUEUE access here in this module.
|
||||
*/
|
||||
|
||||
static xqEventQueue *xqQaddr = NULL;
|
||||
static int xqSigEnable = 1;
|
||||
static int xqEnableCount = 0;
|
||||
static struct kd_quemode xqMode;
|
||||
|
||||
/*
|
||||
* These two pointers are set when the keyboard/mouse handler procs
|
||||
* are called to turn them on or off. This is so that we can call the
|
||||
* correct PostEvent for the device.
|
||||
*/
|
||||
static InputInfoPtr xqMouse = NULL;
|
||||
static InputInfoPtr xqKeyboard = NULL;
|
||||
|
||||
static void XqSignalHandler (int signo);
|
||||
|
||||
/*
|
||||
* Private functions
|
||||
*/
|
||||
static void
|
||||
XqReset (void)
|
||||
{
|
||||
if (xqEnableCount > 0) {
|
||||
xqQaddr->xq_head = xqQaddr->xq_tail;
|
||||
xqQaddr->xq_sigenable = xqSigEnable;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NOTNEEDED
|
||||
static void
|
||||
XqLock (void)
|
||||
{
|
||||
xqSigEnable = 0;
|
||||
if (xqEnableCount > 0) {
|
||||
xqQaddr->xq_sigenable = xqSigEnable;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
XqUnlock (void)
|
||||
{
|
||||
xqSigEnable = 1;
|
||||
if (xqEnableCount > 0) {
|
||||
xqQaddr->xq_sigenable = xqSigEnable;
|
||||
}
|
||||
}
|
||||
#endif /* NOTNEEDED */
|
||||
|
||||
/*
|
||||
* Since this code is shared between two devices, we need to keep track
|
||||
* of how many times we've been enabled or disabled. For example, if the
|
||||
* keyboard has been turned off, but the mouse hasn't, then we do not
|
||||
* want the whole queue off. Only when both devices are turned off do we
|
||||
* actually disable Xqueue mode. When either device is turned on, we
|
||||
* enable it.
|
||||
*/
|
||||
static int
|
||||
XqEnable (InputInfoPtr pInfo)
|
||||
{
|
||||
struct sigaction xqsig;
|
||||
static int msefd = -1;
|
||||
|
||||
if (msefd == -1) {
|
||||
msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK);
|
||||
#if 0
|
||||
msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK | O_NOCTTY);
|
||||
if (msefd < 0) {
|
||||
/*
|
||||
* Try giving it a controlling tty
|
||||
*/
|
||||
msefd = open (ttyname(xf86Info.consoleFd), O_RDWR | O_NONBLOCK);
|
||||
if (msefd >= 0)
|
||||
close (msefd);
|
||||
msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK | O_NOCTTY);
|
||||
if (msefd < 0)
|
||||
sleep(2);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (msefd < 0) {
|
||||
if (xf86GetAllowMouseOpenFail()) {
|
||||
ErrorF("%s: cannot open /dev/mouse (%s)\n",
|
||||
ttyname(xf86Info.consoleFd), strerror(errno));
|
||||
} else {
|
||||
sleep(5);
|
||||
FatalError ("%s: cannot open /dev/mouse (%s)\n",
|
||||
ttyname(xf86Info.consoleFd), strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
if (xqEnableCount++ == 0) {
|
||||
xqMode.qaddr = 0;
|
||||
ioctl (xf86Info.consoleFd, KDQUEMODE, NULL);
|
||||
|
||||
/*
|
||||
* Note: We need to make sure the signal is armed before we enable
|
||||
* XQUEUE mode, so that if we get events immediately after the ioctl
|
||||
* we dont have an unhandled signal coming to the Xserver.
|
||||
* Also note that we use sigaction, so that we do not have to re-arm
|
||||
* the signal every time it is delivered, which just slows things
|
||||
* down (setting a signal is a fairly expensive operation).
|
||||
*/
|
||||
|
||||
xqsig.sa_handler = XqSignalHandler;
|
||||
sigfillset (&xqsig.sa_mask);
|
||||
xqsig.sa_flags = 0;
|
||||
sigaction (SIGUSR2, &xqsig, NULL);
|
||||
|
||||
/*
|
||||
* This is a fairly large queue size. Since we are reacting to events
|
||||
* asynchronously, its best for performance if we deal with as many
|
||||
* events as possible, and high resolution mice generate a lot of
|
||||
* events.
|
||||
*/
|
||||
xqMode.qsize = 64;
|
||||
xqMode.signo = SIGUSR2;
|
||||
xqMode.qaddr = 0;
|
||||
if (ioctl (xf86Info.consoleFd, KDQUEMODE, &xqMode) < 0) {
|
||||
xf86Msg (X_ERROR, "%s: could not set XQUEUE mode (%s)", pInfo->name,
|
||||
strerror(errno));
|
||||
xqEnableCount--;
|
||||
|
||||
xqsig.sa_handler = SIG_DFL;
|
||||
sigfillset (&xqsig.sa_mask);
|
||||
xqsig.sa_flags = 0;
|
||||
sigaction (SIGUSR2, &xqsig, NULL);
|
||||
|
||||
return !Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're in business. The workstation is now in XQUEUE mode.
|
||||
*/
|
||||
xqQaddr = (xqEventQueue *)xqMode.qaddr;
|
||||
xqQaddr->xq_sigenable = 0; /* LOCK */
|
||||
nap(500);
|
||||
XqReset();
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
XqDisable (InputInfoPtr pInfo)
|
||||
{
|
||||
struct sigaction xqsig;
|
||||
|
||||
if (xqEnableCount-- == 1) {
|
||||
xqQaddr->xq_sigenable = 0; /* LOCK */
|
||||
|
||||
if (ioctl (xf86Info.consoleFd, KDQUEMODE, NULL) < 0) {
|
||||
xf86Msg (X_ERROR, "%s: could not unset XQUEUE mode (%s)", pInfo->name,
|
||||
strerror(errno));
|
||||
xqEnableCount++;
|
||||
return !Success;
|
||||
}
|
||||
|
||||
xqsig.sa_handler = SIG_DFL;
|
||||
sigfillset (&xqsig.sa_mask);
|
||||
xqsig.sa_flags = 0;
|
||||
sigaction (SIGUSR2, &xqsig, NULL);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* XQUEUE signal handler. This is what goes through the list of events
|
||||
* we've already received and dispatches them to either the keyboard or
|
||||
* mouse event poster.
|
||||
*/
|
||||
static void
|
||||
XqSignalHandler (int signo)
|
||||
{
|
||||
xqEvent *xqEvents = xqQaddr->xq_events;
|
||||
int xqHead = xqQaddr->xq_head;
|
||||
xEvent xE;
|
||||
MouseDevPtr pMse = NULL;
|
||||
KbdDevPtr pKbd = NULL;
|
||||
signed char dx, dy;
|
||||
|
||||
if (xqMouse)
|
||||
pMse = (MouseDevPtr)xqMouse->private;
|
||||
if (xqKeyboard)
|
||||
pKbd = (KbdDevPtr)xqKeyboard->private;
|
||||
|
||||
while (xqHead != xqQaddr->xq_tail) {
|
||||
|
||||
switch (xqEvents[xqHead].xq_type) {
|
||||
case XQ_MOTION:
|
||||
dx = (signed char)xqEvents[xqHead].xq_x;
|
||||
dy = (signed char)xqEvents[xqHead].xq_y;
|
||||
if (pMse)
|
||||
pMse->PostEvent(xqMouse, ~(xqEvents[xqHead].xq_code) & 0x07,
|
||||
(int)dx, (int)dy, 0, 0);
|
||||
break;
|
||||
|
||||
case XQ_BUTTON:
|
||||
if (pMse)
|
||||
pMse->PostEvent(xqMouse, ~(xqEvents[xqHead].xq_code) & 0x07,
|
||||
0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case XQ_WHEEL:
|
||||
if (pMse) {
|
||||
int wbut = pMse->lastButtons;
|
||||
if (xqEvents[xqHead].xq_code == 1)
|
||||
wbut |= 0x80;
|
||||
else
|
||||
wbut |= 0x40;
|
||||
pMse->PostEvent(xqMouse, wbut, 0, 0, 0, 0);
|
||||
/* Simulate button release */
|
||||
wbut &= ~0xc0;
|
||||
pMse->PostEvent(xqMouse, wbut, 0, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case XQ_KEY:
|
||||
if (pKbd)
|
||||
pKbd->PostEvent(xqKeyboard, xqEvents[xqHead].xq_code & 0x7f,
|
||||
xqEvents[xqHead].xq_code & 0x80 ? FALSE : TRUE);
|
||||
break;
|
||||
|
||||
default:
|
||||
xf86Msg(X_WARNING, "XQUEUE: unknown event type %d\n",
|
||||
xqEvents[xqHead].xq_type);
|
||||
break;
|
||||
}
|
||||
|
||||
xqHead++;
|
||||
if (xqHead == xqQaddr->xq_size)
|
||||
xqHead = 0;
|
||||
xf86Info.inputPending = TRUE;
|
||||
}
|
||||
|
||||
XqReset();
|
||||
}
|
||||
|
||||
/*
|
||||
* Public functions
|
||||
*/
|
||||
int
|
||||
XqMseOnOff (InputInfoPtr pInfo, int on)
|
||||
{
|
||||
if (on) {
|
||||
if (xqMouse) {
|
||||
if (xqMouse != pInfo)
|
||||
xf86Msg(X_WARNING, "XqMseOnOff: mouse pointer structure changed!\n");
|
||||
xqMouse = pInfo;
|
||||
} else {
|
||||
xqMouse = pInfo;
|
||||
return XqEnable(pInfo);
|
||||
}
|
||||
} else {
|
||||
xqMouse = NULL;
|
||||
return XqDisable(pInfo);
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
int
|
||||
XqKbdOnOff (InputInfoPtr pInfo, int on)
|
||||
{
|
||||
if (on) {
|
||||
if (xqKeyboard) {
|
||||
if (xqKeyboard != pInfo)
|
||||
xf86Msg(X_WARNING, "XqKbdOnOff: keyboard pointer structure changed!\n");
|
||||
xqKeyboard = pInfo;
|
||||
} else {
|
||||
xqKeyboard = pInfo;
|
||||
return XqEnable(pInfo);
|
||||
}
|
||||
} else {
|
||||
xqKeyboard = NULL;
|
||||
return XqDisable(pInfo);
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
9
hw/xfree86/os-support/usl/usl_xqueue.h
Normal file
9
hw/xfree86/os-support/usl/usl_xqueue.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* $XdotOrg$ */
|
||||
|
||||
#ifndef _XF86_USL_XQUEUE_H_
|
||||
#define _XF86_USL_XQUEUE_H_
|
||||
|
||||
extern int XqMseOnOff (InputInfoPtr pInfo, int on);
|
||||
extern int XqKbdOnOff (InputInfoPtr pInfo, int on);
|
||||
|
||||
#endif
|
|
@ -118,7 +118,7 @@ typedef signed long xf86ssize_t;
|
|||
# include <termio.h>
|
||||
# include <sys/stat.h>
|
||||
# include <sys/types.h>
|
||||
# if defined(SCO) || defined(ISC)
|
||||
# if defined(__SCO__) || defined(ISC)
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
|
||||
|
@ -176,7 +176,7 @@ typedef signed long xf86ssize_t;
|
|||
# if !defined(sun)
|
||||
# include <sys/emap.h>
|
||||
# endif
|
||||
# if defined(SCO)
|
||||
# if defined(SCO325)
|
||||
# include <sys/vtkd.h>
|
||||
# include <sys/console.h>
|
||||
# include <sys/scankbd.h>
|
||||
|
@ -203,16 +203,16 @@ typedef signed long xf86ssize_t;
|
|||
# define LED_NUM LED_NUM_LOCK
|
||||
# define LED_SCR LED_SCROLL_LOCK
|
||||
# define LED_COMP LED_COMPOSE
|
||||
# endif /* SCO */
|
||||
# endif /* sun */
|
||||
|
||||
# if !defined(VT_ACKACQ)
|
||||
# define VT_ACKACQ 2
|
||||
# endif /* !VT_ACKACQ */
|
||||
|
||||
# if defined(SCO)
|
||||
# if defined(__SCO__)
|
||||
# include <sys/sysmacros.h>
|
||||
# define POSIX_TTY
|
||||
# endif /* SCO */
|
||||
# endif /* __SCO__ */
|
||||
|
||||
# if defined(SVR4) || defined(SCO325)
|
||||
# include <sys/mman.h>
|
||||
|
@ -243,9 +243,11 @@ typedef signed long xf86ssize_t;
|
|||
# define i386 /* not defined in ANSI C mode */
|
||||
# endif /* ATT && !i386 */
|
||||
|
||||
# if (defined(ATT) || defined(SVR4)) && !defined(sun) && !defined(SCO325)
|
||||
# ifndef XQUEUE
|
||||
# define XQUEUE
|
||||
# if (defined(ATT) || defined(SVR4)) && !defined(sun)
|
||||
# ifndef __UNIXWARE__
|
||||
# ifndef XQUEUE
|
||||
# define XQUEUE
|
||||
# endif
|
||||
# endif
|
||||
# include <sys/xque.h>
|
||||
# endif /* ATT || SVR4 */
|
||||
|
|
|
@ -136,6 +136,10 @@ extern void xf86WrapperInit(void);
|
|||
#include <X11/Xfuncproto.h>
|
||||
#include "opaque.h"
|
||||
|
||||
#if defined(XQUEUE)
|
||||
#include "input.h" /* for DeviceIntPtr */
|
||||
#endif
|
||||
|
||||
_XFUNCPROTOBEGIN
|
||||
|
||||
/* public functions */
|
||||
|
|
|
@ -55,7 +55,8 @@
|
|||
|
||||
#if defined(XFree86LOADER) || defined(NEED_XF86_TYPES)
|
||||
|
||||
#if !defined(SYSV) && !defined(SVR4) && !defined(Lynx) || defined(SCO)
|
||||
#if !defined(SYSV) && !defined(SVR4) && !defined(Lynx) || \
|
||||
defined(__SCO__) || defined(__UNIXWARE__)
|
||||
#define HAVE_VSSCANF
|
||||
#define HAVE_VFSCANF
|
||||
#endif
|
||||
|
|
|
@ -676,16 +676,16 @@ xf86printMonitorSection (FILE * cf, XF86ConfMonitorPtr ptr)
|
|||
ptr->mon_width,
|
||||
ptr->mon_height);
|
||||
if ( ptr->mon_n_hsync || ptr->mon_n_vrefresh )
|
||||
fprintf(cf," ### Uncomment if you don't want to default to DDC:\n");
|
||||
fprintf(cf," ### Comment all HorizSync and VertSync values to use DDC:\n");
|
||||
for (i = 0; i < ptr->mon_n_hsync; i++)
|
||||
{
|
||||
fprintf (cf, "#\tHorizSync %2.1f - %2.1f\n",
|
||||
fprintf (cf, "\tHorizSync %2.1f - %2.1f\n",
|
||||
ptr->mon_hsync[i].lo,
|
||||
ptr->mon_hsync[i].hi);
|
||||
}
|
||||
for (i = 0; i < ptr->mon_n_vrefresh; i++)
|
||||
{
|
||||
fprintf (cf, "#\tVertRefresh %2.1f - %2.1f\n",
|
||||
fprintf (cf, "\tVertRefresh %2.1f - %2.1f\n",
|
||||
ptr->mon_vrefresh[i].lo,
|
||||
ptr->mon_vrefresh[i].hi);
|
||||
}
|
||||
|
|
|
@ -489,6 +489,9 @@ LookupCard(char *name)
|
|||
{
|
||||
CardsEntry **ptr;
|
||||
|
||||
if (NumCardsEntry == 0 || CardsDB == 0)
|
||||
return NULL;
|
||||
|
||||
ptr = (CardsEntry**)bsearch(name, CardsDB, NumCardsEntry,
|
||||
sizeof(CardsEntry*), BCompareCards);
|
||||
|
||||
|
|
|
@ -68,6 +68,9 @@
|
|||
#define DefaultXFree86Dir "/usr/X11R6"
|
||||
#endif
|
||||
|
||||
#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0) || \
|
||||
(strcasecmp((S), "keyboard") == 0))
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
|
@ -791,7 +794,7 @@ InitializeDevices(void)
|
|||
mouse_x = work->core.width - (work->core.width >> 2);
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(input->inp_driver, "keyboard") == 0) {
|
||||
else if (IS_KBDDRIV(input->inp_driver)) {
|
||||
device = AddDevice(KEYBOARD, (XtPointer)input, keyboard_x, keyboard_y);
|
||||
SetTip(device);
|
||||
if ((keyboard_x += DEFAULT_KEYBOARD_WIDTH) >
|
||||
|
@ -1645,8 +1648,7 @@ EnableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
|
|||
while (nex != NULL) {
|
||||
if (strcasecmp(nex->iref_inputdev->inp_driver, "mouse") == 0)
|
||||
++nmouses;
|
||||
else if (strcasecmp(nex->iref_inputdev->inp_driver,
|
||||
"keyboard") == 0)
|
||||
else if (IS_KBDDRIV(nex->iref_inputdev->inp_driver))
|
||||
++nkeyboards;
|
||||
iref = nex;
|
||||
nex = (XF86ConfInputrefPtr)(nex->list.next);
|
||||
|
|
|
@ -38,6 +38,9 @@
|
|||
#include <X11/Xaw/SimpleMenu.h>
|
||||
#include <X11/Xaw/SmeBSB.h>
|
||||
|
||||
#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0) || \
|
||||
(strcasecmp((X), "keyboard") == 0))
|
||||
|
||||
/*
|
||||
* Types
|
||||
*/
|
||||
|
@ -159,8 +162,7 @@ KeyboardConfig(XtPointer config)
|
|||
XF86ConfInputPtr key = XF86Config->conf_input_lst;
|
||||
|
||||
while (key != NULL) {
|
||||
if (strcasecmp(key->inp_driver, "keyboard") == 0 &&
|
||||
xkb_infos[i]->conf == key)
|
||||
if (IS_KBDDRIV(key->inp_driver) && xkb_infos[i]->conf == key)
|
||||
break;
|
||||
key = (XF86ConfInputPtr)(key->list.next);
|
||||
}
|
||||
|
@ -216,7 +218,7 @@ KeyboardConfig(XtPointer config)
|
|||
int nkeyboards = 0;
|
||||
|
||||
while (input != NULL) {
|
||||
if (strcasecmp(input->inp_driver, "keyboard") == 0)
|
||||
if (IS_KBDDRIV(input->inp_driver))
|
||||
++nkeyboards;
|
||||
input = (XF86ConfInputPtr)(input->list.next);
|
||||
}
|
||||
|
@ -253,7 +255,11 @@ KeyboardConfig(XtPointer config)
|
|||
keyboard = XtNew(XF86ConfInputRec);
|
||||
keyboard->list.next = NULL;
|
||||
keyboard->inp_identifier = XtNewString(ident_string);
|
||||
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||
keyboard->inp_driver = XtNewString("keyboard");
|
||||
#else
|
||||
keyboard->inp_driver = XtNewString("kbd");
|
||||
#endif
|
||||
keyboard->inp_option_lst = xf86newOption(XtNewString(XkbRules),
|
||||
XtNewString(rules));
|
||||
xf86addNewOption(keyboard->inp_option_lst,
|
||||
|
@ -493,7 +499,7 @@ InitializeKeyboard(void)
|
|||
|
||||
/* XXX Assumes the first keyboard is the core keyboard */
|
||||
while (keyboard != NULL) {
|
||||
if (strcasecmp(keyboard->inp_driver, "keyboard") == 0)
|
||||
if (IS_KBDDRIV(keyboard->inp_driver))
|
||||
break;
|
||||
keyboard = (XF86ConfInputPtr)(keyboard->list.next);
|
||||
}
|
||||
|
|
|
@ -58,9 +58,12 @@ static struct MouseProtocol {
|
|||
#ifdef __UNIXOS2__
|
||||
{"OS2Mouse", MTYPE_AUTOMOUSE},
|
||||
#endif
|
||||
#ifdef SCO
|
||||
#ifdef __SCO__
|
||||
{"OsMouse", MTYPE_AUTOMOUSE},
|
||||
#endif
|
||||
#if defined(__UNIXWARE__)
|
||||
{"Xqueue", MTYPE_XQUEUE},
|
||||
#endif
|
||||
#ifdef WSCONS_SUPPORT
|
||||
{"wsmouse", MTYPE_AUTOMOUSE},
|
||||
#endif
|
||||
|
|
|
@ -33,7 +33,8 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(_SCO_DS) || (defined(sun) && defined(__SVR4))
|
||||
#if defined(__SCO__) || defined(__UNIXWARE__) || \
|
||||
(defined(sun) && defined(__SVR4))
|
||||
#include <curses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
|
@ -47,6 +48,9 @@
|
|||
#include "xf86config.h"
|
||||
#include "loader.h"
|
||||
|
||||
#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0) || \
|
||||
(strcmp((X), "keyboard") == 0))
|
||||
|
||||
#ifndef PROJECT_ROOT
|
||||
#define PROJECT_ROOT "/usr/X11R6"
|
||||
#endif
|
||||
|
@ -201,16 +205,21 @@ TextMode(void)
|
|||
|
||||
ClearScreen();
|
||||
refresh();
|
||||
if (Dialog( __XSERVERNAME__"Configuration",
|
||||
if (Dialog( __XSERVERNAME__" Configuration",
|
||||
"This program will create the "__XCONFIGFILE__" file, based on "
|
||||
"menu selections you make.\n"
|
||||
"\n"
|
||||
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||
"The "__XCONFIGFILE__" file usually resides in /etc. A "
|
||||
"sample "__XCONFIGFILE__" file is supplied with "
|
||||
#else
|
||||
#ifndef __UNIXOS2__
|
||||
"The "__XCONFIGFILE__" file usually resides in /usr/X11R6/etc/X11 "
|
||||
#else
|
||||
"The "__XCONFIGFILE__" file usually resides in "XF86CONFIGDIR" "
|
||||
#endif
|
||||
"or /etc/X11. A sample "__XCONFIGFILE__" file is supplied with "
|
||||
#endif
|
||||
__XSERVERNAME__"; it is configured for a standard VGA card and "
|
||||
"monitor with 640x480 resolution. This program will ask for "
|
||||
"a pathname when it is ready to write the file.\n"
|
||||
|
@ -350,9 +359,12 @@ static char *protocols[] = {
|
|||
#ifdef __UNIXOS2__
|
||||
"OS2Mouse",
|
||||
#endif
|
||||
#ifdef SCO
|
||||
#ifdef __SCO__
|
||||
"OsMouse",
|
||||
#endif
|
||||
#ifdef __UNIXWARE__
|
||||
"Xqueue",
|
||||
#endif
|
||||
#ifdef WSCONS_SUPPORT
|
||||
"wsmouse",
|
||||
#endif
|
||||
|
@ -611,7 +623,7 @@ KeyboardConfig(void)
|
|||
|
||||
nlist = 0;
|
||||
while (input) {
|
||||
if (strcmp(input->inp_driver, "keyboard") == 0) {
|
||||
if (IS_KBDDRIV(input->inp_driver)) {
|
||||
list = (char**)XtRealloc((XtPointer)list, (nlist + 1) * sizeof(char*));
|
||||
list[nlist] = XtMalloc(sizeof(Edit) +
|
||||
strlen(input->inp_identifier) + 1);
|
||||
|
@ -730,7 +742,11 @@ KeyboardConfig(void)
|
|||
input->inp_option_lst =
|
||||
xf86addNewOption(input->inp_option_lst,
|
||||
XtNewString("XkbLayout"), XtNewString("us"));
|
||||
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||
input->inp_driver = XtNewString("keyboard");
|
||||
#else
|
||||
input->inp_driver = XtNewString("kbd");
|
||||
#endif
|
||||
XF86Config->conf_input_lst =
|
||||
xf86addInput(XF86Config, input);
|
||||
}
|
||||
|
@ -806,7 +822,11 @@ KeyboardConfig(void)
|
|||
XtNewString("XkbLayout"), XtNewString(layout));
|
||||
|
||||
if (input->inp_driver == NULL) {
|
||||
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||
input->inp_driver = XtNewString("keyboard");
|
||||
#else
|
||||
input->inp_driver = XtNewString("kbd");
|
||||
#endif
|
||||
XF86Config->conf_input_lst =
|
||||
xf86addInput(XF86Config->conf_input_lst, input);
|
||||
}
|
||||
|
@ -1884,7 +1904,7 @@ LayoutConfig(void)
|
|||
mouses[nmouses] = input;
|
||||
++nmouses;
|
||||
}
|
||||
else if (strcmp(input->inp_driver, "keyboard") == 0) {
|
||||
else if (IS_KBDDRIV(input->inp_driver)) {
|
||||
keyboards = (XF86ConfInputPtr*)XtRealloc((XtPointer)keyboards,
|
||||
(nkeyboards + 1) * sizeof(XF86ConfInputPtr));
|
||||
keyboards[nkeyboards] = input;
|
||||
|
@ -2119,7 +2139,7 @@ LayoutConfig(void)
|
|||
piref = NULL;
|
||||
iref = layout->lay_input_lst;
|
||||
while (iref) {
|
||||
if (strcmp(iref->iref_inputdev->inp_driver, "keyboard") == 0) {
|
||||
if (IS_KBDDRIV(iref->iref_inputdev->inp_driver)) {
|
||||
if (keyboard == NULL)
|
||||
piref = iref;
|
||||
if (xf86findOption(iref->iref_option_lst, "CoreKeyboard")) {
|
||||
|
@ -2165,7 +2185,7 @@ LayoutConfig(void)
|
|||
list[nlist++] = keyboard->inp_identifier;
|
||||
input = XF86Config->conf_input_lst;
|
||||
while (input) {
|
||||
if (input != keyboard && strcmp(input->inp_driver, "keyboard") == 0) {
|
||||
if (input != keyboard && IS_KBDDRIV(input->inp_driver)) {
|
||||
list = (char**)XtRealloc((XtPointer)list, (nlist + 1) * sizeof(char*));
|
||||
list[nlist++] = input->inp_identifier;
|
||||
}
|
||||
|
@ -3206,6 +3226,9 @@ DialogInput(char *title, char *prompt, int height, int width, char *init,
|
|||
continue;
|
||||
case KEY_BACKSPACE:
|
||||
case 0177:
|
||||
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||
case '\b':
|
||||
#endif
|
||||
if (input_x || scrlx) {
|
||||
wattrset(dialog, dialog_attr);
|
||||
|
||||
|
|
|
@ -2134,8 +2134,13 @@ static char *pointersection_text1 =
|
|||
"\n"
|
||||
"# Identifier and driver\n"
|
||||
"\n"
|
||||
#if defined(__UNIXWARE__) || defined(XQUEUE)
|
||||
"# Identifier \"Mouse1\"\n"
|
||||
"# Driver \"mouse\"\n"
|
||||
#else
|
||||
" Identifier \"Mouse1\"\n"
|
||||
" Driver \"mouse\"\n"
|
||||
#endif
|
||||
;
|
||||
|
||||
static char *pointersection_text2 =
|
||||
|
@ -2143,7 +2148,11 @@ static char *pointersection_text2 =
|
|||
"# When using XQUEUE, comment out the above two lines, and uncomment\n"
|
||||
"# the following line.\n"
|
||||
"\n"
|
||||
#if defined(__UNIXWARE__) || defined(XQUEUE)
|
||||
" Option \"Protocol\" \"Xqueue\"\n"
|
||||
#else
|
||||
"# Option \"Protocol\" \"Xqueue\"\n"
|
||||
#endif
|
||||
"\n"
|
||||
"# Mouse-speed setting for PS/2 mouse.\n"
|
||||
"\n"
|
||||
|
|
|
@ -60,8 +60,7 @@ typedef struct vbeControllerInfoBlock {
|
|||
CARD8 OemData[256];
|
||||
} vbeControllerInfoRec, *vbeControllerInfoPtr;
|
||||
|
||||
#if defined(__GNUC__) || defined(SCO) || defined(__USLC__) || \
|
||||
defined(__SUNPRO_C)
|
||||
#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C)
|
||||
#pragma pack() /* All GCC versions recognise this syntax */
|
||||
#else
|
||||
#pragma pack(0)
|
||||
|
|
|
@ -93,7 +93,7 @@ typedef struct _NewClientRec *NewClientPtr;
|
|||
#endif
|
||||
|
||||
#ifndef IN_MODULE
|
||||
#ifdef SCO
|
||||
#ifdef __SCO__
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
|
11
os/access.c
11
os/access.c
|
@ -84,9 +84,9 @@ SOFTWARE.
|
|||
#include <sys/ioctl.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(ISC) || defined(SCO)
|
||||
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(ISC) || defined(__SCO__)
|
||||
#include <netinet/in.h>
|
||||
#endif /* TCPCONN || STREAMSCONN || ISC || SCO */
|
||||
#endif /* TCPCONN || STREAMSCONN || ISC || __SCO__ */
|
||||
#ifdef DNETCONN
|
||||
#include <netdnet/dn.h>
|
||||
#include <netdnet/dnetdb.h>
|
||||
|
@ -138,9 +138,7 @@ SOFTWARE.
|
|||
#endif /* hpux */
|
||||
|
||||
#ifdef SVR4
|
||||
#ifndef SCO
|
||||
#include <sys/sockio.h>
|
||||
#endif
|
||||
#include <sys/stropts.h>
|
||||
#endif
|
||||
|
||||
|
@ -193,6 +191,11 @@ SOFTWARE.
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __SCO__
|
||||
/* The system defined value is wrong. MAXPATHLEN is set in sco5.cf. */
|
||||
#undef PATH_MAX
|
||||
#endif
|
||||
|
||||
#define X_INCLUDE_NETDB_H
|
||||
#include <X11/Xos_r.h>
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ SOFTWARE.
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(Lynx) || defined(SCO) || defined(SCO325)
|
||||
#if defined(Lynx) || defined(__SCO__)
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
|
@ -114,7 +114,7 @@ OsInit(void)
|
|||
#ifdef XFree86LOADER
|
||||
xf86WrapperInit();
|
||||
#endif
|
||||
#if !defined(SCO) && !defined(__CYGWIN__)
|
||||
#if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__)
|
||||
fclose(stdin);
|
||||
fclose(stdout);
|
||||
#endif
|
||||
|
|
50
os/utils.c
50
os/utils.c
|
@ -2238,3 +2238,53 @@ CheckUserAuthorization(void)
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __SCO__
|
||||
#include <fcntl.h>
|
||||
|
||||
static void
|
||||
lockit (int fd, short what)
|
||||
{
|
||||
struct flock lck;
|
||||
|
||||
lck.l_whence = 0;
|
||||
lck.l_start = 0;
|
||||
lck.l_len = 1;
|
||||
lck.l_type = what;
|
||||
|
||||
(void)fcntl (fd, F_SETLKW, &lck);
|
||||
}
|
||||
|
||||
/* SCO OpenServer 5 lacks pread/pwrite. Emulate them. */
|
||||
ssize_t
|
||||
pread (int fd, void *buf, size_t nbytes, off_t offset)
|
||||
{
|
||||
off_t saved;
|
||||
ssize_t ret;
|
||||
|
||||
lockit (fd, F_RDLCK);
|
||||
saved = lseek (fd, 0, SEEK_CUR);
|
||||
lseek (fd, offset, SEEK_SET);
|
||||
ret = read (fd, buf, nbytes);
|
||||
lseek (fd, saved, SEEK_SET);
|
||||
lockit (fd, F_UNLCK);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
pwrite (int fd, const void *buf, size_t nbytes, off_t offset)
|
||||
{
|
||||
off_t saved;
|
||||
ssize_t ret;
|
||||
|
||||
lockit (fd, F_WRLCK);
|
||||
saved = lseek (fd, 0, SEEK_CUR);
|
||||
lseek (fd, offset, SEEK_SET);
|
||||
ret = write (fd, buf, nbytes);
|
||||
lseek (fd, saved, SEEK_SET);
|
||||
lockit (fd, F_UNLCK);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* __SCO__ */
|
||||
|
|
Loading…
Reference in New Issue
Block a user