From b58c42569dea36b5e9ed28b8e96daee5b10c6bf3 Mon Sep 17 00:00:00 2001
From: Daniel Friesel <derf@derf.homelinux.org>
Date: Sat, 19 Jun 2010 18:46:58 +0200
Subject: Allow multiline theme definitions in .fehrc

---
 ChangeLog     |  1 +
 man/feh.1     |  3 +++
 src/options.c | 46 ++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index bd247e5..7ba3f6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@ git HEAD
       toggle fullscreen, should you really need it.
     * --font now sets the global default font (for action/filename display etc.)
     * Rename --screen-clip 0 to --no-screen-clip
+    * Allow multiline theme definitions (via backslash, like in the shell)
 
 Thu Jun 10 12:12:04 CEST 2010
 
diff --git a/man/feh.1 b/man/feh.1
index 3c50254..8228373 100644
--- a/man/feh.1
+++ b/man/feh.1
@@ -552,6 +552,9 @@ Now just run
 .Qq imagemap *.jpg
 to use these options.
 .Pp
+Note that you can split a theme over several lines by placing a backslash at
+the end of a line, like in the shell.
+.Pp
 You can combine these themes with commandline options.  An example .fehrc is
 provided with a couple of cool example themes.
 .
diff --git a/src/options.c b/src/options.c
index d017cad..392fa26 100644
--- a/src/options.c
+++ b/src/options.c
@@ -147,6 +147,8 @@ static void feh_load_options_for_theme(char *theme)
 	char *home;
 	char *rcpath = NULL;
 	char s[1024], s1[1024], s2[1024];
+	int cont = 0;
+	int bspos;
 
 	if (opt.rcfile) {
 		if ((fp = fopen(opt.rcfile, "r")) == NULL) {
@@ -176,14 +178,40 @@ static void feh_load_options_for_theme(char *theme)
 	for (; fgets(s, sizeof(s), fp);) {
 		s1[0] = '\0';
 		s2[0] = '\0';
-		sscanf(s, "%s %[^\n]\n", (char *) &s1, (char *) &s2);
-		if (!(*s1) || (!*s2) || (*s1 == '\n') || (*s1 == '#'))
-			continue;
-		D(5, ("Got theme/options pair %s/%s\n", s1, s2));
-		if (!strcmp(s1, theme)) {
+
+		if (cont) {
+			sscanf(s, " %[^\n]\n", (char *) &s2);
+			if (!*s2)
+				break;
+			D(5, ("Got continued options %s\n", s2));
+		} else {
+			sscanf(s, "%s %[^\n]\n", (char *) &s1, (char *) &s2);
+			if (!(*s1) || (!*s2) || (*s1 == '\n') || (*s1 == '#')) {
+				cont = 0;
+				continue;
+			}
+			D(5, ("Got theme/options pair %s/%s\n", s1, s2));
+		}
+
+		if (!strcmp(s1, theme) || cont) {
+
+			bspos = strlen(s2)-1;
+
+			if (s2[bspos] == '\\') {
+				D(5, ("Continued line\n"));
+				s2[bspos] = '\0';
+				cont = 1;
+				/* A trailing whitespace confuses the option parser */
+				if (bspos && (s2[bspos-1] == ' '))
+					s2[bspos-1] = '\0';
+			} else
+				cont = 0;
+
 			D(4, ("A match. Using options %s\n", s2));
 			feh_parse_options_from_string(s2);
-			break;
+
+			if (!cont)
+				break;
 		}
 	}
 	fclose(fp);
@@ -1182,8 +1210,10 @@ static void feh_create_default_config(char *rcfile)
 "# Set the default feh options to be recursive and verbose\n"
 "# feh -rV\n"
 "\n"
-"# Multiple options can of course be used. They should all be on one line\n"
-"# imagemap -rV --quiet -W 400 -H 300 --thumb-width 40 --thumb-height 30\n"
+"# Multiple options can of course be used. If they are not in one line,\n"
+"# the lines after the theme name must start with a tab character. Like:\n"
+"# imagemap -rV --quiet -W 400 -H 300 \\\n"
+"#          --thumb-width 40 --thumb-height 30\n"
 "\n"
 "# ====================\n"
 "# A few default themes\n"
-- 
cgit v1.2.3