X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=keymaps.c;h=23db4a0bdc910cec83bd01146b0c5254eca2a098;hb=HEAD;hp=bd893288aa0cc5e6936aaa7e5b09ff6d48a78b81;hpb=24236869fbff210b356b6626e6e9e9eadc8a976c;p=qemu diff --git a/keymaps.c b/keymaps.c index bd89328..23db4a0 100644 --- a/keymaps.c +++ b/keymaps.c @@ -1,8 +1,8 @@ /* * QEMU keysym to keycode conversion using rdesktop keymaps - * + * * Copyright (c) 2004 Johannes Schindelin - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -22,47 +22,62 @@ * THE SOFTWARE. */ -static int get_keysym(const char *name) +#include "keymaps.h" +#include "sysemu.h" + +static int get_keysym(const name2keysym_t *table, + const char *name) { - name2keysym_t *p; - for(p = name2keysym; p->name != NULL; p++) { + const name2keysym_t *p; + for(p = table; p->name != NULL; p++) { if (!strcmp(p->name, name)) return p->keysym; } return 0; } -#define MAX_NORMAL_KEYCODE 512 -#define MAX_EXTRA_COUNT 256 -typedef struct { - uint16_t keysym2keycode[MAX_NORMAL_KEYCODE]; - struct { - int keysym; - uint16_t keycode; - } keysym2keycode_extra[MAX_EXTRA_COUNT]; - int extra_count; -} kbd_layout_t; - -static kbd_layout_t *parse_keyboard_layout(const char *language, + +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)); + kr->start = kr->end = code; + kr->next = *krp; + *krp = kr; + } +} + +static kbd_layout_t *parse_keyboard_layout(const name2keysym_t *table, + const char *language, kbd_layout_t * k) { FILE *f; - char file_name[1024]; + char * filename; char line[1024]; int len; - snprintf(file_name, sizeof(file_name), - "%s/keymaps/%s", bios_dir, language); + filename = qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language); if (!k) k = qemu_mallocz(sizeof(kbd_layout_t)); - if (!k) - return 0; - if (!(f = fopen(file_name, "r"))) { + if (!(filename && (f = fopen(filename, "r")))) { fprintf(stderr, - "Could not read keymap file: '%s'\n", file_name); + "Could not read keymap file: '%s'\n", language); return 0; } + qemu_free(filename); for(;;) { if (fgets(line, 1024, f) == NULL) break; @@ -74,7 +89,7 @@ static kbd_layout_t *parse_keyboard_layout(const char *language, if (!strncmp(line, "map ", 4)) continue; if (!strncmp(line, "include ", 8)) { - parse_keyboard_layout(line + 8, k); + parse_keyboard_layout(table, line + 8, k); } else { char *end_of_keysym = line; while (*end_of_keysym != 0 && *end_of_keysym != ' ') @@ -82,12 +97,20 @@ static kbd_layout_t *parse_keyboard_layout(const char *language, if (*end_of_keysym) { int keysym; *end_of_keysym = 0; - keysym = get_keysym(line); + keysym = get_keysym(table, line); if (keysym == 0) { // 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) { @@ -118,12 +141,14 @@ static kbd_layout_t *parse_keyboard_layout(const char *language, return k; } -static void *init_keyboard_layout(const char *language) + +void *init_keyboard_layout(const name2keysym_t *table, const char *language) { - return parse_keyboard_layout(language, 0); + return parse_keyboard_layout(table, language, 0); } -static int keysym2scancode(void *kbd_layout, int keysym) + +int keysym2scancode(void *kbd_layout, int keysym) { kbd_layout_t *k = kbd_layout; if (keysym < MAX_NORMAL_KEYCODE) { @@ -143,3 +168,25 @@ static int keysym2scancode(void *kbd_layout, int keysym) } return 0; } + +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; +} + +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; +}