/* * Called for each file in a directory. Checks if the file is some * sort of image. If so, it creates an image object and adds it to the * list. */ static void directory_visit (GFile *directory, GFileInfo *children_info, EogListStore *store) { GFile *child; gboolean load_uri = FALSE; const char *mime_type, *name; mime_type = g_file_info_get_content_type (children_info); name = g_file_info_get_name (children_info); if (!g_str_has_prefix (name, ".")) { if (eog_image_is_supported_mime_type (mime_type)) { load_uri = TRUE; } } if (load_uri) { const gchar *caption; child = g_file_get_child (directory, name); caption = g_file_info_get_display_name (children_info); eog_list_store_append_image_from_file (store, child, caption); } }
/** * eog_list_store_add_files: * @store: An #EogListStore. * @file_list: (element-type GFile): A %NULL-terminated list of #GFile's. * * Adds a list of #GFile's to @store. The given list * must be %NULL-terminated. * * If any of the #GFile's in @file_list is a directory, all the images * in that directory will be added to @store. If the list of files contains * only one file and this is a regular file, then all the images in the same * directory will be added as well to @store. * **/ void eog_list_store_add_files (EogListStore *store, GList *file_list) { GList *it; GFileInfo *file_info; GFileType file_type; GFile *initial_file = NULL; GtkTreeIter iter; if (file_list == NULL) { return; } gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING); for (it = file_list; it != NULL; it = it->next) { GFile *file = (GFile *) it->data; file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL); if (file_info == NULL) { continue; } file_type = g_file_info_get_file_type (file_info); /* Workaround for gvfs backends that don't set the GFileType. */ if (G_UNLIKELY (file_type == G_FILE_TYPE_UNKNOWN)) { const gchar *ctype; ctype = g_file_info_get_content_type (file_info); /* If the content type is supported adjust file_type */ if (eog_image_is_supported_mime_type (ctype)) file_type = G_FILE_TYPE_REGULAR; } g_object_unref (file_info); if (file_type == G_FILE_TYPE_DIRECTORY) { eog_list_store_append_directory (store, file, file_type); } else if (file_type == G_FILE_TYPE_REGULAR && g_list_length (file_list) == 1) { initial_file = g_file_dup (file); file = g_file_get_parent (file); file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, NULL); /* If we can't get a file_info, file_type will stay as G_FILE_TYPE_REGULAR */ if (file_info != NULL) { file_type = g_file_info_get_file_type (file_info); g_object_unref (file_info); } if (file_type == G_FILE_TYPE_DIRECTORY) { eog_list_store_append_directory (store, file, file_type); if (!is_file_in_list_store_file (store, initial_file, &iter)) { eog_list_store_append_image_from_file (store, initial_file); } } else { eog_list_store_append_image_from_file (store, initial_file); } g_object_unref (file); } else if (file_type == G_FILE_TYPE_REGULAR && g_list_length (file_list) > 1) { eog_list_store_append_image_from_file (store, file); } } gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); if (initial_file && is_file_in_list_store_file (store, initial_file, &iter)) { store->priv->initial_image = eog_list_store_get_pos_by_iter (store, &iter); g_object_unref (initial_file); } else { store->priv->initial_image = 0; } }
static void file_monitor_changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event, EogListStore *store) { const char *mimetype; GFileInfo *file_info; GtkTreeIter iter; EogImage *image; switch (event) { case G_FILE_MONITOR_EVENT_CHANGED: file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL); if (file_info == NULL) { break; } mimetype = g_file_info_get_content_type (file_info); if (is_file_in_list_store_file (store, file, &iter)) { if (eog_image_is_supported_mime_type (mimetype)) { gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, EOG_LIST_STORE_EOG_IMAGE, &image, -1); eog_image_file_changed (image); g_object_unref (image); eog_list_store_thumbnail_refresh (store, &iter); } else { eog_list_store_remove (store, &iter); } } else { if (eog_image_is_supported_mime_type (mimetype)) { eog_list_store_append_image_from_file (store, file); } } g_object_unref (file_info); break; case G_FILE_MONITOR_EVENT_DELETED: if (is_file_in_list_store_file (store, file, &iter)) { EogImage *image; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, EOG_LIST_STORE_EOG_IMAGE, &image, -1); eog_list_store_remove (store, &iter); } break; case G_FILE_MONITOR_EVENT_CREATED: if (!is_file_in_list_store_file (store, file, NULL)) { file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL); if (file_info == NULL) { break; } mimetype = g_file_info_get_content_type (file_info); if (eog_image_is_supported_mime_type (mimetype)) { eog_list_store_append_image_from_file (store, file); } g_object_unref (file_info); } break; case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL); if (file_info == NULL) { break; } mimetype = g_file_info_get_content_type (file_info); if (is_file_in_list_store_file (store, file, &iter) && eog_image_is_supported_mime_type (mimetype)) { eog_list_store_thumbnail_refresh (store, &iter); } g_object_unref (file_info); break; case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: case G_FILE_MONITOR_EVENT_PRE_UNMOUNT: case G_FILE_MONITOR_EVENT_UNMOUNTED: case G_FILE_MONITOR_EVENT_MOVED: break; } }