Compare commits
2 Commits
1990c2f998
...
4b1d6808c9
| Author | SHA1 | Date | |
|---|---|---|---|
| 4b1d6808c9 | |||
| 940ed913aa |
@@ -23,7 +23,11 @@ LayoutSelector = require('LayoutSelector')
|
||||
-- require('System_Tweaks') -- Used for Time Machine Throttle Disable
|
||||
-- require("Focus") -- Does not work with layout saver - Not needed if using Monocle - Focusdim is better than Monocle
|
||||
-- require("FocusMode") -- Removed since I am using Focusdim
|
||||
Network = require("NetworkCenter")
|
||||
--
|
||||
-- Network Center is currently disabled since menus are not working in Hammerspoon - Will re-enable once I can fix the menu issues
|
||||
-- Network = require("NetworkCenter")
|
||||
--
|
||||
require("modules.mouseJiggle").start()
|
||||
|
||||
-- Load the window management module
|
||||
local windowMgr = require("WindowManager")
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
local M = {}
|
||||
|
||||
-- Configuration
|
||||
local REQUIRED_REVERSALS = 3 -- Must switch direction 3 times (e.g., Left -> Right -> Left)
|
||||
local RESET_TIMEOUT = 0.3 -- Fast window: shake must be completed rapidly or it resets
|
||||
local LOCKOUT_DURATION = 3.0 -- Cooldown duration (seconds) before allowed to trigger again
|
||||
|
||||
-- Asymmetrical Thresholds
|
||||
local SPEED_TO_ENABLE = 115.0 -- Slightly lower: easier to turn ON
|
||||
local SPEED_TO_DISABLE = 150.0 -- Slightly higher: harder to accidentally turn OFF
|
||||
|
||||
-- Focusdim Global Hotkey Configuration from your settings
|
||||
local FOCUS_DIM_MODS = { "ctrl", "alt", "shift", "cmd" }
|
||||
local FOCUS_DIM_KEY = "f"
|
||||
|
||||
-- Internal state tracking
|
||||
local jiggleWatcher = nil
|
||||
local isLocked = false
|
||||
local isFocusDimActive = false -- Tracks state to apply the correct threshold
|
||||
local lastXDirection = 0 -- -1 for left, 1 for right, 0 for still
|
||||
local reversalCount = 0
|
||||
local lastEventTime = 0
|
||||
|
||||
-- Forward declaration for the timer loop
|
||||
M.start = function() end
|
||||
|
||||
local function eventCallback(event)
|
||||
if isLocked then return false end
|
||||
|
||||
local now = hs.timer.secondsSinceEpoch()
|
||||
|
||||
-- Reset the counter if the movements aren't happening fast enough
|
||||
if (now - lastEventTime) > RESET_TIMEOUT then
|
||||
reversalCount = 0
|
||||
lastXDirection = 0
|
||||
end
|
||||
|
||||
lastEventTime = now
|
||||
|
||||
-- Extract horizontal movement exclusively
|
||||
local dx = event:getProperty(hs.eventtap.event.properties.mouseEventDeltaX)
|
||||
|
||||
-- Dynamically choose threshold based on current state
|
||||
local currentThreshold = isFocusDimActive and SPEED_TO_DISABLE or SPEED_TO_ENABLE
|
||||
|
||||
-- Only evaluate if it's a high-velocity horizontal snap matching the current state's rule
|
||||
if math.abs(dx) > currentThreshold then
|
||||
local currentDirection = (dx > 0) and 1 or -1
|
||||
|
||||
-- Track direction flips
|
||||
if lastXDirection ~= 0 and currentDirection ~= lastXDirection then
|
||||
reversalCount = reversalCount + 1
|
||||
|
||||
-- Trigger only when the full rapid shake sequence completes
|
||||
if reversalCount >= REQUIRED_REVERSALS then
|
||||
isLocked = true
|
||||
reversalCount = 0
|
||||
lastXDirection = 0
|
||||
|
||||
-- Toggle our internal tracking state
|
||||
isFocusDimActive = not isFocusDimActive
|
||||
|
||||
-- Instantly detach the listener
|
||||
M.stop()
|
||||
|
||||
-- Simulate the hotkey press to toggle Focusdim
|
||||
hs.eventtap.keyStroke(FOCUS_DIM_MODS, FOCUS_DIM_KEY, 0)
|
||||
|
||||
-- Re-enable after the lockout duration
|
||||
hs.timer.doAfter(LOCKOUT_DURATION, function()
|
||||
isLocked = false
|
||||
M.start()
|
||||
end)
|
||||
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
lastXDirection = currentDirection
|
||||
end
|
||||
|
||||
return false -- Pass event through to macOS normally
|
||||
end
|
||||
|
||||
function M.start()
|
||||
if jiggleWatcher then return end
|
||||
|
||||
jiggleWatcher = hs.eventtap.new({ hs.eventtap.event.types.mouseMoved }, eventCallback)
|
||||
jiggleWatcher:start()
|
||||
end
|
||||
|
||||
function M.stop()
|
||||
if jiggleWatcher then
|
||||
jiggleWatcher:stop()
|
||||
jiggleWatcher = nil
|
||||
end
|
||||
end
|
||||
|
||||
return M
|
||||
Reference in New Issue
Block a user