On 14/10/2021 22:44, Max Nikulin wrote:

I think, something should be done with `org-no-popups'. Assume a user who has (I have no idea concerning the goal though)

   (setq pop-up-frames t)
   (setq display-buffer-base-action
         '((display-buffer-reuse-window display-buffer-pop-up-frame)
           (reusable-frames . 0)))

With "emacs -Q" and above settings completion e.g. for "C-h f" does not cause creation of a new frame. Org help windows appear in new frames though. That is why `org-no-popups' should have more code.

I was wrong, (setq pop-up-frames t) leads to creation of new frame for *Completion* buffer at least in Emacs-26.3.

It seems, each case of `org-no-popups' may require specific code. I have tried to take some code related to completion. It overrides display-buffer-base-action, but something more is required for pop-up-frames. That code uses `with-current-buffer-window' while org-goto uses `with-output-to-temp-buffer'. I am unsure what variant is more suitable for org-goto.

I am attaching my draft with minimal changes. I do not like to rely on internal functions but I have not found high level replacement to achieve the same result. Maybe emacs code has a better variant somewhere.
diff --git a/lisp/org-goto.el b/lisp/org-goto.el
index 0a3470f54..26fc2b735 100644
--- a/lisp/org-goto.el
+++ b/lisp/org-goto.el
@@ -203,7 +203,6 @@ When nil, you can use these keybindings to navigate the buffer:
   "Let the user select a location in current buffer.
 This function uses a recursive edit.  It returns the selected
 position or nil."
-  (org-no-popups
    (let ((isearch-mode-map org-goto-local-auto-isearch-map)
 	 (isearch-hide-immediately nil)
 	 (isearch-search-fun-function
@@ -217,7 +216,35 @@ position or nil."
 	  (condition-case nil
 	      (make-indirect-buffer (current-buffer) "*org-goto*" t)
 	    (error (make-indirect-buffer (current-buffer) "*org-goto*" t))))
-	 (let (temp-buffer-show-function temp-buffer-show-hook)
+	 (let (temp-buffer-show-hook
+	       (temp-buffer-show-function
+		(lambda (buffer)
+		  "Prevent new frame in the case of
+
+  (setq display-buffer-base-action
+        '((display-buffer-reuse-window display-buffer-pop-up-frame)
+          (reusable-frames . 0)))
+
+It is not immune to
+
+  (setq pop-up-frames t)
+
+just as \"*Completion*\" buffer.
+The idea is borrowed from `minibuffer-completion-help'."
+		  (display-buffer
+                   buffer
+                   `((display-buffer--maybe-same-window
+                      display-buffer-reuse-window
+                      ,(if (functionp 'display-buffer--maybe-pop-up-frame)
+                           ;; Unavailable in emacs-26
+                           'display-buffer--maybe-pop-up-frame
+                         'display-buffer--maybe-pop-up-frame-or-window)
+                      display-buffer-below-selected)
+                     ,(if temp-buffer-resize-mode
+                          '(window-height . resize-temp-buffer-window)
+                        '(window-height . fit-window-to-buffer))
+                     ,(when temp-buffer-resize-mode
+                        '(preserve-size . (nil . t))))))))
 	   (with-output-to-temp-buffer "*Org Help*"
 	     (princ (format help (if org-goto-auto-isearch
 				     "  Just type for auto-isearch."
@@ -236,7 +263,7 @@ position or nil."
 	 (use-local-map org-goto-map)
 	 (recursive-edit)))
      (kill-buffer "*org-goto*")
-     (cons org-goto-selected-point org-goto-exit-command))))
+     (cons org-goto-selected-point org-goto-exit-command)))
 
 ;;;###autoload
 (defun org-goto (&optional alternative-interface)

Reply via email to