1
0
mirror of https://github.com/dguglielmi/sunny-overlay.git synced 2025-12-06 16:02:39 +01:00
Files
sunny-overlay/x11-terms/gnome-terminal/files/scrollbar-background-theming.patch

196 lines
6.7 KiB
Diff

From: Marco Trevisan <marco.trevisan@canonical.com>
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);