awesome/layouts/grid.c
2007-09-12 17:15:58 +02:00

65 lines
2.3 KiB
C

/*
* grid.c - grid layout
*
* Copyright © 2007 Julien Danjou <julien@danjou.info>
* Copyright © 2007 Alexandru E. Ungur <grid@rb.no-ip.biz>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#include "awesome.h"
#include "grid.h"
#include "layout.h"
#include "tag.h"
extern Client *clients; /* global client list and stack */
void
grid(Display *disp, awesome_config *awesomeconf)
{
unsigned int i, n, cx, cy, cw, ch, aw, ah, cols, rows;
int waw = get_windows_area_width(disp, awesomeconf->statusbar);
int wah = get_windows_area_height(disp, awesomeconf->statusbar);
Client *c;
for(n = 0, c = clients; c; c = c->next)
if(IS_TILED(c, awesomeconf->selected_tags, awesomeconf->ntags))
n++;
/* grid dimensions */
for(rows = 0; rows <= n / 2; rows++)
if(rows * rows >= n)
break;
cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
/* window geoms (cell height/width) */
ch = wah / (rows ? rows : 1);
cw = waw / (cols ? cols : 1);
for(i = 0, c = clients; c; c = c->next)
{
if(!IS_TILED(c, awesomeconf->selected_tags, awesomeconf->ntags))
continue;
c->ismax = False;
cx = (i / rows) * cw;
cy = (i % rows) * ch + (awesomeconf->statusbar.position == BarTop ? awesomeconf->statusbar.height : 0); // bh? adjust
/* adjust height/width of last row/column's windows */
ah = ((i + 1) % rows == 0) ? wah - ch * rows : 0;
aw = (i >= rows * (cols - 1)) ? waw - cw * cols : 0;
resize(c, cx, cy, cw - 2 * c->border + aw, ch - 2 * c->border + ah, False);
i++;
}
}