branch: externals/listen
commit 582e98a88027d874ecea51351f9a902b81b46849
Author: Adam Porter <[email protected]>
Commit: Adam Porter <[email protected]>
WIP: More workarounds
This now seems to correctly update the vtable even when its buffer is
not in a visible window.
---
listen-queue.el | 91 +++++++++++++++++++++++----------------------------------
1 file changed, 36 insertions(+), 55 deletions(-)
diff --git a/listen-queue.el b/listen-queue.el
index c0a4047c28..b5f4db4c45 100644
--- a/listen-queue.el
+++ b/listen-queue.el
@@ -326,46 +326,6 @@ If BACKWARDP, move it backward."
(listen-queue--annotate-buffer))
(listen-queue-goto-current queue)))
-
-(declare-function listen-mode "listen")
-(declare-function listen-play "listen")
-;;;###autoload
-(cl-defun listen-queue-play (queue &optional (track (car (listen-queue-tracks
queue))))
- "Play QUEUE and optionally TRACK in it.
-Interactively, selected queue with completion; and with prefix,
-select track as well."
- (interactive
- (let* ((queue (listen-queue-complete))
- (track (if current-prefix-arg
- (listen-queue-complete-track queue)
- (car (listen-queue-tracks queue)))))
- (list queue track)))
- (let ((player (listen-current-player)))
- (listen-play player (listen-track-filename track))
- ;; Remember queue position of track so if it gets removed, we can still go
to the next track.
- (setf (map-elt (listen-queue-etc queue) :track-number)
- (seq-position (listen-queue-tracks queue) track))
- (let ((previous-track (listen-queue-current queue)))
- (setf (listen-queue-current queue) track
- (map-elt (listen-player-etc player) :queue) queue)
- (listen-queue-with-buffer queue
- ;; HACK: Only update the vtable if its buffer is visible.
- (when-let ((buffer-window (get-buffer-window (current-buffer))))
- (with-selected-window buffer-window
- (listen-save-position
- (goto-char (point-min))
- (ignore-errors
- ;; HACK: Ignore errors, because if the window size has
changed, the vtable's cache
- ;; will miss and it will signal an error.
- (when previous-track
- (listen-queue--vtable-update-object (vtable-current-table)
- previous-track
previous-track))
- (listen-queue--vtable-update-object (vtable-current-table)
track track)))
- (listen-queue--highlight-current))))))
- (unless listen-mode
- (listen-mode))
- queue)
-
(defun listen-queue-goto-current (queue)
"Jump to current track."
(interactive (list (listen-queue-complete)))
@@ -991,13 +951,18 @@ Delay according to `listen-queue-delay-time-range', which
see."
`(let ((,positionᵄ ,position))
(save-excursion
(goto-char ,positionᵄ)
- (cl-letf* (((symbol-function 'vtable--cache-key)
- (lambda ()
- (cons listen-vtable-frame-terminal
listen-vtable-window-width)))
+ (cl-letf* (((symbol-function 'frame-terminal)
+ (lambda (&optional _)
+ listen-vtable-frame-terminal))
+ ((symbol-function 'window-width)
+ (lambda (&optional _ _)
+ listen-vtable-window-width))
(table (vtable-current-table))
((symbol-function 'vtable-current-table)
(lambda ()
- table)))
+ table))
+ ((symbol-function 'vtable--recompute-numerical)
+ #'listen-queue--vtable--recompute-numerical))
,@body)))))
(defvar-local listen-vtable-frame-terminal nil)
@@ -1084,25 +1049,41 @@ select track as well."
(declare-function listen-play "listen")
(let ((player (listen-current-player)))
(listen-play player (listen-track-filename track))
+ ;; Remember queue position of track so if it gets removed, we can still go
to the next track.
+ (setf (map-elt (listen-queue-etc queue) :track-number)
+ (seq-position (listen-queue-tracks queue) track))
(let ((previous-track (listen-queue-current queue)))
(setf (listen-queue-current queue) track
(map-elt (listen-player-etc player) :queue) queue)
(listen-queue-with-buffer queue
- ;; HACK: Only update the vtable if its buffer is visible.
- (when-let ((buffer-window (get-buffer-window (current-buffer))))
- (with-selected-window buffer-window
- (listen-save-position
- (listen-with-vtable-at (point-min)
- ;; HACK: Ignore errors, because if the window size has
changed, the vtable's cache
- ;; will miss and it will signal an error.
- (when previous-track
- (listen-queue--vtable-update-object table previous-track
previous-track))
- (listen-queue--vtable-update-object table track track)))
- (listen-queue--highlight-current))))))
+ (listen-save-position
+ (listen-with-vtable-at (point-min)
+ (when previous-track
+ (listen-queue--vtable-update-object table previous-track
previous-track))
+ (listen-queue--vtable-update-object table track track)))
+ (listen-queue--highlight-current))))
(unless listen-mode
(listen-mode))
queue)
+(defalias 'listen-queue--vtable--recompute-numerical
+ ;; See <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=69927>.
+ ;; TODO: Remove this when not needed.
+ (if (version<= emacs-version "29.2")
+ (lambda (table line)
+ "Recompute numericalness of columns if necessary."
+ (let ((columns (vtable-columns table))
+ (recompute nil))
+ (seq-do-indexed
+ (lambda (elem index)
+ (when (and (vtable-column--numerical (elt columns index))
+ (not (numberp (car elem))))
+ (setq recompute t)))
+ line)
+ (when recompute
+ (vtable--compute-columns table))))
+ #'vtable--recompute-numerical))
+
;;;; Footer
(provide 'listen-queue)