NCurses: rework terminal resize handling

This commit is contained in:
Maxime Coste 2012-10-27 14:18:52 +02:00
parent ee882d9d02
commit 24b43f91c8
2 changed files with 44 additions and 16 deletions

View File

@ -7,7 +7,10 @@
#include <map> #include <map>
#define CTRL(x) x - 'a' + 1 #include <signal.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <fcntl.h>
namespace Kakoune namespace Kakoune
{ {
@ -71,6 +74,18 @@ static void set_color(Color fg_color, Color bg_color)
} }
} }
static NCursesUI* signal_ui;
void on_term_resize(int)
{
int fd = open("/dev/tty", O_RDWR);
winsize ws;
if (fd == 0 or ioctl(fd, TIOCGWINSZ, (void*)&ws) != 0)
return;
close(fd);
resizeterm(ws.ws_row, ws.ws_col);
ungetch(KEY_RESIZE);
signal_ui->update_dimensions();
}
NCursesUI::NCursesUI() NCursesUI::NCursesUI()
{ {
@ -88,6 +103,11 @@ NCursesUI::NCursesUI()
m_menu_fg = get_color_pair(Color::Blue, Color::Cyan); m_menu_fg = get_color_pair(Color::Blue, Color::Cyan);
m_menu_bg = get_color_pair(Color::Cyan, Color::Blue); m_menu_bg = get_color_pair(Color::Cyan, Color::Blue);
update_dimensions();
signal_ui = this;
signal(SIGWINCH, on_term_resize);
} }
NCursesUI::~NCursesUI() NCursesUI::~NCursesUI()
@ -113,18 +133,21 @@ void addutf8str(Utf8Iterator begin, Utf8Iterator end)
addch(*begin++); addch(*begin++);
} }
void NCursesUI::draw(const DisplayBuffer& display_buffer, void NCursesUI::update_dimensions()
const String& status_line)
{ {
int max_x,max_y; int max_x,max_y;
getmaxyx(stdscr, max_y, max_x); getmaxyx(stdscr, max_y, max_x);
max_y -= 1; max_y -= 1;
int status_y = max_y; m_dimensions = { max_y, max_x };
}
int line_index = 0; void NCursesUI::draw(const DisplayBuffer& display_buffer,
const String& status_line)
{
LineCount line_index = 0;
for (const DisplayLine& line : display_buffer.lines()) for (const DisplayLine& line : display_buffer.lines())
{ {
move(line_index, 0); move((int)line_index, 0);
clrtoeol(); clrtoeol();
for (const DisplayAtom& atom : line) for (const DisplayAtom& atom : line)
{ {
@ -138,7 +161,8 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
String content = atom.content.content(); String content = atom.content.content();
int y,x; int y,x;
getyx(stdscr, y,x); getyx(stdscr, y,x);
if (content[content.length()-1] == '\n' and content.length() - 1 < max_x - x) if (content[content.length()-1] == '\n' and
content.char_length() - 1 < m_dimensions.column - x)
{ {
addutf8str(Utf8Iterator(content.begin()), Utf8Iterator(content.end())-1); addutf8str(Utf8Iterator(content.begin()), Utf8Iterator(content.end())-1);
addch(' '); addch(' ');
@ -146,8 +170,8 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
else else
{ {
Utf8Iterator begin(content.begin()), end(content.end()); Utf8Iterator begin(content.begin()), end(content.end());
if (end - begin > max_x - x) if (end - begin > m_dimensions.column - x)
end = begin + (max_x - x); end = begin + m_dimensions.column - x;
addutf8str(begin, end); addutf8str(begin, end);
} }
} }
@ -159,18 +183,18 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
set_attribute(A_BLINK, 0); set_attribute(A_BLINK, 0);
set_attribute(A_BOLD, 0); set_attribute(A_BOLD, 0);
set_color(Color::Blue, Color::Black); set_color(Color::Blue, Color::Black);
for (;line_index < max_y; ++line_index) for (;line_index < m_dimensions.line; ++line_index)
{ {
move(line_index, 0); move((int)line_index, 0);
clrtoeol(); clrtoeol();
addch('~'); addch('~');
} }
set_color(Color::Cyan, Color::Black); set_color(Color::Cyan, Color::Black);
static int last_status_length = 0; static int last_status_length = 0;
move(status_y, max_x - last_status_length); move((int)m_dimensions.line, (int)(m_dimensions.column - last_status_length));
clrtoeol(); clrtoeol();
move(status_y, max_x - (int)status_line.length()); move((int)m_dimensions.line, (int)(m_dimensions.column - status_line.char_length()));
addstr(status_line.c_str()); addstr(status_line.c_str());
last_status_length = (int)status_line.length(); last_status_length = (int)status_line.length();
@ -311,9 +335,7 @@ void NCursesUI::menu_hide()
DisplayCoord NCursesUI::dimensions() DisplayCoord NCursesUI::dimensions()
{ {
int max_x,max_y; return m_dimensions;
getmaxyx(stdscr, max_y, max_x);
return {max_y - 1, max_x};
} }
} }

View File

@ -32,6 +32,11 @@ public:
DisplayCoord dimensions() override; DisplayCoord dimensions() override;
private: private:
friend void on_term_resize(int);
DisplayCoord m_dimensions;
void update_dimensions();
MENU* m_menu = nullptr; MENU* m_menu = nullptr;
WINDOW* m_menu_win = nullptr; WINDOW* m_menu_win = nullptr;
std::vector<ITEM*> m_items; std::vector<ITEM*> m_items;
@ -40,6 +45,7 @@ private:
DisplayCoord m_menu_pos; DisplayCoord m_menu_pos;
DisplayCoord m_menu_size; DisplayCoord m_menu_size;
int m_menu_fg; int m_menu_fg;
int m_menu_bg; int m_menu_bg;
}; };