diff --git a/Analyser/Static/StaticAnalyser.hpp b/Analyser/Static/StaticAnalyser.hpp
index b9a62770d..e806ae042 100644
--- a/Analyser/Static/StaticAnalyser.hpp
+++ b/Analyser/Static/StaticAnalyser.hpp
@@ -35,6 +35,16 @@ struct Media {
bool empty() const {
return disks.empty() && tapes.empty() && cartridges.empty() && mass_storage_devices.empty();
}
+
+ Media &operator +=(const Media &rhs) {
+#define append(name) name.insert(name.end(), rhs.name.begin(), rhs.name.end());
+ append(disks);
+ append(tapes);
+ append(cartridges);
+ append(mass_storage_devices);
+#undef append
+ return *this;
+ }
};
/*!
diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme
index e58d5fee5..583cb9d88 100644
--- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme
+++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme
@@ -90,7 +90,7 @@
+ isEnabled = "NO">
file_names;
std::map selections; // The empty string will be inserted for arguments without an = suffix.
void apply(Reflection::Struct *reflectable) const {
@@ -406,7 +406,7 @@ ParsedArguments parse_arguments(int argc, char *argv[]) {
arguments.selections[name] = value;
}
} else {
- arguments.file_name = arg;
+ arguments.file_names.push_back(arg);
}
}
@@ -585,11 +585,17 @@ int main(int argc, char *argv[]) {
// Determine the machine for the supplied file, if any, or from --new.
Analyser::Static::TargetList targets;
- if(!arguments.file_name.empty()) {
- targets = Analyser::Static::GetTargets(arguments.file_name);
+ if(!arguments.file_names.empty()) {
+ // Take the first file name that actually implies a machine.
+ auto file_name = arguments.file_names.begin();
+ while(file_name != arguments.file_names.end() && targets.empty()) {
+ targets = Analyser::Static::GetTargets(*file_name);
+ ++file_name;
+ }
}
const auto new_argument = arguments.selections.find("new");
+ std::string long_machine_name;
if(new_argument != arguments.selections.end() && !new_argument->second.empty()) {
// Perform for a case-insensitive search against short names.
const auto short_names = Machine::AllMachines(Machine::Type::DoesntRequireMedia, false);
@@ -607,16 +613,23 @@ int main(int argc, char *argv[]) {
// If a match was found, use the corresponding long name to look up a suitable
// Analyser::Statuc::Target and move that to the targets list.
if(short_name != short_names.end()) {
- const auto long_name = Machine::AllMachines(Machine::Type::DoesntRequireMedia, true)[short_name - short_names.begin()];
+ long_machine_name = Machine::AllMachines(Machine::Type::DoesntRequireMedia, true)[short_name - short_names.begin()];
auto targets_by_machine = Machine::TargetsByMachineName(false);
- std::unique_ptr tgt = std::move(targets_by_machine[long_name]);
+ std::unique_ptr tgt = std::move(targets_by_machine[long_machine_name]);
targets.push_back(std::move(tgt));
}
}
if(targets.empty()) {
- if(!arguments.file_name.empty()) {
- std::cerr << "Cannot open " << arguments.file_name << "; no target machine found" << std::endl;
+ if(!arguments.file_names.empty()) {
+ std::cerr << "Cannot open ";
+ bool is_first = true;
+ for(const auto &name: arguments.file_names) {
+ if(!is_first) std::cerr << ", ";
+ is_first = false;
+ std::cerr << name;
+ }
+ std::cerr << "; no target machine found" << std::endl;
return EXIT_FAILURE;
}
@@ -752,6 +765,13 @@ int main(int argc, char *argv[]) {
machine_runner.machine = machine.get();
machine_runner.machine_mutex = &machine_mutex;
+ // Ensure all media is inserted.
+ Analyser::Static::Media media;
+ for(const auto &file_name: arguments.file_names) {
+ media += Analyser::Static::GetMedia(file_name);
+ }
+ machine->media_target()->insert_media(media);
+
// Attempt to set up video and audio.
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
@@ -765,7 +785,7 @@ int main(int argc, char *argv[]) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetSwapInterval(1);
- window = SDL_CreateWindow( final_path_component(arguments.file_name).c_str(),
+ window = SDL_CreateWindow( long_machine_name.empty() ? final_path_component(arguments.file_names.front()).c_str() : long_machine_name.c_str(),
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
400, 300,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);