From eb89a0fdc3b7823ac7e0e630d2db98b2230f6954 Mon Sep 17 00:00:00 2001
From: Nick Schermer <nick@xfce.org>
Date: Wed, 24 Feb 2010 16:20:21 +0100
Subject: [PATCH] Create status icon when we're actually going to display it.

The show/hide in status icons emits a critical warning (in the
plug window) because of the quick hide we do after creating in
status icon. This crashes the status icon in the panel.
Although this is a problem in Gtk, it is also better to delay
creating the status icon until we actually show it.
---
 thunar/thunar-progress-dialog.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/thunar/thunar-progress-dialog.c b/thunar/thunar-progress-dialog.c
index 30ad94bc3..ab8155c01 100644
--- a/thunar/thunar-progress-dialog.c
+++ b/thunar/thunar-progress-dialog.c
@@ -112,13 +112,6 @@ thunar_progress_dialog_init (ThunarProgressDialog *dialog)
   gtk_container_set_border_width (GTK_CONTAINER (dialog->content_box), 8);
   gtk_container_add (GTK_CONTAINER (dialog->vbox), dialog->content_box);
   gtk_widget_show (dialog->content_box);
-
-  dialog->status_icon = gtk_status_icon_new_from_icon_name ("stock_folder-copy");
-  gtk_status_icon_set_visible (dialog->status_icon, FALSE);
-
-  g_signal_connect_swapped (dialog->status_icon, "button-press-event", 
-                            G_CALLBACK (thunar_progress_dialog_toggled), 
-                            GTK_WIDGET (dialog));
 }
 
 
@@ -137,7 +130,8 @@ thunar_progress_dialog_finalize (GObject *object)
   ThunarProgressDialog *dialog = THUNAR_PROGRESS_DIALOG (object);
 
   /* destroy the status icon */
-  g_object_unref (dialog->status_icon);
+  if (dialog->status_icon != NULL)
+    g_object_unref (dialog->status_icon);
 
   /* free the view list */
   g_list_free (dialog->views);
@@ -153,7 +147,14 @@ thunar_progress_dialog_shown (ThunarProgressDialog *dialog)
   _thunar_return_if_fail (THUNAR_IS_PROGRESS_DIALOG (dialog));
 
   /* show the status icon */
-  gtk_status_icon_set_visible (dialog->status_icon, TRUE);
+  if (dialog->status_icon == NULL)
+    {
+      dialog->status_icon = gtk_status_icon_new_from_icon_name ("stock_folder-copy");
+      thunar_progress_dialog_update_status_icon (dialog);
+      g_signal_connect_swapped (dialog->status_icon, "button-press-event",
+                                G_CALLBACK (thunar_progress_dialog_toggled),
+                                GTK_WIDGET (dialog));
+    }
 }
 
 
@@ -267,7 +268,8 @@ thunar_progress_dialog_job_finished (ThunarProgressDialog *dialog,
   if (dialog->views != NULL)
     {
       /* update the status icon */
-      thunar_progress_dialog_update_status_icon (dialog);
+      if (dialog->status_icon != NULL)
+        thunar_progress_dialog_update_status_icon (dialog);
     }
   else
     {
@@ -285,7 +287,8 @@ thunar_progress_dialog_update_status_icon (ThunarProgressDialog *dialog)
   guint  n_views;
 
   _thunar_return_if_fail (THUNAR_IS_PROGRESS_DIALOG (dialog));
-  
+  _thunar_return_if_fail (GTK_IS_STATUS_ICON (dialog->status_icon));
+
   /* determine the number of views now being active */
   n_views = g_list_length (dialog->views);
 
@@ -293,7 +296,7 @@ thunar_progress_dialog_update_status_icon (ThunarProgressDialog *dialog)
   tooltip_text = g_strdup_printf (ngettext ("%d file operation running", 
                                             "%d file operations running",
                                             n_views), 
-                                  n_views);
+                                            n_views);
 
   /* update the tooltip */
 #if GTK_CHECK_VERSION (2, 16, 0)
@@ -369,7 +372,8 @@ thunar_progress_dialog_add_job (ThunarProgressDialog *dialog,
   g_signal_connect_swapped (view, "finished",
                             G_CALLBACK (thunar_progress_dialog_job_finished), dialog);
 
-  thunar_progress_dialog_update_status_icon (dialog);
+  if (dialog->status_icon != NULL)
+    thunar_progress_dialog_update_status_icon (dialog);
 }
 
 
-- 
GitLab