X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2e955a8b51cf21b6f5383ef77cd32d0d58fcabc1..27422a9d8a01ea0658d689be824936674bb20d6e:/lisp/ediff-wind.el diff --git a/lisp/ediff-wind.el b/lisp/ediff-wind.el index 723ae57776..26ff106088 100644 --- a/lisp/ediff-wind.el +++ b/lisp/ediff-wind.el @@ -1,6 +1,7 @@ ;;; ediff-wind.el --- window manipulation utilities -;; Copyright (C) 1994, 95, 96, 97, 2000, 01, 02 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003, +;; 2004, 2005 Free Software Foundation, Inc. ;; Author: Michael Kifer @@ -18,13 +19,13 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: ;;; Code: - + (provide 'ediff-wind) ;; Compiler pacifier @@ -66,7 +67,7 @@ (defun ediff-compute-toolbar-width () 0)) (defgroup ediff-window nil - "Ediff window manipulation" + "Ediff window manipulation." :prefix "ediff-" :group 'ediff :group 'frames) @@ -155,6 +156,7 @@ In this case, Ediff will use those frames to display these buffers." '(user-position . t) ; Emacs only '(vertical-scroll-bars . nil) ; Emacs only '(scrollbar-width . 0) ; XEmacs only + '(scrollbar-height . 0) ; XEmacs only '(menu-bar-lines . 0) ; Emacs only '(tool-bar-lines . 0) ; Emacs 21+ only ;; don't lower but auto-raise @@ -280,7 +282,7 @@ into icons, regardless of the window manager." ) ) )) - + ;; Select the lowest window on the frame. (defun ediff-select-lowest-window () @@ -300,7 +302,7 @@ into icons, regardless of the window manager." (progn (setq bottom-edge next-bottom-edge) (setq lowest-window this-window))) - + (select-window this-window) (if (eq last-window this-window) (progn @@ -321,11 +323,11 @@ into icons, regardless of the window manager." (run-hooks 'ediff-before-setup-windows-hook) (if (eq (selected-window) (minibuffer-window)) (other-window 1)) - + ;; in case user did a no-no on a tty (or (ediff-window-display-p) (setq ediff-window-setup-function 'ediff-setup-windows-plain)) - + (or (ediff-keep-window-config control-buffer) (funcall (ediff-with-current-buffer control-buffer ediff-window-setup-function) @@ -343,7 +345,7 @@ into icons, regardless of the window manager." buffer-A buffer-B buffer-C control-buffer) (ediff-setup-windows-plain-compare buffer-A buffer-B buffer-C control-buffer))) - + (defun ediff-setup-windows-plain-merge (buf-A buf-B buf-C control-buffer) ;; skip dedicated and unsplittable frames (ediff-destroy-control-frame control-buffer) @@ -359,43 +361,43 @@ into icons, regardless of the window manager." (split-window-vertically) (ediff-select-lowest-window) (ediff-setup-control-buffer control-buffer) - + ;; go to the upper window and split it betw A, B, and possibly C (other-window 1) (setq merge-window-lines (max 2 (round (* (window-height) merge-window-share)))) (switch-to-buffer buf-A) (setq wind-A (selected-window)) - + ;; XEmacs used to have a lot of trouble with display ;; It did't set things right unless we tell it to sit still ;; 19.12 seems ok. ;;(if ediff-xemacs-p (sit-for 0)) - + (split-window-vertically (max 2 (- (window-height) merge-window-lines))) (if (eq (selected-window) wind-A) (other-window 1)) (setq wind-C (selected-window)) (switch-to-buffer buf-C) - + (select-window wind-A) (funcall split-window-function) - + (if (eq (selected-window) wind-A) (other-window 1)) (switch-to-buffer buf-B) (setq wind-B (selected-window)) - + (ediff-with-current-buffer control-buffer (setq ediff-window-A wind-A ediff-window-B wind-B ediff-window-C wind-C)) - + (ediff-select-lowest-window) (ediff-setup-control-buffer control-buffer) )) - + ;; This function handles all comparison jobs, including 3way jobs (defun ediff-setup-windows-plain-compare (buf-A buf-B buf-C control-buffer) ;; skip dedicated and unsplittable frames @@ -418,7 +420,7 @@ into icons, regardless of the window manager." (split-window-vertically) (ediff-select-lowest-window) (ediff-setup-control-buffer control-buffer) - + ;; go to the upper window and split it betw A, B, and possibly C (other-window 1) (switch-to-buffer buf-A) @@ -429,19 +431,19 @@ into icons, regardless of the window manager." (window-height wind-A) (window-width wind-A)) 3))) - + ;; XEmacs used to have a lot of trouble with display ;; It did't set things right unless we told it to sit still ;; 19.12 seems ok. ;;(if ediff-xemacs-p (sit-for 0)) - + (funcall split-window-function wind-width-or-height) - + (if (eq (selected-window) wind-A) (other-window 1)) (switch-to-buffer buf-B) (setq wind-B (selected-window)) - + (if three-way-comparison (progn (funcall split-window-function) ; equally @@ -449,24 +451,24 @@ into icons, regardless of the window manager." (other-window 1)) (switch-to-buffer buf-C) (setq wind-C (selected-window)))) - + (ediff-with-current-buffer control-buffer (setq ediff-window-A wind-A ediff-window-B wind-B ediff-window-C wind-C)) - + ;; It is unlikely that we will want to implement 3way window comparison. ;; So, only buffers A and B are used here. (if ediff-windows-job (progn (set-window-start wind-A wind-A-start) (set-window-start wind-B wind-B-start))) - + (ediff-select-lowest-window) (ediff-setup-control-buffer control-buffer) )) - + ;; dispatch an appropriate window setup function (defun ediff-setup-windows-multiframe (buf-A buf-B buf-C control-buf) (ediff-with-current-buffer control-buf @@ -474,7 +476,7 @@ into icons, regardless of the window manager." (if ediff-merge-job (ediff-setup-windows-multiframe-merge buf-A buf-B buf-C control-buf) (ediff-setup-windows-multiframe-compare buf-A buf-B buf-C control-buf))) - + (defun ediff-setup-windows-multiframe-merge (buf-A buf-B buf-C control-buf) ;;; Algorithm: ;;; 1. Never use frames that have dedicated windows in them---it is bad to @@ -490,7 +492,7 @@ into icons, regardless of the window manager." ;; Skip dedicated or iconified frames. ;; Unsplittable frames are taken care of later. (ediff-skip-unsuitable-frames 'ok-unsplittable) - + (let* ((window-min-height 1) (wind-A (ediff-get-visible-buffer-window buf-A)) (wind-B (ediff-get-visible-buffer-window buf-B)) @@ -530,7 +532,7 @@ into icons, regardless of the window manager." merge-window-lines designated-minibuffer-frame done-A done-B done-C) - + ;; buf-A on its own (if (and (window-live-p wind-A) (null use-same-frame) ; implies wind-A is suitable @@ -541,7 +543,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-A (selected-window)) (setq done-A t))) - + ;; buf-B on its own (if (and (window-live-p wind-B) (null use-same-frame) ; implies wind-B is suitable @@ -552,7 +554,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-B (selected-window)) (setq done-B t))) - + ;; buf-C on its own (if (and (window-live-p wind-C) (ediff-window-ok-for-display wind-C) @@ -563,7 +565,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-C (selected-window)) (setq done-C t))) - + (if (and use-same-frame-for-AB ; implies wind A and B are suitable (window-live-p wind-A)) (progn @@ -571,16 +573,16 @@ into icons, regardless of the window manager." (select-window wind-A) (delete-other-windows) (setq wind-A (selected-window)) - + (funcall split-window-function) (if (eq (selected-window) wind-A) (other-window 1)) (switch-to-buffer buf-B) (setq wind-B (selected-window)) - + (setq done-A t done-B t))) - + (if use-same-frame (let ((window-min-height 1)) (if (and (eq frame-A frame-B) @@ -594,27 +596,27 @@ into icons, regardless of the window manager." (max 2 (round (* (window-height) merge-window-share)))) (switch-to-buffer buf-A) (setq wind-A (selected-window)) - + (split-window-vertically (max 2 (- (window-height) merge-window-lines))) (if (eq (selected-window) wind-A) (other-window 1)) (setq wind-C (selected-window)) (switch-to-buffer buf-C) - + (select-window wind-A) - + (funcall split-window-function) (if (eq (selected-window) wind-A) (other-window 1)) (switch-to-buffer buf-B) (setq wind-B (selected-window)) - + (setq done-A t done-B t done-C t) )) - + (or done-A ; Buf A to be set in its own frame, ;;; or it was set before because use-same-frame = 1 (progn @@ -635,7 +637,7 @@ into icons, regardless of the window manager." (switch-to-buffer buf-B) (setq wind-B (selected-window)) )) - + (or done-C ; Buf C to be set in its own frame, ;;; or it was set before because use-same-frame = 1 (progn @@ -646,7 +648,7 @@ into icons, regardless of the window manager." (switch-to-buffer buf-C) (setq wind-C (selected-window)) )) - + (ediff-with-current-buffer control-buf (setq ediff-window-A wind-A ediff-window-B wind-B @@ -654,11 +656,11 @@ into icons, regardless of the window manager." (setq frame-A (window-frame ediff-window-A) designated-minibuffer-frame (window-frame (minibuffer-window frame-A)))) - + (ediff-setup-control-frame control-buf designated-minibuffer-frame) )) - + ;; Window setup for all comparison jobs, including 3way comparisons (defun ediff-setup-windows-multiframe-compare (buf-A buf-B buf-C control-buf) ;;; Algorithm: @@ -672,11 +674,11 @@ into icons, regardless of the window manager." ;;; and the selected frame isn't splittable, we create a new frame and ;;; put both buffers there, event if one of this buffers is visible in ;;; another frame. - + ;; Skip dedicated or iconified frames. ;; Unsplittable frames are taken care of later. (ediff-skip-unsuitable-frames 'ok-unsplittable) - + (let* ((window-min-height 1) (wind-A (ediff-get-visible-buffer-window buf-A)) (wind-B (ediff-get-visible-buffer-window buf-B)) @@ -715,7 +717,7 @@ into icons, regardless of the window manager." wind-A-start wind-B-start designated-minibuffer-frame done-A done-B done-C) - + (ediff-with-current-buffer control-buf (setq wind-A-start (ediff-overlay-start (ediff-get-value-according-to-buffer-type @@ -723,7 +725,7 @@ into icons, regardless of the window manager." wind-B-start (ediff-overlay-start (ediff-get-value-according-to-buffer-type 'B ediff-narrow-bounds)))) - + (if (and (window-live-p wind-A) (null use-same-frame)) ; buf-A on its own (progn ;; buffer buf-A is seen in live wind-A @@ -731,7 +733,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-A (selected-window)) (setq done-A t))) - + (if (and (window-live-p wind-B) (null use-same-frame)) ; buf B on its own (progn ;; buffer buf-B is seen in live wind-B @@ -739,7 +741,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-B (selected-window)) (setq done-B t))) - + (if (and (window-live-p wind-C) (null use-same-frame)) ; buf C on its own (progn ;; buffer buf-C is seen in live wind-C @@ -747,7 +749,7 @@ into icons, regardless of the window manager." (delete-other-windows) (setq wind-C (selected-window)) (setq done-C t))) - + (if use-same-frame (let (wind-width-or-height) ; this affects 3way setups only (if (and (eq frame-A frame-B) (frame-live-p frame-A)) @@ -757,7 +759,7 @@ into icons, regardless of the window manager." (delete-other-windows) (switch-to-buffer buf-A) (setq wind-A (selected-window)) - + (if three-way-comparison (setq wind-width-or-height (/ @@ -765,13 +767,13 @@ into icons, regardless of the window manager." (window-height wind-A) (window-width wind-A)) 3))) - + (funcall split-window-function wind-width-or-height) (if (eq (selected-window) wind-A) (other-window 1)) (switch-to-buffer buf-B) (setq wind-B (selected-window)) - + (if three-way-comparison (progn (funcall split-window-function) ; equally @@ -783,7 +785,7 @@ into icons, regardless of the window manager." done-B t done-C t) )) - + (or done-A ; Buf A to be set in its own frame ;;; or it was set before because use-same-frame = 1 (progn @@ -804,7 +806,7 @@ into icons, regardless of the window manager." (switch-to-buffer buf-B) (setq wind-B (selected-window)) )) - + (if three-way-comparison (or done-C ; Buf C to be set in its own frame ;;; or it was set before because use-same-frame = 1 @@ -816,7 +818,7 @@ into icons, regardless of the window manager." (switch-to-buffer buf-C) (setq wind-C (selected-window)) ))) - + (ediff-with-current-buffer control-buf (setq ediff-window-A wind-A ediff-window-B wind-B @@ -825,14 +827,14 @@ into icons, regardless of the window manager." (setq frame-A (window-frame ediff-window-A) designated-minibuffer-frame (window-frame (minibuffer-window frame-A)))) - + ;; It is unlikely that we'll implement a version of ediff-windows that ;; would compare 3 windows at once. So, we don't use buffer C here. (if ediff-windows-job (progn (set-window-start wind-A wind-A-start) (set-window-start wind-B wind-B-start))) - + (ediff-setup-control-frame control-buf designated-minibuffer-frame) )) @@ -867,7 +869,7 @@ into icons, regardless of the window manager." (defun ediff-frame-has-dedicated-windows (frame) (let (ans) - (walk-windows + (walk-windows (lambda (wind) (if (window-dedicated-p wind) (setq ans t))) 'ignore-minibuffer @@ -895,7 +897,7 @@ into icons, regardless of the window manager." ctl-frame old-ctl-frame lines ;; user-grabbed-mouse fheight fwidth adjusted-parameters) - + (ediff-with-current-buffer ctl-buffer (ediff-cond-compile-for-xemacs-or-emacs (set-buffer-menubar nil) ; xemacs @@ -903,7 +905,7 @@ into icons, regardless of the window manager." ) ;;(setq user-grabbed-mouse (ediff-user-grabbed-mouse)) (run-hooks 'ediff-before-setup-control-frame-hook)) - + (setq old-ctl-frame (ediff-with-current-buffer ctl-buffer ediff-control-frame)) (ediff-with-current-buffer ctl-buffer (setq ctl-frame (if (frame-live-p old-ctl-frame) @@ -919,28 +921,28 @@ into icons, regardless of the window manager." ) (error)) ) - + (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame)) (select-frame ctl-frame) (if (window-dedicated-p (selected-window)) () (delete-other-windows) (switch-to-buffer ctl-buffer)) - + ;; must be before ediff-setup-control-buffer ;; just a precaution--we should be in ctl-buffer already (ediff-with-current-buffer ctl-buffer (make-local-variable 'frame-title-format) (make-local-variable 'frame-icon-title-format) ; XEmacs (make-local-variable 'icon-title-format)) ; Emacs - + (ediff-setup-control-buffer ctl-buffer) (setq dont-iconify-ctl-frame (not (string= ediff-help-message ediff-brief-help-message))) (setq deiconify-ctl-frame (and (eq this-command 'ediff-toggle-help) dont-iconify-ctl-frame)) - + ;; 1 more line for the modeline (setq lines (1+ (count-lines (point-min) (point-max))) fheight lines @@ -962,7 +964,7 @@ into icons, regardless of the window manager." '(auto-raise . nil) '(auto-raise . t)) adjusted-parameters)) - + ;; In XEmacs, buffer menubar needs to be killed before frame parameters ;; are changed. (if (ediff-has-toolbar-support-p) @@ -979,7 +981,7 @@ into icons, regardless of the window manager." nil ; emacs ) ) - + ;; Under OS/2 (emx) we have to call modify frame parameters twice, in order ;; to make sure that at least once we do it for non-iconified frame. If ;; appears that in the OS/2 port of Emacs, one can't modify frame @@ -987,28 +989,28 @@ into icons, regardless of the window manager." ;; windows-nt. (if (memq system-type '(emx windows-nt windows-95)) (modify-frame-parameters ctl-frame adjusted-parameters)) - + ;; make or zap toolbar (if not requested) (ediff-make-bottom-toolbar ctl-frame) - + (goto-char (point-min)) (modify-frame-parameters ctl-frame adjusted-parameters) (make-frame-visible ctl-frame) - + ;; This works around a bug in 19.25 and earlier. There, if frame gets ;; iconified, the current buffer changes to that of the frame that ;; becomes exposed as a result of this iconification. ;; So, we make sure the current buffer doesn't change. (select-frame ctl-frame) (ediff-refresh-control-frame) - + (cond ((and ediff-prefer-iconified-control-frame (not ctl-frame-iconified-p) (not dont-iconify-ctl-frame)) (iconify-frame ctl-frame)) ((or deiconify-ctl-frame (not ctl-frame-iconified-p)) (raise-frame ctl-frame))) - + (set-window-dedicated-p (selected-window) t) ;; Now move the frame. We must do it separately due to an obscure bug in @@ -1016,7 +1018,7 @@ into icons, regardless of the window manager." (modify-frame-parameters ctl-frame (funcall ediff-control-frame-position-function ctl-buffer fwidth fheight)) - + ;; synchronize so the cursor will move to control frame ;; per RMS suggestion (if (ediff-window-display-p) @@ -1031,7 +1033,7 @@ into icons, regardless of the window manager." (ediff-reset-mouse ctl-frame (or (eq this-command 'ediff-quit) (not (eq ediff-grab-mouse t))))) - + (if ediff-xemacs-p (ediff-with-current-buffer ctl-buffer (ediff-cond-compile-for-xemacs-or-emacs @@ -1041,12 +1043,12 @@ into icons, regardless of the window manager." (add-hook 'select-frame-hook 'ediff-xemacs-select-frame-hook nil 'local) )) - + (ediff-with-current-buffer ctl-buffer (run-hooks 'ediff-after-setup-control-frame-hook)) )) - + (defun ediff-destroy-control-frame (ctl-buffer) (ediff-with-current-buffer ctl-buffer (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame)) @@ -1061,7 +1063,7 @@ into icons, regardless of the window manager." (ediff-skip-unsuitable-frames) ;;(ediff-reset-mouse nil) ) - + ;; finds a good place to clip control frame (defun ediff-make-frame-position (ctl-buffer ctl-frame-width ctl-frame-height) @@ -1074,7 +1076,7 @@ into icons, regardless of the window manager." (ctl-frame ediff-control-frame) horizontal-adjustment upward-adjustment ctl-frame-top ctl-frame-left) - + ;; Multiple control frames are clipped based on the value of ;; ediff-control-buffer-number. This is done in order not to obscure ;; other active control panels. @@ -1106,16 +1108,16 @@ into icons, regardless of the window manager." ;; keep ctl frame within the visible bounds (setq ctl-frame-top (max ctl-frame-top 1) ctl-frame-left (max ctl-frame-left 1)) - + (list (cons 'top ctl-frame-top) (cons 'left ctl-frame-left)) ))) - + (defun ediff-xemacs-select-frame-hook () (if (and (equal (selected-frame) ediff-control-frame) (not ediff-use-long-help-message)) (raise-frame ediff-control-frame))) - + (defun ediff-make-wide-display () "Construct an alist of parameters for the wide display. Saves the old frame parameters in `ediff-wide-display-orig-parameters'. @@ -1134,15 +1136,15 @@ It assumes that it is called from within the control buffer." ediff-wide-display-frame frame-A) (modify-frame-parameters frame-A (list (cons 'left cw) (cons 'width wd))))) - - + + ;; Revise the mode line to display which difference we have selected ;; Also resets modelines of buffers A/B, since they may be clobbered by ;; anothe invocations of Ediff. (defun ediff-refresh-mode-lines () (let (buf-A-state-diff buf-B-state-diff buf-C-state-diff buf-C-state-merge) - + (if (ediff-valid-difference-p) (setq buf-C-state-diff (ediff-get-state-of-diff ediff-current-difference 'C) @@ -1171,7 +1173,7 @@ It assumes that it is called from within the control buffer." (setq buf-A-state-diff "" buf-B-state-diff "" buf-C-state-diff "")) - + ;; control buffer format (setq mode-line-format (if (ediff-narrow-control-frame-p) @@ -1184,10 +1186,10 @@ It assumes that it is called from within the control buffer." (ediff-make-wide-control-buffer-id))) ;; Force mode-line redisplay (force-mode-line-update) - + (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame)) (ediff-refresh-control-frame)) - + (ediff-with-current-buffer ediff-buffer-A (setq ediff-diff-status buf-A-state-diff) (ediff-strip-mode-line-format) @@ -1224,8 +1226,8 @@ It assumes that it is called from within the control buffer." (t "")) mode-line-format)))) )) - - + + (defun ediff-refresh-control-frame () (if ediff-emacs-p ;; set frame/icon titles for Emacs @@ -1239,8 +1241,8 @@ It assumes that it is called from within the control buffer." frame-icon-title-format (ediff-make-narrow-control-buffer-id)) ;; force an update of the frame title (modify-frame-parameters ediff-control-frame '(())))) - - + + (defun ediff-make-narrow-control-buffer-id (&optional skip-name) (concat (if skip-name @@ -1259,7 +1261,7 @@ It assumes that it is called from within the control buffer." (concat (cdr (assoc 'name ediff-control-frame-parameters)) ediff-control-buffer-suffix)) - + (defun ediff-make-wide-control-buffer-id () (cond ((< ediff-current-difference 0) (list (format "%%b At start of %d diffs" @@ -1280,10 +1282,10 @@ It assumes that it is called from within the control buffer." (if ediff-xemacs-p (get-buffer-window buff t) (get-buffer-window buff 'visible)))) - + ;;; Functions to decide when to redraw windows - + (defun ediff-keep-window-config (control-buf) (and (eq control-buf (current-buffer)) (/= (buffer-size) 0) @@ -1292,7 +1294,7 @@ It assumes that it is called from within the control buffer." (A-wind ediff-window-A) (B-wind ediff-window-B) (C-wind ediff-window-C)) - + (and (ediff-window-visible-p A-wind) (ediff-window-visible-p B-wind) @@ -1317,4 +1319,5 @@ It assumes that it is called from within the control buffer." ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body)) ;;; End: +;;; arch-tag: 73d9a5d7-eed7-4d9c-8b4b-21d5d78eb597 ;;; ediff-wind.el ends here