diff --git a/x/x.cpp b/x/x.cpp index 89d364fc3c..ce5ce7ea30 100644 --- a/x/x.cpp +++ b/x/x.cpp @@ -1,46 +1,49 @@ -#include +#include +#include +#include +#include +#include #include #include #include - #include #include - #include - #include #include #include - #include #include #include #include #include - #include #include #include #include - #include #include #include - #include +#include + +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include #include -#include -#include -#include -#include -#include +#include struct Process { std::string name; @@ -477,6 +480,8 @@ void logger_setup() } +void ui_main(); + void demo() { setup(); @@ -531,9 +536,67 @@ void demo() get_logger()->Info( "Joining threads" ); + ui_main(); + counter_example_thread.join(); observable_counter_example_thread.join(); histogram_example_thread.join(); get_logger()->Info( "Joined all threads" ); } + +#include +#include + +void BindStdHandlesToConsole() +{ +#ifdef _WIN32 + FreeConsole(); + AllocConsole(); +#endif + + freopen("CONIN$", "r", stdin); + freopen("CONOUT$", "w", stderr); + freopen("CONOUT$", "w", stdout); + +#ifdef _WIN32 + // Note that there is no CONERR$ file + HANDLE hStdout = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE hStdin = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + SetStdHandle(STD_OUTPUT_HANDLE,hStdout); + SetStdHandle(STD_ERROR_HANDLE,hStdout); + SetStdHandle(STD_INPUT_HANDLE,hStdin); +#endif + + // //Clear the error state for each of the C++ standard stream objects. + std::wclog.clear(); + std::clog.clear(); + std::wcout.clear(); + std::wcerr.clear(); + std::wcin.clear(); + std::cerr.clear(); + std::cout.clear(); + std::cin.clear(); +} + +void ui_main() { + BindStdHandlesToConsole(); + using namespace ftxui; + auto screen = ScreenInteractive::TerminalOutput(); + + std::vector entries = { + "entry 1", + "entry 2", + "entry 3", + }; + int selected = 0; + + MenuOption option; +// option.on_enter = screen.ExitLoopClosure(); + auto menu = Menu(&entries, &selected, option); + + screen.Loop(menu); + + std::cout << "Selected element = " << selected << std::endl; +}