summaryrefslogtreecommitdiffstats
path: root/xrdp/funcs.c
diff options
context:
space:
mode:
authorjsorg71 <jsorg71>2004-10-11 02:58:27 +0000
committerjsorg71 <jsorg71>2004-10-11 02:58:27 +0000
commit330a4ffb9877563a8a95b773cc62f2cb8263723b (patch)
treeaa41ac752c7ba54190ab473021415feac3c7c93b /xrdp/funcs.c
parent82eb62e0cc149e1bf69217bff8771fa1a57fd577 (diff)
downloadxrdp-proprietary-330a4ffb9877563a8a95b773cc62f2cb8263723b.tar.gz
xrdp-proprietary-330a4ffb9877563a8a95b773cc62f2cb8263723b.zip
added early keyboard work and some other fixes
Diffstat (limited to 'xrdp/funcs.c')
-rw-r--r--xrdp/funcs.c195
1 files changed, 179 insertions, 16 deletions
diff --git a/xrdp/funcs.c b/xrdp/funcs.c
index dfa4abcd..de367201 100644
--- a/xrdp/funcs.c
+++ b/xrdp/funcs.c
@@ -1,4 +1,3 @@
-
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -62,21 +61,6 @@ int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
}
/*****************************************************************************/
-int color16(int r, int g, int b)
-{
- r = r >> 3;
- g = g >> 2;
- b = b >> 3;
- return (r << 11) | (g << 5) | b;
-}
-
-/*****************************************************************************/
-int color24(int r, int g, int b)
-{
- return r | (g << 8) | (b << 16);
-}
-
-/*****************************************************************************/
/* adjust the bounds to fit in the bitmap */
/* return false if there is nothing to draw else return true */
int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy)
@@ -105,3 +89,182 @@ int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy)
*cy = b->height - *y;
return 1;
}
+
+/* scan codes
+ 1 esc
+ 2 1 or ?
+ 3 2 or @
+ 4 3 or #
+ 5 4 or $
+ 6 5 or %
+ 7 6 or ^
+ 8 7 or &
+ 9 8 or *
+ 10 9 or (
+ 11 10 or )
+ 12 11 or _
+ 13 12 or +
+ 14 backspace
+ 15 tab
+ 16 q or Q
+ 17 w or W
+ 18 e or E
+ 19 r or R
+ 20 t or T
+ 21 y or Y
+ 22 u or U
+ 23 i or I
+ 24 o or O
+ 25 p or P
+ 26 [ or {
+ 27 ] or }
+ 28 enter, keypad if ext
+ 29 left or right ctrl, ext flag is right
+ 30 a or A
+ 31 s or S
+ 32 d or D
+ 33 f or F
+ 34 g or G
+ 35 h or H
+ 36 j or J
+ 37 k or K
+ 38 l or L
+ 39 ; or :
+ 40 ' or "
+ 41 ~
+ 42 left shift
+ 43 \
+ 44 z or Z
+ 45 x or X
+ 46 c or C
+ 47 v or V
+ 48 b or B
+ 49 n or N
+ 50 m or M
+ 51 , or <
+ 52 . or >
+ 53 / can be / on keypad, ext flag is keypad
+ 54 right shift
+ 55 * on keypad or print screen if ext
+ 56 left or right alt, ext flag is right
+ 57 space
+ 58 caps lock
+ 59 F1
+ 60 F2
+ 61 F3
+ 62 F4
+ 63 F5
+ 64 F6
+ 65 F7
+ 66 F8
+ 67 F9
+ 68 F10
+ 69 num lock
+ 70 scroll lock
+ 71 7 or home on keypad, ext flag is not keypad
+ 72 8 or arrow up on keypad, ext flag is not keypad
+ 73 9 or page up
+ 74 -(minus) on keypad
+ 75 4 or arrow left on keypad, ext flag is not keypad
+ 76 middle(5 key) of keypad
+ 77 6 or arrow right, can be on keypad, ext flag in not keypad
+ 78 + on keypad
+ 79 1 or end
+ 80 2 or arrow down, can be on keypad, ext flag in not keypad
+ 81 3 or page down
+ 82 0 or insert on keypad, ext flag is not keypad
+ 83 . or delete on keypad, ext flag is not keypad
+ 87 F11
+ 88 F12
+ 91 left win key ext always on
+ 92 right win key ext always on
+ 93 menu key ext always on
+*/
+
+/* non shift chars */
+char chars1[] = {'\0', '\0', '1', '2', '3', '4', '5', '6',
+ '7', '8', '9', '0', '-', '=', '\0', '\0',
+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
+ 'o', 'p', '[', ']', '\0', '\0', 'a', 's',
+ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
+ '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v',
+ 'b', 'n', 'm', ',', '.', '/', '\0', '*',
+ '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7',
+ '8', '9', '-', '4', '5', '6', '+', '1',
+ '2', '3', '0', '.', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
+/* shift chars */
+char chars2[] = {'\0', '\0', '!', '@', '#', '$', '%', '^',
+ '&', '*', '(', ')', '_', '+', '\0', '\0',
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
+ 'O', 'P', '{', '}', '\0', '\0', 'A', 'S',
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
+ '"', '~', '\0', '|', 'Z', 'X', 'C', 'V',
+ 'B', 'N', 'M', '<', '>', '?', '\0', '*',
+ '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7',
+ '8', '9', '-', '4', '5', '6', '+', '1',
+ '2', '3', '0', '.', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
+
+/*****************************************************************************/
+char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
+ int caps_lock, int num_lock, int scroll_lock)
+{
+ char rv;
+ int shift;
+ int ext;
+
+ shift = keys[42] || keys[54];
+ ext = device_flags & 0x0100;
+ rv = 0;
+ if (scan_code >= 128)
+ {
+ scan_code = scan_code % 128;
+ num_lock = 0;
+ }
+ if (!num_lock)
+ {
+ switch (scan_code)
+ {
+ case 71: /* 7 */
+ case 72: /* 8 */
+ case 73: /* 9 */
+ case 75: /* 4 */
+ case 76: /* 5 */
+ case 77: /* 6 */
+ case 79: /* 1 */
+ case 80: /* 2 */
+ case 81: /* 3 */
+ case 82: /* 0 */
+ case 83: /* . */
+ return rv;
+ }
+ }
+ if (ext)
+ {
+ if (scan_code == 53)
+ rv = '/';
+ }
+ else
+ {
+ if (shift)
+ rv = chars2[scan_code];
+ else
+ rv = chars1[scan_code];
+ if (rv >= 'a' && rv <= 'z' && caps_lock)
+ rv = rv - ('a' - 'A');
+ else if (rv >= 'A' && rv <= 'Z' && caps_lock)
+ rv = rv + ('a' - 'A');
+ }
+ return rv;
+}