From 29874098537e763e8e4cd3fefb1ecc0f36b808a5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 13 Aug 2008 02:24:42 -0400 Subject: [PATCH] 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. --- fc-list/fc-list.c | 41 ++++++++++++++++++++++++----------------- fc-list/fc-list.sgml | 10 +++++++--- src/fcint.h | 3 +++ src/fclist.c | 10 ++++++++++ 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 DESCRIPTION &dhpackage; lists fonts and styles - available on the system for applications using fontconfig. - + available on the system for applications using fontconfig. + With , the whole font pattern + for each font is printed, otherwise only the elements requested + are printed (family and style if none provided). OPTIONS @@ -92,7 +94,9 @@ manpage.1: manpage.sgml - Display status information while busy. + Print whole font pattern for each match. Provided + elements are ignored in this + case. 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) { -- 2.39.5