[gtk+/xi2] GtkEntryCompletion: Use gdk_device_grab().



commit 0db908172543f0b7d5baac721b564bb86e86e809
Author: Carlos Garnacho <carlos gnome org>
Date:   Tue Dec 22 00:21:10 2009 +0100

    GtkEntryCompletion: Use gdk_device_grab().

 gtk/gtkentry.c           |   15 ++++++++++++++-
 gtk/gtkentrycompletion.c |   31 +++++++++++++++++++++----------
 gtk/gtkentryprivate.h    |    5 ++++-
 3 files changed, 39 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 9c885ca..f759fc0 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -139,6 +139,8 @@ struct _GtkEntryPrivate
   gint start_y;
 
   gchar *im_module;
+
+  GdkDevice *completion_device;
 };
 
 typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint;
@@ -9141,6 +9143,7 @@ static gint
 gtk_entry_completion_timeout (gpointer data)
 {
   GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (data);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (completion->priv->entry);
 
   completion->priv->completion_timeout = 0;
 
@@ -9170,7 +9173,7 @@ gtk_entry_completion_timeout (gpointer data)
 	  if (GTK_WIDGET_VISIBLE (completion->priv->popup_window))
 	    _gtk_entry_completion_resize_popup (completion);
           else
-	    _gtk_entry_completion_popup (completion);
+	    _gtk_entry_completion_popup (completion, priv->completion_device);
 	}
       else 
 	_gtk_entry_completion_popdown (completion);
@@ -9471,7 +9474,9 @@ static void
 gtk_entry_completion_changed (GtkWidget *entry,
                               gpointer   user_data)
 {
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
   GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
+  GdkDevice *device;
 
   /* (re)install completion timeout */
   if (completion->priv->completion_timeout)
@@ -9489,6 +9494,14 @@ gtk_entry_completion_changed (GtkWidget *entry,
       return;
     }
 
+  device = gtk_get_current_event_device ();
+
+  if (device && device->source == GDK_SOURCE_KEYBOARD)
+    device = gdk_device_get_associated_device (device);
+
+  if (device)
+    priv->completion_device = device;
+
   completion->priv->completion_timeout =
     gdk_threads_add_timeout (COMPLETION_TIMEOUT,
                    gtk_entry_completion_timeout,
diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c
index a3a01be..9cdd65f 100644
--- a/gtk/gtkentrycompletion.c
+++ b/gtk/gtkentrycompletion.c
@@ -1468,7 +1468,8 @@ _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion)
 }
 
 void
-_gtk_entry_completion_popup (GtkEntryCompletion *completion)
+_gtk_entry_completion_popup (GtkEntryCompletion *completion,
+                             GdkDevice          *device)
 {
   GtkTreeViewColumn *column;
   GList *renderers;
@@ -1483,6 +1484,9 @@ _gtk_entry_completion_popup (GtkEntryCompletion *completion)
   if (!GTK_WIDGET_HAS_FOCUS (completion->priv->entry))
     return;
 
+  if (completion->priv->grab_device)
+    return;
+
   completion->priv->ignore_enter = TRUE;
     
   column = gtk_tree_view_get_column (GTK_TREE_VIEW (completion->priv->action_view), 0);
@@ -1515,13 +1519,16 @@ _gtk_entry_completion_popup (GtkEntryCompletion *completion)
                          gtk_widget_get_screen (completion->priv->entry));
 
   gtk_widget_show (completion->priv->popup_window);
-    
+
   gtk_grab_add (completion->priv->popup_window);
-  gdk_pointer_grab (completion->priv->popup_window->window, TRUE,
-                    GDK_BUTTON_PRESS_MASK |
-                    GDK_BUTTON_RELEASE_MASK |
-                    GDK_POINTER_MOTION_MASK,
-                    NULL, NULL, GDK_CURRENT_TIME);
+  gdk_device_grab (device, completion->priv->popup_window->window,
+                   GDK_OWNERSHIP_WINDOW, TRUE,
+                   GDK_BUTTON_PRESS_MASK |
+                   GDK_BUTTON_RELEASE_MASK |
+                   GDK_POINTER_MOTION_MASK,
+                   NULL, GDK_CURRENT_TIME);
+
+  completion->priv->grab_device = device;
 }
 
 void
@@ -1531,9 +1538,13 @@ _gtk_entry_completion_popdown (GtkEntryCompletion *completion)
     return;
 
   completion->priv->ignore_enter = FALSE;
-  
-  gdk_pointer_ungrab (GDK_CURRENT_TIME);
-  gtk_grab_remove (completion->priv->popup_window);
+
+  if (completion->priv->grab_device)
+    {
+      gdk_device_ungrab (completion->priv->grab_device, GDK_CURRENT_TIME);
+      gtk_grab_remove (completion->priv->popup_window);
+      completion->priv->grab_device = NULL;
+    }
 
   gtk_widget_hide (completion->priv->popup_window);
 }
diff --git a/gtk/gtkentryprivate.h b/gtk/gtkentryprivate.h
index a767800..baf0b9f 100644
--- a/gtk/gtkentryprivate.h
+++ b/gtk/gtkentryprivate.h
@@ -69,10 +69,13 @@ struct _GtkEntryCompletionPrivate
   gchar *completion_prefix;
 
   GSource *check_completion_idle;
+
+  GdkDevice *grab_device;
 };
 
 gboolean _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion);
-void     _gtk_entry_completion_popup        (GtkEntryCompletion *completion);
+void     _gtk_entry_completion_popup        (GtkEntryCompletion *completion,
+                                             GdkDevice          *device);
 void     _gtk_entry_completion_popdown      (GtkEntryCompletion *completion);
 
 void      _gtk_entry_get_borders            (GtkEntry  *entry,



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