From: Simon Tatham Date: Wed, 26 Mar 2008 20:20:25 +0000 (+0000) Subject: Sort the styles of Pango font families into a sensible order, X-Git-Tag: 0.61~249^2~36 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=95a5116dbf46d8b21f39e0f1bc3028c70eee5dcf;p=PuTTY.git Sort the styles of Pango font families into a sensible order, instead of alphabetical order. This is more than cosmetic: it's important because the first one in the list is selected by default. [originally from svn r7941] --- diff --git a/unix/gtkfont.c b/unix/gtkfont.c index 8d491ab8..00348fb8 100644 --- a/unix/gtkfont.c +++ b/unix/gtkfont.c @@ -46,8 +46,7 @@ * - work out why the list boxes don't go all the way to the RHS * of the dialog box * - * - develop a sensible sorting order for the font styles - - * Regular / Roman / non-bold-or-italic should come at the top! + * - construct a stylekey for X11 fonts * * - big testing and shakedown! */ @@ -90,7 +89,8 @@ typedef void (*fontsel_add_entry)(void *ctx, const char *realfontname, const char *family, const char *charset, - const char *style, int size, int flags, + const char *style, const char *stylekey, + int size, int flags, const struct unifont_vtable *fontclass); struct unifont_vtable { @@ -536,7 +536,7 @@ static void x11font_enum_fonts(GtkWidget *widget, */ if (fontsize) callback(callback_ctx, fontnames[i], font, charset, - style, fontsize, flags, &x11font_vtable); + style, NULL, fontsize, flags, &x11font_vtable); } else { /* * This isn't an XLFD, so it must be an alias. @@ -547,7 +547,7 @@ static void x11font_enum_fonts(GtkWidget *widget, * anything but computationally hideous. Ah well. */ callback(callback_ctx, fontnames[i], fontnames[i], NULL, - NULL, 0, FONTFLAG_SERVERALIAS, &x11font_vtable); + NULL, NULL, 0, FONTFLAG_SERVERALIAS, &x11font_vtable); } } XFreeFontNames(fontnames); @@ -883,17 +883,46 @@ static void pangofont_enum_fonts(GtkWidget *widget, fontsel_add_entry callback, */ for (k = 0; k < nsizes; k++) { char *fullname; + char stylekey[128]; pango_font_description_set_size(desc, sizes[k]); fullname = pango_font_description_to_string(desc); + /* + * Construct the sorting key for font styles. + */ + { + char *p = stylekey; + int n; + + n = pango_font_description_get_weight(desc); + /* Weight: normal, then lighter, then bolder */ + if (n <= PANGO_WEIGHT_NORMAL) + n = PANGO_WEIGHT_NORMAL - n; + p += sprintf(p, "%4d", n); + + n = pango_font_description_get_style(desc); + p += sprintf(p, " %2d", n); + + n = pango_font_description_get_stretch(desc); + /* Stretch: closer to normal sorts earlier */ + n = 2 * abs(PANGO_STRETCH_NORMAL - n) + + (n < PANGO_STRETCH_NORMAL); + p += sprintf(p, " %2d", n); + + n = pango_font_description_get_variant(desc); + p += sprintf(p, " %2d", n); + + } + /* * Got everything. Hand off to the callback. * (The charset string is NULL, because only * server-side X fonts use it.) */ callback(callback_ctx, fullname, familyname, NULL, facename, + stylekey, (sizes == &dummysize ? 0 : PANGO_PIXELS(sizes[k])), flags, &pangofont_vtable); @@ -1106,7 +1135,7 @@ typedef struct unifontsel_internal { */ struct fontinfo { char *realname; - char *family, *charset, *style; + char *family, *charset, *style, *stylekey; int size, flags; /* * Fallback sorting key, to permit multiple identical entries @@ -1171,6 +1200,8 @@ static int fontinfo_selorder_compare(void *av, void *bv) return i; if ((i = strnullcasecmp(a->charset, b->charset)) != 0) return i; + if ((i = strnullcasecmp(a->stylekey, b->stylekey)) != 0) + return i; if ((i = strnullcasecmp(a->style, b->style)) != 0) return i; if (a->size != b->size) @@ -1504,7 +1535,8 @@ static void unifontsel_button_toggled(GtkToggleButton *tb, gpointer data) static void unifontsel_add_entry(void *ctx, const char *realfontname, const char *family, const char *charset, - const char *style, int size, int flags, + const char *style, const char *stylekey, + int size, int flags, const struct unifont_vtable *fontclass) { unifontsel_internal *fs = (unifontsel_internal *)ctx; @@ -1514,7 +1546,7 @@ static void unifontsel_add_entry(void *ctx, const char *realfontname, totalsize = sizeof(fontinfo) + strlen(realfontname) + (family ? strlen(family) : 0) + (charset ? strlen(charset) : 0) + - (style ? strlen(style) : 0) + 10; + (style ? strlen(style) : 0) + (stylekey ? strlen(stylekey) : 0) + 10; info = (fontinfo *)smalloc(totalsize); info->fontclass = fontclass; p = (char *)info + sizeof(fontinfo); @@ -1539,6 +1571,12 @@ static void unifontsel_add_entry(void *ctx, const char *realfontname, p += 1+strlen(p); } else info->style = NULL; + if (stylekey) { + info->stylekey = p; + strcpy(p, stylekey); + p += 1+strlen(p); + } else + info->stylekey = NULL; assert(p - (char *)info <= totalsize); info->size = size; info->flags = flags;