mirror of
https://github.com/vale981/ement.el
synced 2025-03-04 17:01:39 -05:00
Change: Track room buffers in local slot
This commit is contained in:
parent
37d3ea8202
commit
97f75535fd
3 changed files with 35 additions and 26 deletions
|
@ -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."
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
8
ement.el
8
ement.el
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue