aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/org-agenda-frame.el25
-rw-r--r--tests/test-org-agenda-frame.el70
2 files changed, 95 insertions, 0 deletions
diff --git a/modules/org-agenda-frame.el b/modules/org-agenda-frame.el
index 2604f979..d7fc3d4d 100644
--- a/modules/org-agenda-frame.el
+++ b/modules/org-agenda-frame.el
@@ -314,6 +314,29 @@ tick, killing the buffer would no longer delete the frame."
(defconst cj/--agenda-frame-timer-parameter 'cj/agenda-frame-timer
"Frame parameter holding the agenda frame's refresh timer (set in Phase 2).")
+(declare-function auto-dim-other-buffers-mode "auto-dim-other-buffers" (&optional arg))
+
+(defvar cj/--agenda-frame-dim-was-on nil
+ "Non-nil when the agenda frame's spawn turned `auto-dim-other-buffers-mode' off.
+The refresh tick's selection swing marks the working window non-selected,
+and auto-dim's debounced dim lands after the tick -- the working frame
+visibly dims every five minutes. Spawn suspends the mode and remembers it
+here; closing the frame restores it.")
+
+(defun cj/--agenda-frame-suspend-dim ()
+ "Turn auto-dim off for the agenda frame's lifetime, remembering it was on."
+ (when (and (bound-and-true-p auto-dim-other-buffers-mode)
+ (fboundp 'auto-dim-other-buffers-mode))
+ (setq cj/--agenda-frame-dim-was-on t)
+ (auto-dim-other-buffers-mode -1)))
+
+(defun cj/--agenda-frame-restore-dim ()
+ "Restore auto-dim if the agenda frame's spawn suspended it."
+ (when (and cj/--agenda-frame-dim-was-on
+ (fboundp 'auto-dim-other-buffers-mode))
+ (setq cj/--agenda-frame-dim-was-on nil)
+ (auto-dim-other-buffers-mode 1)))
+
(defvar cj/--agenda-frame-tearing-down nil
"Non-nil while the agenda frame is being torn down.
Breaks the `delete-frame' / `kill-buffer-hook' re-entrancy loop: deleting
@@ -343,6 +366,7 @@ kills the dedicated sticky buffer, so the next spawn regenerates fresh
rather than reusing stale sticky content. A non-agenda frame is ignored."
(when (cj/--agenda-frame-p frame)
(cj/--agenda-frame-cancel-timer frame)
+ (cj/--agenda-frame-restore-dim)
(let ((buffer (cj/--agenda-frame-sticky-buffer))
(cj/--agenda-frame-tearing-down t))
(when (buffer-live-p buffer)
@@ -414,6 +438,7 @@ Returns the new agenda frame on success."
(add-hook 'kill-buffer-hook
#'cj/--agenda-frame-on-kill-buffer nil t))))
(cj/--agenda-frame-start-timer frame)
+ (cj/--agenda-frame-suspend-dim)
frame)
(error
(when (frame-live-p frame)
diff --git a/tests/test-org-agenda-frame.el b/tests/test-org-agenda-frame.el
index 972df6ec..21842600 100644
--- a/tests/test-org-agenda-frame.el
+++ b/tests/test-org-agenda-frame.el
@@ -516,6 +516,76 @@ removed after a later success -- the failure banner would stick forever."
(cj/--agenda-frame-on-kill-buffer)
(should-not deleted))))
+;;; Auto-dim suspension while the agenda frame lives
+
+(ert-deftest test-org-agenda-frame-spawn-suspends-auto-dim ()
+ "Normal: spawning the frame turns auto-dim off and remembers it was on.
+The refresh tick's selection swing marks the working window non-selected;
+auto-dim's debounced dim then lands after the tick and the working frame
+visibly dims every five minutes."
+ (defvar auto-dim-other-buffers-mode)
+ (let ((auto-dim-other-buffers-mode t)
+ (cj/--agenda-frame-dim-was-on nil)
+ calls)
+ (cl-letf (((symbol-function 'auto-dim-other-buffers-mode)
+ (lambda (arg) (push arg calls)))
+ ((symbol-function 'selected-frame) (lambda () 'launch))
+ ((symbol-function 'make-frame) (lambda (&rest _) 'af))
+ ((symbol-function 'select-frame-set-input-focus) (lambda (_f &rest _) nil))
+ ((symbol-function 'cj/build-org-agenda-list) (lambda (&rest _) nil))
+ ((symbol-function 'org-agenda) (lambda (&rest _) nil))
+ ((symbol-function 'delete-other-windows) (lambda (&rest _) nil))
+ ((symbol-function 'cj/--agenda-frame-sticky-buffer) (lambda () nil))
+ ((symbol-function 'cj/--agenda-frame-start-timer) (lambda (_f) nil)))
+ (cj/--agenda-frame-spawn)
+ (should (equal calls '(-1)))
+ (should cj/--agenda-frame-dim-was-on))))
+
+(ert-deftest test-org-agenda-frame-spawn-leaves-auto-dim-when-off ()
+ "Boundary: auto-dim already off -> spawn doesn't touch it, no restore later."
+ (defvar auto-dim-other-buffers-mode)
+ (let ((auto-dim-other-buffers-mode nil)
+ (cj/--agenda-frame-dim-was-on nil)
+ calls)
+ (cl-letf (((symbol-function 'auto-dim-other-buffers-mode)
+ (lambda (arg) (push arg calls)))
+ ((symbol-function 'selected-frame) (lambda () 'launch))
+ ((symbol-function 'make-frame) (lambda (&rest _) 'af))
+ ((symbol-function 'select-frame-set-input-focus) (lambda (_f &rest _) nil))
+ ((symbol-function 'cj/build-org-agenda-list) (lambda (&rest _) nil))
+ ((symbol-function 'org-agenda) (lambda (&rest _) nil))
+ ((symbol-function 'delete-other-windows) (lambda (&rest _) nil))
+ ((symbol-function 'cj/--agenda-frame-sticky-buffer) (lambda () nil))
+ ((symbol-function 'cj/--agenda-frame-start-timer) (lambda (_f) nil)))
+ (cj/--agenda-frame-spawn)
+ (should (null calls))
+ (should-not cj/--agenda-frame-dim-was-on))))
+
+(ert-deftest test-org-agenda-frame-on-delete-restores-auto-dim ()
+ "Normal: closing the frame restores auto-dim when spawn had turned it off."
+ (let ((cj/--agenda-frame-dim-was-on t)
+ calls)
+ (cl-letf (((symbol-function 'auto-dim-other-buffers-mode)
+ (lambda (arg) (push arg calls)))
+ ((symbol-function 'cj/--agenda-frame-p) (lambda (_f) t))
+ ((symbol-function 'cj/--agenda-frame-cancel-timer)
+ (lambda (&optional _f) nil)))
+ (cj/--agenda-frame-on-delete-frame 'af)
+ (should (equal calls '(1)))
+ (should-not cj/--agenda-frame-dim-was-on))))
+
+(ert-deftest test-org-agenda-frame-on-delete-no-dim-restore-when-untouched ()
+ "Boundary: closing without a suspended auto-dim doesn't enable it."
+ (let ((cj/--agenda-frame-dim-was-on nil)
+ calls)
+ (cl-letf (((symbol-function 'auto-dim-other-buffers-mode)
+ (lambda (arg) (push arg calls)))
+ ((symbol-function 'cj/--agenda-frame-p) (lambda (_f) t))
+ ((symbol-function 'cj/--agenda-frame-cancel-timer)
+ (lambda (&optional _f) nil)))
+ (cj/--agenda-frame-on-delete-frame 'af)
+ (should (null calls)))))
+
;;; Frame lifecycle — transactional spawn rollback
(ert-deftest test-org-agenda-frame-spawn-rolls-back-on-failure ()