From nobody Fri Nov 7 11:34:12 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1548192279403759.4466647954008; Tue, 22 Jan 2019 13:24:39 -0800 (PST) Received: from localhost ([127.0.0.1]:50206 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gm3XC-0003Py-A1 for importer@patchew.org; Tue, 22 Jan 2019 16:24:38 -0500 Received: from eggs.gnu.org ([209.51.188.92]:49365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gm3K2-000076-G3 for qemu-devel@nongnu.org; Tue, 22 Jan 2019 16:11:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gm36O-0003Hj-P9 for qemu-devel@nongnu.org; Tue, 22 Jan 2019 15:56:58 -0500 Received: from mail-qt1-x841.google.com ([2607:f8b0:4864:20::841]:37032) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gm36M-00039O-Qb for qemu-devel@nongnu.org; Tue, 22 Jan 2019 15:56:56 -0500 Received: by mail-qt1-x841.google.com with SMTP id t33so29267330qtt.4 for ; Tue, 22 Jan 2019 12:56:51 -0800 (PST) Received: from earth.fios-router.home (pool-108-28-253-225.washdc.fios.verizon.net. [108.28.253.225]) by smtp.gmail.com with ESMTPSA id z18sm35915992qkz.96.2019.01.22.12.56.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 Jan 2019 12:56:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=fONcLNIbcvib8jdyZeayQEw563Aj42h+/+xGmoBLkMc=; b=J7p+0Phg+6FHYaR1QTE+P53Vw7OfX6BdM5pK1+nAP5o5wgPiAhlop/HwqEzgODyx2J qqs6+ATX60P9paC7pokIpA0Ypv6Yq7//Ch6t6aNoKEIAHphZnXoVrOgw0BOGpMrIA6UA ukJoc8dnTwctFiIm9CE6lK+fPGoNzWHV15dXbpDdNwZ/rcKHLPs7HA+OKLFUQVmQyyrk QFZPKNrOUnKmqbyMCbVngdG0akiihk/dsrwVnrieXUT8V3+8o9KI8WzQwAPxuI7227ez yMulsea83pemD2OlHJe6ufxTZOkn8eOseaznZo6kDJyNK4ZvFdSxVISvGTxTIRSVqXVb j7ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=fONcLNIbcvib8jdyZeayQEw563Aj42h+/+xGmoBLkMc=; b=Ldc/JwUde8nENzcsV9UHbGMdyIhbU4pOSnFX60emXEUP/R623Am0HxfLYEqeXYVgZd OdGZhvgfypS7/MllaGk+w7+nWV0gt7eu7OCeklF2icajuu0pXrMIFNA6hH75LR+B+XW/ kmZjqdjnu5BpnH7W8KbaD3tSYWNTXQuWirG66fhh0rdKeVDluNh63MS+luhTCuEnKe6c +zdIsCf4Ehj5g0rVzfLb23UxVtgizM4+XFMJdb2Agaoob60qFWxeYGhYW473t9PxFFDx IUp+lgCmT6Mgfxxxt7ijDubopu3jFAEEnt3kW/uEYE1LBYwED+xrY9gAqnE1t4vZwqOL cJxA== X-Gm-Message-State: AJcUukfHy3CbVqrb5hnU3iOlGZ9fTtEQ/rh9JEWBTj7IOsfNv6VkYVV6 JGKhEWdA/Jc7/IYXoWV1rVnYgDWs5AA= X-Google-Smtp-Source: ALg8bN7x57OD+NuF5SiE50TknMKVTtopcc89vd1iDIu8GxYQazNHEf20gadnpIW4RFOai+YwTGH1DQ== X-Received: by 2002:a0c:8ecc:: with SMTP id y12mr30573950qvb.41.1548190610215; Tue, 22 Jan 2019 12:56:50 -0800 (PST) From: Ryan El Kochta To: qemu-devel@nongnu.org, kraxel@redhat.com Date: Tue, 22 Jan 2019 15:56:27 -0500 Message-Id: <20190122205627.10182-1-relkochta@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::841 Subject: [Qemu-devel] [PATCH] input-linux: customizable grab toggle keys v5 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: Ryan El Kochta Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @gmail.com) Content-Type: text/plain; charset="utf-8" Here is an updated version of my previous patch. Ctrl-Alt has been removed, as per your recommendation, and Ctrl-Scrolllock has been changed so as to trigger when either ctrl key is pressed, for a consistent naming scheme. I do agree that this is the best way forward. Ctrl-Backtick is also gone. I've tested these on a Windows and Linux guest and they all appear to work fine. Quick aside; I'm sorry if this e-mail isn't a reply to the old thread. I haven't quite figured that one out yet :-) Signed-off-by: Ryan El Kochta --- qapi/ui.json | 10 ++++++++ ui/input-linux.c | 66 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/qapi/ui.json b/qapi/ui.json index 5ad1324..7d9c4bd 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1016,6 +1016,16 @@ '*head' : 'int', 'events' : [ 'InputEvent' ] } } =20 +## +# @GrabToggleKeys: +# +# Keys to toggle input-linux between host and guest. +# +# Since: 4.0 +# +## +{ 'enum': 'GrabToggleKeys', + 'data': [ 'ctrl-ctrl', 'alt-alt', 'meta-meta', 'scrolllock', 'ctrl-scrol= llock' ] } =20 ## # @DisplayGTK: diff --git a/ui/input-linux.c b/ui/input-linux.c index 9720333..ba550dd 100644 --- a/ui/input-linux.c +++ b/ui/input-linux.c @@ -12,6 +12,8 @@ #include "sysemu/sysemu.h" #include "ui/input.h" #include "qom/object_interfaces.h" +#include "sysemu/iothread.h" +#include "block/aio.h" =20 #include #include "standard-headers/linux/input.h" @@ -63,6 +65,8 @@ struct InputLinux { struct input_event event; int read_offset; =20 + enum GrabToggleKeys grab_toggle; + QTAILQ_ENTRY(InputLinux) next; }; =20 @@ -98,6 +102,44 @@ static void input_linux_toggle_grab(InputLinux *il) } } =20 +static bool input_linux_check_toggle(InputLinux *il) +{ + switch (il->grab_toggle) { + case GRAB_TOGGLE_KEYS_CTRL_CTRL: + return il->keydown[KEY_LEFTCTRL] && + il->keydown[KEY_RIGHTCTRL]; + + case GRAB_TOGGLE_KEYS_ALT_ALT: + return il->keydown[KEY_LEFTALT] && + il->keydown[KEY_RIGHTALT]; + + case GRAB_TOGGLE_KEYS_META_META: + return il->keydown[KEY_LEFTMETA] && + il->keydown[KEY_RIGHTMETA]; + + case GRAB_TOGGLE_KEYS_SCROLLLOCK: + return il->keydown[KEY_SCROLLLOCK]; + + case GRAB_TOGGLE_KEYS_CTRL_SCROLLLOCK: + return (il->keydown[KEY_LEFTCTRL] || + il->keydown[KEY_RIGHTCTRL]) && + il->keydown[KEY_SCROLLLOCK]; + + case GRAB_TOGGLE_KEYS__MAX: + /* avoid gcc error */ + break; + } + return false; +} + +static bool input_linux_should_skip(InputLinux *il, + struct input_event *event) +{ + return (il->grab_toggle =3D=3D GRAB_TOGGLE_KEYS_SCROLLLOCK || + il->grab_toggle =3D=3D GRAB_TOGGLE_KEYS_CTRL_SCROLLLOCK) && + event->code =3D=3D KEY_SCROLLLOCK; +} + static void input_linux_handle_keyboard(InputLinux *il, struct input_event *event) { @@ -128,14 +170,13 @@ static void input_linux_handle_keyboard(InputLinux *i= l, } =20 /* send event to guest when grab is active */ - if (il->grab_active) { + if (il->grab_active && !input_linux_should_skip(il, event)) { int qcode =3D qemu_input_linux_to_qcode(event->code); qemu_input_event_send_key_qcode(NULL, qcode, event->value); } =20 /* hotkey -> record switch request ... */ - if (il->keydown[KEY_LEFTCTRL] && - il->keydown[KEY_RIGHTCTRL]) { + if (input_linux_check_toggle(il)) { il->grab_request =3D true; } =20 @@ -410,6 +451,21 @@ static void input_linux_set_repeat(Object *obj, bool v= alue, il->repeat =3D value; } =20 +static int input_linux_get_grab_toggle(Object *obj, Error **errp) +{ + InputLinux *il =3D INPUT_LINUX(obj); + + return il->grab_toggle; +} + +static void input_linux_set_grab_toggle(Object *obj, int value, + Error **errp) +{ + InputLinux *il =3D INPUT_LINUX(obj); + + il->grab_toggle =3D value; +} + static void input_linux_instance_init(Object *obj) { object_property_add_str(obj, "evdev", @@ -421,6 +477,10 @@ static void input_linux_instance_init(Object *obj) object_property_add_bool(obj, "repeat", input_linux_get_repeat, input_linux_set_repeat, NULL); + object_property_add_enum(obj, "grab-toggle", "GrabToggleKeys", + &GrabToggleKeys_lookup, + input_linux_get_grab_toggle, + input_linux_set_grab_toggle, NULL); } =20 static void input_linux_class_init(ObjectClass *oc, void *data) --=20 2.20.1