Fix up comment convention on the arch-tag lines.
[bpt/emacs.git] / lisp / ediff-wind.el
index e13d89a..17cd25d 100644 (file)
@@ -1,7 +1,7 @@
 ;;; ediff-wind.el --- window manipulation utilities
 
 ;; Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
 
 (defvar frame-icon-title-format)
 (defvar ediff-diff-status)
 
+;; declare-function does not exist in XEmacs
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest  r))))
+
+
 (eval-when-compile
-  (let ((load-path (cons (expand-file-name ".") load-path)))
-    (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil t 'nosuffix))
-    (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil t 'nosuffix))
-    (or (featurep 'ediff-help)
-       (load "ediff-help.el" nil t 'nosuffix))
-    (or (featurep 'ediff-tbar)
-       (featurep 'emacs)
-       (load "ediff-tbar.el" 'noerror nil 'nosuffix))
-    ))
+  (require 'ediff-init)
+  (require 'ediff-util)
+  (require 'ediff-help)
+  (if (featurep 'xemacs)
+      (require 'ediff-tbar))
+  )
 ;; end pacifier
 
 (require 'ediff-init)
 
 ;; be careful with ediff-tbar
 (if (featurep 'xemacs)
-    (condition-case nil
-       (require 'ediff-tbar)
-      (error
-       (defun ediff-compute-toolbar-width () 0)))
+    (require 'ediff-tbar)
   (defun ediff-compute-toolbar-width () 0))
 
 (defgroup ediff-window nil
   :group 'frames)
 
 
-(defcustom ediff-window-setup-function 'ediff-setup-windows-automatic
+;; Determine which window setup function to use based on current window system.
+(defun ediff-choose-window-setup-function-automatically ()
+  (if (ediff-window-display-p)
+      'ediff-setup-windows-multiframe
+    'ediff-setup-windows-plain))
+
+(defcustom ediff-window-setup-function (ediff-choose-window-setup-function-automatically)
   "*Function called to set up windows.
-Ediff provides a choice of three functions: `ediff-setup-windows-plain', for
-doing everything in one frame, `ediff-setup-windows-multiframe', which sets
-the control panel in a separate frame, and
-`ediff-setup-windows-automatic' (the default), which chooses an appropriate
-behavior based on the current window system.  If the multiframe function
-detects that one of the buffers A/B is seen in some other frame, it will try
-to keep that buffer in that frame.
-
-If you don't like the two functions provided---write your own one.
+Ediff provides a choice of two functions: `ediff-setup-windows-plain', for
+doing everything in one frame and `ediff-setup-windows-multiframe', which sets
+the control panel in a separate frame. By default, the appropriate function is
+chosen automatically depending on the current window system.
+However, `ediff-toggle-multiframe' can be used to toggle between the multiframe
+display and the single frame display.
+If the multiframe function detects that one of the buffers A/B is seen in some
+other frame, it will try to keep that buffer in that frame.
+
+If you don't like any of the two provided functions, write your own one.
 The basic guidelines:
     1. It should leave the control buffer current and the control window
        selected.
@@ -93,8 +97,7 @@ The basic guidelines:
        Buffer C may not be used in jobs that compare only two buffers.
 If you plan to do something fancy, take a close look at how the two
 provided functions are written."
-  :type '(choice (const :tag "Automatic" ediff-setup-windows-automatic)
-                (const :tag "Multi Frame" ediff-setup-windows-multiframe)
+  :type '(choice (const :tag "Multi Frame" ediff-setup-windows-multiframe)
                 (const :tag "Single Frame" ediff-setup-windows-plain)
                 (function :tag "Other function"))
   :group 'ediff-window)
@@ -281,39 +284,31 @@ into icons, regardless of the window manager."
          (beep 1))
       (message "Please click on Window %d " wind-number))
     (ediff-read-event) ; discard event
-    (setq wind (ediff-cond-compile-for-xemacs-or-emacs
-               (event-window event) ; xemacs
-               (posn-window (event-start event)) ; emacs
-               )
-         )
-    ))
+    (setq wind (if (featurep 'xemacs)
+                  (event-window event)
+                (posn-window (event-start event))))))
 
 
 ;; Select the lowest window on the frame.
 (defun ediff-select-lowest-window ()
-  (ediff-cond-compile-for-xemacs-or-emacs
-   (select-window (frame-lowest-window)) ; xemacs
-   ;; emacs
-   (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))))))
-   ))
+  (if (featurep 'xemacs)
+      (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)
+             (setq bottom-edge next-bottom-edge
+                   lowest-window this-window))
+         (select-window this-window)
+         (when (eq last-window this-window)
+           (select-window lowest-window)
+           (setq window-search nil)))))))
 
 
 ;;; Common window setup routines
@@ -339,12 +334,6 @@ into icons, regardless of the window manager."
        buffer-A buffer-B buffer-C control-buffer))
   (run-hooks 'ediff-after-setup-windows-hook))
 
-;; Set up windows using the correct method based on the current window system.
-(defun ediff-setup-windows-automatic (buffer-A buffer-B buffer-C control-buffer)
-  (if (ediff-window-display-p)
-      (ediff-setup-windows-multiframe buffer-A buffer-B buffer-C control-buffer)
-    (ediff-setup-windows-plain buffer-A buffer-B buffer-C control-buffer)))
-
 ;; Just set up 3 windows.
 ;; Usually used without windowing systems
 ;; With windowing, we want to use dedicated frames.
@@ -369,6 +358,7 @@ into icons, regardless of the window manager."
            ;; this lets us have local versions of ediff-split-window-function
            split-window-function ediff-split-window-function))
     (delete-other-windows)
+    (set-window-dedicated-p (selected-window) nil)
     (split-window-vertically)
     (ediff-select-lowest-window)
     (ediff-setup-control-buffer control-buffer)
@@ -428,6 +418,7 @@ into icons, regardless of the window manager."
            split-window-function ediff-split-window-function
            three-way-comparison ediff-3way-comparison-job))
     (delete-other-windows)
+    (set-window-dedicated-p (selected-window) nil)
     (split-window-vertically)
     (ediff-select-lowest-window)
     (ediff-setup-control-buffer control-buffer)
@@ -897,7 +888,7 @@ into icons, regardless of the window manager."
    (or
     ;; only one window
     (eq wind (next-window wind 'ignore-minibuffer (window-frame wind)))
-    ;; none is dedicated
+    ;; none is dedicated (in multiframe setup)
     (not (ediff-frame-has-dedicated-windows (window-frame wind)))
     )))
 
@@ -910,10 +901,8 @@ into icons, regardless of the window manager."
        fheight fwidth adjusted-parameters)
 
     (ediff-with-current-buffer ctl-buffer
-      (ediff-cond-compile-for-xemacs-or-emacs
-       (when (featurep 'menubar) (set-buffer-menubar nil)) ; xemacs
-       nil ; emacs
-       )
+      (if (and (featurep 'xemacs) (featurep 'menubar))
+         (set-buffer-menubar nil))
       ;;(setq user-grabbed-mouse (ediff-user-grabbed-mouse))
       (run-hooks 'ediff-before-setup-control-frame-hook))
 
@@ -925,13 +914,9 @@ into icons, regardless of the window manager."
            ediff-control-frame ctl-frame)
       ;; protect against undefined face-attribute
       (condition-case nil
-         (ediff-cond-compile-for-xemacs-or-emacs
-          nil ; xemacs
-          (when (face-attribute 'mode-line :box)
-            (set-face-attribute 'mode-line ctl-frame :box nil))
-          )
-       (error))
-      )
+         (if (and (featurep 'emacs) (face-attribute 'mode-line :box))
+             (set-face-attribute 'mode-line ctl-frame :box nil))
+       (error)))
 
     (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame))
     (select-frame ctl-frame)
@@ -980,19 +965,14 @@ into icons, regardless of the window manager."
     ;; In XEmacs, buffer menubar needs to be killed before frame parameters
     ;; are changed.
     (if (ediff-has-toolbar-support-p)
-       (ediff-cond-compile-for-xemacs-or-emacs
-        (progn ; xemacs
-          (if (ediff-has-gutter-support-p)
-              (set-specifier top-gutter (list ctl-frame nil)))
-          (sit-for 0)
-          (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))
-          )
-        nil ; emacs
-        )
-      )
+       (when (featurep 'xemacs)
+         (if (ediff-has-gutter-support-p)
+             (set-specifier top-gutter (list ctl-frame nil)))
+         (sit-for 0)
+         (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))))
 
     ;; 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
@@ -1046,34 +1026,26 @@ into icons, regardless of the window manager."
                           (or (eq this-command 'ediff-quit)
                               (not (eq ediff-grab-mouse t)))))
 
-    (if (featurep 'xemacs)
-       (ediff-with-current-buffer ctl-buffer
-         (ediff-cond-compile-for-xemacs-or-emacs
-          (make-local-hook 'select-frame-hook) ; xemacs
-          nil     ; emacs
-          )
-         (add-hook
-          'select-frame-hook 'ediff-xemacs-select-frame-hook nil 'local)
-         ))
+    (when (featurep 'xemacs)
+      (ediff-with-current-buffer ctl-buffer
+       (make-local-hook 'select-frame-hook)
+       (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))
-    ))
+      (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))
        (let ((ctl-frame ediff-control-frame))
-         (ediff-cond-compile-for-xemacs-or-emacs
-          (when (featurep 'menubar)
-            (set-buffer-menubar default-menubar)) ; xemacs
-          nil ; emacs
-          )
+         (if (and (featurep 'xemacs) (featurep 'menubar))
+             (set-buffer-menubar default-menubar))
          (setq ediff-control-frame nil)
-         (delete-frame ctl-frame)
-         )))
-  (ediff-skip-unsuitable-frames)
+         (delete-frame ctl-frame))))
+  (if ediff-multiframe
+      (ediff-skip-unsuitable-frames))
   ;;(ediff-reset-mouse nil)
   )
 
@@ -1334,5 +1306,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
+;; arch-tag: 73d9a5d7-eed7-4d9c-8b4b-21d5d78eb597
 ;;; ediff-wind.el ends here