input-linux: factor out input_linux_handle_keyboard

No functional change.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 1466067800-25434-3-git-send-email-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2016-06-16 11:03:19 +02:00
parent d4df42c431
commit 2330e9e7cc

View file

@ -188,53 +188,39 @@ static void input_linux_toggle_grab(InputLinux *il)
} }
} }
static void input_linux_event_keyboard(void *opaque) static void input_linux_handle_keyboard(InputLinux *il,
struct input_event *event)
{ {
InputLinux *il = opaque; if (event->type == EV_KEY) {
struct input_event event; if (event->value > 2 || (event->value > 1 && !il->repeat)) {
int rc;
for (;;) {
rc = read(il->fd, &event, sizeof(event));
if (rc != sizeof(event)) {
if (rc < 0 && errno != EAGAIN) {
fprintf(stderr, "%s: read: %s\n", __func__, strerror(errno));
qemu_set_fd_handler(il->fd, NULL, NULL, NULL);
close(il->fd);
}
break;
}
switch (event.type) {
case EV_KEY:
if (event.value > 2 || (event.value > 1 && !il->repeat)) {
/* /*
* ignore autorepeat + unknown key events * ignore autorepeat + unknown key events
* 0 == up, 1 == down, 2 == autorepeat, other == undefined * 0 == up, 1 == down, 2 == autorepeat, other == undefined
*/ */
continue; return;
} }
if (event.code >= KEY_CNT) { if (event->code >= KEY_CNT) {
/* /*
* Should not happen. But better safe than sorry, * Should not happen. But better safe than sorry,
* and we make Coverity happy too. * and we make Coverity happy too.
*/ */
continue; return;
} }
/* keep track of key state */ /* keep track of key state */
if (!il->keydown[event.code] && event.value) { if (!il->keydown[event->code] && event->value) {
il->keydown[event.code] = true; il->keydown[event->code] = true;
il->keycount++; il->keycount++;
} }
if (il->keydown[event.code] && !event.value) { if (il->keydown[event->code] && !event->value) {
il->keydown[event.code] = false; il->keydown[event->code] = false;
il->keycount--; il->keycount--;
} }
/* send event to guest when grab is active */ /* send event to guest when grab is active */
if (il->grab_active) { if (il->grab_active) {
int qcode = qemu_input_linux_to_qcode(event.code); int qcode = qemu_input_linux_to_qcode(event->code);
qemu_input_event_send_key_qcode(NULL, qcode, event.value); qemu_input_event_send_key_qcode(NULL, qcode, event->value);
} }
/* hotkey -> record switch request ... */ /* hotkey -> record switch request ... */
@ -252,8 +238,27 @@ static void input_linux_event_keyboard(void *opaque)
il->grab_request = false; il->grab_request = false;
input_linux_toggle_grab(il); input_linux_toggle_grab(il);
} }
}
}
static void input_linux_event_keyboard(void *opaque)
{
InputLinux *il = opaque;
struct input_event event;
int rc;
for (;;) {
rc = read(il->fd, &event, sizeof(event));
if (rc != sizeof(event)) {
if (rc < 0 && errno != EAGAIN) {
fprintf(stderr, "%s: read: %s\n", __func__, strerror(errno));
qemu_set_fd_handler(il->fd, NULL, NULL, NULL);
close(il->fd);
}
break; break;
} }
input_linux_handle_keyboard(il, &event);
} }
} }