diff options
Diffstat (limited to 'src/terminal-screen.c')
-rw-r--r-- | src/terminal-screen.c | 110 |
1 files changed, 87 insertions, 23 deletions
diff --git a/src/terminal-screen.c b/src/terminal-screen.c index 01bec75..7282f6d 100644 --- a/src/terminal-screen.c +++ b/src/terminal-screen.c @@ -1,6 +1,7 @@ /* * Copyright © 2001 Havoc Pennington * Copyright © 2007, 2008, 2010 Christian Persch + * Copyright (C) 2012-2021 MATE Developers * * Mate-terminal is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,7 +55,7 @@ typedef struct { int tag; - TerminalURLFlavour flavor; + TerminalURLFlavor flavor; } TagData; struct _TerminalScreenPrivate @@ -124,6 +125,8 @@ static void terminal_screen_change_font (TerminalScreen *screen); static gboolean terminal_screen_popup_menu (GtkWidget *widget); static gboolean terminal_screen_button_press (GtkWidget *widget, GdkEventButton *event); +static void terminal_screen_hierarchy_changed (GtkWidget *widget, + GtkWidget *previous_toplevel); static void terminal_screen_launch_child_on_idle (TerminalScreen *screen); static void terminal_screen_child_exited (VteTerminal *terminal, int status); @@ -134,6 +137,9 @@ static void terminal_screen_icon_title_changed (VteTerminal *vte_terminal static void update_color_scheme (TerminalScreen *screen); +static char* terminal_screen_check_hyperlink (TerminalScreen *screen, + GdkEvent *event); + static gboolean terminal_screen_format_title (TerminalScreen *screen, const char *raw_title, char **old_cooked_title); static void terminal_screen_cook_title (TerminalScreen *screen); @@ -160,7 +166,7 @@ static guint signals[LAST_SIGNAL] = { 0 }; typedef struct { const char *pattern; - TerminalURLFlavour flavor; + TerminalURLFlavor flavor; guint32 flags; } TerminalRegexPattern; @@ -174,12 +180,11 @@ static const TerminalRegexPattern url_regex_patterns[] = }; static VteRegex **url_regexes; -static TerminalURLFlavour *url_regex_flavors; +static TerminalURLFlavor *url_regex_flavors; static guint n_url_regexes; static void terminal_screen_url_match_remove (TerminalScreen *screen); - #ifdef ENABLE_SKEY static const TerminalRegexPattern skey_regex_patterns[] = { @@ -351,6 +356,8 @@ terminal_screen_init (TerminalScreen *screen) vte_terminal_set_bold_is_bright (VTE_TERMINAL (screen), TRUE); #endif + vte_terminal_set_allow_hyperlink (VTE_TERMINAL (screen), TRUE); + priv->child_pid = -1; priv->font_scale = PANGO_SCALE_MEDIUM; @@ -484,6 +491,7 @@ terminal_screen_class_init (TerminalScreenClass *klass) widget_class->style_updated = terminal_screen_style_updated; widget_class->drag_data_received = terminal_screen_drag_data_received; widget_class->button_press_event = terminal_screen_button_press; + widget_class->hierarchy_changed = terminal_screen_hierarchy_changed; widget_class->popup_menu = terminal_screen_popup_menu; terminal_class->child_exited = terminal_screen_child_exited; @@ -574,7 +582,7 @@ terminal_screen_class_init (TerminalScreenClass *klass) /* Precompile the regexes */ n_url_regexes = G_N_ELEMENTS (url_regex_patterns); url_regexes = g_new0 (VteRegex*, n_url_regexes); - url_regex_flavors = g_new0 (TerminalURLFlavour, n_url_regexes); + url_regex_flavors = g_new0 (TerminalURLFlavor, n_url_regexes); for (i = 0; i < n_url_regexes; ++i) { @@ -1075,6 +1083,26 @@ terminal_screen_profile_notify_cb (TerminalProfile *profile, } static void +update_toplevel_transparency (TerminalScreen *screen) +{ + GtkWidget *widget = GTK_WIDGET (screen); + TerminalScreenPrivate *priv = screen->priv; + TerminalProfile *profile = priv->profile; + TerminalBackgroundType bg_type = terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_BACKGROUND_TYPE); + + if (bg_type == TERMINAL_BACKGROUND_TRANSPARENT) + { + GtkWidget *toplevel; + toplevel = gtk_widget_get_toplevel (widget); + if (toplevel != NULL && gtk_widget_is_toplevel (toplevel) + && !gtk_widget_get_app_paintable (toplevel)) + { + gtk_widget_set_app_paintable (toplevel, TRUE); + } + } +} + +static void update_color_scheme (TerminalScreen *screen) { TerminalScreenPrivate *priv = screen->priv; @@ -1159,6 +1187,8 @@ update_color_scheme (TerminalScreen *screen) if (bold_rgba) vte_terminal_set_color_bold (VTE_TERMINAL (screen), bold_rgba); + + update_toplevel_transparency (screen); } void @@ -1448,8 +1478,6 @@ get_child_environment (TerminalScreen *screen, g_hash_table_replace (env_table, g_strdup ("WINDOWID"), g_strdup_printf ("%ld", GDK_WINDOW_XID (gtk_widget_get_window (window)))); } #endif - g_hash_table_replace (env_table, g_strdup ("DISPLAY"), g_strdup (gdk_display_get_name (display))); - g_settings_schema_source_list_schemas (g_settings_schema_source_get_default (), TRUE, &list_schemas, NULL); schema_exists = FALSE; @@ -1657,7 +1685,8 @@ terminal_screen_popup_info_unref (TerminalScreenPopupInfo *info) return; g_object_unref (info->screen); - g_free (info->string); + g_free (info->hyperlink); + g_free (info->url); g_slice_free (TerminalScreenPopupInfo, info); } @@ -1684,38 +1713,55 @@ terminal_screen_button_press (GtkWidget *widget, TerminalScreen *screen = TERMINAL_SCREEN (widget); gboolean (* button_press_event) (GtkWidget*, GdkEventButton*) = GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event; - char *matched_string; - int matched_flavor = 0; + char *hyperlink; + char *url; + int url_flavor = FLAVOR_AS_IS; guint state; state = event->state & gtk_accelerator_get_default_mod_mask (); + hyperlink = terminal_screen_check_hyperlink (screen, (GdkEvent*)event); + url = terminal_screen_check_match (screen, (GdkEvent*)event, &url_flavor); - matched_string = terminal_screen_check_match (screen, (GdkEvent*)event, &matched_flavor); - - if (matched_string != NULL && - (event->button == 1 || event->button == 2) && - (state & GDK_CONTROL_MASK)) + // left or middle button with Ctrl + if ((event->button == 1 || event->button == 2) && + (state & GDK_CONTROL_MASK)) { gboolean handled = FALSE; + if (hyperlink != NULL) + g_signal_emit (screen, signals[MATCH_CLICKED], 0, + hyperlink, + FLAVOR_AS_IS, + state, + &handled); + + if (handled) { + g_free (url); + g_free (hyperlink); + return TRUE; /* don't do anything else such as select with the click */ + } + #ifdef ENABLE_SKEY - if (matched_flavor != FLAVOR_SKEY || + if (url_flavor != FLAVOR_SKEY || terminal_profile_get_property_boolean (screen->priv->profile, TERMINAL_PROFILE_USE_SKEY)) #endif + if (url != NULL) { g_signal_emit (screen, signals[MATCH_CLICKED], 0, - matched_string, - matched_flavor, + url, + url_flavor, state, &handled); } - g_free (matched_string); - - if (handled) + if (handled) { + g_free (url); + g_free (hyperlink); return TRUE; /* don't do anything else such as select with the click */ + } } + // right button with no Ctrl, Alt or Shift if (event->button == 3 && (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0) { @@ -1725,8 +1771,9 @@ terminal_screen_button_press (GtkWidget *widget, info->button = event->button; info->state = state; info->timestamp = event->time; - info->string = matched_string; /* adopted */ - info->flavour = matched_flavor; + info->url = url; /* adopted */ + info->hyperlink = hyperlink; /* adopted */ + info->flavor = url_flavor; g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info); terminal_screen_popup_info_unref (info); @@ -1734,6 +1781,9 @@ terminal_screen_button_press (GtkWidget *widget, return TRUE; } + g_free (url); + g_free (hyperlink); + /* default behavior is to let the terminal widget deal with it */ if (button_press_event) return button_press_event (widget, event); @@ -1742,6 +1792,13 @@ terminal_screen_button_press (GtkWidget *widget, } static void +terminal_screen_hierarchy_changed (GtkWidget *widget, + GtkWidget *previous_toplevel) +{ + update_toplevel_transparency (TERMINAL_SCREEN (widget)); +} + +static void terminal_screen_set_dynamic_title (TerminalScreen *screen, const char *title, gboolean userset) @@ -2351,6 +2408,13 @@ terminal_screen_url_match_remove (TerminalScreen *screen) } static char* +terminal_screen_check_hyperlink (TerminalScreen *screen, + GdkEvent *event) +{ + return vte_terminal_hyperlink_check_event (VTE_TERMINAL (screen), event); +} + +static char* terminal_screen_check_match (TerminalScreen *screen, GdkEvent *event, int *flavor) |