diff options
author | balrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-30 22:38:53 +0000 |
---|---|---|
committer | balrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-30 22:38:53 +0000 |
commit | a528b80cb09977806129249ea604aaef3830f3ec (patch) | |
tree | 51786c2e439718f6a8fa571d003aaff9ef60040e /keymaps.c | |
parent | 12bc92ab8acf5e42598b6fa943ceb98ccce6ba71 (diff) | |
download | qemu-a528b80cb09977806129249ea604aaef3830f3ec.zip qemu-a528b80cb09977806129249ea604aaef3830f3ec.tar.gz qemu-a528b80cb09977806129249ea604aaef3830f3ec.tar.bz2 |
Miscellaneous VNC related fixes from Xen forwarded by Matthew Kent.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3489 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'keymaps.c')
-rw-r--r-- | keymaps.c | 64 |
1 files changed, 63 insertions, 1 deletions
@@ -32,6 +32,12 @@ static int get_keysym(const char *name) return 0; } +struct key_range { + int start; + int end; + struct key_range *next; +}; + #define MAX_NORMAL_KEYCODE 512 #define MAX_EXTRA_COUNT 256 typedef struct { @@ -41,8 +47,34 @@ typedef struct { uint16_t keycode; } keysym2keycode_extra[MAX_EXTRA_COUNT]; int extra_count; + struct key_range *keypad_range; + struct key_range *numlock_range; } kbd_layout_t; +static void add_to_key_range(struct key_range **krp, int code) { + struct key_range *kr; + for (kr = *krp; kr; kr = kr->next) { + if (code >= kr->start && code <= kr->end) + break; + if (code == kr->start - 1) { + kr->start--; + break; + } + if (code == kr->end + 1) { + kr->end++; + break; + } + } + if (kr == NULL) { + kr = qemu_mallocz(sizeof(*kr)); + if (kr) { + kr->start = kr->end = code; + kr->next = *krp; + *krp = kr; + } + } +} + static kbd_layout_t *parse_keyboard_layout(const char *language, kbd_layout_t * k) { @@ -87,7 +119,15 @@ static kbd_layout_t *parse_keyboard_layout(const char *language, // fprintf(stderr, "Warning: unknown keysym %s\n", line); } else { const char *rest = end_of_keysym + 1; - int keycode = strtol(rest, NULL, 0); + char *rest2; + int keycode = strtol(rest, &rest2, 0); + + if (rest && strstr(rest, "numlock")) { + add_to_key_range(&k->keypad_range, keycode); + add_to_key_range(&k->numlock_range, keysym); + //fprintf(stderr, "keypad keysym %04x keycode %d\n", keysym, keycode); + } + /* if(keycode&0x80) keycode=(keycode<<8)^0x80e0; */ if (keysym < MAX_NORMAL_KEYCODE) { @@ -143,3 +183,25 @@ static int keysym2scancode(void *kbd_layout, int keysym) } return 0; } + +static inline int keycode_is_keypad(void *kbd_layout, int keycode) +{ + kbd_layout_t *k = kbd_layout; + struct key_range *kr; + + for (kr = k->keypad_range; kr; kr = kr->next) + if (keycode >= kr->start && keycode <= kr->end) + return 1; + return 0; +} + +static inline int keysym_is_numlock(void *kbd_layout, int keysym) +{ + kbd_layout_t *k = kbd_layout; + struct key_range *kr; + + for (kr = k->numlock_range; kr; kr = kr->next) + if (keysym >= kr->start && keysym <= kr->end) + return 1; + return 0; +} |