diff --git a/src/interactive/interactive.cpp b/src/interactive/interactive.cpp index 9543a59..c66a502 100644 --- a/src/interactive/interactive.cpp +++ b/src/interactive/interactive.cpp @@ -8,60 +8,20 @@ #include #include #include +#include +#include #include "interactive.hpp" namespace interactive { int fullscreen_window::ncurses_streambuf::overflow(int c) { if (c != EOF) { - // Check for ANSI escape sequence - if (c == '\033') { - is_escape_sequence = true; - escape_sequence = "\033"; - } else if (is_escape_sequence) { - escape_sequence += static_cast(c); - - // Check if the escape sequence is complete - if (escape_sequence.size() >= 2 && escape_sequence[1] == '[' && - (c == 'm' || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) { - - // Handle color codes - if (escape_sequence.back() == 'm') { - // Process color code - if (escape_sequence == "\033[0m") { - wattrset(win, A_NORMAL); // Reset attributes - } else if (escape_sequence == "\033[1;31m") { - wattron(win, COLOR_PAIR(1)); // Red - } else if (escape_sequence == "\033[1;32m") { - wattron(win, COLOR_PAIR(2)); // Green - } else if (escape_sequence == "\033[1;33m") { - wattron(win, COLOR_PAIR(3)); // Yellow - } else if (escape_sequence == "\033[1;34m") { - wattron(win, COLOR_PAIR(4)); // Blue - } else if (escape_sequence == "\033[1;35m") { - wattron(win, COLOR_PAIR(5)); // Magenta - } else if (escape_sequence == "\033[1;36m") { - wattron(win, COLOR_PAIR(6)); // Cyan - } else if (escape_sequence == "\033[1;37m") { - wattron(win, COLOR_PAIR(7)); // White - } else if (escape_sequence == "\033[90m") { - wattron(win, A_DIM | COLOR_PAIR(7)); // Dark grey - } else if (escape_sequence == "\033[38;5;142m") { - wattron(win, COLOR_PAIR(3) | A_DIM); // Dark yellow - } else if (escape_sequence == "\033[38;5;250m") { - wattron(win, COLOR_PAIR(7) | A_DIM); // Light grey - } - } - - is_escape_sequence = false; - escape_sequence.clear(); - } - } else if (c == '\n') { + buffer += static_cast(c); + if (c == '\n') { + // Process buffer with proper escape sequence handling wprintw(win, "%s", buffer.c_str()); wrefresh(win); buffer.clear(); - } else { - buffer += static_cast(c); } } return c; @@ -71,7 +31,9 @@ fullscreen_window::fullscreen_window(std::string title) { // Set locale for wide character support std::setlocale(LC_ALL, ""); - // Initialize ncurses + // Initialize ncurses with proper terminal capabilities + putenv(const_cast("TERM=xterm-256color")); + initscr(); raw(); // Use raw mode for better control noecho(); @@ -83,15 +45,6 @@ fullscreen_window::fullscreen_window(std::string title) { start_color(); use_default_colors(); - // Initialize color pairs for ANSI colors - init_pair(1, COLOR_RED, -1); // Red - init_pair(2, COLOR_GREEN, -1); // Green - init_pair(3, COLOR_YELLOW, -1); // Yellow - init_pair(4, COLOR_BLUE, -1); // Blue - init_pair(5, COLOR_MAGENTA, -1); // Magenta - init_pair(6, COLOR_CYAN, -1); // Cyan - init_pair(7, COLOR_WHITE, -1); // White - refresh(); // Create display window (takes up all but bottom 4 lines) @@ -100,6 +53,10 @@ fullscreen_window::fullscreen_window(std::string title) { display_win = newwin(max_y - 4, max_x, 0, 0); scrollok(display_win, TRUE); keypad(display_win, TRUE); // Enable keypad for display window + + // Important: set terminal capabilities for this window + nodelay(display_win, TRUE); + wrefresh(display_win); // Create input window (bottom 4 lines) diff --git a/src/interactive/interactive.hpp b/src/interactive/interactive.hpp index a080c83..a92b9c2 100644 --- a/src/interactive/interactive.hpp +++ b/src/interactive/interactive.hpp @@ -23,8 +23,6 @@ class fullscreen_window { private: WINDOW* win; std::string buffer; - bool is_escape_sequence = false; - std::string escape_sequence; protected: virtual int overflow(int c) override;