input-linux: initialize key state
Query input device keys, initialize state accordingly, so the correct state is reflected in case any key is pressed at initialization time. There is a high chance for this to actually happen for the 'enter' key in case you start qemu with a terminal command (directly or virsh). When finding any pressed keys the input grab is delayed until all keys are lifted, to avoid confusing guest and host with appearently stuck keys. Reported-by: Muted Bytes <mutedbytes@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 1476277384-30365-1-git-send-email-kraxel@redhat.com
This commit is contained in:
parent
dbee9897d5
commit
2a57c55f26
@ -347,7 +347,8 @@ static void input_linux_event(void *opaque)
|
|||||||
static void input_linux_complete(UserCreatable *uc, Error **errp)
|
static void input_linux_complete(UserCreatable *uc, Error **errp)
|
||||||
{
|
{
|
||||||
InputLinux *il = INPUT_LINUX(uc);
|
InputLinux *il = INPUT_LINUX(uc);
|
||||||
uint8_t evtmap, relmap, absmap, keymap[KEY_CNT / 8];
|
uint8_t evtmap, relmap, absmap;
|
||||||
|
uint8_t keymap[KEY_CNT / 8], keystate[KEY_CNT / 8];
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int rc, ver;
|
int rc, ver;
|
||||||
|
|
||||||
@ -394,6 +395,7 @@ static void input_linux_complete(UserCreatable *uc, Error **errp)
|
|||||||
if (evtmap & (1 << EV_KEY)) {
|
if (evtmap & (1 << EV_KEY)) {
|
||||||
memset(keymap, 0, sizeof(keymap));
|
memset(keymap, 0, sizeof(keymap));
|
||||||
rc = ioctl(il->fd, EVIOCGBIT(EV_KEY, sizeof(keymap)), keymap);
|
rc = ioctl(il->fd, EVIOCGBIT(EV_KEY, sizeof(keymap)), keymap);
|
||||||
|
rc = ioctl(il->fd, EVIOCGKEY(sizeof(keystate)), keystate);
|
||||||
for (i = 0; i < KEY_CNT; i++) {
|
for (i = 0; i < KEY_CNT; i++) {
|
||||||
if (keymap[i / 8] & (1 << (i % 8))) {
|
if (keymap[i / 8] & (1 << (i % 8))) {
|
||||||
if (linux_is_button(i)) {
|
if (linux_is_button(i)) {
|
||||||
@ -401,12 +403,21 @@ static void input_linux_complete(UserCreatable *uc, Error **errp)
|
|||||||
} else {
|
} else {
|
||||||
il->num_keys++;
|
il->num_keys++;
|
||||||
}
|
}
|
||||||
|
if (keystate[i / 8] & (1 << (i % 8))) {
|
||||||
|
il->keydown[i] = true;
|
||||||
|
il->keycount++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_set_fd_handler(il->fd, input_linux_event, NULL, il);
|
qemu_set_fd_handler(il->fd, input_linux_event, NULL, il);
|
||||||
input_linux_toggle_grab(il);
|
if (il->keycount) {
|
||||||
|
/* delay grab until all keys are released */
|
||||||
|
il->grab_request = true;
|
||||||
|
} else {
|
||||||
|
input_linux_toggle_grab(il);
|
||||||
|
}
|
||||||
QTAILQ_INSERT_TAIL(&inputs, il, next);
|
QTAILQ_INSERT_TAIL(&inputs, il, next);
|
||||||
il->initialized = true;
|
il->initialized = true;
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user