You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
5.6 KiB
Lua

local vimouse = require('vimouse')
local app = require('hs.application')
local eventtap = require('hs.eventtap')
local geometry = require('hs.geometry')
local hotkey = require('hs.hotkey')
local layout = require('hs.layout')
local screen = require('hs.screen')
local win = require('hs.window')
local hyper = { 'cmd', 'alt', 'shift', 'ctrl' }
local laptopMonitor = "Built-in Retina Display"
local mainMonitor = "DELL U3415W"
-- Custom positions where apps can be on the screen
local screenPositions = {
left = geometry.rect(0.01, 0.01, 0.485, 0.98),
leftTop = { x = 0.01, y = 0.01, w = 0.485, h = 0.485 },
leftBottom = { x= 0.01, y = 0.505, w = 0.485, h = 0.485 },
right = geometry.rect(0.505, 0.01, 0.485, 0.98),
rightTop = { x = 0.505, y = 0.01, w = 0.485, h = 0.485 },
rightBottom = { x= 0.505, y = 0.505, w = 0.485, h = 0.485 },
top = geometry.rect(0.01, 0.01, 0.98, 0.485),
bottom = geometry.rect(0.01, 0.505, 0.98, 0.485),
center = geometry.rect(0.15, 0.15, 0.7, 0.7),
max = geometry.rect(0.01, 0.01, 0.98, 0.98),
full = geometry.rect(0, 0, 1, 1),
}
local layoutDouble = {
{ "Calendar", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Firefox", nil, mainMonitor, screenPositions.left, nil, nil },
{ "ForkLift", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Spotify", nil, mainMonitor, screenPositions.left, nil, nil },
{ "iTerm2", nil, mainMonitor, screenPositions.right, nil, nil },
{ "Messages", nil, mainMonitor, screenPositions.rightTop, nil, nil },
{ "Signal", nil, mainMonitor, screenPositions.rightBottom, nil, nil },
{ "Telegram", nil, mainMonitor, screenPositions.rightTop, nil, nil },
{ "Microsoft Teams", nil, mainMonitor, screenPositions.rightBottom, nil, nil },
}
local layoutSingle = {
{ "Calendar", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Firefox", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "ForkLift", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Spotify", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "iTerm2", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Messages", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Signal", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Telegram", nil, laptopMonitor, screenPositions.max, nil, nil },
{ "Microsoft Teams", nil, laptopMonitor, screenPositions.max, nil, nil },
}
local appNames = {
"Calendar",
"Firefox",
"ForkLift",
"Spotify",
"iTerm",
"Messages",
"Signal",
"Telegram",
"Microsoft Teams",
}
local function launchApps()
for i, appName in ipairs(appNames) do
app.launchOrFocus(appName)
end
end
local function moveMouse()
local pt = hs.geometry.rectMidPoint(win.focusedWindow():frame())
hs.mouse.absolutePosition(pt)
end
local function applyPosition(pos)
local w = win.focusedWindow()
local screenName = w:screen():name()
local tempPos = screenPositions[pos]
print(meh)
local tempLayout = {
{ app.frontmostApplication(), nil, screenName, tempPos, nil, nil },
}
layout.apply(tempLayout)
end
-- Window management
--------------------
win.animationDuration = 0
-- Move and click mouse via keyboard
vimouse(hyper, ',')
-- Applying main two layouts
hotkey.bind(hyper, 'q', function() layout.apply(layoutSingle) end)
hotkey.bind(hyper, 'w', function() layout.apply(layoutDouble) end)
-- Window Navigation
-- hotkey D is set in Dash itself
hotkey.bind(hyper, 'a', function() app.launchOrFocus('iTerm') end)
hotkey.bind(hyper, 's', function() app.launchOrFocus('Firefox') end)
hotkey.bind(hyper, 'f', function() app.launchOrFocus('ForkLift') end)
hotkey.bind(hyper, 'g', function() launchApps() end)
-- Moving window around / navigating windows
hotkey.bind(hyper, '[', function() win.focusedWindow():moveOneScreenNorth(); moveMouse() end)
hotkey.bind(hyper, ']', function() win.focusedWindow():moveOneScreenSouth(); moveMouse() end)
hotkey.bind(hyper, 'z', function() applyPosition('full'); moveMouse() end)
hotkey.bind(hyper, 'x', function() applyPosition('max'); moveMouse() end)
hotkey.bind(hyper, 'c', function() applyPosition('center'); moveMouse() end)
hotkey.bind(hyper, 'h', function() applyPosition('left'); moveMouse() end)
hotkey.bind(hyper, 'u', function() applyPosition('leftTop'); moveMouse() end)
hotkey.bind(hyper, 'n', function() applyPosition('leftBottom'); moveMouse() end)
hotkey.bind(hyper, 'l', function() applyPosition('right'); moveMouse() end)
hotkey.bind(hyper, 'i', function() applyPosition('rightTop'); moveMouse() end)
hotkey.bind(hyper, 'm', function() applyPosition('rightBottom'); moveMouse() end)
hotkey.bind(hyper, 'k', function() applyPosition('top'); moveMouse() end)
hotkey.bind(hyper, 'j', function() applyPosition('bottom'); moveMouse() end)
-- map hyper + number to the corresponding fn-key, since the touchbar
-- kinda sucks, and karabiner-elements is breaking fn-function to show keys
hotkey.bind(hyper, '1', function() eventtap.keyStroke({}, 'F1') end)
hotkey.bind(hyper, '2', function() eventtap.keyStroke({}, 'F2') end)
hotkey.bind(hyper, '3', function() eventtap.keyStroke({}, 'F3') end)
hotkey.bind(hyper, '4', function() eventtap.keyStroke({}, 'F4') end)
hotkey.bind(hyper, '5', function() eventtap.keyStroke({}, 'F5') end)
hotkey.bind(hyper, '6', function() eventtap.keyStroke({}, 'F6') end)
hotkey.bind(hyper, '7', function() eventtap.keyStroke({}, 'F7') end)
hotkey.bind(hyper, '8', function() eventtap.keyStroke({}, 'F8') end)
hotkey.bind(hyper, '9', function() eventtap.keyStroke({}, 'F9') end)
hotkey.bind(hyper, '0', function() eventtap.keyStroke({}, 'F10') end)
hotkey.bind(hyper, '-', function() eventtap.keyStroke({}, 'F11') end)
hotkey.bind(hyper, '=', function() eventtap.keyStroke({}, 'F12') end)