On Thu, Jan 19, 2017 at 05:30:40PM -0500, Adam Jackson wrote: > Use evdev. > > Signed-off-by: Adam Jackson <[email protected]>
series: Reviewed-by: Peter Hutterer <[email protected]> Cheers, Peter > --- > configure.ac | 22 - > hw/kdrive/linux/Makefile.am | 8 - > hw/kdrive/linux/keyboard.c | 341 --------------- > hw/kdrive/linux/linux.c | 16 - > hw/kdrive/linux/mouse.c | 982 > -------------------------------------------- > hw/kdrive/linux/ms.c | 175 -------- > hw/kdrive/linux/ps2.c | 177 -------- > include/kdrive-config.h.in | 6 - > 8 files changed, 1727 deletions(-) > delete mode 100644 hw/kdrive/linux/keyboard.c > delete mode 100644 hw/kdrive/linux/mouse.c > delete mode 100644 hw/kdrive/linux/ms.c > delete mode 100644 hw/kdrive/linux/ps2.c > > diff --git a/configure.ac b/configure.ac > index e23c934..cc6f352 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -658,8 +658,6 @@ AC_ARG_ENABLE(xephyr, > AS_HELP_STRING([--enable-xephyr], [Build the kdriv > AC_ARG_ENABLE(xfake, AS_HELP_STRING([--enable-xfake], [Build the > kdrive 'fake' server (default: auto)]), [XFAKE=$enableval], [XFAKE=auto]) > AC_ARG_ENABLE(xfbdev, AS_HELP_STRING([--enable-xfbdev], [Build the > kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], > [XFBDEV=auto]) > dnl kdrive options > -AC_ARG_ENABLE(kdrive-kbd, AS_HELP_STRING([--enable-kdrive-kbd], [Build > kbd driver for kdrive (default: auto)]), [KDRIVE_KBD=$enableval], > [KDRIVE_KBD=auto]) > -AC_ARG_ENABLE(kdrive-mouse, AS_HELP_STRING([--enable-kdrive-mouse], [Build > mouse driver for kdrive (default: auto)]), [KDRIVE_MOUSE=$enableval], > [KDRIVE_MOUSE=auto]) > AC_ARG_ENABLE(kdrive-evdev, AS_HELP_STRING([--enable-kdrive-evdev], [Build > evdev driver for kdrive (default: auto)]), [KDRIVE_EVDEV=$enableval], > [KDRIVE_EVDEV=auto]) > AC_ARG_ENABLE(libunwind, AS_HELP_STRING([--enable-libunwind], [Use > libunwind for backtracing (default: auto)]), [LIBUNWIND="$enableval"], > [LIBUNWIND="auto"]) > AC_ARG_ENABLE(xshmfence, AS_HELP_STRING([--disable-xshmfence], [Disable > xshmfence (default: auto)]), [XSHMFENCE="$enableval"], [XSHMFENCE="auto"]) > @@ -2403,35 +2401,17 @@ if test "$KDRIVE" = yes; then > if test "x$KDRIVE_EVDEV" = xauto; then > KDRIVE_EVDEV=yes > fi > - if test "x$KDRIVE_KBD" = xauto; then > - KDRIVE_KBD=yes > - fi > - if test "x$KDRIVE_MOUSE" = xauto; then > - KDRIVE_MOUSE=yes > - fi > ;; > *) > if test "x$KDRIVE_EVDEV" = xauto; then > KDRIVE_EVDEV=no > fi > - if test "x$KDRIVE_KBD" = xauto; then > - KDRIVE_KBD=no > - fi > - if test "x$KDRIVE_MOUSE" = xauto; then > - KDRIVE_MOUSE=no > - fi > ;; > esac > > - if test "x$KDRIVE_KBD" = xyes; then > - AC_DEFINE(KDRIVE_KBD, 1, [Enable KDrive kbd driver]) > - fi > if test "x$KDRIVE_EVDEV" = xyes; then > AC_DEFINE(KDRIVE_EVDEV, 1, [Enable KDrive evdev driver]) > fi > - if test "x$KDRIVE_MOUSE" = xyes; then > - AC_DEFINE(KDRIVE_MOUSE, 1, [Enable KDrive mouse driver]) > - fi > > XEPHYR_REQUIRED_LIBS="xau xdmcp xcb xcb-shape xcb-render xcb-renderutil > xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms xcb-randr xcb-xkb" > if test "x$XV" = xyes; then > @@ -2482,8 +2462,6 @@ AC_SUBST([KDRIVE_LOCAL_LIBS]) > AC_SUBST([KDRIVE_LIBS]) > AM_CONDITIONAL(KDRIVELINUX, [test "x$KDRIVELINUX" = xyes]) > AM_CONDITIONAL(KDRIVE_EVDEV, [test "x$KDRIVE_EVDEV" = xyes]) > -AM_CONDITIONAL(KDRIVE_KBD, [test "x$KDRIVE_KBD" = xyes]) > -AM_CONDITIONAL(KDRIVE_MOUSE, [test "x$KDRIVE_MOUSE" = xyes]) > AM_CONDITIONAL(TSLIB, [test "x$HAVE_TSLIB" = xyes]) > AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes]) > AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes]) > diff --git a/hw/kdrive/linux/Makefile.am b/hw/kdrive/linux/Makefile.am > index 1362cd9..97c600c 100644 > --- a/hw/kdrive/linux/Makefile.am > +++ b/hw/kdrive/linux/Makefile.am > @@ -10,18 +10,10 @@ liblinux_la_SOURCES = > > liblinux_la_SOURCES += linux.c > > -if KDRIVE_KBD > -liblinux_la_SOURCES += keyboard.c > -endif > - > if KDRIVE_EVDEV > liblinux_la_SOURCES += evdev.c > endif > > -if KDRIVE_MOUSE > -liblinux_la_SOURCES += mouse.c ms.c ps2.c > -endif > - > if TSLIB > liblinux_la_SOURCES += tslib.c > endif > diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c > deleted file mode 100644 > index 5d31b7d..0000000 > --- a/hw/kdrive/linux/keyboard.c > +++ /dev/null > @@ -1,341 +0,0 @@ > -/* > - * Copyright © 1999 Keith Packard > - * XKB integration © 2006 Nokia Corporation, author: Tomas Frydrych > <[email protected]> > - * > - * LinuxKeyboardRead() XKB code based on xf86KbdLnx.c: > - * Copyright © 1990,91 by Thomas Roell, Dinkelscherben, Germany. > - * Copyright © 1994-2001 by The XFree86 Project, Inc. > - * > - * Permission is hereby granted, free of charge, to any person obtaining a > - * copy of this software and associated documentation files (the "Software"), > - * to deal in the Software without restriction, including without limitation > - * the rights to use, copy, modify, merge, publish, distribute, sublicense, > - * and/or sell copies of the Software, and to permit persons to whom the > - * Software is furnished to do so, subject to the following conditions: > - * > - * The above copyright notice and this permission notice shall be included in > - * all copies or substantial portions of the Software. > - * > - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR > - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > - * OTHER DEALINGS IN THE SOFTWARE. > - * > - * Except as contained in this notice, the name of the copyright holder(s) > - * and author(s) shall not be used in advertising or otherwise to promote > - * the sale, use or other dealings in this Software without prior written > - * authorization from the copyright holder(s) and author(s). > - */ > - > -#ifdef HAVE_CONFIG_H > -#include <kdrive-config.h> > -#endif > -#include "kdrive.h" > -#include <linux/keyboard.h> > -#include <linux/kd.h> > -#define XK_PUBLISHING > -#include <X11/keysym.h> > -#include <termios.h> > -#include <sys/ioctl.h> > - > -extern int LinuxConsoleFd; > - > -/* > - * We need these to handle extended scancodes correctly (I could just use the > - * numbers below, but this makes the code more readable > - */ > - > -/* The prefix codes */ > -#define KEY_Prefix0 /* special 0x60 */ 96 > -#define KEY_Prefix1 /* special 0x61 */ 97 > - > -/* The raw scancodes */ > -#define KEY_Enter /* Enter 0x1c */ 28 > -#define KEY_LCtrl /* Ctrl(left) 0x1d */ 29 > -#define KEY_Slash /* / (Slash) ? 0x35 */ 53 > -#define KEY_KP_Multiply /* * 0x37 */ 55 > -#define KEY_Alt /* Alt(left) 0x38 */ 56 > -#define KEY_F3 /* F3 0x3d */ 61 > -#define KEY_F4 /* F4 0x3e */ 62 > -#define KEY_F5 /* F5 0x3f */ 63 > -#define KEY_F6 /* F6 0x40 */ 64 > -#define KEY_F7 /* F7 0x41 */ 65 > -#define KEY_ScrollLock /* ScrollLock 0x46 */ 70 > -#define KEY_KP_7 /* 7 Home 0x47 */ 71 > -#define KEY_KP_8 /* 8 Up 0x48 */ 72 > -#define KEY_KP_9 /* 9 PgUp 0x49 */ 73 > -#define KEY_KP_Minus /* - (Minus) 0x4a */ 74 > -#define KEY_KP_4 /* 4 Left 0x4b */ 75 > -#define KEY_KP_5 /* 5 0x4c */ 76 > -#define KEY_KP_6 /* 6 Right 0x4d */ 77 > -#define KEY_KP_Plus /* + (Plus) 0x4e */ 78 > -#define KEY_KP_1 /* 1 End 0x4f */ 79 > -#define KEY_KP_2 /* 2 Down 0x50 */ 80 > -#define KEY_KP_3 /* 3 PgDown 0x51 */ 81 > -#define KEY_KP_0 /* 0 Insert 0x52 */ 82 > -#define KEY_KP_Decimal /* . (Decimal) Delete 0x53 */ 83 > -#define KEY_Home /* Home 0x59 */ 89 > -#define KEY_Up /* Up 0x5a */ 90 > -#define KEY_PgUp /* PgUp 0x5b */ 91 > -#define KEY_Left /* Left 0x5c */ 92 > -#define KEY_Begin /* Begin 0x5d */ 93 > -#define KEY_Right /* Right 0x5e */ 94 > -#define KEY_End /* End 0x5f */ 95 > -#define KEY_Down /* Down 0x60 */ 96 > -#define KEY_PgDown /* PgDown 0x61 */ 97 > -#define KEY_Insert /* Insert 0x62 */ 98 > -#define KEY_Delete /* Delete 0x63 */ 99 > -#define KEY_KP_Enter /* Enter 0x64 */ 100 > -#define KEY_RCtrl /* Ctrl(right) 0x65 */ 101 > -#define KEY_Pause /* Pause 0x66 */ 102 > -#define KEY_Print /* Print 0x67 */ 103 > -#define KEY_KP_Divide /* Divide 0x68 */ 104 > -#define KEY_AltLang /* AtlLang(right) 0x69 */ 105 > -#define KEY_Break /* Break 0x6a */ 106 > -#define KEY_LMeta /* Left Meta 0x6b */ 107 > -#define KEY_RMeta /* Right Meta 0x6c */ 108 > -#define KEY_Menu /* Menu 0x6d */ 109 > -#define KEY_F13 /* F13 0x6e */ 110 > -#define KEY_F14 /* F14 0x6f */ 111 > -#define KEY_F15 /* F15 0x70 */ 112 > -#define KEY_F16 /* F16 0x71 */ 113 > -#define KEY_F17 /* F17 0x72 */ 114 > -#define KEY_KP_DEC /* KP_DEC 0x73 */ 115 > - > -static void > -LinuxKeyboardRead(int fd, void *closure) > -{ > - unsigned char buf[256], *b; > - int n; > - unsigned char prefix = 0, scancode = 0; > - > - while ((n = read(fd, buf, sizeof(buf))) > 0) { > - b = buf; > - while (n--) { > - /* > - * With xkb we use RAW mode for reading the console, which > allows us > - * process extended scancodes. > - * > - * See if this is a prefix extending the following keycode > - */ > - if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0)) { > - prefix = KEY_Prefix0; > - /* swallow this up */ > - b++; > - continue; > - } > - else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1)) { > - prefix = KEY_Prefix1; > - /* swallow this up */ > - b++; > - continue; > - } > - scancode = b[0] & 0x7f; > - > - switch (prefix) { > - /* from xf86Events.c */ > - case KEY_Prefix0: > - { > - switch (scancode) { > - case KEY_KP_7: > - scancode = KEY_Home; > - break; /* curs home */ > - case KEY_KP_8: > - scancode = KEY_Up; > - break; /* curs up */ > - case KEY_KP_9: > - scancode = KEY_PgUp; > - break; /* curs pgup */ > - case KEY_KP_4: > - scancode = KEY_Left; > - break; /* curs left */ > - case KEY_KP_5: > - scancode = KEY_Begin; > - break; /* curs begin */ > - case KEY_KP_6: > - scancode = KEY_Right; > - break; /* curs right */ > - case KEY_KP_1: > - scancode = KEY_End; > - break; /* curs end */ > - case KEY_KP_2: > - scancode = KEY_Down; > - break; /* curs down */ > - case KEY_KP_3: > - scancode = KEY_PgDown; > - break; /* curs pgdown */ > - case KEY_KP_0: > - scancode = KEY_Insert; > - break; /* curs insert */ > - case KEY_KP_Decimal: > - scancode = KEY_Delete; > - break; /* curs delete */ > - case KEY_Enter: > - scancode = KEY_KP_Enter; > - break; /* keypad enter */ > - case KEY_LCtrl: > - scancode = KEY_RCtrl; > - break; /* right ctrl */ > - case KEY_KP_Multiply: > - scancode = KEY_Print; > - break; /* print */ > - case KEY_Slash: > - scancode = KEY_KP_Divide; > - break; /* keyp divide */ > - case KEY_Alt: > - scancode = KEY_AltLang; > - break; /* right alt */ > - case KEY_ScrollLock: > - scancode = KEY_Break; > - break; /* curs break */ > - case 0x5b: > - scancode = KEY_LMeta; > - break; > - case 0x5c: > - scancode = KEY_RMeta; > - break; > - case 0x5d: > - scancode = KEY_Menu; > - break; > - case KEY_F3: > - scancode = KEY_F13; > - break; > - case KEY_F4: > - scancode = KEY_F14; > - break; > - case KEY_F5: > - scancode = KEY_F15; > - break; > - case KEY_F6: > - scancode = KEY_F16; > - break; > - case KEY_F7: > - scancode = KEY_F17; > - break; > - case KEY_KP_Plus: > - scancode = KEY_KP_DEC; > - break; > - /* Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6) */ > - case 0x2A: > - case 0x36: > - b++; > - prefix = 0; > - continue; > - default: > - /* > - * "Internet" keyboards are generating lots of new > - * codes. Let them pass. There is little consistency > - * between them, so don't bother with symbolic names at > - * this level. > - */ > - scancode += 0x78; > - } > - break; > - } > - > - case KEY_Prefix1: > - { > - /* we do no handle these */ > - b++; > - prefix = 0; > - continue; > - } > - > - default: /* should not happen */ > - case 0: /* do nothing */ > - ; > - } > - > - prefix = 0; > - KdEnqueueKeyboardEvent(closure, scancode, b[0] & 0x80); > - b++; > - } > - } > -} > - > -static int LinuxKbdTrans; > -static struct termios LinuxTermios; > - > -static Status > -LinuxKeyboardEnable(KdKeyboardInfo * ki) > -{ > - struct termios nTty; > - unsigned char buf[256]; > - int n; > - int fd; > - > - if (!ki) > - return !Success; > - > - fd = LinuxConsoleFd; > - ki->driverPrivate = (void *) (intptr_t) fd; > - > - ioctl(fd, KDGKBMODE, &LinuxKbdTrans); > - tcgetattr(fd, &LinuxTermios); > - ioctl(fd, KDSKBMODE, K_RAW); > - nTty = LinuxTermios; > - nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP); > - nTty.c_oflag = 0; > - nTty.c_cflag = CREAD | CS8; > - nTty.c_lflag = 0; > - nTty.c_cc[VTIME] = 0; > - nTty.c_cc[VMIN] = 1; > - cfsetispeed(&nTty, 9600); > - cfsetospeed(&nTty, 9600); > - tcsetattr(fd, TCSANOW, &nTty); > - /* > - * Flush any pending keystrokes > - */ > - while ((n = read(fd, buf, sizeof(buf))) > 0); > - KdRegisterFd(fd, LinuxKeyboardRead, ki); > - return Success; > -} > - > -static void > -LinuxKeyboardDisable(KdKeyboardInfo * ki) > -{ > - int fd; > - > - if (!ki) > - return; > - > - fd = (int) (intptr_t) ki->driverPrivate; > - > - KdUnregisterFd(ki, fd, FALSE); > - ioctl(fd, KDSKBMODE, LinuxKbdTrans); > - tcsetattr(fd, TCSANOW, &LinuxTermios); > -} > - > -static Status > -LinuxKeyboardInit(KdKeyboardInfo * ki) > -{ > - if (!ki) > - return !Success; > - > - free(ki->path); > - ki->path = strdup("console"); > - free(ki->name); > - ki->name = strdup("Linux console keyboard"); > - > - return Success; > -} > - > -static void > -LinuxKeyboardLeds(KdKeyboardInfo * ki, int leds) > -{ > - if (!ki) > - return; > - > - ioctl((int) (intptr_t) ki->driverPrivate, KDSETLED, leds & 7); > -} > - > -KdKeyboardDriver LinuxKeyboardDriver = { > - "keyboard", > - .Init = LinuxKeyboardInit, > - .Enable = LinuxKeyboardEnable, > - .Leds = LinuxKeyboardLeds, > - .Disable = LinuxKeyboardDisable, > -}; > diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c > index 56c2cb7..20f1fce 100644 > --- a/hw/kdrive/linux/linux.c > +++ b/hw/kdrive/linux/linux.c > @@ -32,11 +32,6 @@ > #include <X11/keysym.h> > #include <linux/apm_bios.h> > > -#ifdef KDRIVE_MOUSE > -extern KdPointerDriver LinuxMouseDriver; > -extern KdPointerDriver Ps2MouseDriver; > -extern KdPointerDriver MsMouseDriver; > -#endif > #ifdef TSLIB > extern KdPointerDriver TsDriver; > #endif > @@ -44,9 +39,6 @@ extern KdPointerDriver TsDriver; > extern KdPointerDriver LinuxEvdevMouseDriver; > extern KdKeyboardDriver LinuxEvdevKeyboardDriver; > #endif > -#ifdef KDRIVE_KBD > -extern KdKeyboardDriver LinuxKeyboardDriver; > -#endif > > static int vtno; > int LinuxConsoleFd; > @@ -323,11 +315,6 @@ LinuxFini(void) > void > KdOsAddInputDrivers(void) > { > -#ifdef KDRIVE_MOUSE > - KdAddPointerDriver(&LinuxMouseDriver); > - KdAddPointerDriver(&MsMouseDriver); > - KdAddPointerDriver(&Ps2MouseDriver); > -#endif > #ifdef TSLIB > KdAddPointerDriver(&TsDriver); > #endif > @@ -335,9 +322,6 @@ KdOsAddInputDrivers(void) > KdAddPointerDriver(&LinuxEvdevMouseDriver); > KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver); > #endif > -#ifdef KDRIVE_KBD > - KdAddKeyboardDriver(&LinuxKeyboardDriver); > -#endif > } > > static void > diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c > deleted file mode 100644 > index 6bdd286..0000000 > --- a/hw/kdrive/linux/mouse.c > +++ /dev/null > @@ -1,982 +0,0 @@ > -/* > - * Copyright © 2001 Keith Packard > - * > - * 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 Keith Packard not be used in > - * advertising or publicity pertaining to distribution of the software > without > - * specific, written prior permission. Keith Packard makes no > - * representations about the suitability of this software for any purpose. > It > - * is provided "as is" without express or implied warranty. > - * > - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, > - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO > - * EVENT SHALL KEITH PACKARD 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. > - */ > - > -#ifdef HAVE_CONFIG_H > -#include <kdrive-config.h> > -#endif > -#include <errno.h> > -#include <termios.h> > -#include <X11/X.h> > -#include <X11/Xproto.h> > -#include <xserver_poll.h> > -#include "inputstr.h" > -#include "scrnintstr.h" > -#include "kdrive.h" > - > -#undef DEBUG > -#undef DEBUG_BYTES > -#define KBUFIO_SIZE 256 > -#define MOUSE_TIMEOUT 100 > - > -typedef struct _kbufio { > - int fd; > - unsigned char buf[KBUFIO_SIZE]; > - int avail; > - int used; > -} Kbufio; > - > -static Bool > -MouseWaitForReadable(int fd, int timeout) > -{ > - struct pollfd poll_fd; > - int n; > - CARD32 done; > - > - done = GetTimeInMillis() + timeout; > - poll_fd.fd = fd; > - poll_fd.events = POLLIN; > - for (;;) { > - n = xserver_poll(&poll_fd, 1, timeout); > - if (n > 0) > - return TRUE; > - if (n < 0 && (errno == EAGAIN || errno == EINTR)) { > - timeout = (int) (done - GetTimeInMillis()); > - if (timeout > 0) > - continue; > - } > - break; > - } > - return FALSE; > -} > - > -static int > -MouseReadByte(Kbufio * b, int timeout) > -{ > - int n; > - > - if (b->avail <= b->used) { > - if (timeout && !MouseWaitForReadable(b->fd, timeout)) { > -#ifdef DEBUG_BYTES > - ErrorF("\tTimeout %d\n", timeout); > -#endif > - return -1; > - } > - n = read(b->fd, b->buf, KBUFIO_SIZE); > - if (n <= 0) > - return -1; > - b->avail = n; > - b->used = 0; > - } > -#ifdef DEBUG_BYTES > - ErrorF("\tget %02x\n", b->buf[b->used]); > -#endif > - return b->buf[b->used++]; > -} > - > -#if NOTUSED > -static int > -MouseFlush(Kbufio * b, char *buf, int size) > -{ > - CARD32 now = GetTimeInMillis(); > - CARD32 done = now + 100; > - int c; > - int n = 0; > - > - while ((c = MouseReadByte(b, done - now)) != -1) { > - if (buf) { > - if (n == size) { > - memmove(buf, buf + 1, size - 1); > - n--; > - } > - buf[n++] = c; > - } > - now = GetTimeInMillis(); > - if ((INT32) (now - done) >= 0) > - break; > - } > - return n; > -} > - > -static int > -MousePeekByte(Kbufio * b, int timeout) > -{ > - int c; > - > - c = MouseReadByte(b, timeout); > - if (c != -1) > - --b->used; > - return c; > -} > -#endif /* NOTUSED */ > - > -static Bool > -MouseWaitForWritable(int fd, int timeout) > -{ > - struct pollfd poll_fd; > - int n; > - > - poll_fd.fd = fd; > - poll_fd.events = POLLOUT; > - n = xserver_poll(&poll_fd, 1, timeout); > - if (n > 0) > - return TRUE; > - return FALSE; > -} > - > -static Bool > -MouseWriteByte(int fd, unsigned char c, int timeout) > -{ > - int ret; > - > -#ifdef DEBUG_BYTES > - ErrorF("\tput %02x\n", c); > -#endif > - for (;;) { > - ret = write(fd, &c, 1); > - if (ret == 1) > - return TRUE; > - if (ret == 0) > - return FALSE; > - if (errno != EWOULDBLOCK) > - return FALSE; > - if (!MouseWaitForWritable(fd, timeout)) > - return FALSE; > - } > -} > - > -static Bool > -MouseWriteBytes(int fd, unsigned char *c, int n, int timeout) > -{ > - while (n--) > - if (!MouseWriteByte(fd, *c++, timeout)) > - return FALSE; > - return TRUE; > -} > - > -#define MAX_MOUSE 10 /* maximum length of mouse protocol */ > -#define MAX_SKIP 16 /* number of error bytes before switching */ > -#define MAX_VALID 4 /* number of valid packets before accepting > */ > - > -typedef struct _kmouseProt { > - const char *name; > - Bool (*Complete) (KdPointerInfo * pi, unsigned char *ev, int ne); > - int (*Valid) (KdPointerInfo * pi, unsigned char *ev, int ne); > - Bool (*Parse) (KdPointerInfo * pi, unsigned char *ev, int ne); > - Bool (*Init) (KdPointerInfo * pi); > - unsigned char headerMask, headerValid; > - unsigned char dataMask, dataValid; > - Bool tty; > - unsigned int c_iflag; > - unsigned int c_oflag; > - unsigned int c_lflag; > - unsigned int c_cflag; > - unsigned int speed; > - unsigned char *init; > - unsigned long state; > -} KmouseProt; > - > -typedef enum _kmouseStage { > - MouseBroken, MouseTesting, MouseWorking > -} KmouseStage; > - > -typedef struct _kmouse { > - Kbufio iob; > - const KmouseProt *prot; > - int i_prot; > - KmouseStage stage; /* protocol verification stage */ > - Bool tty; /* mouse device is a tty */ > - int valid; /* sequential valid events */ > - int tested; /* bytes scanned during Testing phase */ > - int invalid; /* total invalid bytes for this protocol */ > - unsigned long state; /* private per protocol, init to prot->state > */ > -} Kmouse; > - > -static int > -mouseValid(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - const KmouseProt *prot = km->prot; > - int i; > - > - for (i = 0; i < ne; i++) > - if ((ev[i] & prot->headerMask) == prot->headerValid) > - break; > - if (i != 0) > - return i; > - for (i = 1; i < ne; i++) > - if ((ev[i] & prot->dataMask) != prot->dataValid) > - return -1; > - return 0; > -} > - > -static Bool > -threeComplete(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - return ne == 3; > -} > - > -static Bool > -fourComplete(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - return ne == 4; > -} > - > -static Bool > -fiveComplete(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - return ne == 5; > -} > - > -static Bool > -MouseReasonable(KdPointerInfo * pi, unsigned long flags, int dx, int dy) > -{ > - Kmouse *km = pi->driverPrivate; > - > - if (km->stage == MouseWorking) > - return TRUE; > - if (dx < -50 || dx > 50) { > -#ifdef DEBUG > - ErrorF("Large X %d\n", dx); > -#endif > - return FALSE; > - } > - if (dy < -50 || dy > 50) { > -#ifdef DEBUG > - ErrorF("Large Y %d\n", dy); > -#endif > - return FALSE; > - } > - return TRUE; > -} > - > -/* > - * Standard PS/2 mouse protocol > - */ > -static Bool > -ps2Parse(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - int dx, dy, dz; > - unsigned long flags; > - unsigned long flagsrelease = 0; > - > - flags = KD_MOUSE_DELTA; > - if (ev[0] & 4) > - flags |= KD_BUTTON_2; > - if (ev[0] & 2) > - flags |= KD_BUTTON_3; > - if (ev[0] & 1) > - flags |= KD_BUTTON_1; > - > - if (ne > 3) { > - dz = (int) (signed char) ev[3]; > - if (dz < 0) { > - flags |= KD_BUTTON_4; > - flagsrelease = KD_BUTTON_4; > - } > - else if (dz > 0) { > - flags |= KD_BUTTON_5; > - flagsrelease = KD_BUTTON_5; > - } > - } > - > - dx = ev[1]; > - if (ev[0] & 0x10) > - dx -= 256; > - dy = ev[2]; > - if (ev[0] & 0x20) > - dy -= 256; > - dy = -dy; > - if (!MouseReasonable(pi, flags, dx, dy)) > - return FALSE; > - if (km->stage == MouseWorking) { > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - if (flagsrelease) { > - flags &= ~flagsrelease; > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - } > - } > - return TRUE; > -} > - > -static Bool ps2Init(KdPointerInfo * pi); > - > -static const KmouseProt ps2Prot = { > - "ps/2", > - threeComplete, mouseValid, ps2Parse, ps2Init, > - 0x08, 0x08, 0x00, 0x00, > - FALSE > -}; > - > -static const KmouseProt imps2Prot = { > - "imps/2", > - fourComplete, mouseValid, ps2Parse, ps2Init, > - 0x08, 0x08, 0x00, 0x00, > - FALSE > -}; > - > -static const KmouseProt exps2Prot = { > - "exps/2", > - fourComplete, mouseValid, ps2Parse, ps2Init, > - 0x08, 0x08, 0x00, 0x00, > - FALSE > -}; > - > -/* > - * Once the mouse is known to speak ps/2 protocol, go and find out > - * what advanced capabilities it has and turn them on > - */ > - > -/* these extracted from FreeBSD 4.3 sys/dev/kbd/atkbdcreg.h */ > - > -/* aux device commands (sent to KBD_DATA_PORT) */ > -#define PSMC_SET_SCALING11 0x00e6 > -#define PSMC_SET_SCALING21 0x00e7 > -#define PSMC_SET_RESOLUTION 0x00e8 > -#define PSMC_SEND_DEV_STATUS 0x00e9 > -#define PSMC_SET_STREAM_MODE 0x00ea > -#define PSMC_SEND_DEV_DATA 0x00eb > -#define PSMC_SET_REMOTE_MODE 0x00f0 > -#define PSMC_SEND_DEV_ID 0x00f2 > -#define PSMC_SET_SAMPLING_RATE 0x00f3 > -#define PSMC_ENABLE_DEV 0x00f4 > -#define PSMC_DISABLE_DEV 0x00f5 > -#define PSMC_SET_DEFAULTS 0x00f6 > -#define PSMC_RESET_DEV 0x00ff > - > -/* PSMC_SET_RESOLUTION argument */ > -#define PSMD_RES_LOW 0 /* typically 25ppi */ > -#define PSMD_RES_MEDIUM_LOW 1 /* typically 50ppi */ > -#define PSMD_RES_MEDIUM_HIGH 2 /* typically 100ppi (default) */ > -#define PSMD_RES_HIGH 3 /* typically 200ppi */ > -#define PSMD_MAX_RESOLUTION PSMD_RES_HIGH > - > -/* PSMC_SET_SAMPLING_RATE */ > -#define PSMD_MAX_RATE 255 /* FIXME: not sure if it's possible > */ > - > -/* aux device ID */ > -#define PSM_MOUSE_ID 0 > -#define PSM_BALLPOINT_ID 2 > -#define PSM_INTELLI_ID 3 > -#define PSM_EXPLORER_ID 4 > -#define PSM_4DMOUSE_ID 6 > -#define PSM_4DPLUS_ID 8 > - > -static unsigned char ps2_init[] = { > - PSMC_ENABLE_DEV, > - 0, > -}; > - > -#define NINIT_PS2 1 > - > -static unsigned char wheel_3button_init[] = { > - PSMC_SET_SAMPLING_RATE, 200, > - PSMC_SET_SAMPLING_RATE, 100, > - PSMC_SET_SAMPLING_RATE, 80, > - PSMC_SEND_DEV_ID, > - 0, > -}; > - > -#define NINIT_IMPS2 4 > - > -static unsigned char wheel_5button_init[] = { > - PSMC_SET_SAMPLING_RATE, 200, > - PSMC_SET_SAMPLING_RATE, 100, > - PSMC_SET_SAMPLING_RATE, 80, > - PSMC_SET_SAMPLING_RATE, 200, > - PSMC_SET_SAMPLING_RATE, 200, > - PSMC_SET_SAMPLING_RATE, 80, > - PSMC_SEND_DEV_ID, > - 0 > -}; > - > -#define NINIT_EXPS2 7 > - > -static unsigned char intelli_init[] = { > - PSMC_SET_SAMPLING_RATE, 200, > - PSMC_SET_SAMPLING_RATE, 100, > - PSMC_SET_SAMPLING_RATE, 80, > - 0 > -}; > - > -#define NINIT_INTELLI 3 > - > -static int > -ps2SkipInit(KdPointerInfo * pi, int ninit, Bool ret_next) > -{ > - Kmouse *km = pi->driverPrivate; > - int c = -1; > - Bool waiting; > - > - waiting = FALSE; > - while (ninit || ret_next) { > - c = MouseReadByte(&km->iob, MOUSE_TIMEOUT); > - if (c == -1) > - break; > - /* look for ACK */ > - if (c == 0xfa) { > - ninit--; > - if (ret_next) > - waiting = TRUE; > - } > - /* look for packet start -- not the response */ > - else if ((c & 0x08) == 0x08) > - waiting = FALSE; > - else if (waiting) > - break; > - } > - return c; > -} > - > -static Bool > -ps2Init(KdPointerInfo * pi) > -{ > - Kmouse *km = pi->driverPrivate; > - int id; > - unsigned char *init; > - int ninit; > - > - /* Send Intellimouse initialization sequence */ > - MouseWriteBytes(km->iob.fd, intelli_init, strlen((char *) intelli_init), > - 100); > - /* > - * Send ID command > - */ > - if (!MouseWriteByte(km->iob.fd, PSMC_SEND_DEV_ID, 100)) > - return FALSE; > - id = ps2SkipInit(pi, 0, TRUE); > - switch (id) { > - case 3: > - init = wheel_3button_init; > - ninit = NINIT_IMPS2; > - km->prot = &imps2Prot; > - break; > - case 4: > - init = wheel_5button_init; > - ninit = NINIT_EXPS2; > - km->prot = &exps2Prot; > - break; > - default: > - init = ps2_init; > - ninit = NINIT_PS2; > - km->prot = &ps2Prot; > - break; > - } > - if (init) > - MouseWriteBytes(km->iob.fd, init, strlen((char *) init), 100); > - /* > - * Flush out the available data to eliminate responses to the > - * initialization string. Make sure any partial event is > - * skipped > - */ > - (void) ps2SkipInit(pi, ninit, FALSE); > - return TRUE; > -} > - > -static Bool > -busParse(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - int dx, dy; > - unsigned long flags; > - > - flags = KD_MOUSE_DELTA; > - dx = (signed char) ev[1]; > - dy = -(signed char) ev[2]; > - if ((ev[0] & 4) == 0) > - flags |= KD_BUTTON_1; > - if ((ev[0] & 2) == 0) > - flags |= KD_BUTTON_2; > - if ((ev[0] & 1) == 0) > - flags |= KD_BUTTON_3; > - if (!MouseReasonable(pi, flags, dx, dy)) > - return FALSE; > - if (km->stage == MouseWorking) > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - return TRUE; > -} > - > -static const KmouseProt busProt = { > - "bus", > - threeComplete, mouseValid, busParse, 0, > - 0xf8, 0x00, 0x00, 0x00, > - FALSE > -}; > - > -/* > - * Standard MS serial protocol, three bytes > - */ > - > -static Bool > -msParse(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - int dx, dy; > - unsigned long flags; > - > - flags = KD_MOUSE_DELTA; > - > - if (ev[0] & 0x20) > - flags |= KD_BUTTON_1; > - if (ev[0] & 0x10) > - flags |= KD_BUTTON_3; > - > - dx = (signed char) (((ev[0] & 0x03) << 6) | (ev[1] & 0x3F)); > - dy = (signed char) (((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F)); > - if (!MouseReasonable(pi, flags, dx, dy)) > - return FALSE; > - if (km->stage == MouseWorking) > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - return TRUE; > -} > - > -static const KmouseProt msProt = { > - "ms", > - threeComplete, mouseValid, msParse, 0, > - 0xc0, 0x40, 0xc0, 0x00, > - TRUE, > - IGNPAR, > - 0, > - 0, > - CS7 | CSTOPB | CREAD | CLOCAL, > - B1200, > -}; > - > -/* > - * Logitech mice send 3 or 4 bytes, the only way to tell is to look at the > - * first byte of a synchronized protocol stream and see if it's got > - * any bits turned on that can't occur in that fourth byte > - */ > -static Bool > -logiComplete(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - > - if ((ev[0] & 0x40) == 0x40) > - return ne == 3; > - if (km->stage != MouseBroken && (ev[0] & ~0x23) == 0) > - return ne == 1; > - return FALSE; > -} > - > -static int > -logiValid(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - const KmouseProt *prot = km->prot; > - int i; > - > - for (i = 0; i < ne; i++) { > - if ((ev[i] & 0x40) == 0x40) > - break; > - if (km->stage != MouseBroken && (ev[i] & ~0x23) == 0) > - break; > - } > - if (i != 0) > - return i; > - for (i = 1; i < ne; i++) > - if ((ev[i] & prot->dataMask) != prot->dataValid) > - return -1; > - return 0; > -} > - > -static Bool > -logiParse(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - int dx, dy; > - unsigned long flags; > - > - flags = KD_MOUSE_DELTA; > - > - if (ne == 3) { > - if (ev[0] & 0x20) > - flags |= KD_BUTTON_1; > - if (ev[0] & 0x10) > - flags |= KD_BUTTON_3; > - > - dx = (signed char) (((ev[0] & 0x03) << 6) | (ev[1] & 0x3F)); > - dy = (signed char) (((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F)); > - flags |= km->state & KD_BUTTON_2; > - } > - else { > - if (ev[0] & 0x20) > - flags |= KD_BUTTON_2; > - dx = 0; > - dy = 0; > - flags |= km->state & (KD_BUTTON_1 | KD_BUTTON_3); > - } > - > - if (!MouseReasonable(pi, flags, dx, dy)) > - return FALSE; > - if (km->stage == MouseWorking) > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - return TRUE; > -} > - > -static const KmouseProt logiProt = { > - "logitech", > - logiComplete, logiValid, logiParse, 0, > - 0xc0, 0x40, 0xc0, 0x00, > - TRUE, > - IGNPAR, > - 0, > - 0, > - CS7 | CSTOPB | CREAD | CLOCAL, > - B1200, > -}; > - > -/* > - * Mouse systems protocol, 5 bytes > - */ > -static Bool > -mscParse(KdPointerInfo * pi, unsigned char *ev, int ne) > -{ > - Kmouse *km = pi->driverPrivate; > - int dx, dy; > - unsigned long flags; > - > - flags = KD_MOUSE_DELTA; > - > - if (!(ev[0] & 0x4)) > - flags |= KD_BUTTON_1; > - if (!(ev[0] & 0x2)) > - flags |= KD_BUTTON_2; > - if (!(ev[0] & 0x1)) > - flags |= KD_BUTTON_3; > - dx = (signed char) (ev[1]) + (signed char) (ev[3]); > - dy = -((signed char) (ev[2]) + (signed char) (ev[4])); > - > - if (!MouseReasonable(pi, flags, dx, dy)) > - return FALSE; > - if (km->stage == MouseWorking) > - KdEnqueuePointerEvent(pi, flags, dx, dy, 0); > - return TRUE; > -} > - > -static const KmouseProt mscProt = { > - "msc", > - fiveComplete, mouseValid, mscParse, 0, > - 0xf8, 0x80, 0x00, 0x00, > - TRUE, > - IGNPAR, > - 0, > - 0, > - CS8 | CSTOPB | CREAD | CLOCAL, > - B1200, > -}; > - > -/* > - * Use logitech before ms -- they're the same except that > - * logitech sometimes has a fourth byte > - */ > -static const KmouseProt *kmouseProts[] = { > - &ps2Prot, &imps2Prot, &exps2Prot, &busProt, &logiProt, &msProt, &mscProt, > -}; > - > -#define NUM_PROT (sizeof (kmouseProts) / sizeof (kmouseProts[0])) > - > -static void > -MouseInitProtocol(Kmouse * km) > -{ > - int ret; > - struct termios t; > - > - if (km->prot->tty) { > - ret = tcgetattr(km->iob.fd, &t); > - > - if (ret >= 0) { > - t.c_iflag = km->prot->c_iflag; > - t.c_oflag = km->prot->c_oflag; > - t.c_lflag = km->prot->c_lflag; > - t.c_cflag = km->prot->c_cflag; > - cfsetispeed(&t, km->prot->speed); > - cfsetospeed(&t, km->prot->speed); > - ret = tcsetattr(km->iob.fd, TCSANOW, &t); > - } > - } > - km->stage = MouseBroken; > - km->valid = 0; > - km->tested = 0; > - km->invalid = 0; > - km->state = km->prot->state; > -} > - > -static void > -MouseFirstProtocol(Kmouse * km, const char *prot) > -{ > - if (prot) { > - for (km->i_prot = 0; km->i_prot < NUM_PROT; km->i_prot++) > - if (!strcmp(prot, kmouseProts[km->i_prot]->name)) > - break; > - if (km->i_prot == NUM_PROT) { > - int i; > - > - ErrorF("Unknown mouse protocol \"%s\". Pick one of:", prot); > - for (i = 0; i < NUM_PROT; i++) > - ErrorF(" %s", kmouseProts[i]->name); > - ErrorF("\n"); > - } > - else { > - km->prot = kmouseProts[km->i_prot]; > - if (km->tty && !km->prot->tty) > - ErrorF > - ("Mouse device is serial port, protocol %s is not serial > protocol\n", > - prot); > - else if (!km->tty && km->prot->tty) > - ErrorF > - ("Mouse device is not serial port, protocol %s is serial > protocol\n", > - prot); > - } > - } > - if (!km->prot) { > - for (km->i_prot = 0; kmouseProts[km->i_prot]->tty != km->tty; > - km->i_prot++); > - km->prot = kmouseProts[km->i_prot]; > - } > - MouseInitProtocol(km); > -} > - > -static void > -MouseNextProtocol(Kmouse * km) > -{ > - do { > - if (!km->prot) > - km->i_prot = 0; > - else if (++km->i_prot == NUM_PROT) > - km->i_prot = 0; > - km->prot = kmouseProts[km->i_prot]; > - } while (km->prot->tty != km->tty); > - MouseInitProtocol(km); > - ErrorF("Switching to mouse protocol \"%s\"\n", km->prot->name); > -} > - > -static void > -MouseRead(int mousePort, void *closure) > -{ > - KdPointerInfo *pi = closure; > - Kmouse *km = pi->driverPrivate; > - unsigned char event[MAX_MOUSE]; > - int ne; > - int c; > - int i; > - int timeout; > - > - timeout = 0; > - ne = 0; > - for (;;) { > - c = MouseReadByte(&km->iob, timeout); > - if (c == -1) { > - if (ne) { > - km->invalid += ne + km->tested; > - km->valid = 0; > - km->tested = 0; > - km->stage = MouseBroken; > - } > - break; > - } > - event[ne++] = c; > - i = (*km->prot->Valid) (pi, event, ne); > - if (i != 0) { > -#ifdef DEBUG > - ErrorF("Mouse protocol %s broken %d of %d bytes bad\n", > - km->prot->name, i > 0 ? i : ne, ne); > -#endif > - if (i > 0 && i < ne) { > - ne -= i; > - memmove(event, event + i, ne); > - } > - else { > - i = ne; > - ne = 0; > - } > - km->invalid += i + km->tested; > - km->valid = 0; > - km->tested = 0; > - if (km->stage == MouseWorking) > - km->i_prot--; > - km->stage = MouseBroken; > - if (km->invalid > MAX_SKIP) { > - MouseNextProtocol(km); > - ne = 0; > - } > - timeout = 0; > - } > - else { > - if ((*km->prot->Complete) (pi, event, ne)) { > - if ((*km->prot->Parse) (pi, event, ne)) { > - switch (km->stage) { > - case MouseBroken: > -#ifdef DEBUG > - ErrorF("Mouse protocol %s seems OK\n", > km->prot->name); > -#endif > - /* do not zero invalid to accumulate invalid bytes */ > - km->valid = 0; > - km->tested = 0; > - km->stage = MouseTesting; > - /* fall through ... */ > - case MouseTesting: > - km->valid++; > - km->tested += ne; > - if (km->valid > MAX_VALID) { > -#ifdef DEBUG > - ErrorF("Mouse protocol %s working\n", > - km->prot->name); > -#endif > - km->stage = MouseWorking; > - km->invalid = 0; > - km->tested = 0; > - km->valid = 0; > - if (km->prot->Init && !(*km->prot->Init) (pi)) > - km->stage = MouseBroken; > - } > - break; > - case MouseWorking: > - break; > - } > - } > - else { > - km->invalid += ne + km->tested; > - km->valid = 0; > - km->tested = 0; > - km->stage = MouseBroken; > - } > - ne = 0; > - timeout = 0; > - } > - else > - timeout = MOUSE_TIMEOUT; > - } > - } > -} > - > -int MouseInputType; > - > -const char *kdefaultMouse[] = { > - "/dev/input/mice", > - "/dev/mouse", > - "/dev/psaux", > - "/dev/adbmouse", > - "/dev/ttyS0", > - "/dev/ttyS1", > -}; > - > -#define NUM_DEFAULT_MOUSE (sizeof (kdefaultMouse) / sizeof > (kdefaultMouse[0])) > - > -static Status > -MouseInit(KdPointerInfo * pi) > -{ > - int i; > - int fd; > - Kmouse *km; > - > - if (!pi) > - return BadImplementation; > - > - if (!pi->path || strcmp(pi->path, "auto") == 0) { > - for (i = 0; i < NUM_DEFAULT_MOUSE; i++) { > - fd = open(kdefaultMouse[i], 2); > - if (fd >= 0) { > - pi->path = strdup(kdefaultMouse[i]); > - break; > - } > - } > - } > - else { > - fd = open(pi->path, 2); > - } > - > - if (fd < 0) > - return BadMatch; > - > - close(fd); > - > - km = (Kmouse *) malloc(sizeof(Kmouse)); > - if (km) { > - km->iob.avail = km->iob.used = 0; > - MouseFirstProtocol(km, pi->protocol ? pi->protocol : "exps/2"); > - /* MouseFirstProtocol sets state to MouseBroken for later protocol > - * checks. Skip these checks if a protocol was supplied */ > - if (pi->protocol) > - km->state = MouseWorking; > - km->i_prot = 0; > - km->tty = isatty(fd); > - km->iob.fd = -1; > - pi->driverPrivate = km; > - } > - else { > - close(fd); > - return BadAlloc; > - } > - > - return Success; > -} > - > -static Status > -MouseEnable(KdPointerInfo * pi) > -{ > - Kmouse *km; > - > - if (!pi || !pi->driverPrivate || !pi->path) > - return BadImplementation; > - > - km = pi->driverPrivate; > - > - km->iob.fd = open(pi->path, 2); > - if (km->iob.fd < 0) > - return BadMatch; > - > - if (!KdRegisterFd(km->iob.fd, MouseRead, pi)) { > - close(km->iob.fd); > - return BadAlloc; > - } > - > - return Success; > -} > - > -static void > -MouseDisable(KdPointerInfo * pi) > -{ > - Kmouse *km; > - > - if (!pi || !pi->driverPrivate) > - return; > - > - km = pi->driverPrivate; > - KdUnregisterFd(pi, km->iob.fd, TRUE); > -} > - > -static void > -MouseFini(KdPointerInfo * pi) > -{ > - free(pi->driverPrivate); > - pi->driverPrivate = NULL; > -} > - > -KdPointerDriver LinuxMouseDriver = { > - "mouse", > - MouseInit, > - MouseEnable, > - MouseDisable, > - MouseFini, > - NULL, > -}; > diff --git a/hw/kdrive/linux/ms.c b/hw/kdrive/linux/ms.c > deleted file mode 100644 > index 3934682..0000000 > --- a/hw/kdrive/linux/ms.c > +++ /dev/null > @@ -1,175 +0,0 @@ > -/* > -Copyright (c) 2001 by Juliusz Chroboczek > -Copyright (c) 1999 by Keith Packard > - > -Permission is hereby granted, free of charge, to any person obtaining a copy > -of this software and associated documentation files (the "Software"), to deal > -in the Software without restriction, including without limitation the rights > -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > -copies of the Software, and to permit persons to whom the Software is > -furnished to do so, subject to the following conditions: > - > -The above copyright notice and this permission notice shall be included in > -all copies or substantial portions of the Software. > - > -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE > -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > -THE SOFTWARE. > -*/ > - > -#ifdef HAVE_CONFIG_H > -#include <kdrive-config.h> > -#endif > -#include <errno.h> > -#include <termios.h> > -#include <xserver_poll.h> > -#include <X11/X.h> > -#include <X11/Xproto.h> > -#include "inputstr.h" > -#include "scrnintstr.h" > -#include "kdrive.h" > - > -static int > -MsReadBytes(int fd, char *buf, int len, int min) > -{ > - int n, tot; > - struct pollfd poll_fd; > - > - poll_fd.fd = fd; > - poll_fd.events = POLLIN; > - tot = 0; > - while (len) { > - n = read(fd, buf, len); > - if (n > 0) { > - tot += n; > - buf += n; > - len -= n; > - } > - if (tot % min == 0) > - break; > - n = xserver_poll(&poll_fd, 1, 100); > - if (n <= 0) > - break; > - } > - return tot; > -} > - > -static void > -MsRead(int port, void *closure) > -{ > - unsigned char buf[3 * 200]; > - unsigned char *b; > - int n; > - int dx, dy; > - unsigned long flags; > - > - while ((n = MsReadBytes(port, (char *) buf, sizeof(buf), 3)) > 0) { > - b = buf; > - while (n >= 3) { > - flags = KD_MOUSE_DELTA; > - > - if (b[0] & 0x20) > - flags |= KD_BUTTON_1; > - if (b[0] & 0x10) > - flags |= KD_BUTTON_3; > - > - dx = (char) (((b[0] & 0x03) << 6) | (b[1] & 0x3F)); > - dy = (char) (((b[0] & 0x0C) << 4) | (b[2] & 0x3F)); > - n -= 3; > - b += 3; > - KdEnqueuePointerEvent(closure, flags, dx, dy, 0); > - } > - } > -} > - > -static Status > -MsInit(KdPointerInfo * pi) > -{ > - if (!pi) > - return BadImplementation; > - > - if (!pi->path || strcmp(pi->path, "auto")) > - pi->path = strdup("/dev/mouse"); > - if (!pi->name) > - pi->name = strdup("Microsoft protocol mouse"); > - > - return Success; > -} > - > -static Status > -MsEnable(KdPointerInfo * pi) > -{ > - int port; > - struct termios t; > - int ret; > - > - port = open(pi->path, O_RDWR | O_NONBLOCK); > - if (port < 0) { > - ErrorF("Couldn't open %s (%d)\n", pi->path, (int) errno); > - return 0; > - } > - else if (port == 0) { > - ErrorF("Opening %s returned 0! Please complain to Keith.\n", > pi->path); > - goto bail; > - } > - > - if (!isatty(port)) { > - ErrorF("%s is not a tty\n", pi->path); > - goto bail; > - } > - > - ret = tcgetattr(port, &t); > - if (ret < 0) { > - ErrorF("Couldn't tcgetattr(%s): %d\n", pi->path, errno); > - goto bail; > - } > - t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | > - IGNCR | ICRNL | IXON | IXOFF); > - t.c_oflag &= ~OPOST; > - t.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); > - t.c_cflag &= ~(CSIZE | PARENB); > - t.c_cflag |= CS8 | CLOCAL | CSTOPB; > - > - cfsetispeed(&t, B1200); > - cfsetospeed(&t, B1200); > - t.c_cc[VMIN] = 1; > - t.c_cc[VTIME] = 0; > - ret = tcsetattr(port, TCSANOW, &t); > - if (ret < 0) { > - ErrorF("Couldn't tcsetattr(%s): %d\n", pi->path, errno); > - goto bail; > - } > - if (KdRegisterFd(port, MsRead, pi)) > - return TRUE; > - pi->driverPrivate = (void *) (intptr_t) port; > - > - return Success; > - > - bail: > - close(port); > - return BadMatch; > -} > - > -static void > -MsDisable(KdPointerInfo * pi) > -{ > - KdUnregisterFd(pi, (int) (intptr_t) pi->driverPrivate, TRUE); > -} > - > -static void > -MsFini(KdPointerInfo * pi) > -{ > -} > - > -KdPointerDriver MsMouseDriver = { > - "ms", > - MsInit, > - MsEnable, > - MsDisable, > - MsFini, > - NULL, > -}; > diff --git a/hw/kdrive/linux/ps2.c b/hw/kdrive/linux/ps2.c > deleted file mode 100644 > index 4fec024..0000000 > --- a/hw/kdrive/linux/ps2.c > +++ /dev/null > @@ -1,177 +0,0 @@ > -/* > - * Copyright © 1999 Keith Packard > - * > - * 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 Keith Packard not be used in > - * advertising or publicity pertaining to distribution of the software > without > - * specific, written prior permission. Keith Packard makes no > - * representations about the suitability of this software for any purpose. > It > - * is provided "as is" without express or implied warranty. > - * > - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, > - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO > - * EVENT SHALL KEITH PACKARD 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. > - */ > - > -#ifdef HAVE_CONFIG_H > -#include <kdrive-config.h> > -#endif > -#include <X11/X.h> > -#include <X11/Xproto.h> > -#include <xserver_poll.h> > -#include "inputstr.h" > -#include "scrnintstr.h" > -#include "kdrive.h" > - > -static int > -Ps2ReadBytes(int fd, char *buf, int len, int min) > -{ > - int n, tot; > - struct pollfd poll_fd; > - > - tot = 0; > - poll_fd.fd = fd; > - poll_fd.events = POLLIN; > - while (len) { > - n = read(fd, buf, len); > - if (n > 0) { > - tot += n; > - buf += n; > - len -= n; > - } > - if (tot % min == 0) > - break; > - n = xserver_poll(&poll_fd, 1, 100); > - if (n <= 0) > - break; > - } > - return tot; > -} > - > -const char *Ps2Names[] = { > - "/dev/psaux", > -/* "/dev/mouse", */ > - "/dev/input/mice", > -}; > - > -#define NUM_PS2_NAMES (sizeof (Ps2Names) / sizeof (Ps2Names[0])) > - > -static void > -Ps2Read(int ps2Port, void *closure) > -{ > - unsigned char buf[3 * 200]; > - unsigned char *b; > - int n; > - int dx, dy; > - unsigned long flags; > - unsigned long left_button = KD_BUTTON_1; > - unsigned long right_button = KD_BUTTON_3; > - > -#undef SWAP_USB > -#ifdef SWAP_USB > - if (id == 2) { > - left_button = KD_BUTTON_3; > - right_button = KD_BUTTON_1; > - } > -#endif > - while ((n = Ps2ReadBytes(ps2Port, (char *) buf, sizeof(buf), 3)) > 0) { > - b = buf; > - while (n >= 3) { > - flags = KD_MOUSE_DELTA; > - if (b[0] & 4) > - flags |= KD_BUTTON_2; > - if (b[0] & 2) > - flags |= right_button; > - if (b[0] & 1) > - flags |= left_button; > - > - dx = b[1]; > - if (b[0] & 0x10) > - dx -= 256; > - dy = b[2]; > - if (b[0] & 0x20) > - dy -= 256; > - dy = -dy; > - n -= 3; > - b += 3; > - KdEnqueuePointerEvent(closure, flags, dx, dy, 0); > - } > - } > -} > - > -static Status > -Ps2Init(KdPointerInfo * pi) > -{ > - int ps2Port, i; > - > - if (!pi->path) { > - for (i = 0; i < NUM_PS2_NAMES; i++) { > - ps2Port = open(Ps2Names[i], 0); > - if (ps2Port >= 0) { > - pi->path = strdup(Ps2Names[i]); > - break; > - } > - } > - } > - else { > - ps2Port = open(pi->path, 0); > - } > - > - if (ps2Port < 0) > - return BadMatch; > - > - close(ps2Port); > - if (!pi->name) > - pi->name = strdup("PS/2 Mouse"); > - > - return Success; > -} > - > -static Status > -Ps2Enable(KdPointerInfo * pi) > -{ > - int fd; > - > - if (!pi) > - return BadImplementation; > - > - fd = open(pi->path, 0); > - if (fd < 0) > - return BadMatch; > - > - if (!KdRegisterFd(fd, Ps2Read, pi)) { > - close(fd); > - return BadAlloc; > - } > - > - pi->driverPrivate = (void *) (intptr_t) fd; > - > - return Success; > -} > - > -static void > -Ps2Disable(KdPointerInfo * pi) > -{ > - KdUnregisterFd(pi, (int) (intptr_t) pi->driverPrivate, TRUE); > -} > - > -static void > -Ps2Fini(KdPointerInfo * pi) > -{ > -} > - > -KdPointerDriver Ps2MouseDriver = { > - "ps2", > - Ps2Init, > - Ps2Enable, > - Ps2Disable, > - Ps2Fini, > - NULL, > -}; > diff --git a/include/kdrive-config.h.in b/include/kdrive-config.h.in > index 3d7e9a4..f59262c 100644 > --- a/include/kdrive-config.h.in > +++ b/include/kdrive-config.h.in > @@ -16,12 +16,6 @@ > /* Support tslib touchscreen abstraction library */ > #undef TSLIB > > -/* Support KDrive kbd driver */ > -#undef KDRIVE_KBD > - > -/* Support KDrive mouse driver */ > -#undef KDRIVE_MOUSE > - > /* Support KDrive evdev driver */ > #undef KDRIVE_EVDEV > > -- > 2.9.3 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: https://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
