diff --git a/src/fe-gtk/chanview-tree.c b/src/fe-gtk/chanview-tree.c index bfceeab2..4b20c28f 100644 --- a/src/fe-gtk/chanview-tree.c +++ b/src/fe-gtk/chanview-tree.c @@ -118,9 +118,9 @@ cv_tree_init (chanview *cv) gtk_widget_set_name (view, "zoitechat-tree"); if (cv->style) { - gtk_widget_modify_base (view, GTK_STATE_NORMAL, &cv->style->base[GTK_STATE_NORMAL]); - gtk_widget_modify_text (view, GTK_STATE_NORMAL, &cv->style->text[GTK_STATE_NORMAL]); - gtk_widget_modify_font (view, cv->style->font_desc); + gtkutil_apply_palette (view, &cv->style->base[GTK_STATE_NORMAL], + &cv->style->text[GTK_STATE_NORMAL], + cv->style->font_desc); } /*gtk_widget_modify_base (view, GTK_STATE_NORMAL, &colors[COL_BG]);*/ gtk_widget_set_can_focus (view, FALSE); diff --git a/src/fe-gtk/chanview.c b/src/fe-gtk/chanview.c index 6efdf5a6..d311b7b3 100644 --- a/src/fe-gtk/chanview.c +++ b/src/fe-gtk/chanview.c @@ -124,14 +124,12 @@ chanview_apply_theme (chanview *cv) w = GTK_WIDGET (tv->tree); if (fe_dark_mode_is_enabled () || prefs.hex_gui_dark_mode == ZOITECHAT_DARK_MODE_LIGHT) { - gtk_widget_modify_base (w, GTK_STATE_NORMAL, &colors[COL_BG]); - gtk_widget_modify_text (w, GTK_STATE_NORMAL, &colors[COL_FG]); + gtkutil_apply_palette (w, &colors[COL_BG], &colors[COL_FG], NULL); } else { /* Revert back to theme defaults. */ - gtk_widget_modify_base (w, GTK_STATE_NORMAL, NULL); - gtk_widget_modify_text (w, GTK_STATE_NORMAL, NULL); + gtkutil_apply_palette (w, NULL, NULL, NULL); } } diff --git a/src/fe-gtk/gtkutil.c b/src/fe-gtk/gtkutil.c index 4d90d864..b79ccf7e 100644 --- a/src/fe-gtk/gtkutil.c +++ b/src/fe-gtk/gtkutil.c @@ -128,6 +128,79 @@ gtkutil_image_new_from_stock (const char *stock, GtkIconSize size) } #endif +void +gtkutil_apply_palette (GtkWidget *widget, const PaletteColor *bg, const PaletteColor *fg, + const PangoFontDescription *font_desc) +{ + if (!widget) + return; + +#if HAVE_GTK3 + { + static const char *class_name = "zoitechat-palette"; + GtkStyleContext *context = gtk_widget_get_style_context (widget); + GtkCssProvider *provider = g_object_get_data (G_OBJECT (widget), + "zoitechat-palette-provider"); + GString *css; + gchar *bg_color = NULL; + gchar *fg_color = NULL; + gchar *font_str = NULL; + + if (!bg && !fg && !font_desc) + { + gtk_style_context_remove_class (context, class_name); + if (provider) + { + gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider)); + g_object_set_data (G_OBJECT (widget), "zoitechat-palette-provider", NULL); + } + return; + } + + if (!provider) + { + provider = gtk_css_provider_new (); + g_object_set_data_full (G_OBJECT (widget), "zoitechat-palette-provider", + provider, g_object_unref); + } + + css = g_string_new ("."); + g_string_append (css, class_name); + g_string_append (css, " {"); + if (bg) + { + bg_color = gdk_rgba_to_string (bg); + g_string_append_printf (css, " background-color: %s;", bg_color); + } + if (fg) + { + fg_color = gdk_rgba_to_string (fg); + g_string_append_printf (css, " color: %s;", fg_color); + } + if (font_desc) + { + font_str = pango_font_description_to_string (font_desc); + g_string_append_printf (css, " font: %s;", font_str); + } + g_string_append (css, " }"); + + gtk_css_provider_load_from_data (provider, css->str, -1, NULL); + gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + gtk_style_context_add_class (context, class_name); + + g_string_free (css, TRUE); + g_free (bg_color); + g_free (fg_color); + g_free (font_str); + } +#else + gtk_widget_modify_base (widget, GTK_STATE_NORMAL, bg); + gtk_widget_modify_text (widget, GTK_STATE_NORMAL, fg); + gtk_widget_modify_font (widget, (PangoFontDescription *) font_desc); +#endif +} + static void gtkutil_file_req_destroy (GtkWidget * wid, struct file_req *freq) { diff --git a/src/fe-gtk/gtkutil.h b/src/fe-gtk/gtkutil.h index 8454a945..c3301138 100644 --- a/src/fe-gtk/gtkutil.h +++ b/src/fe-gtk/gtkutil.h @@ -22,6 +22,7 @@ #include #include "../common/fe.h" +#include "palette.h" typedef void (*filereqcallback) (void *, char *file); @@ -47,6 +48,8 @@ gboolean gtkutil_treemodel_string_to_iter (GtkTreeModel *model, gchar *pathstr, gboolean gtkutil_treeview_get_selected_iter (GtkTreeView *view, GtkTreeIter *iter_ret); gboolean gtkutil_treeview_get_selected (GtkTreeView *view, GtkTreeIter *iter_ret, ...); gboolean gtkutil_tray_icon_supported (GtkWindow *window); +void gtkutil_apply_palette (GtkWidget *widget, const PaletteColor *bg, const PaletteColor *fg, + const PangoFontDescription *font_desc); #if defined (WIN32) || defined (__APPLE__) gboolean gtkutil_find_font (const char *fontname); diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index 3c46af5a..fee465e8 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -2284,9 +2284,8 @@ mg_limit_entry_cb (GtkWidget * igad, gpointer userdata) static void mg_apply_entry_style (GtkWidget *entry) { - gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &colors[COL_BG]); - gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &colors[COL_FG]); - gtk_widget_modify_font (entry, input_style->font_desc); + gtkutil_apply_palette (entry, &colors[COL_BG], &colors[COL_FG], + input_style->font_desc); } static void @@ -2712,11 +2711,6 @@ mg_create_userlist (session_gui *gui, GtkWidget *box) gui->user_tree = ulist = userlist_create (vbox); - if (prefs.hex_gui_ulist_style) - { - gtk_widget_modify_font (ulist, input_style->font_desc); - } - /* * Keep the user list in sync with the chat palette. * @@ -2727,8 +2721,8 @@ mg_create_userlist (session_gui *gui, GtkWidget *box) */ if (prefs.hex_gui_ulist_style || fe_dark_mode_is_enabled ()) { - gtk_widget_modify_base (ulist, GTK_STATE_NORMAL, &colors[COL_BG]); - gtk_widget_modify_text (ulist, GTK_STATE_NORMAL, &colors[COL_FG]); + gtkutil_apply_palette (ulist, &colors[COL_BG], &colors[COL_FG], + prefs.hex_gui_ulist_style ? input_style->font_desc : NULL); } mg_create_meters (gui, vbox);