diff --git xf86-input-keyboard-clean/configure.ac xf86-input-keyboard-workdir/configure.ac index 0f71ce3..024edd3 100644 --- xf86-input-keyboard-clean/configure.ac +++ xf86-input-keyboard-workdir/configure.ac @@ -57,6 +57,11 @@ AC_SUBST(inputdir) # The keyboard driver code is O/S specific case $host_os in + + astral*) + IS_ASTRAL="yes" + ;; + linux*) AC_MSG_ERROR([This is not the keyboard driver you are looking for. Use evdev or libinput.]) ;; @@ -95,6 +100,7 @@ case $host_os in esac AC_SUBST([OS_FLAGS]) +AM_CONDITIONAL(ASTRAL, [test "x$IS_ASTRAL" = xyes]) AM_CONDITIONAL(BSD, [test "x$IS_BSD" = xyes]) AM_CONDITIONAL(SOLARIS, [test "x$IS_SOLARIS" = xyes]) AM_CONDITIONAL(HURD, [test "x$IS_HURD" = xyes]) diff --git xf86-input-keyboard-clean/src/Makefile.am xf86-input-keyboard-workdir/src/Makefile.am index 52f5f4d..3899868 100644 --- xf86-input-keyboard-clean/src/Makefile.am +++ xf86-input-keyboard-workdir/src/Makefile.am @@ -26,10 +26,15 @@ kbd_drv_la_SOURCES = kbd.c xf86OSKbd.h xf86Keymap.h atKeynames.h kbd_drv_la_LIBADD = $(XORG_LIBS) kbd_drv_ladir = @inputdir@ +ASTRAL_SRCS = astral_kbd.c at_scancode.c BSD_SRCS = bsd_KbdMap.c bsd_kbd.c bsd_kbd.h at_scancode.c HURD_SRCS = hurd_kbd.c at_scancode.c SOLARIS_SRCS = sun_kbd.c sun_kbd.h sun_kbdMap.c +if ASTRAL +kbd_drv_la_SOURCES += $(ASTRAL_SRCS) +endif + if BSD kbd_drv_la_SOURCES += $(BSD_SRCS) endif @@ -42,4 +47,4 @@ if HURD kbd_drv_la_SOURCES += $(HURD_SRCS) endif -EXTRA_DIST = $(BSD_SRCS) $(HURD_SRCS) $(SOLARIS_SRCS) +EXTRA_DIST = $(ASTRAL_SRCS) $(BSD_SRCS) $(HURD_SRCS) $(SOLARIS_SRCS) diff --git xf86-input-keyboard-workdir/src/astral_KbdMap.c xf86-input-keyboard-workdir/src/astral_KbdMap.c new file mode 100644 index 0000000..2ca19fd --- /dev/null +++ xf86-input-keyboard-workdir/src/astral_KbdMap.c @@ -0,0 +1,27 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#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 +#include + +void getmap(InputInfoPtr info, KeySymsPtr syms, CARD8 *map){ + syms->map = map; + syms->mapWidth = GLYPHS_PER_KEY; + syms->minKeyCode = MIN_KEYCODE; + syms->maxKeyCode = MAX_KEYCODE; +} diff --git xf86-input-keyboard-workdir/src/astral_kbd.c xf86-input-keyboard-workdir/src/astral_kbd.c new file mode 100644 index 0000000..9de5fa7 --- /dev/null +++ xf86-input-keyboard-workdir/src/astral_kbd.c @@ -0,0 +1,135 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#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 +#include + +// astral stuff + +#define KBPACKET_FLAGS_RELEASED 1 +#define KBPACKET_FLAGS_LEFTCTRL 2 +#define KBPACKET_FLAGS_CAPSLOCK 4 +#define KBPACKET_FLAGS_LEFTALT 8 +#define KBPACKET_FLAGS_RIGHTALT 16 +#define KBPACKET_FLAGS_LEFTSHIFT 32 +#define KBPACKET_FLAGS_RIGHTCTRL 64 +#define KBPACKET_FLAGS_RIGHTSHIFT 128 + +#define KEYCODE_KEYPADENTER 96 +#define KEYCODE_RIGHTCTRL 97 +#define KEYCODE_KEYPADSLASH 98 +#define KEYCODE_SYSREQ 99 +#define KEYCODE_RIGHTALT 100 +#define KEYCODE_LINEFEED 101 +#define KEYCODE_HOME 102 +#define KEYCODE_UP 103 +#define KEYCODE_PAGEUP 104 +#define KEYCODE_LEFT 105 +#define KEYCODE_RIGHT 106 +#define KEYCODE_END 107 +#define KEYCODE_DOWN 108 +#define KEYCODE_PAGEDOWN 109 +#define KEYCODE_INSERT 110 +#define KEYCODE_DELETE 111 + +typedef struct { + char ascii; + uintmax_t keycode; + int flags; +} kbpacket_t; + + +// interface + +static int nop(){ + return Success; +} + +static int keycodeMap[] = { + KEYCODE_KEYPADENTER, KEY_KP_Enter, + KEYCODE_RIGHTCTRL, KEY_RCtrl, + KEYCODE_KEYPADSLASH, KEY_KP_Divide, + KEYCODE_RIGHTALT, KEY_AltLang, + KEYCODE_LINEFEED, KEY_KP_Enter, + KEYCODE_HOME, KEY_Home, + KEYCODE_UP, KEY_Up, + KEYCODE_PAGEUP, KEY_PgUp, + KEYCODE_LEFT, KEY_Left, + KEYCODE_RIGHT, KEY_Right, + KEYCODE_END, KEY_End, + KEYCODE_DOWN, KEY_Down, + KEYCODE_PAGEDOWN, KEY_PgDown, + KEYCODE_INSERT, KEY_Insert, + KEYCODE_DELETE, KEY_Delete +}; + +#define KEYCODE_MAP_SIZE (sizeof(keycodeMap) / sizeof(int)) + +static int getleds(InputInfoPtr pInfo){return 0;} + +static int init(InputInfoPtr, int){return Success;} + +static void kbdread(InputInfoPtr info){ + KbdDevPtr kbd = (KbdDevPtr) info->private; + kbpacket_t packet; + + while (read(info->fd, &packet, sizeof(kbpacket_t))) { + int keycode = packet.keycode; + + // is it a keycode that isn't in the AT keymap? + for (int i = 0; i < KEYCODE_MAP_SIZE; i += 2) { + if (keycode == keycodeMap[i]) { + keycode = keycodeMap[i + 1]; + break; + } + } + + kbd->PostEvent(info, keycode, (packet.flags & KBPACKET_FLAGS_RELEASED) ? FALSE : TRUE); + } + +} + +static Bool openkeyboard(InputInfoPtr info){ + char *kbdPath = xf86SetStrOption(info->options, "Device", "/dev/keyboard0"); + info->fd = open("/dev/keyboard0", O_NONBLOCK | O_RDONLY); + if(info->fd == -1) + FatalError("Failed to open keyboard (%s)\n",strerror(errno)); + + info->read_input = kbdread; + + return TRUE; +} + +Bool xf86OSKbdPreInit(InputInfoPtr info){ + + KbdDevPtr kbd = info->private; + + kbd->KbdInit = init; + kbd->KbdOn = nop; + kbd->KbdOff = nop; + kbd->Bell = nop; + kbd->SetLeds = nop; + kbd->GetLeds = getleds; + kbd->KbdGetMapping = nop; + kbd->RemapScanCode = 0; + kbd->OpenKeyboard = openkeyboard; + + kbd->private = NULL; + + return TRUE; +}