[gtk+] Don't use gdk_{pointer,keyboard}_grab
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Don't use gdk_{pointer,keyboard}_grab
- Date: Sat, 25 Dec 2010 01:02:08 +0000 (UTC)
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]