/** * thunar_folder_reload: * @folder : a #ThunarFolder instance. * * Tells the @folder object to reread the directory * contents from the underlying media. **/ void thunar_folder_reload (ThunarFolder *folder) { _thunar_return_if_fail (THUNAR_IS_FOLDER (folder)); /* check if we are currently connect to a job */ if (G_UNLIKELY (folder->job != NULL)) { /* disconnect from the job */ g_signal_handlers_disconnect_matched (folder->job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, folder); thunar_vfs_job_cancel (THUNAR_VFS_JOB (folder->job)); g_object_unref (G_OBJECT (folder->job)); } /* disconnect from the file alteration monitor */ if (G_UNLIKELY (folder->handle != NULL)) { thunar_vfs_monitor_remove (folder->monitor, folder->handle); folder->handle = NULL; } /* reset the new_files list */ thunar_file_list_free (folder->new_files); folder->new_files = NULL; /* start a new job */ folder->job = thunar_vfs_listdir (thunar_file_get_path (folder->corresponding_file), NULL); g_signal_connect (folder->job, "error", G_CALLBACK (thunar_folder_error), folder); g_signal_connect (folder->job, "finished", G_CALLBACK (thunar_folder_finished), folder); g_signal_connect (folder->job, "infos-ready", G_CALLBACK (thunar_folder_infos_ready), folder); /* tell all consumers that we're loading */ g_object_notify (G_OBJECT (folder), "loading"); }
static void thunar_history_finalize (GObject *object) { ThunarHistory *history = THUNAR_HISTORY (object); /* disconnect from the "forward" action */ g_signal_handlers_disconnect_matched (G_OBJECT (history->action_forward), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, history); g_object_unref (G_OBJECT (history->action_forward)); /* disconnect from the "back" action */ g_signal_handlers_disconnect_matched (G_OBJECT (history->action_back), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, history); g_object_unref (G_OBJECT (history->action_back)); /* release the "forward" and "back" lists */ thunar_file_list_free (history->forward_list); thunar_file_list_free (history->back_list); (*G_OBJECT_CLASS (thunar_history_parent_class)->finalize) (object); }
static void thunar_folder_finalize (GObject *object) { ThunarFolder *folder = THUNAR_FOLDER (object); /* disconnect from the ThunarFileMonitor instance */ g_signal_handlers_disconnect_matched (G_OBJECT (folder->file_monitor), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, folder); g_object_unref (G_OBJECT (folder->file_monitor)); /* disconnect from the file alteration monitor */ if (G_LIKELY (folder->handle != NULL)) thunar_vfs_monitor_remove (folder->monitor, folder->handle); g_object_unref (G_OBJECT (folder->monitor)); /* cancel the pending job (if any) */ if (G_UNLIKELY (folder->job != NULL)) { g_signal_handlers_disconnect_matched (folder->job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, folder); thunar_vfs_job_cancel (folder->job); g_object_unref (G_OBJECT (folder->job)); } /* disconnect from the corresponding file */ if (G_LIKELY (folder->corresponding_file != NULL)) { /* drop the reference */ g_object_set_qdata (G_OBJECT (folder->corresponding_file), thunar_folder_quark, NULL); g_object_unref (G_OBJECT (folder->corresponding_file)); } /* release references to the new files */ thunar_file_list_free (folder->new_files); /* release references to the current files */ thunar_file_list_free (folder->files); (*G_OBJECT_CLASS (thunar_folder_parent_class)->finalize) (object); }
static void thunar_history_set_current_directory (ThunarNavigator *navigator, ThunarFile *current_directory) { ThunarHistory *history = THUNAR_HISTORY (navigator); /* verify that we don't already use that directory */ if (G_UNLIKELY (current_directory == history->current_directory)) return; /* if the new directory is the first one in the forward history, we * just move forward one step instead of clearing the whole forward * history */ if (history->forward_list != NULL && history->forward_list->data == current_directory) thunar_history_go_forward (history, 1); else { /* clear the "forward" list */ gtk_action_set_sensitive (history->action_forward, FALSE); thunar_file_list_free (history->forward_list); history->forward_list = NULL; /* prepend the previous current directory to the "back" list */ if (G_LIKELY (history->current_directory != NULL)) { history->back_list = g_list_prepend (history->back_list, history->current_directory); gtk_action_set_sensitive (history->action_back, TRUE); } /* activate the new current directory */ history->current_directory = current_directory; /* connect to the new current directory */ if (G_LIKELY (current_directory != NULL)) g_object_ref (G_OBJECT (current_directory)); } /* notify listeners */ g_object_notify (G_OBJECT (history), "current-directory"); }
static void thunar_folder_finished (ThunarVfsJob *job, ThunarFolder *folder) { ThunarFile *file; GList *files; GList *lp; _thunar_return_if_fail (THUNAR_IS_FOLDER (folder)); _thunar_return_if_fail (THUNAR_VFS_IS_JOB (job)); _thunar_return_if_fail (THUNAR_IS_FILE (folder->corresponding_file)); _thunar_return_if_fail (folder->handle == NULL); _thunar_return_if_fail (folder->job == job); /* check if we need to merge new files with existing files */ if (G_UNLIKELY (folder->files != NULL)) { /* determine all added files (files on new_files, but not on files) */ for (files = NULL, lp = folder->new_files; lp != NULL; lp = lp->next) if (g_list_find (folder->files, lp->data) == NULL) { /* put the file on the added list */ files = g_list_prepend (files, lp->data); /* add to the internal files list */ folder->files = g_list_prepend (folder->files, lp->data); g_object_ref (G_OBJECT (lp->data)); } /* check if any files were added */ if (G_UNLIKELY (files != NULL)) { /* emit a "files-added" signal for the added files */ g_signal_emit (G_OBJECT (folder), folder_signals[FILES_ADDED], 0, files); /* release the added files list */ g_list_free (files); } /* determine all removed files (files on files, but not on new_files) */ for (files = NULL, lp = folder->files; lp != NULL; ) { /* determine the file */ file = THUNAR_FILE (lp->data); /* determine the next list item */ lp = lp->next; /* check if the file is not on new_files */ if (g_list_find (folder->new_files, file) == NULL) { /* put the file on the removed list (owns the reference now) */ files = g_list_prepend (files, file); /* remove from the internal files list */ folder->files = g_list_remove (folder->files, file); } } /* check if any files were removed */ if (G_UNLIKELY (files != NULL)) { /* emit a "files-removed" signal for the removed files */ g_signal_emit (G_OBJECT (folder), folder_signals[FILES_REMOVED], 0, files); /* release the removed files list */ thunar_file_list_free (files); } /* drop the temporary new_files list */ thunar_file_list_free (folder->new_files); folder->new_files = NULL; } else { /* just use the new files for the files list */ folder->files = folder->new_files; folder->new_files = NULL; /* emit a "files-added" signal for the new files */ g_signal_emit (G_OBJECT (folder), folder_signals[FILES_ADDED], 0, folder->files); } /* we did it, the folder is loaded */ g_signal_handlers_disconnect_matched (folder->job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, folder); g_object_unref (G_OBJECT (folder->job)); folder->job = NULL; /* add us to the file alteration monitor */ folder->handle = thunar_vfs_monitor_add_directory (folder->monitor, thunar_file_get_path (folder->corresponding_file), thunar_folder_monitor, folder); /* tell the consumers that we have loaded the directory */ g_object_notify (G_OBJECT (folder), "loading"); }