Compare commits
15 Commits
ppc-for-2.
...
pull-input
Author | SHA1 | Date | |
---|---|---|---|
|
6575ccddf4 | ||
|
01df51432e | ||
|
f22d0af076 | ||
|
b98d26e333 | ||
|
f2c1d54c18 | ||
|
071608b519 | ||
|
1da90c34c9 | ||
|
3ff430aa91 | ||
|
35227e6a09 | ||
|
e8ce12d9ea | ||
|
beded0ff7f | ||
|
e220656ce1 | ||
|
438528a3e7 | ||
|
9f5c6d06ad | ||
|
e6915b5f3a |
@@ -857,6 +857,10 @@ M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
S: Maintained
|
||||
F: hw/usb/*
|
||||
F: tests/usb-*-test.c
|
||||
F: docs/usb2.txt
|
||||
F: docs/usb-storage.txt
|
||||
F: include/hw/usb.h
|
||||
F: include/hw/usb/
|
||||
|
||||
USB (serial adapter)
|
||||
M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
@@ -1087,6 +1091,7 @@ SPICE
|
||||
M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
S: Supported
|
||||
F: include/ui/qemu-spice.h
|
||||
F: include/ui/spice-display.h
|
||||
F: ui/spice-*.c
|
||||
F: audio/spiceaudio.c
|
||||
F: hw/display/qxl*
|
||||
@@ -1095,6 +1100,7 @@ Graphics
|
||||
M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
S: Odd Fixes
|
||||
F: ui/
|
||||
F: include/ui/
|
||||
|
||||
Cocoa graphics
|
||||
M: Andreas Färber <andreas.faerber@web.de>
|
||||
|
@@ -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 {
|
||||
|
@@ -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 {
|
||||
|
@@ -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] = {
|
||||
|
@@ -778,17 +778,19 @@ FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase,
|
||||
DeviceState *dev;
|
||||
FWCfgState *s;
|
||||
uint32_t version = FW_CFG_VERSION;
|
||||
bool dma_enabled = dma_iobase && dma_as;
|
||||
bool dma_requested = dma_iobase && dma_as;
|
||||
|
||||
dev = qdev_create(NULL, TYPE_FW_CFG_IO);
|
||||
qdev_prop_set_uint32(dev, "iobase", iobase);
|
||||
qdev_prop_set_uint32(dev, "dma_iobase", dma_iobase);
|
||||
qdev_prop_set_bit(dev, "dma_enabled", dma_enabled);
|
||||
if (!dma_requested) {
|
||||
qdev_prop_set_bit(dev, "dma_enabled", false);
|
||||
}
|
||||
|
||||
fw_cfg_init1(dev);
|
||||
s = FW_CFG(dev);
|
||||
|
||||
if (dma_enabled) {
|
||||
if (s->dma_enabled) {
|
||||
/* 64 bits for the address field */
|
||||
s->dma_as = dma_as;
|
||||
s->dma_addr = 0;
|
||||
@@ -814,11 +816,13 @@ FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr,
|
||||
SysBusDevice *sbd;
|
||||
FWCfgState *s;
|
||||
uint32_t version = FW_CFG_VERSION;
|
||||
bool dma_enabled = dma_addr && dma_as;
|
||||
bool dma_requested = dma_addr && dma_as;
|
||||
|
||||
dev = qdev_create(NULL, TYPE_FW_CFG_MEM);
|
||||
qdev_prop_set_uint32(dev, "data_width", data_width);
|
||||
qdev_prop_set_bit(dev, "dma_enabled", dma_enabled);
|
||||
if (!dma_requested) {
|
||||
qdev_prop_set_bit(dev, "dma_enabled", false);
|
||||
}
|
||||
|
||||
fw_cfg_init1(dev);
|
||||
|
||||
@@ -828,7 +832,7 @@ FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr,
|
||||
|
||||
s = FW_CFG(dev);
|
||||
|
||||
if (dma_enabled) {
|
||||
if (s->dma_enabled) {
|
||||
s->dma_as = dma_as;
|
||||
s->dma_addr = 0;
|
||||
sysbus_mmio_map(sbd, 2, dma_addr);
|
||||
@@ -873,7 +877,7 @@ static Property fw_cfg_io_properties[] = {
|
||||
DEFINE_PROP_UINT32("iobase", FWCfgIoState, iobase, -1),
|
||||
DEFINE_PROP_UINT32("dma_iobase", FWCfgIoState, dma_iobase, -1),
|
||||
DEFINE_PROP_BOOL("dma_enabled", FWCfgIoState, parent_obj.dma_enabled,
|
||||
false),
|
||||
true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
@@ -913,7 +917,7 @@ static const TypeInfo fw_cfg_io_info = {
|
||||
static Property fw_cfg_mem_properties[] = {
|
||||
DEFINE_PROP_UINT32("data_width", FWCfgMemState, data_width, -1),
|
||||
DEFINE_PROP_BOOL("dma_enabled", FWCfgMemState, parent_obj.dma_enabled,
|
||||
false),
|
||||
true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
@@ -447,7 +447,7 @@ static USBPacket *usbredir_find_packet_by_id(USBRedirDevice *dev,
|
||||
return p;
|
||||
}
|
||||
|
||||
static void bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
|
||||
static int bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
|
||||
uint8_t status, uint8_t ep, void *free_on_destroy)
|
||||
{
|
||||
struct buf_packet *bufp;
|
||||
@@ -464,7 +464,7 @@ static void bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
|
||||
if (dev->endpoint[EP2I(ep)].bufpq_size >
|
||||
dev->endpoint[EP2I(ep)].bufpq_target_size) {
|
||||
free(data);
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
|
||||
}
|
||||
@@ -477,6 +477,7 @@ static void bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
|
||||
bufp->free_on_destroy = free_on_destroy;
|
||||
QTAILQ_INSERT_TAIL(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
|
||||
dev->endpoint[EP2I(ep)].bufpq_size++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bufp_free(USBRedirDevice *dev, struct buf_packet *bufp,
|
||||
@@ -2082,13 +2083,17 @@ static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
|
||||
status = usb_redir_success;
|
||||
free_on_destroy = NULL;
|
||||
for (i = 0; i < data_len; i += len) {
|
||||
int r;
|
||||
if (len >= (data_len - i)) {
|
||||
len = data_len - i;
|
||||
status = buffered_bulk_packet->status;
|
||||
free_on_destroy = data;
|
||||
}
|
||||
/* bufp_alloc also adds the packet to the ep queue */
|
||||
bufp_alloc(dev, data + i, len, status, ep, free_on_destroy);
|
||||
r = bufp_alloc(dev, data + i, len, status, ep, free_on_destroy);
|
||||
if (r) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->endpoint[EP2I(ep)].pending_async_packet) {
|
||||
|
@@ -42,6 +42,14 @@
|
||||
.driver = "virtio-pci",\
|
||||
.property = "migrate-extra",\
|
||||
.value = "off",\
|
||||
},{\
|
||||
.driver = "fw_cfg_mem",\
|
||||
.property = "dma_enabled",\
|
||||
.value = "off",\
|
||||
},{\
|
||||
.driver = "fw_cfg_io",\
|
||||
.property = "dma_enabled",\
|
||||
.value = "off",\
|
||||
},
|
||||
|
||||
#define HW_COMPAT_2_3 \
|
||||
|
@@ -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);
|
||||
|
@@ -25,7 +25,7 @@
|
||||
#include "sysemu/sysemu.h"
|
||||
|
||||
#if defined(CONFIG_OPENGL_DMABUF)
|
||||
# if SPICE_SERVER_VERSION >= 0x000d00 /* release 0.13.0 */
|
||||
# if SPICE_SERVER_VERSION >= 0x000d01 /* release 0.13.1 */
|
||||
# define HAVE_SPICE_GL 1
|
||||
# include "ui/egl-helpers.h"
|
||||
# include "ui/egl-context.h"
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
23
ui/console.c
23
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);
|
||||
|
4
ui/gtk.c
4
ui/gtk.c
@@ -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;
|
||||
}
|
||||
|
@@ -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],
|
||||
|
32
ui/input.c
32
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;
|
||||
}
|
||||
}
|
||||
|
4
ui/sdl.c
4
ui/sdl.c
@@ -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;
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
19
ui/vnc.c
19
ui/vnc.c
@@ -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 {
|
||||
|
Reference in New Issue
Block a user