Commit 568c73a4 authored by Eric Blake's avatar Eric Blake Committed by Markus Armbruster
Browse files

input: Convert to new qapi union layout



We have two issues with our qapi union layout:
1) Even though the QMP wire format spells the tag 'type', the
C code spells it 'kind', requiring some hacks in the generator.
2) The C struct uses an anonymous union, which places all tag
values in the same namespace as all non-variant members. This
leads to spurious collisions if a tag value matches a non-variant
member's name.

Make the conversion to the new layout for input-related code.

Signed-off-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <1445898903-12082-20-git-send-email-eblake@redhat.com>
[Commit message tweaked slightly]
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent 130257dc
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1735,15 +1735,15 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
            if (*endp != '\0') {
                goto err_out;
            }
            keylist->value->kind = KEY_VALUE_KIND_NUMBER;
            keylist->value->number = value;
            keylist->value->type = KEY_VALUE_KIND_NUMBER;
            keylist->value->u.number = value;
        } else {
            int idx = index_from_key(keyname_buf);
            if (idx == Q_KEY_CODE_MAX) {
                goto err_out;
            }
            keylist->value->kind = KEY_VALUE_KIND_QCODE;
            keylist->value->qcode = idx;
            keylist->value->type = KEY_VALUE_KIND_QCODE;
            keylist->value->u.qcode = idx;
        }

        if (!separator) {
+6 −6
Original line number Diff line number Diff line
@@ -842,13 +842,13 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
    ChannelState *s = (ChannelState *)dev;
    int qcode, keycode;

    assert(evt->kind == INPUT_EVENT_KIND_KEY);
    qcode = qemu_input_key_value_to_qcode(evt->key->key);
    assert(evt->type == INPUT_EVENT_KIND_KEY);
    qcode = qemu_input_key_value_to_qcode(evt->u.key->key);
    trace_escc_sunkbd_event_in(qcode, QKeyCode_lookup[qcode],
                               evt->key->down);
                               evt->u.key->down);

    if (qcode == Q_KEY_CODE_CAPS_LOCK) {
        if (evt->key->down) {
        if (evt->u.key->down) {
            s->caps_lock_mode ^= 1;
            if (s->caps_lock_mode == 2) {
                return; /* Drop second press */
@@ -862,7 +862,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
    }

    if (qcode == Q_KEY_CODE_NUM_LOCK) {
        if (evt->key->down) {
        if (evt->u.key->down) {
            s->num_lock_mode ^= 1;
            if (s->num_lock_mode == 2) {
                return; /* Drop second press */
@@ -876,7 +876,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
    }

    keycode = qcode_to_keycode[qcode];
    if (!evt->key->down) {
    if (!evt->u.key->down) {
        keycode |= 0x80;
    }
    trace_escc_sunkbd_event_out(keycode);
+16 −16
Original line number Diff line number Diff line
@@ -119,33 +119,33 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src,
    assert(hs->n < QUEUE_LENGTH);
    e = &hs->ptr.queue[(hs->head + hs->n) & QUEUE_MASK];

    switch (evt->kind) {
    switch (evt->type) {
    case INPUT_EVENT_KIND_REL:
        if (evt->rel->axis == INPUT_AXIS_X) {
            e->xdx += evt->rel->value;
        } else if (evt->rel->axis == INPUT_AXIS_Y) {
            e->ydy += evt->rel->value;
        if (evt->u.rel->axis == INPUT_AXIS_X) {
            e->xdx += evt->u.rel->value;
        } else if (evt->u.rel->axis == INPUT_AXIS_Y) {
            e->ydy += evt->u.rel->value;
        }
        break;

    case INPUT_EVENT_KIND_ABS:
        if (evt->rel->axis == INPUT_AXIS_X) {
            e->xdx = evt->rel->value;
        } else if (evt->rel->axis == INPUT_AXIS_Y) {
            e->ydy = evt->rel->value;
        if (evt->u.rel->axis == INPUT_AXIS_X) {
            e->xdx = evt->u.rel->value;
        } else if (evt->u.rel->axis == INPUT_AXIS_Y) {
            e->ydy = evt->u.rel->value;
        }
        break;

    case INPUT_EVENT_KIND_BTN:
        if (evt->btn->down) {
            e->buttons_state |= bmap[evt->btn->button];
            if (evt->btn->button == INPUT_BUTTON_WHEEL_UP) {
        if (evt->u.btn->down) {
            e->buttons_state |= bmap[evt->u.btn->button];
            if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) {
                e->dz--;
            } else if (evt->btn->button == INPUT_BUTTON_WHEEL_DOWN) {
            } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) {
                e->dz++;
            }
        } else {
            e->buttons_state &= ~bmap[evt->btn->button];
            e->buttons_state &= ~bmap[evt->u.btn->button];
        }
        break;

@@ -223,8 +223,8 @@ static void hid_keyboard_event(DeviceState *dev, QemuConsole *src,
    int scancodes[3], i, count;
    int slot;

    count = qemu_input_key_value_to_scancode(evt->key->key,
                                             evt->key->down,
    count = qemu_input_key_value_to_scancode(evt->u.key->key,
                                             evt->u.key->down,
                                             scancodes);
    if (hs->n + count > QUEUE_LENGTH) {
        fprintf(stderr, "usb-kbd: warning: key event queue full\n");
+12 −12
Original line number Diff line number Diff line
@@ -183,8 +183,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
    int scancodes[3], i, count;

    qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
    count = qemu_input_key_value_to_scancode(evt->key->key,
                                             evt->key->down,
    count = qemu_input_key_value_to_scancode(evt->u.key->key,
                                             evt->u.key->down,
                                             scancodes);
    for (i = 0; i < count; i++) {
        ps2_put_keycode(s, scancodes[i]);
@@ -393,25 +393,25 @@ static void ps2_mouse_event(DeviceState *dev, QemuConsole *src,
    if (!(s->mouse_status & MOUSE_STATUS_ENABLED))
        return;

    switch (evt->kind) {
    switch (evt->type) {
    case INPUT_EVENT_KIND_REL:
        if (evt->rel->axis == INPUT_AXIS_X) {
            s->mouse_dx += evt->rel->value;
        } else if (evt->rel->axis == INPUT_AXIS_Y) {
            s->mouse_dy -= evt->rel->value;
        if (evt->u.rel->axis == INPUT_AXIS_X) {
            s->mouse_dx += evt->u.rel->value;
        } else if (evt->u.rel->axis == INPUT_AXIS_Y) {
            s->mouse_dy -= evt->u.rel->value;
        }
        break;

    case INPUT_EVENT_KIND_BTN:
        if (evt->btn->down) {
            s->mouse_buttons |= bmap[evt->btn->button];
            if (evt->btn->button == INPUT_BUTTON_WHEEL_UP) {
        if (evt->u.btn->down) {
            s->mouse_buttons |= bmap[evt->u.btn->button];
            if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) {
                s->mouse_dz--;
            } else if (evt->btn->button == INPUT_BUTTON_WHEEL_DOWN) {
            } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) {
                s->mouse_dz++;
            }
        } else {
            s->mouse_buttons &= ~bmap[evt->btn->button];
            s->mouse_buttons &= ~bmap[evt->u.btn->button];
        }
        break;

+14 −13
Original line number Diff line number Diff line
@@ -191,44 +191,45 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
    virtio_input_event event;
    int qcode;

    switch (evt->kind) {
    switch (evt->type) {
    case INPUT_EVENT_KIND_KEY:
        qcode = qemu_input_key_value_to_qcode(evt->key->key);
        qcode = qemu_input_key_value_to_qcode(evt->u.key->key);
        if (qcode && keymap_qcode[qcode]) {
            event.type  = cpu_to_le16(EV_KEY);
            event.code  = cpu_to_le16(keymap_qcode[qcode]);
            event.value = cpu_to_le32(evt->key->down ? 1 : 0);
            event.value = cpu_to_le32(evt->u.key->down ? 1 : 0);
            virtio_input_send(vinput, &event);
        } else {
            if (evt->key->down) {
            if (evt->u.key->down) {
                fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__,
                        qcode, QKeyCode_lookup[qcode]);
            }
        }
        break;
    case INPUT_EVENT_KIND_BTN:
        if (keymap_button[evt->btn->button]) {
        if (keymap_button[evt->u.btn->button]) {
            event.type  = cpu_to_le16(EV_KEY);
            event.code  = cpu_to_le16(keymap_button[evt->btn->button]);
            event.value = cpu_to_le32(evt->btn->down ? 1 : 0);
            event.code  = cpu_to_le16(keymap_button[evt->u.btn->button]);
            event.value = cpu_to_le32(evt->u.btn->down ? 1 : 0);
            virtio_input_send(vinput, &event);
        } else {
            if (evt->btn->down) {
            if (evt->u.btn->down) {
                fprintf(stderr, "%s: unmapped button: %d [%s]\n", __func__,
                        evt->btn->button, InputButton_lookup[evt->btn->button]);
                        evt->u.btn->button,
                        InputButton_lookup[evt->u.btn->button]);
            }
        }
        break;
    case INPUT_EVENT_KIND_REL:
        event.type  = cpu_to_le16(EV_REL);
        event.code  = cpu_to_le16(axismap_rel[evt->rel->axis]);
        event.value = cpu_to_le32(evt->rel->value);
        event.code  = cpu_to_le16(axismap_rel[evt->u.rel->axis]);
        event.value = cpu_to_le32(evt->u.rel->value);
        virtio_input_send(vinput, &event);
        break;
    case INPUT_EVENT_KIND_ABS:
        event.type  = cpu_to_le16(EV_ABS);
        event.code  = cpu_to_le16(axismap_abs[evt->abs->axis]);
        event.value = cpu_to_le32(evt->abs->value);
        event.code  = cpu_to_le16(axismap_abs[evt->u.abs->axis]);
        event.value = cpu_to_le32(evt->u.abs->value);
        virtio_input_send(vinput, &event);
        break;
    default:
Loading