X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fgeom.h;h=8e50834bc7084420e79840b09b02577ae5630a18;hb=HEAD;hp=fed39188263a1438fe26babca8893b1a5a208a23;hpb=d9f14c1d010860e658f4a9adc6682e0264b410aa;p=chaz%2Fopenbox diff --git a/openbox/geom.h b/openbox/geom.h index fed39188..8e50834b 100644 --- a/openbox/geom.h +++ b/openbox/geom.h @@ -2,7 +2,7 @@ geom.h for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,12 +20,31 @@ #ifndef __geom_h #define __geom_h +#include + +typedef struct _GravityCoord { + gint pos; + gint denom; + gboolean center; + gboolean opposite; +} GravityCoord; + +typedef struct _GravityPoint { + GravityCoord x; + GravityCoord y; +} GravityPoint; + +#define GRAVITY_COORD_SET(c, p, cen, opp) \ + (c).pos = (p), (c).center = (cen), (c).opposite = (opp) + + typedef struct _Point { int x; int y; } Point; #define POINT_SET(pt, nx, ny) (pt).x = (nx), (pt).y = (ny) +#define POINT_EQUAL(p1, p2) ((p1).x == (p2).x && (p1).y == (p2).y) typedef struct _Size { int width; @@ -46,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) \ @@ -56,6 +77,11 @@ typedef struct _Rect { #define RECT_EQUAL(r1, r2) ((r1).x == (r2).x && (r1).y == (r2).y && \ (r1).width == (r2).width && \ (r1).height == (r2).height) +#define RECT_EQUAL_DIMS(r, x, y, w, h) \ + ((r).x == (x) && (r).y == (y) && (r).width == (w) && (r).height == (h)) + +#define RECT_TO_DIMS(r, x, y, w, h) \ + (x) = (r).x, (y) = (r).y, (w) = (r).width, (h) = (r).height #define RECT_CONTAINS(r, px, py) \ ((px) >= (r).x && (px) < (r).x + (r).width && \ @@ -78,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; @@ -113,6 +158,9 @@ typedef struct _StrutPartial { (s1).top = MAX((s1).top, (s2).top), \ (s1).bottom = MAX((s1).bottom, (s2).bottom) +#define STRUT_EXISTS(s1) \ + ((s1).left || (s1).top || (s1).right || (s1).bottom) + #define STRUT_EQUAL(s1, s2) \ ((s1).left == (s2).left && \ (s1).top == (s2).top && \ @@ -133,4 +181,7 @@ typedef struct _StrutPartial { (s1).bottom_start == (s2).bottom_start && \ (s1).bottom_end == (s2).bottom_end) +#define RANGES_INTERSECT(r1x, r1w, r2x, r2w) \ + (r1w && r2w && r1x < r2x + r2w && r1x + r1w > r2x) + #endif