diff --git a/OSBindings/Mac/Clock Signal/Machine/CSROMFetcher.mm b/OSBindings/Mac/Clock Signal/Machine/CSROMFetcher.mm index 44e7ebe62..87c1f5f85 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSROMFetcher.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSROMFetcher.mm @@ -16,14 +16,30 @@ ROMMachine::ROMFetcher CSROMFetcher() { return [] (const std::string &machine, const std::vector &roms) -> std::vector>> { - NSString *subdirectory = [@"ROMImages/" stringByAppendingString:[NSString stringWithUTF8String:machine.c_str()]]; + NSString *const subdirectory = [@"ROMImages/" stringByAppendingString:[NSString stringWithUTF8String:machine.c_str()]]; + NSArray *const supportURLs = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; + std::vector>> results; for(const auto &rom: roms) { - NSData *fileData = [[NSBundle mainBundle] - dataForResource:[NSString stringWithUTF8String:rom.file_name.c_str()] - withExtension:nil - subdirectory:subdirectory]; + NSData *fileData; + // Check for this file first within the application support directories. + for(NSURL *supportURL in supportURLs) { + NSURL *const fullURL = [[supportURL URLByAppendingPathComponent:subdirectory] + URLByAppendingPathComponent:[NSString stringWithUTF8String:rom.file_name.c_str()]]; + fileData = [NSData dataWithContentsOfURL:fullURL]; + if(fileData) break; + } + + // Failing that, check inside the application bundle. + if(!fileData) { + fileData = [[NSBundle mainBundle] + dataForResource:[NSString stringWithUTF8String:rom.file_name.c_str()] + withExtension:nil + subdirectory:subdirectory]; + } + + // Store an appropriate result. if(!fileData) results.emplace_back(nullptr); else {