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")); |