added static output handler (fixes #6)
added some extensive debug output — all the communication between pseudo terminal's host and client
This commit is contained in:
parent
fd800dbca8
commit
c7138f3df9
|
@ -51,7 +51,8 @@ namespace krikkel::NCursesPtyWindow
|
||||||
ptyWindow->wresize(Root_Window->lines(), Root_Window->cols());
|
ptyWindow->wresize(Root_Window->lines(), Root_Window->cols());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ptyWindow->writeToClient((unsigned char) input);
|
|
||||||
|
ptyWindow->writeToClient((char *) &input, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -37,9 +37,11 @@ namespace krikkel::NCursesPtyWindow
|
||||||
pseudoTerminalScreen = vterm_obtain_screen(pseudoTerminal);
|
pseudoTerminalScreen = vterm_obtain_screen(pseudoTerminal);
|
||||||
vterm_screen_reset(pseudoTerminalScreen, true);
|
vterm_screen_reset(pseudoTerminalScreen, true);
|
||||||
vterm_screen_set_callbacks(pseudoTerminalScreen, &screenCallbacks, this);
|
vterm_screen_set_callbacks(pseudoTerminalScreen, &screenCallbacks, this);
|
||||||
|
vterm_output_set_callback(pseudoTerminal, &staticHandlerOutput, this);
|
||||||
|
//vterm_screen_enable_altscreen(pseudoTerminalScreen, true);
|
||||||
|
|
||||||
// the terminal is doing most of the work
|
// the terminal is doing most of the work
|
||||||
//raw(); — cbreak might suffice
|
//raw(); //— cbreak might suffice
|
||||||
//noecho(); — already set
|
//noecho(); — already set
|
||||||
//nodelay(true); — @todo needs some reprogramming
|
//nodelay(true); — @todo needs some reprogramming
|
||||||
keypad(false);
|
keypad(false);
|
||||||
|
@ -62,10 +64,11 @@ namespace krikkel::NCursesPtyWindow
|
||||||
return fdPtyClient;
|
return fdPtyClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @todo maybe implement a function with a string buffer
|
void NCursesPtyWindow::writeToClient(const char *output, size_t length) const
|
||||||
void NCursesPtyWindow::writeToClient(char character)
|
|
||||||
{
|
{
|
||||||
write(fdPtyHost, &character, sizeof(character));
|
write(fdPtyHost, output, length);
|
||||||
|
__debug_log("written to PTY client: ");
|
||||||
|
__debug_log(__debug_bytes_printable_table(output, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NCursesPtyWindow::readFromPtyClientThreadMethod()
|
void NCursesPtyWindow::readFromPtyClientThreadMethod()
|
||||||
|
@ -90,6 +93,7 @@ namespace krikkel::NCursesPtyWindow
|
||||||
size_t bytesRead = read(fdPtyHost, ptyClientOutputBuffer, PTY_CLIENT_OUTPUT_BUFFER_SIZE);
|
size_t bytesRead = read(fdPtyHost, ptyClientOutputBuffer, PTY_CLIENT_OUTPUT_BUFFER_SIZE);
|
||||||
if(bytesRead != -1 && bytesRead != 0)
|
if(bytesRead != -1 && bytesRead != 0)
|
||||||
vterm_input_write(pseudoTerminal, ptyClientOutputBuffer, bytesRead);
|
vterm_input_write(pseudoTerminal, ptyClientOutputBuffer, bytesRead);
|
||||||
|
__debug_log("read from PTY client: '" + __debug_bytes_printable(ptyClientOutputBuffer, bytesRead) + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
VTermScreenCallbacks NCursesPtyWindow::screenCallbacks =
|
VTermScreenCallbacks NCursesPtyWindow::screenCallbacks =
|
||||||
|
@ -210,13 +214,13 @@ namespace krikkel::NCursesPtyWindow
|
||||||
attr_t NCursesPtyWindow::extractAttributesFromVTermCell(VTermScreenCell vTermCell)
|
attr_t NCursesPtyWindow::extractAttributesFromVTermCell(VTermScreenCell vTermCell)
|
||||||
{
|
{
|
||||||
attr_t result = A_NORMAL;
|
attr_t result = A_NORMAL;
|
||||||
__debug_log("unimplemented method called");
|
//__debug_log("unimplemented method called");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
short NCursesPtyWindow::extractColorFromVTermCell(VTermScreenCell vTermCell)
|
short NCursesPtyWindow::extractColorFromVTermCell(VTermScreenCell vTermCell)
|
||||||
{
|
{
|
||||||
__debug_log("unimplemented method called");
|
//__debug_log("unimplemented method called");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,4 +321,11 @@ namespace krikkel::NCursesPtyWindow
|
||||||
NCursesPtyWindow *instance = static_cast<NCursesPtyWindow *>(user);
|
NCursesPtyWindow *instance = static_cast<NCursesPtyWindow *>(user);
|
||||||
return instance->handlerPopLine(cols, cells);
|
return instance->handlerPopLine(cols, cells);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NCursesPtyWindow::staticHandlerOutput(const char *s, size_t len, void *user)
|
||||||
|
{
|
||||||
|
NCursesPtyWindow *instance = static_cast<NCursesPtyWindow *>(user);
|
||||||
|
for(size_t index = 0; index < len; ++index)
|
||||||
|
instance->writeToClient(s, len);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -24,7 +24,7 @@ namespace krikkel::NCursesPtyWindow
|
||||||
~NCursesPtyWindow();
|
~NCursesPtyWindow();
|
||||||
|
|
||||||
int getFdPtyClient() const;
|
int getFdPtyClient() const;
|
||||||
void writeToClient(char character);
|
void writeToClient(const char * string, size_t length) const;
|
||||||
|
|
||||||
int add_wch(cchar_t *character);
|
int add_wch(cchar_t *character);
|
||||||
int refresh() override;
|
int refresh() override;
|
||||||
|
@ -66,5 +66,6 @@ namespace krikkel::NCursesPtyWindow
|
||||||
static int staticHandlerResize(int rows, int cols, void *user);
|
static int staticHandlerResize(int rows, int cols, void *user);
|
||||||
static int staticHandlerPushLine(int cols, const VTermScreenCell *cells, void *user);
|
static int staticHandlerPushLine(int cols, const VTermScreenCell *cells, void *user);
|
||||||
static int staticHandlerPopLine(int cols, VTermScreenCell *cells, void *user);
|
static int staticHandlerPopLine(int cols, VTermScreenCell *cells, void *user);
|
||||||
|
static void staticHandlerOutput(const char *s, size_t len, void *user);
|
||||||
};
|
};
|
||||||
}
|
}
|
Loading…
Reference in a new issue