0
0
Fork 1
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-09-29 18:36:26 +00:00

Prevent infinite loop when showing new time in agenda

* lisp/org-agenda.el (org-agenda-dim-blocked-tasks): Don't use
an overlay to make the task invisible, use text properties.
(org-agenda--mark-blocked-entry): Add text property
'org-filter-type to later use `org-agenda-filter-hide-line' if
necessary.
(org-agenda-filter-hide-line): Fix docstring.

The related bug was first reported in 2013 by Matt Lundin here:
https://lists.gnu.org/archive/html/emacs-orgmode/2013-08/msg00072.html

Then Andrew Hyatt reported it again, and provided a minimal recipe on
how to reproduce it consistently.

Thanks a lot to both of them.
This commit is contained in:
Bastien 2020-02-14 10:32:35 +01:00
parent 29f44df758
commit 27e4d7ce48

View file

@ -4003,7 +4003,7 @@ dimming them."
(when (called-interactively-p 'interactive)
(message "Dim or hide blocked tasks..."))
(dolist (o (overlays-in (point-min) (point-max)))
(when (eq (overlay-get o 'org-type) 'org-blocked-todo)
(when (eq (overlay-get o 'face) 'org-agenda-dimmed-todo-face)
(delete-overlay o)))
(save-excursion
(let ((inhibit-read-only t))
@ -4011,22 +4011,26 @@ dimming them."
(while (let ((pos (text-property-not-all
(point) (point-max) 'org-todo-blocked nil)))
(when pos (goto-char pos)))
(let* ((invisible (eq (org-get-at-bol 'org-todo-blocked) 'invisible))
(let* ((invisible
(eq (org-get-at-bol 'org-todo-blocked) 'invisible))
(todo-blocked
(eq (org-get-at-bol 'org-filter-type) 'todo-blocked))
(ov (make-overlay (if invisible
(line-end-position 0)
(line-beginning-position))
(line-end-position))))
(if invisible
(overlay-put ov 'invisible t)
(when todo-blocked
(overlay-put ov 'face 'org-agenda-dimmed-todo-face))
(overlay-put ov 'org-type 'org-blocked-todo))
(forward-line))))
(when invisible
(org-agenda-filter-hide-line 'todo-blocked)))
(move-beginning-of-line 2))))
(when (called-interactively-p 'interactive)
(message "Dim or hide blocked tasks...done")))
(defun org-agenda--mark-blocked-entry (entry)
"For ENTRY a string with the text property `org-hd-marker', if
the header at `org-hd-marker' is blocked according to
"If ENTRY is blocked, mark it for fontification or invisibility.
If the header at `org-hd-marker' is blocked according to
`org-entry-blocked-p', then if `org-agenda-dim-blocked-tasks' is
'invisible and the header is not blocked by checkboxes, set the
text property `org-todo-blocked' to `invisible', otherwise set it
@ -4050,7 +4054,9 @@ to t."
(put-text-property
0 (length entry) 'org-todo-blocked
(if really-invisible 'invisible t)
entry)))))))
entry)
(put-text-property
0 (length entry) 'org-filter-type 'todo-blocked entry)))))))
entry)
(defvar org-agenda-skip-function nil
@ -8064,13 +8070,13 @@ tags in the FILTER if any of the tags in FILTER are grouptags."
org-agenda-filtered-by-top-headline t))
(defun org-agenda-filter-hide-line (type)
"Hide lines with TYPE in the agenda buffer."
"If current line is TYPE, hide it in the agenda buffer."
(let* (buffer-invisibility-spec
(b (max (point-min) (1- (point-at-bol))))
(e (point-at-eol)))
(beg (max (point-min) (1- (point-at-bol))))
(end (point-at-eol)))
(let ((inhibit-read-only t))
(add-text-properties
b e `(invisible org-filtered org-filter-type ,type)))))
beg end `(invisible org-filtered org-filter-type ,type)))))
(defun org-agenda-remove-filter (type)
(interactive)