From 000785a2194012702c5245b0ac69b0003371bcdd Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 12 May 2014 14:57:18 +0200 Subject: [PATCH 1/3] Restore transparency The transparency settings were removed as a side effect of 2bff4b63ed3ceef6055e35563e9b0b33ad57349d This restores them and you will need a compositing window manager to use it. The background image setting, also known as faux transparency, was not restored. The transparency checkbox lost its mnemonic accelerator because 't' is already taken and using any other letter would make it hard to restore the translations of the string. --- src/org.gnome.Terminal.gschema.xml | 10 +++++ src/profile-editor.c | 11 +++++ src/profile-preferences.ui | 92 ++++++++++++++++++++++++++++++++++++++ src/terminal-schemas.h | 3 ++ src/terminal-screen.c | 22 ++++++++- src/terminal-window.c | 7 +++ 6 files changed, 144 insertions(+), 1 deletion(-) diff --git a/src/org.gnome.Terminal.gschema.xml b/src/org.gnome.Terminal.gschema.xml index c031c8a..7bdd156 100644 --- a/src/org.gnome.Terminal.gschema.xml +++ b/src/org.gnome.Terminal.gschema.xml @@ -370,6 +370,16 @@ 'narrow' Whether ambiguous-width characters are narrow or wide when using UTF-8 encoding + + false + Whether to use a transparent background + + + 50 + + Adjust the amount of transparency + A value between 0 and 100, where 0 is opaque and 100 is fully transparent. + diff --git a/src/profile-editor.c b/src/profile-editor.c index 002561d..1a758a9 100644 --- a/src/profile-editor.c +++ b/src/profile-editor.c @@ -1215,7 +1215,18 @@ terminal_profile_edit (GSettings *profile, "active-id", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); + g_settings_bind (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND, + gtk_builder_get_object (builder, "use-transparent-background"), + "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); + g_settings_bind (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND, + gtk_builder_get_object (builder, "background-transparent-scale-box"), + "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY); + g_settings_bind (profile, TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT, + gtk_builder_get_object (builder, "background-transparent-adjustment"), + "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); + /* Finished! */ + terminal_util_bind_mnemonic_label_sensitivity (editor); terminal_util_dialog_focus_widget (editor, widget_name); diff --git a/src/profile-preferences.ui b/src/profile-preferences.ui index 5adcb53..b7decb2 100644 --- a/src/profile-preferences.ui +++ b/src/profile-preferences.ui @@ -23,6 +23,11 @@ 1 100 + + 100 + 1 + 10 + @@ -1036,6 +1041,93 @@ 1 + + + True + False + horizontal + 12 + + + Transparent background + True + True + False + True + 0 + True + + + False + False + 0 + + + + + True + False + horizontal + 6 + + + True + False + 0.5 + none + + + + False + False + 0 + + + + + True + True + background-transparent-adjustment + False + + + True + True + 1 + + + + + True + False + 0.5 + full + + + + False + False + 2 + + + + + True + True + 1 + + + + + True + True + 2 + + diff --git a/src/terminal-schemas.h b/src/terminal-schemas.h index 4b734a3..e434075 100644 --- a/src/terminal-schemas.h +++ b/src/terminal-schemas.h @@ -69,6 +69,9 @@ G_BEGIN_DECLS #define TERMINAL_PROFILE_VISIBLE_NAME_KEY "visible-name" #define TERMINAL_PROFILE_WORD_CHAR_EXCEPTIONS_KEY "word-char-exceptions" +#define TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND "use-transparent-background" +#define TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT "background-transparency-percent" + #define TERMINAL_SETTING_CONFIRM_CLOSE_KEY "confirm-close" #define TERMINAL_SETTING_DEFAULT_SHOW_MENUBAR_KEY "default-show-menubar" #define TERMINAL_SETTING_ENABLE_MENU_BAR_ACCEL_KEY "menu-accelerator-enabled" diff --git a/src/terminal-screen.c b/src/terminal-screen.c index 9a0b450..eab0cec 100644 --- a/src/terminal-screen.c +++ b/src/terminal-screen.c @@ -827,7 +827,9 @@ terminal_screen_profile_changed_cb (GSettings *profile, prop_name == I_(TERMINAL_PROFILE_HIGHLIGHT_COLORS_SET_KEY) || prop_name == I_(TERMINAL_PROFILE_HIGHLIGHT_BACKGROUND_COLOR_KEY) || prop_name == I_(TERMINAL_PROFILE_HIGHLIGHT_FOREGROUND_COLOR_KEY) || - prop_name == I_(TERMINAL_PROFILE_PALETTE_KEY)) + prop_name == I_(TERMINAL_PROFILE_PALETTE_KEY) || + prop_name == I_(TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND) || + prop_name == I_(TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT)) update_color_scheme (screen); if (!prop_name || prop_name == I_(TERMINAL_PROFILE_AUDIBLE_BELL_KEY)) @@ -897,6 +899,8 @@ update_color_scheme (TerminalScreen *screen) GdkRGBA *cursor_bgp = NULL, *cursor_fgp = NULL; GdkRGBA *highlight_bgp = NULL, *highlight_fgp = NULL; GtkStyleContext *context; + GtkWidget *toplevel; + gboolean transparent; gboolean use_theme_colors; context = gtk_widget_get_style_context (widget); @@ -938,6 +942,18 @@ update_color_scheme (TerminalScreen *screen) } colors = terminal_g_settings_get_rgba_palette (priv->profile, TERMINAL_PROFILE_PALETTE_KEY, &n_colors); + + transparent = g_settings_get_boolean (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND); + if (transparent) + { + gint transparency_percent; + + transparency_percent = g_settings_get_int (profile, TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT); + bg.alpha = (100 - transparency_percent) / 100.0; + } + else + bg.alpha = 1.0; + vte_terminal_set_colors (VTE_TERMINAL (screen), &fg, &bg, colors, n_colors); vte_terminal_set_color_bold (VTE_TERMINAL (screen), boldp); @@ -945,6 +961,10 @@ update_color_scheme (TerminalScreen *screen) vte_terminal_set_color_cursor_foreground (VTE_TERMINAL (screen), cursor_fgp); vte_terminal_set_color_highlight (VTE_TERMINAL (screen), highlight_bgp); vte_terminal_set_color_highlight_foreground (VTE_TERMINAL (screen), highlight_fgp); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen)); + if (toplevel != NULL && gtk_widget_is_toplevel (toplevel)) + gtk_widget_set_app_paintable (toplevel, transparent); } static void diff --git a/src/terminal-window.c b/src/terminal-window.c index a290d9f..020c6f0 100644 --- a/src/terminal-window.c +++ b/src/terminal-window.c @@ -2621,6 +2621,8 @@ terminal_window_init (TerminalWindow *window) TerminalWindowPrivate *priv; TerminalApp *app; TerminalSettingsList *profiles_list; + GdkScreen *screen; + GdkVisual *visual; GSettings *gtk_debug_settings; GtkActionGroup *action_group; GtkAction *action; @@ -2637,6 +2639,11 @@ terminal_window_init (TerminalWindow *window) gtk_widget_init_template (GTK_WIDGET (window)); + screen = gtk_widget_get_screen (GTK_WIDGET (window)); + visual = gdk_screen_get_rgba_visual (screen); + if (visual != NULL) + gtk_widget_set_visual (GTK_WIDGET (window), visual); + uuid_generate (u); uuid_unparse (u, uuidstr); priv->uuid = g_strdup (uuidstr); -- 2.10.0 From 9be09f1e055ae7aa2589ec94add5e994260929e3 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Wed, 28 May 2014 14:11:02 +0200 Subject: [PATCH 2/3] window: Make the drawing robust across all themes There are lots of themes out there in the wild that do not specify a background-color for all widgets and the default is transparent. This is usually not a problem because GTK+ sets an opaque region on the whole window and things without a background-color get drawn with the theme's default background colour. However, to achieve transparency we disable the opaque region by making the window app-paintable. This can lead to transparent menubars or notebook tabs in some themes. We can avoid this by ensuring that the window always renders a background. https://bugzilla.gnome.org/show_bug.cgi?id=730016 --- src/terminal-window.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/terminal-window.c b/src/terminal-window.c index 020c6f0..a9f3ff7 100644 --- a/src/terminal-window.c +++ b/src/terminal-window.c @@ -2295,6 +2295,26 @@ terminal_window_realize (GtkWidget *widget) } static gboolean +terminal_window_draw (GtkWidget *widget, + cairo_t *cr) +{ + if (gtk_widget_get_app_paintable (widget)) + { + GtkStyleContext *context; + int width; + int height; + + context = gtk_widget_get_style_context (widget); + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); + gtk_render_background (context, cr, 0, 0, width, height); + gtk_render_frame (context, cr, 0, 0, width, height); + } + + return GTK_WIDGET_CLASS (terminal_window_parent_class)->draw (widget, cr); +} + +static gboolean terminal_window_state_event (GtkWidget *widget, GdkEventWindowState *event) { @@ -2832,6 +2852,7 @@ terminal_window_class_init (TerminalWindowClass *klass) widget_class->show = terminal_window_show; widget_class->realize = terminal_window_realize; + widget_class->draw = terminal_window_draw; widget_class->window_state_event = terminal_window_state_event; widget_class->screen_changed = terminal_window_screen_changed; widget_class->style_updated = terminal_window_style_updated; -- 2.10.0 From 682a729942c07c375fbc075484bc49f188be40cd Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Fri, 13 Nov 2015 15:16:42 +0100 Subject: [PATCH 3/3] screen, window: Extra padding around transparent terminals in Wayland https://bugzilla.redhat.com/show_bug.cgi?id=1207943 --- src/terminal-screen.c | 40 +++++++++++++++++++++++++++++++++++++--- src/terminal-window.c | 18 ++++++++++++------ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/terminal-screen.c b/src/terminal-screen.c index eab0cec..5d321a7 100644 --- a/src/terminal-screen.c +++ b/src/terminal-screen.c @@ -137,6 +137,8 @@ static void terminal_screen_system_font_changed_cb (GSettings *, 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 gboolean terminal_screen_do_exec (TerminalScreen *screen, FDSetupData *data, GError **error); @@ -482,6 +484,7 @@ terminal_screen_class_init (TerminalScreenClass *klass) widget_class->drag_data_received = terminal_screen_drag_data_received; widget_class->button_press_event = terminal_screen_button_press; widget_class->popup_menu = terminal_screen_popup_menu; + widget_class->hierarchy_changed = terminal_screen_hierarchy_changed; terminal_class->child_exited = terminal_screen_child_exited; @@ -885,6 +888,32 @@ terminal_screen_profile_changed_cb (GSettings *profile, } static void +update_toplevel_transparency (TerminalScreen *screen) +{ + GtkWidget *widget = GTK_WIDGET (screen); + TerminalScreenPrivate *priv = screen->priv; + GSettings *profile = priv->profile; + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); + if (toplevel != NULL && gtk_widget_is_toplevel (toplevel)) + { + gboolean transparent; + + transparent = g_settings_get_boolean (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND); + if (gtk_widget_get_app_paintable (toplevel) != transparent) + { + gtk_widget_set_app_paintable (toplevel, transparent); + + /* The opaque region of the toplevel isn't updated until the toplevel is allocated; + * set_app_paintable() doesn't force an allocation, so do that manually. + */ + gtk_widget_queue_resize (toplevel); + } + } +} + +static void update_color_scheme (TerminalScreen *screen) { GtkWidget *widget = GTK_WIDGET (screen); @@ -962,9 +991,7 @@ update_color_scheme (TerminalScreen *screen) vte_terminal_set_color_highlight (VTE_TERMINAL (screen), highlight_bgp); vte_terminal_set_color_highlight_foreground (VTE_TERMINAL (screen), highlight_fgp); - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen)); - if (toplevel != NULL && gtk_widget_is_toplevel (toplevel)) - gtk_widget_set_app_paintable (toplevel, transparent); + update_toplevel_transparency (screen); } static void @@ -1567,6 +1594,13 @@ terminal_screen_do_popup (TerminalScreen *screen, terminal_screen_popup_info_unref (info); } +static void +terminal_screen_hierarchy_changed (GtkWidget *widget, + GtkWidget *previous_toplevel) +{ + update_toplevel_transparency (TERMINAL_SCREEN (widget)); +} + static gboolean terminal_screen_button_press (GtkWidget *widget, GdkEventButton *event) diff --git a/src/terminal-window.c b/src/terminal-window.c index a9f3ff7..d09484e 100644 --- a/src/terminal-window.c +++ b/src/terminal-window.c @@ -2300,15 +2300,21 @@ terminal_window_draw (GtkWidget *widget, { if (gtk_widget_get_app_paintable (widget)) { + GtkAllocation child_allocation; GtkStyleContext *context; - int width; - int height; + GtkWidget *child; + + /* Get the *child* allocation, so we don't overwrite window borders */ + child = gtk_bin_get_child (GTK_BIN (widget)); + gtk_widget_get_allocation (child, &child_allocation); context = gtk_widget_get_style_context (widget); - width = gtk_widget_get_allocated_width (widget); - height = gtk_widget_get_allocated_height (widget); - gtk_render_background (context, cr, 0, 0, width, height); - gtk_render_frame (context, cr, 0, 0, width, height); + gtk_render_background (context, cr, + child_allocation.x, child_allocation.y, + child_allocation.width, child_allocation.height); + gtk_render_frame (context, cr, + child_allocation.x, child_allocation.y, + child_allocation.width, child_allocation.height); } return GTK_WIDGET_CLASS (terminal_window_parent_class)->draw (widget, cr); -- 2.10.0