81
81
if (!gtk_widget_get_realized (GTK_WIDGET (window)))
84
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
84
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
85
85
geometry.width_inc = width;
86
86
geometry.height_inc = height;
87
87
geometry.base_width = inner_border ? (inner_border->left + inner_border->right) : 0;
88
88
geometry.base_height = inner_border ? (inner_border->top + inner_border->bottom) : 0;
89
89
geometry.min_width = geometry.base_width + width * 2;
90
90
geometry.min_height = geometry.base_height + height * 2;
91
gtk_border_free (inner_border);
91
gtk_border_free (inner_border);
93
93
gtk_window_set_geometry_hints(window, widget, &geometry,
94
94
GDK_HINT_RESIZE_INC |
113
113
if (!gtk_widget_get_realized (GTK_WIDGET(window)))
116
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
116
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
117
117
width = vte_terminal_get_char_width (terminal);
118
118
height = vte_terminal_get_char_height (terminal);
119
119
geometry.width_inc = width;
122
122
geometry.base_height = inner_border ? (inner_border->top + inner_border->bottom) : 0;
123
123
geometry.min_width = geometry.base_width + width * 2;
124
124
geometry.min_height = geometry.base_height + height * 2;
125
gtk_border_free (inner_border);
125
gtk_border_free (inner_border);
127
127
gtk_window_set_geometry_hints(window, widget, &geometry,
128
128
GDK_HINT_RESIZE_INC |
188
188
VteTerminal *terminal;
191
GtkBorder *inner_border;
192
int char_width, char_height;
191
GtkBorder *inner_border;
192
int char_width, char_height;
194
194
switch (event->button) {
196
196
terminal = VTE_TERMINAL(widget);
198
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
199
char_width = vte_terminal_get_char_width (terminal);
200
char_height = vte_terminal_get_char_height (terminal);
198
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
199
char_width = vte_terminal_get_char_width (terminal);
200
char_height = vte_terminal_get_char_height (terminal);
201
201
match = vte_terminal_match_check(terminal,
202
202
(event->x - (inner_border ? inner_border->left : 0)) / char_width,
203
203
(event->y - (inner_border ? inner_border->top : 0)) / char_height,
205
gtk_border_free (inner_border);
205
gtk_border_free (inner_border);
206
206
if (match != NULL) {
207
207
g_print("Matched `%s' (%d).\n", match, tag);
308
308
VteTerminal *terminal;
310
310
if ((GTK_IS_WINDOW(data)) && (width >= 2) && (height >= 2)) {
311
gint owidth, oheight, char_width, char_height, column_count, row_count;
312
GtkBorder *inner_border;
311
gint owidth, oheight, char_width, char_height, column_count, row_count;
312
GtkBorder *inner_border;
314
314
terminal = VTE_TERMINAL(widget);
316
316
gtk_window_get_size(GTK_WINDOW(data), &owidth, &oheight);
318
318
/* Take into account border overhead. */
319
char_width = vte_terminal_get_char_width (terminal);
320
char_height = vte_terminal_get_char_height (terminal);
321
column_count = vte_terminal_get_column_count (terminal);
322
row_count = vte_terminal_get_row_count (terminal);
323
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
319
char_width = vte_terminal_get_char_width (terminal);
320
char_height = vte_terminal_get_char_height (terminal);
321
column_count = vte_terminal_get_column_count (terminal);
322
row_count = vte_terminal_get_row_count (terminal);
323
gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
325
owidth -= char_width * column_count;
326
oheight -= char_height * row_count;
327
if (inner_border != NULL) {
328
owidth -= inner_border->left + inner_border->right;
329
oheight -= inner_border->top + inner_border->bottom;
325
owidth -= char_width * column_count;
326
oheight -= char_height * row_count;
327
if (inner_border != NULL) {
328
owidth -= inner_border->left + inner_border->right;
329
oheight -= inner_border->top + inner_border->bottom;
331
331
gtk_window_resize(GTK_WINDOW(data),
332
332
width + owidth, height + oheight);
333
gtk_border_free (inner_border);
333
gtk_border_free (inner_border);
522
522
flags_klass = (GFlagsClass*)g_type_class_ref(type);
523
523
for (i = 0; flags[i] != NULL; ++i) {
524
const GFlagsValue *flags_value;
524
const GFlagsValue *flags_value;
526
flags_value = g_flags_get_value_by_nick(flags_klass, flags[i]);
528
value |= flags_value->value;
530
g_warning("Unknown flag '%s'\n", flags[i]);
526
flags_value = g_flags_get_value_by_nick(flags_klass, flags[i]);
528
value |= flags_value->value;
530
g_warning("Unknown flag '%s'\n", flags[i]);
532
532
g_type_class_unref(flags_klass);
538
538
main(int argc, char **argv)
540
540
GdkScreen *screen;
541
#if GTK_CHECK_VERSION (2, 90, 8)
541
544
GdkColormap *colormap;
542
546
GtkWidget *window, *widget,*hbox = NULL, *scrollbar, *scrolled_window = NULL;
543
547
VteTerminal *terminal;
544
548
char *env_add[] = {
553
557
icon_title = FALSE, shell = TRUE, highlight_set = FALSE,
554
558
cursor_set = FALSE, reverse = FALSE, use_geometry_hints = TRUE,
555
559
antialias = TRUE, use_scrolled_window = FALSE,
556
show_object_notifications = FALSE;
557
char *geometry = NULL;
560
show_object_notifications = FALSE;
561
char *geometry = NULL;
558
562
gint lines = 100;
559
563
const char *message = "Launching interactive shell...\r\n";
560
564
const char *font = NULL;
562
566
const char *command = NULL;
563
567
const char *working_directory = NULL;
564
568
const char *output_file = NULL;
565
char *pty_flags_string = NULL;
566
char *cursor_blink_mode_string = NULL;
567
char *cursor_shape_string = NULL;
568
char *scrollbar_policy_string = NULL;
569
char *pty_flags_string = NULL;
570
char *cursor_blink_mode_string = NULL;
571
char *cursor_shape_string = NULL;
572
char *scrollbar_policy_string = NULL;
569
573
GdkColor fore, back, tint, highlight, cursor;
570
574
const GOptionEntry options[]={
649
653
G_OPTION_ARG_INT, &lines,
650
654
"Specify the number of scrollback-lines", NULL
653
"cursor-blink", 0, 0,
654
G_OPTION_ARG_STRING, &cursor_blink_mode_string,
655
"Cursor blink mode (system|on|off)", "MODE"
657
"cursor-blink", 0, 0,
658
G_OPTION_ARG_STRING, &cursor_blink_mode_string,
659
"Cursor blink mode (system|on|off)", "MODE"
658
662
"color-cursor", 'r', 0,
659
663
G_OPTION_ARG_NONE, &cursor_set,
724
728
GOptionContext *context;
725
729
GError *error = NULL;
726
VteTerminalCursorBlinkMode cursor_blink_mode = VTE_CURSOR_BLINK_SYSTEM;
727
VteTerminalCursorShape cursor_shape = VTE_CURSOR_SHAPE_BLOCK;
728
GtkPolicyType scrollbar_policy = GTK_POLICY_ALWAYS;
729
VtePtyFlags pty_flags = VTE_PTY_DEFAULT;
730
VteTerminalCursorBlinkMode cursor_blink_mode = VTE_CURSOR_BLINK_SYSTEM;
731
VteTerminalCursorShape cursor_shape = VTE_CURSOR_SHAPE_BLOCK;
732
GtkPolicyType scrollbar_policy = GTK_POLICY_ALWAYS;
733
VtePtyFlags pty_flags = VTE_PTY_DEFAULT;
731
735
/* Have to do this early. */
732
736
if (getenv("VTE_PROFILE_MEMORY")) {
750
if (cursor_blink_mode_string) {
751
cursor_blink_mode = parse_enum(VTE_TYPE_TERMINAL_CURSOR_BLINK_MODE, cursor_blink_mode_string);
752
g_free(cursor_blink_mode_string);
754
if (cursor_shape_string) {
755
cursor_shape = parse_enum(VTE_TYPE_TERMINAL_CURSOR_SHAPE, cursor_shape_string);
756
g_free(cursor_shape_string);
758
if (scrollbar_policy_string) {
759
scrollbar_policy = parse_enum(GTK_TYPE_POLICY_TYPE, scrollbar_policy_string);
760
g_free(scrollbar_policy_string);
762
if (pty_flags_string) {
763
pty_flags |= parse_flags(VTE_TYPE_PTY_FLAGS, pty_flags_string);
764
g_free(pty_flags_string);
754
if (cursor_blink_mode_string) {
755
cursor_blink_mode = parse_enum(VTE_TYPE_TERMINAL_CURSOR_BLINK_MODE, cursor_blink_mode_string);
756
g_free(cursor_blink_mode_string);
758
if (cursor_shape_string) {
759
cursor_shape = parse_enum(VTE_TYPE_TERMINAL_CURSOR_SHAPE, cursor_shape_string);
760
g_free(cursor_shape_string);
762
if (scrollbar_policy_string) {
763
scrollbar_policy = parse_enum(GTK_TYPE_POLICY_TYPE, scrollbar_policy_string);
764
g_free(scrollbar_policy_string);
766
if (pty_flags_string) {
767
pty_flags |= parse_flags(VTE_TYPE_PTY_FLAGS, pty_flags_string);
768
g_free(pty_flags_string);
768
772
back.red = back.green = back.blue = 0xffff;
789
793
/* Set ARGB colormap */
790
794
screen = gtk_widget_get_screen (window);
795
#if GTK_CHECK_VERSION (2, 90, 8)
796
visual = gdk_screen_get_rgba_visual(screen);
798
gtk_widget_set_visual(GTK_WIDGET(window), visual);
791
800
colormap = gdk_screen_get_rgba_colormap (screen);
793
802
gtk_widget_set_colormap(window, colormap);
795
if (use_scrolled_window) {
796
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
797
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
798
GTK_POLICY_NEVER, scrollbar_policy);
799
gtk_container_add(GTK_CONTAINER(window), scrolled_window);
801
/* Create a box to hold everything. */
802
hbox = gtk_hbox_new(0, FALSE);
803
gtk_container_add(GTK_CONTAINER(window), hbox);
805
if (use_scrolled_window) {
806
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
807
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
808
GTK_POLICY_NEVER, scrollbar_policy);
809
gtk_container_add(GTK_CONTAINER(window), scrolled_window);
811
/* Create a box to hold everything. */
812
hbox = gtk_hbox_new(0, FALSE);
813
gtk_container_add(GTK_CONTAINER(window), hbox);
806
816
/* Create the terminal widget and add it to the scrolling shell. */
807
817
widget = vte_terminal_new();
810
820
gtk_widget_set_double_buffered(widget, dbuffer);
812
g_signal_connect(terminal, "child-exited", G_CALLBACK(child_exit_cb), NULL);
813
if (show_object_notifications)
814
g_signal_connect(terminal, "notify", G_CALLBACK(terminal_notify_cb), NULL);
815
if (use_scrolled_window) {
816
gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(terminal));
818
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
822
g_signal_connect(terminal, "child-exited", G_CALLBACK(child_exit_cb), NULL);
823
if (show_object_notifications)
824
g_signal_connect(terminal, "notify", G_CALLBACK(terminal_notify_cb), NULL);
825
if (use_scrolled_window) {
826
gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(terminal));
828
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
821
831
/* Connect to the "char_size_changed" signal to set geometry hints
822
832
* whenever the font used by the terminal is changed. */
871
881
g_signal_connect(widget, "decrease-font-size",
872
882
G_CALLBACK(decrease_font_size), window);
874
if (!use_scrolled_window) {
875
/* Create the scrollbar for the widget. */
876
scrollbar = gtk_vscrollbar_new(terminal->adjustment);
877
gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, FALSE, 0);
884
if (!use_scrolled_window) {
885
/* Create the scrollbar for the widget. */
886
scrollbar = gtk_vscrollbar_new(terminal->adjustment);
887
gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, FALSE, 0);
880
890
/* Set some defaults. */
881
891
vte_terminal_set_audible_bell(terminal, audible);
907
917
if (termcap != NULL) {
908
918
vte_terminal_set_emulation(terminal, termcap);
910
vte_terminal_set_cursor_shape(terminal, cursor_shape);
920
vte_terminal_set_cursor_shape(terminal, cursor_shape);
912
922
/* Set the default font. */
913
923
vte_terminal_set_font_from_string_full(terminal, font,
980
char **command_argv = NULL;
990
char **command_argv = NULL;
984
994
_VTE_DEBUG_IF(VTE_DEBUG_MISC)
985
995
vte_terminal_feed(terminal, message, -1);
988
command = "/bin/sh"; // FIXMEchpe
990
if (command != NULL) {
991
if (!g_shell_parse_argv(command, &command_argc, &command_argv, &err) ||
992
!vte_terminal_fork_command_full(terminal,
1001
g_warning("Failed to fork: %s\n", err->message);
1004
g_print("Fork succeeded, PID %d\n", pid);
1007
g_strfreev(command_argv);
997
if (command == NULL || *command == '\0')
998
command = g_getenv ("SHELL");
1000
if (command == NULL || *command == '\0')
1001
command = "/bin/sh";
1003
if (!g_shell_parse_argv(command, &command_argc, &command_argv, &err) ||
1004
!vte_terminal_fork_command_full(terminal,
1009
G_SPAWN_SEARCH_PATH,
1013
g_warning("Failed to fork: %s\n", err->message);
1016
g_print("Fork succeeded, PID %d\n", pid);
1019
g_strfreev(command_argv);
1008
1020
#ifdef VTE_DEBUG
1009
1021
if (command == NULL) {
1010
1022
vte_terminal_feed_child(terminal,
1056
1068
add_weak_pointer(G_OBJECT(widget), &widget);
1057
1069
add_weak_pointer(G_OBJECT(window), &window);
1059
gtk_widget_realize(widget);
1061
if (!gtk_window_parse_geometry (GTK_WINDOW(window), geometry)) {
1062
g_warning (_("Could not parse the geometry spec passed to --geometry"));
1071
gtk_widget_realize(widget);
1073
if (!gtk_window_parse_geometry (GTK_WINDOW(window), geometry)) {
1074
g_warning (_("Could not parse the geometry spec passed to --geometry"));
1077
#if GTK_CHECK_VERSION(2, 91, 0)
1079
/* As of GTK+ 2.91.0, the default size of a window comes from its minimum
1080
* size not its natural size, so we need to set the right default size
1082
gtk_window_set_default_geometry (GTK_WINDOW (window),
1083
vte_terminal_get_column_count (terminal),
1084
vte_terminal_get_row_count (terminal));
1066
1088
gtk_widget_show_all(window);