diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index 9daf7500..a2364fd3 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -239,11 +239,6 @@ void on_term_resize(int) EventManager::instance().force_signal(0); } -void on_sigint(int) -{ - // do nothing -} - NCursesUI::NCursesUI() : m_stdin_watcher{0, [this](FDWatcher&, EventMode mode) { if (m_input_callback) @@ -262,16 +257,17 @@ NCursesUI::NCursesUI() use_default_colors(); set_escdelay(25); - signal(SIGWINCH, on_term_resize); - signal(SIGINT, on_sigint); - mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, nullptr); mouseinterval(0); // force enable report mouse position puts("\033[?1002h"); - update_dimensions(); - wrefresh(stdscr); + signal(SIGWINCH, on_term_resize); + signal(SIGINT, [](int){}); + + check_resize(true); + + redraw(); } NCursesUI::~NCursesUI() @@ -326,17 +322,6 @@ static CharCoord window_pos(WINDOW* win) return pos; } -void NCursesUI::update_dimensions() -{ - m_dimensions = window_size(stdscr); - - if (m_window) - delwin(m_window); - m_window = (NCursesWin*)newwin((int)m_dimensions.line, (int)m_dimensions.column, 0, 0); - - --m_dimensions.line; -} - void NCursesUI::draw_line(const DisplayLine& line, CharCount col_index, const Face& default_face) const { @@ -440,22 +425,32 @@ void NCursesUI::draw_status(const DisplayLine& status_line, m_dirty = true; } -void NCursesUI::check_resize() +void NCursesUI::check_resize(bool force) { - if (resize_pending) + if (not force and not resize_pending) + return; + + resize_pending = 0; + + const int fd = open("/dev/tty", O_RDWR); + auto close_fd = on_scope_end([fd]{ close(fd); }); + winsize ws; + if (ioctl(fd, TIOCGWINSZ, (void*)&ws) == 0) { - int fd = open("/dev/tty", O_RDWR); - winsize ws; - if (ioctl(fd, TIOCGWINSZ, (void*)&ws) == 0) - { - close(fd); - resizeterm(ws.ws_row, ws.ws_col); - update_dimensions(); - } - ungetch(KEY_RESIZE); - m_dirty = true; - resize_pending = false; + resize_term(ws.ws_row, ws.ws_col); + + if (m_window) + delwin(m_window); + m_window = (NCursesWin*)newwin(ws.ws_row, ws.ws_col, 0, 0); + + m_dimensions = CharCoord{ws.ws_row-1, ws.ws_col}; } + else + kak_assert(false); + + m_dirty = true; + ungetch(KEY_RESIZE); + wrefresh(stdscr); } bool NCursesUI::is_key_available() @@ -496,7 +491,10 @@ Key NCursesUI::get_key() if (c > 0 and c < 27) { if (c == CTRL('l')) - redrawwin(stdscr); + { + redrawwin(m_window); + redraw(); + } if (c == CTRL('z')) { raise(SIGTSTP); diff --git a/src/ncurses_ui.hh b/src/ncurses_ui.hh index ac73332d..9669ecf5 100644 --- a/src/ncurses_ui.hh +++ b/src/ncurses_ui.hh @@ -52,7 +52,7 @@ public: static void abort(); private: - void check_resize(); + void check_resize(bool force = false); void redraw(); void draw_line(const DisplayLine& line, CharCount col_index, const Face& default_face) const; @@ -62,7 +62,6 @@ private: NCursesWin* m_window = nullptr; CharCoord m_dimensions; - void update_dimensions(); NCursesWin* m_menu_win = nullptr; Vector m_items;