add optional scrollbar

This commit is contained in:
Albert Safin 2017-08-12 09:16:12 +07:00
parent 3c2753bab2
commit 9521dc3b11
3 changed files with 53 additions and 13 deletions

3
config
View File

@ -34,6 +34,9 @@ scrollback_lines = 10000
# set size hints for the window # set size hints for the window
#size_hints = false #size_hints = false
# "off", "left" or "right"
#scrollbar = off
[colors] [colors]
# If both of these are unset, cursor falls back to the foreground color, # If both of these are unset, cursor falls back to the foreground color,
# and cursor_foreground falls back to the background color. # and cursor_foreground falls back to the background color.

View File

@ -47,6 +47,9 @@ Automatically hide the mouse pointer when you start typing.
Set the number of lines to limit the terminal's scrollback. Setting Set the number of lines to limit the terminal's scrollback. Setting
the number of lines to 0 disables this feature, a negative value makes the number of lines to 0 disables this feature, a negative value makes
the scrollback "infinite". the scrollback "infinite".
.IP \fIscrollbar\fR
Specify scrollbar visibility and position. Accepts \fBoff\fR, \fBleft\fR and
\fBright\fR.
.IP \fIscroll_on_keystroke\fR .IP \fIscroll_on_keystroke\fR
Scroll to the bottom automatically when a key is pressed. Scroll to the bottom automatically when a key is pressed.
.IP \fIscroll_on_output\fR .IP \fIscroll_on_output\fR

View File

@ -160,10 +160,11 @@ static void search(VteTerminal *vte, const char *pattern, bool reverse);
static void overlay_show(search_panel_info *info, overlay_mode mode, VteTerminal *vte); static void overlay_show(search_panel_info *info, overlay_mode mode, VteTerminal *vte);
static void get_vte_padding(VteTerminal *vte, int *left, int *top, int *right, int *bottom); static void get_vte_padding(VteTerminal *vte, int *left, int *top, int *right, int *bottom);
static char *check_match(VteTerminal *vte, GdkEventButton *event); static char *check_match(VteTerminal *vte, GdkEventButton *event);
static void load_config(GtkWindow *window, VteTerminal *vte, config_info *info, static void load_config(GtkWindow *window, VteTerminal *vte, GtkWidget *scrollbar, GtkWidget *hbox,
char **geometry, char **icon); config_info *info, char **geometry, char **icon, bool *show_scrollbar);
static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info, static void set_config(GtkWindow *window, VteTerminal *vte, GtkWidget *scrollbar, GtkWidget *hbox,
char **geometry, char **icon, GKeyFile *config); config_info *info, char **geometry, char **icon, bool *show_scrollbar,
GKeyFile *config);
static long first_row(VteTerminal *vte); static long first_row(VteTerminal *vte);
static std::function<void ()> reload_config; static std::function<void ()> reload_config;
@ -1370,8 +1371,9 @@ static void load_theme(GtkWindow *window, VteTerminal *vte, GKeyFile *config, hi
hints.roundness = get_config_double(config, "hints", "roundness").get_value_or(1.5); hints.roundness = get_config_double(config, "hints", "roundness").get_value_or(1.5);
} }
static void load_config(GtkWindow *window, VteTerminal *vte, config_info *info, static void load_config(GtkWindow *window, VteTerminal *vte, GtkWidget *scrollbar,
char **geometry, char **icon) { GtkWidget *hbox, config_info *info, char **geometry, char **icon,
bool *show_scrollbar) {
const std::string default_path = "/termite/config"; const std::string default_path = "/termite/config";
GKeyFile *config = g_key_file_new(); GKeyFile *config = g_key_file_new();
GError *error = nullptr; GError *error = nullptr;
@ -1406,13 +1408,14 @@ static void load_config(GtkWindow *window, VteTerminal *vte, config_info *info,
} }
if (loaded) { if (loaded) {
set_config(window, vte, info, geometry, icon, config); set_config(window, vte, scrollbar, hbox, info, geometry, icon, show_scrollbar, config);
} }
g_key_file_free(config); g_key_file_free(config);
} }
static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info, static void set_config(GtkWindow *window, VteTerminal *vte, GtkWidget *scrollbar, GtkWidget *hbox,
char **geometry, char **icon, GKeyFile *config) { config_info *info, char **geometry, char **icon, bool *show_scrollbar_ptr,
GKeyFile *config) {
if (geometry) { if (geometry) {
if (auto s = get_config_string(config, "options", "geometry")) { if (auto s = get_config_string(config, "options", "geometry")) {
*geometry = *s; *geometry = *s;
@ -1508,6 +1511,27 @@ static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info,
set_size_hints(GTK_WINDOW(window), vte); set_size_hints(GTK_WINDOW(window), vte);
} }
bool show_scrollbar = false;
if (auto s = get_config_string(config, "options", "scrollbar")) {
// "off" is implicitly handled by default
if (!g_ascii_strcasecmp(*s, "left")) {
show_scrollbar = true;
gtk_box_reorder_child(GTK_BOX(hbox), scrollbar, 0);
} else if (!g_ascii_strcasecmp(*s, "right")) {
show_scrollbar = true;
gtk_box_reorder_child(GTK_BOX(hbox), scrollbar, -1);
}
g_free(*s);
}
if (show_scrollbar) {
gtk_widget_show(scrollbar);
} else {
gtk_widget_hide(scrollbar);
}
if (show_scrollbar_ptr != nullptr) {
*show_scrollbar_ptr = show_scrollbar;
}
load_theme(window, vte, config, info->hints); load_theme(window, vte, config, info->hints);
}/*}}}*/ }/*}}}*/
@ -1554,6 +1578,7 @@ int main(int argc, char **argv) {
GOptionContext *context = g_option_context_new(nullptr); GOptionContext *context = g_option_context_new(nullptr);
char *role = nullptr, *geometry = nullptr, *execute = nullptr, *config_file = nullptr; char *role = nullptr, *geometry = nullptr, *execute = nullptr, *config_file = nullptr;
char *title = nullptr, *icon = nullptr; char *title = nullptr, *icon = nullptr;
bool show_scrollbar = false;
const GOptionEntry entries[] = { const GOptionEntry entries[] = {
{"version", 'v', 0, G_OPTION_ARG_NONE, &version, "Version info", nullptr}, {"version", 'v', 0, G_OPTION_ARG_NONE, &version, "Version info", nullptr},
{"exec", 'e', 0, G_OPTION_ARG_STRING, &execute, "Command to execute", "COMMAND"}, {"exec", 'e', 0, G_OPTION_ARG_STRING, &execute, "Command to execute", "COMMAND"},
@ -1598,6 +1623,11 @@ int main(int argc, char **argv) {
GtkWidget *vte_widget = vte_terminal_new(); GtkWidget *vte_widget = vte_terminal_new();
VteTerminal *vte = VTE_TERMINAL(vte_widget); VteTerminal *vte = VTE_TERMINAL(vte_widget);
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
GtkWidget *scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(vte_widget)));
gtk_box_pack_start(GTK_BOX(hbox), hint_overlay, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, FALSE, 0);
if (role) { if (role) {
gtk_window_set_role(GTK_WINDOW(window), role); gtk_window_set_role(GTK_WINDOW(window), role);
g_free(role); g_free(role);
@ -1633,11 +1663,12 @@ int main(int argc, char **argv) {
gtk_window_fullscreen gtk_window_fullscreen
}; };
load_config(GTK_WINDOW(window), vte, &info.config, geometry ? nullptr : &geometry, load_config(GTK_WINDOW(window), vte, scrollbar, hbox, &info.config,
icon ? nullptr : &icon); geometry ? nullptr : &geometry, icon ? nullptr : &icon, &show_scrollbar);
reload_config = [&]{ reload_config = [&]{
load_config(GTK_WINDOW(window), vte, &info.config, nullptr, nullptr); load_config(GTK_WINDOW(window), vte, scrollbar, hbox, &info.config,
nullptr, nullptr, nullptr);
}; };
signal(SIGUSR1, [](int){ reload_config(); }); signal(SIGUSR1, [](int){ reload_config(); });
@ -1659,7 +1690,7 @@ int main(int argc, char **argv) {
gtk_widget_set_halign(info.panel.entry, GTK_ALIGN_START); gtk_widget_set_halign(info.panel.entry, GTK_ALIGN_START);
gtk_widget_set_valign(info.panel.entry, GTK_ALIGN_END); gtk_widget_set_valign(info.panel.entry, GTK_ALIGN_END);
gtk_container_add(GTK_CONTAINER(panel_overlay), hint_overlay); gtk_container_add(GTK_CONTAINER(panel_overlay), hbox);
gtk_container_add(GTK_CONTAINER(hint_overlay), vte_widget); gtk_container_add(GTK_CONTAINER(hint_overlay), vte_widget);
gtk_container_add(GTK_CONTAINER(window), panel_overlay); gtk_container_add(GTK_CONTAINER(window), panel_overlay);
@ -1713,6 +1744,9 @@ int main(int argc, char **argv) {
gtk_widget_show_all(window); gtk_widget_show_all(window);
gtk_widget_hide(info.panel.entry); gtk_widget_hide(info.panel.entry);
gtk_widget_hide(info.panel.da); gtk_widget_hide(info.panel.da);
if (!show_scrollbar) {
gtk_widget_hide(scrollbar);
}
char **env = g_get_environ(); char **env = g_get_environ();