2002-01-07 Michael Kifer <kifer@cs.stonybrook.edu>
[bpt/emacs.git] / lisp / ediff-mult.el
index ac77984..b8e576d 100644 (file)
@@ -1,8 +1,8 @@
 ;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff
 
-;; Copyright (C) 1995, 1996, 1997, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc.
 
-;; Author: Michael Kifer <kifer@cs.sunysb.edu>
+;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
 
 ;; This file is part of GNU Emacs.
 
@@ -815,9 +815,10 @@ behavior."
       (erase-buffer)
       ;; delete phony overlays that used to represent sessions before the buff
       ;; was redrawn
-      (if ediff-emacs-p
-         (mapcar 'delete-overlay (overlays-in 1 1))
-       (map-extents 'delete-extent))
+      (ediff-cond-compile-for-xemacs-or-emacs
+       (map-extents 'delete-extent)   ; xemacs
+       (mapcar 'delete-overlay (overlays-in 1 1))  ; emacs
+       )
       
       (insert (format ediff-meta-buffer-message
                      (ediff-abbrev-jobname ediff-metajob-name)))
@@ -918,30 +919,32 @@ behavior."
 (defun ediff-update-session-marker-in-dir-meta-buffer (session-num)
   (let (buffer-meta-overlays session-info overl buffer-read-only)
     (setq overl
-         (if ediff-xemacs-p
-             (map-extents
-              (lambda (ext maparg)
-                (if (and
-                     (ediff-overlay-get ext 'ediff-meta-info)
-                     (eq (ediff-overlay-get ext 'ediff-meta-session-number)
-                         session-num))
-                    ext)))
+         (ediff-cond-compile-for-xemacs-or-emacs
+          (map-extents ; xemacs
+           (lambda (ext maparg)
+             (if (and
+                  (ediff-overlay-get ext 'ediff-meta-info)
+                  (eq (ediff-overlay-get ext 'ediff-meta-session-number)
+                      session-num))
+                 ext)))
            ;; Emacs doesn't have map-extents, so try harder
            ;; Splice overlay lists to get all buffer overlays
-           (setq buffer-meta-overlays (overlay-lists)
-                 buffer-meta-overlays (append (car buffer-meta-overlays)
-                                              (cdr buffer-meta-overlays)))
-           (car
-            (delq nil
-                  (mapcar
-                   (lambda (overl)
-                     (if (and
-                          (ediff-overlay-get overl 'ediff-meta-info)
-                          (eq (ediff-overlay-get
-                               overl 'ediff-meta-session-number)
-                              session-num))
-                         overl))
-                   buffer-meta-overlays)))))
+          (progn
+            (setq buffer-meta-overlays (overlay-lists)
+                  buffer-meta-overlays (append (car buffer-meta-overlays)
+                                               (cdr buffer-meta-overlays)))
+            (car
+             (delq nil
+                   (mapcar
+                    (lambda (overl)
+                      (if (and
+                           (ediff-overlay-get overl 'ediff-meta-info)
+                           (eq (ediff-overlay-get
+                                overl 'ediff-meta-session-number)
+                               session-num))
+                          overl))
+                    buffer-meta-overlays))))
+          ))
     (or overl
        (error
         "Bug in ediff-update-session-marker-in-dir-meta-buffer: no overlay with given number %S"
@@ -1179,9 +1182,10 @@ Useful commands:
       (erase-buffer)
       ;; delete phony overlays that used to represent sessions before the buff
       ;; was redrawn
-      (if ediff-emacs-p
-         (mapcar 'delete-overlay (overlays-in 1 1))
-       (map-extents 'delete-extent))
+      (ediff-cond-compile-for-xemacs-or-emacs
+       (map-extents 'delete-extent) ; xemacs
+       (mapcar 'delete-overlay (overlays-in 1 1)) ; emacs
+       )
 
       (insert "This is a registry of all active Ediff sessions.
 
@@ -1507,7 +1511,7 @@ all marked sessions must be active."
              
 ;; This function executes in meta buffer.  It knows where event happened.
 (defun ediff-filegroup-action ()
-  "Execute appropriate action for the selected session."
+  "Execute appropriate action for a selected session."
   (interactive)
   (let* ((pos (ediff-event-point last-command-event))
         (meta-buf (ediff-event-buffer last-command-event))
@@ -1795,6 +1799,8 @@ all marked sessions must be active."
          (setq frame (window-frame wind))
          (raise-frame frame)
          (ediff-reset-mouse frame)))
+    (sit-for 0) ; sometimes needed to synch the display and ensure that the
+               ; point ends up after the just completed session
     (run-hooks 'ediff-show-session-group-hook)
     ))
 
@@ -1975,19 +1981,22 @@ If this is a session registry buffer then just bury it."
   (let (result olist tmp)
     (if (and point (ediff-buffer-live-p buf))
        (ediff-with-current-buffer buf
-         (if ediff-xemacs-p
-             (setq result
-                   (if (setq tmp (extent-at point buf 'ediff-meta-info))
-                       (ediff-overlay-get tmp 'ediff-meta-info)))
-           (setq olist (overlays-at point))
-           (setq olist
-                 (mapcar (lambda (elt)
-                           (unless (overlay-get elt 'invisible)
-                             (overlay-get elt 'ediff-meta-info)))
-                         olist))
-           (while (and olist (null (car olist)))
-             (setq olist (cdr olist)))
-           (setq result (car olist)))))
+         (ediff-cond-compile-for-xemacs-or-emacs
+          (setq result  ; xemacs
+                (if (setq tmp (extent-at point buf 'ediff-meta-info))
+                    (ediff-overlay-get tmp 'ediff-meta-info)))
+          (progn ; emacs
+            (setq olist (overlays-at point))
+            (setq olist
+                  (mapcar (lambda (elt)
+                            (unless (overlay-get elt 'invisible)
+                              (overlay-get elt 'ediff-meta-info)))
+                          olist))
+            (while (and olist (null (car olist)))
+              (setq olist (cdr olist)))
+            (setq result (car olist)))
+          )
+         ))
     (if result
        result
       (if noerror
@@ -1997,14 +2006,17 @@ If this is a session registry buffer then just bury it."
 
 
 (defun ediff-get-meta-overlay-at-pos (point)
-  (if ediff-xemacs-p
-      (extent-at point (current-buffer) 'ediff-meta-info)
-    (let* ((overl-list (overlays-at point))
-          (overl (car overl-list)))
-      (while (and overl (null (overlay-get overl 'ediff-meta-info)))
-       (setq overl-list (cdr overl-list)
-             overl (car overl-list)))
-      overl)))
+  (ediff-cond-compile-for-xemacs-or-emacs
+   (extent-at point (current-buffer) 'ediff-meta-info) ; xemacs
+   ;; emacs
+   (let* ((overl-list (overlays-at point))
+         (overl (car overl-list)))
+     (while (and overl (null (overlay-get overl 'ediff-meta-info)))
+       (setq overl-list (cdr overl-list)
+            overl (car overl-list)))
+     overl)
+   )
+  )
 
 (defsubst ediff-get-session-number-at-pos (point &optional meta-buffer)
   (setq meta-buffer (if (ediff-buffer-live-p meta-buffer)
@@ -2020,18 +2032,21 @@ If this is a session registry buffer then just bury it."
   (if (eobp)
       (goto-char (point-min))
     (let ((overl (ediff-get-meta-overlay-at-pos point)))
-      (if ediff-xemacs-p
-         (progn
-           (if overl
-               (setq overl (next-extent overl))
-             (setq overl (next-extent (current-buffer))))
-           (if overl
-               (extent-start-position overl)
-             (point-max)))
-       (if overl
-           ;; note: end of current overlay is the beginning of the next one
-           (overlay-end overl)
-         (next-overlay-change point))))
+      (ediff-cond-compile-for-xemacs-or-emacs
+       (progn ; xemacs
+        (if overl
+            (setq overl (next-extent overl))
+          (setq overl (next-extent (current-buffer))))
+        (if overl
+            (extent-start-position overl)
+          (point-max)))
+       ;; emacs
+       (if overl
+          ;; note: end of current overlay is the beginning of the next one
+          (overlay-end overl)
+        (next-overlay-change point))
+       )
+      )
     ))
 
 
@@ -2039,27 +2054,30 @@ If this is a session registry buffer then just bury it."
   (if (bobp)
       (goto-char (point-max))
     (let ((overl (ediff-get-meta-overlay-at-pos point)))
-      (if ediff-xemacs-p
-         (progn
-           (if overl
-               (setq overl (previous-extent overl))
-             (setq overl (previous-extent (current-buffer))))
-           (if overl
-               (extent-start-position overl)
-             (point-min)))
-       (if overl (setq point (overlay-start overl)))
-       ;; to get to the beginning of prev overlay
-       (if (not (bobp))
-           ;; trick to overcome an emacs bug--doesn't always find previous
-           ;; overlay change correctly
-           (setq point (1- point)))
-       (setq point (previous-overlay-change point))
-       ;; If we are not over an overlay after subtracting 1, it means we are
-       ;; in the description area preceding session records.  In this case,
-       ;; goto the top of the registry buffer.
-       (or (car (overlays-at point))
-           (setq point (point-min)))
-       point))))
+      (ediff-cond-compile-for-xemacs-or-emacs
+       (progn
+        (if overl
+            (setq overl (previous-extent overl))
+          (setq overl (previous-extent (current-buffer))))
+        (if overl
+            (extent-start-position overl)
+          (point-min)))
+       (progn
+        (if overl (setq point (overlay-start overl)))
+        ;; to get to the beginning of prev overlay
+        (if (not (bobp))
+            ;; trick to overcome an emacs bug--doesn't always find previous
+            ;; overlay change correctly
+            (setq point (1- point)))
+        (setq point (previous-overlay-change point))
+        ;; If we are not over an overlay after subtracting 1, it means we are
+        ;; in the description area preceding session records.  In this case,
+        ;; goto the top of the registry buffer.
+        (or (car (overlays-at point))
+            (setq point (point-min)))
+        point)
+       )
+      )))
 
 ;; this is the action invoked when the user selects a patch from the meta
 ;; buffer.