[gtk+] Don't use gdk_{pointer,keyboard}_grab



commit bde1d072e5bce138965c7df6c4b1e28a8c01c2be
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Dec 24 20:00:19 2010 -0500

    Don't use gdk_{pointer,keyboard}_grab
    
    Instead use gdk_device_grab.

 gtk/gtkhsv.c      |   52 ++++++++++++++++++++++---------------------
 gtk/gtktreeview.c |   63 +++++++++++++++++++++++++++++++++++++----------------
 tests/testgtk.c   |   61 ++++++++++++++++++++++++++++----------------------
 3 files changed, 105 insertions(+), 71 deletions(-)
---
diff --git a/gtk/gtkhsv.c b/gtk/gtkhsv.c
index 80128f9..2d71051 100644
--- a/gtk/gtkhsv.c
+++ b/gtk/gtkhsv.c
@@ -669,21 +669,24 @@ compute_v (GtkHSV *hsv,
 /* Event handlers */
 
 static void
-set_cross_grab (GtkHSV *hsv,
-                guint32 time)
+set_cross_grab (GtkHSV    *hsv,
+                GdkDevice *device,
+                guint32    time)
 {
   GtkHSVPrivate *priv = hsv->priv;
   GdkCursor *cursor;
 
   cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (hsv)),
                                        GDK_CROSSHAIR);
-  gdk_pointer_grab (priv->window, FALSE,
-                    (GDK_POINTER_MOTION_MASK
-                     | GDK_POINTER_MOTION_HINT_MASK
-                     | GDK_BUTTON_RELEASE_MASK),
-                    NULL,
-                    cursor,
-                    time);
+  gdk_device_grab (device,
+                   priv->window,
+                   GDK_OWNERSHIP_NONE,
+                   FALSE,
+                   GDK_POINTER_MOTION_MASK
+                    | GDK_POINTER_MOTION_HINT_MASK
+                    | GDK_BUTTON_RELEASE_MASK,
+                   cursor,
+                   time);
   g_object_unref (cursor);
 }
 
@@ -709,15 +712,15 @@ gtk_hsv_button_press (GtkWidget      *widget,
 
   if (priv->mode != DRAG_NONE || event->button != 1)
     return FALSE;
-  
+
   x = event->x;
   y = event->y;
-  
+
   if (is_in_ring (hsv, x, y))
     {
       priv->mode = DRAG_H;
-      set_cross_grab (hsv, event->time);
-      
+      set_cross_grab (hsv, gdk_event_get_device (event), event->time);
+
       gtk_hsv_set_color (hsv,
                          compute_v (hsv, x, y),
                          priv->s,
@@ -725,26 +728,26 @@ gtk_hsv_button_press (GtkWidget      *widget,
 
       gtk_widget_grab_focus (widget);
       priv->focus_on_ring = TRUE;
-      
+
       return TRUE;
     }
-  
+
   if (is_in_triangle (hsv, x, y))
     {
       gdouble s, v;
-      
+
       priv->mode = DRAG_SV;
-      set_cross_grab (hsv, event->time);
-      
+      set_cross_grab (hsv, gdk_event_get_device (event), event->time);
+
       compute_sv (hsv, x, y, &s, &v);
       gtk_hsv_set_color (hsv, priv->h, s, v);
 
       gtk_widget_grab_focus (widget);
       priv->focus_on_ring = FALSE;
-      
+
       return TRUE;
     }
-  
+
   return FALSE;
 }
 
@@ -759,14 +762,13 @@ gtk_hsv_button_release (GtkWidget      *widget,
 
   if (priv->mode == DRAG_NONE || event->button != 1)
     return FALSE;
-  
+
   /* Set the drag mode to DRAG_NONE so that signal handlers for "catched"
    * can see that this is the final color state.
    */
-  
   mode = priv->mode;
   priv->mode = DRAG_NONE;
-  
+
   x = event->x;
   y = event->y;
 
@@ -786,8 +788,8 @@ gtk_hsv_button_release (GtkWidget      *widget,
       g_assert_not_reached ();
     }
 
-  gdk_display_pointer_ungrab (gdk_window_get_display (event->window),
-                              event->time);
+  gdk_device_ungrab (gdk_event_get_device (event), event->time);
+
   return TRUE;
 }
 
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index e9f64e2..58f3bad 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -3282,14 +3282,18 @@ gtk_tree_view_button_press (GtkWidget      *widget,
 	      return TRUE;
 	    }
 
-	  if (gdk_pointer_grab (_gtk_tree_view_column_get_window (column), FALSE,
-				GDK_POINTER_MOTION_HINT_MASK |
-				GDK_BUTTON1_MOTION_MASK |
-				GDK_BUTTON_RELEASE_MASK,
-				NULL, NULL, event->time))
-	    return FALSE;
-
-	  gtk_grab_add (widget);
+          if (gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
+                               _gtk_tree_view_column_get_window (column),
+                               GDK_OWNERSHIP_NONE,
+                               FALSE,
+                               GDK_POINTER_MOTION_HINT_MASK
+                                | GDK_BUTTON1_MOTION_MASK
+                                | GDK_BUTTON_RELEASE_MASK,
+                               NULL,
+                               event->time) != GDK_GRAB_SUCCESS)
+            return FALSE;
+
+          gtk_grab_add (widget);
           tree_view->priv->in_column_resize = TRUE;
 
 	  _gtk_tree_view_column_set_resized_width (column, gtk_tree_view_column_get_width (column) -
@@ -3326,12 +3330,15 @@ gtk_tree_view_button_release_drag_column (GtkWidget      *widget,
   GtkWidget *button;
   GList *l;
   gboolean rtl;
+  GdkDevice *device, *other;
 
   tree_view = GTK_TREE_VIEW (widget);
 
   rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
-  gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME);
-  gdk_display_keyboard_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME);
+  device = gdk_event_get_device ((GdkEvent*)event);
+  other = gdk_device_get_associated_device (device);
+  gdk_device_ungrab (device, event->time);
+  gdk_device_ungrab (other, event->time);
 
   /* Move the button back */
   button = gtk_tree_view_column_get_button (tree_view->priv->drag_column);
@@ -3406,8 +3413,7 @@ gtk_tree_view_button_release_column_resize (GtkWidget      *widget,
 
   tree_view->priv->in_column_resize = FALSE;
   gtk_grab_remove (widget);
-  gdk_display_pointer_ungrab (gdk_window_get_display (event->window),
-			      event->time);
+  gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
   return TRUE;
 }
 
@@ -9713,6 +9719,7 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
   GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (tree_view));
   GdkDisplay *display = gdk_screen_get_display (screen);
   GtkWidget *button;
+  GdkDevice *pointer, *keyboard;
 
   g_return_if_fail (tree_view->priv->column_drag_info == NULL);
   g_return_if_fail (tree_view->priv->cur_reorder == NULL);
@@ -9801,13 +9808,31 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
     gtk_main_iteration ();
 
   tree_view->priv->in_column_drag = TRUE;
-  gdk_pointer_grab (tree_view->priv->drag_window,
-		    FALSE,
-		    GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK,
-		    NULL, NULL, GDK_CURRENT_TIME);
-  gdk_keyboard_grab (tree_view->priv->drag_window,
-		     FALSE,
-		     GDK_CURRENT_TIME);
+  if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
+    {
+      keyboard = device;
+      pointer = gdk_device_get_associated_device (device);
+    }
+  else
+    {
+      pointer = device;
+      keyboard = gdk_device_get_associated_device (device);
+    }
+
+  gdk_device_grab (pointer,
+                   tree_view->priv->drag_window,
+                   GDK_OWNERSHIP_NONE,
+                   FALSE,
+                   GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK,
+                   NULL,
+                   GDK_CURRENT_TIME);
+  gdk_device_grab (keyboard,
+                   tree_view->priv->drag_window,
+                   GDK_OWNERSHIP_NONE,
+                   FALSE,
+                   GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK,
+                   NULL,
+                   GDK_CURRENT_TIME);
 }
 
 static void
diff --git a/tests/testgtk.c b/tests/testgtk.c
index f560c4e..0f5bb0f 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -6935,23 +6935,27 @@ shape_pressed (GtkWidget *widget, GdkEventButton *event)
   p->y = (int) event->y;
 
   gtk_grab_add (widget);
-  gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
-		    GDK_BUTTON_RELEASE_MASK |
-		    GDK_BUTTON_MOTION_MASK |
-		    GDK_POINTER_MOTION_HINT_MASK,
-		    NULL, NULL, 0);
+  gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
+                   gtk_widget_get_window (widget),
+                   GDK_OWNERSHIP_NONE,
+                   TRUE,
+                   GDK_BUTTON_RELEASE_MASK |
+                   GDK_BUTTON_MOTION_MASK |
+                   GDK_POINTER_MOTION_HINT_MASK,
+                   NULL,
+                   event->time);
 }
 
 static void
-shape_released (GtkWidget *widget)
+shape_released (GtkWidget      *widget,
+                GdkEventButton *event)
 {
   gtk_grab_remove (widget);
-  gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
-			      GDK_CURRENT_TIME);
+  gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
 }
 
 static void
-shape_motion (GtkWidget      *widget, 
+shape_motion (GtkWidget      *widget,
 	      GdkEventMotion *event)
 {
   gint xp, yp;
@@ -8640,21 +8644,20 @@ destroy_properties (GtkWidget             *widget,
 }
 
 static gint
-property_query_event (GtkWidget	       *widget,
-		      GdkEvent	       *event,
-		      struct PropertiesData *data)
+property_query_event (GtkWidget             *widget,
+                      GdkEvent              *event,
+                      struct PropertiesData *data)
 {
   GtkWidget *res_widget = NULL;
 
   if (!data->in_query)
     return FALSE;
-  
+
   if (event->type == GDK_BUTTON_RELEASE)
     {
       gtk_grab_remove (widget);
-      gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
-				  GDK_CURRENT_TIME);
-      
+      gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
+
       res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
       if (res_widget)
 	{
@@ -8674,23 +8677,27 @@ query_properties (GtkButton *button,
 		  struct PropertiesData *data)
 {
   GtkWidget *widget = GTK_WIDGET (button);
-  gint failure;
+  GdkDisplay *display;
+  GdkDeviceManager *device_manager;
+  GdkDevice *device;
 
   g_signal_connect (button, "event",
 		    G_CALLBACK (property_query_event), data);
 
+  display = gtk_widget_get_display (widget);
 
   if (!data->cursor)
-    data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
-					       GDK_TARGET);
-
-  failure = gdk_pointer_grab (gtk_widget_get_window (widget),
-			      TRUE,
-			      GDK_BUTTON_RELEASE_MASK,
-			      NULL,
-			      data->cursor,
-			      GDK_CURRENT_TIME);
-
+    data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
+
+  device_manager = gdk_display_get_device_manager (display);
+  device = gdk_device_manager_get_client_pointer (device_manager);
+  gdk_device_grab (device,
+                   gtk_widget_get_window (widget),
+                   GDK_OWNERSHIP_NONE,
+                   TRUE,
+                   GDK_BUTTON_RELEASE_MASK,
+                   data->cursor,
+                   GDK_CURRENT_TIME);
   gtk_grab_add (widget);
 
   data->in_query = TRUE;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]