From 5de6ca283bffbc041eeb094c8b82dfd8d680f04f Mon Sep 17 00:00:00 2001
From: luke bonham <dadasignificanulla@gmail.com>
Date: Fri, 4 Oct 2013 18:53:33 +0200
Subject: [PATCH] issue #2 fix attempt; centerfair added; small fixes

---
 icons/layout/default/centerfair.png  | Bin 0 -> 169 bytes
 icons/layout/default/centerfairw.png | Bin 0 -> 169 bytes
 icons/layout/zenburn/centerfair.png  | Bin 0 -> 399 bytes
 layout/centerfair.lua                | 147 +++++++++++++++++++++++++++
 layout/termfair.lua                  |  13 ++-
 layout/uselessfair.lua               |  11 +-
 layout/uselesspiral.lua              |  10 +-
 layout/uselesstile.lua               |  10 +-
 wiki                                 |   2 +-
 9 files changed, 176 insertions(+), 17 deletions(-)
 create mode 100644 icons/layout/default/centerfair.png
 create mode 100644 icons/layout/default/centerfairw.png
 create mode 100644 icons/layout/zenburn/centerfair.png
 create mode 100644 layout/centerfair.lua

diff --git a/icons/layout/default/centerfair.png b/icons/layout/default/centerfair.png
new file mode 100644
index 0000000000000000000000000000000000000000..188c24348eee1dd1efcc5beb7c2c72ff7f5320f0
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB_V)Sem}`Jdk263GxeO
zaCmkj4a7<Ec6VXuV3qX%aySb-B8wRqxP?KOkzv*x37{Z*iKnkC`&}*;0e%Y+Dcv@p
zkc_8`V~EE2<RAR3JTrROd1`nZnrf#QUXt7)%*k*xVwSK>+(lKOItEWyKbLh*2~7Yr
Chb7ej

literal 0
HcmV?d00001

diff --git a/icons/layout/default/centerfairw.png b/icons/layout/default/centerfairw.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed4bcf5cd63ef3f1f3d7df24d941648ac1856f48
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L
z7tG-B>_!@hljQC0!qCAg>jC6&7I;J!Gca%qgD@k*tT_@uLG}_)Usv|KTr2{-W(TJv
zfsB^%ba4#PIG_B3pOt4u4?9l{k3&=K6vIoBJA^qIjz-K9mWjKl3RK77>FVdQ&MBb@
E00x{Y4FCWD

literal 0
HcmV?d00001

diff --git a/icons/layout/zenburn/centerfair.png b/icons/layout/zenburn/centerfair.png
new file mode 100644
index 0000000000000000000000000000000000000000..01cda8e89c14980825199778ed2c5defea611305
GIT binary patch
literal 399
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_f1s;*b
z3=G`DAk4@xYmNj^kiEpy*OmP)7mI+hilvrRIs*fvjHioZNX4zUw{7{F3?z<yWH-q>
zR>3q~ZsF$bA6CR2n5q1Qi%-q1x4|M}5}%O(m*>O(dRjBuKV9C}ATQ*qyKB>j#$s1v
zlM52FSu3YYG@BfgYd$l1$?*dximTJ-KIkr+e&q<)X<?R(q_(Ht?-@1y8gpCZ6sj14
z6=EBjm+W2AYu}Sz%lEZ-2GjKg>`%ThoMV2*KS5pE?%3B;LX5MPGS^t}1D%ZylES|D
zx6aj`;-vN-T?&=oz@qhPd*tGOLbrD&J)by#QdnKJ{@;J^f_^W*dN9IllGpypp}X%%
zM6=J_dn}=6uHWbL$MR)Yuj+fcbbqZetJ*649WM=Y<-6Xl2AS&V>gTe~DWM4flk|#Z

literal 0
HcmV?d00001

diff --git a/layout/centerfair.lua b/layout/centerfair.lua
new file mode 100644
index 0000000..d9ea677
--- /dev/null
+++ b/layout/centerfair.lua
@@ -0,0 +1,147 @@
+
+--[[
+                                                  
+     Licensed under GNU General Public License v2 
+      * (c) 2013,      Luke Bonham                
+      * (c) 2012,      Nicolas Estibals           
+      * (c) 2010-2012, Peter Hofmann              
+                                                  
+--]]
+
+local tag       = require("awful.tag")
+local beautiful = require("beautiful")
+local math      = { ceil  = math.ceil,
+                    floor = math.floor,
+                    max   = math.max }
+local tonumber  = tonumber
+
+local centerfair  = { name = "centerfair" }
+
+function centerfair.arrange(p)
+    -- Layout with fixed number of vertical columns (read from nmaster).
+    -- Cols are centerded until there is nmaster columns, then windows
+    -- are stacked in the slave columns, with at most ncol clients per
+    -- column if possible.
+
+    -- with nmaster=3 and ncol=1 you'll have
+    --        (1)                (2)                (3)
+    --   +---+---+---+      +-+---+---+-+      +---+---+---+
+    --   |   |   |   |      | |   |   | |      |   |   |   |
+    --   |   | 1 |   |  ->  | | 1 | 2 | | ->   | 1 | 2 | 3 |  ->
+    --   |   |   |   |      | |   |   | |      |   |   |   |
+    --   +---+---+---+      +-+---+---+-+      +---+---+---+
+
+    --        (4)                (5)
+    --   +---+---+---+      +---+---+---+
+    --   |   |   | 3 |      |   | 2 | 4 |
+    --   + 1 + 2 +---+  ->  + 1 +---+---+
+    --   |   |   | 4 |      |   | 3 | 5 |
+    --   +---+---+---+      +---+---+---+
+
+    -- 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
+
+    -- Screen.
+    local wa = p.workarea
+    local cls = p.clients
+
+    -- How many vertical columns? Read from nmaster on the tag.
+    local t = tag.selected(p.screen)
+    local num_x = centerfair.nmaster or tag.getnmaster(t)
+    local ncol = centerfair.ncol or tag.getncol(t)
+
+    local width = math.floor((wa.width-(num_x+1)*useless_gap) / num_x)
+
+    local offset_y = wa.y + useless_gap
+    if #cls < num_x
+    then
+        -- Less clients than the number of columns, let's center it!
+        local offset_x = wa.x + useless_gap + (wa.width - #cls*width - (#cls+1)*useless_gap) / 2
+        local g = {}
+        g.width = width
+        g.height = wa.height - 2*useless_gap - 2
+        g.y = offset_y
+        for i = 1, #cls do
+            g.x = offset_x + (i - 1) * (width + useless_gap + 2)
+            cls[i]:geometry(g)
+        end
+    else
+        -- More clients than the number of columns, let's arrange it!
+        local offset_x = wa.x 
+        if useless_gap > 0 then
+           offset_x = offset_x 
+        end
+
+        -- Master client deserves a special treatement
+        local g = {}
+        g.width = wa.width - (num_x-1)*width -num_x*useless_gap - 2
+        g.height = wa.height - 2*useless_gap - 2
+        g.x = offset_x + useless_gap
+        g.y = offset_y
+        cls[1]:geometry(g)
+
+        -- 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]
+                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
+                end
+            end
+        end
+
+        -- Compute geometry of the other clients
+        local nclient = 2
+        g.x = g.x + g.width+useless_gap + 2
+        g.width = width
+
+        if useless_gap > 0 then
+            g.width = g.width - useless_gap/2 - 2
+        end
+
+        for i = 1, (num_x-1) do
+            to_remove = 2
+            g.height = math.floor((wa.height-useless_gap)/num_y[i]) 
+            g.y = offset_y
+            for j = 0, (num_y[i]-2) do
+                cls[nclient]:geometry(g)
+                nclient = nclient + 1
+                g.y = g.y + g.height+useless_gap + 2
+                to_remove = to_remove + 2
+            end
+            g.height = wa.height - num_y[i]*useless_gap - (num_y[i]-1)*g.height - useless_gap - to_remove
+            cls[nclient]:geometry(g)
+            nclient = nclient + 1
+            g.x = g.x+g.width+useless_gap + 2
+        end
+    end
+end
+
+return centerfair
diff --git a/layout/termfair.lua b/layout/termfair.lua
index 4beab8f..89a44bb 100644
--- a/layout/termfair.lua
+++ b/layout/termfair.lua
@@ -89,27 +89,32 @@ function termfair.arrange(p)
             else
                 g.height = height
             end
+
             g.x = wa.x + this_x * width
             g.y = wa.y + this_y * height
+
             if useless_gap > 0
             then
                 -- Top and left clients are shrinked by two steps and
                 -- get moved away from the border. Other clients just
                 -- get shrinked in one direction.
+                
+                gap_factor = (useless_gap / 100) * 2
+
                 if this_x == 0
                 then
-                    g.width = g.width - 2 * useless_gap
+                    g.width = g.width - (2 + gap_factor) * useless_gap
                     g.x = g.x + useless_gap
                 else
-                    g.width = g.width - useless_gap
+                    g.width = g.width - (1 + gap_factor) * useless_gap
                 end
 
                 if this_y == 0
                 then
-                    g.height = g.height - 2 * useless_gap
+                    g.height = g.height - (2 + gap_factor) * useless_gap
                     g.y = g.y + useless_gap
                 else
-                    g.height = g.height - useless_gap
+                    g.height = g.height - (1 + gap_factor) * useless_gap
                 end
             end
             c:geometry(g)
diff --git a/layout/uselessfair.lua b/layout/uselessfair.lua
index 7499d91..6aa6666 100644
--- a/layout/uselessfair.lua
+++ b/layout/uselessfair.lua
@@ -71,20 +71,23 @@ local function fair(p, orientation)
                 -- Top and left clients are shrinked by two steps and
                 -- get moved away from the border. Other clients just
                 -- get shrinked in one direction.
+
+                gap_factor = (useless_gap / 100) * 2
+
                 if this_x == 0
                 then
-                    g.width = g.width - 2 * useless_gap
+                    g.width = g.width - (2 + gap_factor) * useless_gap
                     g.x = g.x + useless_gap
                 else
-                    g.width = g.width - useless_gap
+                    g.width = g.width - (1 + gap_factor) * useless_gap
                 end
 
                 if this_y == 0
                 then
-                    g.height = g.height - 2 * useless_gap
+                    g.height = g.height - (2 + gap_factor) * useless_gap
                     g.y = g.y + useless_gap
                 else
-                    g.height = g.height - useless_gap 
+                    g.height = g.height - (1 + gap_factor) * useless_gap
                 end
             end
             -- End of useless gap.
diff --git a/layout/uselesspiral.lua b/layout/uselesspiral.lua
index ad2ba04..3164c75 100644
--- a/layout/uselesspiral.lua
+++ b/layout/uselesspiral.lua
@@ -64,6 +64,8 @@ local function spiral(p, spiral)
             top = false
             left = false
 
+            gap_factor = (useless_gap / 100) * 2
+
             if wa2.y == static_wa.y then
                top = true
             end
@@ -73,17 +75,17 @@ local function spiral(p, spiral)
             end
 
             if top then
-                wa2.height = wa2.height - 2 * useless_gap
+                wa2.height = wa2.height - (2 + gap_factor) * useless_gap
                 wa2.y = wa2.y + useless_gap
             else
-                wa2.height = wa2.height - useless_gap
+                wa2.height = wa2.height - (1 + gap_factor) * useless_gap
             end
 
             if left then
-                wa2.width = wa2.width - 2 * useless_gap
+                wa2.width = wa2.width - (2 + gap_factor) * useless_gap
                 wa2.x = wa2.x + useless_gap
             else
-                wa2.width = wa2.width - useless_gap
+                wa2.width = wa2.width - (1 + gap_factor) * useless_gap
             end
         end
         -- End of useless gap.
diff --git a/layout/uselesstile.lua b/layout/uselesstile.lua
index 78f7bec..e496500 100644
--- a/layout/uselesstile.lua
+++ b/layout/uselesstile.lua
@@ -88,6 +88,8 @@ local function tile_group(cls, wa, orientation, fact, group)
             top = false
             left = false
 
+            gap_factor = (useless_gap / 100) * 2
+
             if geom[y] == wa[y] then
                 top = true
             end
@@ -97,17 +99,17 @@ local function tile_group(cls, wa, orientation, fact, group)
             end
 
             if top then
-                geom[height] = geom[height] - 2 * useless_gap
+                geom[height] = geom[height] - (2 + gap_factor) * useless_gap
                 geom[y] = geom[y] + useless_gap
             else
-                geom[height] = geom[height] - useless_gap
+                geom[height] = geom[height] - (1 + gap_factor) * useless_gap 
             end
 
             if left then
-                geom[width] = geom[width] - 2 * useless_gap
+                geom[width] = geom[width] - (2 + gap_factor) * useless_gap
                 geom[x] = geom[x] + useless_gap
             else
-                geom[width] = geom[width] - useless_gap
+                geom[width] = geom[width] - (1 + gap_factor) * useless_gap
             end
         end
         -- End of useless gap.
diff --git a/wiki b/wiki
index 089c10d..e85974a 160000
--- a/wiki
+++ b/wiki
@@ -1 +1 @@
-Subproject commit 089c10dff4317654c8436ddef408d993d617e202
+Subproject commit e85974ae28dda46d1f1ad1d5985269ea50ce5e83
-- 
2.39.5