From 1d7e8e8e0788c9aa197e30c2d5bc16c92563f386 Mon Sep 17 00:00:00 2001 From: Marco Satti Date: Mon, 6 Aug 2018 22:40:56 +0800 Subject: [PATCH] Tweak main menu. --- orbumfront/src/OrbumFront.cpp | 139 ++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 57 deletions(-) diff --git a/orbumfront/src/OrbumFront.cpp b/orbumfront/src/OrbumFront.cpp index 6981bdb3..105f0f50 100644 --- a/orbumfront/src/OrbumFront.cpp +++ b/orbumfront/src/OrbumFront.cpp @@ -1,74 +1,33 @@ -#include #include #include +#include #include #include #include +#if defined(WIN32) +#include +#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; -} \ No newline at end of file +} + +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; +}