blob: 23c84f7254c9e51adcdc46867588fb90dbf1750e [file] [log] [blame]
Gerd Hoffmannc8b405b2013-11-27 10:35:26 +01001#include "sysemu/sysemu.h"
2#include "qapi-types.h"
3#include "ui/input.h"
4
5struct QemuInputHandlerState {
6 DeviceState *dev;
7 QemuInputHandler *handler;
8 int id;
9 int events;
10 QTAILQ_ENTRY(QemuInputHandlerState) node;
11};
12static QTAILQ_HEAD(, QemuInputHandlerState) handlers =
13 QTAILQ_HEAD_INITIALIZER(handlers);
14
15QemuInputHandlerState *qemu_input_handler_register(DeviceState *dev,
16 QemuInputHandler *handler)
17{
18 QemuInputHandlerState *s = g_new0(QemuInputHandlerState, 1);
19 static int id = 1;
20
21 s->dev = dev;
22 s->handler = handler;
23 s->id = id++;
24 QTAILQ_INSERT_TAIL(&handlers, s, node);
25 return s;
26}
27
28void qemu_input_handler_activate(QemuInputHandlerState *s)
29{
30 QTAILQ_REMOVE(&handlers, s, node);
31 QTAILQ_INSERT_HEAD(&handlers, s, node);
32}
33
34void qemu_input_handler_unregister(QemuInputHandlerState *s)
35{
36 QTAILQ_REMOVE(&handlers, s, node);
37 g_free(s);
38}
39
40static QemuInputHandlerState*
41qemu_input_find_handler(uint32_t mask)
42{
43 QemuInputHandlerState *s;
44
45 QTAILQ_FOREACH(s, &handlers, node) {
46 if (mask & s->handler->mask) {
47 return s;
48 }
49 }
50 return NULL;
51}
52
53void qemu_input_event_send(QemuConsole *src, InputEvent *evt)
54{
55 QemuInputHandlerState *s;
56
57 if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
58 return;
59 }
60
61 s = qemu_input_find_handler(1 << evt->kind);
62 s->handler->event(s->dev, src, evt);
63 s->events++;
64}
65
66void qemu_input_event_sync(void)
67{
68 QemuInputHandlerState *s;
69
70 if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
71 return;
72 }
73
74 QTAILQ_FOREACH(s, &handlers, node) {
75 if (!s->events) {
76 continue;
77 }
78 if (s->handler->sync) {
79 s->handler->sync(s->dev);
80 }
81 s->events = 0;
82 }
83}