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 ()) {