Replace QEMUPutLEDEntry with an embedded Notifier in VncDisplay. Use qemu_input_led_notifier_add/remove instead of the old qemu_add/remove_led_event_handler.
Signed-off-by: Marc-André Lureau <[email protected]> --- ui/vnc.h | 2 +- tools/qemu-vnc/input.c | 49 +++++++++++++++++-------------------------------- ui/vnc.c | 11 ++++++----- 3 files changed, 24 insertions(+), 38 deletions(-) diff --git a/ui/vnc.h b/ui/vnc.h index c8d87cd5301..88293ef4971 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -147,7 +147,7 @@ struct VncDisplay DisplayChangeListener dcl; kbd_layout_t *kbd_layout; int lock_key_sync; - QEMUPutLEDEntry *led; + Notifier led_notifier; int ledstate; QKbdState *kbd; QemuMutex mutex; diff --git a/tools/qemu-vnc/input.c b/tools/qemu-vnc/input.c index 6fb73b31248..b96ff741308 100644 --- a/tools/qemu-vnc/input.c +++ b/tools/qemu-vnc/input.c @@ -13,58 +13,43 @@ #include "trace.h" #include "qemu-vnc.h" -struct QEMUPutLEDEntry { - QEMUPutLEDEvent *put_led; - void *opaque; - QTAILQ_ENTRY(QEMUPutLEDEntry) next; -}; - static NotifierList mouse_mode_notifiers = NOTIFIER_LIST_INITIALIZER(mouse_mode_notifiers); -static QTAILQ_HEAD(, QEMUPutLEDEntry) led_handlers = - QTAILQ_HEAD_INITIALIZER(led_handlers); +static NotifierList led_notifiers = + NOTIFIER_LIST_INITIALIZER(led_notifiers); /* Track the target console for pending mouse events (used by sync) */ static QemuConsole *mouse_target; -QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, - void *opaque) +/* + * The D-Bus Keyboard.Modifiers property uses the same + * bit layout as QEMU's LED constants. + */ +static guint modifiers; + +void qemu_input_led_notifier_add(Notifier *n) { - QEMUPutLEDEntry *s; + notifier_list_add(&led_notifiers, n); +} - s = g_new0(QEMUPutLEDEntry, 1); - s->put_led = func; - s->opaque = opaque; - QTAILQ_INSERT_TAIL(&led_handlers, s, next); - return s; +void qemu_input_led_notifier_remove(Notifier *n) +{ + notifier_remove(n); } -void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry) +int qemu_input_get_led(QemuConsole *con) { - if (!entry) { - return; - } - QTAILQ_REMOVE(&led_handlers, entry, next); - g_free(entry); + return modifiers; } static void on_keyboard_modifiers_changed(GObject *gobject, GParamSpec *pspec, gpointer user_data) { - guint modifiers; - QEMUPutLEDEntry *cursor; - modifiers = qemu_dbus_display1_keyboard_get_modifiers( QEMU_DBUS_DISPLAY1_KEYBOARD(gobject)); - /* - * The D-Bus Keyboard.Modifiers property uses the same - * bit layout as QEMU's LED constants. - */ - QTAILQ_FOREACH(cursor, &led_handlers, next) { - cursor->put_led(cursor->opaque, modifiers); - } + notifier_list_notify(&led_notifiers, NULL); } void qemu_add_mouse_mode_change_notifier(Notifier *notify) diff --git a/ui/vnc.c b/ui/vnc.c index 253b1a9f634..3b6765393e0 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -1820,9 +1820,10 @@ static void vnc_led_state_change(VncState *vs) vnc_flush(vs); } -static void kbd_leds(void *opaque, int ledstate) +static void kbd_leds(Notifier *notifier, void *data) { - VncDisplay *vd = opaque; + VncDisplay *vd = container_of(notifier, VncDisplay, led_notifier); + int ledstate = qemu_input_get_led(vd->dcl.con); VncState *client; trace_vnc_key_guest_leds((ledstate & QEMU_CAPS_LOCK_LED), @@ -3489,8 +3490,7 @@ static void vnc_display_close(VncDisplay *vd) g_free(vd->tlsauthzid); vd->tlsauthzid = NULL; if (vd->lock_key_sync) { - qemu_remove_led_event_handler(vd->led); - vd->led = NULL; + qemu_input_led_notifier_remove(&vd->led_notifier); } #ifdef CONFIG_VNC_SASL if (vd->sasl.authz) { @@ -4221,7 +4221,8 @@ static bool vnc_display_open(VncDisplay *vd, Error **errp) #endif vd->lock_key_sync = lock_key_sync; if (lock_key_sync) { - vd->led = qemu_add_led_event_handler(kbd_leds, vd); + vd->led_notifier.notify = kbd_leds; + qemu_input_led_notifier_add(&vd->led_notifier); } vd->ledstate = 0; -- 2.54.0
