summary refs log tree commit diff stats
path: root/results/classifier/gemma3:12b/graphic/558
diff options
context:
space:
mode:
Diffstat (limited to 'results/classifier/gemma3:12b/graphic/558')
-rw-r--r--results/classifier/gemma3:12b/graphic/55858
1 files changed, 58 insertions, 0 deletions
diff --git a/results/classifier/gemma3:12b/graphic/558 b/results/classifier/gemma3:12b/graphic/558
new file mode 100644
index 000000000..79515e781
--- /dev/null
+++ b/results/classifier/gemma3:12b/graphic/558
@@ -0,0 +1,58 @@
+
+gtk UI interprets double/triple click as button release
+Description of problem:
+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.
+Steps to 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 information:
+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();
+```