Author: kelnos
Date: 2006-10-13 20:31:42 +0000 (Fri, 13 Oct 2006)
New Revision: 23406

Modified:
   xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
   xfdesktop/trunk/src/xfdesktop-special-file-icon.c
Log:
fix warnings and possible crash when trying to reload the desktop too
quickly (i.e., before the previous reload is finished).  partial patch from
jani monoses (bug 2426)


Modified: xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-file-icon-manager.c   2006-10-13 19:48:35 UTC 
(rev 23405)
+++ xfdesktop/trunk/src/xfdesktop-file-icon-manager.c   2006-10-13 20:31:42 UTC 
(rev 23406)
@@ -2338,8 +2338,7 @@
     }
     
     g_object_unref(G_OBJECT(job));
-    if(G_LIKELY(job == fmanager->priv->list_job))
-        fmanager->priv->list_job = NULL;
+    fmanager->priv->list_job = NULL;
 }
 
 static void
@@ -2367,6 +2366,15 @@
     
     if(fmanager->priv->list_job) {
         thunar_vfs_job_cancel(fmanager->priv->list_job);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_error_cb),
+                                             fmanager);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_finished_cb),
+                                             fmanager);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_infos_ready_cb),
+                                             fmanager);
         g_object_unref(G_OBJECT(fmanager->priv->list_job));
     }
     
@@ -2674,6 +2682,21 @@
     
     fmanager->priv->inited = FALSE;
     
+    if(fmanager->priv->list_job) {
+        thunar_vfs_job_cancel(fmanager->priv->list_job);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_error_cb),
+                                             fmanager);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_finished_cb),
+                                             fmanager);
+        
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
+                                             
G_CALLBACK(xfdesktop_file_icon_manager_listdir_infos_ready_cb),
+                                             fmanager);
+        g_object_unref(G_OBJECT(fmanager->priv->list_job));
+        fmanager->priv->list_job = NULL;
+    }
+    
     if(fmanager->priv->save_icons_id) {
         g_source_remove(fmanager->priv->save_icons_id);
         fmanager->priv->save_icons_id = 0;

Modified: xfdesktop/trunk/src/xfdesktop-special-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-special-file-icon.c   2006-10-13 19:48:35 UTC 
(rev 23405)
+++ xfdesktop/trunk/src/xfdesktop-special-file-icon.c   2006-10-13 20:31:42 UTC 
(rev 23406)
@@ -64,6 +64,7 @@
     
     /* only needed for trash */
     DBusGProxy *dbus_proxy;
+    DBusGProxyCall *dbus_querytrash_call;
     gboolean trash_full;
 };
 
@@ -144,6 +145,17 @@
                                          
G_CALLBACK(xfdesktop_special_file_icon_invalidate_pixbuf),
                                          icon);
     
+    if(icon->priv->dbus_proxy) {
+        if(icon->priv->dbus_querytrash_call) {
+            dbus_g_proxy_cancel_call(icon->priv->dbus_proxy,
+                                     icon->priv->dbus_querytrash_call);
+        }
+        dbus_g_proxy_disconnect_signal(icon->priv->dbus_proxy, "TrashChanged",
+                                       
G_CALLBACK(xfdesktop_special_file_icon_trash_changed_cb),
+                                       icon);
+        g_object_unref(G_OBJECT(icon->priv->dbus_proxy));
+    }
+    
     if(icon->priv->pix)
         g_object_unref(G_OBJECT(icon->priv->pix));
     
@@ -153,13 +165,6 @@
     if(icon->priv->tooltip)
         g_free(icon->priv->tooltip);
     
-    if(icon->priv->dbus_proxy) {
-        dbus_g_proxy_disconnect_signal(icon->priv->dbus_proxy, "TrashChanged",
-                                       
G_CALLBACK(xfdesktop_special_file_icon_trash_changed_cb),
-                                       icon);
-        g_object_unref(G_OBJECT(icon->priv->dbus_proxy));
-    }
-    
     G_OBJECT_CLASS(xfdesktop_special_file_icon_parent_class)->finalize(obj);
 }
 
@@ -613,6 +618,8 @@
         xfdesktop_special_file_icon_invalidate_pixbuf(icon);
         xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
     }
+    
+    icon->priv->dbus_querytrash_call = NULL;
 }
 
 
@@ -656,20 +663,23 @@
         DBusGProxy *trash_proxy = xfdesktop_file_utils_peek_trash_proxy();
             
         if(G_LIKELY(trash_proxy)) {
+            DBusGProxyCall *call;
+            
             special_file_icon->priv->dbus_proxy = 
g_object_ref(G_OBJECT(trash_proxy));
             dbus_g_proxy_connect_signal(special_file_icon->priv->dbus_proxy,
                                         "TrashChanged",
                                         
G_CALLBACK(xfdesktop_special_file_icon_trash_changed_cb),
                                         special_file_icon, NULL);
             
-            
if(!org_xfce_Trash_query_trash_async(special_file_icon->priv->dbus_proxy,
-                                                 
xfdesktop_special_file_icon_query_trash_cb,
-                                                 special_file_icon))
-            {
+            call = 
org_xfce_Trash_query_trash_async(special_file_icon->priv->dbus_proxy,
+                                                    
xfdesktop_special_file_icon_query_trash_cb,
+                                                    special_file_icon);
+            if(!call) {
                 
xfdesktop_special_file_icon_trash_handle_error(special_file_icon->priv->gscreen,
                                                                "QueryTrash",
                                                                NULL);
             }
+            special_file_icon->priv->dbus_querytrash_call = call;
         } else {
             /* we might as well just bail here */
             g_object_unref(G_OBJECT(special_file_icon));

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to