[gtk+/xi2] GtkEntryCompletion: Use gdk_device_grab().
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+/xi2] GtkEntryCompletion: Use gdk_device_grab().
- Date: Wed, 30 Dec 2009 21:17:37 +0000 (UTC)
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]