- /* don't snap windows with size increments */
- if (c->size_inc.width > 1 || c->size_inc.height > 1)
- return;
-
- l = c->frame->area.x;
- r = l + c->frame->area.width - 1;
- t = c->frame->area.y;
- b = t + c->frame->area.height - 1;
-
- /* get the screen boundaries */
- area = screen_area(c->desktop);
- al = area->x;
- at = area->y;
- ar = al + area->width - 1;
- ab = at + area->height - 1;
-
- /* snap to other windows */
- if (config_resist_win) {
- for (it = stacking_list; it != NULL; it = it->next) {
- if (!WINDOW_IS_CLIENT(it->data))
- continue;
- target = it->data;
-
- /* don't snap to invisibles or ourself */
- if (!target->frame->visible || target == c) continue;
-
- tl = target->frame->area.x;
- tr = target->frame->area.x + target->frame->area.width - 1;
- tt = target->frame->area.y;
- tb = target->frame->area.y + target->frame->area.height - 1;
-
- if (snapx == NULL) {
- /* horizontal snapping */
- if (t < tb && b > tt) {
- switch (corn) {
- case OB_CORNER_TOPLEFT:
- case OB_CORNER_BOTTOMLEFT:
- dlt = l;
- drb = r + *w - c->frame->area.width;
- if (r < tl && drb >= tl &&
- drb < tl + config_resist_win)
- *w = tl - l, snapx = target;
- break;
- case OB_CORNER_TOPRIGHT:
- case OB_CORNER_BOTTOMRIGHT:
- dlt = l - *w + c->frame->area.width;
- drb = r;
- if (l > tr && dlt <= tr &&
- dlt > tr - config_resist_win)
- *w = r - tr, snapx = target;
- break;
- }
+ if (!resist) return;
+
+ incw = c->size_inc.width;
+ inch = c->size_inc.height;
+
+ l = RECT_LEFT(c->frame->area);
+ r = RECT_RIGHT(c->frame->area);
+ t = RECT_TOP(c->frame->area);
+ b = RECT_BOTTOM(c->frame->area);
+
+ for (it = stacking_list; it; it = g_list_next(it)) {
+ if (!WINDOW_IS_CLIENT(it->data))
+ continue;
+ target = it->data;
+
+ /* don't snap to invisibles or ourself */
+ if (!target->frame->visible || target == c) continue;
+ /* don't snap to windows set to below and skip_taskbar (desklets) */
+ if (target->below && !c->below && target->skip_taskbar) continue;
+
+ tl = RECT_LEFT(target->frame->area);
+ tr = RECT_RIGHT(target->frame->area);
+ tt = RECT_TOP(target->frame->area);
+ tb = RECT_BOTTOM(target->frame->area);
+
+ if (snapx == NULL) {
+ /* horizontal snapping */
+ if (t < tb && b > tt) {
+ switch (corn) {
+ case OB_CORNER_TOPLEFT:
+ case OB_CORNER_BOTTOMLEFT:
+ dlt = l;
+ drb = r + *w - c->frame->area.width;
+ if (r < tl && drb >= tl &&
+ drb < tl + resist)
+ *w = tl - l, snapx = target;
+ break;
+ case OB_CORNER_TOPRIGHT:
+ case OB_CORNER_BOTTOMRIGHT:
+ dlt = l - *w + c->frame->area.width;
+ drb = r;
+ if (l > tr && dlt <= tr &&
+ dlt > tr - resist)
+ *w = r - tr, snapx = target;
+ break;