From: Marco Trevisan Date: Sat, 20 Jan 2018 18:48:39 -0500 Subject: draw proper background under the scrollbar Forwarded: yes, https://bugzilla.gnome.org/show_bug.cgi?id=754796 Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1493964 --- src/terminal-screen-container.cc | 28 +++++++++++++++++-- src/terminal-screen.cc | 60 ++++++++++++++++++++++++++++++++++++++++ src/terminal-screen.hh | 2 ++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/terminal-screen-container.cc b/src/terminal-screen-container.cc index 6d85190..cedb1d9 100644 --- a/src/terminal-screen-container.cc +++ b/src/terminal-screen-container.cc @@ -121,9 +121,25 @@ terminal_screen_container_init (TerminalScreenContainer *container) priv->vscrollbar_policy = GTK_POLICY_AUTOMATIC; } +static gboolean +scrollbar_bg_draw_cb (GtkWidget *widget, cairo_t *cr, TerminalScreenContainer *container) +{ + TerminalScreenContainerPrivate *priv = container->priv; + GdkRGBA * bg = terminal_screen_get_bg_color (priv->screen); + + cairo_save (cr); + cairo_set_source_rgba (cr, bg->red, bg->green, bg->blue, bg->alpha); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_restore (cr); + + return FALSE; +} + static void terminal_screen_container_constructed (GObject *object) { + GtkWidget *scrollbar; TerminalScreenContainer *container = TERMINAL_SCREEN_CONTAINER (object); TerminalScreenContainerPrivate *priv = container->priv; @@ -151,9 +167,12 @@ terminal_screen_container_constructed (GObject *object) } #else priv->hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + priv->vscrollbar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - priv->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, - gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (priv->screen))); + scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, + gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (priv->screen))); + + gtk_box_pack_start (GTK_BOX (priv->vscrollbar), scrollbar, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (priv->hbox), GTK_WIDGET (priv->screen), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (priv->hbox), priv->vscrollbar, FALSE, FALSE, 0); @@ -163,6 +182,11 @@ terminal_screen_container_constructed (GObject *object) #endif _terminal_screen_update_scrollbar (priv->screen); + + g_signal_connect (G_OBJECT (priv->vscrollbar), "draw", + G_CALLBACK (scrollbar_bg_draw_cb), container); + g_signal_connect_swapped (priv->screen, "notify::bg-color", + G_CALLBACK (gtk_widget_queue_draw), priv->vscrollbar); } static void diff --git a/src/terminal-screen.cc b/src/terminal-screen.cc index 85ae885..4e004c4 100644 --- a/src/terminal-screen.cc +++ b/src/terminal-screen.cc @@ -108,6 +108,8 @@ struct _TerminalScreenPrivate gboolean exec_on_realize; guint idle_exec_source; ExecData *exec_data; + GdkRGBA bg_color; + GdkRGBA fg_color; }; enum @@ -123,6 +125,8 @@ enum { PROP_0, PROP_PROFILE, PROP_TITLE, + PROP_BG_COLOR, + PROP_FG_COLOR }; enum @@ -616,6 +620,12 @@ terminal_screen_get_property (GObject *object, case PROP_TITLE: g_value_set_string (value, terminal_screen_get_title (screen)); break; + case PROP_BG_COLOR: + g_value_set_boxed (value, terminal_screen_get_bg_color (screen)); + break; + case PROP_FG_COLOR: + g_value_set_boxed (value, terminal_screen_get_bg_color (screen)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -636,6 +646,8 @@ terminal_screen_set_property (GObject *object, terminal_screen_set_profile (screen, (GSettings*)g_value_get_object (value)); break; case PROP_TITLE: + case PROP_FG_COLOR: + case PROP_BG_COLOR: /* not writable */ default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -727,6 +739,26 @@ terminal_screen_class_init (TerminalScreenClass *klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB))); + g_object_class_install_property + (object_class, + PROP_BG_COLOR, + g_param_spec_boxed ("bg-color", NULL, NULL, + GDK_TYPE_RGBA, + GParamFlags(G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB))); + + g_object_class_install_property + (object_class, + PROP_FG_COLOR, + g_param_spec_boxed ("fg-color", NULL, NULL, + GDK_TYPE_RGBA, + GParamFlags(G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB))); + g_type_class_add_private (object_class, sizeof (TerminalScreenPrivate)); gtk_widget_class_install_style_property (widget_class, @@ -1072,6 +1104,22 @@ terminal_screen_get_title (TerminalScreen *screen) return vte_terminal_get_window_title (VTE_TERMINAL (screen)); } +GdkRGBA* +terminal_screen_get_bg_color (TerminalScreen *screen) +{ + g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL); + + return &screen->priv->bg_color; +} + +GdkRGBA* +terminal_screen_get_fg_color (TerminalScreen *screen) +{ + g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL); + + return &screen->priv->fg_color; +} + static void terminal_screen_profile_changed_cb (GSettings *profile, const char *prop_name, @@ -1324,6 +1372,18 @@ 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); + if (gdk_rgba_hash (&priv->bg_color) != gdk_rgba_hash (&bg)) + { + priv->bg_color = bg; + g_object_notify (G_OBJECT (screen), "bg-color"); + } + + if (gdk_rgba_hash (&priv->fg_color) != gdk_rgba_hash (&fg)) + { + priv->fg_color = fg; + g_object_notify (G_OBJECT (screen), "fg-color"); + } + update_toplevel_transparency (screen); } diff --git a/src/terminal-screen.hh b/src/terminal-screen.hh index 70d0d8c..b434052 100644 --- a/src/terminal-screen.hh +++ b/src/terminal-screen.hh @@ -115,6 +115,8 @@ GSettings* terminal_screen_get_profile (TerminalScreen *screen); GSettings* terminal_screen_ref_profile (TerminalScreen *screen); const char* terminal_screen_get_title (TerminalScreen *screen); +GdkRGBA* terminal_screen_get_bg_color (TerminalScreen *screen); +GdkRGBA* terminal_screen_get_fg_color (TerminalScreen *screen); char *terminal_screen_get_current_dir (TerminalScreen *screen);