el/dot-emacs.el: Fix designated-window machinery for Emacs 23.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 25 Mar 2023 13:00:02 +0000 (13:00 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 25 Mar 2023 13:05:16 +0000 (13:05 +0000)
This lacks the `display-buffer-base-action' hook, so use
`display-buffer-function'.  This adds some messy conditional stuff, but
we'll survive.

el/dot-emacs.el

index 16ee196..4e162fd 100644 (file)
@@ -663,6 +663,14 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
 (defvar mdw-designated-window nil
   "The window chosen by `mdw-designate-window', or nil.")
 
+(defun mdw-designated-window-display-buffer-function (buffer not-this-window)
+  "Display buffer function to use the designated window."
+  (unless mdw-designated-window (error "No designated window!"))
+  (prog1 mdw-designated-window
+    (with-selected-window mdw-designated-window (switch-to-buffer buffer))
+    (setq mdw-designated-window nil
+         display-buffer-function nil)))
+
 (defun mdw-display-buffer-in-designated-window (buffer alist)
   "Display function to use the designated window."
   (prog1 mdw-designated-window
@@ -675,18 +683,28 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
   "Use the selected window for the next pop-up buffer.
 With a prefix argument, clear the designated window."
   (interactive "P")
-  (cond (cancel
-        (setq mdw-designated-window nil)
-        (message "Window designation cleared."))
-       (t
-        (setq mdw-designated-window (selected-window))
-        (message "Window designated."))))
-
-(setq display-buffer-base-action
-      (let* ((action display-buffer-base-action)
-            (funcs (car action))
-            (alist (cdr action)))
-       (cons (cons 'mdw-display-buffer-in-designated-window funcs) alist)))
+  (let ((window (selected-window)))
+    (cond (cancel
+          (setq mdw-designated-window nil)
+          (unless (mdw-emacs-version-p 24)
+            (setq display-buffer-function nil))
+          (message "Window designation cleared."))
+         ((window-dedicated-p window)
+          (error "Window is dedicated to its buffer."))
+         (t
+          (setq mdw-designated-window window)
+          (unless (mdw-emacs-version-p 24)
+            (setq display-buffer-function
+                    #'mdw-designated-window-display-buffer-function))
+          (message "Window designated.")))))
+
+(when (mdw-emacs-version-p 24)
+  (setq display-buffer-base-action
+         (let* ((action display-buffer-base-action)
+                (funcs (car action))
+                (alist (cdr action)))
+           (cons (cons 'mdw-display-buffer-in-designated-window funcs)
+                 alist))))
 
 (defun mdw-clobber-other-windows-showing-buffer (buffer-or-name)
   "Arrange that no windows on other frames are showing BUFFER-OR-NAME."