Change: Track room buffers in local slot

This commit is contained in:
Adam Porter 2021-07-21 14:08:58 -05:00
parent 37d3ea8202
commit 97f75535fd
3 changed files with 35 additions and 26 deletions

View file

@ -440,27 +440,34 @@ and erases the buffer."
ement-ewoc (ewoc-create #'ement-room--pp-thing)))
(defun ement-room--buffer (session room name)
"Return a buffer named NAME showing ROOM's events on SESSION."
(let ((existing-buffer (get-buffer name)))
(if (and existing-buffer
(eq room (buffer-local-value 'ement-room existing-buffer)))
existing-buffer
(with-current-buffer (get-buffer-create name)
(ement-room-mode)
;; FIXME: Move visual-line-mode to a hook.
(visual-line-mode 1)
(setf ement-session session
ement-room room)
;; We don't use `ement-room--insert-events' to avoid extra
;; calls to `ement-room--insert-ts-headers'.
(mapc #'ement-room--insert-event (ement-room-timeline room))
(mapc #'ement-room--insert-event (ement-room-timeline* room))
(ement-room--insert-ts-headers)
;; Move new events to main list.
(setf (ement-room-timeline room) (append (ement-room-timeline* room) (ement-room-timeline room))
(ement-room-timeline* room) nil)
;; Return the buffer!
(current-buffer)))))
"Return buffer named NAME showing ROOM's events on SESSION.
If ROOM has no buffer, one is made and stored in the room's local
data slot."
(or (map-elt (ement-room-local room) 'buffer)
(let ((new-buffer (get-buffer-create name)))
(with-current-buffer new-buffer
(ement-room-mode)
;; FIXME: Move visual-line-mode to a hook.
(visual-line-mode 1)
(setf ement-session session
ement-room room)
;; We don't use `ement-room--insert-events' to avoid extra
;; calls to `ement-room--insert-ts-headers'.
(mapc #'ement-room--insert-event (ement-room-timeline room))
(mapc #'ement-room--insert-event (ement-room-timeline* room))
(ement-room--insert-ts-headers)
;; Move new events to main list.
(setf (ement-room-timeline room) (append (ement-room-timeline* room) (ement-room-timeline room))
(ement-room-timeline* room) nil)
;; Track buffer in room's slot.
(setf (map-elt (ement-room-local ement-room) 'buffer) (current-buffer))
(add-hook 'kill-buffer-hook
(lambda ()
(setf (map-elt (ement-room-local ement-room) 'buffer) nil))
nil 'local))
(setf (map-elt (ement-room-local room) 'buffer) new-buffer)
;; Return the buffer! (in case a map-elt issue doesn't return the value from setf, I think a bug was filed about it...)
new-buffer)))
(defun ement-room--user-display-name (user room)
"Return the displayname for USER in ROOM."

View file

@ -53,7 +53,9 @@
(cl-defstruct ement-room
id display-name prev-batch
summary state timeline timeline* ephemeral account-data unread-notifications
latest-ts topic canonical-alias)
latest-ts topic canonical-alias
;; The local slot is an alist used by the local client only.
local)
;;;; Variables

View file

@ -361,14 +361,14 @@ Runs `ement-sync-callback-hook' with SESSION."
(when ement-auto-sync
(ement--sync session)))
(defun ement--update-room-buffers (&rest _)
(defun ement--update-room-buffers (session)
"Insert new events into rooms which have buffers.
To be called in `ement-sync-callback-hook'."
;; For now, we primitively iterate over the buffer list to find ones
;; whose mode is `ement-room-mode'.
(let* ((buffers (cl-loop for buffer being the buffers
when (eq 'ement-room-mode (buffer-local-value 'major-mode buffer))
collect buffer)))
(let* ((buffers (cl-loop for room in (ement-session-rooms session)
when (map-elt (ement-room-local room) 'buffer)
collect it)))
(dolist (buffer buffers)
(with-current-buffer buffer
(cl-assert ement-room)