summaryrefslogtreecommitdiff
path: root/gtk/gtktooltip.c
diff options
context:
space:
mode:
authorKristian Rietveld <kris@imendio.com>2007-12-17 15:33:45 +0000
committerKristian Rietveld <kristian@src.gnome.org>2007-12-17 15:33:45 +0000
commit239fd8ace2a14a371fbe57aaca546412d00fcb4b (patch)
treedcc47caa749196acfea00d5295f7c59c8fde4673 /gtk/gtktooltip.c
parentc3b2b3ed008351959936395f6e31eb6f755f5c6d (diff)
downloadgtk+-239fd8ace2a14a371fbe57aaca546412d00fcb4b.tar.gz
use a weak pointer to set last_window to NULL as soon as it's destroyed.
2007-12-17 Kristian Rietveld <kris@imendio.com> * gtk/gtktooltip.c (gtk_tooltip_finalize), (gtk_tooltip_set_last_window): use a weak pointer to set last_window to NULL as soon as it's destroyed. (#496546, patch from Benjamin Berg). svn path=/trunk/; revision=19189
Diffstat (limited to 'gtk/gtktooltip.c')
-rw-r--r--gtk/gtktooltip.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c
index 762840374b..53de9cfa73 100644
--- a/gtk/gtktooltip.c
+++ b/gtk/gtktooltip.c
@@ -92,6 +92,8 @@ static void gtk_tooltip_window_hide (GtkWidget *widget,
static void gtk_tooltip_display_closed (GdkDisplay *display,
gboolean was_error,
GtkTooltip *tooltip);
+static void gtk_tooltip_set_last_window (GtkTooltip *tooltip,
+ GdkWindow *window);
G_DEFINE_TYPE (GtkTooltip, gtk_tooltip, G_TYPE_OBJECT);
@@ -179,6 +181,8 @@ gtk_tooltip_finalize (GObject *object)
tooltip->browse_mode_timeout_id = 0;
}
+ gtk_tooltip_set_last_window (tooltip, NULL);
+
if (tooltip->window)
{
GdkDisplay *display;
@@ -734,6 +738,21 @@ gtk_tooltip_display_closed (GdkDisplay *display,
g_object_set_data (G_OBJECT (display), "gdk-display-current-tooltip", NULL);
}
+static void
+gtk_tooltip_set_last_window (GtkTooltip *tooltip,
+ GdkWindow *window)
+{
+ if (tooltip->last_window)
+ g_object_remove_weak_pointer (G_OBJECT (tooltip->last_window),
+ (gpointer *) &tooltip->last_window);
+
+ tooltip->last_window = window;
+
+ if (window)
+ g_object_add_weak_pointer (G_OBJECT (tooltip->last_window),
+ (gpointer *) &tooltip->last_window);
+}
+
static gboolean
gtk_tooltip_run_requery (GtkWidget **widget,
GtkTooltip *tooltip,
@@ -1190,7 +1209,7 @@ _gtk_tooltip_handle_event (GdkEvent *event)
if (current_tooltip)
{
- current_tooltip->last_window = event->any.window;
+ gtk_tooltip_set_last_window (current_tooltip, event->any.window);
gdk_event_get_root_coords (event,
&current_tooltip->last_x,
&current_tooltip->last_y);
@@ -1298,7 +1317,7 @@ _gtk_tooltip_handle_event (GdkEvent *event)
G_CALLBACK (gtk_tooltip_display_closed),
current_tooltip);
- current_tooltip->last_window = event->any.window;
+ gtk_tooltip_set_last_window (current_tooltip, event->any.window);
gdk_event_get_root_coords (event,
&current_tooltip->last_x,
&current_tooltip->last_y);