diff options
-rw-r--r-- | src/interface-curses.cpp | 13 | ||||
-rw-r--r-- | src/interface-gtk.cpp | 33 | ||||
-rw-r--r-- | src/interface-gtk.h | 12 |
3 files changed, 38 insertions, 20 deletions
diff --git a/src/interface-curses.cpp b/src/interface-curses.cpp index 7a242cd..be1bd21 100644 --- a/src/interface-curses.cpp +++ b/src/interface-curses.cpp @@ -248,8 +248,7 @@ InterfaceCurses::info_update_impl(const QRegister *reg) info_current = g_strconcat(PACKAGE_NAME " - <QRegister> ", name, NIL); g_free(name); - - draw_info(); + /* NOTE: drawn in event_loop_iter() */ } void @@ -259,8 +258,7 @@ InterfaceCurses::info_update_impl(const Buffer *buffer) info_current = g_strconcat(PACKAGE_NAME " - <Buffer> ", buffer->filename ? : UNNAMED_FILE, buffer->dirty ? "*" : "", NIL); - - draw_info(); + /* NOTE: drawn in event_loop_iter() */ } void @@ -577,6 +575,13 @@ event_loop_iter() sigint_occurred = FALSE; + /* + * Info window is updated very often which is very + * costly, especially when using PDC_set_title(), + * so we redraw it here, where the overhead does + * not matter much. + */ + interface.draw_info(); wnoutrefresh(interface.info_window); /* FIXME: this does wrefresh() internally */ interface.current_view->refresh(); diff --git a/src/interface-gtk.cpp b/src/interface-gtk.cpp index 900208c..3e1703e 100644 --- a/src/interface-gtk.cpp +++ b/src/interface-gtk.cpp @@ -90,6 +90,8 @@ InterfaceGtk::main_impl(int &argc, char **&argv) vbox = gtk_vbox_new(FALSE, 0); + info_current = g_strdup(PACKAGE_NAME); + cmdline_widget = gtk_entry_new(); gtk_entry_set_has_frame(GTK_ENTRY(cmdline_widget), FALSE); gtk_editable_set_editable(GTK_EDITABLE(cmdline_widget), FALSE); @@ -168,28 +170,21 @@ InterfaceGtk::show_view_impl(ViewGtk *view) void InterfaceGtk::info_update_impl(const QRegister *reg) { - gchar *str; gchar *name = String::canonicalize_ctl(reg->name); - str = g_strconcat(PACKAGE_NAME " - <QRegister> ", - name, NIL); + g_free(info_current); + info_current = g_strconcat(PACKAGE_NAME " - <QRegister> ", + name, NIL); g_free(name); - - gtk_window_set_title(GTK_WINDOW(window), str); - g_free(str); } void InterfaceGtk::info_update_impl(const Buffer *buffer) { - gchar *str; - - str = g_strconcat(PACKAGE_NAME " - <Buffer> ", - buffer->filename ? : UNNAMED_FILE, - buffer->dirty ? "*" : "", NIL); - - gtk_window_set_title(GTK_WINDOW(window), str); - g_free(str); + g_free(info_current); + info_current = g_strconcat(PACKAGE_NAME " - <Buffer> ", + buffer->filename ? : UNNAMED_FILE, + buffer->dirty ? "*" : "", NIL); } void @@ -290,6 +285,7 @@ InterfaceGtk::widget_set_font(GtkWidget *widget, const gchar *font_name) InterfaceGtk::~InterfaceGtk() { + g_free(info_current); if (popup_widget) gtk_widget_destroy(popup_widget); if (window) @@ -376,6 +372,15 @@ handle_key_press(bool is_shift, bool is_ctl, guint keyval) cmdline.keypress(key); } } + + /* + * The info area is updated very often and setting the + * window title each time it is updated is VERY costly. + * So we set it here once after every keypress even if the + * info line did not change. + */ + gtk_window_set_title(GTK_WINDOW(interface.window), + interface.info_current); } static gboolean diff --git a/src/interface-gtk.h b/src/interface-gtk.h index 4afac2f..389b096 100644 --- a/src/interface-gtk.h +++ b/src/interface-gtk.h @@ -67,8 +67,12 @@ public: typedef class InterfaceGtk : public Interface<InterfaceGtk, ViewGtk> { GtkWidget *window; GtkWidget *vbox; + + gchar *info_current; + GtkWidget *info_widget; + + GtkWidget *message_widget; GtkWidget *cmdline_widget; - GtkWidget *info_widget, *message_widget; GtkWidget *popup_widget; @@ -78,8 +82,9 @@ public: InterfaceGtk() : Interface(), window(NULL), vbox(NULL), + info_current(NULL), info_widget(NULL), + message_widget(NULL), cmdline_widget(NULL), - info_widget(NULL), message_widget(NULL), popup_widget(NULL), current_view_widget(NULL) {} ~InterfaceGtk(); @@ -140,6 +145,9 @@ private: static void widget_set_font(GtkWidget *widget, const gchar *font_name); void cmdline_insert_chr(gint &pos, gchar chr); + + friend static inline void handle_key_press(bool is_shift, bool is_ctl, + guint keyval); } InterfaceCurrent; } /* namespace SciTECO */ |