diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2016-03-01 11:15:00 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2016-03-01 11:15:00 +0000 |
commit | 0b85d735831d69ff4ba776e7067ef2e285b234cf (patch) | |
tree | 4c6ab9473a345766c3e6fe3f8742426a80c5242f | |
parent | d9c7737e57d1c5d8505d09b2803ca140875c9657 (diff) | |
parent | 6575ccddf4e7c2484bc14b10d5e89f57506c3953 (diff) |
Merge remote-tracking branch 'remotes/kraxel/tags/pull-input-20160301-1' into staging
qapi: fix input-send-event and promote to stable
# gpg: Signature made Tue 01 Mar 2016 08:19:52 GMT using RSA key ID D3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg: aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
* remotes/kraxel/tags/pull-input-20160301-1:
qapi: promote input-send-event to stable
qapi: rename InputAxis values.
qapi: rename input buttons
qapi: switch x-input-send-event from console to device+head
console: add & use qemu_console_lookup_by_device_name
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | hw/input/hid.c | 4 | ||||
-rw-r--r-- | hw/input/ps2.c | 4 | ||||
-rw-r--r-- | hw/input/virtio-input-hid.c | 4 | ||||
-rw-r--r-- | include/ui/console.h | 2 | ||||
-rw-r--r-- | monitor.c | 2 | ||||
-rw-r--r-- | qapi-schema.json | 52 | ||||
-rw-r--r-- | qmp-commands.hx | 35 | ||||
-rw-r--r-- | scripts/qapi.py | 2 | ||||
-rw-r--r-- | ui/cocoa.m | 4 | ||||
-rw-r--r-- | ui/console.c | 23 | ||||
-rw-r--r-- | ui/gtk.c | 4 | ||||
-rw-r--r-- | ui/input-legacy.c | 4 | ||||
-rw-r--r-- | ui/input.c | 32 | ||||
-rw-r--r-- | ui/sdl.c | 4 | ||||
-rw-r--r-- | ui/sdl2.c | 4 | ||||
-rw-r--r-- | ui/spice-input.c | 4 | ||||
-rw-r--r-- | ui/vnc.c | 19 |
17 files changed, 104 insertions, 99 deletions
diff --git a/hw/input/hid.c b/hw/input/hid.c index b41efbb451..81a85fbdd2 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -140,9 +140,9 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src, case INPUT_EVENT_KIND_BTN: if (evt->u.btn->down) { e->buttons_state |= bmap[evt->u.btn->button]; - if (evt->u.btn->button == INPUT_BUTTON_WHEELUP) { + if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) { e->dz--; - } else if (evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) { + } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) { e->dz++; } } else { diff --git a/hw/input/ps2.c b/hw/input/ps2.c index b6f0e8d8eb..1bd0ddef81 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -406,9 +406,9 @@ static void ps2_mouse_event(DeviceState *dev, QemuConsole *src, case INPUT_EVENT_KIND_BTN: if (evt->u.btn->down) { s->mouse_buttons |= bmap[evt->u.btn->button]; - if (evt->u.btn->button == INPUT_BUTTON_WHEELUP) { + if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) { s->mouse_dz--; - } else if (evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) { + } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) { s->mouse_dz++; } } else { diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index c4af0be9ac..9ca5395739 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -143,8 +143,8 @@ static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_LEFT] = BTN_LEFT, [INPUT_BUTTON_RIGHT] = BTN_RIGHT, [INPUT_BUTTON_MIDDLE] = BTN_MIDDLE, - [INPUT_BUTTON_WHEELUP] = BTN_GEAR_UP, - [INPUT_BUTTON_WHEELDOWN] = BTN_GEAR_DOWN, + [INPUT_BUTTON_WHEEL_UP] = BTN_GEAR_UP, + [INPUT_BUTTON_WHEEL_DOWN] = BTN_GEAR_DOWN, }; static const unsigned int axismap_rel[INPUT_AXIS__MAX] = { diff --git a/include/ui/console.h b/include/ui/console.h index 6631b9690a..f63697182f 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -378,6 +378,8 @@ void graphic_hw_gl_block(QemuConsole *con, bool block); QemuConsole *qemu_console_lookup_by_index(unsigned int index); QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head); +QemuConsole *qemu_console_lookup_by_device_name(const char *device_id, + uint32_t head, Error **errp); bool qemu_console_is_visible(QemuConsole *con); bool qemu_console_is_graphic(QemuConsole *con); bool qemu_console_is_fixedsize(QemuConsole *con); @@ -1375,7 +1375,7 @@ static void hmp_mouse_move(Monitor *mon, const QDict *qdict) if (dz_str) { dz = strtol(dz_str, NULL, 0); if (dz != 0) { - button = (dz > 0) ? INPUT_BUTTON_WHEELUP : INPUT_BUTTON_WHEELDOWN; + button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN; qemu_input_queue_btn(NULL, button, true); qemu_input_event_sync(); qemu_input_queue_btn(NULL, button, false); diff --git a/qapi-schema.json b/qapi-schema.json index 7b8f2a13e6..42fd61b2ce 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3743,12 +3743,9 @@ # Button of a pointer input device (mouse, tablet). # # Since: 2.0 -# -# Note that the spelling of these values may change when the -# x-input-send-event is promoted out of experimental status. ## { 'enum' : 'InputButton', - 'data' : [ 'Left', 'Middle', 'Right', 'WheelUp', 'WheelDown' ] } + 'data' : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down' ] } ## # @InputAxis @@ -3756,12 +3753,9 @@ # Position axis of a pointer input device (mouse, tablet). # # Since: 2.0 -# -# Note that the spelling of these values may change when the -# x-input-send-event is promoted out of experimental status. ## { 'enum' : 'InputAxis', - 'data' : [ 'X', 'Y' ] } + 'data' : [ 'x', 'y' ] } ## # @InputKeyEvent @@ -3825,38 +3819,34 @@ 'abs' : 'InputMoveEvent' } } ## -# @x-input-send-event +# @input-send-event # # Send input event(s) to guest. # -# @console: #optional console to send event(s) to. -# This parameter can be used to send the input event to -# specific input devices in case (a) multiple input devices -# of the same kind are added to the virtual machine and (b) -# you have configured input routing (see docs/multiseat.txt) -# for those input devices. If input routing is not -# configured this parameter has no effect. -# If @console is missing, only devices that aren't associated -# with a console are admissible. -# If @console is specified, it must exist, and both devices -# associated with that console and devices not associated with a -# console are admissible, but the former take precedence. - -# +# @device: #optional display device to send event(s) to. +# @head: #optional head to send event(s) to, in case the +# display device supports multiple scanouts. # @events: List of InputEvent union. # # Returns: Nothing on success. # -# Since: 2.2 -# -# Note: this command is experimental, and not a stable API. Things that -# might change before it becomes stable include the spelling of enum -# values for InputButton and InputAxis, and the notion of how to designate -# which console will receive the event. +# The @display and @head parameters can be used to send the input +# event to specific input devices in case (a) multiple input devices +# of the same kind are added to the virtual machine and (b) you have +# configured input routing (see docs/multiseat.txt) for those input +# devices. The parameters work exactly like the device and head +# properties of input devices. If @device is missing, only devices +# that have no input routing config are admissible. If @device is +# specified, both input devices with and without input routing config +# are admissible, but devices with input routing config take +# precedence. # +# Since: 2.6 ## -{ 'command': 'x-input-send-event', - 'data': { '*console':'int', 'events': [ 'InputEvent' ] } } +{ 'command': 'input-send-event', + 'data': { '*device': 'str', + '*head' : 'int', + 'events' : [ 'InputEvent' ] } } ## # @NumaOptions diff --git a/qmp-commands.hx b/qmp-commands.hx index 13f158d568..b629673459 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -4658,21 +4658,22 @@ Example: EQMP { - .name = "x-input-send-event", + .name = "input-send-event", .args_type = "console:i?,events:q", - .mhandler.cmd_new = qmp_marshal_x_input_send_event, + .mhandler.cmd_new = qmp_marshal_input_send_event, }, SQMP -@x-input-send-event +@input-send-event ----------------- Send input event to guest. Arguments: -- "console": console index. (json-int, optional) -- "events": list of input events. +- "device": display device (json-string, optional) +- "head": display head (json-int, optional) +- "events": list of input events The consoles are visible in the qom tree, under /backend/console[$index]. They have a device link and head property, so @@ -4684,24 +4685,24 @@ Example (1): Press left mouse button. --> { "execute": "x-input-send-event", - "arguments": { "console": 0, +-> { "execute": "input-send-event", + "arguments": { "device": "video0", "events": [ { "type": "btn", - "data" : { "down": true, "button": "Left" } } ] } } + "data" : { "down": true, "button": "left" } } ] } } <- { "return": {} } --> { "execute": "x-input-send-event", - "arguments": { "console": 0, +-> { "execute": "input-send-event", + "arguments": { "device": "video0", "events": [ { "type": "btn", - "data" : { "down": false, "button": "Left" } } ] } } + "data" : { "down": false, "button": "left" } } ] } } <- { "return": {} } Example (2): Press ctrl-alt-del. --> { "execute": "x-input-send-event", - "arguments": { "console": 0, "events": [ +-> { "execute": "input-send-event", + "arguments": { "events": [ { "type": "key", "data" : { "down": true, "key": {"type": "qcode", "data": "ctrl" } } }, { "type": "key", "data" : { "down": true, @@ -4714,10 +4715,10 @@ Example (3): Move mouse pointer to absolute coordinates (20000, 400). --> { "execute": "x-input-send-event" , - "arguments": { "console": 0, "events": [ - { "type": "abs", "data" : { "axis": "X", "value" : 20000 } }, - { "type": "abs", "data" : { "axis": "Y", "value" : 400 } } ] } } +-> { "execute": "input-send-event" , + "arguments": { "events": [ + { "type": "abs", "data" : { "axis": "x", "value" : 20000 } }, + { "type": "abs", "data" : { "axis": "y", "value" : 400 } } ] } } <- { "return": {} } EQMP diff --git a/scripts/qapi.py b/scripts/qapi.py index 8497777d94..18adca753d 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -66,8 +66,6 @@ case_whitelist = [ 'CpuInfoBase', # CPU, visible through query-cpu 'CpuInfoMIPS', # PC, visible through query-cpu 'CpuInfoTricore', # PC, visible through query-cpu - 'InputAxis', # TODO: drop when x-input-send-event is fixed - 'InputButton', # TODO: drop when x-input-send-event is fixed 'QapiErrorClass', # all members, visible through errors 'UuidInfo', # UUID, visible through query-uuid 'X86CPURegister32', # all members, visible indirectly through qom-get diff --git a/ui/cocoa.m b/ui/cocoa.m index 3ee554908a..7063a025c0 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -739,8 +739,8 @@ QemuCocoaView *cocoaView; [INPUT_BUTTON_LEFT] = MOUSE_EVENT_LBUTTON, [INPUT_BUTTON_MIDDLE] = MOUSE_EVENT_MBUTTON, [INPUT_BUTTON_RIGHT] = MOUSE_EVENT_RBUTTON, - [INPUT_BUTTON_WHEELUP] = MOUSE_EVENT_WHEELUP, - [INPUT_BUTTON_WHEELDOWN] = MOUSE_EVENT_WHEELDN, + [INPUT_BUTTON_WHEEL_UP] = MOUSE_EVENT_WHEELUP, + [INPUT_BUTTON_WHEEL_DOWN] = MOUSE_EVENT_WHEELDN, }; qemu_input_update_buttons(dcl->con, bmap, last_buttons, buttons); last_buttons = buttons; diff --git a/ui/console.c b/ui/console.c index 7db0fd27c9..ae61382d6e 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1790,6 +1790,29 @@ QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head) return NULL; } +QemuConsole *qemu_console_lookup_by_device_name(const char *device_id, + uint32_t head, Error **errp) +{ + DeviceState *dev; + QemuConsole *con; + + dev = qdev_find_recursive(sysbus_get_default(), device_id); + if (dev == NULL) { + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, + "Device '%s' not found", device_id); + return NULL; + } + + con = qemu_console_lookup_by_device(dev, head); + if (con == NULL) { + error_setg(errp, "Device %s (head %d) is not bound to a QemuConsole", + device_id, head); + return NULL; + } + + return con; +} + bool qemu_console_is_visible(QemuConsole *con) { return (con == active_console) || (con->dcls > 0); @@ -966,9 +966,9 @@ static gboolean gd_scroll_event(GtkWidget *widget, GdkEventScroll *scroll, InputButton btn; if (scroll->direction == GDK_SCROLL_UP) { - btn = INPUT_BUTTON_WHEELUP; + btn = INPUT_BUTTON_WHEEL_UP; } else if (scroll->direction == GDK_SCROLL_DOWN) { - btn = INPUT_BUTTON_WHEELDOWN; + btn = INPUT_BUTTON_WHEEL_DOWN; } else { return TRUE; } diff --git a/ui/input-legacy.c b/ui/input-legacy.c index c97eac1778..703f0a6ed1 100644 --- a/ui/input-legacy.c +++ b/ui/input-legacy.c @@ -158,7 +158,7 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src, } else { s->buttons &= ~bmap[evt->u.btn->button]; } - if (evt->u.btn->down && evt->u.btn->button == INPUT_BUTTON_WHEELUP) { + if (evt->u.btn->down && evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], @@ -166,7 +166,7 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src, s->buttons); } if (evt->u.btn->down && - evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) { + evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], diff --git a/ui/input.c b/ui/input.c index bdcb974a89..6fd48efb57 100644 --- a/ui/input.c +++ b/ui/input.c @@ -82,19 +82,12 @@ void qemu_input_handler_bind(QemuInputHandlerState *s, const char *device_id, int head, Error **errp) { - DeviceState *dev; QemuConsole *con; + Error *err = NULL; - dev = qdev_find_recursive(sysbus_get_default(), device_id); - if (dev == NULL) { - error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, - "Device '%s' not found", device_id); - return; - } - - con = qemu_console_lookup_by_device(dev, head); - if (con == NULL) { - error_setg(errp, "Device %s is not bound to a QemuConsole", device_id); + con = qemu_console_lookup_by_device_name(device_id, head, &err); + if (err) { + error_propagate(errp, err); return; } @@ -126,17 +119,22 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con) return NULL; } -void qmp_x_input_send_event(bool has_console, int64_t console, - InputEventList *events, Error **errp) +void qmp_input_send_event(bool has_device, const char *device, + bool has_head, int64_t head, + InputEventList *events, Error **errp) { InputEventList *e; QemuConsole *con; + Error *err = NULL; con = NULL; - if (has_console) { - con = qemu_console_lookup_by_index(console); - if (!con) { - error_setg(errp, "console %" PRId64 " not found", console); + if (has_device) { + if (!has_head) { + head = 0; + } + con = qemu_console_lookup_by_device_name(device, head, &err); + if (err) { + error_propagate(errp, err); return; } } @@ -475,8 +475,8 @@ static void sdl_send_mouse_event(int dx, int dy, int x, int y, int state) [INPUT_BUTTON_LEFT] = SDL_BUTTON(SDL_BUTTON_LEFT), [INPUT_BUTTON_MIDDLE] = SDL_BUTTON(SDL_BUTTON_MIDDLE), [INPUT_BUTTON_RIGHT] = SDL_BUTTON(SDL_BUTTON_RIGHT), - [INPUT_BUTTON_WHEELUP] = SDL_BUTTON(SDL_BUTTON_WHEELUP), - [INPUT_BUTTON_WHEELDOWN] = SDL_BUTTON(SDL_BUTTON_WHEELDOWN), + [INPUT_BUTTON_WHEEL_UP] = SDL_BUTTON(SDL_BUTTON_WHEELUP), + [INPUT_BUTTON_WHEEL_DOWN] = SDL_BUTTON(SDL_BUTTON_WHEELDOWN), }; static uint32_t prev_state; @@ -509,9 +509,9 @@ static void handle_mousewheel(SDL_Event *ev) InputButton btn; if (wev->y > 0) { - btn = INPUT_BUTTON_WHEELUP; + btn = INPUT_BUTTON_WHEEL_UP; } else if (wev->y < 0) { - btn = INPUT_BUTTON_WHEELDOWN; + btn = INPUT_BUTTON_WHEEL_DOWN; } else { return; } diff --git a/ui/spice-input.c b/ui/spice-input.c index 72e406382f..8eeebdbb2e 100644 --- a/ui/spice-input.c +++ b/ui/spice-input.c @@ -108,8 +108,8 @@ static void spice_update_buttons(QemuSpicePointer *pointer, [INPUT_BUTTON_LEFT] = 0x01, [INPUT_BUTTON_MIDDLE] = 0x04, [INPUT_BUTTON_RIGHT] = 0x02, - [INPUT_BUTTON_WHEELUP] = 0x10, - [INPUT_BUTTON_WHEELDOWN] = 0x20, + [INPUT_BUTTON_WHEEL_UP] = 0x10, + [INPUT_BUTTON_WHEEL_DOWN] = 0x20, }; if (wheel < 0) { @@ -1593,8 +1593,8 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y) [INPUT_BUTTON_LEFT] = 0x01, [INPUT_BUTTON_MIDDLE] = 0x02, [INPUT_BUTTON_RIGHT] = 0x04, - [INPUT_BUTTON_WHEELUP] = 0x08, - [INPUT_BUTTON_WHEELDOWN] = 0x10, + [INPUT_BUTTON_WHEEL_UP] = 0x08, + [INPUT_BUTTON_WHEEL_DOWN] = 0x10, }; QemuConsole *con = vs->vd->dcl.con; int width = pixman_image_get_width(vs->vd->server); @@ -3732,19 +3732,12 @@ void vnc_display_open(const char *id, Error **errp) device_id = qemu_opt_get(opts, "display"); if (device_id) { - DeviceState *dev; int head = qemu_opt_get_number(opts, "head", 0); + Error *err = NULL; - dev = qdev_find_recursive(sysbus_get_default(), device_id); - if (dev == NULL) { - error_setg(errp, "Device '%s' not found", device_id); - goto fail; - } - - con = qemu_console_lookup_by_device(dev, head); - if (con == NULL) { - error_setg(errp, "Device %s is not bound to a QemuConsole", - device_id); + con = qemu_console_lookup_by_device_name(device_id, head, &err); + if (err) { + error_propagate(errp, err); goto fail; } } else { |