From f23f6b9ea8204a63d17baa712db06aac1ea1c3ad Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 12 Oct 2026 07:15:46 +0000 Subject: add terminal window size update --- include/line/cursor.h | 2 ++ include/line/getter.h | 2 ++ include/line/mode.h | 1 - include/signal_handler.h | 1 + module-test/line_test.cc | 14 +++++++++++++- src/line/cursor.cc | 20 ++++++++++++++++++++ src/line/mode.cc | 3 +++ src/signal/sigwinch_handler.cc | 13 +++++++++++++ 8 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/signal/sigwinch_handler.cc diff --git a/include/line/cursor.h b/include/line/cursor.h index 71a3a4a..63d275c 100644 --- a/include/line/cursor.h +++ b/include/line/cursor.h @@ -42,5 +42,7 @@ void reset_editor(); void cursor_skip_prompt(); +void check_window_update(); + } diff --git a/include/line/getter.h b/include/line/getter.h index 8a3ef7e..ac8683f 100644 --- a/include/line/getter.h +++ b/include/line/getter.h @@ -5,6 +5,8 @@ namespace ov4 { +inline bool windows_size_changed; + int get_terminal_pos_cursor(); int get_buffer_index_display_begin(); int get_buffer_index_display_end(); diff --git a/include/line/mode.h b/include/line/mode.h index 6a4d14d..3d40cef 100644 --- a/include/line/mode.h +++ b/include/line/mode.h @@ -15,5 +15,4 @@ void disable_raw(); void enable_raw(); - } diff --git a/include/signal_handler.h b/include/signal_handler.h index 12ab0a5..bc84744 100644 --- a/include/signal_handler.h +++ b/include/signal_handler.h @@ -25,6 +25,7 @@ void sigchld_handler(int sig); void sigint_handler(int sig); void sigtstp_handler(int sig); void sigquit_handler(int sig); +void sigwinch_handler(int sig); int block_all(sigset_t *prev); int block_handler(sigset_t *prev); diff --git a/module-test/line_test.cc b/module-test/line_test.cc index 6a0ef00..bea6d82 100644 --- a/module-test/line_test.cc +++ b/module-test/line_test.cc @@ -9,9 +9,21 @@ src/history.cc \ src/path.cc \ src/util/string.cc \ + src/signal/misc.cc \ + src/signal/sigwinch_handler.cc \ -std=c++26 -Iinclude -Ithird_party/magic_enum/include \ -O0 -ggdb3 -fno-omit-frame-pointer -fno-inline -D_GLIBCXX_ASSERTIONS \ - -o module-test/line_test.out + -o module-test/line_test.out\ + \ + src/option.cc \ + src/util/io.cc \ + src/signal/sigint_handler.cc \ + src/signal/sigtstp_handler.cc \ + src/signal/sigchld_handler.cc \ + src/signal/sigquit_handler.cc \ + src/job.cc \ + src/util/prompt.cc \ + src/util/color.cc * */ diff --git a/src/line/cursor.cc b/src/line/cursor.cc index 02e43cf..538dfca 100644 --- a/src/line/cursor.cc +++ b/src/line/cursor.cc @@ -21,6 +21,8 @@ namespace ov4 void print_override(const std::string &s) { + check_window_update(); + // save current cursor position // print("\x1b[s"); fflush(stdout); // WTF @@ -43,6 +45,8 @@ void print_override(const std::string &s) void move_cursor(char c) { + check_window_update(); + switch (c) { case 'A': @@ -64,6 +68,8 @@ void move_cursor(char c) void cursor_input_char(char c) { + check_window_update(); + // if receives any input // it should move to the latest history history_index = get_last_index(); @@ -97,6 +103,8 @@ void update_window_size() void move_cursor(T_cursor_movement_direction d) { + void check_window_update(); + switch (d) { case T_cursor_movement_direction::LEFT: @@ -159,6 +167,8 @@ void move_cursor(T_cursor_movement_direction d) void switch_history(T_cursor_movement_direction d) { + check_window_update(); + switch (d) { case T_cursor_movement_direction::UP: @@ -209,4 +219,14 @@ void cursor_skip_prompt() print("\r\x1b[{}C", prompt_pos-1); fflush(stdout); } +void check_window_update() +{ + if (windows_size_changed) + { + update_window_size(); + clear_below(); + windows_size_changed = false; + } +} + } diff --git a/src/line/mode.cc b/src/line/mode.cc index 06f1727..208465b 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -8,6 +8,7 @@ #include "line/cursor.h" #include "line/getter.h" #include "history.h" +#include "signal_handler.h" using namespace std; @@ -57,6 +58,8 @@ void enable_raw() atexit(disable_raw); + Signal(SIGWINCH, sigwinch_handler); + // TCSAFLUSH // the change shall occur after all output written to fildes is transmitted // and all input so far received but not read shall be discarded before the change is made diff --git a/src/signal/sigwinch_handler.cc b/src/signal/sigwinch_handler.cc new file mode 100644 index 0000000..4b692ed --- /dev/null +++ b/src/signal/sigwinch_handler.cc @@ -0,0 +1,13 @@ +#include "signal_handler.h" + +#include "line/getter.h" + +namespace ov4 +{ + +void sigwinch_handler([[maybe_unused]] int sig) +{ + windows_size_changed = true; +} + +} \ No newline at end of file -- cgit v1.3.1-4-g156e