* [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console @ 2008-12-16 15:32 John Haxby 2008-12-16 15:46 ` [Qemu-devel] [PATCH 1 " John Haxby ` (3 more replies) 0 siblings, 4 replies; 9+ messages in thread From: John Haxby @ 2008-12-16 15:32 UTC (permalink / raw) To: qemu developers [-- Attachment #1: Type: text/plain, Size: 4476 bytes --] This is a version of a patch that I originally posted to xen-devel. The xen vnc console and the qemu vnc console have diverged a little, but the problems and subsequent fixes apply equally to both. There are presently a few problems dogging keymap handling for the vnc console: * Some keystrokes that generate a symbol locally are ignored. * Some keystrokes in some keymaps generate the wrong scancode and thence the wrong character * The capslock key is handled inconsistently The first problem is typically caused by missing entries in the keymap. For example, the "Q" key in many European keyboards generates "@" and "Ω" in addition to the normal "q" and "Q" when used with the AltGr key. However, the keysym defintions in vnc_keysym.h are incomplete and so, for example, "Ω" will never be recognised even if it is in the keymap definition (which it often isn't). The second problem is a little more subtle. The code presently assumes that there is a many-to-one mapping from keysyms to scancodes. So, for example, "q", "Q", "@" and "Ω" all generate the scancode 0x10. However, on a UK keyboard the "@" keysym can arise from typing either AltGr-Q (scancode 0x10) or Shift-apostrophe (scancode 0x28). For some keymaps this is particularly damaging -- for example in http://article.gmane.org/gmane.comp.emulators.qemu/32241 the "1", "4" and "6" keys should give "&", "'" (apostrophe) and "§" respectively but actually give "k", "b" and "s". The final problem is related to the numlock handling problem that was fixed fairly recently. For that particular problem, the various keysyms that are generated when the only when the numlock key is pressed or released result in an implicit press or release of the numlock key in order to change the state of the key. In the case of the capslock key, however, it isn't, in general, possible to distinguish between a "A" generated from a capslock and one generated with a shift sequence. The following patches are designed to fix these problems. The first uses five keysym to scancode keymaps for plain, shifted, AltGr'd, shift-AltGr'd and numlocked keys to handle the many-to-many mapping from keysyms to scancodes. The current state of the shift and altgr keys that the guest is aware of is tracked and a keysym looked up in the corresponding map to find the right scancode. If the scancode is not defined in that keymap then the other keymaps are checked and implicit keypress or keyrelease events for shift and AltGr sent to produce the right scancode and modifier set to generate the correct keysym in the guest's application. The first lookup means that the right scancode will be generated for a keysym in all but the most pathological of cases; the second lookup means that, for example, a client UK keyboard will work correctly against a guest Belgian keyboard because the implicit shift and AltGr keypresses and releases will do the necessary shuffling behind the scenes. The second patch adds the missing keysym names to vnc_keysym.h. Not all the X keysym names are in here, but there are enough to satisfy all the keysyms used by the keymaps presently defined. The third and final patch corrects most of the keymap definitions. The ones I haven't changed are the ones I am unsure of -- the names do not always correspond that well to the xkb keymap names and for the non-european keyboards I have very little confidence that what I am typing is what is intended! There is a remaining problem with the numlock key handling which is beyond the scope of these patches: if software running in the guest toggles the numlock key (for example, the X server) then the behaviour of the numlock key may become inverted. Finally, the two attached programs -- evkey.c and evconv.c -- can be used to help generate and test keymap definitions. The former, evkey, is Linux specific and matches up keysyms received through a small X window with the scancodes retrieved from a PS/2 keyboard (and it must be a PS/2 keyboard, USB keyboards generate different scancodes). The latter, evconv, uses the qemu keymap to find the scancode and can be used to check that a keymap definition is going to give the expected scancodes for a given (X) keyboard mapping. Hopefully the comments at the head of each file will describe the intention sufficiently well. jch [-- Attachment #2: evkey.c --] [-- Type: text/x-csrc, Size: 9778 bytes --] /* * Generate Xen keymaps * * Compile: * cc -o evkey evkey.c -lX11 * * Usage: * evkey /usr/share/xen/qemu/keymaps/<prototype-keymap> * * The prototype keymap typically has "include common" and not much * else. keysym to scancode lines not already in the protoype (or * anything it includes) will be emitted on the corresponding keypress * events. The keypress MUST come from a PS/2 keyboard so the correct * scancode can be found. * * A complete and correct keymap that matches the current xkb keymap * will produce no output at all for any keypress. * */ #include <ctype.h> #include <dirent.h> #include <fcntl.h> #include <signal.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <linux/input.h> #define MAX_SCANCODE 255 typedef struct { int plain[MAX_SCANCODE]; int shift[MAX_SCANCODE]; int altgr[MAX_SCANCODE]; int shift_altgr[MAX_SCANCODE]; int numlock[MAX_SCANCODE]; } keysym_map_t; const char *keyboard_name = "AT Translated Set 2 keyboard"; static Display *open_display (char *display_name, int argc, char **argv); static void get_keyboard_info (Display *dpy, int *numlock_mask, int *altgr_mask); static int open_keyboard(void); static int get_lastkeypress (int fd); static void load_keymap (char *path, keysym_map_t *map); static void load_keymap1 (char *file, keysym_map_t *map); static char *check_scancode (keysym_map_t *map, KeySym ks, int scancode, bool shift, bool altgr, bool numlock); static void handler (int sig); static volatile bool done = false; int main (int argc, char **argv) { Display *dpy; int numlock_mask = 0; int altgr_mask = 0; int evfd; keysym_map_t map; dpy = open_display(NULL, argc, argv); evfd = open_keyboard(); get_keyboard_info(dpy, &numlock_mask, &altgr_mask); memset(&map, 0, sizeof(map)); if (argv[1]) load_keymap(argv[1], &map); sigaction(SIGINT, &((struct sigaction) { .sa_handler = handler }), NULL); while (!done) { XEvent event; XNextEvent(dpy, &event); if (event.type == KeyPress) { XKeyEvent *ev = (XKeyEvent *) &event; KeySym ks = NoSymbol; char *keyname; int scancode; char *msg = NULL; char str[256]; XLookupString(ev, str, sizeof(str)-1, &ks, NULL); keyname = XKeysymToString(ks); if (!keyname) continue; if (ev->state & LockMask) fprintf(stderr, "warning: capslock pressed\n"); scancode = get_lastkeypress(evfd); if (IsModifierKey(ks)) msg = check_scancode(&map, ks, scancode, false, false, false); else if (ks != NoSymbol) msg = check_scancode(&map, ks, scancode, (ev->state & ShiftMask), (ev->state & altgr_mask), (ev->state & numlock_mask)); if (msg) { if (ks == NoSymbol) printf("%sNoSymbol\n", msg); else if (IsModifierKey(ks)) printf("%s%s 0x%02x\n", msg, keyname, scancode); else if (IsKeypadKey(ks)) printf("%s%s 0x%02x%s\n", msg, keyname, scancode, (ev->state & numlock_mask) ? " numlock" : ""); else printf("%s%s 0x%02x%s%s\n", msg, keyname, scancode, (ev->state & ShiftMask) ? " shift" : "", (ev->state & altgr_mask) ? " altgr" : ""); fflush(stdout); } } } exit(0); } static Display *open_display (char *display_name, int argc, char **argv) { Display *dpy; XSizeHints hints; XSetWindowAttributes attr; Window w; if (!(dpy = XOpenDisplay(display_name))) { fprintf(stderr, "Can't open display\n"); exit(1); } hints.width = hints.min_width = 100; hints.height = hints.min_height = 100; hints.flags = PMinSize; hints.x = hints.y = 0; memset(&attr, 0, sizeof(attr)); attr.background_pixel = WhitePixel(dpy, DefaultScreen(dpy)); attr.border_pixel = BlackPixel(dpy, DefaultScreen(dpy)); attr.event_mask = KeyPressMask | KeyReleaseMask; w = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, 100, 100, 0, 0, InputOutput, CopyFromParent, CWBackPixel | CWBorderPixel | CWEventMask, &attr); XSetStandardProperties(dpy, w, "evkey", NULL, 0, argv, argc, &hints); XMapWindow(dpy, w); return dpy; } static void get_keyboard_info (Display *dpy, int *numlock_mask, int *altgr_mask) { int min_keycode, max_keycode, keysyms_per_keycode; XModifierKeymap *map; int i, j; XDisplayKeycodes(dpy, &min_keycode, &max_keycode); XGetKeyboardMapping(dpy, min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode); map = XGetModifierMapping(dpy); for (i = 0; i < 8*map->max_keypermod; i += map->max_keypermod) { for (j = 0; j < map->max_keypermod; j++) { if (map->modifiermap[i+j]) { int index = 0; KeySym ks = NoSymbol; while (ks == NoSymbol && index < keysyms_per_keycode) ks = XKeycodeToKeysym(dpy, map->modifiermap[i+j], index++); if (*numlock_mask == 0 && ks == XK_Num_Lock) *numlock_mask = 1 << (i / map->max_keypermod); else if (*altgr_mask == 0 && ks == XK_ISO_Level3_Shift) *altgr_mask = 1 << (i / map->max_keypermod); } } } } static int selector (const struct dirent *dirent) { int n; return (sscanf(dirent->d_name, "event%d", &n) == 1); } static int cmp (const void *d1, const void *d2) { int n1 = 0, n2 = 0; sscanf((*((struct dirent **) d1))->d_name, "event%d", &n1); sscanf((*((struct dirent **) d2))->d_name, "event%d", &n2); return n1 - n2; } static int open_keyboard () { struct dirent **namelist; int fd = -1, i, n; if ((n = scandir("/dev/input", &namelist, selector, cmp)) < 0) { perror("/dev/input"); exit(1); } for (i = 0; i < n; i++) { char file[sizeof("/dev/input/") + strlen(namelist[i]->d_name)]; int version; char name[256]; sprintf(file, "/dev/input/%s", namelist[i]->d_name); if ((fd = open(file, O_RDONLY)) < 0) { perror(file); exit(1); } if (ioctl(fd, EVIOCGVERSION, &version) >= 0 && ioctl(fd, EVIOCGNAME(sizeof(name)), name) >= 0 && strcasecmp(name, keyboard_name) == 0) return fd; close(fd); } fprintf(stderr, "Cannot find input device for \"%s\"\n", keyboard_name); exit(1); } static int get_lastkeypress (int fd) { struct input_event ev[64]; int keycode = -1; int scancode = -1; int i, n; if ((n = read(fd, ev, sizeof(ev))) < sizeof(struct input_event)) { perror("read event"); exit(1); } for (i = 0; i < n/sizeof(struct input_event); i++) { if (ev[i].type == EV_MSC && ev[i].code == MSC_SCAN) scancode = ev[i].value; if (ev[i].type == EV_KEY && ev[i].value == 1 && scancode >= 0) { keycode = scancode; scancode = -1; } } return keycode; } static void load_keymap (char *path, keysym_map_t *map) { if (strchr(path, '/')) { char *dir = strdup(path); char *file = strrchr(dir, '/'); *file++ = '\0'; chdir(dir); load_keymap1(file, map); free(dir); } else { load_keymap1(path, map); } } static void load_keymap1 (char *file, keysym_map_t *map) { char line[1024]; FILE *f; if (!(f = fopen(file, "r"))) { perror(file); exit(1); } while (fgets(line, sizeof(line), f)) { char *ptr = strchr(line, '#'); char *keyname, *p1, *p2; KeySym ks; int code = -1; bool shift = false; bool altgr = false; bool addupper = false; bool numlock = false; bool inhibit = false; if (ptr) *ptr-- = '\0'; else ptr = &line[strlen(line)-1]; while (isspace(*ptr)) *ptr-- = '\0'; if (sscanf(line, "include %as", &p1) == 1) { load_keymap(p1, map); free(p1); continue; } else if (sscanf(line, "map %i", &code) == 1) { continue; } else if (sscanf(line, "%as %i %as %as", &keyname, &code, &p1, &p2) == 4) { altgr = (strcmp(p1, "altgr") == 0 || strcmp(p2, "altgr") == 0); shift = (strcmp(p1, "shift") == 0 || strcmp(p2, "shift") == 0); free(p1); free(p2); } else if (sscanf(line, "%as %i %as", &keyname, &code, &p1) == 3) { altgr = (strcmp(p1, "altgr") == 0); shift = (strcmp(p1, "shift") == 0); addupper = (strcmp(p1, "addupper") == 0); numlock = (strcmp(p1, "numlock") == 0); inhibit = (strcmp(p1, "inhibit") == 0); free(p1); } else if (sscanf(line, "%as %i", &keyname, &code) != 2) { continue; } if (!keyname) { fprintf(stderr, "malformed line: \"%s\"\n", line); continue; } if ((ks = XStringToKeysym(keyname)) == NoSymbol) { fprintf(stderr, "Unknown keysym \"%s\"\n", keyname); free(keyname); continue; } free(keyname); if (inhibit) continue; if (code <= 0 || code >= MAX_SCANCODE) { fprintf(stderr, "Scancode out of range at \"%s\"\n", line); continue; } if (numlock) map->numlock[code] = ks; else if (shift && altgr) map->shift_altgr[code] = ks; else if (shift) map->shift[code] = ks; else if (altgr) map->altgr[code] = ks; else { map->plain[code] = ks; if (addupper) /* this is somewhat dubious */ map->shift[code] = ks + 'A' - 'a'; } } } static char *check_scancode (keysym_map_t *map, KeySym ks, int scancode, bool shift, bool altgr, bool numlock) { static char msg[128]; int *mmap; if (numlock) mmap = map->numlock; else if (shift & altgr) mmap = map->shift_altgr; else if (shift) mmap = map->shift; else if (altgr) mmap = map->altgr; else mmap = map->plain; if (scancode <= 0 || scancode >= MAX_SCANCODE) snprintf(msg, sizeof(msg), "# scancode %#x out of range\n# ", scancode); else if (mmap[scancode] == 0) return ""; else if (mmap[scancode] != ks) return ""; else return NULL; return msg; } static void handler (int sig) { done = true; exit(0); } [-- Attachment #3: evconv.c --] [-- Type: text/x-csrc, Size: 9757 bytes --] /* * Test Xen keymaps * * Compile: * cc -o evconv evconv.c -lX11 * * Usage: * evconv /usr/share/xen/qemu/keymaps/<keymap> * * The keysyms coming from a keypress or keyrelease in a small X * window are matched to the corresponding scancode from a PS/2 * keyboard (and it must be a PS/2 keyboard: USB keyboards won't * work). Each distinct keypress or keyrelese is printed out as the * corresponding scancode and keysym. For example, "Q", "Shift-Q" * "AltGr-Q" and "Shift-Altgr-Q" should all produce the scancode 0x10 * although they will, of course, result in four different keysyms. * */ #include <ctype.h> #include <dirent.h> #include <fcntl.h> #include <signal.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #ifdef USE_VNC_KEYSYM #include "vnc_keysym.h" #endif #define MAX_SCANCODE 255 struct ks { int keysym; int scancode; }; typedef struct { int n; struct ks k[MAX_SCANCODE]; } keysym_map_t; #define KEY_LOCALSTATE 0x1 #define KEY_KEYPAD 0x2 typedef struct { keysym_map_t plain; keysym_map_t shift; keysym_map_t altgr; keysym_map_t shift_altgr; keysym_map_t numlock; unsigned char flags [MAX_SCANCODE]; } keysym_maps_t; const char *keyboard_name = "AT Translated Set 2 keyboard"; static Display *open_display (char *display_name, int argc, char **argv); static void get_keyboard_info (Display *dpy, int *numlock_mask, int *altgr_mask); static void load_keymap (char *path, keysym_maps_t *map); static void load_keymap1 (char *file, keysym_maps_t *map); static void handler (int sig); static void prepare_keymap(keysym_maps_t *); static int lookup_scancode(keysym_map_t *map, int keysym); static int lookup_keysym (const char *name); static volatile bool done = false; int main (int argc, char **argv) { Display *dpy; int numlock_mask = 0; int altgr_mask = 0; keysym_maps_t map; KeySym last = NoSymbol; dpy = open_display(NULL, argc, argv); get_keyboard_info(dpy, &numlock_mask, &altgr_mask); memset(&map, 0, sizeof(map)); if (argv[1]) load_keymap(argv[1], &map); prepare_keymap(&map); sigaction(SIGINT, &((struct sigaction) { .sa_handler = handler }), NULL); while (!done) { XEvent event; XNextEvent(dpy, &event); if (event.type == KeyPress || event.type == KeyRelease) { XKeyEvent *ev = (XKeyEvent *) &event; KeySym ks = NoSymbol; char *keyname; char str[256]; int scancode; XLookupString(ev, str, sizeof(str)-1, &ks, NULL); if (last == ks) { if (event.type == KeyRelease) last = NoSymbol; continue; } if (event.type == KeyPress) last = ks; keyname = XKeysymToString(ks) ?: "VoidSymbol"; if ((scancode = lookup_scancode(&map.plain, ks))) printf("%02x %s%s%s\n", scancode, keyname, (map.flags[scancode] & KEY_LOCALSTATE) ? " (localstate)" : "", (map.flags[scancode] & KEY_KEYPAD) ? " (numlock off)" : ""); if ((scancode = lookup_scancode(&map.shift, ks))) printf("%02x %s (shift)\n", scancode, keyname); if ((scancode = lookup_scancode(&map.altgr, ks))) printf("%02x %s (altgr)\n", scancode, keyname); if ((scancode = lookup_scancode(&map.shift_altgr, ks))) printf("%02x %s (shift altgr)\n", scancode, keyname); if ((scancode = lookup_scancode(&map.numlock, ks))) printf("%02x %s (numlock on)\n", scancode, keyname); fflush(stdout); } } exit(0); } static Display *open_display (char *display_name, int argc, char **argv) { Display *dpy; XSizeHints hints; XSetWindowAttributes attr; Window w; if (!(dpy = XOpenDisplay(display_name))) { fprintf(stderr, "Can't open display\n"); exit(1); } hints.width = hints.min_width = 100; hints.height = hints.min_height = 100; hints.flags = PMinSize; hints.x = hints.y = 0; memset(&attr, 0, sizeof(attr)); attr.background_pixel = WhitePixel(dpy, DefaultScreen(dpy)); attr.border_pixel = BlackPixel(dpy, DefaultScreen(dpy)); attr.event_mask = KeyPressMask | KeyReleaseMask; w = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, 100, 100, 0, 0, InputOutput, CopyFromParent, CWBackPixel | CWBorderPixel | CWEventMask, &attr); XSetStandardProperties(dpy, w, "evkey", NULL, 0, argv, argc, &hints); XMapWindow(dpy, w); return dpy; } static void get_keyboard_info (Display *dpy, int *numlock_mask, int *altgr_mask) { int min_keycode, max_keycode, keysyms_per_keycode; XModifierKeymap *map; int i, j; XDisplayKeycodes(dpy, &min_keycode, &max_keycode); XGetKeyboardMapping(dpy, min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode); map = XGetModifierMapping(dpy); for (i = 0; i < 8*map->max_keypermod; i += map->max_keypermod) { for (j = 0; j < map->max_keypermod; j++) { if (map->modifiermap[i+j]) { int index = 0; KeySym ks = NoSymbol; while (ks == NoSymbol && index < keysyms_per_keycode) ks = XKeycodeToKeysym(dpy, map->modifiermap[i+j], index++); if (*numlock_mask == 0 && ks == XK_Num_Lock) *numlock_mask = 1 << (i / map->max_keypermod); else if (*altgr_mask == 0 && ks == XK_ISO_Level3_Shift) *altgr_mask = 1 << (i / map->max_keypermod); } } } } static void load_keymap (char *path, keysym_maps_t *map) { if (strchr(path, '/')) { char *dir = strdup(path); char *file = strrchr(dir, '/'); *file++ = '\0'; chdir(dir); load_keymap1(file, map); free(dir); } else { load_keymap1(path, map); } } static void load_keymap1 (char *file, keysym_maps_t *map) { char line[1024]; FILE *f; if (!(f = fopen(file, "r"))) { perror(file); exit(1); } while (fgets(line, sizeof(line), f)) { char *ptr = strchr(line, '#'); char *keyname, *p1, *p2; KeySym ks; int code = -1; bool shift = false; bool altgr = false; bool addupper = false; bool numlock = false; bool inhibit = false; if (ptr) *ptr-- = '\0'; else ptr = &line[strlen(line)-1]; while (isspace(*ptr)) *ptr-- = '\0'; if (sscanf(line, "include %as", &p1) == 1) { load_keymap(p1, map); free(p1); continue; } else if (sscanf(line, "map %i", &code) == 1) { continue; } else if (sscanf(line, "%as %i %as %as", &keyname, &code, &p1, &p2) == 4) { altgr = (strcmp(p1, "altgr") == 0 || strcmp(p2, "altgr") == 0); shift = (strcmp(p1, "shift") == 0 || strcmp(p2, "shift") == 0); free(p1); free(p2); } else if (sscanf(line, "%as %i %as", &keyname, &code, &p1) == 3) { altgr = (strcmp(p1, "altgr") == 0); shift = (strcmp(p1, "shift") == 0); addupper = (strcmp(p1, "addupper") == 0); numlock = (strcmp(p1, "numlock") == 0); inhibit = (strcmp(p1, "inhibit") == 0); free(p1); } else if (sscanf(line, "%as %i", &keyname, &code) != 2) { continue; } if (!keyname) { fprintf(stderr, "malformed line: \"%s\"\n", line); continue; } if ((ks = lookup_keysym(keyname)) == 0) { fprintf(stderr, "Unknown keysym \"%s\"\n", keyname); free(keyname); continue; } free(keyname); if (inhibit) continue; if (code <= 0 || code >= MAX_SCANCODE) { fprintf(stderr, "Scancode out of range at \"%s\"\n", line); continue; } if (numlock) map->numlock.k[code].keysym = ks; else if (shift && altgr) map->shift_altgr.k[code].keysym = ks; else if (shift) map->shift.k[code].keysym = ks; else if (altgr) map->altgr.k[code].keysym = ks; else { map->plain.k[code].keysym = ks; if (addupper) /* this is somewhat dubious */ map->shift.k[code].keysym = ks + 'A' - 'a'; } } } static void handler (int sig) { done = true; exit(0); } int cmp (const void *a, const void *b) { return ((struct ks *) b)->keysym - ((struct ks *) a)->keysym; } static void sort_map (keysym_map_t *map) { int i; for (i = 0; i < MAX_SCANCODE; i++) map->k[i].scancode = i; qsort(map->k, MAX_SCANCODE, sizeof(struct ks), cmp); for (map->n = 0; map->n < MAX_SCANCODE; map->n++) if (!map->k[map->n].keysym) break; } static void prepare_keymap (keysym_maps_t *map) { int i; for (i = 0; i < MAX_SCANCODE; i++) { if (!(map->shift.k[i].keysym || map->altgr.k[i].keysym || map->shift_altgr.k[i].keysym)) map->flags[i] |= KEY_LOCALSTATE; if (map->numlock.k[i].keysym) map->flags[i] |= KEY_KEYPAD; } sort_map(&map->plain); sort_map(&map->shift); sort_map(&map->altgr); sort_map(&map->shift_altgr); sort_map(&map->numlock); } static int lookup_scancode (keysym_map_t *map, int keysym) { int l = 0, r = map->n-1; while (l <= r) { int m = (l + r)/2; if (map->k[m].keysym == keysym) return map->k[m].scancode; else if (map->k[m].keysym < keysym) r = m-1; else l = m+1; } return 0; } #ifdef USE_VNC_KEYSYM static int keysym_cmp (const void *a, const void *b) { return strcmp(((name2keysym_t *) a)->name, ((name2keysym_t *) b)->name); } static int lookup_keysym (const char *name) { int l, r; static int n = -1; if (n < 0) { for (n = 0; name2keysym[n].name; n++); qsort(name2keysym, n, sizeof(name2keysym_t), keysym_cmp); } l = 0; r = n-1; while (l <= r) { int m = (l + r)/2; int cmp = strcmp(name2keysym[m].name, name); if (cmp < 0) l = m + 1; else if (cmp > 0) r = m - 1; else return name2keysym[m].keysym; } if (name[0] == 'U') { /* unicode symbol key */ char *ptr; int k = strtol(name+1, &ptr, 16); return *ptr ? 0 : k; } return 0; } #else static int lookup_keysym (const char *name) { return XStringToKeysym(name); } #endif ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 1 of 3] Fix keymap handling for vnc console 2008-12-16 15:32 [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console John Haxby @ 2008-12-16 15:46 ` John Haxby 2009-01-08 20:27 ` Anthony Liguori 2008-12-16 15:48 ` [Qemu-devel] [PATCH 2 " John Haxby ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: John Haxby @ 2008-12-16 15:46 UTC (permalink / raw) To: qemu-devel Fix keymap handling for international keyboards Signed-off-by: John Haxby <john.haxby@oracle.com> curses_keys.h | 2 keymaps.c | 347 ++++++++++++++++++++++++++++++++++++---------------------- sdl_keysym.h | 2 vnc.c | 87 ++++++++++---- vnc_keysym.h | 2 5 files changed, 286 insertions(+), 154 deletions(-) diff -up qemu-0.9.1.6042/curses_keys.h.keymap01 qemu-0.9.1.6042/curses_keys.h --- qemu-0.9.1.6042/curses_keys.h.keymap01 2008-10-28 00:11:06.000000000 +0000 +++ qemu-0.9.1.6042/curses_keys.h 2008-12-16 10:47:36.000000000 +0000 @@ -244,7 +244,7 @@ typedef struct { int keysym; } name2keysym_t; -static const name2keysym_t name2keysym[] = { +static name2keysym_t name2keysym[] = { /* Plain ASCII */ { "space", 0x020 }, { "exclam", 0x021 }, diff -up qemu-0.9.1.6042/keymaps.c.keymap01 qemu-0.9.1.6042/keymaps.c --- qemu-0.9.1.6042/keymaps.c.keymap01 2008-10-02 19:26:42.000000000 +0100 +++ qemu-0.9.1.6042/keymaps.c 2008-12-16 10:47:36.000000000 +0000 @@ -22,58 +22,64 @@ * THE SOFTWARE. */ +static int cmp_keysym(const void *a, const void *b) { + return strcmp(((name2keysym_t *) a)->name, ((name2keysym_t *) b)->name); +} + + static int get_keysym(const char *name) { - const name2keysym_t *p; - for(p = name2keysym; p->name != NULL; p++) { - if (!strcmp(p->name, name)) - return p->keysym; + static int n = -1; + int l, r, m; + + if (n < 0) { + for (n = 0; name2keysym[n].name; n++); + qsort(name2keysym, n, sizeof(name2keysym_t), cmp_keysym); + } + l = 0; + r = n-1; + while (l <= r) { + m = (l + r) / 2; + int cmp = strcmp(name2keysym[m].name, name); + if (cmp < 0) + l = m + 1; + else if (cmp > 0) + r = m - 1; + else + return name2keysym[m].keysym; + } + if (name[0] == 'U') { + /* unicode symbol key */ + char *ptr; + int k = strtol(name+1, &ptr, 16); + return *ptr ? 0 : k; } - return 0; } -struct key_range { - int start; - int end; - struct key_range *next; -}; +#define MAX_SCANCODE 256 +#define KEY_LOCALSTATE 0x1 +#define KEY_KEYPAD 0x2 #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; + int keysym; + int keycode; +} keysym2keycode_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; - } - } -} +typedef struct { + int n; + keysym2keycode_t k[MAX_SCANCODE]; +} keysym_map_t; + +typedef struct { + keysym_map_t plain; + keysym_map_t shift; + keysym_map_t altgr; + keysym_map_t shift_altgr; + keysym_map_t numlock; + uint32_t flags [MAX_SCANCODE]; +} kbd_layout_t; static kbd_layout_t *parse_keyboard_layout(const char *language, kbd_layout_t * k) @@ -81,105 +87,194 @@ static kbd_layout_t *parse_keyboard_layo FILE *f; char file_name[1024]; char line[1024]; - int len; snprintf(file_name, sizeof(file_name), - "%s/keymaps/%s", bios_dir, language); + "%s/keymaps/%s", bios_dir, language); if (!k) k = qemu_mallocz(sizeof(kbd_layout_t)); if (!k) - return 0; + return 0; if (!(f = fopen(file_name, "r"))) { fprintf(stderr, "Could not read keymap file: '%s'\n", file_name); return 0; } - for(;;) { - if (fgets(line, 1024, f) == NULL) - break; - len = strlen(line); - if (len > 0 && line[len - 1] == '\n') - line[len - 1] = '\0'; - if (line[0] == '#') - continue; - if (!strncmp(line, "map ", 4)) - continue; - if (!strncmp(line, "include ", 8)) { - parse_keyboard_layout(line + 8, k); - } else { - char *end_of_keysym = line; - while (*end_of_keysym != 0 && *end_of_keysym != ' ') - end_of_keysym++; - if (*end_of_keysym) { - int keysym; - *end_of_keysym = 0; - keysym = get_keysym(line); - if (keysym == 0) { - // fprintf(stderr, "Warning: unknown keysym %s\n", line); - } else { - const char *rest = end_of_keysym + 1; - 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) { - //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++; - } - } - } - } + while (fgets(line, 1024, f)) { + char *ptr = strchr(line, '#'); + char keyname[1024], p1[1024], p2[1024]; + int keysym, keycode; + int shift = 0; + int altgr = 0; + int addupper = 0; + int numlock = 0; + int inhibit = 0; + + if (ptr) + *ptr-- = '\0'; + else + ptr = &line[strlen(line)-1]; + while (isspace(*ptr)) + *ptr-- = '\0'; + if (!*line) + continue; + if (strncmp(line, "map ", 4) == 0) + continue; + if (sscanf(line, "include %s", p1) == 1) { + parse_keyboard_layout(p1, k); + continue; + } + if (sscanf(line, "%s %i %s %s", keyname, &keycode, p1, p2) == 4) { + shift = (strcmp(p1, "shift") == 0 || strcmp(p2, "shift") == 0); + altgr = (strcmp(p1, "altgr") == 0 || strcmp(p2, "altgr") == 0); + } else if (sscanf(line, "%s %i %s", keyname, &keycode, p1) == 3) { + shift = (strcmp(p1, "shift") == 0); + altgr = (strcmp(p1, "altgr") == 0); + addupper = (strcmp(p1, "addupper") == 0); + numlock = (strcmp(p1, "numlock") == 0); + inhibit = (strcmp(p1, "inhibit") == 0); + } else if (sscanf(line, "%s %i", keyname, &keycode) != 2) + /* silently ignore spurious lines */ + continue; + + if (inhibit) + continue; + if ((keysym = get_keysym(keyname)) == 0) { + fprintf(stderr, "%s: warning: unknown keysym %s\n", + file_name, keyname); + continue; + } + if (keycode <= 0 || keycode >= MAX_SCANCODE) { + fprintf(stderr, "%s: warning: keycode %#x for %s out of range\n", + file_name, keycode, keyname); + continue; + } + if (numlock) + k->numlock.k[keycode].keysym = keysym; + else if (shift && altgr) + k->shift_altgr.k[keycode].keysym = keysym; + else if (altgr) + k->altgr.k[keycode].keysym = keysym; + else if (shift) + k->shift.k[keycode].keysym = keysym; + else { + k->plain.k[keycode].keysym = keysym; + if (addupper) + k->shift.k[keycode].keysym = keysym + 'A' - 'a'; } } fclose(f); return k; } +static int cmp_map (const void *a, const void *b) { + return ((keysym2keycode_t *) b)->keysym - ((keysym2keycode_t *) a)->keysym; +} + +static void sort_map (keysym_map_t *map) { + int i; + for (i = 0; i < MAX_SCANCODE; i++) + map->k[i].keycode = i; + /* sort undefined scancodes to the end */ + qsort(map->k, MAX_SCANCODE, sizeof(keysym2keycode_t), cmp_map); + for (map->n = 0; map->n < MAX_SCANCODE; map->n++) + if (!map->k[map->n].keysym) + break; +} + static void *init_keyboard_layout(const char *language) { - return parse_keyboard_layout(language, 0); + kbd_layout_t *k = parse_keyboard_layout(language, NULL); + if (k) { + int i; + for (i = 0; i < MAX_SCANCODE; i++) { + if (!(k->shift.k[i].keysym + || k->altgr.k[i].keysym + || k->shift_altgr.k[i].keysym)) + k->flags[i] |= KEY_LOCALSTATE; + if (k->numlock.k[i].keysym) + k->flags[i] |= KEY_KEYPAD; + } + sort_map(&k->plain); + sort_map(&k->shift); + sort_map(&k->altgr); + sort_map(&k->shift_altgr); + sort_map(&k->numlock); + } + return k; +} + +static int keysym2scancode_map (keysym_map_t *map, int keysym) +{ + int l = 0, r = map->n - 1, m; + while (l <= r) { + m = (l + r) / 2; + if (map->k[m].keysym == keysym) + return map->k[m].keycode; + else if (map->k[m].keysym < keysym) + r = m - 1; + else + l = m + 1; + } + return 0; } static int keysym2scancode(void *kbd_layout, int keysym) { 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", - keysym); - return k->keysym2keycode[keysym]; - } else { - int i; -#ifdef XK_ISO_Left_Tab - if (keysym == XK_ISO_Left_Tab) - keysym = XK_Tab; -#endif - for (i = 0; i < k->extra_count; i++) - if (k->keysym2keycode_extra[i].keysym == keysym) - return k->keysym2keycode_extra[i].keycode; + int scancode; + + if ((scancode = keysym2scancode_map(&k->plain, keysym))) + return scancode; + if ((scancode = keysym2scancode_map(&k->numlock, keysym))) + return scancode; + if ((scancode = keysym2scancode_map(&k->shift, keysym))) + return scancode; + if ((scancode = keysym2scancode_map(&k->altgr, keysym))) + return scancode; + if ((scancode = keysym2scancode_map(&k->shift_altgr, keysym))) + return scancode; + return 0; +} + +static inline int keysym2scancode1(void *kbd_layout, int keysym, + int *shift, int *altgr) +{ + kbd_layout_t *k = kbd_layout; + int s; + + /* normal case: keysym can be found the expected modifier's map */ + if (*shift && *altgr && (s = keysym2scancode_map(&k->shift_altgr, keysym))) + return s; + if (*altgr && (s = keysym2scancode_map(&k->altgr, keysym))) + return s; + if (*shift && (s = keysym2scancode_map(&k->shift, keysym))) + return s; + if ((s = keysym2scancode_map(&k->plain, keysym))) + return s; + if ((s = keysym2scancode_map(&k->numlock, keysym))) + return s; + + /* fallback for when there is some keyboard/state mismatch */ + if ((s = keysym2scancode_map(&k->plain, keysym))) { + *shift = 0; + *altgr = 0; + return s; + } + if ((s = keysym2scancode_map(&k->shift, keysym))) { + *shift = 1; + *altgr = 0; + return s; + } + if ((s = keysym2scancode_map(&k->altgr, keysym))) { + *shift = 0; + *altgr = 1; + return s; + } + if ((s = keysym2scancode_map(&k->shift_altgr, keysym))) { + *shift = 1; + *altgr = 1; + return s; } return 0; } @@ -187,21 +282,21 @@ static int keysym2scancode(void *kbd_lay 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; + if (keycode >= 0 && keycode < MAX_SCANCODE) + return !!(k->flags[keycode] & KEY_KEYPAD); } static inline int keysym_is_numlock(void *kbd_layout, int keysym) { kbd_layout_t *k = kbd_layout; - struct key_range *kr; + return (keysym2scancode_map(&k->numlock, keysym) != 0); +} - for (kr = k->numlock_range; kr; kr = kr->next) - if (keysym >= kr->start && keysym <= kr->end) - return 1; +static inline int keycode_is_shiftable(void *kbd_layout, int keycode) +{ + kbd_layout_t *k = kbd_layout; + if (keycode >= 0 || keycode < MAX_SCANCODE) + return !(k->flags[keycode] & KEY_LOCALSTATE); return 0; } diff -up qemu-0.9.1.6042/sdl_keysym.h.keymap01 qemu-0.9.1.6042/sdl_keysym.h --- qemu-0.9.1.6042/sdl_keysym.h.keymap01 2008-10-02 19:26:42.000000000 +0100 +++ qemu-0.9.1.6042/sdl_keysym.h 2008-12-16 10:47:36.000000000 +0000 @@ -2,7 +2,7 @@ typedef struct { const char* name; int keysym; } name2keysym_t; -static const name2keysym_t name2keysym[]={ +static name2keysym_t name2keysym[]={ /* ascii */ { "space", 0x020}, { "exclam", 0x021}, diff -up qemu-0.9.1.6042/vnc.c.keymap01 qemu-0.9.1.6042/vnc.c --- qemu-0.9.1.6042/vnc.c.keymap01 2008-12-13 18:57:12.000000000 +0000 +++ qemu-0.9.1.6042/vnc.c 2008-12-16 10:52:09.000000000 +0000 @@ -1031,14 +1031,22 @@ static void pointer_event(VncState *vs, check_pointer_type_change(vs, kbd_mouse_is_absolute()); } +static void put_keycode(int keycode, int down) +{ + if (keycode & 0x80) + kbd_put_keycode(0xe0); + if (down) + kbd_put_keycode(keycode & 0x7f); + else + kbd_put_keycode(keycode | 0x80); +} + static void reset_keys(VncState *vs) { int i; for(i = 0; i < 256; i++) { if (vs->modifiers_state[i]) { - if (i & 0x80) - kbd_put_keycode(0xe0); - kbd_put_keycode(i | 0x80); + put_keycode(i, 0); vs->modifiers_state[i] = 0; } } @@ -1046,12 +1054,29 @@ static void reset_keys(VncState *vs) static void press_key(VncState *vs, int keysym) { - kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) & 0x7f); - kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) | 0x80); + put_keycode(keysym2scancode(vs->kbd_layout, keysym), 1); + put_keycode(keysym2scancode(vs->kbd_layout, keysym), 0); +} + +static void twiddle_modifiers(VncState *vs, int down, int shift, int altgr) +{ + if (shift && !(vs->modifiers_state[0x2a] || vs->modifiers_state[0x36])) + put_keycode(0x2a, down); + if (!shift && vs->modifiers_state[0x2a]) + put_keycode(0x2a, !down); + if (!shift && vs->modifiers_state[0x36]) + put_keycode(0x36, !down); + if (altgr && !vs->modifiers_state[0xb8]) + put_keycode(0xb8, down); + if (!altgr && vs->modifiers_state[0xb8]) + put_keycode(0xb8, !down); } -static void do_key_event(VncState *vs, int down, int keycode, int sym) +static void do_key_event(VncState *vs, int down, int keycode, int sym, + int shift, int altgr) { + int keypad = 0; + /* QEMU console switch */ switch(keycode) { case 0x2a: /* Left Shift */ @@ -1059,11 +1084,8 @@ static void do_key_event(VncState *vs, i case 0x1d: /* Left CTRL */ case 0x9d: /* Right CTRL */ case 0x38: /* Left ALT */ - case 0xb8: /* Right ALT */ - if (down) - vs->modifiers_state[keycode] = 1; - else - vs->modifiers_state[keycode] = 0; + case 0xb8: /* Right ALT aka AltGr*/ + vs->modifiers_state[keycode] = down; break; case 0x02 ... 0x0a: /* '1' to '9' keys */ if (down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) { @@ -1074,16 +1096,22 @@ static void do_key_event(VncState *vs, i } break; case 0x3a: /* CapsLock */ + if (is_graphic_console()) + return; case 0x45: /* NumLock */ if (!down) vs->modifiers_state[keycode] ^= 1; break; } - if (keycode_is_keypad(vs->kbd_layout, keycode)) { + keypad = keycode_is_keypad(vs->kbd_layout, keycode); + if (keypad) { /* If the numlock state needs to change then simulate an additional keypress before sending this one. This will happen if the user - toggles numlock away from the VNC window. + toggles numlock away from the VNC window. This isn't perfect as + pressig the shift key will typically and temporarily have the + effect of inverting the numlock setting: the shift key will be + effectively cancelled out. */ if (keysym_is_numlock(vs->kbd_layout, sym & 0xFFFF)) { if (!vs->modifiers_state[0x45]) { @@ -1099,12 +1127,14 @@ static void do_key_event(VncState *vs, i } if (is_graphic_console()) { - if (keycode & 0x80) - kbd_put_keycode(0xe0); - if (down) - kbd_put_keycode(keycode & 0x7f); - else - kbd_put_keycode(keycode | 0x80); + if (keycode_is_shiftable(vs->kbd_layout, keycode) && !keypad) { + if (down) + twiddle_modifiers(vs, down, shift, altgr); + put_keycode(keycode, down); + if (!down) + twiddle_modifiers(vs, down, shift, altgr); + } else + put_keycode(keycode, down); } else { /* QEMU console emulation */ if (down) { @@ -1153,13 +1183,18 @@ static void do_key_event(VncState *vs, i static void key_event(VncState *vs, int down, uint32_t sym) { + int shift; + int altgr; int keycode; - if (sym >= 'A' && sym <= 'Z' && is_graphic_console()) - sym = sym - 'A' + 'a'; - - keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF); - do_key_event(vs, down, keycode, sym); + shift = (vs->modifiers_state[0x2a] || vs->modifiers_state[0x36]); + altgr = vs->modifiers_state[0xb8]; + keycode = keysym2scancode1(vs->kbd_layout, sym & 0xFFFF, &shift, &altgr); + if (keycode == 0) { + fprintf(stderr, "Key lost : keysym 0x%x(%d)\n", sym, sym); + return; + } + do_key_event(vs, down, keycode, sym, shift, altgr); } static void ext_key_event(VncState *vs, int down, @@ -1169,7 +1204,9 @@ static void ext_key_event(VncState *vs, if (keyboard_layout) key_event(vs, down, sym); else - do_key_event(vs, down, keycode, sym); + do_key_event(vs, down, keycode, sym, + vs->modifiers_state[0x2a] || vs->modifiers_state[0x36], + vs->modifiers_state[0xb8]); } static void framebuffer_update_request(VncState *vs, int incremental, diff -up qemu-0.9.1.6042/vnc_keysym.h.keymap01 qemu-0.9.1.6042/vnc_keysym.h --- qemu-0.9.1.6042/vnc_keysym.h.keymap01 2008-10-02 19:26:42.000000000 +0100 +++ qemu-0.9.1.6042/vnc_keysym.h 2008-12-16 10:47:36.000000000 +0000 @@ -2,7 +2,7 @@ typedef struct { const char* name; int keysym; } name2keysym_t; -static const name2keysym_t name2keysym[]={ +static name2keysym_t name2keysym[]={ /* ascii */ { "space", 0x020}, { "exclam", 0x021}, ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1 of 3] Fix keymap handling for vnc console 2008-12-16 15:46 ` [Qemu-devel] [PATCH 1 " John Haxby @ 2009-01-08 20:27 ` Anthony Liguori 2009-01-08 20:46 ` John Haxby 0 siblings, 1 reply; 9+ messages in thread From: Anthony Liguori @ 2009-01-08 20:27 UTC (permalink / raw) To: qemu-devel John Haxby wrote: > Fix keymap handling for international keyboards > > Signed-off-by: John Haxby <john.haxby@oracle.com> > > curses_keys.h | 2 > keymaps.c | 347 > ++++++++++++++++++++++++++++++++++++---------------------- > sdl_keysym.h | 2 > vnc.c | 87 ++++++++++---- > vnc_keysym.h | 2 > 5 files changed, 286 insertions(+), 154 deletions(-) > > diff -up qemu-0.9.1.6042/curses_keys.h.keymap01 > qemu-0.9.1.6042/curses_keys.h > --- qemu-0.9.1.6042/curses_keys.h.keymap01 2008-10-28 > 00:11:06.000000000 +0000 > +++ qemu-0.9.1.6042/curses_keys.h 2008-12-16 10:47:36.000000000 +0000 > @@ -244,7 +244,7 @@ typedef struct { > int keysym; > } name2keysym_t; > > -static const name2keysym_t name2keysym[] = { > +static name2keysym_t name2keysym[] = { > /* Plain ASCII */ > { "space", 0x020 }, > { "exclam", 0x021 }, > diff -up qemu-0.9.1.6042/keymaps.c.keymap01 qemu-0.9.1.6042/keymaps.c > --- qemu-0.9.1.6042/keymaps.c.keymap01 2008-10-02 > 19:26:42.000000000 +0100 > +++ qemu-0.9.1.6042/keymaps.c 2008-12-16 10:47:36.000000000 +0000 > @@ -22,58 +22,64 @@ > * THE SOFTWARE. > */ > > +static int cmp_keysym(const void *a, const void *b) { > + return strcmp(((name2keysym_t *) a)->name, ((name2keysym_t *) > b)->name); > +} > + > + > static int get_keysym(const char *name) > { > - const name2keysym_t *p; > - for(p = name2keysym; p->name != NULL; p++) { > - if (!strcmp(p->name, name)) > - return p->keysym; > + static int n = -1; > + int l, r, m; > + > + if (n < 0) { > + for (n = 0; name2keysym[n].name; n++); > + qsort(name2keysym, n, sizeof(name2keysym_t), cmp_keysym); Doing an in place sort of a literal array is probably not a great idea. Why does the array need sorting? The indenting is really screwed up here. > + } > + l = 0; > + r = n-1; > + while (l <= r) { > + m = (l + r) / 2; > + int cmp = strcmp(name2keysym[m].name, name); Please don't mix variable declarations with code. > + if (cmp < 0) > + l = m + 1; > + else if (cmp > 0) > + r = m - 1; > + else > + return name2keysym[m].keysym; > + } This is an open coded binary search? Why not just do a linear search? Is this really a performance concern? > + if (name[0] == 'U') { > + /* unicode symbol key */ > + char *ptr; > + int k = strtol(name+1, &ptr, 16); > + return *ptr ? 0 : k; > } > - return 0; > } > > -struct key_range { > - int start; > - int end; > - struct key_range *next; > -}; > +#define MAX_SCANCODE 256 > +#define KEY_LOCALSTATE 0x1 > +#define KEY_KEYPAD 0x2 > > #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; > + int keysym; > + int keycode; > +} keysym2keycode_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; > - } > - } > -} > +typedef struct { > + int n; > + keysym2keycode_t k[MAX_SCANCODE]; > +} keysym_map_t; > + > +typedef struct { > + keysym_map_t plain; > + keysym_map_t shift; > + keysym_map_t altgr; > + keysym_map_t shift_altgr; > + keysym_map_t numlock; > + uint32_t flags [MAX_SCANCODE]; > +} kbd_layout_t; > > static kbd_layout_t *parse_keyboard_layout(const char *language, > kbd_layout_t * k) > @@ -81,105 +87,194 @@ static kbd_layout_t *parse_keyboard_layo > FILE *f; > char file_name[1024]; > char line[1024]; > - int len; > > snprintf(file_name, sizeof(file_name), > - "%s/keymaps/%s", bios_dir, language); > + "%s/keymaps/%s", bios_dir, language); Please don't change existing code formatting. > if (!k) > k = qemu_mallocz(sizeof(kbd_layout_t)); > if (!k) > - return 0; > + return 0; Like right here. > if (!(f = fopen(file_name, "r"))) { > fprintf(stderr, > "Could not read keymap file: '%s'\n", file_name); > return 0; > } > - for(;;) { > - if (fgets(line, 1024, f) == NULL) > - break; > - len = strlen(line); > - if (len > 0 && line[len - 1] == '\n') > - line[len - 1] = '\0'; > - if (line[0] == '#') > - continue; > - if (!strncmp(line, "map ", 4)) > - continue; > - if (!strncmp(line, "include ", 8)) { > - parse_keyboard_layout(line + 8, k); > - } else { > - char *end_of_keysym = line; > - while (*end_of_keysym != 0 && *end_of_keysym != ' ') > - end_of_keysym++; > - if (*end_of_keysym) { > - int keysym; > - *end_of_keysym = 0; > - keysym = get_keysym(line); > - if (keysym == 0) { > - // fprintf(stderr, "Warning: unknown > keysym %s\n", line); > - } else { > - const char *rest = end_of_keysym + 1; > - 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) { > - //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++; > - } > - } > - } > - } > + while (fgets(line, 1024, f)) { > + char *ptr = strchr(line, '#'); > + char keyname[1024], p1[1024], p2[1024]; > + int keysym, keycode; > + int shift = 0; > + int altgr = 0; > + int addupper = 0; > + int numlock = 0; > + int inhibit = 0; Again, the formatting is off. > + if (ptr) > + *ptr-- = '\0'; What happens if the comment character is the first character in the line You'll under run the buffer. > + else > + ptr = &line[strlen(line)-1]; > + while (isspace(*ptr)) > + *ptr-- = '\0'; > + if (!*line) > + continue; > + if (strncmp(line, "map ", 4) == 0) > + continue; > + if (sscanf(line, "include %s", p1) == 1) { %s is generally unsafe to use with sscanf unless you use .* too. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1 of 3] Fix keymap handling for vnc console 2009-01-08 20:27 ` Anthony Liguori @ 2009-01-08 20:46 ` John Haxby 2009-01-08 21:06 ` Anthony Liguori 0 siblings, 1 reply; 9+ messages in thread From: John Haxby @ 2009-01-08 20:46 UTC (permalink / raw) To: qemu-devel Anthony Liguori wrote: > John Haxby wrote: >> Fix keymap handling for international keyboards >> >> Signed-off-by: John Haxby <john.haxby@oracle.com> >> [snip] > > Doing an in place sort of a literal array is probably not a great > idea. Why does the array need sorting? The indenting is really > screwed up here. > The size of the array is dramatically larger than it used to be -- over 1000 entries -- so a linear search over about 200 keysyms is, I thought, a little excessive for linear search and would take an appreciable time at start up. It also seems to me that more keysyms might need to be added in future: the choice was a one-off sort in the vnc_keysym.h definition which is prone to future editing errors or the one-off static sort in the code. I tossed the arguments back and forth with my stuffed penguin and came down in favour of sorting the array: it's a technique I've used before when I wanted robust code at the expense of a little initialisation overhead. Why do you think it's not a good idea? I'll happily revisit the notion. I have no idea why the indenting is screwed up -- it wasn't. I think the Christmas Elves must've got at it. Read and understood the remainder of the comments. I'll re-submit the patches tomorrow -- thanks for looking. jch ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1 of 3] Fix keymap handling for vnc console 2009-01-08 20:46 ` John Haxby @ 2009-01-08 21:06 ` Anthony Liguori 0 siblings, 0 replies; 9+ messages in thread From: Anthony Liguori @ 2009-01-08 21:06 UTC (permalink / raw) To: qemu-devel John Haxby wrote: > The size of the array is dramatically larger than it used to be -- > over 1000 entries -- so a linear search over about 200 keysyms is, I > thought, a little excessive for linear search and would take an > appreciable time at start up. It also seems to me that more keysyms > might need to be added in future: the choice was a one-off sort in the > vnc_keysym.h definition which is prone to future editing errors or the > one-off static sort in the code. I tossed the arguments back and > forth with my stuffed penguin and came down in favour of sorting the > array: it's a technique I've used before when I wanted robust code at > the expense of a little initialisation overhead. Why do you think > it's not a good idea? I'll happily revisit the notion. Since it's a literal array, it's sort of weird to sort it at run time. Why not just pre-sort it in the code? Heck, just write a simple program to re-output the array even in a sorted form. If you did that, the binary search thing would be fine. It's the sorting of the literal array that makes me nervous. Regards, Anthony Liguori > > I have no idea why the indenting is screwed up -- it wasn't. I think > the Christmas Elves must've got at it. > > Read and understood the remainder of the comments. I'll re-submit > the patches tomorrow -- thanks for looking. > > jch > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2 of 3] Fix keymap handling for vnc console 2008-12-16 15:32 [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console John Haxby 2008-12-16 15:46 ` [Qemu-devel] [PATCH 1 " John Haxby @ 2008-12-16 15:48 ` John Haxby 2008-12-16 15:49 ` [Qemu-devel] [PATCH 3 " John Haxby 2009-01-07 15:12 ` [Qemu-devel] [PATCH 0 " John Haxby 3 siblings, 0 replies; 9+ messages in thread From: John Haxby @ 2008-12-16 15:48 UTC (permalink / raw) To: qemu-devel Additional keysym names needed for keymaps Signed-off-by: John Haxby <john.haxby@oracle.com> vnc_keysym.h | 858 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 845 insertions(+), 13 deletions(-) diff -up qemu-0.9.1.6042/vnc_keysym.h.keymap02 qemu-0.9.1.6042/vnc_keysym.h --- qemu-0.9.1.6042/vnc_keysym.h.keymap02 2008-12-16 10:47:36.000000000 +0000 +++ qemu-0.9.1.6042/vnc_keysym.h 2008-12-16 10:47:36.000000000 +0000 @@ -203,6 +203,842 @@ static name2keysym_t name2keysym[]={ { "ydiaeresis", 0x0ff}, {"EuroSign", 0x20ac}, /* XK_EuroSign */ +/* latin 2 extensions */ +{ "Aogonek", 0x01a1}, +{ "breve", 0x01a2}, +{ "Lstroke", 0x01a3}, +{ "Lcaron", 0x01a5}, +{ "Sacute", 0x01a6}, +{ "Scaron", 0x01a9}, +{ "Scedilla", 0x01aa}, +{ "Tcaron", 0x01ab}, +{ "Zacute", 0x01ac}, +{ "Zcaron", 0x01ae}, +{ "Zabovedot", 0x01af}, +{ "aogonek", 0x01b1}, +{ "ogonek", 0x01b2}, +{ "lstroke", 0x01b3}, +{ "lcaron", 0x01b5}, +{ "sacute", 0x01b6}, +{ "caron", 0x01b7}, +{ "scaron", 0x01b9}, +{ "scedilla", 0x01ba}, +{ "tcaron", 0x01bb}, +{ "zacute", 0x01bc}, +{ "doubleacute", 0x01bd}, +{ "zcaron", 0x01be}, +{ "zabovedot", 0x01bf}, +{ "Racute", 0x01c0}, +{ "Abreve", 0x01c3}, +{ "Lacute", 0x01c5}, +{ "Cacute", 0x01c6}, +{ "Ccaron", 0x01c8}, +{ "Eogonek", 0x01ca}, +{ "Ecaron", 0x01cc}, +{ "Dcaron", 0x01cf}, +{ "Dstroke", 0x01d0}, +{ "Nacute", 0x01d1}, +{ "Ncaron", 0x01d2}, +{ "Odoubleacute", 0x01d5}, +{ "Rcaron", 0x01d8}, +{ "Uring", 0x01d9}, +{ "Udoubleacute", 0x01db}, +{ "Tcedilla", 0x01de}, +{ "racute", 0x01e0}, +{ "abreve", 0x01e3}, +{ "lacute", 0x01e5}, +{ "cacute", 0x01e6}, +{ "ccaron", 0x01e8}, +{ "eogonek", 0x01ea}, +{ "ecaron", 0x01ec}, +{ "dcaron", 0x01ef}, +{ "dstroke", 0x01f0}, +{ "nacute", 0x01f1}, +{ "ncaron", 0x01f2}, +{ "odoubleacute", 0x01f5}, +{ "udoubleacute", 0x01fb}, +{ "rcaron", 0x01f8}, +{ "uring", 0x01f9}, +{ "tcedilla", 0x01fe}, +{ "abovedot", 0x01ff}, + + /* latin3 extensions */ + { "Hstroke", 0x02a1 }, + { "Hcircumflex", 0x02a6 }, + { "Iabovedot", 0x02a9 }, + { "Gbreve", 0x02ab }, + { "Jcircumflex", 0x02ac }, + { "hstroke", 0x02b1 }, + { "hcircumflex", 0x02b6 }, + { "idotless", 0x02b9 }, + { "gbreve", 0x02bb }, + { "jcircumflex", 0x02bc }, + { "Cabovedot", 0x02c5 }, + { "Ccircumflex", 0x02c6 }, + { "Gabovedot", 0x02d5 }, + { "Gcircumflex", 0x02d8 }, + { "Ubreve", 0x02dd }, + { "Scircumflex", 0x02de }, + { "cabovedot", 0x02e5 }, + { "ccircumflex", 0x02e6 }, + { "gabovedot", 0x02f5 }, + { "gcircumflex", 0x02f8 }, + { "ubreve", 0x02fd }, + { "scircumflex", 0x02fe }, + + /* latin4 extensions */ + { "kra", 0x03a2 }, + { "kappa", 0x03a2 }, + { "Rcedilla", 0x03a3 }, + { "Itilde", 0x03a5 }, + { "Lcedilla", 0x03a6 }, + { "Emacron", 0x03aa }, + { "Gcedilla", 0x03ab }, + { "Tslash", 0x03ac }, + { "rcedilla", 0x03b3 }, + { "itilde", 0x03b5 }, + { "lcedilla", 0x03b6 }, + { "emacron", 0x03ba }, + { "gcedilla", 0x03bb }, + { "tslash", 0x03bc }, + { "ENG", 0x03bd }, + { "eng", 0x03bf }, + { "Amacron", 0x03c0 }, + { "Iogonek", 0x03c7 }, + { "Eabovedot", 0x03cc }, + { "Imacron", 0x03cf }, + { "Ncedilla", 0x03d1 }, + { "Omacron", 0x03d2 }, + { "Kcedilla", 0x03d3 }, + { "Uogonek", 0x03d9 }, + { "Utilde", 0x03dd }, + { "Umacron", 0x03de }, + { "amacron", 0x03e0 }, + { "iogonek", 0x03e7 }, + { "eabovedot", 0x03ec }, + { "imacron", 0x03ef }, + { "ncedilla", 0x03f1 }, + { "omacron", 0x03f2 }, + { "kcedilla", 0x03f3 }, + { "uogonek", 0x03f9 }, + { "utilde", 0x03fd }, + { "umacron", 0x03fe }, + + /* latin8 extensions */ + { "Babovedot", 0x1001e02 }, + { "babovedot", 0x1001e03 }, + { "Dabovedot", 0x1001e0a }, + { "Wgrave", 0x1001e80 }, + { "Wacute", 0x1001e82 }, + { "dabovedot", 0x1001e0b }, + { "Ygrave", 0x1001ef2 }, + { "Fabovedot", 0x1001e1e }, + { "fabovedot", 0x1001e1f }, + { "Mabovedot", 0x1001e40 }, + { "mabovedot", 0x1001e41 }, + { "Pabovedot", 0x1001e56 }, + { "wgrave", 0x1001e81 }, + { "pabovedot", 0x1001e57 }, + { "wacute", 0x1001e83 }, + { "Sabovedot", 0x1001e60 }, + { "ygrave", 0x1001ef3 }, + { "Wdiaeresis", 0x1001e84 }, + { "wdiaeresis", 0x1001e85 }, + { "sabovedot", 0x1001e61 }, + { "Wcircumflex", 0x1000174 }, + { "Tabovedot", 0x1001e6a }, + { "Ycircumflex", 0x1000176 }, + { "wcircumflex", 0x1000175 }, + { "tabovedot", 0x1001e6b }, + { "ycircumflex", 0x1000177 }, + + /* latin9 extensions */ + { "OE", 0x13bc }, + { "oe", 0x13bd }, + { "Ydiaeresis", 0x13be }, + + /* katakana */ + { "overline", 0x047e }, + { "kana_fullstop", 0x04a1 }, + { "kana_openingbracket", 0x04a2 }, + { "kana_closingbracket", 0x04a3 }, + { "kana_comma", 0x04a4 }, + { "kana_conjunctive", 0x04a5 }, + { "kana_middledot", 0x04a5 }, + { "kana_WO", 0x04a6 }, + { "kana_a", 0x04a7 }, + { "kana_i", 0x04a8 }, + { "kana_u", 0x04a9 }, + { "kana_e", 0x04aa }, + { "kana_o", 0x04ab }, + { "kana_ya", 0x04ac }, + { "kana_yu", 0x04ad }, + { "kana_yo", 0x04ae }, + { "kana_tsu", 0x04af }, + { "kana_tu", 0x04af }, + { "prolongedsound", 0x04b0 }, + { "kana_A", 0x04b1 }, + { "kana_I", 0x04b2 }, + { "kana_U", 0x04b3 }, + { "kana_E", 0x04b4 }, + { "kana_O", 0x04b5 }, + { "kana_KA", 0x04b6 }, + { "kana_KI", 0x04b7 }, + { "kana_KU", 0x04b8 }, + { "kana_KE", 0x04b9 }, + { "kana_KO", 0x04ba }, + { "kana_SA", 0x04bb }, + { "kana_SHI", 0x04bc }, + { "kana_SU", 0x04bd }, + { "kana_SE", 0x04be }, + { "kana_SO", 0x04bf }, + { "kana_TA", 0x04c0 }, + { "kana_CHI", 0x04c1 }, + { "kana_TI", 0x04c1 }, + { "kana_TSU", 0x04c2 }, + { "kana_TU", 0x04c2 }, + { "kana_TE", 0x04c3 }, + { "kana_TO", 0x04c4 }, + { "kana_NA", 0x04c5 }, + { "kana_NI", 0x04c6 }, + { "kana_NU", 0x04c7 }, + { "kana_NE", 0x04c8 }, + { "kana_NO", 0x04c9 }, + { "kana_HA", 0x04ca }, + { "kana_HI", 0x04cb }, + { "kana_FU", 0x04cc }, + { "kana_HU", 0x04cc }, + { "kana_HE", 0x04cd }, + { "kana_HO", 0x04ce }, + { "kana_MA", 0x04cf }, + { "kana_MI", 0x04d0 }, + { "kana_MU", 0x04d1 }, + { "kana_ME", 0x04d2 }, + { "kana_MO", 0x04d3 }, + { "kana_YA", 0x04d4 }, + { "kana_YU", 0x04d5 }, + { "kana_YO", 0x04d6 }, + { "kana_RA", 0x04d7 }, + { "kana_RI", 0x04d8 }, + { "kana_RU", 0x04d9 }, + { "kana_RE", 0x04da }, + { "kana_RO", 0x04db }, + { "kana_WA", 0x04dc }, + { "kana_N", 0x04dd }, + { "voicedsound", 0x04de }, + { "semivoicedsound", 0x04df }, + { "kana_switch", 0xff7e }, + + /* arabic */ + { "Farsi_0", 0x10006f0 }, + { "Farsi_1", 0x10006f1 }, + { "Farsi_2", 0x10006f2 }, + { "Farsi_3", 0x10006f3 }, + { "Farsi_4", 0x10006f4 }, + { "Farsi_5", 0x10006f5 }, + { "Farsi_6", 0x10006f6 }, + { "Farsi_7", 0x10006f7 }, + { "Farsi_8", 0x10006f8 }, + { "Farsi_9", 0x10006f9 }, + { "Arabic_percent", 0x100066a }, + { "Arabic_superscript_alef", 0x1000670 }, + { "Arabic_tteh", 0x1000679 }, + { "Arabic_peh", 0x100067e }, + { "Arabic_tcheh", 0x1000686 }, + { "Arabic_ddal", 0x1000688 }, + { "Arabic_rreh", 0x1000691 }, + { "Arabic_comma", 0x05ac }, + { "Arabic_fullstop", 0x10006d4 }, + { "Arabic_0", 0x1000660 }, + { "Arabic_1", 0x1000661 }, + { "Arabic_2", 0x1000662 }, + { "Arabic_3", 0x1000663 }, + { "Arabic_4", 0x1000664 }, + { "Arabic_5", 0x1000665 }, + { "Arabic_6", 0x1000666 }, + { "Arabic_7", 0x1000667 }, + { "Arabic_8", 0x1000668 }, + { "Arabic_9", 0x1000669 }, + { "Arabic_semicolon", 0x05bb }, + { "Arabic_question_mark", 0x05bf }, + { "Arabic_hamza", 0x05c1 }, + { "Arabic_maddaonalef", 0x05c2 }, + { "Arabic_hamzaonalef", 0x05c3 }, + { "Arabic_hamzaonwaw", 0x05c4 }, + { "Arabic_hamzaunderalef", 0x05c5 }, + { "Arabic_hamzaonyeh", 0x05c6 }, + { "Arabic_alef", 0x05c7 }, + { "Arabic_beh", 0x05c8 }, + { "Arabic_tehmarbuta", 0x05c9 }, + { "Arabic_teh", 0x05ca }, + { "Arabic_theh", 0x05cb }, + { "Arabic_jeem", 0x05cc }, + { "Arabic_hah", 0x05cd }, + { "Arabic_khah", 0x05ce }, + { "Arabic_dal", 0x05cf }, + { "Arabic_thal", 0x05d0 }, + { "Arabic_ra", 0x05d1 }, + { "Arabic_zain", 0x05d2 }, + { "Arabic_seen", 0x05d3 }, + { "Arabic_sheen", 0x05d4 }, + { "Arabic_sad", 0x05d5 }, + { "Arabic_dad", 0x05d6 }, + { "Arabic_tah", 0x05d7 }, + { "Arabic_zah", 0x05d8 }, + { "Arabic_ain", 0x05d9 }, + { "Arabic_ghain", 0x05da }, + { "Arabic_tatweel", 0x05e0 }, + { "Arabic_feh", 0x05e1 }, + { "Arabic_qaf", 0x05e2 }, + { "Arabic_kaf", 0x05e3 }, + { "Arabic_lam", 0x05e4 }, + { "Arabic_meem", 0x05e5 }, + { "Arabic_noon", 0x05e6 }, + { "Arabic_ha", 0x05e7 }, + { "Arabic_heh", 0x05e7 }, + { "Arabic_waw", 0x05e8 }, + { "Arabic_alefmaksura", 0x05e9 }, + { "Arabic_yeh", 0x05ea }, + { "Arabic_fathatan", 0x05eb }, + { "Arabic_dammatan", 0x05ec }, + { "Arabic_kasratan", 0x05ed }, + { "Arabic_fatha", 0x05ee }, + { "Arabic_damma", 0x05ef }, + { "Arabic_kasra", 0x05f0 }, + { "Arabic_shadda", 0x05f1 }, + { "Arabic_sukun", 0x05f2 }, + { "Arabic_madda_above", 0x1000653 }, + { "Arabic_hamza_above", 0x1000654 }, + { "Arabic_hamza_below", 0x1000655 }, + { "Arabic_jeh", 0x1000698 }, + { "Arabic_veh", 0x10006a4 }, + { "Arabic_keheh", 0x10006a9 }, + { "Arabic_gaf", 0x10006af }, + { "Arabic_noon_ghunna", 0x10006ba }, + { "Arabic_heh_doachashmee", 0x10006be }, + { "Farsi_yeh", 0x10006cc }, + { "Arabic_farsi_yeh", 0x10006cc }, + { "Arabic_yeh_baree", 0x10006d2 }, + { "Arabic_heh_goal", 0x10006c1 }, + { "Arabic_switch", 0xff7e }, + + /* japanese keyboard */ + { "Kanji", 0xff21 }, + { "BackApostrophe", 0xff21 }, /* ??? */ + { "Muhenkan", 0xff22 }, + { "Henkan_Mode", 0xff23 }, + { "Henkan", 0xff23 }, + { "Henkan_Mode_Real", 0xff23 }, /* deprecated */ + { "Romaji", 0xff24 }, + { "Hiragana", 0xff25 }, + { "Katakana_Real", 0xff25 }, /* deprecated */ + { "Katakana", 0xff26 }, + { "Hiragana_Katakana", 0xff27 }, + { "Zenkaku", 0xff28 }, + { "Hankaku", 0xff29 }, + { "Zenkaku_Hankaku", 0xff2a }, + { "Touroku", 0xff2b }, + { "Massyo", 0xff2c }, + { "Kana_Lock", 0xff2d }, + { "Kana_Shift", 0xff2e }, + { "Eisu_Shift", 0xff2f }, + { "Eisu_toggle", 0xff30 }, + { "Kanji_Bangou", 0xff37 }, + { "Zen_Koho", 0xff3d }, + { "Mae_Koho", 0xff3e }, + { "Henkan_Mode_Ultra", 0xff3e }, /* deprecated */ + { "backslash_ja", 0xffa5 }, /* ??? */ + + /* dead keys */ + { "dead_grave", 0xfe50 }, + { "dead_acute", 0xfe51 }, + { "dead_circumflex", 0xfe52 }, + { "dead_tilde", 0xfe53 }, + { "dead_macron", 0xfe54 }, + { "dead_breve", 0xfe55 }, + { "dead_abovedot", 0xfe56 }, + { "dead_diaeresis", 0xfe57 }, + { "dead_abovering", 0xfe58 }, + { "dead_doubleacute", 0xfe59 }, + { "dead_caron", 0xfe5a }, + { "dead_cedilla", 0xfe5b }, + { "dead_ogonek", 0xfe5c }, + { "dead_iota", 0xfe5d }, + { "dead_voiced_sound", 0xfe5e }, + { "dead_semivoiced_sound", 0xfe5f }, + { "dead_belowdot", 0xfe60 }, + { "dead_hook", 0xfe61 }, + { "dead_horn", 0xfe62 }, + { "dead_stroke", 0xfe63 }, + { "dead_abovecomma", 0xfe64 }, + { "dead_psili", 0xfe64 }, + { "dead_abovereversedcomma", 0xfe65 }, + { "dead_dasia", 0xfe66 }, + { "dead_belowring", 0xfe67 }, + { "dead_belowmacron", 0xfe68 }, + { "dead_belowcircumflex", 0xfe69 }, + { "dead_belowtilde", 0xfe6a }, + { "dead_belowbreve", 0xfe6b }, + { "dead_belowdiaeresis", 0xfe6c }, + + /* cyrillic */ + { "Cyrillic_GHE_bar", 0x1000492 }, + { "Cyrillic_ghe_bar", 0x1000493 }, + { "Cyrillic_ZHE_descender", 0x1000496 }, + { "Cyrillic_zhe_descender", 0x1000497 }, + { "Cyrillic_KA_descender", 0x100049a }, + { "Cyrillic_ka_descender", 0x100049b }, + { "Cyrillic_KA_vertstroke", 0x100049c }, + { "Cyrillic_ka_vertstroke", 0x100049d }, + { "Cyrillic_EN_descender", 0x10004a2 }, + { "Cyrillic_en_descender", 0x10004a3 }, + { "Cyrillic_U_straight", 0x10004ae }, + { "Cyrillic_u_straight", 0x10004af }, + { "Cyrillic_U_straight_bar", 0x10004b0 }, + { "Cyrillic_u_straight_bar", 0x10004b1 }, + { "Cyrillic_HA_descender", 0x10004b2 }, + { "Cyrillic_ha_descender", 0x10004b3 }, + { "Cyrillic_CHE_descender", 0x10004b6 }, + { "Cyrillic_che_descender", 0x10004b7 }, + { "Cyrillic_CHE_vertstroke", 0x10004b8 }, + { "Cyrillic_che_vertstroke", 0x10004b9 }, + { "Cyrillic_SHHA", 0x10004ba }, + { "Cyrillic_shha", 0x10004bb }, + { "Cyrillic_SCHWA", 0x10004d8 }, + { "Cyrillic_schwa", 0x10004d9 }, + { "Cyrillic_I_macron", 0x10004e2 }, + { "Cyrillic_i_macron", 0x10004e3 }, + { "Cyrillic_O_bar", 0x10004e8 }, + { "Cyrillic_o_bar", 0x10004e9 }, + { "Cyrillic_U_macron", 0x10004ee }, + { "Cyrillic_u_macron", 0x10004ef }, + { "Serbian_dje", 0x06a1 }, + { "Macedonia_gje", 0x06a2 }, + { "Cyrillic_io", 0x06a3 }, + { "Ukrainian_ie", 0x06a4 }, + { "Ukranian_je", 0x06a4 }, + { "Macedonia_dse", 0x06a5 }, + { "Ukrainian_i", 0x06a6 }, + { "Ukranian_i", 0x06a6 }, + { "Ukrainian_yi", 0x06a7 }, + { "Ukranian_yi", 0x06a7 }, + { "Cyrillic_je", 0x06a8 }, + { "Serbian_je", 0x06a8 }, + { "Cyrillic_lje", 0x06a9 }, + { "Serbian_lje", 0x06a9 }, + { "Cyrillic_nje", 0x06aa }, + { "Serbian_nje", 0x06aa }, + { "Serbian_tshe", 0x06ab }, + { "Macedonia_kje", 0x06ac }, + { "Ukrainian_ghe_with_upturn", 0x06ad }, + { "Byelorussian_shortu", 0x06ae }, + { "Cyrillic_dzhe", 0x06af }, + { "Serbian_dze", 0x06af }, + { "numerosign", 0x06b0 }, + { "Serbian_DJE", 0x06b1 }, + { "Macedonia_GJE", 0x06b2 }, + { "Cyrillic_IO", 0x06b3 }, + { "Ukrainian_IE", 0x06b4 }, + { "Ukranian_JE", 0x06b4 }, + { "Macedonia_DSE", 0x06b5 }, + { "Ukrainian_I", 0x06b6 }, + { "Ukranian_I", 0x06b6 }, + { "Ukrainian_YI", 0x06b7 }, + { "Ukranian_YI", 0x06b7 }, + { "Cyrillic_JE", 0x06b8 }, + { "Serbian_JE", 0x06b8 }, + { "Cyrillic_LJE", 0x06b9 }, + { "Serbian_LJE", 0x06b9 }, + { "Cyrillic_NJE", 0x06ba }, + { "Serbian_NJE", 0x06ba }, + { "Serbian_TSHE", 0x06bb }, + { "Macedonia_KJE", 0x06bc }, + { "Ukrainian_GHE_WITH_UPTURN", 0x06bd }, + { "Byelorussian_SHORTU", 0x06be }, + { "Cyrillic_DZHE", 0x06bf }, + { "Serbian_DZE", 0x06bf }, + { "Cyrillic_yu", 0x06c0 }, + { "Cyrillic_a", 0x06c1 }, + { "Cyrillic_be", 0x06c2 }, + { "Cyrillic_tse", 0x06c3 }, + { "Cyrillic_de", 0x06c4 }, + { "Cyrillic_ie", 0x06c5 }, + { "Cyrillic_ef", 0x06c6 }, + { "Cyrillic_ghe", 0x06c7 }, + { "Cyrillic_ha", 0x06c8 }, + { "Cyrillic_i", 0x06c9 }, + { "Cyrillic_shorti", 0x06ca }, + { "Cyrillic_ka", 0x06cb }, + { "Cyrillic_el", 0x06cc }, + { "Cyrillic_em", 0x06cd }, + { "Cyrillic_en", 0x06ce }, + { "Cyrillic_o", 0x06cf }, + { "Cyrillic_pe", 0x06d0 }, + { "Cyrillic_ya", 0x06d1 }, + { "Cyrillic_er", 0x06d2 }, + { "Cyrillic_es", 0x06d3 }, + { "Cyrillic_te", 0x06d4 }, + { "Cyrillic_u", 0x06d5 }, + { "Cyrillic_zhe", 0x06d6 }, + { "Cyrillic_ve", 0x06d7 }, + { "Cyrillic_softsign", 0x06d8 }, + { "Cyrillic_yeru", 0x06d9 }, + { "Cyrillic_ze", 0x06da }, + { "Cyrillic_sha", 0x06db }, + { "Cyrillic_e", 0x06dc }, + { "Cyrillic_shcha", 0x06dd }, + { "Cyrillic_che", 0x06de }, + { "Cyrillic_hardsign", 0x06df }, + { "Cyrillic_YU", 0x06e0 }, + { "Cyrillic_A", 0x06e1 }, + { "Cyrillic_BE", 0x06e2 }, + { "Cyrillic_TSE", 0x06e3 }, + { "Cyrillic_DE", 0x06e4 }, + { "Cyrillic_IE", 0x06e5 }, + { "Cyrillic_EF", 0x06e6 }, + { "Cyrillic_GHE", 0x06e7 }, + { "Cyrillic_HA", 0x06e8 }, + { "Cyrillic_I", 0x06e9 }, + { "Cyrillic_SHORTI", 0x06ea }, + { "Cyrillic_KA", 0x06eb }, + { "Cyrillic_EL", 0x06ec }, + { "Cyrillic_EM", 0x06ed }, + { "Cyrillic_EN", 0x06ee }, + { "Cyrillic_O", 0x06ef }, + { "Cyrillic_PE", 0x06f0 }, + { "Cyrillic_YA", 0x06f1 }, + { "Cyrillic_ER", 0x06f2 }, + { "Cyrillic_ES", 0x06f3 }, + { "Cyrillic_TE", 0x06f4 }, + { "Cyrillic_U", 0x06f5 }, + { "Cyrillic_ZHE", 0x06f6 }, + { "Cyrillic_VE", 0x06f7 }, + { "Cyrillic_SOFTSIGN", 0x06f8 }, + { "Cyrillic_YERU", 0x06f9 }, + { "Cyrillic_ZE", 0x06fa }, + { "Cyrillic_SHA", 0x06fb }, + { "Cyrillic_E", 0x06fc }, + { "Cyrillic_SHCHA", 0x06fd }, + { "Cyrillic_CHE", 0x06fe }, + { "Cyrillic_HARDSIGN", 0x06ff }, + + /* Greek */ + { "Greek_ALPHAaccent", 0x07a1 }, + { "Greek_EPSILONaccent", 0x07a2 }, + { "Greek_ETAaccent", 0x07a3 }, + { "Greek_IOTAaccent", 0x07a4 }, + { "Greek_IOTAdieresis", 0x07a5 }, + { "Greek_IOTAdiaeresis", 0x07a5 }, + { "Greek_OMICRONaccent", 0x07a7 }, + { "Greek_UPSILONaccent", 0x07a8 }, + { "Greek_UPSILONdieresis", 0x07a9 }, + { "Greek_OMEGAaccent", 0x07ab }, + { "Greek_accentdieresis", 0x07ae }, + { "Greek_horizbar", 0x07af }, + { "Greek_alphaaccent", 0x07b1 }, + { "Greek_epsilonaccent", 0x07b2 }, + { "Greek_etaaccent", 0x07b3 }, + { "Greek_iotaaccent", 0x07b4 }, + { "Greek_iotadieresis", 0x07b5 }, + { "Greek_iotaaccentdieresis", 0x07b6 }, + { "Greek_omicronaccent", 0x07b7 }, + { "Greek_upsilonaccent", 0x07b8 }, + { "Greek_upsilondieresis", 0x07b9 }, + { "Greek_upsilonaccentdieresis", 0x07ba }, + { "Greek_omegaaccent", 0x07bb }, + { "Greek_ALPHA", 0x07c1 }, + { "Greek_BETA", 0x07c2 }, + { "Greek_GAMMA", 0x07c3 }, + { "Greek_DELTA", 0x07c4 }, + { "Greek_EPSILON", 0x07c5 }, + { "Greek_ZETA", 0x07c6 }, + { "Greek_ETA", 0x07c7 }, + { "Greek_THETA", 0x07c8 }, + { "Greek_IOTA", 0x07c9 }, + { "Greek_KAPPA", 0x07ca }, + { "Greek_LAMDA", 0x07cb }, + { "Greek_LAMBDA", 0x07cb }, + { "Greek_MU", 0x07cc }, + { "Greek_NU", 0x07cd }, + { "Greek_XI", 0x07ce }, + { "Greek_OMICRON", 0x07cf }, + { "Greek_PI", 0x07d0 }, + { "Greek_RHO", 0x07d1 }, + { "Greek_SIGMA", 0x07d2 }, + { "Greek_TAU", 0x07d4 }, + { "Greek_UPSILON", 0x07d5 }, + { "Greek_PHI", 0x07d6 }, + { "Greek_CHI", 0x07d7 }, + { "Greek_PSI", 0x07d8 }, + { "Greek_OMEGA", 0x07d9 }, + { "Greek_alpha", 0x07e1 }, + { "Greek_beta", 0x07e2 }, + { "Greek_gamma", 0x07e3 }, + { "Greek_delta", 0x07e4 }, + { "Greek_epsilon", 0x07e5 }, + { "Greek_zeta", 0x07e6 }, + { "Greek_eta", 0x07e7 }, + { "Greek_theta", 0x07e8 }, + { "Greek_iota", 0x07e9 }, + { "Greek_kappa", 0x07ea }, + { "Greek_lamda", 0x07eb }, + { "Greek_lambda", 0x07eb }, + { "Greek_mu", 0x07ec }, + { "Greek_nu", 0x07ed }, + { "Greek_xi", 0x07ee }, + { "Greek_omicron", 0x07ef }, + { "Greek_pi", 0x07f0 }, + { "Greek_rho", 0x07f1 }, + { "Greek_sigma", 0x07f2 }, + { "Greek_finalsmallsigma", 0x07f3 }, + { "Greek_tau", 0x07f4 }, + { "Greek_upsilon", 0x07f5 }, + { "Greek_phi", 0x07f6 }, + { "Greek_chi", 0x07f7 }, + { "Greek_psi", 0x07f8 }, + { "Greek_omega", 0x07f9 }, + { "Greek_switch", 0xff7e }, + + /* technical */ + { "leftradical", 0x08a1 }, + { "topleftradical", 0x08a2 }, + { "horizconnector", 0x08a3 }, + { "topintegral", 0x08a4 }, + { "botintegral", 0x08a5 }, + { "vertconnector", 0x08a6 }, + { "topleftsqbracket", 0x08a7 }, + { "botleftsqbracket", 0x08a8 }, + { "toprightsqbracket", 0x08a9 }, + { "botrightsqbracket", 0x08aa }, + { "topleftparens", 0x08ab }, + { "botleftparens", 0x08ac }, + { "toprightparens", 0x08ad }, + { "botrightparens", 0x08ae }, + { "leftmiddlecurlybrace", 0x08af }, + { "rightmiddlecurlybrace", 0x08b0 }, + { "topleftsummation", 0x08b1 }, + { "botleftsummation", 0x08b2 }, + { "topvertsummationconnector", 0x08b3 }, + { "botvertsummationconnector", 0x08b4 }, + { "toprightsummation", 0x08b5 }, + { "botrightsummation", 0x08b6 }, + { "rightmiddlesummation", 0x08b7 }, + { "lessthanequal", 0x08bc }, + { "notequal", 0x08bd }, + { "greaterthanequal", 0x08be }, + { "integral", 0x08bf }, + { "therefore", 0x08c0 }, + { "variation", 0x08c1 }, + { "infinity", 0x08c2 }, + { "nabla", 0x08c5 }, + { "approximate", 0x08c8 }, + { "similarequal", 0x08c9 }, + { "ifonlyif", 0x08cd }, + { "implies", 0x08ce }, + { "identical", 0x08cf }, + { "radical", 0x08d6 }, + { "includedin", 0x08da }, + { "includes", 0x08db }, + { "intersection", 0x08dc }, + { "union", 0x08dd }, + { "logicaland", 0x08de }, + { "logicalor", 0x08df }, + { "partialderivative", 0x08ef }, + { "function", 0x08f6 }, + { "leftarrow", 0x08fb }, + { "uparrow", 0x08fc }, + { "rightarrow", 0x08fd }, + { "downarrow", 0x08fe }, + + /* publishing */ + { "emspace", 0x0aa1 }, + { "enspace", 0x0aa2 }, + { "em3space", 0x0aa3 }, + { "em4space", 0x0aa4 }, + { "digitspace", 0x0aa5 }, + { "punctspace", 0x0aa6 }, + { "thinspace", 0x0aa7 }, + { "hairspace", 0x0aa8 }, + { "emdash", 0x0aa9 }, + { "endash", 0x0aaa }, + { "signifblank", 0x0aac }, + { "ellipsis", 0x0aae }, + { "doubbaselinedot", 0x0aaf }, + { "onethird", 0x0ab0 }, + { "twothirds", 0x0ab1 }, + { "onefifth", 0x0ab2 }, + { "twofifths", 0x0ab3 }, + { "threefifths", 0x0ab4 }, + { "fourfifths", 0x0ab5 }, + { "onesixth", 0x0ab6 }, + { "fivesixths", 0x0ab7 }, + { "careof", 0x0ab8 }, + { "figdash", 0x0abb }, + { "leftanglebracket", 0x0abc }, + { "decimalpoint", 0x0abd }, + { "rightanglebracket", 0x0abe }, + { "marker", 0x0abf }, + { "oneeighth", 0x0ac3 }, + { "threeeighths", 0x0ac4 }, + { "fiveeighths", 0x0ac5 }, + { "seveneighths", 0x0ac6 }, + { "trademark", 0x0ac9 }, + { "signaturemark", 0x0aca }, + { "trademarkincircle", 0x0acb }, + { "leftopentriangle", 0x0acc }, + { "rightopentriangle", 0x0acd }, + { "emopencircle", 0x0ace }, + { "emopenrectangle", 0x0acf }, + { "leftsinglequotemark", 0x0ad0 }, + { "rightsinglequotemark", 0x0ad1 }, + { "leftdoublequotemark", 0x0ad2 }, + { "rightdoublequotemark", 0x0ad3 }, + { "prescription", 0x0ad4 }, + { "minutes", 0x0ad6 }, + { "seconds", 0x0ad7 }, + { "latincross", 0x0ad9 }, + { "hexagram", 0x0ada }, + { "filledrectbullet", 0x0adb }, + { "filledlefttribullet", 0x0adc }, + { "filledrighttribullet", 0x0add }, + { "emfilledcircle", 0x0ade }, + { "emfilledrect", 0x0adf }, + { "enopencircbullet", 0x0ae0 }, + { "enopensquarebullet", 0x0ae1 }, + { "openrectbullet", 0x0ae2 }, + { "opentribulletup", 0x0ae3 }, + { "opentribulletdown", 0x0ae4 }, + { "openstar", 0x0ae5 }, + { "enfilledcircbullet", 0x0ae6 }, + { "enfilledsqbullet", 0x0ae7 }, + { "filledtribulletup", 0x0ae8 }, + { "filledtribulletdown", 0x0ae9 }, + { "leftpointer", 0x0aea }, + { "rightpointer", 0x0aeb }, + { "club", 0x0aec }, + { "diamond", 0x0aed }, + { "heart", 0x0aee }, + { "maltesecross", 0x0af0 }, + { "dagger", 0x0af1 }, + { "doubledagger", 0x0af2 }, + { "checkmark", 0x0af3 }, + { "ballotcross", 0x0af4 }, + { "musicalsharp", 0x0af5 }, + { "musicalflat", 0x0af6 }, + { "malesymbol", 0x0af7 }, + { "femalesymbol", 0x0af8 }, + { "telephone", 0x0af9 }, + { "telephonerecorder", 0x0afa }, + { "phonographcopyright", 0x0afb }, + { "caret", 0x0afc }, + { "singlelowquotemark", 0x0afd }, + { "doublelowquotemark", 0x0afe }, + { "cursor", 0x0aff }, + + /* Caucasus */ + { "Xabovedot", 0x1001e8a }, + { "Ibreve", 0x100012c }, + { "Zstroke", 0x10001b5 }, + { "Gcaron", 0x10001e6 }, + { "Ocaron", 0x10001d1 }, + { "Obarred", 0x100019f }, + { "xabovedot", 0x1001e8b }, + { "ibreve", 0x100012d }, + { "zstroke", 0x10001b6 }, + { "gcaron", 0x10001e7 }, + { "ocaron", 0x10001d2 }, + { "obarred", 0x1000275 }, + { "SCHWA", 0x100018f }, + { "schwa", 0x1000259 }, + { "Lbelowdot", 0x1001e36 }, + { "lbelowdot", 0x1001e37 }, + + /* Thai */ + { "Thai_kokai", 0x0da1 }, + { "Thai_khokhai", 0x0da2 }, + { "Thai_khokhuat", 0x0da3 }, + { "Thai_khokhwai", 0x0da4 }, + { "Thai_khokhon", 0x0da5 }, + { "Thai_khorakhang", 0x0da6 }, + { "Thai_ngongu", 0x0da7 }, + { "Thai_chochan", 0x0da8 }, + { "Thai_choching", 0x0da9 }, + { "Thai_chochang", 0x0daa }, + { "Thai_soso", 0x0dab }, + { "Thai_chochoe", 0x0dac }, + { "Thai_yoying", 0x0dad }, + { "Thai_dochada", 0x0dae }, + { "Thai_topatak", 0x0daf }, + { "Thai_thothan", 0x0db0 }, + { "Thai_thonangmontho", 0x0db1 }, + { "Thai_thophuthao", 0x0db2 }, + { "Thai_nonen", 0x0db3 }, + { "Thai_dodek", 0x0db4 }, + { "Thai_totao", 0x0db5 }, + { "Thai_thothung", 0x0db6 }, + { "Thai_thothahan", 0x0db7 }, + { "Thai_thothong", 0x0db8 }, + { "Thai_nonu", 0x0db9 }, + { "Thai_bobaimai", 0x0dba }, + { "Thai_popla", 0x0dbb }, + { "Thai_phophung", 0x0dbc }, + { "Thai_fofa", 0x0dbd }, + { "Thai_phophan", 0x0dbe }, + { "Thai_fofan", 0x0dbf }, + { "Thai_phosamphao", 0x0dc0 }, + { "Thai_moma", 0x0dc1 }, + { "Thai_yoyak", 0x0dc2 }, + { "Thai_rorua", 0x0dc3 }, + { "Thai_ru", 0x0dc4 }, + { "Thai_loling", 0x0dc5 }, + { "Thai_lu", 0x0dc6 }, + { "Thai_wowaen", 0x0dc7 }, + { "Thai_sosala", 0x0dc8 }, + { "Thai_sorusi", 0x0dc9 }, + { "Thai_sosua", 0x0dca }, + { "Thai_hohip", 0x0dcb }, + { "Thai_lochula", 0x0dcc }, + { "Thai_oang", 0x0dcd }, + { "Thai_honokhuk", 0x0dce }, + { "Thai_paiyannoi", 0x0dcf }, + { "Thai_saraa", 0x0dd0 }, + { "Thai_maihanakat", 0x0dd1 }, + { "Thai_saraaa", 0x0dd2 }, + { "Thai_saraam", 0x0dd3 }, + { "Thai_sarai", 0x0dd4 }, + { "Thai_saraii", 0x0dd5 }, + { "Thai_saraue", 0x0dd6 }, + { "Thai_sarauee", 0x0dd7 }, + { "Thai_sarau", 0x0dd8 }, + { "Thai_sarauu", 0x0dd9 }, + { "Thai_phinthu", 0x0dda }, + { "Thai_maihanakat_maitho", 0x0dde }, + { "Thai_baht", 0x0ddf }, + { "Thai_sarae", 0x0de0 }, + { "Thai_saraae", 0x0de1 }, + { "Thai_sarao", 0x0de2 }, + { "Thai_saraaimaimuan", 0x0de3 }, + { "Thai_saraaimaimalai", 0x0de4 }, + { "Thai_lakkhangyao", 0x0de5 }, + { "Thai_maiyamok", 0x0de6 }, + { "Thai_maitaikhu", 0x0de7 }, + { "Thai_maiek", 0x0de8 }, + { "Thai_maitho", 0x0de9 }, + { "Thai_maitri", 0x0dea }, + { "Thai_maichattawa", 0x0deb }, + { "Thai_thanthakhat", 0x0dec }, + { "Thai_nikhahit", 0x0ded }, + { "Thai_leksun", 0x0df0 }, + { "Thai_leknung", 0x0df1 }, + { "Thai_leksong", 0x0df2 }, + { "Thai_leksam", 0x0df3 }, + { "Thai_leksi", 0x0df4 }, + { "Thai_lekha", 0x0df5 }, + { "Thai_lekhok", 0x0df6 }, + { "Thai_lekchet", 0x0df7 }, + { "Thai_lekpaet", 0x0df8 }, + { "Thai_lekkao", 0x0df9 }, + /* modifiers */ {"Control_L", 0xffe3}, /* XK_Control_L */ {"Control_R", 0xffe4}, /* XK_Control_R */ @@ -215,6 +1051,7 @@ static name2keysym_t name2keysym[]={ {"Shift_R", 0xffe2}, /* XK_Shift_R */ {"Super_L", 0xffeb}, /* XK_Super_L */ {"Super_R", 0xffec}, /* XK_Super_R */ +{"ISO_Level3_Shift", 0xfe03}, /* XK_ISO_Level3_Shift */ /* special keys */ {"BackSpace", 0xff08}, /* XK_BackSpace */ @@ -279,24 +1116,19 @@ static name2keysym_t name2keysym[]={ {"KP_Multiply", 0xffaa}, /* XK_KP_Multiply */ {"KP_Subtract", 0xffad}, /* XK_KP_Subtract */ {"help", 0xff6a}, /* XK_Help */ + { "Break", 0xff6b }, {"Menu", 0xff67}, /* XK_Menu */ {"Print", 0xff61}, /* XK_Print */ + { "Execute", 0xff62 }, {"Mode_switch", 0xff7e}, /* XK_Mode_switch */ {"Num_Lock", 0xff7f}, /* XK_Num_Lock */ {"Pause", 0xff13}, /* XK_Pause */ {"Escape", 0xff1b}, /* XK_Escape */ +{"ISO_Left_Tab", 0xfe20},/* XK_ISO_Left_Tab */ + { "Multi_key", 0xff20 }, + { "ISO_Next_Group", 0xfe08 }, + { "ISO_First_Group", 0xfe0c }, + { "ISO_Last_Group", 0xfe0e }, - /* localized keys */ -{"BackApostrophe", 0xff21}, -{"Muhenkan", 0xff22}, -{"Katakana", 0xff27}, -{"Hankaku", 0xff29}, -{"Zenkaku_Hankaku", 0xff2a}, -{"Henkan_Mode_Real", 0xff23}, -{"Henkan_Mode_Ultra", 0xff3e}, -{"backslash_ja", 0xffa5}, -{"Katakana_Real", 0xff25}, -{"Eisu_toggle", 0xff30}, - -{0,0}, + {0,0}, }; ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 3 of 3] Fix keymap handling for vnc console 2008-12-16 15:32 [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console John Haxby 2008-12-16 15:46 ` [Qemu-devel] [PATCH 1 " John Haxby 2008-12-16 15:48 ` [Qemu-devel] [PATCH 2 " John Haxby @ 2008-12-16 15:49 ` John Haxby 2009-01-07 15:12 ` [Qemu-devel] [PATCH 0 " John Haxby 3 siblings, 0 replies; 9+ messages in thread From: John Haxby @ 2008-12-16 15:49 UTC (permalink / raw) To: qemu-devel Corrected keymap definitions Signed-off-by: John Haxby <john.haxby@oracle.com> common | 7 +-- da | 24 +++++++++--- de | 31 ++++++++++++--- en-gb | 14 ++++++- es | 36 +++++++++++++++--- et | 83 +++++++++++++++++++++++++++++++++++++++-- fi | 123 +++++++++++++++++++++++++++++--------------------------------- fo | 99 ++++++++++++++++++++++++++++++++++++++++++++++--- fr | 32 +++++++++++++--- fr-be | 12 ++++-- hr | 39 ++++++++++++------- hu | 114 ++++++++++++++++++++++++++++++++++++++------------------- is | 89 +++++++++++++++++++++----------------------- it | 42 ++++++++++++++------- modifiers | 1 nl | 83 +++++++++++++++++++++++++++++++++++++++-- nl-be | 65 ++++++++++++++++++++++++++++++++ no | 24 +++++++++--- tr | 88 ++++++++++++++++++-------------------------- 19 files changed, 726 insertions(+), 280 deletions(-) diff -up qemu-0.9.1.6042/keymaps/ar.keymap03 qemu-0.9.1.6042/keymaps/ar diff -up qemu-0.9.1.6042/keymaps/common.keymap03 qemu-0.9.1.6042/keymaps/common --- qemu-0.9.1.6042/keymaps/common.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/common 2008-12-16 09:12:19.000000000 +0000 @@ -84,10 +84,10 @@ F12 0x58 localstate # Printscreen really requires four scancodes (0xe0, 0x2a, 0xe0, 0x37), # but (0xe0, 0x37) seems to work. Print 0xb7 localstate -Sys_Req 0xb7 localstate -Execute 0xb7 localstate +Sys_Req 0x54 localstate Scroll_Lock 0x46 - +Pause 0xc5 localstate +Break 0xc6 localstate # # Insert - PgDown # @@ -117,7 +117,6 @@ KP_Add 0x4e KP_Enter 0x9c KP_Decimal 0x53 numlock -KP_Separator 0x53 numlock KP_Delete 0x53 KP_0 0x52 numlock diff -up qemu-0.9.1.6042/keymaps/da.keymap03 qemu-0.9.1.6042/keymaps/da --- qemu-0.9.1.6042/keymaps/da.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/da 2008-12-16 09:13:22.000000000 +0000 @@ -39,12 +39,14 @@ dead_acute 0x0d dead_grave 0x0d shift bar 0x0d altgr brokenbar 0x0d shift altgr +at 0x10 altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr Lstroke 0x11 shift altgr EuroSign 0x12 altgr cent 0x12 shift altgr registered 0x13 altgr +registered 0x13 shift altgr thorn 0x14 altgr THORN 0x14 shift altgr leftarrow 0x15 altgr @@ -77,13 +79,19 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr ae 0x27 AE 0x27 shift +dead_acute 0x27 altgr +dead_doubleacute 0x27 shift altgr oslash 0x28 -Ooblique 0x28 shift +Oslash 0x28 shift +dead_circumflex 0x28 altgr dead_caron 0x28 shift altgr onehalf 0x29 section 0x29 shift @@ -94,11 +102,17 @@ asterisk 0x2b shift dead_doubleacute 0x2b altgr multiply 0x2b shift altgr guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr copyright 0x2e altgr +copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 @@ -111,10 +125,8 @@ periodcentered 0x34 altgr dead_abovedot 0x34 shift altgr minus 0x35 underscore 0x35 shift -hyphen 0x35 altgr -macron 0x35 shift altgr +dead_belowdot 0x35 altgr +dead_abovedot 0x35 shift altgr nobreakspace 0x39 altgr -less 0x56 -greater 0x56 shift backslash 0x56 altgr notsign 0x56 shift altgr diff -up qemu-0.9.1.6042/keymaps/de-ch.keymap03 qemu-0.9.1.6042/keymaps/de-ch diff -up qemu-0.9.1.6042/keymaps/de.keymap03 qemu-0.9.1.6042/keymaps/de --- qemu-0.9.1.6042/keymaps/de.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/de 2008-12-16 09:15:08.000000000 +0000 @@ -17,7 +17,7 @@ percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr ampersand 0x07 shift -threequarters 0x07 altgr +notsign 0x07 altgr fiveeighths 0x07 shift altgr slash 0x08 shift braceleft 0x08 altgr @@ -30,19 +30,21 @@ bracketright 0x0a altgr plusminus 0x0a shift altgr equal 0x0b shift braceright 0x0b altgr +degree 0x0b shift altgr ssharp 0x0c question 0x0c shift backslash 0x0c altgr questiondown 0x0c shift altgr -acute 0x0d dead_acute 0x0d -grave 0x0d shift dead_grave 0x0d shift dead_cedilla 0x0d altgr dead_ogonek 0x0d shift altgr at 0x10 altgr Greek_OMEGA 0x10 shift altgr +lstroke 0x11 altgr +Lstroke 0x11 shift altgr EuroSign 0x12 altgr +EuroSign 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr tslash 0x14 altgr @@ -55,7 +57,7 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr udiaeresis 0x1a @@ -64,11 +66,12 @@ dead_diaeresis 0x1a altgr dead_abovering 0x1a shift altgr plus 0x1b asterisk 0x1b shift -asciitilde 0x1b altgr dead_tilde 0x1b altgr dead_macron 0x1b shift altgr ae 0x1e altgr AE 0x1e shift altgr +ssharp 0x1f altgr +section 0x1f shift altgr eth 0x20 altgr ETH 0x20 shift altgr dstroke 0x21 altgr @@ -77,27 +80,41 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr odiaeresis 0x27 Odiaeresis 0x27 shift dead_doubleacute 0x27 altgr +dead_doubleacute 0x27 shift altgr adiaeresis 0x28 Adiaeresis 0x28 shift +dead_circumflex 0x28 altgr dead_caron 0x28 shift altgr -asciicircum 0x29 dead_circumflex 0x29 degree 0x29 shift notsign 0x29 altgr +notsign 0x29 shift altgr numbersign 0x2b apostrophe 0x2b shift +dead_grave 0x2b altgr dead_breve 0x2b shift altgr y 0x2c addupper guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 @@ -112,3 +129,5 @@ minus 0x35 underscore 0x35 shift dead_belowdot 0x35 altgr dead_abovedot 0x35 shift altgr +backslash 0x56 +bar 0x56 shift \ No newline at end of file diff -up qemu-0.9.1.6042/keymaps/en-gb.keymap03 qemu-0.9.1.6042/keymaps/en-gb --- qemu-0.9.1.6042/keymaps/en-gb.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/en-gb 2008-12-16 09:16:35.000000000 +0000 @@ -9,8 +9,10 @@ twosuperior 0x03 altgr oneeighth 0x03 shift altgr sterling 0x04 shift threesuperior 0x04 altgr +sterling 0x4 shift altgr dollar 0x05 shift EuroSign 0x05 altgr +onequarter 0x5 shift altgr percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr @@ -41,6 +43,8 @@ at 0x10 altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr Lstroke 0x11 shift altgr +e 0x12 altgr +E 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr tslash 0x14 altgr @@ -52,7 +56,7 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr bracketleft 0x1a @@ -75,7 +79,10 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr semicolon 0x27 @@ -89,6 +96,7 @@ dead_caron 0x28 shift altgr grave 0x29 notsign 0x29 shift bar 0x29 altgr +bar 0x29 shift altgr numbersign 0x2b asciitilde 0x2b shift dead_grave 0x2b altgr @@ -100,7 +108,11 @@ greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 diff -up qemu-0.9.1.6042/keymaps/en-us.keymap03 qemu-0.9.1.6042/keymaps/en-us diff -up qemu-0.9.1.6042/keymaps/es.keymap03 qemu-0.9.1.6042/keymaps/es --- qemu-0.9.1.6042/keymaps/es.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/es 2008-12-16 09:18:02.000000000 +0000 @@ -3,6 +3,7 @@ include common map 0x40a exclam 0x02 shift bar 0x02 altgr +exclamdown 0x02 shift altgr quotedbl 0x03 shift at 0x03 altgr oneeighth 0x03 shift altgr @@ -10,7 +11,8 @@ periodcentered 0x04 shift numbersign 0x04 altgr sterling 0x04 shift altgr dollar 0x05 shift -asciitilde 0x05 altgr +dead_tilde 0x05 altgr +dollar 0x05 shift altgr percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr @@ -18,21 +20,31 @@ ampersand 0x07 shift notsign 0x07 altgr fiveeighths 0x07 shift altgr slash 0x08 shift +braceleft 0x08 altgr seveneighths 0x08 shift altgr parenleft 0x09 shift +bracketleft 0x09 altgr trademark 0x09 shift altgr parenright 0x0a shift +bracketright 0x0a altgr plusminus 0x0a shift altgr equal 0x0b shift +braceright 0x0b altgr degree 0x0b shift altgr apostrophe 0x0c question 0x0c shift +backslash 0x0c altgr +questiondown 0x0c shift altgr exclamdown 0x0d questiondown 0x0d shift +asciitilde 0x0d altgr +asciitilde 0x0d shift altgr +at 0x10 altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr Lstroke 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr tslash 0x14 altgr @@ -44,7 +56,7 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr dead_grave 0x1a @@ -62,44 +74,58 @@ section 0x1f shift altgr eth 0x20 altgr ETH 0x20 shift altgr dstroke 0x21 altgr +ordfeminine 0x21 shift altgr eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr ntilde 0x27 Ntilde 0x27 shift +asciitilde 0x27 altgr dead_doubleacute 0x27 shift altgr dead_acute 0x28 dead_diaeresis 0x28 shift braceleft 0x28 altgr +braceleft 0x28 shift altgr masculine 0x29 ordfeminine 0x29 shift backslash 0x29 altgr +backslash 0x29 shift altgr ccedilla 0x2b Ccedilla 0x2b shift braceright 0x2b altgr dead_breve 0x2b shift altgr guillemotleft 0x2c altgr -less 0x56 -greater 0x56 shift +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr +masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift horizconnector 0x33 altgr multiply 0x33 shift altgr period 0x34 colon 0x34 shift +periodcentered 0x34 altgr division 0x34 shift altgr minus 0x35 underscore 0x35 shift dead_belowdot 0x35 altgr dead_abovedot 0x35 shift altgr +backslash 0x56 +bar 0x56 shift diff -up qemu-0.9.1.6042/keymaps/et.keymap03 qemu-0.9.1.6042/keymaps/et --- qemu-0.9.1.6042/keymaps/et.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/et 2008-12-16 09:20:02.000000000 +0000 @@ -6,80 +6,153 @@ include common # dead_caron 0x29 dead_tilde 0x29 shift +notsign 0x29 altgr +notsign 0x29 shift altgr # 1 exclam 0x2 shift +exclamdown 0x2 shift altgr # 2 quotedbl 0x3 shift at 0x3 altgr +oneeighth 0x3 shift altgr # 3 numbersign 0x4 shift sterling 0x4 altgr +sterling 0x4 shift altgr # 4 currency 0x5 shift dollar 0x5 altgr +dollar 0x5 shift altgr # 5 percent 0x6 shift +onehalf 0x6 altgr +threeeighths 0x6 shift altgr # 6 ampersand 0x7 shift +notsign 0x7 altgr +fiveeighths 0x7 shift altgr # 7 slash 0x8 shift braceleft 0x8 altgr +seveneighths 0x8 shift altgr # 8 parenleft 0x9 shift bracketleft 0x9 altgr +trademark 0x9 shift altgr # 9 parenright 0xa shift bracketright 0xa altgr +plusminus 0xa shift altgr # 0 equal 0xb shift braceright 0xb altgr +degree 0xb shift altgr plus 0xc question 0xc shift backslash 0xc altgr +questiondown 0xc shift altgr -acute 0xd dead_acute 0xd -grave 0xd shift dead_grave 0xd shift +grave 0xd altgr +apostrophe 0xd shift altgr # # QWERTY first row # +at 0x10 altgr +Greek_OMEGA 0x10 shift altgr +lstroke 0x11 altgr +Lstroke 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr +paragraph 0x13 altgr +registered 0x13 shift altgr +tslash 0x14 altgr +Tslash 0x14 shift altgr +leftarrow 0x15 altgr +yen 0x15 shift altgr +downarrow 0x16 altgr +uparrow 0x16 shift altgr +rightarrow 0x17 altgr +idotless 0x17 shift altgr +oslash 0x18 altgr +Oslash 0x18 shift altgr +thorn 0x19 altgr +THORN 0x19 shift altgr udiaeresis 0x1a Udiaeresis 0x1a shift +dead_diaeresis 0x1a altgr +dead_abovering 0x1a shift altgr otilde 0x1b Otilde 0x1b shift section 0x1b altgr +dead_macron 0x1b shift altgr # # QWERTY second row # +ae 0x1e altgr +AE 0x1e shift altgr scaron 0x1f altgr Scaron 0x1f altgr shift +eth 0x20 altgr +ETH 0x20 shift altgr +dstroke 0x21 altgr +ordfeminine 0x21 shift altgr +eng 0x22 altgr +ENG 0x22 shift altgr +hstroke 0x23 altgr +Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr +kra 0x25 altgr +ampersand 0x25 shift altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr odiaeresis 0x27 Odiaeresis 0x27 shift +dead_acute 0x27 altgr +dead_doubleacute 0x27 shift altgr adiaeresis 0x28 Adiaeresis 0x28 shift asciicircum 0x28 altgr +dead_caron 0x28 shift altgr apostrophe 0x2b asterisk 0x2b shift onehalf 0x2b altgr +dead_breve 0x2b shift altgr # # QWERTY third row # -less 0x56 -greater 0x56 shift -bar 0x56 altgr +backslash 0x56 +bar 0x56 shift zcaron 0x2c altgr Zcaron 0x2c altgr shift +guillemotright 0x2d altgr +greater 0x2d shift altgr +cent 0x2e altgr +copyright 0x2e shift altgr +leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr +rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr +mu 0x32 altgr +masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift +less 0x33 altgr +multiply 0x33 shift altgr period 0x34 colon 0x34 shift +greater 0x34 altgr +division 0x34 shift altgr minus 0x35 underscore 0x35 shift +dead_abovedot 0x35 shift altgr diff -up qemu-0.9.1.6042/keymaps/fi.keymap03 qemu-0.9.1.6042/keymaps/fi --- qemu-0.9.1.6042/keymaps/fi.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/fi 2008-12-16 09:23:02.000000000 +0000 @@ -1,33 +1,29 @@ -# generated from XKB map se_FI +# generated from XKB map fi include common map 0x40b exclam 0x02 shift -exclamdown 0x02 altgr -onesuperior 0x02 shift altgr +exclamdown 0x02 shift altgr quotedbl 0x03 shift at 0x03 altgr -twosuperior 0x03 shift altgr +rightdoublequotemark 0x03 shift altgr numbersign 0x04 shift sterling 0x04 altgr -threesuperior 0x04 shift altgr +guillemotright 0x04 shift altgr currency 0x05 shift dollar 0x05 altgr -onequarter 0x05 shift altgr +guillemotleft 0x05 shift altgr percent 0x06 shift -onehalf 0x06 altgr -cent 0x06 shift altgr +U2030 0x06 altgr +leftdoublequotemark 0x06 shift altgr ampersand 0x07 shift -yen 0x07 altgr -fiveeighths 0x07 shift altgr +singlelowquotemark 0x07 altgr +doublelowquotemark 0x07 shift altgr slash 0x08 shift braceleft 0x08 altgr -division 0x08 shift altgr parenleft 0x09 shift bracketleft 0x09 altgr -guillemotleft 0x09 shift altgr parenright 0x0a shift bracketright 0x0a altgr -guillemotright 0x0a shift altgr equal 0x0b shift braceright 0x0b altgr degree 0x0b shift altgr @@ -37,88 +33,87 @@ backslash 0x0c altgr questiondown 0x0c shift altgr dead_acute 0x0d dead_grave 0x0d shift -plusminus 0x0d altgr -notsign 0x0d shift altgr -at 0x10 altgr -Greek_OMEGA 0x10 shift altgr -lstroke 0x11 altgr -Lstroke 0x11 shift altgr +dead_cedilla 0x0d altgr +dead_ogonek 0x0d shift altgr +q 0x10 altgr +Q 0x10 shift altgr +w 0x11 altgr +W 0x11 shift altgr EuroSign 0x12 altgr -cent 0x12 shift altgr -registered 0x13 altgr +r 0x13 altgr +R 0x13 shift altgr thorn 0x14 altgr THORN 0x14 shift altgr -leftarrow 0x15 altgr -yen 0x15 shift altgr -downarrow 0x16 altgr -uparrow 0x16 shift altgr -rightarrow 0x17 altgr -idotless 0x17 shift altgr +y 0x15 altgr +Y 0x15 shift altgr +u 0x16 altgr +U 0x16 shift altgr +idotless 0x17 altgr oe 0x18 altgr OE 0x18 shift altgr -thorn 0x19 altgr -THORN 0x19 shift altgr +dead_horn 0x19 altgr +dead_hook 0x19 shift altgr aring 0x1a Aring 0x1a shift -dead_diaeresis 0x1a altgr +dead_doubleacute 0x1a altgr dead_abovering 0x1a shift altgr dead_diaeresis 0x1b dead_circumflex 0x1b shift dead_tilde 0x1b altgr -dead_caron 0x1b shift altgr -ordfeminine 0x1e altgr -masculine 0x1e shift altgr +dead_macron 0x1b shift altgr +schwa 0x1e altgr +SCHWA 0x1e shift altgr ssharp 0x1f altgr -section 0x1f shift altgr eth 0x20 altgr ETH 0x20 shift altgr -dstroke 0x21 altgr -ordfeminine 0x21 shift altgr -eng 0x22 altgr -ENG 0x22 shift altgr -hstroke 0x23 altgr -Hstroke 0x23 shift altgr +f 0x21 altgr +F 0x21 shift altgr +g 0x22 altgr +G 0x22 shift altgr +h 0x23 altgr +H 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr -ampersand 0x25 shift altgr -lstroke 0x26 altgr -Lstroke 0x26 shift altgr +dead_stroke 0x26 altgr odiaeresis 0x27 Odiaeresis 0x27 shift oslash 0x27 altgr -Ooblique 0x27 shift altgr +Oslash 0x27 shift altgr adiaeresis 0x28 Adiaeresis 0x28 shift ae 0x28 altgr AE 0x28 shift altgr section 0x29 onehalf 0x29 shift -paragraph 0x29 altgr -threequarters 0x29 shift altgr +dead_stroke 0x29 altgr apostrophe 0x2b asterisk 0x2b shift -acute 0x2b altgr -multiply 0x2b shift altgr -guillemotleft 0x2c altgr -less 0x2c shift altgr -guillemotright 0x2d altgr -greater 0x2d shift altgr -copyright 0x2e altgr -leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr -rightdoublequotemark 0x30 altgr -apostrophe 0x30 shift altgr +dead_caron 0x2b altgr +dead_breve 0x2b shift altgr +U0292 0x2c altgr +U01B7 0x2c shift altgr +multiply 0x2d altgr +periodcentered 0x2d shift altgr +c 0x2e altgr +C 0x2e shift altgr +v 0x2f altgr +V 0x2f shift altgr +b 0x30 altgr +B 0x30 shift altgr +eng 0x31 altgr +ENG 0x31 shift altgr mu 0x32 altgr -masculine 0x32 shift altgr +emdash 0x32 shift altgr comma 0x33 semicolon 0x33 shift -dead_cedilla 0x33 altgr -dead_ogonek 0x33 shift altgr +rightsinglequotemark 0x33 altgr +leftsinglequotemark 0x33 shift altgr period 0x34 colon 0x34 shift -periodcentered 0x34 altgr +dead_belowdot 0x34 altgr dead_abovedot 0x34 shift altgr minus 0x35 underscore 0x35 shift -hyphen 0x35 altgr -macron 0x35 shift altgr -nobreakspace 0x39 altgr +endash 0x35 altgr +dead_abovedot 0x35 shift altgr diff -up qemu-0.9.1.6042/keymaps/fo.keymap03 qemu-0.9.1.6042/keymaps/fo --- qemu-0.9.1.6042/keymaps/fo.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/fo 2008-12-16 09:25:13.000000000 +0000 @@ -6,71 +6,156 @@ include common # onehalf 0x29 section 0x29 shift +threequarters 0x29 altgr +paragraph 0x29 shift altgr # 1 exclam 0x2 shift +exclamdown 0x2 altgr +onesuperior 0x2 shift altgr # 2 quotedbl 0x3 shift at 0x3 altgr +twosuperior 0x3 shift altgr # 3 numbersign 0x4 shift sterling 0x4 altgr +threesuperior 0x4 shift altgr # 4 currency 0x5 shift dollar 0x5 altgr +onequarter 0x5 shift altgr # 5 percent 0x6 shift +onehalf 0x6 altgr +cent 0x6 shift altgr # 6 ampersand 0x7 shift +yen 0x7 altgr +fiveeighths 0x7 shift altgr # 7 slash 0x8 shift braceleft 0x8 altgr +division 0x8 shift altgr # 8 parenleft 0x9 shift bracketleft 0x9 altgr +guillemotleft 0x9 shift altgr # 9 parenright 0xa shift bracketright 0xa altgr +guillemotright 0xa shift altgr # 0 equal 0xb shift braceright 0xb altgr +degree 0xb shift altgr plus 0xc question 0xc shift plusminus 0xc altgr +questiondown 0xc shift altgr -bar 0xd altgr dead_acute 0xd +dead_grave 0xd shift +bar 0xd altgr +brokenbar 0xd shift altgr # # QWERTY first row # +at 0x10 altgr +Greek_OMEGA 0x10 shift altgr +lstroke 0x11 altgr +Lstroke 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr +registered 0x13 altgr +registered 0x13 shift altgr +thorn 0x14 altgr +THORN 0x14 shift altgr +leftarrow 0x15 altgr +yen 0x15 shift altgr +downarrow 0x16 altgr +uparrow 0x16 shift altgr +rightarrow 0x17 altgr +idotless 0x17 shift altgr +oe 0x18 altgr +OE 0x18 shift altgr +thorn 0x19 altgr +THORN 0x19 shift altgr aring 0x1a Aring 0x1a shift -eth 0x1b addupper -asciitilde 0x1b altgr +dead_diaeresis 0x1a altgr +dead_circumflex 0x1a shift altgr +eth 0x1b +ETH 0x1b shift +dead_tilde 0x1b altgr +dead_caron 0x1b shift altgr # # QWERTY second row # -ae 0x27 addupper +ordfeminine 0x1e altgr +masculine 0x1e shift altgr +ssharp 0x1f altgr +section 0x1f shift altgr +eth 0x20 altgr +ETH 0x20 shift altgr +dstroke 0x21 altgr +ordfeminine 0x21 shift altgr +eng 0x22 altgr +ENG 0x22 shift altgr +hstroke 0x23 altgr +Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr +kra 0x25 altgr +ampersand 0x25 shift altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr +ae 0x27 +AE 0x27 shift +dead_acute 0x27 altgr +dead_doubleacute 0x27 shift altgr oslash 0x28 -Ooblique 0x28 shift +Oslash 0x28 shift +dead_circumflex 0x28 altgr +dead_caron 0x28 shift altgr apostrophe 0x2b asterisk 0x2b shift +dead_doubleacute 0x2b altgr +multiply 0x2b shift altgr # # QWERTY third row # -less 0x56 -greater 0x56 shift backslash 0x56 altgr +notsign 0x56 shift altgr +guillemotleft 0x2c altgr +less 0x2c shift altgr +guillemotright 0x2d altgr +greater 0x2d shift altgr +copyright 0x2e altgr +copyright 0x2e shift altgr +leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr +rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr +mu 0x32 altgr +masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift +dead_cedilla 0x33 altgr +dead_ogonek 0x33 shift altgr period 0x34 colon 0x34 shift +periodcentered 0x34 altgr +dead_abovedot 0x34 shift altgr minus 0x35 underscore 0x35 shift +hyphen 0x35 altgr +macron 0x35 shift altgr diff -up qemu-0.9.1.6042/keymaps/fr-be.keymap03 qemu-0.9.1.6042/keymaps/fr-be --- qemu-0.9.1.6042/keymaps/fr-be.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/fr-be 2008-12-16 09:27:21.000000000 +0000 @@ -68,7 +68,7 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr dead_circumflex 0x1a @@ -92,6 +92,8 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr ampersand 0x25 shift altgr lstroke 0x26 altgr @@ -106,6 +108,7 @@ dead_caron 0x28 shift altgr twosuperior 0x29 threesuperior 0x29 shift notsign 0x29 altgr +notsign 0x29 shift altgr mu 0x2b sterling 0x2b shift dead_grave 0x2b altgr @@ -118,9 +121,11 @@ greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr -apostrophe 0x30 shift altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr comma 0x32 question 0x32 shift dead_cedilla 0x32 altgr @@ -138,3 +143,4 @@ plus 0x35 shift dead_tilde 0x35 altgr dead_abovedot 0x35 shift altgr backslash 0x56 altgr +backslash 0x56 shift altgr diff -up qemu-0.9.1.6042/keymaps/fr-ca.keymap03 qemu-0.9.1.6042/keymaps/fr-ca diff -up qemu-0.9.1.6042/keymaps/fr-ch.keymap03 qemu-0.9.1.6042/keymaps/fr-ch diff -up qemu-0.9.1.6042/keymaps/fr.keymap03 qemu-0.9.1.6042/keymaps/fr --- qemu-0.9.1.6042/keymaps/fr.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/fr 2008-12-16 09:26:38.000000000 +0000 @@ -4,7 +4,9 @@ map 0x40c # Top row # twosuperior 0x29 +asciitilde 0x29 shift notsign 0x29 altgr +notsign 0x29 shift altgr ampersand 0x02 1 0x02 shift @@ -19,10 +21,12 @@ oneeighth 0x03 shift altgr quotedbl 0x04 3 0x04 shift numbersign 0x04 altgr +sterling 0x04 shift altgr apostrophe 0x05 4 0x05 shift braceleft 0x05 altgr +dollar 0x05 shift altgr parenleft 0x06 5 0x06 shift @@ -52,12 +56,12 @@ plusminus 0x0a shift altgr agrave 0x0b 0 0x0b shift at 0x0b altgr +degree 0x0b shift altgr parenright 0x0c degree 0x0c shift bracketright 0x0c altgr questiondown 0x0c shift altgr - equal 0x0d plus 0x0d shift braceright 0x0d altgr @@ -66,15 +70,16 @@ dead_ogonek 0x0d shift altgr # # AZERTY first row # - a 0x10 addupper ae 0x10 altgr AE 0x10 shift altgr z 0x11 addupper guillemotleft 0x11 altgr +less 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr @@ -92,13 +97,14 @@ rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr dead_circumflex 0x1a dead_diaeresis 0x1a shift +dead_diaeresis 0x1a altgr dead_abovering 0x1a shift altgr dollar 0x1b @@ -110,9 +116,11 @@ dead_macron 0x1b shift altgr # AZERTY second row # q 0x1e addupper +at 0x1e altgr Greek_OMEGA 0x1e shift altgr ssharp 0x1f altgr +section 0x1f shift altgr eth 0x20 altgr ETH 0x20 shift altgr @@ -126,16 +134,22 @@ ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr + kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr m 0x27 addupper +mu 0x27 altgr masculine 0x27 shift altgr ugrave 0x28 percent 0x28 shift +dead_circumflex 0x28 altgr dead_caron 0x28 shift altgr asterisk 0x2b @@ -146,19 +160,27 @@ dead_breve 0x2b shift altgr # # AZERTY third row # -less 0x56 -greater 0x56 shift +backslash 0x56 +bar 0x56 shift w 0x2c addupper +lstroke 0x2c altgr +Lstroke 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr + +n 0x31 altgr +N 0x31 shift altgr comma 0x32 question 0x32 shift diff -up qemu-0.9.1.6042/keymaps/hr.keymap03 qemu-0.9.1.6042/keymaps/hr --- qemu-0.9.1.6042/keymaps/hr.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/hr 2008-12-16 09:28:33.000000000 +0000 @@ -37,6 +37,7 @@ dead_diaeresis 0x0c altgr diaeresis 0x0c shift altgr plus 0x0d asterisk 0x0d shift +cedilla 0x0d shift altgr dead_cedilla 0x0d altgr cedilla 0x0d shift altgr backslash 0x10 altgr @@ -44,6 +45,7 @@ Greek_OMEGA 0x10 shift altgr bar 0x11 altgr Lstroke 0x11 shift altgr EuroSign 0x12 altgr +EuroSign 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr tslash 0x14 altgr @@ -56,7 +58,7 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr scaron 0x1a @@ -69,19 +71,22 @@ multiply 0x1b altgr dead_macron 0x1b shift altgr ae 0x1e altgr AE 0x1e shift altgr -ssharp 0x1f altgr -section 0x1f shift altgr -eth 0x20 altgr -ETH 0x20 shift altgr +doublelowquotemark 0x1f altgr +guillemotright 0x1f shift altgr +leftdoublequotemark 0x20 altgr +guillemotleft 0x20 shift altgr bracketleft 0x21 altgr ordfeminine 0x21 shift altgr bracketright 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr lstroke 0x25 altgr ampersand 0x25 shift altgr -Lstroke 0x26 altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr ccaron 0x27 Ccaron 0x27 shift dead_acute 0x27 altgr @@ -90,18 +95,19 @@ cacute 0x28 Cacute 0x28 shift ssharp 0x28 altgr dead_caron 0x28 shift altgr -dead_cedilla 0x29 -dead_diaeresis 0x29 shift +grave 0x29 +asciitilde 0x29 shift notsign 0x29 altgr +notsign 0x29 shift altgr zcaron 0x2b Zcaron 0x2b shift currency 0x2b altgr dead_breve 0x2b shift altgr y 0x2c addupper -guillemotleft 0x2c altgr -less 0x2c shift altgr -guillemotright 0x2d altgr -greater 0x2d shift altgr +leftsinglequotemark 0x2c altgr +guillemotright 0x2c shift altgr +rightsinglequotemark 0x2d altgr +guillemotleft 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr at 0x2f altgr @@ -109,17 +115,20 @@ grave 0x2f shift altgr braceleft 0x30 altgr apostrophe 0x30 shift altgr braceright 0x31 altgr -section 0x32 altgr +braceright 0x31 shift altgr +asciicircum 0x32 altgr masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift -horizconnector 0x33 altgr +less 0x33 altgr multiply 0x33 shift altgr period 0x34 colon 0x34 shift -periodcentered 0x34 altgr +greater 0x34 altgr division 0x34 shift altgr minus 0x35 underscore 0x35 shift dead_belowdot 0x35 altgr dead_abovedot 0x35 shift altgr +backslash 0x56 +bar 0x56 shift diff -up qemu-0.9.1.6042/keymaps/hu.keymap03 qemu-0.9.1.6042/keymaps/hu --- qemu-0.9.1.6042/keymaps/hu.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/hu 2008-12-16 09:31:23.000000000 +0000 @@ -8,27 +8,35 @@ map 0x40e # AltGr keys: notsign 0x29 altgr asciitilde 0x02 altgr -caron 0x03 altgr +dead_caron 0x03 altgr asciicircum 0x04 altgr -breve 0x05 altgr -degree 0x06 altgr -ogonek 0x07 altgr +dead_breve 0x05 altgr +dead_abovering 0x06 altgr +dead_ogonek 0x07 altgr grave 0x08 altgr -abovedot 0x09 altgr -acute 0x0a altgr -doubleacute 0x0b altgr -diaeresis 0x0c altgr -cedilla 0x0d altgr +dead_abovedot 0x09 altgr +dead_acute 0x0a altgr +dead_doubleacute 0x0b altgr +dead_diaeresis 0x0c altgr +dead_cedilla 0x0d altgr backslash 0x10 altgr bar 0x11 altgr -EuroSign 0x12 altgr +e 0x12 altgr +paragraph 0x13 altgr +tslash 0x14 altgr +leftarrow 0x15 altgr +EuroSign 0x16 altgr Iacute 0x17 altgr +oslash 0x18 altgr +thorn 0x19 altgr division 0x1a altgr multiply 0x1b altgr +adiaeresis 0x1e altgr dstroke 0x1f altgr Dstroke 0x20 altgr bracketleft 0x21 altgr bracketright 0x22 altgr +hstroke 0x23 altgr iacute 0x24 altgr lstroke 0x25 altgr Lstroke 0x26 altgr @@ -42,7 +50,9 @@ ampersand 0x2e altgr at 0x2f altgr braceleft 0x30 altgr braceright 0x31 altgr +less 0x32 altgr semicolon 0x33 altgr +greater 0x34 altgr asterisk 0x35 altgr @@ -66,49 +76,79 @@ Uacute 0x1b shift Eacute 0x27 shift Aacute 0x28 shift Udoubleacute 0x2b shift +Iacute 0x56 shift Y 0x2c shift question 0x33 shift colon 0x34 shift underscore 0x35 shift -F13 0x3b shift -F14 0x3c shift -F15 0x3d shift -F16 0x3e shift -F17 0x3f shift -F18 0x40 shift -F19 0x41 shift -F20 0x42 shift -F21 0x43 shift -F22 0x44 shift -F23 0x57 shift -F24 0x58 shift - - -# Ctrl keys: -F25 0x3b ctrl -F26 0x3c ctrl -F27 0x3d ctrl -F28 0x3e ctrl -F29 0x3f ctrl -F30 0x40 ctrl -F31 0x41 ctrl -F32 0x42 ctrl -F33 0x43 ctrl -F34 0x44 ctrl -F35 0x57 ctrl -#NoSymbol 0x58 ctrl + + +# Shift+Altgr keys: +notsign 0x29 shift altgr +dead_tilde 0x02 shift altgr +caron 0x03 shift altgr +dead_circumflex 0x04 shift altgr +breve 0x05 shift altgr +degree 0x06 shift altgr +ogonek 0x07 shift altgr +dead_grave 0x08 shift altgr +abovedot 0x09 shift altgr +acute 0x0a shift altgr +doubleacute 0x0b shift altgr +diaeresis 0x0c shift altgr +cedilla 0x0d shift altgr +Greek_OMEGA 0x10 shift altgr +Lstroke 0x11 shift altgr +E 0x12 shift altgr +registered 0x13 shift altgr +Tslash 0x14 shift altgr +yen 0x15 shift altgr +uparrow 0x16 shift altgr +iacute 0x17 shift altgr +Oslash 0x18 shift altgr +THORN 0x19 shift altgr +dead_abovering 0x1a shift altgr +dead_macron 0x1b shift altgr +Adiaeresis 0x1e shift altgr +section 0x1f shift altgr +ETH 0x20 shift altgr +ordfeminine 0x21 shift altgr +ENG 0x22 shift altgr +Hstroke 0x23 shift altgr +Iacute 0x24 shift altgr +ampersand 0x25 shift altgr +Lstroke 0x26 shift altgr +cent 0x27 shift altgr +dead_caron 0x28 shift altgr +dead_breve 0x2b shift altgr +# correction: keysym was brokenbar +greater 0x56 shift altgr +less 0x2c shift altgr +greater 0x2d shift altgr +copyright 0x2e shift altgr +leftsinglequotemark 0x2f shift altgr +rightsinglequotemark 0x30 shift altgr +masculine 0x32 shift altgr +multiply 0x33 shift altgr +division 0x34 shift altgr +dead_abovedot 0x35 shift altgr 0 0x29 +# correction: keysym was 0 odiaeresis 0x0b udiaeresis 0x0c oacute 0x0d +# correction: keysym was y z 0x15 odoubleacute 0x1a uacute 0x1b eacute 0x27 aacute 0x28 udoubleacute 0x2b +# correction: keysym was less +iacute 0x56 +# correction: keysym was z y 0x2c comma 0x33 period 0x34 diff -up qemu-0.9.1.6042/keymaps/is.keymap03 qemu-0.9.1.6042/keymaps/is --- qemu-0.9.1.6042/keymaps/is.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/is 2008-12-16 09:37:50.000000000 +0000 @@ -11,7 +11,6 @@ exclamdown 0x02 shift altgr quotedbl 0x03 shift twosuperior 0x03 altgr oneeighth 0x03 shift altgr -#section 0x04 shift numbersign 0x04 shift threesuperior 0x04 altgr sterling 0x04 shift altgr @@ -22,7 +21,7 @@ percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr ampersand 0x07 shift -threequarters 0x07 altgr +notsign 0x07 altgr fiveeighths 0x07 shift altgr slash 0x08 shift braceleft 0x08 altgr @@ -35,92 +34,90 @@ bracketright 0x0a altgr plusminus 0x0a shift altgr equal 0x0b shift braceright 0x0b altgr -#ssharp 0x0c +degree 0x0b shift altgr odiaeresis 0x0c -#question 0x0c shift Odiaeresis 0x0c shift backslash 0x0c altgr questiondown 0x0c shift altgr -#acute 0x0d -minus 0x0d -#dead_acute 0x0d -#grave 0x0d shift -#dead_grave 0x0d shift +minus 0x0d underscore 0x0d shift -dead_cedilla 0x0d altgr +ccedilla 0x0d altgr dead_ogonek 0x0d shift altgr at 0x10 altgr Greek_OMEGA 0x10 shift altgr +lstroke 0x11 altgr +Lstroke 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr paragraph 0x13 altgr registered 0x13 shift altgr tslash 0x14 altgr Tslash 0x14 shift altgr -#z 0x15 addupper leftarrow 0x15 altgr yen 0x15 shift altgr downarrow 0x16 altgr +downarrow 0x16 altgr uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr -#thorn 0x19 altgr -#THORN 0x19 shift altgr -#udiaeresis 0x1a -#Udiaeresis 0x1a shift -#dead_diaeresis 0x1a altgr -#dead_abovering 0x1a shift altgr +Oslash 0x18 shift altgr +thorn 0x19 altgr +THORN 0x19 shift altgr eth 0x1a ETH 0x1a shift +dead_diaeresis 0x1a altgr +dead_abovering 0x1a shift altgr apostrophe 0x1b question 0x1b shift -#plus 0x1b -#asterisk 0x1b shift asciitilde 0x1b altgr -#grave 0x1b altgr -#dead_tilde 0x1b altgr -#dead_macron 0x1b shift altgr -#ae 0x1e altgr -#AE 0x1e shift altgr -#eth 0x20 altgr -#eth 0x20 -#ETH 0x20 shift altgr -#ETH 0x20 shift +dead_macron 0x1b shift altgr +ae 0x1e altgr +AE 0x1e shift altgr +ssharp 0x1f altgr +section 0x1f shift altgr +eth 0x20 altgr +ETH 0x20 shift altgr dstroke 0x21 altgr ordfeminine 0x21 shift altgr eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr -#adiaeresis 0x27 -#Adiaeresis 0x27 shift +ampersand 0x25 shift altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr ae 0x27 AE 0x27 shift -dead_doubleacute 0x27 altgr -#adiaeresis 0x28 -#Adiaeresis 0x28 shift -#dead_caron 0x28 shift altgr -#asciicircum 0x29 -acute 0x28 +asciicircum 0x27 altgr +dead_doubleacute 0x27 shift altgr dead_acute 0x28 -#dead_circumflex 0x29 -#degree 0x29 shift -#notsign 0x29 altgr +dead_circumflex 0x28 shift +dead_circumflex 0x28 altgr +dead_caron 0x28 shift altgr +degree 0x29 +diaeresis 0x29 shift +notsign 0x29 altgr +notsign 0x29 shift altgr plus 0x2b asterisk 0x2b shift grave 0x2b altgr -#numbersign 0x2b -#apostrophe 0x2b shift -#dead_breve 0x2b shift altgr -#y 0x2c addupper +dead_breve 0x2b shift altgr guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 @@ -131,9 +128,9 @@ period 0x34 colon 0x34 shift periodcentered 0x34 altgr division 0x34 shift altgr -#minus 0x35 -#underscore 0x35 shift thorn 0x35 THORN 0x35 shift dead_belowdot 0x35 altgr dead_abovedot 0x35 shift altgr +backslash 0x56 +bar 0x56 shift diff -up qemu-0.9.1.6042/keymaps/it.keymap03 qemu-0.9.1.6042/keymaps/it --- qemu-0.9.1.6042/keymaps/it.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/it 2008-12-16 10:24:53.000000000 +0000 @@ -6,27 +6,31 @@ onesuperior 0x02 altgr exclamdown 0x02 shift altgr quotedbl 0x03 shift twosuperior 0x03 altgr -oneeighth 0x03 shift altgr +dead_doubleacute 0x03 shift altgr sterling 0x04 shift threesuperior 0x04 altgr +dead_tilde 0x04 shift altgr dollar 0x05 shift onequarter 0x05 altgr +oneeighth 0x05 shift altgr percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr ampersand 0x07 shift -threequarters 0x07 altgr +notsign 0x07 altgr fiveeighths 0x07 shift altgr slash 0x08 shift braceleft 0x08 altgr seveneighths 0x08 shift altgr parenleft 0x09 shift +bracketleft 0x09 altgr trademark 0x09 shift altgr parenright 0x0a shift +bracketright 0x0a altgr plusminus 0x0a shift altgr equal 0x0b shift braceright 0x0b altgr -degree 0x0b shift altgr +dead_ogonek 0x0b shift altgr apostrophe 0x0c question 0x0c shift grave 0x0c altgr @@ -34,7 +38,7 @@ questiondown 0x0c shift altgr igrave 0x0d asciicircum 0x0d shift asciitilde 0x0d altgr -dead_ogonek 0x0d shift altgr +dead_circumflex 0x0d shift altgr at 0x10 altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr @@ -52,17 +56,17 @@ uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oslash 0x18 altgr -Ooblique 0x18 shift altgr +Oslash 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr egrave 0x1a eacute 0x1a shift bracketleft 0x1a altgr -dead_abovering 0x1a shift altgr +braceleft 0x1a shift altgr plus 0x1b asterisk 0x1b shift bracketright 0x1b altgr -dead_macron 0x1b shift altgr +braceright 0x1b shift altgr ae 0x1e altgr AE 0x1e shift altgr ssharp 0x1f altgr @@ -75,41 +79,53 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr ograve 0x27 ccedilla 0x27 shift at 0x27 altgr -dead_doubleacute 0x27 shift altgr +dead_cedilla 0x27 shift altgr agrave 0x28 degree 0x28 shift numbersign 0x28 altgr +dead_abovering 0x28 shift altgr backslash 0x29 bar 0x29 shift notsign 0x29 altgr +brokenbar 0x29 shift altgr ugrave 0x2b section 0x2b shift dead_grave 0x2b altgr dead_breve 0x2b shift altgr guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +ntilde 0x31 altgr +Ntilde 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift -horizconnector 0x33 altgr +dead_acute 0x33 altgr multiply 0x33 shift altgr period 0x34 colon 0x34 shift periodcentered 0x34 altgr -division 0x34 shift altgr +dead_diaeresis 0x34 shift altgr minus 0x35 underscore 0x35 shift -dead_belowdot 0x35 altgr -dead_abovedot 0x35 shift altgr +dead_macron 0x35 altgr +division 0x35 shift altgr +guillemotleft 0x56 altgr +guillemotright 0x56 shift altgr diff -up qemu-0.9.1.6042/keymaps/ja.keymap03 qemu-0.9.1.6042/keymaps/ja diff -up qemu-0.9.1.6042/keymaps/lt.keymap03 qemu-0.9.1.6042/keymaps/lt diff -up qemu-0.9.1.6042/keymaps/lv.keymap03 qemu-0.9.1.6042/keymaps/lv diff -up qemu-0.9.1.6042/keymaps/mk.keymap03 qemu-0.9.1.6042/keymaps/mk diff -up qemu-0.9.1.6042/keymaps/modifiers.keymap03 qemu-0.9.1.6042/keymaps/modifiers --- qemu-0.9.1.6042/keymaps/modifiers.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/modifiers 2008-12-16 10:25:47.000000000 +0000 @@ -3,6 +3,7 @@ Shift_L 0x2a Alt_R 0xb8 Mode_switch 0xb8 +ISO_Level3_Shift 0xb8 Alt_L 0x38 Control_R 0x9d diff -up qemu-0.9.1.6042/keymaps/nl-be.keymap03 qemu-0.9.1.6042/keymaps/nl-be --- qemu-0.9.1.6042/keymaps/nl-be.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/nl-be 2008-12-16 10:28:59.000000000 +0000 @@ -1,3 +1,68 @@ # Dutch (Belgium) map 0x813 include common +ampersand 0x02 +1 0x02 shift +bar 0x02 altgr +eacute 0x03 +2 0x03 shift +at 0x03 altgr +quotedbl 0x04 +3 0x04 shift +numbersign 0x04 altgr +apostrophe 0x05 +4 0x05 shift +parenleft 0x06 +5 0x06 shift +section 0x07 +6 0x07 shift +circumflex 0x07 altgr +egrave 0x08 +7 0x08 shift +exclam 0x09 +8 0x09 shift +bracketleft 0x09 altgr +ccedilla 0x0a +9 0x0a shift +braceleft 0x0a altgr +agrave 0x0b +0 0x0b shift +braceright 0x0b altgr +parenright 0x0c +degree 0x0c shift +minus 0x0d +underscore 0x0d shift +a 0x10 addupper +z 0x11 addupper +EuroSign 0x12 altgr +dead_circumflex 0x1a +dead_diaeresis 0x1a shift +bracketleft 0x1a altgr +dollar 0x1b +asterisk 0x1b shift +bracketright 0x1b altgr +q 0x1e addupper +m 0x27 addupper +ugrave 0x28 +percent 0x28 shift +dead_acute 0x28 altgr +twosuperior 0x29 +threesuperior 0x29 shift +mu 0x2b +sterling 0x2b shift +dead_grave 0x2b altgr +w 0x2c addupper +comma 0x32 +question 0x32 shift +semicolon 0x33 +period 0x33 shift +colon 0x34 +slash 0x34 shift +periodcentered 0x34 altgr +equal 0x35 +plus 0x35 shift +tilde 0x35 altgr +dead_tilde 0x35 shift altgr +less 0x56 +greater 0x56 shift +backslash 0x56 altgr diff -up qemu-0.9.1.6042/keymaps/nl.keymap03 qemu-0.9.1.6042/keymaps/nl --- qemu-0.9.1.6042/keymaps/nl.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/nl 2008-12-16 10:27:16.000000000 +0000 @@ -4,56 +4,129 @@ map 0x413 exclam 0x02 shift onesuperior 0x02 altgr -quotebl 0x03 shift +exclamdown 0x02 shift altgr +quotedbl 0x03 shift twosuperior 0x03 altgr +oneeighth 0x03 shift altgr numbersign 0x04 shift threesuperior 0x04 altgr +sterling 0x04 shift altgr dollar 0x05 shift onequarter 0x05 altgr +dollar 0x05 shift altgr percent 0x06 shift onehalf 0x06 altgr +threeeighths 0x06 shift altgr ampersand 0x07 shift threequarters 0x07 altgr +fiveeighths 0x07 shift altgr underscore 0x08 shift sterling 0x08 altgr +seveneighths 0x08 shift altgr parenleft 0x09 shift braceleft 0x09 altgr +bracketleft 0x09 shift altgr parenright 0x0a shift braceright 0x0a altgr +bracketright 0x0a shift altgr apostrophe 0x0b shift +degree 0x0b altgr +trademark 0x0b shift altgr slash 0x0c question 0x0c shift backslash 0x0c altgr +questiondown 0x0c shift altgr degree 0x0d dead_tilde 0x0d shift dead_cedilla 0x0d altgr +dead_ogonek 0x0d shift altgr +at 0x10 altgr +Greek_OMEGA 0x10 shift altgr +lstroke 0x11 altgr +Lstroke 0x11 shift altgr EuroSign 0x12 altgr +cent 0x12 shift altgr paragraph 0x13 altgr +registered 0x13 shift altgr +thorn 0x14 altgr +THORN 0x14 shift altgr +ydiaeresis 0x15 altgr +yen 0x15 shift altgr +udiaeresis 0x16 altgr +Udiaeresis 0x16 shift altgr +idiaeresis 0x17 altgr +Idiaeresis 0x17 shift altgr +ograve 0x18 altgr +Ograve 0x18 shift altgr +paragraph 0x19 altgr +THORN 0x19 shift altgr dead_diaeresis 0x1a dead_circumflex 0x1a shift +asciitilde 0x1a altgr +asciicircum 0x1a shift altgr asterisk 0x1b bar 0x1b shift +dead_tilde 0x1b altgr +dead_macron 0x1b shift altgr +aacute 0x1e altgr +Aacute 0x1e shift altgr ssharp 0x1f altgr +section 0x1f shift altgr +eth 0x20 altgr +ETH 0x20 shift altgr +ordfeminine 0x21 altgr +ordfeminine 0x21 shift altgr +eng 0x22 altgr +ENG 0x22 shift altgr +hstroke 0x23 altgr +Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr +kra 0x25 altgr +ampersand 0x25 shift altgr +lstroke 0x26 altgr +Lstroke 0x26 shift altgr plus 0x27 plusminus 0x27 shift +dead_acute 0x27 altgr +dead_doubleacute 0x27 shift altgr dead_acute 0x28 dead_grave 0x28 shift +apostrophe 0x28 altgr +grave 0x28 shift altgr at 0x29 section 0x29 shift notsign 0x29 altgr +notsign 0x29 shift altgr less 0x2b greater 0x2b shift +dead_grave 0x2b altgr +dead_breve 0x2b shift altgr guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr -copyright 0x2e altgr -mu 0x32 altgr +greater 0x2d shift altgr +cent 0x2e altgr +copyright 0x2e shift altgr +leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr +rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +ntilde 0x31 altgr +Ntilde 0x31 shift altgr +Greek_mu 0x32 altgr +masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift +cedilla 0x33 altgr +guillemotleft 0x33 shift altgr period 0x34 colon 0x34 shift periodcentered 0x34 altgr -hyphen 0x35 +guillemotright 0x34 shift altgr +minus 0x35 equal 0x35 shift +hyphen 0x35 altgr +dead_abovedot 0x35 shift altgr bracketright 0x56 bracketleft 0x56 shift -brokenbar 0x56 altgr diff -up qemu-0.9.1.6042/keymaps/no.keymap03 qemu-0.9.1.6042/keymaps/no --- qemu-0.9.1.6042/keymaps/no.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/no 2008-12-16 10:29:49.000000000 +0000 @@ -39,12 +39,14 @@ backslash 0x0d dead_grave 0x0d shift dead_acute 0x0d altgr notsign 0x0d shift altgr +at 0x10 altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr Lstroke 0x11 shift altgr EuroSign 0x12 altgr cent 0x12 shift altgr registered 0x13 altgr +registered 0x13 shift altgr thorn 0x14 altgr THORN 0x14 shift altgr leftarrow 0x15 altgr @@ -63,9 +65,7 @@ dead_diaeresis 0x1a altgr dead_abovering 0x1a shift altgr dead_diaeresis 0x1b dead_circumflex 0x1b shift -asciicircum 0x01b shift dead_tilde 0x1b altgr -asciitilde 0x1b altgr dead_caron 0x1b shift altgr ordfeminine 0x1e altgr masculine 0x1e shift altgr @@ -79,14 +79,19 @@ eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr +j 0x24 altgr +J 0x24 shift altgr kra 0x25 altgr +ampersand 0x25 shift altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr oslash 0x27 -Ooblique 0x27 shift +Oslash 0x27 shift +dead_acute 0x27 altgr dead_doubleacute 0x27 shift altgr ae 0x28 AE 0x28 shift +dead_circumflex 0x28 altgr dead_caron 0x28 shift altgr bar 0x29 section 0x29 shift @@ -94,12 +99,20 @@ brokenbar 0x29 altgr paragraph 0x29 shift altgr apostrophe 0x2b asterisk 0x2b shift +dead_doubleacute 0x2b altgr multiply 0x2b shift altgr guillemotleft 0x2c altgr +less 0x2c shift altgr guillemotright 0x2d altgr +greater 0x2d shift altgr copyright 0x2e altgr +copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 @@ -112,8 +125,7 @@ periodcentered 0x34 altgr dead_abovedot 0x34 shift altgr minus 0x35 underscore 0x35 shift -hyphen 0x35 altgr -macron 0x35 shift altgr -nobreakspace 0x39 altgr +dead_belowdot 0x35 altgr +dead_abovedot 0x35 shift altgr onehalf 0x56 altgr threequarters 0x56 shift altgr diff -up qemu-0.9.1.6042/keymaps/pl.keymap03 qemu-0.9.1.6042/keymaps/pl diff -up qemu-0.9.1.6042/keymaps/pt-br.keymap03 qemu-0.9.1.6042/keymaps/pt-br diff -up qemu-0.9.1.6042/keymaps/pt.keymap03 qemu-0.9.1.6042/keymaps/pt diff -up qemu-0.9.1.6042/keymaps/ru.keymap03 qemu-0.9.1.6042/keymaps/ru diff -up qemu-0.9.1.6042/keymaps/sl.keymap03 qemu-0.9.1.6042/keymaps/sl diff -up qemu-0.9.1.6042/keymaps/sv.keymap03 qemu-0.9.1.6042/keymaps/sv diff -up qemu-0.9.1.6042/keymaps/th.keymap03 qemu-0.9.1.6042/keymaps/th diff -up qemu-0.9.1.6042/keymaps/tr.keymap03 qemu-0.9.1.6042/keymaps/tr --- qemu-0.9.1.6042/keymaps/tr.keymap03 2008-12-16 09:10:57.000000000 +0000 +++ qemu-0.9.1.6042/keymaps/tr 2008-12-16 10:32:12.000000000 +0000 @@ -5,25 +5,23 @@ exclam 0x02 shift onesuperior 0x02 altgr exclamdown 0x02 shift altgr apostrophe 0x03 shift -at 0x03 altgr -oneeighth 0x03 shift altgr -dead_circumflex 0x04 shift +sterling 0x03 altgr +twosuperior 0x03 shift altgr +asciicircum 0x04 shift numbersign 0x04 altgr -sterling 0x04 shift altgr +threesuperior 0x04 shift altgr plus 0x05 shift dollar 0x05 altgr +onequarter 0x05 shift altgr percent 0x06 shift onehalf 0x06 altgr threeeighths 0x06 shift altgr ampersand 0x07 shift -asciicircum 0x07 altgr -fiveeighths 0x07 shift altgr +threequarters 0x07 altgr slash 0x08 shift braceleft 0x08 altgr -seveneighths 0x08 shift altgr parenleft 0x09 shift bracketleft 0x09 altgr -trademark 0x09 shift altgr parenright 0x0a shift bracketright 0x0a altgr plusminus 0x0a shift altgr @@ -36,28 +34,22 @@ backslash 0x0c altgr questiondown 0x0c shift altgr minus 0x0d underscore 0x0d shift -dead_cedilla 0x0d altgr -dead_ogonek 0x0d shift altgr +division 0x0d altgr at 0x10 altgr Greek_OMEGA 0x10 shift altgr -lstroke 0x11 altgr -Lstroke 0x11 shift altgr EuroSign 0x12 altgr paragraph 0x13 altgr registered 0x13 shift altgr -tslash 0x14 altgr -Tslash 0x14 shift altgr +trademark 0x14 altgr leftarrow 0x15 altgr yen 0x15 shift altgr -downarrow 0x16 altgr -uparrow 0x16 shift altgr +ucircumflex 0x16 altgr +Ucircumflex 0x16 shift altgr idotless 0x17 -I 0x17 shift -rightarrow 0x17 altgr -oslash 0x18 altgr -Ooblique 0x18 shift altgr -thorn 0x19 altgr -THORN 0x19 shift altgr +icircumflex 0x17 altgr +Icircumflex 0x17 shift altgr +ocircumflex 0x18 altgr +Ocircumflex 0x18 shift altgr gbreve 0x1a Gbreve 0x1a shift dead_diaeresis 0x1a altgr @@ -66,37 +58,28 @@ udiaeresis 0x1b Udiaeresis 0x1b shift asciitilde 0x1b altgr dead_macron 0x1b shift altgr -ae 0x1e altgr -AE 0x1e shift altgr -ssharp 0x1f altgr -section 0x1f shift altgr -eth 0x20 altgr -ETH 0x20 shift altgr -dstroke 0x21 altgr -ordfeminine 0x21 shift altgr -eng 0x22 altgr -ENG 0x22 shift altgr -hstroke 0x23 altgr -Hstroke 0x23 shift altgr -kra 0x25 altgr -ampersand 0x25 shift altgr -lstroke 0x26 altgr -Lstroke 0x26 shift altgr +acircumflex 0x1e altgr +Acircumflex 0x1e shift altgr +section 0x1f altgr +ordfeminine 0x21 altgr +j 0x24 altgr +J 0x24 shift altgr scedilla 0x27 Scedilla 0x27 shift -dead_acute 0x27 altgr -dead_doubleacute 0x27 shift altgr +acute 0x27 altgr +dead_acute 0x27 shift altgr i 0x28 Iabovedot 0x28 shift -dead_circumflex 0x28 altgr +apostrophe 0x28 altgr dead_caron 0x28 shift altgr -backslash 0x29 -quotedbl 0x29 shift -asciitilde 0x29 altgr +quotedbl 0x29 +backslash 0x29 shift +plusminus 0x29 altgr +degree 0x29 shift altgr comma 0x2b semicolon 0x2b shift -bar 0x2b altgr -dead_breve 0x2b shift altgr +grave 0x2b altgr +dead_grave 0x2b shift altgr guillemotleft 0x2c altgr less 0x2c shift altgr guillemotright 0x2d altgr @@ -104,20 +87,21 @@ greater 0x2d shift altgr cent 0x2e altgr copyright 0x2e shift altgr leftdoublequotemark 0x2f altgr -grave 0x2f shift altgr +leftsinglequotemark 0x2f shift altgr rightdoublequotemark 0x30 altgr -apostrophe 0x30 shift altgr +rightsinglequotemark 0x30 shift altgr +n 0x31 altgr +N 0x31 shift altgr mu 0x32 altgr masculine 0x32 shift altgr odiaeresis 0x33 Odiaeresis 0x33 shift -less 0x33 altgr -multiply 0x33 shift altgr +multiply 0x33 altgr ccedilla 0x34 Ccedilla 0x34 shift -greater 0x34 altgr +periodcentered 0x34 altgr division 0x34 shift altgr period 0x35 colon 0x35 shift -dead_belowdot 0x35 altgr +dead_abovedot 0x35 altgr dead_abovedot 0x35 shift altgr ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console 2008-12-16 15:32 [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console John Haxby ` (2 preceding siblings ...) 2008-12-16 15:49 ` [Qemu-devel] [PATCH 3 " John Haxby @ 2009-01-07 15:12 ` John Haxby 2009-01-08 20:17 ` Anthony Liguori 3 siblings, 1 reply; 9+ messages in thread From: John Haxby @ 2009-01-07 15:12 UTC (permalink / raw) To: qemu-devel Hello All, John Haxby wrote: > This is a version of a patch that I originally posted to xen-devel. > The xen vnc console and the qemu vnc console have diverged a little, > but the problems and subsequent fixes apply equally to both. [snip] I haven't seen any comments about these patches -- is there something that I should do or am I just being overly impatient? thanks, jch ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console 2009-01-07 15:12 ` [Qemu-devel] [PATCH 0 " John Haxby @ 2009-01-08 20:17 ` Anthony Liguori 0 siblings, 0 replies; 9+ messages in thread From: Anthony Liguori @ 2009-01-08 20:17 UTC (permalink / raw) To: qemu-devel John Haxby wrote: > Hello All, > > John Haxby wrote: >> This is a version of a patch that I originally posted to xen-devel. >> The xen vnc console and the qemu vnc console have diverged a little, >> but the problems and subsequent fixes apply equally to both. > [snip] > > I haven't seen any comments about these patches -- is there something > that I should do or am I just being overly impatient? Nope, just unlucky as I didn't get around to the patches before going on holiday. Am looking now. FWIW, resending the series again with a [RESEND] tag is a good way to get people's attention if it's gone a week or two with no comments. Regards, Anthony Liguori > thanks, jch > > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-01-08 21:06 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-16 15:32 [Qemu-devel] [PATCH 0 of 3] Fix keymap handling for vnc console John Haxby 2008-12-16 15:46 ` [Qemu-devel] [PATCH 1 " John Haxby 2009-01-08 20:27 ` Anthony Liguori 2009-01-08 20:46 ` John Haxby 2009-01-08 21:06 ` Anthony Liguori 2008-12-16 15:48 ` [Qemu-devel] [PATCH 2 " John Haxby 2008-12-16 15:49 ` [Qemu-devel] [PATCH 3 " John Haxby 2009-01-07 15:12 ` [Qemu-devel] [PATCH 0 " John Haxby 2009-01-08 20:17 ` Anthony Liguori
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).