[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libvir] [PATCH] Keyboard layout support for QEMU/KVM



This patch adds support for qemu's -k option, which is required to run
virt-manager with a non-US keymap. Without it, keys are remapped a number
of times, ending up with a completely unusable layout.

Even with this patch I am having problems using the AltGr key, returning a
scancode of 00. This seems to be a qemu problem though.

-- 
Daniel Hokka Zakrisson
Index: src/qemu_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.c,v
retrieving revision 1.26
diff -u -p -r1.26 qemu_conf.c
--- src/qemu_conf.c	14 Jan 2008 14:05:25 -0000	1.26
+++ src/qemu_conf.c	14 Jan 2008 17:55:33 -0000
@@ -218,6 +218,7 @@ void qemudFreeVMDef(struct qemud_vm_def 
         input = input->next;
         free(prev);
     }
+    xmlFree(def->keymap);
     free(def);
 }
 
@@ -1245,6 +1246,7 @@ static struct qemud_vm_def *qemudParseXM
             else
                 strcpy(def->vncListen, driver->vncListen);
             def->vncListen[BR_INET_ADDR_MAXLEN-1] = '\0';
+            def->keymap = (char *) xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "keymap");
             xmlFree(vncport);
             xmlFree(vnclisten);
         } else if (!strcmp((char *)prop, "sdl")) {
@@ -1807,6 +1809,12 @@ int qemudBuildCommandLine(virConnectPtr 
             goto no_memory;
         if (!((*argv)[++n] = strdup(vncdisplay)))
             goto no_memory;
+        if (vm->def->keymap) {
+            if (!((*argv)[++n] = strdup("-k")))
+                goto no_memory;
+            if (!((*argv)[++n] = strdup(vm->def->keymap)))
+                goto no_memory;
+        }
     } else if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE) {
         /* Nada - we added -nographic earlier in this function */
     } else {
@@ -2918,6 +2926,11 @@ char *qemudGenerateXML(virConnectPtr con
                               def->vncListen) < 0)
             goto no_memory;
 
+        if (def->keymap &&
+            virBufferVSprintf(buf, " keymap='%s'",
+                              def->keymap) < 0)
+            goto no_memory;
+
         if (virBufferAdd(buf, "/>\n", -1) < 0)
             goto no_memory;
         break;
Index: src/qemu_conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.h,v
retrieving revision 1.15
diff -u -p -r1.15 qemu_conf.h
--- src/qemu_conf.h	14 Jan 2008 14:05:25 -0000	1.15
+++ src/qemu_conf.h	14 Jan 2008 17:55:33 -0000
@@ -206,6 +206,7 @@ struct qemud_vm_def {
     int vncPort;
     int vncActivePort;
     char vncListen[BR_INET_ADDR_MAXLEN];
+    char *keymap;
 
     int ndisks;
     struct qemud_vm_disk_def *disks;

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]