summaryrefslogtreecommitdiff
path: root/lain/layout/cascade.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lain/layout/cascade.lua')
-rw-r--r--lain/layout/cascade.lua80
1 files changed, 80 insertions, 0 deletions
diff --git a/lain/layout/cascade.lua b/lain/layout/cascade.lua
new file mode 100644
index 0000000..999c599
--- /dev/null
+++ b/lain/layout/cascade.lua
@@ -0,0 +1,80 @@
+
+--[[
+
+ Licensed under GNU General Public License v2
+ * (c) 2014, projektile
+ * (c) 2013, Luke Bonham
+ * (c) 2010-2012, Peter Hofmann
+
+--]]
+
+local tag = require("awful.tag")
+local beautiful = require("beautiful")
+
+local cascade =
+{
+ name = "cascade",
+ nmaster = 0,
+ offset_x = 32,
+ offset_y = 8
+}
+
+function cascade.arrange(p)
+
+ -- Cascade windows.
+
+ -- 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
+
+ -- Themes border width requires an offset.
+ local bw = tonumber(beautiful.border_width) or 0
+
+ -- Screen.
+ local wa = p.workarea
+ local cls = p.clients
+
+ wa.height = wa.height - ((global_border * 2) + (bw * 2))
+ wa.width = wa.width - ((global_border * 2) + (bw * 2))
+ wa.x = wa.x + global_border
+ wa.y = wa.y + global_border
+
+ -- Opening a new window will usually force all existing windows to
+ -- get resized. This wastes a lot of CPU time. So let's set a lower
+ -- bound to "how_many": This wastes a little screen space but you'll
+ -- get a much better user experience.
+ local t = tag.selected(p.screen)
+ local num_c
+ if cascade.nmaster > 0
+ then
+ num_c = cascade.nmaster
+ else
+ num_c = tag.getnmaster(t)
+ end
+
+ local how_many = #cls
+ if how_many < num_c
+ then
+ how_many = num_c
+ end
+
+ local current_offset_x = cascade.offset_x * (how_many - 1)
+ local current_offset_y = cascade.offset_y * (how_many - 1)
+
+ -- Iterate.
+ for i = 1,#cls,1
+ do
+ local c = cls[i]
+ local g = {}
+
+ g.x = wa.x + (how_many - i) * cascade.offset_x
+ g.y = wa.y + (i - 1) * cascade.offset_y
+ g.width = wa.width - current_offset_x
+ g.height = wa.height - current_offset_y
+
+ c:geometry(g)
+ end
+end
+
+return cascade