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)
|
|
|
|
|