+void wm_update_dpy(dpy_t *dpy)
+{
+ int x=0, y=0; // Current window top-left position
+ int tx=0, ty=0; // Total x/y size
+ int mx=0, my=0; // Maximum x/y size (screen size)
+ int sy=0; // Size of focused stack window
+
+ /* Scale horizontally */
+ x = dpy->geom->x;
+ mx = dpy->geom->w - (list_length(dpy->cols)+1)*MARGIN;
+ for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next)
+ tx += COL(lcol)->width;
+ for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next)
+ COL(lcol)->width *= (float)mx / tx;
+
+ /* Scale each column vertically */
+ for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next) {
+ col_t *col = lcol->data;
+ ty = 0;
+ for (list_t *lrow = col->rows; lrow; lrow = lrow->next)
+ ty += ROW(lrow)->height;
+ y = dpy->geom->y;
+ my = dpy->geom->h - (list_length(col->rows)+1)*MARGIN;
+ sy = my - (list_length(col->rows)-1)*STACK;
+ for (list_t *lrow = col->rows; lrow; lrow = lrow->next) {
+ win_t *win = ROW(lrow)->win;
+ win->h = ROW(lrow)->height;
+ int height = 0;
+ switch (col->mode) {
+ case split:
+ sys_move(win, x+MARGIN, y+MARGIN,
+ col->width, win->h * ((float)my / ty));
+ height = win->h;
+ break;
+ case stack:
+ if (lrow->next && ROW(lrow->next)->win == col->row->win) {
+ /* Hack to prevent flashing */
+ win_t *next = ROW(lrow->next)->win;
+ sys_move(next, x+MARGIN, y+MARGIN+STACK+MARGIN,
+ col->width, sy);
+ }
+ height = win == col->row->win ? sy : STACK;
+ sys_move(win, x+MARGIN, y+MARGIN,
+ col->width, height);
+ break;
+ case max:
+ case tab:
+ sys_move(win, x+MARGIN, 0+MARGIN,
+ col->width, dpy->geom->h-2*MARGIN);
+ if (col->row->win == win)
+ sys_raise(win);
+ break;
+ }
+ y += height + MARGIN;
+ ROW(lrow)->height = win->h;
+ }
+ x += col->width + MARGIN;
+ }
+}
+