-horizontal_stack(struct workspace *ws, struct swm_geometry *g) {
- XWindowChanges wc;
- struct swm_geometry gg = *g;
- struct ws_win *win, *winfocus;
- int i, j, split, rowno, hrw, winno, main_height;
- unsigned int mask;
-
- DNPRINTF(SWM_D_STACK, "horizontal_stack: workspace: %d\n", ws->idx);
-
- if ((winno = count_win(ws, 0)) == 0)
- return;
-
- if (ws->focus == NULL)
- ws->focus = TAILQ_FIRST(&ws->winlist);
- winfocus = cur_focus ? cur_focus : ws->focus;
-
- if (ws->l_state.horizontal_mwin &&
- winno > ws->l_state.horizontal_mwin) {
- split = ws->l_state.horizontal_mwin;
- rowno = split;
- main_height = (g->h / SWM_V_SLICE) *
- ws->l_state.horizontal_msize;
- gg.h = main_height;
- } else {
- rowno = winno;
- split = 0;
- }
- hrw = g->w / rowno;
- gg.w = hrw - 2;
-
- i = j = 0;
- TAILQ_FOREACH(win, &ws->winlist, entry) {
- if (split && i == split) {
- rowno = winno - split;
- hrw = (g->w / rowno);
- gg.y += main_height + 2;
- gg.h = g->h - (main_height + 2);
- gg.w = hrw - 2;
- j = 0;
- }
- if (j == rowno - 1)
- gg.w = (hrw + (g->w - (rowno * hrw)));
-
- if (j == 0)
- gg.x = g->x;
- else
- gg.x += hrw;
-
- if (win->transient != 0 || win->floating != 0)
- stack_floater(win, ws->r);
- else {
- bzero(&wc, sizeof wc);
- wc.border_width = 1;
- win->g.x = wc.x = gg.x;
- win->g.y = wc.y = gg.y;
- win->g.w = wc.width = gg.w;
- win->g.h = wc.height = gg.h;
- mask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
- XConfigureWindow(display, win->id, mask, &wc);
- }
-
- XMapRaised(display, win->id);
- j++;
- i++;
- }