[gtk+/xi2: 1022/1239] GdkDevice: Add gdk_device_grab().



commit f94b815b134eb1ec83868008fd0cf31890ed36da
Author: Carlos Garnacho <carlos gnome org>
Date:   Fri Sep 4 17:20:53 2009 +0200

    GdkDevice: Add gdk_device_grab().

 gdk/gdk.h       |    8 +++++++
 gdk/gdkdevice.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 0 deletions(-)
---
diff --git a/gdk/gdk.h b/gdk/gdk.h
index 31a0ea5..77482ef 100644
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -124,6 +124,14 @@ GdkGrabStatus gdk_keyboard_grab      (GdkWindow    *window,
 				      gboolean      owner_events,
 				      guint32       time_);
 
+GdkGrabStatus gdk_device_grab        (GdkDevice        *device,
+                                      GdkWindow        *window,
+                                      GdkGrabOwnership  grab_ownership,
+                                      gboolean          owner_events,
+                                      GdkEventMask      event_mask,
+				      GdkCursor        *cursor,
+				      guint32           time_);
+
 gboolean gdk_pointer_grab_info_libgtk_only (GdkDisplay *display,
 					    GdkWindow **grab_window,
 					    gboolean   *owner_events);
diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c
index e6dacbb..83c3faf 100644
--- a/gdk/gdkdevice.c
+++ b/gdk/gdkdevice.c
@@ -483,6 +483,70 @@ gdk_device_get_axis (GdkDevice  *device,
   return FALSE;
 }
 
+GdkGrabStatus
+gdk_device_grab (GdkDevice        *device,
+                 GdkWindow        *window,
+                 GdkGrabOwnership  grab_ownership,
+                 gboolean          owner_events,
+                 GdkEventMask      event_mask,
+                 GdkCursor        *cursor,
+                 guint32           time_)
+{
+  GdkGrabStatus res;
+  GdkWindow *native;
+
+  g_return_val_if_fail (GDK_IS_DEVICE (device), 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+
+  if (_gdk_native_windows)
+    native = window;
+  else
+    native = gdk_window_get_toplevel (window);
+
+  while (((GdkWindowObject *) native)->window_type == GDK_WINDOW_OFFSCREEN)
+    {
+      native = gdk_offscreen_window_get_embedder (native);
+
+      if (native == NULL ||
+	  (!_gdk_window_has_impl (native) &&
+	   !gdk_window_is_viewable (native)))
+	return GDK_GRAB_NOT_VIEWABLE;
+
+      native = gdk_window_get_toplevel (native);
+    }
+
+  res = _gdk_windowing_device_grab (device,
+                                    window,
+                                    native,
+                                    owner_events,
+                                    event_mask,
+                                    NULL,
+                                    cursor,
+                                    time_);
+
+  if (res == GDK_GRAB_SUCCESS)
+    {
+      GdkDisplay *display;
+      gulong serial;
+
+      display = gdk_drawable_get_display (window);
+      serial = _gdk_windowing_window_get_next_serial (display);
+
+      _gdk_display_add_pointer_grab (display,
+                                     device,
+                                     window,
+                                     native,
+                                     GDK_OWNERSHIP_NONE,
+                                     owner_events,
+                                     event_mask,
+                                     serial,
+                                     time_,
+                                     FALSE);
+    }
+
+  return res;
+}
+
 /* Private API */
 void
 _gdk_device_reset_axes (GdkDevice *device)



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