]> git.proxmox.com Git - qemu.git/blobdiff - keymaps.c
qjson: Handle "\f"
[qemu.git] / keymaps.c
index f1f00eb5b4d141b5e8ab7fba59baa04b05075ab0..78c7ea375cc9906c2ed8518d8428a2389d33f002 100644 (file)
--- a/keymaps.c
+++ b/keymaps.c
 #include "keymaps.h"
 #include "sysemu.h"
 
-static int get_keysym(const a_name2keysym *table,
+static int get_keysym(const name2keysym_t *table,
                      const char *name)
 {
-    const a_name2keysym *p;
+    const name2keysym_t *p;
     for(p = table; p->name != NULL; p++) {
         if (!strcmp(p->name, name))
             return p->keysym;
@@ -59,9 +59,32 @@ static void add_to_key_range(struct key_range **krp, int code) {
     }
 }
 
-static a_kbd_layout *parse_keyboard_layout(const a_name2keysym *table,
+static void add_keysym(char *line, int keysym, int keycode, kbd_layout_t *k) {
+    if (keysym < MAX_NORMAL_KEYCODE) {
+       //fprintf(stderr,"Setting keysym %s (%d) to %d\n",line,keysym,keycode);
+       k->keysym2keycode[keysym] = keycode;
+    } else {
+       if (k->extra_count >= MAX_EXTRA_COUNT) {
+           fprintf(stderr,
+                   "Warning: Could not assign keysym %s (0x%x) because of memory constraints.\n",
+                   line, keysym);
+       } else {
+#if 0
+           fprintf(stderr, "Setting %d: %d,%d\n",
+                   k->extra_count, keysym, keycode);
+#endif
+           k->keysym2keycode_extra[k->extra_count].
+               keysym = keysym;
+           k->keysym2keycode_extra[k->extra_count].
+               keycode = keycode;
+           k->extra_count++;
+       }
+    }
+}
+
+static kbd_layout_t *parse_keyboard_layout(const name2keysym_t *table,
                                           const char *language,
-                                          a_kbd_layout * k)
+                                          kbd_layout_t * k)
 {
     FILE *f;
     char * filename;
@@ -71,7 +94,7 @@ static a_kbd_layout *parse_keyboard_layout(const a_name2keysym *table,
     filename = qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language);
 
     if (!k)
-       k = qemu_mallocz(sizeof(a_kbd_layout));
+       k = qemu_mallocz(sizeof(kbd_layout_t));
     if (!(filename && (f = fopen(filename, "r")))) {
        fprintf(stderr,
                "Could not read keymap file: '%s'\n", language);
@@ -111,27 +134,22 @@ static a_kbd_layout *parse_keyboard_layout(const a_name2keysym *table,
                        //fprintf(stderr, "keypad keysym %04x keycode %d\n", keysym, keycode);
                    }
 
-                   /* if(keycode&0x80)
-                      keycode=(keycode<<8)^0x80e0; */
-                   if (keysym < MAX_NORMAL_KEYCODE) {
-                       //fprintf(stderr,"Setting keysym %s (%d) to %d\n",line,keysym,keycode);
-                       k->keysym2keycode[keysym] = keycode;
-                   } else {
-                       if (k->extra_count >= MAX_EXTRA_COUNT) {
-                           fprintf(stderr,
-                                   "Warning: Could not assign keysym %s (0x%x) because of memory constraints.\n",
-                                   line, keysym);
-                       } else {
-#if 0
-                           fprintf(stderr, "Setting %d: %d,%d\n",
-                                   k->extra_count, keysym, keycode);
-#endif
-                           k->keysym2keycode_extra[k->extra_count].
-                               keysym = keysym;
-                           k->keysym2keycode_extra[k->extra_count].
-                               keycode = keycode;
-                           k->extra_count++;
-                       }
+                   if (rest && strstr(rest, "shift"))
+                       keycode |= SCANCODE_SHIFT;
+                   if (rest && strstr(rest, "altgr"))
+                       keycode |= SCANCODE_ALTGR;
+                   if (rest && strstr(rest, "ctrl"))
+                       keycode |= SCANCODE_CTRL;
+
+                   add_keysym(line, keysym, keycode, k);
+
+                   if (rest && strstr(rest, "addupper")) {
+                       char *c;
+                       for (c = line; *c; c++)
+                           *c = toupper(*c);
+                       keysym = get_keysym(table, line);
+                       if (keysym)
+                           add_keysym(line, keysym, keycode | SCANCODE_SHIFT, k);
                    }
                }
            }
@@ -142,7 +160,7 @@ static a_kbd_layout *parse_keyboard_layout(const a_name2keysym *table,
 }
 
 
-void *init_keyboard_layout(const a_name2keysym *table, const char *language)
+void *init_keyboard_layout(const name2keysym_t *table, const char *language)
 {
     return parse_keyboard_layout(table, language, NULL);
 }
@@ -150,7 +168,7 @@ void *init_keyboard_layout(const a_name2keysym *table, const char *language)
 
 int keysym2scancode(void *kbd_layout, int keysym)
 {
-    a_kbd_layout *k = kbd_layout;
+    kbd_layout_t *k = kbd_layout;
     if (keysym < MAX_NORMAL_KEYCODE) {
        if (k->keysym2keycode[keysym] == 0)
            fprintf(stderr, "Warning: no scancode found for keysym %d\n",
@@ -171,7 +189,7 @@ int keysym2scancode(void *kbd_layout, int keysym)
 
 int keycode_is_keypad(void *kbd_layout, int keycode)
 {
-    a_kbd_layout *k = kbd_layout;
+    kbd_layout_t *k = kbd_layout;
     struct key_range *kr;
 
     for (kr = k->keypad_range; kr; kr = kr->next)
@@ -182,7 +200,7 @@ int keycode_is_keypad(void *kbd_layout, int keycode)
 
 int keysym_is_numlock(void *kbd_layout, int keysym)
 {
-    a_kbd_layout *k = kbd_layout;
+    kbd_layout_t *k = kbd_layout;
     struct key_range *kr;
 
     for (kr = k->numlock_range; kr; kr = kr->next)