diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-05 05:21:28 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-05 05:21:28 -0500 |
| commit | 6afd53b644c9b1fe0592892464c2d7fb37fa29e7 (patch) | |
| tree | 1769d6b60937e71c395ddef67e9e5bfcd58f8a97 /org-drill.el | |
| parent | 7f7564612628d31718c2fc1e4471ab7fa29ef3c1 (diff) | |
| download | org-drill-6afd53b644c9b1fe0592892464c2d7fb37fa29e7.tar.gz org-drill-6afd53b644c9b1fe0592892464c2d7fb37fa29e7.zip | |
fix: restore display state in the buffer setup ran in
org-drill--setup-display saved buffer-local state (mode-line,
variable-pitch-mode) into global defvars and called setq-local on
the current buffer. org-drill--restore-display read those globals
and ran setq-local against whatever buffer happened to be current
at restore time.
If the user switched buffers mid-session, the restore wrote to the
wrong buffer — leaving the original drill buffer's mode-line still
hidden and trampling the destination buffer's mode-line with
whatever was saved from elsewhere.
Captured the buffer at setup in org-drill--saved-display-buffer.
Restore now wraps mode-line and variable-pitch restoration in
with-current-buffer against that saved buffer. Text-scale stays
global (the underlying face attribute is process-wide).
Diffstat (limited to 'org-drill.el')
| -rw-r--r-- | org-drill.el | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/org-drill.el b/org-drill.el index 489215a..f996f15 100644 --- a/org-drill.el +++ b/org-drill.el @@ -571,6 +571,11 @@ This can make text more readable for long-form content." (defvar org-drill--saved-variable-pitch-mode nil "Saved variable-pitch-mode state before drill session started.") +(defvar org-drill--saved-display-buffer nil + "Buffer in which the active drill session set up its display. +Captured at setup so restore can target the same buffer even if the +user has switched away by the time `org-drill--restore-display' runs.") + (defvar org-drill-display-answer-hook nil "Hook called when `org-drill' answers are displayed.") @@ -1973,41 +1978,56 @@ overlay covering whatever range point happened to be at." (defun org-drill--setup-display () "Set up display settings for drill session. -Saves current settings and applies drill-specific display preferences." - ;; Save current text scale and apply new size +Saves current settings and applies drill-specific display preferences. +Records the current buffer so that `org-drill--restore-display' can +target it even if the user switches buffers mid-session." + (setq org-drill--saved-display-buffer (current-buffer)) + + ;; Save current text scale and apply new size (face is global). (when org-drill-text-size-during-session (setq org-drill--saved-text-scale (face-attribute 'default :height nil 'default)) (set-face-attribute 'default nil :height (* org-drill-text-size-during-session 10))) - ;; Save and enable variable-pitch mode + ;; Save and enable variable-pitch mode (buffer-local minor mode). (when org-drill-use-variable-pitch (setq org-drill--saved-variable-pitch-mode (if (boundp 'variable-pitch-mode) variable-pitch-mode nil)) (variable-pitch-mode 1)) - ;; Save and hide modeline + ;; Save and hide modeline (buffer-local). (when org-drill-hide-modeline-during-session (setq org-drill--saved-modeline-format mode-line-format) (setq-local mode-line-format nil))) (defun org-drill--restore-display () - "Restore display settings after drill session ends." - ;; Restore text size - (when org-drill--saved-text-scale - (set-face-attribute 'default nil :height org-drill--saved-text-scale) - (setq org-drill--saved-text-scale nil)) - - ;; Restore variable-pitch mode - (when (and org-drill-use-variable-pitch - (not (eq org-drill--saved-variable-pitch-mode 'unbound))) - (variable-pitch-mode (if org-drill--saved-variable-pitch-mode 1 -1)) - (setq org-drill--saved-variable-pitch-mode nil)) - - ;; Restore modeline - (when org-drill--saved-modeline-format - (setq-local mode-line-format org-drill--saved-modeline-format) - (setq org-drill--saved-modeline-format nil))) + "Restore display settings after drill session ends. +Buffer-local state (mode-line, variable-pitch-mode) is restored in +the buffer the session originated from — not the current buffer at +restore time, which may differ if the user switched away." + (let ((target (and (buffer-live-p org-drill--saved-display-buffer) + org-drill--saved-display-buffer))) + ;; Restore text size (face is global — no buffer targeting needed). + (when org-drill--saved-text-scale + (set-face-attribute 'default nil :height org-drill--saved-text-scale) + (setq org-drill--saved-text-scale nil)) + + ;; Restore variable-pitch-mode in the original buffer. + (when (and org-drill-use-variable-pitch + (not (eq org-drill--saved-variable-pitch-mode 'unbound))) + (when target + (with-current-buffer target + (variable-pitch-mode (if org-drill--saved-variable-pitch-mode 1 -1)))) + (setq org-drill--saved-variable-pitch-mode nil)) + + ;; Restore modeline in the original buffer. + (when org-drill--saved-modeline-format + (when target + (with-current-buffer target + (setq-local mode-line-format org-drill--saved-modeline-format))) + (setq org-drill--saved-modeline-format nil)) + + (setq org-drill--saved-display-buffer nil))) (defun org-drill-unhide-text () "Unhide text." |
