[gtksourceview] Hide CompletionInfo when focus-out-event on the attached-to widget
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview] Hide CompletionInfo when focus-out-event on the attached-to widget
- Date: Mon, 15 Apr 2013 10:51:33 +0000 (UTC)
commit d26f5bff4cc9aa5182fc510f5614b63af619279b
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed Apr 3 18:24:36 2013 +0200
Hide CompletionInfo when focus-out-event on the attached-to widget
The application just needs to attach the calltip window to the
GtkTextView widget, so when the text view looses focus, the calltip is
hidden.
gtksourceview/gtksourcecompletioninfo.c | 65 ++++++++++++++++++++++++++++++---
1 file changed, 60 insertions(+), 5 deletions(-)
---
diff --git a/gtksourceview/gtksourcecompletioninfo.c b/gtksourceview/gtksourcecompletioninfo.c
index f7e8bd8..7a50917 100644
--- a/gtksourceview/gtksourcecompletioninfo.c
+++ b/gtksourceview/gtksourcecompletioninfo.c
@@ -48,11 +48,12 @@
* </example>
*
* If the calltip is displayed on top of a certain widget, say a #GtkTextView,
- * you should hide it when the #GtkWidget::focus-out-event signal is emitted by
- * the #GtkTextView. You may also be interested by the
- * #GtkTextBuffer:cursor-position property (when its value is modified). If you
- * use the #GtkSourceCompletionInfo through the #GtkSourceCompletion machinery,
- * you don't need to worry about this.
+ * you should attach the calltip window to the #GtkTextView with
+ * gtk_window_set_attached_to(). By doing this, the calltip will be hidden when
+ * the #GtkWidget::focus-out-event signal is emitted by the #GtkTextView. You
+ * may also be interested by the #GtkTextBuffer:cursor-position property (when
+ * its value is modified). If you use the #GtkSourceCompletionInfo through the
+ * #GtkSourceCompletion machinery, you don't need to worry about this.
*/
#include <gtksourceview/gtksourcecompletioninfo.h>
@@ -62,6 +63,9 @@
struct _GtkSourceCompletionInfoPrivate
{
guint idle_resize;
+
+ GtkWidget *attached_to;
+ gulong focus_out_event_handler;
};
/* Signals */
@@ -184,11 +188,55 @@ gtk_source_completion_info_get_preferred_height (GtkWidget *widget,
/* Init, dispose, finalize, ... */
+static gboolean
+focus_out_event_cb (GtkSourceCompletionInfo *info)
+{
+ gtk_widget_hide (GTK_WIDGET (info));
+ return FALSE;
+}
+
+static void
+update_attached_to (GtkSourceCompletionInfo *info)
+{
+ GtkWidget *attached_to = gtk_window_get_attached_to (GTK_WINDOW (info));
+
+ if (info->priv->focus_out_event_handler != 0 &&
+ info->priv->attached_to != NULL)
+ {
+ g_signal_handler_disconnect (info->priv->attached_to,
+ info->priv->focus_out_event_handler);
+
+ info->priv->focus_out_event_handler = 0;
+ }
+
+ info->priv->attached_to = attached_to;
+
+ if (attached_to == NULL)
+ {
+ return;
+ }
+
+ g_object_add_weak_pointer (G_OBJECT (attached_to),
+ (gpointer) &info->priv->attached_to);
+
+ info->priv->focus_out_event_handler = g_signal_connect_swapped (attached_to,
+ "focus-out-event",
+ G_CALLBACK (focus_out_event_cb),
+ info);
+}
+
static void
gtk_source_completion_info_init (GtkSourceCompletionInfo *info)
{
info->priv = GTK_SOURCE_COMPLETION_INFO_GET_PRIVATE (info);
+ g_signal_connect (info,
+ "notify::attached-to",
+ G_CALLBACK (update_attached_to),
+ NULL);
+
+ update_attached_to (info);
+
/* Tooltip style */
gtk_window_set_title (GTK_WINDOW (info), _("Completion Info"));
gtk_widget_set_name (GTK_WIDGET (info), "gtk-tooltip");
@@ -209,6 +257,13 @@ gtk_source_completion_info_finalize (GObject *object)
g_source_remove (info->priv->idle_resize);
}
+ if (info->priv->focus_out_event_handler != 0 &&
+ info->priv->attached_to != NULL)
+ {
+ g_signal_handler_disconnect (info->priv->attached_to,
+ info->priv->focus_out_event_handler);
+ }
+
G_OBJECT_CLASS (gtk_source_completion_info_parent_class)->finalize (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]