02d0910511
Convert KDrive to GPE/GKE interface. Add first-class drivers and enumerate every device separately through Xi, instead of lamely attempting to aggregate them. Add XKB support to the Linux keyboard driver. Add 'thumb button' support to the tslib driver. Rejig InitInput, so each DDX has to add a list of drivers it supports. Support NewInputDeviceRequest, et al.
266 lines
7.0 KiB
C
266 lines
7.0 KiB
C
/*
|
|
* Id: vxkbd.c,v 1.1 1999/11/24 08:35:24 keithp Exp $
|
|
*
|
|
* Copyright © 1999 Network Computing Devices, Inc. All rights reserved.
|
|
*
|
|
* Author: Keith Packard
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <kdrive-config.h>
|
|
#endif
|
|
#include "kdrive.h"
|
|
#include "kkeymap.h"
|
|
#include <X11/keysym.h>
|
|
#include <inputstr.h>
|
|
|
|
#define VXWORKS_WIDTH 2
|
|
|
|
KeySym VxWorksKeymap[] = {
|
|
/*7 f1 */ XK_F1, NoSymbol,
|
|
/*8 escape */ XK_Escape, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*13 tab */ XK_Tab, NoSymbol,
|
|
/*14 ` */ XK_grave, XK_asciitilde,
|
|
/*15 f2 */ XK_F2, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*17 lctrl */ XK_Control_L, NoSymbol,
|
|
/*18 lshift */ XK_Shift_L, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*20 lock */ XK_Caps_Lock, NoSymbol,
|
|
/*21 q */ XK_Q, NoSymbol,
|
|
/*22 1 */ XK_1, XK_exclam,
|
|
/*23 f3 */ XK_F3, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*25 lalt */ XK_Meta_L, XK_Alt_L,
|
|
/*26 z */ XK_Z, NoSymbol,
|
|
/*27 s */ XK_S, NoSymbol,
|
|
/*28 a */ XK_A, NoSymbol,
|
|
/*29 w */ XK_W, NoSymbol,
|
|
/*30 2 */ XK_2, XK_at,
|
|
/*31 f4 */ XK_F4, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*33 c */ XK_C, NoSymbol,
|
|
/*34 x */ XK_X, NoSymbol,
|
|
/*35 d */ XK_D, NoSymbol,
|
|
/*36 e */ XK_E, NoSymbol,
|
|
/*37 4 */ XK_4, XK_dollar,
|
|
/*38 3 */ XK_3, XK_numbersign,
|
|
/*39 f5 */ XK_F5, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*41 space */ XK_space, NoSymbol,
|
|
/*42 v */ XK_V, NoSymbol,
|
|
/*43 f */ XK_F, NoSymbol,
|
|
/*44 t */ XK_T, NoSymbol,
|
|
/*45 r */ XK_R, NoSymbol,
|
|
/*46 5 */ XK_5, XK_percent,
|
|
/*47 f6 */ XK_F6, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*49 n */ XK_N, NoSymbol,
|
|
/*50 b */ XK_B, NoSymbol,
|
|
/*51 h */ XK_H, NoSymbol,
|
|
/*52 g */ XK_G, NoSymbol,
|
|
/*53 y */ XK_Y, NoSymbol,
|
|
/*54 6 */ XK_6, XK_asciicircum,
|
|
/*55 f7 */ XK_F7, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*57 ralt */ XK_Meta_R, XK_Alt_R,
|
|
/*58 m */ XK_M, NoSymbol,
|
|
/*59 j */ XK_J, NoSymbol,
|
|
/*60 u */ XK_U, NoSymbol,
|
|
/*61 7 */ XK_7, XK_ampersand,
|
|
/*62 8 */ XK_8, XK_asterisk,
|
|
/*63 f8 */ XK_F8, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*65 , */ XK_comma, XK_less,
|
|
/*66 k */ XK_K, NoSymbol,
|
|
/*67 i */ XK_I, NoSymbol,
|
|
/*68 o */ XK_O, NoSymbol,
|
|
/*69 0 */ XK_0, XK_parenright,
|
|
/*70 9 */ XK_9, XK_parenleft,
|
|
/*71 f9 */ XK_F9, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*73 . */ XK_period, XK_greater,
|
|
/*74 / */ XK_slash, XK_question,
|
|
/*75 l */ XK_L, NoSymbol,
|
|
/*76 ; */ XK_semicolon, XK_colon,
|
|
/*77 p */ XK_P, NoSymbol,
|
|
/*78 - */ XK_minus, XK_underscore,
|
|
/*79 f10 */ XK_F10, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*82 ' */ XK_apostrophe, XK_quotedbl,
|
|
NoSymbol, NoSymbol,
|
|
/*84 [ */ XK_bracketleft, XK_braceleft,
|
|
/*85 = */ XK_equal, XK_plus,
|
|
/*86 f11 */ XK_F11, NoSymbol,
|
|
/*87 sysrq */ XK_Sys_Req, XK_Print,
|
|
/*88 rctrl */ XK_Control_R, NoSymbol,
|
|
/*89 rshift */ XK_Shift_R, NoSymbol,
|
|
/*90 enter */ XK_Return, NoSymbol,
|
|
/*91 ] */ XK_bracketright, XK_braceright,
|
|
/*92 \ */ XK_backslash, XK_bar,
|
|
NoSymbol, NoSymbol,
|
|
/*94 f12 */ XK_F12, NoSymbol,
|
|
/*95 scrolllock*/ XK_Scroll_Lock, NoSymbol,
|
|
/*96 down */ XK_Down, NoSymbol,
|
|
/*97 left */ XK_Left, NoSymbol,
|
|
/*98 pause */ XK_Break, XK_Pause,
|
|
/*99 up */ XK_Up, NoSymbol,
|
|
/*100 delete */ XK_Delete, NoSymbol,
|
|
/*101 end */ XK_End, NoSymbol,
|
|
/*102 bs */ XK_BackSpace, NoSymbol,
|
|
/*103 insert */ XK_Insert, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*105 np 1 */ XK_KP_End, XK_KP_1,
|
|
/*106 right */ XK_Right, NoSymbol,
|
|
/*107 np 4 */ XK_KP_Left, XK_KP_4,
|
|
/*108 np 7 */ XK_KP_Home, XK_KP_7,
|
|
/*109 pgdn */ XK_Page_Down, NoSymbol,
|
|
/*110 home */ XK_Home, NoSymbol,
|
|
/*111 pgup */ XK_Page_Up, NoSymbol,
|
|
/*112 np 0 */ XK_KP_Insert, XK_KP_0,
|
|
/*113 np . */ XK_KP_Delete, XK_KP_Decimal,
|
|
/*114 np 2 */ XK_KP_Down, XK_KP_2,
|
|
/*115 np 5 */ XK_KP_5, NoSymbol,
|
|
/*116 np 6 */ XK_KP_Right, XK_KP_6,
|
|
/*117 np 8 */ XK_KP_Up, XK_KP_8,
|
|
/*118 numlock */ XK_Num_Lock, NoSymbol,
|
|
/*119 np / */ XK_KP_Divide, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*121 np enter */ XK_KP_Enter, NoSymbol,
|
|
/*122 np 3 */ XK_KP_Page_Down, XK_KP_3,
|
|
NoSymbol, NoSymbol,
|
|
/*124 np + */ XK_KP_Add, NoSymbol,
|
|
/*125 np 9 */ XK_KP_Page_Up, XK_KP_9,
|
|
/*126 np * */ XK_KP_Multiply, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*132 np - */ XK_KP_Subtract, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
NoSymbol, NoSymbol,
|
|
/*139 lwin */ XK_Super_L, NoSymbol,
|
|
/*140 rwin */ XK_Super_R, NoSymbol,
|
|
/*141 menu */ XK_Menu, NoSymbol,
|
|
};
|
|
|
|
void
|
|
VxWorksKeyboardLoad (void)
|
|
{
|
|
KeySym *k;
|
|
|
|
kdMinScanCode = 7;
|
|
kdKeymapWidth = VXWORKS_WIDTH;
|
|
kdMaxScanCode = 141;
|
|
memcpy (kdKeymap, VxWorksKeymap, sizeof (VxWorksKeymap));
|
|
}
|
|
|
|
static int kbdFd = -1;
|
|
|
|
#include <errno.h>
|
|
#include <event.h>
|
|
#include <kbd_ioctl.h>
|
|
|
|
extern KeyboardCtrl defaultKeyboardControl;
|
|
|
|
static void
|
|
VxWorksSetAutorepeat (unsigned char *repeats, Bool on)
|
|
{
|
|
int i;
|
|
unsigned char mask;
|
|
int scan_code;
|
|
int key_code;
|
|
unsigned char realkc;
|
|
|
|
if (on)
|
|
{
|
|
realkc = 1;
|
|
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
|
|
for (scan_code = 7; scan_code <= 141; scan_code++)
|
|
{
|
|
key_code = scan_code + 1;
|
|
i = key_code >> 3;
|
|
mask = 1 << (key_code & 7);
|
|
if ((repeats[i] & mask) == 0)
|
|
{
|
|
realkc = scan_code;
|
|
ioctl (kbdFd, KBD_NO_REPEAT, &realkc);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
realkc = 0;
|
|
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
|
|
}
|
|
}
|
|
|
|
int
|
|
VxWorksKeyboardInit (void)
|
|
{
|
|
|
|
kbdFd = open ("/dev/kbd", O_RDONLY, 0);
|
|
if (kbdFd < 0)
|
|
ErrorF ("keyboard open failure %d\n", errno);
|
|
VxWorksSetAutorepeat (defaultKeyboardControl.autoRepeats, TRUE);
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
VxWorksKeyboardFini (int fd)
|
|
{
|
|
if (kbdFd >= 0)
|
|
{
|
|
close (kbdFd);
|
|
kbdFd = -1;
|
|
}
|
|
}
|
|
|
|
void
|
|
VxWorksKeyboardRead (int fd)
|
|
{
|
|
}
|
|
|
|
void
|
|
VxWorksKeyboardLeds (int leds)
|
|
{
|
|
DeviceIntPtr pKeyboard = (DeviceIntPtr) LookupKeyboardDevice ();
|
|
KeyboardCtrl *ctrl = &pKeyboard->kbdfeed->ctrl;
|
|
led_ioctl_info led_info;
|
|
int i;
|
|
|
|
VxWorksSetAutorepeat (ctrl->autoRepeats, ctrl->autoRepeat);
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
led_info.bit_n = 1 << i;
|
|
led_info.OFF_or_ON = (leds & (1 << i)) != 0;
|
|
led_info.reversed = 0;
|
|
ioctl (kbdFd, KBD_SET_LED, &led_info);
|
|
}
|
|
}
|
|
|
|
void
|
|
VxWorksKeyboardBell (int volume, int frequency, int duration)
|
|
{
|
|
}
|
|
|
|
KdKeyboardFuncs VxWorksKeyboardFuncs = {
|
|
VxWorksKeyboardLoad,
|
|
VxWorksKeyboardInit,
|
|
VxWorksKeyboardRead,
|
|
VxWorksKeyboardLeds,
|
|
VxWorksKeyboardBell,
|
|
VxWorksKeyboardFini,
|
|
3,
|
|
};
|