diff --git a/configure.ac.in b/configure.ac.in index 73ac0cf653d2848721e51fdb12a61acb787e4a22..d007a256ce638549ae2f07dc4fa03faaf5a434a5 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -96,6 +96,7 @@ XDT_CHECK_PACKAGE([LIBXFCONF], libxfconf-0, [xfconf_minimum_version]) XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-1.0], [wnck_minimum_version]) XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.0.0]) XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.72]) +XDT_CHECK_PACKAGE([XINERAMA], [xinerama], [0]) AS_IF([test "x$USE_MAINTAINER_MODE" = "xyes"], [ diff --git a/src/Makefile.am b/src/Makefile.am index 767b643e08f5822cd400ae2d315f0be3aa4159e1..7b3b96fb6b1ba246e11d6c5c24a57ff16cf54122 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -85,6 +85,7 @@ xfwm4_CFLAGS = \ $(PRESENT_EXTENSION_CFLAGS) \ $(RANDR_CFLAGS) \ $(RENDER_CFLAGS) \ + $(XINERAMA_CFLAGS) \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ -DDATADIR=\"$(datadir)\" \ -DHELPERDIR=\"$(HELPER_PATH_PREFIX)\" \ @@ -106,6 +107,7 @@ xfwm4_LDADD = \ $(PRESENT_EXTENSION_LIBS) \ $(RANDR_LIBS) \ $(RENDER_LIBS) \ + $(XINERAMA_LIBS) \ $(MATH_LIBS) EXTRA_DIST = \ diff --git a/src/client.c b/src/client.c index 6a16971a3bfb935f8eeef2dfb7a269eacab49a9d..3a9d3fa8bdaaf0284a934efa5436ffec59c3181c 100644 --- a/src/client.c +++ b/src/client.c @@ -2995,10 +2995,11 @@ clientUpdateFullscreenSize (Client *c) { if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREN_MONITORS)) { - gdk_screen_get_monitor_geometry (screen_info->gscr, c->fullscreen_monitors[0], &rect); + /* Monitor numbering is from Xinerama */ + myScreenGetXineramaMonitorGeometry (screen_info, c->fullscreen_monitors[0], &rect); for (i = 1; i < 4; i++) { - gdk_screen_get_monitor_geometry (screen_info->gscr, c->fullscreen_monitors[i], &monitor); + myScreenGetXineramaMonitorGeometry (screen_info, c->fullscreen_monitors[i], &monitor); gdk_rectangle_union (&rect, &monitor, &rect); } } diff --git a/src/screen.c b/src/screen.c index d5c7266e8d6097c41c735087f38efee1cf5b24de..fc7c6085deb33b543b9a272f960860f81c619f40 100644 --- a/src/screen.c +++ b/src/screen.c @@ -27,6 +27,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/extensions/shape.h> +#include <X11/extensions/Xinerama.h> #include <glib.h> #include <gdk/gdk.h> #include <gdk/gdkx.h> @@ -815,6 +816,31 @@ myScreenFindMonitorAtPoint (ScreenInfo *screen_info, gint x, gint y, GdkRectangl *rect = screen_info->cache_monitor; } +void +myScreenGetXineramaMonitorGeometry (ScreenInfo *screen_info, gint monitor_num, GdkRectangle *rect) +{ + XineramaScreenInfo *infos; + int n; + + g_return_if_fail (screen_info != NULL); + g_return_if_fail (rect != NULL); + g_return_if_fail (XineramaIsActive (myScreenGetXDisplay (screen_info))); + + infos = XineramaQueryScreens (myScreenGetXDisplay (screen_info), &n); + if (infos == NULL || n <= 0 || monitor_num < n || monitor_num > n) + { + XFree (infos); + return; + } + + rect->x = infos[monitor_num].x_org; + rect->y = infos[monitor_num].y_org; + rect->width = infos[monitor_num].width; + rect->height = infos[monitor_num].height; + + XFree (infos); +} + gboolean myScreenUpdateFontHeight (ScreenInfo *screen_info) { @@ -843,3 +869,4 @@ myScreenUpdateFontHeight (ScreenInfo *screen_info) return FALSE; } + diff --git a/src/screen.h b/src/screen.h index 2f19057898f9403be15d64729fcedfc84a69eaaa..1309092305d5811a52fc7a83a8c824136ebb4800 100644 --- a/src/screen.h +++ b/src/screen.h @@ -274,5 +274,7 @@ void myScreenFindMonitorAtPoint (ScreenInfo *, gint, GdkRectangle *); gboolean myScreenUpdateFontHeight (ScreenInfo *); - +void myScreenGetXineramaMonitorGeometry (ScreenInfo *, + gint, + GdkRectangle *); #endif /* INC_SCREEN_H */