New functions window-state-buffers and tab-bar-get-buffer-tab (bug#38354)

* lisp/window.el (window-state-buffers): New function.
* lisp/tab-bar.el (tab-bar-get-buffer-tab): New function.

* lisp/emacs-lisp/seq.el (seq-some): Add autoload cookie.

* lisp/desktop.el (desktop-buffers-not-to-save-function): New variable.
(desktop-save-buffer-p): Use it.
This commit is contained in:
Juri Linkov 2019-12-03 01:40:12 +02:00
parent 91762e49e1
commit 9a911b4af5
4 changed files with 59 additions and 2 deletions

View file

@ -946,7 +946,9 @@ which means to truncate VAR's value to at most MAX-SIZE elements
")\n"))))
;; ----------------------------------------------------------------------------
(defun desktop-save-buffer-p (filename bufname mode &rest _dummy)
(defvar desktop-buffers-not-to-save-function nil)
(defun desktop-save-buffer-p (filename bufname mode &rest rest)
"Return t if buffer should have its state saved in the desktop file.
FILENAME is the visited file name, BUFNAME is the buffer name, and
MODE is the major mode.
@ -970,6 +972,9 @@ MODE is the major mode.
(and (null filename)
(null dired-skip) ; bug#5755
(with-current-buffer bufname desktop-save-buffer)))
(or (null desktop-buffers-not-to-save-function)
(funcall desktop-buffers-not-to-save-function
filename bufname mode rest))
t)))
;; ----------------------------------------------------------------------------

View file

@ -348,6 +348,7 @@ If SEQUENCE is empty, return INITIAL-VALUE and FUNCTION is not called."
(throw 'seq--break nil)))
t))
;;;###autoload
(cl-defgeneric seq-some (pred sequence)
"Return non-nil if PRED is satisfied for at least one element of SEQUENCE.
If so, return the first non-nil value returned by PRED."

View file

@ -1244,7 +1244,8 @@ in the selected frame."
(kill-buffer (current-buffer))
;; Delete the current window configuration of tab list
;; without storing it in the undo list of closed tabs
(let (tab-bar-closed-tabs)
(let ((tab-bar-mode t) ; avoid message about deleted tab
tab-bar-closed-tabs)
(tab-bar-close-tab nil (1+ (tab-bar--tab-index to-tab))))))
(defun tab-bar-list-mouse-select (event)
@ -1284,6 +1285,47 @@ indirectly called by the latter."
(tab-bar-rename-tab name))))
(tab-bar-new-tab))))
(defun tab-bar-get-buffer-tab (buffer-or-name &optional all-frames)
"Return a tab whose window contains BUFFER-OR-NAME, or nil if none.
BUFFER-OR-NAME may be a buffer or a buffer name and defaults to
the current buffer.
The optional argument ALL-FRAMES specifies the frames to consider:
- t means consider all tabs on all existing frames.
- `visible' means consider all tabs on all visible frames.
- A frame means consider all tabs on that frame only.
Any other value of ALL-FRAMES means consider all tabs on the
selected frame and no others."
(let ((buffer (if buffer-or-name
(get-buffer buffer-or-name)
(current-buffer))))
(when (bufferp buffer)
(let ((frames (cond
((eq all-frames t) (frame-list))
((eq all-frames 'visible) (visible-frame-list))
((framep all-frames) (list all-frames))
(t (list (selected-frame))))))
(seq-some (lambda (frame)
(with-selected-frame frame
(seq-some (lambda (tab)
(when (if (eq (car tab) 'current-tab)
(get-buffer-window buffer frame)
(let* ((state (cdr (assq 'ws tab)))
(buffers (when state
(window-state-buffers state))))
(or
;; non-writable window-state
(memq buffer buffers)
;; writable window-state
(member (buffer-name buffer) buffers))))
(append tab `((frame . ,frame)))))
(funcall tab-bar-tabs-function))))
frames)))))
(defun switch-to-buffer-other-tab (buffer-or-name &optional norecord)
"Switch to buffer BUFFER-OR-NAME in another tab.

View file

@ -6231,6 +6231,15 @@ windows can get as small as `window-safe-min-height' and
(delete-window window))))
(window--check frame))))
(defun window-state-buffers (state)
"Return all buffers saved to the given window state STATE."
(let ((buffer (cadr (assq 'buffer state)))
(buffers (mapcan (lambda (item)
(when (memq (car item) '(leaf vc hc))
(window-state-buffers item)))
(if (consp (car state)) (list (cdr state)) (cdr state)))))
(if buffer (cons buffer buffers) buffers)))
(defun window-swap-states (&optional window-1 window-2 size)
"Swap the states of live windows WINDOW-1 and WINDOW-2.
WINDOW-1 must specify a live window and defaults to the selected