diff -ur ristretto-master/src/image_viewer.c ristretto-master-new/src/image_viewer.c --- ristretto-master/src/image_viewer.c 2012-02-27 11:39:19.000000000 +0100 +++ ristretto-master-new/src/image_viewer.c 2012-02-28 15:38:25.000000000 +0100 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -68,10 +69,14 @@ GdkColormap *colormap; GtkIconTheme *icon_theme; + GdkPixbuf *missing_icon; GdkPixbuf *bg_icon; GdkColor *bg_color; GdkColor *bg_color_fs; + GError *error; + gboolean show_broken_image_error; + RsttoImageViewerTransaction *transaction; GdkPixbuf *pixbuf; RsttoImageOrientation orientation; @@ -124,6 +129,8 @@ GCancellable *cancellable; GdkPixbufLoader *loader; + GError *error; + gint image_width; gint image_height; gdouble image_scale; @@ -282,6 +289,11 @@ viewer->priv->visual = gdk_rgb_get_visual(); viewer->priv->colormap = gdk_colormap_new (viewer->priv->visual, TRUE); + viewer->priv->show_broken_image_error = + rstto_settings_get_boolean_property ( + viewer->priv->settings, + "show-error-broken-image"); + viewer->priv->icon_theme = gtk_icon_theme_get_default (); viewer->priv->bg_icon = gtk_icon_theme_load_icon ( viewer->priv->icon_theme, @@ -289,6 +301,12 @@ BACKGROUND_ICON_SIZE, 0, NULL); + viewer->priv->missing_icon = gtk_icon_theme_load_icon ( + viewer->priv->icon_theme, + "missing-image", + 128, + 0, + NULL); gdk_pixbuf_saturate_and_pixelate ( viewer->priv->bg_icon, viewer->priv->bg_icon, @@ -573,6 +591,11 @@ g_object_unref (viewer->priv->bg_icon); viewer->priv->bg_icon = NULL; } + if (viewer->priv->missing_icon) + { + g_object_unref (viewer->priv->missing_icon); + viewer->priv->missing_icon = NULL; + } if (viewer->priv->pixbuf) { g_object_unref (viewer->priv->pixbuf); @@ -1137,6 +1160,12 @@ 0.0); cairo_paint (ctx); } + else + { + if (viewer->priv->error) + { + } + } } @@ -1357,6 +1386,14 @@ g_object_unref (viewer->priv->file); viewer->priv->file = file; + if (viewer->priv->error) + { + g_error_free (viewer->priv->error); + viewer->priv->error = NULL; + } + viewer->priv->image_scale = 0; + viewer->priv->image_width = 0; + viewer->priv->image_height = 0; rstto_image_viewer_load_image ( viewer, @@ -1481,6 +1518,10 @@ { tr->viewer->priv->transaction = NULL; } + if (tr->error) + { + g_error_free (tr->error); + } g_object_unref (tr->cancellable); g_object_unref (tr->loader); g_free (tr->buffer); @@ -1695,9 +1736,8 @@ GAsyncResult *result, gpointer user_data ) { - GError *error = NULL; RsttoImageViewerTransaction *transaction = (RsttoImageViewerTransaction *)user_data; - gssize read_bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), result, &error); + gssize read_bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), result, &transaction->error); if (read_bytes == -1) { @@ -1707,7 +1747,7 @@ if (read_bytes > 0) { - if(gdk_pixbuf_loader_write (transaction->loader, (const guchar *)transaction->buffer, read_bytes, &error) == FALSE) + if(gdk_pixbuf_loader_write (transaction->loader, (const guchar *)transaction->buffer, read_bytes, &transaction->error) == FALSE) { /* Clean up the input-stream */ g_input_stream_close (G_INPUT_STREAM (source_object), NULL, NULL); @@ -1726,7 +1766,7 @@ } else { /* Loading complete, transaction should not be free-ed */ - gdk_pixbuf_loader_close (transaction->loader, NULL); + gdk_pixbuf_loader_close (transaction->loader, &transaction->error); /* Clean up the input-stream */ g_input_stream_close (G_INPUT_STREAM (source_object), NULL, NULL); @@ -1841,17 +1881,69 @@ { RsttoImageViewer *viewer = transaction->viewer; GtkWidget *widget = GTK_WIDGET(viewer); + GtkWidget *error_dialog = NULL; + GtkWidget *vbox, *do_not_show_checkbox; if (viewer->priv->transaction == transaction) { - viewer->priv->image_scale = transaction->image_scale; - viewer->priv->image_width = transaction->image_width; - viewer->priv->image_height = transaction->image_height; - viewer->priv->orientation = transaction->orientation; + if (NULL == transaction->error) + { + viewer->priv->image_scale = transaction->image_scale; + viewer->priv->image_width = transaction->image_width; + viewer->priv->image_height = transaction->image_height; + viewer->priv->orientation = transaction->orientation; + set_scale (viewer, transaction->scale); + } + else + { + if (viewer->priv->pixbuf) + { + g_object_unref (viewer->priv->pixbuf); + viewer->priv->pixbuf = NULL; + } - set_scale (viewer, transaction->scale); + if (viewer->priv->show_broken_image_error) + { + GDK_THREADS_ENTER(); + error_dialog = gtk_message_dialog_new_with_markup ( + NULL, + 0, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + transaction->error->message + ); + vbox = gtk_message_dialog_get_message_area ( + GTK_MESSAGE_DIALOG (error_dialog)); + + do_not_show_checkbox = gtk_check_button_new_with_mnemonic ( + _("Do _not show this message again")); + gtk_box_pack_end ( + GTK_BOX (vbox), + do_not_show_checkbox, + TRUE, + FALSE, + 0); + gtk_widget_show (do_not_show_checkbox); + gtk_dialog_run (GTK_DIALOG(error_dialog)); + + if (TRUE == gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (do_not_show_checkbox))) + { + viewer->priv->show_broken_image_error = FALSE; + rstto_settings_set_boolean_property ( + viewer->priv->settings, + "show-error-broken-image", + FALSE); + } + gtk_widget_destroy (error_dialog); + GDK_THREADS_LEAVE(); + } + } + + viewer->priv->error = transaction->error; + transaction->error = NULL; viewer->priv->transaction = NULL; gdk_window_invalidate_rect ( @@ -2530,3 +2622,13 @@ gtk_drag_finish (context, FALSE, FALSE, time_); } } + +GError * +rstto_image_viewer_get_error ( RsttoImageViewer *viewer ) +{ + if (viewer->priv->error) + { + return g_error_copy (viewer->priv->error); + } + return NULL; +} diff -ur ristretto-master/src/image_viewer.h ristretto-master-new/src/image_viewer.h --- ristretto-master/src/image_viewer.h 2012-02-27 11:39:19.000000000 +0100 +++ ristretto-master-new/src/image_viewer.h 2012-02-28 13:59:18.000000000 +0100 @@ -107,6 +107,9 @@ RsttoImageViewer *viewer, GtkMenu *menu); +GError * +rstto_image_viewer_get_error ( RsttoImageViewer *viewer ); + G_END_DECLS #endif /* __RISTRETTO_IMAGE_VIEWER_H__ */ diff -ur ristretto-master/src/main_window.c ristretto-master-new/src/main_window.c --- ristretto-master/src/main_window.c 2012-02-27 11:39:19.000000000 +0100 +++ ristretto-master-new/src/main_window.c 2012-02-28 14:22:57.000000000 +0100 @@ -1110,6 +1110,7 @@ RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER(window->priv->image_viewer); ExifEntry *exif_entry = NULL; gchar exif_data[20]; + GError *error = NULL; if (window->priv->image_list) { @@ -1120,50 +1121,60 @@ status = g_strdup(file_basename); - if (TRUE == rstto_file_has_exif (cur_file)) + error = rstto_image_viewer_get_error (RSTTO_IMAGE_VIEWER (window->priv->image_viewer)); + if (NULL != error) { - /* Extend the status-message with exif-info */ - /********************************************/ - exif_entry = rstto_file_get_exif ( - cur_file, - EXIF_TAG_FNUMBER); - if (exif_entry) + tmp_status = g_strdup_printf ("%s\t- %s", status, error->message); + g_free (status); + status = tmp_status; + } + else + { + if (TRUE == rstto_file_has_exif (cur_file)) { - exif_entry_get_value (exif_entry, exif_data, 20); + /* Extend the status-message with exif-info */ + /********************************************/ + exif_entry = rstto_file_get_exif ( + cur_file, + EXIF_TAG_FNUMBER); + if (exif_entry) + { + exif_entry_get_value (exif_entry, exif_data, 20); + + tmp_status = g_strdup_printf ("%s\t%s", status, exif_data); + + g_free (status); + status = tmp_status; + + /*exif_entry_free (exif_entry);*/ + } + exif_entry = rstto_file_get_exif ( + cur_file, + EXIF_TAG_EXPOSURE_TIME); + if (exif_entry) + { + exif_entry_get_value (exif_entry, exif_data, 20); - tmp_status = g_strdup_printf ("%s\t%s", status, exif_data); + tmp_status = g_strdup_printf ("%s\t%s", status, exif_data); - g_free (status); - status = tmp_status; + g_free (status); + status = tmp_status; - /*exif_entry_free (exif_entry);*/ + /*exif_entry_free (exif_entry);*/ + } } - exif_entry = rstto_file_get_exif ( - cur_file, - EXIF_TAG_EXPOSURE_TIME); - if (exif_entry) - { - exif_entry_get_value (exif_entry, exif_data, 20); - tmp_status = g_strdup_printf ("%s\t%s", status, exif_data); + if(rstto_image_viewer_get_width(viewer) != 0 && rstto_image_viewer_get_height(viewer) != 0) + { + tmp_status = g_strdup_printf ("%s\t%d x %d\t%.1f%%", status, + rstto_image_viewer_get_width(viewer), + rstto_image_viewer_get_height(viewer), + (100 * rstto_image_viewer_get_scale(viewer))); g_free (status); status = tmp_status; - - /*exif_entry_free (exif_entry);*/ } } - - if(rstto_image_viewer_get_width(viewer) != 0 && rstto_image_viewer_get_height(viewer) != 0) - { - tmp_status = g_strdup_printf ("%s\t%d x %d\t%.1f%%", status, - rstto_image_viewer_get_width(viewer), - rstto_image_viewer_get_height(viewer), - (100 * rstto_image_viewer_get_scale(viewer))); - - g_free (status); - status = tmp_status; - } } else { diff -ur ristretto-master/src/settings.c ristretto-master-new/src/settings.c --- ristretto-master/src/settings.c 2012-02-27 11:39:19.000000000 +0100 +++ ristretto-master-new/src/settings.c 2012-02-28 14:44:09.000000000 +0100 @@ -74,6 +74,7 @@ PROP_MAXIMIZE_ON_STARTUP, PROP_MERGE_TOOLBARS, PROP_ERROR_MISSING_THUMBNAILER, + PROP_ERROR_BROKEN_IMAGE, PROP_SORT_TYPE, PROP_THUMBNAIL_SIZE, }; @@ -133,6 +134,7 @@ struct { gboolean missing_thumbnailer; + gboolean broken_image; } errors; }; @@ -170,6 +172,7 @@ settings->priv->maximize_on_startup = TRUE; settings->priv->hide_thumbnailbar_fullscreen = TRUE; settings->priv->errors.missing_thumbnailer = TRUE; + settings->priv->errors.broken_image = TRUE; settings->priv->thumbnail_size = THUMBNAIL_SIZE_NORMAL; xfconf_g_property_bind ( @@ -317,6 +320,13 @@ xfconf_g_property_bind ( settings->priv->channel, + "/errors/broken-image", + G_TYPE_BOOLEAN, + settings, + "show-error-broken-image"); + + xfconf_g_property_bind ( + settings->priv->channel, "/desktop/type", G_TYPE_STRING, settings, @@ -566,6 +576,17 @@ PROP_ERROR_MISSING_THUMBNAILER, pspec); + pspec = g_param_spec_boolean ( + "show-error-broken-image", + "", + "", + TRUE, + G_PARAM_READWRITE); + g_object_class_install_property ( + object_class, + PROP_ERROR_BROKEN_IMAGE, + pspec); + pspec = g_param_spec_uint ( "sort-type", "", @@ -753,6 +774,9 @@ case PROP_ERROR_MISSING_THUMBNAILER: settings->priv->errors.missing_thumbnailer = g_value_get_boolean (value); break; + case PROP_ERROR_BROKEN_IMAGE: + settings->priv->errors.broken_image = g_value_get_boolean (value); + break; case PROP_SORT_TYPE: settings->priv->sort_type = g_value_get_uint ( value ); break; @@ -837,6 +861,11 @@ value, settings->priv->errors.missing_thumbnailer); break; + case PROP_ERROR_BROKEN_IMAGE: + g_value_set_boolean ( + value, + settings->priv->errors.broken_image); + break; case PROP_SORT_TYPE: g_value_set_uint ( value,