diff options
Diffstat (limited to 'gitlab/issues/target_missing/host_missing/accel_missing/558.toml')
| -rw-r--r-- | gitlab/issues/target_missing/host_missing/accel_missing/558.toml | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/gitlab/issues/target_missing/host_missing/accel_missing/558.toml b/gitlab/issues/target_missing/host_missing/accel_missing/558.toml new file mode 100644 index 00000000..96d29a39 --- /dev/null +++ b/gitlab/issues/target_missing/host_missing/accel_missing/558.toml @@ -0,0 +1,65 @@ +id = 558 +title = "gtk UI interprets double/triple click as button release" +state = "closed" +created_at = "2021-08-24T11:46:07.243Z" +closed_at = "2022-03-19T14:16:04.945Z" +labels = ["GUI", "device:input"] +url = "https://gitlab.com/qemu-project/qemu/-/issues/558" +host-os = "Ubuntu 20.04" +host-arch = "x86-64" +qemu-version = "6.0.94 (v6.0.0-3214-gecf2706e27-dirty)" +guest-os = "ToaruOS 2.0" +guest-arch = "x86-64" +description = """When using the GTK interface clicking rapidly in a down-up-down pattern, the final "down" event is erroneously followed by an immediate "up" event and the mouse device in the guest reports the pressed button as no longer being held.""" +reproduce = """1. Start a VM using the GTK interface. +2. Open a tool to examine guest mouse input events, such as `xev` or `yutani-test` +3. Click twice with any button, without releasing on the second click. +4. Observe erroneous 'up' event in guest. +5. Move the mouse while keeping the button pressed. +6. Observe the guest reports the button is not held.""" +additional = """GTK 3 sends an additional `GDK_2BUTTON_PRESS` event after the initial `GDK_BUTTON_PRESS` event, which QEMU is misinterpreting as a release event. I confirmed this with the addition of some logging of `button->type` in `gd_button_event`: + +``` +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 # = PRESS +button = 1, type = 5 # = 2BUTTON_PRESS +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 5 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 7 +button = 1, type = 4 +button = 1, type = 5 +button = 1, type = 7 +``` + +```diff +diff --git a/ui/gtk.c b/ui/gtk.c +index cfb0728d1f..b9979f0e11 100644 +--- a/ui/gtk.c ++++ b/ui/gtk.c +@@ -925,6 +925,13 @@ static gboolean gd_button_event(GtkWidget *widget, GdkEventButton *button, + return TRUE; + } + ++ /* ignore additional events for double- and triple- press, as they are ++ * sent to us after a regular press event; otherwise we will misinterpret ++ * these as release events and eat the button! */ ++ if (button->type == GDK_2BUTTON_PRESS || button->type == GDK_3BUTTON_PRESS) { ++ return TRUE; ++ } ++ + qemu_input_queue_btn(vc->gfx.dcl.con, btn, + button->type == GDK_BUTTON_PRESS); + qemu_input_event_sync(); +```""" |