[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[BUG] org-gnus-follow-link tries to select dead frame [9.8-pre (release_
From: |
Björn Bidar |
Subject: |
[BUG] org-gnus-follow-link tries to select dead frame [9.8-pre (release_9.7.15-163-g3ff21c.dirty @ /home/bidar/.local/etc/emacs/lib/org/lisp/)] |
Date: |
Tue, 21 Jan 2025 01:21:27 +0200 |
* Description
org-gnus-follow-link tries to select the Gnus frame if the user used
gnus-other-frame, the intention is to follow the previous action of the
user and now choose that Gnus frame too.
However it doesn't check if the frame is alive or not, resulting
in (wrong-type-argument frame-live-p #<frame>).
* Preconditions
- gnus-other-frame-object is a dead frame
* Steps to preproduce
1. Try to follow org-gnus link
2. Error
* Proposed change
Use the new org-link-frame-setup activate gnus-other-frame-object if
required.
The org-gnus-no-news function did not take care of if gnus should be
called directly of if should be called using the gnus-other-frame
function, i.e. when gnus-other-frame-object is set.
Take gnus-other-frame-object into account and call it if
gnus-other-frame-object is set or when the user chooses to do so
regardless. This ensures that gnus-other-frame-object always contains an
alive frame. The side effect is gnus-other-frame is used to ensure that
Gnus is called in the correct frame.
See attached patch.
>From 4f4936aba13fe2156d74465e3f4e8df857cc6754 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Bidar?= <bjorn.bidar@thaodan.de>
Date: Tue, 21 Jan 2025 00:55:15 +0200
Subject: [PATCH] Ensure that gnus-other-frame-object is alive before selecting
* lisp/ol-gnus.el (org-gnus-follow-link): Ensure that
`gnus-other-frame-object' is active before selecting it.
Error out in case frame-object is dead, i.e. wasn't activated
by `org-link-frame-setup-function'.
(org-gnus-no-new-news): Take `gnus-other-frame-object' into account.
Call gnus-other-frame with chosen action instead without.
Ensures that previous behavior of `org-gnus-follow-link' is kept.
(org-gnus-no-new-news-other-frame): New function for users who choose
to call `gnus-other-frame' regardless if previous used or not.
* lisp/ol.el (org-link-frame-setup): Include
new `org-gnus-no-news-other-frame` function.
---
lisp/ol-gnus.el | 30 ++++++++++++++++++++++++------
lisp/ol.el | 4 +++-
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/lisp/ol-gnus.el b/lisp/ol-gnus.el
index 5cddc3790..65d77ea88 100644
--- a/lisp/ol-gnus.el
+++ b/lisp/ol-gnus.el
@@ -228,7 +228,12 @@ (defun org-gnus-follow-link (&optional group article)
"Follow a Gnus link to GROUP and ARTICLE."
(require 'gnus)
(funcall (org-link-frame-setup-function 'gnus))
- (when gnus-other-frame-object (select-frame gnus-other-frame-object))
+ (when gnus-other-frame-object
+ (if (not (frame-live-p gnus-other-frame-object))
+ ;; Error out in case org-link-frame-setup did not take care of setting
up
+ ;; the gnus frame if was activate previously.
+ (error "Couldn't select \'gnus-other-frame-object\', make sure it is
active"))
+ (select-frame gnus-other-frame-object))
(let ((group (org-no-properties group))
(article (org-no-properties article)))
(cond
@@ -260,11 +265,24 @@ (defun org-gnus-follow-link (&optional group article)
(message "Couldn't follow Gnus link. The linked group is empty."))))
(group (gnus-group-jump-to-group group)))))
-(defun org-gnus-no-new-news ()
- "Like `\\[gnus]' but doesn't check for new news."
- (cond ((gnus-alive-p) nil)
- (org-gnus-no-server (gnus-no-server))
- (t (gnus))))
+(defun org-gnus-no-new-news (&optional other-frame)
+ "Like `\\[gnus]' but doesn't check for new news.
+In case of OTHER-FRAME or `gnus-other-frame-object' call `gnus-other-frame'.
+
+Ensures that `gnus-other-frame' is activated correctly if dead."
+ (let ((action (cond (org-gnus-no-server #'gnus-no-server)
+ (t #'gnus))))
+ (cond ((or other-frame gnus-other-frame-object)
+ (let ((gnus-other-frame-function action)
+ (gnus-other-frame-resume-function action))
+ (gnus-other-frame)))
+ (t (if (not (gnus-alive-p))
+ (funcall action))))))
+
+(defun org-gnus-no-new-news-other-frame ()
+ "Like `org-gnus-no-new-news' but always in another frame."
+ (org-gnus-no-new-news t))
+
(provide 'ol-gnus)
diff --git a/lisp/ol.el b/lisp/ol.el
index 2365ca802..6cf3d92aa 100644
--- a/lisp/ol.el
+++ b/lisp/ol.el
@@ -348,6 +348,7 @@ (defcustom org-link-frame-setup
`gnus'
`gnus-other-frame'
`org-gnus-no-new-news'
+ `org-gnus-no-new-news-other-frame'
For FILE, use any of
`find-file'
`find-file-other-window'
@@ -374,7 +375,8 @@ (defcustom org-link-frame-setup
(choice
(const gnus)
(const gnus-other-frame)
- (const org-gnus-no-new-news)))
+ (const org-gnus-no-new-news)
+ (const org-gnus-no-new-news-other-frame)))
(cons (const file)
(choice
(const find-file)
--
2.45.2
* Backtrace
Debugger entered--Lisp error: (wrong-type-argument frame-live-p #<dead frame
*Group* • - Emacs 0x562b2cbc8c28>)
select-frame(#<dead frame *Group* • - Emacs 0x562b2cbc8c28>)
org-gnus-follow-link("nnimap+thaodan.de:Sent" "871pxrjqne.fsf@")
org-gnus-open("nnimap+thaodan.de:Sent#871pxrjqne.fsf@" nil)
funcall(org-gnus-open "nnimap+thaodan.de:Sent#871pxrjqne.fsf@" nil)
(condition-case nil (funcall f path arg) (wrong-number-of-arguments (funcall f
path)))
(progn (condition-case nil (funcall f path arg) (wrong-number-of-arguments
(funcall f path))))
(if (functionp f) (progn (condition-case nil (funcall f path arg)
(wrong-number-of-arguments (funcall f path)))))
(let ((f (org-link-get-parameter type :follow))) (if (functionp f) (progn
(condition-case nil (funcall f path arg) (wrong-number-of-arguments (funcall f
path))))))
(let nil (let ((f (org-link-get-parameter type :follow))) (if (functionp f)
(progn (condition-case nil (funcall f path arg) (wrong-number-of-arguments
(funcall f path)))))))
(cond ((equal type '"file") (let nil (let* ((option (org-element--property
:search-option link nil nil)) (path (if option (concat path "::" option)
path))) (org-link-open-as-file path (let* ((val ...)) (cond (arg ...) (... ...)
(... ...))))))) ((member type '("radio" "fuzzy" "custom-id" "coderef")) (let
nil (if (run-hook-with-args-until-success 'org-open-link-functions path) nil
(if (not arg) (org-mark-ring-push) (switch-to-buffer-other-window
(org-link--buffer-for-internals))) (let ((destination (save-excursion ...)))
(if (and (<= ... destination) (>= ... destination)) nil (widen)) (goto-char
destination))))) (t (let nil (let ((f (org-link-get-parameter type :follow)))
(if (functionp f) (progn (condition-case nil (funcall f path arg)
(wrong-number-of-arguments ...))))))))
(let ((type (org-element--property :type link nil nil)) (path
(org-element--property :path link nil nil))) (cond ((equal type '"file") (let
nil (let* ((option (org-element--property :search-option link nil nil)) (path
(if option ... path))) (org-link-open-as-file path (let* (...) (cond ... ...
...)))))) ((member type '("radio" "fuzzy" "custom-id" "coderef")) (let nil (if
(run-hook-with-args-until-success 'org-open-link-functions path) nil (if (not
arg) (org-mark-ring-push) (switch-to-buffer-other-window
(org-link--buffer-for-internals))) (let ((destination ...)) (if (and ... ...)
nil (widen)) (goto-char destination))))) (t (let nil (let ((f
(org-link-get-parameter type :follow))) (if (functionp f) (progn
(condition-case nil ... ...))))))))
org-link-open((link (:standard-properties [42406 nil 42453 42538 42540 0 nil
nil nil nil nil nil nil nil #<buffer emacs.org> nil nil (paragraph
(:standard-properties [42396 42396 42396 42541 42541 0 nil nil element t nil
nil nil nil #<buffer emacs.org> nil nil (item ...)]))] :type "gnus"
:type-explicit-p t :path "nnimap+thaodan.de:Sent#871pxrjqne.fsf@" :format
bracket :raw-link "gnus:nnimap+thaodan.de:Sent#871pxrjqne.fsf@" :application
nil :search-option nil)) nil)
(cond ((not type) (user-error "No link found")) ((memq type '(comment
comment-block node-property keyword)) (call-interactively
#'org-open-at-point-global)) ((memq type '(headline inlinetask))
(org-match-line org-complex-heading-regexp) (let ((tags-beg (match-beginning
5)) (tags-end (match-end 5))) (if (and tags-beg (>= (point) tags-beg) (<
(point) tags-end)) (org-tags-view arg (save-excursion (let* (... ...)
(buffer-substring ... ...)))) (let* ((val (org-offer-links-in-entry ... ...
arg))) (if (consp val) (let* (...) (if ... ... ...))))))) ((or (eq type
'footnote-reference) (and (eq type 'footnote-definition) (save-excursion
(skip-chars-forward " \11") (let ((begin ...)) (if begin (< ... begin) (= ...
...)))))) (org-footnote-action)) ((and (eq type 'planning) (org-in-regexp
org-ts-regexp-both nil t)) (org-follow-timestamp-link)) ((and (eq type 'clock)
value (>= (point) (org-element-begin value)) (<= (point) (org-element-end
value))) (org-follow-timestamp-link)) ((eq type 'src-block)
(org-babel-open-src-block-result)) ((>= (point) (save-excursion (goto-char
(org-element-end context)) (skip-chars-backward " \11") (point))) (user-error
"No link found")) ((eq type 'inline-src-block)
(org-babel-open-src-block-result)) ((eq type 'timestamp)
(org-follow-timestamp-link)) ((eq type 'link) (org-link-open context arg))
((memq type '(citation citation-reference)) (org-cite-follow context arg)) (t
(user-error "No link found")))
(let* ((context (org-element-lineage (org-element-context) '(citation
citation-reference clock comment comment-block footnote-definition
footnote-reference headline inline-src-block inlinetask keyword link
node-property planning src-block timestamp) t)) (type (org-element-type
context)) (value (org-element--property :value context nil nil))) (cond ((not
type) (user-error "No link found")) ((memq type '(comment comment-block
node-property keyword)) (call-interactively #'org-open-at-point-global)) ((memq
type '(headline inlinetask)) (org-match-line org-complex-heading-regexp) (let
((tags-beg (match-beginning 5)) (tags-end (match-end 5))) (if (and tags-beg (>=
(point) tags-beg) (< (point) tags-end)) (org-tags-view arg (save-excursion
(let* ... ...))) (let* ((val ...)) (if (consp val) (let* ... ...)))))) ((or (eq
type 'footnote-reference) (and (eq type 'footnote-definition) (save-excursion
(skip-chars-forward " \11") (let (...) (if begin ... ...)))))
(org-footnote-action)) ((and (eq type 'planning) (org-in-regexp
org-ts-regexp-both nil t)) (org-follow-timestamp-link)) ((and (eq type 'clock)
value (>= (point) (org-element-begin value)) (<= (point) (org-element-end
value))) (org-follow-timestamp-link)) ((eq type 'src-block)
(org-babel-open-src-block-result)) ((>= (point) (save-excursion (goto-char
(org-element-end context)) (skip-chars-backward " \11") (point))) (user-error
"No link found")) ((eq type 'inline-src-block)
(org-babel-open-src-block-result)) ((eq type 'timestamp)
(org-follow-timestamp-link)) ((eq type 'link) (org-link-open context arg))
((memq type '(citation citation-reference)) (org-cite-follow context arg)) (t
(user-error "No link found"))))
(if (run-hook-with-args-until-success 'org-open-at-point-functions) nil (let*
((context (org-element-lineage (org-element-context) '(citation
citation-reference clock comment comment-block footnote-definition
footnote-reference headline inline-src-block inlinetask keyword link
node-property planning src-block timestamp) t)) (type (org-element-type
context)) (value (org-element--property :value context nil nil))) (cond ((not
type) (user-error "No link found")) ((memq type '(comment comment-block
node-property keyword)) (call-interactively #'org-open-at-point-global)) ((memq
type '(headline inlinetask)) (org-match-line org-complex-heading-regexp) (let
((tags-beg (match-beginning 5)) (tags-end (match-end 5))) (if (and tags-beg (>=
... tags-beg) (< ... tags-end)) (org-tags-view arg (save-excursion ...)) (let*
(...) (if ... ...))))) ((or (eq type 'footnote-reference) (and (eq type
'footnote-definition) (save-excursion (skip-chars-forward " \11") (let ...
...)))) (org-footnote-action)) ((and (eq type 'planning) (org-in-regexp
org-ts-regexp-both nil t)) (org-follow-timestamp-link)) ((and (eq type 'clock)
value (>= (point) (org-element-begin value)) (<= (point) (org-element-end
value))) (org-follow-timestamp-link)) ((eq type 'src-block)
(org-babel-open-src-block-result)) ((>= (point) (save-excursion (goto-char
(org-element-end context)) (skip-chars-backward " \11") (point))) (user-error
"No link found")) ((eq type 'inline-src-block)
(org-babel-open-src-block-result)) ((eq type 'timestamp)
(org-follow-timestamp-link)) ((eq type 'link) (org-link-open context arg))
((memq type '(citation citation-reference)) (org-cite-follow context arg)) (t
(user-error "No link found")))))
org-open-at-point()
(let ((warning-suppress-types (cons '(org-element org-element-parser)
warning-suppress-types))) (org-open-at-point))
org-open-at-mouse((mouse-2 (#<window 14035 on emacs.org> 42477 (524 . 1069)
2228637244 nil 42477 (43 . 34) nil (8 . 5) (12 . 26))))
funcall-interactively(org-open-at-mouse (mouse-2 (#<window 14035 on emacs.org>
42477 (524 . 1069) 2228637244 nil 42477 (43 . 34) nil (8 . 5) (12 . 26))))
command-execute(org-open-at-mouse)
- [BUG] org-gnus-follow-link tries to select dead frame [9.8-pre (release_9.7.15-163-g3ff21c.dirty @ /home/bidar/.local/etc/emacs/lib/org/lisp/)],
Björn Bidar <=