+;; ----------------------------------------------------------------------------
+;; Auto-Saving.
+(defvar desktop-auto-save-timer nil)
+
+(defun desktop-auto-save-enable (&optional timeout)
+ (when (and (integerp (or timeout desktop-auto-save-timeout))
+ (> (or timeout desktop-auto-save-timeout) 0))
+ (add-hook 'window-configuration-change-hook 'desktop-auto-save-set-timer)))
+
+(defun desktop-auto-save-disable ()
+ (remove-hook 'window-configuration-change-hook 'desktop-auto-save-set-timer)
+ (desktop-auto-save-cancel-timer))
+
+(defun desktop-auto-save ()
+ "Save the desktop periodically.
+Called by the timer created in `desktop-auto-save-set-timer'."
+ (when (and desktop-save-mode
+ (integerp desktop-auto-save-timeout)
+ (> desktop-auto-save-timeout 0)
+ ;; Avoid desktop saving during lazy loading.
+ (not desktop-lazy-timer)
+ ;; Save only to own desktop file.
+ (eq (emacs-pid) (desktop-owner))
+ desktop-dirname)
+ (desktop-save desktop-dirname nil t)))
+
+(defun desktop-auto-save-set-timer ()
+ "Set the auto-save timer.
+Cancel any previous timer. When `desktop-auto-save-timeout' is a positive
+integer, start a new idle timer to call `desktop-auto-save' repeatedly
+after that many seconds of idle time."
+ (desktop-auto-save-cancel-timer)
+ (when (and (integerp desktop-auto-save-timeout)
+ (> desktop-auto-save-timeout 0))
+ (setq desktop-auto-save-timer
+ (run-with-idle-timer desktop-auto-save-timeout nil
+ 'desktop-auto-save))))
+
+(defun desktop-auto-save-cancel-timer ()
+ (when desktop-auto-save-timer
+ (cancel-timer desktop-auto-save-timer)
+ (setq desktop-auto-save-timer nil)))
+