diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2011-08-30 09:29:05 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2011-08-30 09:37:22 +0200 | 
| commit | 13bb86700ef0eecbc013bd19215ef0f013fe8bc3 (patch) | |
| tree | 2a238446f2f7dd44324985fefb17a4251016dbef | |
| parent | 3d9b852526a0971df97807478b58a50d355a63b9 (diff) | |
winwidget.c: resize: Fix non-fulllscreen Xinerama issues on screens =! 1 (see #5)
| -rw-r--r-- | ChangeLog | 2 | ||||
| -rw-r--r-- | man/feh.pre | 4 | ||||
| -rw-r--r-- | src/winwidget.c | 45 | 
3 files changed, 26 insertions, 25 deletions
| @@ -7,7 +7,7 @@ git HEAD        <https://github.com/derf/feh/issues/60>      * The --collage option (aka collage mode) is now deprecated      * The --filelist option now supports /dev/stdin (or "-" as shortcut) -    * Partial fix for too large windows with Xinerama (only works on screen 0) +    * Several Xinerama fixes, only --fullscreen on screen != 0 is still broken        <https://github.com/derf/feh/issues/5>  Tue, 16 Aug 2011 22:48:06 +0200  Daniel Friesel <derf@finalrewind.org> diff --git a/man/feh.pre b/man/feh.pre index d0579cb..07126a0 100644 --- a/man/feh.pre +++ b/man/feh.pre @@ -1308,9 +1308,9 @@ section.  .  .Sh BUGS  . -Xinerama support does not really work on Xinerama screens != 0.  Set +In a Xinerama setup, fullscreen mode only works properly on screen 0.  Set  .Ev XINERAMA_SCREEN -to the correct number as a workaround. +to the correct screen number or toggle fullscreen off, then on as a workaround.  .  .Pp  . diff --git a/src/winwidget.c b/src/winwidget.c index 5c92655..94e0a53 100644 --- a/src/winwidget.c +++ b/src/winwidget.c @@ -778,26 +778,45 @@ void winwidget_resize(winwidget winwid, int w, int h)  	int scr_width = scr->width;  	int scr_height = scr->height; +	XGetWindowAttributes(disp, winwid->win, &attributes); +  #ifdef HAVE_LIBXINERAMA  	if (opt.xinerama && xinerama_screens) { +		int i; +		xinerama_screen = 0; +		for (i = 0; i < num_xinerama_screens; i++) { +			if (XY_IN_RECT(attributes.x, attributes.y, +						xinerama_screens[i].x_org, +						xinerama_screens[i].y_org, +						xinerama_screens[i].width, xinerama_screens[i].height)) { +				xinerama_screen = i; +				break; +			} + +		} +		if (getenv("XINERAMA_SCREEN")) +			xinerama_screen = atoi(getenv("XINERAMA_SCREEN")); +  		scr_width = xinerama_screens[xinerama_screen].width;  		scr_height = xinerama_screens[xinerama_screen].height;  	}  #endif + +	D(("   x %d y %d w %d h %d\n", attributes.x, attributes.y, winwid->w, +		winwid->h)); +  	if (opt.geom_flags) {  		winwid->had_resize = 1;  		return;  	}  	if (winwid && ((winwid->w != w) || (winwid->h != h))) { -		D(("Really doing a resize\n"));  		/* winwidget_clear_background(winwid); */  		if (opt.screen_clip) {  			winwid->w = (w > scr_width) ? scr_width : w;  			winwid->h = (h > scr_height) ? scr_height : h;  		}  		if (winwid->full_screen) { -			XGetWindowAttributes(disp, winwid->win, &attributes);  			XTranslateCoordinates(disp, winwid->win, attributes.root,  						-attributes.border_width -  						attributes.x, @@ -811,26 +830,8 @@ void winwidget_resize(winwidget winwid, int w, int h)  		winwid->had_resize = 1;  		XFlush(disp); -#ifdef HAVE_LIBXINERAMA -		/* TODO this section _might_ no longer be needed */ -		if (opt.xinerama && xinerama_screens) { -			int i; - -			for (i = 0; i < num_xinerama_screens; i++) { -				xinerama_screen = 0; -				if (XY_IN_RECT(winwid->x, winwid->y, -					       xinerama_screens[i].x_org, -					       xinerama_screens[i].y_org, -					       xinerama_screens[i].width, xinerama_screens[i].height)) { -					xinerama_screen = i; -					break; -				} - -			} -			if (getenv("XINERAMA_SCREEN")) -				xinerama_screen = atoi(getenv("XINERAMA_SCREEN")); -		} -#endif				/* HAVE_LIBXINERAMA */ +		D(("-> x %d y %d w %d h %d\n", winwid->x, winwid->y, winwid->w, +			winwid->h));  	} else {  		D(("No resize actually needed\n")); | 
