Hi On Wed, Apr 3, 2024 at 9:51 AM Justinien Bouron <justinien.bou...@gmail.com> wrote: > > Depending on your use-case, it might be inconvenient to have qemu grab > the input device from the host immediately upon starting the guest. > > Added a new bool option to input-linux: grab-on-startup. If true, the > device is grabbed as soon as the guest is started, otherwise it is not > grabbed until the toggle combination is entered. To avoid breaking > existing setups, the default value of grab-on-startup is true, i.e. same > behaviour as before this change. > > Signed-off-by: Justinien Bouron <justinien.bou...@gmail.com> > --- > > Changes since v2: > - Added missing (since 9.1) to the new option in qapi/qom.json > > qapi/qom.json | 14 +++++++++++++- > ui/input-linux.c | 20 +++++++++++++++++++- > 2 files changed, 32 insertions(+), 2 deletions(-) > > diff --git a/qapi/qom.json b/qapi/qom.json > index 85e6b4f84a..2067e41991 100644 > --- a/qapi/qom.json > +++ b/qapi/qom.json > @@ -508,13 +508,25 @@ > # @grab-toggle: the key or key combination that toggles device grab > # (default: ctrl-ctrl) > # > +# @grab-on-startup: if true, grab the device immediately upon starting > +# the guest. Otherwise, don't grab the device until the > +# combination is entered. This does not influence other devices > +# even if grab_all is true, i.e. in the unlikely scenario where > +# device1 has grab_all=true + grab-on-startup=true and device2 has > +# grab-on-startup=false, only device1 is grabbed on startup, then, > +# once the grab combination is entered, grabbing is toggled off > +# for both devices (because device1 enforces the grab_all > +# property) until the combination is entered again at which point > +# both devices will be grabbed. (default: true) (since 9.1). > +# > # Since: 2.6 > ## > { 'struct': 'InputLinuxProperties', > 'data': { 'evdev': 'str', > '*grab_all': 'bool', > '*repeat': 'bool', > - '*grab-toggle': 'GrabToggleKeys' } } > + '*grab-toggle': 'GrabToggleKeys', > + '*grab-on-startup': 'bool'} } > > ## > # @EventLoopBaseProperties: > diff --git a/ui/input-linux.c b/ui/input-linux.c > index e572a2e905..68b5c6d485 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_startup; > bool keydown[KEY_CNT]; > int keycount; > int wheel; > @@ -400,7 +401,7 @@ static void input_linux_complete(UserCreatable *uc, Error > **errp) > if (il->keycount) { > /* delay grab until all keys are released */ > il->grab_request = true; > - } else { > + } else if (il->grab_on_startup) { > input_linux_toggle_grab(il); > }
The patch looks ok to me, but you don't handle the case where keys are pressed at startup and the grab is delayed. You could add a if (!il->grab_on_startup) goto skip_grab, probably instead. > QTAILQ_INSERT_TAIL(&inputs, il, next); > @@ -491,6 +492,19 @@ static void input_linux_set_grab_toggle(Object *obj, int > value, > il->grab_toggle = value; > } > > +static bool input_linux_get_grab_on_startup(Object *obj, Error **errp) > +{ > + InputLinux *il = INPUT_LINUX(obj); > + return il->grab_on_startup; > +} > + > +static void input_linux_set_grab_on_startup(Object *obj, bool value, > + Error **errp) > +{ > + InputLinux *il = INPUT_LINUX(obj); > + il->grab_on_startup = value; > +} > + > static void input_linux_instance_init(Object *obj) > { > } > @@ -498,6 +512,7 @@ static void input_linux_instance_init(Object *obj) > static void input_linux_class_init(ObjectClass *oc, void *data) > { > UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); > + ObjectProperty *grab_on_startup_prop; > > ucc->complete = input_linux_complete; > > @@ -514,6 +529,9 @@ static void input_linux_class_init(ObjectClass *oc, void > *data) > &GrabToggleKeys_lookup, > input_linux_get_grab_toggle, > input_linux_set_grab_toggle); > + grab_on_startup_prop = object_class_property_add_bool(oc, > "grab-on-startup", > + input_linux_get_grab_on_startup, input_linux_set_grab_on_startup); > + object_property_set_default_bool(grab_on_startup_prop, true); > } > > static const TypeInfo input_linux_info = { > -- > 2.44.0 >