By defining a struct containing the coordinates of the
windows (top, bottom, left, right, width, height) and
using a helper function to set up these coordinates, the
whole function becomes much cleaner and easier to read.
---
 src/actions.c |  112 +++++++++++++++++++++++++++-----------------------------
 1 files changed, 54 insertions(+), 58 deletions(-)

diff --git a/src/actions.c b/src/actions.c
index f6a0867..65ebc0b 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -395,34 +395,50 @@ void wMaximizeWindow(WWindow *wwin, int directions)
        wwin->flags.maximized = directions;
 }
 
+/* the window boundary coordinates */
+typedef struct {
+       int left;
+       int right;
+       int bottom;
+       int top;
+       int width;
+       int height;
+} win_coords;
+
+static void set_window_coords(WWindow *wwin, win_coords *obs)
+{
+       obs->left = wwin->frame_x;
+       obs->top = wwin->frame_y;
+       obs->width = wwin->frame->core->width;
+       obs->height = wwin->frame->core->height;
+       obs->bottom = obs->top + obs->height;
+       obs->right = obs->left + obs->width;
+}
+
 /*
  * Maximus: tiled maximization (maximize without overlapping other windows)
  *
- * The window to be maximized will be denoted by w_0 (sub-index zero)
- * while the windows which will stop the maximization of w_0 are denoted by 
w_j.
+ * The original window 'orig' will be maximized to new coordinates 'new'.
+ * The windows obstructing the maximization of 'orig' are denoted 'obs'.
  */
 static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, 
int *new_y,
                                  unsigned int *new_width, unsigned int 
*new_height)
 {
        WWindow *tmp;
-       int x_0            = wwin->frame_x;
-       int y_0            = wwin->frame_y;
-       int width_0        = wwin->frame->core->width;
-       int height_0       = wwin->frame->core->height;
-       int bottom_0       = y_0 + height_0;
-       int right_border_0 = x_0 + width_0;
-       int new_x_0, new_y_0, new_bottom_0, new_right_border_0, new_height_0;
-       int x_j,  y_j, width_j, height_j, bottom_j, top_j, right_border_j;
-       int x_intsect, y_intsect;
-       short int tbar_height_0 = 0, rbar_height_0 = 0;
-       short int bd_width_0 = 0;
+       short int tbar_height_0 = 0, rbar_height_0 = 0, bd_width_0 = 0;
        short int adjust_height;
+       int x_intsect, y_intsect;
+       /* the obstructing, original and new windows */
+       win_coords obs, orig, new;
+
+       /* set the original coordinate positions of the window to be 
Maximumized */
+       set_window_coords(wwin, &orig);
 
        /* Try to fully maximize first, then readjust later */
-       new_x_0            = usableArea.x1;
-       new_y_0            = usableArea.y1;
-       new_bottom_0       = usableArea.y2;
-       new_right_border_0 = usableArea.x2;
+       new.left    = usableArea.x1;
+       new.right   = usableArea.x2;
+       new.top     = usableArea.y1;
+       new.bottom  = usableArea.y2;
 
        if (HAS_TITLEBAR(wwin))
                tbar_height_0 = TITLEBAR_HEIGHT;
@@ -431,7 +447,7 @@ static void find_Maximus_geometry(WWindow *wwin, WArea 
usableArea, int *new_x, i
        if (HAS_BORDER(wwin))
                bd_width_0 = FRAME_BORDER_WIDTH;
 
-       /* the length to be subtracted if w_0 has titlebar, etc */
+       /* the length to be subtracted if the window has titlebar, etc */
        adjust_height = tbar_height_0 + 2 * bd_width_0 + rbar_height_0;
 
        tmp = wwin;
@@ -445,31 +461,20 @@ static void find_Maximus_geometry(WWindow *wwin, WArea 
usableArea, int *new_x, i
                }
                tmp = tmp->prev;
 
-               /*
-                * Set the w_j window coordinates. It is convenient
-                * to not use "corrected" sizes for width and height,
-                * otherwise bottom_j and right_border_j would be
-                * incorrect.
-                */
-               x_j = tmp->frame_x;
-               y_j = tmp->frame_y;
-               width_j = tmp->frame->core->width;
-               height_j = tmp->frame->core->height;
-               bottom_j = y_j + height_j;
-               top_j = y_j;
-               right_border_j = x_j + width_j;
+               /* Set the coordinates of obstructing window */
+               set_window_coords(tmp, &obs);
 
                /* Try to maximize in the y direction first */
-               x_intsect = calcIntersectionLength(x_0, width_0, x_j, width_j);
+               x_intsect = calcIntersectionLength(orig.left, orig.width, 
obs.left, obs.width);
                if (x_intsect != 0) {
                        /* TODO: Consider the case when coords are equal */
-                       if (bottom_j < y_0 && bottom_j > new_y_0) {
+                       if (obs.bottom < orig.top && obs.bottom > new.top) {
                                /* w_0 is below the bottom of w_j */
-                               new_y_0 = bottom_j + 1;
+                               new.top = obs.bottom + 1;
                        }
-                       if (bottom_0 < top_j && top_j < new_bottom_0) {
+                       if (orig.bottom < obs.top && obs.top < new.bottom) {
                                /* The bottom of w_0 is above the top of w_j */
-                               new_bottom_0 = top_j - 1;
+                               new.bottom = obs.top - 1;
                        }
                }
        }
@@ -483,40 +488,31 @@ static void find_Maximus_geometry(WWindow *wwin, WArea 
usableArea, int *new_x, i
                }
                tmp = tmp->prev;
 
-               /* set the w_j window coordinates */
-               x_j = tmp->frame_x;
-               y_j = tmp->frame_y;
-               width_j = tmp->frame->core->width;
-               height_j = tmp->frame->core->height;
-               bottom_j = y_j + height_j;
-               top_j = y_j;
-               right_border_j = x_j + width_j;
+               set_window_coords(tmp, &obs);
 
                /*
-                * Use the updated y coordinates from the above step to account
-                * the possibility that the new value of y_0 will have different
-                * intersections with w_j
+                * Use the new.top and new.height instead of original values
+                * as they may have different intersections with the 
obstructing windows
                 */
-               new_height_0 = new_bottom_0 - new_y_0 - adjust_height;
-               y_intsect = calcIntersectionLength(new_y_0, new_height_0, y_j, 
height_j);
+               new.height = new.bottom - new.top - adjust_height;
+               y_intsect = calcIntersectionLength(new.top, new.height, 
obs.top, obs.height);
                if (y_intsect != 0) {
-                       if (right_border_j < x_0 && right_border_j > new_x_0) {
+                       if (obs.right < orig.left && obs.right > new.left) {
                                /* w_0 is completely to the right of w_j */
-                               new_x_0 = right_border_j + 1;
+                               new.left = obs.right + 1;
                        }
-                       if (right_border_0 < x_j && x_j < new_right_border_0) {
+                       if (orig.right < obs.left && obs.left < new.right) {
                                /* w_0 is completely to the left of w_j */
-                               new_right_border_0 = x_j - 1;
+                               new.right = obs.left - 1;
                        }
                }
        }
 
+       *new_x = new.left;
+       *new_y = new.top;
        /* xcalc needs -7 here, but other apps don't */
-       new_height_0 = new_bottom_0 - new_y_0 - adjust_height - 1;
-       *new_x = new_x_0;
-       *new_y = new_y_0;
-       *new_height = new_height_0;
-       *new_width = new_right_border_0 - new_x_0;
+       *new_height = new.bottom - new.top - adjust_height - 1;;
+       *new_width = new.right - new.left;
 }
 
 void wUnmaximizeWindow(WWindow *wwin)
-- 
1.7.0.2.276.g60daf


-- 
To unsubscribe, send mail to [email protected].

Reply via email to