summaryrefslogtreecommitdiff
path: root/src/terminal-screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/terminal-screen.c')
-rw-r--r--src/terminal-screen.c110
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)