emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/ement b07b7c0da1 3/4: Change/Fix: (ement-room-read-rece


From: ELPA Syncer
Subject: [elpa] externals/ement b07b7c0da1 3/4: Change/Fix: (ement-room-read-receipt-timer) When read receipt is unseen
Date: Fri, 9 Sep 2022 17:57:44 -0400 (EDT)

branch: externals/ement
commit b07b7c0da16d8b915865b5e04a32d87a715e2df7
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>

    Change/Fix: (ement-room-read-receipt-timer) When read receipt is unseen
    
    - Move function called by timer to a named function.
    
    - Send read receipt even if its position is outside the range of
    retrieved events.  Otherwise, it could be so far back that it never
    gets updated, which doesn't seem useful.  The fully-read marker
    remains unmoved until the user gets to the end of the room's events
    and marks them all as read, which seems right and useful.
---
 README.org    |  1 +
 ement-room.el | 46 +++++++++++++++++++++++++++-------------------
 2 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/README.org b/README.org
index 3a005c1700..50be3eff6a 100644
--- a/README.org
+++ b/README.org
@@ -274,6 +274,7 @@ Note that, while ~matrix-client~ remains usable, and 
probably will for some time
 
 *Fixed*
 + Read receipt-sending function was called too many times when scrolling.
++ Send read receipts even when the last receipt is outside the range of 
retrieved events.
 
 ** 0.1.2
 
diff --git a/ement-room.el b/ement-room.el
index 5a142d31fc..a0c2bcb515 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -2452,25 +2452,33 @@ WINDOW's end is beyond the marker.  For use in
       (let ((room-buffer (window-buffer window)))
         (setf ement-room-read-receipt-timer
               (run-with-idle-timer
-               3 nil (lambda ()
-                       (when (and (windowp window)
-                                  (eq (window-buffer window) room-buffer))
-                         (with-selected-window window
-                           (when-let ((read-receipt-node 
(ement-room--ewoc-last-matching ement-ewoc
-                                                           (lambda (node-data)
-                                                             (eq 
'ement-room-read-receipt-marker node-data)))))
-                             ;; The read-receipt marker is visible (i.e. it's 
not between
-                             ;; earlier events which we have not retrieved).
-                             (when (> (window-end) (ewoc-location 
read-receipt-node))
-                               ;; The window's end has been scrolled past the 
position of the receipt marker.
-                               (when-let* ((window-end-node (or (ewoc-locate 
ement-ewoc (window-end))
-                                                                (ewoc-nth 
ement-ewoc -1)))
-                                           (event-node (cl-typecase (ewoc-data 
window-end-node)
-                                                         (ement-event 
window-end-node)
-                                                         (t 
(ement-room--ewoc-next-matching ement-ewoc window-end-node
-                                                              #'ement-event-p 
#'ewoc-prev)))))
-                                 (ement-room-mark-read ement-room ement-session
-                                   :read-event (ewoc-data 
event-node))))))))))))))
+               3 nil #'ement-room-read-receipt-timer window room-buffer))))))
+
+(defun ement-room-read-receipt-timer (window room-buffer)
+  "Send read receipt for WINDOW displaying ROOM-BUFFER.
+To be called by timer run by
+`ement-room-start-read-receipt-timer'."
+  (when (and (windowp window)
+             (eq (window-buffer window) room-buffer))
+    (with-selected-window window
+      (let ((read-receipt-node (ement-room--ewoc-last-matching ement-ewoc
+                                 (lambda (node-data)
+                                   (eq 'ement-room-read-receipt-marker 
node-data)))))
+        (when (or
+               ;; The window's end has been scrolled to or past the position 
of the
+               ;; receipt marker.
+               (and read-receipt-node
+                    (>= (window-end) (ewoc-location read-receipt-node)))
+               ;; The read receipt is outside of retrieved events.
+               (not read-receipt-node))
+          (when-let* ((window-end-node (or (ewoc-locate ement-ewoc 
(window-end))
+                                           (ewoc-nth ement-ewoc -1)))
+                      (event-node (cl-typecase (ewoc-data window-end-node)
+                                    (ement-event window-end-node)
+                                    (t (ement-room--ewoc-next-matching 
ement-ewoc window-end-node
+                                         #'ement-event-p #'ewoc-prev)))))
+            (ement-room-mark-read ement-room ement-session
+              :read-event (ewoc-data event-node))))))))
 
 (defun ement-room-goto-fully-read-marker ()
   "Move to the fully-read marker in the current room."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]