diff --git a/apple/OSX/platform.h b/apple/OSX/platform.h index b01f6526f5..cb33fb8629 100644 --- a/apple/OSX/platform.h +++ b/apple/OSX/platform.h @@ -37,9 +37,9 @@ - (void)loadingCore:(RAModuleInfo*)core withFile:(const char*)file; - (void)unloadingCore:(RAModuleInfo*)core; -@property (strong, nonatomic) NSString* configDirectory; // e.g. /var/mobile/Documents/.RetroArch -@property (strong, nonatomic) NSString* globalConfigFile; // e.g. /var/mobile/Documents/.RetroArch/retroarch.cfg -@property (strong, nonatomic) NSString* coreDirectory; // e.g. /Applications/RetroArch.app/modules +@property (nonatomic) NSString* configDirectory; // e.g. /var/mobile/Documents/.RetroArch +@property (nonatomic) NSString* globalConfigFile; // e.g. /var/mobile/Documents/.RetroArch/retroarch.cfg +@property (nonatomic) NSString* coreDirectory; // e.g. /Applications/RetroArch.app/modules @end diff --git a/apple/common/RAModuleInfo.h b/apple/common/RAModuleInfo.h index 39173ec473..65c4553156 100644 --- a/apple/common/RAModuleInfo.h +++ b/apple/common/RAModuleInfo.h @@ -25,13 +25,13 @@ extern NSArray* apple_get_modules(); @interface RAModuleInfo : NSObject -@property NSString* path; // e.g. /path/to/corename_libretro.dylib -@property NSString* baseName; // e.g. corename_libretro -@property core_info_t* info; -@property config_file_t* data; -@property NSString* description; // Friendly name from config file, else just the filename -@property NSString* customConfigFile; // Path where custom config file would reside -@property NSString* configFile; // Path to effective config file +@property (nonatomic) NSString* path; // e.g. /path/to/corename_libretro.dylib +@property (nonatomic) NSString* baseName; // e.g. corename_libretro +@property (nonatomic) core_info_t* info; +@property (nonatomic) config_file_t* data; +@property (nonatomic) NSString* description; // Friendly name from config file, else just the filename +@property (nonatomic) NSString* customConfigFile; // Path where custom config file would reside +@property (nonatomic) NSString* configFile; // Path to effective config file - (bool)supportsFileAtPath:(NSString*)path; diff --git a/apple/common/RAModuleInfo.m b/apple/common/RAModuleInfo.m index 985cfcb9c7..581bd0d116 100644 --- a/apple/common/RAModuleInfo.m +++ b/apple/common/RAModuleInfo.m @@ -92,11 +92,13 @@ NSArray* apple_get_modules() #ifdef IOS #import "../iOS/views.h" +static const void* const associated_string_key = &associated_string_key; + // Build a string with a second associated string static NSString* build_string_pair(NSString* stringA, NSString* stringB) { NSString* string_pair = [NSString stringWithString:stringA]; - objc_setAssociatedObject(string_pair, "OTHER", stringB, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(string_pair, associated_string_key, stringB, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return string_pair; } @@ -147,23 +149,25 @@ static NSString* build_string_pair(NSString* stringA, NSString* stringB) if (indexPath.section == _firmwareSectionIndex) { NSString* item = (NSString*)[self itemForIndexPath:indexPath]; - apple_display_alert(objc_getAssociatedObject(item, "OTHER"), item); + apple_display_alert(objc_getAssociatedObject(item, associated_string_key), item); } } - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"datacell"]; + static NSString* const cell_id = @"datacell"; + + UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"datacell"]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cell_id]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; } NSString* item = (NSString*)[self itemForIndexPath:indexPath]; - NSString* value = (NSString*)objc_getAssociatedObject(item, "OTHER"); + NSString* value = (NSString*)objc_getAssociatedObject(item, associated_string_key); cell.textLabel.text = item; cell.detailTextLabel.text = value; diff --git a/apple/iOS/RALogView.m b/apple/iOS/RALogView.m index af802dceca..d81608a0fc 100644 --- a/apple/iOS/RALogView.m +++ b/apple/iOS/RALogView.m @@ -69,8 +69,10 @@ void ios_add_log_message(const char* format, ...) - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"message"]; - cell = cell ? cell : [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"message"]; + static NSString* const cell_id = @"message"; + + UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; + cell = cell ? cell : [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id]; pthread_mutex_lock(&g_lock); cell.textLabel.text = g_messages[indexPath.row]; diff --git a/apple/iOS/browser.m b/apple/iOS/browser.m index 1ad53f41d7..fc7e5d7add 100644 --- a/apple/iOS/browser.m +++ b/apple/iOS/browser.m @@ -296,7 +296,7 @@ static void file_action(enum file_action action, NSString* source, NSString* tar - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { - static NSString* const cell_id; + static NSString* const cell_id = @"module"; UITableViewCell* cell = nil; if ([self getCellFor:cell_id withStyle:UITableViewCellStyleDefault result:&cell]) diff --git a/apple/iOS/platform.h b/apple/iOS/platform.h index db3dfe6864..4282656126 100644 --- a/apple/iOS/platform.h +++ b/apple/iOS/platform.h @@ -36,13 +36,13 @@ - (void)refreshSystemConfig; -@property (strong, nonatomic) NSString* configDirectory; // e.g. /var/mobile/Documents/.RetroArch -@property (strong, nonatomic) NSString* globalConfigFile; // e.g. /var/mobile/Documents/.RetroArch/retroarch.cfg -@property (strong, nonatomic) NSString* coreDirectory; // e.g. /Applications/RetroArch.app/modules +@property (nonatomic) NSString* configDirectory; // e.g. /var/mobile/Documents/.RetroArch +@property (nonatomic) NSString* globalConfigFile; // e.g. /var/mobile/Documents/.RetroArch/retroarch.cfg +@property (nonatomic) NSString* coreDirectory; // e.g. /Applications/RetroArch.app/modules -@property (strong, nonatomic) NSString* documentsDirectory; // e.g. /var/mobile/Documents -@property (strong, nonatomic) NSString* systemDirectory; // e.g. /var/mobile/Documents/.RetroArch -@property (strong, nonatomic) NSString* systemConfigPath; // e.g. /var/mobile/Documents/.RetroArch/frontend.cfg +@property (nonatomic) NSString* documentsDirectory; // e.g. /var/mobile/Documents +@property (nonatomic) NSString* systemDirectory; // e.g. /var/mobile/Documents/.RetroArch +@property (nonatomic) NSString* systemConfigPath; // e.g. /var/mobile/Documents/.RetroArch/frontend.cfg @end @@ -50,4 +50,4 @@ void ios_set_bluetooth_mode(NSString* mode); bool is_ios_7(); -#endif \ No newline at end of file +#endif diff --git a/apple/iOS/platform.m b/apple/iOS/platform.m index d2959b7983..73811fccac 100644 --- a/apple/iOS/platform.m +++ b/apple/iOS/platform.m @@ -209,7 +209,7 @@ static void handle_touch_event(NSArray* touches) - (bool)directoryList:(id)list itemWasSelected:(RADirectoryItem*)path { if(path.isDirectory) - [[RetroArch_iOS get] pushViewController:[[RADirectoryList alloc] initWithPath:path.path delegate:self] animated:YES]; + [self pushViewController:[[RADirectoryList alloc] initWithPath:path.path delegate:self] animated:YES]; else { _path = path.path; @@ -218,7 +218,7 @@ static void handle_touch_event(NSArray* touches) apple_display_alert(@"The directory containing the selected file has limited permissions. This may " "prevent zipped games from loading, and will cause some cores to not function.", 0); - [[RetroArch_iOS get] pushViewController:[[RAModuleList alloc] initWithGame:path.path delegate:self] animated:YES]; + [self pushViewController:[[RAModuleList alloc] initWithGame:path.path delegate:self] animated:YES]; } return true; diff --git a/apple/iOS/settings.m b/apple/iOS/settings.m index e7d8137224..a7b88ce337 100644 --- a/apple/iOS/settings.m +++ b/apple/iOS/settings.m @@ -21,6 +21,10 @@ #include "bluetooth/btdynamic.h" #include "bluetooth/btpad.h" +static const void* const associated_userdata_key = &associated_userdata_key; +static const void* const associated_module_key = &associated_module_key; +static const void* const associated_setting_key = &associated_setting_key; + enum SettingTypes { BooleanSetting, ButtonSetting, EnumerationSetting, FileListSetting, @@ -209,7 +213,7 @@ static RASettingData* custom_action(NSString* action, NSString* value, id data, result->reload = reload_func; if (data != nil) - objc_setAssociatedObject(result, "USERDATA", data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(result, associated_userdata_key, data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return result; } @@ -377,7 +381,7 @@ static NSArray* build_input_port_group(config_file_t* config, uint32_t player) - (void)handleCustomAction:(RASettingData*)setting { if ([@"Core Info" isEqualToString:setting->label]) - [[RetroArch_iOS get] pushViewController:[[RAModuleInfoList alloc] initWithModuleInfo:_module] animated:YES]; + [self.navigationController pushViewController:[[RAModuleInfoList alloc] initWithModuleInfo:_module] animated:YES]; else if([@"Delete Custom Config" isEqualToString:setting->label]) { [_module deleteCustomConfig]; @@ -476,14 +480,14 @@ static void bluetooth_option_changed(RASettingData* setting) - (void)handleCustomAction:(RASettingData*)setting { if ([@"Diagnostic Log" isEqualToString:setting->label]) - [[RetroArch_iOS get] pushViewController:[RALogView new] animated:YES]; + [self.navigationController pushViewController:[RALogView new] animated:YES]; else if ([@"Enable BTstack" isEqualToString:setting->label]) btstack_set_poweron([setting->value isEqualToString:@"true"]); else if([@"Global Core Config" isEqualToString:setting->label]) - [RetroArch_iOS.get pushViewController:[[RASettingsList alloc] initWithModule:nil] animated:YES]; + [self.navigationController pushViewController:[[RASettingsList alloc] initWithModule:nil] animated:YES]; else { - RAModuleInfo* data = (RAModuleInfo*)objc_getAssociatedObject(setting, "USERDATA"); + RAModuleInfo* data = (RAModuleInfo*)objc_getAssociatedObject(setting, associated_userdata_key); if (data) { if (!data.hasCustomConfig) @@ -494,18 +498,18 @@ static void bluetooth_option_changed(RASettingData* setting) delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; - objc_setAssociatedObject(alert, "MODULE", data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(alert, associated_module_key, data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [alert show]; } else - [RetroArch_iOS.get pushViewController:[[RASettingsList alloc] initWithModule:data] animated:YES]; + [self.navigationController pushViewController:[[RASettingsList alloc] initWithModule:data] animated:YES]; } } } - (void)alertView:(UIAlertView*)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { - RAModuleInfo* data = (RAModuleInfo*)objc_getAssociatedObject(alertView, "MODULE"); + RAModuleInfo* data = (RAModuleInfo*)objc_getAssociatedObject(alertView, associated_module_key); if (data) { @@ -515,7 +519,7 @@ static void bluetooth_option_changed(RASettingData* setting) [self.tableView reloadData]; } - [RetroArch_iOS.get pushViewController:[[RASettingsList alloc] initWithModule:data] animated:YES]; + [self.navigationController pushViewController:[[RASettingsList alloc] initWithModule:data] animated:YES]; } } @@ -614,7 +618,7 @@ static void bluetooth_option_changed(RASettingData* setting) case EnumerationSetting: case FileListSetting: case AspectSetting: - [[RetroArch_iOS get] pushViewController:[[RASettingEnumerationList alloc] initWithSetting:setting fromTable:(UITableView*)self.view] animated:YES]; + [self.navigationController pushViewController:[[RASettingEnumerationList alloc] initWithSetting:setting fromTable:(UITableView*)self.view] animated:YES]; break; case ButtonSetting: @@ -622,7 +626,7 @@ static void bluetooth_option_changed(RASettingData* setting) break; case GroupSetting: - [[RetroArch_iOS get] pushViewController:[[RASettingsSubList alloc] initWithSettings:setting->subValues title:setting->label] animated:YES]; + [self.navigationController pushViewController:[[RASettingsSubList alloc] initWithSettings:setting->subValues title:setting->label] animated:YES]; break; default: @@ -634,7 +638,7 @@ static void bluetooth_option_changed(RASettingData* setting) - (void)handleBooleanSwitch:(UISwitch*)swt { - RASettingData* setting = objc_getAssociatedObject(swt, "SETTING"); + RASettingData* setting = objc_getAssociatedObject(swt, associated_setting_key); [setting setValue:swt.on ? @"true" : @"false"]; [self handleCustomAction:setting]; @@ -642,7 +646,7 @@ static void bluetooth_option_changed(RASettingData* setting) - (void)handleSlider:(UISlider*)sld { - RASettingData* setting = objc_getAssociatedObject(sld, "SETTING"); + RASettingData* setting = objc_getAssociatedObject(sld, associated_setting_key); [setting setValue:[NSString stringWithFormat:@"%f", sld.value]]; [self handleCustomAction:setting]; @@ -658,11 +662,12 @@ static void bluetooth_option_changed(RASettingData* setting) { case BooleanSetting: { - cell = [self.tableView dequeueReusableCellWithIdentifier:@"boolean"]; + static NSString* const cell_id = @"boolean"; + cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"boolean"]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id]; UISwitch* accessory = [[UISwitch alloc] init]; [accessory addTarget:self action:@selector(handleBooleanSwitch:) forControlEvents:UIControlEventValueChanged]; @@ -675,18 +680,19 @@ static void bluetooth_option_changed(RASettingData* setting) UISwitch* swt = (UISwitch*)cell.accessoryView; swt.on = [setting->value isEqualToString:@"true"]; - objc_setAssociatedObject(swt, "SETTING", setting, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(swt, associated_setting_key, setting, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return cell; } case RangeSetting: { - cell = [self.tableView dequeueReusableCellWithIdentifier:@"range"]; + static NSString* const cell_id = @"range"; + cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"range"]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id]; UISlider* accessory = [UISlider new]; [accessory addTarget:self action:@selector(handleSlider:) forControlEvents:UIControlEventValueChanged]; @@ -702,7 +708,7 @@ static void bluetooth_option_changed(RASettingData* setting) sld.minimumValue = setting->rangeMin; sld.maximumValue = setting->rangeMax; sld.value = [setting->value doubleValue]; - objc_setAssociatedObject(sld, "SETTING", setting, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(sld, associated_setting_key, setting, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return cell; } @@ -710,16 +716,17 @@ static void bluetooth_option_changed(RASettingData* setting) default: { - cell = [self.tableView dequeueReusableCellWithIdentifier:@"default"]; + static NSString* const cell_id = @"default"; + cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"default"]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cell_id]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } if (setting->reload) - setting->reload(setting, objc_getAssociatedObject(setting, "USERDATA")); + setting->reload(setting, objc_getAssociatedObject(setting, associated_userdata_key)); cell.textLabel.text = setting->label; @@ -771,8 +778,10 @@ static void bluetooth_option_changed(RASettingData* setting) - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"option"]; - cell = cell ? cell : [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"option"]; + static NSString* const cell_id = @"option"; + + UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:cell_id]; + cell = cell ? cell : [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id]; if (indexPath.section == _mainSection) cell.textLabel.text = [_value labelForEnumerationIndex:indexPath.row]; @@ -787,7 +796,7 @@ static void bluetooth_option_changed(RASettingData* setting) [_value setValue: (indexPath.section == _mainSection) ? [_value valueForEnumerationIndex:indexPath.row] : @""]; [_view reloadData]; - [[RetroArch_iOS get] popViewControllerAnimated:YES]; + [self.navigationController popViewControllerAnimated:YES]; } @end diff --git a/apple/iOS/views.h b/apple/iOS/views.h index b607c6415d..5a0cd530d1 100644 --- a/apple/iOS/views.h +++ b/apple/iOS/views.h @@ -24,8 +24,8 @@ // utility.m @interface RATableViewController : UITableViewController -@property NSMutableArray* sections; -@property BOOL hidesHeaders; +@property (nonatomic) NSMutableArray* sections; +@property (nonatomic) BOOL hidesHeaders; - (id)initWithStyle:(UITableViewStyle)style; - (bool)getCellFor:(NSString*)reuseID withStyle:(UITableViewCellStyle)style result:(UITableViewCell**)output; @@ -35,8 +35,8 @@ // browser.m @interface RADirectoryItem : NSObject -@property (strong) NSString* path; -@property bool isDirectory; +@property (nonatomic) NSString* path; +@property (nonatomic) bool isDirectory; @end // browser.m