summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2008-08-13 02:24:42 -0400
committerBehdad Esfahbod <behdad@behdad.org>2009-02-13 16:53:56 -0800
commit29874098537e763e8e4cd3fefb1ecc0f36b808a5 (patch)
tree89c21bdd57d49373ab772d23c55fd40b9ab9320a
parent77c0d8bce86ca088782d5631617c0ef681d91312 (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.c41
-rw-r--r--fc-list/fc-list.sgml10
-rw-r--r--src/fcint.h3
-rw-r--r--src/fclist.c10
-rw-r--r--src/fcname.c14
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)
{