From 9779f11f4801628b38d17fa78d638f6a75d6257d Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Fri, 29 Dec 2017 21:27:21 +0100
Subject: Fix zoom ratio calculation

This simplifies the logic behind the automatic zoom ratio calculation, which is used by both --auto-zoom and --scale-down.
---
 src/winwidget.c | 123 +++++++++-----------------------------------------------
 1 file changed, 20 insertions(+), 103 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index beae9fa..a8bcc0a 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -328,6 +328,7 @@ void winwidget_create_window(winwidget ret, int w, int h)
 		opt.geom_h = h;
 		opt.geom_flags |= WidthValue | HeightValue;
 	}
+
 	return;
 }
 
@@ -422,7 +423,6 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 	int sx, sy, sw, sh, dx, dy, dw, dh;
 	int calc_w, calc_h;
 	int antialias = 0;
-	int need_center = winwid->had_resize;
 
 	if (!winwid->full_screen && resize) {
 		winwidget_resize(winwid, winwid->im_w, winwid->im_h, 0);
@@ -438,6 +438,9 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 	D(("winwidget_render_image resize %d force_alias %d im %dx%d\n",
 	      resize, force_alias, winwid->im_w, winwid->im_h));
 
+	/* winwidget_setup_pixmaps(winwid) resets the winwid->had_resize flag */
+	int had_resize = winwid->had_resize || resize;
+
 	winwidget_setup_pixmaps(winwid);
 
 	if (!winwid->full_screen && ((gib_imlib_image_has_alpha(winwid->im))
@@ -447,110 +450,19 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 				     || (winwid->has_rotated)))
 		feh_draw_checks(winwid);
 
-	if (!winwid->full_screen && opt.zoom_mode && (winwid->type != WIN_TYPE_THUMBNAIL)
-				&& (winwid->zoom == 1.0) && ! (opt.geom_flags & (WidthValue | HeightValue))
-				&& (winwid->w > winwid->im_w) && (winwid->h > winwid->im_h))
-		feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, winwid->w, winwid->h);
+	if (had_resize && !opt.keep_zoom_vp && (winwid->type != WIN_TYPE_THUMBNAIL)) {
+		double required_zoom = 1.0;
+		feh_calc_needed_zoom(&required_zoom, winwid->im_w, winwid->im_h, winwid->w, winwid->h);
 
-	/*
-	 * In case of a resize, the geomflags (and im_w, im_h) get updated by
-	 * the ConfigureNotify handler.
-	 */
-	if (need_center && !winwid->full_screen && (winwid->type != WIN_TYPE_THUMBNAIL)
-				&& (opt.geom_flags & (WidthValue | HeightValue))
-				&& ((winwid->w < winwid->im_w) || (winwid->h < winwid->im_h)))
-		feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, winwid->w, winwid->h);
+		winwid->zoom = opt.default_zoom ? (0.01 * opt.default_zoom) : 1.0;
 
+		if ((opt.scale_down || (winwid->full_screen && !opt.default_zoom))
+				&& winwid->zoom > required_zoom)
+			winwid->zoom = required_zoom;
+		else if ((opt.zoom_mode && required_zoom > 1)
+				&& (!opt.default_zoom || required_zoom < winwid->zoom))
+			winwid->zoom = required_zoom;
 
-	if (resize && (winwid->type != WIN_TYPE_THUMBNAIL) &&
-			(winwid->full_screen || (opt.geom_flags & (WidthValue | HeightValue)))) {
-		int smaller;	/* Is the image smaller than screen? */
-		int max_w = 0, max_h = 0;
-
-		if (winwid->full_screen) {
-			max_w = scr->width;
-			max_h = scr->height;
-#ifdef HAVE_LIBXINERAMA
-			if (opt.xinerama && xinerama_screens) {
-				max_w = xinerama_screens[xinerama_screen].width;
-				max_h = xinerama_screens[xinerama_screen].height;
-			}
-#endif				/* HAVE_LIBXINERAMA */
-		} else {
-			if (opt.geom_flags & WidthValue) {
-				max_w = opt.geom_w;
-			}
-			if (opt.geom_flags & HeightValue) {
-				max_h = opt.geom_h;
-			}
-		}
-
-		D(("Calculating for fullscreen/fixed geom render\n"));
-		smaller = ((winwid->im_w < max_w)
-			   && (winwid->im_h < max_h));
-
-		if (!smaller || opt.zoom_mode) {
-			/* contributed by Jens Laas <jens.laas@data.slu.se>
-			 * What it does:
-			 * zooms images by a fixed amount but never larger than the screen.
-			 *
-			 * Why:
-			 * This is nice if you got a collection of images where some
-			 * are small and can stand a small zoom. Large images are unaffected.
-			 *
-			 * When does it work, and how?
-			 * You have to be in fullscreen mode _and_ have auto-zoom turned on.
-			 *   "feh -FZ --zoom 130 imagefile" will do the trick.
-			 *        -zoom percent - the new switch.
-			 *                        100 = orignal size,
-			 *                        130 is 30% larger.
-			 */
-			if (opt.default_zoom) {
-				double old_zoom = winwid->zoom;
-
-				winwid->zoom = 0.01 * opt.default_zoom;
-				if (opt.default_zoom != 100) {
-					if ((winwid->im_h * winwid->zoom) > max_h)
-						winwid->zoom = old_zoom;
-					else if ((winwid->im_w * winwid->zoom) > max_w)
-						winwid->zoom = old_zoom;
-				}
-
-				winwid->im_x = ((int)
-						(max_w - (winwid->im_w * winwid->zoom))) >> 1;
-				winwid->im_y = ((int)
-						(max_h - (winwid->im_h * winwid->zoom))) >> 1;
-			} else {
-				/* Image is larger than the screen (so wants shrinking), or it's
-				   smaller but wants expanding to fill it */
-				double ratio = feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, max_w, max_h);
-
-				if (ratio > 1.0) {
-					/* height is the factor */
-					winwid->im_x = 0;
-					winwid->im_y = ((int)
-							(max_h - (winwid->im_h * winwid->zoom))) >> 1;
-				} else {
-					/* width is the factor */
-					winwid->im_x = ((int)
-							(max_w - (winwid->im_w * winwid->zoom))) >> 1;
-					winwid->im_y = 0;
-				}
-			}
-		} else {
-			/* my modification to jens hack, allow --zoom without auto-zoom mode */
-			if (opt.default_zoom) {
-				winwid->zoom = 0.01 * opt.default_zoom;
-			} else {
-				winwid->zoom = 1.0;
-			}
-			/* Just center the image in the window */
-			winwid->im_x = (int) (max_w - (winwid->im_w * winwid->zoom)) >> 1;
-			winwid->im_y = (int) (max_h - (winwid->im_h * winwid->zoom)) >> 1;
-		}
-	}
-	else if (need_center && !winwid->full_screen
-			&& (winwid->type != WIN_TYPE_THUMBNAIL) && !opt.keep_zoom_vp) {
 		winwid->im_x = (int) (winwid->w - (winwid->im_w * winwid->zoom)) >> 1;
 		winwid->im_y = (int) (winwid->h - (winwid->im_h * winwid->zoom)) >> 1;
 	}
@@ -564,7 +476,7 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 	 * solution considering a future refactoring of this function.
 	 */
 
-	if (need_center || resize) {
+	if (had_resize) {
 		if ((opt.offset_flags & XValue) && (winwid->im_w * winwid->zoom) > winwid->w) {
 			if (opt.offset_flags & XNegative) {
 				winwid->im_x = winwid->w - (winwid->im_w * winwid->zoom) - opt.offset_x;
@@ -581,6 +493,11 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 		}
 	}
 
+	winwid->had_resize = 0;
+
+	if (opt.keep_zoom_vp)
+		winwidget_sanitise_offsets(winwid);
+
 	/* Now we ensure only to render the area we're looking at */
 	dx = winwid->im_x;
 	dy = winwid->im_y;
-- 
cgit v1.2.3


From acada1a7153a43f4fd18cfb15ac7b0278e0d4727 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Fri, 9 Mar 2018 16:21:06 +0100
Subject: Allow empty string as --geometry argument

Passing an empty string to the --geometry option will enable fixed geometry mode without having to specify anything else
---
 src/options.c   | 1 +
 src/options.h   | 1 +
 src/winwidget.c | 2 +-
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/options.c b/src/options.c
index bc95604..1e75c6b 100644
--- a/src/options.c
+++ b/src/options.c
@@ -592,6 +592,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
 				opt.filelistfile = estrdup(optarg);
 			break;
 		case 'g':
+			opt.geom_enabled = 1;
 			opt.geom_flags = XParseGeometry(optarg, &opt.geom_x,
 					&opt.geom_y, &opt.geom_w, &opt.geom_h);
 			break;
diff --git a/src/options.h b/src/options.h
index ed8641a..6ad8a44 100644
--- a/src/options.h
+++ b/src/options.h
@@ -106,6 +106,7 @@ struct __fehoptions {
 	int sort;
 	int version_sort;
 	int debug;
+	int geom_enabled;
 	int geom_flags;
 	int geom_x;
 	int geom_y;
diff --git a/src/winwidget.c b/src/winwidget.c
index a8bcc0a..1ce7e61 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -323,7 +323,7 @@ void winwidget_create_window(winwidget ret, int w, int h)
 	winwidget_register(ret);
 
 	/* do not scale down a thumbnail list window, only those created from it */
-	if (opt.scale_down && (ret->type != WIN_TYPE_THUMBNAIL)) {
+	if (opt.geom_enabled && (ret->type != WIN_TYPE_THUMBNAIL)) {
 		opt.geom_w = w;
 		opt.geom_h = h;
 		opt.geom_flags |= WidthValue | HeightValue;
-- 
cgit v1.2.3


From 4f347623187269bf959d8cfe1ee70da1c8262d33 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Thu, 11 Jan 2018 10:51:43 +0100
Subject: Fix draw checks condition

---
 src/winwidget.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 1ce7e61..a928a18 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -445,8 +445,9 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 
 	if (!winwid->full_screen && ((gib_imlib_image_has_alpha(winwid->im))
 				     || (opt.geom_flags & (WidthValue | HeightValue))
-				     || (winwid->im_x || winwid->im_y) || (winwid->zoom != 1.0)
-				     || (winwid->w > winwid->im_w || winwid->h > winwid->im_h)
+				     || (winwid->im_x || winwid->im_y)
+				     || (winwid->w > winwid->im_w * winwid->zoom)
+				     || (winwid->h > winwid->im_h * winwid->zoom)
 				     || (winwid->has_rotated)))
 		feh_draw_checks(winwid);
 
-- 
cgit v1.2.3


From 81d0a386e27d044987308a1a66a1a623175fbc4a Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Thu, 11 Jan 2018 10:52:55 +0100
Subject: Run draw checks after zoom calculation

---
 src/winwidget.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index a928a18..7ac641a 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -443,14 +443,6 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 
 	winwidget_setup_pixmaps(winwid);
 
-	if (!winwid->full_screen && ((gib_imlib_image_has_alpha(winwid->im))
-				     || (opt.geom_flags & (WidthValue | HeightValue))
-				     || (winwid->im_x || winwid->im_y)
-				     || (winwid->w > winwid->im_w * winwid->zoom)
-				     || (winwid->h > winwid->im_h * winwid->zoom)
-				     || (winwid->has_rotated)))
-		feh_draw_checks(winwid);
-
 	if (had_resize && !opt.keep_zoom_vp && (winwid->type != WIN_TYPE_THUMBNAIL)) {
 		double required_zoom = 1.0;
 		feh_calc_needed_zoom(&required_zoom, winwid->im_w, winwid->im_h, winwid->w, winwid->h);
@@ -499,6 +491,14 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 	if (opt.keep_zoom_vp)
 		winwidget_sanitise_offsets(winwid);
 
+	if (!winwid->full_screen && ((gib_imlib_image_has_alpha(winwid->im))
+				     || (opt.geom_flags & (WidthValue | HeightValue))
+				     || (winwid->im_x || winwid->im_y)
+				     || (winwid->w > winwid->im_w * winwid->zoom)
+				     || (winwid->h > winwid->im_h * winwid->zoom)
+				     || (winwid->has_rotated)))
+		feh_draw_checks(winwid);
+
 	/* Now we ensure only to render the area we're looking at */
 	dx = winwid->im_x;
 	dy = winwid->im_y;
-- 
cgit v1.2.3


From 6407071aa3d4a213565b0e47fc14c06848a7d582 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Thu, 11 Jan 2018 10:59:45 +0100
Subject: Remove duplicate bounds checking

---
 src/winwidget.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 7ac641a..917e74d 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -429,12 +429,6 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 		winwidget_reset_image(winwid);
 	}
 
-	/* bounds checks for panning */
-	if (winwid->im_x > winwid->w)
-		winwid->im_x = winwid->w;
-	if (winwid->im_y > winwid->h)
-		winwid->im_y = winwid->h;
-
 	D(("winwidget_render_image resize %d force_alias %d im %dx%d\n",
 	      resize, force_alias, winwid->im_w, winwid->im_h));
 
-- 
cgit v1.2.3


From 30c40b7e7fc573e1bda6264c507e4883791a1c05 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Fri, 29 Dec 2017 12:34:48 +0100
Subject: Fix window auto-resize with --keep-zoom-vp enabled

--keep-zoom-vp will no longer block the dynamic window resizing mechanism.
---
 src/slideshow.c | 10 ++--------
 src/winwidget.c |  3 ++-
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/src/slideshow.c b/src/slideshow.c
index effdcaf..071cb29 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -223,10 +223,8 @@ void feh_reload_image(winwidget w, int resize, int force_new)
 		w->im_x = tim_x;
 		w->im_y = tim_y;
 		w->zoom = tzoom;
-		winwidget_render_image(w, 0, 0);
-	} else {
-		winwidget_render_image(w, resize, 0);
 	}
+	winwidget_render_image(w, resize, 0);
 
 	return;
 }
@@ -386,11 +384,7 @@ void slideshow_change_image(winwidget winwid, int change, int render)
 				winwid->zoom = tzoom;
 			}
 			if (render) {
-				if (opt.keep_zoom_vp) {
-					winwidget_render_image(winwid, 0, 0);
-				} else {
-					winwidget_render_image(winwid, 1, 0);
-				}
+				winwidget_render_image(winwid, 1, 0);
 			}
 			break;
 		} else
diff --git a/src/winwidget.c b/src/winwidget.c
index 917e74d..3c90b57 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -426,7 +426,8 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 
 	if (!winwid->full_screen && resize) {
 		winwidget_resize(winwid, winwid->im_w, winwid->im_h, 0);
-		winwidget_reset_image(winwid);
+		if (!opt.keep_zoom_vp)
+			winwidget_reset_image(winwid);
 	}
 
 	D(("winwidget_render_image resize %d force_alias %d im %dx%d\n",
-- 
cgit v1.2.3


From d9c1cab85af4107cde67a2aba5657fc0b680f852 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Fri, 12 Jan 2018 17:59:40 +0100
Subject: Fix --screen-clip window dimension calculation

---
 src/winwidget.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 3c90b57..576ff58 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -820,8 +820,12 @@ void winwidget_resize(winwidget winwid, int w, int h, int force_resize)
 	if (winwid && ((winwid->w != w) || (winwid->h != h))) {
 		/* winwidget_clear_background(winwid); */
 		if (opt.screen_clip) {
-            winwid->w = (w > scr_width) ? scr_width : w;
-            winwid->h = (h > scr_height) ? scr_height : h;
+			double required_zoom = 1.0;
+			int max_w = (w > scr_width) ? scr_width : w;
+			int max_h = (h > scr_height) ? scr_height : h;
+			feh_calc_needed_zoom(&required_zoom, winwid->im_w, winwid->im_h, max_w, max_h);
+			winwid->w = winwid->im_w * required_zoom;
+			winwid->h = winwid->im_h * required_zoom;
 		}
 		if (winwid->full_screen) {
             XTranslateCoordinates(disp, winwid->win, attributes.root,
-- 
cgit v1.2.3


From b71d8407eea710d654438f423b6f56eb323ee5d2 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Wed, 17 Jan 2018 09:45:09 +0100
Subject: Remove unused code

---
 src/winwidget.c | 8 --------
 src/winwidget.h | 1 -
 2 files changed, 9 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 576ff58..39d7d7b 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -645,13 +645,6 @@ Pixmap feh_create_checks(void)
 	return(checks_pmap);
 }
 
-void winwidget_clear_background(winwidget w)
-{
-	XSetWindowBackgroundPixmap(disp, w->win, feh_create_checks());
-	/* XClearWindow(disp, w->win); */
-	return;
-}
-
 void feh_draw_checks(winwidget win)
 {
 	static GC gc = None;
@@ -818,7 +811,6 @@ void winwidget_resize(winwidget winwid, int w, int h, int force_resize)
         return;
     }
 	if (winwid && ((winwid->w != w) || (winwid->h != h))) {
-		/* winwidget_clear_background(winwid); */
 		if (opt.screen_clip) {
 			double required_zoom = 1.0;
 			int max_w = (w > scr_width) ? scr_width : w;
diff --git a/src/winwidget.h b/src/winwidget.h
index dd8489a..280c977 100644
--- a/src/winwidget.h
+++ b/src/winwidget.h
@@ -146,7 +146,6 @@ winwidget winwidget_create_from_image(Imlib_Image im, char type);
 void winwidget_rename(winwidget winwid, char *newname);
 void winwidget_destroy(winwidget winwid);
 void winwidget_create_window(winwidget ret, int w, int h);
-void winwidget_clear_background(winwidget w);
 Pixmap feh_create_checks(void);
 double feh_calc_needed_zoom(double *zoom, int orig_w, int orig_h, int dest_w, int dest_h);
 void feh_debug_print_winwid(winwidget winwid);
-- 
cgit v1.2.3


From f111cef018432cd12d9989c4f8b4ecd3dfa186bb Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Wed, 17 Jan 2018 09:57:36 +0100
Subject: Fix indentation

---
 src/winwidget.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 39d7d7b..1ea6e9c 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -806,10 +806,10 @@ void winwidget_resize(winwidget winwid, int w, int h, int force_resize)
 	D(("   x %d y %d w %d h %d\n", attributes.x, attributes.y, winwid->w,
 		winwid->h));
 
-    if ((opt.geom_flags & (WidthValue | HeightValue)) && !force_resize) {
-        winwid->had_resize = 1;
-        return;
-    }
+	if ((opt.geom_flags & (WidthValue | HeightValue)) && !force_resize) {
+		winwid->had_resize = 1;
+		return;
+	}
 	if (winwid && ((winwid->w != w) || (winwid->h != h))) {
 		if (opt.screen_clip) {
 			double required_zoom = 1.0;
@@ -820,13 +820,12 @@ void winwidget_resize(winwidget winwid, int w, int h, int force_resize)
 			winwid->h = winwid->im_h * required_zoom;
 		}
 		if (winwid->full_screen) {
-            XTranslateCoordinates(disp, winwid->win, attributes.root,
-                        -attributes.border_width -
-                        attributes.x,
-                        -attributes.border_width - attributes.y, &tc_x, &tc_y, &dw);
-            winwid->x = tc_x;
-            winwid->y = tc_y;
-            XMoveResizeWindow(disp, winwid->win, tc_x, tc_y, winwid->w, winwid->h);
+			XTranslateCoordinates(disp, winwid->win, attributes.root,
+						-attributes.border_width - attributes.x,
+						-attributes.border_width - attributes.y, &tc_x, &tc_y, &dw);
+			winwid->x = tc_x;
+			winwid->y = tc_y;
+			XMoveResizeWindow(disp, winwid->win, tc_x, tc_y, winwid->w, winwid->h);
 		} else
 			XResizeWindow(disp, winwid->win, winwid->w, winwid->h);
 
-- 
cgit v1.2.3


From 0235156ba92bff1f9b023a2fd91540bfca66ce1b Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Thu, 25 Jan 2018 15:03:45 +0100
Subject: Simplify --keep-zoom-vp handling

---
 src/slideshow.c | 37 -------------------------------------
 src/winwidget.c | 13 +++++++------
 2 files changed, 7 insertions(+), 43 deletions(-)

diff --git a/src/slideshow.c b/src/slideshow.c
index 071cb29..f3860ed 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -143,16 +143,6 @@ void feh_reload_image(winwidget w, int resize, int force_new)
 	Imlib_Image tmp;
 	int old_w, old_h;
 
-	unsigned char tmode =0;
-	int tim_x =0;
-	int tim_y =0;
-	double tzoom =0;
-
-	tmode = w->mode;
-	tim_x = w->im_x;
-	tim_y = w->im_y;
-	tzoom = w->zoom;
-
 	if (!w->file) {
 		im_weprintf(w, "couldn't reload, this image has no file associated with it.");
 		winwidget_render_image(w, 0, 0);
@@ -217,13 +207,6 @@ void feh_reload_image(winwidget w, int resize, int force_new)
 		w->im_w = gib_imlib_image_get_width(w->im);
 		w->im_h = gib_imlib_image_get_height(w->im);
 	}
-	if (opt.keep_zoom_vp) {
-		/* put back in: */
-		w->mode = tmode;
-		w->im_x = tim_x;
-		w->im_y = tim_y;
-		w->zoom = tzoom;
-	}
 	winwidget_render_image(w, resize, 0);
 
 	return;
@@ -239,11 +222,6 @@ void slideshow_change_image(winwidget winwid, int change, int render)
 	 */
 	int our_filelist_len = filelist_len;
 
-	unsigned char tmode =0;
-	int tim_x =0;
-	int tim_y =0;
-	double tzoom =0;
-
 	/* Without this, clicking a one-image slideshow reloads it. Not very *
 	   intelligent behaviour :-) */
 	if (filelist_len < 2 && opt.cycle_once == 0)
@@ -354,14 +332,6 @@ void slideshow_change_image(winwidget winwid, int change, int render)
 			last = NULL;
 		}
 
-		if (opt.keep_zoom_vp) {
-		/* pre loadimage - record settings */
-			tmode = winwid->mode;
-			tim_x = winwid->im_x;
-			tim_y = winwid->im_y;
-			tzoom = winwid->zoom;
-		}
-
 		if (winwidget_loadimage(winwid, FEH_FILE(current_file->data))) {
 			int w = gib_imlib_image_get_width(winwid->im);
 			int h = gib_imlib_image_get_height(winwid->im);
@@ -376,13 +346,6 @@ void slideshow_change_image(winwidget winwid, int change, int render)
 			winwidget_reset_image(winwid);
 			winwid->im_w = w;
 			winwid->im_h = h;
-			if (opt.keep_zoom_vp) {
-				/* put back in: */
-				winwid->mode = tmode;
-				winwid->im_x = tim_x;
-				winwid->im_y = tim_y;
-				winwid->zoom = tzoom;
-			}
 			if (render) {
 				winwidget_render_image(winwid, 1, 0);
 			}
diff --git a/src/winwidget.c b/src/winwidget.c
index 1ea6e9c..03aa9e8 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -426,8 +426,7 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 
 	if (!winwid->full_screen && resize) {
 		winwidget_resize(winwid, winwid->im_w, winwid->im_h, 0);
-		if (!opt.keep_zoom_vp)
-			winwidget_reset_image(winwid);
+		winwidget_reset_image(winwid);
 	}
 
 	D(("winwidget_render_image resize %d force_alias %d im %dx%d\n",
@@ -953,10 +952,12 @@ void feh_debug_print_winwid(winwidget w)
 
 void winwidget_reset_image(winwidget winwid)
 {
-	winwid->zoom = 1.0;
-	winwid->old_zoom = 1.0;
-	winwid->im_x = 0;
-	winwid->im_y = 0;
+	if (!opt.keep_zoom_vp) {
+		winwid->zoom = 1.0;
+		winwid->old_zoom = 1.0;
+		winwid->im_x = 0;
+		winwid->im_y = 0;
+	}
 	winwid->im_angle = 0.0;
 	winwid->has_rotated = 0;
 	return;
-- 
cgit v1.2.3


From 701cf1377fa37a1d0c6556eeaf12118c73f4f841 Mon Sep 17 00:00:00 2001
From: ulteq <ulteq@web.de>
Date: Sat, 10 Mar 2018 21:28:32 +0100
Subject: Adapt the new --offset option

---
 src/winwidget.c | 22 ++++++----------------
 1 file changed, 6 insertions(+), 16 deletions(-)

diff --git a/src/winwidget.c b/src/winwidget.c
index 03aa9e8..4374752 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -450,33 +450,23 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias)
 				&& (!opt.default_zoom || required_zoom < winwid->zoom))
 			winwid->zoom = required_zoom;
 
-		winwid->im_x = (int) (winwid->w - (winwid->im_w * winwid->zoom)) >> 1;
-		winwid->im_y = (int) (winwid->h - (winwid->im_h * winwid->zoom)) >> 1;
-	}
-
-	/*
-	 * Adjust X/Y offset if the image is larger than the window and
-	 * --inner-geometry is set. This will cause odd behaviour when
-	 * zooming an already large image in --inner-geometry mode, but in most
-	 * cases this should be what the user wants. Plus, it doesn't require
-	 * fiddling around in two or three places above, so it's the best
-	 * solution considering a future refactoring of this function.
-	 */
-
-	if (had_resize) {
-		if ((opt.offset_flags & XValue) && (winwid->im_w * winwid->zoom) > winwid->w) {
+		if (opt.offset_flags & XValue) {
 			if (opt.offset_flags & XNegative) {
 				winwid->im_x = winwid->w - (winwid->im_w * winwid->zoom) - opt.offset_x;
 			} else {
 				winwid->im_x = - opt.offset_x * winwid->zoom;
 			}
+		} else {
+			winwid->im_x = (int) (winwid->w - (winwid->im_w * winwid->zoom)) >> 1;
 		}
-		if ((opt.offset_flags & YValue) && (winwid->im_h * winwid->zoom) > winwid->h) {
+		if (opt.offset_flags & YValue) {
 			if (opt.offset_flags & YNegative) {
 				winwid->im_y = winwid->h - (winwid->im_h * winwid->zoom) - opt.offset_y;
 			} else {
 				winwid->im_y = - opt.offset_y * winwid->zoom;
 			}
+		} else {
+			winwid->im_y = (int) (winwid->h - (winwid->im_h * winwid->zoom)) >> 1;
 		}
 	}
 
-- 
cgit v1.2.3