void on_prop(GtkAction* action, FmMainWin* win) { FmFolderView* fv = FM_FOLDER_VIEW(win->folder_view); /* FIXME: should prevent directly accessing data members */ FmFileInfo* fi = FM_FOLDER_MODEL(fv->model)->dir->dir_fi; FmFileInfoList* files = fm_file_info_list_new(); fm_list_push_tail(files, fi); fm_show_file_properties(files); fm_list_unref(files); }
FmPathList* fm_path_list_new_from_file_info_gslist(GSList* fis) { FmPathList* list = fm_path_list_new(); GSList* l; for(l=fis;l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; fm_list_push_tail(list, fi->path); } return list; }
FmPathList* fm_path_list_new_from_file_info_list(FmFileInfoList* fis) { FmPathList* list = fm_path_list_new(); GList* l; for(l=fm_list_peek_head_link(fis);l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; fm_list_push_tail(list, fi->path); } return list; }
void on_file_info_finished(FmFileInfoJob* job, FmFolder* folder) { GList* l; GSList* files_to_add = NULL; GSList* files_to_update = NULL; for(l=fm_list_peek_head_link(job->file_infos);l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; GList* l2 = _fm_folder_get_file_by_name(folder, fi->path->name); if(l2) /* the file is already in the folder, update */ { FmFileInfo* fi2 = (FmFileInfo*)l2->data; /* FIXME: will fm_file_info_copy here cause problems? * the file info might be referenced by others, too. * we're mofifying an object referenced by others. * we should redesign the API, or document this clearly * in future API doc. */ fm_file_info_copy(fi2, fi); files_to_update = g_slist_prepend(files_to_update, fi2); } else { files_to_add = g_slist_prepend(files_to_add, fi); fm_file_info_ref(fi); fm_list_push_tail(folder->files, fi); } } if(files_to_add) { g_signal_emit(folder, signals[FILES_ADDED], 0, files_to_add); g_slist_free(files_to_add); } if(files_to_update) { g_signal_emit(folder, signals[FILES_CHANGED], 0, files_to_update); g_slist_free(files_to_update); } folder->pending_jobs = g_slist_remove(folder->pending_jobs, job); }
static void on_job_finished(FmDirListJob* job, FmFolder* folder) { GList* l; GSList* files = NULL; /* actually manually disconnecting from 'finished' signal is not * needed since the signal is only emit once, and later the job * object will be distroyed very soon. */ /* g_signal_handlers_disconnect_by_func(job, on_job_finished, folder); */ for(l = fm_list_peek_head_link(job->files); l; l=l->next) { FmFileInfo* inf = (FmFileInfo*)l->data; files = g_slist_prepend(files, inf); fm_list_push_tail(folder->files, inf); } if(G_LIKELY(files)) g_signal_emit(folder, signals[FILES_ADDED], 0, files); if(job->dir_fi) folder->dir_fi = fm_file_info_ref(job->dir_fi); folder->job = NULL; /* the job object will be freed in idle handler. */ g_signal_emit(folder, signals[LOADED], 0); }
void fm_dnd_src_set_file(FmDndSrc* ds, FmFileInfo* file) { FmFileInfoList* files = fm_file_info_list_new(); fm_list_push_tail(files, file); ds->files = files; }