mirror of
https://github.com/dguglielmi/sunny-overlay.git
synced 2025-12-06 16:02:39 +01:00
196 lines
6.7 KiB
Diff
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);
|
|
|