input.c revision cc330d4169441727fecf1da08aee806fc021c4e2
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 25025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#include "sysemu.h" 26cc330d4169441727fecf1da08aee806fc021c4e2David 'Digit' Turner#include "net/net.h" 27025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#include "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) { 5117410ee4539bb5216421bb9f9dc287b1f678b6cdDavid 'Digit' Turner s = qemu_mallocz(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) { 83025c32ffcd9f682cd761a836fe8798738d1648f2David Turner notifier_list_notify(&mouse_mode_notifiers); 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 97025c32ffcd9f682cd761a836fe8798738d1648f2David Turner s = qemu_mallocz(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; 102025c32ffcd9f682cd761a836fe8798738d1648f2David Turner s->qemu_put_mouse_event_name = qemu_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 124025c32ffcd9f682cd761a836fe8798738d1648f2David Turner qemu_free(entry->qemu_put_mouse_event_name); 125025c32ffcd9f682cd761a836fe8798738d1648f2David Turner qemu_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 135025c32ffcd9f682cd761a836fe8798738d1648f2David Turner s = qemu_mallocz(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); 148025c32ffcd9f682cd761a836fe8798738d1648f2David Turner qemu_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{ 315025c32ffcd9f682cd761a836fe8798738d1648f2David Turner notifier_list_remove(&mouse_mode_notifiers, notify); 316025c32ffcd9f682cd761a836fe8798738d1648f2David Turner} 317