mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-02 11:21:12 +00:00
ce93f64b1e
The QEMU 'sendkey' command expects keys to be encoded in the same way as the RFB extended keycode set. Specifically it wants extended 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
57 lines
1.5 KiB
Python
Executable File
57 lines
1.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
"""
|
|
Generate the big keycodes table for virkeys.
|
|
It read keymaps.csv from stdin and put the generated code to stdout.
|
|
|
|
Please keep keymaps.csv be exactly the same as:
|
|
http://git.gnome.org/browse/gtk-vnc/plain/src/keymaps.csv.
|
|
If anything inconsistent happens, please change this file
|
|
instead of keymaps.csv which is a mirror.
|
|
"""
|
|
|
|
import sys
|
|
import re
|
|
|
|
namecolums = (0,2,10)
|
|
xtkbdkey_index = 8
|
|
|
|
def quotestring(str):
|
|
if str[0] != '"':
|
|
return '"' + str + '"'
|
|
return str
|
|
|
|
print '''
|
|
/* Generated file, DON'T edit it */
|
|
|
|
#ifndef VIRT_KEY_INTERNAL
|
|
# error do not use this; it is not a public header
|
|
#endif
|
|
|
|
struct keycode virKeycodes[] = {
|
|
'''
|
|
|
|
sys.stdin.readline() # eat the fist line.
|
|
|
|
for line in sys.stdin.xreadlines():
|
|
a = re.match("([^,]*)," * 13 + "([^,]*)$", line[0:-1]).groups()
|
|
b = ""
|
|
rfbkey = 0
|
|
for i in namecolums:
|
|
b = b + (a[i] and quotestring(a[i]) or 'NULL') + ','
|
|
for i in [ x for x in range(12) if not x in namecolums ]:
|
|
b = b + (a[i] or '0') + ','
|
|
if i == xtkbdkey_index:
|
|
# RFB keycodes are XT kbd keycodes with a slightly
|
|
# different encoding of 0xe0 scan codes. RFB uses
|
|
# the high bit of the first byte, instead of the low
|
|
# bit of the second byte.
|
|
rfbkey = int(a[i] or '0')
|
|
rfbkey = (rfbkey & 0x100) >> 1 | (rfbkey & 0x7f)
|
|
|
|
# Append RFB keycode as the last column
|
|
b = b + str(rfbkey)
|
|
print " { " + b + "},"
|
|
|
|
print '};'
|