# HG changeset patch # User zas_ # Date 1207001425 0 # Node ID f4a0555794a9cda19ab7536648688f77d400b979 # Parent 5bdab7ed4bcde0cc5f8a2624a2b9b2aadff1ca38 Customizable info overlay in fullscreen, based on the patch posted to gqview-devel list by Timo on 2007-09-10. diff -r 5bdab7ed4bcd -r f4a0555794a9 src/globals.c --- a/src/globals.c Mon Mar 31 21:09:36 2008 +0000 +++ b/src/globals.c Mon Mar 31 22:10:25 2008 +0000 @@ -100,6 +100,8 @@ gint fullscreen_clean_flip = FALSE; gint fullscreen_disable_saver = TRUE; gint fullscreen_above = FALSE; +gint show_fullscreen_info = TRUE; +gchar *fullscreen_info = NULL; gint dupe_custom_threshold = 99; diff -r 5bdab7ed4bcd -r f4a0555794a9 src/gqview.h --- a/src/gqview.h Mon Mar 31 21:09:36 2008 +0000 +++ b/src/gqview.h Mon Mar 31 22:10:25 2008 +0000 @@ -167,6 +167,8 @@ extern gint fullscreen_clean_flip; extern gint fullscreen_disable_saver; extern gint fullscreen_above; +extern gint show_fullscreen_info; +extern gchar *fullscreen_info; extern gint dupe_custom_threshold; diff -r 5bdab7ed4bcd -r f4a0555794a9 src/image-overlay.c --- a/src/image-overlay.c Mon Mar 31 21:09:36 2008 +0000 +++ b/src/image-overlay.c Mon Mar 31 22:10:25 2008 +0000 @@ -13,6 +13,7 @@ #include "image-overlay.h" #include "collect.h" +#include "exif.h" #include "filelist.h" #include "image.h" #include "img-view.h" @@ -75,6 +76,72 @@ static void image_osd_timer_schedule(OverlayStateData *osd); +static gchar *image_osd_mkinfo(const gchar *str, ImageWindow *imd, GHashTable *vars) +{ + gchar delim = '%', imp = '|', sep[] = " - "; + gchar *start, *end; + gint pos, prev; + gint last; + gchar *name, *data; + GString *new = g_string_new(str); + gchar *ret; + ExifData *exif; + + exif = exif_read_fd(imd->image_fd, FALSE); + prev = 0; + last = FALSE; + + while (TRUE) + { + start = strchr(new->str, delim); + if (!start) + break; + end = strchr(start+1, delim); + if (!end) + break; + + name = g_strndup(start+1, end-start-1); + pos = start-new->str; + data = g_strdup(g_hash_table_lookup(vars, name)); + if (!data && exif) + data = exif_get_data_as_text(exif, name); + + g_string_erase(new, pos, end-start+1); + if (data) + g_string_insert(new, pos, data); + if (pos-prev == 2 && new->str[pos-1] == imp) + { + g_string_erase(new, --pos, 1); + if (last && data) + { + g_string_insert(new, pos, sep); + pos += strlen(sep); + } + } + + prev = data ? pos+strlen(data)-1 : pos-1; + last = data ? TRUE : last; + g_free(name); + g_free(data); + } + + /* search and destroy empty lines */ + end = new->str; + while (start = strchr(end, '\n')) + { + end = start; + while (*++(end) == '\n') + ; + g_string_erase(new, start-new->str, end-start-1); + } + + g_strchomp(new->str); + + ret = new->str; + g_string_free(new, FALSE); + + return ret; +} static GdkPixbuf *image_osd_info_render(ImageWindow *imd) { @@ -90,7 +157,11 @@ CollectInfo *info; gchar *ct; int i; - + gint w, h; + GHashTable *vars; + + vars = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); + name = image_get_name(imd); if (name) { @@ -148,20 +219,8 @@ } size = text_from_size_abrev(imd->size); - if (!name_escaped) - { - text = g_strdup_printf(_("Untitled")); - } - else if (imd->unknown) + if (!imd->unknown) { - text = g_strdup_printf("%s(%d/%d) %s\n%s - %s", ct, - n, t, name_escaped, - text_from_time(imd->mtime), size); - } - else - { - gint w, h; - if (imd->delay_flip && imd->il && imd->il->pixbuf && image_get_pixbuf(imd) != imd->il->pixbuf) @@ -174,15 +233,31 @@ pixbuf_renderer_get_image_size(PIXBUF_RENDERER(imd->pr), &w, &h); } - text = g_strdup_printf("%s(%d/%d) %s\n%d x %d - %s - %s", ct, - n, t, name_escaped, - w, h, - text_from_time(imd->mtime), size); + g_hash_table_insert(vars, "width", g_strdup_printf("%d", w)); + g_hash_table_insert(vars, "height", g_strdup_printf("%d", h)); + g_hash_table_insert(vars, "res", g_strdup_printf("%d × %d", w, h)); + } + + g_hash_table_insert(vars, "collection", g_strdup(ct)); + g_hash_table_insert(vars, "number", g_strdup_printf("%d", n)); + g_hash_table_insert(vars, "total", g_strdup_printf("%d", t)); + g_hash_table_insert(vars, "name", g_strdup(name_escaped)); + g_hash_table_insert(vars, "date", g_strdup(text_from_time(imd->mtime))); + g_hash_table_insert(vars, "size", g_strdup(size)); + + if (!name_escaped) + { + text = g_strdup_printf(_("Untitled")); + } + else + { + text = image_osd_mkinfo(fullscreen_info, imd, vars); + } - } g_free(size); - g_free(ct); - g_free(name_escaped); + g_free(ct); + g_free(name_escaped); + g_hash_table_destroy(vars); { GString *buf = g_string_sized_new(FILEDATA_MARKS_SIZE * 2); @@ -206,6 +281,7 @@ width += 10; height += 10; + /* TODO: make osd color configurable --Zas */ pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); pixbuf_set_rect_fill(pixbuf, 3, 3, width-6, height-6, 240, 240, 240, 210); pixbuf_set_rect(pixbuf, 0, 0, width, height, 240, 240, 240, 80, 1, 1, 1, 1); diff -r 5bdab7ed4bcd -r f4a0555794a9 src/main.c --- a/src/main.c Mon Mar 31 21:09:36 2008 +0000 +++ b/src/main.c Mon Mar 31 22:10:25 2008 +0000 @@ -18,6 +18,7 @@ #include "dnd.h" #include "editors.h" #include "filelist.h" +#include "image-overlay.h" #include "img-view.h" #include "layout.h" #include "layout_image.h" @@ -1134,6 +1135,11 @@ color_profile_input_name[i] = NULL; } + fullscreen_info = g_strdup("%collection%(%number%/%total%) %name%\n" + "%res%|%date%|%size%\n" + "%fAperture%|%fShutterSpeed%|%fISOSpeedRating%|%fFocalLength%|%fExposureBias%\n" + "%fCamera%|%fFlash%"); + sidecar_ext_add_defaults(); } @@ -1155,6 +1161,7 @@ layout_geometry_get(NULL, &main_window_x, &main_window_y, &main_window_w, &main_window_h); } + show_fullscreen_info = image_osd_get(lw->image, NULL, NULL); } layout_geometry_get_dividers(NULL, &window_hdivider_pos, &window_vdivider_pos); @@ -1418,6 +1425,7 @@ collection_get_first(first_collection)); } } + image_osd_set(lw->image, FALSE, show_fullscreen_info); g_free(geometry); g_free(cmd_path); diff -r 5bdab7ed4bcd -r f4a0555794a9 src/preferences.c --- a/src/preferences.c Mon Mar 31 21:09:36 2008 +0000 +++ b/src/preferences.c Mon Mar 31 22:10:25 2008 +0000 @@ -123,6 +123,8 @@ static gint fullscreen_clean_flip_c; static gint fullscreen_disable_saver_c; static gint fullscreen_above_c; +static gint show_fullscreen_info_c; +static gchar *fullscreen_info_c = NULL; static gint dupe_custom_threshold_c; @@ -295,6 +297,12 @@ fullscreen_clean_flip = fullscreen_clean_flip_c; fullscreen_disable_saver = fullscreen_disable_saver_c; fullscreen_above = fullscreen_above_c; + show_fullscreen_info = show_fullscreen_info_c; + if (fullscreen_info_c) + { + g_free(fullscreen_info); + fullscreen_info = g_strdup(fullscreen_info_c); + } update_on_time_change = update_on_time_change_c; exif_rotate_enable = exif_rotate_enable_c; @@ -781,6 +789,23 @@ gtk_widget_show(gd->dialog); } +static void fullscreen_info_view_changed_cb(GtkWidget* widget, gpointer data) +{ + GtkWidget *pTextView; + GtkTextBuffer* pTextBuffer; + GtkTextIter iStart; + GtkTextIter iEnd; + + pTextView = GTK_WIDGET(data); + + pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView)); + gtk_text_buffer_get_start_iter(pTextBuffer, &iStart); + gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd); + + if (fullscreen_info_c) g_free(fullscreen_info_c); + fullscreen_info_c = gtk_text_buffer_get_text(pTextBuffer, &iStart, &iEnd, TRUE); +} + static void config_window_create(void) { GtkWidget *win_vbox; @@ -799,9 +824,11 @@ GtkWidget *scrolled; GtkWidget *viewport; GtkWidget *filter_view; + GtkWidget *fullscreen_info_view; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreeViewColumn *column; + GtkTextBuffer *buffer; gint i; configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -1221,6 +1248,39 @@ fullscreen_clean_flip, &fullscreen_clean_flip_c); pref_checkbox_new_int(group, _("Disable screen saver"), fullscreen_disable_saver, &fullscreen_disable_saver_c); + pref_checkbox_new_int(group, _("Always show fullscreen info"), + show_fullscreen_info, &show_fullscreen_info_c); + pref_label_new(group, _("Fullscreen info string")); + + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_set_size_request(scrolled, 200, 150); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 5); + gtk_widget_show(scrolled); + + fullscreen_info_view = gtk_text_view_new(); + gtk_widget_set_tooltip_markup(fullscreen_info_view, + _("%name% results in the filename of the picture.\n" + "Also available: %collection%, %number%, %total%, %date%,\n" + "%size% (filesize), %width%, %height%, %res% (resolution)\n" + "To access exif data use the exif name, e. g. %fCamera% is the formatted camera name,\n" + "%Exif.Photo.DateTimeOriginal% the date of the original shot.\n" + "If two or more variables are connected with the |-sign, it prints available variables with a separator.\n" + "%fShutterSpeed%|%fISOSpeedRating%|%fFocalLength% could show \"1/20s - 400 - 80 mm\" or \"1/200 - 80 mm\",\n" + "if there's no ISO information in the Exif data.\n" + "If a line is empty, it is removed. This allows to add lines that totally disappear when no data is available.\n" +)); + +gtk_container_add(GTK_CONTAINER(scrolled), fullscreen_info_view); + gtk_widget_show(fullscreen_info_view); + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(fullscreen_info_view)); + gtk_text_buffer_set_text(buffer, fullscreen_info, -1); + g_signal_connect(G_OBJECT(buffer), "changed", + G_CALLBACK(fullscreen_info_view_changed_cb), fullscreen_info_view); + group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL); diff -r 5bdab7ed4bcd -r f4a0555794a9 src/rcfile.c --- a/src/rcfile.c Mon Mar 31 21:09:36 2008 +0000 +++ b/src/rcfile.c Mon Mar 31 22:10:25 2008 +0000 @@ -357,6 +357,8 @@ write_bool_option(f, "fullscreen_clean_flip", fullscreen_clean_flip); write_bool_option(f, "fullscreen_disable_saver", fullscreen_disable_saver); write_bool_option(f, "fullscreen_above", fullscreen_above); + write_bool_option(f, "show_fullscreen_info", show_fullscreen_info); + write_char_option(f, "fullscreen_info", fullscreen_info); write_int_option(f, "custom_similarity_threshold", dupe_custom_threshold); @@ -632,6 +634,10 @@ "fullscreen_disable_saver", value, fullscreen_disable_saver); fullscreen_above = read_bool_option(f, option, "fullscreen_above", value, fullscreen_above); + show_fullscreen_info = read_bool_option(f, option, + "show_fullscreen_info", value, show_fullscreen_info); + fullscreen_info = read_char_option(f, option, + "fullscreen_info", value_all, fullscreen_info); dupe_custom_threshold = read_int_option(f, option, "custom_similarity_threshold", value, dupe_custom_threshold);