From 94789a9100cbce4a0f117c548cf0949f79a97607 Mon Sep 17 00:00:00 2001 From: deepend Date: Sun, 25 Jan 2026 11:30:21 -0700 Subject: [PATCH] Added gtkutil_apply_palette declaration and implementation to apply palette colors/fonts via GTK3 CSS providers with GTK2 fallbacks preserved. Switched channel tree and theme application logic to use the new palette helper. Updated entry and user list styling to route palette/font application through the helper. --- src/fe-gtk/chanview-tree.c | 6 ++-- src/fe-gtk/chanview.c | 6 ++-- src/fe-gtk/gtkutil.c | 73 ++++++++++++++++++++++++++++++++++++++ src/fe-gtk/gtkutil.h | 3 ++ src/fe-gtk/maingui.c | 14 +++----- 5 files changed, 85 insertions(+), 17 deletions(-) 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);