Implement fc-list --verbose (#13015)

A private FcObjectGetSet() is implemented that provides an
FcObjectSet of all registered elements.  FcFontSetList() is
then modified to use the object set from FcObjectGetSet() if
provided object-set is NULL.

Alternatively FcObjectGetSet() can be made public.  In that
case fc-list can use that as a base if --verbose is included,
and also add any elements provided by the user (though that has
no effect, as all elements from the cache are already registered).
Currently fc-list ignores user-provided elements if --verbose
is specified.
This commit is contained in:
Behdad Esfahbod 2008-08-13 02:24:42 -04:00
parent 77c0d8bce8
commit 2987409853
5 changed files with 58 additions and 20 deletions

View File

@ -71,11 +71,11 @@ static void usage (char *program)
fprintf (stderr, "List fonts matching [pattern]\n");
fprintf (stderr, "\n");
#if HAVE_GETOPT_LONG
fprintf (stderr, " -v, --verbose display status information while busy\n");
fprintf (stderr, " -v, --verbose display entire font pattern\n");
fprintf (stderr, " -V, --version display font config version and exit\n");
fprintf (stderr, " -?, --help display this help and exit\n");
#else
fprintf (stderr, " -v (verbose) display status information while busy\n");
fprintf (stderr, " -v (verbose) display entire font pattern\n");
fprintf (stderr, " -V (version) display font config version and exit\n");
fprintf (stderr, " -? (help) display this help and exit\n");
#endif
@ -85,7 +85,7 @@ static void usage (char *program)
int
main (int argc, char **argv)
{
/*int verbose = 0;*/
int verbose = 0;
int i;
FcObjectSet *os = 0;
FcFontSet *fs;
@ -105,7 +105,7 @@ main (int argc, char **argv)
FC_MAJOR, FC_MINOR, FC_REVISION);
exit (0);
case 'v':
/* verbose = 1; */
verbose = 1;
break;
default:
usage (argv[0]);
@ -124,20 +124,22 @@ main (int argc, char **argv)
if (argv[i])
{
pat = FcNameParse ((FcChar8 *) argv[i]);
while (argv[++i])
{
if (!os)
os = FcObjectSetCreate ();
FcObjectSetAdd (os, argv[i]);
}
if (!verbose)
while (argv[++i])
{
if (!os)
os = FcObjectSetCreate ();
FcObjectSetAdd (os, argv[i]);
}
}
else
pat = FcPatternCreate ();
if (!os)
if (!verbose && !os)
os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, (char *) 0);
fs = FcFontList (0, pat, os);
FcObjectSetDestroy (os);
if (os)
FcObjectSetDestroy (os);
if (pat)
FcPatternDestroy (pat);
@ -150,11 +152,16 @@ main (int argc, char **argv)
FcChar8 *font;
FcChar8 *file;
font = FcNameUnparse (fs->fonts[j]);
if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch)
printf ("%s: ", file);
printf ("%s\n", font);
free (font);
if (verbose)
FcPatternPrint (fs->fonts[j]);
else
{
font = FcNameUnparse (fs->fonts[j]);
if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch)
printf ("%s: ", file);
printf ("%s\n", font);
free (font);
}
}
FcFontSetDestroy (fs);
}

View File

@ -76,8 +76,10 @@ manpage.1: manpage.sgml
<title>DESCRIPTION</title>
<para><command>&dhpackage;</command> lists fonts and styles
available on the system for applications using fontconfig.</para>
available on the system for applications using fontconfig.
With <option>--verbose</option>, the whole font pattern
for each font is printed, otherwise only the elements requested
are printed (family and style if none provided).</para>
</refsect1>
<refsect1>
<title>OPTIONS</title>
@ -92,7 +94,9 @@ manpage.1: manpage.sgml
<option>--verbose</option>
</term>
<listitem>
<para>Display status information while busy.</para>
<para>Print whole font pattern for each match. Provided
<replaceable>element</replaceable>s are ignored in this
case.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -863,6 +863,9 @@ FcObjectFromName (const char * name);
FcPrivate const char *
FcObjectName (FcObject object);
FcPrivate FcObjectSet *
FcObjectGetSet (void);
FcPrivate FcBool
FcObjectInit (void);

View File

@ -457,6 +457,7 @@ FcFontSetList (FcConfig *config,
FcListHashTable table;
int i;
FcListBucket *bucket;
int destroy_os = 0;
if (!config)
{
@ -468,6 +469,13 @@ FcFontSetList (FcConfig *config,
goto bail0;
}
FcListHashTableInit (&table);
if (!os)
{
os = FcObjectGetSet ();
destroy_os = 1;
}
/*
* Walk all available fonts adding those that
* match to the hash table
@ -532,6 +540,8 @@ bail2:
bail1:
FcListHashTableCleanup (&table);
bail0:
if (destroy_os)
FcObjectSetDestroy (os);
return 0;
}

View File

@ -327,6 +327,20 @@ FcObjectFromName (const char * name)
return 0;
}
FcObjectSet *
FcObjectGetSet (void)
{
int i;
FcObjectSet *os = NULL;
os = FcObjectSetCreate ();
for (i = 0; i < FcObjectsNumber; i++)
FcObjectSetAdd (os, FcObjects[i].object);
return os;
}
FcBool
FcObjectInit (void)
{