branch: externals/dired-preview
commit 0dceaef04debd0543bf80080c03beedb39d9c721
Author: Protesilaos Stavrou <i...@protesilaos.com>
Commit: Protesilaos Stavrou <i...@protesilaos.com>

    Use a function to return the display-buffer action
    
    This gives the user maximum control over the behaviour of the
    display-buffer mechanism.
    
    Thanks to Bruno Boal for taking a look into this with me:
    <https://git.sr.ht/~bboal>.  This was done in a private channel and
    the information is shared with permission.
---
 dired-preview.el | 70 +++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 49 insertions(+), 21 deletions(-)

diff --git a/dired-preview.el b/dired-preview.el
index c13a5f2b08..34074cc5a6 100644
--- a/dired-preview.el
+++ b/dired-preview.el
@@ -82,28 +82,16 @@
   :group 'dired-preview
   :type 'integer)
 
-(defcustom dired-preview-buffer-name "*dired-preview*"
-  "Name of preview buffer.
-Used by the default value of `dired-preview-display-action-alist'."
-  :group 'dired-preview
-  :type 'string)
-
-(defcustom dired-preview-display-action-alist
-  `((display-buffer-in-side-window)
-    (side . right)
-    (slot . -1)
-    (window-width . 0.3)
-    (dedicated . t)
-    (window-parameters . ((no-other-window . t)
-                          (mode-line-format . ("%e"
-                                               mode-line-front-space
-                                               ,dired-preview-buffer-name)))))
-  "The `display-buffer' action for the preview.
+(defcustom dired-preview-display-action-alist-function
+  #'dired-preview-display-action-alist-dwim
+  "Function to return the `display-buffer' action for the preview.
 This is the same data that is passed to `display-buffer-alist'.
 Read Info node `(elisp) Displaying Buffers'.  As such, it is
-meant for experienced users."
+meant for experienced users.  See the reference function
+`dired-preview-display-action-alist-dwim' for the implementation
+details."
   :group 'dired-preview
-  :type 'alist)
+  :type 'function)
 
 (defcustom dired-preview-delay 0.7
   "Time in seconds to wait before previewing."
@@ -222,11 +210,51 @@ See user option 
`dired-preview-ignored-extensions-regexp'."
     (set-window-parameter window 'dired-preview-window :preview)
     (add-hook 'window-state-change-hook 
#'dired-preview--close-previews-outside-dired)))
 
+(defvar dired-preview-buffer-name "*dired-preview*"
+  "Name of preview buffer.")
+
+(defun dired-preview-return-window-size (dimension)
+  "Return window size by checking for DIMENSION.
+DIMENSION is either a `:width' or `:height' keyword.  It is
+checked against `split-width-threshold' or
+`split-height-threshold'"
+  (pcase dimension
+    (:width (if (>= (* fill-column 2) split-width-threshold)
+                fill-column
+              (- (window-body-width) fill-column)))
+    (:height (let ((height (frame-height)))
+               (if (>= (* height 2) split-height-threshold)
+                   height
+                 (- (window-body-height) height))))))
+
+(defun dired-preview-display-action-side ()
+  "Pick a side window that is appropriate for the given frame."
+  (if (>= (frame-pixel-width) (frame-pixel-height))
+      `(:side right :dimension window-width :size 
,(dired-preview-return-window-size :width))
+    `(:side bottom :dimension window-height :size 
,(dired-preview-return-window-size :height))))
+
+(defun dired-preview-display-action-alist-dwim ()
+  "Reference function for `dired-preview-display-action-alist-function'.
+Return a `display-buffer' action alist, as described in the
+aforementioned user option."
+  (let ((properties (dired-preview-display-action-side)))
+    `((display-buffer-in-side-window)
+      (side . ,(plist-get properties :side))
+      (slot . -1)
+      (,(plist-get properties :dimension) . ,(plist-get properties :size))
+      (dedicated . t)
+      (window-parameters . ((no-other-window . t)
+                            (mode-line-format . ("%e"
+                                                 mode-line-front-space
+                                                 
,dired-preview-buffer-name)))))))
+
 (defun dired-preview--display-buffer (buffer)
   "Call `display-buffer' for BUFFER.
 Only do it with the current major mode is Dired."
-  (display-buffer buffer dired-preview-display-action-alist)
-  (dired-preview-set-up-preview-window buffer))
+  (display-buffer buffer (funcall (or 
dired-preview-display-action-alist-function
+                                      
#'dired-preview-display-action-alist-dwim)))
+  (when (window-live-p (get-buffer-window buffer))
+    (dired-preview-set-up-preview-window buffer)))
 
 (defun dired-preview-display-file (file)
   "Display preview of FILE if appropriate."

Reply via email to