# HG changeset patch # User tron # Date 1100208015 0 # Node ID a4f288d6d7ab236e1cff65207645447881e37ba6 # Parent 04b6dace94b33b2b30c1a9de83d34e427927de7c (svn r541) Make windows even snappier! ^^ Thanks to nzhook, who also proposed the original patch. diff -r 04b6dace94b3 -r a4f288d6d7ab window.c --- a/window.c Thu Nov 11 17:53:11 2004 +0000 +++ b/window.c Thu Nov 11 21:20:15 2004 +0000 @@ -721,40 +721,10 @@ ny = y; if (_patches.window_snap_radius != 0) { - uint hsnap = _patches.window_snap_radius; - uint vsnap = _patches.window_snap_radius; - uint delta; - - // Snap at screen borders - // Left screen border - delta = abs(x); - if (delta <= hsnap) { - nx = 0; - hsnap = delta; - } + int hsnap = _patches.window_snap_radius; + int vsnap = _patches.window_snap_radius; + int delta; - // Right screen border - delta = abs(_screen.width - x - w->width); - if (delta <= hsnap) { - nx = _screen.width - w->width; - hsnap = delta; - } - - // Top of screen - delta = abs(y); - if (delta <= vsnap) { - ny = 0; - vsnap = delta; - } - - // Bottom of screen - delta = abs(_screen.height - y - w->height); - if (delta <= vsnap) { - ny = _screen.height - w->height; - vsnap = delta; - } - - // Snap at other windows for (v = _windows; v != _last_window; ++v) { if (v == w) continue; // Don't snap at yourself @@ -774,6 +744,22 @@ } } + if (w->top + w->height >= v->top && w->top <= v->top + v->height) { + // Your left border <-> other left border + delta = abs(v->left - x); + if (delta <= hsnap) { + nx = v->left; + hsnap = delta; + } + + // Your right border <-> other right border + delta = abs(v->left + v->width - x - w->width); + if (delta <= hsnap) { + nx = v->left + v->width - w->width; + hsnap = delta; + } + } + if (x + w->width > v->left && x < v->left + v->width) { // Your top border <-> other bottom border delta = abs(v->top + v->height - y); @@ -789,6 +775,22 @@ vsnap = delta; } } + + if (w->left + w->width >= v->left && w->left <= v->left + v->width) { + // Your top border <-> other top border + delta = abs(v->top - y); + if (delta <= vsnap) { + ny = v->top; + vsnap = delta; + } + + // Your bottom border <-> other bottom border + delta = abs(v->top + v->height - y - w->height); + if (delta <= vsnap) { + ny = v->top + v->height - w->height; + vsnap = delta; + } + } } }