From 4190fec56ebd413e0e398d23edb55b89772ae1d0 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Sat, 4 May 2019 16:29:39 +0100 Subject: [PATCH] Fix Gnus summary widget navigation across frames * lisp/gnus/gnus-sum.el (gnus-summary-widget-forward) (gnus-summary-widget-backward): Signal more informative error if article window is not found. Consider other frames displaying article buffer, and raise its frame before navigating its widgets. * lisp/gnus/gnus-win.el (gnus-get-buffer-window): Simplify and add docstring. --- lisp/gnus/gnus-sum.el | 18 ++++++++++++------ lisp/gnus/gnus-win.el | 19 ++++++++++--------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index b8aa302f11..ac222acfd2 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -9423,8 +9423,11 @@ gnus-summary-widget-forward (interactive "p") (gnus-summary-select-article) (gnus-configure-windows 'article) - (select-window (gnus-get-buffer-window gnus-article-buffer)) - (widget-forward arg)) + (let ((win (or (gnus-get-buffer-window gnus-article-buffer t) + (error "No article window found")))) + (select-window win) + (select-frame-set-input-focus (window-frame win)) + (widget-forward arg))) (defun gnus-summary-widget-backward (arg) "Move point to the previous field or button in the article. @@ -9432,10 +9435,13 @@ gnus-summary-widget-backward (interactive "p") (gnus-summary-select-article) (gnus-configure-windows 'article) - (select-window (gnus-get-buffer-window gnus-article-buffer)) - (unless (widget-at (point)) - (goto-char (point-max))) - (widget-backward arg)) + (let ((win (or (gnus-get-buffer-window gnus-article-buffer t) + (error "No article window found")))) + (select-window win) + (select-frame-set-input-focus (window-frame win)) + (unless (widget-at (point)) + (goto-char (point-max))) + (widget-backward arg))) (defun gnus-summary-isearch-article (&optional regexp-p) "Do incremental search forward on the current article. diff --git a/lisp/gnus/gnus-win.el b/lisp/gnus/gnus-win.el index 5f7154c545..a992fe731c 100644 --- a/lisp/gnus/gnus-win.el +++ b/lisp/gnus/gnus-win.el @@ -28,6 +28,7 @@ (require 'gnus) (require 'gnus-util) +(require 'seq) (defgroup gnus-windows nil "Window configuration." @@ -509,15 +510,15 @@ gnus-remove-some-windows (delq lowest-buf bufs))))) (defun gnus-get-buffer-window (buffer &optional frame) - (cond ((and (null gnus-use-frames-on-any-display) - (memq frame '(t 0 visible))) - (car - (let ((frames (frames-on-display-list))) - (seq-remove (lambda (win) (not (memq (window-frame win) - frames))) - (get-buffer-window-list buffer nil frame))))) - (t - (get-buffer-window buffer frame)))) + "Return a window currently displaying BUFFER, or nil if none. +Like `get-buffer-window', but respecting +`gnus-use-frames-on-any-display'." + (if (and (not gnus-use-frames-on-any-display) + (memq frame '(t 0 visible))) + (let ((frames (frames-on-display-list))) + (seq-find (lambda (win) (memq (window-frame win) frames)) + (get-buffer-window-list buffer nil frame))) + (get-buffer-window buffer frame))) (provide 'gnus-win) -- 2.20.1