summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorache <ache@ache.one>2021-09-23 06:35:32 +0200
committerache <ache@ache.one>2021-09-23 06:35:32 +0200
commitee5a46f8f74913e6429a6a82a5b9017f081e06dc (patch)
treed1674a079d5fbbb4ccb73a01c3bbc6561378a094
parentAdd submodule lain (diff)
Add uselessfair
-rw-r--r--lib/uselessfair.lua108
-rw-r--r--rc.lua5
2 files changed, 111 insertions, 2 deletions
diff --git a/lib/uselessfair.lua b/lib/uselessfair.lua
new file mode 100644
index 0000000..e1284e0
--- /dev/null
+++ b/lib/uselessfair.lua
@@ -0,0 +1,108 @@
+
+--[[
+
+ Licensed under GNU General Public License v2
+ * (c) 2014, projektile, worron
+ * (c) 2013, Luke Bonham
+ * (c) 2012, Josh Komoroske
+ * (c) 2010-2012, Peter Hofmann
+
+--]]
+
+local beautiful = require("beautiful")
+local ipairs = ipairs
+local math = { ceil = math.ceil, sqrt = math.sqrt, floor = math.floor, max = math.max }
+local tonumber = tonumber
+
+local uselessfair = {}
+
+-- Transformation functions
+local function swap(geometry)
+ return { x = geometry.y, y = geometry.x, width = geometry.height, height = geometry.width }
+end
+
+-- Client geometry correction depending on useless gap and window border
+local function size_correction(c, geometry, useless_gap)
+ geometry.width = math.max(geometry.width - 2 * c.border_width - useless_gap, 1)
+ geometry.height = math.max(geometry.height - 2 * c.border_width - useless_gap, 1)
+ geometry.x = geometry.x + useless_gap / 2
+ geometry.y = geometry.y + useless_gap / 2
+end
+
+-- Main tiling function
+local function fair(p, orientation)
+
+ -- Theme vars
+ local useless_gap = beautiful.useless_gap_width or 0
+ local global_border = beautiful.global_border_width or 0
+
+ -- Aliases
+ local wa = p.workarea
+ local cls = p.clients
+
+ -- Nothing to tile here
+ if #cls == 0 then return 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
+ wa.x = wa.x + useless_gap / 2 + global_border
+ wa.y = wa.y + useless_gap / 2 + global_border
+
+ -- Geometry calculation
+ local row, col = 0, 0
+
+ local rows = math.ceil(math.sqrt(#cls))
+ local cols = math.ceil(#cls / rows)
+
+ for i, c in ipairs(cls) do
+ local g = {}
+
+ -- find tile orientation for current client and swap geometry if need
+ local need_swap = (orientation == "east" and #cls <= 2) or (orientation == "south" and #cls > 2)
+ local area = need_swap and swap(wa) or wa
+
+ -- calculate geometry
+ if #cls < (cols * rows) and row == cols - 1 then
+ g.width = area.width / (rows - ((cols * rows) - #cls))
+ else
+ g.width = area.width / rows
+ end
+
+ g.height = area.height / cols
+ g.x = area.x + col * g.width
+ g.y = area.y + row * g.height
+
+ -- turn back to real if geometry was swapped
+ if need_swap then g = swap(g) end
+
+ -- window size correction depending on useless gap and window border
+ size_correction(c, g, useless_gap)
+
+ -- set geometry
+ c:geometry(g)
+
+ -- update tile grid coordinates
+ col = i % rows
+ row = math.floor(i / rows)
+ end
+end
+
+-- Layout constructor
+local function construct_layout(name, direction)
+ return {
+ name = name,
+ -- @p screen The screen number to tile
+ arrange = function(p) return fair(p, direction) end
+ }
+end
+
+-- Build layouts with different tile direction
+uselessfair.vertical = construct_layout("uselessfair", "south")
+uselessfair.horizontal = construct_layout("uselessfairh", "east")
+
+-- Module aliase
+uselessfair.arrange = uselessfair.vertical.arrange
+uselessfair.name = uselessfair.vertical.name
+
+return uselessfair
diff --git a/rc.lua b/rc.lua
index e440d72..13c6643 100644
--- a/rc.lua
+++ b/rc.lua
@@ -11,6 +11,7 @@ local naughty = require("naughty")
local vicious = require("vicious")
local menubar = require("menubar")
local lfs = require('lfs')
+local uselessfair = require("lib.uselessfair")
awful.screen = require("awful.screen")
@@ -92,8 +93,8 @@ lain.layout.cascade.offset_y = 20
-- Table of layouts to cover with awful.layout.inc, order matters.
awful.layout.layouts = {
- -- lain.layout.uselessfairnogap, --3
- lain.layout.uselessfair, --3
+ -- uselessfairnogap, --3
+ uselessfair, --3
lain.layout.cascade, --3
lain.layout.cascade.tile, --3
awful.layout.suit.tile, --1