diff options
Diffstat (limited to 'xorg/X11R7.6/rdp/rdpinput.c')
-rw-r--r-- | xorg/X11R7.6/rdp/rdpinput.c | 530 |
1 files changed, 35 insertions, 495 deletions
diff --git a/xorg/X11R7.6/rdp/rdpinput.c b/xorg/X11R7.6/rdp/rdpinput.c index d71da521..7fb20379 100644 --- a/xorg/X11R7.6/rdp/rdpinput.c +++ b/xorg/X11R7.6/rdp/rdpinput.c @@ -1,5 +1,5 @@ /* -Copyright 2005-2013 Jay Sorg +Copyright 2005-2014 Jay Sorg Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that @@ -32,7 +32,7 @@ keyboard and mouse stuff /* tab notes */ /* mstsc send tab up without a tab down to mark the mstsc has gained focus - this should have sure control alt and shift are all up + this should make sure control alt and shift are all up rdesktop does not do this */ /* this should be fixed in rdesktop */ @@ -40,6 +40,10 @@ keyboard and mouse stuff #include <sys/types.h> #include <sys/wait.h> +#include "rdpkeyboard.h" +#include "rdpkeyboardbase.h" +#include "rdpkeyboardevdev.h" + #define LOG_LEVEL 1 #define LLOG(_level, _args) \ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0) @@ -50,13 +54,11 @@ extern ScreenPtr g_pScreen; /* in rdpmain.c */ extern DeviceIntPtr g_pointer; /* in rdpmain.c */ extern DeviceIntPtr g_keyboard; /* in rdpmain.c */ extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */ +extern int g_shift_down; /* in rdpmain.c */ +extern int g_alt_down; /* in rdpmain.c */ +extern int g_ctrl_down; /* in rdpmain.c */ static int g_old_button_mask = 0; -static int g_pause_spe = 0; -static int g_ctrl_down = 0; -static int g_alt_down = 0; -static int g_shift_down = 0; -static int g_tab_down = 0; /* this is toggled every time num lock key is released, not like the above *_down vars */ static int g_scroll_lock_down = 0; @@ -66,87 +68,7 @@ static int g_x = 0; static int g_y = 0; static int g_timer_schedualed = 0; static int g_delay_motion = 1; /* turn on or off */ - -#define MIN_KEY_CODE 8 -#define MAX_KEY_CODE 255 -#define NO_OF_KEYS ((MAX_KEY_CODE - MIN_KEY_CODE) + 1) -#define GLYPHS_PER_KEY 2 - -#define RDPSCAN_Tab 15 -#define RDPSCAN_Return 28 /* ext is used to know KP or not */ -#define RDPSCAN_Control 29 /* ext is used to know L or R */ -#define RDPSCAN_Shift_L 42 -#define RDPSCAN_Slash 53 -#define RDPSCAN_Shift_R 54 -#define RDPSCAN_KP_Multiply 55 -#define RDPSCAN_Alt 56 /* ext is used to know L or R */ -#define RDPSCAN_Caps_Lock 58 -#define RDPSCAN_Pause 69 -#define RDPSCAN_Scroll_Lock 70 -#define RDPSCAN_KP_7 71 /* KP7 or home */ -#define RDPSCAN_KP_8 72 /* KP8 or up */ -#define RDPSCAN_KP_9 73 /* KP9 or page up */ -#define RDPSCAN_KP_4 75 /* KP4 or left */ -#define RDPSCAN_KP_6 77 /* KP6 or right */ -#define RDPSCAN_KP_1 79 /* KP1 or home */ -#define RDPSCAN_KP_2 80 /* KP2 or up */ -#define RDPSCAN_KP_3 81 /* KP3 or page down */ -#define RDPSCAN_KP_0 82 /* KP0 or insert */ -#define RDPSCAN_KP_Decimal 83 /* KP. or delete */ -#define RDPSCAN_89 89 -#define RDPSCAN_90 90 -#define RDPSCAN_LWin 91 -#define RDPSCAN_RWin 92 -#define RDPSCAN_Menu 93 -#define RDPSCAN_115 115 -#define RDPSCAN_126 126 - -#define XSCAN_Tab 23 -#define XSCAN_Return 36 /* above right shift */ -#define XSCAN_Control_L 37 -#define XSCAN_Shift_L 50 -#define XSCAN_slash 61 -#define XSCAN_Shift_R 62 -#define XSCAN_KP_Multiply 63 -#define XSCAN_Alt_L 64 -#define XSCAN_Caps_Lock 66 /* caps lock */ -#define XSCAN_Num_Lock 77 /* num lock */ -#define XSCAN_KP_7 79 -#define XSCAN_KP_8 80 -#define XSCAN_KP_9 81 -#define XSCAN_KP_4 83 -#define XSCAN_KP_6 85 -#define XSCAN_KP_1 87 -#define XSCAN_KP_2 88 -#define XSCAN_KP_3 89 -#define XSCAN_KP_0 90 -#define XSCAN_KP_Decimal 91 -#define XSCAN_97 97 -#define XSCAN_Enter 104 /* on keypad */ -#define XSCAN_Control_R 105 -#define XSCAN_KP_Divide 106 -#define XSCAN_Print 107 -#define XSCAN_Alt_R 108 -#define XSCAN_Home 110 -#define XSCAN_Up 111 -#define XSCAN_Prior 112 -#define XSCAN_Left 113 -#define XSCAN_Right 114 -#define XSCAN_End 115 -#define XSCAN_Down 116 -#define XSCAN_Next 117 -#define XSCAN_Insert 118 -#define XSCAN_Delete 119 -#define XSCAN_Pause 127 -#define XSCAN_129 129 -#define XSCAN_LWin 133 -#define XSCAN_RWin 134 -#define XSCAN_Menu 135 -#define XSCAN_LMeta 156 -#define XSCAN_RMeta 156 - -#define N_PREDEFINED_KEYS \ - (sizeof(g_kbdMap) / (sizeof(KeySym) * GLYPHS_PER_KEY)) +static int g_use_evdev = 1; /* Copied from Xvnc/lib/font/util/utilbitmap.c */ static unsigned char g_reverse_byte[0x100] = @@ -185,138 +107,6 @@ static unsigned char g_reverse_byte[0x100] = 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; -static KeySym g_kbdMap[] = -{ - NoSymbol, NoSymbol, /* 8 */ - XK_Escape, NoSymbol, /* 9 */ - XK_1, XK_exclam, /* 10 */ - XK_2, XK_at, - XK_3, XK_numbersign, - XK_4, XK_dollar, - XK_5, XK_percent, - XK_6, XK_asciicircum, - XK_7, XK_ampersand, - XK_8, XK_asterisk, - XK_9, XK_parenleft, - XK_0, XK_parenright, - XK_minus, XK_underscore, /* 20 */ - XK_equal, XK_plus, - XK_BackSpace, NoSymbol, - XK_Tab, XK_ISO_Left_Tab, - XK_Q, NoSymbol, - XK_W, NoSymbol, - XK_E, NoSymbol, - XK_R, NoSymbol, - XK_T, NoSymbol, - XK_Y, NoSymbol, - XK_U, NoSymbol, /* 30 */ - XK_I, NoSymbol, - XK_O, NoSymbol, - XK_P, NoSymbol, - XK_bracketleft, XK_braceleft, - XK_bracketright, XK_braceright, - XK_Return, NoSymbol, - XK_Control_L, NoSymbol, - XK_A, NoSymbol, - XK_S, NoSymbol, - XK_D, NoSymbol, /* 40 */ - XK_F, NoSymbol, - XK_G, NoSymbol, - XK_H, NoSymbol, - XK_J, NoSymbol, - XK_K, NoSymbol, - XK_L, NoSymbol, - XK_semicolon, XK_colon, - XK_apostrophe, XK_quotedbl, - XK_grave, XK_asciitilde, - XK_Shift_L, NoSymbol, /* 50 */ - XK_backslash, XK_bar, - XK_Z, NoSymbol, - XK_X, NoSymbol, - XK_C, NoSymbol, - XK_V, NoSymbol, - XK_B, NoSymbol, - XK_N, NoSymbol, - XK_M, NoSymbol, - XK_comma, XK_less, - XK_period, XK_greater, /* 60 */ - XK_slash, XK_question, - XK_Shift_R, NoSymbol, - XK_KP_Multiply, NoSymbol, - XK_Alt_L, NoSymbol, - XK_space, NoSymbol, - XK_Caps_Lock, NoSymbol, - XK_F1, NoSymbol, - XK_F2, NoSymbol, - XK_F3, NoSymbol, - XK_F4, NoSymbol, /* 70 */ - XK_F5, NoSymbol, - XK_F6, NoSymbol, - XK_F7, NoSymbol, - XK_F8, NoSymbol, - XK_F9, NoSymbol, - XK_F10, NoSymbol, - XK_Num_Lock, NoSymbol, - XK_Scroll_Lock, NoSymbol, - XK_KP_Home, XK_KP_7, - XK_KP_Up, XK_KP_8, /* 80 */ - XK_KP_Prior, XK_KP_9, - XK_KP_Subtract, NoSymbol, - XK_KP_Left, XK_KP_4, - XK_KP_Begin, XK_KP_5, - XK_KP_Right, XK_KP_6, - XK_KP_Add, NoSymbol, - XK_KP_End, XK_KP_1, - XK_KP_Down, XK_KP_2, - XK_KP_Next, XK_KP_3, - XK_KP_Insert, XK_KP_0, /* 90 */ - XK_KP_Delete, XK_KP_Decimal, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - XK_F11, NoSymbol, - XK_F12, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, /* 100 */ - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - XK_KP_Enter, NoSymbol, - XK_Control_R, NoSymbol, - XK_KP_Divide, NoSymbol, - XK_Print, NoSymbol, - XK_Alt_R, NoSymbol, - NoSymbol, NoSymbol, - XK_Home, NoSymbol, /* 110 */ - XK_Up, NoSymbol, - XK_Prior, NoSymbol, - XK_Left, NoSymbol, - XK_Right, NoSymbol, - XK_End, NoSymbol, - XK_Down, NoSymbol, - XK_Next, NoSymbol, - XK_Insert, NoSymbol, - XK_Delete, NoSymbol, - NoSymbol, NoSymbol, /* 120 */ - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - XK_Pause, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, /* 130 */ - NoSymbol, NoSymbol, - NoSymbol, NoSymbol, - XK_Super_L, NoSymbol, - XK_Super_R, NoSymbol, - XK_Menu, NoSymbol -}; - #if 0 /******************************************************************************/ static void @@ -505,7 +295,14 @@ rdpLoadLayout(int keylayout) LLOGLN(0, ("rdpLoadLayout: keylayout 0x%8.8x display %s", keylayout, display)); memset(&set, 0, sizeof(set)); - set.rules = "evdev"; /* was "base" */ + if (g_use_evdev) + { + set.rules = "evdev"; + } + else + { + set.rules = "base"; + } set.model = "pc104"; set.layout = "us"; switch (keylayout) @@ -554,8 +351,11 @@ rdpLoadLayout(int keylayout) g_keyboard->key = NULL; /* init keyboard and reload the map */ - InitKeyboardDeviceStruct(g_keyboard, &set, rdpBell, - rdpChangeKeyboardControl); + if (!InitKeyboardDeviceStruct(g_keyboard, &set, rdpBell, + rdpChangeKeyboardControl)) + { + LLOGLN(0, ("rdpLoadLayout: InitKeyboardDeviceStruct failed")); + } /* notify the X11 clients eg. X_ChangeKeyboardMapping */ keySyms = XkbGetCoreMap(g_keyboard); @@ -591,7 +391,14 @@ rdpKeybdProc(DeviceIntPtr pDevice, int onoff) case DEVICE_INIT: LLOGLN(10, ("rdpKeybdProc: DEVICE_INIT")); memset(&set, 0, sizeof(set)); - set.rules = "evdev"; /* was "base" */ + if (g_use_evdev) + { + set.rules = "evdev"; + } + else + { + set.rules = "base"; + } set.model = "pc104"; set.layout = "us"; set.variant = ""; @@ -1050,25 +857,6 @@ rdpEnqueueButton(int type, int buttons) } /******************************************************************************/ -static void -rdpEnqueueKey(int type, int scancode) -{ - int i; - int n; - EventListPtr rdp_events; - xEvent *pev; - - i = GetEventList(&rdp_events); - n = GetKeyboardEvents(rdp_events, g_keyboard, type, scancode); - - for (i = 0; i < n; i++) - { - pev = (rdp_events + i)->event; - mieqEnqueue(g_keyboard, (InternalEvent *)pev); - } -} - -/******************************************************************************/ static CARD32 rdpDeferredInputCallback(OsTimerPtr timer, CARD32 now, pointer arg) { @@ -1137,263 +925,15 @@ PtrAddEvent(int buttonMask, int x, int y) /******************************************************************************/ void -check_keysa(void) -{ - if (g_ctrl_down != 0) - { - rdpEnqueueKey(KeyRelease, g_ctrl_down); - g_ctrl_down = 0; - } - - if (g_alt_down != 0) - { - rdpEnqueueKey(KeyRelease, g_alt_down); - g_alt_down = 0; - } - - if (g_shift_down != 0) - { - rdpEnqueueKey(KeyRelease, g_shift_down); - g_shift_down = 0; - } -} - -/******************************************************************************/ -void -sendDownUpKeyEvent(int type, int x_scancode) -{ - /* if type is keydown, send keyup + keydown */ - if (type == KeyPress) - { - rdpEnqueueKey(KeyRelease, x_scancode); - rdpEnqueueKey(KeyPress, x_scancode); - } - else - { - rdpEnqueueKey(KeyRelease, x_scancode); - } -} - -/** - * @param down - true for KeyDown events, false otherwise - * @param param1 - ASCII code of pressed key - * @param param2 - - * @param param3 - scancode of pressed key - * @param param4 - - ******************************************************************************/ -void KbdAddEvent(int down, int param1, int param2, int param3, int param4) { - int rdp_scancode; - int x_scancode; - int is_ext; - int is_spe; - int type; - - LLOGLN(10, ("KbdAddEvent: down=0x%x param1=0x%x param2=0x%x param3=0x%x " - "param4=0x%x", down, param1, param2, param3, param4)); - if (g_keyboard == 0) + if (g_use_evdev) { - return; + KbdAddEvent_evdev(down, param1, param2, param3, param4); } - type = down ? KeyPress : KeyRelease; - rdp_scancode = param3; - is_ext = param4 & 256; /* 0x100 */ - is_spe = param4 & 512; /* 0x200 */ - x_scancode = 0; - - switch (rdp_scancode) + else { - case RDPSCAN_Caps_Lock: /* caps lock */ - case RDPSCAN_Shift_L: /* left shift */ - case RDPSCAN_Shift_R: /* right shift */ - case RDPSCAN_Scroll_Lock: /* scroll lock */ - x_scancode = rdp_scancode + MIN_KEY_CODE; - - if (x_scancode > 0) - { - /* left or right shift */ - if ((rdp_scancode == RDPSCAN_Shift_L) || - (rdp_scancode == RDPSCAN_Shift_R)) - { - g_shift_down = down ? x_scancode : 0; - } - rdpEnqueueKey(type, x_scancode); - } - break; - - case RDPSCAN_Alt: /* left - right alt button */ - - if (is_ext) - { - x_scancode = XSCAN_Alt_R; /* right alt button */ - } - else - { - x_scancode = XSCAN_Alt_L; /* left alt button */ - } - - g_alt_down = down ? x_scancode : 0; - rdpEnqueueKey(type, x_scancode); - break; - - case RDPSCAN_Tab: /* tab */ - - if (!down && !g_tab_down) - { - check_keysa(); /* leave x_scancode 0 here, we don't want the tab key up */ - } - else - { - sendDownUpKeyEvent(type, XSCAN_Tab); - } - - g_tab_down = down; - break; - - case RDPSCAN_Control: /* left or right ctrl */ - - /* this is to handle special case with pause key sending control first */ - if (is_spe) - { - if (down) - { - g_pause_spe = 1; - /* leave x_scancode 0 here, we don't want the control key down */ - } - } - else - { - x_scancode = is_ext ? XSCAN_Control_R : XSCAN_Control_L; - g_ctrl_down = down ? x_scancode : 0; - rdpEnqueueKey(type, x_scancode); - } - - break; - - case RDPSCAN_Pause: /* Pause or Num Lock */ - - if (g_pause_spe) - { - x_scancode = XSCAN_Pause; - - if (!down) - { - g_pause_spe = 0; - } - } - else - { - x_scancode = g_ctrl_down ? XSCAN_Pause : XSCAN_Num_Lock; - } - - rdpEnqueueKey(type, x_scancode); - break; - - case RDPSCAN_Return: /* Enter or Return */ - x_scancode = is_ext ? XSCAN_Enter : XSCAN_Return; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_Slash: /* / */ - x_scancode = is_ext ? XSCAN_KP_Divide : XSCAN_slash; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_Multiply: /* * on KP or Print Screen */ - x_scancode = is_ext ? XSCAN_Print : XSCAN_KP_Multiply; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_7: /* 7 or Home */ - x_scancode = is_ext ? XSCAN_Home : XSCAN_KP_7; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_8: /* 8 or Up */ - x_scancode = is_ext ? XSCAN_Up : XSCAN_KP_8; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_9: /* 9 or PgUp */ - x_scancode = is_ext ? XSCAN_Prior : XSCAN_KP_9; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_4: /* 4 or Left */ - x_scancode = is_ext ? XSCAN_Left : XSCAN_KP_4; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_6: /* 6 or Right */ - x_scancode = is_ext ? XSCAN_Right : XSCAN_KP_6; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_1: /* 1 or End */ - x_scancode = is_ext ? XSCAN_End : XSCAN_KP_1; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_2: /* 2 or Down */ - x_scancode = is_ext ? XSCAN_Down : XSCAN_KP_2; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_3: /* 3 or PgDn */ - x_scancode = is_ext ? XSCAN_Next : XSCAN_KP_3; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_0: /* 0 or Insert */ - x_scancode = is_ext ? XSCAN_Insert : XSCAN_KP_0; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_KP_Decimal: /* . or Delete */ - x_scancode = is_ext ? XSCAN_Delete : XSCAN_KP_Decimal; - sendDownUpKeyEvent(type, x_scancode); - break; - - case RDPSCAN_LWin: /* left win key */ - rdpEnqueueKey(type, XSCAN_LWin); - break; - - case RDPSCAN_RWin: /* right win key */ - rdpEnqueueKey(type, XSCAN_RWin); - break; - - case RDPSCAN_Menu: /* menu key */ - rdpEnqueueKey(type, XSCAN_Menu); - break; - - case RDPSCAN_89: /* left meta */ - rdpEnqueueKey(type, XSCAN_LMeta); - break; - - case RDPSCAN_90: /* right meta */ - rdpEnqueueKey(type, XSCAN_RMeta); - break; - - case RDPSCAN_115: - rdpEnqueueKey(type, XSCAN_97); /* "/ ?" on br keybaord */ - break; - - case RDPSCAN_126: - rdpEnqueueKey(type, XSCAN_129); /* . on br keypad */ - break; - - default: - x_scancode = rdp_scancode + MIN_KEY_CODE; - - if (x_scancode > 0) - { - LLOGLN(10, ("KbdAddEvent: rdp_scancode %d x_scancode %d", - rdp_scancode, x_scancode)); - sendDownUpKeyEvent(type, x_scancode); - } - - break; + KbdAddEvent_base(down, param1, param2, param3, param4); } } |