+;; Insert the activity marker for session SESSION in the meta buffer at point
+;; The activity marker is either SPC (untouched session), or + (active session,
+;; i.e., ediff is currently run in it), or - (finished session, i.e., we've ran
+;; ediff in it and then exited)
+(defun ediff-insert-session-activity-marker-in-meta-buffer (session)
+ (insert
+ (cond ((ediff-get-session-activity-marker session))
+ ;; virgin session
+ (t " "))))
+
+;; Insert session status at point. Status is either ?H (marked for hiding), or
+;; ?I (hidden or invalid), or ?* (meaning marked for an operation; currently,
+;; such op can only be checking for equality)), or SPC (meaning neither marked
+;; nor invalid)
+(defun ediff-insert-session-status-in-meta-buffer (session)
+ (insert
+ (cond ((ediff-get-session-status session)) ; session has status: ?H, ?I, ?*
+ ;; normal session, no marks or hidings
+ (t " "))))
+
+;; If NEW-MARKER is non-nil, use it to substitute the current activity marker
+;; in the meta buffer. If nil, use SPC
+(defun ediff-replace-session-activity-marker-in-meta-buffer (point new-marker)
+ (let* ((overl (ediff-get-meta-overlay-at-pos point))
+ (session-info (ediff-overlay-get overl 'ediff-meta-info))
+ (activity-marker (ediff-get-session-activity-marker session-info))
+ buffer-read-only)
+ (or new-marker activity-marker (setq new-marker ?\ ))
+ (goto-char (ediff-overlay-start overl))
+ (if (eq (char-after (point)) new-marker)
+ () ; if marker shown in buffer is the same as new-marker, do nothing
+ (insert new-marker)
+ (delete-char 1)
+ (set-buffer-modified-p nil))))
+
+;; If NEW-STATUS is non-nil, use it to substitute the current status marker in
+;; the meta buffer. If nil, use SPC
+(defun ediff-replace-session-status-in-meta-buffer (point new-status)
+ (let* ((overl (ediff-get-meta-overlay-at-pos point))
+ (session-info (ediff-overlay-get overl 'ediff-meta-info))
+ (status (ediff-get-session-status session-info))
+ buffer-read-only)
+ (setq new-status (or new-status status ?\ ))
+ (goto-char (ediff-overlay-start overl))
+ (forward-char 1) ; status is the second char in session record
+ (if (eq (char-after (point)) new-status)
+ () ; if marker shown in buffer is the same as new-marker, do nothing
+ (insert new-status)
+ (delete-char 1)
+ (set-buffer-modified-p nil))))
+
+;; insert all file info in meta buffer for a given session
+(defun ediff-insert-session-info-in-meta-buffer (session-info sessionNum)
+ (let ((f1 (ediff-get-session-objA session-info))
+ (f2 (ediff-get-session-objB session-info))
+ (f3 (ediff-get-session-objC session-info))
+ (pt (point))
+ (hidden (eq (ediff-get-session-status session-info) ?I)))
+ ;; insert activity marker, i.e., SPC, - or +
+ (ediff-insert-session-activity-marker-in-meta-buffer session-info)
+ ;; insert session status, i.e., *, H
+ (ediff-insert-session-status-in-meta-buffer session-info)
+ (insert " Session " (int-to-string sessionNum) ":\n")
+ (ediff-meta-insert-file-info1 f1)
+ (ediff-meta-insert-file-info1 f2)
+ (ediff-meta-insert-file-info1 f3)
+ (ediff-set-meta-overlay pt (point) session-info sessionNum hidden)))
+