summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-08-30 09:29:05 +0200
committerDaniel Friesel <derf@finalrewind.org>2011-08-30 09:37:22 +0200
commit13bb86700ef0eecbc013bd19215ef0f013fe8bc3 (patch)
tree2a238446f2f7dd44324985fefb17a4251016dbef
parent3d9b852526a0971df97807478b58a50d355a63b9 (diff)
winwidget.c: resize: Fix non-fulllscreen Xinerama issues on screens =! 1 (see #5)
-rw-r--r--ChangeLog2
-rw-r--r--man/feh.pre4
-rw-r--r--src/winwidget.c45
3 files changed, 26 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 38de6aa..f74415a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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"));