aboutsummaryrefslogtreecommitdiffhomepage
path: root/interface-ncurses.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-15 21:03:25 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-15 21:03:25 +0100
commiteb51ff93c5c54dfb82e607b4843f9160523076b7 (patch)
treef6db2c0e026508cb78128c994c02f216639f731d /interface-ncurses.cpp
parent8c27f0437054497360a8358c5e3fb516f1eaa996 (diff)
downloadsciteco-eb51ff93c5c54dfb82e607b4843f9160523076b7.tar.gz
NCurses interface: support terminal resizing
* currently, the message line is not remembered and reset on termresize * any open popup window will be drawn over by the other windows
Diffstat (limited to 'interface-ncurses.cpp')
-rw-r--r--interface-ncurses.cpp44
1 files changed, 38 insertions, 6 deletions
diff --git a/interface-ncurses.cpp b/interface-ncurses.cpp
index 904ae6c..7fc6ae9 100644
--- a/interface-ncurses.cpp
+++ b/interface-ncurses.cpp
@@ -46,11 +46,10 @@ InterfaceNCurses::InterfaceNCurses()
raw();
cbreak();
noecho();
- curs_set(0); // Scintilla draws its own cursor
+ curs_set(0); /* Scintilla draws its own cursor */
- setlocale(LC_CTYPE, ""); // for displaying UTF-8 characters properly
+ setlocale(LC_CTYPE, ""); /* for displaying UTF-8 characters properly */
- /* TODO: handle terminal resize */
/* NOTE: initializes color pairs */
sci = scintilla_new(scnotification);
sci_window = scintilla_get_window(sci);
@@ -60,16 +59,36 @@ InterfaceNCurses::InterfaceNCurses()
cmdline_window = newwin(0, 0, LINES - 1, 0);
keypad(cmdline_window, TRUE);
+ cmdline_current = NULL;
ssm(SCI_SETFOCUS, TRUE);
+ /* scintilla will be refreshed in event loop */
msg(MSG_USER, " ");
- cmdline_update();
+ cmdline_update("");
endwin();
}
void
+InterfaceNCurses::resize_all_windows(void)
+{
+ int lines, cols;
+
+ getmaxyx(stdscr, lines, cols);
+
+ wresize(sci_window, lines - 2, cols);
+ wresize(msg_window, 1, cols);
+ mvwin(msg_window, lines - 2, 0);
+ wresize(cmdline_window, 1, cols);
+ mvwin(cmdline_window, lines - 1, 0);
+
+ /* scintilla will be refreshed in event loop */
+ msg(MSG_USER, " "); /* FIXME: use saved message */
+ cmdline_update();
+}
+
+void
InterfaceNCurses::vmsg(MessageType type, const gchar *fmt, va_list ap)
{
static const short type2colorid[] = {
@@ -95,10 +114,18 @@ InterfaceNCurses::vmsg(MessageType type, const gchar *fmt, va_list ap)
void
InterfaceNCurses::cmdline_update(const gchar *cmdline)
{
- size_t len = strlen(cmdline);
- int half_line = (COLS - 2) / 2;
+ size_t len;
+ int half_line = (getmaxx(stdscr) - 2) / 2;
const gchar *line;
+ if (cmdline) {
+ g_free(cmdline_current);
+ cmdline_current = g_strdup(cmdline);
+ } else {
+ cmdline = cmdline_current;
+ }
+ len = strlen(cmdline);
+
/* FIXME: optimize */
line = cmdline + len - MIN(len, half_line + len % half_line);
@@ -193,6 +220,10 @@ InterfaceNCurses::event_loop(void)
key = wgetch(cmdline_window);
switch (key) {
+ case ERR:
+ case KEY_RESIZE:
+ resize_all_windows();
+ break;
case ESCAPE_SURROGATE:
cmdline_keypress('\x1B');
break;
@@ -225,6 +256,7 @@ InterfaceNCurses::~InterfaceNCurses()
delwin(sci_window);
delwin(cmdline_window);
+ g_free(cmdline_current);
delwin(msg_window);
if (popup_window)