diff --git a/wm/hammerspoon/ctrlDoubleTap.lua b/wm/hammerspoon/ctrlDoubleTap.lua new file mode 100755 index 0000000..fc4a553 --- /dev/null +++ b/wm/hammerspoon/ctrlDoubleTap.lua @@ -0,0 +1,70 @@ +local timer = require("hs.timer") +local eventtap = require("hs.eventtap") + +local events = eventtap.event.types + +local module = {} + +module.timeFrame = 1 + +module.action = function() + hs.alert("You double tapped ctrl!") +end + +local timeFirstControl = 0 +local firstDown = false +local secondDown = false + +local noFlags = function(ev) + local result = true + for k,v in pairs(ev:getFlags()) do + if v then + result = false + break + end + end + return result +end + +local onlyCtrl = function(ev) + local result = ev:getFlags().ctrl + for k,v in pairs(ev:getFlags()) do + if k ~= "ctrl" and v then + result = false + break + end + end + return result +end + +local reset = function() + timeFirstControl = 0 + firstDown = false + secondDown = false +end + +module.eventWatcher = eventtap.new({events.flagsChanged, events.keyDown}, function(ev) + if(timer.secondsSinceEpoch() - timeFirstControl) > module.timeFrame then + reset() + end + + if ev:getType() == events.flagsChanged then + if noFlags(ev) and firstDown and secondDown then + if module.action then module.action() end + reset() + elseif onlyCtrl(ev) and not firstDown then + firstDown = true + timeFirstControl = timer.secondsSinceEpoch() + elseif onlyCtrl(ev) and firstDown then + secondDown = true + elseif not noFlags(ev) then + reset() + end + else + reset() + end + return false +end):start() + +return module + diff --git a/wm/hammerspoon/escapeControlDouble.lua b/wm/hammerspoon/escapeControlDouble.lua new file mode 100755 index 0000000..2036d68 --- /dev/null +++ b/wm/hammerspoon/escapeControlDouble.lua @@ -0,0 +1,54 @@ +local eventtap = require("hs.eventtap") +local keycodes = require("hs.keycodes") +keycodes = keycodes.map +local events = eventtap.event.types + +local module = {} + +local escPressed = false +local otherPressed = false +local recursion = false + +module.addModifier = function(ev) + ev:setFlags({['cmd'] = true}) + return ev +end + +module.eventWatcher = eventtap.new({events.keyDown, events.keyUp}, function(ev) + if recursion then + recursion = false + return false + end + if ev:getKeyCode() == keycodes['escape'] then + if ev:getType() == events.keyDown then + if not escPressed then + --hs.alert("esc down") + escPressed = true + otherPressed = false + return true + end + else + --hs.alert("esc up") + escPressed = false + if not otherPressed then + --hs.alert("escape") + ev = eventtap.event.newKeyEvent({}, 'escape', true) + recursion = true + ev:post() + else + --escPressed = false + end + return true + end + elseif escPressed and ev:getType() == events.keyDown then + otherPressed = true + ev = module.addModifier(ev) + recursion = true + ev:post() + return true + end + return false +end):start() + +return module + diff --git a/wm/hammerspoon/init.lua b/wm/hammerspoon/init.lua new file mode 100755 index 0000000..0e95dec --- /dev/null +++ b/wm/hammerspoon/init.lua @@ -0,0 +1,30 @@ +local super = {"cmd", "alt", "ctrl"} +hs.hotkey.bind(super, "W", function() + --hs.notify.new({title="Hammerspoon", informativeText="Hello World"}):send() + hs.alert.show("Reloading...") + hs.reload() +end) +hs.hotkey.bind(super, "R", function() + hs.reload() +end) + +--ctrlDoubleTap = require("ctrlDoubleTap") +--ctrlDoubleTap.timeFrame = 0.3 +--ctrlDoubleTap.action = function() + --hs.eventtap.keyStroke({}, "f19") +--end + +escCtrlDouble = require("escapeControlDouble") +escCtrlDouble.addModifier = function(ev) + app = hs.application.frontmostApplication() + if app:title() == "iTerm2" then + ev:setFlags({['ctrl'] = true}) + elseif app:title() == "kitty" then + ev:setFlags({['ctrl'] = true}) + else + ev:setFlags({['cmd'] = true}) + end + return ev +end + +hs.alert.show("Configuration reloaded") diff --git a/wm/hammerspoon/setup.sh b/wm/hammerspoon/setup.sh new file mode 100755 index 0000000..92b4577 --- /dev/null +++ b/wm/hammerspoon/setup.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +source ${DOTFILES}/helpers.sh + +function main() +{ + local scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)" + + print_info "Installing hammerspoon" + + caskget hammerspoon + + linkfile ${scriptdir} ${HOME}/.hammerspoon + + print_ok "Hammerspoon installed" +} + +main "$@" diff --git a/wm/setup.sh b/wm/setup.sh index cb9ac6d..72e4b73 100755 --- a/wm/setup.sh +++ b/wm/setup.sh @@ -25,6 +25,8 @@ function main() print_info "Installing logitech drivers" caskget caskroom/drivers/logitech-options print_ok "Logitech drivers installed" + + ${scriptdir}/hammerspoon/setup.sh } main "$@"