Make tiling shortcuts practical in tiled mode

This commit is contained in:
Alice Gaudon 2020-10-02 18:27:40 +02:00
parent 755eb1acc4
commit 2e0dc4f268
1 changed files with 43 additions and 9 deletions

View File

@ -1,6 +1,7 @@
-- Offers window tiling functionnality -- Offers window tiling functionnality
local awful = require("awful") local awful = require("awful")
local grect = require("gears.geometry").rectangle
-- Placements -- Placements
local leftTileGeometry = awful.placement.scale local leftTileGeometry = awful.placement.scale
@ -52,6 +53,26 @@ local screenRight = function(geo)
end end
end end
local swapClient = function(c, dir, stacked)
local sel = c or capi.client.focus
if sel then
local cltbl = awful.client.visible(sel.screen, stacked)
local geomtbl = {}
for i,cl in ipairs(cltbl) do
geomtbl[i] = cl:geometry()
end
local target = grect.get_in_direction(dir, geomtbl, sel:geometry())
-- If we found a client to swap with, then go for it
if target then
cltbl[target]:swap(sel)
return true
end
end
return false
end
client.connect_signal("manage", function (c) client.connect_signal("manage", function (c)
if awesome.startup if awesome.startup
and not c.size_hints.user_position and not c.size_hints.user_position
@ -68,30 +89,43 @@ end)
return { return {
key = { key = {
tileRight = function (c) tileRight = function (c)
c.maximized = true if c.maximized then
if not applyTile(c, rightTileGeometry) then c:raise()
screenRight(leftTileGeometry)(c) if not applyTile(c, rightTileGeometry) then
screenRight(leftTileGeometry)(c)
end
else
swapClient(c, 'right')
end end
end, end,
tileLeft = function (c) tileLeft = function (c)
c.maximized = true if c.maximized then
if not applyTile(c, leftTileGeometry) then c:raise()
screenLeft(rightTileGeometry)(c) if not applyTile(c, leftTileGeometry) then
screenLeft(rightTileGeometry)(c)
end
else
swapClient(c, 'left')
end end
end, end,
screenLeft = screenLeft(maximizedTileGeometry), screenLeft = screenLeft(maximizedTileGeometry),
screenRight = screenRight(maximizedTileGeometry), screenRight = screenRight(maximizedTileGeometry),
toggleMaximized = function (c) toggleMaximized = function (c)
if not c.maximized then if not c.maximized then
c.maximized = true if not swapClient(c, 'up') then
c.maximized = true
c:raise()
end
else else
if not applyTile(c, maximizedTileGeometry) then if not applyTile(c, maximizedTileGeometry) then
c.maximized = false c.maximized = false
end end
end end
end, end,
minimize = function(c) minimize = function(c)
c.minimized = true if c.maximized or not swapClient(c, 'down') then
c.minimized = true
end
end end
} }
} }