]> git.madduck.net Git - etc/awesome.git/blobdiff - 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:

closes #318
[etc/awesome.git] / layout / termfair.lua
index 6d244606a87a96b284135dc1361be93c4f7df356..33b7ffc7489634761565caab3248c336b494a975 100644 (file)
@@ -9,24 +9,21 @@
                                                   
 --]]
 
                                                   
 --]]
 
-local tag      = require("awful.tag")
 local math     = { ceil  = math.ceil,
                    floor = math.floor,
                    max   = math.max }
 local math     = { ceil  = math.ceil,
                    floor = math.floor,
                    max   = math.max }
+local screen   = screen
 local tonumber = tonumber
 
 local termfair  = { name = "termfair" }
 termfair.center = { name = "centerfair" }
 
 local function do_fair(p, orientation)
 local tonumber = tonumber
 
 local termfair  = { name = "termfair" }
 termfair.center = { name = "centerfair" }
 
 local function do_fair(p, orientation)
-    -- Screen.
-    local wa  = p.workarea
+    local t = p.tag or screen[p.screen].selected_tag
+    local wa = p.workarea
     local cls = p.clients
 
     local cls = p.clients
 
-    if #cls <= 0 then return end
-
-    -- Useless gaps.
-    local useless_gap = p.useless_gap or 0
+    if #cls == 0 then return end
 
     if orientation == "west" then
         -- Layout with fixed number of vertical columns (read from nmaster).
 
     if orientation == "west" then
         -- Layout with fixed number of vertical columns (read from nmaster).
@@ -47,18 +44,16 @@ local function do_fair(p, orientation)
         --   | 3 | 2 | 1 |      | 3 | 2 | 1 |      | 3 | 2 | 1 |
         --   +---+---+---+      +---+---+---+      +---+---+---+
 
         --   | 3 | 2 | 1 |      | 3 | 2 | 1 |      | 3 | 2 | 1 |
         --   +---+---+---+      +---+---+---+      +---+---+---+
 
-        if #cls <= 0 then return end
-
         -- How many vertical columns? Read from nmaster on the tag.
         -- How many vertical columns? Read from nmaster on the tag.
-        local num_x = tonumber(termfair.nmaster) or tag.master_count
-        local ncol  = tonumber(termfair.ncol) or tag.column_count
-        local width = math.floor((wa.width - (num_x + 1)*useless_gap) / num_x)
+        local num_x = tonumber(termfair.nmaster) or t.master_count
+        local ncol  = tonumber(termfair.ncol) or t.column_count
 
         if num_x <= 2 then num_x = 2 end
         if ncol  <= 1 then ncol  = 1 end
 
         if num_x <= 2 then num_x = 2 end
         if ncol  <= 1 then ncol  = 1 end
+        local width = math.floor(wa.width/num_x)
 
         local num_y     = math.max(math.ceil(#cls / num_x), ncol)
 
         local num_y     = math.max(math.ceil(#cls / num_x), ncol)
-        local height    = math.floor((wa.height - (num_y + 1)*useless_gap) / num_y)
+        local height    = math.floor(wa.height/num_y)
         local cur_num_x = num_x
         local at_x      = 0
         local at_y      = 0
         local cur_num_x = num_x
         local at_x      = 0
         local at_y      = 0
@@ -81,30 +76,24 @@ local function do_fair(p, orientation)
             -- Calculate geometry.
             local g = {}
             if this_x == (num_x - 1) then
             -- Calculate geometry.
             local g = {}
             if this_x == (num_x - 1) then
-                g.width = wa.width - (num_x - 1)*width - (num_x + 1)*useless_gap - 2*c.border_width
+                g.width = wa.width - (num_x - 1)*width
             else
             else
-                g.width = width - 2*c.border_width
+                g.width = width
             end
 
             if this_y == (num_y - 1) then
             end
 
             if this_y == (num_y - 1) then
-                g.height = wa.height - (num_y - 1)*height - (num_y + 1)*useless_gap - 2*c.border_width
+                g.height = wa.height - (num_y - 1)*height
             else
             else
-                g.height = height - 2*c.border_width
+                g.height = height
             end
 
             g.x = wa.x + this_x*width
             g.y = wa.y + this_y*height
 
             end
 
             g.x = wa.x + this_x*width
             g.y = wa.y + this_y*height
 
-            if useless_gap > 0 then
-                -- All clients tile evenly.
-                g.x = g.x + (this_x + 1)*useless_gap
-                g.y = g.y + (this_y + 1)*useless_gap
-            end
-
-            if g.width < 1 then g.width = 1 end
+            if g.width  < 1 then g.width  = 1 end
             if g.height < 1 then g.height = 1 end
 
             if g.height < 1 then g.height = 1 end
 
-            c:geometry(g)
+            p.geometries[c] = g
 
             remaining_clients = remaining_clients - 1
 
 
             remaining_clients = remaining_clients - 1
 
@@ -143,99 +132,98 @@ local function do_fair(p, orientation)
         --   +---+---+---+      +---+---+---+
 
         -- How many vertical columns? Read from nmaster on the tag.
         --   +---+---+---+      +---+---+---+
 
         -- How many vertical columns? Read from nmaster on the tag.
-        local num_x = tonumber(termfair.center.nmaster) or tag.master_count
-        local ncol  = tonumber(termfair.center.ncol) or tag.column_count
-        local width = math.floor((wa.width - (num_x + 1)*useless_gap) / num_x)
+        local num_x = tonumber(termfair.center.nmaster) or t.master_count
+        local ncol  = tonumber(termfair.center.ncol) or t.column_count
 
         if num_x <= 2 then num_x = 2 end
         if ncol  <= 1 then ncol  = 1 end
 
 
         if num_x <= 2 then num_x = 2 end
         if ncol  <= 1 then ncol  = 1 end
 
+        local width = math.floor(wa.width / num_x)
+
         if #cls < num_x then
             -- Less clients than the number of columns, let's center it!
         if #cls < num_x then
             -- Less clients than the number of columns, let's center it!
-            local offset_x = wa.x + (wa.width - #cls*width - (#cls - 1)*useless_gap) / 2
-            local g = {}
-            g.y = wa.y + useless_gap
+            local offset_x = wa.x + (wa.width - #cls*width) / 2
             for i = 1, #cls do
             for i = 1, #cls do
-                local c = cls[i]
-                g.width = width - 2*c.border_width
-                g.height = wa.height - 2*useless_gap - 2*c.border_width
+                local g = { y = wa.y }
+                g.width  = width
+                g.height = wa.height
                 if g.width < 1 then g.width = 1 end
                 if g.height < 1 then g.height = 1 end
                 if g.width < 1 then g.width = 1 end
                 if g.height < 1 then g.height = 1 end
-                g.x = offset_x + (i - 1) * (width + useless_gap)
-                c:geometry(g)
+                g.x = offset_x + (i - 1) * width
+                p.geometries[cls[i]] = g
             end
         else
             -- More clients than the number of columns, let's arrange it!
             -- Master client deserves a special treatement
             end
         else
             -- More clients than the number of columns, let's arrange it!
             -- Master client deserves a special treatement
-            local c = cls[1]
             local g = {}
             local g = {}
-            g.width = wa.width - (num_x - 1)*width - (num_x + 1)*useless_gap - 2*c.border_width
-            g.height = wa.height - 2*useless_gap - 2*c.border_width
+            g.width = wa.width - (num_x - 1)*width
+            g.height = wa.height
             if g.width < 1 then g.width = 1 end
             if g.height < 1 then g.height = 1 end
             if g.width < 1 then g.width = 1 end
             if g.height < 1 then g.height = 1 end
-            g.x = wa.x + useless_gap
-            g.y = wa.y + useless_gap
-
-            c:geometry(g)
+            g.x = wa.x
+            g.y = wa.y
+            p.geometries[cls[1]] = g
 
             -- Treat the other clients
 
             -- Compute distribution of clients among columns
 
             -- Treat the other clients
 
             -- Compute distribution of clients among columns
-            local num_y ={}
-            do
-                local remaining_clients = #cls-1
-                local ncol_min = math.ceil(remaining_clients/(num_x-1))
-                if ncol >= ncol_min then
-                    for i = (num_x-1), 1, -1 do
-                        if (remaining_clients-i+1) < ncol then
-                            num_y[i] = remaining_clients-i + 1
-                        else
-                            num_y[i] = ncol
-                        end
-                        remaining_clients = remaining_clients - num_y[i]
+            local num_y = {}
+            local remaining_clients = #cls-1
+            local ncol_min = math.ceil(remaining_clients/(num_x-1))
+
+            if ncol >= ncol_min then
+                for i = (num_x-1), 1, -1 do
+                    if (remaining_clients-i+1) < ncol then
+                        num_y[i] = remaining_clients-i + 1
+                    else
+                        num_y[i] = ncol
+                    end
+                    remaining_clients = remaining_clients - num_y[i]
+                end
+            else
+                local rem = remaining_clients % (num_x-1)
+                if rem == 0 then
+                    for i = 1, num_x-1 do
+                        num_y[i] = ncol_min
                     end
                 else
                     end
                 else
-                    local rem = remaining_clients % (num_x-1)
-                    if rem == 0 then
-                        for i = 1, num_x-1 do
-                            num_y[i] = ncol_min
-                        end
-                    else
-                        for i = 1, num_x-1 do
-                            num_y[i] = ncol_min - 1
-                        end
-                        for i = 0, rem-1 do
-                            num_y[num_x-1-i] = num_y[num_x-1-i] + 1
-                        end
+                    for i = 1, num_x-1 do
+                        num_y[i] = ncol_min - 1
+                    end
+                    for i = 0, rem-1 do
+                        num_y[num_x-1-i] = num_y[num_x-1-i] + 1
                     end
                 end
             end
 
             -- Compute geometry of the other clients
             local nclient = 2 -- we start with the 2nd client
                     end
                 end
             end
 
             -- Compute geometry of the other clients
             local nclient = 2 -- we start with the 2nd client
-            g.x = g.x + g.width + useless_gap + 2*c.border_width
-
+            local wx = g.x + g.width
             for i = 1, (num_x-1) do
             for i = 1, (num_x-1) do
-                local height = math.floor((wa.height - (num_y[i] + 1)*useless_gap) / num_y[i])
-                g.y = wa.y + useless_gap
+                local height = math.floor(wa.height / num_y[i])
+                local wy = wa.y
                 for j = 0, (num_y[i]-2) do
                 for j = 0, (num_y[i]-2) do
-                    local c = cls[nclient]
-                    g.height = height - 2*c.border_width
-                    g.width = width - 2*c.border_width
+                    local g = {}
+                    g.x = wx
+                    g.y = wy
+                    g.height = height
+                    g.width = width
                     if g.width < 1 then g.width = 1 end
                     if g.height < 1 then g.height = 1 end
                     if g.width < 1 then g.width = 1 end
                     if g.height < 1 then g.height = 1 end
-                    c:geometry(g)
+                    p.geometries[cls[nclient]] = g
                     nclient = nclient + 1
                     nclient = nclient + 1
-                    g.y = g.y + height + useless_gap
+                    wy = wy + height
                 end
                 end
-                local c = cls[nclient]
-                g.height = wa.height - (num_y[i] + 1)*useless_gap - (num_y[i] - 1)*height - 2*c.border_width
-                g.width = width - 2*c.border_width
+                local g = {}
+                g.x = wx
+                g.y = wy
+                g.height = wa.height - (num_y[i] - 1)*height
+                g.width = width
                 if g.width < 1 then g.width = 1 end
                 if g.height < 1 then g.height = 1 end
                 if g.width < 1 then g.width = 1 end
                 if g.height < 1 then g.height = 1 end
-                c:geometry(g)
+                p.geometries[cls[nclient]] = g
                 nclient = nclient + 1
                 nclient = nclient + 1
-                g.x = g.x + width + useless_gap
+                wx = wx + width
             end
         end
     end
             end
         end
     end