...fare Linux appena un po' piu' divertente!

Come i Font Interagiscono con X Server e X Client

By Thomas Adam


Introduzione

Dietro la grafica, c'e' una chiara mole di cose che accadono quando un applicazione richiede l'uso di un font. A causa delle installazioni di default che incluono entrambi il server X e i loro rispettivi client sulla stessa macchina, molte delle funzionalita' sono mascherate. Comunque, il server X gioca un ruolo principale nella gestione dei font memorizzati in esso.

Ci sono due meccanismi diversi che lavorano, per quanto riguarda i font: uno fa uso di un server dei font, l'altro no.

I Fonts e la loro collocazione

Prendendo un tipico sistema che non usa un server dei font, le definizioni dei font sono una proprieta' del server X; che esso conosce e tiene traccia di quali font ci sono sul proprio sistema. I default di X11 per la ricerca dei font sono in /usr/lib/X11/fonts/* .

Tipicamente, in una definizione standard presa da /etc/X11/XF86Config-4 (o dal nuovo xorg.conf) i file possono essere tipo questi:

Section "Files"
    FontPath        "unix/:7100"          # local font server
    # if the local font server has problems, we can fall back on these
    FontPath        "/usr/lib/X11/fonts/misc"
    FontPath        "/usr/lib/X11/fonts/cyrillic"
    FontPath        "/usr/lib/X11/fonts/75dpi/"
    FontPath        "/usr/lib/X11/fonts/100dpi/"
    FontPath        "/usr/X11R6/lib/X11/fonts/sgi"
    FontPath        "/usr/lib/X11/fonts/Type1"
    FontPath        "/usr/lib/X11/fonts/CID"
    FontPath        "/usr/lib/X11/fonts/100dpi:unscaled"
    FontPath        "/usr/lib/X11/fonts/75dpi:unscaled"

Un'applicazione puo' richiedere un font per la visualizzazione, e il server X lo cerchera' cortesemente nelle directory memorizzate indicate (anche in molte directory, come nell'esempio sopra). Il comando ' xset q ' elenchera' quelle informazioni [1] , e addirittura alcuni path di font possono essere aggunti con' xset +fp /some/location/ '.

Comunque, questo non fa niente di piu' che aggiungere una definizione di directory. Per fare in modo che il server X sia consapevole del fatto che e' stata aggiunta una nuova locazione, occorre fare un refresh con ' xset fp rehash '.

Descrizioni del font

Esiste un comodo meccanismo nei font di X11, che consiste negli alias dei nomi dei font. Se ignoriamo per il momento i font TrueType, il comando 'xlsfonts' lista i font cosi':

-adobe-avant garde gothic-book-o-normal--0-0-0-0-p-0-iso8859-1
-adobe-courier-bold-o-normal--17-120-100-100-m-100-iso10646-1
...
[ Tolte molte altre linee ]

Prendiamone una per esempio — ecco il significato di ogni singola parte:

font description
Figure 1: Struttura di un font tipico.

Ci sono molte informazioni, vero? Si, e' vero, ci sono molte informazioni utili . Approssimativamente (e fuori dalla mia testa) ecco il significato di ogni singola parte:

Tutto questo puo' essere seccante e noioso, e certamente sarebbe un incubo se si dovessero ricordare tutte le informazioni insieme. Ecco dove aliasing e wildcarding diventano utili.

La maggior parte delle applicazioni X11 che usano il database X11 Resource Database (XRDB) permettono a varie risorse di essere impostate con un appropriato font. Esempio:

*xterm.font: *courier-bold-o-*-120*

Questo dovrebbe essere in un modo carino auto-esplicante, giusto? E' analogo allo spesso utilizzato a riga di comando [2] di:

<program> -fn '*courier-bold-o-*-120*'

Il server X poi cerca quel font, espandendo la wildcard come deve essere. Con questo e' lasciato largo spazio all'utente per assicurare il corretto posizionamento di qualsiasi wildcard, dal momento che in molte occasioni non si accoppiera' o trovera' font non intenzionali. Il server X attraversera' qualsiasi percorso nel suo fontpath, nell'ordine in cui le directory sono elencate , fino a che non si accoppia con un font. Non si puo' modificare l'ordine a sufficenza — e' analogo al modo in cui viene cercato un file eseguibile, nella $PATH. Il primo font trovato e' comunque dentro la lista dei fontpaths, sebbene due o piu' font si dovessere accoppiare con la wildcard.

Aliasing e' leggermente differente, cioe' invece che l'utente debba tenere conto dell'accoppiamento su wildcard, esiste un file "font.alias" che contiene dei nomi brevi per i font (nomi alternativi, se si vuole). Eccone uno:

lucidasans-bolditalic-8    -b&h-lucida-bold-i-normal-sans-11-80-100-100-p-69-iso885 9-1

Essenzialmente, e' un file a due colonne, con il nome alternativo nella prima colonna, e il nome del font reale nella seconda. Come prima, se si usa un alias per caricare un font, il server X lo cerchera' nelle directory dei font di turno. Questo ha in piu' il beneficio di essere in grado di specificare gli alias per font che sono in altre directory.

Un file fonts.alias e' associato anche con un file fonts.dir. Si puo' pensare questo file come un database massivo che usa il server X. E' un po' come font.alias, eccetto che questo file elenca i seguenti:

Actual Font Name                Font Name

Qaundo si chiede al server X di ricercare un font, esso cercera' in fonts.dir per trovare con chiave o il font col nome lungo, o il suo alias (dal momento che nella ricerca alias e' mappato prima del fonts.dir). Se non si e' mai usato il comando mkfontdir(1), ecco cosa fa — crea un file font.dir con dentro ogni e qualsiasi fontpath elencato.

Server dei Font

Ora i server dei font: non sono necessari. In realta' — a meno che non siate una grande multinazionale che ha centinaia di workstation che si connettono al server X con diversi prodotti commerciali. Nella release R5 di X11, e' stato utilizzato per uniformita', per assicurare che i nomi dei font rimanessero coerenti, cioe' che le applicazioni potessero caricarli, e pertanto condividerli . Quello che accade e' qualcosa tipo questo:

XFS Comms
Figure 2: Come XFS interagisce con il server X e i client X

La macchina "Server" ha un certo numero di servizi che vengono eseguiti su di essa -- incluso il XFS (X Font Server). Il locale server X eseguito su un client e pertanto comunica con un server dei font (cio' e' tipico della riga):

FontPath "unix/:7100" 

Il server dei font risponde fornendo al server X sul client una lista di nomi di font di applicazioni (X client) che possono essere caricate e visualizzate sullo schermo. (Sotto c'e' molto che accade, ma cio' verra' omesso.) Notare il "ruolo invertito" qui [3] : il server X e' un client rispetto al server dei font — percio' e' esso stesso un "font client" — altri esempi includono una stampante, la quale dovrebbe anch'essa necessariamente parlare con il font server (sebbene non mostrato nel diagramma di sopra).

Vecchie versioni di Red Hat usano insistere sull'esecuzione di un TrueType font server, per nessun'altra ragione che, presumibilmente, per annoiare chiunque.


[1] Programmaticamente, questo puo' essere realizzato con la XSetFontPath() call.

[2] Notare le virgolette qui, per non eseguire la globalizzazione nella shell.

[3] Rick Moen commenta: i nuovi di Unix sono spesso confusi dalle nozioni di applicazioni che sono client di X11 e il display grafico che viene guidato da un processo server, il quale e' in qualche modo opposto alle aspettative delle persone. Essi pensano: sicuramente le applicazioni forniscono i dati per la visualizzazione, percio' esse sono server, che l'interfaccia grafica sta' ricevendo, percio' la pensano come client. Tuttavia, quello che sta' servendo, a entrambi le locali applicazioni e quelle remote X11 attraverso accesso di rete, e' che il software di servizio costruisce la visualizzazione grafica, come una funzione centrale del sistema per tutte le applicazioni che ne hanno bisogno. Percio' le applicazioni sono, per quello scopo, client.

Talkback: Discuss this article with The Answer Gang

Copyright © 2006, Thomas Adam. Released under the Open Publication license unless otherwise noted in the body of the article. Linux Gazette is not produced, sponsored, or endorsed by its prior host, SSC, Inc.

Published in Issue 128 of Linux Gazette, July 2006

Tux