branch: externals/bufferlo
commit 4be499010ad74ca50858b5328343cd6b667dc6c1
Author: shipmints <shipmi...@gmail.com>
Commit: shipmints <shipmi...@gmail.com>

    Bookmark saving and closing now retain user's focused frame/tab. Renamed 
org- to orig-. Indent correct.
---
 bufferlo.el | 72 +++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 42 insertions(+), 30 deletions(-)

diff --git a/bufferlo.el b/bufferlo.el
index d79f8f9e93..125549ff7d 100644
--- a/bufferlo.el
+++ b/bufferlo.el
@@ -609,7 +609,7 @@ when `tab-bar--tab' is called from `tab-bar-select-tab."
 
 (defun bufferlo--clear-buffer-lists-activate (oldfn &rest args)
   "This should be set up as a advice around `tab-bar-select-tab'.
-It actiavtes clearing the buffer lists for `tab-bar--tab'
+It activates clearing the buffer lists for `tab-bar--tab'
 before calling OLDFN with ARGS.  See `bufferlo--clear-buffer-lists'."
   (let* ((bufferlo--clear-buffer-lists-active t)
          (result (apply oldfn args)))
@@ -1493,7 +1493,7 @@ this bookmark is embedded in a frame bookmark."
     (let ((bookmark-name (if (null embedded-tab)
                              (bookmark-name-from-full-record bookmark)
                            nil))
-             (msg))
+          (msg))
       (when-let ((abm (assoc bookmark-name (bufferlo--active-bookmarks)))
                  (duplicate-policy bufferlo-bookmark-tab-duplicate-policy))
         (when (eq duplicate-policy 'prompt)
@@ -1540,7 +1540,7 @@ this bookmark is embedded in a frame bookmark."
              (renamed
               (mapcar
                (lambda (bm)
-                 (let ((org-name (car bm))
+                 (let ((orig-name (car bm))
                        (record (cadr bm)))
                    (set-buffer dummy)
                    (condition-case err
@@ -1550,10 +1550,10 @@ this bookmark is embedded in a frame bookmark."
                               (run-hooks 'bookmark-after-jump-hook))
                      (error
                       (ignore err)
-                      (message "Bufferlo tab: Could not restore %s (error %s)" 
org-name err)))
+                      (message "Bufferlo tab: Could not restore %s (error %s)" 
orig-name err)))
                    (unless (eq (current-buffer) dummy)
-                     (unless (string-equal org-name (buffer-name))
-                       (cons org-name (buffer-name))))))
+                     (unless (string-equal orig-name (buffer-name))
+                       (cons orig-name (buffer-name))))))
                (alist-get 'buffer-bookmarks bookmark)))
              (bl (mapcar (lambda (b)
                            (if-let (replace (assoc b renamed))
@@ -1571,23 +1571,23 @@ this bookmark is embedded in a frame bookmark."
           (when (and (not embedded-tab)
                      bookmark-name
                      (frame-parameter nil 'bufferlo-bookmark-frame-name))
-              (let ((clear-policy 
bufferlo-bookmark-tab-load-into-bookmarked-frame-policy))
-                (when (eq clear-policy 'prompt)
-                  (pcase (let ((read-answer-short t))
-                           (read-answer "Tab bookmark conflicts with frame 
bookmark: Allow tab bookmark, Clear tab bookmark "
-                                        '(("allow" ?a "Allow tab bookmark")
-                                          ("clear" ?c "Clear tab bookmark")
-                                          ("help" ?h "Help")
-                                          ("quit" ?q "Quit--retains the 
bookmark"))))
-                    ("clear" (setq clear-policy 'clear))
-                    (_ (setq clear-policy 'allow)))) ; allow, quit cases
-                (pcase clear-policy
-                  ('clear
-                   (setq tbm nil))
-                  ('clear-warn
-                   (setq tbm nil)
-                   (setq msg (concat msg "; cleared tab bookmark")))
-                  ('allow))))
+            (let ((clear-policy 
bufferlo-bookmark-tab-load-into-bookmarked-frame-policy))
+              (when (eq clear-policy 'prompt)
+                (pcase (let ((read-answer-short t))
+                         (read-answer "Tab bookmark conflicts with frame 
bookmark: Allow tab bookmark, Clear tab bookmark "
+                                      '(("allow" ?a "Allow tab bookmark")
+                                        ("clear" ?c "Clear tab bookmark")
+                                        ("help" ?h "Help")
+                                        ("quit" ?q "Quit--retains the 
bookmark"))))
+                  ("clear" (setq clear-policy 'clear))
+                  (_ (setq clear-policy 'allow)))) ; allow, quit cases
+              (pcase clear-policy
+                ('clear
+                 (setq tbm nil))
+                ('clear-warn
+                 (setq tbm nil)
+                 (setq msg (concat msg "; cleared tab bookmark")))
+                ('allow))))
           (setf (alist-get 'bufferlo-bookmark-tab-name
                            (cdr (bufferlo--current-tab)))
                 tbm))
@@ -1600,7 +1600,7 @@ this bookmark is embedded in a frame bookmark."
 (defun bufferlo--bookmark-frame-get (&optional frame)
   "Get the bufferlo frame bookmark.
 FRAME specifies the frame; the default value of nil selects the current frame."
-  (let ((org-tab (1+ (tab-bar--current-tab-index nil frame)))
+  (let ((orig-tab (1+ (tab-bar--current-tab-index nil frame)))
         (tabs nil))
     (dotimes (i (length (funcall tab-bar-tabs-function frame)))
       (tab-bar-select-tab (1+ i))
@@ -1612,9 +1612,9 @@ FRAME specifies the frame; the default value of nil 
selects the current frame."
             (push (cons 'tab-name name) tbm)
           (push (cons 'tab-name nil) tbm))
         (push tbm tabs)))
-    (tab-bar-select-tab org-tab)
+    (tab-bar-select-tab orig-tab)
     `((tabs . ,(reverse tabs))
-      (current . ,org-tab)
+      (current . ,orig-tab)
       (handler . ,#'bufferlo--bookmark-frame-handler))))
 
 (defun bufferlo--bookmark-frame-handler (bookmark &optional no-message)
@@ -1927,7 +1927,12 @@ Specify NO-MESSAGE to inhibit the bookmark save status 
message."
              ((eq abm-type 'fbm)
               (bufferlo-bookmark-frame-save abm-name nil t))
              ((eq abm-type 'tbm)
-              (bufferlo-bookmark-tab-save abm-name nil t)))
+              (let ((orig-tab (1+ (tab-bar--current-tab-index))))
+                (tab-bar-select-tab
+                 (1+ (tab-bar--tab-index
+                      (alist-get 'tab (cadr abm)))))
+                (bufferlo-bookmark-tab-save abm-name nil t)
+                (tab-bar-select-tab orig-tab))))
             (push abm-name bookmarks-saved)))))
     (cond
      (bookmarks-saved
@@ -2173,8 +2178,9 @@ transient work."
                 abms))
          (fbms (seq-filter
                 (lambda (x) (eq 'fbm (alist-get 'type (cadr x))))
-                abms)))
-    ;; do tab bookmarks first, then frame bookmarks
+                abms))
+         (orig-frame (selected-frame))
+         (orig-tab-name (alist-get 'name (bufferlo--current-tab))))
     (dolist (abm tbms)
       (let ((abm-frame (alist-get 'frame (cadr abm)))
             (abm-tab (alist-get 'tab (cadr abm))))
@@ -2189,7 +2195,13 @@ transient work."
         (with-selected-frame abm-frame
           (let ((bufferlo-delete-frame-kill-buffers-save-bookmark-prompt nil)
                 (bufferlo-delete-frame-kill-buffers-prompt nil))
-            (bufferlo-delete-frame-kill-buffers)))))))
+            (bufferlo-delete-frame-kill-buffers)))))
+    ;; Best effort to get back to where we started. Frame and/or tab could now 
be gone.
+    (when (frame-live-p orig-frame)
+      (select-frame orig-frame)
+      (let ((tab-index (tab-bar--tab-index-by-name orig-tab-name)))
+        (if tab-index
+            (tab-bar-select-tab (1+ tab-index)))))))
 
 (defun bufferlo-bookmarks-close ()
   "Close all active bufferlo frame and tab bookmarks and kill their buffers.

Reply via email to