input.c revision 2184d300da3cbf971fadc095edfa9537f371f9d1
1025c32ffcd9f682cd761a836fe8798738d1648f2David Turner/*
2025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * QEMU System Emulator
3025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
4025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * Copyright (c) 2003-2008 Fabrice Bellard
5025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
6025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * Permission is hereby granted, free of charge, to any person obtaining a copy
7025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * of this software and associated documentation files (the "Software"), to deal
8025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * in the Software without restriction, including without limitation the rights
9025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * copies of the Software, and to permit persons to whom the Software is
11025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * furnished to do so, subject to the following conditions:
12025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
13025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * The above copyright notice and this permission notice shall be included in
14025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * all copies or substantial portions of the Software.
15025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
16025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * THE SOFTWARE.
23025c32ffcd9f682cd761a836fe8798738d1648f2David Turner */
24025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
2534c48ff1e3ad5cd2084ca40188754d45f423750bDavid 'Digit' Turner#include "sysemu/sysemu.h"
26cc330d4169441727fecf1da08aee806fc021c4e2David 'Digit' Turner#include "net/net.h"
276af6765e2f3bc930d0dce21d752bea570a1b1362David 'Digit' Turner#include "monitor/monitor.h"
281c31e3e43ce4cca85a707dfff631e5e102fdecedDavid 'Digit' Turner#include "ui/console.h"
291c31e3e43ce4cca85a707dfff631e5e102fdecedDavid 'Digit' Turner#include "qapi/qmp/qjson.h"
30025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
3117410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#ifdef CONFIG_SKINNING
3217410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' TurnerQEMUPutMouseEntry *original_qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
3317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner                                                         void *opaque, int absolute,
3417410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner                                                         const char *name);
3517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#undef qemu_add_mouse_event_handler
3617410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#define qemu_add_mouse_event_handler original_qemu_add_mouse_event_handler
3717410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#endif
3817410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turnerstatic QTAILQ_HEAD(, QEMUPutKBDEntry) kbd_handlers =
3917410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    QTAILQ_HEAD_INITIALIZER(kbd_handlers);
40025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstatic QTAILQ_HEAD(, QEMUPutLEDEntry) led_handlers = QTAILQ_HEAD_INITIALIZER(led_handlers);
41025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstatic QTAILQ_HEAD(, QEMUPutMouseEntry) mouse_handlers =
42025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_HEAD_INITIALIZER(mouse_handlers);
4317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turnerstatic NotifierList mouse_mode_notifiers =
44025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    NOTIFIER_LIST_INITIALIZER(mouse_mode_notifiers);
45025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
46025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
47025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
4817410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    QEMUPutKBDEntry *s;
4917410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner
5017410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    if (func != NULL) {
51aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner        s = g_malloc0(sizeof(QEMUPutKBDEntry));
5217410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner
5317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        s->put_kbd_event = func;
5417410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        s->opaque = opaque;
5517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner
5617410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        QTAILQ_INSERT_TAIL(&kbd_handlers, s, next);
5717410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    }
58025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
59025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
6017410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turnervoid qemu_remove_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
61025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
6217410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    QEMUPutKBDEntry *cursor, *cursor_next;
6317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    if (func != NULL) {
6417410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        QTAILQ_FOREACH_SAFE(cursor, &kbd_handlers, next, cursor_next) {
6517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            if (cursor->put_kbd_event == func && cursor->opaque == opaque) {
6617410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner                QTAILQ_REMOVE(&kbd_handlers, cursor, next);
6717410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            }
6817410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        }
6917410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    }
70025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
71025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
72025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstatic void check_mode_change(void)
73025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
74025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    static int current_is_absolute, current_has_absolute;
75025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int is_absolute;
76025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int has_absolute;
77025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
78025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    is_absolute = kbd_mouse_is_absolute();
79025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    has_absolute = kbd_mouse_has_absolute();
80025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
81025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (is_absolute != current_is_absolute ||
82025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        has_absolute != current_has_absolute) {
832184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner        notifier_list_notify(&mouse_mode_notifiers, NULL);
84025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
85025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
86025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    current_is_absolute = is_absolute;
87025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    current_has_absolute = has_absolute;
88025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
89025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
90025c32ffcd9f682cd761a836fe8798738d1648f2David TurnerQEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
91025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                                void *opaque, int absolute,
92025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                                const char *name)
93025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
94025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEntry *s;
95025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    static int mouse_index = 0;
96025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
97aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    s = g_malloc0(sizeof(QEMUPutMouseEntry));
98025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
99025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->qemu_put_mouse_event = func;
100025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->qemu_put_mouse_event_opaque = opaque;
101025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->qemu_put_mouse_event_absolute = absolute;
102aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    s->qemu_put_mouse_event_name = g_strdup(name);
103025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->index = mouse_index++;
104025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
105025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_INSERT_TAIL(&mouse_handlers, s, node);
106025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
107025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    check_mode_change();
108025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
109025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    return s;
110025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
111025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
112025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_activate_mouse_event_handler(QEMUPutMouseEntry *entry)
113025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
114025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_REMOVE(&mouse_handlers, entry, node);
115025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_INSERT_HEAD(&mouse_handlers, entry, node);
116025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
117025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    check_mode_change();
118025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
119025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
120025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
121025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
122025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_REMOVE(&mouse_handlers, entry, node);
123025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
124aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    g_free(entry->qemu_put_mouse_event_name);
125aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    g_free(entry);
126025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
127025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    check_mode_change();
128025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
129025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
130025c32ffcd9f682cd761a836fe8798738d1648f2David TurnerQEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func,
131025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                            void *opaque)
132025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
133025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutLEDEntry *s;
134025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
135aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    s = g_malloc0(sizeof(QEMUPutLEDEntry));
136025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
137025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->put_led = func;
138025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    s->opaque = opaque;
139025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_INSERT_TAIL(&led_handlers, s, next);
140025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    return s;
141025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
142025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
143025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_remove_led_event_handler(QEMUPutLEDEntry *entry)
144025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
145025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (entry == NULL)
146025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        return;
147025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_REMOVE(&led_handlers, entry, next);
148aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner    g_free(entry);
149025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
150025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
151025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid kbd_put_keycode(int keycode)
152025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
15317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    QEMUPutKBDEntry *cursor;
15417410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner    QTAILQ_FOREACH(cursor, &kbd_handlers, next) {
15517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        cursor->put_kbd_event(cursor->opaque, keycode);
156025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
157025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
158025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
159025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid kbd_put_ledstate(int ledstate)
160025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
161025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutLEDEntry *cursor;
162025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
163025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_FOREACH(cursor, &led_handlers, next) {
164025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        cursor->put_led(cursor->opaque, ledstate);
165025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
166025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
167025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
168025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
169025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
170025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEntry *entry;
171025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEvent *mouse_event;
172025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    void *mouse_event_opaque;
17317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#ifndef CONFIG_SKINNING
174025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int width;
17517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#endif
176025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
177025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (QTAILQ_EMPTY(&mouse_handlers)) {
178025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        return;
179025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
180025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
181025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    entry = QTAILQ_FIRST(&mouse_handlers);
182025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
183025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    mouse_event = entry->qemu_put_mouse_event;
184025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    mouse_event_opaque = entry->qemu_put_mouse_event_opaque;
185025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
186025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (mouse_event) {
18717410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#ifndef CONFIG_SKINNING
188025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        if (graphic_rotate) {
18917410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            if (entry->qemu_put_mouse_event_absolute) {
190025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                width = 0x7fff;
19117410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            } else {
192025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                width = graphic_width - 1;
19317410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            }
19417410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            mouse_event(mouse_event_opaque, width - dy, dx, dz, buttons_state);
19517410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        } else {
19617410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner            mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
19717410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        }
19817410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#else
19917410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner        mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
20017410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner#endif
201025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
202025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
203025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
204025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerint kbd_mouse_is_absolute(void)
205025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
206025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (QTAILQ_EMPTY(&mouse_handlers)) {
207025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        return 0;
208025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
209025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
210025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    return QTAILQ_FIRST(&mouse_handlers)->qemu_put_mouse_event_absolute;
211025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
212025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
213025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerint kbd_mouse_has_absolute(void)
214025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
215025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEntry *entry;
216025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
217025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_FOREACH(entry, &mouse_handlers, node) {
218025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        if (entry->qemu_put_mouse_event_absolute) {
219025c32ffcd9f682cd761a836fe8798738d1648f2David Turner            return 1;
220025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        }
221025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
222025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
223025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    return 0;
224025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
225025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
226025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstatic void info_mice_iter(QObject *data, void *opaque)
227025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
228025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QDict *mouse;
229025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    Monitor *mon = opaque;
230025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
231025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    mouse = qobject_to_qdict(data);
232025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    monitor_printf(mon, "%c Mouse #%" PRId64 ": %s%s\n",
233025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                  (qdict_get_bool(mouse, "current") ? '*' : ' '),
234025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                   qdict_get_int(mouse, "index"), qdict_get_str(mouse, "name"),
235025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                   qdict_get_bool(mouse, "absolute") ? " (absolute)" : "");
236025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
237025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
238025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid do_info_mice_print(Monitor *mon, const QObject *data)
239025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
240025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QList *mice_list;
241025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
242025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    mice_list = qobject_to_qlist(data);
243025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (qlist_empty(mice_list)) {
244025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        monitor_printf(mon, "No mouse devices connected\n");
245025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        return;
246025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
247025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
248025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    qlist_iter(mice_list, info_mice_iter, mon);
249025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
250025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
251025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid do_info_mice(Monitor *mon, QObject **ret_data)
252025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
253025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEntry *cursor;
254025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QList *mice_list;
255025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int current;
256025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
257025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    mice_list = qlist_new();
258025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
259025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (QTAILQ_EMPTY(&mouse_handlers)) {
260025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        goto out;
261025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
262025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
263025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    current = QTAILQ_FIRST(&mouse_handlers)->index;
264025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
265025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_FOREACH(cursor, &mouse_handlers, node) {
266025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        QObject *obj;
267025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        obj = qobject_from_jsonf("{ 'name': %s,"
268025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 "  'index': %d,"
269025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 "  'current': %i,"
270025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 "  'absolute': %i }",
271025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 cursor->qemu_put_mouse_event_name,
272025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 cursor->index,
273025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 cursor->index == current,
274025c32ffcd9f682cd761a836fe8798738d1648f2David Turner                                 !!cursor->qemu_put_mouse_event_absolute);
275025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        qlist_append_obj(mice_list, obj);
276025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
277025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
278025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerout:
279025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    *ret_data = QOBJECT(mice_list);
280025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
281025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
282025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid do_mouse_set(Monitor *mon, const QDict *qdict)
283025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
284025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QEMUPutMouseEntry *cursor;
285025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int index = qdict_get_int(qdict, "index");
286025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    int found = 0;
287025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
288025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (QTAILQ_EMPTY(&mouse_handlers)) {
289025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        monitor_printf(mon, "No mouse devices connected\n");
290025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        return;
291025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
292025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
293025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    QTAILQ_FOREACH(cursor, &mouse_handlers, node) {
294025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        if (cursor->index == index) {
295025c32ffcd9f682cd761a836fe8798738d1648f2David Turner            found = 1;
296025c32ffcd9f682cd761a836fe8798738d1648f2David Turner            qemu_activate_mouse_event_handler(cursor);
297025c32ffcd9f682cd761a836fe8798738d1648f2David Turner            break;
298025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        }
299025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
300025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
301025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    if (!found) {
302025c32ffcd9f682cd761a836fe8798738d1648f2David Turner        monitor_printf(mon, "Mouse at given index not found\n");
303025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    }
304025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
305025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    check_mode_change();
306025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
307025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
308025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_add_mouse_mode_change_notifier(Notifier *notify)
309025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
310025c32ffcd9f682cd761a836fe8798738d1648f2David Turner    notifier_list_add(&mouse_mode_notifiers, notify);
311025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
312025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
313025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid qemu_remove_mouse_mode_change_notifier(Notifier *notify)
314025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
3152184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    notifier_remove(notify);
316025c32ffcd9f682cd761a836fe8798738d1648f2David Turner}
317