mirror of
https://github.com/hch12907/orbum.git
synced 2024-05-10 08:44:02 -04:00
Tweak main menu.
This commit is contained in:
parent
dd8445a2b9
commit
1d7e8e8e07
|
@ -1,74 +1,33 @@
|
|||
#include <cstdio>
|
||||
#include <csignal>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <Core.hpp>
|
||||
#include <Macros.hpp>
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
bool quit = false;
|
||||
volatile bool show_main_menu = false;
|
||||
|
||||
#if defined(WIN32)
|
||||
BOOL WINAPI console_handler(DWORD signal)
|
||||
{
|
||||
show_main_menu = true;
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
void signal_handler(int signal)
|
||||
{
|
||||
show_main_menu = true;
|
||||
|
||||
// This is a win32 specific thing? Otherwise subsequent signals are not caught...
|
||||
// https://stackoverflow.com/questions/43959514/why-the-second-sigint-cant-be-captured-on-win32
|
||||
std::signal(SIGINT, signal_handler);
|
||||
std::signal(SIGBREAK, signal_handler);
|
||||
}
|
||||
#endif
|
||||
|
||||
void main_menu(CoreApi& core)
|
||||
{
|
||||
char c = '\0';
|
||||
do
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1':
|
||||
case 's':
|
||||
{
|
||||
puts("Saving state...");
|
||||
core.save_state();
|
||||
puts("Saved state ok");
|
||||
break;
|
||||
}
|
||||
case '2':
|
||||
case 'd':
|
||||
{
|
||||
puts("Dumping memory...");
|
||||
core.dump_all_memory();
|
||||
puts("Dumped memory ok");
|
||||
break;
|
||||
}
|
||||
case '3':
|
||||
case 'c':
|
||||
{
|
||||
goto exit_menu;
|
||||
}
|
||||
case '4':
|
||||
case 'q':
|
||||
{
|
||||
quit = true;
|
||||
goto exit_menu;
|
||||
}
|
||||
}
|
||||
|
||||
puts("Orbum main menu");
|
||||
puts(" 1. (s)ave state (json)");
|
||||
puts(" 2. (d)ump all memory (binary)");
|
||||
puts(" 3. (c)ontinue");
|
||||
puts(" 4. (q)uit");
|
||||
fputs("Select an option: ", stdout);
|
||||
|
||||
} while ((c = getchar()));
|
||||
|
||||
exit_menu:
|
||||
puts("");
|
||||
show_main_menu = false;
|
||||
}
|
||||
void main_menu(CoreApi& core);
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
|
@ -79,8 +38,11 @@ int main(int argc, char* argv[])
|
|||
std::cout << std::endl
|
||||
<< "Working directory: " << boost::filesystem::initial_path() << std::endl;
|
||||
|
||||
#if defined(WIN32)
|
||||
SetConsoleCtrlHandler(console_handler, TRUE);
|
||||
#else
|
||||
std::signal(SIGINT, signal_handler);
|
||||
std::signal(SIGBREAK, signal_handler);
|
||||
#endif
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -111,4 +73,67 @@ int main(int argc, char* argv[])
|
|||
|
||||
std::cout << "Exiting" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void main_menu(CoreApi& core)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
std::cout << "\nOrbum main menu\n"
|
||||
<< " 1. (s)ave state (json)\n"
|
||||
<< " 2. (d)ump all memory (binary)\n"
|
||||
<< " 3. (c)ontinue\n"
|
||||
<< " 4. (q)uit\n"
|
||||
<< "\nSelect an option: "
|
||||
<< std::flush;
|
||||
|
||||
char c = '\0';
|
||||
try
|
||||
{
|
||||
std::string line;
|
||||
std::getline(std::cin, line);
|
||||
c = line.at(0);
|
||||
}
|
||||
catch (const std::out_of_range&)
|
||||
{
|
||||
std::cout << "Invalid option" << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '1':
|
||||
case 's':
|
||||
{
|
||||
std::cout << "Saving state..." << std::endl;
|
||||
core.save_state();
|
||||
std::cout << "Saved state ok" << std::endl;
|
||||
break;
|
||||
}
|
||||
case '2':
|
||||
case 'd':
|
||||
{
|
||||
std::cout << "Dumping memory..." << std::endl;
|
||||
core.dump_all_memory();
|
||||
std::cout << "Dumped memory ok" << std::endl;
|
||||
break;
|
||||
}
|
||||
case '3':
|
||||
case 'c':
|
||||
{
|
||||
goto exit_menu;
|
||||
}
|
||||
case '4':
|
||||
case 'q':
|
||||
{
|
||||
quit = true;
|
||||
goto exit_menu;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
exit_menu:
|
||||
std::cout << std::endl;
|
||||
show_main_menu = false;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue