From 5d56e9039a4f6041da74556ec4e9f571e12da0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C5=93ur?= Date: Sun, 5 Nov 2023 21:35:22 +0100 Subject: [PATCH] fix: torrentTableView crash after superview.superview.superview (#6207) --- macosx/AboutWindowController.mm | 1 + macosx/AddMagnetWindowController.mm | 1 + macosx/AddWindowController.mm | 1 + macosx/Base.lproj/MainMenu.xib | 68 +++++++++++++------- macosx/BlocklistDownloaderViewController.mm | 1 + macosx/ColorTextField.mm | 2 + macosx/Controller.mm | 2 + macosx/CreatorWindowController.mm | 1 + macosx/FileOutlineController.mm | 1 + macosx/FileOutlineView.mm | 1 + macosx/FilterBarController.mm | 1 + macosx/FilterBarView.mm | 1 + macosx/GlobalOptionsPopoverViewController.mm | 1 + macosx/GroupsPrefsController.mm | 1 + macosx/InfoActivityViewController.mm | 1 + macosx/InfoFileViewController.mm | 1 + macosx/InfoOptionsViewController.mm | 1 + macosx/InfoPeersViewController.mm | 1 + macosx/InfoTrackersViewController.mm | 1 + macosx/InfoWindowController.mm | 1 + macosx/MessageWindowController.mm | 1 + macosx/PiecesView.mm | 1 + macosx/PrefsController.mm | 1 + macosx/StatsWindowController.mm | 1 + macosx/StatusBarController.mm | 1 + macosx/TorrentCellActionButton.mm | 21 +++--- macosx/TorrentCellControlButton.mm | 21 +++--- macosx/TorrentCellRevealButton.mm | 21 +++--- macosx/TorrentTableView.mm | 1 + macosx/URLSheetWindowController.mm | 1 + 30 files changed, 100 insertions(+), 59 deletions(-) diff --git a/macosx/AboutWindowController.mm b/macosx/AboutWindowController.mm index 66fe51b57..0026b2126 100644 --- a/macosx/AboutWindowController.mm +++ b/macosx/AboutWindowController.mm @@ -33,6 +33,7 @@ AboutWindowController* fAboutBoxInstance = nil; - (void)awakeFromNib { + [super awakeFromNib]; self.fVersionField.stringValue = @(LONG_VERSION_STRING); self.fCopyrightField.stringValue = [NSBundle.mainBundle localizedStringForKey:@"NSHumanReadableCopyright" value:nil diff --git a/macosx/AddMagnetWindowController.mm b/macosx/AddMagnetWindowController.mm index dc3dc6e30..c31822cc1 100644 --- a/macosx/AddMagnetWindowController.mm +++ b/macosx/AddMagnetWindowController.mm @@ -52,6 +52,7 @@ typedef NS_ENUM(NSUInteger, PopupPriority) { - (void)awakeFromNib { + [super awakeFromNib]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateGroupMenu:) name:@"UpdateGroups" object:nil]; NSString* name = self.torrent.name; diff --git a/macosx/AddWindowController.mm b/macosx/AddWindowController.mm index 9b06af769..6ee61a99a 100644 --- a/macosx/AddWindowController.mm +++ b/macosx/AddWindowController.mm @@ -87,6 +87,7 @@ typedef NS_ENUM(NSUInteger, PopupPriority) { - (void)awakeFromNib { + [super awakeFromNib]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateCheckButtons:) name:@"TorrentFileCheckChange" object:self.torrent]; diff --git a/macosx/Base.lproj/MainMenu.xib b/macosx/Base.lproj/MainMenu.xib index c7564f5c1..facef2bee 100644 --- a/macosx/Base.lproj/MainMenu.xib +++ b/macosx/Base.lproj/MainMenu.xib @@ -76,7 +76,7 @@ - + @@ -87,7 +87,7 @@ - + @@ -98,7 +98,7 @@ - + @@ -154,7 +154,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -188,7 +188,7 @@ - + @@ -202,17 +202,23 @@ + + + @@ -289,19 +298,22 @@ - + @@ -333,7 +345,7 @@ - + @@ -343,25 +355,31 @@ @@ -428,7 +446,7 @@ - + diff --git a/macosx/BlocklistDownloaderViewController.mm b/macosx/BlocklistDownloaderViewController.mm index d70654f7a..e8fddbceb 100644 --- a/macosx/BlocklistDownloaderViewController.mm +++ b/macosx/BlocklistDownloaderViewController.mm @@ -32,6 +32,7 @@ BlocklistDownloaderViewController* fBLViewController = nil; - (void)awakeFromNib { + [super awakeFromNib]; self.fButton.title = NSLocalizedString(@"Cancel", "Blocklist -> cancel button"); CGFloat const oldWidth = NSWidth(self.fButton.frame); diff --git a/macosx/ColorTextField.mm b/macosx/ColorTextField.mm index 8e0253576..02688267e 100644 --- a/macosx/ColorTextField.mm +++ b/macosx/ColorTextField.mm @@ -8,6 +8,8 @@ - (void)awakeFromNib { + [super awakeFromNib]; + self.enabled = self.enabled; } diff --git a/macosx/Controller.mm b/macosx/Controller.mm index 8e22f77a2..7c83e7477 100644 --- a/macosx/Controller.mm +++ b/macosx/Controller.mm @@ -599,6 +599,8 @@ void onTorrentCompletenessChanged(tr_torrent* tor, tr_completeness status, bool - (void)awakeFromNib { + [super awakeFromNib]; + Toolbar* toolbar = [[Toolbar alloc] initWithIdentifier:@"TRMainToolbar"]; toolbar.delegate = self; toolbar.allowsUserCustomization = YES; diff --git a/macosx/CreatorWindowController.mm b/macosx/CreatorWindowController.mm index f4f662628..847562cfe 100644 --- a/macosx/CreatorWindowController.mm +++ b/macosx/CreatorWindowController.mm @@ -158,6 +158,7 @@ NSMutableSet* creatorWindowControllerSet = nil; - (void)awakeFromNib { + [super awakeFromNib]; self.window.restorationClass = [self class]; NSString* name = self.fPath.lastPathComponent; diff --git a/macosx/FileOutlineController.mm b/macosx/FileOutlineController.mm index 3b38d23a6..1a4598f7a 100644 --- a/macosx/FileOutlineController.mm +++ b/macosx/FileOutlineController.mm @@ -38,6 +38,7 @@ typedef NS_ENUM(NSUInteger, FilePriorityMenuTag) { // - (void)awakeFromNib { + [super awakeFromNib]; self.fFileList = [[NSMutableArray alloc] init]; //set table header tool tips diff --git a/macosx/FileOutlineView.mm b/macosx/FileOutlineView.mm index c064313bd..dbade6fce 100644 --- a/macosx/FileOutlineView.mm +++ b/macosx/FileOutlineView.mm @@ -19,6 +19,7 @@ - (void)awakeFromNib { + [super awakeFromNib]; FileNameCell* nameCell = [[FileNameCell alloc] init]; [self tableColumnWithIdentifier:@"Name"].dataCell = nameCell; diff --git a/macosx/FilterBarController.mm b/macosx/FilterBarController.mm index 7b1247e4a..8b605277a 100644 --- a/macosx/FilterBarController.mm +++ b/macosx/FilterBarController.mm @@ -50,6 +50,7 @@ typedef NS_ENUM(NSInteger, FilterTypeTag) { - (void)awakeFromNib { + [super awakeFromNib]; //localizations self.fNoFilterButton.title = NSLocalizedString(@"All", "Filter Bar -> filter button"); self.fActiveFilterButton.title = NSLocalizedString(@"Active", "Filter Bar -> filter button"); diff --git a/macosx/FilterBarView.mm b/macosx/FilterBarView.mm index 379d2035d..b23ed2381 100644 --- a/macosx/FilterBarView.mm +++ b/macosx/FilterBarView.mm @@ -12,6 +12,7 @@ - (void)awakeFromNib { + [super awakeFromNib]; _searchFieldVerticalConstraint.constant = -.5; } diff --git a/macosx/GlobalOptionsPopoverViewController.mm b/macosx/GlobalOptionsPopoverViewController.mm index 0082f7b5a..65e1ac9eb 100644 --- a/macosx/GlobalOptionsPopoverViewController.mm +++ b/macosx/GlobalOptionsPopoverViewController.mm @@ -35,6 +35,7 @@ - (void)awakeFromNib { + [super awakeFromNib]; self.fUploadLimitField.integerValue = [self.fDefaults integerForKey:@"UploadLimit"]; self.fDownloadLimitField.integerValue = [self.fDefaults integerForKey:@"DownloadLimit"]; diff --git a/macosx/GroupsPrefsController.mm b/macosx/GroupsPrefsController.mm index 673321ea5..0ed3fc982 100644 --- a/macosx/GroupsPrefsController.mm +++ b/macosx/GroupsPrefsController.mm @@ -39,6 +39,7 @@ typedef NS_ENUM(NSInteger, SegmentTag) { - (void)awakeFromNib { + [super awakeFromNib]; [self.fTableView registerForDraggedTypes:@[ kGroupTableViewDataType ]]; [self.fSelectedColorView addObserver:self forKeyPath:@"color" options:0 context:NULL]; diff --git a/macosx/InfoActivityViewController.mm b/macosx/InfoActivityViewController.mm index 0242a7f4e..ee8c8f177 100644 --- a/macosx/InfoActivityViewController.mm +++ b/macosx/InfoActivityViewController.mm @@ -66,6 +66,7 @@ static CGFloat const kStackViewVerticalSpacing = 8.0; - (void)awakeFromNib { + [super awakeFromNib]; [self checkWindowSize]; } diff --git a/macosx/InfoFileViewController.mm b/macosx/InfoFileViewController.mm index bfa167222..01f85c9b4 100644 --- a/macosx/InfoFileViewController.mm +++ b/macosx/InfoFileViewController.mm @@ -36,6 +36,7 @@ - (void)awakeFromNib { + [super awakeFromNib]; CGFloat const height = [NSUserDefaults.standardUserDefaults floatForKey:@"InspectorContentHeightFiles"]; if (height != 0.0) { diff --git a/macosx/InfoOptionsViewController.mm b/macosx/InfoOptionsViewController.mm index 6754bae6a..497f35b95 100644 --- a/macosx/InfoOptionsViewController.mm +++ b/macosx/InfoOptionsViewController.mm @@ -74,6 +74,7 @@ static CGFloat const kStackViewSpacing = 8.0; - (void)awakeFromNib { + [super awakeFromNib]; [self checkWindowSize]; [self setGlobalLabels]; diff --git a/macosx/InfoPeersViewController.mm b/macosx/InfoPeersViewController.mm index b9266215f..d73b9eca3 100644 --- a/macosx/InfoPeersViewController.mm +++ b/macosx/InfoPeersViewController.mm @@ -49,6 +49,7 @@ static NSString* const kWebSeedAnimationId = @"webSeed"; - (void)awakeFromNib { + [super awakeFromNib]; CGFloat const height = [NSUserDefaults.standardUserDefaults floatForKey:@"InspectorContentHeightPeers"]; if (height != 0.0) { diff --git a/macosx/InfoTrackersViewController.mm b/macosx/InfoTrackersViewController.mm index ddeaed695..a4dbb7bf9 100644 --- a/macosx/InfoTrackersViewController.mm +++ b/macosx/InfoTrackersViewController.mm @@ -46,6 +46,7 @@ typedef NS_ENUM(NSInteger, TrackerSegmentTag) { - (void)awakeFromNib { + [super awakeFromNib]; [self.fTrackerAddRemoveControl.cell setToolTip:NSLocalizedString(@"Add a tracker", "Inspector view -> tracker buttons") forSegment:TrackerSegmentTagAdd]; [self.fTrackerAddRemoveControl.cell setToolTip:NSLocalizedString(@"Remove selected trackers", "Inspector view -> tracker buttons") diff --git a/macosx/InfoWindowController.mm b/macosx/InfoWindowController.mm index f874cb47b..c6b102a76 100644 --- a/macosx/InfoWindowController.mm +++ b/macosx/InfoWindowController.mm @@ -70,6 +70,7 @@ typedef NS_ENUM(NSUInteger, TabTag) { - (void)awakeFromNib { + [super awakeFromNib]; self.fNoneSelectedField.stringValue = NSLocalizedString(@"No Torrents Selected", "Inspector -> selected torrents"); //window location and size diff --git a/macosx/MessageWindowController.mm b/macosx/MessageWindowController.mm index 9286cb10c..ae4ac20d0 100644 --- a/macosx/MessageWindowController.mm +++ b/macosx/MessageWindowController.mm @@ -50,6 +50,7 @@ static NSTimeInterval const kUpdateSeconds = 0.75; - (void)awakeFromNib { + [super awakeFromNib]; NSWindow* window = self.window; window.frameAutosaveName = @"MessageWindowFrame"; [window setFrameUsingName:@"MessageWindowFrame"]; diff --git a/macosx/PiecesView.mm b/macosx/PiecesView.mm index 40c1fc58f..ae2acbb9c 100644 --- a/macosx/PiecesView.mm +++ b/macosx/PiecesView.mm @@ -110,6 +110,7 @@ typedef struct PieceInfo - (void)awakeFromNib { + [super awakeFromNib]; self.torrent = nil; } diff --git a/macosx/PrefsController.mm b/macosx/PrefsController.mm index be55bbef5..5f81890bb 100644 --- a/macosx/PrefsController.mm +++ b/macosx/PrefsController.mm @@ -197,6 +197,7 @@ static NSString* const kWebUIURLFormat = @"http://localhost:%ld/"; - (void)awakeFromNib { + [super awakeFromNib]; self.fHasLoaded = YES; self.window.restorationClass = [self class]; diff --git a/macosx/StatsWindowController.mm b/macosx/StatsWindowController.mm index 3e2b0ca1a..bdbc13e4a 100644 --- a/macosx/StatsWindowController.mm +++ b/macosx/StatsWindowController.mm @@ -53,6 +53,7 @@ tr_session* fLib = NULL; - (void)awakeFromNib { + [super awakeFromNib]; [self updateStats]; self.fTimer = [NSTimer scheduledTimerWithTimeInterval:kUpdateSeconds target:self selector:@selector(updateStats) diff --git a/macosx/StatusBarController.mm b/macosx/StatusBarController.mm index 0b6c66d0e..9d16d66c2 100644 --- a/macosx/StatusBarController.mm +++ b/macosx/StatusBarController.mm @@ -54,6 +54,7 @@ typedef NS_ENUM(NSUInteger, StatusTag) { - (void)awakeFromNib { + [super awakeFromNib]; //localize menu items [self.fStatusButton.menu itemWithTag:StatusTagTotalRatio].title = NSLocalizedString(@"Total Ratio", "Status Bar -> status menu"); [self.fStatusButton.menu itemWithTag:StatusTagSessionRatio].title = NSLocalizedString(@"Session Ratio", "Status Bar -> status menu"); diff --git a/macosx/TorrentCellActionButton.mm b/macosx/TorrentCellActionButton.mm index bbb65ffdb..e93946db1 100644 --- a/macosx/TorrentCellActionButton.mm +++ b/macosx/TorrentCellActionButton.mm @@ -5,19 +5,27 @@ #import "TorrentCellActionButton.h" #import "TorrentTableView.h" #import "Torrent.h" +#import "TorrentCell.h" @interface TorrentCellActionButton () @property(nonatomic) NSTrackingArea* fTrackingArea; @property(nonatomic) NSImage* fImage; @property(nonatomic) NSImage* fAlternativeImage; -@property(nonatomic) TorrentTableView* torrentTableView; +@property(nonatomic) IBOutlet TorrentCell* torrentCell; +@property(nonatomic, readonly) TorrentTableView* torrentTableView; @property(nonatomic) NSUserDefaults* fDefaults; @end @implementation TorrentCellActionButton +- (TorrentTableView*)torrentTableView +{ + return self.torrentCell.fTorrentTableView; +} + - (void)awakeFromNib { + [super awakeFromNib]; self.fDefaults = NSUserDefaults.standardUserDefaults; self.fImage = self.image; @@ -29,21 +37,12 @@ [self.cell setHighlightsBy:NSNoCellMask]; } -- (void)setupTorrentTableView -{ - if (!self.torrentTableView) - { - self.torrentTableView = (TorrentTableView*)[[[self superview] superview] superview]; - } -} - - (void)mouseEntered:(NSEvent*)event { [super mouseEntered:event]; self.image = self.fImage; - [self setupTorrentTableView]; [self.torrentTableView hoverEventBeganForView:self]; } @@ -53,7 +52,6 @@ self.image = self.fAlternativeImage; - [self setupTorrentTableView]; [self.torrentTableView hoverEventEndedForView:self]; } @@ -67,7 +65,6 @@ BOOL minimal = [self.fDefaults boolForKey:@"SmallView"]; if (!minimal) { - [self setupTorrentTableView]; [self.torrentTableView hoverEventEndedForView:self]; } } diff --git a/macosx/TorrentCellControlButton.mm b/macosx/TorrentCellControlButton.mm index fca5a910e..a957a2432 100644 --- a/macosx/TorrentCellControlButton.mm +++ b/macosx/TorrentCellControlButton.mm @@ -5,17 +5,26 @@ #import "TorrentCellControlButton.h" #import "TorrentTableView.h" #import "Torrent.h" +#import "TorrentCell.h" @interface TorrentCellControlButton () @property(nonatomic) NSTrackingArea* fTrackingArea; @property(nonatomic, copy) NSString* controlImageSuffix; -@property(nonatomic) TorrentTableView* torrentTableView; +@property(nonatomic) IBOutlet TorrentCell* torrentCell; +@property(nonatomic, readonly) TorrentTableView* torrentTableView; @end @implementation TorrentCellControlButton +- (TorrentTableView*)torrentTableView +{ + return self.torrentCell.fTorrentTableView; +} + - (void)awakeFromNib { + [super awakeFromNib]; + self.controlImageSuffix = @"Off"; [self updateImage]; } @@ -26,14 +35,6 @@ [self updateImage]; } -- (void)setupTorrentTableView -{ - if (!self.torrentTableView) - { - self.torrentTableView = (TorrentTableView*)[[[self superview] superview] superview]; - } -} - - (void)mouseEntered:(NSEvent*)event { [super mouseEntered:event]; @@ -66,8 +67,6 @@ - (void)updateImage { - [self setupTorrentTableView]; - NSImage* controlImage; Torrent* torrent = [self.torrentTableView itemAtRow:[self.torrentTableView rowForView:self]]; if (torrent.active) diff --git a/macosx/TorrentCellRevealButton.mm b/macosx/TorrentCellRevealButton.mm index 44679691e..45f4047fa 100644 --- a/macosx/TorrentCellRevealButton.mm +++ b/macosx/TorrentCellRevealButton.mm @@ -4,27 +4,28 @@ #import "TorrentCellRevealButton.h" #import "TorrentTableView.h" +#import "TorrentCell.h" @interface TorrentCellRevealButton () @property(nonatomic) NSTrackingArea* fTrackingArea; @property(nonatomic, copy) NSString* revealImageString; -@property(nonatomic) TorrentTableView* torrentTableView; +@property(nonatomic) IBOutlet TorrentCell* torrentCell; +@property(nonatomic, readonly) TorrentTableView* torrentTableView; @end @implementation TorrentCellRevealButton -- (void)awakeFromNib +- (TorrentTableView*)torrentTableView { - self.revealImageString = @"RevealOff"; - [self updateImage]; + return self.torrentCell.fTorrentTableView; } -- (void)setupTorrentTableView +- (void)awakeFromNib { - if (!self.torrentTableView) - { - self.torrentTableView = (TorrentTableView*)[[[self superview] superview] superview]; - } + [super awakeFromNib]; + + self.revealImageString = @"RevealOff"; + [self updateImage]; } - (void)mouseEntered:(NSEvent*)event @@ -57,8 +58,6 @@ - (void)updateImage { - [self setupTorrentTableView]; - NSImage* revealImage = [NSImage imageNamed:self.revealImageString]; self.image = revealImage; self.needsDisplay = YES; diff --git a/macosx/TorrentTableView.mm b/macosx/TorrentTableView.mm index 1efabcbff..4b8379f7e 100644 --- a/macosx/TorrentTableView.mm +++ b/macosx/TorrentTableView.mm @@ -114,6 +114,7 @@ static NSTimeInterval const kToggleProgressSeconds = 0.175; - (void)awakeFromNib { + [super awakeFromNib]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(refreshTorrentTable) name:@"RefreshTorrentTable" object:nil]; } diff --git a/macosx/URLSheetWindowController.mm b/macosx/URLSheetWindowController.mm index 419384905..1b0b85e9e 100644 --- a/macosx/URLSheetWindowController.mm +++ b/macosx/URLSheetWindowController.mm @@ -24,6 +24,7 @@ - (void)awakeFromNib { + [super awakeFromNib]; self.fLabelField.stringValue = NSLocalizedString(@"Internet address of torrent file:", "URL sheet label"); self.fOpenButton.title = NSLocalizedString(@"Open", "URL sheet button"); self.fCancelButton.title = NSLocalizedString(@"Cancel", "URL sheet button");