Lots of random documentation fixes
[awesome.git] / lib / awful / layout / init.lua.in
blob387fb86020e5ddc275055c15b7058242d57190aa
1 ---------------------------------------------------------------------------
2 -- @author Julien Danjou <julien@danjou.info>
3 -- @copyright 2008 Julien Danjou
4 -- @release @AWESOME_VERSION@
5 ---------------------------------------------------------------------------
7 -- Grab environment we need
8 local ipairs = ipairs
9 local type = type
10 local tag = require("awful.tag")
11 local util = require("awful.util")
12 local ascreen = require("awful.screen")
13 local capi = {
14 screen = screen,
15 awesome = awesome,
16 client = client
18 local client = require("awful.client")
20 --- Layout module for awful
21 -- awful.layout
22 local layout = {}
23 layout.suit = require("awful.layout.suit")
25 -- This is a special lock used by the arrange function.
26 -- This avoids recurring call by emitted signals.
27 local arrange_lock = false
29 --- Get the current layout.
30 -- @param screen The screen number.
31 -- @return The layout function.
32 function layout.get(screen)
33 local t = tag.selected(screen)
34 return tag.getproperty(t, "layout") or layout.suit.floating
35 end
37 --- Change the layout of the current tag.
38 -- @param layouts A table of layouts.
39 -- @param i Relative index.
40 function layout.inc(layouts, i)
41 local t = tag.selected()
42 if t then
43 local curlayout = layout.get()
44 local curindex
45 local rev_layouts = {}
46 for k, v in ipairs(layouts) do
47 if v == curlayout then
48 curindex = k
49 break
50 end
51 end
52 if curindex then
53 local newindex = util.cycle(#layouts, curindex + i)
54 layout.set(layouts[newindex])
55 end
56 end
57 end
59 --- Set the layout function of the current tag.
60 -- @param _layout Layout name.
61 -- @param t The tag to modify, if null tag.selected() is used.
62 function layout.set(_layout, t)
63 t = t or tag.selected()
64 tag.setproperty(t, "layout", _layout)
65 end
67 --- Arrange a screen using its current layout.
68 -- @param screen The screen to arrange.
69 function layout.arrange(screen)
70 if arrange_lock then return end
71 arrange_lock = true
72 local p = {}
73 p.workarea = capi.screen[screen].workarea
74 -- Handle padding
75 local padding = ascreen.padding(capi.screen[screen])
76 if padding then
77 p.workarea.x = p.workarea.x + (padding.left or 0)
78 p.workarea.y = p.workarea.y + (padding.top or 0)
79 p.workarea.width = p.workarea.width - ((padding.left or 0 ) + (padding.right or 0))
80 p.workarea.height = p.workarea.height - ((padding.top or 0) + (padding.bottom or 0))
81 end
82 p.geometry = capi.screen[screen].geometry
83 p.clients = client.tiled(screen)
84 p.screen = screen
85 layout.get(screen).arrange(p)
86 capi.screen[screen]:emit_signal("arrange")
87 arrange_lock = false
88 end
90 --- Get the current layout name.
91 -- @param layout The layout.
92 -- @return The layout name.
93 function layout.getname(_layout)
94 local _layout = _layout or layout.get()
95 return _layout.name
96 end
98 local function arrange_prop(obj) layout.arrange(obj.screen) end
100 capi.client.connect_signal("property::size_hints_honor", arrange_prop)
101 capi.client.connect_signal("property::struts", arrange_prop)
102 capi.client.connect_signal("property::minimized", arrange_prop)
103 capi.client.connect_signal("property::sticky", arrange_prop)
104 capi.client.connect_signal("property::fullscreen", arrange_prop)
105 capi.client.connect_signal("property::maximized_horizontal", arrange_prop)
106 capi.client.connect_signal("property::maximized_vertical", arrange_prop)
107 capi.client.connect_signal("property::border_width", arrange_prop)
108 capi.client.connect_signal("property::hidden", arrange_prop)
109 capi.client.connect_signal("property::floating", arrange_prop)
110 capi.client.connect_signal("property::geometry", arrange_prop)
111 -- If prop is screen, we do not know what was the previous screen, so
112 -- let's arrange all screens :-(
113 capi.client.connect_signal("property::screen", function(c)
114 for screen = 1, capi.screen.count() do layout.arrange(screen) end end)
116 local function arrange_on_tagged(c, tag)
117 if not tag.screen then return end
118 layout.arrange(tag.screen)
119 if not capi.client.focus or not capi.client.focus:isvisible() then
120 local c = client.focus.history.get(tag.screen, 0)
121 if c then capi.client.focus = c end
124 local function arrange_tag(t)
125 layout.arrange(tag.getscreen(t))
128 for s = 1, capi.screen.count() do
129 capi.screen[s]:add_signal("arrange")
131 tag.attached_connect_signal(s, "property::mwfact", arrange_tag)
132 tag.attached_connect_signal(s, "property::nmaster", arrange_tag)
133 tag.attached_connect_signal(s, "property::ncol", arrange_tag)
134 tag.attached_connect_signal(s, "property::layout", arrange_tag)
135 tag.attached_connect_signal(s, "property::windowfact", arrange_tag)
136 tag.attached_connect_signal(s, "property::selected", arrange_tag)
137 tag.attached_connect_signal(s, "property::activated", arrange_tag)
138 tag.attached_connect_signal(s, "tagged", arrange_tag)
139 capi.screen[s]:connect_signal("property::workarea", function(screen)
140 layout.arrange(screen.index)
141 end)
142 capi.screen[s]:connect_signal("padding", function (screen)
143 layout.arrange(screen.index)
144 end)
147 capi.client.connect_signal("focus", function(c) layout.arrange(c.screen) end)
148 capi.client.connect_signal("list", function()
149 for screen = 1, capi.screen.count() do
150 layout.arrange(screen)
152 end)
154 return layout
156 -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80