branch: elpa/jabber
commit 1cf6fe0f285583e42be009b12d434b4ea2be3fb2
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>

    mam: Decouple sync-complete refresh via hook
---
 lisp/jabber-chatbuffer.el | 21 +++++++++++++++++++++
 lisp/jabber-mam.el        | 25 +++++++++++--------------
 2 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/lisp/jabber-chatbuffer.el b/lisp/jabber-chatbuffer.el
index 99b15813ed..72ac6510a2 100644
--- a/lisp/jabber-chatbuffer.el
+++ b/lisp/jabber-chatbuffer.el
@@ -430,6 +430,8 @@ EWOC-PP is the pretty-printer function for the message 
EWOC."
         (setq jabber-chat-encryption 'plaintext))))
   (jabber-chat-encryption--update-header))
 
+(declare-function jabber-chat-find-buffer "jabber-chat" (chat-with))
+(declare-function jabber-muc-find-buffer "jabber-muc" (group))
 (declare-function jabber-muc-sender-p "jabber-muc" (jid))
 (declare-function jabber-db-backlog "jabber-db"
                   (account peer &optional count start-time resource msg-type))
@@ -601,6 +603,25 @@ or nil if the message was a duplicate."
                     jabber-connections)
         (kill-buffer buf)))))
 
+;;; MAM hook listeners
+
+(defvar jabber-mam-sync-complete-functions)  ; jabber-mam.el
+
+(defun jabber-chat--handle-mam-sync-complete (peers)
+  "Refresh chat buffers that received MAM messages.
+PEERS is a list of (PEER . TYPE) pairs."
+  (dolist (entry peers)
+    (let* ((peer (car entry))
+           (type (cdr entry))
+           (buffer (if (string= type "groupchat")
+                       (jabber-muc-find-buffer peer)
+                     (jabber-chat-find-buffer peer))))
+      (when (and buffer (buffer-live-p buffer))
+        (with-current-buffer buffer
+          (jabber-chat-buffer-refresh))))))
+
+(add-hook 'jabber-mam-sync-complete-functions 
#'jabber-chat--handle-mam-sync-complete)
+
 (with-eval-after-load "jabber-core"
   (add-hook 'jabber-post-disconnect-hook #'jabber-chatbuffer--kill-stale))
 
diff --git a/lisp/jabber-mam.el b/lisp/jabber-mam.el
index 2b97f4f88b..cf24542197 100644
--- a/lisp/jabber-mam.el
+++ b/lisp/jabber-mam.el
@@ -58,7 +58,6 @@
 (declare-function jabber-db-ensure-open "jabber-db" ())
 (declare-function jabber-chat--decrypt-if-needed "jabber-chat" (jc xml-data))
 (declare-function jabber-chat-find-buffer "jabber-chat" (chat-with))
-(declare-function jabber-chat-buffer-refresh "jabber-chatbuffer" ())
 (declare-function jabber-muc-find-buffer "jabber-muc" (group))
 (declare-function jabber-parse-time "jabber-util" (raw-time))
 (declare-function jabber-message-correct--replace-id "jabber-message-correct"
@@ -108,6 +107,12 @@ Set to nil to fetch the entire archive."
   :type '(choice integer (const :tag "Fetch all" nil))
   :group 'jabber)
 
+;;; Hooks
+
+(defvar jabber-mam-sync-complete-functions nil
+  "Hook run after MAM stores messages for one or more peers.
+Each function receives one argument: a list of (PEER . TYPE) pairs.")
+
 ;;; Internal state
 
 (defvar jabber-mam--syncing nil
@@ -395,21 +400,13 @@ TYPE is \"groupchat\" for MUC or \"chat\" for 1:1."
       (force-mode-line-update))))
 
 (defun jabber-mam--redraw-dirty ()
-  "Refresh all chat buffers that received MAM messages during sync.
-Reloads each buffer's ewoc from the database in place.
-Does NOT manage `jabber-chat-mam-syncing'; that flag is controlled
-by per-query completion callbacks registered in the catch-up functions."
+  "Signal that accumulated dirty peers need display refresh.
+Drains `jabber-mam--dirty-peers' and runs
+`jabber-mam-sync-complete-functions'."
   (let ((peers (prog1 jabber-mam--dirty-peers
                  (setq jabber-mam--dirty-peers nil))))
-    (dolist (entry peers)
-      (let* ((peer (car entry))
-             (type (cdr entry))
-             (buffer (if (string= type "groupchat")
-                         (jabber-muc-find-buffer peer)
-                       (jabber-chat-find-buffer peer))))
-        (when (and buffer (buffer-live-p buffer))
-          (with-current-buffer buffer
-            (jabber-chat-buffer-refresh)))))))
+    (when peers
+      (run-hook-with-args 'jabber-mam-sync-complete-functions peers))))
 
 ;;; Shared transaction management
 

Reply via email to