X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fgeom.h;h=8e50834bc7084420e79840b09b02577ae5630a18;hb=HEAD;hp=7c5ee32e31047643cbe0544072f0f419d3874967;hpb=1124d1036984f920dcd5b2caec9ff8fe2d788b8a;p=chaz%2Fopenbox diff --git a/openbox/geom.h b/openbox/geom.h index 7c5ee32e..8e50834b 100644 --- a/openbox/geom.h +++ b/openbox/geom.h @@ -24,6 +24,7 @@ typedef struct _GravityCoord { gint pos; + gint denom; gboolean center; gboolean opposite; } GravityCoord; @@ -64,6 +65,8 @@ typedef struct _Rect { #define RECT_RIGHT(r) ((r).x + (r).width - 1) #define RECT_BOTTOM(r) ((r).y + (r).height - 1) +#define RECT_AREA(r) ((r).width * (r).height) + #define RECT_SET_POINT(r, nx, ny) \ (r).x = (nx), (r).y = (ny) #define RECT_SET_SIZE(r, w, h) \ @@ -101,6 +104,25 @@ typedef struct _Rect { (r).height = MIN((a).y + (a).height - 1, \ (b).y + (b).height - 1) - (r).y + 1) +/* Returns the shortest manhatten distance between two rects, or 0 if they + intersect. */ +static inline gint rect_manhatten_distance(Rect r, Rect o) +{ + if (RECT_INTERSECTS_RECT(r, o)) + return 0; + + gint min_distance = G_MAXINT; + if (RECT_RIGHT(o) < RECT_LEFT(r)) + min_distance = MIN(min_distance, RECT_LEFT(r) - RECT_RIGHT(o)); + if (RECT_LEFT(o) > RECT_RIGHT(r)) + min_distance = MIN(min_distance, RECT_LEFT(o) - RECT_RIGHT(r)); + if (RECT_BOTTOM(o) < RECT_TOP(r)) + min_distance = MIN(min_distance, RECT_TOP(r) - RECT_BOTTOM(o)); + if (RECT_TOP(o) > RECT_BOTTOM(r)) + min_distance = MIN(min_distance, RECT_TOP(o) - RECT_BOTTOM(r)); + return min_distance; +} + typedef struct _Strut { int left; int top; @@ -160,6 +182,6 @@ typedef struct _StrutPartial { (s1).bottom_end == (s2).bottom_end) #define RANGES_INTERSECT(r1x, r1w, r2x, r2w) \ - (r1x < r2x + r2w && r1x + r1w > r2x) + (r1w && r2w && r1x < r2x + r2w && r1x + r1w > r2x) #endif