-
-
Save valmayaki/4f3bff7789c57175f1ab03f363d1e221 to your computer and use it in GitHub Desktop.
Hammerspoon script to move/resize window under cursor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Inspired by Linux alt-drag or Better Touch Tools move/resize functionality | |
function get_window_under_mouse() | |
-- Invoke `hs.application` because `hs.window.orderedWindows()` doesn't do it | |
-- and breaks itself | |
local _ = hs.application | |
local my_pos = hs.geometry.new(hs.mouse.getAbsolutePosition()) | |
local my_screen = hs.mouse.getCurrentScreen() | |
return hs.fnutils.find(hs.window.orderedWindows(), function(w) | |
return my_screen == w:screen() and my_pos:inside(w:frame()) | |
end) | |
end | |
dragging_win = nil | |
dragging_mode = 1 | |
drag_event = hs.eventtap.new({ hs.eventtap.event.types.mouseMoved }, function(e) | |
if dragging_win then | |
local dx = e:getProperty(hs.eventtap.event.properties.mouseEventDeltaX) | |
local dy = e:getProperty(hs.eventtap.event.properties.mouseEventDeltaY) | |
local mods = hs.eventtap.checkKeyboardModifiers() | |
-- Ctrl + Shift to move the window under cursor | |
if dragging_mode == 1 and mods.ctrl and mods.shift then | |
dragging_win:move({dx, dy}, nil, false, 0) | |
-- Alt + Shift to resize the window under cursor | |
elseif mods.alt and mods.shift then | |
local sz = dragging_win:size() | |
local w1 = sz.w + dx | |
local h1 = sz.h + dy | |
dragging_win:setSize(w1, h1) | |
end | |
end | |
return nil | |
end) | |
flags_event = hs.eventtap.new({ hs.eventtap.event.types.flagsChanged }, function(e) | |
local flags = e:getFlags() | |
if flags.ctrl and flags.shift and dragging_win == nil then | |
dragging_win = get_window_under_mouse() | |
dragging_mode = 1 | |
drag_event:start() | |
elseif flags.alt and flags.shift and dragging_win == nil then | |
dragging_win = get_window_under_mouse() | |
dragging_mode = 2 | |
drag_event:start() | |
else | |
drag_event:stop() | |
dragging_win = nil | |
end | |
return nil | |
end) | |
flags_event:start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment