Bug 33644 - Fontconfig doesn't match correctly in <test>
authorAkira TAGOH <akira@tagoh.org>
Mon, 21 May 2012 04:43:20 +0000 (13:43 +0900)
committerAkira TAGOH <akira@tagoh.org>
Fri, 25 May 2012 04:11:25 +0000 (13:11 +0900)
Warn if the multiple values is set to <test>, including the case of
in <alias> because the behavior isn't intuitive since so many users
is asking for a help to get things working for their expectation.

Use multiple <match>s or <alias>es for OR operator and
multiple <test>s for AND operator.

doc/fontconfig-user.sgml
src/fcxml.c

index c6ab856..f29cfe0 100644 (file)
@@ -627,6 +627,29 @@ This is an example of a system-wide configuration file
        &lt;family&gt;monospace&lt;/family&gt;
        &lt;prefer&gt;&lt;family&gt;Andale Mono&lt;/family&gt;&lt;/prefer&gt;
 &lt;/alias&gt;
+
+&lt;--
+       The example of the requirements of OR operator;
+       If the 'family' contains 'Courier New' OR 'Courier'
+       add 'monospace' as the alternative
+--&gt;
+&lt;match target="pattern"&gt;
+       &lt;test name="family" mode="eq"&gt;
+               &lt;string&gt;Courier New&lt;/string&gt;
+       &lt;/test&gt;
+       &lt;edit name="family" mode="prepend"&gt;
+               &lt;string&gt;monospace&lt;/string&gt;
+       &lt;/edit&gt;
+&lt;/match&gt;
+&lt;match target="pattern"&gt;
+       &lt;test name="family" mode="eq"&gt;
+               &lt;string&gt;Courier&lt;/string&gt;
+       &lt;/test&gt;
+       &lt;edit name="family" mode="prepend"&gt;
+               &lt;string&gt;monospace&lt;/string&gt;
+       &lt;/edit&gt;
+&lt;/match&gt;
+
 &lt;/fontconfig&gt;
     </programlisting>
   </refsect2>
index f027270..d92cbcc 100644 (file)
@@ -1590,6 +1590,7 @@ FcParseAlias (FcConfigParse *parse)
        case FcVStackFamily:
            if (family)
            {
+               FcConfigMessage (parse, FcSevereWarning, "Having multiple <family> in <alias> isn't supported and may not works as expected");
                new = FcExprCreateOp (parse->config, vstack->u.expr, FcOpComma, family);
                if (!new)
                    FcConfigMessage (parse, FcSevereError, "out of memory");
@@ -2204,6 +2205,10 @@ FcParseTest (FcConfigParse *parse)
        FcConfigMessage (parse, FcSevereWarning, "missing test expression");
        return;
     }
+    if (expr->op == FcOpComma)
+    {
+       FcConfigMessage (parse, FcSevereWarning, "Having multiple values in <test> isn't supported and may not works as expected");
+    }
     test = FcTestCreate (parse, kind, qual, name, FC_OP (compare, flags), expr);
     if (!test)
     {