dotfiles/dot_config/awesome/lib/better-resize.lua
2024-04-14 18:41:15 -07:00

138 lines
3.3 KiB
Lua

local capi = {
client = client,
mouse = mouse,
screen = screen,
mousegrabber = mousegrabber,
}
local awful = require("awful")
local function mouse_resize_handler(m, c)
awful.client.incwfact(0, c) -- needed to fix normalization at start
local start = m(capi.mouse.coords())
local x, y = start.x, start.y
local wa = m(c.screen.workarea)
local idx = awful.client.idx(c)
local c_above
local idx_above, idx_below
local wfact_above, wfact_below
local jump_to = { x = x, y = y }
local move_mwfact = false
do
local g = m(c:geometry())
local v_border = 0.2 * g.height
if idx and idx.idx > 1 and y >= g.y and y <= g.y + v_border then
-- we are near the top edge of the window
c_above = awful.client.next(-1, c)
C_BELOW = c
jump_to.y = g.y
idx_above = idx.idx - 1
idx_below = idx.idx
elseif idx and idx.idx < idx.num and y >= g.y + g.height - v_border then
-- we are near the bottom edge of the window
c_above = c
C_BELOW = awful.client.next(1, c)
idx_above = idx.idx
idx_below = idx.idx + 1
jump_to.y = g.y + g.height
end
local mw_split = wa.x + wa.width * c.screen.selected_tag.master_width_factor
if math.abs(mw_split - x) > wa.width / 6 then
move_mwfact = false
else
move_mwfact = true
jump_to.x = mw_split
end
end
if idx and idx_above then
local t = c.screen.selected_tag
local data = t.windowfact or {}
local colfact = data[idx.col] or {}
wfact_above = colfact[idx_above] or 1
wfact_below = colfact[idx_below] or 1
end
if idx_above and move_mwfact then
CURSOR = "cross"
elseif idx_above then
CURSOR = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).y
elseif move_mwfact then
CURSOR = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).x
else
return false
end
capi.mouse.coords(m(jump_to))
capi.mousegrabber.run(function(_mouse)
if not c.valid then
return false
end
local pressed = false
for _, v in ipairs(_mouse.buttons) do
if v then
pressed = true
break
end
end
_mouse = m(_mouse)
if pressed then
if move_mwfact then
c.screen.selected_tag.master_width_factor = math.min(math.max((_mouse.x - wa.x) / wa.width, 0.01), 0.99)
end
if idx and idx_above then
local factor_delta = (_mouse.y - jump_to.y) / wa.height
if factor_delta < 0 then
factor_delta = math.max(factor_delta, -(wfact_above - 0.05))
else
factor_delta = math.min(factor_delta, wfact_below - 0.05)
end
local t = c.screen.selected_tag
local data = t.windowfact or {}
local colfact = data[idx.col] or {}
colfact[idx_above] = wfact_above + factor_delta
colfact[idx_below] = wfact_below - factor_delta
awful.client.incwfact(0, c_above) -- just in case
end
return true
else
return false
end
end, CURSOR)
return true
end
awful.layout.suit.tile.mouse_resize_handler = function(c)
return mouse_resize_handler(function(x)
return x
end, c)
end
---@diagnostic disable-next-line: duplicate-set-field
awful.layout.suit.tile.bottom.mouse_resize_handler = function(c)
return mouse_resize_handler(function(q)
return { x = q.y, y = q.x, width = q.height, height = q.width }
end, c)
end
-- local old_coords = mouse.coords
-- mouse.coords = function(...)
-- if select(1, ...) and not(select(1, ...).blah) then
-- print("set mouse!!!")
-- print(debug.traceback())
-- end
-- return old_coords(...)
-- end