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))))