From nobody Wed Dec 17 06:08:54 2025 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 1519233183427995.0631147454966; Wed, 21 Feb 2018 09:13:03 -0800 (PST) Received: from localhost ([::1]:33854 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eoXws-0004Ep-1Z for importer@patchew.org; Wed, 21 Feb 2018 12:12:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39773) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eoXsY-0000TY-En for qemu-devel@nongnu.org; Wed, 21 Feb 2018 12:08:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eoXsU-0005b5-BE for qemu-devel@nongnu.org; Wed, 21 Feb 2018 12:08:26 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:32920 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eoXsU-0005an-5v for qemu-devel@nongnu.org; Wed, 21 Feb 2018 12:08:22 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D83AD4022905; Wed, 21 Feb 2018 17:08:21 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-147.ams2.redhat.com [10.36.116.147]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8B8D52024CA8; Wed, 21 Feb 2018 17:08:21 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id D52FE17515; Wed, 21 Feb 2018 18:08:20 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 21 Feb 2018 18:08:17 +0100 Message-Id: <20180221170820.15365-3-kraxel@redhat.com> In-Reply-To: <20180221170820.15365-1-kraxel@redhat.com> References: <20180221170820.15365-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Wed, 21 Feb 2018 17:08:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Wed, 21 Feb 2018 17:08:21 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'kraxel@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [RFC PATCH 2/5] kbd-state: add hotkey registry 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: programmingkidx@gmail.com, Gerd Hoffmann , peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add support to register hotkeys and to check whenever a given QKeyCode combined with the current modifier state is a hotkey. A hotkey can be any key combined with up to three modifier keys. Signed-off-by: Gerd Hoffmann --- include/ui/kbd-state.h | 27 +++++++++++++++++++++++++++ ui/kbd-state.c | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/include/ui/kbd-state.h b/include/ui/kbd-state.h index c961da45b2..3f13649b63 100644 --- a/include/ui/kbd-state.h +++ b/include/ui/kbd-state.h @@ -20,3 +20,30 @@ bool kbd_state_key_get(KbdState *kbd, QKeyCode qcode); void kbd_state_key_event(KbdState *kbd, QKeyCode qcode, bool down); void kbd_state_lift_all_keys(KbdState *kbd); KbdState *kbd_state_init(QemuConsole *con); + +/* ------------------------------------------------------------------ */ + +typedef enum KbdHotkey KbdHotkey; + +enum KbdHotkey { + KBD_HOTKEY_NONE =3D 0, + + KBD_HOTKEY_GRAB, + KBD_HOTKEY_FULLSCREEN, + KBD_HOTKEY_REDRAW, + + KBD_HOTKEY_CONSOLE_1, + KBD_HOTKEY_CONSOLE_2, + KBD_HOTKEY_CONSOLE_3, + KBD_HOTKEY_CONSOLE_4, + KBD_HOTKEY_CONSOLE_5, + KBD_HOTKEY_CONSOLE_6, + KBD_HOTKEY_CONSOLE_7, + KBD_HOTKEY_CONSOLE_8, + KBD_HOTKEY_CONSOLE_9, +}; + +void kbd_state_hotkey_register(KbdState *kbd, KbdHotkey, QKeyCode qcode, + KbdModifier mod1, KbdModifier mod2, + KbdModifier mod3); +KbdHotkey kbd_state_hotkey_get(KbdState *kbd, QKeyCode qcode); diff --git a/ui/kbd-state.c b/ui/kbd-state.c index 7a9fe268c2..812cb368e3 100644 --- a/ui/kbd-state.c +++ b/ui/kbd-state.c @@ -6,20 +6,20 @@ #include "ui/input.h" #include "ui/kbd-state.h" =20 -typedef struct KbdHotkey KbdHotkey; +typedef struct KbdHotkeyEntry KbdHotkeyEntry; =20 -struct KbdHotkey { +struct KbdHotkeyEntry { uint32_t id; QKeyCode qcode; DECLARE_BITMAP(mods, KBD_MOD__MAX); - QTAILQ_ENTRY(KbdHotkey) next; + QTAILQ_ENTRY(KbdHotkeyEntry) next; }; =20 struct KbdState { QemuConsole *con; DECLARE_BITMAP(keys, Q_KEY_CODE__MAX); DECLARE_BITMAP(mods, KBD_MOD__MAX); - QTAILQ_HEAD(,KbdHotkey) hotkeys; + QTAILQ_HEAD(, KbdHotkeyEntry) hotkeys; }; =20 static void kbd_state_modifier_update(KbdState *kbd, @@ -117,3 +117,36 @@ KbdState *kbd_state_init(QemuConsole *con) =20 return kbd; } + +void kbd_state_hotkey_register(KbdState *kbd, KbdHotkey id, QKeyCode qcode, + KbdModifier mod1, KbdModifier mod2, + KbdModifier mod3) +{ + KbdHotkeyEntry *hotkey =3D g_new0(KbdHotkeyEntry, 1); + + hotkey->id =3D id; + hotkey->qcode =3D qcode; + if (mod1 !=3D KBD_MOD_NONE) { + set_bit(mod1, hotkey->mods); + } + if (mod2 !=3D KBD_MOD_NONE) { + set_bit(mod2, hotkey->mods); + } + if (mod3 !=3D KBD_MOD_NONE) { + set_bit(mod3, hotkey->mods); + } + QTAILQ_INSERT_TAIL(&kbd->hotkeys, hotkey, next); +} + +KbdHotkey kbd_state_hotkey_get(KbdState *kbd, QKeyCode qcode) +{ + KbdHotkeyEntry *hotkey; + + QTAILQ_FOREACH(hotkey, &kbd->hotkeys, next) { + if (qcode =3D=3D hotkey->qcode && + bitmap_equal(kbd->mods, hotkey->mods, KBD_MOD__MAX)) { + return hotkey->id; + } + } + return KBD_HOTKEY_NONE; +} --=20 2.9.3