138 lines
3.3 KiB
Lua
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
|