diff options
author | lukefromdc <[email protected]> | 2017-06-28 01:14:26 -0400 |
---|---|---|
committer | lukefromdc <[email protected]> | 2017-07-02 13:35:19 -0400 |
commit | a1445bc208e22260c27ce67ad4ebce6040ff5a3c (patch) | |
tree | 06a244b6f33eb854b6a010362c89379b92abef2e | |
parent | 03bf5cecd39646e0e7c19af097d5fc64b05c40d5 (diff) | |
download | mate-panel-a1445bc208e22260c27ce67ad4ebce6040ff5a3c.tar.bz2 mate-panel-a1445bc208e22260c27ce67ad4ebce6040ff5a3c.tar.xz |
Make panel image background in GTK theme work again
*Support both url(image file) and gradient image panel backgrounds in the GTK theme.
*Scaling by 1.0/panel dimensions should never have worked, doesn't now. Get the actual image dimensions instead
*Background: disable in PanelPlug features that don't work on panel toplevel
*panel-background: catch error on unsupported image such as -gtk-gradient
An image bg set in the GTK theme needs to be a file or a css gradient as the older -gtk-gradient does not return a valid cairo_pattern_t when read directly
*GTK 3.14,3.16: fix theme bg image render in plugs
PanelPlug rendering is handled differently with GTK 3.14 and 3.16 than later versions. Handle this so all supported image backgrounds in GTK themes render properly in all supported GTK versions
-rw-r--r-- | libmate-panel-applet/mate-panel-applet.c | 16 | ||||
-rw-r--r-- | mate-panel/panel-background.c | 40 |
2 files changed, 45 insertions, 11 deletions
diff --git a/libmate-panel-applet/mate-panel-applet.c b/libmate-panel-applet/mate-panel-applet.c index 5efde6b3..f036b6ec 100644 --- a/libmate-panel-applet/mate-panel-applet.c +++ b/libmate-panel-applet/mate-panel-applet.c @@ -1776,18 +1776,30 @@ static void _mate_panel_applet_prepare_css (GtkStyleContext *context) GtkCssProvider *provider; provider = gtk_css_provider_new (); +#if GTK_CHECK_VERSION (3, 18, 0) gtk_css_provider_load_from_data (provider, - ".mate-custom-panel-background{\n" + "#PanelPlug {\n" + " background-repeat: no-repeat;\n" /*disable in gtk theme features */ + " background-size: cover; " /*that don't work on panel-toplevel */ + " }\n" + ".mate-custom-panel-background{\n" /*prepare CSS for user set theme */ + " background-color: rgba (0, 0, 0, 0);\n" + " background-image: none;\n" + "}", + -1, NULL); +#else +gtk_css_provider_load_from_data (provider, + ".mate-custom-panel-background{\n" /*prepare CSS for user set theme */ " background-color: rgba (0, 0, 0, 0);\n" " background-image: none;\n" "}", -1, NULL); +#endif gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref (provider); } - static void mate_panel_applet_init (MatePanelApplet *applet) { diff --git a/mate-panel/panel-background.c b/mate-panel/panel-background.c index 11812faa..1b388f92 100644 --- a/mate-panel/panel-background.c +++ b/mate-panel/panel-background.c @@ -109,15 +109,37 @@ panel_background_prepare (PanelBackground *background) * (gdk_window_clear_backing_region), the correctly * scaled pattern is used */ cairo_matrix_t m; - - cairo_matrix_init_translate (&m, 0, 0); - cairo_matrix_scale (&m, - 1.0 / background->region.width, - 1.0 / background->region.height); - cairo_pattern_set_matrix (background->default_pattern, &m); - - gdk_window_set_background_pattern (background->window, - background->default_pattern); + cairo_surface_t *surface; + double width, height; + + surface = NULL; + width = 1.0; + height = 1.0; + cairo_pattern_get_surface(background->default_pattern, &surface); + /* catch invalid images (e.g. -gtk-gradient) before scaling and rendering */ + if (surface != NULL ){ + cairo_surface_reference(surface); + width = cairo_image_surface_get_width (surface); + height = cairo_image_surface_get_height (surface); + cairo_matrix_init_translate (&m, 0, 0); + cairo_matrix_scale (&m, + width / background->region.width, + height / background->region.height); + cairo_pattern_set_matrix (background->default_pattern, &m); + + gdk_window_set_background_pattern (background->window, + background->default_pattern); + } + else { + g_warning ("%s\n", + ("unsupported panel image background such as -gtk-gradient")); + g_warning ("%s\n", + ("use an image file or a standard css gradient")); + /* use any background color that has been set if image is invalid */ + gdk_window_set_background_rgba ( + background->window, &background->default_color); + } + cairo_surface_destroy(surface); } else gdk_window_set_background_rgba ( background->window, &background->default_color); |