aboutsummaryrefslogtreecommitdiff
path: root/modules/undead-buffers.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-08-25 05:28:25 -0600
committerCraig Jennings <c@cjennings.net>2026-08-25 05:28:25 -0600
commit638310601a39e7f9ade59ea85794a21167905f31 (patch)
tree59ebb07880634aaf2084cf4917b09aadc1cd7068 /modules/undead-buffers.el
parentac1d034d09dd37305e84d08438fef268ed8173bc (diff)
downloaddotemacs-638310601a39e7f9ade59ea85794a21167905f31.tar.gz
dotemacs-638310601a39e7f9ade59ea85794a21167905f31.zip
fix(startup): keep *Warnings* alive so 31.1's first frame is Wayland
Emacs 31.1's warnings.el defers daemon-startup warnings into a one-shot after-make-frame-functions closure that holds the *Warnings* buffer object and displays it on the first client frame. The startup sweep in cj/dashboard-only killed that buffer first. On the first emacsclient -c of every session, display-buffer then signaled inside make-frame and server.el answered -window-system-unsupported. emacsclient silently retried on $DISPLAY, and the frame opened on XWayland behind the pgtk "unsupported under X" dialog. Only that first frame was affected, which made it look like a display problem rather than a config one. I added *Warnings* to cj/undead-buffer-list so the sweep buries it instead, the same choice desktop.el makes in desktop-clear-preserve-buffers. Two things follow. C-x k on *Warnings* now buries it. A startup that produced warnings shows them on the first frame, because the deferred closure finally has a live buffer. As a backstop, cj/warning--display-buffer-if-live wraps warning--display-buffer so a dead buffer (or a name that resolves to none) is skipped rather than passed on. That function only exists from Emacs 31, and advising the undefined symbol on 30.2 is harmless. The new tests pin *Warnings* to the undead list and check the sweep leaves it live. The guard tests cover live and dead buffers plus names that do and don't resolve, and run the real 31.x function on a dead buffer.
Diffstat (limited to 'modules/undead-buffers.el')
-rw-r--r--modules/undead-buffers.el11
1 files changed, 10 insertions, 1 deletions
diff --git a/modules/undead-buffers.el b/modules/undead-buffers.el
index e5b8dc00..21232e50 100644
--- a/modules/undead-buffers.el
+++ b/modules/undead-buffers.el
@@ -31,7 +31,16 @@
(defvar cj/undead-buffer-list
'("*scratch*" "*EMMS-Playlist*" "*Messages*" "*ert*"
- "*AI-Assistant*")
+ "*AI-Assistant*"
+ ;; *Warnings* stays alive because Emacs 31's warnings.el defers daemon
+ ;; startup warnings into an `after-make-frame-functions' closure that
+ ;; holds this buffer object until the first client frame. The startup
+ ;; sweep in `cj/dashboard-only' used to kill it; the closure then failed
+ ;; inside `make-frame', server.el reported the window system as
+ ;; unsupported, and emacsclient silently retried on $DISPLAY, so the first
+ ;; frame of every 31.1 session opened on XWayland. I bury it instead, the
+ ;; same choice desktop.el makes in `desktop-clear-preserve-buffers'.
+ "*Warnings*")
"Buffer names to bury instead of killing (exact match).")
(defvar cj/undead-buffer-regexps nil