diff options
author | jsorg71 <jsorg71> | 2004-10-11 02:58:27 +0000 |
---|---|---|
committer | jsorg71 <jsorg71> | 2004-10-11 02:58:27 +0000 |
commit | 330a4ffb9877563a8a95b773cc62f2cb8263723b (patch) | |
tree | aa41ac752c7ba54190ab473021415feac3c7c93b /xrdp/funcs.c | |
parent | 82eb62e0cc149e1bf69217bff8771fa1a57fd577 (diff) | |
download | xrdp-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.c | 195 |
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; +} |