diff lisp/ediff-wind.el @ 13132:7ed272c3c177

(ediff-make-frame-position): fixed bugs. (ediff-control-frame-parameters): fixed defaults.
author Michael Kifer <kifer@cs.stonybrook.edu>
date Fri, 06 Oct 1995 01:00:10 +0000
parents c4daa54a92fc
children 60556fda3e6f
line wrap: on
line diff
--- a/lisp/ediff-wind.el	Fri Oct 06 00:59:04 1995 +0000
+++ b/lisp/ediff-wind.el	Fri Oct 06 01:00:10 1995 +0000
@@ -87,16 +87,17 @@
        '(name . "Ediff")
        ;;'(unsplittable . t)
        '(minibuffer . nil)
+       '(user-position . t)	      ; Emacs only
        '(vertical-scroll-bars . nil)  ; Emacs only
        '(scrollbar-width . 0)         ; XEmacs only
        '(menu-bar-lines . 0)          ; Emacs only
+       '(visibility . nil)	      ; doesn't work for XEmacs yet
        ;; 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
-       '(user-position . t)
        (cons 'top  (if (fboundp 'ediff-display-pixel-height)
 		       (1+ (ediff-display-pixel-height))
 		     3000))
@@ -107,13 +108,27 @@
   "Frame parameters for displaying Ediff Control Panel.
 Do not specify width and height here. These are computed automatically.")
 
+;; position of the mouse; used to decide whether to warp the mouse into ctl
+;; frame
+(ediff-defvar-local ediff-mouse-pixel-position nil "")
+
+;; not used for now
+(defvar ediff-mouse-pixel-threshhold 30
+  "If the user moves mouse more than this many pixels, Ediff won't warp mouse into control window.")
+
+(defvar ediff-grab-mouse t
+  "*If t, Ediff will always grab the mouse and put it in the control frame.
+If 'maybe, Ediff will do it sometimes, but not after operations that require
+relatively long time. If nil, the mouse will be entirely user's
+responsibility.")
+
 (defvar ediff-control-frame-position-function 'ediff-make-frame-position
   "Function to call to determine the desired location for the control panel.
 Expects three parameters: the control buffer, the desired width and height
 of the control frame. It returns an association list
 of the form \(\(top . <position>\) \(left . <position>\)\)")
 
-(defvar ediff-control-frame-upward-shift (if ediff-xemacs-p 36 4)
+(defvar ediff-control-frame-upward-shift (if ediff-xemacs-p 42 14)
   "*The upward shift of control frame from the top of buffer A's frame.
 Measured in pixels.
 This is used by the default control frame positioning function,
@@ -219,7 +234,7 @@
 (defun ediff-setup-windows (buffer-A buffer-B buffer-C control-buffer)
   ;; Make sure we are not in the minibuffer window when we try to delete
   ;; all other windows.
-  (run-hooks 'ediff-before-setup-windows-hooks)
+  (run-hooks 'ediff-before-setup-windows-hook)
   (if (eq (selected-window) (minibuffer-window))
       (other-window 1))
       
@@ -231,7 +246,7 @@
       (funcall 
        (ediff-eval-in-buffer control-buffer ediff-window-setup-function)
        buffer-A buffer-B buffer-C control-buffer))
-  (run-hooks 'ediff-after-setup-windows-hooks))
+  (run-hooks 'ediff-after-setup-windows-hook))
 
 ;; Just set up 3 windows.
 ;; Usually used without windowing systems
@@ -268,9 +283,10 @@
     (switch-to-buffer buf-A)
     (setq wind-A (selected-window))
     
-    ;; XEmacs seems to have a lot of trouble with display
-    ;; It won't set things right unless we tell it to sit still
-    (if ediff-xemacs-p (sit-for 0))
+    ;; 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) 
@@ -330,9 +346,10 @@
 		   (window-width wind-A))
 		 3)))
     
-    ;; XEmacs seems to have a lot of trouble with display
-    ;; It won't set things right unless we tell it to sit still
-    (if ediff-xemacs-p (sit-for 0))
+    ;; 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)
 		  
@@ -486,9 +503,9 @@
 	  (switch-to-buffer buf-A)
 	  (setq wind-A (selected-window))
 	  
-	  ;; XEmacs seems to have a lot of trouble with display
-	  ;; It won't set things right unless we tell it to catch breath
-	  (if ediff-xemacs-p (sit-for 0))
+	  ;; XEmacs used to have a lot of trouble with display
+	  ;; It did't set things right unless we told it to catch breath
+	  ;;(if ediff-xemacs-p (sit-for 0))
 	  
 	  (split-window-vertically
 	   (max 2 (- (window-height) merge-window-lines)))
@@ -652,9 +669,9 @@
 	  (switch-to-buffer buf-A)
 	  (setq wind-A (selected-window))
 	  
-	  ;; XEmacs seems to have a lot of trouble with display
-	  ;; It won't set things right unless we tell it to catch breath
-	  (if ediff-xemacs-p (sit-for 0))
+	  ;; XEmacs used to have a lot of trouble with display
+	  ;; It didn't set things right unless we told it to catch breath
+	  ;;(if ediff-xemacs-p (sit-for 0))
 	  
 	  (if three-way-comparison
 	      (setq wind-width-or-height
@@ -751,12 +768,13 @@
 (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 
+	ctl-frame old-ctl-frame lines user-grabbed-mouse
 	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 user-grabbed-mouse (ediff-user-grabbed-mouse))
+      (run-hooks 'ediff-before-setup-control-frame-hook))
   
     (setq old-ctl-frame (ediff-eval-in-buffer ctl-buffer ediff-control-frame))
     ;; Delete the old ctl frame and get a new ctl frame.
@@ -782,11 +800,11 @@
       (switch-to-buffer ctl-buffer))
       
     ;; must be before ediff-setup-control-buffer
-    (if ediff-xemacs-p
-	;; just a precaution--we should be in ctl-buffer already
-	(ediff-eval-in-buffer ctl-buffer
-	  (make-local-variable 'frame-title-format)
-	  (make-local-variable 'frame-icon-title-format)))
+    ;; just a precaution--we should be in ctl-buffer already
+    (ediff-eval-in-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
@@ -802,22 +820,28 @@
 	  fheight lines
 	  fwidth (+ (ediff-help-message-line-length) 2)
 	  adjusted-parameters (append (list
+				       '(visibility . t)
 				       (cons 'width fwidth)
 				       (cons 'height fheight))
 				      (funcall
 				       ediff-control-frame-position-function
 				       ctl-buffer fwidth fheight)))
+    (if ediff-prefer-long-help-message
+	(setq adjusted-parameters
+	      (cons '(auto-raise . nil) adjusted-parameters)))
     
     ;; In XEmacs, buffer menubar needs to be killed before frame parameters
-    ;; are changed. XEmacs needs to redisplay, as it has trouble setting
-    ;; height correctly otherwise.
+    ;; are changed. 
     (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)))
+	  ;; XEmacs needed a redisplay, as it had trouble setting
+	  ;; height correctly otherwise.
+	  ;;(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
@@ -828,13 +852,7 @@
       
     (goto-char (point-min))
     
-    (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)))
+    (modify-frame-parameters ctl-frame adjusted-parameters)
     
     ;; 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
@@ -843,16 +861,27 @@
     (select-frame ctl-frame)
     (ediff-refresh-control-frame)
     
-    (modify-frame-parameters ctl-frame adjusted-parameters)
+    (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)))
     
     (if ediff-xemacs-p
 	(set-window-buffer-dedicated (selected-window) ctl-buffer)
       (set-window-dedicated-p (selected-window) t))
       
-    (or ediff-xemacs-p (sit-for 0 200)) ; emacs has trouble here, needs time
+    ;; resynch so the cursor will move to control frame
+    ;; per RMS suggestion
+    (let ((count 7))
+      (sit-for .1)
+      (while (and (not (frame-visible-p ctl-frame)) (> count 0))
+	(setq count (1- count))
+	(sit-for .3)))
+
     (or (ediff-frame-iconified-p ctl-frame)
-	(ediff-reset-mouse ctl-frame))
-    (or ediff-xemacs-p (unfocus-frame))
+	;; don't warp the mouse, unless ediff-grab-mouse = t
+	(ediff-reset-mouse ctl-frame (not (eq ediff-grab-mouse t))))
 	
     (if ediff-xemacs-p
 	(ediff-eval-in-buffer ctl-buffer
@@ -861,7 +890,7 @@
 	  ))
 	
     (ediff-eval-in-buffer ctl-buffer
-      (run-hooks 'ediff-after-setup-control-frame-hooks))
+      (run-hooks 'ediff-after-setup-control-frame-hook))
     ))
     
 (defun ediff-destroy-control-frame (ctl-buffer)
@@ -870,12 +899,12 @@
 	(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))
+  ;;(ediff-reset-mouse nil)
+  )
     
 
 ;; finds a good place to clip control frame
@@ -883,12 +912,12 @@
   (ediff-eval-in-buffer ctl-buffer
     (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-top (eval (cdr (assoc 'top frame-A-parameters))))
+	   (frame-A-left (eval (cdr (assoc 'left frame-A-parameters))))
 	   (frame-A-width (frame-width frame-A))
 	   (ctl-frame ediff-control-frame)
 	   horizontal-adjustment upward-adjustment
-	   ctl-frame-top) 
+	   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
@@ -896,25 +925,39 @@
       (setq horizontal-adjustment (* 2 ediff-control-buffer-number)
 	    upward-adjustment (* -14 ediff-control-buffer-number))
 
-      (setq ctl-frame-top (- frame-A-top
-			     upward-adjustment
-			     ediff-control-frame-upward-shift))
-      (list
-       (cons 'top (if (> ctl-frame-top 0) ctl-frame-top 1))
-       (cons 'left (+ frame-A-left
-		      (if ediff-prefer-long-help-message
-			  (* (ediff-frame-char-width ctl-frame)
-			     (+ ediff-wide-control-frame-rightward-shift
-				horizontal-adjustment))
-			(- (* frame-A-width
-			      (ediff-frame-char-width frame-A))
-			   (* (ediff-frame-char-width ctl-frame)
-			      (+ ctl-frame-width
-				 ediff-narrow-control-frame-leftward-shift
-				 horizontal-adjustment))))))))))
+      (setq ctl-frame-top
+	    (- frame-A-top upward-adjustment ediff-control-frame-upward-shift)
+	    ctl-frame-left
+	    (+ frame-A-left
+	       (if ediff-prefer-long-help-message
+		   (* (ediff-frame-char-width ctl-frame)
+		      (+ ediff-wide-control-frame-rightward-shift
+			 horizontal-adjustment))
+		 (- (* frame-A-width (ediff-frame-char-width frame-A))
+		    (* (ediff-frame-char-width ctl-frame)
+		       (+ ctl-frame-width
+			  ediff-narrow-control-frame-leftward-shift
+			  horizontal-adjustment))))))
+      ;; keep ctl frame within the visible bounds
+      (setq ctl-frame-top (max ctl-frame-top 1)
+	    ctl-frame-left (max ctl-frame-left 1))
+      (setq ctl-frame-top
+	    (min ctl-frame-top
+		 (- (ediff-display-pixel-height)
+		    (* 2 ctl-frame-height
+		       (ediff-frame-char-height ctl-frame))))
+	    ctl-frame-left
+	    (min ctl-frame-left
+		 (- (ediff-display-pixel-width)
+		    (* ctl-frame-width (ediff-frame-char-width ctl-frame)))))
+      
+      (list (cons 'top ctl-frame-top)
+	    (cons 'left ctl-frame-left))
+      )))
 			       
 (defun ediff-xemacs-select-frame-hook ()
-  (if (equal (selected-frame) ediff-control-frame)
+  (if (and (equal (selected-frame) ediff-control-frame)
+	   (not ediff-prefer-long-help-message))
       (raise-frame ediff-control-frame)))
 	
 (defun ediff-make-wide-display ()
@@ -930,7 +973,7 @@
 	 (cw (ediff-frame-char-width frame-A))
 	 (wd (- (/ (ediff-display-pixel-width) cw) 5)))
     (setq ediff-wide-display-orig-parameters 
-	  (list (cons 'left (max 0 (cdr (assoc 'left frame-A-params))))
+	  (list (cons 'left (max 0 (eval (cdr (assoc 'left frame-A-params)))))
 		(cons 'width (cdr (assoc 'width frame-A-params))))
 	  ediff-wide-display-frame frame-A)
     (modify-frame-parameters frame-A (list (cons 'left cw)
@@ -958,11 +1001,16 @@
 			    "")
 	 buf-C-state-diff (if (and (ediff-buffer-live-p ediff-buffer-C)
 				   (or buf-C-state-diff buf-C-state-merge))
-			      (format "[%s%s] "
+			      (format "[%s%s%s] "
 				      (or buf-C-state-diff "")
 				      (if buf-C-state-merge
 					  (concat " " buf-C-state-merge)
-					""))
+					"")
+				      (if (ediff-get-state-of-ancestor 
+					   ediff-current-difference)
+					  " AncestorEmpty"
+					"")
+				      )
 			    ""))
       (setq buf-A-state-diff ""
 	    buf-B-state-diff ""
@@ -1003,20 +1051,37 @@
 	  (setq mode-line-format
 		(list " C: " 'ediff-diff-status mode-line-format))
 	  (force-mode-line-update)))
+    (if (ediff-buffer-live-p ediff-ancestor-buffer)
+	(ediff-eval-in-buffer ediff-ancestor-buffer
+	  (ediff-strip-mode-line-format)
+	  ;; we keep the second dummy string in the mode line format of the
+	  ;; ancestor, since for other buffers Ediff prepends 2 strings and
+	  ;; ediff-strip-mode-line-format expects that.
+	  (setq mode-line-format
+		(list " Ancestor: "
+		      (cond ((not (stringp buf-C-state-merge))
+			     "")
+			    ((string-match "prefer-A" buf-C-state-merge)
+			     "[=diff(B)] ")
+			    ((string-match "prefer-B" buf-C-state-merge)
+			     "[=diff(A)] ")
+			    (t ""))
+		      mode-line-format))))
     ))
     
   
 (defun ediff-refresh-control-frame ()
-  (if ediff-xemacs-p
-      (progn
-	(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))))
-     ))
+  (setq frame-title-format (ediff-make-narrow-control-buffer-id)
+	frame-icon-title-format (ediff-make-narrow-control-buffer-id) ; XEmacs
+	icon-title-format (ediff-make-narrow-control-buffer-id))      ; Emacs
+  ;; the emacs part will be modified once the 'name and 'title
+  ;; frame parameters are separated
+  (if ediff-emacs-p
+      (modify-frame-parameters
+       ediff-control-frame
+       (list (cons 'name (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)