JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix positioning issue on flipped layouts with a multi-column/row stack.
[spectrwm.git] / spectrwm.c
index 960c0eb..5bf74b1 100644 (file)
@@ -3465,8 +3465,9 @@ switchws(struct swm_region *r, union arg *args)
        this_r->ws = new_ws;
        new_ws->r = this_r;
 
-       /* Set focus_pending before stacking. */
-       if (focus_mode != SWM_FOCUS_FOLLOW)
+       /* Set focus_pending before stacking, if needed. */
+       if (focus_mode != SWM_FOCUS_FOLLOW && (!new_ws->focus_pending ||
+           validate_win(new_ws->focus_pending)))
                new_ws->focus_pending = get_region_focus(new_ws->r);
 
        stack();
@@ -4258,20 +4259,24 @@ stack_master(struct workspace *ws, struct swm_geometry *g, int rot, int flip)
                        colno = (winno - mwin) / stacks;
                        if (s <= (winno - mwin) % stacks)
                                colno++;
-                       split = split + colno;
-                       hrh = (r_g.h / colno);
+                       split += colno;
+                       hrh = r_g.h / colno;
                        extra = r_g.h - (colno * hrh);
-                       if (flip)
-                               win_g.x = r_g.x;
-                       else
+
+                       if (!flip)
                                win_g.x += win_g.w + 2 * border_width +
                                    tile_gap;
+
                        win_g.w = (r_g.w - msize -
                            (stacks * (2 * border_width + tile_gap))) / stacks;
                        if (s == 1)
                                win_g.w += (r_g.w - msize -
                                    (stacks * (2 * border_width + tile_gap))) %
                                    stacks;
+
+                       if (flip)
+                               win_g.x -= win_g.w + 2 * border_width +
+                                   tile_gap;
                        s--;
                        j = 0;
                }