branch: externals/bufferlo commit 385a726715a8a47b0fe5e85827c9dd39fff0f965 Author: shipmints <shipmi...@gmail.com> Commit: shipmints <shipmi...@gmail.com>
Correct bufferlo--bookmark-frame-handler frame selection Restored frame must be selected and raised outside the context of with-selected-frame which restores the frame from before its invocation. --- bufferlo.el | 86 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/bufferlo.el b/bufferlo.el index 2205365d76..fc9ce80b79 100644 --- a/bufferlo.el +++ b/bufferlo.el @@ -2213,48 +2213,50 @@ the message after successfully restoring the bookmark." ;; Do the real work with the target frame selected (current or newly created) ;; NOTE: No :abort throws after this point - (with-selected-frame (if new-frame-p - (with-temp-buffer (make-frame)) - (selected-frame)) - ;; Clear existing tabs unless merging - (unless (eq load-policy 'merge) - (if (>= emacs-major-version 28) - (tab-bar-tabs-set nil) - (set-frame-parameter nil 'tabs nil))) - - ;; Load tabs - (let ((first (if (eq load-policy 'merge) nil t)) - (tab-bar-new-tab-choice t)) - (mapc - (lambda (tbm) - (if first - (setq first nil) - (tab-bar-new-tab-to)) - (bufferlo--bookmark-tab-handler tbm t 'embedded-tab) - (when-let* ((tab-name (alist-get 'tab-name tbm))) - (tab-bar-rename-tab tab-name))) - (alist-get 'tabs bookmark))) - (tab-bar-select-tab (alist-get 'current bookmark)) - - ;; Handle duplicate frame bookmark - (pcase duplicate-policy - ;; Do nothing for 'allow or nil - ('clear - (setq fbm nil)) - ('clear-warn - (setq fbm nil) - (funcall msg-append "cleared frame bookmark"))) - - (set-frame-parameter nil 'bufferlo-bookmark-frame-name fbm) - - ;; Restore geometry - (when (and new-frame-p - (display-graphic-p) - (eq bufferlo-bookmark-frame-load-make-frame 'restore-geometry)) - (when-let* ((fg (alist-get 'bufferlo--frame-geometry bookmark))) - (bufferlo--set-frame-geometry fg))) - - (raise-frame)) + (let ((frame (if new-frame-p + (with-temp-buffer (make-frame)) + (selected-frame)))) + (with-selected-frame frame + ;; Clear existing tabs unless merging + (unless (eq load-policy 'merge) + (if (>= emacs-major-version 28) + (tab-bar-tabs-set nil) + (set-frame-parameter nil 'tabs nil))) + + ;; Load tabs + (let ((first (if (eq load-policy 'merge) nil t)) + (tab-bar-new-tab-choice t)) + (mapc + (lambda (tbm) + (if first + (setq first nil) + (tab-bar-new-tab-to)) + (bufferlo--bookmark-tab-handler tbm t 'embedded-tab) + (when-let* ((tab-name (alist-get 'tab-name tbm))) + (tab-bar-rename-tab tab-name))) + (alist-get 'tabs bookmark))) + (tab-bar-select-tab (alist-get 'current bookmark)) + + ;; Handle duplicate frame bookmark + (pcase duplicate-policy + ;; Do nothing for 'allow or nil + ('clear + (setq fbm nil)) + ('clear-warn + (setq fbm nil) + (funcall msg-append "cleared frame bookmark"))) + + (set-frame-parameter nil 'bufferlo-bookmark-frame-name fbm) + + ;; Restore geometry + (when (and new-frame-p + (display-graphic-p) + (eq bufferlo-bookmark-frame-load-make-frame 'restore-geometry)) + (when-let* ((fg (alist-get 'bufferlo--frame-geometry bookmark))) + (bufferlo--set-frame-geometry fg)))) + + ;; Select and raise the restored frame outside the context of with-selected-frame + (select-frame-set-input-focus frame)) ;; Log message (unless (or no-message bufferlo--bookmark-handler-no-message)