[Xfce4-commits] [panel-plugins/xfce4-clipman-plugin] 01/03: Revert "Use the xfce_gtk_menu_popup_until_mapped (bumps libxfce4ui to 4.13)"
noreply at xfce.org
noreply at xfce.org
Thu Sep 15 10:19:44 CEST 2016
This is an automated email from the git hooks/post-receive script.
ochosi pushed a commit to branch master
in repository panel-plugins/xfce4-clipman-plugin.
commit 3abeb00331ccf43567921652d8c9717725f9ed1f
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date: Thu Sep 15 10:09:41 2016 +0200
Revert "Use the xfce_gtk_menu_popup_until_mapped (bumps libxfce4ui to 4.13)"
This reverts commit ce62e1fb5143cb27777ea88b3583ff03ada11a24.
---
configure.ac.in | 2 +-
panel-plugin/Makefile.am | 1 +
panel-plugin/plugin.c | 95 ++++++++++++++++++++++++++++++++++++++----------
3 files changed, 77 insertions(+), 21 deletions(-)
diff --git a/configure.ac.in b/configure.ac.in
index b73789e..32cb22a 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -64,7 +64,7 @@ XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.32.0])
XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.32.0])
XDT_CHECK_PACKAGE([GDKX], [gdk-x11-3.0], [3.14.0])
XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.14.0])
-XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.13.0])
+XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.12.0])
XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.12.0])
XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-2.0], [4.12.0])
XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.10.0])
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
index 9a7e432..26259f2 100644
--- a/panel-plugin/Makefile.am
+++ b/panel-plugin/Makefile.am
@@ -222,3 +222,4 @@ DISTCLEANFILES = \
install-exec-hook:
$(LN_S) -f $(exec_prefix)/bin/xfce4-popup-clipman $(DESTDIR)$(exec_prefix)/bin/xfce4-popup-clipman-actions
+
diff --git a/panel-plugin/plugin.c b/panel-plugin/plugin.c
index 8055490..a0050d6 100644
--- a/panel-plugin/plugin.c
+++ b/panel-plugin/plugin.c
@@ -26,7 +26,6 @@
#include <gtk/gtk.h>
#include <xfconf/xfconf.h>
#include <libxfce4util/libxfce4util.h>
-#include <libxfce4ui/libxfce4ui.h>
#ifdef PANEL_PLUGIN
#include <libxfce4panel/libxfce4panel.h>
@@ -47,6 +46,8 @@ static gboolean my_plugin_set_popup_selection (MyPlugin *plugin);
static GdkFilterReturn event_filter_popup_menu (GdkXEvent *xevent,
GdkEvent *event,
MyPlugin *plugin);
+static gboolean xfce_popup_grab_available (GdkWindow *win,
+ guint32 timestamp);
@@ -350,31 +351,32 @@ plugin_configure (MyPlugin *plugin)
void
plugin_popup_menu (MyPlugin *plugin)
{
- gboolean mapped = FALSE;
#ifdef PANEL_PLUGIN
gtk_menu_set_screen (GTK_MENU (plugin->menu), gtk_widget_get_screen (plugin->button));
- mapped = xfce_gtk_menu_popup_until_mapped (GTK_MENU (plugin->menu), NULL, NULL,
- plugin->menu_position_func, plugin,
- 0, gtk_get_current_event_time ());
-
- if (mapped)
- {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plugin->button), TRUE);
- xfce_panel_plugin_register_menu (plugin->panel_plugin, GTK_MENU (plugin->menu));
- }
- else
- g_critical ("Unable to display menu (probably a keyboard/mouse grab concurrency issue).");
+ if(!gtk_widget_has_grab(plugin->menu))
+ {
+ gtk_grab_add(plugin->menu);
+ }
+ gtk_menu_popup (GTK_MENU (plugin->menu), NULL, NULL,
+ plugin->menu_position_func, plugin,
+ 0, gtk_get_current_event_time ());
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plugin->button), TRUE);
+ xfce_panel_plugin_register_menu (plugin->panel_plugin, GTK_MENU (plugin->menu));
#elif defined (STATUS_ICON)
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gtk_menu_set_screen (GTK_MENU (plugin->menu), gtk_status_icon_get_screen (plugin->status_icon));
G_GNUC_END_IGNORE_DEPRECATIONS
- mapped = xfce_gtk_menu_popup_until_mapped (GTK_MENU (plugin->menu), NULL, NULL,
- plugin->menu_position_func, plugin->status_icon,
- 0, gtk_get_current_event_time ());
- if (!mapped)
- g_critical ("Unable to display menu (probably a keyboard/mouse grab concurrency issue).");
+
+ if(!gtk_widget_has_grab(plugin->menu))
+ {
+ gtk_grab_add(plugin->menu);
+ }
+
+ gtk_menu_popup (GTK_MENU (plugin->menu), NULL, NULL,
+ plugin->menu_position_func, plugin->status_icon,
+ 0, gtk_get_current_event_time ());
#endif
}
@@ -435,6 +437,8 @@ event_filter_popup_menu (GdkXEvent *xevent, GdkEvent *event, MyPlugin *plugin)
if (evt->message_type != message_type)
return GDK_FILTER_CONTINUE;
+ /* Copy workaround from xfdesktop to handle the awkward case where binding
+ * a keyboard shortcut to the popup command doesn't always work out... */
#ifdef PANEL_PLUGIN
screen = gtk_widget_get_screen (GTK_WIDGET (plugin->button));
#elif defined (STATUS_ICON)
@@ -444,6 +448,12 @@ G_GNUC_END_IGNORE_DEPRECATIONS
#endif
root = gdk_screen_get_root_window (screen);
+ if (!xfce_popup_grab_available (root, GDK_CURRENT_TIME))
+ {
+ g_critical ("Unable to get keyboard/mouse grab.");
+ return FALSE;
+ }
+
if (G_LIKELY (evt->format == 8) && (*(evt->data.b) != '\0'))
{
@@ -453,8 +463,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
if (xfconf_channel_get_bool (plugin->channel, "/tweaks/popup-at-pointer", FALSE))
{
- xfce_gtk_menu_popup_until_mapped (GTK_MENU (plugin->menu), NULL, NULL, NULL, NULL,
- 0, gtk_get_current_event_time ());
+ gtk_menu_popup (GTK_MENU (plugin->menu), NULL, NULL, NULL, NULL,
+ 0, gtk_get_current_event_time ());
}
else
{
@@ -480,3 +490,48 @@ make_window_visible (GdkSeat *seat,
gdk_window_show (window);
}
#endif
+
+/* Code taken from xfwm4/src/menu.c:grab_available(). This should fix the case
+ * where binding 'xfdesktop -menu' to a keyboard shortcut sometimes works and
+ * sometimes doesn't. Credit for this one goes to Olivier.
+ */
+static gboolean
+xfce_popup_grab_available (GdkWindow *win, guint32 timestamp)
+{
+ GdkDisplay* display = gdk_window_get_display(win);
+#if GTK_CHECK_VERSION (3, 20, 0)
+ GdkSeat *seat = gdk_display_get_default_seat (display);
+#endif
+ GdkGrabStatus g = GDK_GRAB_ALREADY_GRABBED;
+ gboolean grab_failed = TRUE;
+ gint i = 0;
+
+ TRACE ("entering grab_available");
+
+ /* With a keyboard grab elsewhere, we have to wait on that to clear.
+ * So try up to 2500 times and only keep trying when the failure is
+ * already grabbed, any other failure mode will never succeed.
+ */
+ while ((i++ < 2500) && grab_failed && g == GDK_GRAB_ALREADY_GRABBED)
+ {
+#if GTK_CHECK_VERSION (3, 20, 0)
+ g = gdk_seat_grab(seat, win, GDK_SEAT_CAPABILITY_KEYBOARD, TRUE, NULL, NULL, make_window_visible, NULL);
+ if (g == GDK_GRAB_SUCCESS)
+ {
+ gdk_seat_ungrab (seat);
+ grab_failed = FALSE;
+ }
+#else
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ g = gdk_keyboard_grab (win, TRUE, timestamp);
+ if (g == GDK_GRAB_SUCCESS)
+ {
+ gdk_keyboard_ungrab(timestamp);
+ grab_failed = FALSE;
+ }
+ G_GNUC_END_IGNORE_DEPRECATIONS
+#endif
+ }
+
+ return (!grab_failed);
+}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list