Unverified Commit 0672ef6d authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

another attempt at fixing flicker in tiling --scale-down images

Heuristic: if the first event we receive after mapping a window is a
resize, we're likely running under control of a tiling window manager.
Set fixed-geometry mode to avoid future resize operations (and thus flicker).
parent 2635bad2
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -207,6 +207,8 @@ static void feh_event_handle_ButtonPress(XEvent * ev)
		return;
	}

	winwid->just_mapped = 0;

	state = ev->xbutton.state & (ControlMask | ShiftMask | Mod1Mask | Mod4Mask);
	button = ev->xbutton.button;

@@ -440,7 +442,19 @@ void feh_event_handle_ConfigureNotify(XEvent * ev)
					opt.geom_h = w->h;
				}
				winwidget_render_image(w, 0, 0);
				if (w->just_mapped) {
					/*
					 * Looks like we're being adjusted by a tiling window manager.
					 * Set fixed geometry so that we will not make further (futile) resize attempts.
					 * This avoids flickering during image changes when feh is running in a tiling window.
					 * It's still kind of an ugly workaround.
					 */
					D(("Environment looks like a tiling window manager -- setting fixed geometry mode\n"));
					opt.geom_enabled = 1;
					opt.geom_flags |= WidthValue | HeightValue;
				}
			}
			w->just_mapped = 0;
		}
	}

@@ -567,6 +581,7 @@ static void feh_event_handle_MotionNotify(XEvent * ev)
					- (winwid->im_click_offset_y * winwid->zoom);

			winwidget_render_image(winwid, 0, 1);
			winwid->just_mapped = 0;
		}
	} else if ((opt.mode == MODE_PAN) || (opt.mode == MODE_NEXT)) {
		int orig_x, orig_y;
@@ -634,6 +649,7 @@ static void feh_event_handle_MotionNotify(XEvent * ev)
			if ((winwid->im_x != orig_x)
					|| (winwid->im_y != orig_y))
				winwidget_render_image(winwid, 0, 1);
			winwid->just_mapped = 0;
		}
	} else if (opt.mode == MODE_ROTATE) {
		while (XCheckTypedWindowEvent(disp, ev->xmotion.window, MotionNotify, ev));
@@ -656,6 +672,7 @@ static void feh_event_handle_MotionNotify(XEvent * ev)
			winwid->im_angle = (ev->xmotion.x - winwid->w / 2) / ((double) winwid->w / 2) * 3.1415926535;
			D(("angle: %f\n", winwid->im_angle));
			winwidget_render_image(winwid, 0, 1);
			winwid->just_mapped = 0;
		}
	} else if (opt.mode == MODE_BLUR) {
		while (XCheckTypedWindowEvent(disp, ev->xmotion.window, MotionNotify, ev));
@@ -680,6 +697,7 @@ static void feh_event_handle_MotionNotify(XEvent * ev)
				gib_imlib_free_image_and_decache(winwid->im);
				winwid->im = ptr;
			}
			winwid->just_mapped = 0;
		}
	} else {
		while (XCheckTypedWindowEvent(disp, ev->xmotion.window, MotionNotify, ev));
@@ -696,6 +714,7 @@ static void feh_event_handle_MotionNotify(XEvent * ev)
			} else {
				feh_event_handle_generic(winwid, ev->xmotion.state | Mod3Mask, NoSymbol, 0, NULL, 0);
			}
			winwid->just_mapped = 0;
		}
	}
	return;
+2 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ static winwidget winwidget_allocate(void)
	ret->click_offset_x = 0;
	ret->click_offset_y = 0;
	ret->has_rotated = 0;
	ret->just_mapped = 0;

#ifdef HAVE_INOTIFY
    ret->inotify_wd = -1;
@@ -881,6 +882,7 @@ void winwidget_show(winwidget winwid)
		if (ev.type == ConfigureNotify)
			feh_event_handle_ConfigureNotify(&ev);
		D(("Window mapped\n"));
		winwid->just_mapped = 1;
		winwid->visible = 1;
	}
	return;
+1 −0
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ struct __winwidget {
	time_t click_start_time;

	unsigned char has_rotated;
	unsigned char just_mapped;

#ifdef HAVE_INOTIFY
	int inotify_wd;