Mercurial > emacs
changeset 12084:4a13777b153b
(ediff-make-control-frame): optimized for display.
Commented out (redraw-display), to improve speed.
Got rid of toolbars in control frame in xemacs
Changed window-min-height from 1 to 2
(ediff-diff-at-point,ediff-toggle-multiframe): bug fixes.
(ediff-destroy-control-frame,ediff-window-display-p): new functions.
Converted xemacs *screen* nomenclature to *frame*.
Incorporated overlay strings. Ediff no longer runs under emacs
19.28 and earlier and XEmacs 19.11 and earlier.
Changed window-system to ediff-window-display.
(ediff-toggle-multiframe): fixed.
(ediff-destroy-control-frame): new function.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Mon, 05 Jun 1995 23:42:53 +0000 |
parents | 2bfc61a5fbe7 |
children | 589a32fa67a9 |
files | lisp/ediff-wind.el |
diffstat | 1 files changed, 158 insertions(+), 145 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ediff-wind.el Mon Jun 05 23:41:43 1995 +0000 +++ b/lisp/ediff-wind.el Mon Jun 05 23:42:53 1995 +0000 @@ -23,9 +23,9 @@ (require 'ediff-init) -(defvar ediff-window-setup-function (if (not window-system) - 'ediff-setup-windows-plain - 'ediff-setup-windows-multiframe) +(defvar ediff-window-setup-function (if (ediff-window-display-p) + 'ediff-setup-windows-multiframe + 'ediff-setup-windows-plain) "*Function called to set up windows. Ediff provides a choice of two functions: ediff-setup-windows-plain, for doing everything in one frame, and ediff-setup-windows-multiframe, @@ -82,25 +82,25 @@ In this case, Ediff will use those frames to display these buffers.") (defconst ediff-control-frame-parameters - (if window-system + (if (ediff-window-display-p) (list '(name . "Ediff") ;;'(unsplittable . t) '(minibuffer . nil) - '(vertical-scroll-bars . nil) ; FSF only + '(vertical-scroll-bars . nil) ; Emacs only '(scrollbar-width . 0) ; XEmacs only - '(menu-bar-lines . 0) ; FSF only + '(menu-bar-lines . 0) ; Emacs only ;; don't lower and auto-raise '(auto-lower . nil) '(auto-raise . t) ;; this blocks queries from window manager as to where to put ;; ediff's control frame. we put the frame outside the display, ;; so the initial frame won't jump all over the screen - (cons 'top (if (fboundp 'x-display-pixel-height) - (1+ (x-display-pixel-height)) + (cons 'top (if (fboundp 'ediff-display-pixel-height) + (1+ (ediff-display-pixel-height)) 3000)) - (cons 'left (if (fboundp 'x-display-pixel-width) - (1+ (x-display-pixel-width)) + (cons 'left (if (fboundp 'ediff-display-pixel-width) + (1+ (ediff-display-pixel-width)) 3000)) )) "Frame parameters for displaying Ediff Control Panel. @@ -186,28 +186,28 @@ ;; Select the lowest window on the frame. (defun ediff-select-lowest-window () - (let* ((lowest-window (selected-window)) - (bottom-edge (car (cdr (cdr (cdr (window-edges)))))) - ;;(last-window (previous-window)) - (last-window (save-excursion - (other-window -1) (selected-window))) - (window-search t)) - (while window-search - (let* ((this-window (next-window)) - (next-bottom-edge (car (cdr (cdr (cdr - (window-edges this-window))))))) - (if (< bottom-edge next-bottom-edge) - (progn - (setq bottom-edge next-bottom-edge) - (setq lowest-window this-window))) + (if ediff-xemacs-p + (select-window (frame-lowest-window)) + (let* ((lowest-window (selected-window)) + (bottom-edge (car (cdr (cdr (cdr (window-edges)))))) + (last-window (save-excursion + (other-window -1) (selected-window))) + (window-search t)) + (while window-search + (let* ((this-window (next-window)) + (next-bottom-edge + (car (cdr (cdr (cdr (window-edges this-window))))))) + (if (< bottom-edge next-bottom-edge) + (progn + (setq bottom-edge next-bottom-edge) + (setq lowest-window this-window))) + + (select-window this-window) + (if (eq last-window this-window) + (progn + (select-window lowest-window) + (setq window-search nil)))))))) - (select-window this-window) - (if (eq last-window this-window) - (progn - (select-window lowest-window) - (setq window-search nil))))))) - - ;;; Common window setup routines @@ -222,8 +222,10 @@ (if (eq (selected-window) (minibuffer-window)) (other-window 1)) - ;; when support for buf C is added, the actual window setup function will - ;; depend on ediff-job-name + ;; 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-eval-in-buffer control-buffer ediff-window-setup-function) @@ -243,15 +245,9 @@ 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-eval-in-buffer control-buffer - (if (and window-system (ediff-frame-live-p ediff-control-frame)) - (progn - (redraw-display) - (ediff-delete-frame ediff-control-frame) - (setq ediff-control-frame nil)))) - (ediff-skip-unsuitable-frames) - (let ((window-min-height 1) + ;; skip dedicated and unsplittable frames + (ediff-destroy-control-frame control-buffer) + (let ((window-min-height 2) split-window-function merge-window-share merge-window-lines wind-A wind-B wind-C) @@ -302,17 +298,11 @@ ;; 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 - (ediff-eval-in-buffer control-buffer - (if (and window-system (ediff-frame-live-p ediff-control-frame)) - (progn - (redraw-display) - (ediff-delete-frame ediff-control-frame) - (setq ediff-control-frame nil)))) - (ediff-skip-unsuitable-frames) - (let ((window-min-height 1) + (ediff-destroy-control-frame control-buffer) + (let ((window-min-height 2) split-window-function wind-width-or-height three-way-comparison - job wind-A-start wind-B-start wind-A wind-B wind-C) + wind-A-start wind-B-start wind-A wind-B wind-C) (ediff-eval-in-buffer control-buffer (setq wind-A-start (ediff-overlay-start (ediff-get-value-according-to-buffer-type @@ -320,7 +310,6 @@ wind-B-start (ediff-overlay-start (ediff-get-value-according-to-buffer-type 'B ediff-narrow-bounds)) - job ediff-job-name ;; this lets us have local versions of ediff-split-window-function split-window-function ediff-split-window-function three-way-comparison ediff-3way-comparison-job)) @@ -366,7 +355,7 @@ ;; It is unlikely that we will want to implement 3way window comparison. ;; So, only buffers A and B are used here. - (if (eq job 'ediff-windows) + (if ediff-windows-job (progn (set-window-start wind-A wind-A-start) (set-window-start wind-B wind-B-start))) @@ -394,17 +383,17 @@ ;;; If buffers A, B, C are is separate frames, use them to display these ;;; buffers. - ;; Skip dedicated or iconified frames. Unsplittable frames are taken - ;; care of later. + ;; Skip dedicated or iconified frames. + ;; Unsplittable frames are taken care of later. (ediff-skip-unsuitable-frames 'ok-unsplittable) - (let* ((window-min-height 1) + (let* ((window-min-height 2) (wind-A (ediff-get-visible-buffer-window buf-A)) (wind-B (ediff-get-visible-buffer-window buf-B)) (wind-C (ediff-get-visible-buffer-window buf-C)) - (frame-A (if wind-A (ediff-window-frame wind-A))) - (frame-B (if wind-B (ediff-window-frame wind-B))) - (frame-C (if wind-C (ediff-window-frame wind-C))) + (frame-A (if wind-A (window-frame wind-A))) + (frame-B (if wind-B (window-frame wind-B))) + (frame-C (if wind-C (window-frame wind-C))) ;; on wide display, do things in one frame (force-one-frame (ediff-eval-in-buffer control-buf ediff-wide-display-p)) @@ -412,12 +401,14 @@ (split-window-function (ediff-eval-in-buffer control-buf ediff-split-window-function)) (orig-wind (selected-window)) - (orig-frame (ediff-selected-frame)) + (orig-frame (selected-frame)) (use-same-frame (or force-one-frame (eq frame-A (or frame-C orig-frame)) (eq frame-B (or frame-C orig-frame)) - (not (ediff-frame-live-p frame-A)) - (not (ediff-frame-live-p frame-B)) + (not (frame-live-p frame-A)) + (not (frame-live-p frame-B)) + (and (eq frame-A frame-B) + (not (frame-live-p frame-C))) )) (use-same-frame-for-AB (and (not use-same-frame) (eq frame-A frame-B))) @@ -458,7 +449,7 @@ (if use-same-frame-for-AB (progn - (ediff-select-frame frame-A) + (select-frame frame-A) (switch-to-buffer buf-A) (delete-other-windows) (setq wind-A (selected-window)) @@ -473,11 +464,11 @@ done-B t))) (if use-same-frame - (let ((curr-frame (ediff-selected-frame)) - (window-min-height 1)) + (let ((curr-frame (selected-frame)) + (window-min-height 2)) ;; avoid dedicated and non-splittable windows (ediff-skip-unsuitable-frames) - (or (eq curr-frame (ediff-selected-frame)) + (or (eq curr-frame (selected-frame)) (setq wind-A nil wind-B nil wind-C nil @@ -545,12 +536,11 @@ (setq ediff-window-A wind-A ediff-window-B wind-B ediff-window-C wind-C) - - (setq frame-A (ediff-window-frame ediff-window-A) - designated-minibuffer-frame (ediff-window-frame - (minibuffer-window frame-A)))) - - (ediff-setup-control-frame control-buf) + (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) )) @@ -572,15 +562,15 @@ ;; Unsplittable frames are taken care of later. (ediff-skip-unsuitable-frames 'ok-unsplittable) - (let* ((window-min-height 1) + (let* ((window-min-height 2) (wind-A (ediff-get-visible-buffer-window buf-A)) (wind-B (ediff-get-visible-buffer-window buf-B)) (wind-C (ediff-get-visible-buffer-window buf-C)) - (frame-A (if wind-A (ediff-window-frame wind-A))) - (frame-B (if wind-B (ediff-window-frame wind-B))) - (frame-C (if wind-C (ediff-window-frame wind-C))) + (frame-A (if wind-A (window-frame wind-A))) + (frame-B (if wind-B (window-frame wind-B))) + (frame-C (if wind-C (window-frame wind-C))) (ctl-frame-exists-p (ediff-eval-in-buffer control-buf - (ediff-frame-live-p ediff-control-frame))) + (frame-live-p ediff-control-frame))) ;; on wide display, do things in one frame (force-one-frame (ediff-eval-in-buffer control-buf ediff-wide-display-p)) @@ -595,16 +585,16 @@ (if three-way-comparison (or (eq frame-A frame-C) (eq frame-B frame-C) - (not (ediff-frame-live-p frame-A)) - (not (ediff-frame-live-p frame-B)) - (not (ediff-frame-live-p frame-C)))) - (and (not (ediff-frame-live-p frame-B)) + (not (frame-live-p frame-A)) + (not (frame-live-p frame-B)) + (not (frame-live-p frame-C)))) + (and (not (frame-live-p frame-B)) (or ctl-frame-exists-p - (eq frame-A (ediff-selected-frame)))) - (and (not (ediff-frame-live-p frame-A)) + (eq frame-A (selected-frame)))) + (and (not (frame-live-p frame-A)) (or ctl-frame-exists-p - (eq frame-B (ediff-selected-frame)))))) - wind-A-start wind-B-start job-name + (eq frame-B (selected-frame)))))) + wind-A-start wind-B-start designated-minibuffer-frame done-A done-B done-C) @@ -614,8 +604,7 @@ 'A ediff-narrow-bounds)) wind-B-start (ediff-overlay-start (ediff-get-value-according-to-buffer-type - 'B ediff-narrow-bounds)) - job-name ediff-job-name)) + 'B ediff-narrow-bounds)))) (if (and (window-live-p wind-A) (null use-same-frame)) ; buf-A on its own (progn @@ -642,12 +631,12 @@ (setq done-C t))) (if use-same-frame - (let ((curr-frame (ediff-selected-frame)) + (let ((curr-frame (selected-frame)) ;; this affects 3way setups only wind-width-or-height) ;; avoid dedicated and non-splittable windows (ediff-skip-unsuitable-frames) - (or (eq curr-frame (ediff-selected-frame)) + (or (eq curr-frame (selected-frame)) (setq wind-A nil wind-B nil wind-C nil @@ -720,33 +709,33 @@ (setq ediff-window-A wind-A ediff-window-B wind-B ediff-window-C wind-C) - - (setq frame-A (ediff-window-frame ediff-window-A) - designated-minibuffer-frame (ediff-window-frame - (minibuffer-window frame-A)))) + + (setq frame-A (window-frame ediff-window-A) + designated-minibuffer-frame + (window-frame (minibuffer-window frame-A)))) ;; It is unlikely that we'll implement ediff-windows that would compare ;; 3 windows at once. So, we don't use buffer C here. - (if (eq job-name 'ediff-windows) + (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) + (ediff-setup-control-frame control-buf designated-minibuffer-frame) )) ;; skip unsplittable and dedicated windows ;; create a new splittable frame if none is found (defun ediff-skip-unsuitable-frames (&optional ok-unsplittable) - (if window-system + (if (ediff-window-display-p) (let (last-window) (while (and (not (eq (selected-window) last-window)) (or (window-dedicated-p (selected-window)) - (ediff-frame-iconified-p (ediff-selected-frame)) + (ediff-frame-iconified-p (selected-frame)) (if ok-unsplittable nil - (ediff-frame-unsplittable-p (ediff-selected-frame))))) + (ediff-frame-unsplittable-p (selected-frame))))) ;; remember where started (or last-window (setq last-window (selected-window))) ;; try new window @@ -754,31 +743,38 @@ (if (eq (selected-window) last-window) ;; fed up, no appropriate frame (progn - (redraw-display) - (ediff-select-frame (ediff-make-frame '((unsplittable))))))))) + ;;(redraw-display) + (select-frame (ediff-make-frame '((unsplittable))))))))) ;; Prepare or refresh control frame -(defun ediff-setup-control-frame (ctl-buffer) - (let ((window-min-height 1) +(defun ediff-setup-control-frame (ctl-buffer designated-minibuffer-frame) + (let ((window-min-height 2) ctl-frame-iconified-p dont-iconify-ctl-frame deiconify-ctl-frame ctl-frame old-ctl-frame lines fheight fwidth adjusted-parameters) (ediff-eval-in-buffer ctl-buffer + (if ediff-xemacs-p (set-buffer-menubar nil)) (run-hooks 'ediff-before-setup-control-frame-hooks)) (setq old-ctl-frame (ediff-eval-in-buffer ctl-buffer ediff-control-frame)) + ;; Delete the old ctl frame and get a new ctl frame. + ;; The old ctl frame is deleted to let emacs reset default minibuffer + ;; frame or when the ctl frame needs to be moved. + ;; The old frame isn't reused, since ediff-setup-control-frame is called + ;; very rarely, so the overhead is minimal. (if (frame-live-p old-ctl-frame) (delete-frame old-ctl-frame)) - (redraw-display) - ;; Make the frame while ctl-buff is current, so that - ;; ediff-control-frame-parameters will have the right value. + ;;(redraw-display) + ;; new ctl frame should be created while ctl-buff is current, so that + ;; the local default-minibuffer-frame will be consulted and + ;; that ediff-control-frame-parameters will have the right value. (ediff-eval-in-buffer ctl-buffer (let ((default-minibuffer-frame designated-minibuffer-frame)) - (setq ctl-frame (ediff-make-frame ediff-control-frame-parameters) - ctl-buffer (setq ediff-control-frame ctl-frame)))) + (setq ctl-frame (make-frame ediff-control-frame-parameters) + ediff-control-frame ctl-frame))) (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame)) - (ediff-select-frame ctl-frame) + (select-frame ctl-frame) (if (window-dedicated-p (selected-window)) () (delete-other-windows) @@ -788,8 +784,8 @@ (if ediff-xemacs-p ;; just a precaution--we should be in ctl-buffer already (ediff-eval-in-buffer ctl-buffer - (make-local-variable 'screen-title-format) - (make-local-variable 'screen-icon-title-format))) + (make-local-variable 'frame-title-format) + (make-local-variable 'frame-icon-title-format))) (ediff-setup-control-buffer ctl-buffer) (setq dont-iconify-ctl-frame @@ -812,36 +808,41 @@ ctl-buffer fwidth fheight))) ;; In XEmacs, buffer menubar needs to be killed before frame parameters - ;; are changed XEmacs needs to redisplay, as it has trouble setting + ;; are changed. XEmacs needs to redisplay, as it has trouble setting ;; height correctly otherwise. - (if (and ediff-xemacs-p (ediff-frame-has-menubar)) - (progn (set-buffer-menubar nil)(sit-for 0))) + (if ediff-xemacs-p + (progn + (set-specifier top-toolbar-height (list ctl-frame 0)) + (set-specifier bottom-toolbar-height (list ctl-frame 0)) + (set-specifier left-toolbar-width (list ctl-frame 0)) + (set-specifier right-toolbar-width (list ctl-frame 0)) + (sit-for 0))) ;; 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 parameters of iconified frames. (if (eq system-type 'emx) - (ediff-modify-frame-parameters ctl-frame adjusted-parameters)) + (modify-frame-parameters ctl-frame adjusted-parameters)) (goto-char (point-min)) (cond ((and ediff-prefer-iconified-control-frame (not ctl-frame-iconified-p) (not dont-iconify-ctl-frame)) - (ediff-iconify-frame ctl-frame)) + (iconify-frame ctl-frame)) ((or deiconify-ctl-frame (not ctl-frame-iconified-p)) - (ediff-raise-frame ctl-frame))) + (raise-frame 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. - (ediff-select-frame ctl-frame) + (select-frame ctl-frame) (ediff-refresh-control-frame) - (ediff-modify-frame-parameters ctl-frame adjusted-parameters) + (modify-frame-parameters ctl-frame adjusted-parameters) (if ediff-xemacs-p (set-window-buffer-dedicated (selected-window) ctl-buffer) @@ -849,30 +850,41 @@ (or ediff-xemacs-p (sit-for 0 200)) ; emacs has trouble here, needs time (or (ediff-frame-iconified-p ctl-frame) - (set-mouse-position ctl-frame 1 0)) - (if (ediff-check-version '< 19 11 'xemacs) (sit-for 0)) + (ediff-reset-mouse ctl-frame)) (or ediff-xemacs-p (unfocus-frame)) (if ediff-xemacs-p (ediff-eval-in-buffer ctl-buffer - (make-local-variable 'select-screen-hook) - (add-hook 'select-screen-hook 'ediff-xemacs-select-screen-hook) + (make-local-variable 'select-frame-hook) + (add-hook 'select-frame-hook 'ediff-xemacs-select-frame-hook) )) (ediff-eval-in-buffer ctl-buffer (run-hooks 'ediff-after-setup-control-frame-hooks)) - - )) + )) + +(defun ediff-destroy-control-frame (ctl-buffer) + (ediff-eval-in-buffer ctl-buffer + (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame)) + (let ((ctl-frame ediff-control-frame)) + (if ediff-xemacs-p + (set-buffer-menubar default-menubar)) + ;;(redraw-display) + (setq ediff-control-frame nil) + (delete-frame ctl-frame) + ))) + (ediff-skip-unsuitable-frames) + (ediff-reset-mouse)) ;; finds a good place to clip control frame (defun ediff-make-frame-position (ctl-buffer ctl-frame-width ctl-frame-height) (ediff-eval-in-buffer ctl-buffer - (let* ((frame-A (ediff-window-frame ediff-window-A)) - (frame-A-parameters (ediff-frame-parameters frame-A)) + (let* ((frame-A (window-frame ediff-window-A)) + (frame-A-parameters (frame-parameters frame-A)) (frame-A-top (cdr (assoc 'top frame-A-parameters))) (frame-A-left (cdr (assoc 'left frame-A-parameters))) - (frame-A-width (ediff-frame-width frame-A)) + (frame-A-width (frame-width frame-A)) (ctl-frame ediff-control-frame) horizontal-adjustment upward-adjustment ctl-frame-top) @@ -900,9 +912,9 @@ ediff-narrow-control-frame-leftward-shift horizontal-adjustment)))))))))) -(defun ediff-xemacs-select-screen-hook () - (if (equal (ediff-selected-frame) ediff-control-frame) - (ediff-raise-frame ediff-control-frame))) +(defun ediff-xemacs-select-frame-hook () + (if (equal (selected-frame) ediff-control-frame) + (raise-frame ediff-control-frame))) (defun ediff-make-wide-display () "Construct an alist of parameters for the wide display. @@ -910,18 +922,17 @@ The frame to be resized is kept in `ediff-wide-display-frame'. This function modifies only the left margin and the width of the display. It assumes that it is called from within the control buffer." - (if (not (fboundp 'x-display-pixel-width)) - (error - "Can't determine display width. Please upgrade your version of Emacs")) - (let* ((frame-A (ediff-window-frame ediff-window-A)) - (frame-A-params (ediff-frame-parameters frame-A)) + (if (not (fboundp 'ediff-display-pixel-width)) + (error "Can't determine display width.")) + (let* ((frame-A (window-frame ediff-window-A)) + (frame-A-params (frame-parameters frame-A)) (cw (ediff-frame-char-width frame-A)) - (wd (- (/ (x-display-pixel-width) cw) 5))) + (wd (- (/ (ediff-display-pixel-width) cw) 5))) (setq ediff-wide-display-orig-parameters (list (cons 'left (max 0 (cdr (assoc 'left frame-A-params)))) (cons 'width (cdr (assoc 'width frame-A-params)))) ediff-wide-display-frame frame-A) - (ediff-modify-frame-parameters frame-A (list (cons 'left cw) + (modify-frame-parameters frame-A (list (cons 'left cw) (cons 'width wd))))) @@ -969,7 +980,7 @@ ;; Force mode-line redisplay (force-mode-line-update) - (if (and window-system (ediff-frame-live-p ediff-control-frame)) + (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame)) (ediff-refresh-control-frame)) (ediff-eval-in-buffer ediff-buffer-A @@ -997,11 +1008,11 @@ (defun ediff-refresh-control-frame () (if ediff-xemacs-p (progn - (setq screen-title-format (ediff-make-narrow-control-buffer-id) - screen-icon-title-format (ediff-make-narrow-control-buffer-id)) - ;; this forces update of the screen title - (ediff-modify-frame-parameters ediff-control-frame '(()))) - (ediff-modify-frame-parameters + (setq frame-title-format (ediff-make-narrow-control-buffer-id) + frame-icon-title-format (ediff-make-narrow-control-buffer-id)) + ;; this forces update of the frame title + (modify-frame-parameters ediff-control-frame '(()))) + (modify-frame-parameters ediff-control-frame (list (cons 'name (ediff-make-narrow-control-buffer-id)))) )) @@ -1067,9 +1078,11 @@ (or (not ediff-3way-job) (eq (window-buffer C-wind) ediff-buffer-C)) (string= ediff-window-config-saved - (format "%S%S%S%S%S" + (format "%S%S%S%S%S%S%S" ctl-wind A-wind B-wind C-wind - ediff-split-window-function))))))) + ediff-split-window-function + (ediff-multiframe-setup-p) + ediff-wide-display-p))))))) (provide 'ediff-wind)