diff --git a/lib/awful/layout/suit/fair.lua.in b/lib/awful/layout/suit/fair.lua.in index 5de18e5e..9fc15764 100644 --- a/lib/awful/layout/suit/fair.lua.in +++ b/lib/awful/layout/suit/fair.lua.in @@ -1,6 +1,6 @@ --------------------------------------------------------------------------- --- @author Julien Danjou <julien@danjou.info> --- @copyright 2008 Julien Danjou +-- @author Josh Komoroske +-- @copyright 2012 Josh Komoroske -- @release @AWESOME_VERSION@ --------------------------------------------------------------------------- @@ -16,46 +16,66 @@ local function do_fair(p, orientation) local wa = p.workarea local cls = p.clients + -- Swap workarea dimensions, if our orientation is "east" + if orientation == 'east' then + wa.width, wa.height = wa.height, wa.width + wa.x, wa.y = wa.y, wa.x + end + if #cls > 0 then - local cells = math.ceil(math.sqrt(#cls)) - local strips = math.ceil(#cls / cells) + local rows, cols = 0, 0 + if #cls == 2 then + rows, cols = 1, 2 + else + rows = math.ceil(math.sqrt(#cls)) + cols = math.ceil(#cls / rows) + end - local cell = 0 - local strip = 0 for k, c in ipairs(cls) do + k = k - 1 local g = {} - if ( orientation == "east" and #cls > 2 ) - or ( orientation == "south" and #cls <= 2 ) then - if #cls < (strips * cells) and strip == strips - 1 then - g.width = wa.width / (cells - ((strips * cells) - #cls)) - else - g.width = wa.width / cells - end - g.height = wa.height / strips - g.x = wa.x + cell * g.width - g.y = wa.y + strip * g.height + local row, col = 0, 0 + row = k % rows + col = math.floor(k / rows) + + local lrows, lcols = 0, 0 + if k >= rows * cols - rows then + lrows = #cls - (rows * cols - rows) + lcols = cols else - if #cls < (strips * cells) and strip == strips - 1 then - g.height = wa.height / (cells - ((strips * cells) - #cls)) - else - g.height = wa.height / cells - end - g.width = wa.width / strips - - g.x = wa.x + strip * g.width - g.y = wa.y + cell * g.height + lrows = rows + lcols = cols + end + + if row == lrows - 1 then + g.height = wa.height - math.ceil(wa.height / lrows) * row + g.y = wa.height - g.height + else + g.height = math.ceil(wa.height / lrows) + g.y = g.height * row + end + + if col == lcols - 1 then + g.width = wa.width - math.ceil(wa.width / lcols) * col + g.x = wa.width - g.width + else + g.width = math.ceil(wa.width / lcols) + g.x = g.width * col end - g.width = g.width - c.border_width * 2 g.height = g.height - c.border_width * 2 - c:geometry(g) + g.width = g.width - c.border_width * 2 + g.y = g.y + wa.y + g.x = g.x + wa.x - cell = cell + 1 - if cell == cells then - cell = 0 - strip = strip + 1 + -- Swap window dimensions, if our orientation is "east" + if orientation == 'east' then + g.width, g.height = g.height, g.width + g.x, g.y = g.y, g.x end + + c:geometry(g) end end end