summaryrefslogtreecommitdiff
path: root/openbox/resist.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-06-13 01:50:01 +0000
committerDana Jansens <danakj@orodu.net>2007-06-13 01:50:01 +0000
commit7a6a516b8e3d8ad6b15379eabf6652a6f43eab27 (patch)
tree9428e8773cfd3441d26a3585990d07f8286b1f86 /openbox/resist.c
parent739606e39c218ad2f3cb1412267f73e4f3d49e15 (diff)
very cool struts. partial struts actually are partial struts now. possibly way broken with xinerama?
Diffstat (limited to 'openbox/resist.c')
-rw-r--r--openbox/resist.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/openbox/resist.c b/openbox/resist.c
index ab71d132..e4596840 100644
--- a/openbox/resist.c
+++ b/openbox/resist.c
@@ -123,6 +123,7 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
gint pl, pt, pr, pb; /* physical screen area edges */
gint cl, ct, cr, cb; /* current edges */
gint w, h; /* current size */
+ Rect desired_area;
if (!resist) return;
@@ -140,13 +141,18 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
ct = RECT_TOP(c->frame->area);
cr = RECT_RIGHT(c->frame->area);
cb = RECT_BOTTOM(c->frame->area);
+
+ RECT_SET(desired_area, *x, *y, c->area.width, c->area.height);
for (i = 0; i < screen_num_monitors; ++i) {
- area = screen_area_monitor(c->desktop, i);
parea = screen_physical_area_monitor(i);
- if (!RECT_INTERSECTS_RECT(*parea, c->frame->area))
+ if (!RECT_INTERSECTS_RECT(*parea, c->frame->area)) {
+ g_free(parea);
continue;
+ }
+
+ area = screen_area_monitor(c->desktop, i, &desired_area);
al = RECT_LEFT(*area);
at = RECT_TOP(*area);
@@ -174,6 +180,9 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
*y = pt;
else if (cb <= pb && b > pb && b < pb + resist)
*y = pb - h + 1;
+
+ g_free(area);
+ g_free(parea);
}
frame_frame_gravity(c->frame, x, y, c->area.width, c->area.height);
@@ -276,6 +285,7 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
gint pl, pt, pr, pb; /* physical screen boundaries */
gint incw, inch;
guint i;
+ Rect desired_area;
if (!resist) return;
@@ -287,12 +297,17 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
incw = c->size_inc.width;
inch = c->size_inc.height;
+ RECT_SET(desired_area, c->area.x, c->area.y, *w, *h);
+
for (i = 0; i < screen_num_monitors; ++i) {
- area = screen_area_monitor(c->desktop, i);
parea = screen_physical_area_monitor(i);
- if (!RECT_INTERSECTS_RECT(*parea, c->frame->area))
+ if (!RECT_INTERSECTS_RECT(*parea, c->frame->area)) {
+ g_free(parea);
continue;
+ }
+
+ area = screen_area_monitor(c->desktop, i, &desired_area);
/* get the screen boundaries */
al = RECT_LEFT(*area);
@@ -347,5 +362,8 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
*h = b - pt + 1;
break;
}
+
+ g_free(area);
+ g_free(parea);
}
}