]> git.madduck.net Git - etc/awesome.git/blobdiff - layout/uselesstile.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 #110 from dnedbaylo/master
[etc/awesome.git] / layout / uselesstile.lua
index d244f439810c3a3ea8a4f01d1a484024597979ee..877fad1dcf6f01fae3e12946c2f567d823606516 100644 (file)
@@ -35,19 +35,18 @@ local function swap(geometry)
     return { x = geometry.y, y = geometry.x, width = geometry.height, height = geometry.width }
 end
 
--- Find geometry for column/row tiling
-local function cut_area(wa, total, index, is_horizontal)
-    local wa = is_horizontal and swap(wa) or wa
-    local height = wa.height / total
+-- Find geometry for secondary windows column
+local function cut_column(wa, n, index)
+    local width = wa.width / n
+    local area = { x = wa.x + (index - 1) * width, y = wa.y, width = width, height = wa.height }
 
-    local area = {
-        x = wa.x,
-        y = wa.y + (index - 1) * height,
-        width = wa.width,
-        height = height
-    }
+    return area
+end
 
-    if is_horizontal then area = swap(area) end
+-- Find geometry for certain window in column
+local function cut_row(wa, factor, index, used)
+    local height = wa.height * factor.window[index] / factor.total
+    local area = { x = wa.x, y = wa.y + used, width = wa.width, height = height }
 
     return area
 end
@@ -60,11 +59,33 @@ local function size_correction(c, geometry, useless_gap)
     geometry.y = geometry.y + useless_gap / 2
 end
 
+-- Check size factor for group of clients and calculate total
+local function calc_factor(n, winfactors)
+    local factor = { window = winfactors, total = 0, min = 1 }
+
+    for i = 1, n do
+        if not factor.window[i] then
+            factor.window[i] = factor.min
+        else
+            factor.min = math.min(factor.window[i], factor.min)
+            if factor.window[i] < 0.05 then factor.window[i] = 0.05 end
+        end
+        factor.total = factor.total + factor.window[i]
+    end
+
+    return factor
+end
+
 -- Tile group of clients in given area
 -- @canvas need for proper transformation only
-local function tile_column(canvas, area, list, useless_gap, transformation)
+-- @winfactors table with clients size factors
+local function tile_column(canvas, area, list, useless_gap, transformation, winfactors)
+    local used = 0
+    local factor = calc_factor(#list, winfactors)
+
     for i, c in ipairs(list) do
-        local g = cut_area(area, #list, i)
+        local g = cut_row(area, factor, i, used)
+        used = used + g.height
 
         -- swap workarea dimensions
         if transformation.flip then g = flip(canvas, g) end
@@ -102,6 +123,14 @@ local function tile(p, orientation)
         mwfact = 1
     end
 
+    -- clients size factor
+    local data = tag.getdata(t).windowfact
+
+    if not data then
+        data = {}
+        tag.getdata(t).windowfact = data
+    end
+
     -- Workarea size correction depending on useless gap and global border
     wa.height = wa.height - 2 * global_border - useless_gap
     wa.width  = wa.width -  2 * global_border - useless_gap
@@ -136,7 +165,8 @@ local function tile(p, orientation)
         height = wa.height
     }
 
-    tile_column(wa, master_area, cls_master, useless_gap, transformation)
+    if not data[0] then data[0] = {} end
+    tile_column(wa, master_area, cls_master, useless_gap, transformation, data[0])
 
     -- Tile other windows
     local other_area = {
@@ -149,6 +179,8 @@ local function tile(p, orientation)
     -- get column number for other windows
     local ncol = math.min(tag.getncol(t), #cls_other)
 
+    if ncol == 0 then ncol = 1 end
+
     -- split other windows to column groups
     local last_small_column = ncol - #cls_other % ncol
     local rows_min = math.floor(#cls_other / ncol)
@@ -164,9 +196,11 @@ local function tile(p, orientation)
             client_index = client_index + 1
         end
 
-               -- and tile
-               local column_area = cut_area(other_area, ncol, position, true)
-        tile_column(wa, column_area, column, useless_gap, transformation)
+        -- and tile
+        local column_area = cut_column(other_area, ncol, position)
+
+        if not data[i] then data[i] = {} end
+        tile_column(wa, column_area, column, useless_gap, transformation, data[i])
     end
 end