X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fresistance.c;h=31188aa387ecdcc296559a78b24a70c4a6628cb8;hb=e094bd40f3212fdb71f34256b4fc2c6b04469132;hp=68106abf2b17eeb2bb67d3cb4ecb015d50501f2a;hpb=23ee7b9a934d5aef2835b684edb9192fa11feb06;p=chaz%2Fopenbox diff --git a/plugins/resistance.c b/plugins/resistance.c index 68106abf..31188aa3 100644 --- a/plugins/resistance.c +++ b/plugins/resistance.c @@ -3,10 +3,28 @@ #include "../kernel/frame.h" #include "../kernel/stacking.h" #include "../kernel/screen.h" +#include "../kernel/config.h" #include -static int resistance = 10; -static gboolean window_resistance = TRUE; /* window-to-window */ +#define DEFAULT_RESISTANCE 10 + +void plugin_setup_config() +{ + ConfigValue val; + + config_def_set(config_def_new("resistance", Config_Integer, + "Edge Resistance", + "The amount of resistance to provide when " + "moving windows past edges." + "positioned.")); + config_def_set(config_def_new("resistance.windows", Config_Bool, + "Edge Resistance On Windows", + "Whether to provide edge resistance when " + "moving windows past the edge of another " + "window.")); + val.bool = TRUE; + config_set("resistance.windows", Config_Bool, val); +} static void resist(Client *c, int *x, int *y) { @@ -16,7 +34,16 @@ static void resist(Client *c, int *x, int *y) int al, at, ar, ab; /* screen area edges */ int cl, ct, cr, cb; /* current edges */ int w, h; /* current size */ - gboolean snapx = FALSE, snapy = FALSE; + Client *snapx = NULL, *snapy = NULL; + ConfigValue resist, window_resist; + + if (!config_get("resistance", Config_Integer, &resist) || + resist.integer < 0) { + resist.integer = DEFAULT_RESISTANCE; + config_set("resistance", Config_Integer, resist); + } + if (!config_get("resistance.windows", Config_Bool, &window_resist)) + g_assert_not_reached(); w = c->frame->area.width; h = c->frame->area.height; @@ -32,12 +59,14 @@ static void resist(Client *c, int *x, int *y) cb = ct + c->frame->area.height - 1; /* snap to other clients */ - if (window_resistance) + if (window_resist.bool) for (it = stacking_list; it != NULL; it = it->next) { Client *target; int tl, tt, tr, tb; /* 1 past the target's edges on each side */ target = it->data; + /* don't snap to self or non-visibles */ + if (!target->frame->visible || target == c) continue; tl = target->frame->area.x - 1; tt = target->frame->area.y - 1; @@ -48,14 +77,32 @@ static void resist(Client *c, int *x, int *y) window edge available, without going all the way from bottom-to-top in the stacking list */ - if (!snapx && cl >= tr && l < tr && l >= tr - resistance) - *x = tr, snapx = TRUE; - else if (!snapx && cr <= tl && r > tl && r <= tl + resistance) - *x = tl - w + 1, snapx = TRUE; - else if (!snapy && ct >= tb && t < tb && t >= tb - resistance) - *y = tb, snapy = TRUE; - else if (!snapy && cb <= tt && b > tt && b <= tt + resistance) - *y = tt - h + 1, snapy = TRUE; + if (snapx == NULL) { + if (cl >= tr && l < tr && l >= tr - resist.integer) + *x = tr, snapx = target; + else if (cr <= tl && r > tl && r <= tl + resist.integer) + *x = tl - w + 1, snapx = target; + if (snapx != NULL) { + /* try to corner snap to the window */ + if (ct > tt && t <= tt && t > tt - resist.integer) + *y = tt + 1, snapy = target; + else if (cb < tb && b >= tb && b < tb + resist.integer) + *y = tb - h, snapy = target; + } + } + if (snapy == NULL) { + if (ct >= tb && t < tb && t >= tb - resist.integer) + *y = tb, snapy = target; + else if (!cb <= tt && b > tt && b <= tt + resist.integer) + *y = tt - h + 1, snapy = target; + if (snapy != NULL) { + /* try to corner snap to the window */ + if (cl > tl && l <= tl && l > tl - resist.integer) + *x = tl + 1, snapx = target; + else if (cr < tr && r >= tr && r < tr + resist.integer) + *x = tr - w, snapx = target; + } + } if (snapx && snapy) break; } @@ -68,13 +115,13 @@ static void resist(Client *c, int *x, int *y) ab = at + area->height - 1; /* snap to screen edges */ - if (cl >= al && l < al && l >= al - resistance) + if (cl >= al && l < al && l >= al - resist.integer) *x = al; - else if (cr <= ar && r > ar && r <= ar + resistance) + else if (cr <= ar && r > ar && r <= ar + resist.integer) *x = ar - w + 1; - if (ct >= at && t < at && t >= at - resistance) + if (ct >= at && t < at && t >= at - resist.integer) *y = at; - else if (cb <= ab && b > ab && b < ab + resistance) + else if (cb <= ab && b > ab && b < ab + resist.integer) *y = ab - h + 1; }