vlc | branch: master | Marvin Scholz <[email protected]> | Fri Sep  8 03:00:08 
2017 +0200| [7576e56f0e4d120783fc126ef87f5375da20c563] | committer: Marvin 
Scholz

macosx: Fix filtering of log messages

Changes through the array controller are for the arrangedObjects, which
is the result of filtering and sorting.

Therefore we need to change the backing array. It is actually fine to do
that (contrary to my previous statement), as long as we behave correctly
and immediately send the appropriate KVO messages. Thats is why the
previous approach with just calling rearrangeObjects at some later point
after modifying the backing array would not work.

A big thanks to the AppKit Abusers Slack group, they provided a lot of
help to solve this.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7576e56f0e4d120783fc126ef87f5375da20c563
---

 modules/gui/macosx/VLCLogWindowController.m | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/modules/gui/macosx/VLCLogWindowController.m 
b/modules/gui/macosx/VLCLogWindowController.m
index 22d5c54162..34590d1e43 100644
--- a/modules/gui/macosx/VLCLogWindowController.m
+++ b/modules/gui/macosx/VLCLogWindowController.m
@@ -322,26 +322,31 @@ static void MsgCallback(void *data, int type, const 
vlc_log_t *item, const char
 }
 
 /**
- Clears all messages in the message table by removing all items from the 
arrayController
+ Clears all messages in the message table by removing all items from the 
messagesArray
  */
 - (void)clearMessageTable
 {
-    NSRange range = NSMakeRange(0, [[_arrayController arrangedObjects] count]);
-    [_arrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet 
indexSetWithIndexesInRange:range]];
-}
+    [self willChangeValueForKey:@"messagesArray"];
+    [_messagesArray removeAllObjects];
+    [self didChangeValueForKey:@"messagesArray"];}
 
 /**
- Appends all messages from the buffer to the arrayController and clears the 
buffer
+ Appends all messages from the buffer to the messagesArray and clears the 
buffer
  */
 - (void)appendMessageBuffer
 {
-    if ([_messagesArray count] > 1000000) {
-        [_messagesArray removeObjectsInRange:NSMakeRange(0, 2)];
-    }
+    static const NSUInteger limit = 1000000;
+
+    [self willChangeValueForKey:@"messagesArray"];
     @synchronized (_messageBuffer) {
-        [_arrayController addObjects:_messageBuffer];
+        [_messagesArray addObjectsFromArray:_messageBuffer];
         [_messageBuffer removeAllObjects];
     }
+
+    if ([_messagesArray count] > limit) {
+        [_messagesArray removeObjectsInRange:NSMakeRange(0, 
_messagesArray.count - limit)];
+    }
+    [self didChangeValueForKey:@"messagesArray"];
 }
 
 @end

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to