summaryrefslogtreecommitdiff
path: root/lain/layout/centerwork.lua
blob: 61f4907b78d1f581f11d013a467ff72a5af3ea00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

--[[
                                                  
     Licensed under GNU General Public License v2 
      * (c) 2014,      projektile                 
      * (c) 2013,      Luke Bonham                
      * (c) 2010-2012, Peter Hofmann              
                                                  
--]]

local awful     = require("awful")
local beautiful = require("beautiful")
local tonumber  = tonumber
local math      = { floor = math.floor }

local centerwork =
{
    name         = "centerwork",
    top_left     = 0,
    top_right    = 1,
    bottom_left  = 2,
    bottom_right = 3
}

function centerwork.arrange(p)
    -- A useless gap (like the dwm patch) can be defined with
    -- beautiful.useless_gap_width .
    local useless_gap = tonumber(beautiful.useless_gap_width) or 0

    -- 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

    -- Borders are factored in.
    wa.height = wa.height - ((global_border * 2) + (bw * 2))
    wa.width = wa.width - ((global_border * 2) + (bw * 2))

    -- Width of main column?
    local t = awful.tag.selected(p.screen)
    local mwfact = awful.tag.getmwfact(t)

    if #cls > 0
    then
        -- Main column, fixed width and height.
        local c = cls[#cls]
        local g = {}
        local mainwid = math.floor(wa.width * mwfact)
        local slavewid = wa.width - mainwid
        local slaveLwid = math.floor(slavewid / 2)
        local slaveRwid = slavewid - slaveLwid
        local slaveThei = math.floor(wa.height / 2)
        local slaveBhei = wa.height - slaveThei

        g.height = wa.height - 2 * useless_gap
        g.width = mainwid
        g.x = wa.x + slaveLwid + global_border
        g.y = wa.y + useless_gap + global_border

        c:geometry(g)

        -- Auxiliary windows.
        if #cls > 1
        then
            local at = 0
            for i = (#cls - 1),1,-1
            do
                -- It's all fixed. If there are more than 5 clients,
                -- those additional clients will float. This is
                -- intentional.
                if at == 4
                then
                    break
                end

                c = cls[i]
                g = {}

                if at == centerwork.top_left
                then
                    -- top left
                    g.x = wa.x + useless_gap + global_border
                    g.y = wa.y + useless_gap + global_border
                    g.width = slaveLwid - 2 * useless_gap
                    g.height = slaveThei - useless_gap
                elseif at == centerwork.top_right
                then
                    -- top right
                    g.x = wa.x + slaveLwid + mainwid + useless_gap + global_border
                    g.y = wa.y + useless_gap + global_border
                    g.width = slaveRwid - 2 * useless_gap
                    g.height = slaveThei - useless_gap
                elseif at == centerwork.bottom_left
                then
                    -- bottom left
                    g.x = wa.x + useless_gap + global_border
                    g.y = wa.y + slaveThei + useless_gap + global_border
                    g.width = slaveLwid - 2 * useless_gap
                    g.height = slaveBhei - 2 * useless_gap
                elseif at == centerwork.bottom_right
                then
                    -- bottom right
                    g.x = wa.x + slaveLwid + mainwid + useless_gap + global_border
                    g.y = wa.y + slaveThei + useless_gap + global_border
                    g.width = slaveRwid - 2 * useless_gap
                    g.height = slaveBhei - 2 * useless_gap
                end

                c:geometry(g)

                at = at + 1
            end

            -- Set remaining clients to floating.
            for i = (#cls - 1 - 4),1,-1
            do
                c = cls[i]
                awful.client.floating.set(c, true)
            end
        end
    end
end

return centerwork