aboutsummaryrefslogtreecommitdiff
path: root/modules/music-config.el
diff options
context:
space:
mode:
Diffstat (limited to 'modules/music-config.el')
-rw-r--r--modules/music-config.el38
1 files changed, 36 insertions, 2 deletions
diff --git a/modules/music-config.el b/modules/music-config.el
index bff0f5ce..e9f7c2bb 100644
--- a/modules/music-config.el
+++ b/modules/music-config.el
@@ -364,7 +364,8 @@ that right-aligns the metadata drifts point to arbitrary visual columns
and snaps every landing back to the row start. An active isearch owns
point until it ends; the snap lands when the search exits."
(unless (or (bolp) (bound-and-true-p isearch-mode))
- (beginning-of-line)))
+ (beginning-of-line))
+ (cj/music--highlight-current-number))
(defvar-local cj/music--renumber-timer nil
"Pending idle timer for the playlist row renumber, or nil.")
@@ -401,7 +402,40 @@ debounce timer can outlive the playlist buffer."
(propertize (format "%3d " n)
'face 'cj/music-keyhint-face
'cursor t))))
- (forward-line 1))))))))
+ (forward-line 1))))
+ ;; The rebuild deleted the marked overlay; re-mark the current row.
+ (setq cj/music--current-number-overlay nil)
+ (cj/music--highlight-current-number)))))
+
+(defvar-local cj/music--current-number-overlay nil
+ "The number overlay currently rendered as the you-are-here mark, or nil.")
+
+(defun cj/music--set-number-face (ov current)
+ "Re-render number overlay OV's string; CURRENT non-nil marks it inverse.
+Keeps the text and the cursor property, swaps only the face."
+ (let ((s (overlay-get ov 'before-string)))
+ (overlay-put ov 'before-string
+ (propertize (substring-no-properties s)
+ 'face (if current
+ '(:inherit cj/music-keyhint-face :inverse-video t)
+ 'cj/music-keyhint-face)
+ 'cursor t))))
+
+(defun cj/music--highlight-current-number ()
+ "Render the current row's number in inverse video, restoring the last one.
+The block cursor draws only in the selected window, and the playlist dock
+is glanced at from other windows constantly, so the number itself carries
+the you-are-here mark -- visible whether or not the window has focus."
+ (let ((ov (seq-find (lambda (o) (overlay-get o 'cj-music-row-number))
+ (overlays-in (line-beginning-position)
+ (min (1+ (line-beginning-position)) (point-max))))))
+ (unless (eq ov cj/music--current-number-overlay)
+ (when (and (overlayp cj/music--current-number-overlay)
+ (overlay-buffer cj/music--current-number-overlay))
+ (cj/music--set-number-face cj/music--current-number-overlay nil))
+ (setq cj/music--current-number-overlay ov)
+ (when ov
+ (cj/music--set-number-face ov t)))))
(defun cj/music--schedule-renumber (&rest _)
"Debounced renumber of the current playlist buffer after a text change.