aboutsummaryrefslogtreecommitdiffhomepage
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
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
-rw-r--r--interface-gtk.cpp6
-rw-r--r--interface-gtk.h2
-rw-r--r--interface-ncurses.cpp44
-rw-r--r--interface-ncurses.h5
-rw-r--r--interface.h3
5 files changed, 50 insertions, 10 deletions
diff --git a/interface-gtk.cpp b/interface-gtk.cpp
index 38100fe..ed0b36c 100644
--- a/interface-gtk.cpp
+++ b/interface-gtk.cpp
@@ -69,7 +69,7 @@ InterfaceGtk::InterfaceGtk()
ssm(SCI_SETFOCUS, TRUE);
- cmdline_update();
+ cmdline_update("");
}
void
@@ -100,6 +100,10 @@ InterfaceGtk::cmdline_update(const gchar *cmdline)
{
gint pos = 1;
+ if (!cmdline)
+ /* widget automatically redrawn */
+ return;
+
gtk_entry_set_text(GTK_ENTRY(cmdline_widget), "*");
gtk_editable_insert_text(GTK_EDITABLE(cmdline_widget),
cmdline, -1, &pos);
diff --git a/interface-gtk.h b/interface-gtk.h
index 5b48ef6..661786a 100644
--- a/interface-gtk.h
+++ b/interface-gtk.h
@@ -42,7 +42,7 @@ public:
iMessage, wParam, lParam);
}
- void cmdline_update(const gchar *cmdline = "");
+ void cmdline_update(const gchar *cmdline = NULL);
void popup_add_filename(PopupFileType type,
const gchar *filename, bool highlight = false);
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)
diff --git a/interface-ncurses.h b/interface-ncurses.h
index 9b938a2..9469cfc 100644
--- a/interface-ncurses.h
+++ b/interface-ncurses.h
@@ -21,12 +21,15 @@ extern class InterfaceNCurses : public Interface {
WINDOW *sci_window;
WINDOW *msg_window;
WINDOW *cmdline_window;
+ gchar *cmdline_current;
WINDOW *popup_window;
GSList *popup_list;
gint popup_list_longest;
gint popup_list_length;
+ void resize_all_windows(void);
+
public:
InterfaceNCurses();
~InterfaceNCurses();
@@ -39,7 +42,7 @@ public:
return scintilla_send_message(sci, iMessage, wParam, lParam);
}
- void cmdline_update(const gchar *cmdline = "");
+ void cmdline_update(const gchar *cmdline = NULL);
void popup_add_filename(PopupFileType type,
const gchar *filename, bool highlight = false);
diff --git a/interface.h b/interface.h
index f84649a..d40506a 100644
--- a/interface.h
+++ b/interface.h
@@ -44,7 +44,8 @@ public:
virtual sptr_t ssm(unsigned int iMessage,
uptr_t wParam = 0, sptr_t lParam = 0) = 0;
- virtual void cmdline_update(const gchar *cmdline = "") = 0;
+ /* NULL means to redraw the current cmdline if necessary */
+ virtual void cmdline_update(const gchar *cmdline = NULL) = 0;
enum PopupFileType {
POPUP_FILE,