From: Benjamin Otte Date: Sun, 9 Oct 2022 13:08:55 +0000 (-0400) Subject: fontbutton: Use attributes for custom font X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~9^2~189^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=32ef462f1df74a148e95272bcebd707d3550e343;p=gtk4.git fontbutton: Use attributes for custom font Don't try to use CSS. --- diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c index 0edf9de4fc..ef8f64c2b5 100644 --- a/gtk/gtkfontbutton.c +++ b/gtk/gtkfontbutton.c @@ -31,7 +31,6 @@ #include "gtkbinlayout.h" #include "gtkbox.h" -#include "gtkcssprovider.h" #include "gtkfontchooser.h" #include "gtkfontchooserdialog.h" #include "gtkfontchooserutils.h" @@ -40,7 +39,6 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkseparator.h" -#include "gtkstylecontext.h" #include "gtkwidgetprivate.h" #include @@ -102,7 +100,6 @@ struct _GtkFontButton GtkFontFilterFunc font_filter; gpointer font_filter_data; GDestroyNotify font_filter_data_destroy; - GtkCssProvider *provider; }; struct _GtkFontButtonClass @@ -640,8 +637,6 @@ gtk_font_button_finalize (GObject *object) g_free (font_button->preview_text); - g_clear_object (&font_button->provider); - gtk_widget_unparent (font_button->button); G_OBJECT_CLASS (gtk_font_button_parent_class)->finalize (object); @@ -1086,226 +1081,36 @@ dialog_destroy (GtkWidget *widget, font_button->font_dialog = NULL; } -static void -add_css_variations (GString *s, - const char *variations) -{ - const char *p; - const char *sep = ""; - - if (variations == NULL || variations[0] == '\0') - { - g_string_append (s, "normal"); - return; - } - - p = variations; - while (p && *p) - { - const char *start; - const char *end, *end2; - double value; - char name[5]; - - while (g_ascii_isspace (*p)) p++; - - start = p; - end = strchr (p, ','); - if (end && (end - p < 6)) - goto skip; - - name[0] = p[0]; - name[1] = p[1]; - name[2] = p[2]; - name[3] = p[3]; - name[4] = '\0'; - - p += 4; - while (g_ascii_isspace (*p)) p++; - if (*p == '=') p++; - - if (p - start < 5) - goto skip; - - value = g_ascii_strtod (p, (char **) &end2); - - while (end2 && g_ascii_isspace (*end2)) end2++; - - if (end2 && (*end2 != ',' && *end2 != '\0')) - goto skip; - - g_string_append_printf (s, "%s\"%s\" %g", sep, name, value); - sep = ", "; - -skip: - p = end ? end + 1 : NULL; - } -} - -static char * -pango_font_description_to_css (PangoFontDescription *desc, - const char *features, - const char *language) -{ - GString *s; - PangoFontMask set; - - s = g_string_new ("* { "); - - set = pango_font_description_get_set_fields (desc); - if (set & PANGO_FONT_MASK_FAMILY) - { - g_string_append (s, "font-family: \""); - g_string_append (s, pango_font_description_get_family (desc)); - g_string_append (s, "\"; "); - } - if (set & PANGO_FONT_MASK_STYLE) - { - switch (pango_font_description_get_style (desc)) - { - case PANGO_STYLE_NORMAL: - g_string_append (s, "font-style: normal; "); - break; - case PANGO_STYLE_OBLIQUE: - g_string_append (s, "font-style: oblique; "); - break; - case PANGO_STYLE_ITALIC: - g_string_append (s, "font-style: italic; "); - break; - default: - break; - } - } - if (set & PANGO_FONT_MASK_VARIANT) - { - switch (pango_font_description_get_variant (desc)) - { - case PANGO_VARIANT_NORMAL: - g_string_append (s, "font-variant: normal; "); - break; - case PANGO_VARIANT_SMALL_CAPS: - g_string_append (s, "font-variant: small-caps; "); - break; - case PANGO_VARIANT_ALL_SMALL_CAPS: - g_string_append (s, "font-variant: all-small-caps; "); - break; - case PANGO_VARIANT_PETITE_CAPS: - g_string_append (s, "font-variant: petite-caps; "); - break; - case PANGO_VARIANT_ALL_PETITE_CAPS: - g_string_append (s, "font-variant: all-petite-caps; "); - break; - case PANGO_VARIANT_UNICASE: - g_string_append (s, "font-variant: unicase; "); - break; - case PANGO_VARIANT_TITLE_CAPS: - g_string_append (s, "font-variant: titling-caps; "); - break; - default: - break; - } - } - if (set & PANGO_FONT_MASK_WEIGHT) - g_string_append_printf (s, "font-weight: %d; ", pango_font_description_get_weight (desc)); - - if (set & PANGO_FONT_MASK_STRETCH) - { - switch (pango_font_description_get_stretch (desc)) - { - case PANGO_STRETCH_ULTRA_CONDENSED: - g_string_append (s, "font-stretch: ultra-condensed; "); - break; - case PANGO_STRETCH_EXTRA_CONDENSED: - g_string_append (s, "font-stretch: extra-condensed; "); - break; - case PANGO_STRETCH_CONDENSED: - g_string_append (s, "font-stretch: condensed; "); - break; - case PANGO_STRETCH_SEMI_CONDENSED: - g_string_append (s, "font-stretch: semi-condensed; "); - break; - case PANGO_STRETCH_NORMAL: - g_string_append (s, "font-stretch: normal; "); - break; - case PANGO_STRETCH_SEMI_EXPANDED: - g_string_append (s, "font-stretch: semi-expanded; "); - break; - case PANGO_STRETCH_EXPANDED: - g_string_append (s, "font-stretch: expanded; "); - break; - case PANGO_STRETCH_EXTRA_EXPANDED: - g_string_append (s, "font-stretch: extra-expanded; "); - break; - case PANGO_STRETCH_ULTRA_EXPANDED: - g_string_append (s, "font-stretch: ultra-expanded; "); - break; - default: - break; - } - } - if (set & PANGO_FONT_MASK_SIZE) - { - g_string_append_printf (s, "font-size: %dpt; ", pango_font_description_get_size (desc) / PANGO_SCALE); - } - - if (set & PANGO_FONT_MASK_VARIATIONS) - { - const char *variations; - - g_string_append (s, "font-variation-settings: "); - variations = pango_font_description_get_variations (desc); - add_css_variations (s, variations); - g_string_append (s, "; "); - } - if (features) - { - g_string_append_printf (s, "font-feature-settings: %s;", features); - } - - g_string_append (s, "}"); - - return g_string_free (s, FALSE); -} - static void gtk_font_button_label_use_font (GtkFontButton *font_button) { - GtkStyleContext *context; - - context = gtk_widget_get_style_context (font_button->font_label); - if (!font_button->use_font) - { - if (font_button->provider) - { - gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (font_button->provider)); - g_clear_object (&font_button->provider); - } - } + gtk_label_set_attributes (GTK_LABEL (font_button->font_label), NULL); else { PangoFontDescription *desc; - char *data; - - if (!font_button->provider) - { - font_button->provider = gtk_css_provider_new (); - gtk_style_context_add_provider (context, - GTK_STYLE_PROVIDER (font_button->provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - } + PangoAttrList *attrs; desc = pango_font_description_copy (font_button->font_desc); if (!font_button->use_size) pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE); - data = pango_font_description_to_css (desc, - font_button->font_features, - pango_language_to_string (font_button->language)); - gtk_css_provider_load_from_data (font_button->provider, data, -1); + attrs = pango_attr_list_new (); + + /* Prevent font fallback */ + pango_attr_list_insert (attrs, pango_attr_fallback_new (FALSE)); + + /* Force current font and features */ + pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc)); + if (font_button->font_features) + pango_attr_list_insert (attrs, pango_attr_font_features_new (font_button->font_features)); + if (font_button->language) + pango_attr_list_insert (attrs, pango_attr_language_new (font_button->language)); + + gtk_label_set_attributes (GTK_LABEL (font_button->font_label), attrs); - g_free (data); + pango_attr_list_unref (attrs); pango_font_description_free (desc); } }