[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/ement d0cc4862ce 3/4: Merge: Limit number of coalesced
From: |
ELPA Syncer |
Subject: |
[elpa] externals/ement d0cc4862ce 3/4: Merge: Limit number of coalesced membership events |
Date: |
Sun, 7 Jul 2024 21:58:06 -0400 (EDT) |
branch: externals/ement
commit d0cc4862cef09b6a387b9f18428301d4ce0195b6
Merge: 9f6cbb8b40 81f35091ec
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Merge: Limit number of coalesced membership events
Fixes #282.
---
README.org | 4 +++-
ement-room.el | 52 +++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/README.org b/README.org
index d88a63c40e..a65d0a068f 100644
--- a/README.org
+++ b/README.org
@@ -299,7 +299,9 @@ Ement.el doesn't support encrypted rooms natively, but it
can be used transparen
** 0.16-pre
-Nothing new yet.
+*Changes*
+
++ Option ~ement-room-coalesce-events~ may now be set to (and defaults to) a
maximum number of events to coalesce together. (This avoids potential
performance problems in rare cases. See
[[https://github.com/alphapapa/ement.el/issues/247][#247]]. Thanks to
[[https://github.com/viiru-][Arto Jantunen]] for reporting and
[[https://github.com/sergiodj][Sergio Durigan Junior]] for testing.)
** 0.15.1
diff --git a/ement-room.el b/ement-room.el
index e512befaa1..4b79137626 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -421,12 +421,26 @@ this one automatically.")
"Maximum height in pixels of room avatars shown in header lines."
:type 'integer)
-(defcustom ement-room-coalesce-events t
+(defcustom ement-room-coalesce-events 100
"Coalesce certain events in room buffers.
For example, membership events can be overwhelming in large
rooms, especially ones bridged to IRC. This option groups them
-together so they take less space."
- :type 'boolean)
+together so they take less space.
+
+The current, naïve implementation re-renders events as they are
+coalesced, which can cause a performance problem in unusual
+circumstances, so the number of events coalesced into a single,
+rendered event may be limited."
+ :type '(choice (integer :tag "Up to this many events")
+ (const :tag "An unlimited number of events"
+ ;; NOTE: As this docstring says, in most cases it
should be fine,
+ ;; but since in those rare cases the problem can be
unusually bad
+ ;; (e.g. taking 15 minutes to render a room's events in
+ ;;
<https://github.com/alphapapa/ement.el/issues/247>), we default
+ ;; to a safer choice.
+ :doc "Note that this choice may cause performance
problems in rooms with very large numbers of consecutive membership events, but
in most cases it should be fine."
+ t)
+ (const :tag "Don't coalesce" nil)))
(defcustom ement-room-header-line-format
;; TODO: Show in new screenshots.
@@ -3607,6 +3621,10 @@ the first and last nodes in the buffer, respectively."
(defun ement-room--coalesce-nodes (a b ewoc)
"Try to coalesce events in nodes A and B in EWOC.
Return absorbing node if coalesced."
+ ;; NOTE: This does not coalesce two `ement-room-membership-events' nodes; it
only
+ ;; coalesces an individual membership event into another one or into an
+ ;; `ement-room-membership-events' node.
+ ;; TODO: Allow two `ement-room-membership-events' nodes to be coalesced.
(cl-labels ((coalescable-p (node)
(or (and (ement-event-p (ewoc-data node))
(member (ement-event-type (ewoc-data node))
'("m.room.member")))
@@ -3616,16 +3634,24 @@ Return absorbing node if coalesced."
(not (ement-room-membership-events-p
(ewoc-data b))))
a b))
(absorbed-node (if (eq absorbing-node a) b a)))
- (cl-etypecase (ewoc-data absorbing-node)
- (ement-room-membership-events nil)
- (ement-event (setf (ewoc-data absorbing-node)
(ement-room-membership-events--update
-
(make-ement-room-membership-events
- :events (list
(ewoc-data absorbing-node)))))))
- (push (ewoc-data absorbed-node) (ement-room-membership-events-events
(ewoc-data absorbing-node)))
- (ement-room-membership-events--update (ewoc-data absorbing-node))
- (ewoc-delete ewoc absorbed-node)
- (ewoc-invalidate ewoc absorbing-node)
- absorbing-node))))
+ (when (cl-etypecase (ewoc-data absorbing-node)
+ (ement-room-membership-events
+ (pcase-exhaustive ement-room-coalesce-events
+ ((pred integerp)
+ (< (length (ement-room-membership-events-events (ewoc-data
absorbing-node)))
+ ement-room-coalesce-events))
+ (`t t)))
+ (ement-event
+ (setf (ewoc-data absorbing-node)
+ (ement-room-membership-events--update
+ (make-ement-room-membership-events
+ :events (list (ewoc-data absorbing-node)))))))
+ (push (ewoc-data absorbed-node)
+ (ement-room-membership-events-events (ewoc-data
absorbing-node)))
+ (ement-room-membership-events--update (ewoc-data absorbing-node))
+ (ewoc-delete ewoc absorbed-node)
+ (ewoc-invalidate ewoc absorbing-node)
+ absorbing-node)))))
(defun ement-room--insert-event (event)
"Insert EVENT into current buffer."