From nobody Mon Feb 9 12:43:06 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15452216352261016.4589897011142; Wed, 19 Dec 2018 04:13:55 -0800 (PST) Received: from localhost ([::1]:59670 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZajZ-00070A-9t for importer@patchew.org; Wed, 19 Dec 2018 07:13:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZafC-0003Jv-Cx for qemu-devel@nongnu.org; Wed, 19 Dec 2018 07:09:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gZaf9-0000CH-Aj for qemu-devel@nongnu.org; Wed, 19 Dec 2018 07:09:22 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40732) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gZaf6-0000Ai-7l for qemu-devel@nongnu.org; Wed, 19 Dec 2018 07:09:16 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3B03289AED for ; Wed, 19 Dec 2018 12:09:14 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-174.ams2.redhat.com [10.36.117.174]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B2E1100034B; Wed, 19 Dec 2018 12:09:10 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 3F5665E16D; Wed, 19 Dec 2018 13:09:05 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 19 Dec 2018 13:09:02 +0100 Message-Id: <20181219120904.17643-6-kraxel@redhat.com> In-Reply-To: <20181219120904.17643-1-kraxel@redhat.com> References: <20181219120904.17643-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 19 Dec 2018 12:09:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH v2 5/7] kbd-state: use state tracker for vnc X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use the new keyboard state tracked for vnc. Allows to drop the vnc-specific modifier state tracking code. Signed-off-by: Gerd Hoffmann Reviewed-by: Daniel P. Berrang=C3=A9 --- ui/vnc.h | 5 ++- ui/vnc.c | 120 ++++++++++++++++++-----------------------------------------= ---- 2 files changed, 35 insertions(+), 90 deletions(-) diff --git a/ui/vnc.h b/ui/vnc.h index a86e0610e8..56111908ce 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -44,6 +44,7 @@ #include "keymaps.h" #include "vnc-palette.h" #include "vnc-enc-zrle.h" +#include "ui/kbd-state.h" =20 // #define _VNC_DEBUG 1 =20 @@ -155,7 +156,7 @@ struct VncDisplay int lock_key_sync; QEMUPutLEDEntry *led; int ledstate; - int key_delay_ms; + KbdState *kbd; QemuMutex mutex; =20 QEMUCursor *cursor; @@ -326,8 +327,6 @@ struct VncState =20 VncReadEvent *read_handler; size_t read_handler_expect; - /* input */ - uint8_t modifiers_state[256]; =20 bool abort; QemuMutex output_mutex; diff --git a/ui/vnc.c b/ui/vnc.c index 0c1b477425..b56431ce3b 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -59,7 +59,6 @@ static QTAILQ_HEAD(, VncDisplay) vnc_displays =3D QTAILQ_HEAD_INITIALIZER(vnc_displays); =20 static int vnc_cursor_define(VncState *vs); -static void vnc_release_modifiers(VncState *vs); static void vnc_update_throttle_offset(VncState *vs); =20 static void vnc_set_share_mode(VncState *vs, VncShareMode mode) @@ -1248,7 +1247,7 @@ void vnc_disconnect_finish(VncState *vs) vnc_sasl_client_cleanup(vs); #endif /* CONFIG_VNC_SASL */ audio_del(vs); - vnc_release_modifiers(vs); + kbd_state_lift_all_keys(vs->vd->kbd); =20 if (vs->mouse_mode_notifier.notify !=3D NULL) { qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier); @@ -1737,26 +1736,10 @@ static void pointer_event(VncState *vs, int button_= mask, int x, int y) qemu_input_event_sync(); } =20 -static void reset_keys(VncState *vs) +static void press_key(VncState *vs, QKeyCode qcode) { - int i; - for(i =3D 0; i < 256; i++) { - if (vs->modifiers_state[i]) { - qemu_input_event_send_key_number(vs->vd->dcl.con, i, false); - qemu_input_event_send_key_delay(vs->vd->key_delay_ms); - vs->modifiers_state[i] =3D 0; - } - } -} - -static void press_key(VncState *vs, int keysym) -{ - int keycode =3D keysym2scancode(vs->vd->kbd_layout, keysym, - false, false, false) & SCANCODE_KEYMASK; - qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, true); - qemu_input_event_send_key_delay(vs->vd->key_delay_ms); - qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false); - qemu_input_event_send_key_delay(vs->vd->key_delay_ms); + kbd_state_key_event(vs->vd->kbd, qcode, true); + kbd_state_key_event(vs->vd->kbd, qcode, false); } =20 static void vnc_led_state_change(VncState *vs) @@ -1797,32 +1780,20 @@ static void kbd_leds(void *opaque, int ledstate) =20 static void do_key_event(VncState *vs, int down, int keycode, int sym) { + QKeyCode qcode =3D qemu_input_key_number_to_qcode(keycode); + /* QEMU console switch */ - switch(keycode) { - case 0x2a: /* Left Shift */ - case 0x36: /* Right Shift */ - case 0x1d: /* Left CTRL */ - case 0x9d: /* Right CTRL */ - case 0x38: /* Left ALT */ - case 0xb8: /* Right ALT */ - if (down) - vs->modifiers_state[keycode] =3D 1; - else - vs->modifiers_state[keycode] =3D 0; - break; - case 0x02 ... 0x0a: /* '1' to '9' keys */ - if (vs->vd->dcl.con =3D=3D NULL && - down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]= ) { + switch (qcode) { + case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */ + if (vs->vd->dcl.con =3D=3D NULL && down && + kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_CTRL) && + kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_ALT)) { /* Reset the modifiers sent to the current console */ - reset_keys(vs); - console_select(keycode - 0x02); + kbd_state_lift_all_keys(vs->vd->kbd); + console_select(qcode - Q_KEY_CODE_1); return; } - break; - case 0x3a: /* CapsLock */ - case 0x45: /* NumLock */ - if (down) - vs->modifiers_state[keycode] ^=3D 1; + default: break; } =20 @@ -1837,16 +1808,14 @@ static void do_key_event(VncState *vs, int down, in= t keycode, int sym) toggles numlock away from the VNC window. */ if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) { - if (!vs->modifiers_state[0x45]) { + if (!kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_NUMLOCK)) { trace_vnc_key_sync_numlock(true); - vs->modifiers_state[0x45] =3D 1; - press_key(vs, 0xff7f); + press_key(vs, Q_KEY_CODE_NUM_LOCK); } } else { - if (vs->modifiers_state[0x45]) { + if (kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_NUMLOCK)) { trace_vnc_key_sync_numlock(false); - vs->modifiers_state[0x45] =3D 0; - press_key(vs, 0xff7f); + press_key(vs, Q_KEY_CODE_NUM_LOCK); } } } @@ -1859,30 +1828,25 @@ static void do_key_event(VncState *vs, int down, in= t keycode, int sym) toggles capslock away from the VNC window. */ int uppercase =3D !!(sym >=3D 'A' && sym <=3D 'Z'); - int shift =3D !!(vs->modifiers_state[0x2a] | vs->modifiers_state[0= x36]); - int capslock =3D !!(vs->modifiers_state[0x3a]); + bool shift =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_SHIFT); + bool capslock =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_CAPS= LOCK); if (capslock) { if (uppercase =3D=3D shift) { trace_vnc_key_sync_capslock(false); - vs->modifiers_state[0x3a] =3D 0; - press_key(vs, 0xffe5); + press_key(vs, Q_KEY_CODE_CAPS_LOCK); } } else { if (uppercase !=3D shift) { trace_vnc_key_sync_capslock(true); - vs->modifiers_state[0x3a] =3D 1; - press_key(vs, 0xffe5); + press_key(vs, Q_KEY_CODE_CAPS_LOCK); } } } =20 - if (qemu_console_is_graphic(NULL)) { - qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down); - qemu_input_event_send_key_delay(vs->vd->key_delay_ms); - } else { - bool numlock =3D vs->modifiers_state[0x45]; - bool control =3D (vs->modifiers_state[0x1d] || - vs->modifiers_state[0x9d]); + kbd_state_key_event(vs->vd->kbd, qcode, down); + if (!qemu_console_is_graphic(NULL)) { + bool numlock =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_NUMLO= CK); + bool control =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_CTRL); /* QEMU console emulation */ if (down) { switch (keycode) { @@ -1983,27 +1947,6 @@ static void do_key_event(VncState *vs, int down, int= keycode, int sym) } } =20 -static void vnc_release_modifiers(VncState *vs) -{ - static const int keycodes[] =3D { - /* shift, control, alt keys, both left & right */ - 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8, - }; - int i, keycode; - - if (!qemu_console_is_graphic(NULL)) { - return; - } - for (i =3D 0; i < ARRAY_SIZE(keycodes); i++) { - keycode =3D keycodes[i]; - if (!vs->modifiers_state[keycode]) { - continue; - } - qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false); - qemu_input_event_send_key_delay(vs->vd->key_delay_ms); - } -} - static const char *code2name(int keycode) { return QKeyCode_str(qemu_input_key_number_to_qcode(keycode)); @@ -2011,9 +1954,9 @@ static const char *code2name(int keycode) =20 static void key_event(VncState *vs, int down, uint32_t sym) { - bool shift =3D vs->modifiers_state[0x2a] || vs->modifiers_state[0x36]; - bool altgr =3D vs->modifiers_state[0xb8]; - bool ctrl =3D vs->modifiers_state[0x1d] || vs->modifiers_state[0x9d]; + bool shift =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_SHIFT); + bool altgr =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_ALTGR); + bool ctrl =3D kbd_state_modifier_get(vs->vd->kbd, KBD_MOD_CTRL); int keycode; int lsym =3D sym; =20 @@ -3240,6 +3183,7 @@ void vnc_display_init(const char *id, Error **errp) =20 vd->dcl.ops =3D &dcl_ops; register_displaychangelistener(&vd->dcl); + vd->kbd =3D kbd_state_init(vd->dcl.con); } =20 =20 @@ -3976,7 +3920,6 @@ void vnc_display_open(const char *id, Error **errp) vd->led =3D qemu_add_led_event_handler(kbd_leds, vd); } vd->ledstate =3D 0; - vd->key_delay_ms =3D key_delay_ms; =20 device_id =3D qemu_opt_get(opts, "display"); if (device_id) { @@ -3993,10 +3936,13 @@ void vnc_display_open(const char *id, Error **errp) } =20 if (con !=3D vd->dcl.con) { + kbd_state_free(vd->kbd); unregister_displaychangelistener(&vd->dcl); vd->dcl.con =3D con; register_displaychangelistener(&vd->dcl); + vd->kbd =3D kbd_state_init(vd->dcl.con); } + kbd_state_set_delay(vd->kbd, key_delay_ms); =20 if (saddr =3D=3D NULL) { goto cleanup; --=20 2.9.3