From f3dda5ba2c01227ce3837fc524640977b61c92e8 Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Tue, 14 Oct 2008 16:50:02 +0200 Subject: [PATCH] Fix infinite loop when rescheduling from agenda with tags filtering. --- lisp/org-agenda.el | 17 ++++++++- lisp/org-compat.el | 94 +++++++++++++++++++++++----------------------- 2 files changed, 62 insertions(+), 49 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 3a244302e..6324130e0 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -4128,7 +4128,7 @@ With prefix argument STRIP, remove all lines that do have the tag." org-tag-alist-for-agenda "")) (setq char (read-char)) (when (equal char ?\t) - (unless (local-variable-p 'org-global-tags-completion-table) + (unless (local-variable-p 'org-global-tags-completion-table (current-buffer)) (org-set-local 'org-global-tags-completion-table (org-global-tags-completion-table))) (let ((completion-ignore-case t)) @@ -4168,6 +4168,17 @@ With prefix argument STRIP, remove all lines that do have the tag." (org-overlay-put ov 'type 'tags-filter) (push ov org-agenda-filter-overlays))) +(defun org-agenda-fix-tags-filter-overlays-at (&optional pos) + (setq pos (or pos (point))) + (save-excursion + (dolist (ov (org-overlays-at pos)) + (when (and (org-overlay-get ov 'invisible) + (eq (org-overlay-get ov 'type) 'tags-filter)) + (goto-char pos) + (if (< (org-overlay-start ov) (point-at-eol)) + (org-move-overlay ov (point-at-eol) + (org-overlay-end ov))))))) + (defun org-agenda-filter-by-tag-show-all () (mapc 'org-delete-overlay org-agenda-filter-overlays) (setq org-agenda-filter-overlays nil)) @@ -5002,13 +5013,15 @@ the same tree node, and the headline of the tree node in the Org-mode file." (defun org-agenda-show-new-time (marker stamp &optional prefix) "Show new date stamp via text properties." ;; We use text properties to make this undoable - (let ((inhibit-read-only t)) + (let ((inhibit-read-only t) + (buffer-invisibility-spec)) (setq stamp (concat " " prefix " => " stamp)) (save-excursion (goto-char (point-max)) (while (not (bobp)) (when (equal marker (get-text-property (point) 'org-marker)) (org-move-to-column (- (window-width) (length stamp)) t) + (org-agenda-fix-tags-filter-overlays-at (point)) (if (featurep 'xemacs) ;; Use `duplicable' property to trigger undo recording (let ((ex (make-extent nil nil)) diff --git a/lisp/org-compat.el b/lisp/org-compat.el index 22348e5f1..4c9f117bf 100644 --- a/lisp/org-compat.el +++ b/lisp/org-compat.el @@ -176,7 +176,7 @@ that can be added." ((fboundp 'add-to-invisibility-spec) (add-to-invisibility-spec arg)) ((or (null buffer-invisibility-spec) (eq buffer-invisibility-spec t)) - (setq buffer-invisibility-spec (list arg))) + (setq buffer-invisibility-spec (list arg))) (t (setq buffer-invisibility-spec (cons arg buffer-invisibility-spec))))) @@ -197,56 +197,56 @@ that can be added." (defun org-indent-to-column (column &optional minimum buffer) "Work around a bug with extents with invisibility in XEmacs." - (if (featurep 'xemacs) - (let ((ext-inv (extent-list - nil (point-at-bol) (point-at-eol) - 'all-extents-closed-open 'invisible)) - ext-inv-specs) - (dolist (ext ext-inv) - (when (extent-property ext 'invisible) - (add-to-list 'ext-inv-specs (list ext (extent-property - ext 'invisible))) - (set-extent-property ext 'invisible nil))) - (indent-to-column column minimum buffer) - (dolist (ext-inv-spec ext-inv-specs) - (set-extent-property (car ext-inv-spec) 'invisible - (cadr ext-inv-spec)))) - (indent-to-column column minimum))) + (if (featurep 'xemacs) + (let ((ext-inv (extent-list + nil (point-at-bol) (point-at-eol) + 'all-extents-closed-open 'invisible)) + ext-inv-specs) + (dolist (ext ext-inv) + (when (extent-property ext 'invisible) + (add-to-list 'ext-inv-specs (list ext (extent-property + ext 'invisible))) + (set-extent-property ext 'invisible nil))) + (indent-to-column column minimum buffer) + (dolist (ext-inv-spec ext-inv-specs) + (set-extent-property (car ext-inv-spec) 'invisible + (cadr ext-inv-spec)))) + (indent-to-column column minimum))) (defun org-indent-line-to (column) "Work around a bug with extents with invisibility in XEmacs." - (if (featurep 'xemacs) - (let ((ext-inv (extent-list - nil (point-at-bol) (point-at-eol) - 'all-extents-closed-open 'invisible)) - ext-inv-specs) - (dolist (ext ext-inv) - (when (extent-property ext 'invisible) - (add-to-list 'ext-inv-specs (list ext (extent-property - ext 'invisible))) - (set-extent-property ext 'invisible nil))) - (indent-line-to column) - (dolist (ext-inv-spec ext-inv-specs) - (set-extent-property (car ext-inv-spec) 'invisible - (cadr ext-inv-spec)))) - (indent-line-to column))) + (if (featurep 'xemacs) + (let ((ext-inv (extent-list + nil (point-at-bol) (point-at-eol) + 'all-extents-closed-open 'invisible)) + ext-inv-specs) + (dolist (ext ext-inv) + (when (extent-property ext 'invisible) + (add-to-list 'ext-inv-specs (list ext (extent-property + ext 'invisible))) + (set-extent-property ext 'invisible nil))) + (indent-line-to column) + (dolist (ext-inv-spec ext-inv-specs) + (set-extent-property (car ext-inv-spec) 'invisible + (cadr ext-inv-spec)))) + (indent-line-to column))) (defun org-move-to-column (column &optional force buffer) - (if (featurep 'xemacs) - (let ((ext-inv (extent-list - nil (point-at-bol) (point-at-eol) - 'all-extents-closed-open 'invisible)) - ext-inv-specs) - (dolist (ext ext-inv) - (when (extent-property ext 'invisible) - (add-to-list 'ext-inv-specs (list ext (extent-property ext - 'invisible))) - (set-extent-property ext 'invisible nil))) - (move-to-column column force buffer) - (dolist (ext-inv-spec ext-inv-specs) - (set-extent-property (car ext-inv-spec) 'invisible - (cadr ext-inv-spec)))) - (move-to-column column force))) + (if (featurep 'xemacs) + (let ((ext-inv (extent-list + nil (point-at-bol) (point-at-eol) + 'all-extents-closed-open 'invisible)) + ext-inv-specs) + (dolist (ext ext-inv) + (when (extent-property ext 'invisible) + (add-to-list 'ext-inv-specs (list ext (extent-property ext + 'invisible))) + (set-extent-property ext 'invisible nil))) + (move-to-column column force buffer) + (dolist (ext-inv-spec ext-inv-specs) + (set-extent-property (car ext-inv-spec) 'invisible + (cadr ext-inv-spec)))) + (move-to-column column force))) (defun org-get-x-clipboard-compat (value) "Get the clipboard value on XEmacs or Emacs 21" @@ -263,7 +263,7 @@ that can be added." (if (featurep 'xemacs) (add-text-properties 0 (length string) properties string) (apply 'propertize string properties))) - + (provide 'org-compat) ;; arch-tag: a0a0579f-e68c-4bdf-9e55-93768b846bbe