CARATTERISTICHE DISTINTIVE DI X TRA I SISTEMI A FINESTRE Indipendente da hw e sistema operativo, permette di realizzare applicazioni portabili su macchine diverse sotto sistemi operativi diversi. 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). X-client usa insieme di routines Xlib | rete protocollo di rete (X-protocol) | X-server controlla display, keyboard e mouse | device drivers | dispositivi hw 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). X PROTOCOL Definisce quali pacchetti di informazione 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): in caso di richieste non valide. X SERVER Alloca e gestisce risorse per conto del client: solo l'identificatore della risorsa e' conosciuto da client e passato via rete. 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. Permette 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, ha il pieno controllo delle sottofinestre. 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 - 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 Molto di basso livello, poco agevole per sviluppare interfacce grafiche. 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', form di 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 - lanciare main loop del toolkit, che automaticamente cattura eventi e chiama le callback associate Realizzare interfacce e' molto piu' semplice e veloce. Se programma ha bisogno di widget con caratteristiche particolari non possedute da nessun widget predefinito, puo' definire nuovi tipi di widget. Widget sono organizzati in classi secondo paradigma object-oriented, che privilegia riusabilita' ed estensibilita'. TIPI DI TOOLKIT X fornisce insieme di strumenti per definire e manipolare widget, base per implementare un toolkit. Questa e' la libreria Xt intrinsics. E' scelta di X non fissare un insieme particolare di widget (come non fissa un window manager). Varie case forniscono widget set particolari da associare a Xt intrinsics. X toolkit = Xt intrinsics (parte standard X) + widget set (parte non standard) applicazione widget set Xt intrinsics Xlib | ... Esempi di widget sets: - OSF Motif - AT&T OpenLook - MIT Athena (free, ma molto limitato) Altri toolkit si appoggiano direttamente a Xlib senza usare Xt. Tra questi XForms, che useremo. - 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