[libvirt] [PATCH 1/2] Fix keymap used to talk with QEMU

Daniel P. Berrange berrange at redhat.com
Fri Aug 26 10:41:47 UTC 2011


On Thu, Aug 25, 2011 at 11:20:18AM -0600, Eric Blake wrote:
> On 08/25/2011 10:49 AM, Daniel P. Berrange wrote:
> >From: "Daniel P. Berrange"<berrange at redhat.com>
> >
> >The QEMU 'sendkey' command expects keys to be encoded in the same
> >way as the RFB extended keycode set. Specfically it wants extended
> 
> s/Specfically/Specifically/
> 
> >keys to have the high bit of the first byte set, while the Linux
> >XT KBD driver codeset uses the low bit of the second byte. To deal
> >with this we introduce a new keymap 'RFB' and use that in the QEMU
> >driver
> >
> >* include/libvirt/libvirt.h.in: Add VIR_KEYCODE_SET_RFB
> >* src/qemu/qemu_driver.c: Use RFB keycode set instead of XT KBD
> >* src/util/virkeycode-mapgen.py: Auto-generate the RFB keycode
> >   set from the XT KBD set
> >* src/util/virkeycode.c: Add RFB keycode entry to table. Add a
> >   verify check on cardinality of the codeOffset table
> >---
> >  include/libvirt/libvirt.h.in  |    1 +
> >  src/qemu/qemu_driver.c        |    8 ++++----
> >  src/util/virkeycode-mapgen.py |   12 ++++++++++++
> >  src/util/virkeycode.c         |    5 +++++
> >  4 files changed, 22 insertions(+), 4 deletions(-)
> 
> >@@ -62,7 +63,10 @@ static unsigned int codeOffset[] = {
> >          offsetof(struct keycode, usb),
> >      [VIR_KEYCODE_SET_WIN32] =
> >          offsetof(struct keycode, win32),
> >+    [VIR_KEYCODE_SET_RFB] =
> >+        offsetof(struct keycode, rfb),
> >  };
> >+extern int (*codeOffsetVerify(void)) [verify_true (ARRAY_CARDINALITY(codeOffset) == VIR_KEYCODE_SET_LAST)]; \
> 
> Why the trailing backslash?
> 
> Also, open-coding this verify is dangerous; gcc warnings have
> changed over time, rendering certain verification styles that were
> once safe into something that trips up -Werror.  It is safer (and
> shorter!) to let gnulib worry about gcc quirks, by changing this
> line to just be:
> 
> verify(ARRAY_CARDINALITY(codeOffset) == VIR_KEYCODE_SET_LAST);

Yeah it was a stupid cut+paste from src/util/util.h where we had to
open-code it for the enums, because the gnulib macro resulted in
clashing symbols when used more than one.


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list