From c36b573fda672434d8a6c8a2a64a771212c4eead Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 21 Sep 2020 12:52:42 -0400 Subject: fc: Sort faces of a family Make pango_font_family_list_faces() return faces sorted by slant and weight. This makes the font chooser look much less random. --- pango/pangofc-fontmap.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index e120d305..0f211c46 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -2805,6 +2805,32 @@ create_face (PangoFcFamily *fcfamily, return face; } +static int +compare_face (const void *p1, const void *p2) +{ + const PangoFcFace *f1 = *(const void **)p1; + const PangoFcFace *f2 = *(const void **)p2; + int w1, w2; + int s1, s2; + + if (FcPatternGetInteger (f1->pattern, FC_WEIGHT, 0, &w1) != FcResultMatch) + w1 = FC_WEIGHT_MEDIUM; + + if (FcPatternGetInteger (f1->pattern, FC_SLANT, 0, &s1) != FcResultMatch) + s1 = FC_SLANT_ROMAN; + + if (FcPatternGetInteger (f2->pattern, FC_WEIGHT, 0, &w2) != FcResultMatch) + w2 = FC_WEIGHT_MEDIUM; + + if (FcPatternGetInteger (f2->pattern, FC_SLANT, 0, &s2) != FcResultMatch) + s2 = FC_SLANT_ROMAN; + + if (s1 != s2) + return s1 - s2; /* roman < italic < oblique */ + + return w1 - w2; /* from light to heavy */ +} + static void ensure_faces (PangoFcFamily *fcfamily) { @@ -2914,6 +2940,8 @@ ensure_faces (PangoFcFamily *fcfamily) faces = g_renew (PangoFcFace *, faces, num); + qsort (faces, num, sizeof (PangoFcFace *), compare_face); + fcfamily->n_faces = num; fcfamily->faces = faces; } -- cgit v1.2.1