unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 1806@emacsbugs.donarmstrong.com
Subject: bug#1806: dired-pop-to-buffer in wrong place
Date: Tue, 20 Jan 2009 16:59:17 +0100	[thread overview]
Message-ID: <4975F4D5.5030000@gmx.at> (raw)
In-Reply-To: <jwvpriouh72.fsf-monnier+emacsbugreports@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 604 bytes --]

Please have a look at the attached (only lightly tested) patch.  I
didn't provide a similar service for `special-display-buffer-names' and
`special-display-regexps' yet.

`display-buffer' and `pop-to-buffer' behave "as usual" as long as the
default values for `pop-up-windows', NOT-THIS-WINDOW, and OTHER-WINDOW
are used.  An application calling `display-buffer' or `pop-to-buffer'
can specify the preferable window to split by setting NOT-THIS-WINDOW or
OTHER-WINDOW appropriately.  Users can specify their preferences (and
override the application) by setting `pop-up-windows' appropriately.

martin



[-- Attachment #2: window.el.diff --]
[-- Type: text/plain, Size: 11572 bytes --]

*** window.el.~1.179.~	2009-01-16 17:41:41.046875000 +0100
--- window.el	2009-01-20 16:58:01.062500000 +0100
***************
*** 789,797 ****
    :version "21.1"
    :group 'windows)
  
  (defcustom pop-up-windows t
!   "Non-nil means `display-buffer' should make a new window."
!   :type 'boolean
    :group 'windows)
  
  (defcustom split-height-threshold 80
--- 789,843 ----
    :version "21.1"
    :group 'windows)
  
+ ;; Make sure the following two variables always use the same values
+ ;; (sans `t').
+ (defconst pop-up-windows-values
+   '(largest lru selected below right bottom-left top-left)
+   "List of preferences supported by `pop-up-windows'.")
+ 
  (defcustom pop-up-windows t
!   "Non-nil means `display-buffer' is allowed to make a new window.
! A non-empty list specifies the windows `display-buffer' will
! consider for splitting on the respective frame.  The following
! entries are supported:
! 
!  largest ...... largest window
!  lru .......... least recently used window
!  selected ..... the frame's selected window
!  below ........ window below frame's selected window
!  right ........ window right of frame's selected window
!  bottom-left .. window in lower left corner of frame
!  top-left ..... window in upper left corner of frame
!  t ............ window specified by application
! 
! Note that when `display-buffer' finds the value t, it will use
! the value specified by the function that called `display-buffer'
! provided there is one, and ignore this entry otherwise.  If the
! entire list equals `(t)', `display-buffer' will pop up a new
! window if and only if the application specified value produces
! one.  If this list does not contain the value t, `display-buffer'
! will ignore any value specified by an application.
! 
! The default value t stands for the list `(t largest lru)'.  This
! means that Emacs will first try a value specified by the
! application that called `display-buffer'.  If there's no such
! value, or the window specified by that value doesn't exist, or
! that window can't be split, `display-buffer' will try to split
! the largest window and, if that fails too, the least recently
! used window."
!   :type '(choice
! 	  (const :tag "Disallow" nil)
! 	  (const :tag "Allow" t)
! 	  (repeat :tag "Preferences"
! 		  (choice
! 		   (const :tag "Largest" largest)
! 		   (const :tag "Least Recently Used" lru)
! 		   (const :tag "Selected" selected)
! 		   (const :tag "Below Selected" below)
! 		   (const :tag "Right of Selected" right)
! 		   (const :tag "Bottom Left" bottom-left)
! 		   (const :tag "Top Left" top-left)
! 		   (const :tag "Application Specified" t))))
    :group 'windows)
  
  (defcustom split-height-threshold 80
***************
*** 957,962 ****
--- 1003,1099 ----
  	  (enlarge-window (/ (- (window-height window) (window-height)) 2))
  	(error nil)))))
  
+ (defun window--probe-windows (frame windows probe)
+   "Find window in WINDOWS satisfying PROBE on FRAME.
+ To be called by `window--pop-up-window' exclusively."
+   (cond
+    ((eq probe 'selected)
+     (let ((window (frame-selected-window frame)))
+       (car (member window windows))))
+    ((eq probe 'largest)
+     (get-largest-window frame t))
+    ((eq probe 'lru)
+     (get-lru-window frame t))
+    ((memq probe '(below right bottom-left top-left))
+     (let ((this-edges
+ 	   (window-edges
+ 	    (cond
+ 	     ((memq probe '(below right))
+ 	      (frame-selected-window frame))
+ 	     ((memq probe '(top-left bottom-left))
+ 	      (frame-root-window frame)))))
+ 	  edges)
+       (catch 'found
+ 	(dolist (window windows)
+ 	  (setq edges (window-edges window))
+ 	  (when (or (and (eq probe 'below)
+ 			 (= (nth 1 edges) (nth 3 this-edges))
+ 			 (= (nth 2 edges) (nth 2 this-edges)))
+ 		    (and (eq probe 'right)
+ 			 (= (nth 0 edges) (nth 2 this-edges))
+ 			 (= (nth 1 edges) (nth 1 this-edges)))
+ 		    (and (eq probe 'top-left)
+ 			 (= (nth 0 edges) (nth 0 this-edges))
+ 			 (= (nth 1 edges) (nth 1 this-edges)))
+ 		    (and (eq probe 'bottom-left)
+ 			 (= (nth 0 edges) (nth 0 this-edges))
+ 			 (= (nth 3 edges) (nth 3 this-edges))))
+ 	    (throw 'found window))))))))
+ 
+ (defun window--pop-up-window (buffer frame user system)
+   "Pop up a new window for BUFFER on FRAME.
+ FRAME nil means the selected frame.  If FRAME cannot be split,
+ try to split a window on the last nonminibuffer frame instead.
+ 
+ USER, if not nil and not t, is a list specifying the user's
+ preferences for finding the window to split.  For a list of
+ supported values see the variable `pop-up-windows-values'.  The
+ special value t means to use SYSTEM, if applicable, instead.  For
+ the meaning of all values, consult the documentation of the
+ variable `pop-up-windows'.  If USER equals t, this means to use
+ the list `(t largest lru)' instead.
+ 
+ SYSTEM, provided it is any of `pop-up-windows-values',
+ substitutes an occurence of t within USER."
+   ;; FRAME nil means use the selected frame.
+   (setq frame (or frame (selected-frame)))
+   ;; But make sure our frame is not a minibuffer frame.
+   (when (window-minibuffer-p (frame-selected-window frame))
+     (setq frame (last-nonminibuffer-frame)))
+   (unless (and (frame-parameter frame 'unsplittable)
+ 	       ;; If the frame cannot be split have a look at
+ 	       ;; `last-nonminibuffer-frame'.
+ 	       (or (not (eq frame (selected-frame)))
+ 		   (not (setq frame (last-nonminibuffer-frame)))
+ 		   (not (window--frame-usable-p frame))
+ 		   (frame-parameter frame 'unsplittable)))
+     (when (eq user t)
+       ;; USER t means use '(t largest lru) instead.
+       (setq user '(t largest lru)))
+     (let* ((this-window (frame-selected-window frame))
+ 	   (windows (window-list frame 'nomini this-window))
+ 	   (probe (car user))
+ 	   window window-to-use)
+       ;; While we have not yet found a usable window, scan `windows' for
+       ;; a windows satisfying `probe'.
+       (while (and (not window-to-use) windows probe)
+ 	(setq window
+ 	      (if (eq probe t)
+ 		  ;; SYSTEM overrides t in USER.
+ 		  (when (memq system pop-up-windows-values)
+ 		    ;; SYSTEM is a valid value, so use it.
+ 		    (window--probe-windows frame windows system))
+ 		(window--probe-windows frame windows probe)))
+ 	(when window
+ 	  (setq window-to-use (window--try-to-split-window window)))
+ 	(unless window-to-use
+ 	  ;; Don't consider `window' again.
+ 	  (setq windows (remove window windows))
+ 	  (setq user (cdr user))
+ 	  (setq probe (car user))))
+       (when window-to-use
+ 	(window--display-buffer-2 buffer window-to-use)))))
+ 
  (defun window--display-buffer-1 (window)
    "Raise the frame containing WINDOW.
  Do not raise the selected frame.  Return WINDOW."
***************
*** 987,993 ****
  
  Optional argument NOT-THIS-WINDOW non-nil means display the
  buffer in a window other than the selected one, even if it is
! already displayed in the selected window.
  
  Optional argument FRAME specifies which frames to investigate
  when the specified buffer is already displayed.  If the buffer is
--- 1124,1135 ----
  
  Optional argument NOT-THIS-WINDOW non-nil means display the
  buffer in a window other than the selected one, even if it is
! already displayed in the selected window.  As a special case, if
! NOT-THIS-WINDOW is any of the values in `pop-up-windows-values',
! this means to use that for finding a window to split.  The
! documentation of the variable `pop-up-windows' contains an
! explanation of what these values mean as well as when such a
! value is applied.
  
  Optional argument FRAME specifies which frames to investigate
  when the specified buffer is already displayed.  If the buffer is
***************
*** 1009,1017 ****
  consider all visible or iconified frames."
    (interactive "BDisplay buffer:\nP")
    (let* ((can-use-selected-window
! 	  ;; The selected window is usable unless either NOT-THIS-WINDOW
! 	  ;; is non-nil, it is dedicated to its buffer, or it is the
! 	  ;; `minibuffer-window'.
  	  (not (or not-this-window
  		   (window-dedicated-p (selected-window))
  		   (window-minibuffer-p))))
--- 1151,1159 ----
  consider all visible or iconified frames."
    (interactive "BDisplay buffer:\nP")
    (let* ((can-use-selected-window
! 	  ;; The selected window is usable unless either
! 	  ;; NOT-THIS-WINDOW is non-nil, it is dedicated to its
! 	  ;; buffer, or it is the `minibuffer-window'.
  	  (not (or not-this-window
  		   (window-dedicated-p (selected-window))
  		   (window-minibuffer-p))))
***************
*** 1039,1046 ****
        (funcall display-buffer-function buffer not-this-window))
       ((and (not not-this-window)
  	   (eq (window-buffer (selected-window)) buffer))
!       ;; The selected window already displays BUFFER and
!       ;; `not-this-window' is nil, so use it.
        (window--display-buffer-1 (selected-window)))
       ((and can-use-selected-window (same-window-p name-of-buffer))
        ;; If the buffer's name tells us to use the selected window do so.
--- 1181,1188 ----
        (funcall display-buffer-function buffer not-this-window))
       ((and (not not-this-window)
  	   (eq (window-buffer (selected-window)) buffer))
!       ;; The selected window already displays BUFFER and NOT-THIS-WINDOW
!       ;; is nil, so use it.
        (window--display-buffer-1 (selected-window)))
       ((and can-use-selected-window (same-window-p name-of-buffer))
        ;; If the buffer's name tells us to use the selected window do so.
***************
*** 1073,1093 ****
        (window--display-buffer-2
         buffer (frame-selected-window (funcall pop-up-frame-function))))
       ((and pop-up-windows
! 	   ;; Make a new window.
! 	   (or (not (frame-parameter frame-to-use 'unsplittable))
! 	       ;; If the selected frame cannot be split look at
! 	       ;; `last-nonminibuffer-frame'.
! 	       (and (eq frame-to-use (selected-frame))
! 		    (setq frame-to-use (last-nonminibuffer-frame))
! 		    (window--frame-usable-p frame-to-use)
! 		    (not (frame-parameter frame-to-use 'unsplittable))))
! 	   ;; Attempt to split largest or least recently used window.
! 	   (setq window-to-use
! 		 (or (window--try-to-split-window
! 		      (get-largest-window frame-to-use t))
! 		     (window--try-to-split-window
! 		      (get-lru-window frame-to-use t))))
! 	   (window--display-buffer-2 buffer window-to-use)))
       ((let ((window-to-undedicate
  	     ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate
  	     ;; the selected window to its buffer, to avoid that some of
--- 1215,1222 ----
        (window--display-buffer-2
         buffer (frame-selected-window (funcall pop-up-frame-function))))
       ((and pop-up-windows
! 	   (window--pop-up-window
! 	    buffer frame-to-use pop-up-windows not-this-window)))
       ((let ((window-to-undedicate
  	     ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate
  	     ;; the selected window to its buffer, to avoid that some of
***************
*** 1129,1134 ****
--- 1258,1269 ----
  already visible in the selected window, and ignore
  `same-window-regexps' and `same-window-buffer-names'.
  
+ As a special case, if OTHER-WINDOW is any of the values in
+ `pop-up-windows-values', this means to use that value for finding
+ a suitable window to split.  The documentation of the variable
+ `pop-up-windows' contains an explanation of what these values
+ mean as well as when such a value is applied.
+ 
  If the window to show BUFFER-OR-NAME is not on the selected
  frame, raise that window's frame and give it input focus.
  

  reply	other threads:[~2009-01-20 15:59 UTC|newest]

Thread overview: 166+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-06 15:29 bug#1806: dired-pop-to-buffer in wrong place Juri Linkov
2009-01-06 17:33 ` martin rudalics
2009-01-06 17:54   ` Juri Linkov
2009-01-06 18:25     ` martin rudalics
2009-01-06 21:09       ` Juri Linkov
2009-01-07 10:27         ` martin rudalics
2009-01-07 12:09           ` Juri Linkov
2009-01-07 15:34             ` martin rudalics
2009-01-07 17:47               ` Juri Linkov
2009-01-07 20:00                 ` martin rudalics
2009-01-08  7:42                 ` martin rudalics
2009-01-08 22:55                   ` Juri Linkov
2009-01-09  9:30                     ` martin rudalics
2009-01-13 23:46                       ` Juri Linkov
2009-01-14 14:20                         ` martin rudalics
2009-01-14 18:00                           ` Stefan Monnier
2009-01-14 21:55                             ` martin rudalics
2009-01-14 22:19                               ` Stefan Monnier
2009-01-15 10:36                                 ` martin rudalics
2009-01-15 14:59                                   ` Stefan Monnier
2009-01-15 22:59                                     ` Juri Linkov
2009-01-16  2:19                                       ` Stefan Monnier
2009-01-20 15:59                                         ` martin rudalics [this message]
2009-01-21  2:51                                           ` Stefan Monnier
2009-04-28 22:58                                           ` Juri Linkov
2009-04-29  7:13                                             ` martin rudalics
2009-04-29  9:54                                               ` Juri Linkov
2009-04-29 12:39                                                 ` martin rudalics
2009-04-30 11:47                                                   ` Juri Linkov
2009-04-29 15:28                                               ` Stefan Monnier
2009-04-30  9:06                                                 ` martin rudalics
2009-04-30 18:29                                                   ` Stefan Monnier
2009-05-01 10:04                                                     ` martin rudalics
2009-05-01 17:24                                                       ` Stefan Monnier
2009-05-02  6:59                                                         ` martin rudalics
2009-05-04 13:52                                                           ` Stefan Monnier
2009-05-04 16:40                                                             ` martin rudalics
2009-05-02 11:48                                                       ` Juri Linkov
2009-05-02 13:09                                                         ` martin rudalics
2009-05-02 13:54                                                           ` Juri Linkov
2009-05-02 18:53                                                             ` martin rudalics
2009-05-02 20:57                                                               ` Juri Linkov
2009-05-02 22:39                                                         ` Juri Linkov
2009-05-03  7:50                                                           ` martin rudalics
2009-05-03 11:46                                                             ` Juri Linkov
2009-05-03 19:02                                                               ` martin rudalics
2009-05-05  7:04                                                 ` martin rudalics
2009-05-17 19:54                                                   ` Juri Linkov
2009-05-18  8:11                                                     ` martin rudalics
2009-05-18 10:59                                                       ` Roland Winkler
2009-05-18 12:14                                                         ` martin rudalics
2009-05-18 15:04                                                           ` Roland Winkler
2009-05-18 19:44                                                             ` Stefan Monnier
2009-05-19  0:09                                                             ` Juri Linkov
2009-05-18  8:11                                                     ` martin rudalics
2009-05-18 18:49                                                       ` Glenn Morris
2009-05-19  0:19                                                         ` Juri Linkov
2009-10-03  2:20                                                         ` Glenn Morris
2009-10-05 21:45                                                           ` Juri Linkov
2009-10-05 22:27                                                             ` Stephen Berman
2009-10-06  2:53                                                               ` Glenn Morris
2009-10-06  8:17                                                                 ` Stephen Berman
2009-10-06 22:38                                                                 ` Juri Linkov
2009-10-06  2:52                                                             ` Glenn Morris
2009-10-06  3:55                                                               ` Stefan Monnier
2009-10-06  7:22                                                                 ` Glenn Morris
2009-10-06  8:19                                                                   ` Stefan Monnier
2009-10-07  2:58                                                                     ` Glenn Morris
2009-10-07  5:54                                                                       ` Stefan Monnier
2009-10-06  8:56                                                                   ` martin rudalics
2009-10-06 16:19                                                                     ` Glenn Morris
2009-10-06 16:46                                                                       ` Stefan Monnier
2009-10-06 22:38                                                                       ` Juri Linkov
2009-10-07  2:58                                                                         ` Glenn Morris
2009-10-12 20:32                                                                           ` Juri Linkov
2009-10-12 22:57                                                                             ` Glenn Morris
2009-10-13 22:37                                                                               ` Juri Linkov
2009-10-14 20:35                                                                                 ` Juri Linkov
2009-10-15  5:39                                                                                   ` martin rudalics
2009-10-15 22:29                                                                                     ` Juri Linkov
2009-10-16  0:30                                                                                       ` Stefan Monnier
2009-10-16  7:05                                                                                         ` martin rudalics
2009-10-16 13:09                                                                                           ` Stefan Monnier
2009-10-16 13:25                                                                                             ` martin rudalics
2009-10-16 15:37                                                                                               ` Stefan Monnier
2009-10-16 16:35                                                                                                 ` martin rudalics
2009-10-16 20:41                                                                                                   ` Stefan Monnier
2009-10-17  9:03                                                                                                     ` martin rudalics
2009-10-18  1:40                                                                                                       ` Stefan Monnier
2009-10-18 10:24                                                                                                         ` martin rudalics
2009-10-18 14:45                                                                                                           ` Stefan Monnier
2009-10-18 15:34                                                                                                             ` martin rudalics
2009-10-19  2:08                                                                                                               ` Stefan Monnier
2009-10-19  7:36                                                                                                                 ` martin rudalics
2009-10-19 14:01                                                                                                                   ` Stefan Monnier
2009-10-19 15:16                                                                                                                     ` martin rudalics
2009-10-19 18:35                                                                                                                       ` Stefan Monnier
2009-10-20  7:35                                                                                                                         ` martin rudalics
2009-10-20 13:30                                                                                                                           ` Stefan Monnier
2009-10-20 15:14                                                                                                                             ` martin rudalics
2009-10-20 19:45                                                                                                                               ` Stefan Monnier
2009-10-16  7:05                                                                                       ` martin rudalics
2009-10-16  9:38                                                                                         ` Juri Linkov
2009-10-16 12:04                                                                                           ` martin rudalics
2009-10-16 16:10                                                                                             ` Glenn Morris
2009-10-16 13:15                                                                                           ` Stefan Monnier
2009-10-06 18:26                                                                     ` Glenn Morris
2009-10-06 22:38                                                                       ` Juri Linkov
2009-05-19  0:18                                                       ` Juri Linkov
2009-05-19  2:04                                                         ` Stefan Monnier
2009-01-14 23:37                               ` Juri Linkov
2009-01-15 10:37                                 ` martin rudalics
2009-01-15 23:00                                   ` Juri Linkov
2009-01-16 14:52                                     ` martin rudalics
2009-01-14 21:28                           ` Juri Linkov
2009-01-14 22:01                             ` martin rudalics
2009-01-14 23:16                               ` Stefan Monnier
     [not found]               ` <jwv63kpg30v.fsf-monnier+emacsbugreports@gnu.org>
2009-01-08 19:25                 ` martin rudalics
2009-01-08 22:59                   ` Juri Linkov
     [not found]                   ` <jwvy6xl9mz4.fsf-monnier+emacsbugreports@gnu.org>
2009-01-09  9:30                     ` martin rudalics
2009-01-09 17:19                       ` Stefan Monnier
2009-01-14 14:20                         ` martin rudalics
2009-01-14 18:00                           ` Stefan Monnier
2011-10-04 22:57                             ` Glenn Morris
2011-10-04 23:55                               ` Juri Linkov
2011-10-05 22:13                                 ` Chong Yidong
2011-10-05 23:23                                   ` Juri Linkov
2011-10-06  2:03                                     ` Chong Yidong
2011-10-06 15:20                                       ` Juri Linkov
2011-10-10 20:51                                         ` Juri Linkov
2009-01-08 14:31             ` Roland Winkler
2009-01-08 11:52           ` Carsten Dominik
2009-01-08 19:25             ` martin rudalics
2009-01-06 22:07     ` Stefan Monnier
2009-01-06 23:27       ` Juri Linkov
2009-01-07  4:23         ` Stefan Monnier
2012-09-22 13:24 ` martin rudalics
2012-09-22 23:54   ` Juri Linkov
2012-09-23  9:22     ` martin rudalics
2012-09-24  8:22       ` Juri Linkov
2012-09-24  9:40         ` martin rudalics
2012-09-25  8:05           ` Juri Linkov
2012-09-25  9:59             ` martin rudalics
2012-09-26  6:24               ` Juri Linkov
2012-09-26  8:48                 ` martin rudalics
2012-09-26 10:10                   ` Juri Linkov
2012-09-26 11:03                     ` martin rudalics
2012-09-27  8:01                       ` Juri Linkov
2012-09-27 17:32                         ` martin rudalics
2012-09-27 19:24                           ` Juri Linkov
2012-09-28  6:32                             ` martin rudalics
2012-09-28  9:38                               ` Juri Linkov
2012-09-28 13:14                                 ` martin rudalics
2012-09-28 15:27                                   ` Juri Linkov
2012-09-30 10:47                                     ` martin rudalics
2012-09-30 13:40                                       ` Juri Linkov
2012-10-03 23:29                                       ` Juri Linkov
2012-10-04  3:55                                         ` Drew Adams
2012-10-04  7:45                                           ` martin rudalics
2012-10-04 14:04                                             ` Drew Adams
2012-10-04  7:44                                         ` martin rudalics
2012-10-04  8:51                                           ` Juri Linkov
2012-10-04 13:17                                             ` martin rudalics
2012-09-26  3:16           ` Chong Yidong
2012-09-26  8:48             ` martin rudalics
2012-09-26 11:22               ` Juanma Barranquero

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4975F4D5.5030000@gmx.at \
    --to=rudalics@gmx.at \
    --cc=1806@emacsbugs.donarmstrong.com \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).