From 59742b2e0791402a88d1c1df397a8f843588b452 Mon Sep 17 00:00:00 2001
From: Daniel Friesel <derf@finalrewind.org>
Date: Fri, 10 Sep 2010 22:55:29 +0200
Subject: [PATCH] Add --info option

---
 src/feh.h       |  1 +
 src/imlib.c     | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/options.c   |  4 +++
 src/options.h   |  1 +
 src/winwidget.c |  4 +++
 5 files changed, 89 insertions(+)

diff --git a/src/feh.h b/src/feh.h
index de5415c..f627a78 100644
--- a/src/feh.h
+++ b/src/feh.h
@@ -132,6 +132,7 @@ int feh_load_image_char(Imlib_Image * im, char *filename);
 void feh_draw_filename(winwidget w);
 void feh_draw_actions(winwidget w);
 void feh_draw_caption(winwidget w);
+void feh_draw_info(winwidget w);
 void feh_display_status(char stat);
 void real_loadables_mode(int loadable);
 void feh_reload_image(winwidget w, int resize, int force_new);
diff --git a/src/imlib.c b/src/imlib.c
index 48bc4ea..672d65d 100644
--- a/src/imlib.c
+++ b/src/imlib.c
@@ -622,6 +622,85 @@ void feh_draw_filename(winwidget w)
 	return;
 }
 
+void feh_draw_info(winwidget w)
+{
+	static Imlib_Font fn = NULL;
+	int tw = 0, th = 0;
+	int tmp_tw = 0, tmp_th = 0;
+	Imlib_Image im = NULL;
+	static DATA8 atab[256];
+	int no_lines = 0;
+	char *info_cmd;
+	char info_buf[256];
+	FILE *info_pipe;
+
+	if ((!w->file) || (!FEH_FILE(w->file->data))
+			|| (!FEH_FILE(w->file->data)->filename))
+		return;
+
+	if (opt.font)
+		fn = gib_imlib_load_font(opt.font);
+
+	if (!fn) {
+		if (w->full_screen)
+			fn = gib_imlib_load_font(DEFAULT_FONT_BIG);
+		else
+			fn = gib_imlib_load_font(DEFAULT_FONT);
+	}
+
+	if (!fn) {
+		weprintf("Couldn't load font for filename printing");
+		return;
+	}
+
+	info_cmd = feh_printf(opt.info_cmd, FEH_FILE(w->file->data));
+
+	memset(atab, 0, sizeof(atab));
+
+	gib_imlib_get_text_size(fn, "w", NULL, &tw, &th, IMLIB_TEXT_TO_RIGHT);
+
+	info_pipe = popen(info_cmd, "r");
+
+	im = imlib_create_image(290 * tw, 20 * th);
+	if (!im)
+		eprintf("Couldn't create image. Out of memory?");
+
+	gib_imlib_image_set_has_alpha(im, 1);
+	gib_imlib_apply_color_modifier_to_rectangle(im, 0, 0, 290 * tw, 20 * th, NULL, NULL, NULL, atab);
+	gib_imlib_image_fill_rectangle(im, 0, 0, 290 * tw, 20 * th, 0, 0, 0, 0);
+
+	if (!info_pipe) {
+		gib_imlib_text_draw(im, fn, NULL, 2, 2,
+				"Error runnig info command", IMLIB_TEXT_TO_RIGHT,
+				255, 0, 0, 255);
+		gib_imlib_get_text_size(fn, "Error running info command", NULL, &tw, &th,
+				IMLIB_TEXT_TO_RIGHT);
+		no_lines = 1;
+	}
+	else {
+		while ((no_lines < 20) && fgets(info_buf, 256, info_pipe)) {
+			info_buf[strlen(info_buf)-1] = '\0';
+	gib_imlib_get_text_size(fn, "w", NULL, &tw, &th, IMLIB_TEXT_TO_RIGHT);
+			gib_imlib_text_draw(im, fn, NULL, 2, (no_lines*th)+2, info_buf,
+					IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255);
+			gib_imlib_text_draw(im, fn, NULL, 1, (no_lines*th)+1, info_buf,
+					IMLIB_TEXT_TO_RIGHT, 255, 255, 255, 255);
+			no_lines++;
+			gib_imlib_get_text_size(fn, info_buf, NULL, &tmp_tw, &tmp_th, IMLIB_TEXT_TO_RIGHT);
+			if (tmp_tw > tw)
+				tw = tmp_tw;
+		}
+		pclose(info_pipe);
+	}
+
+
+	gib_imlib_render_image_on_drawable(w->bg_pmap, im, w->w - tw - 5, w->h -
+	(th * no_lines) - 5, 1, 1, 0);
+
+	gib_imlib_free_image_and_decache(im);
+	return;
+}
+
 char *build_caption_filename(feh_file * file)
 {
 	char *caption_filename;
diff --git a/src/options.c b/src/options.c
index e2ccc74..182f3d8 100644
--- a/src/options.c
+++ b/src/options.c
@@ -423,6 +423,7 @@ static void feh_parse_option_array(int argc, char **argv)
 		{"index-dim"     , 1, 0, 232},
 		{"thumb-redraw"  , 1, 0, 'J'},
 		{"action-hold-slide", 0, 0, 233},
+		{"info"          , 1, 0, 234},
 
 		{0, 0, 0, 0}
 	};
@@ -772,6 +773,9 @@ static void feh_parse_option_array(int argc, char **argv)
 		case 233:
 			opt.action_hold_slide = 1;
 			break;
+		case 234:
+			opt.info_cmd = estrdup(optarg);
+			break;
 		default:
 			break;
 		}
diff --git a/src/options.h b/src/options.h
index e9595b7..5a187f4 100644
--- a/src/options.h
+++ b/src/options.h
@@ -88,6 +88,7 @@ struct __fehoptions {
 	char *menu_style;
 	char *caption_path;
 	char *start_list_at;
+	char *info_cmd;
 
 	gib_style *menu_style_l;
 
diff --git a/src/winwidget.c b/src/winwidget.c
index 771024b..855e0da 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -539,6 +539,8 @@ void winwidget_render_image(winwidget winwid, int resize, int alias)
 		feh_draw_actions(winwid);
 	if ((opt.mode == MODE_ZOOM) && !alias)
 		feh_draw_zoom(winwid);
+	if (opt.info_cmd)
+		feh_draw_info(winwid);
 	XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
 	XClearWindow(disp, winwid->win);
 	return;
@@ -559,6 +561,8 @@ void winwidget_render_image_cached(winwidget winwid)
 		feh_draw_filename(winwid);
 	if (opt.draw_actions)
 		feh_draw_actions(winwid);
+	if (opt.info_cmd)
+		feh_draw_info(winwid);
 	XSetWindowBackgroundPixmap(disp, winwid->win, winwid->bg_pmap);
 	XClearWindow(disp, winwid->win);
 }
-- 
GitLab