/** * @brief `ncurses` window displaying contents of a pseudo terminal * @author Christian Burger (christian@krikkel.de) */ #ifndef __WINDOW_H__ #define __WINDOW_H__ #include "SingleUserInput.hpp" #include "Window.hpp" #include #include #include #include #include #include namespace krikkel::NCursesPtyWindow { class PtyWindow : public Window { public: PtyWindow(std::mutex *writeToNCursesMutex, int lines, int columns, int y, int x); ~PtyWindow(); int getFdPtyClient() const; void writeToClient(const char * string, size_t length); void writeUnicodeCharToClient(wint_t character); void writeKeyToClient(VTermKey key); int refresh() override; int wresize(int rows, int cols); private: int fdPtyHost, fdPtyClient; struct termios terminalParameters; VTerm *pseudoTerminal; std::mutex writeToPseudoTerminalMutex; std::mutex *writeToNCursesMutex; VTermScreen *pseudoTerminalScreen; static VTermScreenCallbacks screenCallbacks; /// @todo one line is at most 4096 chars long static const uint16_t PTY_CLIENT_OUTPUT_BUFFER_SIZE = 2 * 4096; char ptyClientOutputBuffer[PTY_CLIENT_OUTPUT_BUFFER_SIZE]; uint16_t cursorX, cursorY; std::thread readPtyClientThread; void readFromPtyClientThreadMethod(); void readFromPtyClient(); int handlerDamage(VTermRect rect); int handlerMoveRect(VTermRect dest, VTermRect src); int handlerMoveCursor(VTermPos pos, VTermPos oldpos, int visible); int handlerSetTermProp(VTermProp prop, VTermValue *val); int handlerBell(); int handlerResize(int rows, int cols); int handlerPushLine(int cols, const VTermScreenCell *cells); int handlerPopLine(int cols, VTermScreenCell *cells); attr_t extractAttributesFromVTermCell(VTermScreenCell cell); short extractColorFromVTermCell(VTermScreenCell cell); void copyPtyCellToNCursesWindow(int x, int y); static int staticHandlerDamage(VTermRect rect, void *user); static int staticHandlerMoveRect(VTermRect dest, VTermRect src, void *user); static int staticHandlerMoveCursor(VTermPos pos, VTermPos oldpos, int visible, void *user); static int staticHandlerSetTermProp(VTermProp prop, VTermValue *val, void *user); static int staticHandlerBell(void *user); static int staticHandlerResize(int rows, int cols, void *user); static int staticHandlerPushLine(int cols, const VTermScreenCell *cells, void *user); static int staticHandlerPopLine(int cols, VTermScreenCell *cells, void *user); static void staticHandlerOutput(const char *s, size_t len, void *user); }; } #endif // __WINDOW_H__