aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-11-28 13:13:06 +0800
committerPo Lu2021-11-28 13:14:13 +0800
commitbd321f78eb8db839147a13a8543c0d3ca878f242 (patch)
tree61d866160f7be789e83d4081ea6e22e7698115d2 /src
parent08d1c405073f614d89bcdf7f6bd19e8c8aaf8356 (diff)
downloademacs-bd321f78eb8db839147a13a8543c0d3ca878f242.tar.gz
emacs-bd321f78eb8db839147a13a8543c0d3ca878f242.zip
Fix xwidget popups on XI2
* src/gtkutil.c (xg_is_menu_window): Determine whether wdesc is a menu generated by a menu bar more reliably. * src/xwidget.c (xwidget_button_1): Release all XI2 grabs on click.
Diffstat (limited to 'src')
-rw-r--r--src/gtkutil.c6
-rw-r--r--src/xwidget.c14
2 files changed, 19 insertions, 1 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 9e676cd025b..8f8db4ed372 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -853,7 +853,11 @@ xg_is_menu_window (Display *dpy, Window wdesc)
853 { 853 {
854 GtkWidget *fw = gtk_bin_get_child (GTK_BIN (gwdesc)); 854 GtkWidget *fw = gtk_bin_get_child (GTK_BIN (gwdesc));
855 if (GTK_IS_MENU (fw)) 855 if (GTK_IS_MENU (fw))
856 return true; 856 {
857 GtkWidget *parent
858 = gtk_menu_shell_get_parent_shell (GTK_MENU_SHELL (fw));
859 return GTK_IS_MENU_BAR (parent);
860 }
857 } 861 }
858 862
859 return false; 863 return false;
diff --git a/src/xwidget.c b/src/xwidget.c
index 5da2aa1743b..e07b290acbf 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -907,6 +907,10 @@ xwidget_button_1 (struct xwidget_view *view,
907 GdkEvent *xg_event = gdk_event_new (down_p ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE); 907 GdkEvent *xg_event = gdk_event_new (down_p ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
908 struct xwidget *model = XXWIDGET (view->model); 908 struct xwidget *model = XXWIDGET (view->model);
909 GtkWidget *target; 909 GtkWidget *target;
910#ifdef HAVE_XINPUT2
911 struct x_display_info *dpyinfo;
912 struct xi_device_t *xi_device;
913#endif
910 914
911 /* X and Y should be relative to the origin of view->wdesc. */ 915 /* X and Y should be relative to the origin of view->wdesc. */
912 x += view->clip_left; 916 x += view->clip_left;
@@ -930,6 +934,16 @@ xwidget_button_1 (struct xwidget_view *view,
930 xg_event->button.time = time; 934 xg_event->button.time = time;
931 xg_event->button.device = find_suitable_pointer (view->frame); 935 xg_event->button.device = find_suitable_pointer (view->frame);
932 936
937#ifdef HAVE_XINPUT2
938 dpyinfo = FRAME_DISPLAY_INFO (view->frame);
939 for (int idx = 0; idx < dpyinfo->num_devices; ++idx)
940 {
941 xi_device = &dpyinfo->devices[idx];
942
943 XIUngrabDevice (view->dpy, xi_device->device_id, CurrentTime);
944 }
945#endif
946
933 gtk_main_do_event (xg_event); 947 gtk_main_do_event (xg_event);
934 gdk_event_free (xg_event); 948 gdk_event_free (xg_event);
935} 949}