From: Ben Pfaff <blp@gnu.org>
Date: Wed, 7 May 2008 00:16:51 +0000 (+0000)
Subject: (get_tooltip_location): Prevent crash when a tooltip is being prepared
X-Git-Tag: sav-api~1030
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1704b725af8798d00a87b7a4bed86fde902462e3;p=pspp

(get_tooltip_location): Prevent crash when a tooltip is being prepared
when the assistant is closed.
---

diff --git a/src/ui/gui/ChangeLog b/src/ui/gui/ChangeLog
index 31c6b3bf4b..2110403dab 100644
--- a/src/ui/gui/ChangeLog
+++ b/src/ui/gui/ChangeLog
@@ -1,3 +1,11 @@
+2008-05-06  Ben Pfaff  <blp@gnu.org>
+
+	Bug #23127.  Reviewed by John Darrington.  Tested by Jason Stover,
+	in an earlier form.
+
+	* text-data-import-dialog.c (get_tooltip_location): Prevent crash
+	when a tooltip is being prepared when the assistant is closed.
+
 2008-05-06  Ben Pfaff  <blp@gnu.org>
 
 	* text-data-import-dialog.c (text_data_import_assistant): Allocate
diff --git a/src/ui/gui/text-data-import-dialog.c b/src/ui/gui/text-data-import-dialog.c
index 9c984d417d..7598ba98ec 100644
--- a/src/ui/gui/text-data-import-dialog.c
+++ b/src/ui/gui/text-data-import-dialog.c
@@ -1808,6 +1808,19 @@ get_tooltip_location (GtkWidget *widget, gint wx, gint wy,
   GtkTreeModel *tree_model;
   bool ok;
 
+  /* Check that WIDGET is really visible on the screen before we
+     do anything else.  This is a bug fix for a sticky situation:
+     when text_data_import_assistant() returns, it frees the data
+     necessary to compose the tool tip message, but there may be
+     a tool tip under preparation at that point (even if there is
+     no visible tool tip) that will call back into us a little
+     bit later.  Perhaps the correct solution to this problem is
+     to make the data related to the tool tips part of a GObject
+     that only gets destroyed when all references are released,
+     but this solution appears to be effective too. */
+  if (!GTK_WIDGET_MAPPED (widget))
+    return FALSE;
+
   gtk_tree_view_convert_widget_to_bin_window_coords (tree_view,
                                                      wx, wy, &bx, &by);
   if (!gtk_tree_view_get_path_at_pos (tree_view, bx, by,