1 ---------------------------------------------------------------------------
2 -- @author Julien Danjou <julien@danjou.info>
3 -- @copyright 2008 Julien Danjou
4 -- @release @AWESOME_VERSION@
5 ---------------------------------------------------------------------------
7 -- Grab environment we need
10 local tag = require("awful.tag")
11 local util
= require("awful.util")
12 local ascreen
= require("awful.screen")
18 local client
= require("awful.client")
20 --- Layout module for awful
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
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()
43 local curlayout
= layout
.get()
45 local rev_layouts
= {}
46 for k
, v
in ipairs(layouts
) do
47 if v
== curlayout
then
53 local newindex
= util
.cycle(#layouts
, curindex
+ i
)
54 layout
.set(layouts
[newindex
])
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
)
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
73 p
.workarea
= capi
.screen
[screen
].workarea
75 local padding
= ascreen
.padding(capi
.screen
[screen
])
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))
82 p
.geometry
= capi
.screen
[screen
].geometry
83 p
.clients
= client
.tiled(screen
)
85 layout
.get(screen
).arrange(p
)
86 capi
.screen
[screen
]:emit_signal("arrange")
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()
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
)
142 capi
.screen
[s
]:connect_signal("padding", function (screen
)
143 layout
.arrange(screen
.index
)
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
)
156 -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80