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

wiki updated
[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
 
     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
 
     return area
 end
@@ -60,11 +59,33 @@ local function size_correction(c, geometry, useless_gap)
     geometry.y = geometry.y + useless_gap / 2
 end
 
     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
 -- 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
     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
 
         -- swap workarea dimensions
         if transformation.flip then g = flip(canvas, g) end
@@ -102,6 +123,14 @@ local function tile(p, orientation)
         mwfact = 1
     end
 
         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
     -- 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
     }
 
         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 = {
 
     -- 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)
 
     -- 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)
     -- 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
 
             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
 
     end
 end