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
