From bd1fffc449203a9a20de243d97dedde8f34cb951 Mon Sep 17 00:00:00 2001 Message-Id: From: Michal Privoznik Date: Mon, 6 Jan 2014 17:09:30 +0100 Subject: [PATCH] virkeycode: Allow ANSI_A https://bugzilla.redhat.com/show_bug.cgi?id=1044806 Currently, sending the ANSI_A keycode from os_x codepage doesn't work as it has a special value of 0x0. Our internal code handles that no different to other not defined keycodes. Hence, in order to allow it we must change all the undefined keycodes from 0 to -1 and adapt some code too. # virsh send-key guestname --codeset os_x ANSI_A error: invalid keycode: 'ANSI_A' # virsh send-key guestname --codeset os_x ANSI_B # virsh send-key guestname --codeset os_x ANSI_C Signed-off-by: Michal Privoznik (cherry picked from commit 72ffbd1bf3005907c604d94c13058c9e547d46e8) Signed-off-by: Jiri Denemark --- src/util/virkeycode-mapgen.py | 4 ++-- src/util/virkeycode.c | 4 ++-- tools/virsh-domain.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/util/virkeycode-mapgen.py b/src/util/virkeycode-mapgen.py index 22b21b4..8360bfe 100755 --- a/src/util/virkeycode-mapgen.py +++ b/src/util/virkeycode-mapgen.py @@ -86,12 +86,12 @@ for i in range(len(cols)): if isname: print "const char *virKeymapNames_" + name + "[] = {" else: - print "unsigned short virKeymapValues_" + name + "[] = {" + print "int virKeymapValues_" + name + "[] = {" for entry in keycodes: if isname: print " " + quotestring(entry[i] or "NULL") + "," else: - print " " + (entry[i] or "0") + "," + print " " + (entry[i] or "-1") + "," print "};\n" diff --git a/src/util/virkeycode.c b/src/util/virkeycode.c index 50594d6..7880a0a 100644 --- a/src/util/virkeycode.c +++ b/src/util/virkeycode.c @@ -50,7 +50,7 @@ static const char **virKeymapNames[] = { }; verify(ARRAY_CARDINALITY(virKeymapNames) == VIR_KEYCODE_SET_LAST); -static unsigned short *virKeymapValues[] = { +static int *virKeymapValues[] = { [VIR_KEYCODE_SET_LINUX] = virKeymapValues_linux, [VIR_KEYCODE_SET_XT] = @@ -113,7 +113,7 @@ int virKeycodeValueTranslate(virKeycodeSet from_codeset, { size_t i; - if (key_value <= 0) + if (key_value < 0) return -1; diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9afe44a..3895f39 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -6884,7 +6884,7 @@ vshKeyCodeGetInt(const char *key_name) { unsigned int val; - if (virStrToLong_ui(key_name, NULL, 0, &val) < 0 || val > 0xffff || !val) + if (virStrToLong_ui(key_name, NULL, 0, &val) < 0 || val > 0xffff) return -1; return val; } @@ -6925,8 +6925,8 @@ cmdSendKey(vshControl *ctl, const vshCmd *cmd) goto cleanup; } - if ((keycode = vshKeyCodeGetInt(opt->data)) <= 0) { - if ((keycode = virKeycodeValueFromString(codeset, opt->data)) <= 0) { + if ((keycode = vshKeyCodeGetInt(opt->data)) < 0) { + if ((keycode = virKeycodeValueFromString(codeset, opt->data)) < 0) { vshError(ctl, _("invalid keycode: '%s'"), opt->data); goto cleanup; } -- 1.8.5.2