emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals-release/activities 990f3ac98d 013/103: WIP


From: ELPA Syncer
Subject: [elpa] externals-release/activities 990f3ac98d 013/103: WIP
Date: Tue, 30 Jan 2024 03:57:46 -0500 (EST)

branch: externals-release/activities
commit 990f3ac98d05ebd533801f5a3e9e289af4128a10
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>

    WIP
---
 activity-tabs.el | 16 ++++++++++++++--
 activity.el      | 45 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/activity-tabs.el b/activity-tabs.el
index b9cb52c3b9..e47e9b9902 100644
--- a/activity-tabs.el
+++ b/activity-tabs.el
@@ -58,11 +58,23 @@ accordingly."
   (if activity-tabs-mode
       (progn
         (tab-bar-mode 1)
-        (advice-add #'activity-resume :before #'activity-tabs-before-resume))
-    (advice-remove #'activity-resume #'activity-tabs-before-resume)))
+        (advice-add #'activity-resume :before #'activity-tabs-before-resume)
+        (advice-add #'activity-active-p :override 
#'activity-tabs-activity-active-p))
+    (advice-remove #'activity-resume #'activity-tabs-before-resume)
+    (advice-remove #'activity-active-p #'activity-tabs-activity-active-p)))
 
 ;;;; Functions
 
+(defun activity-tabs-activity-active-p (activity)
+  "Return non-nil if ACTIVITY is active.
+That is, if any tabs have an `activity' parameter whose
+activity's name is NAME."
+  (pcase-let (((cl-struct activity name) activity))
+    (cl-some (lambda (tab)
+               (when-let ((activity (alist-get 'activity tab)))
+                 (equal name (activity-name activity))))
+             (funcall tab-bar-tabs-function))))
+
 (defun activity-tabs-before-resume (activity &rest _)
   "Called before resuming ACTIVITY."
   (run-hook-with-args 'activity-tabs-before-resume-functions activity))
diff --git a/activity.el b/activity.el
index 37fdfc7f25..55bfcda9e5 100644
--- a/activity.el
+++ b/activity.el
@@ -260,6 +260,41 @@ If DEFAULTP, save its default state; if LASTP, its last."
                                               (activity-last activity) 
last))))))
     (bookmark-store name record nil)))
 
+(defun activity-save-all ()
+  "Save all active activities' last states."
+  (interactive)
+  (dolist (activity (cl-remove-if-not #'activity-active-p 
(activity-activities)))
+    (activity-save activity :lastp t)))
+
+;;;; Activity mode
+
+;; This mode automatically saves active activities.
+
+(defvar activity-mode-timer nil
+  "Automatically saves activities according to 
`activity-mode-idle-frequency'.")
+
+(defgroup activity-mode nil
+  "Automatically save activities."
+  :group 'activity)
+
+(defcustom activity-mode-idle-frequency 5
+  "Automatically save activities when Emacs has been idle this many seconds."
+  :type 'natnum)
+
+;;;###autoload
+(define-minor-mode activity-mode
+  "Automatically remember activities' state.
+accordingly."
+  :global t
+  :group 'activity
+  (if activity-mode
+      (progn
+        (setf activity-mode-timer (run-at-time activity-mode-idle-frequency 
activity-mode-idle-frequency
+                                               #'activity-save-all)))
+    (when (timerp activity-mode-timer)
+      (cancel-timer activity-mode-timer)
+      (setf activity-mode-timer nil))))
+
 ;;;; Functions
 
 (defun activity-state ()
@@ -267,6 +302,16 @@ If DEFAULTP, save its default state; if LASTP, its last."
   (make-activity-state
    :window-state (activity--window-state (selected-frame))))
 
+(defun activity-active-p (activity)
+  "Return non-nil if ACTIVITY is active.
+That is, if any frames have an `activity' parameter whose
+activity's name is NAME."
+  (pcase-let (((cl-struct activity name) activity))
+    (cl-some (lambda (frame)
+               (when-let ((activity (frame-parameter frame 'activity)))
+                 (equal name (activity-name activity))))
+             (frame-list))))
+
 (defun activity--window-state (frame)
   "Return FRAME's window state."
   (with-selected-frame frame



reply via email to

[Prev in Thread] Current Thread [Next in Thread]