IL SISTEMA X-WINDOW
Indipendente da hw e sistema operativo, permette di realizzare applicazioni
portabili su macchine diverse sotto sistemi operativi diversi
(tutti della famiglia UNIX).
Progettato per sistemi distribuiti, permette a piu' applicazioni di
cooperare attraverso una rete (es. l'interfaccia grafica gira su una
macchina diversa da quella dove gira il programma).
Anche con architetture e/o sistema operativi diversi.
Tutto avviene in maniera completamente trasparente all'applicazione.
Modello a strati

X non impone alcuno stile di interfaccia o di interazione con l'utente.
Strati sw sopra a X si preoccupano di definire questo (vedere
window manager e toolkits - tra poco).
X Protocol
Definisce quali pacchetti di informazione (messaggi) sono scambiati
tra client e server tramite rete:
-
richieste (client->server): allocare una risorsa, leggere valori
correnti di una risorsa, modificare valori di una risorsa.
Interazione asincrona: server mette le richieste in coda e le
soddisfa quando ha tempo.
-
risposte (server->client): info di ritorno per certi tipi di richieste
(es. allocare una risorsa, ritorna identificatore per accedere alla
risorsa)
-
eventi (server->client): Xlib (sul client) mette eventi in una coda da
cui il programma puo' leggerli uno a uno per processarli (interazione
asincrona)
-
errori (server->client): generati in caso di richieste non valide.
X Server
Alloca e gestisce risorse (finestre, font, bitmap, ...) per conto del
client: solo l'identificatore della risorsa e' conosciuto da client e
passato via rete (assieme ai messaggi che si riferiscono a quella
risorsa).
Passa input dai device (tastiera, mouse) ai client.
Passa output (testo e grafica 2D) dai client al display.
X Lib
Strato piu' basso di X.
Libreria (API) di funzioni che permettono al client di comunicare
col server per:
- ottenere risorse (finestre, pixmap, fonts ...)
- manipolare risorse (leggere, assegnare e modificare proprieta')
- ricevere input (eventi)
- inviare output (testi e grafica 2D)
X Client
Un'applicazione che usa i servizi di un X-server usando Xlib
direttamente o indirettamente tramite altre librerie sopra Xlib.
Window Manager
Un particolare X-client con compito speciale di gestire finestre sullo
schermo: posizionare, ridimensionare, iconificare, gestire stack order,
stabilire quale finestra ha il focus per mouse e tastiera...
X non fissa un particolare window manager, ne esistono vari, che
utilizzano politiche diverse.
Window manager aggiunge decorazioni a finestre (bordo, barra del titolo,
controlli per iconify, resize ecc.).
Queste caratteristiche della finestra non sono gestite dal programma
applicativo, il programma applicativo gestisce solo l'interno della
finestra (comprese le sottofinestre).
Solo le top-level window di ogni applicazione sono gestite dal window
manager.
L'applicazione non ha il controllo della posizione e dimensione di queste,
ne' del fatto che siano mappate o no.
Puo' dare hints al window manager, ma non e' detto chi siano rispettati;
e comunque l'utente puo' intervenire a cambiare la situazione.
Invece, l'applicazione ha il pieno controllo delle sottofinestre,
e ha la responsabilita' di ridisegnarne il contenuto (refresh) quando
- la finestra cambia dimensioni
- la finestra torna visibile dopo essere stata (parzialmente)
oscurata da altre, oppure iconificata
La libreria di base e i toolkit
Xlib: interfaccia a basso livello tra client e server
Xtoolkit (sono vari): basati su Xlib, forniscono componenti di
alto livello per la costruzione di interfacce grafiche
Un toolkit e' composto da
- una parte standard: Xt intrinsics
- una parte che varia a seconda del toolkit (widget set)
Ci torniamo meglio tra poco.
X Client che usa solo Xlib
Il programma deve:
-
definire le sue finestre, la loro gerarchia (sottofinestre), la
politica con cui le sottofinestre vengono risistemate quando le
dimensioni della finestra madre vengono modificate,
e molte altri dettagli per ogni singola finestra
-
definire quali eventi sono catturati in ogni finestra
-
implementare un ciclo dove attende un evento, guarda di che tipo e'
e in che finestra si e' verificato, e agisce di conseguenza
(ciclo degli eventi)
Molto di basso livello, poco agevole per sviluppare interfacce grafiche.
Vedremo un esempio di applicazione molto semplice (e tuttavia
il codice e' complicato).
X Client che usa un Toolkit
Un toolkit e' uno strato sw sopra Xlib.
Fornisce elementi predefiniti di interfacce, che il programmatore puo'
configurare (entro i limiti previsti) ed assemblare per costruire
un'interfaccia.
Gli elementi di interfaccia sono chiamati widget (window object).
Esempio: bottone, menu', maschera per acquisizione dati ...
I widget sono raggruppati in tipi (classi).
Ogni tipo di widget ha:
- apparenza: alcune caratteristiche fisse e altre riconfigurabili
- comportamento: ciascun tipo di widget e' sensibile a certi eventi,
il programmatore puo' associare azioni da eseguire quando si verifica
un evento, dette callback
Il programma deve:
- creare i widget configurandoli come preferisce, definire callback,
associarle ai widget
- lanciare main loop del toolkit, che automaticamente cattura eventi
e chiama le callback associate
(cioe' implementa il ciclo degli eventi)
Realizzare interfacce e' molto piu' semplice e veloce.
Widget sono organizzati in classi secondo paradigma object-oriented,
che privilegia riusabilita' ed estensibilita'.
Se un programma ha bisogno di widget con caratteristiche particolari non
possedute da nessun widget predefinito, puo' definire nuovi tipi di
widget.
Tipi di toolkit
E' scelta di X non fissare un insieme particolare di widget (come non
fissa un window manager).
X fornisce una libreria (API) di funzioni di base per definire e
manipolare widget: la libreria Xt intrinsics.
Varie case forniscono widget set particolari da associare a Xt intrinsics,
ottenendo cosi' un toolkit.
Xtoolkit =
Xt intrinsics (parte standard X) +
widget set (parte non standard)
Dentro l' X-client: 
Esempi di widget sets:
- OSF Motif
- AT&T OpenLook
- MIT Athena (free, ma molto limitato)
- Lesstif (free, emula Motif)
Vedremo la stessa applicazione vista con Xlib tradotta usando
Athena widget set, e un altro esempio di applicazione piu' complessa.
File di esempio
Per Xlib:
- basicx.c:
apre una finestra con al centro una stringa, la finestra e'
sensibile alla pressione di un tasto del mouse o della
tastiera e l'effetto e' la terminazione del programma
- makefile
Finestra creata da basicx:

Per Xt:
- basicxt.c:
comportamento come basicx, ma codice molto piu' semplice
(in realta' la finestra - implementata con un bottone -
e' sensibile alla pressione solo del tasto sinistro del mouse)
- nextxt.c:
apre una finestra con dentro due bottoni, il primo fa terminare
il programma, il secondo fa apparire un'altra finestra;
tale finestra secondaria sparisce quando si preme un bottone
situato su di essa
- makefile per entrambi
Finestra creata da basicxt:

Finestre da nextxt.c: 1) appena lanciato, 2) dopo aver ingrandito la
finestra principale e aver fatto apparire la seconda finestra
1)
2)
Struttura di un programma che usa Xlib
(versione semplificata monofinestra)
-
Connettersi a X server
-
Creare finestra
-
Specificare eventi che si vogliono catturare nella finestra
-
Procurarsi le risorse che servono per produrre output nella finestra
(es. fonts)
-
Mostrare la finestra
-
Iniziare un ciclo in cui
- si attende un evento
- a seconda del tipo di evento si fa qualcosa
Esempi di eventi:
- Expose - ridisegnare il contenuto della finestra
- ConfigureNotify - tenere conto delle nuove dimensioni della finestra
- KeyPress
- ButtonPress
Struttura di un programma che usa X toolkit
-
Inizializzazione -- si ottiene finestra top level
(quella gestita dal window manager)
-
Creare come figlie o discendenti di top level tutte le altre finestre (widget)
scegliendo per ciascuna finestra il tipo (classe) di widget adeguato
Esempi:
- box - per contenere altri widget
- command - per bottoni
-
Associare ai widget creati le callback necessarie
-
Mostrare la finestra top level (e automaticamente tutte le sue discendenti)
-
Chiamare il main loop di Xt - questo automaticamente gestisce attesa di eventi e chiamata delle callback relative
Gerarchia di widget in nextxt.c:

TopLevel e PShell sono gestite da window manager.
PShell e Dialog sono sovrapposte e coincidenti.
Box e' un contenitore e gestisce la posizione dei due bottoni
dentro la finestra TopLevel.
Altre potenzialita' di X che non vediamo
-
Associazione a widget di comportamenti non previsti da chi li
ha disegnati (i comportamenti previsti sono specificati associando
callback, per quelli non previsti si usa un altro meccanismo che
associa azioni a un widget su un evento)
-
Configurazione delle risorse mediante file anziche' nel codice
dell'applicazione
Altri strumenti per lo sviluppo di interfacce
Altri pacchetti per lo sviluppo di interfacce in ambiente X
si appoggiano direttamente a Xlib senza usare Xt.
Tra questi XForms, il pacchetto usato nell'A.A. 1999/2000.
- e' un pacchetto di dimensioni contenute ma completo
- possiede tutti i concetti base di un toolkit (filosofia
object-oriented, eventi e callback,...)
- adatto a scopi didattici
- permette di ottenere interfacce esteticamente belle e funzionali
- ha associato un GUI designer
- e' public domain