helm/hammerspoon/modules/windows.lua

115 lines
4.8 KiB
Lua
Raw Normal View History

2015-12-23 21:21:18 -08:00
-- TODO: Window management library
2015-12-26 23:30:07 -08:00
local window = {
direction = {
up = 1,
down = 2,
left = 4,
right = 8
},
move = function (x, y, w, h)
end,
slide = function (direction, amount)
end,
resizeIn = function (direction, amount)
end,
resizeOut = function (direction, amount)
end,
}
--
local modes = {
position = hs.hotkey.modal.new('cmd-ctrl', 'up'),
resizeTL = hs.hotkey.modal.new('cmd-ctrl', 'left'),
resizeBR = hs.hotkey.modal.new('cmd-ctrl', 'right'),
}
local currentMode = nil
-- Screen overlay
local function initOverlay(width, height)
local f = hs.screen.primaryScreen():frame()
return hs.drawing.rectangle(hs.geometry(
(f.w / 2) - (width / 2),
(f.h / 2) - (height / 2),
width, height))
:setAlpha(0.65)
:setFillColor(hs.drawing.color.black)
:bringToFront()
end
local overlay = initOverlay(300, 400)
--
for key, modal in pairs(modes) do
modal:bind('', 'escape', function() modal:exit() end)
modal.entered = function(self)
for k, m in pairs(modes) do
if k ~= key then m:exit() end
end
currentMode = key
overlay:show()
end
modal.exited = function(self)
if currentMode == key then
currentMode = nil
overlay:hide()
end
end
end
local step = 10
local bigstep = 100
modes.position
:bind('cmd', 'up', function() window.slide(window.direction.up, true) end)
:bind('cmd', 'down', function() window.slide(window.direction.down, true) end)
:bind('cmd', 'left', function() window.slide(window.direction.left, true) end)
:bind('cmd', 'right', function() window.slide(window.direction.right, true) end)
:bind('shift', 'up', function() window.slide(window.direction.up, step) end)
:bind('shift', 'down', function() window.slide(window.direction.down, step) end)
:bind('shift', 'left', function() window.slide(window.direction.left, step) end)
:bind('shift', 'right', function() window.slide(window.direction.right, step) end)
:bind('alt', 'up', function() window.slide(window.direction.up, bigstep) end)
:bind('alt', 'down', function() window.slide(window.direction.down, bigstep) end)
:bind('alt', 'left', function() window.slide(window.direction.left, bigstep) end)
:bind('alt', 'right', function() window.slide(window.direction.right, bigstep) end)
modes.resizeTL
:bind('cmd', 'up', function() window.resizeOut(window.direction.up, true) end)
:bind('cmd', 'down', function() window.resizeIn(window.direction.down, true) end)
:bind('cmd', 'left', function() window.resizeOut(window.direction.left, true) end)
:bind('cmd', 'right', function() window.resizeIn(window.direction.right, true) end)
:bind('shift', 'up', function() window.resizeOut(window.direction.up, step) end)
:bind('shift', 'down', function() window.resizeIn(window.direction.down, step) end)
:bind('shift', 'left', function() window.resizeOut(window.direction.left, step) end)
:bind('shift', 'right', function() window.resizeIn(window.direction.right, step) end)
:bind('alt', 'up', function() window.resizeOut(window.direction.up, bigstep) end)
:bind('alt', 'down', function() window.resizeIn(window.direction.down, bigstep) end)
:bind('alt', 'left', function() window.resizeOut(window.direction.left, bigstep) end)
:bind('alt', 'right', function() window.resizeIn(window.direction.right, bigstep) end)
modes.resizeBR
:bind('cmd', 'up', function() window.resizeIn(window.direction.up, true) end)
:bind('cmd', 'down', function() window.resizeOut(window.direction.down, true) end)
:bind('cmd', 'left', function() window.resizeIn(window.direction.left, true) end)
:bind('cmd', 'right', function() window.resizeOut(window.direction.right, true) end)
:bind('shift', 'up', function() window.resizeIn(window.direction.up, step) end)
:bind('shift', 'down', function() window.resizeOut(window.direction.down, step) end)
:bind('shift', 'left', function() window.resizeIn(window.direction.left, step) end)
:bind('shift', 'right', function() window.resizeOut(window.direction.right, step) end)
:bind('alt', 'up', function() window.resizeIn(window.direction.up, bigstep) end)
:bind('alt', 'down', function() window.resizeOut(window.direction.down, bigstep) end)
:bind('alt', 'left', function() window.resizeIn(window.direction.left, bigstep) end)
:bind('alt', 'right', function() window.resizeOut(window.direction.right, bigstep) end)