Ottimizzare le risorse: il gestore di finestre TWM

di Francesco Celebrini


Era una grigia giornata d'autunno di qualche anno fa, probabilmente, quando un "amico esperto di computer" (chi non ha mai avuto un "amico esperto di computer"?)
si presentò raggiante alla porta di casa mia con in mano una copia di Linux, all'epoca da me sconosciuto.
L'antefatto risaliva ad alcuni giorni prima quando, incontrandolo per caso, mi lanciai in uno sproloquio sulla precoce obsolescenza dei PC e dei programmi e sulla mia
ferrea quanto donchischiottesca ostinazione a non cadere nel ricatto della continua spesa per stare al passo con le ultime trovate di marketing dal mondo dell'information tecnology... ...in poche parole, avevo un computer non più nuovissimo he
i più o meno recenti sistemi operativi e programmi Windows avevano reso di una lentezza estenuante!!
E fu a questo punto che l'"amico esperto di computer" entrò prepotentemente sulla scena affermando che "...ho io la soluzione, ti porto un sistema operativo che gira bene anche su vecchi PC...". Il risultato fu che con Linux il PC sembrava essere ancora più lento!!!

Lasciando stare gli aneddoti divertenti, ce n'é voluto poi di tempo per capire che in fondo l'amico aveva ragione: con Linux si possono riutilizzare vecchi pc a patto però di
essere in grado di configurarli e di ottimizzarli.
In questo senso tanti e di varia natura sono gli accorgimenti da adottare ma in questo breve articolo mi soffermerò sull'analisi di TWM (Tab Window Manager), il gestore di finestre più leggero (e spartano) di Linux fornito insieme al server x, che risulta essere un ottimo strumento in computer non molto potenti.

Per quelli di voi che non hanno mai utilizzato TWM è necessario dire che per lanciarlo (almeno su red hat) occorre prima digitare da console il comando:
switchdesk TWM
e poi:
startx

TWM ha un file di configurazione che si trova generalmente in
/etc/X11/twm/system.twmrc
che permette una buona configurazione del gestore di finestre.
Il file, composto da variabili e funzioni, puo' essere diviso in 4 parti:
- nella prima vengono dichiarate alcune variabili generali (font, icona, colori dei vari elementi)
- nella seconda vengono definite le funzioni composte che riguardano il movimento
- nella terza vengono abbinate le funzioni precedenti con i tasti del mouse
- nella quarta vengono definiti i menu e gli eventuali sottomenu e la funzione attribuita a ciascuna voce.

Per entrare nel dettaglio, di seguito vi mostro un esempio di file system.twmrc che non esaurisce certo tutte le opzioni di configurazione ma può essere una buona base di partenza (ricordatevi che la pagina man di TWM è piuttosto dettagliata).


##################
#### system.twmrc

####################################
### Definizione di alcune variabili

NoGrabServer
# non coinvolge il server durante la visualizzazione di menu', ecc.
# (notate che ho usato l'apostrofo, i caratteri accentati non sono
# consentiti nemmeno nei commenti)
RestartPreviousState
# riporta lo schermo allo stato precedente lo spengimento del
# gestore di finestre
DecorateTransients
# inserisce la barra del titolo per le finestre in movimento

# indica il font, l'icona, ecc..
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-*-*-*"

# di seguito i colori dei vari elementi
Color
{
BorderColor "lavender"
DefaultBackground "azure"
DefaultForeground "darkgreen"
TitleBackground "azure"
TitleForeground "darkgreen"
MenuBackground "azure"
MenuForeground "darkgreen"
MenuTitleBackground "darkgreen"
MenuTitleForeground "azure"
IconBackground "azure"
IconForeground "darkgreen"
IconBorderColor "darkgreen"
IconManagerBackground "azure"
IconManagerForeground "darkgreen"
}

# visualizza l'immagine indicata sulla barra della finestra
# al passaggio del puntatore
Pixmaps
{
TitleHighlight "/root/immagine.bmp"
}

##################################
# Definizione di alcune funzioni composte utili per azioni basate sul movimento
# (utilizzate nella sezione successiva)
MoveDelta 3
# questa variabile specifica il numero di pixel che il puntatore
# deve percorrere prima che la funzione f.move inizi a funzionare;
# provate a dargli valore 0 e vedrete la sottile differenza!
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 }

# Le funzioni sopra dichiarate sono composte da un gruppo di tre funzioni
# ciascuna; vediamone alcune nel dettaglio:
# f.move ----> permette di trascinare il contorno della finestra selezionata mentre il
# pulsante del mouse indicato è premuto
# f.lower ----> abassa la finestra selezionata
# f.deltastop ----> permette di terminare una funzione definita dall'utente se
# il puntatore è stato mosso più del numero di pixel definito
# in MoveDelta
# f.raise ----> alza la finestra selezionata
# f.iconify ----> riduce a icona o ripristina la finestra o l'icona selezionata

#################################
# Definizione di alcuni abbinamenti di funzioni viste in precedenza con i tasti
# del mouse.
# La sintassi è:
# Pulsante = TASTI : CONTESTO : FUNZIONE
# I pulsanti sono ovviamente il sinistro, il destro e il centrale del mouse;
# i tasti sono indicati da una lettera che si riferisce ad un tasto (s indica il ta
# sto shift, c il tasto control, ecc.); il contesto indica l'elemento visualizza
# to da considerare (root e' lo sfondo); la funzione è la funzione assegnata.
#################################

Button1 = : root : f.menu "principale"

Button1 = c : window|icon : f.function "sposta-sotto"
Button2 = c : window|icon : f.iconify
Button3 = c : window|icon : f.function "sposta-sopra"

Button1 = : title : f.function "sposta-sopra"
Button2 = : title : f.raiselower

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

Button1 = : iconmgr : f.iconify
Button2 = : iconmgr : f.iconify

####################################
# Definizione dei menù; ad ogni menù e sottomenù viene attribuito un nome e i
# colori che acquisiscono i nomi degli elementi e lo sfondo al passaggio del pun
# tatore; ad ogni elemento del menù viene attribuita una funzione che svolge un
# determinato compito (per alcune funzioni non sarà necessaria una descrizione)
####################################

menu "principale" ("mediumblue" : "orange")
{
"MENU PRINCIPALE" f.title # indica il titolo del menu'
"" f.raise # esegue la funzione lasciando uno spazio vuoto nel menu
"TERMINALE" f.exec "exec xterm &" # esegue il programma xterm
"Programmi" f.menu "Programmi" # esegue la funzione che apre un
sottomenu'
"" f.nop # serve solo per lasciare uno spazio vuoto
"Riduci a icona" f.iconify
"Ridimensiona" f.resize
"Sposta sotto" f.lower
"Messa a fuoco" f.focus
"Fuori fuoco" f.unfocus
"Mostra riepilogo finestre" f.showiconmgr
"Nascondi riepilogo finestre" f.hideiconmgr
"Termina" f.destroy # termina l'applicazione
"Cancella" f.delete # chiude la finestra
"Riavvia" f.restart
"Esci" f.quit
}

menu "Programmi" ("mediumblue" : "pink")
{
"Mozilla" f.exec "exec mozilla &"
"Open Office" f.exec "exec ooffice &"
"Calcolatrice" f.exec "exec xcalc &"
"Grafica" f.menu "Grafica"
}

menu "Grafica" ("mediumblue" : "gold")
{
"Gimp" f.exec "exec gimp &"
"Bitmap" f.exec "exec bitmap &"
}


###########
# Fine - Buona configurazione!

 

AUTORE DEL TESTO
Francesco Celebrini

Pubblicato il: 10/08/2004