diff mbox series

input-linux: Make grabbing on start configurable

Message ID 20210208141724.58067-1-minus@mnus.de (mailing list archive)
State New, archived
Headers show
Series input-linux: Make grabbing on start configurable | expand

Commit Message

minus Feb. 8, 2021, 2:17 p.m. UTC
Setting grab_on_start=off allows starting a VM on boot that shares the
keyboard/mouse of the host but without grabbing it immediately.

Signed-off-by: minus <minus@mnus.de>
---
 ui/input-linux.c | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/ui/input-linux.c b/ui/input-linux.c
index 05c0c98819..c4f82eaa98 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -44,6 +44,7 @@  struct InputLinux {
     bool        grab_request;
     bool        grab_active;
     bool        grab_all;
+    bool        grab_on_start;
     bool        keydown[KEY_CNT];
     int         keycount;
     int         wheel;
@@ -394,11 +395,13 @@  static void input_linux_complete(UserCreatable *uc, Error **errp)
     }
 
     qemu_set_fd_handler(il->fd, input_linux_event, NULL, il);
-    if (il->keycount) {
-        /* delay grab until all keys are released */
-        il->grab_request = true;
-    } else {
-        input_linux_toggle_grab(il);
+    if (il->grab_on_start) {
+        if (il->keycount) {
+            /* delay grab until all keys are released */
+            il->grab_request = true;
+        } else {
+            input_linux_toggle_grab(il);
+        }
     }
     QTAILQ_INSERT_TAIL(&inputs, il, next);
     il->initialized = true;
@@ -450,6 +453,21 @@  static bool input_linux_get_grab_all(Object *obj, Error **errp)
     return il->grab_all;
 }
 
+static void input_linux_set_grab_on_start(Object *obj, bool value,
+                                          Error **errp)
+{
+    InputLinux *il = INPUT_LINUX(obj);
+
+    il->grab_on_start = value;
+}
+
+static bool input_linux_get_grab_on_start(Object *obj, Error **errp)
+{
+    InputLinux *il = INPUT_LINUX(obj);
+
+    return il->grab_on_start;
+}
+
 static void input_linux_set_grab_all(Object *obj, bool value,
                                    Error **errp)
 {
@@ -490,6 +508,9 @@  static void input_linux_set_grab_toggle(Object *obj, int value,
 
 static void input_linux_instance_init(Object *obj)
 {
+    InputLinux *il = INPUT_LINUX(obj);
+
+    il->grab_on_start = true;
 }
 
 static void input_linux_class_init(ObjectClass *oc, void *data)
@@ -504,6 +525,9 @@  static void input_linux_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "grab_all",
                                    input_linux_get_grab_all,
                                    input_linux_set_grab_all);
+    object_class_property_add_bool(oc, "grab_on_start",
+                                   input_linux_get_grab_on_start,
+                                   input_linux_set_grab_on_start);
     object_class_property_add_bool(oc, "repeat",
                                    input_linux_get_repeat,
                                    input_linux_set_repeat);