[Xfce4-commits] [panel-plugins/xfce4-whiskermenu-plugin] 21/41: Replace deprecated pointer grab.

noreply at xfce.org noreply at xfce.org
Sat Aug 20 18:32:35 CEST 2016


This is an automated email from the git hooks/post-receive script.

gottcode pushed a commit to branch master
in repository panel-plugins/xfce4-whiskermenu-plugin.

commit b83e05ef51ebadc8a5d1fe9d88c4acd6f714ecae
Author: Graeme Gott <graeme at gottcode.org>
Date:   Tue Aug 9 08:22:32 2016 -0400

    Replace deprecated pointer grab.
---
 panel-plugin/plugin.cpp | 48 ++++++++++++++++++++++++++------
 panel-plugin/window.cpp | 73 ++++++++++++++++++++++++++++++++-----------------
 2 files changed, 87 insertions(+), 34 deletions(-)

diff --git a/panel-plugin/plugin.cpp b/panel-plugin/plugin.cpp
index 0a9d592..a3e00b1 100644
--- a/panel-plugin/plugin.cpp
+++ b/panel-plugin/plugin.cpp
@@ -51,19 +51,48 @@ static bool panel_utils_grab_available()
 {
 	bool grab_succeed = false;
 
-	// Don't try to get the grab for longer then 1/4 second
 	GdkWindow* root = gdk_screen_get_root_window(xfce_gdk_screen_get_active(NULL));
+	GdkDisplay* display = gdk_display_get_default();
+#if GTK_CHECK_VERSION(3,20,0)
+	GdkSeat* seat = gdk_display_get_default_seat(display);
+
+	// Don't try to get the grab for longer then 1/4 second
+	for (guint i = 0; i < (G_USEC_PER_SEC / 400); ++i)
+	{
+		if (gdk_seat_grab(seat, root, GDK_SEAT_CAPABILITY_ALL, true, NULL, NULL, NULL, NULL))
+		{
+			gdk_seat_ungrab(seat);
+			grab_succeed = true;
+			break;
+		}
+		g_usleep(100);
+	}
+#else
+	GdkDeviceManager* device_manager = gdk_display_get_device_manager(display);
+	GdkDevice* pointer = gdk_device_manager_get_client_pointer(device_manager);
+	GdkDevice* keyboard = gdk_device_get_associated_device(pointer);
+
+	// Don't try to get the grab for longer then 1/4 second
 	GdkGrabStatus grab_pointer = GDK_GRAB_FROZEN;
 	GdkGrabStatus grab_keyboard = GDK_GRAB_FROZEN;
-	for (guint i = 0; i < (G_USEC_PER_SEC / 4 / 100); ++i)
+	for (guint i = 0; i < (G_USEC_PER_SEC / 400); ++i)
 	{
-		grab_keyboard = gdk_keyboard_grab(root, true, GDK_CURRENT_TIME);
+		grab_keyboard = gdk_device_grab(keyboard,
+				root,
+				GDK_OWNERSHIP_NONE,
+				true,
+				GDK_ALL_EVENTS_MASK,
+				NULL,
+				GDK_CURRENT_TIME);
 		if (grab_keyboard == GDK_GRAB_SUCCESS)
 		{
-			const GdkEventMask pointer_mask = static_cast<GdkEventMask>(GDK_BUTTON_PRESS_MASK
-					| GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK
-					| GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK);
-			grab_pointer = gdk_pointer_grab(root, true, pointer_mask, NULL, NULL, GDK_CURRENT_TIME);
+			grab_pointer = gdk_device_grab(pointer,
+					root,
+					GDK_OWNERSHIP_NONE,
+					true,
+					GDK_ALL_EVENTS_MASK,
+					NULL,
+					GDK_CURRENT_TIME);
 			if (grab_pointer == GDK_GRAB_SUCCESS)
 			{
 				grab_succeed = true;
@@ -76,12 +105,13 @@ static bool panel_utils_grab_available()
 	// Release the grab so the menu window can take it
 	if (grab_pointer == GDK_GRAB_SUCCESS)
 	{
-		gdk_pointer_ungrab(GDK_CURRENT_TIME);
+		gdk_device_ungrab(pointer, GDK_CURRENT_TIME);
 	}
 	if (grab_keyboard == GDK_GRAB_SUCCESS)
 	{
-		gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+		gdk_device_ungrab(keyboard, GDK_CURRENT_TIME);
 	}
+#endif
 
 	if (!grab_succeed)
 	{
diff --git a/panel-plugin/window.cpp b/panel-plugin/window.cpp
index 2ef6082..cfd8706 100644
--- a/panel-plugin/window.cpp
+++ b/panel-plugin/window.cpp
@@ -39,6 +39,49 @@ using namespace WhiskerMenu;
 
 //-----------------------------------------------------------------------------
 
+#if GTK_CHECK_VERSION(3,20,0)
+
+static void grab_pointer(GdkWindow* window, guint32)
+{
+	GdkDisplay* display = gdk_display_get_default();
+	GdkSeat* seat = gdk_display_get_default_seat(display);
+	gdk_seat_grab(seat, window, GDK_SEAT_CAPABILITY_ALL_POINTING, true, NULL, NULL, NULL, NULL);
+}
+
+static void ungrab_pointer()
+{
+	GdkDisplay* display = gdk_display_get_default();
+	GdkSeat* seat = gdk_display_get_default_seat(display);
+	gdk_seat_ungrab(seat);
+}
+
+#else
+
+static void grab_pointer(GdkWindow* window, guint32 time)
+{
+	GdkDisplay* display = gdk_display_get_default();
+	GdkDeviceManager* device_manager = gdk_display_get_device_manager(display);
+	GdkDevice* device = gdk_device_manager_get_client_pointer(device_manager);
+	gdk_device_grab(device, window, GDK_OWNERSHIP_NONE, true,
+		GdkEventMask(
+			GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+			GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
+		),
+		NULL, time);
+}
+
+static void ungrab_pointer()
+{
+	GdkDisplay* display = gdk_display_get_default();
+	GdkDeviceManager* device_manager = gdk_display_get_device_manager(display);
+	GdkDevice* device = gdk_device_manager_get_client_pointer(device_manager);
+	gdk_device_ungrab(device, gtk_get_current_event_time());
+}
+
+#endif
+
+//-----------------------------------------------------------------------------
+
 WhiskerMenu::Window::Window() :
 	m_window(NULL),
 	m_sidebar_size_group(NULL),
@@ -248,7 +291,7 @@ WhiskerMenu::Window::~Window()
 
 void WhiskerMenu::Window::hide()
 {
-	gdk_pointer_ungrab(gtk_get_current_event_time());
+	ungrab_pointer();
 
 	// Hide command buttons to remove active border
 	for (int i = 0; i < 4; ++i)
@@ -601,12 +644,7 @@ void WhiskerMenu::Window::save()
 
 void WhiskerMenu::Window::on_context_menu_destroyed()
 {
-	gdk_pointer_grab(gtk_widget_get_window(GTK_WIDGET(m_window)), true,
-			GdkEventMask(
-				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-				GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-			),
-			NULL, NULL, gtk_get_current_event_time());
+	grab_pointer(gtk_widget_get_window(GTK_WIDGET(m_window)), gtk_get_current_event_time());
 }
 
 //-----------------------------------------------------------------------------
@@ -658,12 +696,7 @@ gboolean WhiskerMenu::Window::on_enter_notify_event(GtkWidget*, GdkEvent* event)
 		return false;
 	}
 
-	gdk_pointer_grab(gtk_widget_get_window(GTK_WIDGET(m_window)), true,
-			GdkEventMask(
-				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-				GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-			),
-			NULL, NULL, crossing_event->time);
+	grab_pointer(gtk_widget_get_window(GTK_WIDGET(m_window)), crossing_event->time);
 
 	return false;
 }
@@ -679,12 +712,7 @@ gboolean WhiskerMenu::Window::on_leave_notify_event(GtkWidget*, GdkEvent* event)
 		return false;
 	}
 
-	gdk_pointer_grab(gtk_widget_get_window(GTK_WIDGET(m_window)), true,
-			GdkEventMask(
-				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-				GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-			),
-			NULL, NULL, crossing_event->time);
+	grab_pointer(gtk_widget_get_window(GTK_WIDGET(m_window)), crossing_event->time);
 
 	return false;
 }
@@ -789,12 +817,7 @@ gboolean WhiskerMenu::Window::on_map_event(GtkWidget*, GdkEvent*)
 	gtk_window_set_keep_above(m_window, true);
 
 	// Track mouse clicks outside of menu
-	gdk_pointer_grab(gtk_widget_get_window(GTK_WIDGET(m_window)), true,
-			GdkEventMask(
-				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-				GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-			),
-			NULL, NULL, gtk_get_current_event_time());
+	grab_pointer(gtk_widget_get_window(GTK_WIDGET(m_window)), gtk_get_current_event_time());
 
 	// Focus search entry
 	gtk_widget_grab_focus(GTK_WIDGET(m_search_entry));

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list