input: bind devices and input routing
Add function to bind input devices to display devices. Implementing input routing on top of this: Events coming from the display device in question are routed to the input device bound to it (if there is one). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
8b84286f4c
commit
6f5943cf45
@ -29,6 +29,9 @@ QemuInputHandlerState *qemu_input_handler_register(DeviceState *dev,
|
|||||||
void qemu_input_handler_activate(QemuInputHandlerState *s);
|
void qemu_input_handler_activate(QemuInputHandlerState *s);
|
||||||
void qemu_input_handler_deactivate(QemuInputHandlerState *s);
|
void qemu_input_handler_deactivate(QemuInputHandlerState *s);
|
||||||
void qemu_input_handler_unregister(QemuInputHandlerState *s);
|
void qemu_input_handler_unregister(QemuInputHandlerState *s);
|
||||||
|
void qemu_input_handler_bind(QemuInputHandlerState *s,
|
||||||
|
const char *device_id, int head,
|
||||||
|
Error **errp);
|
||||||
void qemu_input_event_send(QemuConsole *src, InputEvent *evt);
|
void qemu_input_event_send(QemuConsole *src, InputEvent *evt);
|
||||||
void qemu_input_event_sync(void);
|
void qemu_input_event_sync(void);
|
||||||
|
|
||||||
|
43
ui/input.c
43
ui/input.c
@ -1,3 +1,4 @@
|
|||||||
|
#include "hw/qdev.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qapi-types.h"
|
#include "qapi-types.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
@ -10,6 +11,7 @@ struct QemuInputHandlerState {
|
|||||||
QemuInputHandler *handler;
|
QemuInputHandler *handler;
|
||||||
int id;
|
int id;
|
||||||
int events;
|
int events;
|
||||||
|
QemuConsole *con;
|
||||||
QTAILQ_ENTRY(QemuInputHandlerState) node;
|
QTAILQ_ENTRY(QemuInputHandlerState) node;
|
||||||
};
|
};
|
||||||
static QTAILQ_HEAD(, QemuInputHandlerState) handlers =
|
static QTAILQ_HEAD(, QemuInputHandlerState) handlers =
|
||||||
@ -53,12 +55,46 @@ void qemu_input_handler_unregister(QemuInputHandlerState *s)
|
|||||||
qemu_input_check_mode_change();
|
qemu_input_check_mode_change();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_input_handler_bind(QemuInputHandlerState *s,
|
||||||
|
const char *device_id, int head,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
DeviceState *dev;
|
||||||
|
QemuConsole *con;
|
||||||
|
|
||||||
|
dev = qdev_find_recursive(sysbus_get_default(), device_id);
|
||||||
|
if (dev == NULL) {
|
||||||
|
error_set(errp, QERR_DEVICE_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);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->con = con;
|
||||||
|
}
|
||||||
|
|
||||||
static QemuInputHandlerState*
|
static QemuInputHandlerState*
|
||||||
qemu_input_find_handler(uint32_t mask)
|
qemu_input_find_handler(uint32_t mask, QemuConsole *con)
|
||||||
{
|
{
|
||||||
QemuInputHandlerState *s;
|
QemuInputHandlerState *s;
|
||||||
|
|
||||||
QTAILQ_FOREACH(s, &handlers, node) {
|
QTAILQ_FOREACH(s, &handlers, node) {
|
||||||
|
if (s->con == NULL || s->con != con) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (mask & s->handler->mask) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(s, &handlers, node) {
|
||||||
|
if (s->con != NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (mask & s->handler->mask) {
|
if (mask & s->handler->mask) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -151,7 +187,7 @@ void qemu_input_event_send(QemuConsole *src, InputEvent *evt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send event */
|
/* send event */
|
||||||
s = qemu_input_find_handler(1 << evt->kind);
|
s = qemu_input_find_handler(1 << evt->kind, src);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -252,7 +288,8 @@ bool qemu_input_is_absolute(void)
|
|||||||
{
|
{
|
||||||
QemuInputHandlerState *s;
|
QemuInputHandlerState *s;
|
||||||
|
|
||||||
s = qemu_input_find_handler(INPUT_EVENT_MASK_REL | INPUT_EVENT_MASK_ABS);
|
s = qemu_input_find_handler(INPUT_EVENT_MASK_REL | INPUT_EVENT_MASK_ABS,
|
||||||
|
NULL);
|
||||||
return (s != NULL) && (s->handler->mask & INPUT_EVENT_MASK_ABS);
|
return (s != NULL) && (s->handler->mask & INPUT_EVENT_MASK_ABS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user