NCurses: rework terminal resize handling
This commit is contained in:
parent
ee882d9d02
commit
24b43f91c8
|
@ -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};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user