static void create_trash_item(FmPlacesModel* model) { GtkTreeIter it; FmPlaceItem* item; GdkPixbuf* pix; GFile* gf; gf = g_file_new_for_uri("trash:///"); model->trash_monitor = fm_monitor_directory(gf, NULL); g_signal_connect(model->trash_monitor, "changed", G_CALLBACK(on_trash_changed), model); g_object_unref(gf); item = g_slice_new0(FmPlaceItem); item->type = FM_PLACES_ITEM_PATH; item->fi = fm_file_info_new(); item->fi->path = fm_path_ref(fm_path_get_trash()); item->fi->icon = fm_icon_from_name("user-trash"); gtk_list_store_insert(GTK_LIST_STORE(model), &it, 2); pix = fm_icon_get_pixbuf(item->fi->icon, fm_config->pane_icon_size); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, _("Trash"), FM_PLACES_MODEL_COL_INFO, item, -1); g_object_unref(pix); model->trash_it = it; if(0 == model->trash_idle) model->trash_idle = g_idle_add((GSourceFunc)update_trash_item, model); }
/** * fm_file_info_job_add_gfile * @job: a job to add file * @gf: a file descriptor to add to query list * * Adds a path @gf to query list for the @job. * * This API may only be called before starting the @job. * * Since: 0.1.0 */ void fm_file_info_job_add_gfile(FmFileInfoJob* job, GFile* gf) { FmPath* path = fm_path_new_for_gfile(gf); FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_path_unref(path); fm_file_info_list_push_tail_noref(job->file_infos, fi); }
static void add_vol(FmPlacesModel* model, GVolume* vol, FmFileInfoJob* job) { GtkTreeIter it; FmPlaceItem* item; item = g_slice_new0(FmPlaceItem); item->fi = fm_file_info_new(); item->type = FM_PLACES_ITEM_VOL; item->vol = (GVolume*)g_object_ref(vol); gtk_list_store_insert_before(GTK_LIST_STORE(model), &it, &model->sep_it); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_INFO, item, -1); update_vol(model, item, &it, job); }
static inline FmFileInfo *_new_info_for_native_file(FmDirListJob* job, FmPath* path, const char* path_str, GError** err) { FmFileInfo *fi; if (fm_job_is_cancelled(FM_JOB(job))) return NULL; if (!(job->flags & FM_DIR_LIST_JOB_DETAILED)) return fm_file_info_new_from_native_file(path, path_str, err); fi = fm_file_info_new(); fm_file_info_set_path(fi, path); if (fm_file_info_set_from_native_file(fi, path_str, err)) return fi; fm_file_info_unref(fi); return NULL; }
static void add_bookmarks(FmPlacesModel* model, FmFileInfoJob* job) { FmPlaceItem* item; GList *bms, *l; FmIcon* icon = fm_icon_from_name("folder"); FmIcon* remote_icon = NULL; GdkPixbuf* folder_pix = fm_icon_get_pixbuf(icon, fm_config->pane_icon_size); GdkPixbuf* remote_pix = NULL; bms = fm_bookmarks_list_all(model->bookmarks); for(l=bms;l;l=l->next) { FmBookmarkItem* bm = (FmBookmarkItem*)l->data; GtkTreeIter it; GdkPixbuf* pix; item = g_slice_new0(FmPlaceItem); item->type = FM_PLACES_ITEM_PATH; item->fi = fm_file_info_new(); item->fi->path = fm_path_ref(bm->path); fm_file_info_job_add(job, item->fi->path); if(fm_path_is_native(item->fi->path)) { item->fi->icon = fm_icon_ref(icon); pix = folder_pix; } else { if(G_UNLIKELY(!remote_icon)) { remote_icon = fm_icon_from_name("folder-remote"); remote_pix = fm_icon_get_pixbuf(remote_icon, fm_config->pane_icon_size); } item->fi->icon = fm_icon_ref(remote_icon); pix = remote_pix; } item->bm_item = bm; gtk_list_store_append(GTK_LIST_STORE(model), &it); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, bm->name, FM_PLACES_MODEL_COL_INFO, item, -1); } g_object_unref(folder_pix); fm_icon_unref(icon); if(remote_icon) { fm_icon_unref(remote_icon); if(remote_pix) g_object_unref(remote_pix); } }
/** * fm_file_info_job_new * @files_to_query: (allow-none): list of paths to query informatiom * @flags: modificators of query mode * * Creates a new #FmFileInfoJob which can be used by #FmJob API. * * Returns: (transfer full): a new #FmFileInfoJob object. * * Since: 0.1.0 */ FmFileInfoJob* fm_file_info_job_new(FmPathList* files_to_query, FmFileInfoJobFlags flags) { GList* l; FmFileInfoJob* job = (FmFileInfoJob*)g_object_new(FM_TYPE_FILE_INFO_JOB, NULL); FmFileInfoList* file_infos; job->flags = flags; if(files_to_query) { file_infos = job->file_infos; for(l = fm_path_list_peek_head_link(files_to_query);l;l=l->next) { FmPath* path = FM_PATH(l->data); FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_file_info_list_push_tail_noref(file_infos, fi); } } return job; }
/** * fm_file_info_job_add * @job: a job to add file * @path: a path to add to query list * * Adds a @path to query list for the @job. * * This API may only be called before starting the @job. * * Since: 0.1.0 */ void fm_file_info_job_add(FmFileInfoJob* job, FmPath* path) { FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_file_info_list_push_tail_noref(job->file_infos, fi); }
static void fm_places_model_init(FmPlacesModel *self) { GType types[] = {GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER}; GtkTreeIter it; GtkTreePath* tp; FmPlaceItem* item; GList *vols, *l; GIcon* gicon; FmIcon* icon; GFile* gf; GdkPixbuf* pix; FmFileInfoJob* job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_FOLLOW_SYMLINK); GtkListStore* model = GTK_LIST_STORE(self); gtk_list_store_set_column_types(GTK_LIST_STORE(self), FM_PLACES_MODEL_N_COLS, types); self->theme_change_handler = g_signal_connect_swapped(gtk_icon_theme_get_default(), "changed", G_CALLBACK(update_icons), self); self->use_trash_change_handler = g_signal_connect(fm_config, "changed::use_trash", G_CALLBACK(on_use_trash_changed), self); self->pane_icon_size_change_handler = g_signal_connect(fm_config, "changed::pane_icon_size", G_CALLBACK(on_pane_icon_size_changed), self); icon = fm_icon_from_name("media-eject"); pix = fm_icon_get_pixbuf(icon, fm_config->pane_icon_size); fm_icon_unref(icon); self->eject_icon = pix; item = g_slice_new0(FmPlaceItem); item->type = FM_PLACES_ITEM_PATH; item->fi = fm_file_info_new(); item->fi->path = fm_path_ref(fm_path_get_home()); item->fi->icon = fm_icon_from_name("user-home"); gtk_list_store_append(model, &it); pix = fm_icon_get_pixbuf(item->fi->icon, fm_config->pane_icon_size); gtk_list_store_set(model, &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, item->fi->path->name, FM_PLACES_MODEL_COL_INFO, item, -1); g_object_unref(pix); fm_file_info_job_add(job, item->fi->path); /* Only show desktop in side pane when the user has a desktop dir. */ if(g_file_test(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP), G_FILE_TEST_IS_DIR)) { item = g_slice_new0(FmPlaceItem); item->type = FM_PLACES_ITEM_PATH; item->fi = fm_file_info_new(); item->fi->path = fm_path_ref(fm_path_get_desktop()); item->fi->icon = fm_icon_from_name("user-desktop"); gtk_list_store_append(model, &it); pix = fm_icon_get_pixbuf(item->fi->icon, fm_config->pane_icon_size); gtk_list_store_set(model, &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, _("Desktop"), FM_PLACES_MODEL_COL_INFO, item, -1); g_object_unref(pix); fm_file_info_job_add(job, item->fi->path); } if(fm_config->use_trash) create_trash_item(self); /* FIXME: how to handle trash can? */ item = g_slice_new0(FmPlaceItem); item->type = FM_PLACES_ITEM_PATH; item->fi = fm_file_info_new(); item->fi->path = fm_path_ref(fm_path_get_apps_menu()); item->fi->icon = fm_icon_from_name("system-software-install"); gtk_list_store_append(model, &it); pix = fm_icon_get_pixbuf(item->fi->icon, fm_config->pane_icon_size); gtk_list_store_set(model, &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, _("Applications"), FM_PLACES_MODEL_COL_INFO, item, -1); g_object_unref(pix); /* fm_file_info_job_add(job, item->fi->path); */ /* volumes */ self->vol_mon = g_volume_monitor_get(); g_signal_connect(self->vol_mon, "volume-added", G_CALLBACK(on_vol_added), self); g_signal_connect(self->vol_mon, "volume-removed", G_CALLBACK(on_vol_removed), self); g_signal_connect(self->vol_mon, "volume-changed", G_CALLBACK(on_vol_changed), self); g_signal_connect(self->vol_mon, "mount-added", G_CALLBACK(on_mount_added), self); /* separator */ gtk_list_store_append(model, &self->sep_it); /* add volumes to side-pane */ vols = g_volume_monitor_get_volumes(self->vol_mon); for(l=vols;l;l=l->next) { GVolume* vol = G_VOLUME(l->data); add_vol(self, vol, job); g_object_unref(vol); } g_list_free(vols); /* get the path of separator */ self->sep_tp = gtk_tree_model_get_path(GTK_TREE_MODEL(self), &self->sep_it); self->bookmarks = fm_bookmarks_get(); /* bookmarks */ g_signal_connect(self->bookmarks, "changed", G_CALLBACK(on_bookmarks_changed), self); /* add bookmarks to side pane */ add_bookmarks(self, job); g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), self); self->jobs = g_slist_prepend(self->jobs, job); fm_job_run_async(FM_JOB(job)); }