Updating branch refs/heads/master to f94dfd551f71a792686b580cdfb357a5581dfc65 (commit) from f529ab4578e71917841cc2e1d095e3243bc06808 (commit)
commit f94dfd551f71a792686b580cdfb357a5581dfc65 Author: Stephan Arts <step...@xfce.org> Date: Mon Nov 15 20:23:27 2010 +0100 Improve performance when opening a lot of files (Bug #6677) - Reduce I/O. - Apply patch by Ala Luszczak <ala.luszc...@gmail.com> src/image.c | 48 ++++++++++++++++++++--------------- src/image.h | 1 + src/main_window.c | 68 ++++++++++++++++++++++++++++++++++--------------- src/main_window.h | 2 + src/picture_viewer.c | 3 ++ 5 files changed, 80 insertions(+), 42 deletions(-) diff --git a/src/image.c b/src/image.c index 9b3c2ce..f4f5019 100644 --- a/src/image.c +++ b/src/image.c @@ -261,33 +261,14 @@ RsttoImage * rstto_image_new (GFile *file) { RsttoImage *image = g_object_new (RSTTO_TYPE_IMAGE, NULL); - gchar *file_path = g_file_get_path (file); - ExifEntry *exif_entry = NULL; g_object_ref (file); image->priv->file = file; - image->priv->exif_data = exif_data_new_from_file (file_path); + image->priv->exif_data = NULL; image->priv->thumbnail = NULL; image->priv->pixbuf = NULL; - - if (image->priv->exif_data) { - exif_entry = exif_data_get_entry (image->priv->exif_data, EXIF_TAG_ORIENTATION); - } - /* Check if the image has exif-data available */ - if (exif_entry && exif_entry->data != NULL) - { - /* Get the image-orientation from EXIF data */ - image->priv->orientation = exif_get_short (exif_entry->data, exif_data_get_byte_order (exif_entry->parent->parent)); - if (image->priv->orientation == 0) - /* Default orientation */ - image->priv->orientation = RSTTO_IMAGE_ORIENT_NONE; - } - else - { - /* Default orientation */ - image->priv->orientation = RSTTO_IMAGE_ORIENT_NONE; - } + image->priv->orientation = RSTTO_IMAGE_ORIENT_NOT_DETERMINED; return image; } @@ -554,6 +535,31 @@ rstto_image_get_size (RsttoImage *image) RsttoImageOrientation rstto_image_get_orientation (RsttoImage *image) { + if (image->priv->orientation == RSTTO_IMAGE_ORIENT_NOT_DETERMINED){ + gchar *file_path = g_file_get_path (image->priv->file); + ExifEntry *exif_entry = NULL; + + image->priv->exif_data = exif_data_new_from_file (file_path); + + if (image->priv->exif_data) { + exif_entry = exif_data_get_entry (image->priv->exif_data, EXIF_TAG_ORIENTATION); + } + /* Check if the image has exif-data available */ + if (exif_entry && exif_entry->data != NULL) + { + /* Get the image-orientation from EXIF data */ + image->priv->orientation = exif_get_short (exif_entry->data, exif_data_get_byte_order (exif_entry->parent->parent)); + if (image->priv->orientation == 0) + /* Default orientation */ + image->priv->orientation = RSTTO_IMAGE_ORIENT_NONE; + } + else + { + /* Default orientation */ + image->priv->orientation = RSTTO_IMAGE_ORIENT_NONE; + } + } + return image->priv->orientation; } diff --git a/src/image.h b/src/image.h index a36659b..c6a8407 100644 --- a/src/image.h +++ b/src/image.h @@ -31,6 +31,7 @@ typedef enum RSTTO_IMAGE_ORIENT_90, RSTTO_IMAGE_ORIENT_TRANSVERSE, RSTTO_IMAGE_ORIENT_270, + RSTTO_IMAGE_ORIENT_NOT_DETERMINED, } RsttoImageOrientation; #define RSTTO_TYPE_IMAGE rstto_image_get_type() diff --git a/src/main_window.c b/src/main_window.c index c4f9bb6..8aa40ac 100644 --- a/src/main_window.c +++ b/src/main_window.c @@ -55,6 +55,9 @@ #define ZOOM_FACTOR 1.2 #endif +#define RSTTO_RECENT_FILES_APP_NAME "ristretto" +#define RSTTO_RECENT_FILES_GROUP "Graphics" + struct _RsttoMainWindowPriv { struct { @@ -262,6 +265,10 @@ cb_rstto_main_window_vpaned_pos_changed (GtkWidget *widget, gpointer user_data); static void cb_rstto_main_window_hpaned_pos_changed (GtkWidget *widget, gpointer user_data); +gboolean +rstto_main_window_add_file_to_recent_files (GFile *file); + + static GtkWidgetClass *parent_class = NULL; static GtkActionEntry action_entries[] = @@ -2016,13 +2023,7 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window) gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } - else - { - uri = g_file_get_uri (_files_iter->data); - gtk_recent_manager_add_item (window->priv->recent_manager, uri); - g_free (uri); - uri = NULL; - } + _files_iter = g_slist_next (_files_iter); } } @@ -2039,15 +2040,6 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window) gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } - else - { - - uri = g_file_get_uri (files->data); - gtk_recent_manager_add_item (window->priv->recent_manager, uri); - g_free (uri); - uri = NULL; - - } } if (pos == -1) @@ -2082,7 +2074,6 @@ cb_rstto_main_window_open_folder (GtkWidget *widget, RsttoMainWindow *window) GFileInfo *file_info = NULL; const gchar *filename = NULL; const gchar *content_type = NULL; - gchar *uri = NULL; gint pos = 0; GtkWidget *dialog; gchar *current_uri = rstto_settings_get_string_property (RSTTO_SETTINGS (window->priv->settings_manager), "current-uri"); @@ -2127,10 +2118,8 @@ cb_rstto_main_window_open_folder (GtkWidget *widget, RsttoMainWindow *window) if (pos == -1) rstto_image_list_iter_set_position (window->priv->iter, 0); - uri = g_file_get_uri (file); - gtk_recent_manager_add_item (window->priv->recent_manager, uri); - g_free (uri); - uri = NULL; + g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, + file, NULL); rstto_settings_set_string_property (RSTTO_SETTINGS (window->priv->settings_manager), "current-uri", @@ -2522,3 +2511,40 @@ cb_rstto_main_window_hpaned_pos_changed (GtkWidget *widget, gpointer user_data) rstto_settings_set_uint_property (RSTTO_SETTINGS (window->priv->settings_manager), "thumbnailbar-size", size); } + +gboolean +rstto_main_window_add_file_to_recent_files (GFile *file) +{ + GFileInfo *file_info; + GtkRecentData *recent_data; + gchar* uri; + static gchar *groups[2] = { RSTTO_RECENT_FILES_GROUP , NULL }; + + if (file == NULL) return FALSE; + + uri = g_file_get_uri (file); + if(uri == NULL) return FALSE; + + file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + 0, NULL, NULL); + if (file_info == NULL) return FALSE; + + recent_data = g_slice_new (GtkRecentData); + recent_data->display_name = NULL; + recent_data->description = NULL; //NULL + recent_data->mime_type = (gchar *) g_file_info_get_content_type (file_info); + recent_data->app_name = RSTTO_RECENT_FILES_APP_NAME; + recent_data->app_exec = g_strjoin(" ", g_get_prgname (), "%u", NULL); + recent_data->groups = groups; + recent_data->is_private = FALSE; + + gtk_recent_manager_add_full (gtk_recent_manager_get_default(), uri, recent_data); + + g_free (recent_data->app_exec); + g_free (uri); + g_object_unref (file_info); + + g_slice_free (GtkRecentData, recent_data); + + return FALSE; +} diff --git a/src/main_window.h b/src/main_window.h index b618a71..8a724f5 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -69,6 +69,8 @@ GType rstto_main_window_get_type(); GtkWidget *rstto_main_window_new (RsttoImageList *, gboolean); +gboolean rstto_main_window_add_file_to_recent_files (GFile *); + G_END_DECLS #endif /* __RISTRETTO_MAIN_WINDOW_H__ */ diff --git a/src/picture_viewer.c b/src/picture_viewer.c index 3e6b9ce..b0c0942 100644 --- a/src/picture_viewer.c +++ b/src/picture_viewer.c @@ -29,6 +29,7 @@ #include "image_list.h" #include "picture_viewer.h" #include "settings.h" +#include "main_window.h" #include "marshal.h" typedef enum @@ -1609,6 +1610,8 @@ rstto_picture_viewer_set_image (RsttoPictureViewer *viewer, RsttoImage *image) } rstto_image_load (viewer->priv->image, FALSE, *scale, FALSE, NULL); + + g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, rstto_image_get_file(viewer->priv->image), NULL); } else { _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits