qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Bug in SDL key event processing
Date: Thu, 10 Jul 2008 14:25:05 -0500	[thread overview]
Message-ID: <48766211.2090304@codemonkey.ws> (raw)
In-Reply-To: <48762C59.9010204@dbservice.com>

Tomas Carnecky wrote:
> Anthony Liguori wrote:
>> Tomas Carnecky wrote:
>>> Again, you _can not_ assume that the X keycode (XKeyEvent.keycode or 
>>> SDL_KeyboardEvent.scancode) has any particular meaning. If you run 
>>> on pure X11, you have to translate it into a keysym 
>>> (XKeycodeToKeysym()) and use that instead. If you run on SDL, you 
>>> have to use keysym.sym.
>>
>> Having to use keysym.sym means that -k is *always* required.  So it 
>> looks like we need to detect when the keycodes translation is not 
>> xfree86 and insist that a -k option is passed.
>
> What does '-k' actually mean? It's not the current layout I use in 
> X11. Is it the layout that the VM uses?

It's the type of hardware keyboard being exposed to the guest.  It has 
the side effect of always processing keysyms instead of scancodes.

> Keep in mind that using '-k' completely changes the semantics of the 
> keyboard. I'm using the colemak layout, so my top row is: qwfpg. For 
> the sake of simplicity, assume that the guest uses the standard en-us 
> layout.

Then you would need to add a colemak translation table if you wanted 
that to be reflected in the guest.  However, if you use -k en-us and use 
en-us in the guest, it should just work for you.

> Now let's go through what happens when I press the third key of the 
> top row (labeled 'e' on standard US keyboard). Without the '-k' 
> switch, qemu uses the X11 keycode (26) and translates that into the 
> corresponding scancode. The VM then receives '0x12'. The guest will 
> then translate it to an 'e'.

This is because of your weird evdev scancodes.  QEMU expects the 
scancodes to be xfree86, not evdev.

> Now let's see what happens when I use '-k en-us': When I press the 
> third key of the top row, qemu receives a SDLK_F keyboard event. 
> Because I loaded the en-us layout, the qemu sdl frontend translates 
> the event into '0x21' and sends that to the VM. The guest will then 
> translate it to a 'f'.
>
> Without '-k', the mapping is purely 'positional', qemu tries to guess 
> which physical key was pressed on the keyboard, and send the 
> corresponding scancode to the guest. With '-k' qemu translates the 
> events according to their meaning (the user meant to send me a 'f') 
> and generates the corresponding scancode.

The issue is that we always assume scancodes from the xfree86 keycodes.  
We have one translation table that converts from xfree86=>ps/2.

The real fix for this problem would be to detect what the current xkb 
keycode is, and then use an appropriate translation to generate ps/2 
scancodes.

Honestly though, this is the first time I've seen this problem come up.  
Patches are certainly welcome but this appears to be a very odd case.  I 
think you're asking for trouble using evdev.

> Please consider making the -k switch easier to understand. I'd suggest 
> having two modes:
>
> -k raw[=model]: when the user presses the top left key, generate a 
> scancode corresponding to the top left key. Use 'model' to translate 
> the SDL scancode (possible useful for other frontends as well).
>
> -k map[=keymap]: Guest OS uses this keymap: 'keymap'. When the user 
> presses 'f', send whatever scancode is needed to have the guest 
> generate 'f'.
>
>
> I'd expect -k map=en-us to be the default. That way the user doesn't 
> have to change the layout in each of the VMs (just tell them to use 
> en-us when installing the guest). When he/she changes the layout in 
> the host, it will be 'changed' in all guests as well.

The problem with that is that it forces non en-us users to specify a -k 
option.  Right now, as long as you use the xfree86 keycodes for xkb, SDL 
will Just Work regardless of what your keyboard layout is.  There are 
far more non en-us users than en-us users who have  an odd xkb keycodes.

Regards,

Anthony Liguori

>
> tom
>
>

  parent reply	other threads:[~2008-07-10 19:25 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-09 23:27 [Qemu-devel] Bug in SDL key event processing Tomas Carnecky
2008-07-09 23:37 ` Samuel Thibault
2008-07-09 23:46   ` Tomas Carnecky
2008-07-09 23:55     ` Samuel Thibault
2008-07-10  0:09       ` Tomas Carnecky
2008-07-10  0:20         ` Samuel Thibault
2008-07-10  3:19         ` Anthony Liguori
2008-07-10  7:56           ` Tomas Carnecky
2008-07-10 13:35             ` Anthony Liguori
2008-07-10 13:43               ` Tomas Carnecky
2008-07-10 13:56                 ` Anthony Liguori
2008-07-10 14:03                 ` Tomas Carnecky
2008-07-10 14:10                   ` Samuel Thibault
2008-07-10 14:20                     ` Tomas Carnecky
2008-07-10 14:49                       ` Samuel Thibault
2008-07-10 14:39                   ` Anthony Liguori
2008-07-10 15:35                     ` Tomas Carnecky
2008-07-10 15:51                       ` Samuel Thibault
2008-07-10 19:25                       ` Anthony Liguori [this message]
2008-07-10 19:51                         ` Tomas Carnecky
2008-07-10 21:55                         ` Samuel Thibault
2008-07-10 22:03                           ` Anthony Liguori
2008-07-10 22:14                             ` Samuel Thibault
2008-07-14 16:02                           ` Ian Jackson
2008-07-14 16:27                             ` Samuel Thibault
2008-07-14 16:01                         ` Ian Jackson
2008-07-09 23:52   ` Anthony Liguori
2008-07-10 12:03     ` Jamie Lokier
2008-07-10 12:24       ` Samuel Thibault
  -- strict thread matches above, loose matches on Subject: below --
2008-07-10 14:22 Juergen Keil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48766211.2090304@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).