summary refs log tree commit diff stats
path: root/ui/gtk.c
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki@daynix.com>2022-10-08 23:01:16 +0900
committerGerd Hoffmann <kraxel@redhat.com>2022-10-12 12:46:34 +0200
commit8af5f82b90cc860d79171ade228ccea59c7f525e (patch)
treefe2e2054a1cc9eb5f9a2dfc6fe1cea28d7e85fb9 /ui/gtk.c
parent0468fe82d32e99b6d84085e76d1e946bbe1e80ac (diff)
downloadfocaccia-qemu-8af5f82b90cc860d79171ade228ccea59c7f525e.tar.gz
focaccia-qemu-8af5f82b90cc860d79171ade228ccea59c7f525e.zip
ui/gtk: Fix the implicit mouse ungrabbing logic
Although the grab menu item represents the tabbed displays, the old
implicit mouse ungrabbing logic changes the grab menu item even for
an untabbed display.

Leave the grab menu item when implicitly ungrabbing mouse for an
untabbed display. The new ungrabbing logic introduced in
gd_mouse_mode_change() strictly follows the corresponding grabbing
logic found in gd_button_event().

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20221008140116.11473-1-akihiko.odaki@daynix.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'ui/gtk.c')
-rw-r--r--ui/gtk.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/ui/gtk.c b/ui/gtk.c
index 1467b8c7d7..6fc2e23963 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -681,9 +681,13 @@ static void gd_mouse_mode_change(Notifier *notify, void *data)
 
     s = container_of(notify, GtkDisplayState, mouse_mode_notifier);
     /* release the grab at switching to absolute mode */
-    if (qemu_input_is_absolute() && gd_is_grab_active(s)) {
-        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(s->grab_item),
-                                       FALSE);
+    if (qemu_input_is_absolute() && s->ptr_owner) {
+        if (!s->ptr_owner->window) {
+            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(s->grab_item),
+                                           FALSE);
+        } else {
+            gd_ungrab_pointer(s);
+        }
     }
     for (i = 0; i < s->nb_vcs; i++) {
         VirtualConsole *vc = &s->vc[i];