X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fresistance.c;h=31188aa387ecdcc296559a78b24a70c4a6628cb8;hb=106d5630bfac19eaa5b402bd1ee06d4d41cf7f28;hp=24e291a049b8d70becaef1581670f2d5da0763d2;hpb=80c7f14520694771c08b9564487ba65e7dadd75e;p=chaz%2Fopenbox diff --git a/plugins/resistance.c b/plugins/resistance.c index 24e291a0..31188aa3 100644 --- a/plugins/resistance.c +++ b/plugins/resistance.c @@ -3,15 +3,29 @@ #include "../kernel/frame.h" #include "../kernel/stacking.h" #include "../kernel/screen.h" +#include "../kernel/config.h" #include +#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 int resistance = 10; -static gboolean window_resistance = TRUE; /* window-to-window */ - static void resist(Client *c, int *x, int *y) { GList *it; @@ -20,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; @@ -36,7 +59,7 @@ 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 */ @@ -54,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; } @@ -74,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; }