hi, After updating fontconfig, apps which use fontconfig are going to crash:(, then I found FcPatternGetString(pattern, FC_FILE,... only returns basename instread of full path name sometimes that make cairo return NULL font face then app crashes. Then follow to fontconfig, I think problem is here. void FcPatternDestroy (FcPattern *p) { int i; if (FcPatternFindFullFname (p)) FcPatternAddFullFname (p, 0); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ why every call to FcPatternDestroy want to reset font full name, maybe this object is still hold by others. Removing these two lines, everything works fine now.:D Patrick Lam wrote: > James Cloos wrote: > >>>>>>> "Patrick" == Patrick Lam <plam@xxxxxxx> writes: >> >> >> >> Patrick> So I was suggesting this slightly evil thing. If you call >> Patrick> FcPatternGetString for an FC_FILE, then fontconfig will >> Patrick> silently append the path of the cache file to the path of the >> Patrick> file. ... ... ... The result is that no changes are visible >> Patrick> from the outside; no version number bumping or recompilation >> Patrick> required. >> >> OK. I get it now. Looks perfect. > > > I've implemented this now. It was kind of messy, I guess, because I had > to also copy the full pathname whenever I was duplicating an FcPattern > (and this happens a number of times). It would be nice if I could think > of a simpler solution, but this seems to work. > > So, we have basenames in caches; these basenames are relative to the > cache file's (conceptual) location. (Even if we stuff them all in /var, > we know what directory the cache file belongs to.) So you can move your > directories all around the drive, or mount them in different places, and > things should continue working. > > pat