[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


79. X: gestori di finestre

Il gestore di finestre, o window manager (WM), è quel programma cliente, che si occupa di incorniciare le superfici degli altri programmi clienti, di gestire la messa a fuoco, e quindi il passaggio da un programma all'altro e di altre funzioni di contorno. Anche se apparentemente non sembra molto, il gestore di finestre è in grado di cambiare la faccia e il funzionamento operativo del sistema X.

Alcuni gestori di finestre consentono di utilizzare una superficie maggiore di quella che si vede sullo schermo. Si parla in questi casi di gestori di finestre con superficie grafica virtuale, ovvero di virtual window manager (VWM). Di solito, per passare da una zona all'altra della superficie grafica virtuale si utilizza la combinazione [Ctrl+freccia...] nella direzione in cui ci si vuole spostare, oppure si utilizza il mouse all'interno di una tabellina riassuntiva di tutta la superficie grafica virtuale.

Volendo, a puro titolo didattico, si può utilizzare X senza un gestore di finestre.

xinit xterm -geometry =50x10+10+10

La figura 79.1 mostra il risultato del comando appena mostrato. Quando termina l'esecuzione del programma `xterm', `xinit' fa terminare il funzionamento del servente.

68.jpg

Figura 79.1: Il servente X avviato senza un gestore di finestre.

Per conoscere maggiori notizie sui gestori di finestre per X si può consultare la pagina http://www.plig.org/xwinman.

79.1 twm

Il gestore di finestre tradizionale e più semplice è `twm'. È l'unico che venga fornito assieme a X. Non è particolarmente amichevole, ma utilizza poche risorse, e così è adatto agli elaboratori più lenti; e inoltre è facile da configurare. Vale sempre la pena di configurare in modo essenziale questo gestore di finestre per avere un riferimento sicuro, anche quando se ne intende utilizzare principalmente un altro più sofisticato.

69.jpg

Figura 79.2: `twm', il gestore di finestre tradizionale.

79.1.1 twm e ~/.xinitrc

Per fare in modo che, attraverso lo script `startx', si avvii automaticamente il gestore di finestre `twm', occorre ricordare di modificare il proprio script `~/.xinitrc'.

Nel caso particolare di `twm' che è un gestore di finestre piuttosto povero, può essere conveniente l'avvio di altri programmi prima di `twm' stesso. Ecco come potrebbe terminare il nostro `~/.xinitrc'.

...
# start some nice programs

# TWM
xsetroot -solid gray
xclock -digital -geometry +0-0 &
xbiff -geometry -0-0 &
twm

In questo esempio si può osservare che viene avviato prima il programma `xsetroot' per definire un colore uniforme del fondale (la finestra principale), quindi vengono avviati `xclock' e `xbiff' sullo sfondo (background). Infine viene avviato il gestore di finestre `twm'. *1*

79.1.2 ~/.twmrc

Il file `~/.twmrc' contiene la configurazione personalizzata di `twm'. Se manca, viene utilizzata solitamente la configurazione predefinita, e in tal caso potrebbe trattarsi di `/usr/X11R6/lib/X11/twm/system.twmrc'.

Segue un esempio molto semplificato di una possibile configurazione personalizzata, ottenuta attraverso la modifica del file di configurazione distribuito assieme a `twm'.

# .twmrc
#

NoGrabServer
RestartPreviousState
DecorateTransients
TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"
IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*"
#ClientBorderWidth

Color
{
    BorderColor "slategrey"
    DefaultBackground "maroon"
    DefaultForeground "gray85"
    TitleBackground "maroon"
    TitleForeground "gray85"
    MenuBackground "maroon"
    MenuForeground "gray85"
    MenuTitleBackground "gray70"
    MenuTitleForeground "maroon"
    IconBackground "maroon"
    IconForeground "gray85"
    IconBorderColor "gray85"
    IconManagerBackground "maroon"
    IconManagerForeground "gray85"
}


# Definizione di alcune funzioni utili per azioni basate sul movimento.

MoveDelta 3
Function "sposta-sotto" { f.move f.deltastop f.lower }
Function "sposta-sopra" { f.move f.deltastop f.raise }
Function "sposta-icona" { f.move f.deltastop f.iconify }


# Definisce alcuni abbinamenti con i tasti del mouse.

Button1 = : root : f.menu "opzioni-generali"
Button3 = : root : f.menu "programmi"

Button1 = : title : f.function "sposta-sopra"
Button2 = : title : f.iconify
Button3 = : title : f.function "sposta-sotto"

Button1 = : icon : f.function "sposta-icona"
Button2 = : icon : f.iconify
Button3 = : icon : f.iconify

Button1 = : iconmgr : f.function "sposta-sopra"
Button2 = : iconmgr : f.iconify
Button3 = : iconmgr : f.function "sposta-sotto"


# Inizia la definizione dei menu

menu "opzioni-generali"
{
"Twm"			f.title
"Riduzione a icona"	f.iconify
"Ridimensionamento"	f.resize
"Spostamento"		f.move
"Sopra"			f.raise
"Sotto"			f.lower
""			f.nop
"Messa a fuoco"		f.focus
"Fuori fuoco"		f.unfocus
"Mostra Iconmanager"	f.showiconmgr
"Nasconde Iconmanager"	f.hideiconmgr
""			f.nop
"Eliminazione"		f.destroy
"Cancellazione"		f.delete
""			f.nop
"Riavvio"		f.restart
"Fine lavoro"		f.quit
}

menu "programmi"
{
"Menu dei programmi"	f.title
"Terminale"		f.exec		"xterm -font 6x13 -ls -geometry 80x25+0+0 &"
"File manager"		f.exec		"xfm &"
""			f.nop
"Applicazioni varie"	f.menu		"applicazioni"
""			f.nop
"Riavvio"		f.restart
"Fine lavoro"		f.quit
}

menu "applicazioni"
{
"Applicazioni varie"	f.title
"medit" 		f.exec		"medit &"
""			f.nop
"ghostview"		f.exec		"ghostview -geometry =630x420+0+0 &"
"gv"			f.exec		"gv -geometry =630x420+0+0 &"
""			f.nop
"xpaint"		f.exec		"xpaint &"
}

Nella prima parte vengono definite le caratteristiche generali dell'ambiente. Successivamente si definisce il funzionamento del mouse e in particolare si abbinano delle funzioni alla pressione dei tasti di questo. La cosa più importante è predisporre dei menu in modo da poter avviare i programmi utilizzati più di frequente. L'esempio visto sopra viene ripreso in parte nella descrizione seguente:

Function "sposta-sotto" { f.move f.deltastop f.lower }
Function "sposta-sopra" { f.move f.deltastop f.raise }
Function "sposta-icona" { f.move f.deltastop f.iconify }

In questa parte vengono definite alcune funzioni composte a cui si farà riferimento più giù in corrispondenza di azioni con il mouse o eventualmente anche di selezioni all'interno di menu.

Button1 = : root : f.menu "opzioni-generali"
Button3 = : root : f.menu "programmi"

Button1 = : title : f.function "sposta-sopra"
Button2 = : title : f.iconify
Button3 = : title : f.function "sposta-sotto"

Button1 = : icon : f.function "sposta-icona"
Button2 = : icon : f.iconify
Button3 = : icon : f.iconify

Button1 = : iconmgr : f.function "sposta-sopra"
Button2 = : iconmgr : f.iconify
Button3 = : iconmgr : f.function "sposta-sotto"

Questa parte definisce le azioni abbinate alla pressione di uno dei tasti del mouse, in corrispondenza di determinati oggetti:

In particolare, se si preme il primo tasto del mouse quando il puntatore si trova su una parte di superficie libera del fondale, ovvero sulla finestra principale, si apre il menu delle opzioni generali. Premendo invece il terzo tasto si apre un altro menu: quello dei programmi.

menu "opzioni-generali"
{
"Twm"			f.title
"Riduzione a icona"	f.iconify
"Ridimensionamento"	f.resize
"Spostamento"		f.move
"Sopra"			f.raise
"Sotto"			f.lower
""			f.nop
"Messa a fuoco"		f.focus
"Fuori fuoco"		f.unfocus
"Mostra Iconmanager"	f.showiconmgr
"Nasconde Iconmanager"	f.hideiconmgr
""			f.nop
"Eliminazione"		f.destroy
"Cancellazione"		f.delete
""			f.nop
"Riavvio"		f.restart
"Fine lavoro"		f.quit
}

Il menu delle opzioni generali, permette di attivare una serie di funzioni di `twm'. In particolare, vale la pena di notare la funzione `f.destroy' con cui si può eliminare una finestra assieme al programma in esecuzione al suo interno. Inoltre, si può osservare la funzione `f.nop' che non fa alcunché e viene usata in abbinamento a delle separazioni tra le voci del menu, e la funzione `f.title' che serve solo a definire un titolo per il menu. *2*

menu "programmi"
{
"Menu dei programmi"	f.title
"Terminale"		f.exec		"xterm -font 6x13 -ls -geometry 80x25+0+0 &"
"File manager"		f.exec		"xfm &"
""			f.nop
"Applicazioni varie"	f.menu		"applicazioni"
""			f.nop
"Riavvio"		f.restart
"Fine lavoro"		f.quit
}

Il menu del programmi è solo una raccolta di richieste di avvio di programmi di uso comune, oltre alla chiamata di funzioni importanti come il riavvio del gestore di finestre e la conclusione della sua attività. I menù possono essere annidati, come in questo esempio, dove la voce `Applicazioni varie' apre un altro menu di applicazioni.

79.2 fvwm

Il gestore di finestre `fvwm' è una derivazione di `twm' con superficie grafica virtuale e cornici tridimensionali.

70.jpg

Figura 79.3: `fvwm' -- sull'angolo superiore sinistro si vede la tabellina riepilogativa della superficie grafica virtuale.

79.2.1 fvwm e ~/.xinitrc

Per fare in modo che, attraverso lo script `startx', si avvii automaticamente il gestore di finestre `fvwm', occorre ricordare di modificare il proprio script `~/.xinitrc'.

Generalmente è sufficiente avviare il gestore di finestre, senza altri programmi accessori.

...
# start some nice programs

fvwm

79.2.2 ~/.fvwmrc

Il file `~/.fvwmrc' contiene la configurazione personalizzata di `fvwm'. Se manca, viene utilizzata solitamente la configurazione predefinita, e in tal caso potrebbe trattarsi di `/usr/X11R6/lib/X11/fvwm/system.fvwmrc'.

Come al solito, la personalizzazione del file di configurazione parte da una copia di quello predefinito.

cp /usr/X11R6/lib/X11/fvwm/system.fvwmrc ~/.fvwmrc

Il file di configurazione predefinito potrebbe essere molto complesso, ma adeguatamente commentato in modo da guidare chi desidera modificarlo. In generale, non è conveniente personalizzare tutto. Di sicuro è necessario sistemare i menu, mentre il resto può rimanere com'è.

Di seguito vengono mostrati alcuni pezzi di questo file, in cui appare in che modo si compone un menu (in questo ambiente si parla di menu a scomparsa: popup) e come questo si può collegare a un'azione del mouse.

# This menu will fire up some very common utilities
Popup "Utilities"
	Title 	"Programmi"
	Exec    "Terminale"	exec xterm -e bash &
	Nop	""
	Popup   "Applicazioni"	Apps
	Nop	""
	Popup	"Fine lavoro"	Quit-Verify
EndPopup

In questo esempio si vede la dichiarazione di un menu a scomparsa denominato `Utilities'. Al suo interno vengono definiti diversi elementi (funzioni). In particolare:

Un menu deve poter essere aperto in qualche modo, per esempio attraverso la selezione di una voce in un altro menu. Ma il menu principale deve essere accessibile in modo indipendente da altri menu: di solito si abbina a un clic sulla finestra principale (il desktop).

#     Button	Context Modifi 	Function
Mouse 1		R   	A       PopUp "Utilities"
Mouse 2		R    	A      	PopUp "Window Ops"

L'estratto sopra riportato, mostra l'abbinamento tra un clic del primo tasto del mouse, quando il puntatore si trova sulla finestra principale, e l'azione `PopUp "Utilities"', cosa che fa apparire il menu visto in precedenza.

Per concludere, vale la pena di osservare che i sottomenu sono identici a un menu normale. Quello che segue è il menu `Apps' che si ottiene selezionando la voce `Applicazioni' del menu visto sopra.

Popup "Apps"
        Exec    "Netscape"      exec netscape &
        Exec    "Pine"          exec xterm -e pine &
	Nop     ""
        Exec    "Emacs"         exec emacs &
EndPopup

79.3 fvwm2

Il gestore di finestre `fvwm2' è una derivazione di `fvwm' in cui si emula il comportamento di MS-Windows 95, pur mantenendo il sistema della superficie grafica virtuale.

71.jpg

Figura 79.4: `xfontsel' eseguito all'interno di `fvwm2'.

79.3.1 fvwm2 e ~/.xinitrc

Per fare in modo che, attraverso lo script `startx', si avvii automaticamente il gestore di finestre `fvwm2', occorre ricordare di modificare il proprio script `~/.xinitrc'.

Generalmente è sufficiente avviare il gestore di finestre, senza altri programmi accessori.

...
# start some nice programs

fvwm2

79.3.2 ~/.fvwm2rc

Il file `~/.fvwm2rc' contiene la configurazione personalizzata. Se manca viene utilizzata solitamente la configurazione predefinita e in tal caso potrebbe trattarsi di `/usr/X11R6/lib/X11/fvwm2/system.fvwm2rc'.

Per la personalizzazione del file di configurazione si parte normalmente da una copia di quello predefinito.

cp /usr/X11R6/lib/X11/fvwm2/system.fvwm2rc ~/.fvwm2rc

Il file di configurazione predefinito è molto complesso, ma adeguatamente commentato in modo da guidare chi desidera modificarlo. In generale, è conveniente personalizzare almeno il sistema di menu, ma anche la barra delle applicazioni, quella che emula il comportamento di MS-Windows 95, necessita di una verifica.

Di seguito vengono mostrati alcuni pezzi significativi di questo file.

# Dimensione della superficie grafica virtuale.
DeskTopSize 3x2

`fvwm2' è un gestore di finestre virtuale, e i tal senso permette l'utilizzo di una superficie grafica maggiore di quella reale. Questa istruzione definisce la disponibilità di una superficie virtuale pari a sei volte quella normale, disposta su una matrice di tre colonne per due righe.

A volte si può desiderare di non gestire alcuna superficie grafica virtuale. In tal caso, l'istruzione va sostituita con `DeskTopSize 1x1'.

AddToMenu "StartMenu"
+ "Terminale%mini-term.xpm%"		Exec	rxvt -font 6x13 -ls -geometry 80x25+0+0 &
+ "File manager%mini-filemgr.xpm%"	Exec	xfm -geometry =250x400-0+0 &
+ "Applicazioni varie%mini-x2.xpm%"	Popup	Applications
+ ""					Nop 
+ "Fine lavoro%mini-stop.xpm%"		Popup   Quit-Verify

AddToMenu "Applications" "Applicazioni" Title
+ "medit%mini-edit.xpm%"		Exec	medit &
+ ""					Nop
+ "gv%mini-gv.xpm%"			Exec	gv -geometry 630x420+0+0 &
+ "xpaint%mini-paint.xpm%"		Exec	xpaint -geometry 630x420+0+0 &
+ ""					Nop
+ "dosemu%mini-x2.xpm%"			Exec	xdos -geometry +0+0 &

AddToMenu "Quit-Verify" "Fine lavoro?" Title
+ "Sì, fine lavoro%mini-exclam.xpm%"	Quit
+ "No, annulla%mini-cross.xpm%" 	Nop

L'estratto precedente mostra un esempio molto semplificato di un sistema di menu. La prima differenza che si nota, rispetto alla configurazione di altri programmi di questo tipo, è la presenza di riferimenti a file di icona. Infatti, le descrizioni che appaiono nel menu, possono essere associate a un'icona rappresentata da un file delimitato attraverso il simbolo di percentuale. Per esempio, `"Terminale %mini-term.xpm%"' rappresenta la voce che dovrà apparire sul menu, e l'icona che gli verrà posta a fianco. Le icone non sono obbligatorie e sono contenute normalmente all'interno della directory `/usr/X11R6/lib/X11/mini-icons/'.

Gli elementi, o le funzioni, utilizzabili all'interno di un menu sono in particolare:

Si può osservare ancora, che il titolo del menu viene definito subito dopo la dichiarazione dell'inizio del menu stesso. Per esempio, `AddToMenu "Applications" "Applicazioni" Title' dichiara l'inizio del menu `Applications' che avrà il titolo `Applicazioni'.

#     Button	Context Modifi 	Function
Mouse 1		R   	A       Menu "StartMenu" Nop
Mouse 2		R    	A       Menu "Window-Ops2" Nop
Mouse 3         R       A       WindowList

L'abbinamento delle azioni del mouse è sempre molto importante. Nell'esempio visibile sopra, si abbina un clic con il primo tasto sulla finestra principale (cioè lo sfondo) al menu principale descritto in precedenza.

Può essere utile dare un'occhiata anche all'abbinamento che si stabilisce con la selezione dei bottoni posti sulla barra del titolo delle finestre.

# Bottoni della barra del titolo

# Un bottone nella parte sinistra apre il menu delle opzioni.
# Il primo bottone a destra riduce a icona.
# Il secondo bottone a destra espande la finestra al massimo consentito dallo schermo.
# Il terzo bottone a destra chiude la finestra

#     Button	Context Modif 	Function
Mouse 0		1    	A      	Function "window_ops_func"
Mouse 1         2       A       Delete
Mouse 0		4    	A     	Maximize 100 95
Mouse 0		6    	A     	Iconify

È il caso di osservare che `Mouse 0' corrisponde a un clic con un tasto qualsiasi del mouse. Inoltre, la funzione `Maximize' permette di ridimensionare la finestra in rapporto percentuale rispetto alla dimensione dello schermo. In questo caso, trattandosi di un gestore di finestre che utilizza la parte bassa dello schermo per la barra delle applicazioni, conviene limitare l'ingrandimento verticale a solo il 95%, in modo da non coprire tale barra.

Style "FvwmTaskBar" NoTitle,BorderWidth 4,HandleWidth 4,Sticky,StaysOnTop,WindowListSkip,CirculateSkip

*FvwmTaskBarGeometry +0-0
*FvwmTaskBarFore Black
*FvwmTaskBarBack #c0c0c0
*FvwmTaskBarTipsFore black
*FvwmTaskBarTipsBack bisque
*FvwmTaskBarFont -adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*
*FvwmTaskBarSelFont -adobe-helvetica-bold-r-*-*-*-120-*-*-*-*-*-*
*FvwmTaskBarAction Click1 Iconify -1,Raise,Focus
*FvwmTaskBarAction Click2 Iconify
*FvwmTaskBarAction Click3 Module "FvwmIdent" FvwmIdent
*FvwmTaskBarUseSkipList
*FvwmTaskBarAutoStick
*FvwmTaskBarStartName Avvio
*FvwmTaskBarStartMenu StartMenu
*FvwmTaskBarStartIcon 
*FvwmTaskBarShowTips
#*FvwmTaskBarShowTransients
#*FvwmTaskBarClockFormat %I:%M%p
#*FvwmTaskBarHighlightFocus
#*FvwmTaskBarAutoHide
*FvwmTaskBarMailCommand Exec xterm -T Posta -ls -e mail

Si può personalizzare anche la barra delle applicazioni. Vale la pena di osservare quanto segue.

Resta da notare che alcune voci riferite alla barra degli strumenti hanno valore solo in quanto esistenti, in qualità di valori booleani. Alcune voci risultano commentate, lasciando intendere che la loro assenza implica la negazione della definizione loro corrispondente.

79.4 fvwm95-2

Il gestore di finestre `fvwm95-2' è una variante di `fvwm2' che si avvicina ancora di più al comportamento di MS-Windows 95.

72.jpg

Figura 79.5: `xcalc' eseguito all'interno di `fvwm95-2'.

79.4.1 fvwm95-2 e ~/.xinitrc

Per fare in modo che, attraverso lo script `startx', si avvii automaticamente il gestore di finestre `fvwm95-2', occorre ricordare di modificare il proprio script `~/.xinitrc'.

Generalmente è sufficiente avviare il gestore di finestre, senza altri programmi accessori.

...
# start some nice programs

fvwm95-2

79.4.2 ~/.fvwm2rc95

Il file `~/.fvwm2rc95' contiene la configurazione personalizzata. Se manca viene utilizzata solitamente la configurazione predefinita e in tal caso potrebbe trattarsi di `/usr/X11R6/lib/X11/fvwm95-2/system.fvwm2rc95'.

Per la personalizzazione del file di configurazione si parte normalmente da una copia di quello predefinito.

cp /usr/X11R6/lib/X11/fvwm95-2/system.fvwm2rc95 ~/.fvwm2rc95

Il file di configurazione predefinito è molto complesso, ma adeguatamente commentato in modo da guidare chi desidera modificarlo. In generale, è conveniente personalizzare almeno il sistema di menu, ma anche la barra delle applicazioni, quella che emula il comportamento di MS-Windows 95, necessita di una verifica.

Il formato di questo file è compatibile con quello di `fvwm2'.

79.5 AfterStep

Il gestore di finestre `afterstep' è una derivazione di `fvwm' in cui si emula il comportamento dell'interfaccia grafica di NeXT. Dal punto di vista operativo si comporta in maniera molto simile a `fvwm'.

73.jpg

Figura 79.6: `xcalc' eseguito all'interno di AfterStep.

79.5.1 ~/.steprc

Il file `~/.steprc' contiene la configurazione personalizzata. Se manca viene utilizzata solitamente la configurazione predefinita: `/usr/X11R6/lib/X11/afterstep/system.steprc'.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


1.) È bene ricordare che `xsetroot' non ha bisogno di essere avviato sullo sfondo perché termina subito la sua attività.

2.) Nella tradizione informatica, la sigla NOP sta per Not OPerate e definisce un'azione priva di risultati.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]