<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -239,6 +239,83 @@ _gdk_input_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
   return TRUE;
 }
 
+gint
+_gdk_input_grab_device (GdkDevice    *device,
+                        GdkWindow    *window,
+                        gint          owner_events,
+                        GdkEventMask  event_mask,
+                        GdkWindow    *confine_to,
+                        GdkCursor    *cursor,
+                        guint32       time)
+{
+  GdkDisplayX11 *display_impl;
+  GdkDevicePrivate *gdkdev;
+  XEventClass event_classes[GDK_MAX_DEVICE_CLASSES];
+  gint result, num_classes;
+
+  display_impl = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window));
+  gdkdev = (GdkDevicePrivate *) device;
+
+  _gdk_input_common_find_events (window, gdkdev,
+                                 event_mask,
+                                 event_classes, &amp;num_classes);
+#ifdef G_ENABLE_DEBUG
+  if (_gdk_debug_flags &amp; GDK_DEBUG_NOGRABS)
+    result = GrabSuccess;
+  else
+#endif
+#ifdef XINPUT_2
+    {
+      GdkCursorPrivate *cursor_private;
+      Window xconfine_to;
+      Cursor xcursor;
+
+      cursor_private = (GdkCursorPrivate*) cursor;
+
+      if (!confine_to || GDK_WINDOW_DESTROYED (confine_to))
+        xconfine_to = None;
+      else
+        xconfine_to = GDK_WINDOW_XID (confine_to);
+
+      if (!cursor)
+        xcursor = None;
+      else
+        {
+          _gdk_x11_cursor_update_theme (cursor);
+          xcursor = cursor_private-&gt;xcursor;
+        }
+
+      result = XExtendedGrabDevice (display_impl-&gt;xdisplay,
+                                    gdkdev-&gt;xdevice,
+                                    GDK_WINDOW_XWINDOW (window),
+                                    GrabModeAsync,
+                                    owner_events,
+                                    xconfine_to,
+                                    xcursor,
+                                    num_classes, event_classes,
+                                    0, NULL);
+    }
+#else
+    result = XGrabDevice (display_impl-&gt;xdisplay, gdkdev-&gt;xdevice,
+                          GDK_WINDOW_XWINDOW (window),
+                          owner_events, num_classes, event_classes,
+                          GrabModeAsync, GrabModeAsync, time);
+#endif
+
+  return result;
+}
+
+void
+_gdk_input_ungrab_device (GdkDisplay *display,
+                          GdkDevice  *device,
+                          guint32     time)
+{
+  GdkDisplayX11 *display_impl = GDK_DISPLAY_X11 (display);
+  GdkDevicePrivate *gdkdev = (GdkDevicePrivate *) device;
+
+  XUngrabDevice (display_impl-&gt;xdisplay, gdkdev-&gt;xdevice, time);
+}
+
 gint 
 _gdk_input_grab_pointer (GdkWindow *     window,
 			 gint            owner_events,
@@ -250,10 +327,9 @@ _gdk_input_grab_pointer (GdkWindow *     window,
   gboolean need_ungrab;
   GdkDevicePrivate *gdkdev;
   GList *tmp_list;
-  XEventClass event_classes[GDK_MAX_DEVICE_CLASSES];
-  gint num_classes;
   gint result;
-  GdkDisplayX11 *display_impl  = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window));
+  GdkDisplay *display = GDK_WINDOW_DISPLAY (window);
+  GdkDisplayX11 *display_impl  = GDK_DISPLAY_X11 (display);
 
   tmp_list = display_impl-&gt;input_windows;
   new_window = NULL;
@@ -284,19 +360,12 @@ _gdk_input_grab_pointer (GdkWindow *     window,
 	  gdkdev = (GdkDevicePrivate *)tmp_list-&gt;data;
 	  if (!GDK_IS_CORE (gdkdev) &amp;&amp; gdkdev-&gt;xdevice)
 	    {
-	      _gdk_input_common_find_events (window, gdkdev,
-					     event_mask,
-					     event_classes, &amp;num_classes);
-#ifdef G_ENABLE_DEBUG
-	      if (_gdk_debug_flags &amp; GDK_DEBUG_NOGRABS)
-		result = GrabSuccess;
-	      else
-#endif
-		result = XGrabDevice (display_impl-&gt;xdisplay, gdkdev-&gt;xdevice,
-				      GDK_WINDOW_XWINDOW (window),
-				      owner_events, num_classes, event_classes,
-				      GrabModeAsync, GrabModeAsync, time);
-	      
+              result = _gdk_input_grab_device ((GdkDevice *) gdkdev,
+                                               window,
+                                               owner_events, event_mask,
+                                               confine_to, NULL,
+                                               time);
+
 	      /* FIXME: if failure occurs on something other than the first
 		 device, things will be badly inconsistent */
 	      if (result != Success)
@@ -314,7 +383,7 @@ _gdk_input_grab_pointer (GdkWindow *     window,
 	  if (!GDK_IS_CORE (gdkdev) &amp;&amp; gdkdev-&gt;xdevice &amp;&amp;
 	      ((gdkdev-&gt;button_state != 0) || need_ungrab))
 	    {
-	      XUngrabDevice (display_impl-&gt;xdisplay, gdkdev-&gt;xdevice, time);
+              _gdk_input_ungrab_device (display, &amp;gdkdev-&gt;info, time);
 	      gdkdev-&gt;button_state = 0;
 	    }
 	  
@@ -353,7 +422,7 @@ _gdk_input_ungrab_pointer (GdkDisplay *display,
 	{
 	  gdkdev = (GdkDevicePrivate *)tmp_list-&gt;data;
 	  if (!GDK_IS_CORE (gdkdev) &amp;&amp; gdkdev-&gt;xdevice)
-	    XUngrabDevice( display_impl-&gt;xdisplay, gdkdev-&gt;xdevice, time);
+            _gdk_input_ungrab_device (display, &amp;gdkdev-&gt;info, time);
 
 	  tmp_list = tmp_list-&gt;next;
 	}</diff>
      <filename>gdk/x11/gdkinput-xfree.c</filename>
    </modified>
    <modified>
      <diff>@@ -152,6 +152,16 @@ gboolean         _gdk_input_other_event      (GdkEvent         *event,
 					      XEvent           *xevent,
                                               GdkDisplay       *display,
 					      GdkWindow        *window);
+gint             _gdk_input_grab_device      (GdkDevice        *device,
+                                              GdkWindow        *window,
+					      gint              owner_events,
+					      GdkEventMask      event_mask,
+					      GdkWindow        *confine_to,
+                                              GdkCursor        *cursor,
+					      guint32           time);
+void             _gdk_input_ungrab_device    (GdkDisplay       *display,
+                                              GdkDevice        *device,
+                                              guint32           time);
 gint             _gdk_input_grab_pointer     (GdkWindow        *window,
 					      gint              owner_events,
 					      GdkEventMask      event_mask,</diff>
      <filename>gdk/x11/gdkinputprivate.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a7eee65cd192685117116f89329d971e204469d1</id>
    </parent>
  </parents>
  <author>
    <name>Carlos Garnacho</name>
    <email>carlos@bacterio.(none)</email>
  </author>
  <url>http://github.com/garnacho/gtk-mpx/commit/31ad5017fe020cff99baa48c22afe42933609287</url>
  <id>31ad5017fe020cff99baa48c22afe42933609287</id>
  <committed-date>2009-01-15T18:31:26-08:00</committed-date>
  <authored-date>2009-01-15T18:31:26-08:00</authored-date>
  <message>Refactor out individual device grabbing from pointer grabbing. Use XExtendedGrabDevice.</message>
  <tree>7d2b7b340288318ef02e1c8b1165fac1a239501d</tree>
  <committer>
    <name>Carlos Garnacho</name>
    <email>carlos@bacterio.(none)</email>
  </committer>
</commit>
