aboutsummaryrefslogtreecommitdiff
path: root/org-drill.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-05 05:21:28 -0500
committerCraig Jennings <c@cjennings.net>2026-05-05 05:21:28 -0500
commit6afd53b644c9b1fe0592892464c2d7fb37fa29e7 (patch)
tree1769d6b60937e71c395ddef67e9e5bfcd58f8a97 /org-drill.el
parent7f7564612628d31718c2fc1e4471ab7fa29ef3c1 (diff)
downloadorg-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.el60
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."