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