|
|
@ -1,34 +1,48 @@
|
|
|
|
(local {: application : caffeinate : logger : timer : window} hs)
|
|
|
|
(local {: application : caffeinate : fnutils : logger : timer : window} hs)
|
|
|
|
|
|
|
|
|
|
|
|
(local log (logger.new :quitter :info))
|
|
|
|
(local {: contains : ifilter} fnutils)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(local log (logger.new :quitter :debug))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(local keep-apps [:Safari
|
|
|
|
|
|
|
|
:Arc
|
|
|
|
|
|
|
|
"Firefox Developer Edition"
|
|
|
|
|
|
|
|
:Ghostty
|
|
|
|
|
|
|
|
:Miniflux
|
|
|
|
|
|
|
|
:Phanpy
|
|
|
|
|
|
|
|
:Obsidian])
|
|
|
|
|
|
|
|
|
|
|
|
(local to-kill {})
|
|
|
|
(local to-kill {})
|
|
|
|
|
|
|
|
|
|
|
|
(fn kill [app]
|
|
|
|
(fn kill [app]
|
|
|
|
(when (not (app:isFrontmost))
|
|
|
|
(when (not (app:isFrontmost))
|
|
|
|
(log.i (.. "killing " (app:name)))
|
|
|
|
(log.i (.. "killing " (app:name)))
|
|
|
|
(app:kill)))
|
|
|
|
(let [focused-win (window.focusedWindow)]
|
|
|
|
|
|
|
|
(app:kill)
|
|
|
|
(fn mark [app]
|
|
|
|
(focused-win:focus))))
|
|
|
|
(when (= (app:kind) 1)
|
|
|
|
|
|
|
|
(log.i (.. "marking " (app:name)))
|
|
|
|
|
|
|
|
(set (. to-kill (app:bundleID)) (timer.doAfter 300 #(kill app)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(fn unmark [win]
|
|
|
|
(fn unmark [app]
|
|
|
|
(let [app (win:application)
|
|
|
|
(let [bundle-id (app:bundleID)
|
|
|
|
bundle-id (app:bundleID)
|
|
|
|
|
|
|
|
t (?. to-kill bundle-id)]
|
|
|
|
t (?. to-kill bundle-id)]
|
|
|
|
(when (not= t nil)
|
|
|
|
(when (not= t nil)
|
|
|
|
(log.i (.. "unmarking " (app:name)))
|
|
|
|
(log.i (.. "unmarking " (app:name)))
|
|
|
|
(t:stop)
|
|
|
|
(t:stop)
|
|
|
|
(set (. to-kill bundle-id) nil))))
|
|
|
|
(set (. to-kill bundle-id) nil))))
|
|
|
|
|
|
|
|
|
|
|
|
(fn mark-all-apps [event]
|
|
|
|
(fn mark [app]
|
|
|
|
(when (= event caffeinate.watcher.systemDidWake)
|
|
|
|
(when (= (app:kind) 1)
|
|
|
|
(each [_ app (ipairs (application.find ""))]
|
|
|
|
(unmark app)
|
|
|
|
(mark app))))
|
|
|
|
(log.i (.. "marking " (app:name)))
|
|
|
|
|
|
|
|
(set (. to-kill (app:bundleID)) (timer.doAfter 300 #(kill app)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(fn mark-all-apps []
|
|
|
|
|
|
|
|
(log.d :mark-all-apps)
|
|
|
|
|
|
|
|
(each [_ app (ipairs (ifilter [(application.find "")]
|
|
|
|
|
|
|
|
#(not (contains keep-apps ($1:name)))))]
|
|
|
|
|
|
|
|
(mark app)))
|
|
|
|
|
|
|
|
|
|
|
|
(local cw (caffeinate.watcher.new mark-all-apps))
|
|
|
|
(local cw (caffeinate.watcher.new #(when (= $1 caffeinate.watcher.systemDidWake)
|
|
|
|
|
|
|
|
(mark-all-apps))))
|
|
|
|
|
|
|
|
|
|
|
|
(local wf (window.filter.new {:Safari false
|
|
|
|
(local wf (window.filter.new {:Safari false
|
|
|
|
:Arc false
|
|
|
|
:Arc false
|
|
|
@ -43,7 +57,7 @@
|
|
|
|
(log.i :starting)
|
|
|
|
(log.i :starting)
|
|
|
|
(mark-all-apps)
|
|
|
|
(mark-all-apps)
|
|
|
|
(cw:start)
|
|
|
|
(cw:start)
|
|
|
|
(wf:subscribe {window.filter.windowFocused unmark
|
|
|
|
(wf:subscribe {window.filter.windowFocused #(unmark ($1:application))
|
|
|
|
window.filter.windowUnfocused #(mark ($1:application))}))
|
|
|
|
window.filter.windowUnfocused #(mark ($1:application))}))
|
|
|
|
|
|
|
|
|
|
|
|
;; use global so this isn't GC'ed
|
|
|
|
;; use global so this isn't GC'ed
|
|
|
|