diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2015-03-03 08:51:40 +0100 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2015-03-03 14:41:02 +0100 |
commit | f224c151ea399119b88250156e2d2b98219032e2 (patch) | |
tree | 798f7e808407d8797c067c04a01e18af2897aa6b | |
parent | 1b47f453bdb95f56297f84d8902cd75f8d74fe75 (diff) | |
download | network-manager-applet-f224c151ea399119b88250156e2d2b98219032e2.tar.gz |
editor: fix displaying background color when highlighting errors
gtk_widget_override_background_color() stopped working at some point [1] for
some Gtk themes, including default Adwaita (due to usage of background-image).
So we need to use GtkCssProvider. Anyway gtk_widget_override_background_color()
has been deprecated recently [2].
[1] https://bugzilla.gnome.org/show_bug.cgi?id=656461
[2] https://mail.gnome.org/archives/gtk-list/2015-February/msg00053.html
[3] http://trac.wxwidgets.org/ticket/14759
-rw-r--r-- | src/connection-editor/ip4-routes-dialog.c | 2 | ||||
-rw-r--r-- | src/connection-editor/ip6-routes-dialog.c | 2 | ||||
-rw-r--r-- | src/connection-editor/page-dcb.c | 20 | ||||
-rw-r--r-- | src/connection-editor/page-ip4.c | 2 | ||||
-rw-r--r-- | src/connection-editor/page-ip6.c | 2 | ||||
-rw-r--r-- | src/utils/utils.c | 42 | ||||
-rw-r--r-- | src/utils/utils.h | 4 |
7 files changed, 61 insertions, 13 deletions
diff --git a/src/connection-editor/ip4-routes-dialog.c b/src/connection-editor/ip4-routes-dialog.c index e399e4d6..89e8424f 100644 --- a/src/connection-editor/ip4-routes-dialog.c +++ b/src/connection-editor/ip4-routes-dialog.c @@ -455,7 +455,7 @@ cell_changed_cb (GtkEditable *editable, colorname = value_valid ? "lightgreen" : "red"; gdk_rgba_parse (&rgba, colorname); - gtk_widget_override_background_color (GTK_WIDGET (editable), GTK_STATE_FLAG_NORMAL, &rgba); + utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; diff --git a/src/connection-editor/ip6-routes-dialog.c b/src/connection-editor/ip6-routes-dialog.c index 67197a77..31421d62 100644 --- a/src/connection-editor/ip6-routes-dialog.c +++ b/src/connection-editor/ip6-routes-dialog.c @@ -403,7 +403,7 @@ cell_changed_cb (GtkEditable *editable, colorname = value_valid ? "lightgreen" : "red"; gdk_rgba_parse (&rgba, colorname); - gtk_widget_override_background_color (GTK_WIDGET (editable), GTK_STATE_FLAG_NORMAL, &rgba); + utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; diff --git a/src/connection-editor/page-dcb.c b/src/connection-editor/page-dcb.c index a8f64fe5..2d18666c 100644 --- a/src/connection-editor/page-dcb.c +++ b/src/connection-editor/page-dcb.c @@ -107,6 +107,8 @@ uint_entries_validate (GtkBuilder *builder, const char *fmt, gint max, gboolean gboolean valid = TRUE; GdkRGBA bgcolor; + gdk_rgba_parse (&bgcolor, "red3"); + for (i = 0; i < 8; i++) { tmp = g_strdup_printf (fmt, i); entry = GTK_ENTRY (gtk_builder_get_object (builder, tmp)); @@ -119,17 +121,20 @@ uint_entries_validate (GtkBuilder *builder, const char *fmt, gint max, gboolean num = strtol (text, NULL, 10); if (errno || num < 0 || num > max) { /* FIXME: only sets highlight color? */ - gdk_rgba_parse (&bgcolor, "red3"); - gtk_widget_override_background_color (GTK_WIDGET (entry), GTK_STATE_FLAG_NORMAL, &bgcolor); + utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); valid = FALSE; } else - gtk_widget_override_background_color (GTK_WIDGET (entry), GTK_STATE_FLAG_NORMAL, NULL); + utils_override_bg_color (GTK_WIDGET (entry), NULL); total += (guint) num; + if (sum && total > 100) + utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); } } - if (sum && total != 100) + if (sum && total != 100) { + utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); valid = FALSE; + } return valid; } @@ -138,10 +143,11 @@ static void pg_dialog_valid_func (GtkBuilder *builder) { GtkDialog *dialog; - gboolean valid = FALSE; + gboolean b1, b2, valid = FALSE; - valid = uint_entries_validate (builder, "pg_pgpct%u_entry", 100, TRUE) && - uint_entries_validate (builder, "pg_uppct%u_entry", 100, FALSE); + b1 = uint_entries_validate (builder, "pg_pgpct%u_entry", 100, TRUE); + b2 = uint_entries_validate (builder, "pg_uppct%u_entry", 100, FALSE); + valid = b1 && b2; dialog = GTK_DIALOG (gtk_builder_get_object (builder, "pg_dialog")); gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, valid); diff --git a/src/connection-editor/page-ip4.c b/src/connection-editor/page-ip4.c index 1b6d1d80..66e20859 100644 --- a/src/connection-editor/page-ip4.c +++ b/src/connection-editor/page-ip4.c @@ -711,7 +711,7 @@ cell_changed_cb (GtkEditable *editable, colorname = value_valid ? "lightgreen" : "red"; gdk_rgba_parse (&rgba, colorname); - gtk_widget_override_background_color (GTK_WIDGET (editable), GTK_STATE_FLAG_NORMAL, &rgba); + utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; diff --git a/src/connection-editor/page-ip6.c b/src/connection-editor/page-ip6.c index 1e58b780..7c031a04 100644 --- a/src/connection-editor/page-ip6.c +++ b/src/connection-editor/page-ip6.c @@ -698,7 +698,7 @@ cell_changed_cb (GtkEditable *editable, colorname = value_valid ? "lightgreen" : "red"; gdk_rgba_parse (&rgba, colorname); - gtk_widget_override_background_color (GTK_WIDGET (editable), GTK_STATE_FLAG_NORMAL, &rgba); + utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; diff --git a/src/utils/utils.c b/src/utils/utils.c index 42db7468..c9301fe9 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright 2007 - 2014 Red Hat, Inc. + * Copyright 2007 - 2015 Red Hat, Inc. */ #include <config.h> @@ -477,3 +477,43 @@ utils_update_password_storage (NMSetting *setting, } } +/** + * utils_override_bg_color: + * + * The function can be used to set background color for a widget. + * There are functions for that in Gtk2 [1] and Gtk3 [2]. Unfortunately, they + * have been deprecated, and moreover gtk_widget_override_background_color() + * stopped working at some point for some Gtk themes, including the default + * Adwaita theme. + * [1] gtk_widget_modify_bg() or gtk_widget_modify_base() + * [2] gtk_widget_override_background_color() + * + * Related links: + * https://bugzilla.gnome.org/show_bug.cgi?id=656461 + * https://mail.gnome.org/archives/gtk-list/2015-February/msg00053.html + */ +void +utils_override_bg_color (GtkWidget *widget, GdkRGBA *rgba) +{ + GtkCssProvider *provider; + char *css; + + provider = (GtkCssProvider *) g_object_get_data (G_OBJECT (widget), "our-css-provider"); + if (G_UNLIKELY (!provider)) { + provider = gtk_css_provider_new (); + gtk_style_context_add_provider (gtk_widget_get_style_context (widget), + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + g_object_set_data_full (G_OBJECT (widget), "our-css-provider", + provider, (GDestroyNotify) g_object_unref); + } + + if (rgba) { + css = g_strdup_printf ("* { background-color: %s; background-image: none; }", + gdk_rgba_to_string (rgba)); + gtk_css_provider_load_from_data (provider, css, -1, NULL); + g_free (css); + } else + gtk_css_provider_load_from_data (provider, "", -1, NULL); +} + diff --git a/src/utils/utils.h b/src/utils/utils.h index 5adb20d2..3e3d31bb 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright 2007 - 2014 Red Hat, Inc. + * Copyright 2007 - 2015 Red Hat, Inc. */ #ifndef UTILS_H @@ -100,5 +100,7 @@ void utils_update_password_storage (NMSetting *setting, GtkWidget *passwd_entry, const char *password_flags_name); +void utils_override_bg_color (GtkWidget *widget, GdkRGBA *rgba); + #endif /* UTILS_H */ |