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 ...
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