diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2008-08-13 02:24:42 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2009-02-13 16:53:56 -0800 |
commit | 29874098537e763e8e4cd3fefb1ecc0f36b808a5 (patch) | |
tree | 89c21bdd57d49373ab772d23c55fd40b9ab9320a | |
parent | 77c0d8bce86ca088782d5631617c0ef681d91312 (diff) |
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.
-rw-r--r-- | fc-list/fc-list.c | 41 | ||||
-rw-r--r-- | fc-list/fc-list.sgml | 10 | ||||
-rw-r--r-- | src/fcint.h | 3 | ||||
-rw-r--r-- | src/fclist.c | 10 | ||||
-rw-r--r-- | src/fcname.c | 14 |
5 files changed, 58 insertions, 20 deletions
diff --git a/fc-list/fc-list.c b/fc-list/fc-list.c index a410df8..8384f28 100644 --- a/fc-list/fc-list.c +++ b/fc-list/fc-list.c @@ -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); } diff --git a/fc-list/fc-list.sgml b/fc-list/fc-list.sgml index fbd0b0d..f4a3147 100644 --- a/fc-list/fc-list.sgml +++ b/fc-list/fc-list.sgml @@ -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> diff --git a/src/fcint.h b/src/fcint.h index fe59947..5798702 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -863,6 +863,9 @@ FcObjectFromName (const char * name); FcPrivate const char * FcObjectName (FcObject object); +FcPrivate FcObjectSet * +FcObjectGetSet (void); + FcPrivate FcBool FcObjectInit (void); diff --git a/src/fclist.c b/src/fclist.c index a0306ca..2a53b79 100644 --- a/src/fclist.c +++ b/src/fclist.c @@ -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; } diff --git a/src/fcname.c b/src/fcname.c index 51544de..0815cf3 100644 --- a/src/fcname.c +++ b/src/fcname.c @@ -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) { |