[hammerspoon] quitter
change
commit 0b15fd2be210109623c69745218e2516959dd412
author Alpha Chen <alpha@kejadlen.dev>
date
parent 6cd8ea8d
diff --git a/.hammerspoon/quitter.fnl b/.hammerspoon/quitter.fnl
index b90d45e4..09cb0915 100644
--- a/.hammerspoon/quitter.fnl
+++ b/.hammerspoon/quitter.fnl
@@ -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 {})
 
 (fn kill [app]
   (when (not (app:isFrontmost))
     (log.i (.. "killing " (app:name)))
-    (app:kill)))
-
-(fn mark [app]
-  (when (= (app:kind) 1)
-    (log.i (.. "marking " (app:name)))
-    (set (. to-kill (app:bundleID)) (timer.doAfter 300 #(kill app)))))
+    (let [focused-win (window.focusedWindow)]
+      (app:kill)
+      (focused-win:focus))))
 
-(fn unmark [win]
-  (let [app (win:application)
-        bundle-id (app:bundleID)
+(fn unmark [app]
+  (let [bundle-id (app:bundleID)
         t (?. to-kill bundle-id)]
     (when (not= t nil)
       (log.i (.. "unmarking " (app:name)))
       (t:stop)
       (set (. to-kill bundle-id) nil))))
 
-(fn mark-all-apps [event]
-  (when (= event caffeinate.watcher.systemDidWake)
-    (each [_ app (ipairs (application.find ""))]
-      (mark app))))
+(fn mark [app]
+  (when (= (app:kind) 1)
+    (unmark 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
                               :Arc false
@@ -43,7 +57,7 @@
   (log.i :starting)
   (mark-all-apps)
   (cw:start)
-  (wf:subscribe {window.filter.windowFocused unmark
+  (wf:subscribe {window.filter.windowFocused #(unmark ($1:application))
                  window.filter.windowUnfocused #(mark ($1:application))}))
 
 ;; use global so this isn't GC'ed