.gitignore | 4 README | 20 ++ configure.ac | 15 - man/.gitignore | 2 man/kbd.man | 19 +- src/.gitignore | 6 src/bsd_kbd.c | 47 ----- src/hurd_kbd.c | 2 src/kbd.c | 470 +++++++------------------------------------------------ src/lnx_kbd.c | 239 --------------------------- src/sco_kbd.c | 60 ------- src/sun_kbd.c | 168 ++++++++++++++++--- src/sun_kbd.h | 1 src/sun_kbdMap.c | 10 - src/xf86Keymap.h | 3 src/xf86OSKbd.h | 11 - 16 files changed, 253 insertions(+), 824 deletions(-)
New commits: commit c66f4f9fcc7450f2c1378f6117bda4442d2af8ae Author: Peter Hutterer <[email protected]> Date: Wed Oct 7 10:53:14 2009 +1000 keyboard 1.4.0 Signed-off-by: Peter Hutterer <[email protected]> diff --git a/configure.ac b/configure.ac index cbcb0be..c26e402 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-keyboard], - 1.3.99.1, + 1.4.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-keyboard) commit 0c75afb4895b60aa08209ccfee9dfad4e4495f4d Author: Peter Hutterer <[email protected]> Date: Tue Oct 6 17:02:33 2009 +1000 Remove now un-used autorepeat field. Signed-off-by: Peter Hutterer <[email protected]> Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index b2e858f..556d594 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -307,7 +307,6 @@ KbdCtrl( DeviceIntPtr device, KeybdCtrl *ctrl) leds = ctrl->leds & ~(XCAPS | XNUM | XSCR); /* ??? */ pKbd->leds = leds; pKbd->SetLeds(pInfo, pKbd->leds); - pKbd->autoRepeat = ctrl->autoRepeat; } static void diff --git a/src/xf86OSKbd.h b/src/xf86OSKbd.h index 2732649..daeabf1 100644 --- a/src/xf86OSKbd.h +++ b/src/xf86OSKbd.h @@ -69,7 +69,6 @@ typedef struct { int bell_pitch; int bell_duration; - Bool autoRepeat; unsigned long leds; unsigned long xledsMask; unsigned long keyLeds; commit adc1048980113b329d97ebf5b974ca4a50fc86ba Author: Peter Hutterer <[email protected]> Date: Tue Oct 6 17:00:58 2009 +1000 Don't use XKB_DFLT_RULES from the server. On Linux, the server uses default rules of "evdev" which doesn't apply for this driver. For all other cases, the server uses "base", so let's just hardcode it here too. Signed-off-by: Peter Hutterer <[email protected]> Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index c86c2fc..b2e858f 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -113,12 +113,6 @@ static const OptionInfoRec KeyboardOptions[] = { { -1, NULL, OPTV_NONE, {0}, FALSE } }; -/* Xorg 1.6 and earlier put the default XKB rules file in __XKBDEFRULES__ - in xorg-server.h, later versions switched to XKB_DFLT_RULES */ -#if !defined(XKB_DFLT_RULES) && defined(__XKBDEFRULES__) -# define XKB_DFLT_RULES __XKBDEFRULES__ -#endif - static const char *kbdDefaults[] = { #ifdef XQUEUE "Protocol", "Xqueue", @@ -126,7 +120,7 @@ static const char *kbdDefaults[] = { "Protocol", "standard", #endif "AutoRepeat", "500 30", - "XkbRules", XKB_DFLT_RULES, + "XkbRules", "base", "XkbModel", "pc105", "XkbLayout", "us", "CustomKeycodes", "off", commit ecd34ebd43d5a8c0db0a6dd132b61a4c663c7fd8 Author: Peter Hutterer <[email protected]> Date: Tue Oct 6 17:05:56 2009 +1000 Require macros 1.3 for XORG_DEFAULT_OPTIONS Signed-off-by: Peter Hutterer <[email protected]> diff --git a/configure.ac b/configure.ac index 9b41f79..cbcb0be 100644 --- a/configure.ac +++ b/configure.ac @@ -26,10 +26,9 @@ AC_INIT([xf86-input-keyboard], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-keyboard) -# Require xorg-macros version 1.2 or newer for XORG_CWARNFLAGS and -# XORG_CHANGELOG macros -m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.2.1 or later before running autoconf/autogen])]) -XORG_MACROS_VERSION(1.2.1) +# Require xorg-macros version 1.3 or newer for XORG_DEFAULT_OPTIONS +m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.3 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.3) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_AUX_DIR(.) @@ -112,7 +111,7 @@ XORG_DRIVER_CHECK_EXT(XKB, kbproto) PKG_CHECK_MODULES(XORG, [xorg-server >= 1.2.99.0] xproto $REQUIRED_MODULES) sdkdir=$(pkg-config --variable=sdkdir xorg-server) -XORG_CWARNFLAGS +XORG_DEFAULT_OPTIONS XORG_CFLAGS="$CWARNFLAGS $XORG_CFLAGS" AC_SUBST([XORG_CFLAGS]) @@ -121,8 +120,4 @@ AC_SUBST([XORG_CFLAGS]) # Checks for header files. AC_HEADER_STDC -XORG_MANPAGE_SECTIONS -XORG_RELEASE_VERSION -XORG_CHANGELOG - AC_OUTPUT([Makefile src/Makefile man/Makefile]) commit 5427034948fd4d59d5d2d50f9188376f23119a72 Author: Peter Hutterer <[email protected]> Date: Wed Sep 9 11:48:43 2009 +1000 keyboard 1.3.99.1 Signed-off-by: Peter Hutterer <[email protected]> diff --git a/configure.ac b/configure.ac index aab639c..9b41f79 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-keyboard], - 1.3.2, + 1.3.99.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-keyboard) commit 158d33c15df60696946031a0319e2bd2ec8b9541 Author: Alan Coopersmith <[email protected]> Date: Wed Aug 19 18:56:05 2009 -0700 sun_kbd: Check if streams module is already on the stack before pushing it Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbd.c b/src/sun_kbd.c index f6d99f3..614835e 100644 --- a/src/sun_kbd.c +++ b/src/sun_kbd.c @@ -184,12 +184,18 @@ KbdOn(InputInfoPtr pInfo, int what) } if (priv->strmod) { - SYSCALL(i = ioctl(pInfo->fd, I_PUSH, priv->strmod)); - if (i < 0) { - xf86Msg(X_ERROR, - "%s: cannot push module '%s' onto keyboard device: %s\n", - pInfo->name, priv->strmod, strerror(errno)); + /* Check to see if module is already pushed */ + SYSCALL(i = ioctl(pInfo->fd, I_FIND, priv->strmod)); + + if (i == 0) { /* Not already pushed */ + SYSCALL(i = ioctl(pInfo->fd, I_PUSH, priv->strmod)); + if (i < 0) { + xf86Msg(X_ERROR, "%s: cannot push module '%s' onto " + "keyboard device: %s\n", + pInfo->name, priv->strmod, strerror(errno)); + } } + #ifdef HIDIOCKMSDIRECT if (strcmp(priv->strmod, "usbkbm") == 0) { io_get_direct = HIDIOCKMGDIRECT; commit 891d55e759ff6a30f62809081a11c3da20fc0551 Author: Aaron Zang <[email protected]> Date: Thu Aug 13 20:39:59 2009 -0700 sun_kbd: Use HID ioctl variants to get/set direct mode on usbhid devices When opening a usb hid* device node directly (instead of via the /dev/kbd virtual/coalescing device node), use the HIDIOCKMGDIRECT and HIDIOCKMSDIRECT ioctls instead of the KIO* versions. When closing the device, always reset back to direct mode, no matter what state we found it in. Signed-off-by: Aaron Zang <[email protected]> Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbd.c b/src/sun_kbd.c index bb831c1..f6d99f3 100644 --- a/src/sun_kbd.c +++ b/src/sun_kbd.c @@ -63,6 +63,8 @@ #include <sys/stropts.h> #include <sys/vuid_event.h> #include <sys/kbd.h> +#include <sys/note.h> /* needed before including older versions of hid.h */ +#include <sys/usb/clients/hid/hid.h> static int KbdOn(InputInfoPtr pInfo, int what); static Bool OpenKeyboard(InputInfoPtr pInfo); @@ -168,6 +170,8 @@ KbdOn(InputInfoPtr pInfo, int what) sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private; int ktrans, kdirect, i; + int io_get_direct = KIOCGDIRECT; + int io_set_direct = KIOCSDIRECT; if (priv->kbdActive) { return Success; @@ -186,9 +190,15 @@ KbdOn(InputInfoPtr pInfo, int what) "%s: cannot push module '%s' onto keyboard device: %s\n", pInfo->name, priv->strmod, strerror(errno)); } +#ifdef HIDIOCKMSDIRECT + if (strcmp(priv->strmod, "usbkbm") == 0) { + io_get_direct = HIDIOCKMGDIRECT; + io_set_direct = HIDIOCKMSDIRECT; + } +#endif } - SYSCALL(i = ioctl(pInfo->fd, KIOCGDIRECT, &kdirect)); + SYSCALL(i = ioctl(pInfo->fd, io_get_direct, &kdirect)); if (i < 0) { xf86Msg(X_ERROR, "%s: Unable to determine keyboard direct setting: %s\n", @@ -199,7 +209,7 @@ KbdOn(InputInfoPtr pInfo, int what) priv->odirect = kdirect; kdirect = 1; - SYSCALL(i = ioctl(pInfo->fd, KIOCSDIRECT, &kdirect)); + SYSCALL(i = ioctl(pInfo->fd, io_set_direct, &kdirect)); if (i < 0) { xf86Msg(X_ERROR, "%s: Failed turning keyboard direct mode on: %s\n", pInfo->name, strerror(errno)); @@ -243,6 +253,7 @@ KbdOff(InputInfoPtr pInfo, int what) sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private; int i; + int io_set_direct, kdirect; if (priv->remove_timer) { TimerFree(priv->remove_timer); @@ -276,8 +287,18 @@ KbdOff(InputInfoPtr pInfo, int what) priv->otranslation = -1; } - if (priv->odirect != -1) { - SYSCALL(i = ioctl(pInfo->fd, KIOCSDIRECT, &priv->odirect)); + io_set_direct = KIOCSDIRECT; + kdirect = priv->odirect; + +#ifdef HIDIOCKMSDIRECT + if ((priv->strmod != NULL) && (strcmp(priv->strmod, "usbkbm") == 0)) { + io_set_direct = HIDIOCKMSDIRECT; + kdirect = 0; + } +#endif + + if (kdirect != -1) { + SYSCALL(i = ioctl(pInfo->fd, io_set_direct, &kdirect)); if (i < 0) { xf86Msg(X_ERROR, "%s: Unable to restore keyboard direct setting: %s\n", commit 8e42e8f0034d89ef4b6cee44148961f808ba0602 Author: Alan Coopersmith <[email protected]> Date: Wed Aug 5 15:03:43 2009 -0700 sun_kbd: re-open keyboard if needed in KbdOn If we closed keyboard in KbdOff, we need to reopen it in KbdOn, or will not be able to type after VT switch. Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbd.c b/src/sun_kbd.c index 1c87a24..bb831c1 100644 --- a/src/sun_kbd.c +++ b/src/sun_kbd.c @@ -65,6 +65,7 @@ #include <sys/kbd.h> static int KbdOn(InputInfoPtr pInfo, int what); +static Bool OpenKeyboard(InputInfoPtr pInfo); static void CloseKeyboard(InputInfoPtr pInfo); static void @@ -172,6 +173,12 @@ KbdOn(InputInfoPtr pInfo, int what) return Success; } + if (pInfo->fd == -1) { + if (!OpenKeyboard(pInfo)) { + return BadImplementation; + } + } + if (priv->strmod) { SYSCALL(i = ioctl(pInfo->fd, I_PUSH, priv->strmod)); if (i < 0) { commit bba90b4e87be3ae5a13d69f6d9c60aa97761c8d5 Author: Alan Coopersmith <[email protected]> Date: Tue Aug 4 21:31:23 2009 -0700 Sun bug 6852921: Recycling Xorg runs out of file descriptors in kbd driver http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6852921 Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbd.c b/src/sun_kbd.c index b4ebc57..1c87a24 100644 --- a/src/sun_kbd.c +++ b/src/sun_kbd.c @@ -65,6 +65,7 @@ #include <sys/kbd.h> static int KbdOn(InputInfoPtr pInfo, int what); +static void CloseKeyboard(InputInfoPtr pInfo); static void sunKbdSetLeds(InputInfoPtr pInfo, int leds) @@ -236,6 +237,11 @@ KbdOff(InputInfoPtr pInfo, int what) int i; + if (priv->remove_timer) { + TimerFree(priv->remove_timer); + priv->remove_timer = NULL; + } + if (!priv->kbdActive) { return Success; } @@ -245,11 +251,6 @@ KbdOff(InputInfoPtr pInfo, int what) return Success; } - if (priv->remove_timer) { - TimerFree(priv->remove_timer); - priv->remove_timer = NULL; - } - /* restore original state */ if (priv->oleds != -1) { @@ -288,7 +289,7 @@ KbdOff(InputInfoPtr pInfo, int what) } } - priv->kbdActive = FALSE; + CloseKeyboard(pInfo); return Success; } @@ -385,20 +386,26 @@ SetKbdRepeat(InputInfoPtr pInfo, char rad) /* Nothing to do */ } -/* Called from OsTimer callback, since removing a device from the device - list or changing pInfo->fd while xf86Wakeup is looping through the list - causes server crashes */ -static CARD32 -RemoveKeyboard(OsTimerPtr timer, CARD32 time, pointer arg) +static void +CloseKeyboard(InputInfoPtr pInfo) { - InputInfoPtr pInfo = (InputInfoPtr) arg; KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private; close(pInfo->fd); pInfo->fd = -1; priv->kbdActive = FALSE; +} + +/* Called from OsTimer callback, since removing a device from the device + list or changing pInfo->fd while xf86Wakeup is looping through the list + causes server crashes */ +static CARD32 +RemoveKeyboard(OsTimerPtr timer, CARD32 time, pointer arg) +{ + InputInfoPtr pInfo = (InputInfoPtr) arg; + CloseKeyboard(pInfo); xf86DisableDevice(pInfo->dev, TRUE); return 0; /* All done, don't set to run again */ commit 352aa83c416a78e59be4dfa7d8442e5eec50130a Author: Alan Coopersmith <[email protected]> Date: Tue Aug 4 21:04:24 2009 -0700 Stop checking for #ifdef __SOL8__ - assume Solaris is at least Solaris 8 If you want to run a pre-1999 kernel, you'll need a pre-2009 X server Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/xf86Keymap.h b/src/xf86Keymap.h index 2bd2205..5f6a792 100644 --- a/src/xf86Keymap.h +++ b/src/xf86Keymap.h @@ -173,8 +173,7 @@ static KeySym map[NUM_KEYCODES * GLYPHS_PER_KEY] = { !defined(linux) && \ !defined(CSRG_BASED) && \ !defined(__CYGWIN__) && \ - !defined(__SOL8__) && \ - (!defined(sun) || defined(i386)) + !defined(sun) static KeySym map84[NUM_KEYCODES * GLYPHS_PER_KEY] = { /* 0x00 */ NoSymbol, NoSymbol, NoSymbol, NoSymbol, commit fe8d1f70fc7edce4f030766159aebae8f8a89ffc Author: Peter Hutterer <[email protected]> Date: Sat May 30 21:12:34 2009 +1000 Remove ModuleInfoRec. This struct was removed with 2107becb0ce2ffda001be65728c53563496d8d50 from the server. Signed-off-by: Peter Hutterer <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index 1afa560..c86c2fc 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -153,13 +153,6 @@ static char *xkb_layout; static char *xkb_variant; static char *xkb_options; -/*ARGSUSED*/ -static const OptionInfoRec * -KeyboardAvailableOptions(void *unused) -{ - return (KeyboardOptions); -} - static void SetXkbOption(InputInfoPtr pInfo, char *name, char **option) { @@ -534,14 +527,6 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down) xf86PostKeyboardEvent(device, scanCode + MIN_KEYCODE, down); } -ModuleInfoRec KbdInfo = { - 1, - "KBD", - NULL, - 0, - KeyboardAvailableOptions, -}; - static void xf86KbdUnplug(pointer p) { commit 29f075db9f86aa7e5e01688a5fd5e0081210e16b Author: Peter Hutterer <[email protected]> Date: Mon May 11 15:30:23 2009 +1000 Return BadValue if the server failed to init the keyboard. (#21278) If keyboard init failed, we don't have a useful keymap and thus can't continue. This is essentially 0e15697b53c9448ce9911aa6499b2ea0bda92af6 from xserver ported over here. X.Org Bug 21278 <http://bugs.freedesktop.org/show_bug.cgi?id=21278> Signed-off-by: Peter Hutterer <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index 767ff6b..1afa560 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -424,7 +424,14 @@ KbdProc(DeviceIntPtr device, int what) rmlvo.variant = xkb_variant; rmlvo.options = xkb_options; - InitKeyboardDeviceStruct(device, &rmlvo, KbdBell, KbdCtrl); + if (!InitKeyboardDeviceStruct(device, &rmlvo, KbdBell, KbdCtrl)) + { + xf86Msg(X_ERROR, "%s: Keyboard initialization failed. This " + "could be a missing or incorrect setup of " + "xkeyboard-config.\n", device->name); + + return BadValue; + } } #else { commit 7a4d6f396597c4b96e1402dadfcd2c0e5b7b0579 Author: Alan Coopersmith <[email protected]> Date: Fri May 1 14:47:59 2009 -0700 Override HKTG & BSlash2 keycodes on Solaris Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbdMap.c b/src/sun_kbdMap.c index 0b4b99c..50d7585 100644 --- a/src/sun_kbdMap.c +++ b/src/sun_kbdMap.c @@ -36,10 +36,17 @@ /* Map the Solaris keycodes to the "XFree86" keycodes. */ -/* Additional Sun Japanese Keyboard Keys not defined in common/atKeynames.h */ +/* Additional Sun Japanese Keyboard Keys not defined in atKeynames.h */ #define KEY_Kanji 0x82 #define KEY_Execute 0x83 +/* Override atKeynames.h values with unique keycodes, so we can distinguish + KEY_F15 from KEY_HKTG & KEY_KP_DEC from KEY_BSlash2 */ +#undef KEY_HKTG +#define KEY_HKTG /* Hirugana/Katakana tog 0xC8 */ 200 /* was 112 */ +#undef KEY_BSlash2 +#define KEY_BSlash2 /* \ _ 0xCB */ 203 /* was 115 */ + static unsigned char sunmap[256] = { #if defined(i386) || defined(__i386) || defined(__i386__) || defined(__x86) KEY_NOTUSED, /* 0 */ commit 2bc18590e6b7b403dcec22a09820010748c48972 Author: Alan Coopersmith <[email protected]> Date: Thu Apr 30 16:26:23 2009 -0700 Solaris keyboard fixes for HAL hotplugging support - Handle hot-unplug by checking for ENODEV on read and removing device - Make sure to re-push streams module on resume Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/sun_kbd.c b/src/sun_kbd.c index a222d38..b4ebc57 100644 --- a/src/sun_kbd.c +++ b/src/sun_kbd.c @@ -22,7 +22,7 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* Copyright 2004-2007 Sun Microsystems, Inc. All rights reserved. +/* Copyright 2004-2009 Sun Microsystems, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -64,6 +64,8 @@ #include <sys/vuid_event.h> #include <sys/kbd.h> +static int KbdOn(InputInfoPtr pInfo, int what); + static void sunKbdSetLeds(InputInfoPtr pInfo, int leds) { @@ -105,6 +107,7 @@ KbdInit(InputInfoPtr pInfo, int what) int ktype, klayout, i; const char *ktype_name; + priv->kbdActive = FALSE; priv->otranslation = -1; priv->odirect = -1; @@ -114,15 +117,11 @@ KbdInit(InputInfoPtr pInfo, int what) priv->strmod = NULL; } - if (priv->strmod) { - SYSCALL(i = ioctl(pInfo->fd, I_PUSH, priv->strmod)); - if (i < 0) { - xf86Msg(X_ERROR, - "%s: cannot push module '%s' onto keyboard device: %s\n", - pInfo->name, priv->strmod, strerror(errno)); - } + i = KbdOn(pInfo, DEVICE_INIT); + if (i != Success) { + return i; } - + SYSCALL(i = ioctl(pInfo->fd, KIOCTYPE, &ktype)); if (i < 0) { xf86Msg(X_ERROR, "%s: Unable to determine keyboard type: %s\n", @@ -155,7 +154,6 @@ KbdInit(InputInfoPtr pInfo, int what) xf86Msg(X_PROBED, "%s: Keyboard layout: %d\n", pInfo->name, klayout); priv->ktype = ktype; - priv->oleds = sunKbdGetLeds(pInfo); return Success; } @@ -169,6 +167,19 @@ KbdOn(InputInfoPtr pInfo, int what) int ktrans, kdirect, i; + if (priv->kbdActive) { + return Success; + } + + if (priv->strmod) { + SYSCALL(i = ioctl(pInfo->fd, I_PUSH, priv->strmod)); + if (i < 0) { + xf86Msg(X_ERROR, + "%s: cannot push module '%s' onto keyboard device: %s\n", + pInfo->name, priv->strmod, strerror(errno)); + } + } + SYSCALL(i = ioctl(pInfo->fd, KIOCGDIRECT, &kdirect)); if (i < 0) { xf86Msg(X_ERROR, @@ -207,6 +218,13 @@ KbdOn(InputInfoPtr pInfo, int what) return BadImplementation; } + priv->oleds = sunKbdGetLeds(pInfo); + + /* Allocate here so we don't alloc in ReadInput which may be called + from SIGIO handler. */ + priv->remove_timer = TimerSet(priv->remove_timer, 0, 0, NULL, NULL); + + priv->kbdActive = TRUE; return Success; } @@ -218,6 +236,20 @@ KbdOff(InputInfoPtr pInfo, int what) int i; + if (!priv->kbdActive) { + return Success; + } + + if (pInfo->fd == -1) { + priv->kbdActive = FALSE; + return Success; + } + + if (priv->remove_timer) { + TimerFree(priv->remove_timer); + priv->remove_timer = NULL; + } + /* restore original state */ if (priv->oleds != -1) { @@ -254,9 +286,9 @@ KbdOff(InputInfoPtr pInfo, int what) "%s: cannot pop module '%s' off keyboard device: %s\n", pInfo->name, priv->strmod, strerror(errno)); } - priv->strmod = NULL; } + priv->kbdActive = FALSE; return Success; } @@ -353,20 +385,66 @@ SetKbdRepeat(InputInfoPtr pInfo, char rad) /* Nothing to do */ } +/* Called from OsTimer callback, since removing a device from the device + list or changing pInfo->fd while xf86Wakeup is looping through the list + causes server crashes */ +static CARD32 +RemoveKeyboard(OsTimerPtr timer, CARD32 time, pointer arg) +{ + InputInfoPtr pInfo = (InputInfoPtr) arg; + KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; + sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private; + + close(pInfo->fd); + pInfo->fd = -1; + priv->kbdActive = FALSE; + + xf86DisableDevice(pInfo->dev, TRUE); + + return 0; /* All done, don't set to run again */ +} + static void ReadInput(InputInfoPtr pInfo) { KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; + sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private; Firm_event event[64]; int nBytes, i; - /* I certainly hope its not possible to read partial events */ - - if ((nBytes = read(pInfo->fd, (char *)event, sizeof(event))) > 0) - { - for (i = 0; i < (nBytes / sizeof(Firm_event)); i++) { - pKbd->PostEvent(pInfo, event[i].id & 0xFF, - event[i].value == VKEY_DOWN ? TRUE : FALSE); + while (TRUE) { + /* I certainly hope it's not possible to read partial events */ + nBytes = read(pInfo->fd, (char *)event, sizeof(event)); + if (nBytes > 0) { + for (i = 0; i < (nBytes / sizeof(Firm_event)); i++) { + pKbd->PostEvent(pInfo, event[i].id & 0xFF, + event[i].value == VKEY_DOWN ? TRUE : FALSE); + } + } else if (nBytes == -1) { + switch (errno) { + case EAGAIN: /* Nothing to read now */ + return; + case EINTR: /* Interrupted, try again */ + break; + case ENODEV: /* May happen when USB kbd is unplugged */ + /* We use X_NONE here because it doesn't alloc since we + may be called from SIGIO handler */ + xf86MsgVerb(X_NONE, 0, + "%s: Device no longer present - removing.\n", + pInfo->name); + xf86RemoveEnabledDevice(pInfo); + priv->remove_timer = TimerSet(priv->remove_timer, 0, 1, + RemoveKeyboard, pInfo); + return; + default: /* All other errors */ + /* We use X_NONE here because it doesn't alloc since we + may be called from SIGIO handler */ + xf86MsgVerb(X_NONE, 0, "%s: Read error: %s\n", pInfo->name, + strerror(errno)); + return; + } + } else { /* nBytes == 0, so nothing more to read */ + return; } } } diff --git a/src/sun_kbd.h b/src/sun_kbd.h index a73e201..080cbb5 100644 --- a/src/sun_kbd.h +++ b/src/sun_kbd.h @@ -36,6 +36,7 @@ typedef struct { int odirect; /* Original "direct" mode setting */ int oleds; /* Original LED state */ const char * strmod; /* Streams module pushed on kbd device */ + OsTimerPtr remove_timer; /* Callback for removal on ENODEV */ } sunKbdPrivRec, *sunKbdPrivPtr; /* sun_kbdMap.c */ commit 810fe3a4afd7e77a645c312f9475e75c2f7e925c Author: Alan Curry <[email protected]> Date: Sat Feb 28 00:53:10 2009 -0500 KDGETLED needs a char, not an int. KDGETLED actually only stores a single byte at the address indicated by &real_leds, which on big-endian systems means the kernel's led state is put into the most-significant byte of real_leds. The LED_CAP LED_NUM LED_SCR macros then extract some bits from the least-significant byte, which still contains stack garbage since real_leds hasn't been initialized. Don't believe what the console_ioctl(4) man page says. It's wrong. Go read drivers/char/vt_ioctl.c in the kernel source. Signed-off-by: Peter Hutterer <[email protected]> diff --git a/src/lnx_kbd.c b/src/lnx_kbd.c index cfe35a3..9144464 100644 --- a/src/lnx_kbd.c +++ b/src/lnx_kbd.c @@ -73,7 +73,8 @@ SetKbdLeds(InputInfoPtr pInfo, int leds) static int GetKbdLeds(InputInfoPtr pInfo) { - int real_leds, leds = 0; + char real_leds; + int leds = 0; ioctl(pInfo->fd, KDGETLED, &real_leds); commit 0fafdc024624d27ddffdcc4ff0047dec59ef33e2 Author: Alan Coopersmith <[email protected]> Date: Thu Apr 2 16:53:53 2009 -0700 Remove Initialised static variable (not used since xf86AddModuleInfo removal) Signed-off-by: Alan Coopersmith <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index d596cf6..767ff6b 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -546,11 +546,6 @@ xf86KbdPlug(pointer module, int *errmaj, int *errmin) { - static Bool Initialised = FALSE; - - if (!Initialised) - Initialised = TRUE; - xf86AddInputDriver(&KBD, module, 0); return module; commit 7b64df0a988674454522e353ea2b56485474af6e Author: David Miller <[email protected]> Date: Tue Feb 24 16:50:22 2009 -0800 Fix xf86-input-keyboard build on Linux/sparc lnx_kbd.c: Fix Sparc build. Signed-off-by: David S. Miller <[email protected]> diff --git a/src/lnx_kbd.c b/src/lnx_kbd.c index d599df7..cfe35a3 100644 --- a/src/lnx_kbd.c +++ b/src/lnx_kbd.c @@ -57,17 +57,6 @@ SetKbdLeds(InputInfoPtr pInfo, int leds) { int real_leds = 0; -#if defined (__sparc__) - KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; - if (pKbd->sunKbd) { - if (leds & 0x08) real_leds |= XLED1; - if (leds & 0x04) real_leds |= XLED3; - if (leds & 0x02) real_leds |= XLED4; - if (leds & 0x01) real_leds |= XLED2; - leds = real_leds; - real_leds = 0; - } -#endif /* defined (__sparc__) */ #ifdef LED_CAP if (leds & XLED1) real_leds |= LED_CAP; if (leds & XLED2) real_leds |= LED_NUM; commit 62e663e7b107207b474713f22b6fec72f811dd86 Author: Daniel Stone <[email protected]> Date: Tue Feb 10 17:24:21 2009 +1000 Switch to new XKB API Signed-off-by: Peter Hutterer <[email protected]> diff --git a/src/kbd.c b/src/kbd.c index e89392b..d596cf6 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -38,9 +38,8 @@ #include "xf86OSKbd.h" #include "compiler.h" -#include <X11/extensions/XKB.h> -#include <X11/extensions/XKBstr.h> -#include <X11/extensions/XKBsrv.h> +#include "xkbstr.h" +#include "xkbsrv.h" #define CAPSFLAG 1 #define NUMFLAG 2 @@ -88,12 +87,6 @@ typedef enum { OPTION_PROTOCOL, OPTION_AUTOREPEAT, OPTION_XLEDS, - OPTION_XKB_KEYMAP, - OPTION_XKB_KEYCODES, - OPTION_XKB_TYPES, - OPTION_XKB_COMPAT, - OPTION_XKB_SYMBOLS, - OPTION_XKB_GEOMETRY, OPTION_XKB_RULES, OPTION_XKB_MODEL, OPTION_XKB_LAYOUT, @@ -111,12 +104,6 @@ static const OptionInfoRec KeyboardOptions[] = { { OPTION_PROTOCOL, "Protocol", OPTV_STRING, {0}, FALSE }, { OPTION_AUTOREPEAT, "AutoRepeat", OPTV_STRING, {0}, FALSE }, { OPTION_XLEDS, "XLeds", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_KEYMAP, "XkbKeymap", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_KEYCODES, "XkbKeycodes", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_TYPES, "XkbTypes", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_COMPAT, "XkbCompat", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_SYMBOLS, "XkbSymbols", OPTV_STRING, {0}, FALSE }, - { OPTION_XKB_GEOMETRY, "XkbGeometry", OPTV_STRING, {0}, FALSE }, { OPTION_XKB_RULES, "XkbRules", OPTV_STRING, {0}, FALSE }, { OPTION_XKB_MODEL, "XkbModel", OPTV_STRING, {0}, FALSE }, { OPTION_XKB_LAYOUT, "XkbLayout", OPTV_STRING, {0}, FALSE }, @@ -166,8 +153,6 @@ static char *xkb_layout; static char *xkb_variant; static char *xkb_options; -static XkbComponentNamesRec xkbnames; - /*ARGSUSED*/ static const OptionInfoRec * KeyboardAvailableOptions(void *unused) @@ -258,24 +243,11 @@ KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags) xfree(s); } - SetXkbOption(pInfo, "XkbKeymap", &xkbnames.keymap); - if (xkbnames.keymap) { - xf86Msg(X_CONFIG, "%s: XkbKeymap overrides all other XKB settings\n", - pInfo->name); - } else { - SetXkbOption(pInfo, "XkbRules", &xkb_rules); - SetXkbOption(pInfo, "XkbModel", &xkb_model); - SetXkbOption(pInfo, "XkbLayout", &xkb_layout); - SetXkbOption(pInfo, "XkbVariant", &xkb_variant); - SetXkbOption(pInfo, "XkbOptions", &xkb_options); - - SetXkbOption(pInfo, "XkbKeycodes", &xkbnames.keycodes); - SetXkbOption(pInfo, "XkbTypes", &xkbnames.types); - SetXkbOption(pInfo, "XkbCompat", &xkbnames.compat); - SetXkbOption(pInfo, "XkbSymbols", &xkbnames.symbols); - SetXkbOption(pInfo, "XkbGeometry", &xkbnames.geometry); - } - + SetXkbOption(pInfo, "XkbRules", &xkb_rules); + SetXkbOption(pInfo, "XkbModel", &xkb_model); + SetXkbOption(pInfo, "XkbLayout", &xkb_layout); + SetXkbOption(pInfo, "XkbVariant", &xkb_variant); + SetXkbOption(pInfo, "XkbOptions", &xkb_options); pKbd->CustomKeycodes = FALSE; from = X_DEFAULT; @@ -443,16 +415,28 @@ KbdProc(DeviceIntPtr device, int what) pKbd->KbdGetMapping(pInfo, &keySyms, modMap); device->public.on = FALSE; - if (xkbnames.keymap) - xkb_rules = NULL; - XkbSetRulesDflts(xkb_rules, xkb_model, xkb_layout, - xkb_variant, xkb_options); - XkbInitKeyboardDeviceStruct(device, - &xkbnames, - &keySyms, - modMap, - KbdBell, - (KbdCtrlProcPtr)KbdCtrl); +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 5 + { + XkbRMLVOSet rmlvo; + rmlvo.rules = xkb_rules; + rmlvo.model = xkb_model; + rmlvo.layout = xkb_layout; + rmlvo.variant = xkb_variant; + rmlvo.options = xkb_options; + -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

