summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Abrahamsen <eric@ericabrahamsen.net>2019-04-21 11:04:20 -0700
committerEric Abrahamsen <eric@ericabrahamsen.net>2019-09-21 18:41:22 -0700
commite1a45c26c4b951d1d2407c2f3075164866d8a0ea (patch)
tree728b1e1947db036248a827ab1cae068f0e6b4338
parent14e7c01feeafd3852522c221187e7359d21079f5 (diff)
downloademacs-e1a45c26c4b951d1d2407c2f3075164866d8a0ea.tar.gz
New option for making Gnus window layouts atomic
* lisp/gnus/gnus-win.el (gnus-use-atomic-windows): New boolean customization option. (gnus-configure-windows): When removing old window layouts, check for and remove atomicity. (gnus-configure-windows): When gnus-use-atomic-windows is non-nil, make Gnus window layouts atomic. * doc/misc/gnus.texi (Window Layout): Document.
-rw-r--r--doc/misc/gnus.texi8
-rw-r--r--etc/NEWS5
-rw-r--r--lisp/gnus/gnus-win.el21
3 files changed, 34 insertions, 0 deletions
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index fb9581f9853..d535c1a49ef 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -22923,6 +22923,14 @@ window is displayed vertically next to another window, you may also want
to fiddle with @code{gnus-tree-minimize-window} to avoid having the
windows resized.
+Lastly, it's possible to make Gnus window layouts ``atomic''
+(@xref{Atomic Windows, , Atomic Windows, elisp, The GNU Emacs Lisp
+Reference Manual}) by setting @code{gnus-use-atomic-windows} to
+@code{t}. This will ensure that pop-up buffers (e.g. help or
+completion buffers), will appear below or to the side of the entire
+Gnus window layout and not, for example, squashed between the summary
+and article buffers.
+
@subsection Window Configuration Names
Here's a list of most of the currently known window configurations,
diff --git a/etc/NEWS b/etc/NEWS
index 20d2e62bd3b..166c13363f0 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1032,6 +1032,11 @@ Of course it will still find it if you have it in '~/.ecompleterc'.
** Gnus
+++
+*** New option 'gnus-use-atomic-windows' makes Gnus window layouts
+atomic. See the "Atomic Windows" section of the Elisp manual for
+details.
+
++++
*** There's a new value for 'gnus-article-date-headers',
'combined-local-lapsed', which will show both the time (in the local
timezone) and the lapsed time.
diff --git a/lisp/gnus/gnus-win.el b/lisp/gnus/gnus-win.el
index e6906e99bb2..cc3141cf631 100644
--- a/lisp/gnus/gnus-win.el
+++ b/lisp/gnus/gnus-win.el
@@ -39,6 +39,11 @@
:group 'gnus-windows
:type 'boolean)
+(defcustom gnus-use-atomic-windows t
+ "If non-nil, Gnus' window compositions will be atomic."
+ :type 'boolean
+ :version "27.1")
+
(defcustom gnus-window-min-width 2
"Minimum width of Gnus buffers."
:group 'gnus-windows
@@ -402,6 +407,15 @@ See the Gnus manual for an explanation of the syntax used.")
(unless (gnus-buffer-live-p nntp-server-buffer)
(nnheader-init-server-buffer))
+ ;; Remove all 'window-atom parameters, as we're going to blast
+ ;; and recreate the window layout.
+ (when (window-parameter nil 'window-atom)
+ (let ((root (window-atom-root)))
+ (walk-window-subtree
+ (lambda (win)
+ (set-window-parameter win 'window-atom nil))
+ root t)))
+
;; Either remove all windows or just remove all Gnus windows.
(let ((frame (selected-frame)))
(unwind-protect
@@ -423,6 +437,13 @@ See the Gnus manual for an explanation of the syntax used.")
(set-buffer nntp-server-buffer)
(gnus-configure-frame split)
(run-hooks 'gnus-configure-windows-hook)
+
+ ;; If we're using atomic windows, and the current frame has
+ ;; multiple windows, make them atomic.
+ (when (and gnus-use-atomic-windows
+ (window-parent (selected-window)))
+ (window-make-atom (window-parent (selected-window))))
+
(when gnus-window-frame-focus
(select-frame-set-input-focus
(window-frame gnus-window-frame-focus)))))))))