From 29ac0f9ee6b09831ed2990abb096bef5c6a742e8 Mon Sep 17 00:00:00 2001 From: deepend Date: Sat, 31 Jan 2026 13:49:06 -0700 Subject: [PATCH] Added a GTK3 CSS font provider helper and updated emoji font application to avoid deprecated override APIs in GTK3 builds. Switched GTK3 setup color previews, entry styling, and user list palette updates to use gtkutil_apply_palette instead of deprecated GTK3 overrides. --- src/fe-gtk/maingui.c | 44 ++++++++++++++++++++++++++++++++-- src/fe-gtk/setup.c | 56 +++++++++++++++++--------------------------- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index ae849bf3..2281c287 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -117,6 +117,44 @@ mg_color_component_to_pango (double value) return (guint16)(value * 65535.0 + 0.5); } +#if HAVE_GTK3 +static void +mg_apply_font_css (GtkWidget *widget, const PangoFontDescription *desc, + const char *class_name, const char *provider_key) +{ + GtkStyleContext *context; + GtkCssProvider *provider; + char *font_str; + GString *css; + + if (!widget || !desc) + return; + + context = gtk_widget_get_style_context (widget); + if (!context) + return; + + provider = g_object_get_data (G_OBJECT (widget), provider_key); + if (!provider) + { + provider = gtk_css_provider_new (); + g_object_set_data_full (G_OBJECT (widget), provider_key, provider, g_object_unref); + } + + font_str = pango_font_description_to_string (desc); + css = g_string_new ("."); + g_string_append (css, class_name); + g_string_append_printf (css, " { font: %s; }", font_str); + gtk_css_provider_load_from_data (provider, css->str, -1, NULL); + g_string_free (css, TRUE); + g_free (font_str); + + gtk_style_context_add_class (context, class_name); + gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} +#endif + static void mg_set_label_alignment_start (GtkWidget *widget) { @@ -3243,7 +3281,8 @@ mg_apply_emoji_fallback_widget (GtkWidget *widget) return; #if HAVE_GTK3 - gtk_widget_override_font (widget, desc); + mg_apply_font_css (widget, desc, "zoitechat-emoji-font", + "zoitechat-emoji-font-provider"); #else gtk_widget_modify_font (widget, desc); #endif @@ -3285,7 +3324,8 @@ mg_apply_emoji_primary_widget (GtkWidget *widget) return; #if HAVE_GTK3 - gtk_widget_override_font (widget, desc); + mg_apply_font_css (widget, desc, "zoitechat-emoji-font", + "zoitechat-emoji-font-provider"); #else gtk_widget_modify_font (widget, desc); #endif diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index 5721d13d..01d50516 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -1692,15 +1692,7 @@ setup_color_button_apply (GtkWidget *button, const PaletteColor *color) { GtkWidget *target = g_object_get_data (G_OBJECT (button), "zoitechat-color-box"); GtkWidget *apply_widget = GTK_IS_WIDGET (target) ? target : button; -#if HAVE_GTK3 - GtkStateFlags states[] = { - GTK_STATE_FLAG_NORMAL, - GTK_STATE_FLAG_PRELIGHT, - GTK_STATE_FLAG_ACTIVE, - GTK_STATE_FLAG_SELECTED, - GTK_STATE_FLAG_INSENSITIVE - }; -#else +#if !HAVE_GTK3 GtkStateType states[] = { GTK_STATE_NORMAL, GTK_STATE_PRELIGHT, @@ -1711,18 +1703,18 @@ setup_color_button_apply (GtkWidget *button, const PaletteColor *color) #endif guint i; - for (i = 0; i < G_N_ELEMENTS (states); i++) #if HAVE_GTK3 - gtk_widget_override_background_color (apply_widget, states[i], color); + gtkutil_apply_palette (apply_widget, color, NULL, NULL); #else + for (i = 0; i < G_N_ELEMENTS (states); i++) gtk_widget_modify_bg (apply_widget, states[i], color); #endif if (apply_widget != button) - for (i = 0; i < G_N_ELEMENTS (states); i++) #if HAVE_GTK3 - gtk_widget_override_background_color (button, states[i], color); + gtkutil_apply_palette (button, color, NULL, NULL); #else + for (i = 0; i < G_N_ELEMENTS (states); i++) gtk_widget_modify_bg (button, states[i], color); #endif @@ -2803,9 +2795,8 @@ static void setup_apply_entry_style (GtkWidget *entry) { #if HAVE_GTK3 - gtk_widget_override_background_color (entry, GTK_STATE_FLAG_NORMAL, &colors[COL_BG]); - gtk_widget_override_color (entry, GTK_STATE_FLAG_NORMAL, &colors[COL_FG]); - gtk_widget_override_font (entry, input_style->font_desc); + gtkutil_apply_palette (entry, &colors[COL_BG], &colors[COL_FG], + input_style->font_desc); #else gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &colors[COL_BG]); gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &colors[COL_FG]); @@ -2819,29 +2810,26 @@ setup_apply_to_sess (session_gui *gui) mg_update_xtext (gui->xtext); chanview_apply_theme ((chanview *) gui->chanview); - if (prefs.hex_gui_ulist_style) - { -#if HAVE_GTK3 - gtk_widget_override_font (gui->user_tree, input_style->font_desc); -#else - gtk_widget_modify_font (gui->user_tree, input_style->font_desc); +#if !HAVE_GTK3 + if (prefs.hex_gui_ulist_style) + gtk_widget_modify_font (gui->user_tree, input_style->font_desc); #endif - } #if HAVE_GTK3 - if (prefs.hex_gui_ulist_style || fe_dark_mode_is_enabled ()) { - gtk_widget_override_background_color (gui->user_tree, GTK_STATE_FLAG_NORMAL, &colors[COL_BG]); + const PaletteColor *bg = NULL; + const PaletteColor *fg = NULL; + const PangoFontDescription *font = NULL; + + if (prefs.hex_gui_ulist_style || fe_dark_mode_is_enabled ()) + bg = &colors[COL_BG]; if (fe_dark_mode_is_enabled ()) - gtk_widget_override_color (gui->user_tree, GTK_STATE_FLAG_NORMAL, &colors[COL_FG]); - else - gtk_widget_override_color (gui->user_tree, GTK_STATE_FLAG_NORMAL, NULL); - } - else - { - gtk_widget_override_background_color (gui->user_tree, GTK_STATE_FLAG_NORMAL, NULL); - gtk_widget_override_color (gui->user_tree, GTK_STATE_FLAG_NORMAL, NULL); - } + fg = &colors[COL_FG]; + if (prefs.hex_gui_ulist_style) + font = input_style->font_desc; + + gtkutil_apply_palette (gui->user_tree, bg, fg, font); + } #else if (prefs.hex_gui_ulist_style || fe_dark_mode_is_enabled ()) {