X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fextensions.c;h=ddcb83bbf8c70976914550c26777ddcb21bf69c6;hb=34e819738b344a992a1dbfd6cdd165e0c8ddb3a9;hp=be1ac5470679d3cb8247a21694c511e93d0e2d3e;hpb=d0abbec2e522119c0865f668b094c60a1712e24f;p=chaz%2Fopenbox diff --git a/openbox/extensions.c b/openbox/extensions.c index be1ac547..ddcb83bb 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; @@ -7,6 +9,7 @@ gboolean extensions_shape = FALSE; int extensions_shape_event_basep; gboolean extensions_xinerama = FALSE; int extensions_xinerama_event_basep; +gboolean extensions_xinerama_active = FALSE; gboolean extensions_randr = FALSE; int extensions_randr_event_basep; gboolean extensions_vidmode = FALSE; @@ -33,6 +36,7 @@ void extensions_query_all() extensions_xinerama = XineramaQueryExtension(ob_display, &extensions_xinerama_event_basep, &junk); + extensions_xinerama_active = XineramaIsActive(ob_display); #endif #ifdef XRANDR @@ -47,3 +51,40 @@ 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_active) { + 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, + screen_physical_size.width, screen_physical_size.height); + } + + /* 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 = MIN(r, (*xin_areas)[0].x + (*xin_areas)[0].width - 1); + b = MIN(b, (*xin_areas)[0].y + (*xin_areas)[0].height - 1); + } + RECT_SET((*xin_areas)[*nxin], l, t, r - l + 1, b - t + 1); +}