summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2013-02-14 12:12:56 +0100
committerDaniel Friesel <derf@finalrewind.org>2013-02-14 12:12:56 +0100
commit5dfdc0bc15e49f7c091aad123cf1b03f55d936cb (patch)
tree1a5184f1d516aa15b3eedcfb9418b6938888bd10
parentfc11253d85202e8733a709a5acbb8e09358d1054 (diff)
Determine active Xinerama screen by pointer position
-rw-r--r--ChangeLog5
-rw-r--r--src/imlib.c27
-rw-r--r--src/winwidget.c17
3 files changed, 39 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 842c208..bd69368 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+git HEAD
+
+ * Set correct window dimensions on any Xinerama screen, not just the
+ first one (active screen is determined by current pointer location)
+
Wed, 13 Feb 2013 01:46:56 +0100 Daniel Friesel <derf+feh@finalrewind.org>
* Release v2.9
diff --git a/src/imlib.c b/src/imlib.c
index 2425050..5514a34 100644
--- a/src/imlib.c
+++ b/src/imlib.c
@@ -68,13 +68,32 @@ static char *feh_magick_load_image(char *filename);
void init_xinerama(void)
{
if (opt.xinerama && XineramaIsActive(disp)) {
- int major, minor;
+ int major, minor, px, py, i;
+
+ /* discarded */
+ Window dw;
+ int di;
+ unsigned int du;
+
+ XineramaQueryVersion(disp, &major, &minor);
+ xinerama_screens = XineramaQueryScreens(disp, &num_xinerama_screens);
+
if (getenv("XINERAMA_SCREEN"))
xinerama_screen = atoi(getenv("XINERAMA_SCREEN"));
- else
+ else {
xinerama_screen = 0;
- XineramaQueryVersion(disp, &major, &minor);
- xinerama_screens = XineramaQueryScreens(disp, &num_xinerama_screens);
+ XQueryPointer(disp, root, &dw, &dw, &px, &py, &di, &di, &du);
+ for (i = 0; i < num_xinerama_screens; i++) {
+ if (XY_IN_RECT(px, py,
+ xinerama_screens[i].x_org,
+ xinerama_screens[i].y_org,
+ xinerama_screens[i].width,
+ xinerama_screens[i].height)) {
+ xinerama_screen = i;
+ break;
+ }
+ }
+ }
}
}
#endif /* HAVE_LIBXINERAMA */
diff --git a/src/winwidget.c b/src/winwidget.c
index 2f543df..ada4c02 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -780,23 +780,28 @@ void winwidget_move(winwidget winwid, int x, int y)
void winwidget_resize(winwidget winwid, int w, int h)
{
- Window ignored_window;
XWindowAttributes attributes;
- int tc_x, tc_y;
+ int tc_x, tc_y, px, py;
int scr_width = scr->width;
int scr_height = scr->height;
+ /* discarded */
+ Window dw;
+ int di, i;
+ unsigned int du;
+
XGetWindowAttributes(disp, winwid->win, &attributes);
#ifdef HAVE_LIBXINERAMA
if (opt.xinerama && xinerama_screens) {
- int i;
xinerama_screen = 0;
+ XQueryPointer(disp, root, &dw, &dw, &px, &py, &di, &di, &du);
for (i = 0; i < num_xinerama_screens; i++) {
- if (XY_IN_RECT(attributes.x, attributes.y,
+ if (XY_IN_RECT(px, py,
xinerama_screens[i].x_org,
xinerama_screens[i].y_org,
- xinerama_screens[i].width, xinerama_screens[i].height)) {
+ xinerama_screens[i].width,
+ xinerama_screens[i].height)) {
xinerama_screen = i;
break;
}
@@ -828,7 +833,7 @@ void winwidget_resize(winwidget winwid, int w, int h)
XTranslateCoordinates(disp, winwid->win, attributes.root,
-attributes.border_width -
attributes.x,
- -attributes.border_width - attributes.y, &tc_x, &tc_y, &ignored_window);
+ -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);