diff options
| author | Po Lu | 2021-11-28 13:13:06 +0800 |
|---|---|---|
| committer | Po Lu | 2021-11-28 13:14:13 +0800 |
| commit | bd321f78eb8db839147a13a8543c0d3ca878f242 (patch) | |
| tree | 61d866160f7be789e83d4081ea6e22e7698115d2 /src | |
| parent | 08d1c405073f614d89bcdf7f6bd19e8c8aaf8356 (diff) | |
| download | emacs-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.c | 6 | ||||
| -rw-r--r-- | src/xwidget.c | 14 |
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 | } |