Re: TWM: truetype support
Marc Aurele La France <[email protected]> Fri, 4 Jan 2008 08:03:27 -0700 (Mountain Standard Time)
| Newsgroups | gmane.comp.xfree86.devel |
|---|---|
| Message-ID | <[email protected]> |
On Mon, 5 Nov 2007, Eeri Kask wrote:
>>> So, luckily we are now a step closed to the solution: let's not use
>>> 'fixed' as coded-in-default in twm.c if TWM_USE_XFT is defined, but
>>> '-*-fixed-*-*-*-*-*-*-*-*-*-*-*-*', and neither XListFonts() nor
>>> XftFontOpenXlfd() have any further difficulties! (Is XListFonts()
>>> supposed to translate font alias names at all?) This looks a good idea,
>>> in fact this is what you suggested first: let XListFonts() resolve
>>> 'fixed' and then use it. Now we know how to do that. :-)
>>> (As a backside, we then remove the flexibility in twm to use the
>>> 'fixed'-alias-redirection to an arbitrary font.)
>> First, the X server does not even start if it cannot resolve 'fixed'. In
>> that case, whether or not `twm` starts is a moot point.
>> Secondly, there are likely to be .twmrc's out there that specify other
>> aliases, such as '7x13' and so on. Thus, it is important to fall back to a
>> raster font when Xft cannot resolve a font name, whether or not that name is
>> a default. This makes it unnecessary to change twm's default font names.
> The good news is, Xft is hardly going to fail.
> One can easily put "A quick brown fox jumps over the lazy dog" for
> TitleFont into .twmrc as an amusing proof. So if XLFD loading fails, we
> will in fact never enter the "fallback" branch in util.c in GetFont().
> But anyways, on our adventurous path to save "fixed" I'll put up a one
> more proposition. What about the following code fragment at the
> beginning for GetFont() in util.c? Now "fixed", "variable", "7x13" et
> cetera are fine as font names. :-)
> ----8<----8<----
> void
> GetFont(MyFont *font)
> {
> #ifdef TWM_USE_XFT
>
> XFontStruct *xlfd;
> Atom atom;
> char *atom_name;
>
> if (font->font != NULL) {
> XftFontClose (dpy, font->font);
> font->font = NULL;
> }
>
> /* test if core font: */
> xlfd = XLoadQueryFont (dpy, font->name);
> if (xlfd) {
> if (XGetFontProperty (xlfd, XA_FONT, &atom) == True) {
> atom_name = XGetAtomName (dpy, atom);
> if (atom_name) {
> font->font = XftFontOpenXlfd (dpy, Scr->screen, atom_name);
> XFree (atom_name);
> }
> }
> XFreeFont (dpy, xlfd);
> }
>
> /* next, try Xft font: */
> if (font->font == NULL)
> font->font = XftFontOpenName (dpy, Scr->screen, font->name);
>
> /* fallback: */
> ....
> ----8<----8<----
At first, I really liked this idea, but I now realize that, because your
spacing changes (as I have them integrated) are only effective for Xft
fonts, "Xft'ing" bitmap fonts would change twm's default behaviour. Thus,
I'd rather not call XftFontOpenXlfd(), which leaves me with a GetFont()
function that looks like ...
void
GetFont(MyFont *font)
{
if (font->fontset != NULL)
XFreeFontSet(dpy, font->fontset);
if (font->font != NULL)
XFreeFont(dpy, font->font);
#ifdef TWM_USE_XFT
if (font->xftfont != NULL)
XftFontClose(dpy, font->xftfont);
font->xftfont = XftFontOpenName(dpy, Scr->screen, font->name);
if (font->xftfont != NULL) {
font->height = font->xftfont->ascent + font->xftfont->descent;
font->y = font->xftfont->ascent;
font->ascent = font->xftfont->ascent;
font->descent = font->xftfont->descent;
return;
}
#endif /* TWM_USE_XFT */
if (use_fontset) {
char **missing_charset_list_return;
int missing_charset_count_return;
char *def_string_return;
XFontSetExtents *font_extents;
XFontStruct **xfonts;
int i, ascent, descent, fnum;
char *basename2, **font_names;
basename2 = (char *)malloc(strlen(font->name) + 3);
if (basename2) {
sprintf(basename2, "%s,*", font->name);
} else
basename2 = font->name;
if( (font->fontset = XCreateFontSet(dpy, basename2,
&missing_charset_list_return,
&missing_charset_count_return,
&def_string_return)) == NULL) {
fprintf (stderr, "%s: unable to open fontset \"%s\"\n",
ProgramName, font->name);
exit(1);
}
if (basename2 != font->name)
free(basename2);
for(i=0; i<missing_charset_count_return; i++){
printf("%s: warning: font for charset %s is lacking.\n",
ProgramName, missing_charset_list_return[i]);
}
font_extents = XExtentsOfFontSet(font->fontset);
fnum = XFontsOfFontSet(font->fontset, &xfonts, &font_names);
for( i = 0, ascent = 0, descent = 0; i < fnum; i++){
if (ascent < (*xfonts)->ascent) ascent = (*xfonts)->ascent;
if (descent < (*xfonts)->descent) descent = (*xfonts)->descent;
xfonts++;
}
font->height = font_extents->max_logical_extent.height;
font->y = ascent;
font->ascent = ascent;
font->descent = descent;
return;
}
if ((font->font = XLoadQueryFont(dpy, font->name)) == NULL)
{
char *deffontname = Scr->DefaultFont.name;
if (deffontname == NULL)
deffontname = "fixed";
if ((font->font = XLoadQueryFont(dpy, deffontname)) == NULL)
{
fprintf (stderr, "%s: unable to open fonts \"%s\" or \"%s\"\n",
ProgramName, font->name, deffontname);
exit(1);
}
}
font->height = font->font->ascent + font->font->descent;
font->y = font->font->ascent;
font->ascent = font->font->ascent;
font->descent = font->font->descent;
}
This means that, to use Xft, the user would need to specify a font name
that is recognized by XftFontOpenName().
In looking over your latest patch sets, I notice a fair amount of activity
in the Fixes and Appearance ones. Do you now consider them as finalised?
What about SloppyFocus?
I'm attaching a diff, against XFree86 CVS source, of those of your changes
that I have so far integrated.
Lastly, do you intend to update twm's man page?
Thanks.
Marc.
+----------------------------------+----------------------------------+
| Marc Aurele La France | work: 1-780-492-9310 |
| Academic Information and | fax: 1-780-492-1729 |
| Communications Technologies | email: [email protected] |
| 352 General Services Building +----------------------------------+
| University of Alberta | |
| Edmonton, Alberta | Standard disclaimers apply |
| T6G 2H1 | |
| CANADA | |
+----------------------------------+----------------------------------+
XFree86 developer and VP. ATI driver and X server internals.
twm.diff.gz
(application/x-gzip, 24.1 KB) - not displayed