diff options
-rw-r--r-- | interface-gtk.cpp | 6 | ||||
-rw-r--r-- | interface-gtk.h | 2 | ||||
-rw-r--r-- | interface-ncurses.cpp | 44 | ||||
-rw-r--r-- | interface-ncurses.h | 5 | ||||
-rw-r--r-- | interface.h | 3 |
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, |