24.01.2014 Views

1705 TXT HTM PDF pdf P1 P2 P3 P4 31.1 Struttura - IIS Marconi ...

1705 TXT HTM PDF pdf P1 P2 P3 P4 31.1 Struttura - IIS Marconi ...

1705 TXT HTM PDF pdf P1 P2 P3 P4 31.1 Struttura - IIS Marconi ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>1705</strong><br />

Capitolo 31<br />

<strong>TXT</strong><br />

<strong>HTM</strong><br />

<strong>PDF</strong><br />

<strong>pdf</strong><br />

<strong>P1</strong><br />

<strong>P2</strong><br />

<strong>P3</strong><br />

<strong>P4</strong><br />

X<br />

«<br />

<strong>31.1</strong> <strong>Struttura</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1707<br />

<strong>31.1</strong>.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1708<br />

<strong>31.1</strong>.2 Cliente-servente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1709<br />

31.2 X.Org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1710<br />

31.3 Lettura del file di configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1711<br />

31.3.1 Sezione «Files» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1713<br />

31.3.2 Sezione «ServerFlags» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1713<br />

31.3.3 Sezione «InputDevice» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1714<br />

31.3.4 Sezione «Monitor» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1715<br />

31.3.5 Sezione «Device» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1716<br />

31.3.6 Sezione «Screen» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1717<br />

31.4 Accesso a un servente di caratteri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1718<br />

31.5 Funzionamento e accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1719<br />

«a2» 2010.08 anteprima --- Copyright © Daniele Giacomini -- 〈appunti2 ( ad) gmail·com 〉 〈http://informaticalibera.net 〉 Edizione di prova.<br />

31.5.1 Procedura di avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1719<br />

31.5.2 Privilegi per il funzionamento di un servente grafico . . . . . . . . . . . . . . . . . 1726<br />

31.5.3 Stazioni grafiche virtuali multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1726<br />

31.5.4 Definizione dello schermo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1727<br />

31.5.5 Accedere allo schermo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1727<br />

31.5.6 Accedere allo schermo con Secure Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1734<br />

31.5.7 Cambiare identità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1735<br />

31.5.8 Tipi di carattere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1736<br />

31.5.9 X e l’uso senza dispositivo di puntamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1736<br />

31.6 Approfondimento: monitor, adattatore grafico e frequenza dot-clock . . . . . . . . . . 1738<br />

31.6.1 Autorilevamento con Read-edid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1738<br />

31.6.2 Autorilevamento con un servente XFree86 versione 3.* . . . . . . . . . . . . . . . 1740<br />

31.6.3 Un po’ di teoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1744<br />

31.6.4 Configurazione della sezione «Monitor» di «XF86Config» . . . . . . . . . . . . . 1751<br />

31.6.5 Rifiniture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1756<br />

31.6.6 Altri programmi affini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1757<br />

31.7 La tastiera e la sua configurazione «elementare» . . . . . . . . . . . . . . . . . . . . . . . . . . . .1757<br />

31.7.1 Livelli, tasti morti, composizione e gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1757<br />

31.7.2 Configurazione elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1760<br />

31.7.3 Geometria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1765


1706 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.8 Configurazione più dettagliata della tastiera e del mouse . . . . . . . . . . . . . . . . . .1767<br />

31.8.1 Componenti della configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1768<br />

31.8.2 Modificatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1768<br />

31.8.3 Configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1768<br />

31.8.4 Configurazione con «xmodmap» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1774<br />

31.9 Metodi di inserimento intelligente con SCIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1783<br />

31.9.1 SCIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1783<br />

31.9.2 Attivazione del metodo di inserimento intelligente . . . . . . . . . . . . . . . . . . . . 1784<br />

31.9.3 La configurazione locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1785<br />

31.9.4 Utilizzo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1785<br />

<strong>31.1</strong>0 Gestori di finestre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1787<br />

<strong>31.1</strong>0.1 Twm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1787<br />

<strong>31.1</strong>0.2 Fvwm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1792<br />

<strong>31.1</strong>1 Accorgimenti per la costruzione di un menù . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1796<br />

<strong>31.1</strong>1.1 Verifica della disponibilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1796<br />

<strong>31.1</strong>1.2 Verificare che un programma non sia già in funzione . . . . . . . . . . . . . . . . . 1797<br />

<strong>31.1</strong>1.3 Informare della fase di avvio del programma . . . . . . . . . . . . . . . . . . . . . . . . 1797<br />

<strong>31.1</strong>1.4 Mettere assieme le varie fasi di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1798<br />

<strong>31.1</strong>1.5 Innesto di un file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1799<br />

<strong>31.1</strong>1.6 Separazione di un file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1799<br />

<strong>31.1</strong>2 X: login grafico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1800<br />

<strong>31.1</strong>2.1 Configurazione generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1800<br />

<strong>31.1</strong>2.2 Utilizzo attraverso la rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1801<br />

<strong>31.1</strong>2.3 Avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1802<br />

<strong>31.1</strong>2.4 Xdm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1802<br />

<strong>31.1</strong>2.5 Gdm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1804<br />

<strong>31.1</strong>2.6 Kdm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1805<br />

<strong>31.1</strong>2.7 Wdm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1805<br />

<strong>31.1</strong>3 Sessione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1805<br />

<strong>31.1</strong>3.1 Il problema che motiva il concetto di «sessione» . . . . . . . . . . . . . . . . . . . . . 1805<br />

<strong>31.1</strong>3.2 Gli script che controllano l’avvio della sessione . . . . . . . . . . . . . . . . . . . . . 1806<br />

<strong>31.1</strong>3.3 Gestori di sessione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1806<br />

<strong>31.1</strong>3.4 Gnome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1807<br />

<strong>31.1</strong>3.5 KDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1808<br />

<strong>31.1</strong>4 Accesso remoto alla sessione di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1813


X 1707<br />

<strong>31.1</strong>4.1 Funzionamento di VNC in generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1814<br />

<strong>31.1</strong>4.2 Avvio e conclusione del funzionamento del servente VNC in un sistema<br />

GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1815<br />

<strong>31.1</strong>4.3 Avvio del servente VNC in condizioni difficili in un sistema GNU 1817<br />

<strong>31.1</strong>4.4 Configurazione e utilizzo dei caratteri tipografici . . . . . . . . . . . . . . . . . . 1820<br />

<strong>31.1</strong>4.5 Accesso a un servente VNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1821<br />

<strong>31.1</strong>4.6 Utilizzo comune di VNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1822<br />

<strong>31.1</strong>4.7 VNC attraverso un tunnel cifrato con il protocollo SSH . . . . . . . . . . . . . . .1822<br />

<strong>31.1</strong>4.8 Inserire VNC automaticamente all’avvio di X . . . . . . . . . . . . . . . . . . . . . . . 1823<br />

<strong>31.1</strong>4.9 RealVNC e TightVNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1825<br />

<strong>31.1</strong>4.10 Script «vncrc» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1825<br />

<strong>31.1</strong>4.11 Conclusione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1833<br />

<strong>31.1</strong>5 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1833<br />

.fvwmrc 1792 .twmrc 1787 .vncrc 1820 .Xauthority 1727 1731 .xinitrc 1720<br />

1723 1787 1792 .xmodmap 1776 .xserverrc 1720 .xsession 1800 1805<br />

.Xsession 1800 1805 /etc/kde2/kdm/ 1805 /etc/X11/gdm/ 1804<br />

/etc/X11/kdm/ 1805 /etc/X11/wdm/ 1805 /etc/X11/xdm/ 1802<br />

/etc/X11/xkb/ 1767 /etc/X11/xkb/rules/ 1760 fvwm 1792 get-edid 1738<br />

gnomecc 1807 gnome-session 1807 gnome-wm 1807 mcookie 1731 modeline<br />

1757 panel 1808 parse-edid 1738 setxkbmap 1760 startx 1719 1721<br />

system.twmrc 1787 vnc.conf 1820 vncpasswd 1817 vncrc 1825 vncserver<br />

1815 X 1724 1726 xauth 1729 xdm-config 1802 xev 1774 xhost 1732 xinit 1720<br />

xinitrc 1724 xkbcomp 1773 xkbprint 1765 xmodmap 1774 1776 xon 1733<br />

xorg.conf 1710 1711 Xrealvnc 1817 xserverrc 1724 Xsession 1800 1805<br />

Xtightvnc 1817 xvidtune 1756 Xvnc 1817 xvncviewer 1821 $DISPLAY 1726<br />

X è un sistema grafico per gli ambienti Unix, o più precisamente per gli ambienti aderenti<br />

agli standard C ANSI o POSIX. X Window System è stato sviluppato originariamente nei<br />

laboratori del MIT (Massachusetts institute of technology) e in seguito tutti i diritti sono stati<br />

assegnati a un altro ente.<br />

I termini X, X Window e X Window System sono da intendersi come sinonimi dello stesso<br />

sistema grafico, mentre il nome «X Windows» non è corretto.<br />

X Window System è un marchio registrato. Lo sviluppo di X come software libero avviene<br />

attraverso la fondazione X.Org (〈http://www.x.org 〉).<br />

<strong>31.1</strong> <strong>Struttura</strong><br />

Nel sistema X si utilizzano alcuni termini importanti che rappresentano altrettante parti di<br />

questo.<br />

«<br />

• servente X<br />

Il servente X è il programma che gestisce le funzionalità grafiche e le mette a disposizione<br />

degli altri programmi. Per questa ragione, l’elaboratore su cui si fa funzionare il servente


1708 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

X deve essere dotato di video grafico, tastiera e mouse. Il servente grafico fornisce anche<br />

un servizio di rete dal momento che consente l’accesso a programmi in funzione presso<br />

altri elaboratori.<br />

• cliente X<br />

I clienti X sono i programmi che utilizzano questo ambiente grafico comunicando con il<br />

servente X. Un cliente X può essere messo in funzione anche in un elaboratore diverso<br />

da quello sul quale è in funzione un servente X.<br />

• protocollo X<br />

Tra i clienti X e il servente X, intercorre una comunicazione, attraverso un protocollo<br />

prestabilito.<br />

• librerie Xlib<br />

I programmi che utilizzano i servizi del servente X accedono a funzioni di librerie<br />

specifiche che sono conosciute come Xlib.<br />

• gestore di finestre<br />

Un gestore di finestre, ovvero un window manager, è un programma speciale che si<br />

occupa di gestire le finestre delle varie applicazioni. In generale, nell’ambiente X si<br />

tratta di un cliente X.<br />

«<br />

<strong>31.1</strong>.1 Hardware<br />

Dal punto di vista di X, l’hardware è ciò che consente di interagire in questo sistema grafico<br />

(nel senso che il resto non è di sua competenza). Si tratta della tastiera, dello schermo grafico<br />

e del dispositivo di puntamento. In pratica il ruolo di X è quello di controllare tutto questo.<br />

|Figura <strong>31.1</strong>. X è un sistema attraverso il quale, teoricamente, è possibile avere macchine<br />

che fanno girare più di un servente grafico, ognuno in grado di controllare una<br />

stazione grafica (display) che a sua volta utilizza uno o più schermi grafici.


X 1709<br />

All’interno di un elaboratore possono funzionare teoricamente più serventi grafici per controllare<br />

altrettante stazioni grafiche di lavoro. Inoltre, sempre teoricamente, una stazione grafica<br />

può utilizzare più di uno schermo grafico contemporaneamente.<br />

Nel gergo di X la stazione grafica è il display, che viene identificato da un numero a partire<br />

da zero, nella forma ‘:n’. Se una stazione grafica è dotata di più di uno schermo, quando<br />

si deve fare riferimento a uno di questi occorre aggiungere all’indicazione del numero della<br />

stazione grafica quello dello schermo. Anche in questo caso, il primo corrisponde a zero. La<br />

forma diventa quindi ‘:n.m’, dove n è la stazione grafica e m è lo schermo. La figura <strong>31.1</strong><br />

dovrebbe chiarire il meccanismo. Il valore predefinito di stazione grafica e schermo è zero,<br />

per cui, quando non si specificano queste informazioni, si intende implicitamente lo schermo<br />

‘:0.0’.<br />

I dispositivi di puntamento, solitamente il mouse, possono avere un numero variabile di tasti;<br />

teoricamente si va da un minimo di uno a un massimo di cinque. Nell’ambiente X, questi tasti<br />

si distinguono attraverso un numero: 1, 2, 3, 4 e 5. Il tasto sinistro è il primo e da lì si continua<br />

la numerazione. Quando si utilizza un mouse a tre tasti, il tasto numero due è quello centrale.<br />

Il vero problema è che X utilizza normalmente tre tasti: nei mouse a due tasti, il tasto destro<br />

svolge la funzione del tasto numero tre e solitamente il tasto centrale (cioè il numero due) si<br />

ottiene con l’uso contemporaneo dei due tasti esistenti.<br />

|Figura 31.2. La numerazione dei tasti dei mouse che ne hanno solo due è particolare.<br />

Questo problema viene ripreso nella descrizione della configurazione di X e lì dovrebbe<br />

risultare più chiaro.<br />

<strong>31.1</strong>.2 Cliente-servente<br />

Il programma che si occupa di gestire la stazione grafica è il servente grafico. È un servente<br />

perché offre solo dei servizi e non interagisce direttamente con l’utente. Sono i programmi<br />

clienti a interagire con l’utente. Questi richiedono al servente di poter utilizzare uno schermo<br />

determinato e, attraverso la stazione grafica corrispondente, sono in grado di ricevere l’input<br />

della tastiera e del dispositivo di puntamento.<br />

Tra i programmi clienti, quello che riveste un ruolo fondamentale è il gestore di finestre, attraverso<br />

il quale si rendono disponibili quei meccanismi con cui si può passare facilmente da un<br />

programma all’altro e le finestre possono essere ridimensionate o ridotte a icona.<br />

«


1710 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

X è trasparente nei confronti della rete. Un programma cliente può utilizzare i servizi di un<br />

servente remoto, interagendo con la stazione grafica di quel servente. Questo tipo di utilizzo<br />

richiede comunque una forma di autorizzazione o autenticazione, per motivi di sicurezza.<br />

Quando si vuole identificare uno schermo particolare di un certo elaboratore nella rete,<br />

si antepone alle coordinate (già viste nella sezione precedente) il nome o l’indirizzo di<br />

quell’elaboratore: ‘nodo:n.m’. La figura 31.3 mostra un esempio di questo tipo di utilizzo.<br />

|Figura 31.3. Il servente grafico può concedere l’utilizzo della stazione grafica anche a<br />

programmi in esecuzione su elaboratori remoti.<br />

Un programma cliente può connettersi con un servente X, sia locale, sia remoto. Per una<br />

connessione remota occorre stabilire un collegamento. Il servente X resta normalmente in<br />

ascolto sulla porta 6000 + n, dove n rappresenta il numero della stazione grafica, ovvero del<br />

servente X.<br />

Nel caso di una stazione grafica con indirizzo ‘:1’, la porta su cui dovrebbe trovarsi in ascolto<br />

il servente relativo è la numero 6001.<br />

Il concetto di cliente-servente per ciò che riguarda la rete viene ripreso nei capitoli dedicati<br />

proprio alle connessioni in rete (capitolo 38 e successivi).<br />

Infine, è bene tenere in considerazione il fatto che le librerie specifiche per X (Xlib), sono<br />

indispensabili sia per i serventi, sia per i clienti.<br />

31.2 X.Org<br />

«<br />

La versione libera di X è costituita da X.Org 1 e in precedenza da XFree86. 2 In generale si<br />

tratta di un servente X per i sistemi operativi Unix, eventualmente in più versioni alternative,<br />

specifiche per un gruppo particolare di adattatori grafici.<br />

La struttura prevista per il file system di un sistema GNU e di altri sistemi Unix (sezione<br />

21.12) colloca tutti i file statici di X (binari, documentazione, librerie, ecc.) al di sotto di<br />

‘/usr/X11R6/’. Tuttavia, per ragioni di compatibilità, di norma vengono aggiunti alcuni<br />

collegamenti simbolici:<br />

• ‘/usr/bin/X11’ che punta a ‘/usr/X11R6/bin’,<br />

• ‘/usr/lib/X11’ che punta a ‘/usr/X11R6/lib/X11’,


X 1711<br />

• ‘/usr/include/X11’ che punta a ‘/usr/X11R6/include/X11’.<br />

X utilizza un file di configurazione, che può essere collocato in varie posizioni, ma generalmente<br />

si trova nella directory ‘/etc/X11/’. Il file di configurazione può avere nomi diversi;<br />

tra le tante possibilità, meritano attenzione ‘xorg.conf’, ‘XF86Config-4’ e ‘XF86Config’:<br />

‘xorg.conf’<br />

File di configurazione previsto per X.Org.<br />

‘XF86Config-4’ File di configurazione previsto per XFree86 versione 4.*.<br />

‘XF86Config’<br />

File di configurazione normale per XFree86.<br />

In origine era disponibile lo script ‘xf86config’, ovvero ‘xorgconfig’, attualmente non<br />

più utile e rimpiazzato, eventualmente, dal comando ‘X -configure’, oppure da uno script<br />

specifico per la propria distribuzione GNU/Linux.<br />

31.3 Lettura del file di configurazione<br />

La lettura del file di configurazione di X (‘/etc/X11/XF86Config’ o ‘/etc/X11/<br />

xorg.conf’) può dare molte informazioni utili sull’organizzazione del sistema grafico. In particolare,<br />

i programmi utilizzati per generarlo sono realizzati in modo da inserire molti commenti,<br />

tra cui anche esempi di direttive, così da agevolare chi volesse modificarlo successivamente<br />

a mano.<br />

Il simbolo ‘#’ serve a iniziare un commento che termina alla fine della riga, inoltre le righe<br />

bianche e quelle vuote vengono ignorate.<br />

A titolo di esempio viene mostrato un file di configurazione generato attraverso ‘xorgconfig’,<br />

come descritto nella sezione ??xfree86 configurazione essenziale??, ma semplificato.<br />

«<br />

|Section "Module"<br />

| Load "dbe" # Double buffer extension<br />

| Load "type1"<br />

| Load "freetype"<br />

|EndSection<br />

|<br />

|Section "Files"<br />

| RgbPath "/etc/X11/rgb"<br />

| FontPath "/usr/lib/X11/fonts/misc/"<br />

| FontPath "/usr/lib/X11/fonts/75dpi/:unscaled"<br />

| FontPath "/usr/lib/X11/fonts/100dpi/:unscaled"<br />

| FontPath "/usr/lib/X11/fonts/Type1/"<br />

| FontPath "/usr/lib/X11/fonts/Speedo/"<br />

| FontPath "/usr/lib/X11/fonts/75dpi/"<br />

| FontPath "/usr/lib/X11/fonts/100dpi/"<br />

| FontPath "/usr/lib/X11/fonts/truetype/"<br />

|EndSection<br />

|<br />

|Section "ServerFlags"<br />

| # Option "DontZap"<br />

| # Option "Dont Zoom"<br />

|EndSection


1712 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

| Option "AutoRepeat" "500 30"<br />

| Option "LeftAlt" "Meta"<br />

| Option "RightAlt" "ModeShift"<br />

| Option "XkbRules" "xorg"<br />

| Option "XkbModel" "pc104"<br />

| Option "XkbLayout" "it"<br />

|EndSection<br />

|<br />

|Section "InputDevice"<br />

| Identifier "Mouse1"<br />

| Driver "mouse"<br />

| Option "Protocol" "PS/2"<br />

| Option "Device" "/dev/mouse"<br />

| Option "Emulate3Buttons" "true"<br />

| # Option "Emulate3Timeout" "50"<br />

|EndSection<br />

|<br />

|Section "Monitor"<br />

| Identifier "Monitor1"<br />

| HorizSync 30-50<br />

| VertRefresh 50-90<br />

|EndSection<br />

|<br />

|Section "Device"<br />

| Identifier "Standard VESA"<br />

| Driver "vesa"<br />

|EndSection<br />

|<br />

|Section "Screen"<br />

| Identifier "Screen 1"<br />

| Device "Standard VESA"<br />

| Monitor "Monitor1"<br />

| DefaultDepth 16<br />

|<br />

| Subsection "Display"<br />

| Depth 8<br />

| Modes "1024x768" "800x600" "640x480"<br />

| ViewPort 0 0<br />

| EndSubsection<br />

| Subsection "Display"<br />

| Depth 16<br />

| Modes "1024x768" "800x600" "640x480"<br />

| ViewPort 0 0


X 1713<br />

| EndSubsection<br />

| Subsection "Display"<br />

| Depth 24<br />

| Modes "1024x768" "800x600" "640x480"<br />

| ViewPort 0 0<br />

| EndSubsection<br />

|EndSection<br />

|<br />

|Section "ServerLayout"<br />

| Identifier "Simple Layout"<br />

| Screen "Screen 1"<br />

| InputDevice "Mouse1" "CorePointer"<br />

| InputDevice "Keyboard1" "CoreKeyboard"<br />

|EndSection<br />

Segue la descrizione superficiale di alcune sezioni che possono comporre questo file di configurazione.<br />

Per una descrizione un po’ più dettagliata si può consultare la pagina di manuale<br />

XF86Config(5).<br />

31.3.1 Sezione «Files»<br />

«<br />

La sezione ‘Files’ riguarda la posizione dei file utilizzati dal servente.<br />

|RgbPath "/etc/X11/rgb"<br />

La direttiva ‘RgbPath’ permette di indicare il file contenente l’elenco dei nomi dei colori<br />

associato alla codifica RGB relativa.<br />

|FontPath "/usr/lib/X11/fonts/misc/"<br />

|FontPath "/usr/lib/X11/fonts/75dpi/:unscaled"<br />

|FontPath "/usr/lib/X11/fonts/100dpi/:unscaled"<br />

|FontPath "/usr/lib/X11/fonts/Type1/"<br />

|FontPath "/usr/lib/X11/fonts/Speedo/"<br />

|FontPath "/usr/lib/X11/fonts/75dpi/"<br />

|FontPath "/usr/lib/X11/fonts/100dpi/"<br />

|FontPath "/usr/lib/X11/fonts/truetype/"<br />

Con le direttive ‘FontPath’ si indicano le directory contenenti i file dei tipi di carattere<br />

utilizzabili.<br />

31.3.2 Sezione «ServerFlags»<br />

La sezione ‘ServerFlags’ permette di controllare alcune opzioni abbastanza importanti, in<br />

particolare quelle seguenti.<br />

«<br />

|Option "DontZap"<br />

La direttiva ‘DontZap’, se presente (di solito c’è, ma commentata), toglie la possibilità di<br />

concludere l’attività del servente attraverso la combinazione di tasti [ Ctrl Alt Backspace ].


1714 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Option "Dont Zoom"<br />

La direttiva ‘DontZoom’, se presente (di solito c’è, ma commentata), toglie la possibilità di<br />

cambiare la modalità grafica attraverso l’uso delle combinazioni [ Ctrl Alt + ] («control», «alt»,<br />

«+ del tastierino numerico») e [ Ctrl Alt - ] («control», «alt», «− del tastierino numerico»).<br />

31.3.3 Sezione «InputDevice»<br />

«<br />

La sezione ‘InputDevice’ può riguardare la configurazione della tastiera, oppure quella del<br />

dispositivo di puntamento.<br />

Per quanto riguarda la tastiera, conviene non intervenire manualmente all’interno di questa sezione,<br />

in quanto il programma utilizzato per generare il file di configurazione dovrebbe essere<br />

in grado di inserire tutte le direttive necessarie.<br />

Una sezione ‘InputDevice’ riferita a un mouse, contiene in particolare l’indicazione del<br />

protocollo e del file di dispositivo a cui si fa riferimento:<br />

|Option "Protocol" "PS/2"<br />

|Option "Device" "/dev/mouse"<br />

Nel caso di mouse a due tasti, oppure a tre, quando quello centrale corrisponde in realtà alla<br />

pressione simultanea dei due tasti, si aggiunge in particolare l’opzione corrispondente:<br />

|Option "Emulate3Buttons" "true"<br />

Quando si utilizza un mouse bus, come per esempio il tipo PS/2, il file di dispositivo corrispondente<br />

non consente l’accesso multiplo da parte dei processi elaborativi. Di conseguenza<br />

si possono creare dei problemi tra X e demoni come ‘gpm’. Il problema si risolve proprio<br />

utilizzando il demone ‘gpm’ con l’opzione ‘-R’ e facendo poi in modo che X utilizzi il<br />

dispositivo ‘/dev/gpmdata’.<br />

Quello che si vede di seguito è la configurazione alternativa di una sezione ‘InputDevice’<br />

necessaria allo scopo di utilizzare il dispositivo ‘/dev/gpmdata’. In questo caso si considera<br />

che il demone ‘gpm’ fornisca le funzionalità del mouse secondo il protocollo ‘IntelliMouse’<br />

(qualunque sia il tipo di mouse utilizzato effettivamente); le dichiarazioni proposte consentono<br />

di utilizzare anche la rotellina (se c’è), e di ottenere la funzione del tasto centrale, anche se<br />

questo non dovesse esserci. Si veda a questo proposito anche quanto descritto nella sezione<br />

15.10.<br />

|Section "InputDevice"<br />

| Identifier "Mouse1"<br />

| Driver "mouse"<br />

| Option "Protocol" "IntelliMouse"<br />

| Option "Device" "/dev/gpmdata"<br />

| Option "Buttons" "5"<br />

| Option "ZAxisMapping" "4 5"<br />

| Option "Emulate3Buttons" "true"<br />

|EndSection


X 1715<br />

31.3.4 Sezione «Monitor»<br />

«<br />

La sezione ‘Monitor’ riguarda la configurazione del monitor, inteso come unità di visualizzazione<br />

dell’immagine, attraverso la sua scansione. Il file di configurazione può contenere<br />

diverse sezioni ‘Monitor’, distinte in base alla direttiva ‘Identifier’, come nell’esempio<br />

seguente:<br />

|Identifier<br />

"Monitor generico"<br />

Il nome utilizzato per identificare il monitor, serve per potervi fare riferimento all’interno di<br />

una sezione ‘Screen’.<br />

|HorizSync 31.5, 32.8<br />

La direttiva ‘HorizSync’ permette di definire le frequenze di sincronizzazione orizzontale.<br />

Può trattarsi di: valori discreti, cioè di un elenco di valori separati da una virgola; intervalli,<br />

cioè da due numeri collegati da un trattino; oppure di elenchi misti.<br />

|# HorizSync 30-64 # multisync<br />

|# HorizSync 31.5, 35.2 # multiple fixed sync frequencies<br />

|# HorizSync 15-25, 30-50 # multiple ranges of sync frequencies<br />

I valori indicati si riferiscono a kilohertz (simbolo: «kHz»), cioè migliaia di hertz, in modo<br />

predefinito. 3<br />

|VertRefresh 50-70<br />

La direttiva ‘VertRefresh’ permette di definire le frequenze di sincronizzazione verticale.<br />

Valgono le stesse considerazione fatte per i valori della sincronizzazione orizzontale. Generalmente<br />

si tratta di un intervallo, come appare nell’esempio, inoltre l’unità di misura predefinita<br />

è in hertz.<br />

Queste indicazioni possono essere delicate per il tipo di monitor che si utilizza, per cui non<br />

possono essere indicate troppo alla leggera. Infatti, ci sono situazioni in cui un monitor<br />

spinto a funzionare a frequenze troppo diverse da quelle previste dalla sua scheda tecnica,<br />

può anche risultarne danneggiarlo.<br />

|# 640x400 @ 70 Hz, 31.5 kHz hsync<br />

|Modeline "640x400" 25.175 640 664 760 800 400 409 411 450<br />

|<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 25.175 640 664 760 800 480 491 493 525<br />

Le direttive ‘Modeline’ (solitamente sono più di una nella stessa sezione) permettono di definire<br />

in dettaglio le caratteristiche di un quadro, o frame, cioè di un’immagine secondo il punto<br />

di vista del monitor. Viene definito un nome seguito da una serie di informazioni numeriche<br />

(che sono descritte meglio nella sezione 31.6). Convenzionalmente, il nome viene attribuito in<br />

modo da ricordare la risoluzione che si ottiene con quel tipo di modalità. A quel nome si fa<br />

riferimento attraverso altre direttive nella sezione ‘Screen’.


1716 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Mode "640x480"<br />

| DotClock 25.175<br />

| HTimings 640 664 760 800<br />

| VTimings 480 491 493 525<br />

| # Flags "Interlace"<br />

|EndMode<br />

In alternativa alla direttiva ‘Modeline’, si può utilizzare la direttiva ‘Mode’ che si articola su<br />

più righe e può risultare più leggibile. Qui si mostra la dichiarazione della modalità ‘640x480’<br />

già vista nell’esempio precedente.<br />

I nomi delle dichiarazione di queste diverse modalità di composizione dei quadri, possono<br />

essere usati più volte; quando ciò accade, viene presa in considerazione la prima modalità<br />

corrispondente che risulti valida.<br />

Con X.Org, non è più obbligatorio indicare queste direttive ‘Mode’ o ‘ModeLine’, perché il<br />

servente dispone di un elenco predefinito di queste indicazioni, associate a dei nomi intuitivi,<br />

corrispondente alle specifiche VESA.<br />

«<br />

31.3.5 Sezione «Device»<br />

La sezione ‘Device’ riguarda la configurazione dell’adattatore grafico. Il file di configurazione<br />

può contenere diverse sezioni ‘Device’, distinte attraverso la direttiva ‘Identifier’, come<br />

nell’esempio seguente:<br />

|Identifier<br />

"Standard VESA"<br />

Il nome utilizzato per identificare l’adattatore, serve per potervi fare riferimento all’interno di<br />

una sezione ‘Screen’.<br />

La maggior parte delle indicazioni che riguardano l’adattatore grafico possono essere determinate<br />

automaticamente dal servente grafico, all’avvio. Tuttavia, una volta conosciute, conviene<br />

fissarle nel file di configurazione.<br />

|Clocks 25.2 28.3<br />

La direttiva ‘Clocks’ è molto importante e delicata. Permette di definire esplicitamente l’elenco<br />

di valori di dot-clock dell’adattatore grafico. Si tratta in pratica delle frequenza con cui<br />

possono essere emessi i vari punti che compongono l’immagine. I due valori mostrati nell’esempio,<br />

dovrebbero essere sufficientemente bassi e comuni, da poter risultare compatibili<br />

con la maggior parte degli adattatori grafici VGA. L’unità di misura predefinita è il megahertz<br />

(simbolo: «MHz»), inteso come milioni di hertz.


X 1717<br />

31.3.6 Sezione «Screen»<br />

La sezione ‘Screen’ permette di legare assieme le informazioni sul monitor e sull’adattatore<br />

grafico, aggiungendo qualche indicazione sull’aspetto della superficie grafica. Il file<br />

di configurazione può contenere diverse sezioni ‘Screen’, distinte attraverso la direttiva<br />

‘Identifier’, come nell’esempio seguente:<br />

«<br />

|Identifier "Screen 1"<br />

Le direttive ‘Device’ e ‘Monitor’ permettono di indicare le sezioni che descrivono le<br />

caratteristiche dell’adattatore grafico e del monitor.<br />

|Device<br />

|Monitor<br />

"S3 ViRGE"<br />

"Addonics MON-7C8B"<br />

Inoltre, la direttiva ‘DefaultDepth’, consente di selezionare la sottosezione ‘Display’<br />

predefinita, in base alla scelta della profondità di colori:<br />

|DefaultDepth 24<br />

La sottosezione ‘Display’ serve a definire le modalità di visualizzazione che si possono utilizzare<br />

in corrispondenza di una certa profondità di colori (o di grigi). In pratica, se il tipo<br />

di adattatore grafico e il servente corrispondente permettono di utilizzare profondità di colori<br />

differenti, in base al livello utilizzato e in funzione della memoria presente è possibile ottenere<br />

risoluzioni più o meno dettagliate.<br />

|Subsection "Display"<br />

| Depth 24<br />

| Modes "1024x768" "1280x1024"<br />

| ViewPort 0 0<br />

|EndSubsection<br />

La direttiva ‘Depth’ definisce la profondità di colori espressa in numero di bit. Nell’esempio,<br />

il numero 24 rappresenta la possibilità di gestire circa 16 milioni di colori (o grigi), dal momento<br />

che con 24 bit si possono rappresentare esattamente 16777216 cifre differenti (2 24 =<br />

16777216).<br />

|Depth 24<br />

La direttiva ‘Modes’ elenca le modalità utilizzabili con la profondità di colori definita nella<br />

sottosezione. Queste modalità sono indicate per nome, in base a quanto dichiarato nella sezione<br />

‘Monitor’, attraverso le direttive ‘Modeline’ o ‘Mode’, oppure in base alle definizioni<br />

VESA predefinite.<br />

|Modes<br />

"1024x768" "1280x1024"<br />

La disponibilità di più modalità che fanno riferimento a risoluzioni differenti, fa sì che si definisca<br />

implicitamente una dimensione virtuale della superficie grafica, pari alla risoluzione<br />

massima. Questa dimensione deve essere tale da non superare la richiesta di memoria video,<br />

comunque deve essere maggiore o uguale alla massima dimensione stabilita con la direttiva<br />

‘Modes’. Quando si utilizza una superficie grafica virtuale più grande di quella effettiva che<br />

appare sullo schermo, può essere utile stabilire quale sia la posizione iniziale, all’avvio del ser-


1718 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

vente. Ciò si ottiene con la direttiva ‘ViewPoint’, dove solitamente si utilizzano le coordinate<br />

0 0, a indicare l’angolo superiore sinistro.<br />

|ViewPort 0 0<br />

«<br />

31.4 Accesso a un servente di caratteri<br />

È già stata descritta a grandi linee la sezione ‘Files’ della configurazione di X, in cui si<br />

trovano in particolare le direttive ‘FontPath’, per dichiarare la collocazione dei file contenenti<br />

le informazioni sui caratteri tipografici da visualizzare.<br />

Secondo questo tipo di impostazione, ogni volta che si aggiunge una directory contenente altri<br />

caratteri, occorre modificare la configurazione di X per includere anche quella tra i percorsi<br />

previsti. Per semplificare l’accesso ai caratteri esistono dei serventi di caratteri, con i quali<br />

X può comunicare attraverso la rete, oppure solo dei socket di dominio Unix. In altri termini,<br />

un servente di caratteri può offrire il suo servizio attraverso la rete, per più di un elaboratore,<br />

oppure anche solo localmente, per mezzo di file socket.<br />

Esistono diversi programmi che possono svolgere il compito di un servente di caratteri (per<br />

esempio Xfs, 4 X-TT 5 e Xfstt 6 ); inoltre, spesso l’installazione di un servente del genere diventa<br />

quasi obbligatoria per via delle dipendenze stabilite da chi organizza la propria distribuzione<br />

GNU. Senza entrare nell’analisi del funzionamento di un servente di caratteri, basti sapere che<br />

di solito questi sono in funzione in attesa di connessioni sulla porta 7100 TCP e se usano un<br />

socket di dominio Unix, dovrebbe corrispondere al file ‘/tmp/.font-unix/fs7100’. Se poi<br />

si gestiscono più serventi di caratteri nello stesso elaboratore, il numero della porta potrebbe<br />

essere un valore leggermente più alto, come 7101 o 7110, a cui si associa di conseguenza il<br />

file ‘/tmp/.font-unix/fs7101’ o ‘/tmp/.font-unix/fs7110’.<br />

In presenza di uno o più serventi di caratteri, si deve intervenire nella configurazione di X per<br />

dichiarare come questi possono essere raggiunti. In caso di socket di dominio Unix, si usano<br />

direttive di questo tipo:<br />

|<br />

|FontPath "unix/:71nn"<br />

|<br />

In caso di connessioni attraverso la rete, si può provare una di queste due direttive:<br />

|<br />

|FontPath "inet/nodo:71nn"<br />

|<br />

|<br />

|FontPath "tcp/nodo:71nn"<br />

|<br />

Naturalmente, nn va sostituito con il valore esatto, in base alla configurazione del servente di<br />

caratteri a cui si vuole accedere.


X 1719<br />

31.5 Funzionamento e accesso<br />

Con le distribuzioni GNU normali, dopo la configurazione del servente X, dovrebbe essere<br />

sufficiente avviare lo script ‘startx’, senza argomenti, per vedere funzionare questo ambiente<br />

grafico.<br />

«<br />

$ startx [ Invio ]<br />

Avendo avviato il servente X, vale la pena di provare a cambiare la risoluzione di visualizzazione<br />

attraverso la combinazione [ Ctrl Alt + ] («control», «alt», «+ del tastierino numerico») e<br />

[ Ctrl Alt - ] («control», «alt», «− del tastierino numerico»).<br />

Per passare dal servente X a una console virtuale, è sufficiente utilizzare la combinazione<br />

[ Ctrl Alt F1 ], oppure [ Ctrl Alt F2 ],... invece del solito [ Alt Fn ] che non potrebbe funzionare. Il servente<br />

X occupa normalmente la posizione della prima console virtuale libera, che solitamente<br />

è la settima; per cui si raggiunge con la combinazione [ Ctrl Alt F7 ].<br />

Per concludere l’esecuzione del servente X ci sono due modi:<br />

• interrompere il servente attraverso la combinazione [ Ctrl Alt Backspace ];<br />

• concludere l’esecuzione del gestore di finestre o di altro programma analogo.<br />

L’interruzione dell’esecuzione del servente X con la combinazione [ Ctrl Alt Backspace ] è il modo<br />

più brutale, ma può essere opportuno quando non si vede più nulla, specie quando si è avviato<br />

X dopo una configurazione sbagliata.<br />

31.5.1 Procedura di avvio<br />

Nelle sezioni precedenti si è accennato al modo con cui è possibile avviare e concludere il funzionamento<br />

del servente X. Dovrebbe essere chiaro che per avviare X si utilizza normalmente<br />

lo script ‘startx’ (anche se non è l’unico modo possibile), dal quale si sviluppa una struttura<br />

piuttosto articolata che è opportuno conoscere.<br />

Quando sono disponibili diversi serventi grafici distinti a seconda del tipo di adattatore grafico,<br />

si crea un collegamento simbolico in modo da poter avviare il servente giusto utilizzando<br />

semplicemente il nome ‘X’. In pratica, dovrebbe essere il programma di configurazione stesso<br />

che provvede a sistemare questa cosa.<br />

Se si avvia semplicemente il servente, utilizzando il nome ‘X’ oppure quello specifico di un<br />

adattatore grafico particolare, si ottiene solo una superficie grafica su cui fare scorrere il mouse.<br />

Per poter fare qualcosa, occorre almeno avere in funzione un programma che consenta di<br />

avviarne altri. Occorrono cioè dei clienti. 7<br />

Per risolvere questo problema si deve utilizzare il programma ‘xinit’, attraverso il quale<br />

si possono definire alcuni clienti di partenza (per esempio un gestore di finestre), il tipo di<br />

servente da utilizzare e le sue opzioni eventuali.<br />

«


1720 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

«<br />

31.5.1.1 Utilizzo di «xinit»<br />

Il programma ‘xinit’ viene usato per avviare il servente X e un primo programma cliente.<br />

Quando questo programma cliente termina la sua esecuzione, ‘xinit’ invia un segnale di<br />

interruzione al servente X e quindi, a sua volta, termina la sua esecuzione.<br />

|<br />

|xinit [[cliente] opzioni] [ -- [servente] [stazione_grafica] opzioni] |<br />

Se non viene indicato un programma cliente specifico, ‘xinit’ tenta di avviare il file ‘~/<br />

.xinitrc’, che di solito dovrebbe corrispondere a uno script; se questo manca, tenta di<br />

avviare il programma ‘xterm’ nel modo seguente:<br />

|<br />

|xterm -geometry +1+1 -n -login -display :0<br />

|<br />

Se non viene indicato un programma servente specifico, ‘xinit’ tenta di avviare il file ‘~/<br />

.xserverrc’; se questo manca, tenta di avviare il programma ‘X’ nel modo seguente:<br />

|<br />

|X :0<br />

|<br />

Quando si vuole fare in modo che il servente X venga avviato inizialmente con un gruppetto di<br />

programmi clienti, si fa in modo che ‘xinit’ utilizzi per questo uno script. Di solito si tratta<br />

proprio del file ‘~/.xinitrc’, quello che verrebbe avviato in modo predefinito. All’interno di<br />

questo script, i programmi dovrebbero essere avviati sullo sfondo, con la possibile eccezione<br />

di quelli che terminano immediatamente la loro funzione. L’ultimo di questi programmi deve<br />

funzionare in primo piano (foreground), in modo che la sua conclusione corrisponda con quella<br />

dello script stesso.<br />

Di solito, ‘xinit’ viene avviato senza l’indicazione esplicita di cliente e servente. Se si intende<br />

utilizzare questa possibilità, i nomi di cliente e servente devono comprendere il percorso<br />

per raggiungerli: devono cioè iniziare con un punto (‘.’) oppure con una barra obliqua (‘/’).<br />

Diversamente non verrebbero riconosciuti come tali, ma come opzioni per il programma cliente<br />

o per il programma servente, a seconda che si trovino a sinistra o a destra dei due trattini di<br />

separazione (‘--’). Segue la descrizione di alcuni esempi.<br />

• $ xinit & [ Invio ]<br />

Avvia ‘xinit’ con i valori predefiniti (sullo sfondo). In questo modo ‘xinit’ tenta di<br />

avviare il servente X utilizzando il programma o lo script ‘~/.xinitrc’ come cliente,<br />

oppure il programma ‘xterm’ in sua mancanza.<br />

• $ xinit -- /usr/bin/X11/X & [ Invio ]<br />

Si richiede a ‘xinit’ di avviare il servente ‘/usr/bin/X11/X’ (probabilmente è un<br />

programma con privilegi speciali che a sua volta avvia ‘/usr/bin/X11/Xorg’). Per<br />

quanto riguarda il cliente, si utilizzano i valori predefiniti.<br />

• $ xinit -- -depth 16 [ Invio ]


X 1721<br />

‘xinit’ avvia il servente X predefinito, con l’argomento ‘-depth 16’, attraverso cui<br />

si richiede una profondità di colori di 16 bit/pixel (2 16 = 65535). Per quanto riguarda il<br />

cliente, si utilizzano i valori predefiniti.<br />

Il modo migliore per verificare cosa accade quando si avvia ‘xinit’ è quello di verificare<br />

l’interdipendenza tra i processi attraverso ‘pstree’. Supponendo di avere avviato ‘xinit’<br />

senza argomenti si dovrebbe ottenere uno schema simile a quello seguente:<br />

In questo caso si può osservare che ‘xinit’ avvia il terminale grafico ‘xterm’, che a sua volta<br />

avvia una shell.<br />

31.5.1.2 Utilizzo di «startx»<br />

«<br />

Nella sezione precedente si è visto che è possibile avviare il servente X attraverso ‘xinit’.<br />

Questo modo potrebbe però risultare scomodo quando si ha la necessità di utilizzare sistematicamente<br />

determinati attributi. Il sistema grafico dovrebbe essere avviato attraverso lo script<br />

‘startx’, che è predisposto per ‘xinit’ nel modo più adatto alle esigenze particolari del<br />

proprio sistema.<br />

Di solito le distribuzioni GNU forniscono uno script adattato alla loro impostazione, oppure,<br />

lo stesso programma di configurazione di X potrebbe predisporre da solo questo file. In ogni<br />

caso, l’amministratore del sistema dovrebbe rivedere questo script ed eventualmente ritoccarlo.<br />

La sintassi di ‘startx’, quando si tratta di una versione aderente all’impostazione originale di<br />

X, è praticamente uguale a quella di ‘xinit’.<br />

|<br />

|startx [[cliente] opzioni] [ -- [servente] opzioni] |<br />

Lo script ‘startx’ offre però la possibilità di predisporre delle opzioni predefinite per cliente<br />

e servente.<br />

|#!/bin/bash<br />

|#<br />

|# Site administrators are STRONGLY urged to write nicer versions.<br />

|#<br />

|userclientrc=$HOME/.xinitrc<br />

|sysclientrc=/etc/X11/xinit/xinitrc<br />

|userserverrc=$HOME/.xserverrc<br />

|sysserverrc=/etc/X11/xinit/xserverrc<br />

|defaultclient=xterm<br />

|defaultserver=/usr/bin/X<br />

|defaultclientargs=""<br />

|defaultserverargs=""<br />

|defaultdisplay=":0"<br />

|clientargs=""<br />

|serverargs=""<br />

|<br />

|enable_xauth=1<br />

|


1722 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

L’esempio mostra come può apparire la parte iniziale di uno script ‘startx’. Sarebbe sufficiente<br />

modificare proprio le prime righe per definire delle opzioni predefinite, attribuendo un<br />

valore alle variabili ‘clientargs’ e ‘serverargs’. La prima si riferisce alle opzioni per il<br />

cliente, la seconda per quelle del servente.<br />

Per esempio, volendo avviare il servente, attraverso ‘startx’, con una risoluzione di<br />

16 bit/pixel, basterebbe modificare le prime righe come nell’esempio seguente, in modo da<br />

fornire al servente l’opzione ‘-depth 16’.<br />

|userclientrc=$HOME/.xinitrc<br />

|sysclientrc=/etc/X11/xinit/xinitrc<br />

|userserverrc=$HOME/.xserverrc<br />

|sysserverrc=/etc/X11/xinit/xserverrc<br />

|defaultclient=xterm<br />

|defaultserver=/usr/bin/X<br />

|defaultclientargs=""<br />

|defaultserverargs=""<br />

|defaultdisplay=":0"<br />

|clientargs=""<br />

|serverargs="-depth 16"<br />

Tuttavia, si scorge facilmente la possibilità di usare dei file di configurazione generali per tutto<br />

il sistema:<br />

|sysclientrc=/etc/X11/xinit/xinitrc<br />

|sysserverrc=/etc/X11/xinit/xserverrc<br />

Pertanto, la possibilità di modificare direttamente lo script è da considerare solo come ultima<br />

risorsa.<br />

Se si vuole leggere il contenuto dello script ‘start’, ecco in breve la descrizione delle varie<br />

fasi in esso contenute.<br />

1. Vengono definite delle variabili per le impostazioni predefinite.<br />

2. Si determina quale script utilizzare per l’avvio dei programmi clienti e quale per l’avvio<br />

del servente.<br />

3. Nel ciclo ‘while’, vengono scanditi gli eventuali argomenti utilizzati per avviare<br />

‘startx’; se ne vengono trovati, questi prevalgono su quelli predefiniti.<br />

4. Se ci sono argomenti vengono utilizzati, altrimenti si fa riferimento al contenuto dei file<br />

di configurazione.<br />

5. Se non è definita la variabile di ambiente XAUTHORITY, questa viene creata<br />

inserendovi il contenuto del file ‘~/.Xauthority’.<br />

6. Definisce l’autorizzazione all’accesso alla stazione grafica (display) attraverso una<br />

stringa generata in modo casuale, con il programma ‘mcookie’.<br />

7. Avvia ‘xinit’ con gli argomenti determinati in base all’elaborazione precedente.<br />

8. Al termine del funzionamento di ‘xinit’, elimina l’autorizzazione concessa<br />

precedentemente.


X 1723<br />

9. Infine, viene liberata la memoria usata per l’utilizzo della console virtuale in cui prima si<br />

collocava il sistema grafico.<br />

Da quanto visto finora, si può intuire l’importanza dello script ‘~/.xinitrc’. È il mezzo<br />

attraverso cui avviare più programmi clienti, ma non solo: esistono programmi che hanno lo<br />

scopo di configurare alcune impostazioni del servente X e questo è l’unico posto comodo per<br />

metterli in esecuzione in modo automatico. Un esempio di questi programmi è ‘xset’.<br />

Supponendo di avere avviato ‘startx’ senza argomenti, si dovrebbe ottenere uno schema<br />

simile a quello seguente:<br />

Come si può osservare, rispetto allo stesso esempio visto nella sezione precedente, si ha<br />

‘startx’ che avvia ‘xinit’, il quale poi provvede al resto.<br />

31.5.1.3 Script «~/.xinitrc»<br />

Questo script è quello predefinito per l’avvio dei primi programmi clienti di un servente X<br />

avviato attraverso il programma ‘xinit’.<br />

«<br />

Per preparare il proprio script personalizzato si può partire da quello predefinito della distribuzione<br />

GNU che dovrebbe trovarsi all’interno di ‘/usr/lib/X11/xinit/’ (oppure ‘/etc/<br />

X11/xinit/’). Basta copiarlo nella propria directory personale e cambiargli nome facendolo<br />

diventare ‘~/.xinitrc’.<br />

La preparazione di questo script è molto importante, se non altro perché permette di definire il<br />

tipo di gestore di finestre che si vuole utilizzare.<br />

Un tempo, il file predefinito era piuttosto complesso, includendo la procedura di autorizzazione<br />

all’accesso per la stazione grafica. Recentemente le cose sono cambiate e il problema di questa<br />

autorizzazione è stato spostato nello script ‘startx’. Pertanto, se verso la fine del file si<br />

incontra un commento del tipo ‘# start some nice programs’, si possono aggiungere<br />

dei comandi solo dopo quel punto; diversamente, se il file non contiene nulla di particolare,<br />

lo si può semplicemente scrivere da zero. L’esempio seguente si riferisce a un’impostazione<br />

recente, in cui il file ‘~/.xinitrc’ può limitarsi a contenere solo ciò che serve direttamente<br />

all’utente finale:<br />

|#!/bin/sh<br />

|xsetroot -solid SteelBlue<br />

|exec twm<br />

Il programma ‘xsetroot’ definisce lo sfondo, in questo caso solo un colore, quindi termina<br />

immediatamente l’esecuzione. Il programma ‘twm’ è il gestore di finestre (window manager)<br />

da avviare; in particolare si usa il comando ‘exec’ allo scopo di rimpiazzare la shell. Eventualmente,<br />

prima di avviare il gestore di finestre si possono indicare altri programmi che si<br />

vuole siano già pronti in esecuzione quando si avvia il servente. Per esempio, volendo avviare<br />

‘xclock’ basterebbe modificare le ultime righe come segue:<br />

|# start some nice programs<br />

|xsetroot -solid SteelBlue<br />

|xclock -geometry +0+0 &<br />

|exec twm


1724 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

In questo caso, ‘xclock’ viene avviato sullo sfondo perché altrimenti, a differenza di<br />

‘xsetroot’, rimarrebbe in funzione fino al ricevimento di un segnale di interruzione,<br />

impedendo così l’avvio del gestore di finestre fino al termine del suo funzionamento. 8<br />

Si deve ricordare che si tratta di uno script, pertanto occorre che gli siano attribuiti i permessi<br />

necessari di esecuzione.<br />

31.5.1.4 Configurazione globale e sequenza di script<br />

«<br />

Quando si vuole fare in modo che si possa mettere in funzione il sistema grafico X senza<br />

costringere gli utenti a predisporre la loro personalizzazione tramite il file ‘~/.xinitrc’, si<br />

deve essere in grado di risalire alla configurazione generale. In questo senso, ogni distribuzione<br />

GNU potrebbe avere una propria politica e questo rischia di complicare le cose. Qui viene<br />

proposta una situazione, ma in pratica ognuno deve rifare una propria ricerca.<br />

Si parte dallo script ‘startx’ per determinare la collocazione dei file di configurazione<br />

predefiniti:<br />

|userclientrc=$HOME/.xinitrc<br />

|userserverrc=$HOME/.xserverrc<br />

|sysclientrc=/usr/lib/X11/xinit/xinitrc<br />

|sysserverrc=/usr/lib/X11/xinit/xserverrc<br />

|defaultclient=/usr/bin/X11/xterm<br />

|defaultserver=/usr/bin/X11/X<br />

In questo caso, si intende intuitivamente che:<br />

• lo script da usare per avviare i programmi clienti, secondo le impostazioni degli utenti,<br />

è ‘~/.xinitrc’, mentre quello che stabilisce quale sia il programma servente è ‘~/<br />

.xserverrc’;<br />

• in mancanza degli script degli utenti, si usano ‘/usr/lib/X11/xinit/xinitrc’ e<br />

‘/usr/lib/X11/xinit/xserverrc’ rispettivamente;<br />

• in mancanza anche di questi file, si avvia semplicemente il programma ‘xterm’ come<br />

cliente e il programma ‘X’ come servente.<br />

Tuttavia, dal momento che gli script ‘/usr/lib/X11/xinit/xinitrc’ e ‘/usr/lib/X11/<br />

xinit/xserverrc’ servono in pratica alla configurazione del sistema grafico, è normale che<br />

la loro collocazione reale sia invece nella directory ‘/etc/X11/xinit/’, dove i nomi di origine<br />

corrispondono soltanto a dei collegamenti simbolici. Nello stesso modo, il file ‘/usr/<br />

bin/X11/X’ che rappresenta il servente predefinito, dovrebbe essere un programma che si<br />

limita ad avviare a sua volta il file ‘/etc/X11/X’, che a sua volta dovrebbe essere un altro<br />

collegamento simbolico che punta all’eseguibile corretto (di solito ‘/usr/bin/X11/Xorg’).<br />

Giunti a questo punto conviene dare un’occhiata ai file ‘/usr/lib/X11/xinit/xinitrc’<br />

e ‘/usr/lib/X11/xinit/xserverrc’, ovvero a ‘/etc/X11/xinit/xinitrc’ e ‘/etc/<br />

X11/xinit/xserverrc’. Il file ‘xinitrc’ potrebbe presentarsi così:


X 1725<br />

|#!/bin/sh<br />

|# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $<br />

|<br />

|# /etc/X11/xinit/xinitrc<br />

|#<br />

|# global xinitrc file, used by all X sessions started by xinit (startx)<br />

|<br />

|# invoke global X session script<br />

|. /etc/X11/Xsession<br />

In questo caso, si vede che viene letto il contenuto del file ‘/etc/X11/Xsession’ e trattato<br />

come una prosecuzione dello script stesso. Attraverso questo script ulteriore, si fanno poi<br />

una serie di altre operazioni, con cui si configura in pratica ciò che viene così definito come<br />

sessione.<br />

Il sistema grafico X può essere usato senza doversi prendere cura della configurazione della<br />

sessione. In pratica, si ottiene questo usando il file ‘~/.xinitrc’ personalizzato, perché in<br />

tal modo si esclude l’uso dello script ‘xinitrc’ globale, senza il quale non si attiva lo script<br />

‘Xsession’. Tuttavia, se si vogliono usare convenientemente quelli che sono definiti come<br />

gestori di sessione (per esempio Gnome o KDE, che si collocano al di sopra dei comuni<br />

gestori di finestre), non si può evitare il passaggio per lo script ‘Xsession’.<br />

Senza entrare nel dettaglio dello script ‘Xsession’, vale la pena di annotare che questo, se lo<br />

trova, utilizza anche il file ‘~/.Xsession’, nel caso un utente volesse definire l’utilizzo di un<br />

gestore di sessione diverso da quello predefinito.<br />

Volendo dare un’occhiata allo script ‘xserverrc’, si potrebbe trovare un contenuto simile a<br />

quello seguente:<br />

|#!/bin/sh<br />

|exec /usr/bin/X11/X -dpi 100 -nolisten tcp<br />

In pratica, si avvia il file ‘/usr/bin/X11/X’ (‘/usr/bin/X11/X’), che, come già descritto,<br />

dovrebbe corrispondere in pratica a un collegamento simbolico riferito a ‘/etc/X11/X’, il<br />

quale, a sua volta, dovrebbe essere un collegamento che punta al servente adatto per il proprio<br />

elaboratore.<br />

In questo caso particolare, si vede che, per motivi di sicurezza, sono inibite espressamente<br />

le comunicazioni di rete attraverso il protocollo TCP/IP, con l’opzione ‘-nolisten tcp’.<br />

Pertanto, un utente che volesse abilitarle, dovrebbe scrivere il proprio file ‘~/.xserverrc’,<br />

senza l’uso di questa opzione.


1726 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

«<br />

31.5.2 Privilegi per il funzionamento di un servente grafico<br />

Esiste un particolare importante a proposito del funzionamento di un servente: per poter svolgere<br />

il suo compito deve poter accedere a certe risorse disponendo di privilegi adeguati. Perché<br />

ciò avvenga e sia consentito l’uso da parte di utenti comuni, è necessario che l’eseguibile che<br />

lo rappresenta abbia i permessi necessari a renderlo capace di questo. In pratica deve appartenere<br />

all’utente ‘root’ e avere il bit SUID attivo (SUID-root). Generalmente, il file ‘/usr/<br />

bin/X11/X’ è un programma che ottiene tali privilegi e si occupa di avviare il collegamento<br />

‘/etc/X11/X’. L’esempio seguente mostra i permessi di questo file:<br />

$ ls -l /usr/bin/X11/X [ Invio ]<br />

|-rwsr-sr-x 1 root root 7400 gen 29 18:35 /usr/bin/X11/X<br />

In questo modo, l’utente comune non può avviare direttamente l’eseguibile del servente grafico<br />

che preferisce, ma deve limitarsi a usare ‘X’.<br />

«<br />

31.5.3 Stazioni grafiche virtuali multiple<br />

X può gestire più di una stazione grafica virtuale simultaneamente, con una modalità d’uso<br />

simile a quella delle console virtuali di un sistema GNU/Linux. In pratica, è possibile avviare<br />

diversi serventi X a cui si abbina un numero di stazione grafica differente. Dal momento che<br />

si tratta sempre della stessa macchina fisica, la configurazione non cambia.<br />

L’avvio di più stazioni grafiche virtuali può creare dei problemi con il mouse se il dispositivo<br />

corrispondente non consente la lettura simultanea da parte di più processi. Questo è<br />

sempre lo stesso problema legato ai mouse bus e si può risolvere utilizzando il demone ‘gpm’<br />

con l’opzione ‘-R’, facendo poi in modo che X utilizzi il dispositivo ‘/dev/gpmdata’.<br />

Come è stato descritto nelle sezioni precedenti, il sistema grafico viene avviato generalmente<br />

attraverso lo script ‘startx’, o eventualmente richiamando direttamente il programma<br />

‘xinit’. Quando non si specificano opzioni particolari, si intende voler avviare il servente<br />

X utilizzando la stazione grafica ‘:0’. In un sistema GNU/Linux, ciò si traduce in pratica nell’utilizzo<br />

della posizione corrispondente alla prima console virtuale disponibile, che di solito<br />

è la settima.<br />

Se si vogliono avviare altri serventi X, occorre specificare un diverso numero di stazione grafica,<br />

cosa che serve solo a distinguerle. Così, ogni nuovo servente avviato va a utilizzare una<br />

posizione corrispondente alla prima console virtuale rimasta libera. In pratica, [ Ctrl Alt F7 ] dovrebbe<br />

permettere di raggiungere la prima di queste stazioni grafiche virtuali, [ Ctrl Alt F8 ] la<br />

successiva e così di seguito.<br />

Semplificando quanto mostrato nelle sezioni precedenti, a proposito di ‘xinit’ e di ‘startx’,<br />

si può fare riferimento alla sintassi seguente per avviare un servente X.<br />

|<br />

|xinit -- [stazione_grafica] [opzioni] |<br />

|<br />

|startx -- [stazione_grafica] [opzioni] |


X 1727<br />

Dopo i due trattini di separazione della parte cliente da quella servente, è possibile indicare il<br />

numero della stazione grafica, e subito dopo si possono indicare altre opzioni.<br />

Di solito, si avvia ‘startx’ (e meno frequentemente si avvia direttamente ‘xinit’) senza<br />

indicare alcuna stazione grafica, facendo riferimento implicitamente al numero ‘:0’. Dopo<br />

averne avviato uno con questo numero, non ne possono essere avviati altri con lo stesso, quindi,<br />

se si vogliono gestire più serventi contemporaneamente, occorre definire la stazione grafica.<br />

$ startx -- :1 [ Invio ]<br />

L’esempio mostrato avvia una copia del servente X utilizzando la stazione grafica ‘:1’.<br />

Ci possono essere dei motivi per avviare diversi serventi X simultaneamente; per esempio per<br />

avere due o più sessioni funzionanti in qualità di utenti differenti, oppure per poter confrontare<br />

il funzionamento in presenza di diverse opzioni del servente, come nel caso seguente, dove si<br />

specifica una profondità di colori di 16 bit.<br />

$ startx -- :2 -depth 16 [ Invio ]<br />

È importante tenere a mente che le opzioni del servente, che nell’esempio sono costituite solo<br />

da ‘-depth 16’, vanno poste dopo l’indicazione della stazione grafica.<br />

31.5.4 Definizione dello schermo<br />

Per l’utilizzo normale che si può fare di X non è necessario doversi rendere conto che ogni<br />

programma cliente deve specificare lo schermo su cui vuole apparire. Infatti, viene definita automaticamente<br />

la variabile di ambiente DISPLAY contenente le coordinate dello schermo predefinito.<br />

Modificando eventualmente il contenuto di questa variabile, si cambia l’indicazione<br />

dello schermo predefinito per i programmi che vengono avviati ricevendo quel valore.<br />

Generalmente è possibile informare un programma dello schermo su cui questo deve apparire<br />

attraverso un argomento standard, ‘-display’, descritto nella sezione 32.1.<br />

31.5.5 Accedere allo schermo<br />

Quando si esegue una sessione TELNET, o qualunque altra cosa che permetta di accedere a un<br />

sistema remoto, si avvia una procedura di accesso su un altro elaboratore, utilizzando il proprio<br />

come terminale o console remota. Quando si utilizza un servente X è possibile condividere<br />

lo schermo del proprio monitor. Per farlo occorre autorizzare l’utilizzo del proprio schermo<br />

all’elaboratore remoto. Si osservi il comando seguente:<br />

«<br />

«<br />

tizio@dinkel.brot.dg:~$ xterm -display :0 & [ Invio ]<br />

Si tratta dell’utente ‘tizio’, che dall’elaboratore dinkel.brot.dg intende avviare il programma<br />

‘xterm’ utilizzando lo schermo ‘:0’ presso il suo stesso elaboratore locale. Si osservi<br />

anche che se l’utente in questione avvia questo comando da una finestra di terminale che si trova<br />

già a funzionare sullo schermo ‘:0’, il comando seguente significherebbe la stessa cosa, in<br />

quanto l’informazione sullo schermo verrebbe ottenuta dalla variabile di ambiente DISPLAY,<br />

senza bisogno di utilizzare l’opzione ‘-display’:<br />

tizio@dinkel.brot.dg:~$ xterm & [ Invio ]


1728 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Questo comando avvia ‘xterm’, il quale tenta di connettersi con il servente X che gestisce lo<br />

schermo locale ‘:0.0’ (abbreviato con ‘:0’), allo scopo di poterlo utilizzare: se il servente X<br />

si rifiuta, ‘xterm’ deve rinunciare.<br />

L’autorizzazione ad accedere allo schermo deve essere definita anche per lo stesso utente<br />

che ha avviato il servente X; tuttavia, questa autorizzazione viene predisposta inizialmente<br />

in modo automatico, attraverso ‘startx’, oppure uno degli altri script coinvolti.<br />

L’autorizzazione all’utilizzo del proprio schermo grafico da parte di programmi in esecuzione<br />

su altri elaboratori connessi in rete può avvenire semplicemente in base a un elenco di indirizzi<br />

autorizzati, oppure attraverso altre forme di riconoscimento. Qui vengono spiegati solo<br />

i modi più semplici e meno sicuri; per avere una visione completa delle possibilità si devono<br />

consultare le pagine di manuale X(1), xauth(1) e Xsecurity(1).<br />

È importante non sottovalutare il pericolo di un accesso indesiderato al proprio servente<br />

X, in quanto un aggressore preparato può sfruttare questa possibilità per arrivare anche a<br />

utilizzare la tastiera. In pratica, un aggressore potrebbe fare tutto quello che gli concedono<br />

i privilegi con cui è stato avviato il servente X.<br />

Il metodo più semplice in assoluto per concedere l’accesso al servente X è quello di stabilire<br />

attraverso il comando ‘xhost’ quali sono gli elaboratori che possono accedere. Questo<br />

significa implicitamente che tutti gli utenti di questi elaboratori possono accedere. Volendo<br />

distinguere tra gli utenti, occorre utilizzare almeno il metodo delle chiavi in chiaro<br />

(‘MIT-MAGIC-COOKIE-1’).<br />

Per attuare in pratica questo secondo meccanismo, viene utilizzato un file di configurazione<br />

personale, ‘~/.Xauthority’, nel quale sono elencati degli indirizzi di serventi X e le chiavi<br />

di accesso relative. Questo file non è leggibile direttamente; tuttavia, a titolo di esempio,<br />

potrebbe contenere le informazioni seguenti, che si riferiscono all’utente ‘tizio’ presso il<br />

solito elaboratore dinkel.brot.dg:<br />

|dinkel/unix:0 MIT-MAGIC-COOKIE-1 0f207ef0f71e2490b0648c26ed4f3e41<br />

|dinkel.brot.dg:0 MIT-MAGIC-COOKIE-1 0f207ef0f71e2490b0648c26ed4f3e41<br />

Questo contenuto determina che il servente X, avviato dall’utente a cui appartiene questo file,<br />

accetta connessioni locali (attraverso un socket di dominio Unix) e connessioni remote,<br />

attraverso la tecnica del ‘MIT-MAGIC-COOKIE-1’, quando chi accede fornisce la chiave di<br />

riconoscimento ‘0f207ef0f71e2490b0648c26ed4f3e41’. In questo caso, la chiave è la<br />

stessa, sia per le connessioni locali, sia per quelle attraverso la rete, ma potrebbero essere diverse;<br />

ciò che conta è che il cliente sia in grado di fornire la chiave giusta in base al tipo di<br />

connessione che effettua con il servente.<br />

Per fare in modo che il cliente sappia quale chiave utilizzare, occorre che l’utente che tenta di<br />

accedere al servente X abbia un file ‘~/.Xauthority’ contenente un record adatto. In pratica,<br />

se l’utente ‘caio’ vuole accedere, deve avere il record seguente nel caso questo avvenga<br />

nell’ambito dello stesso elaboratore locale:<br />

|dinkel/unix:0 MIT-MAGIC-COOKIE-1 0f207ef0f71e2490b0648c26ed4f3e41<br />

Oppure, gli serve il record successivo nel caso debba accedere da un altro elaboratore:


X 1729<br />

|dinkel.brot.dg:0 MIT-MAGIC-COOKIE-1 0f207ef0f71e2490b0648c26ed4f3e41<br />

Lo stesso utente che ha avviato il servente X deve essere autorizzato, attraverso il proprio<br />

file ‘~/.Xauthority’ che serve per questo scopo, imponendo agli altri la chiave di accesso.<br />

Si può comprendere meglio il meccanismo della chiave di riconoscimento<br />

‘MIT-MAGIC-COOKIE-1’, solo se si pensa allo scopo che ha: una persona può avere la<br />

possibilità di accedere a più elaboratori di una stessa rete locale, ma le utenze relative potrebbero<br />

anche corrispondere a nominativi-utente distinti, a seconda dell’elaboratore. Questa<br />

persona può avere la necessità di accedere a uno di questi elaboratori, attraverso la rete,<br />

avviando lì un programma che però deve apparire presso la stazione da cui sta operando. In<br />

altri termini, quando c’è la necessità di avviare un programma che deve apparire sullo schermo<br />

di un altro elaboratore, di solito si tratta di utenze che appartengono alla stessa persona fisica;<br />

in questo senso non c’è nulla di strano se tutte queste utenze condividono la stessa chiave.<br />

Per la precisione, nel caso di due utenti che appartengono allo stesso elaboratore, il record<br />

che descrive la chiave di accesso locale deve essere identico per entrambi. Di conseguenza,<br />

la condivisione di questo implica che il servente X avviato da uno di questi due è anche<br />

accessibile dall’altro.<br />

Dal momento che il file ‘~/.Xauthority’ non è un file di testo normale, per accedervi, si<br />

utilizza generalmente il programma ‘xauth’.<br />

31.5.5.1 Utilizzo di «xauth»<br />

Il programma ‘xauth’ è necessario per poter accedere alle informazioni contenute nei file di<br />

autorizzazione, normalmente ‘~/.Xauthority’, per poterle modificare. Per la maggior parte<br />

delle situazioni, ‘xauth’ non ha bisogno di contattare il servente X.<br />

«<br />

|<br />

|xauth [opzioni] [comando argomento... ]|<br />

Il programma ‘xauth’ interviene in base a dei comandi, che gli possono essere impartiti come<br />

argomenti della stessa riga di comando, nella parte finale, oppure in modo interattivo,<br />

attraverso l’invito seguente:<br />

xauth><br />

Spesso, i comandi richiedono l’indicazione di un file. In quella occasione, se si utilizza un<br />

trattino singolo (‘-’), questo viene inteso come lo standard input, oppure lo standard output, a<br />

seconda del contesto.


1730 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Tabella 31.42. Alcune opzioni.<br />

Opzione<br />

Descrizione<br />

|<br />

Permette di accedere a un file di autorizzazioni differente da<br />

-f file_di_autorizzazione<br />

quello standard, che di solito è ‘~/.Xauthority’.<br />

L’accesso al file delle autorizzazioni è regolato attraverso un<br />

file lucchetto (lock file), che alle volte potrebbe rimanere presente<br />

senza che ce ne sia più bisogno. Eccezionalmente e<br />

| -b con prudenza, si può utilizzare questa opzione per forzare il<br />

blocco ed eliminare il file lucchetto (lock file) relativo.<br />

|Tabella 31.43. Alcuni comandi. I comandi di ‘xauth’ possono essere impartiti in modo<br />

interattivo, oppure possono essere indicati come argomenti finali della riga di comando di<br />

‘xauth’.<br />

Comando<br />

|<br />

add stazione_grafica protocollo ←↪<br />

↩→ chiave_esadecimale<br />

Descrizione<br />

Questo comando serve ad aggiungere manualmente un record<br />

nel file di autorizzazione. Deve essere specificata: la stazione<br />

grafica, ovvero un indirizzo che non arriva a specificare anche<br />

lo schermo (in caso contrario questa informazione viene<br />

ignorata semplicemente); il tipo di protocollo, che può anche<br />

essere abbreviato con un punto singolo (‘.’), nel caso si<br />

tratti del tipo ‘MIT-MAGIC-COOKIE-1’; la chiave esadecimale,<br />

ovvero una stringa composta da un numero pari di cifre<br />

esadecimali, senza alcun prefisso.<br />

| list [stazione_grafica... ]<br />

Permette di visualizzare i record del file di autorizzazione,<br />

limitandosi alle stazioni grafiche indicate. Se queste non sono<br />

specificate, il comando mostra l’elenco completo.<br />

| info Permette di conoscere alcune informazioni generali sul file di<br />

autorizzazione.<br />

Questo comando permette di estrarre alcuni record dal file<br />

delle autorizzazioni, corrispondenti alle stazioni grafiche<br />

indicate. Il risultato viene accumulato nel file indicato come<br />

primo argomento di questo comando. Nel primo caso,<br />

con ‘extract’, le informazioni vengono memorizzate in<br />

file stazione_grafica...<br />

forma binaria, mentre nel secondo, con ‘nextract’, queste<br />

informazioni sono convertite in forma testuale.<br />

Questo comando consente di acquisire nel file di autorizzazione<br />

i record contenuti nel file indicato. Questi record vanno<br />

a sostituire quelli corrispondenti, riferiti alle stesse stazioni<br />

grafiche che dovessero essere già presenti nel proprio file di<br />

file<br />

|<br />

extract file [stazione_grafica... ]<br />

|<br />

nextract<br />

|<br />

merge file<br />

|<br />

nmerge<br />

autorizzazione. Anche in questo caso vale la differenza per<br />

cui ‘merge’ si aspetta di attingere i record da un file binario,<br />

mentre ‘nmerge’ utilizza un file di testo normale.<br />

|<br />

Elimina i record specificati attraverso l’indicazione delle<br />

remove stazione_grafica...<br />

stazioni grafiche relative.<br />

| exit<br />

Questi due comandi riguardano il funzionamento interattivo<br />

di ‘xauth’. Con ‘exit’ viene concluso il funzionamento del<br />

| quit programma, salvando le modifiche; con ‘quit’, si ottiene una<br />

conclusione senza salvare.<br />

Segue la descrizione di alcuni esempi.<br />

• tizio@dinkel.brot.dg:~$ xauth add :0 . 12345678 [ Invio ]


X 1731<br />

L’utente aggiunge, o modifica, il record di autorizzazione riferito all’accesso locale,<br />

specificando per questo il protocollo ‘MIT-MAGIC-COOKIE-1’ in modo predefinito,<br />

attraverso il punto, indicando una stringa esadecimale molto semplice: 12345678 16 .<br />

• tizio@dinkel.brot.dg:~$ extract /tmp/prova :0 [ Invio ]<br />

Estrae una copia del record di autorizzazione all’accesso locale e la salva nel file ‘/tmp/<br />

prova’.<br />

• caio@dinkel.brot.dg:~$ merge /tmp/prova :0 [ Invio ]<br />

Un altro utente, si appropria dei record contenuti nel file ‘/etc/prova’.<br />

• tizio@roggen.brot.dg:~$ xauth extract - $DISPLAY; ←↪<br />

↩→ | rsh dinkel.brot.dg xauth merge - [ Invio ]<br />

L’utente ‘tizio’ che sta utilizzando l’elaboratore roggen.brot.dg ottiene attraverso<br />

‘rsh’ di aggiungere al proprio file di autorizzazione remoto, quello presso la sua utenza<br />

corrispondente nell’elaboratore dinkel.brot.dg, il record riferito al servente X<br />

che sta utilizzando in quel momento. In altri termini, fa in modo di poter avviare dei<br />

programmi presso l’elaboratore remoto, utilizzando la stazione grafica su cui si trova.<br />

Si osservi l’uso della variabile di ambiente DISPLAY per ottenere l’indicazione precisa<br />

dello schermo che sta utilizzando e anche l’uso del trattino per collegare i due programmi<br />

attraverso i flussi standard.<br />

31.5.5.2 Utilizzo di «mcookie»<br />

Il programma ‘mcookie’ ha lo scopo di generare un numero esadecimale, più o meno casuale,<br />

convertito in stringa, che viene emesso attraverso lo standard output:<br />

«<br />

|<br />

|mcookie<br />

|<br />

La sua utilità sta solo nel facilitare la generazione di chiavi per il sistema di autorizzazione.<br />

La situazione più comune in cui viene utilizzato è il comando seguente, dove in pratica ci si<br />

risparmia di decidere la chiave:<br />

$ xauth add :0 . ‘mcookie‘ [ Invio ]<br />

31.5.5.3 Riepilogo sull’utilizzo del file di autorizzazione<br />

Il file di autorizzazione è composto da record contenenti tre informazioni: la stazione grafica<br />

(senza il dettaglio dello schermo); il nome di un protocollo di autenticazione; una chiave, il<br />

cui significato varia a seconda del tipo di protocollo utilizzato.<br />

È importante sottolineare che può esistere un solo record per stazione grafica, per cui, ogni<br />

volta che si aggiunge un record per una certa stazione, questo va a sostituire un altro record<br />

eventuale riferito alla stessa stazione.<br />

In generale, si distingue tra la stazione grafica locale, a cui si accede senza passare per la rete,<br />

e le stazioni grafiche remote, che contengono anche l’indicazione del nome del nodo di rete.<br />

«


1732 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Tra le stazioni remote ci può essere anche quella locale, indicata secondo il punto di vista della<br />

rete.<br />

Perché possa avvenire una connessione tra un programma cliente e un servente X, è necessario<br />

che il record di autorizzazione a cui può accedere il cliente, riferito al servente X in questione,<br />

sia identico a quello corrispondente del servente X.<br />

Il sistema di autorizzazione di X sembra fatto perché le chiavi siano cambiate spesso. In<br />

generale, si cerca di sistemare l’autorizzazione sempre solo nel momento in cui ne esiste il<br />

bisogno, ma subito dopo sarebbe bene cambiare la chiave di autorizzazione.<br />

«<br />

31.5.5.4 Utilizzo di «xhost»<br />

Il programma ‘xhost’ permette di aggiungere o togliere nomi dalla lista di elaboratori e<br />

utenti a cui è concesso di utilizzare lo schermo grafico, senza la richiesta di altre forme di<br />

autenticazione:<br />

|<br />

|xhost [[+|-]nome... ]|<br />

|<br />

|xhost [+|-] |<br />

Se non vengono utilizzati argomenti, ‘xhost’ emette un messaggio informando sullo stato<br />

attuale del controllo degli accessi. I nomi indicati nella sintassi di ‘xhost’ hanno una struttura<br />

particolare:<br />

|<br />

|famiglia:indirizzo<br />

|<br />

In pratica, per le connessioni su reti IPv4 si utilizza la famiglia ‘inet’.<br />

Le funzionalità di X non sono sempre presenti su tutte le piattaforme. In questo caso<br />

particolare, potrebbe darsi che non sia possibile regolare gli accessi ai singoli utenti.<br />

Se si vuole concedere sistematicamente l’accesso a qualche nodo di rete, conviene inserire i<br />

comandi necessari all’interno del file ‘~/.xinitrc’ in modo che siano eseguiti ogni volta<br />

all’avvio del servente X.<br />

|Tabella 31.44. Alcune opzioni.<br />

Opzione<br />

Descrizione<br />

| + L’accesso è consentito a tutti.<br />

| - L’accesso è consentito solo agli elaboratori e agli utenti<br />

|[+]nome<br />

inclusi nell’elenco di quelli autorizzati.<br />

Il nome indicato -- può trattarsi di un elaboratore o di un utente<br />

di un elaboratore -- è autorizzato a utilizzare lo schermo. Il<br />

segno ‘+’ iniziale è facoltativo.<br />

| -nome Il nome indicato (può trattarsi di un elaboratore o di un utente<br />

di un elaboratore) non è autorizzato a utilizzare lo schermo.<br />

Le connessioni in corso non vengono interrotte, ma le nuove<br />

connessioni vengono impedite.


X 1733<br />

Segue la descrizione di alcuni esempi.<br />

• $ xhost + [ Invio ]<br />

Autorizza chiunque ad accedere.<br />

• $ xhost - [ Invio ]<br />

Limita la possibilità di accesso ai soli nomi inseriti nell’elenco di elaboratori e utenti<br />

autorizzati.<br />

• $ xhost +inet:roggen.brot.dg [ Invio ]<br />

Consente all’elaboratore roggen.brot.dg di accedere al servente grafico.<br />

• $ xhost -inet:roggen.brot.dg [ Invio ]<br />

Elimina l’elaboratore roggen.brot.dg dalla lista di quelli a cui è consentito<br />

accedere.<br />

31.5.5.5 Utilizzo di «xon»<br />

‘xon’ esegue un comando in un elaboratore remoto attraverso ‘rsh’, facendo in modo che<br />

venga utilizzato il servente X locale:<br />

«<br />

|<br />

|xon nodo_remoto [opzioni] [comando] |<br />

Si tratta in pratica di un modo abbreviato per eseguire un’applicazione remota senza la<br />

necessità di utilizzare la solita opzione ‘-display’. 9<br />

Se attraverso gli attributi non viene indicato alcun comando da eseguire, ‘xon’ tenta di avviare<br />

‘xterm -ls’, in pratica una sessione ‘xterm’ di login.<br />

‘xon’ è in grado di funzionare solo quando l’elaboratore remoto è configurato in modo da<br />

consentire le connessioni remote attraverso ‘rsh’ senza richiedere alcun tipo di riconoscimento.<br />

Sotto questo aspetto, ‘xon’ è limitato all’utilizzo nelle reti chiuse in cui esiste un<br />

serio rapporto di fiducia tra le persone che vi accedono.<br />

|Tabella 31.45. Alcune opzioni.<br />

Opzione<br />

Descrizione<br />

Prima di eseguire il comando indicato, utilizza ‘xhost’ nel<br />

tentativo di autorizzare l’elaboratore remoto a utilizzare il<br />

| -access proprio servente X. In effetti, lo scopo di ‘xon’ è quello di<br />

facilitare l’esecuzione di programmi remoti ma con un I/O<br />

locale, cioè attraverso il servente X con il quale si interagisce.<br />

Quando ‘xon’ viene avviato attraverso una finestra di terminale,<br />

utilizzando questa opzione si riceve lo standard output e<br />

| -debug lo standard error. In tal modo si possono conoscere eventuali<br />

segnalazioni di errore e qualunque altro output normale.


1734 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

L’esempio seguente mostra l’avvio del programma ‘xcalc’ nell’elaboratore<br />

roggen.brot.dg, utilizzando il servente X locale. Prima di farlo, ‘xon’ avvia ‘xhost’ per<br />

consentire all’elaboratore remoto di accedere al proprio servente X.<br />

$ xon roggen.brot.dg -access /usr/bin/X11/xcalc [ Invio ]<br />

31.5.6 Accedere allo schermo con Secure Shell<br />

«<br />

Secure Shell (sezione 49.7) facilita le connessioni remote, gestendo in modo automatico tutto<br />

il procedimento di autorizzazione all’accesso al proprio schermo. Per arrivare a questo risultato,<br />

è comunque necessario abilitare tale funzionalità nella configurazione: sia dalla parte del<br />

servente, sia dalla parte del cliente.<br />

Nel file di configurazione del servente Secure Shell, è necessario trovare queste direttive:<br />

|X11Forwarding yes<br />

|X11DisplayOffset 10<br />

Nel file di configurazione del cliente Secure Shell, è necessario trovare queste direttive:<br />

|Host *<br />

| ForwardX11 yes<br />

Così facendo, una volta aperta una finestra di terminale, ci si può collegare all’elaboratore<br />

remoto usando il cliente Secure Shell, come nell’esempio seguente:<br />

tizio$dinkel.brot.dg:~$ ssh caio@roggen.brot.dg [ Invio ]<br />

Dopo la fase di autenticazione, che potrebbe consistere nella richiesta della parola d’ordine, è<br />

possibile verificare che la variabile di ambiente DISPLAY risulta impostata in modo da fare<br />

riferimento al proprio elaboratore locale, utilizzando uno schermo particolare, come definito<br />

nella direttiva ‘X11DisplayOffset’:<br />

caio$roggen.brot.dg:~$ echo $DISPLAY [ Invio ]<br />

|dinkel.brot.dg:10.0<br />

A questo punto, è sufficiente avviare un programma grafico qualunque nell’elaboratore remoto,<br />

senza bisogno di altro: si ottiene di farlo funzionare sul proprio schermo grafico.<br />

caio$roggen.brot.dg:~$ xclock [ Invio ]<br />

Si osservi che la comunicazione tra i due elaboratori avviene all’interno di un tunnel definito<br />

da Secure Shell. Ciò consente di ottenere una connessione cifrata; in ogni caso, tuttavia, è<br />

da tenere in considerazione che non viene rilevata come tale da un programma di analisi del<br />

traffico in rete, ma solo come una connessione di Secure Shell.


X 1735<br />

31.5.7 Cambiare identità<br />

Quando si intende avviare un programma che utilizza la grafica, ma con i privilegi di un altro<br />

utente, non basta usare il comando ‘su’, come avviene per quei programmi che richiedono<br />

soltanto un terminale a caratteri. Infatti, si crea il problema delle autorizzazioni, già descritto<br />

nelle sezioni precedenti. Pertanto, occorre eventualmente un programma analogo a ‘su’, in<br />

grado però di provvedere anche a ciò che serve per autorizzare la comunicazione con il proprio<br />

servente X. A titolo di esempio viene descritto Gksu:<br />

«<br />

|<br />

|gksu [-u utente] [opzioni] [comando] |<br />

Se il programma ‘gksu’ viene avviato senza alcun argomento, chiede interattivamente cosa<br />

deve fare: quale utente deve impersonare e quale comando eseguire.<br />

|Figura 31.49. Il programma ‘gksu’ avviato senza alcun argomento chiede tutto in modo<br />

interattivo.<br />

In ogni caso, viene richiesto l’inserimento della parola d’ordine dell’utente che interessa. Di<br />

norma, la richiesta della parola d’ordine coincide con un congelamento momentaneo delle altre<br />

attività.<br />

|Figura 31.50. La richiesta dell’inserimento della parola d’ordine. In questo caso verrebbe<br />

avviato il programma ‘mlterm’ in qualità di utente ‘root’.


1736 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.5.8 Tipi di carattere<br />

«<br />

In base a quanto indicato nel file di configurazione ‘/etc/XF86Config’ nella sezione<br />

‘Files’, i tipi di carattere utilizzati da X sono collocati nelle directory successive a ‘/usr/<br />

lib/X11/fonts/’. All’interno di queste directory si trovano dei file contenenti le informazioni<br />

sui vari tipi di carattere tipografico e i loro nomi sono contenuti negli elenchi<br />

‘fonts.dir’.<br />

Il nome di un carattere tipografico è strutturato in un modo altamente descrittivo. Segue un<br />

esempio che viene scomposto. 10<br />

|-b&h-lucidatypewriter-medium-r-normal-sans-8-80-100-100-m-50-iso8859-1<br />

• ‘b&h’<br />

è la «fonderia», ovvero il produttore;<br />

• ‘lucidatypewriter’<br />

• ‘medium’<br />

è lo spessore;<br />

definisce la famiglia;<br />

• ‘r’ è il tipo -- «r» sta per roman (tondo), «i» indicherebbe italic (corsivo) e «o» oblique<br />

(obliquo);<br />

• ‘normal’<br />

è l’ampiezza orizzontale;<br />

• ‘sans’ è una particolarità dello stile, in questo caso indica l’assenza di grazie o serif ,<br />

cioè dei terminali che facilitano la lettura;<br />

• ‘8’<br />

indica la dimensione in punti grafici (pixel);<br />

• ‘80’ indica la dimensione in decimi di punto tipografici (precisamente si tratta di 722,7<br />

per pollice, pari a circa 0,035 mm);<br />

• ‘100’ è la risoluzione orizzontale, espressa in punti per pollice, per la quale è stato<br />

progettato il tipo di carattere;<br />

• ‘100’ è la risoluzione verticale, espressa in punti per pollice, per la quale è stato<br />

progettato il tipo di carattere;<br />

• ‘m’ è la larghezza, in questo caso monospaced, ovvero a larghezza fissa, mentre<br />

l’alternativa sarebbe «p», cioè proportional;<br />

• ‘50’ è lo spessore medio espresso in decimi di punto (in questo caso si tratta di cinque<br />

punti normali);<br />

• ‘iso8859-1’ è l’insieme di caratteri, in questo caso, il codice ‘iso8859-1’ corrisponde<br />

al noto ISO Latin 1.<br />

31.5.9 X e l’uso senza dispositivo di puntamento<br />

«<br />

L’utilizzo del sistema grafico senza mouse, o senza un dispositivo equivalente, può essere<br />

importante in condizioni di emergenza, o comunque quando il tipo di mouse che si ha a<br />

disposizione potrebbe risultare più scomodo che altro.


X 1737<br />

I serventi grafici di X offrono queste funzionalità attraverso il tastierino numerico, dopo aver<br />

attivato le estensioni della tastiera. Perché ciò sia possibile è necessario che nel file di configurazione<br />

sia commentata l’istruzione che si in questo esempio, oppure che sia assente del<br />

tutto:<br />

|# Option XkbDisable<br />

Per abilitare l’uso del tastierino numerico in modo che possa sostituirsi al mouse occorre utilizzare<br />

la combinazione [ Ctrl Maiuscole BlocNum ] («control», «maiuscole», «blocco-numeri»). Se<br />

la combinazione riesce si ottiene una segnalazione sonora (se si ripete la combinazione si<br />

disabilita l’uso del tastierino).<br />

Da quel momento, si possono utilizzare i tasti [ 4 ], [ 8 ], [ 6 ] e [ 2 ], per spostare il puntatore<br />

rispettivamente verso sinistra, in alto, a destra e in basso. Inoltre, si possono usare anche i<br />

tasti [ 7 ], [ 9 ], [ 3 ] e [ 1 ], per ottenere degli spostamenti obliqui. Questi spostamenti potrebbero<br />

essere piuttosto lenti in condizioni normali; per accelerarli, mentre si tiene premuto il<br />

tasto che si riferisce alla direzione scelta, si può premere e rilasciare immediatamente un altro<br />

tasto, scegliendolo in modo tale che in quel momento non abbia un significato particolare;<br />

probabilmente la cosa migliore è usare per questo il tasto delle maiuscole.<br />

Per emulare i tasti del mouse si utilizzano gli altri tasti del tastierino numerico: [ 5 ] corrisponde<br />

a un clic; [ + ] corrisponde a un clic doppio; [ 0 ] rappresenta la pressione di un tasto senza<br />

rilasciarlo; [ . ] rilascia il tasto del mouse. In condizioni normali, ciò corrisponde al primo<br />

tasto del mouse, ma si può specificare precisamente il tasto attraverso una combinazione con<br />

i tasti [ / ], [ * ] e [ - ], che rappresentano rispettivamente il primo, il secondo (quello centrale)<br />

e il terzo tasto del mouse. Per esempio, [ * 5 ] corrisponde a un clic con il tasto centrale del<br />

mouse.<br />

|Figura 31.53. Comandi per l’emulazione del mouse con X.<br />

X, dopo un po’ di tempo in cui non si utilizza più il tastierino numerico in sostituzione del<br />

mouse, ne disabilita l’emulazione in modo automatico.


1738 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.6 Approfondimento: monitor, adattatore grafico e<br />

frequenza dot-clock<br />

«<br />

Quando si vuole configurare XFree86 nelle versioni 3.* e qualcosa va storto, oppure non si<br />

riesce a ottenere quello che si vuole esattamente attraverso uno dei vari programmi già descritti<br />

nel capitolo precedente, può essere necessario mettere mano alle sezioni ‘Monitor’, ‘Device’<br />

e ‘Screen’ del file ‘/etc/X11/XF86Config’. Tra tutte, la sezione ‘Monitor’ è la più difficile<br />

per il principiante, a causa delle direttive ‘Modeline’ o ‘Mode’, in cui si devono indicare una<br />

serie di numeri più o meno oscuri.<br />

In questo capitolo si mostra in che modo calcolare i valori delle modalità video. Una scelta<br />

impropria di questi valori, potrebbe causare problemi, fino ad arrivare al danneggiamento<br />

del monitor. Si prega di intervenire con prudenza ed eventualmente anche di leggere<br />

XFree86 Video Timings HOWTO di Eric S. Raymond.<br />

«<br />

31.6.1 Autorilevamento con Read-edid<br />

Read-edid 11 è un piccolo sistema di programmi in grado di scandire l’adattatore grafico e il monitor,<br />

allo scopo di ottenere le informazioni necessarie a configurare correttamente programmi<br />

come XFree86. Si compone precisamente di ‘get-edid’ e di ‘parse-edid’.<br />

Il programma ‘get-edid’ esegue la scansione dell’adattatore grafico e attraverso di questo<br />

anche del monitor. Il risultato della scansione è un file binario emesso attraverso lo standard<br />

output, mentre attraverso lo standard error si ottengono altre informazioni diagnostiche.<br />

Per esempio, si può ignorare temporaneamente il risultato emesso dallo standard output per<br />

osservare tali notizie diagnostiche:<br />

# get-edid 1> /dev/null [ Invio ]<br />

Si potrebbe ottenere un risultato simile a quello seguente:<br />

|get-edid: get-edid version 1.4.1<br />

|<br />

| Performing real mode VBE call<br />

| Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0<br />

| Function supported<br />

| Call successful<br />

|<br />

| VBE version 102<br />

| VBE string at 0xc098d "S3 Incorporated. Trio64V+"<br />

|<br />

|VBE/DDC service about to be called<br />

| Report DDC capabilities<br />

|<br />

| Performing real mode VBE call<br />

| Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0<br />

| Function supported<br />

| Call successful<br />

|


X 1739<br />

| Monitor and video card combination supports DDC1 transfers<br />

| Monitor and video card combination does not support DDC2 transfers<br />

| 0 seconds per 128 byte EDID block transfer<br />

| Screen is blanked during DDC transfer<br />

|<br />

|Reading next EDID block<br />

|<br />

|VBE/DDC service about to be called<br />

| Read EDID<br />

|<br />

| Performing real mode VBE call<br />

| Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0<br />

| Function supported<br />

| Call successful<br />

In questo caso è stato individuato un vecchio adattatore grafico «Trio64V+».<br />

Per poter leggere il risultato emesso attraverso lo standard error, si usa ‘parse-edid’:<br />

# get-edid 2> /dev/null | parse-edid [ Invio ]<br />

Ecco quello che si potrebbe ottenere:<br />

| # EDID version 1 revision 0<br />

|Section "Monitor"<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

| Identifier "PHL:0012"<br />

| VendorName "PHL"<br />

| ModelName "PHL:0012"<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

| # DPMS capabilities: Active off:yes Suspend:yes Standby:yes<br />

|<br />

| Mode "640x400" # vfreq 70.072Hz, hfreq 31.462kHz<br />

| DotClock 25.170000<br />

| HTimings 640 656 752 800<br />

| VTimings 400 412 414 449<br />

| Flags "+HSync" "-VSync"<br />

| EndMode<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

| # Block type: 2:0 3:0<br />

|EndSection<br />

In pratica, con questo risultato si può compilare la sezione ‘Monitor’ del file di configurazione<br />

di XFree86.


1740 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

«<br />

31.6.2 Autorilevamento con un servente XFree86 versione 3.*<br />

Quando non si conoscono tutte le caratteristiche del proprio adattatore grafico, è possibile utilizzare<br />

un servente X con l’opzione ‘-probeonly’ per vedere cosa questo riesce a determinare<br />

da solo. Alcuni parametri sono sensibili al carico del sistema, per cui, questo tipo di prova deve<br />

essere fatto quando non si effettuano altre attività.<br />

Qui si sta facendo riferimento all’uso di un servente XFree86 versione 3.*. Pertanto, il<br />

file di configurazione di partenza che viene proposto, rispecchia la sintassi relativa a quelle<br />

versioni e non può funzionare per una versione 4.*.<br />

È il caso di utilizzare un servente più o meno generico, per esempio quello per gli adattatori<br />

SVGA (‘XF86_SVGA’), che deve essere stato installato. Per stimolare l’autorilevamento,<br />

è necessario che le voci corrispondenti non siano presenti nel file di configurazione ‘/etc/<br />

X11/XF86Config’ (o siano commentate). Un file come quello seguente, dove le sezioni<br />

‘Monitor’, ‘Device’ e ‘Screen’ sono quasi vuote, dovrebbe andare bene per cominciare<br />

lo studio del proprio adattatore grafico:<br />

|Section "Files"<br />

| RgbPath "/etc/X11/rgb"<br />

| FontPath "/usr/lib/X11/fonts/misc/"<br />

| FontPath "/usr/lib/X11/fonts/Type1/"<br />

| FontPath "/usr/lib/X11/fonts/Speedo/"<br />

| FontPath "/usr/lib/X11/fonts/75dpi/"<br />

| FontPath "/usr/lib/X11/fonts/100dpi/"<br />

|EndSection<br />

|<br />

|Section "ServerFlags"<br />

| # DontZap<br />

| # DontZoom<br />

|EndSection<br />

|<br />

|Section "Keyboard"<br />

| Protocol "Standard"<br />

| AutoRepeat 500 5<br />

| Xkbkeycodes "xfree86"<br />

| XkbTypes "default"<br />

| XkbCompat "default"<br />

| XkbSymbols "en_US(pc102)+it"<br />

| XkbGeometry "pc"<br />

|EndSection<br />

|<br />

|Section "Pointer"<br />

| Protocol "microsoft"<br />

| Device "/dev/mouse"<br />

| Emulate3Buttons<br />

| Emulate3Timeout 50<br />

|EndSection


X 1741<br />

|<br />

|Section "Monitor"<br />

| Identifier "Monitor generico"<br />

|EndSection<br />

|<br />

|Section "Device"<br />

| Identifier "SuperVGA"<br />

|EndSection<br />

|<br />

|Section "Screen"<br />

| Driver "svga"<br />

| Device "SuperVGA"<br />

| Monitor "Monitor generico"<br />

| Subsection "Display"<br />

| Modes "640x400" "640x480" "640x480.28" "800x600"<br />

| EndSubsection<br />

|EndSection<br />

Si avvia quindi ‘X’, come utente ‘root’, con l’opzione ‘-probeonly’, salvando lo standard<br />

output e lo standard error in un file (‘X’ è un collegamento simbolico al file binario del<br />

servente grafico prescelto).<br />

Purtroppo, è necessario tenere in considerazione che questo tipo di prove può modificare l’aspetto<br />

dei caratteri sullo schermo, o bloccarlo del tutto. Per cui, se non si hanno alternative,<br />

si rischia di dover riavviare il sistema.<br />

# X -probeonly > /tmp/x.tmp 2>&1 [ Invio ]<br />

Se tutto è andato bene, il file ‘/tmp/x.tmp’ generato dal comando, dovrebbe contenere un<br />

risultato simile a quello seguente, che viene sezionato per descriverlo in dettaglio.<br />

|XFree86 Version 3.3.2 / X Window System<br />

|(protocol Version 11, revision 0, vendor release 6300)<br />

|Release Date: March 2 1998<br />

| If the server is older than 6-12 months, or if your card is newer<br />

| than the above date, look for a newer version before reporting<br />

| problems. (see http://www.XFree86.Org/FAQ)<br />

|Operating System: Linux 2.0.34 i686 [ELF]<br />

La parte iniziale presenta la versione del servente e del sistema operativo utilizzato.


1742 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Configured drivers:<br />

| SVGA: server for SVGA graphics adaptors (Patchlevel 0):<br />

| NV1, STG2000, RIVA128, ET4000, ET4000W32, ET4000W32i,<br />

| ET4000W32i_rev_b, ET4000W32i_rev_c, ET4000W32p, ET4000W32p_rev_a,<br />

|...<br />

| s3_svga, ct65520, ct65525, ct65530, ct65535, ct65540, ct65545,<br />

| ct65546, ct65548, ct65550, ct65554, ct65555, ct68554, ct64200,<br />

| ct64300, generic<br />

Segue quindi l’indicazione del tipo di servente grafico avviato (SVGA) e l’elenco di tutti i<br />

nomi degli adattatori grafici gestibili con questo.<br />

|(using VT number 7)<br />

Il servente grafico utilizzerebbe (se avviato normalmente) il posto della console virtuale<br />

numero sette.<br />

|XF86Config: /usr/lib/X11/XF86Config<br />

È stata letta la configurazione del file ‘/usr/lib/X11/XF86Config’ (in questo caso si tratta<br />

di un collegamento simbolico a ‘/etc/X11/XF86Config’).<br />

Dopo questo punto segue un elenco di informazioni, in parte definite all’interno del file di<br />

configurazione e in parte determinate in modo automatico.<br />

|(**) stands for supplied, (--) stands for probed/default values<br />

Le informazioni fornite attraverso il file di configurazione sono prefissate dal simbolo<br />

‘(**)’, mentre quelle predefinite o determinate dall’interrogazione dell’adattatore grafico,<br />

sono prefissate dal simbolo ‘(--)’.<br />

|(**) XKB: keycodes: "xfree86"<br />

|(**) XKB: types: "default"<br />

|(**) XKB: compat: "default"<br />

|(**) XKB: symbols: "en_US(pc102)+it"<br />

|(**) XKB: geometry: "pc"<br />

|(**) Mouse: type: microsoft, device: /dev/mouse, baudrate: 1200<br />

|(**) Mouse: buttons: 3, 3 button emulation (timeout: 50ms)<br />

|(**) SVGA: Graphics device ID: "SuperVGA"<br />

|(**) SVGA: Monitor ID: "Monitor generico"<br />

|(**) FontPath set to "/usr/lib/X11/fonts/misc/,...<br />

Dato l’esempio proposto, le informazioni sulla tastiera, il mouse e i percorsi dei tipi di carattere,<br />

sono prelevati dal file di configurazione. In particolare, si osserva che da quel file,<br />

sono state prese in considerazione la sezione ‘Device’ denominata ‘SuperVGA’ e la sezione<br />

‘Monitor’ denominata ‘Monitor generico’.<br />

|(--) SVGA: PCI: S3 ViRGE/DX or /GX rev 1, Memory @ 0xe0000000<br />

|(--) SVGA: S3V: ViRGE/DXGX rev 1, Linear FB @ 0xe0000000<br />

|(--) SVGA: Detected S3 ViRGE/DXGX<br />

|(--) SVGA: using driver for chipset "s3_virge"


X 1743<br />

L’adattatore grafico è una scheda S3 ViRGE/DXGX, per la quale verrebbe utilizzato il driver<br />

‘s3_virge’. Tuttavia, data la circostanza, converrebbe utilizzare un servente grafico differente<br />

per questo adattatore; precisamente ‘XF86_S3V’.<br />

|(--) SVGA: videoram: 4096k<br />

|(--) SVGA: Ramdac speed: 170 MHz<br />

|(--) SVGA: Detected current MCLK value of 42.955 MHz<br />

|(--) SVGA: chipset: s3_virge<br />

|(--) SVGA: videoram: 4096k<br />

|(**) SVGA: Using 8 bpp, Depth 8, Color weight: 666<br />

|(--) SVGA: Maximum allowed dot-clock: 170.000 MHz<br />

Seguono altre informazioni molto importanti, come la quantità di memoria video e la frequenza<br />

massima di dot-clock. Si osservi in particolare la profondità di colori indicata: 8 bit/pixel (8 bit<br />

per punto). L’informazione è preceduta dal simbolo ‘(**)’ perché il tipo di servente grafico<br />

permette la gestione di un massimo di 8 bit/pixel (256 colori), per cui è questo il valore fissato,<br />

benché l’adattatore grafico permetta ben altri livelli di profondità.<br />

31.6.2.1 Dot-clock<br />

«<br />

Una delle informazioni più delicate dell’adattatore grafico è la frequenza del cosiddetto dotclock.<br />

Il significato di questo parametro viene descritto più avanti, tuttavia è bene sapere subito<br />

che si può manifestare in modi differenti.<br />

Nell’esempio mostrato, appare l’indicazione di un livello massimo.<br />

|(--) SVGA: Maximum allowed dot-clock: 170.000 MHz<br />

In altre situazioni, può essere fornita una o più righe con un elenco di valori di dot-clock, come<br />

nell’esempio seguente:<br />

|(--) xxx: clocks: 25.0 28.0 40.0 0.0 50.0 77.0 36.0 45.0<br />

|(--) xxx: clocks: 130.0 120.0 80.0 31.0 110.0 65.0 75.0 94.0<br />

In questo secondo caso, è necessario indicare la direttiva ‘Clocks’ nella sezione ‘Device’ del<br />

file ‘/etc/X11/XF86Config’, come nell’esempio seguente:<br />

|Section "Device"<br />

| ...<br />

| Clocks 25.0 28.0 40.0 0.0 50.0 77.0 36.0 45.0<br />

| Clocks 130.0 120.0 80.0 31.0 110.0 65.0 75.0 94.0<br />

|EndSection<br />

Quando invece la frequenza di dot-clock viene indicata solo come valore massimo (come nel<br />

caso dell’adattatore S3 ViRGE), non serve indicare alcuna direttiva ‘Clocks’.


1744 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.6.3 Un po’ di teoria<br />

«<br />

Alla base della costruzione dell’immagine da parte dell’adattatore grafico, sta la frequenza<br />

di dot-clock, ovvero la frequenza a cui ogni punto che la compone viene emesso. Questa è<br />

espressa in megahertz (MHz) e a volte deve essere selezionata da un elenco (quando si deve<br />

utilizzare la direttiva ‘Clocks’), altre volte può essere programmata liberamente, purché non<br />

venga superato il limite massimo.<br />

In linea di massima, l’adattatore grafico VGA elementare tradizionale, ha una frequenza di<br />

dot-clock di 25175 MHz.<br />

Chi lavora con l’informatica potrebbe essere portato a confondersi. In questo caso, megahertz<br />

significa esattamente milioni di hertz. Per cui, 25175 MHz sono esattamente pari a<br />

25175000 Hz. Così, kilohertz rappresenta migliaia di hertz, per cui, per esempio, 31,5 kHz<br />

corrispondono a 31500 Hz.<br />

A parità di condizioni, al crescere della risoluzione deve crescere la frequenza di dot-clock.<br />

Leggendo il contenuto standard di una vecchia versione 3.* del file ‘/etc/X11/XF86Config’,<br />

si conoscono i valori minimi delle frequenze di dot-clock per le risoluzioni più comuni. Qui<br />

vengono riportate nella tabella 31.68.<br />

|Tabella 31.68. Frequenze minime di dot-clock in base alla risoluzione.<br />

Risoluzione<br />

Frequenza di dot-clock minima<br />

640×480 25,175 MHz<br />

800×600 36 MHz<br />

1024×768 interlacciato 44,9 MHz<br />

1024×768 65 MHz<br />

1152×864 interlacciato 65 MHz<br />

1152×864 92 MHz<br />

1280×1024 interlacciato 80 MHz<br />

1280×1024 110 MHz<br />

1600×1200 162 MHz<br />

1800×1440 230 MHz<br />

31.6.3.1 Ampiezza di banda del monitor<br />

«<br />

L’ampiezza di banda del monitor, o bandwidth, rappresenta la frequenza massima del segnale<br />

video che il monitor è in grado di gestire. Frequenze superiori vengono semplicemente filtrate,<br />

diventando particolari visivi non più percettibili.<br />

In linea di principio, la frequenza di dot-clock utilizzata nell’adattatore grafico dovrebbe essere<br />

inferiore o uguale al valore massimo della frequenza del segnale video gestibile con il monitor,<br />

cioè al valore dell’ampiezza di banda.


X 1745<br />

31.6.3.2 Scomposizione e scansione dell’immagine sul monitor<br />

L’immagine che appare sullo schermo di un monitor può essere descritta, in modo semplificato,<br />

come l’insieme di una serie di righe, composte a loro volta da punti. La prima forma di<br />

rappresentazione di un’immagine di origine elettronica è stata quella del tubo a raggi catodici<br />

e da questo tipo di tecnologia derivano le soluzioni adottate per la sua composizione.<br />

«<br />

|Figura 31.69. La scansione di un’immagine.<br />

Le righe di un’immagine video vengono disegnate da un «pennello» ideale, che inizia la sua<br />

scansione in una posizione dello schermo in alto a sinistra, muovendosi verso destra e ricominciando<br />

sempre dal lato sinistro della riga successiva. Giunto alla fine dello schermo, riprende<br />

dalla posizione superiore sinistra.<br />

Il pennello di scansione, una volta che ha terminato una riga, prima di poter riprendere con<br />

la riga successiva, deve avere il tempo necessario per posizionarsi all’inizio di questa. Nello<br />

stesso modo, quando il pennello di scansione giunge alla fine dell’ultima riga, deve avere il<br />

tempo di ritornare all’inizio dello schermo, cioè nella posizione estrema in alto a sinistra.<br />

|Figura 31.70. Il ritorno all’inizio dopo la scansione di un’immagine completa.<br />

Un’immagine completa è un quadro, o frame, ma un quadro potrebbe essere ottenuto con<br />

un’unica scansione, dall’inizio alla fine dello schermo, oppure dalla somma di due semiquadri.<br />

In questo ultimo caso si usa la tecnica dell’interlacciamento, in cui le righe dei due semiquadri


1746 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

si affiancano senza accavallarsi. La figura 31.71 mostra il caso di un quadro composto da un<br />

numero di righe pari.<br />

|Figura 31.71. Due semiquadri di una scansione interlacciata.<br />

L’interlacciamento è nato come un metodo per ridurre lo sfarfallio dell’immagine nel sistema<br />

televisivo tradizionale. Per esempio, in Europa i quadri si susseguono a una frequenza di 25 Hz,<br />

un valore troppo basso perché l’occhio umano non si accorga dello sfarfallio. Così, attraverso<br />

l’interlacciamento, le immagini trasmesse vengono scomposte in due parti, visualizzate in<br />

sequenza a una frequenza di 50 Hz, considerata accettabile per quel tipo di utilizzo, anche<br />

se questo può comunque provocare strani effetti alla percezione dei particolari.<br />

In generale, a parità di frequenza di quadro, è preferibile un’immagine interlacciata per ridurre<br />

l’effetto dello sfarfallio.<br />

Da quanto affermato si può intendere che l’immagine video sia prodotta come una sequenza<br />

lineare di punti e di pause, necessarie al ritorno all’inizio di una riga successiva, di un quadro<br />

o di un semiquadro successivo.


X 1747<br />

|Figura 31.72. Rappresentazione schematica dello scorrere del segnale video, con le pause<br />

tra riga e riga e tra quadro e quadro.<br />

Il monitor su cui si visualizza il segnale video, deve avere un modo per sapere quando inizia<br />

un quadro e quando inizia ogni riga. Le pause necessarie al ritorno del pennello di scansione,<br />

vengono usate per sincronizzare la scansione stessa.<br />

31.6.3.3 Frequenza, durata e lunghezza<br />

La frequenza di dot-clock è una sorta di orologio che scandisce il tempo del segnale video. Un<br />

ciclo di questa frequenza rappresenta un punto dell’immagine. Questa frequenza si esprime<br />

in megahertz, per cui, una frequenza di dot-clock di 25,175 indica che in un secondo possono<br />

essere visualizzati 25175000 punti (si deve tenere presente che si tratta di valori teorici).<br />

Seguendo questo ragionamento, le «misure» dell’immagine potrebbero essere valutate in<br />

quantità di dot-clock.<br />

In tutto si utilizzano tre tipi di unità di misura per ciò che riguarda la composizione delle<br />

immagini: frequenze, riferite ai cicli di scansione delle righe e dei quadri; durate, riferite alle<br />

pause tra le righe e tra i quadri; lunghezze, pari alla traduzione di questi valori in unità di<br />

dot-clock.<br />

Ricapitolando quanto già esposto nella sezione precedente, l’immagine video è composta da<br />

quadri che a loro volta si scompongono in righe. Le righe vengono scandite a una certa frequenza,<br />

definita come frequenza orizzontale, e così anche i quadri, frequenza di quadro. Queste<br />

frequenze possono essere tradotte in «lunghezze», riferite a unità di dot-clock. Per esempio,<br />

la frequenza orizzontale di 31,5 kHz (31500 Hz), misurata con un dot-clock di 25,175 MHz,<br />

si traduce in una lunghezza di riga pari a 799,2 punti (25175000 / 31500 = 799,2).<br />

Quando si valutano grandezze riferite alla scansione verticale dell’immagine, per esempio la<br />

frequenza di quadro, si utilizzano lunghezze riferite al numero di righe. Continuando l’esempio<br />

precedente, se si aggiunge che la frequenza verticale è di 60 Hz, si determina che un quadro è<br />

composto da circa 419583 dot-clock, pari a circa 525 righe.<br />

Come già affermato, anche lo scorrere del tempo può essere valutato in unità dot-clock. Per<br />

esempio, un intervallo di tempo di 3,8 µs (microsecondi, ovvero milionesimi di secondo) è<br />

lungo 95,6 dot-clock (25175000 * 0,0000038 = 95,6).<br />

«


1748 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.6.3.4 Definizioni, concetti ed equazioni<br />

«<br />

La documentazione di XFree86 utilizza alcune definizioni che conviene elencare e chiarire.<br />

Le sigle indicate fanno volutamente riferimento a quelle utilizzate nel XFree86 Video Timings<br />

HOWTO.<br />

• Frequenza di sincronizzazione orizzontale, Horizontal sync frequency, HSF<br />

La frequenza di scansione orizzontale delle righe sullo schermo. Generalmente si tratta<br />

di una grandezza espressa in kilohertz.<br />

• Frequenza di sincronizzazione verticale, Vertical sync frequency, VSF<br />

La frequenza di scansione verticale dei semiquadri, o dei quadri, sullo schermo. Quando<br />

l’immagine viene composta attraverso semiquadri interlacciati, si tratta della frequenza<br />

di scansione dei semiquadri stessi, altrimenti si tratta della stessa frequenza di scansione<br />

dei quadri interi.<br />

• Frequenza di quadro, frequenza di frame, Vertical refresh rate, RR<br />

La frequenza di scansione verticale dei quadri interi (frame).<br />

• Frequenza di dot-clock, Dot-clock frequency, DCF<br />

La frequenza di dot-clock, espressa generalmente in megahertz.<br />

• Ampiezza di banda video, Video bandwidth, VB<br />

La frequenza massima per il segnale video accettato dal monitor. Questo valore dovrebbe<br />

essere maggiore o uguale a quello del dot-clock, ma anche valori inferiori a questo<br />

permettono ugualmente di vedere qualcosa. In generale, il livello minimo dell’ampiezza<br />

di banda deve essere almeno superiore alla metà della frequenza di dot-clock.<br />

• Ampiezza orizzontale, Horizontal frame length, HFL<br />

Si tratta della lunghezza totale di una riga, espressa in dot-clock. Questa dimensione deve<br />

includere la parte visibile e la pausa prima dell’inizio della riga successiva.<br />

• Ampiezza verticale, Vertical frame length, VFL<br />

Si tratta dell’altezza totale di un quadro intero, espressa in righe. Questa dimensione deve<br />

includere la parte visibile e la pausa prima dell’inizio del quadro successivo.<br />

• Risoluzione orizzontale, Horizontal resolution, HR<br />

La risoluzione orizzontale, espressa in punti o dot-clock, della parte visibile dell’immagine.<br />

Per definizione, si tratta di un valore inferiore dell’ampiezza orizzontale<br />

(HFL).<br />

• Risoluzione verticale, Vertical resolution, VR<br />

La risoluzione verticale, espressa in righe, della parte visibile dell’immagine.<br />

definizione, si tratta di un valore inferiore dell’ampiezza verticale (VFL).<br />

Alcune equazioni elementari possono aiutare a collegare i vari pezzi del mosaico.<br />

• HSF = DCF / HFL<br />

La frequenza di scansione orizzontale equivale alla frequenza di dot-clock divisa per la<br />

lunghezza completa della riga (espressa in dot-clock).<br />

Per


X 1749<br />

• RR = DCF / (HFL * VFL)<br />

La frequenza di scansione di un quadro intero equivale alla frequenza di dot-clock divisa<br />

per il prodotto della lunghezza completa della riga e il numero complessivo delle righe.<br />

La frequenza di sincronizzazione verticale è pari al doppio di RR quando si utilizzano<br />

semiquadri interlacciati, altrimenti corrisponde al valore di RR.<br />

• DCF = RR * HFL * VFL<br />

Derivata dalla precedente. La frequenza di dot-clock si ottiene con il prodotto della<br />

frequenza di scansione di un quadro intero, la lunghezza completa della riga e il numero<br />

complessivo delle righe.<br />

31.6.3.5 Multipli di otto e rapporto 4/3<br />

Una particolarità comune dei valori che riguardano la risoluzione di un’immagine, è l’essere<br />

un multiplo di otto. Se si osserva, valori come 640×480, 800×600, 1024×768,... sono numeri<br />

divisibili per otto, senza lasciare alcun resto.<br />

Un gran numero di adattatori grafici accetta determinati tipi di valori solo se sono multipli di<br />

otto. Per questo, in generale, per tutte le «lunghezze» orizzontali, quindi ciò che si esprime<br />

in punti o in dot-clock e riguarda la riga, si deve avere l’accortezza di usare multipli di otto.<br />

Questo particolare viene chiarito meglio in seguito.<br />

Data la tradizione televisiva, il formato più comune della visualizzazione su monitor è 3/4,<br />

cioè la risoluzione verticale (il numero delle righe visibili) è il 75 % rispetto alla risoluzione<br />

orizzontale (il numero di punti visibili per riga). Questa regola non è obbligatoria. L’unico<br />

vincolo sono i multipli di otto per le grandezze che riguardano la scansione orizzontale.<br />

31.6.3.6 Utilizzo della memoria video<br />

L’immagine che appare sullo schermo di un monitor viene generata all’interno di una matrice<br />

contenuta in una memoria, che poi viene scandita nel modo che è stato spiegato. All’interno<br />

di questa memoria si deve conservare solo la parte di immagine visibile effettivamente,<br />

escludendo le pause inserite per facilitare il compito del pennello di scansione del monitor.<br />

La memoria disponibile pone un limite alla risoluzione massima e alla profondità dell’immagine.<br />

A seconda del numero di colori o di sfumature che si vogliono rappresentare, deve essere<br />

impiegato un numero più o meno grande di bit per ogni punto dell’immagine. Se n è il numero<br />

di bit messo a disposizione per ogni punto, il numero di colori o sfumature disponibile è di 2 n .<br />

Nello stesso modo, conoscendo la memoria disponibile e la risoluzione che si vuole ottenere,<br />

si determina quanti siano i colori ottenibili per ogni punto.<br />

Per esempio, se si dispone di 1 Mibyte, pari a 1048576 byte, cioè 8388608 bit, volendo<br />

ottenere una risoluzione (visibile) di 800×600 punti, si ottiene che per ogni punto sarebbero<br />

disponibili 17 bit (8388608 / (800 * 600)).<br />

Tuttavia, di solito, il numero di bit che può essere utilizzato per definire la profondità di un’immagine<br />

è limitato a valori ben precisi: 2 bit (bianco/nero), 4 bit (16 colori), 8 bit (256 colori),<br />

16 bit (64 Kicolori), 24 bit (16 Micolori), 32 bit (4 Micolori),...<br />

«<br />

«<br />

Si osservi che in alcune circostanze, vale anche per la profondità di colori la regola del<br />

multiplo di otto; per esempio, di solito si ha a che fare con profondità da 8 bit, 16 bit, 24 bit<br />

e 32 bit.


1750 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.6.3.7 Impulsi di sincronismo<br />

«<br />

Fino a questo momento sono state descritte le immagini video come qualcosa formato da righe<br />

visibili, collegate tra loro da delle pause, a formare dei quadri (o dei semiquadri), i quali si<br />

collegano tra loro con delle pause più grandi. Quando si è accennato ai concetti di ampiezza<br />

orizzontale e verticale, si è sottolineato il fatto che queste grandezze devono includere anche<br />

le pause relative.<br />

Ma le pause da sole non bastano. Al loro interno si inseriscono degli impulsi di sincronismo,<br />

senza i quali queste non sarebbero riconosciute dal monitor.<br />

|Figura 31.73. Righe e impulsi di sincronismo.<br />

L’impulso di sincronismo orizzontale ha una durata che può variare da monitor a monitor,<br />

ma in ogni caso si esprime in un’unità di tempo che resta costante al variare della frequenza<br />

dot-clock. Generalmente sono accettabili valori compresi tra 3,5 µs e 4,0 µs (microsecondi).<br />

La figura 31.73 mostra schematicamente gli elementi che compongono una riga completa:<br />

la parte visibile, definita come risoluzione orizzontale (HR), un tempo di guardia precedente<br />

all’impulso di sincronismo (HTG), l’impulso di sincronismo (HSP), un tempo di guardia finale.<br />

Quindi ricomincia un’altra riga.<br />

Il tempo di guardia iniziale e finale è importante come l’impulso di sincronismo, tuttavia viene<br />

definito normalmente in modo approssimativo, salvo aggiustamenti successivi. In generale, un<br />

tempo di guardia medio di 30 dot-clock dovrebbe andare bene. È importante osservare subito<br />

che di solito il tempo di guardia iniziale e finale non sono simmetrici.<br />

In maniera analoga funziona il sincronismo verticale. Si ha un tempo di guardia iniziale (VTG,<br />

Vertical time guard), un impulso di sincronismo verticale (VSP) e un tempo di guardia finale.<br />

L’impulso di sincronismo dovrebbe oscillare tra i 50 µs e i 300 µs (microsecondi).


X 1751<br />

31.6.3.8 Tradurre i valori in unità dot-clock e in quantità di righe<br />

La definizione dei vari elementi che compongono l’immagine deve essere fatta attraverso due<br />

unità di misura uniformi: dot-clock per ciò che riguarda la scansione orizzontale e righe per la<br />

scansione verticale.<br />

Si è accennato al fatto che il tempo di guardia orizzontale può aggirarsi attorno a un valore di<br />

30 dot-clock, senza bisogno di fare altri calcoli, mentre il problema si pone per trasformare il<br />

tempo dell’impulso di sincronismo in dot-clock. Basta moltiplicare la frequenza di dot-clock<br />

per il tempo. La frequenza è espressa in hertz e il tempo in secondi.<br />

Lunghezza in dot-clock = DCF * tempo<br />

Per riprendere un esempio già fatto, se si utilizza una frequenza di dot-clock di 25,175 MHz e<br />

si vuole misurare un intervallo di 3,8 µs, si ottiene una lunghezza di 95,6 dot-clock (25175000<br />

* 0,0000038).<br />

«<br />

Il vero problema, quando si fa riferimento a grandezze orizzontali, è il fatto che queste<br />

devono essere espresse in multipli di otto. Molte approssimazioni nei calcoli relativi, che<br />

per il momento non sono ancora state mostrate, derivano da questa esigenza.<br />

Il tempo di guardia verticale, a seconda del tipo di monitor utilizzato, potrebbe essere assente<br />

del tutto, oppure potrebbe essere richiesto un massimo di tre righe. Eventualmente, un tempo<br />

di guardia maggiore del necessario, non può essere dannoso.<br />

Il calcolo della lunghezza dell’impulso di sincronismo verticale, in termini di righe, è un po’<br />

più complesso. Uno dei modi possibili è quello di definire prima la lunghezza in dot-clock e<br />

quindi di convertirla in righe, dividendo questo valore per la lunghezza complessiva della riga.<br />

Lunghezza VSP = ( DCF * tempo ) / HFL<br />

Riprendendo l’esempio precedente, aggiungendo che una riga ha la lunghezza complessiva<br />

di 800 dot-clock, volendo calcolare un impulso di sincronismo verticale di 64 µs circa, si<br />

ottengono due righe ((25175000 * 0,000064) / 800).<br />

31.6.4 Configurazione della sezione «Monitor» di «XF86Config»<br />

Quanto descritto fino a questo momento serve per chiarire il significato delle direttive contenute<br />

nella sezione ‘Monitor’ del file di configurazione di XFree86: ‘/etc/X11/XF86Config’.<br />

Viene proposto un esempio:<br />

«


1752 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Section "Monitor"<br />

| Identifier "Monitor generico"<br />

| HorizSync 31.5, 35.15<br />

| VertRefresh 50-70<br />

|<br />

| # 640x400 @ 70 Hz, 31.5 kHz hsync<br />

| Modeline "640x400" 25.175 640 664 760 800 400 409 411 450<br />

|<br />

| # 640x480 @ 60 Hz, 31.5 kHz hsync<br />

| Modeline "640x480" 25.175 640 664 760 800 480 491 493 525<br />

|<br />

| # 800x600 @ 56 Hz, 35.15 kHz hsync<br />

| Modeline "800x600" 36 800 824 896 1024 600 601 603 625<br />

|EndSection<br />

Si deve osservare che ogni direttiva ‘Modeline’, o la sua equivalente ‘Mode’, contiene tutte le<br />

informazioni necessarie sul funzionamento del monitor in corrispondenza a quella particolare<br />

modalità. Questo significa che le direttive ‘HorizSync’ e ‘VertRefresh’ sono solo un’informazione<br />

aggiuntiva che serve a permettere un controllo incrociato. Per essere più precisi,<br />

il file ‘/etc/X11/XF86Config’ potrebbe contenere informazioni su molte modalità di visualizzazione,<br />

che vengono selezionate in base alle limitazioni poste dalle direttive ‘HorizSync’<br />

e ‘VertRefresh’.<br />

31.6.4.1 Scomposizione delle informazioni<br />

«<br />

La direttiva ‘Modeline’ contiene una serie di notizie che è necessario distinguere per poterne<br />

conoscere il significato.<br />

|<br />

|Modeline nome freq_dot_clock informazioni_scansione_orizz informazioni_scansione_vert opzioni...<br />

|<br />

In particolare, le informazioni sulla scansione orizzontale e quelle sulla scansione verticale<br />

sono una coppia di quattro numeri distinti (otto in tutto).<br />

|# nome dot scansione scansione<br />

|# modalità clock orizzontale verticale<br />

|# ------------------ ------------------<br />

|Modeline "640x480" 25.175 640 664 760 800 480 491 493 525<br />

Le opzioni sono delle parole chiave che possono apparire in coda, in presenza di occasioni<br />

particolari, secondo quanto descritto nella documentazione del servente grafico che si utilizza.<br />

È bene ripetere che la direttiva ‘Modeline’ potrebbe essere sostituita con Mode, una specie di<br />

sottosezione molto più leggibile.


X 1753<br />

|<br />

|Mode nome<br />

| DotClock frequenza_dot_clock<br />

| HTimings informazioni_scansione_orizzontale<br />

| VTimings informazioni_scansione_verticale<br />

| [Flags opzioni... ]<br />

|EndMode<br />

|<br />

Segue l’esempio già mostrato sopra.<br />

|Mode "640x480"<br />

| DotClock 25.175<br />

| HTimings 640 664 760 800<br />

| VTimings 480 491 493 525<br />

|EndMode<br />

31.6.4.2 Scansione orizzontale<br />

I quattro valori indicati nella direttiva ‘HTimings’, o quelli che appaiono subito dopo la<br />

frequenza di dot-clock nella direttiva ‘Modeline’, rappresentano i tempi della scansione<br />

orizzontale, espressi in unità di dot-clock.<br />

«<br />

|<br />

|risoluzione_orizzontale inizio_sinc fine_sinc ampiezza_orizzontale<br />

|<br />

In pratica, seguendo l’esempio già mostrato, «640 664 760 800» indica che: la risoluzione<br />

orizzontale è di 640 punti, o dot-clock, l’impulso di sincronismo orizzontale inizia in corrispondenza<br />

del 664-esimo dot-clock e termina con il 760-esimo dot-clock, infine la lunghezza<br />

complessiva della riga è di 800 punti.<br />

Con qualche conto si scopre che la frequenza orizzontale necessaria per la scansione con questa<br />

modalità è di 31,5 kHz (25175000 / 800) e che la durata dell’impulso di sincronismo è di 3,8 µs<br />

((760 − 664) / 25175000).<br />

La cosa più importante da osservare è che tutti i valori sono divisibili per otto.<br />

31.6.4.3 Scansione verticale<br />

I quattro valori indicati nella direttiva ‘VTimings’, o gli ultimi quattro valori della direttiva<br />

‘Modeline’, rappresentano i tempi della scansione verticale, espressi in quantità di righe.<br />

«<br />

|<br />

|risoluzione_verticale inizio_sinc fine_sinc ampiezza_verticale<br />

|<br />

In pratica, seguendo l’esempio già mostrato, «480 491 493 525» indica che: la risoluzione<br />

verticale è di 480 righe, l’impulso di sincronismo verticale inizia in corrispondenza della 491-<br />

esima riga (ideale) e termina con la 493-esima, infine l’altezza complessiva del quadro è di<br />

525 righe.


1754 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Con qualche conto si scopre che la frequenza verticale (del quadro intero) necessaria per la<br />

scansione con questa modalità è di 70 Hz (25175000 / (800 * 525)) e che la durata dell’impulso<br />

di sincronismo è di 64 µs ((493 − 491) * 800 / 25175000).<br />

La frequenza dei semiquadri è doppia, quando si utilizza una modalità interlacciata. Questo<br />

va tenuto in considerazione, perché è la frequenza dei semiquadri quella che viene presa in<br />

considerazione nella direttiva ‘VertRefresh’.<br />

31.6.4.4 Interlacciamento<br />

«<br />

La predisposizione di una modalità interlacciata richiede solo due particolarità: che il numero<br />

complessivo delle righe (VFL) sia in numero dispari e che si aggiunga alla fine l’opzione<br />

‘Interlace’.<br />

|# 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync<br />

|Modeline "1024x768" 44.9 1024 1048 1208 1264 768 776 784 817 Interlace<br />

|<br />

|# 1152x864 @ 89 Hz interlaced, 44 kHz hsync<br />

|ModeLine "1152x864" 65 1152 1168 1384 1480 864 865 875 985 Interlace<br />

|<br />

|# 1280x1024 @ 87 Hz interlaced, 51 kHz hsync<br />

|Modeline "1280x1024" 80 1280 1296 1512 1568 1024 1025 1037 1165 Interlace<br />

I valori riferiti alla scansione verticale si riferiscono sempre al quadro intero, per cui, la frequenza<br />

di sincronizzazione verticale risulta doppia rispetto alla frequenza di quadro (refresh<br />

rate o frame rate).<br />

A questo si può aggiungere che la durata dell’impulso di sincronismo verticale dovrebbe essere<br />

doppia (o quasi) rispetto a quella necessaria in caso di scansione normale (non interlacciata).<br />

31.6.4.5 Adattamento delle configurazioni predefinite<br />

«<br />

Il file di configurazione di XFree86, ‘/etc/X11/XF86Config’, offre molti esempi validi di<br />

configurazione del monitor, ma non tutti i casi possibili e immaginabili. Uno degli elementi<br />

che può creare disturbo è proprio la frequenza di dot-clock.<br />

È già stato spiegato che il servente grafico, usato con l’opzione ‘-probeonly’, può dare tante<br />

informazioni utili sull’adattatore grafico utilizzato. Tra le altre cose, dovrebbe essere in grado<br />

di informare sulle frequenze di dot-clock disponibili. Quello che si vede dall’esempio è l’informazione<br />

sul dot-clock di un elaboratore portatile Zenith (Z*Star 433VL), ottenuto da un<br />

servente XFree86 versione 3.*.<br />

|(--) VGA16: clocks: 28.32 28.32 28.32 28.32<br />

Potrebbe nascere un problema se si tratta di frequenze fisse che non corrispondono ad alcuna<br />

modalità predefinita del file di configurazione; proprio come nel caso dell’esempio.<br />

Intuitivamente, si può cercare di adattare una modalità che abbia una frequenza di dot-clock<br />

abbastanza vicina. Osservando il file di configurazione predefinito si possono trovare queste<br />

due modalità.


X 1755<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 25.175 640 664 760 800 480 491 493 525<br />

|<br />

|# 640x480 @ 72 Hz, 36.5 kHz hsync<br />

|Modeline "640x480" 31.5 640 680 720 864 480 488 491 521<br />

Anche se non si conosce nulla delle caratteristiche del monitor (in questo caso è quello del<br />

portatile, un LCD) si può azzardare l’idea che delle frequenze orizzontali e verticali comprese<br />

tra i valori di questi esempi, non dovrebbero creare problemi (la frequenza orizzontale di<br />

31,5 kHz è quella più bassa in assoluto rispetto a tutte le modalità predefinite). Si procede per<br />

tentativi.<br />

Evidentemente, dagli esempi proposti, ci si accontenta di una risoluzione di 640×480 punti,<br />

quindi questi valori sono noti. Inoltre, si può decidere di mantenere le stesse frequenze di<br />

sincronizzazione verticale e orizzontale dell’esempio già visto che utilizzava una frequenza<br />

di dot-clock leggermente più bassa. Così facendo, la pausa tra una riga e l’altra dovrebbe<br />

aumentare, come probabilmente anche la pausa tra un quadro e l’altro.<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 28.32 640 ??? ??? ??? 480 ??? ??? ???<br />

Conoscendo la frequenza di scansione orizzontale, si calcola la dimensione complessiva della<br />

riga: 28320000 / 31500 = 899, ma questo numero deve essere divisibile per otto, così si sceglie<br />

il valore 896. Nello stesso modo si calcola il numero di righe complessivo che compone un<br />

quadro: (28320000 / 896) / 60 = 526,78, ma si sceglie di approssimare per difetto (al massimo,<br />

la frequenza verticale diviene leggermente più alta di 60 Hz).<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 28.32 640 ??? ??? 896 480 ??? ??? 526<br />

Adesso è la volta di determinare la durata dell’impulso di sincronismo orizzontale. Dovrebbe<br />

essere di circa 4 µs: 28320000 * 0,000004 = 113 dot-clock. Il problema adesso è quello di<br />

trovare qualcosa di soddisfacente che sia divisibile per otto.<br />

((896 − 640) − 113) / 2 = 71,5<br />

640 + 71 = 711; il valore più vicino che sia divisibile per otto è 712.<br />

712 + 113 = 825; il valore più vicino che sia divisibile per otto è 824.<br />

896 − 824 = 72, che rende il tempo di guardia perfettamente simmetrico (è stato solo un caso).<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 28.32 640 712 824 896 480 ??? ??? 526<br />

Restano i dati sulla durata dell’impulso di sincronismo verticale. Dal momento che la differenza<br />

rispetto all’esempio di riferimento non è molto grande, si può provare un po’ a occhio,<br />

salvo verificare con la calcolatrice.<br />

|# 640x480 @ 60 Hz, 31.5 kHz hsync<br />

|Modeline "640x480" 28.32 640 712 824 896 480 491 494 526<br />

Con questi valori, l’impulso di sincronismo dura 95 µs ((494 − 491) * 896 / 28320000),<br />

perfettamente accettabile.


1756 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Volendo verificare la frequenza orizzontale e verticale per sicurezza, si ottengono 31,58 kHz e<br />

60,08 Hz, valori leggermente differenti rispetto a quelli di partenza, ma sicuramente tollerabili.<br />

«<br />

«<br />

31.6.5 Rifiniture<br />

I valori che si calcolano a tavolino, non possono essere sempre perfetti al primo colpo. Se<br />

tutto va bene, può capitare che l’immagine appaia un po’ troppo spostata rispetto al centro<br />

dello schermo. Di certo si possono utilizzare i controlli del monitor per spostarla, ma a volte<br />

non conviene esagerare, dovendo trovare un compromesso tra la visualizzazione di schermate<br />

a caratteri e l’uso di X.<br />

Quello che bisogna fare è ritoccare le dimensioni degli impulsi di sincronismo, oltre a cercare<br />

la loro collocazione ideale. Per questo però, viene in aiuto un programma apposito, che<br />

permette di verificare al volo valori differenti. Si tratta di ‘xvidtune’.<br />

31.6.5.1 Utilizzo di «xvidtune»<br />

Il programma ‘xvidtune’ 12 permette di verificare la configurazione delle modalità video utilizzabili<br />

attraverso il servente X attivo. Generalmente viene avviato senza opzioni, ottenendo<br />

un funzionamento interattivo:<br />

|<br />

|xvidtune [opzioni] |<br />

|Figura 31.84. Aspetto del programma ‘xvidtune’.<br />

Come si può osservare dalla figura, i controlli dal lato sinistro riguardano la scansione orizzontale,<br />

mentre quelli del lato destro quella verticale. In basso a destra si può tenere sotto controllo<br />

il valore della frequenza di dot-clock (pixel clock), della frequenza di sincronizzazione<br />

orizzontale e verticale.


X 1757<br />

Al posto di utilizzare le barre si scorrimento, si possono selezionare i pulsanti grafici corrispondenti<br />

all’azione che si vuole ottenere: LE F T dovrebbe spostare l’immagine a sinistra, RI G H T a<br />

destra, WI D E R dovrebbe allargare l’immagine, e NA R R O W E R dovrebbe restringerla.<br />

Per verificare l’effetto delle modifiche, basta selezionare il pulsante grafico TE S T .<br />

I pulsanti grafici NE X T e PR E V permettono di passare alla modalità grafica successiva (quella<br />

che si otterrebbe con la combinazione [ Ctrl Alt + ]) e precedente ([ Ctrl Alt - ]).<br />

31.6.6 Altri programmi affini<br />

«<br />

• modeline(1) 13<br />

Si tratta di un programma che calcola i valori da associare alla direttiva ‘Modeline’,<br />

oppure ‘Mode’, dei programmi che usano la grafica e devono sapere come gestire la<br />

scansione dell’immagine.<br />

31.7 La tastiera e la sua configurazione «elementare»<br />

La configurazione della tastiera con X è un problema molto delicato, che normalmente si<br />

risolve semplicemente utilizzando le opzioni che sono già state stabilite; tuttavia, manca<br />

una documentazione adeguata e coerente per le opzioni esistenti e ancora di più manca una<br />

documentazione sufficiente per poter gestire in proprio una mappa autonoma della tastiera.<br />

Si tenga in considerazione che, a causa della complessità del sistema di gestione della tastiera<br />

di XFree86 e di X.Org, le indicazioni che appaiono in questo capitolo possono essere imprecise<br />

o troppo semplificate.<br />

«<br />

31.7.1 Livelli, tasti morti, composizione e gruppi<br />

La tastiera dell’elaboratore deriva concettualmente da quella delle prime macchine da scrivere,<br />

con le quali ogni tasto poteva generare due simboli diversi, alzando o abbassando il blocco<br />

dei martelli. Per questa ragione, nelle tastiere per elaboratore di lingua inglese i tasti delle<br />

maiuscole si chiamano shift, perché spostano virtualmente questi martelli. Secondo lo standard<br />

ISO 9995, la selezione di un simbolo in base al meccanismo che normalmente è controllato<br />

attraverso il tasto delle maiuscole, avviene in base a dei livelli. In pratica, su uno stesso tasto<br />

ci può essere una lettera minuscola o maiuscola, o comunque due simboli differenti, in base<br />

alla selezione del livello appropriato.<br />

«<br />

Lo standard ISO 9995 considera che i livelli possano essere anche più di due; per esempio su<br />

diverse tastiere europee si ottiene la selezione di un terzo livello usando una combinazione<br />

con il tasto [ AltGr ]. Con XFree86 e X.Org si gestiscono normalmente quattro livelli, ma<br />

bisogna tenere premuto inizialmente il tasto [ AltGr ] e aggiungere eventualmente il tasto<br />

[ Maiuscole ] subito dopo, per raggiungere il quarto livello.<br />

Generalmente, con l’uso dei vari livelli disponibili dovrebbe essere possibile esaurire l’insieme<br />

dei simboli necessari a una certa lingua; tuttavia spesso si utilizzano altre due tecniche per<br />

facilitare l’inserimento di caratteri particolari: tasti morti che servono ad accentare la lettera


1758 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

successiva e sequenze di composizione. Nel primo caso, la pressione di un tasto (direttamente<br />

o attraverso la selezione del livello appropriato) non genera alcun carattere, in attesa del tasto<br />

successivo: se l’associazione tra i due è valida si ottiene la lettera accentata corrispondente.<br />

Nel secondo caso viene utilizzato un tasto per richiedere espressamente una modalità di composizione,<br />

a cui segue l’inserimento di una sequenza di simboli appropriati: se la sequenza<br />

viene riconosciuta, si ottiene un carattere «composto».<br />

Nelle mappe europee comuni, XFree86 e X.Org offrono la funzione di composizione nel<br />

livello due del tasto [ AltGr ], ovvero con la combinazione [ Maiuscole AltGr ]. Quello che si<br />

deve osservare è che la combinazione deve iniziare con la pressione di [ Maiuscole ], perché<br />

facendo il contrario, si selezionerebbe invece il quarto livello.<br />

Per poter selezionare un insieme di simboli differente, si possono definire dei gruppi alternativi,<br />

da attivare a scelta. Per esempio, associando a un primo gruppo la mappa della tastiera<br />

italiana e a un secondo la mappa francese, in corrispondenza di un tasto si potrebbe ottenere sia<br />

la lettera «a» minuscola e maiuscola (tastiera italiana), sia la lettera «q» minuscola e maiuscola<br />

(tastiera francese).<br />

|Figura 31.85. Esempio di un tasto con due gruppi, ognuno con due livelli: la lettera «a»<br />

appartiene al primo livello del primo gruppo; la lettera «A» appartiene al secondo livello<br />

del primo gruppo; la lettera «q» appartiene al primo livello del secondo gruppo; la lettera<br />

«Q» appartiene al secondo livello del secondo gruppo.<br />

XFree86 e X.Org gestiscono facilmente fino a quattro gruppi, ma quello che conta è avere il<br />

mezzo per selezionarli.<br />

Come è noto, quando i due livelli servono a selezionare la stessa lettera, ma in forma<br />

minuscola o maiuscola, di norma sul tasto fisico della tastiera appare solo il simbolo<br />

corrispondente alla lettera maiuscola.<br />

Come si intende facilmente, per ottenere il passaggio a un livello o a un gruppo differente da<br />

quello attivo, si devono usare tasti o combinazioni di tasti appropriati. I tasti usati per questo<br />

scopo vengono chiamati normalmente modificatori.


X 1759<br />

|Figura 31.86. Normalmente XFree86 e X.Org gestiscono quattro livelli. Quello che si<br />

vede in questa figura è il confronto tra il gruppo ‘it’ e ‘fr’ per lo stesso tasto.<br />

|Riquadro 31.87. Confusione tra livelli e gruppi.<br />

La complessità della configurazione della tastiera con XFree86 e X.Org è tale per cui tra gruppi e<br />

livelli si crea un po’ di confusione. Infatti, di solito la definizione dei simboli associati ai livelli<br />

superiori al secondo avviene incorporando quelli di un altro gruppo. Pertanto, i gruppi vanno<br />

considerati in base al contesto e non in senso «assoluto», tenendo conto che il cambiamento di<br />

gruppo può voler dire che si sta passando al terzo livello, oppure che si sta scambiando la mappa<br />

attuale con quella di un’altra lingua.<br />

È bene osservare che, a seconda di come è configurata la tastiera, il tasto [ Fissamaiuscole ] può<br />

avere funzionalità diverse, anche se intuitivamente ciò non si dovrebbe apprezzare. In pratica,<br />

in alcune tastiere europee, come nel caso di quella francese, la pressione di questo tasto attiva<br />

e mantiene il secondo livello, come se fosse sempre premuto il tasto delle maiuscole normale;<br />

in altri casi, come avviene nella tastiera statunitense e derivate (compresa quella italiana), il<br />

comportamento è diverso. Infatti, in questi casi ciò che si vuole è di ottenere le lettere maiuscole<br />

solo nella porzione alfanumerica della tastiera, mentre il resto dei simboli deve essere<br />

accessibile nella stessa modalità di prima; inoltre, se si preme il tasto delle maiuscole, si vuole<br />

che il risultato che si ottiene quando il tasto [ Fissamaiuscole ] è inserito sia di nuovo di lettere<br />

minuscole. Per questo tipo di trasformazioni, pertanto, il tasto [ Fissamaiuscole ] inserito non serve<br />

a richiedere il cambiamento di livello, ma la trasformazione della lettera da minuscola a<br />

maiuscola, o viceversa.<br />

Questa caratteristica è molto importante e permette di capire il motivo, per cui, nella configurazione<br />

della tastiera italiana, si ottengono le lettere accentate maiuscole inserendo<br />

proprio il [ Fissamaiuscole ].


1760 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.7.2 Configurazione elementare<br />

«<br />

La configurazione della mappa della tastiera si fa normalmente all’interno del file di configurazione<br />

di X (‘/etc/X11/XF86Config’, ‘XF86Config-4’ o ‘xorg.conf’, a seconda dei casi)<br />

e si può alterare durante il funzionamento con l’aiuto del programma ‘setxkbmap’. 14 Nella<br />

situazione più semplice si fa riferimento a un modello di tastiera attraverso le indicazioni<br />

contenute nei file della directory ‘/usr/lib/X11/xkb/rules/’, ovvero ‘/etc/X11/xkb/<br />

rules/’. Per esempio, si potrebbero leggere le direttive seguenti nel file di configurazione di<br />

X:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbRules" "xorg"<br />

| Option "XkbModel" "pc102"<br />

| Option "XkbLayout" "it"<br />

| Option "XkbVariant" "basic"<br />

|EndSection<br />

Le direttive significative dell’esempio sono quelle riferite alle opzioni che iniziano con la sigla<br />

‘Xkb’. L’opzione ‘XkbRules’ dichiara delle «regole» generali; nella maggior parte dei casi<br />

va bene indicare la sigla ‘xorg’, che richiama l’utilizzo dei file ‘xkb/rules/xorg’ e ‘xkb/<br />

rules/xorg.lst’.<br />

Seguendo l’esempio, all’interno del file ‘xkb/rules/xorg.lst’ si possono individuare tutte<br />

le voci che possono essere utilizzate per l’opzione ‘XkbModel’:<br />

|! model<br />

| pc101 Generic 101-key PC<br />

| pc102 Generic 102-key (Intl) PC<br />

| pc104 Generic 104-key PC<br />

| pc105 Generic 105-key (Intl) PC<br />

|...<br />

|...<br />

| trust Trust Wireless Keyboard Classic<br />

| trustda Trust Direct Access Keyboard<br />

| yahoo Yahoo! Internet Keyboard<br />

Nell’esempio si vede la selezione di una tastiera a 102 tasti tradizionale (ovvero una tastiera<br />

AT europea senza i tasti «win» e «menù»). Proseguendo, si vede l’opzione ‘XkbLayout’ a<br />

cui viene attribuita la voce ‘it’, che presumibilmente serve a individuare una mappa adatta<br />

alla lingua italiana. Anche la disponibilità di queste sigle dipende dal contenuto del file ‘xkb/<br />

rules/xorg.lst’, che a questo proposito si può mostrare così:


X 1761<br />

|! layout<br />

| us U.S. English<br />

| en_US U.S. English w/ ISO9995-3<br />

| us_intl U.S. English w/ deadkeys<br />

| al Albanian<br />

|...<br />

|...<br />

| it Italian<br />

| jp Japanese<br />

| kan Kannada<br />

|...<br />

|...<br />

| yu Yugoslavian<br />

| nec/jp PC-98xx Series<br />

La disposizione dei tasti associata alla sigla assegnata all’opzione ‘XkbLayout’ può prevedere<br />

delle varianti e se necessario quella preferita va specificata con l’opzione ‘XkbVariant’.<br />

Nell’esempio la dichiarazione riferita all’opzione ‘XkbVariant’ è perfettamente inutile, dal<br />

momento che con la parola chiave ‘basic’ non si specifica alcunché. Eventualmente, nel<br />

file ‘xkb/rules/xorg.lst’ si può vedere quali varianti sono disponibili, ammesso che<br />

funzionino:<br />

|! variant<br />

| nodeadkeys Eliminate dead keys<br />

Volendo gestire più gruppi di simboli, si possono indicare più alternative tra le opzioni di<br />

‘XkbLayout’, come nell’esempio seguente:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbRules" "xorg"<br />

| Option "XkbModel" "pc102"<br />

| Option "XkbLayout" "it,fr,de"<br />

| Option "XkbVariant" "basic,basic,basic"<br />

| Option "XkbOptions" "grp:alt_shift_toggle"<br />

|EndSection<br />

In questa circostanza, si vogliono gestire tre mappe alternative: italiana, francese e tedesca<br />

(se ne possono gestire al massimo quattro). Per passare da un gruppo al successivo si deve<br />

usare la combinazione di tasti [ Alt Maiuscole ] (è indifferente se si tratta di quelli a sinistra o a<br />

destra), come si intuisce dall’opzione ‘XkbOptions’. Anche per sapere cosa si può usare per<br />

selezionare un gruppo si deve consultare il file ‘xkb/rules/xorg.lst’:


1762 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|! option<br />

| grp Group Shift/Lock behavior<br />

| grp:switch R-Alt switches group while pressed<br />

| grp:lwin_switch Left Win-key switches group while pressed<br />

| grp:rwin_switch Right Win-key switches group while pressed<br />

| grp:win_switch Both Win-keys switch group while pressed<br />

| grp:toggle Right Alt key changes group<br />

| ...<br />

| ...<br />

| grp:ctrl_alt_toggle Alt+Control changes group<br />

| grp:alt_shift_toggle Alt+Shift changes group<br />

| grp:menu_toggle Menu key changes group<br />

| ...<br />

Con l’aggiunta di diverse voci nell’opzione ‘XkbLayout’, è stata ampliata nello stesso modo la<br />

voce relativa alle varianti. Nel caso una delle disposizioni richiedesse una variante particolare,<br />

si potrebbe inserire rispettando l’ordine:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbRules" "xorg"<br />

| Option "XkbModel" "pc102"<br />

| Option "XkbLayout" "it,fr,de"<br />

| Option "XkbVariant" "basic,nodeadkeys,basic"<br />

| Option "XkbOptions" "grp:alt_shift_toggle"<br />

|EndSection<br />

In questo caso si specifica la variante ‘nodeadkeys’ per la disposizione francese, che in pratica<br />

annulla l’uso dei tasti morti in quel contesto.<br />

In caso di difficoltà, l’opzione ‘XkbOptions’ può servire per specificare cosa usare per<br />

richiamare il terzo livello:


X 1763<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbRules" "xorg"<br />

| Option "XkbModel" "pc102"<br />

| Option "XkbLayout" "it,fr,de"<br />

| Option "XkbVariant" "basic,basic,basic"<br />

| Option "XkbOptions" "grp:alt_shift_toggle,lv3:switch"<br />

|EndSection<br />

In questo caso si dichiara che si vuole usare il tasto [ Ctrl ] alla destra per passare al terzo livello<br />

(quello che nel caso della tastiera italiana consente di ottenere simboli come la chiocciola e il<br />

cancelletto). Ecco cosa si vede a questo proposito nel file ‘xkb/rules/xorg.lst’, si tenga<br />

presente comunque che non è detto che tutte le alternative funzionino effettivamente:<br />

|! option<br />

| ...<br />

| ...<br />

| lv3 Third level choosers<br />

| lv3:switch Press Right Control to choose 3rd level<br />

| lv3:menu_switch Press Menu key to choose 3rd level<br />

| lv3:win_switch Press any of Win-keys to choose 3rd level<br />

| lv3:lwin_switch Press Left Win-key to choose 3rd level<br />

| lv3:rwin_switch Press Right Win-key to choose 3rd level<br />

| ...<br />

Per fare tutte queste cose durante il funzionamento di X (ammesso che la tastiera sia utilizzabile<br />

in qualche modo), si può usare il comando ‘setxkbmap’, come nell’esempio seguente, equivalente<br />

all’ultima situazione mostrata. Se si usa il comando al di fuori dell’ambiente grafico,<br />

occorre aggiungere l’opzione ‘-display’, per far sapere al programma dove intervenire.<br />

$ setxkbmap -rules xorg -model pc102 -layout "it,fr,de" ←↪<br />

↩→<br />

-variant basic -option "" -option "grp:alt_shift_toggle" ←↪<br />

↩→ -option "lv3:switch" [ Invio ]<br />

Si può comprendere come è stata usata l’opzione ‘-option’: la prima volta ha un argomento<br />

nullo per azzerare le opzioni; la seconda volta dichiara la combinazione da usare per cambiare<br />

gruppo; la terza volta dichiara l’uso del tasto [ Ctrl ] destro per accedere al terzo livello.<br />

In conclusione è bene osservare che ci sono delle disposizioni di tasti, come quella canadese<br />

(‘ca’) che definiscono autonomamente più di un gruppo. In questi casi diventa difficile<br />

o impossibile abbinarne altre in modo efficace. Eventualmente, dal momento che si tratta<br />

presumibilmente della sovrapposizione della disposizione statunitense con quella francese, si<br />

possono usare queste definizioni affiancate (‘Option "XkbLayout" "us,fr"’).


1764 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Tabella 31.97. Alcuni modelli comuni di tastiera.<br />

Denominazione Descrizione<br />

| pc101 La tastiera tradizionale di lingua inglese degli elaboratori «AT», in cui il tasto<br />

[ Alt ] destro viene usato normalmente con la stessa funzione di quello sinistro.<br />

| pc102 La tastiera tradizionale europea degli elaboratori «AT», in cui il tasto [ Alt ] destro<br />

serve normalmente per ottenere un terzo livello di simboli.<br />

La tastiera di lingua inglese degli elaboratori «AT» con estensioni per MS-<br />

| pc104 Windows (tre tasti in più), in cui il tasto [ Alt ] destro viene usato normalmente<br />

con la stessa funzione di quello sinistro.<br />

La tastiera europea degli elaboratori «AT» con estensioni per MS-Windows (tre<br />

| pc105 tasti in più), in cui il tasto [ Alt ] destro serve normalmente per ottenere un terzo<br />

livello di simboli.<br />

|Tabella 31.98. Alcune mappe di disposizione dei simboli.<br />

Mappa Descrizione Mappa Descrizione<br />

| al Albanese. | am Armena.<br />

| ar Araba. | az Azerbagiana.<br />

| be Belga. | bg Bulgara.<br />

| br Brasiliana. | bs Bosniaca.<br />

| by Bielorussa. | ca Canadese.<br />

| cz Ceca. | de Tedesca.<br />

| dk Danese. | ee Estone.<br />

| el Greca | es Spagnola.<br />

| fi Finlandese. | fr Francese.<br />

| gb Britannica. | hr Croata.<br />

| hu Ungherese. | il Israeliana.<br />

| ir Iraniana. | is Islandese.<br />

| it Italiana. | mk Macedone.<br />

| mn Mongola. | mt Maltese.<br />

| nl Olandese. | no Norvegese.<br />

| pl Polacca. | pt Portoghese.<br />

| ro Rumena. | ru Russa.<br />

| se Svedese. | si Slovena.<br />

| sk Slovacca. | sr Serba.


X 1765<br />

Mappa Descrizione Mappa Descrizione<br />

| tr Turca. | ua Ucraina.<br />

| us Statunitense. | us_intl Statunitense<br />

morti.<br />

con accenti<br />

| en_US Inglese generalizzato<br />

estensioni ISO 9995.<br />

con<br />

31.7.3 Geometria<br />

Tra i file che descrivono i vari tipi di tastiera disponibili con X, ne esiste un gruppo che serve<br />

a ottenere una mappa stampata della disposizione dei tasti, con l’aiuto del programma<br />

‘xkbprint’. 15 Questo programma, oltre alle opzioni eventuali, prevede l’indicazione obbligatoria<br />

delle coordinate dello schermo dal quale si vuole ottenere la mappa della configurazione<br />

attuale:<br />

«<br />

|<br />

|xkbprint [opzioni] schermo [file_da_generare] |<br />

Se non si indica il nome di un file da generare, il programma crea un file nella directory<br />

corrente che corrisponde al modello ‘server-n.estensione’, dove n descrive le coordinate<br />

dello schermo. La tabella successiva descrive alcune opzioni di ‘xkbprint’.<br />

|Tabella 31.99. Alcune opzioni.<br />

Opzione<br />

Descrizione<br />

| -color<br />

Genera un risultato con o senza<br />

| -mono colorazione dei tasti.<br />

Genera un risultato in formato EPS,<br />

| -eps altrimenti si ottiene un formato<br />

PostScript.<br />

L’opzione ‘-fit’, che è predefinita, fa<br />

| -fit<br />

in modo che il risultato sia contenuto<br />

in una pagina; con l’opzione ‘-full’<br />

| -full si ottiene un risultato delle dimensioni<br />

normali.<br />

|<br />

Consente di stabilire cosa si vuole vedere<br />

sui tasti: nulla, il nome, il codice<br />

-label none|name|code|symbols<br />

numerico o il simbolo.<br />

|<br />

Richiede di mostrare i simboli a<br />

-ll n<br />

partire dal livello n.<br />

|<br />

Si tratta di un modo alternativo per<br />

-o file<br />

indicare il file da generare.<br />

|<br />

-pict all|none|common<br />

Controlla la visualizzazione dei pittogrammi<br />

(secondo lo standard ISO<br />

9995-7). Con i tre argomenti alternativi<br />

si ottengono rispettivamente: tutti<br />

i pittogrammi, nessun pittogramma,<br />

solo quelli comuni.


1766 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Vengono mostrati alcuni esempi di utilizzo del programma ‘xkbprint’; successivamente<br />

appaiono alcune figure ottenute dalla configurazione di una mappa italiana a 102 tasti.<br />

• $ xkbprint -color -label symbols -ll 1 -pict all :0 tastiera.ps [ Invio ]<br />

Genera il file PostScript ‘tastiera.ps’, con il disegno della tastiera, usando il colori<br />

previsti, mostrando i simboli in corrispondenza dei tasti, partendo dal primo livello (predefinito),<br />

usando i pittogrammi standard per tutti i tasti con funzioni speciali. La mappa<br />

che si ottiene fa riferimento alle coordinate dello schermo ‘:0’, ovvero ‘:0.0’.<br />

• $ xkbprint -eps -color -label symbols -ll 1 -pict all ←↪<br />

↩→ :0 tastiera.eps [ Invio ]<br />

Come nell’esempio precedente, ma creando invece il file EPS ‘tastiera.eps’.<br />

• $ xkbprint -eps -color -label symbols -ll 1 -pict all :0 [ Invio ]<br />

Rispetto all’esempio precedente, non viene indicato il nome del file da creare, pertanto<br />

si ottiene il file ‘server-0.eps’.<br />

• $ xkbprint -color -label symbols -ll 3 -pict all :0 tastiera.ps [ Invio ]<br />

Questo esempio è simile al primo, dal quale si distingue per specificare la richiesta di<br />

utilizzare i simboli a partire dal terzo livello. In pratica, per la tastiera italiana e per<br />

altre tastiere europee, si tratta di quei simboli che si ottengono tenendo premuto il tasto<br />

[ AltGr ].<br />

• $ xkbprint -color -label code :0 tastiera.ps [ Invio ]<br />

Rispetto al primo esempio, viene generato un disegno contenente i codici numerici dei<br />

tasti.<br />

|Figura <strong>31.1</strong>00. ‘xkbprint -color -label symbols -ll 1 -pict all :0’


X 1767<br />

|Figura <strong>31.1</strong>01. ‘xkbprint -color -label symbols -ll 3 -pict all :0’<br />

|Figura <strong>31.1</strong>02. ‘xkbprint -color -label code :0’<br />

31.8 Configurazione più dettagliata della tastiera e del<br />

mouse<br />

XFree86 e X.Org prevedono un tipo di configurazione più dettagliato; eventualmente è possibile<br />

intervenire a livello brutale anche attraverso il programma ‘xmodmap’. In ogni caso,<br />

occorre ricordare che la configurazione della tastiera interferisce anche con quella del mouse;<br />

pertanto, un errore fatto da una parte può anche ripercuotersi dall’altra.<br />

Si tenga in considerazione che, a causa della complessità del sistema di gestione della tastiera<br />

di X, le indicazioni che appaiono in questo capitolo possono essere imprecise o troppo<br />

semplificate.<br />

«


1768 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.8.1 Componenti della configurazione<br />

«<br />

Nelle situazioni più comuni, i componenti usati da XFree86 e X.Org per la configurazione<br />

della tastiera e del mouse, si trovano a partire dalla directory ‘/usr/lib/X11/xkb/’, oppure<br />

da ‘/etc/X11/xkb/’. Per semplicità, qui vengono indicati percorsi del tipo ‘xkb/...’. I<br />

componenti principali sono cinque:<br />

1. i codici dei tasti (key code), annotati all’interno della directory ‘xkb/keycodes/’, dove<br />

si abbinano i codici numerici della tastiera a dei nomi simbolici, secondo la forma<br />

‘’;<br />

2. i tipi, annotati all’interno della directory ‘xkb/types/’, dove si definisce il<br />

comportamento dei tasti modificatori (quelli che servono a creare delle combinazioni);<br />

3. le mappe di compatibilità, annotate all’interno della directory ‘xkb/compatibility/’,<br />

dove si definiscono gli adattamenti da applicare quando i programmi non sono in grado<br />

di interpretare correttamente tutte le funzionalità disponibili;<br />

4. i simboli, annotate all’interno della directory ‘xkb/symbols/’, dove si definiscono i<br />

caratteri associati effettivamente ai nomi simbolici dei tasti;<br />

5. i disegni delle tastiere (geometry), annotati all’interno della directory ‘xkb/geometry/’,<br />

dove si descrivono le tastiere in modo da poterne riprodurre una mappa stampata.<br />

«<br />

31.8.2 Modificatori<br />

I modificatori sono i tasti o le combinazioni di tasti che servono a cambiare significato ad altri<br />

tasti. La configurazione di XFree86 e X.Org distingue tra modificatori reali e modificatori<br />

virtuali.<br />

I modificatori reali sono i tasti [ Maiuscole ], [ Fissamaiuscole ], [ Ctrl ] e altri cinque modificatori generici<br />

da stabilire, denominati ‘Mod1’, ‘Mod2’, ‘Mod3’, ‘Mod4’ e ‘Mod5’. A questi modificatori<br />

generici si possono associare tasti come [ Alt ], [ Meta ], [ BlocNum ], che in tal caso sono da considerare<br />

dei modificatori virtuali. Eventualmente, un modificatore virtuale può essere costituito<br />

in pratica da una combinazione di tasti.<br />

Storicamente, i modificatori presenti praticamente in tutte le tastiere sono solo i primi tre modificatori<br />

reali appena descritti; questo spiega la necessità di attribuire gli altri ai modificatori<br />

generici.<br />

31.8.3 Configurazione<br />

«<br />

La configurazione della tastiera può avvenire nel file ‘XF86Config’ in un modo più dettagliato<br />

rispetto a quanto si descrive di solito. Si osservi l’esempio seguente:


X 1769<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

|# Option "XkbKeycodes" "xfree86"<br />

| Option "XkbKeycodes" "xorg"<br />

| Option "XkbTypes" "default"<br />

| Option "XkbSymbols" "en_US(pc102)+it"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic+pc+iso9995"<br />

|EndSection<br />

Quello che si vede rappresenta una configurazione minima per l’utilizzo di una tastiera italiana<br />

tipica in un elaboratore x86 con X.Org. Le varie opzioni rappresentano le cinque componenti<br />

principali di configurazione, che si trovano all’interno dei file contenuti nelle directory<br />

‘xkb/keycodes/’, ‘xkb/types/’, ‘xkb/symbols/’, ‘xkb/geometry/’ e ‘xkb/compat/’<br />

rispettivamente.<br />

In questo caso, l’opzione ‘XkbKeycodes’ contiene il valore ‘xorg’, che rimanda ai file ‘xkb/<br />

rules/xorg’ e ‘xkb/rules/xorg.lst’; nel primo di questi due file c’è un riferimento<br />

esplicito alla voce ‘xfree86’ per ciò che riguarda i codici della tastiera di un elaboratore<br />

x86:<br />

|! model = keycodes<br />

| macintosh_old = macintosh<br />

| powerpcps2 = powerpcps2<br />

| pc98 = xfree98(pc98)<br />

| abnt2 = xfree86(abnt2)<br />

| jp106 = xfree86(jp106)<br />

| * = xfree86<br />

Ciò corrisponde a selezionare il file di configurazione ‘xkb/keycodes/xfree86’ che contiene<br />

l’abbinamento tra codici numerici della tastiera e codici simbolici, come si può vedere<br />

dall’estratto seguente:<br />

|default xkb_keycodes "xfree86" {<br />

| include "xfree86(basic)"<br />

| = 51;<br />

| = 94;<br />

|};<br />

|<br />

|xkb_keycodes "basic" {<br />

|<br />

| minimum= 8;<br />

| maximum= 255;<br />

|<br />

| = 49;


1770 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

| = 10;<br />

| = 11;<br />

| ...<br />

| indicator 1 = "Caps Lock";<br />

| indicator 2 = "Num Lock";<br />

| indicator 3 = "Scroll Lock";<br />

|<br />

| alias = ;<br />

|};<br />

|...<br />

|xkb_keycodes "abnt2" {<br />

| include "xfree86(basic)"<br />

| = 94;<br />

| = 51;<br />

| = 134;<br />

|};<br />

Come appena descritto, assegnare il valore ‘xfree86’ all’opzione ‘XkbKeycodes’ significa<br />

indicare l’uso del file ‘xkb/keycodes/xfree86’, il cui contenuto, come si può vedere<br />

dall’estratto di esempio, è suddiviso in sezioni. Quando si indica il file, occorrerebbe anche<br />

specificare la sezione a cui si fa riferimento; in questo caso la sezione predefinita a essere presa<br />

in considerazione è quella denominata nello stesso modo del file, ‘xfree86’, come si vede<br />

all’inizio:<br />

|default xkb_keycodes "xfree86" {<br />

| include "xfree86(basic)"<br />

|...<br />

Si può vedere che questa sezione richiama la sezione ‘basic’ dello stesso file. In pratica, la<br />

configurazione di X (‘/etc/X11/XF86Config<br />

*’, ‘/etc/X11/xorg.conf’, ecc.) avrebbe<br />

potuto essere più precisa specificandola così:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "default"<br />

| Option "XkbSymbols" "en_US(pc102)+it"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic+pc+iso9995"<br />

|EndSection<br />

L’opzione ‘XkbTypes’, che si riferisce alla gestione dei tasti modificatori, contiene il valore<br />

‘default’, che corrisponde alla selezione del file ‘xkb/types/default’, utilizzando la<br />

sezione predefinita con lo stesso nome. Il contenuto del file potrebbe essere questo:


X 1771<br />

|default xkb_types "default" {<br />

| include "basic"<br />

| include "pc"<br />

| include "iso9995"<br />

| include "extra"<br />

| include "mousekeys"<br />

|};<br />

In pratica, viene dichiarato l’uso di altri file della stessa directory secondo la sequenza che<br />

si può vedere. La stessa cosa, si può esprimere nel file di configurazione di X (‘/etc/X11/<br />

XF86Config<br />

*’, ‘/etc/X11/xorg.conf’, ecc.), come si vede dall’esempio seguente:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "basic+pc+iso9995+extra+mousekeys"<br />

| Option "XkbSymbols" "en_US(pc102)+it"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic+pc+iso9995"<br />

|EndSection<br />

Naturalmente si possono rendere esplicite le sezioni; osservando il contenuto dei vari file, si<br />

dovrebbe scrivere così:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "basic(basic)+pc(default)+←↪<br />

↩→ iso9995(default)+extra(default)+mousekeys(default)"<br />

| Option "XkbSymbols" "en_US(pc102)+it"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic+pc+iso9995"<br />

|EndSection<br />

Dopo aver espanso le opzioni precedenti, ‘XkbSymbols’ comincia a essere più intuitiva: evidentemente<br />

viene usata la sezione ‘pc102’ del file ‘xkb/symbols/en_US’ e la sezione predefinita<br />

del file ‘xkb/symbols/it’. In questo modo si fa riferimento alla mappa inglese con<br />

tutte le estensioni del caso, compreso il fatto che si usa una tastiera a 102 tasti, a cui si sovrappone<br />

la mappa italiana, che va a sostituire alcuni tasti. Dall’osservazione dei file, si determina<br />

che la sezione predefinita del file ‘xkb/symbols/it’ è ‘basic’:


1772 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "basic(basic)+pc(default)+←↪<br />

↩→ iso9995(default)+extra(default)+mousekeys(default)"<br />

| Option "XkbSymbols" "en_US(pc102)+it(basic)"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic+pc+iso9995"<br />

|EndSection<br />

L’opzione ‘XkbGeometry’ serve a dichiarare la forma che ha la tastiera. Come ormai si intende,<br />

viene indicata la sezione ‘pc102’ del file ‘xkb/geometry/pc’. Ovviamente è opportuno<br />

che la geometria della tastiera sia conforme a quanto dichiarato nell’opzione ‘XkbSymbols’.<br />

L’opzione ‘XkbCompat’ dichiara le «mappe di compatibilità». Come si vede si fa riferimento<br />

alle sezioni predefinite dei file ‘xkb/compat/basic’, ‘xkb/compat/pc’ e ‘xkb/compat/<br />

iso9995’. Dall’osservazione dei file si determinano le sezioni predefinite:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "basic(basic)+pc(default)+←↪<br />

↩→ iso9995(default)+extra(default)+mousekeys(default)"<br />

| Option "XkbSymbols" "en_US(pc102)+it(basic)"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic(basic)+pc(basic)+iso9995(default)"<br />

|EndSection<br />

Questa modalità di configurazione diventa utile quando si vuole fare qualcosa di diverso da<br />

ciò che sarebbe predefinito. Per questo, l’opzione più interessante per gli interventi manuali<br />

è ‘XkbSymbols’. Per esempio, per attribuire una «variante» alla mappa della tastiera prescelta,<br />

occorre trovare presumibilmente una sezione appropriata nel file, che in questo caso<br />

è ‘xkb/symbols/it’; così, volendo disabilitare i tasti morti, occorre specificare la sezione<br />

‘nodeadkeys’:<br />

| ...<br />

| Option "XkbSymbols" "en_US(pc102)+it(nodeadkeys)"<br />

| ...<br />

Con lo stesso criterio, per cambiare la geometria della tastiera, occorre intervenire tra le opzioni<br />

di ‘xkb/symbols/en_US’ e di ‘xkb/geometry/pc’; in questo caso si passa a una tastiera a<br />

105 tasti:


X 1773<br />

| ...<br />

| Option "XkbSymbols" "en_US(pc105)+it(basic)"<br />

| Option "XkbGeometry" "pc(pc105)"<br />

| ...<br />

31.8.3.1 Sintesi della configurazione<br />

Una volta definita in qualche modo la configurazione per la tastiera, si può ottenere una sintesi<br />

di tutto ciò che viene coinvolto con l’aiuto del programma ‘xkbcomp’, 16 usando l’opzione<br />

‘-xkb’:<br />

«<br />

$ xkbcomp -xkb :0 [ Invio ]<br />

In questo modo si richiede di analizzare la configurazione relativa alla tastiera associata allo<br />

schermo nelle coordinate ‘:0’ (ovvero ‘:0.0’). Ciò che si ottiene in questo caso è il file<br />

‘server-0.xkb’, la cui consultazione può essere molto utile per comprendere meglio la<br />

configurazione della propria tastiera.<br />

31.8.3.2 Aggiungere nuovi file di configurazione<br />

A parte ogni considerazione sulla difficoltà che comporta la modifica e l’aggiunta di altri file<br />

nella struttura che si articola a partire dalla directory ‘xkb/’, occorre considerare che i file in<br />

questione (e le sezioni in essi contenute) sono riepilogati all’interno di indici; uno per ogni sottodirectory.<br />

Per esempio, il file ‘xkb/symbols.dir’ si riferisce al contenuto della directory<br />

‘xkb/symbols/’. Ecco un estratto di questo file:<br />

«<br />

|-dp----- a------- it(basic)<br />

|--p----- a------- it(Sundeadkeys)<br />

|--p----- a------- it(sundeadkeys)<br />

|--p----- a------- it(nodeadkeys)<br />

L’elenco è composto da tre parti: una prima serie di indicatori, una seconda serie e alla fine<br />

il file e la sezione a cui si riferiscono. Questi indicatori possono essere teoricamente quelli<br />

seguenti:<br />

|<br />

|hdp-----<br />

amkfg--- nome(sezione)<br />

|<br />

Questi indicatori servono a classificare la sezione che appare a fianco, secondo la logica della<br />

tabella seguente:<br />

Lettera Significato mnemonico Descrizione<br />

| h hidden<br />

| d default Sezione predefinita.<br />

| p partial Sezione parziale.<br />

| a alphanumeric<br />

Sezione nascosta da utilizzare soltanto all’interno<br />

di altre.<br />

Funzione riferita alla parte della tastiera che<br />

serve a ottenere simboli alfanumerici e non.


1774 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Lettera Significato mnemonico Descrizione<br />

| m modifier Funzione riferita all’uso dei tasti modificatori.<br />

| k keypad<br />

Funzione riferita alla gestione della tastiera<br />

numerica.<br />

Funzione riferita alla gestione di tasti con<br />

funzioni speciali.<br />

| f function<br />

|<br />

g group Funzione riferita alla gestione di gruppi alternativi.<br />

31.8.4 Configurazione con «xmodmap»<br />

«<br />

Nella necessità di modificare o di costruire una mappa personalizzata della tastiera, piuttosto<br />

di addentrarsi nei meandri del contenuto delle varie sottodirectory che si articolano a partire<br />

da ‘xkb/’, può essere più conveniente l’uso del programma ‘xmodmap’. 17 Per poter usare<br />

questo programma è necessario conoscere il codice numerico dei tasti. Per acquisire questa<br />

informazione si può utilizzare il programma ‘xkbprint’, che si avvale delle informazioni contenute<br />

nella directory ‘xkb/geometry/’, ma in presenza di una tastiera differente dal previsto,<br />

occorre usare il programma ‘xev’. 18<br />

Il programma ‘xev’ si avvia da una finestra di terminale e si traduce in un riquadro con sfondo<br />

bianco, contenente un piccolo rettangolo. Quando la sua finestra è in primo piano o comunque<br />

quando è attiva, le azioni che si compiono con la tastiera o con il mouse, vengono descritte<br />

nella finestra di terminale da cui il programma è stato avviato. La figura successiva dà un’idea<br />

di questo comportamento.


X 1775<br />

|Figura <strong>31.1</strong>17. Il programma ‘xev’ in funzione.<br />

Per esempio, premendo il tasto [ Ctrl ] sinistro di una tastiera comune si dovrebbe ottenere un<br />

risultato simile a quello seguente:<br />

|KeyPress event, serial 29, synthetic NO, window 0x1000001,<br />

| root 0x36, subw 0x0, time 2064092, (336,380), root:(339,399),<br />

| state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,<br />

| XLookupString gives 0 bytes: ""<br />

|<br />

|KeyRelease event, serial 29, synthetic NO, window 0x1000001,<br />

| root 0x36, subw 0x0, time 2064203, (336,380), root:(339,399),<br />

| state 0x4, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,<br />

| XLookupString gives 0 bytes: ""<br />

Da questo esempio si comprende che il codice del tasto [ Ctrl ] sinistro è il numero 37.<br />

Con queste informazioni si può usare il programma ‘xmodmap’ per sostituire la funzione di<br />

qualche tasto, oppure per ridefinire completamente la tastiera.


1776 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.8.4.1 Utilizzo di «xmodmap»<br />

«<br />

Il programma ‘xmodmap’ si avvale normalmente di un file di configurazione, che, se non<br />

lo si specifica espressamente, corrisponde a ‘.xmodmap’ contenuto nella directory personale<br />

dell’utente. Per questa ragione il programma può fare a meno di argomenti nella riga di<br />

comando:<br />

|<br />

|xmodmap [opzioni] [file_di_configurazione] |<br />

|Tabella <strong>31.1</strong>19. Alcune opzioni.<br />

Opzione<br />

Descrizione<br />

|<br />

-display schermo Permette di specificare a quale servente grafico fare<br />

riferimento.<br />

| -grammar Genera un promemoria della sintassi da usare per la<br />

configurazione.<br />

| -n Simula l’operazione, senza eseguirla veramente.<br />

|<br />

Esegue l’espressione fornita, che in pratica è l’equivalente di<br />

-e espressione una direttiva di configurazione. Si può usare questa opzione<br />

più volte.<br />

| -pm print modifier<br />

Emette la configurazione attuale dei modificatori.<br />

| -pk print keymap<br />

Emette la configurazione attuale della mappa della tastiera.<br />

| -pke print keymap expression<br />

Emette la configurazione attuale della mappa della tastiera,<br />

usando un formato compatibile con quello necessario per la<br />

configurazione.<br />

| -pp print pointermap<br />

Emette la configurazione attuale del puntatore grafico.<br />

Segue la descrizione di alcuni esempi di interrogazione sullo stato attuale della configurazione,<br />

quando il servente grafico è stato avviato avendo il file di configurazione di X (‘/etc/X11/<br />

XF86Config<br />

*’, ‘/etc/X11/xorg.conf’, ecc.) con la sezione ‘InputDevice’ organizzata<br />

così:<br />

|Section "InputDevice"<br />

| Identifier "Keyboard1"<br />

| Driver "Keyboard"<br />

|<br />

| Option "AutoRepeat" "500 30"<br />

|<br />

| Option "XkbKeycodes" "xorg(xfree86)"<br />

| Option "XkbTypes" "basic(basic)+pc(default)+←↪<br />

↩→iso9995(default)+extra(default)+mousekeys(default)"<br />

| Option "XkbSymbols" "en_US(pc102)+it(basic)"<br />

| Option "XkbGeometry" "pc(pc102)"<br />

| Option "XkbCompat" "basic(basic)+pc(basic)+iso9995(default)"<br />

|EndSection


X 1777<br />

• $ xmodmap -grammar [ Invio ]<br />

|xmodmap accepts the following input expressions:<br />

|<br />

| pointer = default reset pointer buttons to default<br />

| pointer = NUMBER ... set pointer button codes<br />

| keycode NUMBER = [KEYSYM ...] map keycode to given keysyms<br />

| keysym KEYSYM = [KEYSYM ...] look up keysym and do a keycode operation<br />

| clear MODIFIER remove all keys for this modifier<br />

| add MODIFIER = KEYSYM ... add the keysyms to the modifier<br />

| remove MODIFIER = KEYSYM ... remove the keysyms from the modifier<br />

|<br />

|where NUMBER is a decimal, octal, or hex constant; KEYSYM is a valid<br />

|Key Symbol name; and MODIFIER is one of the eight modifier names:<br />

|Lock, Control, Mod1, Mod2, Mod3, Mod4, or Mod5.<br />

|an exclamation mark (!) are taken as comments.<br />

|for MODIFIER names.<br />

|<br />

Lines beginning with<br />

Shift,<br />

Case is significant except<br />

|Keysyms on the left hand side of the = sign are looked up before any changes<br />

|are made; keysyms on the right are looked up after all of those on the left<br />

|have been resolved.<br />

This makes it possible to swap modifier keys.<br />

• $ xmodmap -pm [ Invio ]<br />

|xmodmap: up to 2 keys per modifier, (keycodes in parentheses):<br />

|<br />

|shift Shift_L (0x32), Shift_R (0x3e)<br />

|lock<br />

Caps_Lock (0x42)<br />

|control Control_L (0x25), Control_R (0x6d)<br />

|mod1<br />

|mod2<br />

|mod3<br />

|mod4<br />

|mod5<br />

Alt_L (0x40)<br />

Num_Lock (0x4d)<br />

Mode_switch (0x71)<br />

Super_L (0x73)<br />

Scroll_Lock (0x4e)<br />

• $ xmodmap -pk [ Invio ]<br />

|There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 255.<br />

|...<br />

| 8<br />

| 9 0xff1b (Escape)<br />

| 10 0x0031 (1) 0x0021 (exclam) 0x00b9 (onesuperior) 0x00a1 (exclamdown)<br />

| 11 0x0032 (2) 0x0022 (quotedbl) 0x00b2 (twosuperior) 0xfe59 (dead_doubleacute)<br />

| 12 0x0033 (3) 0x00a3 (sterling) 0x00b3 (threesuperior) 0xfe53 (dead_tilde)<br />

|...<br />

|115 0xffeb (Super_L)<br />

|116 0xff20 (Multi_key)<br />

|117 0xff67 (Menu)<br />

|118<br />

|119<br />

|...<br />

|254<br />

|255


1778 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

• $ xmodmap -pke [ Invio ]<br />

|keycode 8 =<br />

|keycode 9 = Escape<br />

|keycode 10 = 1 exclam onesuperior exclamdown<br />

|keycode 11 = 2 quotedbl twosuperior dead_doubleacute<br />

|keycode 12 = 3 sterling threesuperior dead_tilde<br />

|...<br />

|keycode 115 = Super_L<br />

|keycode 116 = Multi_key<br />

|keycode 117 = Menu<br />

|keycode 118 =<br />

|keycode 119 =<br />

|...<br />

|keycode 254 =<br />

|keycode 255 =<br />

• $ xmodmap -pp [ Invio ]<br />

|There are 3 pointer buttons defined.<br />

|<br />

| Physical Button<br />

| Button Code<br />

| 1 1<br />

| 2 2<br />

| 3 3<br />

31.8.4.2 Configurazione della tastiera numerica<br />

«<br />

In presenza di una tastiera comune, con la quale si intende sfruttare il blocco dei tasti numerici<br />

esclusivamente per questo, eliminando del tutto la possibilità di usare quei tasti anche per<br />

il movimento del cursore e altro, si possono ridefinire le funzioni associate ai tasti, senza<br />

distinzione tra i livelli. Per cominciare occorre ottenere la configurazione attuale:<br />

$ xmodmap -pke [ Invio ]<br />

|...<br />

|keycode<br />

|keycode<br />

|keycode<br />

|...<br />

|keycode<br />

|keycode<br />

|keycode<br />

|...<br />

|keycode<br />

|keycode<br />

|keycode<br />

79 = KP_Home KP_7<br />

80 = KP_Up KP_8<br />

81 = KP_Prior KP_9<br />

83 = KP_Left KP_4<br />

84 = KP_Begin KP_5<br />

85 = KP_Right KP_6<br />

87 = KP_End KP_1<br />

88 = KP_Down KP_2<br />

89 = KP_Next KP_3


X 1779<br />

|keycode<br />

|keycode<br />

|...<br />

90 = KP_Insert KP_0<br />

91 = KP_Delete KP_Decimal<br />

Con questi dati si può costruire un file di configurazione contenente le righe seguenti:<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

|keycode<br />

79 = KP_7<br />

80 = KP_8<br />

81 = KP_9<br />

83 = KP_4<br />

84 = KP_5<br />

85 = KP_6<br />

87 = KP_1<br />

88 = KP_2<br />

89 = KP_3<br />

90 = KP_0<br />

91 = KP_Decimal<br />

Queste righe possono essere inserite all’interno del file ‘~/.xmodmap’, oppure in un altro file<br />

da indicare espressamente nella riga di comando di ‘xmodmap’. In alternativa si può usare<br />

anche l’opzione ‘-e’, in questo modo:<br />

$ xmodmap -e "keycode 79 = KP_7" [ Invio ]<br />

$ xmodmap -e "keycode 80 = KP_8" [ Invio ]<br />

$ xmodmap -e "keycode 81 = KP_9" [ Invio ]<br />

$ xmodmap -e "keycode 83 = KP_4" [ Invio ]<br />

$ xmodmap -e "keycode 84 = KP_5" [ Invio ]<br />

$ xmodmap -e "keycode 85 = KP_6" [ Invio ]<br />

$ xmodmap -e "keycode 87 = KP_1" [ Invio ]<br />

$ xmodmap -e "keycode 88 = KP_2" [ Invio ]<br />

$ xmodmap -e "keycode 89 = KP_3" [ Invio ]<br />

$ xmodmap -e "keycode 90 = KP_0" [ Invio ]<br />

$ xmodmap -e "keycode 91 = KP_Decimal" [ Invio ]


1780 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

31.8.4.3 Configurazione dei tasti del mouse<br />

«<br />

Normalmente i tasti del mouse sono configurati in modo da avere il primo tasto, ovvero quello<br />

premuto più spesso, sotto al dito indice della mano destra. Una persona che volesse usare il<br />

mouse con la mano sinistra dovrebbe ridefinire la sequenza dei tasti con una configurazione<br />

per ‘xmodmap’ pari all’esempio seguente:<br />

|pointer = 3 2 1<br />

Usando l’opzione ‘-e’ basta il comando seguente:<br />

$ xmodmap -e "pointer = 3 2 1" [ Invio ]<br />

Si può verificare l’inversione con l’opzione ‘-pp’:<br />

$ xmodmap -pp [ Invio ]<br />

|There are 3 pointer buttons defined.<br />

|<br />

| Physical Button<br />

| Button Code<br />

| 1 3<br />

| 2 2<br />

| 3 1<br />

31.8.4.4 Riconfigurazione della mappa della tastiera<br />

«<br />

La riconfigurazione della mappa della tastiera può essere eseguita facilmente se si dispone<br />

già di una mappa abbastanza simile a quella che si vuole ottenere. Per prima cosa occorre<br />

osservare l’associazione dei tasti modificatori:<br />

$ xmodmap -pm [ Invio ]<br />

|xmodmap: up to 2 keys per modifier, (keycodes in parentheses):<br />

|<br />

|shift Shift_L (0x32), Shift_R (0x3e)<br />

|lock<br />

Caps_Lock (0x42)<br />

|control Control_L (0x25), Control_R (0x6d)<br />

|mod1<br />

|mod2<br />

|mod3<br />

|mod4<br />

|mod5<br />

Alt_L (0x40)<br />

Num_Lock (0x4d)<br />

Mode_switch (0x71)<br />

Super_L (0x73)<br />

Scroll_Lock (0x4e)<br />

Per riprodurre la stessa cosa attraverso direttive di configurazione di ‘xmodmap’, occorrono le<br />

righe seguenti:<br />

|clear shift<br />

|clear lock<br />

|clear control


X 1781<br />

|clear mod1<br />

|clear mod2<br />

|clear mod3<br />

|clear mod4<br />

|clear mod5<br />

|add shift = Shift_L Shift_R<br />

|add lock = Caps_Lock<br />

|add control = Control_L Control_R<br />

|add mod1 = Alt_L<br />

|add mod2 = Num_Lock<br />

|add mod3 = Mode_switch<br />

|add mod5 = Scroll_Lock<br />

Successivamente, si può riprodurre la mappa attuale, direttamente in forma di direttive di<br />

configurazione per ‘xmodmap’, con l’opzione ‘-pke’:<br />

$ xmodmap -pke [ Invio ]<br />

|keycode 8 =<br />

|keycode 9 = Escape<br />

|keycode 10 = 1 exclam onesuperior exclamdown<br />

|keycode 11 = 2 quotedbl twosuperior dead_doubleacute<br />

|...<br />

|keycode 115 = Super_L<br />

|keycode 116 = Multi_key<br />

|keycode 117 = Menu<br />

|keycode 118 =<br />

|keycode 119 =<br />

|...<br />

|keycode 254 =<br />

|keycode 255 =<br />

Per ottenere quasi la stessa cosa, basta assemblare le due parti in un file da dare in pasto a<br />

‘xmodmap’:<br />

|clear shift<br />

|clear lock<br />

|clear control<br />

|clear mod1<br />

|clear mod2<br />

|clear mod3<br />

|clear mod4<br />

|clear mod5<br />

|add shift = Shift_L Shift_R<br />

|add lock = Caps_Lock<br />

|add control = Control_L Control_R<br />

|add mod1 = Alt_L<br />

|add mod2 = Num_Lock


1782 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|add mod3 = Mode_switch<br />

|add mod5 = Scroll_Lock<br />

|keycode 8 =<br />

|keycode 9 = Escape<br />

|keycode 10 = 1 exclam onesuperior exclamdown<br />

|keycode 11 = 2 quotedbl twosuperior dead_doubleacute<br />

|...<br />

|keycode 115 = Super_L<br />

|keycode 116 = Multi_key<br />

|keycode 117 = Menu<br />

|keycode 118 =<br />

|keycode 119 =<br />

|...<br />

|keycode 254 =<br />

|keycode 255 =<br />

Naturalmente, una volta verificato che tutto funziona (quasi) come prima, si può fare qualche<br />

modifica. Dovrebbe essere evidente che ogni direttiva ‘keycode’ ha alla destra del segno ‘=’<br />

la sequenza dei quattro livelli per il tasto corrispondente.<br />

È importante osservare che l’associazione dei modificatori non è uniforme tra le definizioni<br />

delle tastiere dei vari paesi. Per esempio, non è detto che la funzione per il passaggio al<br />

terzo livello sia associata al modificatore virtuale ‘Mode_switch’, come invece avviene in<br />

questo caso; inoltre non è detto che sia associata al modificatore reale ‘Mod3’. Purtroppo,<br />

l’associazione dei modificatori non può essere cambiata, se non seguendo attentamente le<br />

caratteristiche della configurazione contenuta a partire da ‘xkb/’.<br />

Se si dispone di una tastiera che, pur risultando compatibile dal punto di vista elettronico,<br />

mostra di avere un’associazione differente dei codici numerici, occorre usare il programma<br />

‘xev’ per scoprire l’abbinamento corretto, quindi si può cercare di adattare una mappa già<br />

esistente, secondo la modalità già mostrata. Naturalmente ciò richiede un lavoro più lungo,<br />

tenendo conto che la prima cosa da associare correttamente sono proprio i modificatori che<br />

si vogliono usare. Tornando all’esempio già mostrato, i vari tasti [ Maiuscole ], [ Fissamaiuscole ],<br />

[ Ctrl ], [ Alt ],... sono associati così:<br />

|keycode 50 = Shift_L<br />

|keycode 62 = Shift_R<br />

|keycode 66 = Caps_Lock<br />

|keycode 37 = Control_L<br />

|keycode 109 = Control_R<br />

|keycode 64 = Alt_L Meta_L<br />

|keycode 77 = Num_Lock Pointer_EnableKeys<br />

|keycode 113 = Mode_switch<br />

|keycode 78 = Scroll_Lock


X 1783<br />

31.9 Metodi di inserimento intelligente con SCIM<br />

La tastiera per elaboratore nasce come evoluzione di quella della macchina da scrivere, secondo<br />

una logica «occidentale», dove i caratteri tipografici sono in un numero molto limitato.<br />

Per scrivere i caratteri di lingue che ne annoverano una quantità maggiore, occorre un sistema<br />

alternativo di inserimento, che di solito si basa su una forma di traslitterazione a partire dall’alfabeto<br />

latino; per esempio, nel caso della lingua cinese, di solito si attribuiscono dei nomi<br />

ai caratteri.<br />

«<br />

Con X, per realizzare l’obiettivo della scrittura con caratteri di lingue orientali che utilizzano<br />

molti simboli, si usa normalmente un programma che viene attivato dalle applicazioni che<br />

richiedono l’inserimento, attraverso una combinazione di tasti che viene interpretata dalle applicazioni<br />

stesse. In pratica, se la configurazione locale è attinente, le applicazioni tendono a<br />

dare un significato particolare a certe combinazioni di tasti, con le quali attivano o disattivano<br />

il programma di inserimento guidato dei caratteri di una certa lingua.<br />

31.9.1 SCIM<br />

«<br />

SCIM, 19 ovvero Smart common input method, viene definita una «piattaforma» per diversi<br />

metodi di inserimento intelligente. SCIM è principalmente un servente che viene interpellato<br />

dai programmi grafici quando richiesto attraverso la combinazione di tasti [ Ctrl Spazio ]. Questo<br />

servente, che costituisce la piattaforma SCIM, si avvale di moduli specifici per ogni metodo<br />

di inserimento. Questi moduli si chiamano genericamente IMEngine (Input method engine) e<br />

a seconda della presenza di questo o di quel modulo, SCIM è in grado di offrire il metodo di<br />

inserimento intelligente relativo.<br />

Di solito, la piattaforma SCIM viene avviata come demone a uso di un utente singolo (se più<br />

utenti accedono allo stesso elaboratore, ognuno avvia la sua copia del demone):<br />

|<br />

|scim [opzioni] |<br />

In condizioni normali, si usa solo l’opzione ‘-d’, con la quale si ottiene proprio il<br />

funzionamento del programma ‘scim’ in qualità di demone, sullo sfondo:<br />

$ scim -d [ Invio ]<br />

|Launching a SCIM daemon with Socket FrontEnd...<br />

|Loading simple Config module ...<br />

|Creating backend ...<br />

|Loading socket FrontEnd module ...<br />

|Starting SCIM as daemon ...<br />

|Launching a SCIM process with x11...<br />

|Loading socket Config module ...<br />

|Creating backend ...<br />

|Loading x11 FrontEnd module ...<br />

|GTK Panel of SCIM 1.4.4<br />

|SCIM has been successfully launched.<br />

|Smart Common Input Method 1.4.4


1784 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Come si può intuire dall’esempio, il demone ‘scim’ va avviato nell’ambito del sistema grafico<br />

X, eventualmente da una finestra di terminale, se non è possibile fare di meglio. Tuttavia,<br />

occorre predisporre prima delle variabili di ambiente:<br />

|XMODIFIERS=’@im=SCIM’<br />

|GTK_IM_MODULE="scim"<br />

|QT_IM_MODULE="scim"<br />

|export XMODIFIERS<br />

|export GTK_IM_MODULE<br />

|export QT_IM_MODULE<br />

|#<br />

|scim -d<br />

«<br />

31.9.2 Attivazione del metodo di inserimento intelligente<br />

Una volta definite le variabili di ambiente e il demone ‘scim’ come descritto nella sezione<br />

precedente, alcuni programmi associano senza altre preoccupazioni la combinazione di tasti<br />

[ Ctrl Spazio ] all’emersione di un programma frontale con il quale si può dichiarare il tipo di<br />

metodo di inserimento preferito (in base ai moduli disponibili).<br />

|Figura <strong>31.1</strong>37. Il pannellino di selezione per il metodo di inserimento intelligente.<br />

|Figura <strong>31.1</strong>38. Il menù di selezione del metodo di inserimento intelligente.


X 1785<br />

31.9.3 La configurazione locale<br />

Alcuni programmi, alla pressione della combinazione [ Ctrl Spazio ] attivano sempre il pannellino<br />

di controllo di SCIM, ammesso che il demone ‘scim’ sia disponibile; altri programmi lo fanno<br />

solo se la configurazione locale è appropriata, secondo il loro punto di vista.<br />

«<br />

Per esempio, OpenOffice.org è uno di quei programmi che necessitano di una configurazione<br />

locale «orientale». Esempi di tali configurazioni sono ‘zh_CN.UTF-8’ e ‘ja_JP.UTF-8’;<br />

naturalmente si richiede l’uso dell’insieme di caratteri universale, attraverso la codifica UTF-8.<br />

Come è noto, per impostare il linguaggio è sufficiente assegnare un valore alla variabile di<br />

ambiente LANG, per farlo ereditare in modo predefinito a tutte le altre variabili LC_<br />

* . Tuttavia,<br />

se lo si preferisce, al fine di attivare le funzioni di SCIM, è sufficiente che la variabile<br />

di ambiente LC_CTYPE sia impostata in questo modo. Si vede l’esempio della configurazione<br />

cinese comune, in entrambi i casi (nel secondo caso la configurazione locale predefinita è<br />

quella della lingua italiana, con l’eccezione della variabile LC_CTYPE):<br />

|LANG=zh_CN.UTF-8<br />

|LANG=it_IT.UTF-8<br />

|LC_CTYPE=zh_CN.UTF-8<br />

L’utilizzo della variabile di ambiente LC_CTYPE, con una configurazione locale differente<br />

da quella complessiva, ha però degli effetti collaterali. In particolare, supponendo di utilizzare<br />

proprio la configurazione dell’ultimo esempio mostrato (in generale lingua italiana, mentre<br />

LC_CTYPE è impostata per il cinese), si ottiene sì un ambiente che comunica in italiano, consentendo<br />

l’uso di una modalità di inserimento cinese (e probabilmente anche di altre lingue),<br />

ma l’inserimento di valori numerici potrebbe richiedere l’uso del punto per separare la parte<br />

intera da quella decimale (mentre in italiano si richiede l’uso della virgola).<br />

31.9.4 Utilizzo<br />

«<br />

Per inserire effettivamente i caratteri desiderati, dopo avere selezionato il metodo di inserimento,<br />

occorre passare all’applicazione nella quale va inserito il testo e si procede digitando<br />

la traslitterazione dei caratteri voluti. A seconda del metodo di inserimento, si ottiene un<br />

meccanismo di completamento, eventualmente con la proposta di un certo numero di caratteri<br />

alternativi da scegliere, come si vede nella figura successiva. Per selezionare un carattere in<br />

questo modo, è sufficiente premere il numero corrispondente, oppure si può agire con il mouse,<br />

in modo abbastanza intuitivo.


1786 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Figura <strong>31.1</strong>41. Esempio di inserimento di un testo in cinese: inserendo la sequenza «mu»,<br />

si ottiene un elenco di caratteri alternativi che possono corrispondere.<br />

Si osservi che, quando si usa un programma di scrittura, è necessario che il tipo di carattere<br />

scelto contenga i simboli che si vogliono inserire. Solo i programmi più evoluti provvedono<br />

da soli a cambiare il tipo di carattere quando quello originario non li contiene.<br />

|Figura <strong>31.1</strong>42. Esempio di inserimento di un testo in cinese con una finestra di terminale.


X 1787<br />

<strong>31.1</strong>0 Gestori di finestre<br />

Il gestore di finestre, o window manager (WM), è quel programma cliente, che si occupa di<br />

incorniciare le superfici degli altri programmi clienti, di gestire la messa a fuoco, il passaggio<br />

da un programma all’altro e di altre funzioni di contorno. Anche se apparentemente non sembra<br />

molto, il gestore di finestre è in grado di cambiare la faccia e il funzionamento operativo<br />

del sistema X.<br />

Alcuni gestori di finestre consentono di utilizzare una superficie maggiore di quella che si<br />

vede sullo schermo. Si parla in questi casi di gestori di finestre con superficie grafica virtuale,<br />

ovvero di virtual window manager (VWM). Di solito, per passare da una zona all’altra della<br />

superficie grafica virtuale si utilizza la combinazione [ Ctrl freccia... ] nella direzione in cui ci si<br />

vuole spostare, oppure si utilizza il mouse all’interno di una tabellina riassuntiva di tutta la<br />

superficie grafica virtuale.<br />

Volendo, a puro titolo didattico, si può utilizzare X senza un gestore di finestre:<br />

«<br />

$ xinit /usr/bin/X11/xterm -geometry =50x10+10+10 [ Invio ]<br />

Oppure:<br />

$ startx /usr/bin/X11/xterm -geometry =50x10+10+10 [ Invio ]<br />

La figura <strong>31.1</strong>43 mostra il risultato di questo comando. Quando termina l’esecuzione del<br />

programma ‘xterm’, ‘xinit’ fa terminare il funzionamento del servente.<br />

|Figura <strong>31.1</strong>43. Il servente X avviato senza un gestore di finestre.<br />

Qui vengono descritti brevemente solo due gestore di finestre, Twm e Fvwm, che hanno doti<br />

particolari di semplicità e di adattabilità.<br />

<strong>31.1</strong>0.1 Twm<br />

Il gestore di finestre tradizionale e più semplice è Twm, 20 ed è l’unico che venga fornito assieme<br />

a X (anche se le distribuzioni GNU possono tenerlo distinto in un pacchetto separato). Non è<br />

particolarmente amichevole, ma utilizza poche risorse e così è adatto agli elaboratori più lenti;<br />

inoltre è facile da configurare. L’eseguibile che svolge il lavoro, corrisponde a ‘twm’.<br />

«


1788 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Figura <strong>31.1</strong>44. Twm, il gestore di finestre tradizionale.<br />

Per fare in modo che, attraverso lo script ‘startx’, si avvii automaticamente il<br />

gestore di finestre Twm, occorre ricordare di modificare il proprio script ‘~/.xinitrc’.<br />

Nel caso particolare di Twm che è un gestore di finestre piuttosto povero, può essere conveniente<br />

l’avvio di altri programmi prima dell’eseguibile ‘twm’. Ecco come potrebbe terminare<br />

il file ‘~/.xinitrc’:<br />

|# Twm<br />

|xsetroot -solid gray<br />

|xclock -digital -geometry +0-0 &<br />

|xbiff -geometry -0-0 &<br />

|exec twm<br />

In questo esempio si può osservare che viene avviato prima il programma ‘xsetroot’ per definire<br />

un colore uniforme del fondale (la finestra principale), quindi vengono avviati ‘xclock’<br />

e ‘xbiff’ sullo sfondo (background). Infine viene avviato il gestore di finestre attraverso<br />

l’eseguibile ‘twm’. 21<br />

La configurazione generale di Twm risiede normalmente nel file ‘/usr/lib/X11/twm/<br />

system.twmrc’, oppure ‘/etc/X11/twm/system.twmrc’, a seconda dell’impostazione<br />

della propria distribuzione GNU. Eventualmente, ogni utente può definire la propria<br />

configurazione personale, nel file ‘~/.twmrc’, che in tal caso si sostituisce a quella generale.<br />

Segue un esempio della configurazione di Twm, ridotto all’essenziale (una copia dovrebbe<br />

essere disponibile anche qui: 〈allegati/esempio-di-configurazione-twmrc 〉). Come appare anche<br />

dal commento introduttivo, si osservi il fatto che la configurazione di Twm non ammette la<br />

presenza di caratteri speciali, comprese le lettere accentate.<br />

|# .twmrc<br />

|# ATTENZIONE: twm non vuole lettere accentate nemmeno nei commenti!<br />

|#<br />

|<br />

|NoGrabServer<br />

|RestartPreviousState<br />

|DecorateTransients<br />

|TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"<br />

|ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"


X 1789<br />

|MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"<br />

|IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"<br />

|IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*"<br />

|#ClientBorderWidth<br />

|<br />

|Color<br />

|{<br />

| BorderColor "slategrey"<br />

| DefaultBackground "maroon"<br />

| DefaultForeground "gray85"<br />

| TitleBackground "maroon"<br />

| TitleForeground "gray85"<br />

| MenuBackground "maroon"<br />

| MenuForeground "gray85"<br />

| MenuTitleBackground "gray70"<br />

| MenuTitleForeground "maroon"<br />

| IconBackground "maroon"<br />

| IconForeground "gray85"<br />

| IconBorderColor "gray85"<br />

| IconManagerBackground "maroon"<br />

| IconManagerForeground "gray85"<br />

|}<br />

|<br />

|<br />

|# Definizione di alcune funzioni utili per azioni basate sul movimento.<br />

|<br />

|MoveDelta 3<br />

|Function "sposta-sotto" { f.move f.deltastop f.lower }<br />

|Function "sposta-sopra" { f.move f.deltastop f.raise }<br />

|Function "sposta-icona" { f.move f.deltastop f.iconify }<br />

|<br />

|<br />

|# Definisce alcuni abbinamenti con i tasti del mouse.<br />

|<br />

|Button1 = : root : f.menu "opzioni-generali"<br />

|Button3 = : root : f.menu "programmi"<br />

|<br />

|Button1 = : title : f.function "sposta-sopra"<br />

|Button2 = : title : f.iconify<br />

|Button3 = : title : f.function "sposta-sotto"<br />

|<br />

|Button1 = : icon : f.function "sposta-icona"<br />

|Button2 = : icon : f.iconify<br />

|Button3 = : icon : f.iconify<br />

|<br />

|Button1 = : iconmgr : f.function "sposta-sopra"<br />

|Button2 = : iconmgr : f.iconify<br />

|Button3 = : iconmgr : f.function "sposta-sotto"<br />

|<br />

|<br />

|# Inizia la definizione dei menu‘<br />

|<br />

|menu "opzioni-generali"


1790 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|{<br />

|"Twm"<br />

|"Riduzione a icona"<br />

|"Ridimensionamento"<br />

|"Spostamento"<br />

|"Sopra"<br />

|"Sotto"<br />

f.title<br />

f.iconify<br />

f.resize<br />

f.move<br />

f.raise<br />

f.lower<br />

|"" f.nop<br />

|"Messa a fuoco"<br />

|"Fuori fuoco"<br />

|"Mostra Iconmanager"<br />

|"Nasconde Iconmanager"<br />

f.focus<br />

f.unfocus<br />

|"" f.nop<br />

|"Eliminazione"<br />

|"Cancellazione"<br />

f.showiconmgr<br />

f.hideiconmgr<br />

f.destroy<br />

f.delete<br />

|"" f.nop<br />

|"Riavvio"<br />

|"Fine lavoro"<br />

|}<br />

|<br />

|menu "programmi"<br />

|{<br />

|"Menu‘ dei programmi"<br />

f.restart<br />

f.quit<br />

f.title<br />

|"Terminale" f.exec "xterm -font 6x13 -ls -geometry 80x25+0+0 &"<br />

|"File manager" f.exec "xfm &"<br />

|"" f.nop<br />

|"Applicazioni varie" f.menu "applicazioni"<br />

|"" f.nop<br />

|"Riavvio"<br />

|"Fine lavoro"<br />

|}<br />

|<br />

|menu "applicazioni"<br />

|{<br />

|"Applicazioni varie"<br />

f.restart<br />

f.quit<br />

f.title<br />

|"medit" f.exec "medit &"<br />

|"" f.nop<br />

|"ghostview" f.exec "ghostview -geometry =630x420+0+0 &"<br />

|"gv" f.exec "gv -geometry =630x420+0+0 &"<br />

|"" f.nop<br />

|"xpaint" f.exec "xpaint &"<br />

|}<br />

Nella prima parte vengono definite le caratteristiche generali dell’ambiente. Successivamente<br />

si definisce il funzionamento del mouse e in particolare si abbinano delle funzioni alla pressione<br />

dei tasti di questo. La cosa più importante è predisporre dei menù in modo da poter<br />

avviare i programmi utilizzati più di frequente. L’esempio visto sopra viene ripreso in parte<br />

nella descrizione seguente:


X 1791<br />

|...<br />

|Function "sposta-sotto" { f.move f.deltastop f.lower }<br />

|Function "sposta-sopra" { f.move f.deltastop f.raise }<br />

|Function "sposta-icona" { f.move f.deltastop f.iconify }<br />

|...<br />

In questa parte vengono definite alcune funzioni composte a cui viene fatto riferimento più<br />

giù, in corrispondenza di azioni con il mouse o eventualmente anche di selezioni all’interno di<br />

menù.<br />

|...<br />

|Button1 = : root : f.menu "opzioni-generali"<br />

|Button3 = : root : f.menu "programmi"<br />

|<br />

|Button1 = : title : f.function "sposta-sopra"<br />

|Button2 = : title : f.iconify<br />

|Button3 = : title : f.function "sposta-sotto"<br />

|<br />

|Button1 = : icon : f.function "sposta-icona"<br />

|Button2 = : icon : f.iconify<br />

|Button3 = : icon : f.iconify<br />

|<br />

|Button1 = : iconmgr : f.function "sposta-sopra"<br />

|Button2 = : iconmgr : f.iconify<br />

|Button3 = : iconmgr : f.function "sposta-sotto"<br />

|...<br />

Questa parte definisce le azioni abbinate alla pressione di uno dei tasti del mouse, in<br />

corrispondenza di oggetti determinati:<br />

• la finestra principale, ovvero il fondale;<br />

• la barra del titolo di una finestra;<br />

• un’icona;<br />

• il riepilogo delle finestre e delle icone presenti sulla superficie grafica (iconmanager).<br />

In particolare, se si preme il primo tasto del mouse quando il puntatore si trova su una parte<br />

di superficie libera del fondale, ovvero sulla finestra principale, si apre il menù delle opzioni<br />

generali. Premendo invece il terzo tasto si apre un altro menù: quello dei programmi.<br />

|...<br />

|menu "opzioni-generali"<br />

|{<br />

|"Twm"<br />

f.title<br />

|"Riduzione a icona" f.iconify<br />

|"Ridimensionamento" f.resize<br />

|"Spostamento"<br />

f.move


1792 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|"Sopra"<br />

f.raise<br />

|"Sotto"<br />

f.lower<br />

|"" f.nop<br />

|"Messa a fuoco"<br />

f.focus<br />

|"Fuori fuoco"<br />

f.unfocus<br />

|"Mostra Iconmanager" f.showiconmgr<br />

|"Nasconde Iconmanager" f.hideiconmgr<br />

|"" f.nop<br />

|"Eliminazione"<br />

f.destroy<br />

|"Cancellazione"<br />

f.delete<br />

|"" f.nop<br />

|"Riavvio"<br />

f.restart<br />

|"Fine lavoro"<br />

f.quit<br />

|}<br />

|...<br />

Il menù delle opzioni generali, permette di attivare una serie di funzioni di Twm. In particolare,<br />

vale la pena di notare la funzione ‘f.destroy’ con cui si può eliminare una finestra assieme<br />

al programma in esecuzione al suo interno. Inoltre, si può osservare la funzione ‘f.nop’ che<br />

non fa alcunché e viene usata in abbinamento a delle separazioni tra le voci del menù, quindi<br />

la funzione ‘f.title’ che serve solo a definire un titolo per il menù. 22<br />

|...<br />

|menu "programmi"<br />

|{<br />

|"Menu‘ dei programmi"<br />

f.title<br />

|"Terminale" f.exec "xterm -font 6x13 -ls -geometry 80x25+0+0 &"<br />

|"File manager" f.exec "xfm &"<br />

|"" f.nop<br />

|"Applicazioni varie" f.menu "applicazioni"<br />

|"" f.nop<br />

|"Riavvio"<br />

|"Fine lavoro"<br />

|}<br />

|...<br />

f.restart<br />

f.quit<br />

Il menù dei programmi è solo una raccolta di richieste di avvio di programmi di uso comune,<br />

oltre alla chiamata di funzioni importanti come il riavvio del gestore di finestre e la conclusione<br />

della sua attività. I menù possono essere annidati, come in questo esempio, dove la voce<br />

‘Applicazioni varie’ apre un altro menù di applicazioni.<br />

<strong>31.1</strong>0.2 Fvwm<br />

«<br />

Il gestore di finestre Fvwm 23 è una derivazione di Twm con superficie grafica virtuale e cornici<br />

che danno l’impressione di essere tridimensionali.


X 1793<br />

|Figura <strong>31.1</strong>51. Il programma ‘xfontsel’ eseguito all’interno di Fvwm.<br />

Per fare in modo che, attraverso lo script ‘startx’, si avvii automaticamente il gestore di finestre<br />

Fvwm, occorre ricordare di modificare il proprio script ‘~/.xinitrc’, inserendovi la<br />

chiamata all’eseguibile ‘fvwm’ (o ‘fvwm2’, a seconda di come viene denominato l’eseguibile<br />

dalla propria distribuzione). Generalmente è sufficiente avviare il gestore di finestre, senza<br />

altri programmi accessori:<br />

|# start some nice programs<br />

|<br />

|exec fvwm<br />

La configurazione generale di Fvwm risiede normalmente nel file ‘/usr/lib/X11/fvwm/<br />

system.fvwmrc’, oppure ‘/etc/X11/fvwm/system.fvwmrc’, a seconda dell’impostazione<br />

della propria distribuzione GNU. Eventualmente, ogni utente può definire la propria<br />

configurazione personale, nel file ‘~/.fvwmrc’, che in tal caso si sostituisce a quella generale.<br />

Anche se esiste sostanzialmente una sola versione di Fvwm che continui a essere sviluppata,<br />

sono esistite diverse varianti del programma con configurazioni non compatibili tra di loro.<br />

Per questo, a seconda della distribuzione GNU utilizzata, può darsi che i file di configurazione<br />

debbano includere il numero più significativo della versione. Nel caso particolare di<br />

Fvwm 2.<br />

*, i file potrebbero essere ‘system.fvwm2rc’ e ‘.fvwm2rc’.<br />

Il file di configurazione predefinito potrebbe essere molto complesso, ma adeguatamente commentato<br />

in modo da guidare chi desidera modificarlo. In generale, non è conveniente personalizzare<br />

tutto. Di sicuro è necessario sistemare i menù, mentre il resto può rimanere come si<br />

trova.<br />

Quello che segue è un esempio di configurazione completa di Fvwm 2.*, ridotta all’essenziale,<br />

con la presenza di una barra di avvio simile a quella di MS-Windows 95/98. Di proposito, si<br />

fa riferimento a una sola superficie grafica virtuale:<br />

|#<br />

|# Solo una superficie virtuale.


1794 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|#<br />

|DeskTopSize 1x1<br />

|#<br />

|# Init: la funzione che controlla tutto<br />

|#<br />

|DestroyFunc InitFunction<br />

|AddToFunc InitFunction<br />

|+ "I" Module FvwmTaskBar<br />

|#<br />

|# Menù principale<br />

|#<br />

|DestroyMenu Avvio<br />

|AddToMenu Avvio<br />

|+ "Xterm" exec xterm -ls -geometry 80x25+0+0<br />

|+ "" nop<br />

|+ "GV" exec gv -geometry 630x420+0+0<br />

|+ "X<strong>pdf</strong>" exec x<strong>pdf</strong> -geometry 630x420+0+0<br />

|+ "" nop<br />

|+ "XFig" exec xfig -geometry 630x420+0+0<br />

|+ "Gnumeric" exec gnumeric -geometry 630x420+0+0<br />

|+ "Abiword" exec abiword -geometry 630x420+0+0<br />

|+ "" nop<br />

|+ "Galeon" exec galeon<br />

|+ "Balsa" exec balsa -geometry 630x420+0+0<br />

|+ "" nop<br />

|+ "Fine lavoro" quit<br />

|#<br />

|# Menù abbinato all’angolo sinistro della finestra<br />

|#<br />

|DestroyMenu Finestra<br />

|AddToMenu Finestra<br />

|+ "Sposta" Move<br />

|+ "Ridimensiona" Resize<br />

|+ "Riduci a icona" Iconify<br />

|+ "Ingrandisci" Maximize 100 95<br />

|+ "" Nop<br />

|+ "Elimina" Destroy<br />

|+ "Chiudi" Close<br />

|#<br />

|# Mouse e funzioni abbinate<br />

|#<br />

|Mouse 1 R A Menu Avvio<br />

|Mouse 2 R A Menu Finestra<br />

|Mouse 3 R A WindowList<br />

|Mouse 0 T A move-and-raise-or-raiselower<br />

|Mouse 0 W M -<br />

|Mouse 0 F A resize-or-raiselower


X 1795<br />

|Mouse 0 S A resize-or-raiselower<br />

|Mouse 0 I A move-or-winmenu-or-deiconify<br />

|Mouse 0 1 A Popup Finestra<br />

|Mouse 0 2 A Close<br />

|Mouse 1 4 A Maximize 100 95<br />

|Mouse 2 4 A Maximize 100 95<br />

|Mouse 3 4 A Maximize 100 95<br />

|Mouse 0 6 A Iconify<br />

|#<br />

|DestroyFunc move-or-winmenu-or-deiconify<br />

|AddToFunc<br />

|+ "M" Move<br />

|+ "C" Popup Finestra<br />

|+ "D" Iconify<br />

|#<br />

move-or-winmenu-or-deiconify<br />

|DestroyFunc move-and-raise-or-raiselower<br />

|AddToFunc<br />

|+ "M" Move<br />

|+ "M" Raise<br />

|+ "C" RaiseLower<br />

|#<br />

move-and-raise-or-raiselower<br />

|DestroyFunc resize-or-raiselower<br />

|AddToFunc<br />

|+ "M" Resize<br />

|+ "C" RaiseLower<br />

|#<br />

|# Barra stile Windows<br />

|#<br />

resize-or-raiselower<br />

|Style "FvwmTaskBar" NoTitle<br />

|Style "FvwmTaskBar" BorderWidth 3<br />

|Style "FvwmTaskBar" HandleWidth 3<br />

|Style "FvwmTaskBar" Sticky<br />

|Style "FvwmTaskBar" StaysOnTop<br />

|Style "FvwmTaskBar" WindowListSkip<br />

|Style "FvwmTaskBar" CirculateSkip<br />

|#<br />

| * FvwmTaskBarGeometry +0-0<br />

| * FvwmTaskBarFore Black<br />

| * FvwmTaskBarBack #c0c0c0<br />

| * FvwmTaskBarTipsFore black<br />

| * FvwmTaskBarTipsBack bisque<br />

| * FvwmTaskBarFont -adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*<br />

| * FvwmTaskBarSelFont -adobe-helvetica-bold-r-*-*-*-120-*-*-*-*-*-*<br />

| * FvwmTaskBarAction Click1 Iconify -1,Raise,Focus<br />

| * FvwmTaskBarAction Click2 Iconify<br />

| * FvwmTaskBarAction Click3 Module "FvwmIdent" FvwmIdent<br />

| * FvwmTaskBarUseSkipList


1796 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

| * FvwmTaskBarAutoStick<br />

| * FvwmTaskBarStartName Avvio<br />

| * FvwmTaskBarStartMenu Avvio<br />

| * FvwmTaskBarStartIcon mini-exp.xpm<br />

| * FvwmTaskBarShowTips<br />

|#*FvwmTaskBarShowTransients<br />

|#*FvwmTaskBarClockFormat %I:%M%p<br />

|#*FvwmTaskBarHighlightFocus<br />

|#*FvwmTaskBarAutoHide<br />

<strong>31.1</strong>1 Accorgimenti per la costruzione di un menù<br />

«<br />

Quando si vuole realizzare un menù per un gestore di finestre, o per un programma specifico<br />

da usare nell’ambiente grafico, possono essere utili degli script che si vogliono annotare in<br />

questo capitolo.<br />

Naturalmente, il linguaggio usato per la costruzione del menù potrebbe includere già delle<br />

direttive di controllo, tali da rendere superflui alcuni o tutti gli script che vengono proposti qui;<br />

pertanto ogni cosa va usata se effettivamente ne esiste la convenienza.<br />

Gli script proposti, che si basano sulla disponibilità di una shell POSIX (o quasi), sono semplificati<br />

al massimo; sta poi alla sensibilità di ognuno estenderli secondo le proprie preferenze.<br />

Si osservi anche che, se incorporati nelle direttive della configurazione del menù, vanno forse<br />

modificati in qualche modo per proteggere alcuni simboli; inoltre, potrebbe essere necessario<br />

tradurli in istruzioni disposte su una sola riga.<br />

<strong>31.1</strong>1.1 Verifica della disponibilità<br />

«<br />

Quando si realizza un menù per facilitare l’avvio di alcuni programmi, può essere utile verificare<br />

prima la loro esistenza effettiva, in modo da avvisare l’utente in caso contrario. Infatti,<br />

durante il funzionamento in modalità grafica si perdono normalmente le segnalazioni di errore<br />

fornite dalla shell o dal sistema operativo.<br />

L’esempio seguente riguarda l’avvio del programma ‘gnumeric’, collocato precisamente nella<br />

directory ‘/usr/bin/’; se il file dovesse mancare o se semplicemente non dovesse risultare<br />

eseguibile, si otterrebbe una finestra di terminale con un avvertimento, che rimane evidente<br />

per pochi secondi:<br />

|if [ -x /usr/bin/gnumeric ]<br />

|then<br />

| gnumeric<br />

|else<br />

| xterm -e "echo Sorry, gnumeric is not available. ; sleep 15"<br />

|fi<br />

Segue lo stesso esempio, facendo uso però di ‘xmessage’, al posto di ‘xterm’:


X 1797<br />

|if [ -x /usr/bin/gnumeric ]<br />

|then<br />

| gnumeric<br />

|else<br />

| xmessage -timeout 15 "Sorry, gnumeric is not available."<br />

|fi<br />

<strong>31.1</strong>1.2 Verificare che un programma non sia già in funzione<br />

Quando la configurazione dell’ambiente grafico non prevede la presenza di segnalazioni che<br />

avvisano dell’avvio in corso di un programma, l’utente inesperto può essere indotto a ritentare<br />

l’avvio di qualcosa che sembra non dare segni di vita. Questo tipo di problema si aggrava<br />

quando l’accesso alla memoria di massa è relativamente lento e finisce con il rallentare ancora<br />

di più l’avvio del programma stesso, salvo alla fine ritrovarsi in funzione tutte le copie richieste<br />

in sequenza.<br />

«<br />

Quando un programma consente al proprio interno di avviare altre copie di se stesso, o di<br />

aprire più documenti distinti in schede separate, può essere utile uno script che verifica lo stato<br />

dei processi elaborativi appartenenti allo stesso utente:<br />

|if ps x | grep -v grep | grep "[0-9] gnumeric" 2>&1 > /dev/null<br />

|then<br />

| xterm -e "echo Already running ; sleep 10"<br />

|else<br />

| gnumeric<br />

|fi<br />

La stessa cosa, facendo uso però di ‘xmessage’, al posto di ‘xterm’:<br />

|if ps x | grep -v grep | grep "[0-9] gnumeric" 2>&1 > /dev/null<br />

|then<br />

| xmessage -timeout 10 "Already running"<br />

|else<br />

| gnumeric<br />

|fi<br />

<strong>31.1</strong>1.3 Informare della fase di avvio del programma<br />

La fase di avvio di un programma può essere resa evidente attraverso l’uso del comando<br />

‘ps rx’, con il quale si evidenziano i processi residenti in memoria (quindi i processi attivi),<br />

appartenenti all’utente. Quando il processo elaborativo raggiunge la quiete e non si trova<br />

più a essere residente, di solito ha già mostrato la finestra grafica che lo riguarda. L’esempio<br />

seguente si riferisce all’avvio di AbiWord:<br />

«<br />

|xterm -e "echo Loading abiword... ; ←↪<br />

↩→ sleep 2 ; ←↪<br />

↩→ while ps rx | grep -v grep | grep \"[0-9] abiword\" ; ←↪<br />

↩→ do sleep 2 ; ←↪<br />

↩→ done" & ←↪<br />

↩→ abiword


1798 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Come si può osservare, la maggior parte dello script è inserita nel comando avviato da ‘xterm’,<br />

perché al termine del ciclo di controllo il terminale deve chiudersi.<br />

Si osservi che la verifica fatta con ‘ps’ potrebbe dover includere altri programmi, se quello che<br />

si avvia, prima di potersi presentare ne deve avviare. Questo succede spesso con i programmi<br />

per Gnome o per KDE. Segue un altro esempio riferito all’avvio di Gnumeric:<br />

|xterm -e "echo Loading gnumeric... ; ←↪<br />

↩→ sleep 2 ; ←↪<br />

↩→ while ps rx | grep -v grep | grep \"[0-9] gnumeric\" ←↪<br />

↩→ || ps rx | grep -v grep | grep \"gconfd\" ←↪<br />

↩→ || ps rx | grep -v grep | grep \"bonobo-activation-server\" ; ←↪<br />

↩→ do sleep 2 ; ←↪<br />

↩→ done" & ←↪<br />

↩→ gnumeric<br />

Eventualmente, si può decidere di considerare qualunque programma che non sia in quiete,<br />

anche se può succedere che la finestra del terminale non si chiuda più, per la presenza di un<br />

processo impegnativo indipendente:<br />

|xterm -e "echo Loading gnumeric... ; ←↪<br />

↩→ sleep 2 ; ←↪<br />

↩→ while ps rx | grep -v grep ; ←↪<br />

↩→ do sleep 2 ; ←↪<br />

↩→ done" & ←↪<br />

↩→ gnumeric<br />

<strong>31.1</strong>1.4 Mettere assieme le varie fasi di controllo<br />

«<br />

L’esempio seguente mostra le istruzioni necessarie a mettere assieme i vari controlli già<br />

descritti nelle sezioni precedenti, facendo riferimento al programma AbiWord:<br />

|if [ -x /usr/bin/abiword ]<br />

|then<br />

| if ps x | grep -v grep | grep "[0-9] abiword" 2>&1 > /dev/null<br />

| then<br />

| xterm -e "echo Already running abiword ; sleep 10"<br />

| else<br />

| xterm -e "echo Loading abiword... ; sleep 2 ; ←↪<br />

↩→while ps rx | grep -v grep | grep \"[0-9] abiword\" ; ←↪<br />

↩→do sleep 2 ; done" & abiword<br />

| fi<br />

|else<br />

| xterm -e "echo Sorry, abiword is not available. ; sleep 15"<br />

|fi<br />

Come già visto, con ‘xmessage’ si può limitare l’uso di ‘xterm’:


X 1799<br />

|if [ -x /usr/bin/abiword ]<br />

|then<br />

| if ps x | grep -v grep | grep "[0-9] abiword" 2>&1 > /dev/null<br />

| then<br />

| xmessage -timeout 10 "Already running abiword"<br />

| else<br />

| xterm -e "echo Loading abiword... ; sleep 2 ; ←↪<br />

↩→while ps rx | grep -v grep | grep \"[0-9] abiword\" ; ←↪<br />

↩→do sleep 2 ; done" & abiword<br />

| fi<br />

|else<br />

| xmessage -timeout 15 "Sorry, abiword is not available."<br />

|fi<br />

<strong>31.1</strong>1.5 Innesto di un file system<br />

Per controllare il comando ‘mount’ si potrebbe usare un codice simile a quello seguente, in<br />

modo da sapere se l’operazione ha avuto successo o meno:<br />

«<br />

|if mount /mnt/fd0<br />

|then<br />

| xterm -e "echo /mnt/fd0 mounted successfully ; sleep 15"<br />

|elif mount | grep " /mnt/fd0 "<br />

|then<br />

| xterm -e "echo /mnt/fd0 is already mounted ; sleep 15"<br />

|else<br />

| xterm -e "echo Sorry: /mnt/fd0 mount failed ; sleep 15"<br />

|fi<br />

L’esempio si basa sulla presenza di un file ‘/etc/fstab’ nel quale è previsto il punto<br />

di innesto ‘/mnt/fd0/’, che presumibilmente è riferito al file di dispositivo ‘/dev/<br />

fd0’.<br />

<strong>31.1</strong>1.6 Separazione di un file system<br />

Per controllare il comando ‘umount’ si potrebbe usare un codice simile a quello seguente, in<br />

modo da sapere se l’operazione è ammissibile e se ha avuto successo:<br />

«


1800 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|if mount | grep " /mnt/hdc "<br />

|then<br />

| if umount /mnt/hdc<br />

| then<br />

| eject /dev/hdc<br />

| xterm -e "echo /mnt/hdc successfully unmounted ; sleep 15"<br />

| else<br />

| xterm -e "echo Sorry: umount failed ; sleep 15"<br />

| fi<br />

|else<br />

| xterm -e "echo /mnt/hdc is not to be unmounted. ; sleep 10"<br />

|fi<br />

L’esempio presume che il file di dispositivo ‘/dev/hdc’ vada innestato nella directory ‘/mnt/<br />

hdc/’; inoltre, si suppone che si tratti proprio di un’unità che può espellere il supporto di<br />

memorizzazione (come nel caso di un lettore CD o DVD).<br />

<strong>31.1</strong>2 X: login grafico<br />

«<br />

X può essere avviato automaticamente, attraverso un sistema di autenticazione grafico, noto<br />

come display manager. In generale si tratta di un demone che viene configurato in modo<br />

da utilizzare una o più stazioni grafiche, locali o remote. Naturalmente, la configurazione<br />

predefinita di un sistema del genere, dovrebbe riguardare esclusivamente una sola stazione<br />

grafica locale.<br />

È bene sottolineare che, quando si tratta di una sola stazione grafica locale, non c’è alcun<br />

bisogno di un sistema del genere e il buon vecchio script ‘startx’ rimane la cosa migliore<br />

per avviare X, evitando in tal modo la presenza di un demone inutile nell’elenco dei processi<br />

elaborativi.<br />

<strong>31.1</strong>2.1 Configurazione generale<br />

«<br />

Nel momento in cui ci si inserisce un sistema grafico per l’autenticazione, prima dell’avvio di<br />

X, cambiano le dipendenze che ci sono tra i file di configurazione (script o porzioni di script).<br />

Pertanto, una configurazione personalizzata attraverso la modifica del file ‘~/.xinitrc’, può<br />

rivelarsi inutile.<br />

L’impostazione scelta da questa o quella distribuzione GNU può essere diversa e bisogna<br />

vedere i file di configurazione del sistema di autenticazione per sapere cosa succede veramente.<br />

Alcune distribuzioni GNU usano in particolare gli script ‘/etc/X11/Xsession’ e ‘~/<br />

.Xsession’ (o ‘~/.xsession’), rispettivamente per la configurazione globale e quella personalizzata<br />

di ogni utente. In questo modo, un utente che prima inseriva nel file ‘~/.xinitrc’<br />

le istruzioni per l’avvio del proprio gestore di finestre preferito, deve usare invece il file ‘~/<br />

.Xsession’ per questo, ma nello stesso modo di prima.<br />

Diversamente, in mancanza della configurazione corretta per l’avvio del gestore di finestre o<br />

di altro sistema del genere, dopo la fase di autenticazione, si avvia il solito servente X con un<br />

terminale e nulla altro.


X 1801<br />

|#!/bin/sh<br />

|xsetroot -solid gray<br />

|xclock -digital -geometry +0-0 &<br />

|xbiff -geometry -0-0 &<br />

|exec twm<br />

Quello che si vede sopra è il contenuto ipotetico di un file ‘~/.Xsession’ predisposto per<br />

l’avvio del gestore di finestre Twm.<br />

<strong>31.1</strong>2.2 Utilizzo attraverso la rete<br />

«<br />

Il programma tipico che offre le funzionalità di un display manager, è in grado di fornire anche<br />

un accesso attraverso la rete, con il protocollo XDMCP (X display manager control protocol),<br />

che utilizza la porta 177. Quello che segue è un estratto dal file ‘/etc/services’:<br />

|...<br />

|xdmcp 177/tcp # X Display Manager Control Protocol<br />

|xdmcp<br />

|...<br />

177/udp<br />

In pratica, un elaboratore remoto deve avviare un proprio servente grafico, con il quale si<br />

collega al programma presso l’elaboratore che offre il servizio XDMCP. Il programma richiede<br />

l’autenticazione e da quel momento inizia una sessione grafica che riguarda l’elaboratore che<br />

offre il servizio, anche se viene gestita materialmente dallo schermo dell’elaboratore remoto.<br />

Per collegarsi a un servizio XDMCP, ammesso che accetti effettivamente richieste di questo<br />

tipo, si può provare presso un elaboratore da usare come terminale un comando come quello<br />

seguente:<br />

$ xinit -- -query 172.21.77.253 [ Invio ]<br />

Oppure, direttamente così:<br />

$ /usr/bin/X11/X vt7 -dpi 100 -query 172.21.77.253 [ Invio ]<br />

In tal caso, l’indirizzo IPv4 172.21.77.253 è proprio quello dell’elaboratore che offre il servizio<br />

XDMCP.<br />

|Figura <strong>31.1</strong>67. Esempio di utilizzo di un servizio XDMCP.


1802 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

<strong>31.1</strong>2.3 Avvio<br />

«<br />

Trattandosi di un sistema di autenticazione, il programma che se ne occupa potrebbe essere<br />

avviato tramite un record appropriato nel file ‘/etc/inittab’, ma in generale si preferisce<br />

l’avvio di un demone attraverso la procedura di inizializzazione del sistema.<br />

<strong>31.1</strong>2.4 Xdm<br />

«<br />

Xdm 24 è il sistema di autenticazione grafica tradizionale di X, incluso anche in XFree86. In<br />

condizioni normali, i file e gli script di configurazione che lo riguardano, dovrebbero trovarsi<br />

nella directory ‘/etc/X11/xdm/’.<br />

La configurazione predefinita dovrebbe prevedere l’apertura di una sola sessione grafica locale,<br />

escludendo l’accesso remoto.<br />

L’avvio del demone ‘xdm’, che si occupa di controllare l’accesso e l’avvio di X, dovrebbe<br />

essere gestito da uno script della procedura di inizializzazione del sistema; per esempio ‘/etc/<br />

init.d/xdm’, o altro simile. Tuttavia, anche avviando direttamente l’eseguibile ‘xdm’, si<br />

ottiene il risultato (naturalmente lo si deve fare con i privilegi dell’utente ‘root’).<br />

Una volta superata la fase di autenticazione in modo corretto, inizia una sessione, controllata<br />

dallo script ‘/etc/X11/xdm/Xsession’. Al termine di questo script termina la sessione e<br />

ritorna la richiesta di autenticazione per quella stazione grafica. In condizioni normali, questo<br />

script dovrebbe richiamare un altro script usato anche per altri sistemi del genere (per<br />

esempio ‘/etc/X11/Xsession’), che a sua volta dovrebbe occuparsi di avviare lo script<br />

personalizzato dell’utente (‘~/.Xsession’ o ‘~/.xsession’).<br />

Quello che si vede sopra è l’interdipendenza tra i processi nel momento in cui il sistema di<br />

autenticazione attende che l’utente si presenti. Si può vedere che è necessaria la presenza del<br />

servente X e in particolare si può poi osservare che tutto funziona con i privilegi dell’utente<br />

‘root’.<br />

Nel momento in cui si supera la fase dell’autenticazione, vengono avviati i processi richiesti<br />

dallo script ‘/etc/X11/xdm/Xsession’ e dagli altri che questo richiama (per esempio<br />

‘~/.Xsession’). In questo caso, come si vede nel riquadro precedente, si tratta del gestore<br />

di finestre Twm. Naturalmente, i processi avviati a partire dallo script ‘/etc/X11/xdm/<br />

Xsession’ hanno i privilegi dell’utente che esegue l’autenticazione.<br />

Il file di configurazione ‘/etc/X11/xdm/xdm-config’ contiene l’elenco degli altri file<br />

utilizzati e di altre opzioni:<br />

|DisplayManager.errorLogFile:<br />

|DisplayManager.pidFile:<br />

|DisplayManager.keyFile:<br />

/var/log/xdm.log<br />

/var/run/xdm.pid<br />

/usr/lib/X11/xdm/xdm-keys


X 1803<br />

|DisplayManager.servers:<br />

|DisplayManager.accessFile:<br />

|DisplayManager.authDir:<br />

|DisplayManager.willing:<br />

/usr/lib/X11/xdm/Xservers<br />

/usr/lib/X11/xdm/Xaccess<br />

/var/lib/xdm<br />

su nobody -c /usr/lib/X11/xdm/Xwilling<br />

|! All displays should use authorization, but we cannot be sure X terminals<br />

|! will be configured to support it, so those that do not will require<br />

|! individual resource settings.<br />

|DisplayManager*authorize:<br />

true<br />

|! Scripts to start the server, start the user session, and reset the server<br />

|DisplayManager*setup:<br />

|DisplayManager*startup:<br />

|DisplayManager*reset:<br />

|DisplayManager*resources:<br />

|DisplayManager*session:<br />

|DisplayManager*authComplain:<br />

/usr/lib/X11/xdm/Xsetup<br />

/usr/lib/X11/xdm/Xstartup<br />

/usr/lib/X11/xdm/Xreset<br />

/usr/lib/X11/xdm/Xresources<br />

/usr/lib/X11/xdm/Xsession<br />

true<br />

|DisplayManager*userPath: /usr/local/bin:/usr/bin:/bin:←↪<br />

↩→/usr/bin/X11:/usr/games<br />

|DisplayManager*systemPath: /usr/local/sbin:/usr/local/bin:←↪<br />

↩→/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11<br />

|<br />

|! SECURITY: do not listen for XDMCP or Chooser requests<br />

|! Comment out this line if you want to manage X terminals with xdm<br />

|DisplayManager.requestPort: 0<br />

Nell’esempio merita molta attenzione l’ultima direttiva: la sua presenza fa sì che venga a mancare<br />

il servizio XDMCP, pertanto i tentativi di collegamento verrebbero rifiutati. Per attivare il<br />

servizio, occorre commentare, o eliminare la direttiva:<br />

|...<br />

|! SECURITY: do not listen for XDMCP or Chooser requests<br />

|! Comment out this line if you want to manage X terminals with xdm<br />

|# DisplayManager.requestPort: 0<br />

Secondo l’esempio mostrato, il file ‘/etc/X11/xdm/Xservers’ permette di controllare l’avvio<br />

locale del servizio di autenticazione grafica. L’esempio seguente apre una sola sessione<br />

che deve collocarsi nella settima console virtuale:<br />

|...<br />

|:0 local /usr/bin/X11/X vt7 -dpi 100 -nolisten tcp<br />

Per avere due sessioni, una nella settima console, l’altra nell’ottava:<br />

|...<br />

|:0 local /usr/bin/X11/X vt7 -dpi 100 -nolisten tcp<br />

|:1 local /usr/bin/X11/X vt8 -dpi 100 -nolisten tcp<br />

Naturalmente, Xdm può servire anche solo per le connessioni remote, attraverso la rete,<br />

pertanto si può benissimo disattivare l’accesso locale, commentando le direttive di questo file.


1804 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Nella configurazione di Xdm c’è un altro file importante da considerare, che secondo la configurazione<br />

già vista è ‘/etc/X11/xdm/Xaccess’. Questo file serve a delimitare l’accessibilità<br />

del servizio XDMCP offerto. La direttiva dell’esempio seguente abilita l’accesso a qualunque<br />

indirizzo:<br />

|...<br />

|#<br />

|# Any host can get a login window:<br />

|#<br />

| *<br />

|...<br />

«<br />

<strong>31.1</strong>2.5 Gdm<br />

Gdm 25 è un altro sistema di autenticazione grafica conforme al gestore di sessione Gnome.<br />

Il principio di funzionamento è lo stesso di Xdm, dove in particolare è possibile scegliere di<br />

avviare sessioni differenti, che fanno riferimento a script diversi.<br />

La configurazione e gli script di Gdm si trovano a partire dalla directory ‘/etc/X11/gdm/’;<br />

in particolare, gli script che consentono di selezionare delle sessioni diverse si trovano nella<br />

directory ‘/etc/X11/gdm/Sessions/’. Uno di questi dovrebbe fare riferimento allo<br />

script ‘/etc/X11/Xsession’, il quale a sua volta si prende cura di avviare anche lo script<br />

personalizzato dell’utente (‘~/.Xsession’ o simile).<br />

Una volta completata la fase di autenticazione, la dipendenza dei processi attivi potrebbe<br />

presentarsi in questo modo:<br />

Per la precisione, i processi avviati dagli script di sessione si trovano ad avere i privilegi<br />

dell’utente che si è autenticato, mentre il resto funziona con i privilegi dell’utente ‘root’.<br />

Gdm è realizzato particolarmente per essere usato con il gestore di sessione Gnome; in tal<br />

caso, al posto di un gestore di finestre, viene avviato l’eseguibile ‘gnome-session’, che a sua<br />

volta controlla un gestore di finestre, in base alla configurazione.<br />

In condizioni particolari, Gdm si rifiuta di avviare la richiesta di autenticazione; ciò, in<br />

particolare, se manca la possibilità di verificare la presenza di un elaboratore corrispondente<br />

al nome restituito da ‘hostname’. Per esempio, l’indicazione corretta del nome,<br />

senza il dominio di appartenenza e senza una direttiva ‘search’ appropriata nel file ‘/etc/<br />

resolv.conf’, può provocare questo tipo di problema.


X 1805<br />

<strong>31.1</strong>2.6 Kdm<br />

Kdm 26 è un altro sistema simile a Xdm, con l’aggiunta della possibilità di selezionare delle<br />

sessioni differenti, come avviene per Gdm. La sua origine richiama il gestore di sessione KDE<br />

e i suoi file di configurazione potrebbero risiedere in ‘/etc/kde2/kdm/’, oppure in ‘/etc/<br />

X11/kdm/’. A ogni modo, la struttura di questi file e di questi script è molto simile a quella<br />

usata da Xdm; anche in questo caso, il file ‘kdm/Xsession’ dovrebbe rimandare allo script<br />

standard ‘/etc/X11/Xsession’, il quale a sua volta dovrebbe utilizzare lo script personale<br />

degli utenti (‘~/.Xsession’ o ‘~/.xsession’).<br />

<strong>31.1</strong>2.7 Wdm<br />

Wdm 27 è un lavoro derivato da Xdm, i cui file di configurazione e gli script principali si<br />

collocano normalmente nella directory ‘/etc/X11/wdm/’. Anche in questo caso è disponibile<br />

la possibilità di avviare sessioni differenti.<br />

<strong>31.1</strong>3 Sessione<br />

Nell’ambito di X, il termine «sessione» si inserisce nel momento in cui esiste un sistema di<br />

autenticazione che controlla l’utilizzo della stazione grafica, trattandosi infatti di una sessione<br />

di lavoro riferita a un certo utente.<br />

In pratica, si tratta di un’astrazione ulteriore nel sistema di script che servono all’avvio del<br />

sistema grafico, dove ‘/etc/X11/xinit/xinitrc’ e ‘~/.xinitrc’ perdono il loro ruolo<br />

dominante, per passarlo allo script ‘/etc/X11/Xsession’ e a ‘~/.xsession’ o ‘~/<br />

.Xsession’.<br />

«<br />

«<br />

«<br />

<strong>31.1</strong>3.1 Il problema che motiva il concetto di «sessione»<br />

Le applicazioni che utilizzano il sistema grafico sono sempre più sofisticate e richiedono funzionalità<br />

che, da solo, X non può dare. Quindi, per poter usare certi programmi con certe<br />

funzionalità, si ha la necessità di avviarne altri, che eventualmente possono non mostrarsi, ma<br />

che comunicano con i primi.<br />

Di norma, questi programmi che coadiuvano le attività svolte con il sistema grafico, non possono<br />

essere avviati prima che il servente X sia disponibile, inoltre devono operare con i privilegi<br />

dell’utente che ha avviato la sessione.<br />

In un certo senso, è come se la sessione grafica corrispondesse all’avvio di un sottosistema<br />

personale, che richiede l’attivazione di certi servizi.<br />

Dal momento che i servizi da avviare dipendono anche dai programmi che si intendono usare,<br />

diventa complicata e onerosa la compilazione di uno script ‘/etc/X11/xinit/xinitrc’ che<br />

provveda a tutte queste cose, nel modo giusto. Pertanto, in un sistema operativo che prevede<br />

la grafica e anche le sessioni, lo script ‘xinitrc’ si limita ad avviare a sua volta lo script<br />

‘Xsession’, il quale però non è da modificare, in quanto a sua volta esegue ciò che trova,<br />

in sequenza, nella directory ‘/etc/X11/Xsession.d/’; ed è lì, eventualmente, che si deve<br />

intervenire.<br />

«


1806 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

<strong>31.1</strong>3.2 Gli script che controllano l’avvio della sessione<br />

«<br />

In un sistema che preveda le sessioni grafiche, lo script ‘/etc/X11/xinit/xinitrc’ si limita<br />

a eseguire il contenuto dello script ‘Xsession’, attraverso l’incorporazione:<br />

|#!/bin/sh<br />

|# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $<br />

|<br />

|# /etc/X11/xinit/xinitrc<br />

|#<br />

|# global xinitrc file, used by all X sessions started by xinit (startx)<br />

|<br />

|# invoke global X session script<br />

|. /etc/X11/Xsession<br />

In pratica, in questo modo il lavoro di ‘/etc/X11/Xsession’ viene eseguito formalmente<br />

dallo stesso ‘xinitrc’.<br />

Il codice contenuto nel file ‘Xsession’ incorpora a sua volta, quello dei file contenuti nella<br />

directory ‘/etc/X11/Xsession.d/’, secondo l’ordine lessicografico. Per esempio, tale<br />

directory potrebbe contenere i file seguenti:<br />

$ ls /etc/X11/Xsession.d [ Invio ]<br />

|/etc/X11/Xsession.d/20x11-common_process-args<br />

|/etc/X11/Xsession.d/30x11-common_xresources<br />

|/etc/X11/Xsession.d/50x11-common_determine-startup<br />

|/etc/X11/Xsession.d/90x11-common_ssh-agent<br />

|/etc/X11/Xsession.d/99x11-common_start<br />

Al termine, se esiste il file ‘~/.xsession’ (oppure ‘~/.Xsession’), viene eseguito anche<br />

il suo contenuto, altrimenti viene avviato ciò che si considera essere il «gestore di sessione»<br />

predefinito.<br />

<strong>31.1</strong>3.3 Gestori di sessione<br />

«<br />

Il gestore di sessione è un programma che dovrebbe facilitare l’uso del sistema grafico, ma<br />

che può anche complicarlo. Il suo compito è quello di consentire all’utente di configurare la<br />

propria sessione attraverso strumenti grafici, oltre che di facilitare la gestione dei servizi grafici<br />

necessari.<br />

In pratica, se non si amano le complicazioni, si potrebbe usare benissimo un gestore di finestre<br />

puro e semplice, mentre un gestore di sessione vero e proprio si trova spesso a dover avvalersi<br />

a sua volta di un gestore di finestre.<br />

Se si usa un sistema di autenticazione grafica sofisticato, può essere possibile la scelta tra<br />

diversi tipi di sessione, corrispondenti solitamente a script di avvio differenti, in cui può essere<br />

richiamato questo o quel gestore di sessione.


X 1807<br />

<strong>31.1</strong>3.4 Gnome<br />

Gnome 28 (pronunciato «g-a-n-o-m-e»), è un gestore di sessione altamente configurabile,<br />

contornato da diversi programmi realizzati specificatamente per rendere l’ambiente uniforme<br />

e confortevole. Naturalmente, i programmi realizzati per Gnome possono funzionare anche<br />

senza questo gestore di sessione: è sufficiente che siano disponibili le librerie grafiche<br />

necessarie.<br />

Il programma eseguibile che rappresenta in pratica il gestore di sessione è ‘gnome-session’.<br />

Il fatto di avviarlo non produce nulla di particolare sullo schermo grafico, salvo che è possibile<br />

configurare l’avvio automatico di altri programmi di contorno, come per esempio il<br />

gestore di finestre.<br />

A proposito del gestore di finestre, è da annotare che questo deve essere compatibile con<br />

Gnome; inoltre, se la propria distribuzione GNU non organizza bene i pacchetti, le prime<br />

volte che si avvia il gestore di sessione Gnome potrebbe essere complicato far partire anche il<br />

gestore di finestre. In mancanza d’altro, basta avviarlo da un terminale grafico, eventualmente<br />

dopo averlo ottenuto da un menù.<br />

Infine, a proposito della dipendenza dei processi elaborativi, è da osservare che le applicazioni<br />

avviate dal gestore di sessione Gnome non risultano discendere da ‘gnome-session’, ma<br />

direttamente dal processo principale (Init). Nell’esempio seguente si vedono diversi processi<br />

relativi a Gnome, staccati da ‘gnome-session’, avviato a sua volta da Gdm:<br />

«<br />

Nelle sezioni seguenti vengono descritti brevemente alcuni programmi essenziali per l’uso del<br />

gestore di sessione Gnome.<br />

<strong>31.1</strong>3.4.1 Gnome control center<br />

Gnome control center è il programma di configurazione di Gnome. Lo si può avviare attraverso<br />

l’eseguibile ‘gnomecc’, oppure da un menù, attraverso una voce che fa riferimento alle<br />

proprietà di qualcosa.<br />

«


1808 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Figura <strong>31.1</strong>79. Gnome control center nella scelta del tipo di gestore di finestre.<br />

<strong>31.1</strong>3.4.2 Gnome panel<br />

«<br />

Gnome panel è un’altra applicazione importante che consente di avere sempre a portata di<br />

mano un menù da cui avviare le applicazioni. Sulla barra di questo menù possono risiedere<br />

anche delle icone per l’avvio rapido dei programmi più importanti, oppure delle applet (applicazioncine),<br />

ovvero programmi che graficamente hanno dimensioni ridotte. Il programma in<br />

questione corrisponde all’eseguibile ‘panel’.<br />

|Figura <strong>31.1</strong>80. Gnome panel, dove si vedono in particolare due bottoni per l’avvio rapido<br />

di applicazioni importanti.<br />

«<br />

<strong>31.1</strong>3.5 KDE<br />

KDE, 29 ovvero K desktop environment, è un altro gestore di sessione, paragonabile a Gnome.<br />

Il programma eseguibile che rappresenta in pratica il gestore di sessione è ‘kde2’. Come nel<br />

caso di Gnome, il fatto di avviarlo non produce nulla di particolare sullo schermo grafico, salvo<br />

il fatto che è possibile configurare l’avvio automatico di altri programmi di contorno, come per<br />

esempio il gestore di finestre.<br />

A proposito della dipendenza dei processi elaborativi, è da osservare che le applicazioni avviate<br />

dal gestore di sessione KDE non risultano discendere da ‘kde2’, ma da ‘kdeinit’; oppure, a<br />

seconda dei casi, possono discendere direttamente da Init. Nell’esempio seguente si vedono<br />

tre terminali aperti con la shell Bash:


X 1809<br />

È probabile che non si riesca a vedere se non si usa semplicemente ‘ps’ per conoscere l’elenco<br />

dei processi attivi, ma esiste un programma fondamentale per KDE, denominato ‘kdesktop’,<br />

il cui scopo è quello di controllare il fondale, sul quale si depositano alcune icone. In altre<br />

parole, si tratta di un processo grafico che non si inserisce in una finestra e ricopre la superficie<br />

grafica, rappresentando in pratica la scrivania grafica di KDE.<br />

In condizioni normali, KDE utilizza un menù alla base della superficie grafica dello schermo,<br />

corrispondente al programma ‘kicker’, come si vede qui sotto:<br />

I programmi che fanno parte della raccolta di KDE sono molti (spesso si tratta di derivazioni di<br />

altri programmi già esistenti, modificati in modo da usare le stesse librerie grafiche e armonizzare<br />

così l’estetica generale), caratterizzati comunemente dall’iniziale comune: «k». Alcuni di<br />

questi programmi sono molto importanti per l’ambiente e vengono descritti brevemente nelle<br />

sezioni seguenti.<br />

<strong>31.1</strong>3.5.1 Kpersonalizer<br />

Kpersonalizer, a cui corrisponde l’eseguibile omonimo (‘kpersonalizer’), consente una<br />

configurazione generale guidata. In particolare, come si vede nella figura <strong>31.1</strong>83, si imposta la<br />

disposizione della tastiera e la nazionalità.<br />

«


1810 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Figura <strong>31.1</strong>83. Kpersonalizer.<br />

«<br />

<strong>31.1</strong>3.5.2 Kcontrol<br />

Lo stesso Kpersonalizer suggerisce di usare Kcontrol, ovvero il centro di controllo, alla fine<br />

della personalizzazione generale, per la definizione più dettagliata della configurazione di<br />

KDE. L’eseguibile corrispondente è ‘kcontrol’.


X 1811<br />

|Figura <strong>31.1</strong>84. Kcontrol.<br />

Kcontrol consente di visualizzare molti aspetti del sistema, anche se per questo, con<br />

GNU/Linux è sufficiente accedere alla directory ‘/proc/’.<br />

<strong>31.1</strong>3.5.3 Kmenuedit<br />

Kmenuedit consente di modificare agevolmente l’elenco delle voci contenute nel menù (il<br />

menù è gestito in pratica da ‘kicker’).<br />

«


1812 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Figura <strong>31.1</strong>85. Kmenuedit.<br />

Eventualmente, è disponibile anche Kappfinder per ottenere una scansione automatica degli<br />

applicativi disponibili e il conseguente aggiornamento del menù in modo automatico.<br />

|Figura <strong>31.1</strong>86. Kappfinder.


X 1813<br />

<strong>31.1</strong>3.5.4 Khelpcenter<br />

Khelpcenter è un sistema integrato per la navigazione della documentazione. In pratica,<br />

consente di leggere la documentazione specifica di KDE, ma anche quella comune dei sistemi<br />

Unix e dei sistemi GNU (Info). La figura <strong>31.1</strong>87 mostra in particolare l’accesso alle<br />

pagine di manuale.<br />

«<br />

|Figura <strong>31.1</strong>87. Khelpcenter.<br />

<strong>31.1</strong>4 Accesso remoto alla sessione di lavoro<br />

Con un terminale a caratteri è possibile gestire una sessione di lavoro trasferibile successivamente<br />

in un altro terminale, attraverso il programma Screen (sezione 15.13); in modo simile, è<br />

possibile agire per quanto riguarda la sessione di lavoro con un servente X, attraverso VNC, 30<br />

ovvero Virtual network computing.<br />

È bene ricordare che X offre già la possibilità di eseguire un programma in un elaboratore,<br />

mostrandone le finestre nel servente di un altro (sezione 31.5.5). Diversamente da questa modalità<br />

comune di utilizzo di X, VNC consente di controllare tutto il servente grafico e il gestore<br />

di finestre (o anche il gestore di sessione) relativo. Inoltre, VNC consente anche un accesso<br />

simultaneo da parte di più terminali remoti, solitamente per permettere la visualizzazione di<br />

ciò che avviene.<br />

«<br />

VNC è uno strumento utile soprattutto nell’ambito di una rete locale protetta dall’esterno,<br />

dal momento che utilizza una comunicazione in chiaro e che l’accesso al servente è<br />

controllato semplicemente da una parola d’ordine.


1814 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

<strong>31.1</strong>4.1 Funzionamento di VNC in generale<br />

«<br />

VNC si compone essenzialmente di un programma servente, con le funzionalità grafiche di X,<br />

il quale non si collega a una stazione grafica e viene usato attraverso un programma cliente<br />

apposito. Questo servente comunica nel modo consueto, come un servente X normale (connessioni<br />

TCP alle porte 6000+n) a cui si aggiunge la comunicazione necessaria al controllo<br />

attraverso il proprio cliente specifico, con le porte 5900+n.<br />

|Figura <strong>31.1</strong>88. Comunicazione tra il servente e il cliente VNC.<br />

La figura mostra una situazione comune, in cui un elaboratore ospita un servente VNC,<br />

dinkel.brot.dg, che offre la stazione grafica virtuale ‘:1’. In tal modo, la comunicazione<br />

con il servente avviene alla porta 5901 (ovvero 5900 più il numero corrispondente alla<br />

stazione grafica virtuale).<br />

Nell’elaboratore che ospita il servente VNC, l’interazione con questo non risulta apparente, a<br />

meno di avviare nello stesso un cliente VNC.<br />

Il cliente VNC, a sua volta, potrebbe essere autonomo, oppure richiedere un servente X normale<br />

per poter funzionare. Il programma mostrato in figura è un esempio di cliente che richiede<br />

X per poter funzionare.<br />

Un servente VNC può essere utilizzato da un solo cliente, oppure può essere consentito un<br />

accesso simultaneo da parte di più clienti; in tal caso, probabilmente, viene concesso a uno solo<br />

di interagire, mentre agli altri è permesso solo osservare. Pertanto, le situazioni più comuni di<br />

utilizzo di un sistema grafico basato su VNC sono due: l’esigenza di mantenere in funzione<br />

una sessione di lavoro grafica, a cui poter accedere da un terminale remoto, sospendendo e<br />

riprendendo la connessione anche da altre posizioni; oppure l’esigenza di fare un lavoro che<br />

altri utenti possono visualizzare, senza bisogno di un proiettore.<br />

L’accesso a un servente VNC è controllato esclusivamente attraverso il confronto di una parola<br />

d’ordine, definita in modo indipendente dal meccanismo di riconoscimento degli utenti del<br />

sistema operativo.


X 1815<br />

<strong>31.1</strong>4.2 Avvio e conclusione del funzionamento del servente VNC<br />

in un sistema GNU<br />

«<br />

Il funzionamento del servente VNC dipende dalla configurazione del servente X: se X non<br />

funziona correttamente a causa di un difetto di configurazione, anche il servente VNC non<br />

può funzionare. Pertanto, di solito si avvia un servente VNC da una sessione X già attiva,<br />

probabilmente da una finestra di terminale:<br />

|<br />

|vncserver [:n_stazione_grafica] [opzioni] |<br />

Il programma ‘vncserver’ è in realtà un involucro per controllare l’avvio di ‘Xvnc’,<br />

‘Xrealvnc’ o ‘Xtightvnc’ (dipende dall’edizione e ci possono essere anche altri nomi), che<br />

è invece il vero servente VNC.<br />

Generalmente, l’avvio del servente VNC avviene sulla stazione grafica ‘:1’, anche quando la<br />

stazione grafica ‘:0’ non risulta impegnata, salvo che sia indicato diversamente con le opzioni<br />

della riga di comando.<br />

Quando un utente avvia per la prima volta un servente VNC nel modo descritto, questo crea<br />

la directory ‘~/.vnc/’, in cui vengono annotate le informazioni sulle sessioni di lavoro relative,<br />

oltre a un file contenente una parola d’ordine cifrata, che serve per consentire l’accesso<br />

successivo. In ogni caso, la prima volta provvede ‘vncserver’ a preparare tutto; l’esempio<br />

seguente si riferisce all’utente ‘tizio’ presso l’elaboratore dinkel.brot.dg:<br />

$ vncserver [ Invio ]<br />

|You will require a password to access your desktops.<br />

Password: digitazione_all’oscuro [ Invio ]<br />

Verify: digitazione_all’oscuro [ Invio ]<br />

|New ’X’ desktop is dinkel:1<br />

|<br />

|Starting applications specified in /etc/X11/Xsession<br />

|Log file is /home/tizio/.vnc/dinkel:1.log<br />

Come si può intendere, viene richiesta l’indicazione e la conferma di una parola d’ordine, che<br />

non può essere troppo breve, la quale viene conservata nel file ‘~/.vnc/passwd’ in forma<br />

cifrata. Quando l’utente dovesse avviare nuovamente un servente VNC, disponendo già di<br />

questo file, non verrebbe più chiesta la parola d’ordine, rimanendo la stessa già stabilita in<br />

precedenza.<br />

Superata questa fase, viene avviato effettivamente il servente VNC. Nell’esempio risulta avviato<br />

sulla stazione grafica virtuale ‘:1’; pertanto, per poterlo raggiungere, si deve usare un<br />

indirizzo del tipo dinkel.brot.dg:1 (in generale conviene evitare la forma abbreviata<br />

che viene suggerita da ‘vncserver’).<br />

Al termine, ‘vncserver’ ricorda dove si può trovare il file in cui sono annotate le informazioni<br />

specifiche sull’avvio del servente VNC, che diventa molto utile quando questo non si avvia


1816 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

come si desidera, per scoprire l’origine del problema. In generale, questo file ha la forma: ‘~/<br />

.vnc/nodo:n_stazione_grafica.log’.<br />

Non sono da escludere problemi di configurazione di XFree86, che XFree86 stesso è in<br />

grado di superare, mentre il servente VNC non può.<br />

Inizialmente, il contenuto di questo file può essere simile al testo seguente:<br />

|15/12/02 09:09:00 Xvnc version 3.3.5 - built Nov 22 2002 09:33:52<br />

|15/12/02 09:09:00 Copyright (C) 2002 RealVNC Ltd.<br />

|15/12/02 09:09:00 Copyright (C) 1994-2000 AT&T Laboratories Cambridge.<br />

|15/12/02 09:09:00 All Rights Reserved.<br />

|15/12/02 09:09:00 See http://www.realvnc.com for information on VNC<br />

|15/12/02 09:09:00 Desktop name ’X’ (dinkel:1)<br />

|15/12/02 09:09:00 Protocol version supported 3.3<br />

|15/12/02 09:09:00 Listening for VNC connections on TCP port 5901<br />

Eventualmente, se sono stati installati i componenti necessari di VNC, ‘vncserver’ avvia il<br />

servente VNC in modo da offrire anche un accesso HTTP alla porta 5800+n, per mezzo del<br />

quale, con un navigatore in grado di mettere in funzione programmi Java, è possibile accedere<br />

in mancanza di un programma cliente migliore. In tal caso, si può osservare questo fatto nello<br />

stesso file appena mostrato:<br />

|15/12/02 09:09:00 Listening for HTTP connections on TCP port 5801<br />

|15/12/02 09:09:00 URL http://dinkel:5801<br />

In questo caso, l’indirizzo per accedere è preferibilmente http://<br />

dinkel.brot.dg:5801.<br />

Se si vuole avviare il servente VNC senza avviare prima X, le cose si complicano un po’.<br />

Infatti, quando ciò è possibile, X determina da solo alcune informazioni sul funzionamento<br />

dell’adattatore grafico e sulle capacità dello schermo reale; pertanto, quando si avvia il servente<br />

VNC da una sessione di X già attiva, le stesse informazioni vengono utilizzate da VNC,<br />

mentre in mancanza di queste, il funzionamento di VNC dipenderebbe da parametri predefiniti,<br />

spesso non gradevoli. Per esempio, avviando un servente VNC senza l’appoggio di un<br />

servente XFree86 preesistente, si ottiene una stazione grafica impostata sostanzialmente per<br />

un adattatore di tipo VGA standard (640×480 punti grafici e una profondità di colori modesta).<br />

L’esempio seguente mostra l’avvio di un servente VNC, attraverso ‘vncserver’, al di<br />

fuori di una sessione di lavoro con X, dove si specifica la dimensione della superficie grafica<br />

(1024×768 punti grafici) e la profondità di colori (16 bit):<br />

$ vncserver -depth 16 -geometry 1024x768 [ Invio ]<br />

Per concludere il funzionamento del servente VNC, presso l’elaboratore locale, si può usare<br />

‘vncserver’ con l’opzione ‘-kill’:<br />

|<br />

|vncserver -kill :n_stazione_grafica<br />

|<br />

Al termine della descrizione dell’avvio di un servente VNC, è bene chiarire che, quando accede<br />

un cliente VNC, se già esiste un altro programma cliente collegato, generalmente questo


X 1817<br />

(quello preesistente) termina di funzionare. In pratica, in condizioni normali, si suppone che<br />

l’utente che accede a un servente VNC sia l’unico autorizzato a farlo, pertanto, se è rimasta<br />

una sessione aperta, ciò è dovuto probabilmente a una dimenticanza dello stesso. Per consentire<br />

degli accessi simultanei al servente VNC, è necessaria l’opzione ‘-alwaysshared’,<br />

come descritto nella tabella seguente, che riepiloga alcune opzioni per l’avvio dell’involucro<br />

‘vncserver’.<br />

|Tabella <strong>31.1</strong>93. Alcune opzioni della riga di comando di ‘vncserver’.<br />

Opzione o argomento<br />

Descrizione<br />

Consente di indicare espressamente<br />

il numero di stazione grafica da<br />

| :n_stazione_grafica utilizzare. In mancanza di questa<br />

informazione dovrebbe trattarsi di<br />

‘:1’.<br />

|<br />

Definisce la dimensione della superficie<br />

grafica da utilizzare, in punti<br />

-geometry n_punti_larghezzaxn_punti_altezza<br />

grafici.<br />

|<br />

Definisce la profondità di colori<br />

-depth n_bit<br />

espressa in numero di bit.<br />

Consente di impedire o consentire la<br />

| -nevershared<br />

condivisione multipla del servente. In<br />

pratica, la prima delle due opzioni<br />

| -alwaysshared è quella predefinita, per fare in modo<br />

che solo un accesso per volta sia<br />

permesso.<br />

|<br />

Avvia all’interno del servente grafico<br />

-startup programma<br />

il programma o lo script indicato.<br />

Conclude il funzionamento del servente,<br />

in funzione nell’elaboratore lo-<br />

|<br />

-kill :n_stazione_grafica<br />

cale, controllando la stazione grafica<br />

indicata.<br />

<strong>31.1</strong>4.3 Avvio del servente VNC in condizioni difficili in un sistema<br />

GNU<br />

L’impostazione effettiva di un servente X in una distribuzione GNU, può essere molto complessa.<br />

In altri termini, il funzionamento di ‘xinit’ e di ‘startx’, non è perfettamente uniforme<br />

da una distribuzione all’altra, spesso per la necessità di arginare dei problemi di sicurezza.<br />

Pertanto, qualsiasi sia la ragione, può succedere che un servente VNC non si comporti<br />

come ci si aspetterebbe; si può arrivare anche a vedere funzionare il servente, ma senza un<br />

gestore di finestre o un gestore di sessione.<br />

Di fronte a problemi di questo tipo, può essere più conveniente avviare direttamente il servente<br />

VNC senza l’aiuto dell’involucro ‘vncserver’, predisponendo uno script adatto alle proprie<br />

esigenze. Vengono mostrati qui due script: uno per controllare ‘Xvnc’, ovvero l’eseguibile del<br />

servente VNC, l’altro per controllare l’avvio di un gestore di finestre, chiamato all’interno del<br />

primo. A fianco di questi esempi, ne vengono mostrati comunque anche di equivalenti in cui si<br />

utilizza ‘vncserver’, ma in modo da ottenere lo stesso risultato, perché alle volte può essere<br />

vero il contrario, ovvero che senza ‘vncserver’ non si riesca ad avviare VNC.<br />

«


1818 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Come già accennato, il programma eseguibile del servente VNC può essere denominato<br />

‘Xvnc’, ‘Xrealvnc’ o ‘Xtightvnc’, a seconda dell’edizione. Tuttavia, è normale che sia<br />

disponibile almeno un collegamento simbolico che consenta l’uso del nome ‘Xvnc’.<br />

|#!/bin/sh<br />

|# vncs1024<br />

|<br />

|# X fonts.<br />

|VNC_FONTS=\<br />

|/usr/lib/X11/fonts/misc,\<br />

|/usr/lib/X11/fonts/75dpi,\<br />

|/usr/lib/X11/fonts/100dpi/,\<br />

|/usr/lib/X11/fonts/Type1/,\<br />

|/usr/lib/X11/fonts/Speedo/<br />

|<br />

|# Quit old VNC servers and reset personal configuration.<br />

|killall Xvnc 2> /dev/null<br />

|killall Xrealvnc 2> /dev/null<br />

|killall Xtightvnc 2> /dev/null<br />

|rm -rf<br />

|mkdir<br />

~/.vnc<br />

~/.vnc<br />

|vncpasswd ~/.vnc/passwd<br />

|<br />

|# Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

|Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \<br />

| -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -dpi 100 2> ~/.vnc/log &<br />

|<br />

|# Start the window manager inside a wrap script.<br />

|# After window manager run, the VNC server should be killed, by<br />

|# the wrap script.<br />

|vncwm &<br />

|#!/bin/sh<br />

|# vncwm<br />

|xloadimage -display :1 -onroot -fullscreen ~/.wallpaper<br />

|fvwm -display :1 2> /dev/null ; killall Xvnc ; \<br />

| killall Xrealvnc ; \<br />

| killall Xtightvnc<br />

Il primo di questi due script, denominato qui ‘vncs1024’, definisce inizialmente una variabile<br />

di ambiente, contenente l’elenco delle directory dei caratteri di X (questa informazione può essere<br />

tratta eventualmente dal file di configurazione di X: ‘/etc/X11/XF86Config<br />

*’, ‘/etc/<br />

X11/xorg.conf’, ecc.). Successivamente elimina i processi avviati con il nome ‘Xvnc’,<br />

‘Xrealvnc’ o ‘Xtightvnc’, ammesso che ce ne siano, poi elimina anche il contenuto del-


X 1819<br />

la directory ‘~/.vnc/’; quindi chiede di definire una parola d’ordine nuova, con l’aiuto di<br />

‘vncpasswd’.<br />

Quando tutto è pronto, si avvia l’eseguibile ‘Xvnc’, utilizzando la stazione grafica ‘:1’ (come<br />

fa normalmente ‘vncserver’), con un elenco piuttosto lungo di opzioni, come si può vedere<br />

dall’esempio. In particolare, in questo caso, si specifica una dimensione della superficie grafica<br />

di 1024×768 punti grafici, inviando il flusso dello standard error nel file ‘~/.vnc/log’, per<br />

poter sapere ciò che accade. Si osservi inoltre che ‘Xvnc’ viene avviato sullo sfondo in modo<br />

esplicito.<br />

Infine si avvia uno script ‘vncwm’, il cui scopo è quello di avviare un gestore di finestre e<br />

di chiudere il funzionamento di ‘Xvnc’, ‘Xrealvnc’ o ‘Xtightvnc’, al termine del funzionamento<br />

di questo. Infatti, come si vede, lo script carica un fondale e avvia Fvwm: al termine<br />

del funzionamento di Fvwm elimina tutti i processi con il nome ‘Xvnc’, ‘Xrealvnc’ e<br />

‘Xtightvnc’.<br />

Naturalmente, in questo modo si può avviare un solo servente VNC alla volta.<br />

Da quanto visto si intuisce la sintassi per l’avvio dell’eseguibile ‘Xvnc’:<br />

|<br />

|Xvnc [:n_stazione_grafica] [opzioni] |<br />

Segue la descrizione di alcune opzioni della riga di comando.<br />

|Tabella <strong>31.1</strong>96. Alcune opzioni della riga di comando di ‘Xvnc’. Si osservi che a seconda<br />

della realizzazione di VNC, alcune opzioni potrebbero non funzionare.<br />

Opzione o argomento<br />

Descrizione<br />

Consente di indicare espressamente<br />

il numero di stazione grafica da<br />

| :n_stazione_grafica utilizzare. In mancanza di questa<br />

informazione si tenta di usare ‘:0’.<br />

|<br />

-auth file Definisce il nome del file usato per<br />

l’autenticazione di X.<br />

|<br />

Definisce la dimensione della superficie<br />

grafica da utilizzare, in punti<br />

-geometry n_punti_larghezzaxn_punti_altezza<br />

grafici.<br />

|<br />

Definisce la profondità di colori<br />

-depth n_bit<br />

espressa in numero di bit.<br />

Consente di impedire o consentire la<br />

| -nevershared<br />

condivisione multipla del servente. In<br />

pratica, la prima delle due opzioni<br />

| -alwaysshared è quella predefinita, per fare in modo<br />

che solo un accesso per volta sia<br />

permesso.<br />

|<br />

Definisce il tempo massimo di attesa,<br />

-rfbwait n_millisecondi<br />

in millisecondi, per un cliente VNC.<br />

|<br />

Definisce il file contenente la parola<br />

d’ordine cifrata che serve per<br />

-rfbauth file<br />

consentire l’accesso.<br />

|<br />

-rfbport n_porta<br />

Definisce il numero della porta usata<br />

per la comunicazione con i clienti<br />

VNC.


1820 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

Opzione o argomento<br />

Descrizione<br />

|<br />

Definisce l’elenco dei percorsi delle<br />

-fp stringa directory contenenti informazioni sui<br />

caratteri tipografici da usare.<br />

Definisce il file contenente le informazioni<br />

sui colori, senza l’estensione<br />

‘.txt’. Generalmente si rico-<br />

|<br />

-co file pia il percorso indicato nella direttiva<br />

‘RgbPath’ del file ‘/etc/X11/<br />

XF86Config[-4]’ o ‘/etc/X11/<br />

xorg.conf’.<br />

|<br />

Definisce la risoluzione in punti per<br />

-dpi n_punti<br />

pollice.<br />

In alternativa all’avvio diretto di ‘Xvnc’, il comando di avvio potrebbe essere sostituito così:<br />

|...<br />

|# Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

|vncserver :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \<br />

| -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -dpi 100 \<br />

| -startup true 2> ~/.vnc/log &<br />

|...<br />

Si può osservare la comparsa dell’opzione ‘-startup’, con la quale si vuole evitare che<br />

‘vncserver’ avvii autonomamente un gestore di sessione o altro, che comunque viene già<br />

controllato all’interno del proprio script.<br />

<strong>31.1</strong>4.4 Configurazione e utilizzo dei caratteri tipografici<br />

«<br />

Non esiste una configurazione vera e propria del servente VNC; esiste piuttosto una configurazione<br />

di ‘vncserver’, che di solito si lascia commentata completamente. In ogni caso, si<br />

tratta del file ‘/etc/vnc.conf’ ed eventualmente di ‘~/.vncrc’.<br />

L’utilizzo di questi file diventa utile, quindi, solo se si avvia il servente VNC attraverso<br />

‘vncserver’ e si sono manifestati dei problemi a cui si pone rimedio solo con la<br />

configurazione.<br />

Una situazione in cui è necessario intervenire nella configurazione è la presenza di direttive<br />

‘FontPath’ nel file di configurazione di X (‘/etc/X11/XF86Config<br />

*’, ‘/etc/X11/<br />

xorg.conf’, ecc.), che fanno riferimento a caratteri tipografici non esistenti; per esempio<br />

quando queste informazioni sono fornite da un servente di caratteri che in quel momento non<br />

risulta rispondere. In tal caso, si può specificare nella configurazione quali percorsi sono sicuri,<br />

tralasciando il superfluo.


X 1821<br />

<strong>31.1</strong>4.5 Accesso a un servente VNC<br />

«<br />

Si può accedere a un servente VNC con diversi programmi, ma in un sistema GNU dovrebbe<br />

essere preferibile farlo attraverso ‘xvncviewer’. Come lascia intuire il nome, si tratta di un<br />

programma che richiede l’uso di un servente X già attivo, che mostra poi la stazione grafica<br />

remota in una finestra di quella locale.<br />

Di solito è necessario avviare ‘xvncviewer’ da una finestra di terminale, per poter specificare<br />

a quale nodo di rete e a quale stazione grafica collegarsi. Si utilizza la sintassi seguente:<br />

|<br />

|xvncviewer [opzioni] nodo:n_stazione_grafica<br />

|<br />

Se nella riga di comando non viene specificata l’opzione ‘-passwd’ (con la quale si indica<br />

un file contenente una parola d’ordine cifrata), è necessario inserire la parola d’ordine per<br />

l’accesso al servente VNC:<br />

$ xvncviewer dinkel.brot.dg:1 [ Invio ]<br />

|VNC viewer version 3.3.5 - built Nov 22 2002 09:31:25<br />

|Copyright (C) 2002 RealVNC Ltd.<br />

|Copyright (C) 1994-2000 AT&T Laboratories Cambridge.<br />

|See http://www.realvnc.com for information on VNC.<br />

|VNC server supports protocol version 3.3 (viewer 3.3)<br />

Password: digitazione_all’oscuro [ Invio ]<br />

Successivamente vengono visualizzate altre informazioni, quindi appare la finestra relativa alla<br />

comunicazione con il servente VNC.<br />

Se quello che si vede è solo uno sfondo grigio, senza applicazioni attive, dove premendo i<br />

tasti del mouse non si ottiene nulla, è probabile che il servente VNC sia stato avviato senza<br />

un gestore di finestre o un gestore di sessione.<br />

Quando si vuole visualizzare semplicemente ciò che accade in un servente VNC, senza<br />

poter interferire, mentre un altro cliente VNC sta interagendo, si può usare l’opzione<br />

‘-viewonly’, assieme a ‘-shared’. Eventualmente, dalla parte del servente si può usare l’opzione<br />

‘-alwaysshared’ per garantire che sia consentito l’accesso simultaneo da parte di più<br />

clienti (questa opzione vale sia per l’avvio diretto di ‘Xvnc’, sia per l’involucro ‘vncserver’):<br />

$ xvncviewer -viewonly dinkel.brot.dg:1 [ Invio ]<br />

Segue la descrizione di alcune opzioni.


1822 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|Tabella <strong>31.1</strong>99. Alcune opzioni della riga di comando di ‘xvncviewer’.<br />

Opzione o argomento<br />

Descrizione<br />

| nodo:n_stazione_grafica Consente di indicare il nodo di rete e il numero di<br />

stazione grafica da utilizzare.<br />

| -shared Richiede una connessione a un servente VNC, consentendo<br />

esplicitamente la condivisione dello stesso con altri clienti.<br />

Richiede una connessione a un servente VNC per la sola visualizzazione<br />

di ciò che accade. Di solito si usa assieme<br />

| -viewonly all’opzione ‘-shared’.<br />

| -fullscreen Fa in modo di funzionare occupando tutta la superficie<br />

disponibile, senza il contorno di una finestra.<br />

Consente di specificare un file contenente una parola d’ordine<br />

cifrata, che dovrebbe corrispondere a quanto utilizzato<br />

|<br />

-passwd file<br />

dallo stesso servente, in modo da non richiedere all’utente<br />

l’inserimento della stessa.<br />

«<br />

<strong>31.1</strong>4.6 Utilizzo comune di VNC<br />

La situazione in cui è più comune l’utilizzo di VNC è quella dell’utente che si trova lontano<br />

dal proprio elaboratore, al quale può comunque accedere attraverso la rete. In generale, in<br />

questo elaboratore remoto non è già in funzione alcun servente VNC, pertanto conviene avviare<br />

X nell’elaboratore di cui si dispone temporaneamente; quindi, da lì, con una finestra di<br />

terminale, si può contattare l’elaboratore remoto e avviare il servente VNC. Se tutto funziona<br />

correttamente, il servente VNC viene avviato con caratteristiche compatibili alla grafica di cui<br />

si dispone effettivamente; quindi ci si può collegare con un cliente VNC.<br />

elaboratore_locale$ ssh tizio@dinkel.brot.dg [ Invio ]<br />

In questo modo ci si collega all’elaboratore dinkel.brot.dg utilizzando l’utenza ‘tizio’.<br />

Successivamente si avvia il servente VNC presso l’elaboratore remoto:<br />

elaboratore_remoto$ vncserver [ Invio ]<br />

Quindi, se tutto ha funzionato correttamente ci si collega con un cliente VNC:<br />

elaboratore_remoto$ exit [ Invio ]<br />

elaboratore_locale$ xvncviewer dinkel.brot.dg:1 [ Invio ]<br />

<strong>31.1</strong>4.7 VNC attraverso un tunnel cifrato con il protocollo SSH<br />

«<br />

Attraverso Secure Shell (sezione 49.7) è possibile creare un tunnel cifrato, per utilizzare con<br />

più tranquillità l’accesso a un servente VNC. Viene riproposto l’esempio di utilizzo comune,<br />

utilizzando un tunnel del genere:<br />

elaboratore_locale$ ssh tizio@dinkel.brot.dg [ Invio ]<br />

In questo modo ci si collega all’elaboratore dinkel.brot.dg utilizzando l’utenza ‘tizio’.<br />

Successivamente si avvia il servente VNC presso l’elaboratore remoto:<br />

elaboratore_remoto$ vncserver [ Invio ]


X 1823<br />

Dall’elaboratore locale ci si collega nuovamente con l’elaboratore remoto per creare un tunnel<br />

cifrato:<br />

elaboratore_remoto$ exit [ Invio ]<br />

elaboratore_locale$ ssh -N -L 5901:dinkel.brot.dg:5901 [ Invio ]<br />

A questo punto, invece di contattare direttamente l’elaboratore remoto dinkel.brot.dg, è<br />

invece sufficiente collegarsi a quello locale; prima però, conviene mettere il programma ‘ssh’<br />

sullo sfondo:<br />

[ Ctrl z ]<br />

elaboratore_locale$ bg [ Invio ]<br />

elaboratore_locale$ xvncviewer localhost:1 [ Invio ]<br />

<strong>31.1</strong>4.8 Inserire VNC automaticamente all’avvio di X<br />

«<br />

È possibile realizzare uno script con cui si avvia un servente VNC e subito dopo X con un<br />

cliente VNC, a tutto schermo, che punta esattamente al servente locale, senza interferire con<br />

l’utente. Questo tipo di tecnica può servire in un laboratorio didattico in due casi: quando<br />

l’insegnante vuole avviare una sessione di lavoro grafica, pronta subito perché gli studenti vi<br />

si possano collegare, evitando così di utilizzare una lavagna luminosa; quando si vuole fare<br />

avviare agli studenti la sessione di lavoro grafica in modo che l’insegnante abbia la possibilità<br />

di intervenire sul loro lavoro, senza doversi spostare fisicamente dalla sua postazione.<br />

|#!/bin/sh<br />

|# vncsc1024<br />

|<br />

|# X fonts.<br />

|VNC_FONTS=\<br />

|/usr/lib/X11/fonts/misc,\<br />

|/usr/lib/X11/fonts/75dpi,\<br />

|/usr/lib/X11/fonts/100dpi/,\<br />

|/usr/lib/X11/fonts/Type1/,\<br />

|/usr/lib/X11/fonts/Speedo/<br />

|<br />

|# Quit old VNC servers and reset personal configuration.<br />

|killall Xvnc 2> /dev/null<br />

|killall Xrealvnc 2> /dev/null<br />

|killall Xtightvnc 2> /dev/null<br />

|rm -rf<br />

|mkdir<br />

~/.vnc<br />

~/.vnc<br />

|vncpasswd ~/.vnc/passwd<br />

|<br />

|# Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

|Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \<br />

| -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -alwaysshared nologo -dpi 100 2> ~/.vnc/log &


1824 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|<br />

|# Start the window manager inside a wrap script.<br />

|# After window manager run, the VNC server should be killed, by<br />

|# the wrap script.<br />

|vncwm &<br />

|<br />

|# Start xinit with xvncviewer as a client<br />

|xinit /usr/bin/xvncviewer -fullscreen -passwd ~/.vnc/passwd localhost:1<br />

Come si può osservare, questo esempio è molto simile a quanto già visto in una sezione precedente,<br />

dove la novità sta nell’avviare, dopo lo script ‘vncwm’, ‘xinit’ specificando l’avvio di<br />

‘xvncviewer’ al posto del solito gestore di finestre. Naturalmente, lo script ‘vncwm’ rimane<br />

tale e quale a prima:<br />

|#!/bin/sh<br />

|# vncwm<br />

|xloadimage -display :1 -onroot -fullscreen ~/.wallpaper<br />

|fvwm -display :1 2> /dev/null ; killall Xvnc ; \<br />

| killall Xrealvnc ; \<br />

| killall Xtightvnc<br />

Come si può intuire, lo script che qui è stato chiamato ‘vncsc1024’ è adatto per l’insegnante<br />

(o il relatore) che vuole consentire l’accesso ai suoi studenti, a cui deve comunicare anche la<br />

parola d’ordine per accedere, che come si vede viene sostituita ogni volta. Diversamente, se<br />

si vuole realizzare uno script da fare usare agli studenti al posto del solito ‘startx’, si deve<br />

fare in modo che il file della parola d’ordine sia già stato preparato e sia «standard»; l’estratto<br />

seguente mostra solo le istruzioni salienti da modificare:<br />

|# Quit old VNC servers and reset personal configuration.<br />

|killall Xvnc 2> /dev/null<br />

|killall Xrealvnc 2> /dev/null<br />

|killall Xtightvnc 2> /dev/null<br />

|rm -rf ~/.vnc<br />

|mkdir ~/.vnc<br />

|cp /etc/vnc/sharedx.passwd ~/.vnc/passwd<br />

|chmod 0600 ~/.vnc/passwd<br />

Anche qui è possibile utilizzare ‘vncserver’ con l’aggiunta dell’opzione ‘-startup’:<br />

|...<br />

|# Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

|Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \<br />

| -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -alwaysshared nologo -dpi 100 \<br />

| -startup true 2> ~/.vnc/log &<br />

|...


X 1825<br />

<strong>31.1</strong>4.9 RealVNC e TightVNC<br />

I due filoni principali dello sviluppo di VNC sono rappresentati da RealVNC e da TightVNC.<br />

In generale, questi lavori sono abbastanza compatibili tra di loro, comunque vale la pena di<br />

conoscere i nomi con cui potrebbero essere distinti i programmi e gli script che li riguardano:<br />

«<br />

VNC VNC4 RealVNC TightVNC<br />

‘Xvnc’ ‘Xvnc4’ ‘Xrealvnc’ ‘Xtightvnc’<br />

‘vncserver’ ‘vnc4server’ ‘realvncserver’ ‘tightvncserver’<br />

‘xvncviewer’ ‘xvnc4viewer’ ‘xrealvncviewer’ ‘xtightvncviewer’<br />

‘vncconnect’ ‘vnc4connect’ ‘realvncconnect’ ‘tightvncconnect’<br />

‘vncpasswd’ ‘vnc4passwd’ ‘vncpasswd.real’ --<br />

<strong>31.1</strong>4.10 Script «vncrc»<br />

La distribuzione NLNX (volume III) includeva uno script, denominato ‘vncrc’ (oggi incorporato<br />

in ‘nlnxrc’), con lo scopo di facilitare l’uso di VNC (RealVNC o TightVNC), nelle<br />

situazioni più comuni. Viene proposta qui una versione semplificata di quello script, che potrebbe<br />

essere utile anche al di fuori del contesto particolare di NLNX. Una copia dovrebbe<br />

essere disponibile anche qui: 〈allegati/vncrc 〉).<br />

«<br />

|#!/bin/sh<br />

|##<br />

|## Multipurpose script to use VNC.<br />

|##<br />

|#<br />

|# Main variables.<br />

|#<br />

|TEMPORARY=‘tempfile‘<br />

|touch $TEMPORARY<br />

|SELECTION=""<br />

|#<br />

|GEOMETRY=""<br />

|DEPTH=""<br />

|#<br />

|VNC_REMOTE_SERVER=‘cat /etc/nlnx/all/VNC_REMOTE_SERVER 2> /dev/null‘<br />

|VNC_REMOTE_SERVERS=‘cat /etc/nlnx/all/VNC_REMOTE_SERVERS 2> /dev/null‘<br />

|#<br />

|# Encripted default password.<br />

|# bla bla bla: zxdftipe<br />

|#<br />

|ENCRIPTED_PASSWORD="zxdftipe"<br />

|PASSWORD_FILE="$HOME/.vnc/passwd"<br />

|#<br />

|# X fonts.<br />

|#<br />

|VNC_FONTS=\<br />

|/usr/lib/X11/fonts/misc/,\<br />

|/usr/lib/X11/fonts/75dpi/:unscaled,\<br />

|/usr/lib/X11/fonts/100dpi/:unscaled,\<br />

|/usr/lib/X11/fonts/75dpi/,\<br />

|/usr/lib/X11/fonts/100dpi/,\


1826 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

|/usr/lib/X11/fonts/Type1/,\<br />

|/usr/lib/X11/fonts/Speedo/<br />

|#<br />

|# Command line arguments.<br />

|#<br />

|PROGRAM_NAME=‘basename $0‘<br />

|ARGUMENTS="$@"<br />

|#<br />

|# Main menu.<br />

|#<br />

|# srvr = server<br />

|# cclnt = controlling client<br />

|# vclnt = viewing client<br />

|#<br />

|main_menu () {<br />

| if dialog \<br />

| --clear \<br />

| --title "VNC run commands" \<br />

| --menu "VNC server works at \":1\" and X works at \":0\"" \<br />

| 0 0 0 \<br />

| "vncs" "srvr + new password" \<br />

| "vncsc" "srvr + cclnt + X + new password" \<br />

| "vnccx" " cclnt + X + password \"$PASSWORD_FILE\"" \<br />

| "vncvx" " vclnt + X + password \"$PASSWORD_FILE\"" \<br />

| "vncc" " cclnt + X + password \"$PASSWORD_FILE\"" \<br />

| "vncv" " vclnt + X + password \"$PASSWORD_FILE\"" \<br />

| "sharedx" "srvr + cclnt + X + default password" \<br />

| "takesharedx" " cclnt + X + default password" \<br />

| "viewsharedx" " vclnt + X + default password" \<br />

| 2> $TEMPORARY<br />

| then<br />

| SELECTION=‘cat $TEMPORARY‘<br />

| echo "" > $TEMPORARY<br />

| #<br />

| # Test if the command can be done<br />

| #<br />

| if false<br />

| then<br />

| #<br />

| # There are troubles... (to be done).<br />

| #<br />

| dialog --msgbox "There are unknown troubles..." 0 0<br />

| else<br />

| #<br />

| # Continue as run with this command name (arguments included).<br />

| #<br />

| PROGRAM_NAME="$SELECTION"<br />

| fi<br />

| fi<br />

|}<br />

|#<br />

|# sharedx.<br />

|#


X 1827<br />

|start_shared_x () {<br />

| #<br />

| # Quit old VNC servers and reset personal configuration.<br />

| #<br />

| killall Xvnc 2> /dev/null<br />

| killall Xrealvnc 2> /dev/null<br />

| killall Xtightvnc 2> /dev/null<br />

| rm -f $PASSWORD_FILE<br />

| echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE<br />

| chmod 0600 $PASSWORD_FILE<br />

| #<br />

| # Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

| #<br />

| Xvnc :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \<br />

| -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -alwaysshared nologo -dpi 100 2> ‘dirname $PASSWORD_FILE‘/log &<br />

| #<br />

| # If it does not work, start it with vncserver:<br />

| #<br />

| # vncserver :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \<br />

| # -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \<br />

| # -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| # -alwaysshared nologo -dpi 100 \<br />

| # -startup true 2> ‘dirname $PASSWORD_FILE‘/log &<br />

| #<br />

| # Window manager.<br />

| #<br />

| start_vnc_window_manager &<br />

| #<br />

| # Start xinit with xvncviewer as a client<br />

| #<br />

| xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE localhost:1<br />

|}<br />

|#<br />

|# vncs.<br />

|#<br />

|start_vncs () {<br />

| #<br />

| # Quit old VNC servers and reset personal configuration.<br />

| #<br />

| killall Xvnc 2> /dev/null<br />

| killall Xrealvnc 2> /dev/null<br />

| killall Xtightvnc 2> /dev/null<br />

| rm -f $PASSWORD_FILE<br />

| #<br />

| if ! vncpasswd $PASSWORD_FILE<br />

| then<br />

| #<br />

| dialog --msgbox "The password is not valid, sorry." 0 0<br />

| #<br />

| exit<br />

| #


1828 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

| fi<br />

| #<br />

| # Start VNC server at screen :1, using ~/.vnc/log for log file.<br />

| #<br />

| Xvnc :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \<br />

| -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \<br />

| -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| -alwaysshared nologo -dpi 100 2> ‘dirname $PASSWORD_FILE‘/log &<br />

| #<br />

| # If it does not work, start it with vncserver:<br />

| #<br />

| # vncserver :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \<br />

| # -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \<br />

| # -fp $VNC_FONTS -co /etc/X11/rgb \<br />

| # -alwaysshared nologo -dpi 100 \<br />

| # -startup true 2> ‘dirname $PASSWORD_FILE‘/log &<br />

| #<br />

| # Window manager.<br />

| #<br />

| start_vnc_window_manager &<br />

|}<br />

|#<br />

|# vncwm.<br />

|#<br />

|start_vnc_window_manager () {<br />

| #<br />

| xsetroot -display :1 -solid NavyBlue<br />

| #<br />

| if [ -f ~/.backgroundcolor ]<br />

| then<br />

| xsetroot -display :1 -solid ‘cat ~/.backgroundcolor‘<br />

| fi<br />

| #<br />

| if [ -f ~/.wallpaper ]<br />

| then<br />

| display -display :1 -window root -backdrop ~/.wallpaper<br />

| fi<br />

| #<br />

| # Start fvwm and kill VNC when it dies.<br />

| #<br />

| fvwm2 -display :1 2> /dev/null ; killall Xvnc 2> /dev/null ; \<br />

| killall Xrealvnc 2> /dev/null ; \<br />

| killall Xtightvnc 2> /dev/null<br />

| #<br />

|}<br />

|#<br />

|# Common viewer procedure<br />

|#<br />

|vnc_viewer_procedure () {<br />

| #<br />

| # The default password file will be used if available.<br />

| #<br />

| if [ -f $PASSWORD_FILE ]


X 1829<br />

| then<br />

| #<br />

| dialog --msgbox "There is already a file $PASSWORD_FILE. \<br />

|If authentication fails, try to remove it." 0 0<br />

| #<br />

| else<br />

| if ! vncpasswd $PASSWORD_FILE<br />

| then<br />

| #<br />

| dialog --msgbox "The password is not valid, \<br />

|I will try with a default one." 0 0<br />

| #<br />

| # Try with default password.<br />

| #<br />

| echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE<br />

| fi<br />

| fi<br />

| #<br />

| # Check for arguments.<br />

| #<br />

| if [ "$ARGUMENTS" = "" ]<br />

| then<br />

| #<br />

| # Give address.<br />

| #<br />

| if dialog \<br />

| --title "remote VNC server address" \<br />

| --inputbox \<br />

| "Please insert the remote VNC server address. \<br />

|The connection will be tried at screen \":1\"." \<br />

| 0 0 \<br />

| "$VNC_REMOTE_SERVER" \<br />

| 2> $TEMPORARY<br />

| then<br />

| ARGUMENTS=‘cat $TEMPORARY‘<br />

| echo "" > $TEMPORARY<br />

| fi<br />

| fi<br />

| #<br />

| # Save data.<br />

| #<br />

| VNC_REMOTE_SERVER="$ARGUMENTS"<br />

| rm -f /etc/nlnx/all/VNC_REMOTE_SERVER<br />

| echo "$VNC_REMOTE_SERVER" > /etc/nlnx/all/VNC_REMOTE_SERVER<br />

|}<br />

|#<br />

|# Take/view shared x procedure<br />

|#<br />

|vnc_viewer_shared_x_procedure () {<br />

| #<br />

| # Default password<br />

| #<br />

| rm -f $PASSWORD_FILE


1830 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

| echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE<br />

| chmod 0600 $PASSWORD_FILE<br />

| #<br />

| # Check for arguments.<br />

| #<br />

| if [ "$ARGUMENTS" = "" ]<br />

| then<br />

| #<br />

| # Give address.<br />

| #<br />

| if dialog \<br />

| --title "remote VNC server addresses" \<br />

| --inputbox \<br />

| "Please insert the remote VNC server addresses. \<br />

|The connection will be tried at screen \":1\"." \<br />

| 0 0 \<br />

| "$VNC_REMOTE_SERVERS" \<br />

| 2> $TEMPORARY<br />

| then<br />

| ARGUMENTS=‘cat $TEMPORARY‘<br />

| echo "" > $TEMPORARY<br />

| fi<br />

| fi<br />

| #<br />

| # Save data.<br />

| #<br />

| VNC_REMOTE_SERVERS="$ARGUMENTS"<br />

| rm -f /etc/nlnx/all/VNC_REMOTE_SERVERS<br />

| echo "$VNC_REMOTE_SERVERS" > /etc/nlnx/all/VNC_REMOTE_SERVERS<br />

|}<br />

|#<br />

|# Geometry selection.<br />

|#<br />

|select_geometry () {<br />

| if dialog \<br />

| --clear \<br />

| --title "geometry" \<br />

| --menu "Select VNC server geometry:" \<br />

| 0 0 0 \<br />

| "1024x768" "default" \<br />

| "1440x1080" "" \<br />

| "1408x1056" "" \<br />

| "1376x1032" "" \<br />

| "1344x1008" "" \<br />

| "1312x984" "" \<br />

| "1280x960" "" \<br />

| "1248x936" "" \<br />

| "1216x912" "" \<br />

| "1184x888" "" \<br />

| "1152x864" "" \<br />

| "1120x840" "" \<br />

| "1088x816" "" \<br />

| "1056x792" "" \


X 1831<br />

| "1024x768" "usual resolution" \<br />

| "992x744" "" \<br />

| "960x720" "" \<br />

| "928x696" "" \<br />

| "896x672" "" \<br />

| "864x648" "" \<br />

| "832x624" "" \<br />

| "800x600" "old SVGA resolution" \<br />

| "768x576" "" \<br />

| "736x552" "" \<br />

| "704x528" "" \<br />

| "672x504" "" \<br />

| "640x480" "old VGA resolution" \<br />

| "608x456" "" \<br />

| "576x432" "" \<br />

| "544x408" "" \<br />

| "512x384" "" \<br />

| "480x360" "" \<br />

| 2> $TEMPORARY<br />

| then<br />

| SELECTION=‘cat $TEMPORARY‘<br />

| echo "" > $TEMPORARY<br />

| GEOMETRY="$SELECTION"<br />

| else<br />

| #<br />

| # Set to a default<br />

| #<br />

| GEOMETRY="1024x768"<br />

| fi<br />

|}<br />

|#<br />

|# Write to log.<br />

|#<br />

|log_vnc_view () {<br />

| logger "User $USER trying to view VNC server $1"<br />

|}<br />

|log_vnc_control () {<br />

| logger "User $USER trying to control VNC server $1"<br />

|}<br />

|#<br />

|# Start the command selection<br />

|#<br />

|if [ "$PROGRAM_NAME" = "vncrc" ]<br />

|then<br />

| main_menu<br />

|fi<br />

|#<br />

|# Now the program name might be changed.<br />

|#<br />

|if [ "$PROGRAM_NAME" = "sharedx" ]<br />

|then<br />

| select_geometry<br />

| DEPTH="16"


1832 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

| start_shared_x<br />

|elif [ "$PROGRAM_NAME" = "vncs" ]<br />

|then<br />

| select_geometry<br />

| DEPTH="16"<br />

| start_vncs<br />

|elif [ "$PROGRAM_NAME" = "vnccx" ]<br />

|then<br />

| #<br />

| vnc_viewer_procedure<br />

| #<br />

| # Please note that you cannot put it in background!<br />

| #<br />

| xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE \<br />

| $VNC_REMOTE_SERVER:1<br />

| #<br />

|elif [ "$PROGRAM_NAME" = "vncvx" ]<br />

|then<br />

| #<br />

| vnc_viewer_procedure<br />

| #<br />

| log_vnc_view $VNC_REMOTE_SERVER:1<br />

| #<br />

| # Please note that you cannot put it in background!<br />

| #<br />

| xinit /usr/bin/xvncviewer -viewonly -fullscreen -passwd $PASSWORD_FILE \<br />

| $VNC_REMOTE_SERVER:1<br />

| #<br />

|elif [ "$PROGRAM_NAME" = "vncc" ]<br />

|then<br />

| #<br />

| vnc_viewer_procedure<br />

| #<br />

| log_vnc_control $VNC_REMOTE_SERVER:1<br />

| #<br />

| /usr/bin/xvncviewer -passwd $PASSWORD_FILE $VNC_REMOTE_SERVER:1 &<br />

| #<br />

|elif [ "$PROGRAM_NAME" = "vncv" ]<br />

|then<br />

| #<br />

| vnc_viewer_procedure<br />

| #<br />

| log_vnc_view $VNC_REMOTE_SERVER:1<br />

| #<br />

| /usr/bin/xvncviewer -viewonly -passwd $PASSWORD_FILE $VNC_REMOTE_SERVER:1 &<br />

| #<br />

|elif [ "$PROGRAM_NAME" = "vncsc" ]<br />

|then<br />

| select_geometry<br />

| DEPTH="16"<br />

| start_vncs<br />

| xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE localhost:1<br />

| #


X 1833<br />

|elif [ "$PROGRAM_NAME" = "takesharedx" ]<br />

|then<br />

| #<br />

| vnc_viewer_shared_x_procedure<br />

| #<br />

| for a in $ARGUMENTS<br />

| do<br />

| #<br />

| log_vnc_control $a:1<br />

| #<br />

| /usr/bin/xvncviewer -passwd $PASSWORD_FILE "$a:1" -title "$a:1" &<br />

| done<br />

| #<br />

|elif [ "$PROGRAM_NAME" = "viewsharedx" ]<br />

|then<br />

| #<br />

| vnc_viewer_shared_x_procedure<br />

| #<br />

| for a in $ARGUMENTS<br />

| do<br />

| #<br />

| log_vnc_view $a:1<br />

| #<br />

| /usr/bin/xvncviewer -viewonly -passwd $PASSWORD_FILE "$a:1" \<br />

| -title "$a:1" &<br />

| done<br />

| #<br />

|fi<br />

<strong>31.1</strong>4.11 Conclusione<br />

VNC è un lavoro che ha prodotto diversi filoni di sviluppo, per esigenze differenti. Oltre a<br />

quanto descritto in questo capitolo esistono diversi altri programmi che possono essere di un<br />

certo interesse. Di tale disponibilità è bene tenerne conto, per sapere che può essere utile una<br />

ricerca approfondita prima di organizzare il proprio lavoro in modo sistematico con VNC.<br />

<strong>31.1</strong>5 Riferimenti<br />

«<br />

«<br />

• The XFree86 Project, Inc.<br />

〈http://www.xfree86.org/ 〉<br />

• X.Org foundation<br />

〈http://www.x.org/ 〉<br />

• Eric S. Raymond, XFree86 Video Timings HOWTO<br />

〈http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html 〉<br />

• ISO/IEC 9995:1994, Information technology -- Keyboard layouts for text and office<br />

systems<br />

〈http://www.iso.org 〉


1834 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

• Pictogrammes ISO 9995-7<br />

〈http://pages.infinit.net/pm2/lexique4.htm 〉<br />

• Erik Fortune, The X keyboard extension: protocol specification<br />

〈http://www.xfree86.org/current/XKBproto.<strong>pdf</strong> 〉<br />

• Kamil Toman, Ivan U. Pascal, The XKB configuration guide<br />

〈http://www.xfree86.org/current/XKB-Config.<strong>pdf</strong> 〉<br />

• Kamil Toman, Ivan U. Pascal, How to further enhance XKB configuration<br />

〈http://www.xfree86.org/current/XKB-Enhancing.<strong>pdf</strong> 〉<br />

• Doug Palmer, An unreliable guide to XKB configuration<br />

〈http://www.charvolant.org/~doug/xkb/ 〉<br />

• Ivan U. Pascal, X keyboard extension<br />

〈http://pascal.tsu.ru/en/xkb/ 〉<br />

• Erik Fortune, The X keyboard extension: protocol specification<br />

〈http://www.xfree86.org/current/XKBproto.<strong>pdf</strong> 〉<br />

• Kamil Toman, Ivan U. Pascal, The XKB configuration guide<br />

〈http://www.xfree86.org/current/XKB-Config.<strong>pdf</strong> 〉<br />

• Kamil Toman, Ivan U. Pascal, How to further enhance XKB configuration<br />

〈http://www.xfree86.org/current/XKB-Enhancing.<strong>pdf</strong> 〉<br />

• Doug Palmer, An unreliable guide to XKB configuration<br />

〈http://www.charvolant.org/~doug/xkb/ 〉<br />

• Ivan U. Pascal, X keyboard extension<br />

〈http://pascal.tsu.ru/en/xkb/ 〉<br />

• Matt Chapman, Window managers for X<br />

〈http://www.plig.org/xwinman/ 〉.<br />

• FVWM<br />

〈http://www.fvwm.org 〉<br />

• RealVNC<br />

〈http://www.realvnc.com 〉<br />

• TightVNC<br />

〈http://www.tightvnc.org 〉<br />

• Karl Runge, x11vnc: a VNC server for real X displays<br />

〈http://www.karlrunge.com/x11vnc/ 〉<br />

• Giuseppe De Marco, Cripting delle sessioni VNC, articolo contenuto nella rivista Linux<br />

magazine, edizioni Master, ISSN 1592-8152, anno III, numero 25, dicembre 2002


X 1835<br />

1<br />

X.Org MIT più altre licenze per porzioni particolari di codice<br />

2<br />

XFree86 MIT più altre licenze per porzioni particolari di codice<br />

3<br />

Quando si parla di cose legate all’informatica, è facile sbagliarsi. La frequenza si misura in<br />

hertz (simbolo: «Hz»), che rappresenta il numero di cicli al secondo. I moltiplicatori di questa<br />

unità di misura sono quelli standard, quindi ‘k’ sta per 1000 e non 1024.<br />

4<br />

X MIT più altre licenze per porzioni particolari di codice<br />

5<br />

X MIT più altre licenze per porzioni particolari di codice<br />

6<br />

Xfstt GNU LGPL<br />

7<br />

Se si vuole provare a vedere cos’è un servente X senza clienti basta avviare ‘X’. Come già<br />

spiegato in precedenza, è sempre possibile uscire con la combinazione [ Ctrl Alt Backspace ].<br />

8<br />

In questo caso, dal momento che ‘twm’ viene avviato rimpiazzando la shell, risulta che il<br />

processo di ‘xclock’ dipende proprio da ‘twm’.<br />

9<br />

Prima di utilizzare ‘xon’ è indispensabile sapere gestire ‘rsh’.<br />

10<br />

I caratteri tipografici di X servono solo per la rappresentazione di testo sullo schermo. In<br />

pratica, non sono utili per la stampa vera e propria.<br />

11<br />

Read-edid software libero per la maggior parte GNU GPL<br />

12<br />

X MIT più altre licenze per porzioni particolari di codice<br />

13<br />

modeline GNU GPL<br />

14<br />

X MIT più altre licenze per porzioni particolari di codice<br />

15<br />

X MIT più altre licenze per porzioni particolari di codice<br />

16<br />

X MIT più altre licenze per porzioni particolari di codice<br />

17<br />

X MIT più altre licenze per porzioni particolari di codice<br />

18<br />

X MIT più altre licenze per porzioni particolari di codice<br />

19<br />

SCIM GNU GPL<br />

20<br />

X MIT più altre licenze per porzioni particolari di codice<br />

21<br />

È bene ricordare che ‘xsetroot’ non ha bisogno di essere avviato sullo sfondo perché<br />

termina subito la sua attività.<br />

22<br />

Nella tradizione informatica, la sigla NOP sta per Not operate e definisce un’azione priva di<br />

risultati.<br />

23<br />

Fvwm 2 software libero soggetto a diverse licenze a seconda della porzione di codice<br />

coinvolta<br />

24<br />

X MIT più altre licenze per porzioni particolari di codice<br />

25<br />

Gdm GNU GPL<br />

26<br />

KDE GNU GPL, GNU LGPL e altre licenze a seconda della porzione di codice<br />

27<br />

Wdm GNU GPL con l’aggiunta della licenza specifica di Xdm<br />

28<br />

Gnome GNU GPL e GNU LGPL


1836 volume I Sistemi GNU/Linux: uso e amministrazione generale<br />

29<br />

KDE GNU GPL, GNU LGPL e altre licenze a seconda della porzione di codice<br />

30<br />

VNC GNU GPL

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!