+static int
+xfont_list (MFrame *frame, MPlist *plist, MFont *font, int maxnum)
+{
+ MDisplayInfo *disp_info = FRAME_DEVICE (frame)->display_info;
+ MSymbol registry = font ? FONT_PROPERTY (font, MFONT_REGISTRY) : Mnil;
+ MSymbol family = font ? FONT_PROPERTY (font, MFONT_FAMILY) : Mnil;
+ int size = font ? font->size : 0;
+ MPlist *pl, *p;
+ int num = 0;
+ int mdebug_mask = MDEBUG_FONT;
+
+ MDEBUG_PRINT2 (" [X-FONT] listing %s-%s...",
+ family ? msymbol_name (family) : "*",
+ registry ? msymbol_name (registry) : "*");
+
+ if (registry == Mnil)
+ xfont_list_all (frame);
+ else
+ xfont_registry_list (frame, registry);
+
+ MPLIST_DO (pl, disp_info->font_list)
+ {
+ if (registry != Mnil && registry != MPLIST_KEY (pl))
+ continue;
+ MPLIST_DO (p, MPLIST_VAL (pl))
+ {
+ MFontX *fontx;
+
+ if (family != Mnil && family != MPLIST_KEY (p))
+ continue;
+ for (fontx = MPLIST_VAL (p); fontx; fontx = fontx->next)
+ if (! font
+ || (mfont__match_p (&fontx->core, font, MFONT_REGISTRY)))
+ {
+ if (fontx->core.size == size
+ || fontx->core.size == 0)
+ {
+ mplist_push (plist, MPLIST_KEY (p), fontx);
+ num++;
+ }
+ else if (size == 0
+ || (size <= 360 && HAVE_SIZE (fontx, (size / 10))))
+ {
+ unsigned size5_36 = fontx->size5_36;
+ MFontX *fontx2;
+ int i;
+
+ fontx->size5_36 = 0;
+ for (i = fontx->core.size / 10; i <= 36; i++)
+ if (size5_36 & (1 << (i - 5)))
+ {
+ MSTRUCT_CALLOC (fontx2, MERROR_WIN);
+ fontx2->core = fontx->core;
+ fontx2->core.size = i * 10;
+ fontx2->next = fontx->next;
+ fontx->next = fontx2;
+ fontx = fontx2;
+ if ((size == 0 || size == fontx->core.size)
+ && (maxnum == 0 || num < maxnum))
+ {
+ mplist_push (plist, MPLIST_KEY (p), fontx);
+ num++;
+ }
+ }
+ }
+ if (maxnum > 0 && maxnum == num)
+ break;
+ }
+ if (maxnum > 0 && maxnum == num)
+ break;
+ }
+ if (maxnum > 0 && maxnum == num)
+ break;
+ }
+
+ MDEBUG_PRINT1 (" %d found\n", num);
+ return num;
+}
+