diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-25 13:14:40 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-25 13:14:40 -0500 |
| commit | 3bd514d9841429ba8a5b02819e7e10950c62ab8e (patch) | |
| tree | 6ccc73edaca3dd7e8d43785f21dabd699afa98e5 /tests | |
| parent | 32cfe216b4f5917b1a979e0372edf9b8f1ab62ea (diff) | |
| download | dotemacs-3bd514d9841429ba8a5b02819e7e10950c62ab8e.tar.gz dotemacs-3bd514d9841429ba8a5b02819e7e10950c62ab8e.zip | |
feat(auto-dim): dim vterm windows by blending terminal colors
Window dimming via face-remap never reached vterm. The terminal resolves its own colors per cell while redrawing, so it bypasses the remapped faces, and agent and shell windows stayed bright when they lost focus.
I advise vterm--get-color to blend each looked-up color toward the auto-dim faces whenever every window showing the buffer is dimmed. The foreground and background blend amounts are separate defcustoms (foreground stays more legible, background fades harder). After a dim-state change I force a full vterm repaint by briefly nudging the terminal size, because vterm only repaints the rows libvterm marked dirty. A post-command hook and a select-window advice cover the windmove and Shift-arrow focus paths that window-selection-change-functions misses.
Tests cover the dimmed-buffer predicate, the color blend, the selection-change scheduling, and the auto-dim-before-repaint ordering.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-auto-dim-config.el | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/test-auto-dim-config.el b/tests/test-auto-dim-config.el index 45e1db5f..f33a475a 100644 --- a/tests/test-auto-dim-config.el +++ b/tests/test-auto-dim-config.el @@ -10,6 +10,7 @@ ;;; Code: (require 'ert) +(require 'cl-lib) (add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) (defconst test-auto-dim--fork @@ -29,5 +30,107 @@ (when (fboundp 'auto-dim-other-buffers-mode) (auto-dim-other-buffers-mode -1)))) +(ert-deftest test-auto-dim-config-vterm-dimmed-p-all-windows-dimmed () + "Normal: a vterm buffer is dimmed when all displayed windows are dimmed." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let ((major-mode 'vterm-mode)) + (cl-letf (((symbol-function 'get-buffer-window-list) + (lambda (&rest _) '(left right))) + ((symbol-function 'window-parameter) + (lambda (window parameter) + (and (eq parameter 'adob--dim) + (memq window '(left right)))))) + (should (cj/auto-dim--vterm-buffer-dimmed-p))))) + +(ert-deftest test-auto-dim-config-vterm-dimmed-p-undimmed-window-keeps-buffer-bright () + "Normal: a selected/undimmed vterm window keeps the buffer bright." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let ((major-mode 'vterm-mode)) + (cl-letf (((symbol-function 'get-buffer-window-list) + (lambda (&rest _) '(left right))) + ((symbol-function 'window-parameter) + (lambda (window parameter) + (and (eq parameter 'adob--dim) + (eq window 'right))))) + (should-not (cj/auto-dim--vterm-buffer-dimmed-p))))) + +(ert-deftest test-auto-dim-config-vterm-get-color-dims-only-dimmed-vterm-buffers () + "Normal: vterm color advice dims only buffers marked dimmed." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let ((major-mode 'vterm-mode) + (cj/auto-dim-vterm-foreground-blend 1.0)) + (cl-letf (((symbol-function 'cj/auto-dim--vterm-buffer-dimmed-p) + (lambda () t)) + ((symbol-function 'cj/auto-dim--face-color) + (lambda (&rest _) "#555555"))) + (should (equal "#555555" + (cj/auto-dim--vterm-get-color + (lambda (&rest _) "#ffffff") 7 :foreground)))) + (cl-letf (((symbol-function 'cj/auto-dim--vterm-buffer-dimmed-p) + (lambda () nil))) + (should (equal "#ffffff" + (cj/auto-dim--vterm-get-color + (lambda (&rest _) "#ffffff") 7 :foreground)))))) + +(ert-deftest test-auto-dim-config-vterm-post-command-schedules-refresh-on-window-change () + "Normal: post-command vterm refresh schedules only after selection changes." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let ((cj/auto-dim--last-selected-window 'old) + (calls 0)) + (cl-letf (((symbol-function 'selected-window) + (lambda () 'new)) + ((symbol-function 'cj/auto-dim--schedule-vterm-refresh) + (lambda (&optional _) (setq calls (1+ calls))))) + (cj/auto-dim--refresh-vterm-on-command) + (cj/auto-dim--refresh-vterm-on-command)) + (should (eq cj/auto-dim--last-selected-window 'new)) + (should (= calls 1)))) + +(ert-deftest test-auto-dim-config-vterm-refresh-runs-auto-dim-before-invalidate () + "Normal: deferred vterm refresh updates auto-dim before invalidating vterm." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let (events) + (cl-letf (((symbol-function 'adob--update) + (lambda () (push 'adob events))) + ((symbol-function 'cj/auto-dim--refresh-vterm-windows) + (lambda (&optional _) (push 'vterm events)))) + (cj/auto-dim--refresh-vterm-after-auto-dim)) + (should (equal events '(vterm adob))))) + +(ert-deftest test-auto-dim-config-vterm-refresh-nudges-size-for-full-redraw () + "Normal: vterm refresh nudges size to force full-grid redraw." + (skip-unless (file-directory-p test-auto-dim--fork)) + (require 'auto-dim-config) + (let ((calls nil) + (vterm-min-window-width 80)) + (with-temp-buffer + (setq major-mode 'vterm-mode) + (setq-local vterm--term 'term) + (let ((buffer (current-buffer))) + (cl-letf (((symbol-function 'window-list) + (lambda (&rest _) '(vterm-window))) + ((symbol-function 'window-buffer) + (lambda (_) buffer)) + ((symbol-function 'window-live-p) + (lambda (_) t)) + ((symbol-function 'window-body-height) + (lambda (_) 24)) + ((symbol-function 'window-body-width) + (lambda (_) 100)) + ((symbol-function 'vterm--get-margin-width) + (lambda () 3)) + ((symbol-function 'vterm--set-size) + (lambda (term height width) + (push (list term height width) calls)))) + (cj/auto-dim--refresh-vterm-windows)))) + (should (equal (nreverse calls) + '((term 25 97) + (term 24 97)))))) + (provide 'test-auto-dim-config) ;;; test-auto-dim-config.el ends here |
