diff options
author | David 'Digit' Turner <digit@google.com> | 2009-09-14 14:32:27 -0700 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2009-09-14 14:32:27 -0700 |
commit | 5d8f37ad78fc66901af50c762029a501561f3b23 (patch) | |
tree | 206790f8f21000850a98c4f9590a79e779106278 /keymaps.c | |
parent | cd059b15f2c7df69f4a087bd66900eb172e41d1c (diff) | |
download | external_qemu-5d8f37ad78fc66901af50c762029a501561f3b23.zip external_qemu-5d8f37ad78fc66901af50c762029a501561f3b23.tar.gz external_qemu-5d8f37ad78fc66901af50c762029a501561f3b23.tar.bz2 |
Merge upstream QEMU 10.0.50 into the Android source tree.
This change integrates many changes from the upstream QEMU sources.
Its main purpose is to enable correct ARMv6 and ARMv7 support to the
Android emulator. Due to the nature of the upstream code base, this
unfortunately also required changes to many other parts of the source.
Note that to ensure easier integrations in the future, some source files
and directories that have heavy Android-specific customization have been
renamed with an -android suffix. The original files are still there for
easier integration tracking, but *never* compiled. For example:
net.c net-android.c
qemu-char.c qemu-char-android.c
slirp/ slirp-android/
etc...
Tested on linux-x86, darwin-x86 and windows host machines.
Diffstat (limited to 'keymaps.c')
-rw-r--r-- | keymaps.c | 67 |
1 files changed, 26 insertions, 41 deletions
@@ -22,34 +22,20 @@ * 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; } -struct key_range { - int start; - int end; - struct key_range *next; -}; - -#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; - 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; @@ -67,34 +53,31 @@ static void add_to_key_range(struct key_range **krp, int code) { } if (kr == NULL) { kr = qemu_mallocz(sizeof(*kr)); - if (kr) { - kr->start = kr->end = code; - kr->next = *krp; - *krp = kr; - } + kr->start = kr->end = code; + kr->next = *krp; + *krp = kr; } } -static kbd_layout_t *parse_keyboard_layout(const char *language, +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; @@ -106,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 != ' ') @@ -114,7 +97,7 @@ 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 { @@ -158,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) { @@ -184,7 +169,7 @@ static int keysym2scancode(void *kbd_layout, int keysym) return 0; } -static inline int keycode_is_keypad(void *kbd_layout, int keycode) +int keycode_is_keypad(void *kbd_layout, int keycode) { kbd_layout_t *k = kbd_layout; struct key_range *kr; @@ -195,7 +180,7 @@ static inline int keycode_is_keypad(void *kbd_layout, int keycode) return 0; } -static inline int keysym_is_numlock(void *kbd_layout, int keysym) +int keysym_is_numlock(void *kbd_layout, int keysym) { kbd_layout_t *k = kbd_layout; struct key_range *kr; |