awful.screen: fix padding
[awesome.git] / lib / awful / layout / init.lua.in
blob963582e4ea75e58a8f62abee8582aef2944c2d1e
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 capi = { screen = screen, client = client }
11 local tag = require("awful.tag")
12 local util = require("awful.util")
13 local suit = require("awful.layout.suit")
14 local ascreen = require("awful.screen")
15 local capi = {
16 screen = screen,
17 awesome = awesome,
18 client = client
20 local client = require("awful.client")
22 --- Layout module for awful
23 module("awful.layout")
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 get(screen)
33 local t = tag.selected(screen)
34 return tag.getproperty(t, "layout") or 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 inc(layouts, i)
41 local t = tag.selected()
42 if t then
43 local curlayout = 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 set(layouts[newindex])
55 end
56 end
57 end
59 --- Set the layout function of the current tag.
60 -- @param layout Layout name.
61 function set(layout, t)
62 t = t or tag.selected()
63 tag.setproperty(t, "layout", layout)
64 end
66 --- Arrange a screen using its current layout.
67 -- @param screen The screen to arrange.
68 function arrange(screen)
69 if arrange_lock then return end
70 arrange_lock = true
71 local p = {}
72 p.workarea = capi.screen[screen].workarea
73 -- Handle padding
74 local padding = ascreen.padding(capi.screen[screen])
75 if padding then
76 p.workarea.x = p.workarea.x + (padding.left or 0)
77 p.workarea.y = p.workarea.y + (padding.top or 0)
78 p.workarea.width = p.workarea.width - ((padding.left or 0 ) + (padding.right or 0))
79 p.workarea.height = p.workarea.height - ((padding.top or 0) + (padding.bottom or 0))
80 end
81 p.geometry = capi.screen[screen].geometry
82 p.clients = client.tiled(screen)
83 p.screen = screen
84 get(screen).arrange(p)
85 arrange_lock = false
86 end
88 --- Get the current layout name.
89 -- @param layout The layout.
90 -- @return The layout name.
91 function getname(layout)
92 local layout = layout or get()
93 return layout.name
94 end
96 local function arrange_prop(obj) arrange(obj.screen) end
98 capi.client.add_signal("new", function(c)
99 c:add_signal("property::size_hints_honor", arrange_prop)
100 c:add_signal("property::struts", arrange_prop)
101 c:add_signal("property::minimized", arrange_prop)
102 c:add_signal("property::sticky", arrange_prop)
103 c:add_signal("property::fullscreen", arrange_prop)
104 c:add_signal("property::maximized_horizontal", arrange_prop)
105 c:add_signal("property::maximized_vertical", arrange_prop)
106 c:add_signal("property::border_width", arrange_prop)
107 c:add_signal("property::hidden", arrange_prop)
108 c:add_signal("property::titlebar", arrange_prop)
109 c:add_signal("property::floating", arrange_prop)
110 c:add_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 c:add_signal("property::screen", function(c)
114 for screen = 1, capi.screen.count() do arrange(screen) end end)
115 end)
117 local function arrange_on_tagged(c, tag)
118 if not tag.screen then return end
119 arrange(tag.screen)
120 if not capi.client.focus or not capi.client.focus:isvisible() then
121 local c = client.focus.history.get(tag.screen, 0)
122 if c then capi.client.focus = c end
126 for s = 1, capi.screen.count() do
127 tag.attached_add_signal(s, "property::mwfact", arrange_prop)
128 tag.attached_add_signal(s, "property::nmaster", arrange_prop)
129 tag.attached_add_signal(s, "property::ncol", arrange_prop)
130 tag.attached_add_signal(s, "property::layout", arrange_prop)
131 tag.attached_add_signal(s, "property::windowfact", arrange_prop)
132 tag.attached_add_signal(s, "property::selected", arrange_prop)
133 tag.attached_add_signal(s, "tagged", arrange_prop)
134 capi.screen[s]:add_signal("property::workarea", function(screen)
135 arrange(screen.index)
136 end)
137 capi.screen[s]:add_signal("tag::attach", function (screen, tag)
138 arrange(screen.index)
139 end)
140 capi.screen[s]:add_signal("tag::detach", function (screen, tag)
141 arrange(screen.index)
142 end)
143 capi.screen[s]:add_signal("padding", function (screen)
144 arrange(screen.index)
145 end)
148 capi.client.add_signal("focus", function(c) arrange(c.screen) end)
149 capi.client.add_signal("list", function()
150 for screen = 1, capi.screen.count() do
151 arrange(screen)
153 end)
155 -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80