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