+(defun desktop-append-buffer-args (&rest args)
+ "Append ARGS at end of `desktop-buffer-args-list'.
+ARGS must be an argument list for `desktop-create-buffer'."
+ (setq desktop-buffer-args-list (nconc desktop-buffer-args-list (list args)))
+ (unless desktop-lazy-timer
+ (setq desktop-lazy-timer
+ (run-with-idle-timer desktop-lazy-idle-delay t 'desktop-idle-create-buffers))))
+
+(defun desktop-lazy-create-buffer ()
+ "Pop args from `desktop-buffer-args-list', create buffer and bury it."
+ (when desktop-buffer-args-list
+ (let* ((remaining (length desktop-buffer-args-list))
+ (args (pop desktop-buffer-args-list))
+ (buffer-name (nth 2 args))
+ (msg (format "Desktop lazily opening %s (%s remaining)..."
+ buffer-name remaining)))
+ (when desktop-lazy-verbose
+ (message "%s" msg))
+ (let ((desktop-first-buffer nil)
+ (desktop-buffer-ok-count 0)
+ (desktop-buffer-fail-count 0))
+ (apply 'desktop-create-buffer args)
+ (run-hooks 'desktop-delay-hook)
+ (setq desktop-delay-hook nil)
+ (bury-buffer (get-buffer buffer-name))
+ (when desktop-lazy-verbose
+ (message "%s%s" msg (if (> desktop-buffer-ok-count 0) "done" "failed")))))))
+
+(defun desktop-idle-create-buffers ()
+ "Create buffers until the user does something, then stop.
+If there are no buffers left to create, kill the timer."
+ (let ((repeat 1))
+ (while (and repeat desktop-buffer-args-list)
+ (save-window-excursion
+ (desktop-lazy-create-buffer))
+ (setq repeat (sit-for 0.2))
+ (unless desktop-buffer-args-list
+ (cancel-timer desktop-lazy-timer)
+ (setq desktop-lazy-timer nil)
+ (message "Lazy desktop load complete")
+ (sit-for 3)
+ (message "")))))
+
+(defun desktop-lazy-complete ()
+ "Run the desktop load to completion."
+ (interactive)
+ (let ((desktop-lazy-verbose t))
+ (while desktop-buffer-args-list
+ (save-window-excursion
+ (desktop-lazy-create-buffer)))
+ (message "Lazy desktop load complete")))
+
+(defun desktop-lazy-abort ()
+ "Abort lazy loading of the desktop."
+ (interactive)
+ (when desktop-lazy-timer
+ (cancel-timer desktop-lazy-timer)
+ (setq desktop-lazy-timer nil))
+ (when desktop-buffer-args-list
+ (setq desktop-buffer-args-list nil)
+ (when (interactive-p)
+ (message "Lazy desktop load aborted"))))
+
+;; ----------------------------------------------------------------------------
+;; When `desktop-save-mode' is non-nil and "--no-desktop" is not specified on the
+;; command line, we do the rest of what it takes to use desktop, but do it
+;; after finishing loading the init file.
+;; We cannot use `command-switch-alist' to process "--no-desktop" because these
+;; functions are processed after `after-init-hook'.
+(add-hook
+ 'after-init-hook
+ (lambda ()
+ (let ((key "--no-desktop"))
+ (when (member key command-line-args)
+ (setq command-line-args (delete key command-line-args))
+ (setq desktop-save-mode nil)))
+ (when desktop-save-mode
+ (desktop-read)
+ (setq inhibit-startup-screen t))))