]> Dogcows Code - chaz/openbox/blobdiff - plugins/resistance.c
document the options
[chaz/openbox] / plugins / resistance.c
index c7f47c3e07bdec1c907fa0d7dd052805109982e6..31188aa387ecdcc296559a78b24a70c4a6628cb8 100644 (file)
@@ -3,10 +3,28 @@
 #include "../kernel/frame.h"
 #include "../kernel/stacking.h"
 #include "../kernel/screen.h"
+#include "../kernel/config.h"
 #include <glib.h>
 
-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,14 +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;
-            if (target == c) continue; /* don't snap to self */
-            if (!target->visible) continue; /* don't snap to non-visibles */
+            /* 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;
@@ -50,15 +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
             */
-            g_print("r %d tl %d\n", r, tl);
-            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;
         }
@@ -71,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;
 }
 
This page took 0.025658 seconds and 4 git commands to generate.