See ChangeLog entry 2005-11-07 for details.
This commit is contained in:
parent
f5814bf3ff
commit
5390c7ab05
|
@ -51,7 +51,7 @@
|
||||||
#ifdef SVR4
|
#ifdef SVR4
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(ISC) || defined(__CYGWIN__) || defined(SCO) || defined(SCO325)
|
#if defined(ISC) || defined(__CYGWIN__) || defined(__SCO__)
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -61,7 +61,7 @@ copyright holders.
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#if (defined(sun) && defined(SVR4)) || (defined(SCO))
|
#if (defined(sun) && defined(SVR4)) || defined(__SCO__) || defined(__UNIXWARE__)
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#endif
|
#endif
|
||||||
#include "scrnintstr.h"
|
#include "scrnintstr.h"
|
||||||
|
@ -1377,7 +1377,7 @@ ReplaceAllKeywords(
|
||||||
defined(linux) || \
|
defined(linux) || \
|
||||||
defined(__CYGWIN__) || \
|
defined(__CYGWIN__) || \
|
||||||
(defined(sun) && !defined(SVR4)) || \
|
(defined(sun) && !defined(SVR4)) || \
|
||||||
(defined(SVR4) && !defined(sun) && !defined(USL)) || \
|
(defined(SVR4) && !defined(sun) && !defined(__UNIXWARE__)) || \
|
||||||
defined(__UNIXOS2__) || \
|
defined(__UNIXOS2__) || \
|
||||||
defined(ISC) || \
|
defined(ISC) || \
|
||||||
defined(Lynx) || \
|
defined(Lynx) || \
|
||||||
|
|
|
@ -1604,18 +1604,8 @@ extern void outl(unsigned int a, unsigned int l);
|
||||||
# define asm __asm
|
# define asm __asm
|
||||||
# endif
|
# endif
|
||||||
# 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
|
# ifndef SCO325
|
||||||
# if defined(USL)
|
# if defined(__UNIXWARE__)
|
||||||
# if defined(IN_MODULE)
|
# if defined(IN_MODULE)
|
||||||
# /* avoid including <sys/types.h> for <sys/inline.h> on UnixWare */
|
# /* avoid including <sys/types.h> for <sys/inline.h> on UnixWare */
|
||||||
# define ushort unsigned short
|
# define ushort unsigned short
|
||||||
|
@ -1627,15 +1617,15 @@ extern void outl(unsigned int a, unsigned int l);
|
||||||
# else
|
# else
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# endif /* IN_MODULE */
|
# endif /* IN_MODULE */
|
||||||
# endif /* USL */
|
# endif /* __UNIXWARE__ */
|
||||||
# if !defined(sgi) && !defined(__SUNPRO_C)
|
# if !defined(sgi) && !defined(__SUNPRO_C)
|
||||||
# include <sys/inline.h>
|
# include <sys/inline.h>
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
# include "scoasm.h"
|
# include "scoasm.h"
|
||||||
# endif
|
# endif
|
||||||
# if !defined(__HIGHC__) && !defined(SCO325) && !defined(sgi) && \
|
# if (!defined(__HIGHC__) && !defined(sgi) && !defined(__SUNPRO_C)) || \
|
||||||
!defined(__SUNPRO_C)
|
defined(__USLC__)
|
||||||
# pragma asm partial_optimization outl
|
# pragma asm partial_optimization outl
|
||||||
# pragma asm partial_optimization outw
|
# pragma asm partial_optimization outw
|
||||||
# pragma asm partial_optimization outb
|
# pragma asm partial_optimization outb
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include <xorg-config.h>
|
#include <xorg-config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SCO325
|
#if defined(__SCO__) && defined(__USLC__)
|
||||||
#ifndef _SCOASM_HDR_INC
|
#ifndef _SCOASM_HDR_INC
|
||||||
#define _SCOASM_HDR_INC
|
#define _SCOASM_HDR_INC
|
||||||
|
|
||||||
|
@ -140,4 +140,4 @@ asm int inb(port)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _SCOASM_HDR_INC */
|
#endif /* _SCOASM_HDR_INC */
|
||||||
#endif /* SCO325 */
|
#endif /* __SCO__ && __USLC__ */
|
||||||
|
|
|
@ -1106,6 +1106,11 @@ configInputKbd(IDevPtr inputp)
|
||||||
MessageType from = X_DEFAULT;
|
MessageType from = X_DEFAULT;
|
||||||
Bool customKeycodesDefault = FALSE;
|
Bool customKeycodesDefault = FALSE;
|
||||||
int verb = 0;
|
int verb = 0;
|
||||||
|
#if defined(XQUEUE)
|
||||||
|
char *kbdproto = "Xqueue";
|
||||||
|
#else
|
||||||
|
char *kbdproto = "standard";
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize defaults */
|
/* Initialize defaults */
|
||||||
xf86Info.xleds = 0L;
|
xf86Info.xleds = 0L;
|
||||||
|
@ -1146,16 +1151,25 @@ configInputKbd(IDevPtr inputp)
|
||||||
xf86Info.xkbgeometry = NULL;
|
xf86Info.xkbgeometry = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
s = xf86SetStrOption(inputp->commonOptions, "Protocol", "standard");
|
s = xf86SetStrOption(inputp->commonOptions, "Protocol", kbdproto);
|
||||||
if (xf86NameCmp(s, "standard") == 0) {
|
if (xf86NameCmp(s, "standard") == 0) {
|
||||||
xf86Info.kbdProc = xf86KbdProc;
|
xf86Info.kbdProc = xf86KbdProc;
|
||||||
xf86Info.kbdEvents = xf86KbdEvents;
|
xf86Info.kbdEvents = xf86KbdEvents;
|
||||||
xfree(s);
|
xfree(s);
|
||||||
} else if (xf86NameCmp(s, "xqueue") == 0) {
|
} 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
|
#ifdef XQUEUE
|
||||||
xf86Info.kbdProc = xf86XqueKbdProc;
|
xf86Info.kbdProc = xf86XqueKbdProc;
|
||||||
xf86Info.kbdEvents = xf86XqueEvents;
|
xf86Info.kbdEvents = xf86XqueEvents;
|
||||||
xf86Msg(X_CONFIG, "Xqueue selected for keyboard input\n");
|
xf86Msg(X_CONFIG, "Xqueue selected for keyboard input\n");
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
xfree(s);
|
xfree(s);
|
||||||
#ifdef WSCONS_SUPPORT
|
#ifdef WSCONS_SUPPORT
|
||||||
|
|
|
@ -76,8 +76,11 @@ Bool foundMouse = FALSE;
|
||||||
#if defined(__UNIXOS2__)
|
#if defined(__UNIXOS2__)
|
||||||
#define DFLT_MOUSE_DEV "mouse$"
|
#define DFLT_MOUSE_DEV "mouse$"
|
||||||
#define DFLT_MOUSE_PROTO "OS2Mouse"
|
#define DFLT_MOUSE_PROTO "OS2Mouse"
|
||||||
#elif defined(SCO)
|
#elif defined(__SCO__)
|
||||||
static char *DFLT_MOUSE_PROTO = "OSMouse";
|
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)
|
#elif defined(QNX4)
|
||||||
static char *DFLT_MOUSE_PROTO = "OSMouse";
|
static char *DFLT_MOUSE_PROTO = "OSMouse";
|
||||||
static char *DFLT_MOUSE_DEV = "/dev/mouse";
|
static char *DFLT_MOUSE_DEV = "/dev/mouse";
|
||||||
|
@ -294,7 +297,7 @@ configureInputSection (void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SCO
|
#ifndef __SCO__
|
||||||
fd = open(DFLT_MOUSE_DEV, 0);
|
fd = open(DFLT_MOUSE_DEV, 0);
|
||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
foundMouse = TRUE;
|
foundMouse = TRUE;
|
||||||
|
@ -311,12 +314,14 @@ configureInputSection (void)
|
||||||
mouse->inp_driver = "mouse";
|
mouse->inp_driver = "mouse";
|
||||||
mouse->inp_option_lst =
|
mouse->inp_option_lst =
|
||||||
xf86addNewOption(mouse->inp_option_lst, "Protocol", DFLT_MOUSE_PROTO);
|
xf86addNewOption(mouse->inp_option_lst, "Protocol", DFLT_MOUSE_PROTO);
|
||||||
#ifndef SCO
|
#ifndef __SCO__
|
||||||
mouse->inp_option_lst =
|
mouse->inp_option_lst =
|
||||||
xf86addNewOption(mouse->inp_option_lst, "Device", DFLT_MOUSE_DEV);
|
xf86addNewOption(mouse->inp_option_lst, "Device", DFLT_MOUSE_DEV);
|
||||||
#endif
|
#ifndef __UNIXWARE__
|
||||||
mouse->inp_option_lst =
|
mouse->inp_option_lst =
|
||||||
xf86addNewOption(mouse->inp_option_lst, "ZAxisMapping", "4 5 6 7");
|
xf86addNewOption(mouse->inp_option_lst, "ZAxisMapping", "4 5 6 7");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse);
|
ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@ -885,7 +890,7 @@ DoConfigure()
|
||||||
#ifdef __UNIXOS2__
|
#ifdef __UNIXOS2__
|
||||||
#define PATH_MAX 2048
|
#define PATH_MAX 2048
|
||||||
#endif
|
#endif
|
||||||
#if defined(SCO) || defined(SCO325)
|
#if !defined(PATH_MAX)
|
||||||
#define PATH_MAX 1024
|
#define PATH_MAX 1024
|
||||||
#endif
|
#endif
|
||||||
const char* configfile = XF86CONFIGFILE".new";
|
const char* configfile = XF86CONFIGFILE".new";
|
||||||
|
@ -1009,13 +1014,13 @@ DoConfigure()
|
||||||
|
|
||||||
ErrorF("\n");
|
ErrorF("\n");
|
||||||
|
|
||||||
#ifdef SCO
|
#ifdef __SCO__
|
||||||
ErrorF("\n"__XSERVERNAME__
|
ErrorF("\n"__XSERVERNAME__
|
||||||
" is using the kernel event driver to access the mouse.\n"
|
" is using the kernel event driver to access the mouse.\n"
|
||||||
"If you wish to use the internal "__XSERVERNAME__
|
"If you wish to use the internal "__XSERVERNAME__
|
||||||
"mouse drivers, please\n"
|
" mouse drivers, please\n"
|
||||||
"edit the file and correct the Device.\n");
|
"edit the file and correct the Device.\n");
|
||||||
#else /* !SCO */
|
#else /* !__SCO__ */
|
||||||
if (!foundMouse) {
|
if (!foundMouse) {
|
||||||
ErrorF("\n"__XSERVERNAME__" is not able to detect your mouse.\n"
|
ErrorF("\n"__XSERVERNAME__" is not able to detect your mouse.\n"
|
||||||
"Edit the file and correct the Device.\n");
|
"Edit the file and correct the Device.\n");
|
||||||
|
@ -1028,7 +1033,7 @@ DoConfigure()
|
||||||
"the protocol.\n",DFLT_MOUSE_DEV);
|
"the protocol.\n",DFLT_MOUSE_DEV);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* !SCO */
|
#endif /* !__SCO__ */
|
||||||
|
|
||||||
if (xf86NumScreens > 1) {
|
if (xf86NumScreens > 1) {
|
||||||
ErrorF("\n"__XSERVERNAME__
|
ErrorF("\n"__XSERVERNAME__
|
||||||
|
|
|
@ -364,7 +364,7 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
|
||||||
case ACTION_SWITCHSCREEN:
|
case ACTION_SWITCHSCREEN:
|
||||||
if (VTSwitchEnabled && !xf86Info.dontVTSwitch && arg) {
|
if (VTSwitchEnabled && !xf86Info.dontVTSwitch && arg) {
|
||||||
int vtno = *((int *) arg);
|
int vtno = *((int *) arg);
|
||||||
#ifdef SCO
|
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||||
vtno--;
|
vtno--;
|
||||||
#endif
|
#endif
|
||||||
#if defined(QNX4)
|
#if defined(QNX4)
|
||||||
|
@ -377,12 +377,13 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
|
||||||
break;
|
break;
|
||||||
case ACTION_SWITCHSCREEN_NEXT:
|
case ACTION_SWITCHSCREEN_NEXT:
|
||||||
if (VTSwitchEnabled && !xf86Info.dontVTSwitch) {
|
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)
|
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0)
|
||||||
#else
|
#else
|
||||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno + 1) < 0)
|
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno + 1) < 0)
|
||||||
#endif
|
#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)
|
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 0) < 0)
|
||||||
#else
|
#else
|
||||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) < 0)
|
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) < 0)
|
||||||
|
@ -784,7 +785,7 @@ special:
|
||||||
break;
|
break;
|
||||||
#endif
|
#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
|
* Under Linux, the raw keycodes are consumed before the kernel
|
||||||
* does any processing on them, so we must emulate the vt switching
|
* does any processing on them, so we must emulate the vt switching
|
||||||
|
@ -923,7 +924,7 @@ special:
|
||||||
|
|
||||||
#endif /* USE_VT_SYSREQ */
|
#endif /* USE_VT_SYSREQ */
|
||||||
|
|
||||||
#ifdef SCO
|
#ifdef __SCO__
|
||||||
/*
|
/*
|
||||||
* With the console in raw mode, SCO will not switch consoles,
|
* With the console in raw mode, SCO will not switch consoles,
|
||||||
* you get around this by activating the next console along, if
|
* you get around this by activating the next console along, if
|
||||||
|
@ -938,7 +939,7 @@ special:
|
||||||
xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
|
xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif /* SCO */
|
#endif /* __SCO__ */
|
||||||
#ifdef XKB
|
#ifdef XKB
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1104,8 +1105,9 @@ special:
|
||||||
Bool
|
Bool
|
||||||
xf86CommonSpecialKey(int key, Bool down, int modifiers)
|
xf86CommonSpecialKey(int key, Bool down, int modifiers)
|
||||||
{
|
{
|
||||||
if ((ModifierIsSet(ControlMask | AltMask)) ||
|
if ((!ModifierIsSet(ShiftMask)) &&
|
||||||
(ModifierIsSet(ControlMask | AltLangMask))) {
|
(((ModifierIsSet(ControlMask | AltMask)) ||
|
||||||
|
(ModifierIsSet(ControlMask | AltLangMask))))) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
|
||||||
case KEY_BackSpace:
|
case KEY_BackSpace:
|
||||||
|
|
|
@ -906,7 +906,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
|
||||||
xf86EnterServerState(SETUP);
|
xf86EnterServerState(SETUP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef SCO
|
#ifdef SCO325
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
* Under SCO we must ack that we got the console at startup,
|
* 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");
|
xf86Msg(X_WARNING, "VT_ACKACQ failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* SCO */
|
#endif /* SCO325 */
|
||||||
|
|
||||||
for (i = 0; i < xf86NumScreens; i++) {
|
for (i = 0; i < xf86NumScreens; i++) {
|
||||||
xf86EnableAccess(xf86Screens[i]);
|
xf86EnableAccess(xf86Screens[i]);
|
||||||
|
|
|
@ -402,6 +402,26 @@ LoaderInit(void)
|
||||||
*/
|
*/
|
||||||
mallopt(M_MMAP_MAX, 0);
|
mallopt(M_MMAP_MAX, 0);
|
||||||
#endif
|
#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"
|
#define OSNAME "lynxos"
|
||||||
#elif defined(__GNU__)
|
#elif defined(__GNU__)
|
||||||
#define OSNAME "hurd"
|
#define OSNAME "hurd"
|
||||||
#elif defined(SCO)
|
#elif defined(__SCO__)
|
||||||
#define OSNAME "sco"
|
#define OSNAME "sco"
|
||||||
#elif defined(DGUX)
|
#elif defined(DGUX)
|
||||||
#define OSNAME "dgux"
|
#define OSNAME "dgux"
|
||||||
|
@ -58,6 +58,8 @@
|
||||||
#define OSNAME "isc"
|
#define OSNAME "isc"
|
||||||
#elif defined(SVR4) && defined(sun)
|
#elif defined(SVR4) && defined(sun)
|
||||||
#define OSNAME "solaris"
|
#define OSNAME "solaris"
|
||||||
|
#elif defined(SVR5)
|
||||||
|
#define OSNAME "svr5"
|
||||||
#elif defined(SVR4)
|
#elif defined(SVR4)
|
||||||
#define OSNAME "svr4"
|
#define OSNAME "svr4"
|
||||||
#elif defined(__UNIXOS2__)
|
#elif defined(__UNIXOS2__)
|
||||||
|
|
|
@ -58,7 +58,7 @@ xf86VTRequest(int sig)
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
xf86VTSwitchPending()
|
xf86VTSwitchPending(void)
|
||||||
{
|
{
|
||||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ static int sco_ledstatus = -1;
|
||||||
static unsigned int sco_ledstate = 0;
|
static unsigned int sco_ledstate = 0;
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
xf86VTSwitchAway()
|
xf86VTSwitchAway(void)
|
||||||
{
|
{
|
||||||
ev_flush();
|
ev_flush();
|
||||||
ev_suspend();
|
ev_suspend();
|
||||||
|
@ -93,7 +93,7 @@ xf86VTSwitchAway()
|
||||||
* switched away.
|
* switched away.
|
||||||
*/
|
*/
|
||||||
Bool
|
Bool
|
||||||
xf86VTSwitchTo()
|
xf86VTSwitchTo(void)
|
||||||
{
|
{
|
||||||
ev_resume();
|
ev_resume();
|
||||||
|
|
||||||
|
|
|
@ -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 $ */
|
/* $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
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
* documentation for any purpose is hereby granted without fee, provided that
|
* documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
@ -39,19 +39,19 @@
|
||||||
|
|
||||||
static Bool KeepTty = FALSE;
|
static Bool KeepTty = FALSE;
|
||||||
static int VTnum = -1;
|
static int VTnum = -1;
|
||||||
static char *vtdevice = NULL;
|
static char vtdevice[48];
|
||||||
static int sco_console_mode = -1;
|
static int sco_console_mode = -1;
|
||||||
|
|
||||||
extern Bool mpxLock;
|
extern Bool mpxLock;
|
||||||
|
|
||||||
void
|
void
|
||||||
xf86OpenConsole()
|
xf86OpenConsole(void)
|
||||||
{
|
{
|
||||||
int fd,i, ioctl_ret;
|
int i, ioctl_ret;
|
||||||
struct vt_mode VT;
|
struct vt_mode VT;
|
||||||
static char vtname[32];
|
|
||||||
struct vid_info vidinf;
|
struct vid_info vidinf;
|
||||||
struct sigaction sigvtsw;
|
struct sigaction sigvtsw;
|
||||||
|
char *ttn;
|
||||||
|
|
||||||
if (serverGeneration == 1) {
|
if (serverGeneration == 1) {
|
||||||
/* check if we're run with euid==0 */
|
/* check if we're run with euid==0 */
|
||||||
|
@ -59,6 +59,9 @@ xf86OpenConsole()
|
||||||
FatalError("xf86OpenConsole: Server must be setuid root\n");
|
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).
|
* Set up the virtual terminal (multiscreen in SCO parlance).
|
||||||
* For the actual console itself, screens are numbered from
|
* For the actual console itself, screens are numbered from
|
||||||
|
@ -67,75 +70,37 @@ xf86OpenConsole()
|
||||||
* system such as MaxSpeed or SunRiver. Therefore, we should
|
* system such as MaxSpeed or SunRiver. Therefore, we should
|
||||||
* not make any assumptions about the TTY name we are on, and
|
* not make any assumptions about the TTY name we are on, and
|
||||||
* instead we rely on ttyname() to give us the real TTY name.
|
* 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
|
* 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.
|
* the command line.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (VTnum == -1) {
|
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;
|
ttn = ttyname (1);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (ttn == (char *)0) {
|
if (ttn == (char *)0) {
|
||||||
ErrorF ("xf86OpenConsole: Error determining TTY name (%s)\n",
|
FatalError ("xf86OpenConsole: Could not determine TTY name: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
snprintf (vtname, sizeof(vtname)-1, "/dev/tty%02d", VTnum);
|
|
||||||
} else {
|
|
||||||
strlcpy (vtname, ttn, sizeof(vtname));
|
|
||||||
}
|
}
|
||||||
vtdevice = vtname;
|
strlcpy (vtdevice, ttn, sizeof(vtdevice));
|
||||||
} else if (VTnum == -2 || VTnum >= 0) {
|
} else if (VTnum >= 0) {
|
||||||
/*
|
snprintf (vtdevice, sizeof(vtdevice), "/dev/tty%02d", VTnum);
|
||||||
* 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 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
if ((xf86Info.consoleFd = open(vtdevice, O_RDWR | O_NDELAY, 0)) < 0) {
|
||||||
FatalError("xf86OpenConsole: Cannot open %s (%s)\n", vtdevice,
|
FatalError("xf86OpenConsole: Cannot open %s: %s\n", vtdevice,
|
||||||
strerror(errno));
|
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -145,10 +110,13 @@ xf86OpenConsole()
|
||||||
*/
|
*/
|
||||||
vidinf.size = sizeof(vidinf);
|
vidinf.size = sizeof(vidinf);
|
||||||
if (ioctl (xf86Info.consoleFd, CONS_GETINFO, &vidinf) < 0) {
|
if (ioctl (xf86Info.consoleFd, CONS_GETINFO, &vidinf) < 0) {
|
||||||
FatalError ("xf86OpenConsole: Failed to query console number (%s)\n",
|
FatalError ("xf86OpenConsole: %s not a console device "
|
||||||
strerror (errno));
|
"or error querying device: %s\n", vtdevice, strerror (errno));
|
||||||
}
|
}
|
||||||
xf86Info.vtno = vidinf.m_num;
|
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 */
|
/* We activate the console just in case its not the one we are on */
|
||||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
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
|
* use this later when we close the console device to restore it to
|
||||||
* that same mode.
|
* that same mode.
|
||||||
*/
|
*/
|
||||||
|
@ -227,7 +195,7 @@ xf86OpenConsole()
|
||||||
* video card down again after coming out of Xfree86.
|
* video card down again after coming out of Xfree86.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xf86CloseConsole()
|
xf86CloseConsole(void)
|
||||||
{
|
{
|
||||||
struct vt_mode VT;
|
struct vt_mode VT;
|
||||||
struct sigaction sigvtsw;
|
struct sigaction sigvtsw;
|
||||||
|
@ -310,7 +278,7 @@ xf86ProcessArgument(int argc, char *argv[], int i)
|
||||||
return(0);
|
return(0);
|
||||||
} else {
|
} else {
|
||||||
VTnum = -2;
|
VTnum = -2;
|
||||||
vtdevice = argv[i];
|
strlcpy (vtdevice, argv[i], sizeof(vtdevice));
|
||||||
return(2);
|
return(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -318,7 +286,7 @@ xf86ProcessArgument(int argc, char *argv[], int i)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xf86UseMsg()
|
xf86UseMsg(void)
|
||||||
{
|
{
|
||||||
ErrorF("vtXX use the specified VT number\n");
|
ErrorF("vtXX use the specified VT number\n");
|
||||||
ErrorF("-crt DEVICE use the specified VT device\n");
|
ErrorF("-crt DEVICE use the specified VT device\n");
|
||||||
|
|
|
@ -73,7 +73,7 @@ xf86SetKbdLeds(int leds)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
xf86GetKbdLeds()
|
xf86GetKbdLeds(void)
|
||||||
{
|
{
|
||||||
int leds;
|
int leds;
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ static uchar_t *sc_mapbuf;
|
||||||
static uchar_t *sc_mapbuf2;
|
static uchar_t *sc_mapbuf2;
|
||||||
|
|
||||||
void
|
void
|
||||||
xf86KbdInit()
|
xf86KbdInit(void)
|
||||||
{
|
{
|
||||||
orig_getsc = 0;
|
orig_getsc = 0;
|
||||||
if (ioctl (xf86Info.consoleFd, TCGETSC, &orig_getsc) < 0)
|
if (ioctl (xf86Info.consoleFd, TCGETSC, &orig_getsc) < 0)
|
||||||
|
@ -214,7 +214,7 @@ xf86KbdInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
xf86KbdOn()
|
xf86KbdOn(void)
|
||||||
{
|
{
|
||||||
struct termios newtio;
|
struct termios newtio;
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ xf86KbdOn()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
xf86KbdOff()
|
xf86KbdOff(void)
|
||||||
{
|
{
|
||||||
/* Revert back to original translate scancode mode */
|
/* Revert back to original translate scancode mode */
|
||||||
if (use_tcs)
|
if (use_tcs)
|
||||||
|
@ -267,11 +267,3 @@ xf86KbdOff()
|
||||||
|
|
||||||
return(xf86Info.consoleFd);
|
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;
|
static Bool IOEnabled = FALSE;
|
||||||
|
|
||||||
Bool xf86EnableIO(void)
|
Bool
|
||||||
|
xf86EnableIO(void)
|
||||||
{
|
{
|
||||||
if (IOEnabled)
|
if (IOEnabled)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -80,7 +81,8 @@ Bool xf86EnableIO(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf86DisableIO(void)
|
void
|
||||||
|
xf86DisableIO(void)
|
||||||
{
|
{
|
||||||
if (!IOEnabled)
|
if (!IOEnabled)
|
||||||
return;
|
return;
|
||||||
|
@ -93,7 +95,8 @@ void xf86DisableIO(void)
|
||||||
/* Interrupt Handling section */
|
/* Interrupt Handling section */
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
Bool xf86DisableInterrupts()
|
Bool
|
||||||
|
xf86DisableInterrupts(void)
|
||||||
{
|
{
|
||||||
if (!IOEnabled) {
|
if (!IOEnabled) {
|
||||||
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
||||||
|
@ -113,7 +116,8 @@ Bool xf86DisableInterrupts()
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf86EnableInterrupts()
|
void
|
||||||
|
xf86EnableInterrupts(void)
|
||||||
{
|
{
|
||||||
if (!IOEnabled) {
|
if (!IOEnabled) {
|
||||||
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
static int
|
||||||
SupportedInterfaces (void)
|
SupportedInterfaces (void)
|
||||||
{
|
{
|
||||||
/* FIXME: Is this correct? Should we just return MSE_MISC? */
|
return MSE_MISC;
|
||||||
return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_MISC | MSE_AUTO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *internalNames[] = {
|
static const char *internalNames[] = {
|
||||||
|
@ -107,8 +106,8 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
||||||
case DEVICE_INIT:
|
case DEVICE_INIT:
|
||||||
pPointer->public.on = FALSE;
|
pPointer->public.on = FALSE;
|
||||||
|
|
||||||
dmask = D_REL | D_BUTTON;
|
dmask = D_ABS | D_REL | D_BUTTON;
|
||||||
if ((evi = ev_init()) < 0) {
|
if ((evi = ev_initf(xf86Info.consoleFd)) < 0) {
|
||||||
FatalError ("OsMouseProc: Event driver initialization failed (%s)\n",
|
FatalError ("OsMouseProc: Event driver initialization failed (%s)\n",
|
||||||
evtErrStr(evi));
|
evtErrStr(evi));
|
||||||
}
|
}
|
||||||
|
@ -127,9 +126,9 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
||||||
map[1] = 1;
|
map[1] = 1;
|
||||||
map[2] = 2;
|
map[2] = 2;
|
||||||
map[3] = 3;
|
map[3] = 3;
|
||||||
map[4] = 6;
|
map[4] = 7;
|
||||||
map[5] = 7;
|
map[5] = 8;
|
||||||
map[6] = 8;
|
map[6] = 6;
|
||||||
map[7] = 4;
|
map[7] = 4;
|
||||||
map[8] = 5; /* Compatibile with SCO X server */
|
map[8] = 5; /* Compatibile with SCO X server */
|
||||||
|
|
||||||
|
@ -161,7 +160,7 @@ OsMouseProc (DeviceIntPtr pPointer, int what)
|
||||||
|
|
||||||
case DEVICE_OFF:
|
case DEVICE_OFF:
|
||||||
case DEVICE_CLOSE:
|
case DEVICE_CLOSE:
|
||||||
pPointer->public.on = TRUE;
|
pPointer->public.on = FALSE;
|
||||||
RemoveEnabledDevice (pInfo->fd);
|
RemoveEnabledDevice (pInfo->fd);
|
||||||
if (what == DEVICE_CLOSE) {
|
if (what == DEVICE_CLOSE) {
|
||||||
ev_close();
|
ev_close();
|
||||||
|
@ -185,18 +184,15 @@ OsMouseReadInput (InputInfoPtr pInfo)
|
||||||
|
|
||||||
while ((evp = ev_read()) != (EVENT *)0) {
|
while ((evp = ev_read()) != (EVENT *)0) {
|
||||||
int buttons = EV_BUTTONS(*evp);
|
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) {
|
if (EV_TAG(*evp) & T_WHEEL) {
|
||||||
dz = (dy & 0x08) ? (dy & 0x0f) - 16 : (dy & 0x0f);
|
pMse->PostEvent (pInfo, buttons, 0, 0, 0, 0);
|
||||||
dx = dy = 0;
|
|
||||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
|
||||||
/* Simulate button release */
|
/* Simulate button release */
|
||||||
dz = 0;
|
|
||||||
buttons &= ~(WHEEL_FWD | WHEEL_BACK);
|
buttons &= ~(WHEEL_FWD | WHEEL_BACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
pMse->PostEvent (pInfo, buttons, dx, dy, 0, 0);
|
||||||
ev_pop();
|
ev_pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -217,9 +213,9 @@ OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
|
||||||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||||
|
|
||||||
/* Check if the device can be opened. */
|
/* Check if the device can be opened. */
|
||||||
pInfo->fd = ev_init();
|
pInfo->fd = ev_initf(xf86Info.consoleFd);
|
||||||
if (pInfo->fd != -1) {
|
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);
|
pInfo->fd = ev_open(&dmask);
|
||||||
} else {
|
} else {
|
||||||
pInfo->fd = -999;
|
pInfo->fd = -999;
|
||||||
|
|
|
@ -65,7 +65,7 @@ xf86KbdInit()
|
||||||
ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
|
ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
|
||||||
#endif
|
#endif
|
||||||
ioctl (xf86Info.consoleFd, TCGETA, &kbdtty);
|
ioctl (xf86Info.consoleFd, TCGETA, &kbdtty);
|
||||||
#if defined(E_TABSZ) && !defined(SCO325)
|
#if defined(E_TABSZ)
|
||||||
kbdemap = xalloc(E_TABSZ);
|
kbdemap = xalloc(E_TABSZ);
|
||||||
if (ioctl(xf86Info.consoleFd, LDGMAP, kbdemap) < 0)
|
if (ioctl(xf86Info.consoleFd, LDGMAP, kbdemap) < 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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 */
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 <termio.h>
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# if defined(SCO) || defined(ISC)
|
# if defined(__SCO__) || defined(ISC)
|
||||||
# include <sys/param.h>
|
# include <sys/param.h>
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ typedef signed long xf86ssize_t;
|
||||||
# if !defined(sun)
|
# if !defined(sun)
|
||||||
# include <sys/emap.h>
|
# include <sys/emap.h>
|
||||||
# endif
|
# endif
|
||||||
# if defined(SCO)
|
# if defined(SCO325)
|
||||||
# include <sys/vtkd.h>
|
# include <sys/vtkd.h>
|
||||||
# include <sys/console.h>
|
# include <sys/console.h>
|
||||||
# include <sys/scankbd.h>
|
# include <sys/scankbd.h>
|
||||||
|
@ -203,16 +203,16 @@ typedef signed long xf86ssize_t;
|
||||||
# define LED_NUM LED_NUM_LOCK
|
# define LED_NUM LED_NUM_LOCK
|
||||||
# define LED_SCR LED_SCROLL_LOCK
|
# define LED_SCR LED_SCROLL_LOCK
|
||||||
# define LED_COMP LED_COMPOSE
|
# define LED_COMP LED_COMPOSE
|
||||||
# endif /* SCO */
|
# endif /* sun */
|
||||||
|
|
||||||
# if !defined(VT_ACKACQ)
|
# if !defined(VT_ACKACQ)
|
||||||
# define VT_ACKACQ 2
|
# define VT_ACKACQ 2
|
||||||
# endif /* !VT_ACKACQ */
|
# endif /* !VT_ACKACQ */
|
||||||
|
|
||||||
# if defined(SCO)
|
# if defined(__SCO__)
|
||||||
# include <sys/sysmacros.h>
|
# include <sys/sysmacros.h>
|
||||||
# define POSIX_TTY
|
# define POSIX_TTY
|
||||||
# endif /* SCO */
|
# endif /* __SCO__ */
|
||||||
|
|
||||||
# if defined(SVR4) || defined(SCO325)
|
# if defined(SVR4) || defined(SCO325)
|
||||||
# include <sys/mman.h>
|
# include <sys/mman.h>
|
||||||
|
@ -243,9 +243,11 @@ typedef signed long xf86ssize_t;
|
||||||
# define i386 /* not defined in ANSI C mode */
|
# define i386 /* not defined in ANSI C mode */
|
||||||
# endif /* ATT && !i386 */
|
# endif /* ATT && !i386 */
|
||||||
|
|
||||||
# if (defined(ATT) || defined(SVR4)) && !defined(sun) && !defined(SCO325)
|
# if (defined(ATT) || defined(SVR4)) && !defined(sun)
|
||||||
# ifndef XQUEUE
|
# ifndef __UNIXWARE__
|
||||||
# define XQUEUE
|
# ifndef XQUEUE
|
||||||
|
# define XQUEUE
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# include <sys/xque.h>
|
# include <sys/xque.h>
|
||||||
# endif /* ATT || SVR4 */
|
# endif /* ATT || SVR4 */
|
||||||
|
|
|
@ -136,6 +136,10 @@ extern void xf86WrapperInit(void);
|
||||||
#include <X11/Xfuncproto.h>
|
#include <X11/Xfuncproto.h>
|
||||||
#include "opaque.h"
|
#include "opaque.h"
|
||||||
|
|
||||||
|
#if defined(XQUEUE)
|
||||||
|
#include "input.h" /* for DeviceIntPtr */
|
||||||
|
#endif
|
||||||
|
|
||||||
_XFUNCPROTOBEGIN
|
_XFUNCPROTOBEGIN
|
||||||
|
|
||||||
/* public functions */
|
/* public functions */
|
||||||
|
|
|
@ -55,7 +55,8 @@
|
||||||
|
|
||||||
#if defined(XFree86LOADER) || defined(NEED_XF86_TYPES)
|
#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_VSSCANF
|
||||||
#define HAVE_VFSCANF
|
#define HAVE_VFSCANF
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -676,16 +676,16 @@ xf86printMonitorSection (FILE * cf, XF86ConfMonitorPtr ptr)
|
||||||
ptr->mon_width,
|
ptr->mon_width,
|
||||||
ptr->mon_height);
|
ptr->mon_height);
|
||||||
if ( ptr->mon_n_hsync || ptr->mon_n_vrefresh )
|
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++)
|
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].lo,
|
||||||
ptr->mon_hsync[i].hi);
|
ptr->mon_hsync[i].hi);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ptr->mon_n_vrefresh; i++)
|
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].lo,
|
||||||
ptr->mon_vrefresh[i].hi);
|
ptr->mon_vrefresh[i].hi);
|
||||||
}
|
}
|
||||||
|
|
|
@ -489,6 +489,9 @@ LookupCard(char *name)
|
||||||
{
|
{
|
||||||
CardsEntry **ptr;
|
CardsEntry **ptr;
|
||||||
|
|
||||||
|
if (NumCardsEntry == 0 || CardsDB == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ptr = (CardsEntry**)bsearch(name, CardsDB, NumCardsEntry,
|
ptr = (CardsEntry**)bsearch(name, CardsDB, NumCardsEntry,
|
||||||
sizeof(CardsEntry*), BCompareCards);
|
sizeof(CardsEntry*), BCompareCards);
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,9 @@
|
||||||
#define DefaultXFree86Dir "/usr/X11R6"
|
#define DefaultXFree86Dir "/usr/X11R6"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0) || \
|
||||||
|
(strcasecmp((S), "keyboard") == 0))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes
|
* Prototypes
|
||||||
*/
|
*/
|
||||||
|
@ -791,7 +794,7 @@ InitializeDevices(void)
|
||||||
mouse_x = work->core.width - (work->core.width >> 2);
|
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);
|
device = AddDevice(KEYBOARD, (XtPointer)input, keyboard_x, keyboard_y);
|
||||||
SetTip(device);
|
SetTip(device);
|
||||||
if ((keyboard_x += DEFAULT_KEYBOARD_WIDTH) >
|
if ((keyboard_x += DEFAULT_KEYBOARD_WIDTH) >
|
||||||
|
@ -1645,8 +1648,7 @@ EnableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
|
||||||
while (nex != NULL) {
|
while (nex != NULL) {
|
||||||
if (strcasecmp(nex->iref_inputdev->inp_driver, "mouse") == 0)
|
if (strcasecmp(nex->iref_inputdev->inp_driver, "mouse") == 0)
|
||||||
++nmouses;
|
++nmouses;
|
||||||
else if (strcasecmp(nex->iref_inputdev->inp_driver,
|
else if (IS_KBDDRIV(nex->iref_inputdev->inp_driver))
|
||||||
"keyboard") == 0)
|
|
||||||
++nkeyboards;
|
++nkeyboards;
|
||||||
iref = nex;
|
iref = nex;
|
||||||
nex = (XF86ConfInputrefPtr)(nex->list.next);
|
nex = (XF86ConfInputrefPtr)(nex->list.next);
|
||||||
|
|
|
@ -38,6 +38,9 @@
|
||||||
#include <X11/Xaw/SimpleMenu.h>
|
#include <X11/Xaw/SimpleMenu.h>
|
||||||
#include <X11/Xaw/SmeBSB.h>
|
#include <X11/Xaw/SmeBSB.h>
|
||||||
|
|
||||||
|
#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0) || \
|
||||||
|
(strcasecmp((X), "keyboard") == 0))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Types
|
* Types
|
||||||
*/
|
*/
|
||||||
|
@ -159,8 +162,7 @@ KeyboardConfig(XtPointer config)
|
||||||
XF86ConfInputPtr key = XF86Config->conf_input_lst;
|
XF86ConfInputPtr key = XF86Config->conf_input_lst;
|
||||||
|
|
||||||
while (key != NULL) {
|
while (key != NULL) {
|
||||||
if (strcasecmp(key->inp_driver, "keyboard") == 0 &&
|
if (IS_KBDDRIV(key->inp_driver) && xkb_infos[i]->conf == key)
|
||||||
xkb_infos[i]->conf == key)
|
|
||||||
break;
|
break;
|
||||||
key = (XF86ConfInputPtr)(key->list.next);
|
key = (XF86ConfInputPtr)(key->list.next);
|
||||||
}
|
}
|
||||||
|
@ -216,7 +218,7 @@ KeyboardConfig(XtPointer config)
|
||||||
int nkeyboards = 0;
|
int nkeyboards = 0;
|
||||||
|
|
||||||
while (input != NULL) {
|
while (input != NULL) {
|
||||||
if (strcasecmp(input->inp_driver, "keyboard") == 0)
|
if (IS_KBDDRIV(input->inp_driver))
|
||||||
++nkeyboards;
|
++nkeyboards;
|
||||||
input = (XF86ConfInputPtr)(input->list.next);
|
input = (XF86ConfInputPtr)(input->list.next);
|
||||||
}
|
}
|
||||||
|
@ -253,7 +255,11 @@ KeyboardConfig(XtPointer config)
|
||||||
keyboard = XtNew(XF86ConfInputRec);
|
keyboard = XtNew(XF86ConfInputRec);
|
||||||
keyboard->list.next = NULL;
|
keyboard->list.next = NULL;
|
||||||
keyboard->inp_identifier = XtNewString(ident_string);
|
keyboard->inp_identifier = XtNewString(ident_string);
|
||||||
|
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||||
keyboard->inp_driver = XtNewString("keyboard");
|
keyboard->inp_driver = XtNewString("keyboard");
|
||||||
|
#else
|
||||||
|
keyboard->inp_driver = XtNewString("kbd");
|
||||||
|
#endif
|
||||||
keyboard->inp_option_lst = xf86newOption(XtNewString(XkbRules),
|
keyboard->inp_option_lst = xf86newOption(XtNewString(XkbRules),
|
||||||
XtNewString(rules));
|
XtNewString(rules));
|
||||||
xf86addNewOption(keyboard->inp_option_lst,
|
xf86addNewOption(keyboard->inp_option_lst,
|
||||||
|
@ -493,7 +499,7 @@ InitializeKeyboard(void)
|
||||||
|
|
||||||
/* XXX Assumes the first keyboard is the core keyboard */
|
/* XXX Assumes the first keyboard is the core keyboard */
|
||||||
while (keyboard != NULL) {
|
while (keyboard != NULL) {
|
||||||
if (strcasecmp(keyboard->inp_driver, "keyboard") == 0)
|
if (IS_KBDDRIV(keyboard->inp_driver))
|
||||||
break;
|
break;
|
||||||
keyboard = (XF86ConfInputPtr)(keyboard->list.next);
|
keyboard = (XF86ConfInputPtr)(keyboard->list.next);
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,9 +58,12 @@ static struct MouseProtocol {
|
||||||
#ifdef __UNIXOS2__
|
#ifdef __UNIXOS2__
|
||||||
{"OS2Mouse", MTYPE_AUTOMOUSE},
|
{"OS2Mouse", MTYPE_AUTOMOUSE},
|
||||||
#endif
|
#endif
|
||||||
#ifdef SCO
|
#ifdef __SCO__
|
||||||
{"OsMouse", MTYPE_AUTOMOUSE},
|
{"OsMouse", MTYPE_AUTOMOUSE},
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__UNIXWARE__)
|
||||||
|
{"Xqueue", MTYPE_XQUEUE},
|
||||||
|
#endif
|
||||||
#ifdef WSCONS_SUPPORT
|
#ifdef WSCONS_SUPPORT
|
||||||
{"wsmouse", MTYPE_AUTOMOUSE},
|
{"wsmouse", MTYPE_AUTOMOUSE},
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if defined(_SCO_DS) || (defined(sun) && defined(__SVR4))
|
#if defined(__SCO__) || defined(__UNIXWARE__) || \
|
||||||
|
(defined(sun) && defined(__SVR4))
|
||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#else
|
#else
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
|
@ -47,6 +48,9 @@
|
||||||
#include "xf86config.h"
|
#include "xf86config.h"
|
||||||
#include "loader.h"
|
#include "loader.h"
|
||||||
|
|
||||||
|
#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0) || \
|
||||||
|
(strcmp((X), "keyboard") == 0))
|
||||||
|
|
||||||
#ifndef PROJECT_ROOT
|
#ifndef PROJECT_ROOT
|
||||||
#define PROJECT_ROOT "/usr/X11R6"
|
#define PROJECT_ROOT "/usr/X11R6"
|
||||||
#endif
|
#endif
|
||||||
|
@ -201,16 +205,21 @@ TextMode(void)
|
||||||
|
|
||||||
ClearScreen();
|
ClearScreen();
|
||||||
refresh();
|
refresh();
|
||||||
if (Dialog( __XSERVERNAME__"Configuration",
|
if (Dialog( __XSERVERNAME__" Configuration",
|
||||||
"This program will create the "__XCONFIGFILE__" file, based on "
|
"This program will create the "__XCONFIGFILE__" file, based on "
|
||||||
"menu selections you make.\n"
|
"menu selections you make.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||||
|
"The "__XCONFIGFILE__" file usually resides in /etc. A "
|
||||||
|
"sample "__XCONFIGFILE__" file is supplied with "
|
||||||
|
#else
|
||||||
#ifndef __UNIXOS2__
|
#ifndef __UNIXOS2__
|
||||||
"The "__XCONFIGFILE__" file usually resides in /usr/X11R6/etc/X11 "
|
"The "__XCONFIGFILE__" file usually resides in /usr/X11R6/etc/X11 "
|
||||||
#else
|
#else
|
||||||
"The "__XCONFIGFILE__" file usually resides in "XF86CONFIGDIR" "
|
"The "__XCONFIGFILE__" file usually resides in "XF86CONFIGDIR" "
|
||||||
#endif
|
#endif
|
||||||
"or /etc/X11. A sample "__XCONFIGFILE__" file is supplied with "
|
"or /etc/X11. A sample "__XCONFIGFILE__" file is supplied with "
|
||||||
|
#endif
|
||||||
__XSERVERNAME__"; it is configured for a standard VGA card and "
|
__XSERVERNAME__"; it is configured for a standard VGA card and "
|
||||||
"monitor with 640x480 resolution. This program will ask for "
|
"monitor with 640x480 resolution. This program will ask for "
|
||||||
"a pathname when it is ready to write the file.\n"
|
"a pathname when it is ready to write the file.\n"
|
||||||
|
@ -350,9 +359,12 @@ static char *protocols[] = {
|
||||||
#ifdef __UNIXOS2__
|
#ifdef __UNIXOS2__
|
||||||
"OS2Mouse",
|
"OS2Mouse",
|
||||||
#endif
|
#endif
|
||||||
#ifdef SCO
|
#ifdef __SCO__
|
||||||
"OsMouse",
|
"OsMouse",
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __UNIXWARE__
|
||||||
|
"Xqueue",
|
||||||
|
#endif
|
||||||
#ifdef WSCONS_SUPPORT
|
#ifdef WSCONS_SUPPORT
|
||||||
"wsmouse",
|
"wsmouse",
|
||||||
#endif
|
#endif
|
||||||
|
@ -611,7 +623,7 @@ KeyboardConfig(void)
|
||||||
|
|
||||||
nlist = 0;
|
nlist = 0;
|
||||||
while (input) {
|
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 = (char**)XtRealloc((XtPointer)list, (nlist + 1) * sizeof(char*));
|
||||||
list[nlist] = XtMalloc(sizeof(Edit) +
|
list[nlist] = XtMalloc(sizeof(Edit) +
|
||||||
strlen(input->inp_identifier) + 1);
|
strlen(input->inp_identifier) + 1);
|
||||||
|
@ -730,7 +742,11 @@ KeyboardConfig(void)
|
||||||
input->inp_option_lst =
|
input->inp_option_lst =
|
||||||
xf86addNewOption(input->inp_option_lst,
|
xf86addNewOption(input->inp_option_lst,
|
||||||
XtNewString("XkbLayout"), XtNewString("us"));
|
XtNewString("XkbLayout"), XtNewString("us"));
|
||||||
|
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||||
input->inp_driver = XtNewString("keyboard");
|
input->inp_driver = XtNewString("keyboard");
|
||||||
|
#else
|
||||||
|
input->inp_driver = XtNewString("kbd");
|
||||||
|
#endif
|
||||||
XF86Config->conf_input_lst =
|
XF86Config->conf_input_lst =
|
||||||
xf86addInput(XF86Config, input);
|
xf86addInput(XF86Config, input);
|
||||||
}
|
}
|
||||||
|
@ -806,7 +822,11 @@ KeyboardConfig(void)
|
||||||
XtNewString("XkbLayout"), XtNewString(layout));
|
XtNewString("XkbLayout"), XtNewString(layout));
|
||||||
|
|
||||||
if (input->inp_driver == NULL) {
|
if (input->inp_driver == NULL) {
|
||||||
|
#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
|
||||||
input->inp_driver = XtNewString("keyboard");
|
input->inp_driver = XtNewString("keyboard");
|
||||||
|
#else
|
||||||
|
input->inp_driver = XtNewString("kbd");
|
||||||
|
#endif
|
||||||
XF86Config->conf_input_lst =
|
XF86Config->conf_input_lst =
|
||||||
xf86addInput(XF86Config->conf_input_lst, input);
|
xf86addInput(XF86Config->conf_input_lst, input);
|
||||||
}
|
}
|
||||||
|
@ -1884,7 +1904,7 @@ LayoutConfig(void)
|
||||||
mouses[nmouses] = input;
|
mouses[nmouses] = input;
|
||||||
++nmouses;
|
++nmouses;
|
||||||
}
|
}
|
||||||
else if (strcmp(input->inp_driver, "keyboard") == 0) {
|
else if (IS_KBDDRIV(input->inp_driver)) {
|
||||||
keyboards = (XF86ConfInputPtr*)XtRealloc((XtPointer)keyboards,
|
keyboards = (XF86ConfInputPtr*)XtRealloc((XtPointer)keyboards,
|
||||||
(nkeyboards + 1) * sizeof(XF86ConfInputPtr));
|
(nkeyboards + 1) * sizeof(XF86ConfInputPtr));
|
||||||
keyboards[nkeyboards] = input;
|
keyboards[nkeyboards] = input;
|
||||||
|
@ -2119,7 +2139,7 @@ LayoutConfig(void)
|
||||||
piref = NULL;
|
piref = NULL;
|
||||||
iref = layout->lay_input_lst;
|
iref = layout->lay_input_lst;
|
||||||
while (iref) {
|
while (iref) {
|
||||||
if (strcmp(iref->iref_inputdev->inp_driver, "keyboard") == 0) {
|
if (IS_KBDDRIV(iref->iref_inputdev->inp_driver)) {
|
||||||
if (keyboard == NULL)
|
if (keyboard == NULL)
|
||||||
piref = iref;
|
piref = iref;
|
||||||
if (xf86findOption(iref->iref_option_lst, "CoreKeyboard")) {
|
if (xf86findOption(iref->iref_option_lst, "CoreKeyboard")) {
|
||||||
|
@ -2165,7 +2185,7 @@ LayoutConfig(void)
|
||||||
list[nlist++] = keyboard->inp_identifier;
|
list[nlist++] = keyboard->inp_identifier;
|
||||||
input = XF86Config->conf_input_lst;
|
input = XF86Config->conf_input_lst;
|
||||||
while (input) {
|
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 = (char**)XtRealloc((XtPointer)list, (nlist + 1) * sizeof(char*));
|
||||||
list[nlist++] = input->inp_identifier;
|
list[nlist++] = input->inp_identifier;
|
||||||
}
|
}
|
||||||
|
@ -3206,6 +3226,9 @@ DialogInput(char *title, char *prompt, int height, int width, char *init,
|
||||||
continue;
|
continue;
|
||||||
case KEY_BACKSPACE:
|
case KEY_BACKSPACE:
|
||||||
case 0177:
|
case 0177:
|
||||||
|
#if defined(__SCO__) || defined(__UNIXWARE__)
|
||||||
|
case '\b':
|
||||||
|
#endif
|
||||||
if (input_x || scrlx) {
|
if (input_x || scrlx) {
|
||||||
wattrset(dialog, dialog_attr);
|
wattrset(dialog, dialog_attr);
|
||||||
|
|
||||||
|
|
|
@ -2134,8 +2134,13 @@ static char *pointersection_text1 =
|
||||||
"\n"
|
"\n"
|
||||||
"# Identifier and driver\n"
|
"# Identifier and driver\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
#if defined(__UNIXWARE__) || defined(XQUEUE)
|
||||||
|
"# Identifier \"Mouse1\"\n"
|
||||||
|
"# Driver \"mouse\"\n"
|
||||||
|
#else
|
||||||
" Identifier \"Mouse1\"\n"
|
" Identifier \"Mouse1\"\n"
|
||||||
" Driver \"mouse\"\n"
|
" Driver \"mouse\"\n"
|
||||||
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
static char *pointersection_text2 =
|
static char *pointersection_text2 =
|
||||||
|
@ -2143,7 +2148,11 @@ static char *pointersection_text2 =
|
||||||
"# When using XQUEUE, comment out the above two lines, and uncomment\n"
|
"# When using XQUEUE, comment out the above two lines, and uncomment\n"
|
||||||
"# the following line.\n"
|
"# the following line.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
#if defined(__UNIXWARE__) || defined(XQUEUE)
|
||||||
|
" Option \"Protocol\" \"Xqueue\"\n"
|
||||||
|
#else
|
||||||
"# Option \"Protocol\" \"Xqueue\"\n"
|
"# Option \"Protocol\" \"Xqueue\"\n"
|
||||||
|
#endif
|
||||||
"\n"
|
"\n"
|
||||||
"# Mouse-speed setting for PS/2 mouse.\n"
|
"# Mouse-speed setting for PS/2 mouse.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
|
|
@ -60,8 +60,7 @@ typedef struct vbeControllerInfoBlock {
|
||||||
CARD8 OemData[256];
|
CARD8 OemData[256];
|
||||||
} vbeControllerInfoRec, *vbeControllerInfoPtr;
|
} vbeControllerInfoRec, *vbeControllerInfoPtr;
|
||||||
|
|
||||||
#if defined(__GNUC__) || defined(SCO) || defined(__USLC__) || \
|
#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C)
|
||||||
defined(__SUNPRO_C)
|
|
||||||
#pragma pack() /* All GCC versions recognise this syntax */
|
#pragma pack() /* All GCC versions recognise this syntax */
|
||||||
#else
|
#else
|
||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
|
|
|
@ -93,7 +93,7 @@ typedef struct _NewClientRec *NewClientPtr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef IN_MODULE
|
#ifndef IN_MODULE
|
||||||
#ifdef SCO
|
#ifdef __SCO__
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
11
os/access.c
11
os/access.c
|
@ -84,9 +84,9 @@ SOFTWARE.
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <ctype.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>
|
#include <netinet/in.h>
|
||||||
#endif /* TCPCONN || STREAMSCONN || ISC || SCO */
|
#endif /* TCPCONN || STREAMSCONN || ISC || __SCO__ */
|
||||||
#ifdef DNETCONN
|
#ifdef DNETCONN
|
||||||
#include <netdnet/dn.h>
|
#include <netdnet/dn.h>
|
||||||
#include <netdnet/dnetdb.h>
|
#include <netdnet/dnetdb.h>
|
||||||
|
@ -138,9 +138,7 @@ SOFTWARE.
|
||||||
#endif /* hpux */
|
#endif /* hpux */
|
||||||
|
|
||||||
#ifdef SVR4
|
#ifdef SVR4
|
||||||
#ifndef SCO
|
|
||||||
#include <sys/sockio.h>
|
#include <sys/sockio.h>
|
||||||
#endif
|
|
||||||
#include <sys/stropts.h>
|
#include <sys/stropts.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -193,6 +191,11 @@ SOFTWARE.
|
||||||
#endif
|
#endif
|
||||||
#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
|
#define X_INCLUDE_NETDB_H
|
||||||
#include <X11/Xos_r.h>
|
#include <X11/Xos_r.h>
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ SOFTWARE.
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Lynx) || defined(SCO) || defined(SCO325)
|
#if defined(Lynx) || defined(__SCO__)
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ OsInit(void)
|
||||||
#ifdef XFree86LOADER
|
#ifdef XFree86LOADER
|
||||||
xf86WrapperInit();
|
xf86WrapperInit();
|
||||||
#endif
|
#endif
|
||||||
#if !defined(SCO) && !defined(__CYGWIN__)
|
#if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__)
|
||||||
fclose(stdin);
|
fclose(stdin);
|
||||||
fclose(stdout);
|
fclose(stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
50
os/utils.c
50
os/utils.c
|
@ -2238,3 +2238,53 @@ CheckUserAuthorization(void)
|
||||||
}
|
}
|
||||||
#endif
|
#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