void term_set_font(GtkWidget *win, VteTerminal *term, size_t index) { PangoFontDescription *font_desc = NULL; glong width, height; if (index >= sizeof fonts / sizeof fonts[0]) { fprintf(stderr, __NAME__": Warning: Invalid font index\n"); return; } width = vte_terminal_get_column_count(term); height = vte_terminal_get_row_count(term); font_desc = pango_font_description_from_string(fonts[index]); vte_terminal_set_font(term, font_desc); pango_font_description_free(font_desc); vte_terminal_set_font_scale(term, 1); term_set_size(win, term, width, height); if (win != NULL) vte_terminal_set_geometry_hints_for_window(VTE_TERMINAL(term), GTK_WINDOW(win)); }
static void char_size_realized(GtkWidget *widget, gpointer data) { VteTerminal *terminal = VTE_TERMINAL(widget); GtkWindow *window = GTK_WINDOW(data); if (!gtk_widget_get_realized (widget)) return; vte_terminal_set_geometry_hints_for_window(terminal, window); }
void term_set_font_scale(GtkWidget *win, VteTerminal *term, gdouble mult) { gdouble s; glong width, height; width = vte_terminal_get_column_count(term); height = vte_terminal_get_row_count(term); s = vte_terminal_get_font_scale(term); s *= mult; vte_terminal_set_font_scale(term, s); term_set_size(win, term, width, height); vte_terminal_set_geometry_hints_for_window(VTE_TERMINAL(term), GTK_WINDOW(win)); }
gboolean sig_key_press(GtkWidget *widget, GdkEvent *event, gpointer data) { VteTerminal *term = VTE_TERMINAL(widget); GtkWidget *win = (GtkWidget *)data; if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) { switch (((GdkEventKey *)event)->keyval) { case GDK_KEY_C: vte_terminal_copy_clipboard(term); return TRUE; case GDK_KEY_V: vte_terminal_paste_clipboard(term); return TRUE; case GDK_KEY_KP_0: vte_terminal_set_font_scale(term, 1); vte_terminal_set_geometry_hints_for_window(VTE_TERMINAL(term), GTK_WINDOW(win)); return TRUE; case GDK_KEY_KP_1: term_set_font(win, term, 0); return TRUE; case GDK_KEY_KP_2: term_set_font(win, term, 1); return TRUE; case GDK_KEY_KP_3: term_set_font(win, term, 2); return TRUE; case GDK_KEY_KP_4: term_set_font(win, term, 3); return TRUE; case GDK_KEY_KP_5: term_set_font(win, term, 4); return TRUE; case GDK_KEY_KP_6: term_set_font(win, term, 5); return TRUE; case GDK_KEY_KP_7: term_set_font(win, term, 6); return TRUE; case GDK_KEY_KP_8: term_set_font(win, term, 7); return TRUE; case GDK_KEY_KP_9: term_set_font(win, term, 8); return TRUE; } } return FALSE; }
gboolean setup_term(GtkWidget *win, GtkWidget *term, struct term_options *to) { static char *args_default[] = { NULL, NULL, NULL }; char **args_use; size_t i; GdkRGBA c_foreground_gdk; GdkRGBA c_background_gdk; GdkRGBA c_palette_gdk[16]; GdkRGBA c_gdk; VteRegex *url_vregex = NULL; GError *err = NULL; GSpawnFlags spawn_flags; if (to->argv != NULL) { args_use = to->argv; spawn_flags = G_SPAWN_SEARCH_PATH; } else { if (args_default[0] == NULL) { args_default[0] = vte_get_user_shell(); if (args_default[0] == NULL) args_default[0] = "/bin/sh"; if (login_shell) args_default[1] = g_strdup_printf("-%s", args_default[0]); else args_default[1] = args_default[0]; } args_use = args_default; spawn_flags = G_SPAWN_SEARCH_PATH | G_SPAWN_FILE_AND_ARGV_ZERO; } /* Appearance. */ term_set_font(NULL, VTE_TERMINAL(term), 0); gtk_widget_show_all(win); vte_terminal_set_allow_bold(VTE_TERMINAL(term), enable_bold); vte_terminal_set_cursor_blink_mode(VTE_TERMINAL(term), VTE_CURSOR_BLINK_OFF); vte_terminal_set_geometry_hints_for_window(VTE_TERMINAL(term), GTK_WINDOW(win)); vte_terminal_set_mouse_autohide(VTE_TERMINAL(term), TRUE); vte_terminal_set_scrollback_lines(VTE_TERMINAL(term), scrollback_lines); gdk_rgba_parse(&c_foreground_gdk, c_foreground); gdk_rgba_parse(&c_background_gdk, c_background); for (i = 0; i < 16; i++) gdk_rgba_parse(&c_palette_gdk[i], c_palette[i]); vte_terminal_set_colors(VTE_TERMINAL(term), &c_foreground_gdk, &c_background_gdk, c_palette_gdk, 16); if (c_bold != NULL) { gdk_rgba_parse(&c_gdk, c_bold); vte_terminal_set_color_bold(VTE_TERMINAL(term), &c_gdk); } if (c_cursor != NULL) { gdk_rgba_parse(&c_gdk, c_cursor); vte_terminal_set_color_cursor(VTE_TERMINAL(term), &c_gdk); } if (c_cursor_foreground != NULL) { gdk_rgba_parse(&c_gdk, c_cursor_foreground); vte_terminal_set_color_cursor_foreground(VTE_TERMINAL(term), &c_gdk); } url_vregex = vte_regex_new_for_match(url_regex, strlen(url_regex), PCRE2_MULTILINE | PCRE2_CASELESS, &err); if (url_vregex == NULL) fprintf(stderr, "url_regex: %s\n", err == NULL ? "<err is NULL>" : err->message); else { vte_terminal_match_add_regex(VTE_TERMINAL(term), url_vregex, 0); vte_regex_unref(url_vregex); } /* Signals. */ g_signal_connect(G_OBJECT(term), "bell", G_CALLBACK(sig_bell), win); g_signal_connect(G_OBJECT(term), "button-press-event", G_CALLBACK(sig_button_press), NULL); if (!to->hold) g_signal_connect(G_OBJECT(term), "child-exited", G_CALLBACK(sig_child_exited), win); g_signal_connect(G_OBJECT(term), "decrease-font-size", G_CALLBACK(sig_decrease_font_size), win); g_signal_connect(G_OBJECT(term), "increase-font-size", G_CALLBACK(sig_increase_font_size), win); g_signal_connect(G_OBJECT(term), "key-press-event", G_CALLBACK(sig_key_press), win); g_signal_connect(G_OBJECT(term), "resize-window", G_CALLBACK(sig_window_resize), win); g_signal_connect(G_OBJECT(term), "window-title-changed", G_CALLBACK(sig_window_title_changed), win); /* Spawn child. */ return vte_terminal_spawn_sync(VTE_TERMINAL(term), VTE_PTY_DEFAULT, to->cwd, args_use, NULL, spawn_flags, NULL, NULL, NULL, NULL, NULL); }