/** * @author Christian Burger (christian@krikkel.de) */ #include "App.hpp" #include "Debug.hpp" #include #include #include #include #include namespace krikkel::NCursesPtyWindow { App::App() : NCursesApplication(false) { } int App::run() { std::mutex writeMutex; PtyWindow *ptyWindow = new PtyWindow(&writeMutex , Root_Window->lines() , Root_Window->cols() , 0 , 0); 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); } while(true) { SingleUserInput input = ptyWindow->readSingleUserInput(); if(input.isNormalKey()) ptyWindow->writeUnicodeCharToClient(input.getRawInput()); if(input.isFunctionKey()) { if(input.getRawInput() == KEY_RESIZE) ptyWindow->wresize(Root_Window->lines(), Root_Window->cols()); else ptyWindow->writeKeyToClient(input.mapKeyNcursesToVTerm()); } } return 0; } }