]> git.madduck.net Git - etc/awesome.git/blob - layout/termfair.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge pull request #90 from jepugs/master
[etc/awesome.git] / layout / termfair.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2014,      projektile                 
6       * (c) 2013,      Luke Bonham                
7       * (c) 2010-2012, Peter Hofmann              
8                                                   
9 --]]
10
11 local tag       = require("awful.tag")
12 local beautiful = require("beautiful")
13 local math      = { ceil  = math.ceil,
14                     floor = math.floor,
15                     max   = math.max }
16 local tonumber  = tonumber
17
18 local termfair  = { name = "termfair" }
19
20 function termfair.arrange(p)
21     -- Layout with fixed number of vertical columns (read from nmaster).
22     -- New windows align from left to right. When a row is full, a now
23     -- one above it is created. Like this:
24
25     --        (1)                (2)                (3)
26     --   +---+---+---+      +---+---+---+      +---+---+---+
27     --   |   |   |   |      |   |   |   |      |   |   |   |
28     --   | 1 |   |   |  ->  | 2 | 1 |   |  ->  | 3 | 2 | 1 |  ->
29     --   |   |   |   |      |   |   |   |      |   |   |   |
30     --   +---+---+---+      +---+---+---+      +---+---+---+
31
32     --        (4)                (5)                (6)
33     --   +---+---+---+      +---+---+---+      +---+---+---+
34     --   | 4 |   |   |      | 5 | 4 |   |      | 6 | 5 | 4 |
35     --   +---+---+---+  ->  +---+---+---+  ->  +---+---+---+
36     --   | 3 | 2 | 1 |      | 3 | 2 | 1 |      | 3 | 2 | 1 |
37     --   +---+---+---+      +---+---+---+      +---+---+---+
38
39     -- A useless gap (like the dwm patch) can be defined with
40     -- beautiful.useless_gap_width.
41     local useless_gap = tonumber(beautiful.useless_gap_width) or 0
42     if useless_gap < 0 then useless_gap = 0 end
43
44     -- A global border can be defined with
45     -- beautiful.global_border_width
46     local global_border = tonumber(beautiful.global_border_width) or 0
47     if global_border < 0 then global_border = 0 end
48
49     -- Themes border width requires an offset
50     local bw = tonumber(beautiful.border_width) or 0
51
52     -- Screen.
53     local wa = p.workarea
54     local cls = p.clients
55
56     -- Borders are factored in.
57     wa.height = wa.height - ((global_border * 2) + (bw * 2))
58     wa.width = wa.width - ((global_border * 2) + (bw * 2))
59
60     -- How many vertical columns?
61     local t = tag.selected(p.screen)
62     local num_x = termfair.nmaster or tag.getnmaster(t)
63
64     -- Do at least "desired_y" rows.
65     local desired_y = termfair.ncol or tag.getncol(t)
66
67     if #cls > 0
68     then
69         local num_y = math.max(math.ceil(#cls / num_x), desired_y)
70         local cur_num_x = num_x
71         local at_x = 0
72         local at_y = 0
73         local remaining_clients = #cls
74         local width = math.floor(wa.width / num_x)
75         local height = math.floor(wa.height / num_y)
76
77         -- We start the first row. Left-align by limiting the number of
78         -- available slots.
79         if remaining_clients < num_x
80         then
81             cur_num_x = remaining_clients
82         end
83
84         -- Iterate in reversed order.
85         for i = #cls,1,-1
86         do
87             -- Get x and y position.
88             local c = cls[i]
89             local this_x = cur_num_x - at_x - 1
90             local this_y = num_y - at_y - 1
91
92             -- Calc geometry.
93             local g = {}
94             if this_x == (num_x - 1)
95             then
96                 g.width = wa.width - (num_x - 1) * width - useless_gap
97             else
98                 g.width = width - useless_gap
99             end
100             if this_y == (num_y - 1)
101             then
102                 g.height = wa.height - (num_y - 1) * height - useless_gap
103             else
104                 g.height = height - useless_gap
105             end
106
107             g.x = wa.x + this_x * width + global_border
108             g.y = wa.y + this_y * height + global_border
109
110             if useless_gap > 0
111             then
112                 -- All clients tile evenly.
113                 g.x = g.x + (useless_gap / 2)
114                 g.y = g.y + (useless_gap / 2)
115
116             end
117             c:geometry(g)
118             remaining_clients = remaining_clients - 1
119
120             -- Next grid position.
121             at_x = at_x + 1
122             if at_x == num_x
123             then
124                 -- Row full, create a new one above it.
125                 at_x = 0
126                 at_y = at_y + 1
127
128                 -- We start a new row. Left-align.
129                 if remaining_clients < num_x
130                 then
131                     cur_num_x = remaining_clients
132                 end
133             end
134         end
135     end
136 end
137
138 return termfair