xref: /openbmc/qemu/ui/spice-input.c (revision 864401c2a709bcb66182c02372fb60a30055a4d7)
1*864401c2SGerd Hoffmann /*
2*864401c2SGerd Hoffmann  * Copyright (C) 2010 Red Hat, Inc.
3*864401c2SGerd Hoffmann  *
4*864401c2SGerd Hoffmann  * This program is free software; you can redistribute it and/or
5*864401c2SGerd Hoffmann  * modify it under the terms of the GNU General Public License as
6*864401c2SGerd Hoffmann  * published by the Free Software Foundation; either version 2 or
7*864401c2SGerd Hoffmann  * (at your option) version 3 of the License.
8*864401c2SGerd Hoffmann  *
9*864401c2SGerd Hoffmann  * This program is distributed in the hope that it will be useful,
10*864401c2SGerd Hoffmann  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*864401c2SGerd Hoffmann  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*864401c2SGerd Hoffmann  * GNU General Public License for more details.
13*864401c2SGerd Hoffmann  *
14*864401c2SGerd Hoffmann  * You should have received a copy of the GNU General Public License
15*864401c2SGerd Hoffmann  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16*864401c2SGerd Hoffmann  */
17*864401c2SGerd Hoffmann 
18*864401c2SGerd Hoffmann #include <stdlib.h>
19*864401c2SGerd Hoffmann #include <stdio.h>
20*864401c2SGerd Hoffmann #include <string.h>
21*864401c2SGerd Hoffmann 
22*864401c2SGerd Hoffmann #include <spice.h>
23*864401c2SGerd Hoffmann #include <spice/enums.h>
24*864401c2SGerd Hoffmann 
25*864401c2SGerd Hoffmann #include "qemu-common.h"
26*864401c2SGerd Hoffmann #include "qemu-spice.h"
27*864401c2SGerd Hoffmann #include "console.h"
28*864401c2SGerd Hoffmann 
29*864401c2SGerd Hoffmann /* keyboard bits */
30*864401c2SGerd Hoffmann 
31*864401c2SGerd Hoffmann typedef struct QemuSpiceKbd {
32*864401c2SGerd Hoffmann     SpiceKbdInstance sin;
33*864401c2SGerd Hoffmann     int ledstate;
34*864401c2SGerd Hoffmann } QemuSpiceKbd;
35*864401c2SGerd Hoffmann 
36*864401c2SGerd Hoffmann static void kbd_push_key(SpiceKbdInstance *sin, uint8_t frag);
37*864401c2SGerd Hoffmann static uint8_t kbd_get_leds(SpiceKbdInstance *sin);
38*864401c2SGerd Hoffmann static void kbd_leds(void *opaque, int l);
39*864401c2SGerd Hoffmann 
40*864401c2SGerd Hoffmann static const SpiceKbdInterface kbd_interface = {
41*864401c2SGerd Hoffmann     .base.type          = SPICE_INTERFACE_KEYBOARD,
42*864401c2SGerd Hoffmann     .base.description   = "qemu keyboard",
43*864401c2SGerd Hoffmann     .base.major_version = SPICE_INTERFACE_KEYBOARD_MAJOR,
44*864401c2SGerd Hoffmann     .base.minor_version = SPICE_INTERFACE_KEYBOARD_MINOR,
45*864401c2SGerd Hoffmann     .push_scan_freg     = kbd_push_key,
46*864401c2SGerd Hoffmann     .get_leds           = kbd_get_leds,
47*864401c2SGerd Hoffmann };
48*864401c2SGerd Hoffmann 
49*864401c2SGerd Hoffmann static void kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
50*864401c2SGerd Hoffmann {
51*864401c2SGerd Hoffmann     kbd_put_keycode(frag);
52*864401c2SGerd Hoffmann }
53*864401c2SGerd Hoffmann 
54*864401c2SGerd Hoffmann static uint8_t kbd_get_leds(SpiceKbdInstance *sin)
55*864401c2SGerd Hoffmann {
56*864401c2SGerd Hoffmann     QemuSpiceKbd *kbd = container_of(sin, QemuSpiceKbd, sin);
57*864401c2SGerd Hoffmann     return kbd->ledstate;
58*864401c2SGerd Hoffmann }
59*864401c2SGerd Hoffmann 
60*864401c2SGerd Hoffmann static void kbd_leds(void *opaque, int ledstate)
61*864401c2SGerd Hoffmann {
62*864401c2SGerd Hoffmann     QemuSpiceKbd *kbd = opaque;
63*864401c2SGerd Hoffmann 
64*864401c2SGerd Hoffmann     kbd->ledstate = 0;
65*864401c2SGerd Hoffmann     if (ledstate & QEMU_SCROLL_LOCK_LED) {
66*864401c2SGerd Hoffmann         kbd->ledstate |= SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK;
67*864401c2SGerd Hoffmann     }
68*864401c2SGerd Hoffmann     if (ledstate & QEMU_NUM_LOCK_LED) {
69*864401c2SGerd Hoffmann         kbd->ledstate |= SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK;
70*864401c2SGerd Hoffmann     }
71*864401c2SGerd Hoffmann     if (ledstate & QEMU_CAPS_LOCK_LED) {
72*864401c2SGerd Hoffmann         kbd->ledstate |= SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK;
73*864401c2SGerd Hoffmann     }
74*864401c2SGerd Hoffmann     spice_server_kbd_leds(&kbd->sin, ledstate);
75*864401c2SGerd Hoffmann }
76*864401c2SGerd Hoffmann 
77*864401c2SGerd Hoffmann void qemu_spice_input_init(void)
78*864401c2SGerd Hoffmann {
79*864401c2SGerd Hoffmann     QemuSpiceKbd *kbd;
80*864401c2SGerd Hoffmann 
81*864401c2SGerd Hoffmann     kbd = qemu_mallocz(sizeof(*kbd));
82*864401c2SGerd Hoffmann     kbd->sin.base.sif = &kbd_interface.base;
83*864401c2SGerd Hoffmann     qemu_spice_add_interface(&kbd->sin.base);
84*864401c2SGerd Hoffmann     qemu_add_led_event_handler(kbd_leds, kbd);
85*864401c2SGerd Hoffmann }
86