summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorbramadams <yasser.araf@belgacom.net>2025-12-28 22:43:47 -0500
committerGitHub <noreply@github.com>2025-12-29 09:13:47 +0530
commit4c634387bafee20407de67f0d11eb6c4a225cca9 (patch)
treeeb60c9d3dcd0c0caf55ce6e0d824295f680ca9ff /lisp
parent1ad2b7511a98d77f9d1ad8d25be8dd4c9f48f97a (diff)
fix(pdf-annot): refresh stale annotations before operations
Fix "epdfinfo: No such annotation: annot-X-Y" error caused by annotations getting out-of-sync between buffer and epdfinfo cache. Add pdf-annot--ensure-fresh function that fetches fresh annotation data from the server before modifying, deleting, or interacting with annotations. Fixes: #246 Closes: #260 Author: @bramadams
Diffstat (limited to 'lisp')
-rw-r--r--lisp/pdf-annot.el14
1 files changed, 14 insertions, 0 deletions
diff --git a/lisp/pdf-annot.el b/lisp/pdf-annot.el
index 7c63dd2..0abad53 100644
--- a/lisp/pdf-annot.el
+++ b/lisp/pdf-annot.el
@@ -479,6 +479,7 @@ Signals an error, if PROPERTY is not modifiable.
Returns the modified annotation."
(declare (indent 2))
+ (setq a (pdf-annot--ensure-fresh a))
(unless (equal value (pdf-annot-get a property))
(unless (pdf-annot-property-modifiable-p a property)
(error "Property `%s' is read-only for this annotation"
@@ -558,6 +559,15 @@ have identical id properties."
"Return id property of annotation A."
(pdf-annot-get a 'id))
+(defun pdf-annot--ensure-fresh (a)
+ "Return a fresh version of annotation A from the server.
+If the annotation does not exist anymore, signal an error."
+ (let ((id (pdf-annot-get-id a)))
+ (or (cl-find id
+ (pdf-annot-getannots (pdf-annot-get a 'page) nil (pdf-annot-get-buffer a))
+ :key #'pdf-annot-get-id)
+ (user-error "No such annotation: %s" id))))
+
(defun pdf-annot-get-type (a)
"Return type property of annotation A."
(pdf-annot-get a 'type))
@@ -581,6 +591,7 @@ This function always returns nil."
(interactive
(list (pdf-annot-read-annotation
"Click on the annotation you wish to delete")))
+ (setq a (pdf-annot--ensure-fresh a))
(with-current-buffer (pdf-annot-get-buffer a)
(pdf-info-delannot
(pdf-annot-get-id a))
@@ -644,6 +655,7 @@ The DO-SAVE argument is given to
`pdf-info-getattachment-from-annot', which see."
(unless (pdf-annot-has-attachment-p a)
(error "Annotation has no data attached: %s" a))
+ (setq a (pdf-annot--ensure-fresh a))
(pdf-info-getattachment-from-annot
(pdf-annot-get-id a)
do-save
@@ -892,6 +904,7 @@ i.e. a non mouse-movement event is read."
(let* ((mpos (posn-object-x-y (event-start event)))
(a (or annot
(pdf-annot-at-position mpos))))
+ (setq a (pdf-annot--ensure-fresh a))
(unless a
(error "No annotation at this position: %s" mpos))
(let* ((apos (pdf-annot-image-position a))
@@ -1510,6 +1523,7 @@ At any given point of time, only one annotation can be in edit mode."
(not (eq a pdf-annot-edit-contents--annotation)))
(with-current-buffer pdf-annot-edit-contents--buffer
(pdf-annot-edit-contents-finalize 'ask)))
+ (setq a (pdf-annot--ensure-fresh a))
(unless (buffer-live-p pdf-annot-edit-contents--buffer)
(setq pdf-annot-edit-contents--buffer
(get-buffer-create