+void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
+{
+ Rect *area, *parea;
+ guint i;
+ gint l, t, r, b; /* requested edges */
+ gint al, at, ar, ab; /* screen area edges */
+ gint pl, pt, pr, pb; /* physical screen area edges */
+ gint cl, ct, cr, cb; /* current edges */
+ gint w, h; /* current size */
+
+ if (!resist) return;
+
+ frame_client_gravity(c->frame, x, y, c->area.width, c->area.height);
+
+ w = c->frame->area.width;
+ h = c->frame->area.height;
+
+ l = *x;
+ t = *y;
+ r = l + w - 1;
+ b = t + h - 1;
+
+ cl = RECT_LEFT(c->frame->area);
+ ct = RECT_TOP(c->frame->area);
+ cr = RECT_RIGHT(c->frame->area);
+ cb = RECT_BOTTOM(c->frame->area);
+
+ 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))
+ continue;
+
+ al = RECT_LEFT(*area);
+ at = RECT_TOP(*area);
+ ar = RECT_RIGHT(*area);
+ ab = RECT_BOTTOM(*area);
+ pl = RECT_LEFT(*parea);
+ pt = RECT_TOP(*parea);
+ pr = RECT_RIGHT(*parea);
+ pb = RECT_BOTTOM(*parea);
+
+ if (cl >= al && l < al && l >= al - resist)
+ *x = al;
+ else if (cr <= ar && r > ar && r <= ar + resist)
+ *x = ar - w + 1;
+ else if (cl >= pl && l < pl && l >= pl - resist)
+ *x = pl;
+ else if (cr <= pr && r > pr && r <= pr + resist)
+ *x = pr - w + 1;
+
+ if (ct >= at && t < at && t >= at - resist)
+ *y = at;
+ else if (cb <= ab && b > ab && b < ab + resist)
+ *y = ab - h + 1;
+ else if (ct >= pt && t < pt && t >= pt - resist)
+ *y = pt;
+ else if (cb <= pb && b > pb && b < pb + resist)
+ *y = pb - h + 1;
+ }
+
+ frame_frame_gravity(c->frame, x, y, c->area.width, c->area.height);
+}
+
+void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
+ ObCorner corn)