From aff47d79bdd05e84969133306704c381e01523b6 Mon Sep 17 00:00:00 2001 From: PreacherDHM Date: Wed, 15 Apr 2026 06:58:59 -0700 Subject: [PATCH] working on ssh fork --- CMakeLists.txt | 2 +- includes/tart.h | 11 ++++++-- source/CMakeLists.txt | 5 ++++ source/tart.c | 66 ++++++++++++++++++++++++++++++++----------- 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 785bc60..9d1149a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,5 +25,5 @@ add_subdirectory(externals) # PROJECT add_subdirectory(source) # -add_subdirectory(test) +#add_subdirectory(test) diff --git a/includes/tart.h b/includes/tart.h index 109eb6d..2a30694 100644 --- a/includes/tart.h +++ b/includes/tart.h @@ -14,6 +14,7 @@ typedef unsigned int TART_FLAGS; typedef unsigned char tart_byte; typedef unsigned short tart_id; +#include #ifdef TART_UTF8 #include @@ -90,6 +91,8 @@ typedef struct { tart_vec2 terminalSize; tart_buffer buffer; const char* name; + + ssh_channel ch; }tart_window ; @@ -189,12 +192,14 @@ typedef struct { #define t_strncpy wcncpy #endif -int tart_create_window(tart_window* w, tart_vec2 ws, const char* title); +int tart_create_window(tart_window* w, tart_vec2 ws, const char* title, ssh_channel ch); int tart_init(tart_window* w); int tart_close(tart_window* w); -void tart_disable_cusor(); -void tart_enable_cusor(); +tart_vec2 tart_window_resize(tart_window* w, tart_vec2 size); +void tart_disable_cusor(tart_window* w); +void tart_enable_cusor(tart_window* w); int tart_draw(tart_window* w); +int tart_draw_to_buffer(tart_window* w); int tart_jump(tart_window* w, tart_vec2 pos); int tart_move_cursor(tart_window* w, tart_vec2 pos); diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 1f9dcd5..caee0df 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -12,6 +12,11 @@ add_library(${PROJECT_NAME} STATIC ${LIB_SOURCES}) target_include_directories(${PROJECT_NAME} BEFORE PUBLIC "../includes/") +target_link_libraries( + ${PROJECT_NAME} + ssh +) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") target_compile_definitions(${PROJECT_NAME} PUBLIC "_LINUX") endif() diff --git a/source/tart.c b/source/tart.c index 11c36d8..c4931d4 100644 --- a/source/tart.c +++ b/source/tart.c @@ -7,6 +7,7 @@ #include #include #include +#include #define BUFFER_AT_POS(W) (W->windowSize.x * W->buffer.curser.y) + W->buffer.curser.x @@ -14,12 +15,21 @@ #define BUFFER_SIZE (w->windowSize.x * w->windowSize.y) #define BUFFER_BUFFER_SIZE BUFFER_LINE_SIZE * w->windowSize.y +void tart_free_buffer(tart_window* w) { + for (int i = 0; i < w->windowSize.y; i++) { + free(w->buffer.buffer[i]); + + } + free(w->buffer.buffer); +} + tart_vec2 GetTerminalSize(tart_window* w) { struct winsize win; ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); return (tart_vec2){win.ws_col,win.ws_row}; }; + int tart_create_buffer(tart_window* w) { w->buffer.buffer = (tart_cell**)malloc(w->windowSize.y * sizeof(tart_cell*)); if(w->buffer.buffer == NULL) { @@ -70,19 +80,26 @@ int tart_create_buffer(tart_window* w) { return TART_OK; } -void tart_free_buffer(tart_window* w) { - free(w->buffer.buffer); +tart_vec2 tart_window_resize(tart_window* w, tart_vec2 size) { + printf("size.x %d, size.y %d\n", size.x, size.y); + tart_free_buffer(w); + w->windowSize = size; + w->terminalSize = size; + tart_create_buffer(w); + return size; } -int tart_create_window(tart_window* w, tart_vec2 ws, const char* title) { - w->windowSize.x = GetTerminalSize(w).x - 1; - w->windowSize.y = GetTerminalSize(w).y; - w->terminalSize = GetTerminalSize(w); +int tart_create_window(tart_window* w, tart_vec2 ws, const char* title, ssh_channel ch) { + w->windowSize.x = ws.x - 1; + w->windowSize.y = ws.y; + w->terminalSize = ws; w->homePosition = (tart_vec2){ (w->terminalSize.x / 2) - (w->windowSize.x / 2), (w->terminalSize.x / 2) - (w->windowSize.x / 2) }; + w->ch = ch; + tart_create_buffer(w); return TART_OK; @@ -110,8 +127,8 @@ int flush_buffer(tart_window* w) { #endif ); for(int i = 0; i < w->windowSize.y; i++) { - for(int j = 0; j < w->windowSize.x ; j++) { - bzero(w->buffer.buffer[i][j], sizeof(tart_cell)); + for(int j = 0; j < w->windowSize.x + 1 ; j++) { + bzero(w->buffer.buffer[i][j], TART_CELL_SIZE); memcpy(w->buffer.buffer[i][j], ce, sizeof(tart_cell)); } @@ -143,22 +160,24 @@ int tart_init(tart_window* w) { //write(STDOUT_FILENO, ce, TART_CELL_SIZE); - write(STDOUT_FILENO, "\e[?1049h", 8); - write(STDOUT_FILENO, "\e[H", 3); - write(STDOUT_FILENO, "\e[s", 3); + ssh_channel_write(w->ch, "\e[?1049h", 8); + ssh_channel_write(w->ch, "\e[H", 3); + ssh_channel_write(w->ch, "\e[s", 3); return TART_OK; } -void tart_disable_cusor() { - write(STDOUT_FILENO, "\e[?25l", 6); +void tart_disable_cusor(tart_window* w) { + //write(STDOUT_FILENO, "\e[?25l", 6); + ssh_channel_write(w->ch, "\e[?25l", strlen("\e[?25l")); } -void tart_enable_cusor() { - write(STDOUT_FILENO, "\e[?25h", 6); +void tart_enable_cusor(tart_window* w) { + //write(STDOUT_FILENO, "\e[?25h", 6); + ssh_channel_write(w->ch, "\e[?25h", strlen("\e[?25h")); } int tart_close(tart_window* w) { - write(STDOUT_FILENO, "\e[?1049l", 8); + ssh_channel_write(w->ch, "\e[?1049l", 8); //for(int i = 0; i < w->windowSize.y; i++) { // free(w->buffer.buffer[i]); //} @@ -179,6 +198,21 @@ int tart_draw(tart_window* w) { return TART_OK; } +int tart_draw_to_buffer(tart_window* w) { + int bufferSize = TART_OK; + int windowBufferSize = (w->windowSize.x + 1) * w->windowSize.y * TART_CELL_SIZE; + char cusureMoveBuff[30] = ""; + int index = 0; + for(int i = 0; i < w->windowSize.y; i++) { + ssh_channel_write(w->ch,w->buffer.buffer[i], TART_CELL_SIZE * (w->windowSize.x + 1)); + int wrote = sprintf(cusureMoveBuff,"\e[1B\e[%dD", w->windowSize.x + 1); + ssh_channel_write(w->ch,cusureMoveBuff, wrote); + } + ssh_channel_write(w->ch,"\e[H",strlen("\e[H")); + flush_buffer(w); + return bufferSize; +} + int tart_jump(tart_window* w, tart_vec2 pos) { w->buffer.jump = pos; w->buffer.curser = pos;