+(defvar calc-embedded-original-modes nil
+ "The mode settings for Calc buffer when put in embedded mode.")
+
+(defun calc-embedded-save-original-modes ()
+ "Save the current Calc modes when entereding embedded mode."
+ (let ((calcbuf (save-excursion
+ (calc-create-buffer)
+ (current-buffer)))
+ lang modes)
+ (if calcbuf
+ (with-current-buffer calcbuf
+ (setq lang
+ (cons calc-language calc-language-option))
+ (setq modes
+ (list (cons 'calc-display-just
+ calc-display-just)
+ (cons 'calc-display-origin
+ calc-display-origin)))
+ (let ((v calc-embedded-mode-vars))
+ (while v
+ (let ((var (cdr (car v))))
+ (unless (memq var '(the-language the-display-just))
+ (setq modes
+ (cons (cons var (symbol-value var))
+ modes))))
+ (setq v (cdr v))))
+ (setq calc-embedded-original-modes (cons lang modes)))
+ (setq calc-embedded-original-modes nil))))
+
+(defun calc-embedded-preserve-modes ()
+ "Preserve the current modes when leaving embedded mode."
+ (interactive)
+ (if calc-embedded-info
+ (progn
+ (calc-embedded-save-original-modes)
+ (message "Current modes will be preserved when leaving embedded mode."))
+ (message "Not in embedded mode.")))
+
+(defun calc-embedded-restore-original-modes ()
+ "Restore the original Calc modes when leaving embedded mode."
+ (let ((calcbuf (get-buffer "*Calculator*"))
+ (changed nil)
+ (lang (car calc-embedded-original-modes))
+ (modes (cdr calc-embedded-original-modes)))
+ (if (and calcbuf calc-embedded-original-modes)
+ (with-current-buffer calcbuf
+ (unless (and
+ (equal calc-language (car lang))
+ (equal calc-language-option (cdr lang)))
+ (calc-set-language (car lang) (cdr lang))
+ (setq changed t))
+ (while modes
+ (let ((mode (car modes)))
+ (unless (equal (symbol-value (car mode)) (cdr mode))
+ (set (car mode) (cdr mode))
+ (setq changed t)))
+ (setq modes (cdr modes)))
+ (when changed
+ (calc-refresh)
+ (calc-set-mode-line))))
+ (setq calc-embedded-original-modes nil)))
+