/** * @author Christian Burger (christian@krikkel.de) */ #include "DemoApp.hpp" #include "Debug.hpp" #include #include #include #include #include #include #include namespace krikkel::NCurses { using std::scoped_lock; DemoApp::DemoApp() : NCursesApplication(false) { } int DemoApp::run() { setUpWindows(); forkShell(); mainLoop(); return 0; } void DemoApp::setUpWindows() { windowManager = new VerticalTilingWindowManager(Root_Window, &ncursesMutex); topWindowManager = new HorizontalTilingWindowManager(new Window(), &ncursesMutex); bottomWindowManager = new HorizontalTilingWindowManager(new Window(), &ncursesMutex); windowManager->addWindow(topWindowManager); ptyWindow = new PtyWindow(&ncursesMutex, 0, 0, 0, 0); windowManager->addWindow(ptyWindow); windowManager->addWindow(bottomWindowManager); windowManager->updateLayout(); windowManager->refresh(); dummyWindowTopLeft = new Window(); topWindowManager->addWindow(dummyWindowTopLeft, 1); dummyWindowTopLeft->addstr("t\no\np\n \nl\ne\nf\nt\n w\ni\nn\nd\no\nw"); dummyWindowTopRight = new Window(topWindowManager); dummyWindowTopRight->addstr("top right window"); topWindowManager->updateLayout(); topWindowManager->refresh(); dummyWindowBottomLeft = new Window(bottomWindowManager); dummyWindowBottomLeft->addstr("bottom left window"); dummyWindowBottomRight = new Window(bottomWindowManager); dummyWindowBottomRight->addstr("bottom right window"); bottomWindowManager->updateLayout(); bottomWindowManager->refresh(); } void DemoApp::forkShell() { if(fork() == 0) { const char *shellPath = getenv("SHELL"); if(!shellPath) shellPath = "/bin/bash"; login_tty(ptyWindow->getFdPtyClient()); const int sizeArg = 2; const char *arg[sizeArg] = {shellPath, NULL}; fprintf(stderr, "+C exits shell.\n\n"); execv(shellPath, const_cast(arg)); fprintf(stderr, "Well, well, well … could not start a shell. We " "tried `%s`. Maybe set `SHELL` environment variable" " to a working value?", shellPath); exit(1); } } void DemoApp::mainLoop() { while(true) { SingleUserInput input = windowManager->readSingleUserInput(); if(input.isNormalKey()) { ptyWindow->writeUnicodeCharToClient(input.getRawInput()); { scoped_lock lock(ncursesMutex); dummyWindowTopRight->addch(input.getRawInput()); dummyWindowTopRight->refresh(); } } if(input.isFunctionKey()) { switch(input.getRawInput()) { case KEY_RESIZE: windowManager->updateLayout(); break; case KEY_F(1): if(topWindowManager->isHidden()) windowManager->showWindow(topWindowManager); else windowManager->hideWindow(topWindowManager); windowManager->updateLayout(); windowManager->refresh(); break; case KEY_F(2): if(ptyWindow->isHidden()) windowManager->showWindow(ptyWindow); else windowManager->hideWindow(ptyWindow); windowManager->updateLayout(); windowManager->refresh(); break; case KEY_F(3): if(bottomWindowManager->isHidden()) windowManager->showWindow(bottomWindowManager); else windowManager->hideWindow(bottomWindowManager); windowManager->updateLayout(); windowManager->refresh(); break; case KEY_F(4): windowManager->invertWindowsVisibility(); windowManager->updateLayout(); windowManager->refresh(); break; case KEY_F(5): windowManager->refresh(); break; default: ptyWindow->writeFunctionKeyToClient(input.mapKeyNcursesToVTerm()); } } } } }