X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/7a4d6f5ffa594603ef83bc8b0e9945d12e082490..bacf63807cefea2364dc734e6c07bb6cbbe5c242:/layout/cascadetile.lua diff --git a/layout/cascadetile.lua b/layout/cascadetile.lua index a94bbed..3baf3e9 100644 --- a/layout/cascadetile.lua +++ b/layout/cascadetile.lua @@ -2,6 +2,7 @@ --[[ Licensed under GNU General Public License v2 + * (c) 2014, projektile * (c) 2013, Luke Bonham * (c) 2010-2012, Peter Hofmann @@ -30,29 +31,35 @@ function cascadetile.arrange(p) -- It's a bit hard to demonstrate the behaviour with ASCII-images... -- - -- (1) (2) (3) (4) - -- +-----+---+ +-----+---+ +-----+---+ +-----+---+ - -- | | | | | | | | | | | 4 | - -- | | | | | 2 | | | 3 | | | | - -- | 1 | | -> | 1 | | -> | 1 | | -> | 1 +---+ - -- | | | | +---+ | +---+ | | 3 | - -- | | | | | | | | 2 | | |---| - -- | | | | | | | |---| | | 2 | - -- | | | | | | | | | | |---| - -- +-----+---+ +-----+---+ +-----+---+ +-----+---+ + -- (1) (2) (3) (4) + -- +----------+---+ +----------+---+ +----------+---+ +----------+---+ + -- | | | | | 3 | | | 4 | | +---+| + -- | | | -> | | | -> | +---++ -> | +---+|+ + -- | 1 | 2 | | 1 +---++ | 1 | 3 || | 1 +---+|+| + -- | | | | | 2 || | +---++| | +---+|+ | + -- | | | | | || | | 2 | | | | 2 |+ | + -- +----------+---+ +---------+---++ +--------+---+-+ +------+---+---+ -- A useless gap (like the dwm patch) can be defined with -- beautiful.useless_gap_width. - local useless_gap = tonumber(beautiful.useless_gap_width) - if useless_gap == nil - then - useless_gap = 0 - end + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + if useless_gap < 0 then useless_gap = 0 end + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end -- Screen. local wa = p.workarea local cls = p.clients + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + -- Width of main column? local t = tag.selected(p.screen) local mwfact @@ -92,14 +99,18 @@ function cascadetile.arrange(p) if #cls > 0 then -- Main column, fixed width and height. - local c = cls[#cls] + local c = cls[1] local g = {} - local mainwid = wa.width * mwfact + -- Subtracting the useless_gap width from the work area width here + -- makes this mwfact calculation work the same as in uselesstile. + -- Rounding is necessary to prevent the rendered size of slavewid + -- from being 1 pixel off when the result is not an integer. + local mainwid = math.floor((wa.width - useless_gap) * mwfact) local slavewid = wa.width - mainwid if overlap_main == 1 then - g.width = wa.width + g.width = wa.width - 2*c.border_width -- The size of the main window may be reduced a little bit. -- This allows you to see if there are any windows below the @@ -108,10 +119,10 @@ function cascadetile.arrange(p) -- overlapping everything else. g.width = g.width - cascadetile.extra_padding else - g.width = mainwid + g.width = mainwid - 2*c.border_width end - g.height = wa.height + g.height = wa.height - 2*c.border_width g.x = wa.x g.y = wa.y if useless_gap > 0 @@ -130,19 +141,21 @@ function cascadetile.arrange(p) g.width = g.width - useless_gap end end + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end c:geometry(g) -- Remaining clients stacked in slave column, new ones on top. if #cls > 1 then - for i = (#cls - 1),1,-1 + for i = 2,#cls do c = cls[i] g = {} - g.width = slavewid - current_offset_x - g.height = wa.height - current_offset_y - g.x = wa.x + mainwid + (how_many - i) * cascadetile.offset_x - g.y = wa.y + (i - 1) * cascadetile.offset_y + g.width = slavewid - current_offset_x - 2*c.border_width + g.height = wa.height - current_offset_y - 2*c.border_width + g.x = wa.x + mainwid + (how_many - (i - 1)) * cascadetile.offset_x + g.y = wa.y + (i - 2) * cascadetile.offset_y if useless_gap > 0 then g.width = g.width - 2 * useless_gap @@ -150,6 +163,8 @@ function cascadetile.arrange(p) g.x = g.x + useless_gap g.y = g.y + useless_gap end + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end c:geometry(g) end end