Skip to content

Commit 33e5e3b

Browse files
committed
Add snapping on resize
1 parent dea4f4e commit 33e5e3b

File tree

6 files changed

+261
-166
lines changed

6 files changed

+261
-166
lines changed

awful/placement.lua

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,10 +1666,6 @@ function placement.restore(d, args)
16661666
height = memento.height,
16671667
}
16681668

1669-
if args.clear_stored_geometry then
1670-
data[d][args.context] = nil
1671-
end
1672-
16731669
return true
16741670
end
16751671

ui/mouse/edge_snap.lua

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,29 @@
1-
---------------------------------------------------------------------------
2-
--- Mouse snapping related functions
3-
--
4-
-- @author Julien Danjou <[email protected]>
5-
-- @copyright 2008 Julien Danjou
6-
-- @copyright 2023 David Kosorin
7-
-- @submodule mouse
8-
---------------------------------------------------------------------------
1+
--------------------------------------------------------------------------------
2+
---Mouse snapping related functions
3+
---@author Julien Danjou <[email protected]>
4+
---@copyright 2008 Julien Danjou
5+
---@copyright 2023 David Kosorin
6+
---@submodule mouse
7+
--------------------------------------------------------------------------------
98

109
local capi = Capi
1110
local abs = math.abs
1211
local alayout = require("awful.layout")
13-
local amresize = require("awful.mouse.resize")
1412
local aplacement = require("awful.placement")
15-
local gcolor = require("gears.color")
1613
local gshape = require("gears.shape")
1714
local wibox = require("wibox")
1815
local cairo = require("lgi").cairo
1916
local beautiful = require("theme.theme")
2017
local uui = require("utils.ui")
21-
local ucolor = require("utils.color")
2218

19+
local M = {}
2320

24-
local placement_context = "edge_snap"
21+
local stored_geometries = setmetatable({}, { __mode = "k" })
2522

2623
---@type wibox|nil
2724
local preview_wibox = nil
2825

29-
---@type { edge?: edge|corner, placement?: (fun(client: client, preview?: boolean): geometry) }
26+
---@type { edge?: edge|corner, placement?: (fun(client: client): geometry) }
3027
local current_state = {}
3128

3229
---@param geo geometry
@@ -140,11 +137,9 @@ local function update(client)
140137
local placement = edge and (aplacement.scale
141138
+ aplacement[edge]
142139
+ (axis and aplacement["maximize_" .. axis] or nil))
143-
current_state.placement = function(c, preview)
140+
current_state.placement = function(c)
144141
return placement(c, {
145-
pretend = preview,
146-
store_geometry = not preview,
147-
context = placement_context,
142+
pretend = true,
148143
to_percent = 0.5,
149144
honor_workarea = true,
150145
honor_padding = true,
@@ -159,9 +154,8 @@ local function update(client)
159154
return changed
160155
end
161156

162-
163157
---@param client client
164-
local function detect(client)
158+
function M.detect(client)
165159
if (not client.floating) and alayout.get(client.screen) ~= alayout.suit.floating then
166160
return
167161
end
@@ -171,31 +165,39 @@ local function detect(client)
171165
end
172166

173167
local placement = current_state.placement
174-
local geo = placement and placement(client, true)
168+
local geo = placement and placement(client)
175169
show_preview(client, geo)
176170
end
177171

172+
---@param client client
173+
function M.store(client)
174+
stored_geometries[client] = client:geometry()
175+
end
176+
177+
---@param client client
178+
---@return geometry|nil
179+
function M.try_restore(client)
180+
local geo = stored_geometries[client]
181+
stored_geometries[client] = nil
182+
return geo
183+
end
184+
178185
---@param client client
179186
---@param args awful.placement.args.common
180187
---@return geometry|nil
181-
local function apply(client, args)
182-
if not current_state.placement then
183-
return nil
188+
function M.apply(client, args)
189+
local placement = current_state.placement
190+
if not placement then
191+
return
184192
end
185193

186-
-- Remove the move offset
187194
args.offset = {}
188195

189196
preview_wibox.visible = false
190197

191-
return current_state.placement(client, false)
192-
end
198+
M.store(client)
193199

194-
amresize.add_move_callback(function(client, geo, args)
195-
aplacement.restore(client, { context = placement_context, clear_stored_geometry = true })
196-
detect(client)
197-
end, "mouse.move")
200+
return placement(client)
201+
end
198202

199-
amresize.add_leave_callback(function(client, geo, args)
200-
return apply(client, args)
201-
end, "mouse.move")
203+
return M

ui/mouse/init.lua

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
1-
local awful = require("awful")
1+
local amouse = require("awful.mouse")
2+
local amresize = require("awful.mouse.resize")
23

3-
awful.mouse.drag_to_tag.enabled = false
4+
amouse.drag_to_tag.enabled = false
45

5-
-- Order matters
6-
require("ui.mouse.edge_snap")
7-
require("ui.mouse.snap")
6+
local M = {
7+
edge_snap = require("ui.mouse.edge_snap"),
8+
snap = require("ui.mouse.snap"),
9+
}
10+
11+
amresize.add_move_callback(function(client, geo, args)
12+
M.edge_snap.detect(client)
13+
return M.snap.move(client, M.edge_snap.try_restore(client) or geo)
14+
end, "mouse.move")
15+
16+
amresize.add_leave_callback(function(client, geo, args)
17+
return M.edge_snap.apply(client, args)
18+
end, "mouse.move")
19+
20+
amresize.add_move_callback(function(client, geo, args)
21+
return M.snap.resize(client, geo, args.corner)
22+
end, "mouse.resize")
23+
24+
return M

0 commit comments

Comments
 (0)