X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fextensions.c;h=ec53e0a77262de89e8d00693c20a9682329b1012;hb=973507ff28b5d71433b3d0583e757fbc82b254c5;hp=be1ac5470679d3cb8247a21694c511e93d0e2d3e;hpb=f26f23de50cb7941a7702198e3b4d1b2f9de062e;p=chaz%2Fopenbox diff --git a/openbox/extensions.c b/openbox/extensions.c index be1ac547..ec53e0a7 100644 --- a/openbox/extensions.c +++ b/openbox/extensions.c @@ -1,5 +1,7 @@ #include "openbox.h" +#include "geom.h" #include "extensions.h" +#include "screen.h" gboolean extensions_xkb = FALSE; int extensions_xkb_event_basep; @@ -32,7 +34,7 @@ void extensions_query_all() #ifdef XINERAMA extensions_xinerama = XineramaQueryExtension(ob_display, &extensions_xinerama_event_basep, - &junk); + &junk) && XineramaIsActive(ob_display); #endif #ifdef XRANDR @@ -47,3 +49,41 @@ void extensions_query_all() &junk); #endif } + +void extensions_xinerama_screens(Rect **xin_areas, guint *nxin) +{ + guint i; + gint l, r, t, b; +#ifdef XINERAMA + if (extensions_xinerama) { + guint i; + gint n; + XineramaScreenInfo *info = XineramaQueryScreens(ob_display, &n); + *nxin = n; + *xin_areas = g_new(Rect, *nxin + 1); + for (i = 0; i < *nxin; ++i) + RECT_SET((*xin_areas)[i], info[i].x_org, info[i].y_org, + info[i].width, info[i].height); + } else +#endif + { + *nxin = 1; + *xin_areas = g_new(Rect, *nxin + 1); + RECT_SET((*xin_areas)[0], 0, 0, + WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen)), + HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen))); + } + + /* returns one extra with the total area in it */ + l = (*xin_areas)[0].x; + t = (*xin_areas)[0].y; + r = (*xin_areas)[0].x + (*xin_areas)[0].width - 1; + b = (*xin_areas)[0].y + (*xin_areas)[0].height - 1; + for (i = 1; i < *nxin; ++i) { + l = MIN(l, (*xin_areas)[i].x); + t = MIN(l, (*xin_areas)[i].y); + r = MAX(r, (*xin_areas)[i].x + (*xin_areas)[i].width - 1); + b = MAX(b, (*xin_areas)[i].y + (*xin_areas)[i].height - 1); + } + RECT_SET((*xin_areas)[*nxin], l, t, r - l + 1, b - t + 1); +}