Function: desktop-create-buffer

desktop-create-buffer is a byte-compiled function defined in desktop.el.gz.

Signature

(desktop-create-buffer FILE-VERSION BUFFER-FILENAME BUFFER-NAME BUFFER-MAJORMODE BUFFER-MINORMODES BUFFER-POINT BUFFER-MARK BUFFER-READONLY BUFFER-MISC &optional BUFFER-LOCALS COMPACTED-VARS &rest UNSUPPORTED)

Source Code

;; Defined in /usr/src/emacs/lisp/desktop.el.gz
;; ----------------------------------------------------------------------------
;; Create a buffer, load its file, set its mode, ...;
;; called from Desktop file only.

(defun desktop-create-buffer
    (file-version
     buffer-filename
     buffer-name
     buffer-majormode
     buffer-minormodes
     buffer-point
     buffer-mark
     buffer-readonly
     buffer-misc
     &optional
     buffer-locals
     compacted-vars
     &rest _unsupported)

  (setq desktop-io-file-version file-version)

  (let ((desktop-file-version	    file-version)
	(desktop-buffer-file-name   buffer-filename)
	(desktop-buffer-name	    buffer-name)
	(desktop-buffer-major-mode  buffer-majormode)
	(desktop-buffer-minor-modes buffer-minormodes)
	(desktop-buffer-point	    buffer-point)
	(desktop-buffer-mark	    buffer-mark)
	(desktop-buffer-read-only   buffer-readonly)
	(desktop-buffer-misc	    buffer-misc)
	(desktop-buffer-locals	    buffer-locals))
    ;; To make desktop files with relative file names possible, we cannot
    ;; allow `default-directory' to change. Therefore we save current buffer.
    (save-current-buffer
      ;; Give major mode module a chance to add a handler.
      (desktop-load-file desktop-buffer-major-mode)
      (let ((buffer-list (buffer-list))
	    (result
	     (condition-case-unless-debug err
		 (funcall (or (cdr (assq desktop-buffer-major-mode
					 desktop-buffer-mode-handlers))
			      'desktop-restore-file-buffer)
			  desktop-buffer-file-name
			  desktop-buffer-name
			  desktop-buffer-misc)
	       (error
		(message "Desktop: Can't load buffer %s: %s"
			 desktop-buffer-name
			 (error-message-string err))
		(when desktop-missing-file-warning (sit-for 1))
		nil))))
	(if (bufferp result)
	    (setq desktop-buffer-ok-count (1+ desktop-buffer-ok-count))
	  (setq desktop-buffer-fail-count (1+ desktop-buffer-fail-count))
	  (setq result nil))
	;; Restore buffer list order with new buffer at end. Don't change
	;; the order for old desktop files (old desktop module behavior).
	(unless (< desktop-file-version 206)
	  (dolist (buf buffer-list)
            (and (buffer-live-p buf)
                 (bury-buffer buf)))
	  (when result (bury-buffer result)))
	(when result
	  (unless (or desktop-first-buffer (< desktop-file-version 206))
	    (setq desktop-first-buffer result))
	  (set-buffer result)
	  (unless (equal (buffer-name) desktop-buffer-name)
	    (rename-buffer desktop-buffer-name t))
	  ;; minor modes
	  (cond ((equal '(t) desktop-buffer-minor-modes) ; backwards compatible
		 (auto-fill-mode 1))
		((equal '(nil) desktop-buffer-minor-modes) ; backwards compatible
		 (auto-fill-mode 0))
		(t
		 (dolist (minor-mode desktop-buffer-minor-modes)
		   ;; Give minor mode module a chance to add a handler.
		   (desktop-load-file minor-mode)
		   (let ((handler (cdr (assq minor-mode desktop-minor-mode-handlers))))
		     (if handler
			 (funcall handler desktop-buffer-locals)
		       (when (functionp minor-mode)
			 (funcall minor-mode 1)))))))
	  ;; Even though point and mark are non-nil when written by
	  ;; `desktop-save', they may be modified by handlers wanting to set
	  ;; point or mark themselves.
	  (when desktop-buffer-point
	    (goto-char
	     (condition-case err
		 ;; Evaluate point.  Thus point can be something like
		 ;; '(search-forward ...
		 (eval desktop-buffer-point)
	       (error (message "%s" (error-message-string err)) 1))))
	  (when desktop-buffer-mark
            (if (consp desktop-buffer-mark)
                (progn
                  (move-marker (mark-marker) (car desktop-buffer-mark))
                  (if (car (cdr desktop-buffer-mark))
                      (activate-mark 'dont-touch-tmm)))
              (move-marker (mark-marker) desktop-buffer-mark)))
	  ;; Never override file system if the file really is read-only marked.
	  (when desktop-buffer-read-only (setq buffer-read-only desktop-buffer-read-only))
	  (dolist (this desktop-buffer-locals)
	    (if (consp this)
		;; An entry of this form `(symbol . value)'.
		(progn
		  (make-local-variable (car this))
		  (set (car this) (cdr this)))
	      ;; An entry of the form `symbol'.
	      (make-local-variable this)
	      (makunbound this)))
          ;; adjust `buffer-display-time' for the downtime. e.g.,
          ;; * if `buffer-display-time' was 8:00
          ;; * and emacs stopped at `desktop-file-modtime' == 11:00
          ;; * and we are loading the desktop file at (current-time) 12:30,
          ;; -> then we restore `buffer-display-time' as 9:30,
          ;; for the sake of `clean-buffer-list': preserving the invariant
          ;; "how much time the user spent in Emacs without looking at this buffer".
          (setq buffer-display-time
		(time-since (if buffer-display-time
				(time-subtract desktop-file-modtime
					       buffer-display-time)
			      0)))
	  (unless (< desktop-file-version 208) ; Don't misinterpret any old custom args
	    (dolist (record compacted-vars)
	      (let*
		  ((var (car record))
		   (deser-fun (nth 2 (assq var desktop-var-serdes-funs))))
		(if deser-fun (set var (funcall deser-fun (cadr record))))))))
	result))))