# 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);