emacs-elpa-diffs
[Top][All Lists]
Advanced

[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."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]