+ /* don't snap to invisibles or ourself */
+ if (!t->frame->visible || t == c) continue;
+
+ switch (corn) {
+ case Corner_TopLeft:
+ case Corner_BottomLeft:
+ dlt = lt;
+ drb = rb + *w - c->frame->area.width;
+ tlt = t->frame->area.x;
+ if (rb < tlt && drb >= tlt && drb < tlt + resist.integer)
+ *w = tlt - lt, snapx = t;
+ break;
+ case Corner_TopRight:
+ case Corner_BottomRight:
+ dlt = lt - *w + c->frame->area.width;
+ drb = rb;
+ trb = t->frame->area.x + t->frame->area.width - 1;
+ if (lt > trb && dlt <= trb && dlt > trb - resist.integer)
+ *w = rb - trb, snapx = t;
+ break;
+ }
+ }
+ }
+
+ /* snap to screen edges */
+ switch (corn) {
+ case Corner_TopLeft:
+ case Corner_BottomLeft:
+ dlt = lt;
+ drb = rb + *w - c->frame->area.width;
+ if (rb <= ar && drb > ar && drb <= ar + resist.integer)
+ *w = ar - lt + 1;
+ break;
+ case Corner_TopRight:
+ case Corner_BottomRight:
+ dlt = lt - *w + c->frame->area.width;
+ drb = rb;
+ if (lt >= al && dlt < al && dlt >= al - resist.integer)
+ *w = rb - al + 1;
+ break;
+ }
+
+ /* vertical snapping */
+
+ lt = c->frame->area.y;
+ rb = lt + c->frame->area.height - 1;
+
+ /* snap to other windows */
+ if (window_resist.bool) {
+ for (it = stacking_list; !snapy && it != NULL; it = it->next) {
+ t = it->data;
+
+ /* don't snap to invisibles or ourself */
+ if (!t->frame->visible || t == c) continue;
+
+ switch (corn) {
+ case Corner_TopLeft:
+ case Corner_TopRight:
+ dlt = lt;
+ drb = rb + *h - c->frame->area.height;
+ tlt = t->frame->area.y;
+ if (rb < tlt && drb >= tlt && drb < tlt + resist.integer)
+ *h = tlt - lt, snapy = t;
+ break;
+ case Corner_BottomLeft:
+ case Corner_BottomRight:
+ dlt = lt - *h + c->frame->area.height;
+ drb = rb;
+ trb = t->frame->area.y + t->frame->area.height - 1;
+ if (lt > trb && dlt <= trb && dlt > trb - resist.integer)
+ *h = rb - trb, snapy = t;
+ break;
+ }
+ }
+ }
+
+ /* snap to screen edges */
+ switch (corn) {
+ case Corner_TopLeft:
+ case Corner_TopRight:
+ dlt = lt;
+ drb = rb + *h - c->frame->area.height;
+ if (rb <= ab && drb > ab && drb <= ab + resist.integer)
+ *h = ab - lt + 1;
+ break;
+ case Corner_BottomLeft:
+ case Corner_BottomRight:
+ dlt = lt - *h + c->frame->area.height;
+ drb = rb;
+ if (lt >= at && dlt < at && dlt >= at - resist.integer)
+ *h = rb - at + 1;
+ break;
+ }
+
+ /* round down for size increments */
+ *w -= c->frame->area.width + c->frame->size.left + c->frame->size.right;
+ *w = *w / c->size_inc.width * c->size_inc.width;
+ *w += c->frame->area.width + c->frame->size.left + c->frame->size.right;
+
+ *h -= c->frame->area.height + c->frame->size.top + c->frame->size.bottom;
+ *h = *h / c->size_inc.height * c->size_inc.height;
+ *h += c->frame->area.height + c->frame->size.top + c->frame->size.bottom;
+}
+
+static void event(ObEvent *e, void *foo)
+{
+ if (e->type == Event_Client_Moving)
+ resist_move(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1]);
+ else if (e->type == Event_Client_Resizing)
+ resist_size(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1],
+ e->data.c.num[2]);