diff mbox

hw/input/hid.c Fix capslock hid code

Message ID 1421880521-7664-1-git-send-email-dvaleev@suse.de
State New
Headers show

Commit Message

dvaleev@suse.de Jan. 21, 2015, 10:48 p.m. UTC
From: Dinar Valeev <dvaleev@suse.com>

When ever USB keyboard is used, e.g. '-usbdevice keyboard' pressing
caps lock key send 0x32 hid code, which is treated as backslash.
Instead it should be 0x39 code. This affects sending uppercase keys,
as they typed whith caps lock active.

While on x86 this can be workarounded by using ps/2 protocol. On
Power it is crusial as we don't have anything else than USB.

This is fixes guest automation tasts over vnc.

Signed-off-by: Dinar Valeev <dvaleev@suse.com>
---
 hw/input/hid.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Gerd Hoffmann Jan. 22, 2015, 7:20 a.m. UTC | #1
On Mi, 2015-01-21 at 23:48 +0100, dvaleev@suse.de wrote:
> From: Dinar Valeev <dvaleev@suse.com>
> 
> When ever USB keyboard is used, e.g. '-usbdevice keyboard' pressing
> caps lock key send 0x32 hid code, which is treated as backslash.
> Instead it should be 0x39 code. This affects sending uppercase keys,
> as they typed whith caps lock active.
> 
> While on x86 this can be workarounded by using ps/2 protocol. On
> Power it is crusial as we don't have anything else than USB.
> 
> This is fixes guest automation tasts over vnc.

That probably happens because your test automation vnc client sends
uppercase letters without also sending shift-down/up events.  The qemu
vnc server logic which is supposed to sync up capslock state between
guest and host thinks capslock is pressed on the host then and injects
some synthetic capslock key events.

Just say'ing FYI, that doesn't render the fix invalid, but you may have
wondered why you are not seeing this with a normal vnc client ;)

Added to input queue.

thanks,
  Gerd
dvaleev@suse.de Jan. 22, 2015, 7:59 a.m. UTC | #2
On 01/22/2015 08:20 AM, Gerd Hoffmann wrote:
> On Mi, 2015-01-21 at 23:48 +0100, dvaleev@suse.de wrote:
>> From: Dinar Valeev <dvaleev@suse.com>
>>
>> When ever USB keyboard is used, e.g. '-usbdevice keyboard' pressing
>> caps lock key send 0x32 hid code, which is treated as backslash.
>> Instead it should be 0x39 code. This affects sending uppercase keys,
>> as they typed whith caps lock active.
>>
>> While on x86 this can be workarounded by using ps/2 protocol. On
>> Power it is crusial as we don't have anything else than USB.
>>
>> This is fixes guest automation tasts over vnc.
>
> That probably happens because your test automation vnc client sends
> uppercase letters without also sending shift-down/up events.  The qemu
> vnc server logic which is supposed to sync up capslock state between
> guest and host thinks capslock is pressed on the host then and injects
> some synthetic capslock key events.
>
> Just say'ing FYI, that doesn't render the fix invalid, but you may have
> wondered why you are not seeing this with a normal vnc client ;)
Yeah, I thought about sending shift+letter. It become better, but not 
really. Sending shift-b would print "|B".

I've seen this behaviour with a home grown perl vnc client, ruby-vnc as 
well as with manual vncviewer client, vnc and SDL ui.

The reproducer is simple: qemu-system-x86_64 -enable-kvm -cdrom 
SLE-12-Server-MINI-ISO-x86_64-GM-DVD.iso -usbdevice keyboard -m 1024

Pressing caps lock produces "\". showkey says backslash is pressed.

Dinar,
>
> Added to input queue.
Thanks
>
> thanks,
>    Gerd
>
>
diff mbox

Patch

diff --git a/hw/input/hid.c b/hw/input/hid.c
index 148c003..58212a7 100644
--- a/hw/input/hid.c
+++ b/hw/input/hid.c
@@ -41,7 +41,7 @@  static const uint8_t hid_usage_keys[0x100] = {
     0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x33,
     0x34, 0x35, 0xe1, 0x31, 0x1d, 0x1b, 0x06, 0x19,
     0x05, 0x11, 0x10, 0x36, 0x37, 0x38, 0xe5, 0x55,
-    0xe2, 0x2c, 0x32, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
+    0xe2, 0x2c, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
     0x3f, 0x40, 0x41, 0x42, 0x43, 0x53, 0x47, 0x5f,
     0x60, 0x61, 0x56, 0x5c, 0x5d, 0x5e, 0x57, 0x59,
     0x5a, 0x5b, 0x62, 0x63, 0x00, 0x00, 0x00, 0x44,