# Protocolli e architettura di X Window System

In informatica, l'X Window System (comunemente chiamato X11 o X) è un sistema finestre per la visualizzazione di bitmap, che è trasparente rispetto alle reti di calcolatori. Questa voce descrive i dettagli dei protocolli e della struttura tecnica di X11.

## Storia

X venne creato come parte del progetto Athena al MIT.

## Modello client-server e trasparenza in rete

X è basato su un modello client-server. Un programma X server gira in un computer con un display grafico e comunica con vari programmi client. Il server agisce da tramite tra l'utente e il programma client, accettando richieste di output grafico (finestre) dai programmi client e mostrandoli all'utente, e ricevendo gli input dell'utente (tastiera, mouse) e trasmettendoli ai programmi client.
In X, il server gira sul computer dell'utente, mentre i client possono girare anche su macchine diverse. Questo è il contrario della configurazione comune dei sistemi client-server, dove il client gira sul computer dell'utente e il server gira su un computer remoto. Questo modo contrario spesso confonde i nuovi utenti di X. La terminologia di X Window è vista dalla prospettiva del programma client piuttosto che da quella dell'utente o dell'hardware: i programmi remoti si connettono al display attaccato all'X server che gira nella macchina locale e che perciò agiscono come client; L'X display locale accetta traffico in entrata e perciò agisce come un server.
Il protocollo di comunicazione tra server e client gira in modo trasparente rispetto alla rete: il client e il server possono girare nella stessa macchina o in macchine differenti, eventualmente con architetture e sistemi operativi differenti. Un client e un server possono comunicare in maniera sicura su Internet attraverso il tunneling della connessione in una connessione cifrata.

## Principi di progettazione

Bob Scheifler e Jim Gettys impostarono i primi principi di X come segue (come elencato in Scheifler/Gettys 1996):
* Non si devono aggiungere nuove funzionalità a meno che uno sviluppatore non riesca a completare una reale applicazione senza di essa.
* È tanto importante decidere cosa un sistema non è quanto decidere che cosa è. Non (si deve) esaudire tutti i bisogni del mondo; piuttosto, rendere il sistema estensibile così che bisogni ulteriori possano essere soddisfatti in una maniera compatibile in avanti.
* La sola cosa peggiore della generalizzazione da un esempio è generalizzare senza neanche un solo esempio.
* Se un problema non è stato capito completamente, è probabilmente meglio non fornire nessuna soluzione.
* Se puoi ottenere il 90 per cento degli effetti desiderati per il 10 per cento del lavoro, usa la soluzione più semplice. (Vedi anche Peggio è meglio.)
* Isolare la complessità il più possibile.
* Fornire meccanismi piuttosto che politiche. In particolare, mettere le politiche riguardanti l'interfaccia utente nelle mani dei client.
Il primo principio venne modificato durante la progettazione di X11 in:"Non aggiungere nuove funzionalità a meno che non vieni a sapere di qualche applicazione reale che la richiederà." X è stato largamente attenuto a questi principi da allora. L'implementazione di riferimento è sviluppata con una visione di estensione e miglioramento dell'implementazione, pur mantenendosi quasi interamente compatibile con il protocollo originale del 1987.

## Protocollo principale

La comunicazione tra server e client è fatta scambiandosi pacchetti attraverso un canale di rete. La connessione viene stabilita dal client, che invia il primo pacchetto. Il server risponde inviando un pacchetto che attesta l'accettazione o il rifiuto della connessione, o con una richiesta di ulteriore autenticazione. Se la connessione viene accettata, il pacchetto di accettazione contiene dei dati per il client da usare nell'interazione successiva con il server.
Dopo che la connessione è stabilita, quattro tipi di pacchetti possono venire scambiati tra client e server nel canale:
* Request: Il client richiede informazioni dal server o gli chiede di eseguire un'azione.
* Reply: Il server risponde alla richiesta. Non tutte le richieste generano una risposta.
* Event: Il server invia un evento al client, per esempio un input da mouse o tastiera o una finestra che è stata mossa, ridimensionata o esposta.
* Error: Il server invia un pacchetto di errore se una richiesta non è valida. Dato che le richieste vengono accodate, i pacchetti di errore generati da una richiesta potrebbero non essere inviati immediatamente.
Il server X fornisce un insieme di servizi base. I programmi client realizzano funzionalità più complesse interagendo con il server.

### Finestre

Quella che di solito in altre interfacce grafiche utente viene chiamata una finestra, è una finestra top-level (di primo piano) nell'X Window System. Il termine finestra è anche usato per finestre che stanno dentro un'altra finestra, in altre parole, sotto finestre di una finestra padre. Gli elementi grafici tipo bottoni, menu, icone, ecc. sono tutti realizzati usando finestre.
Una finestra può essere creata come sotto finestra di una finestra padre. Questo causa il fatto che le finestre sono gestite gerarchicamente in un albero. La radice dell'albero viene chiamata root window (finestra radice), che è automaticamente creata dal server. Le finestre top-level sono esattamente le sotto finestre figlie della finestra radice. Alla vista, la finestra radice è larga come lo schermo e sta dietro a tutte le altre finestre.

### Identificatori

Tutti i dati sulle finestre, font, ecc. sono immagazzinati nel server. Il client conosce gli identificatori di questi oggetti—interi che può usare come nomi per essi quando interagisce col server. Per esempio, se un client volesse che venisse creata una finestra, richiederebbe al server di creare una finestra con un dato identificatore. Il server crea quindi una finestra e le associa l'identificatore. L'identificatore può essere usato più tardi dal client per richiedere, ad esempio, che venga disegnata una stringa nella finestra.
Gli identificatori sono univoci anche nel server, non solo nel client; per esempio, non ci possono essere due finestre con lo stesso identificatore, anche se creato da due client differenti. Un client può accedere a qualsiasi oggetto noto l'identificatore, anche se l'oggetto è stato creato da un altro client.

### Attributi e proprietà

Ogni finestra ha un insieme predefinito di attributi e un insieme di proprietà, tutti memorizzati nel server e accessibili ai client tramite richieste appropriate. Gli attributi sono dati che riguardano la finestra, come la sua dimensione, la posizione, il colore di sfondo, ecc. Le proprietà sono pezzi di dati che sono attribuiti alla finestra. Al contrario degli attributi, le proprietà non hanno un significato a livello del protocollo principale di X Window. Un client può salvare dati arbitrari in una proprietà di una finestra.
Una proprietà è caratterizzata da un nome, un tipo e un valore. Una proprietà è simile ad una variabili in un linguaggio imperativo, dove l'applicazione può creare una nuova proprietà con un dato nome e di un certo tipo e salvarci un valore. Le proprietà sono associate alle finestre: due proprietà con lo stesso nome, aventi tipi e valori differenti possono esistere in due finestre differenti.
Le proprietà sono usate principalmente per la comunicazione fra client. Per esempio, la proprietà chiamata WM_NAME è usata per salvare il nome per la finestra; i gestori di finestre di solito leggono questa proprietà e visualizzano il nome della finestra in cima ad essa.
Le proprietà di una finestra possono essere mostrate usando il comando xprop. In particolare xprop -root mostra le proprietà della root window, che include le X resources (X risorse, parametri dei programmi).

### Eventi

Gli eventi sono pacchetti inviati dal server al client per comunicare che qualcosa che il client è interessato a sapere è avvenuto. Un client può richiedere al server di inviare un evento a un altro client; questo è usato per la comunicazione fra client. Per esempio, quando un client richiede il testo correntemente selezionato, un evento viene inviato al client che detiene la finestra che ha il testo selezionato.
Il contenuto di una finestra può essere distrutto in alcuni casi (per esempio, se la finestra è coperta). Ogni volta che un'area di contenuti distrutti (non visibili) viene resa visibile, il server genera un evento Expose per notificare al client che una parte della finestra deve essere disegnata.
Altri eventi sono usati per notificare ai client di input di mouse o tastiere, della creazione di nuove finestre, ecc.
Alcuni tipi di eventi sono sempre inviati ai client, ma la maggior parte di eventi sono inviati solo se il client aveva stabilito un interesse a riceverli. Questo perché i client potrebbero essere interessati solo ad alcuni tipi di eventi. Ad esempio, un client potrebbe essere interessato a eventi della tastiera ma non a quelli del mouse.

### Color modes (Modalità dei colore)

Il modo in cui i colori sono gestiti nell'X Window System a volte scatena confusione negli utenti, e storicamente sono parecchie e diverse le modalità che sono state supportate. Le applicazioni più moderne usano Truecolor (colori a 24-bit, 8 bit per ognuno di rosso, verde e blu), ma applicazioni vecchie o specialistiche potrebbero richiedere modalità diverse. Molte applicazione specialistiche commerciali usano PseudoColor.
Il protocollo X11 attualmente usa un intero singolo senza segno a 32-bit per rappresentare un singolo colore nella maggioranza delle operazioni grafiche, chiamato pixel value (valore del pixel). Quando si trasferisce l'intensità dei colori primari, viene usato un intero a 16 bit per ogni componente del colore. Esistono le seguenti rappresentazioni dei colori; non tutte di queste potrebbero essere supportate.
* DirectColor: Un pixel value viene decomposto nei sottocampi separati rosso, verde, blu. Ogni sottocampo indicizza una colormap (mappa del colore) separata. Le entry possono essere cambiate in tutte le colormap.
** TrueColor: Lo stesso del DirectColor, eccetto che le entry delle colormap sono predefinite dall'hardware e non possono essere cambiate. Tipicamente, ogni colormap di rosso, verde e blue fornisce una curva (quasi) lineare di intensità.
* GrayScale: Un pixel value indicizza una singola colormap che contiene intensità monocromatiche. Le entry delle colormap possono essere modificate.
** StaticGray: Lo stesso che GrayScale. eccetto che le entry delle colormap sono predefinite dall'hardware e non possono essere cambiate.
* PseudoColor (Chunk): Un pixel value indicizza una singola colormap che contiene le intensità dei colori. Le entry delle colormap possono essere modificate.
** StaticColor: Lo stesso che PseudoColor, eccetto che le entry delle colormap sono predefinite dall'hardware e non possono essere cambiate.

## Xlib e altre librerie client

La maggior parte dei programmi client comunicano con il server attraverso la libreria Xlib client. In particolare, la maggior parte di client usa librerie tipo Xaw, Motif, GTK+, o Qt le quali a loro volta usano Xlib per interagire con il server.

## Comunicazione fra client

Il protocollo principale di X Window fornisce meccanismi per la comunicazione tra i client: proprietà ed eventi di una finestra, in particolare gli eventi di messaggi client-to-client. Tuttavia, non specifica alcun protocollo per tali tipi di interazioni. Questi protocolli sono invece disciplinati da un insieme separato di convenzioni di comunicazione inter-client.
L'Inter-Client Communication Conventions Manual specifica il protocollo per lo scambio di dati attraverso selezioni e l'interazione delle applicazioni con il window manager. Questa specifica è stata considerata difficile e confusa; la consistenza del "look and feel" dell'applicazione e la comunicazione in genere è affrontata attraverso la programmazione di un determinato ambiente desktop.
L'Inter-Client Exchange protocol (ICE), specifica un framework per la creazione di protocolli di interazione tra i client, in modo che uno specifico protocollo può essere costruito in cima ad esso. In particolare, l'X Session Management protocol (XSMP) è un protocollo basato su ICE che regola l'interazione tra le applicazioni con il session manager, che è il programma che si occupa di memorizzare lo stato del desktop al termine di una sessione interattiva e di recuperarla quando un'altra sessione con lo stesso utente viene avviata di nuovo.
Più convenzioni recenti sono incluse nelle specifiche freedesktop, compreso il drag-and-drop (trascinamento) la convenzione Xdnd utilizzata per il trasferimento dei dati selezionando e trascinando in un'altra finestra e la convenzione per le applicazioni embedded Xembed che specifica come un'applicazione può essere eseguita in una sottofinestra di un'altra applicazione.

### Selezioni, cut buffer e trascinamenti

Le selezioni, i cut buffer e trascinamenti sono i meccanismi utilizzati per il sistema X Window per consentire a un utente di trasferire i dati da una finestra all'altra. Le selezioni e i cut buffer vengono utilizzati (di solito) quando un utente seleziona il testo o altri dati in una finestra e incolla in una finestra diversa. Il trascinamento è utilizzato quando un utente seleziona qualcosa in una finestra, poi clicca sulla selezione e trascina in un'altra finestra.
Dal momento che due finestre possono essere gestite da due diverse applicazioni, il trasferimento dei dati richiede che due diversi client, per interagire, siano collegati con lo stesso server X. Il protocollo principale di X Window comprende alcuni tipi di richieste ed eventi che sono specifici per lo cambio si selezioni, ma il trasferimento è fatto usando l'invio di eventi generali client-to-client e proprietà della finestra, che non sono specifici per il trasferimento delle selezioni.
I dati che devono essere trasferiti tra client possono essere di diversi tipi: di solito è testo, ma può anche essere una pixmap, un numero, una lista di oggetti, ecc.
Selezioni e trascinamenti sono meccanismi attivi: dopo che una parte di testo è stata selezionata in una finestra, il client che gestisce la finestra deve supportare attivamente un protocollo per il trasferimento dei dati all'applicazione che ne faccia richiesta. I cut buffer, invece, sono un meccanismo passivo: quando l'utente seleziona un testo, il suo contenuto viene trasferito in un cut buffer, dove rimane anche se l'applicazione che gestisce la finestra termina e la finestra viene distrutta.

### Window manager (Gestore delle finestre)

Un window manager è un programma che controlla l'aspetto generale di finestre e altri elementi grafici dell'interfaccia grafica utente. Le differenze nel look dell'X Window System in installazioni differenti sono principalmente dovute all'uso di diversi window manager o differenti configurazioni del window manager.
Il window manager si fa carico di decidere la posizione delle finestre, aggiungere bordi decorativi attorno ad esse, gestire icone, gestire i click del mouse fuori dalle finestre (nello sfondo), gestire certe combinazioni di tasti, ecc.
Dal punto di vista dell'X server, il window manager non è differente dagli altri client. La posizione iniziale e i bordi decorativi attorno alle finestre sono gestite dal window manager usando le seguenti richieste:
* un'applicazione può richiedere al server di non soddisfare le richieste di mappatura (visualizzazione) delle sotto finestre di una data finestra e che venga invece inviato un messaggio al suo posto.
* un'applicazione può richiedere il cambiamento della finestra genitore.
Il window manager usa la prima richiesta per intercettare qualunque richiesta di mappatura di finestre top-level (figlie della root window). Ogni volta che un'altra applicazione richiede la mappatura di una finestra top-level, il server non la esegue ma invia un evento al window manager al suo posto. La maggior parte dei window manager "adotta" la finestra: creano una finestra top-level più grande (chiamata frame window, finestra cornice) e affidano (rendono figlia) la finestra originale come figlia. Graficamente questo corrisponde a mettere la finestra originale dentro la frame window. Lo spazio della frame window che non è occupato dalla finestra originale viene usato per la cornice decorativa attorno alla finestra (il "bordo" e la "barra del titolo").
Il window manager gestisce i click del mouse nella frame window. Questo permette per esempio di muovere o ridimensionare la finestra quando un utente clicca e trascina sul bordo o sulla barra del titolo.
Il window manager è anche responsabile della gestione di icone ed elementi visuali relativi all'interfaccia grafica. Le icone non esistono a livello del protocollo principale di X Window. Sono implementate dal window manager. Per esempio. quando una finestra deve essere "ridotta a icona", il window manager FVWM cancella la finestra e crea una finestra per il nome dell'applicazione ridotta a icona ed eventualmente anche per un'immagine dell'icona. Il significato e la gestione delle icone è perciò deciso completamente dal window manager: alcuni window manager come wm2 non implementano proprio le icone.

### Session manager (Gestore di sessione)

Approssimativamente, lo stato di una sessione è lo "stato del desktop" in un dato momento: un insieme di finestre con i loro attuali contenuti. Più precisamente, è l'insieme delle applicazioni che gestiscono queste finestre e le informazioni che permettono a queste applicazioni di ripristinare le condizioni delle loro finestre gestite se richiesto. Un X session manager è un programma che salva e ripristina lo stato delle sessioni.
L'effetto più riconoscibile dell'uso di un session manager è la possibilità di uscire da una sessione interattiva e poi trovare le stesse finestre con lo stesso stato quando si rientra. Per fare in modo che funzioni, il session manager salva i nomi delle applicazioni che stanno girando all'uscita e le riavvia al login. Per fare in modo che lo stato delle applicazioni possa essere ripristinato bene (necessario per ripristinare il contenuto delle finestre), le applicazioni devono essere in grado di salvare il loro stato di esecuzione su richiesta del session manager e ricaricarlo quando vengono riavviate.
L'X Window System include un session manager predefinito chiamato xsm. Altri session manager sono stati sviluppati per specifici sistemi desktop: per esempio ksmserver è il session manager predefinito di KDE.

## X display manager

L'X display manager è il programma che mostra il login prompt grafico nell'X Window System. Più in generale, un display manager fa girare uno o più X server nella macchina locale e accetta connessioni in entrata da X server che girano su computer remoti. I server locali sono avviati dal display manager, che li connette per presentare all'utente la schermata di login. I server remoti sono avviati indipendentemente dal display manager e connessi ad esso. In questa situazione, il display manager lavora come un server telnet grafico: un X server può connettersi al display manager il quale avvia una sessione; i programmi di questa sessione girano sullo stesso computer del display manager ma hanno input e output nel computer dove gira l'X server (che potrebbe essere il computer di fronte all'utente come uno remoto).
XDM è il display mangager di base fornito con l'X Window System. Altri display manager comprendono GDM (GNOME), KDM (KDE), WDM (che usa i WINGs widget usati in Window Maker) e entrance (che usa l'architettura usata in Enlightenment v.17).

## Elementi dell'interfaccia utente

I primi widget toolkit per X includevano Xav (l'insieme di widget del progetto Athena), OLIT (OPEN LOOK Intrinsics Toolkit), XView, Motif e Tk. OLIT and XView sono i toolkit base per il vecchio ambiente desktop di Sun OpenWindows.
Motif fornisce il toolkit base per il Common Desktop Environment (CDE), che è un ambiente desktop usato nei sistemi Unix commerciali tipo Solaris, AIX e HP-UX. (Solaris 10 include sia CDE che GNOME, con quest'ultimo adesso preferito come ambiente desktop.)
Toolkit più moderni sono Qt (usato da KDE), GTK+ (usato da GNOME), wxWidgets, FLTK e FOX.

## Estensioni

L'X server fu progettato per essere semplice ma estensibile. In questo modo, molte funzionalità risiedono adesso nelle estensioni del protocollo.
A livello di protocollo. ad ogni estensione possono essere assegnati nuovi tipi di pacchetto di richiesta/evento/errore. I client hanno accesso alle funzionalità delle estensioni attraverso le librerie di estensione. Aggiungendo estensioni all'implementazione corrente del X server è notoriamente difficile a causa della mancanza di modularità nella progettazione del server. Un obiettivo a lungo termine del progetto XCB è di automatizzare la generazione sia di estensioni lato client che lato server a partire da descrizioni di protocollo in XML.
La seguente è una lista parziale delle estensioni che sono state sviluppate, ordinate approssimativamente in ordine temporale per ordine di introduzione a partire dal più recente:
| Estensione | Descrizione e note |
| Composite | Rendering di intere gerarchie di finestre fuori schermo, che permette alle applicazioni e ai composition manager di eseguire effetti grafici. È richiesto per funzioni come la alpha trasparenza di finestre e ombreggiature. |
| Damage | Traccia le regioni modificate delle finestre e minimizza l'utilizzo di banda richiesto per mantenere il display aggiornato. |
| XFixes | Diversi cambiamenti di protocollo. |
| Extended-Visual-Information (EVIE) | Permette ad un client di determinare le informazioni sulle core X visuals al di là di quello che il protocollo principale permette. |
| Distributed Multihead (DMX) | Comunica con il DMX server. |
| XvMC | Delega della video motion compensation alle GPU che lo supportano. |
| GLX | Supporto per il rendering OpenGL all'interno delle finestre. |
| XRender | Compositing (via accelerazione hardware) di immagini con alpha blending. |
| Resize and Rotate (RANDR) | Cambio dinamico di dimensione, riflessione, rotazione e frequenza di aggiornamento di uno schermo X. |
| Xinerama | Suddivisione del desktop in più monitor. |
| Display Power Management Signaling (DPMS) | Permette il controllo delle modalità di risparmio energetico del monitor. |
| XPRINT | |
| X keyboard extension | Gestione avanzata del layout della tastiera. |
| DOUBLE-BUFFER | Fornisce un'animazione senza flickering. |
| RECORD | |
| MIT-SHM | Uso della memoria condivisa per migliorare le performance. |
| SYNC | Fornisce timer e sincronizza i client (che ad esempio girano su diversi host e sistemi operativi) dall'interno dell'X server. Creato per sopperire agli errori introdotti dalla rete. |
| XTEST | |
| XInputExtension | Supporto per periferiche di input come le tavolette grafiche. |
| BIG-REQUESTS | Abilita richieste di lunghezza fino a 262140 byte. |
| XC-MISC | |
| X video extension | Supporto per l'hardware video overlay e hardware-based video scaling on playback. Anche chiamato Xv (da non confondersi con il programma xv). |
| Shape | Supporto per finestre non rettangolari e parzialmente trasparenti (binarie, senza opacità alpha). |
| DEC-XTRAP | |
| MIT-SCREEN-SAVER | |
| MIT-SUNDRY-NONSTANDARD | Supporto retro-compatibile per varie funzionalità per i client che usavano le prime implementazioni di X11. Per compatibilità con i client Pre-X11R4. |
| SECURITY | |
| TOG-CUP | Fornisce una politica di utilizzo delle colormap. |
| X-Resource | |
| XC-APPGROUP | |
| XFree86-Bigfont | |
| XFree86-DGA | Fornisce l'accesso al direct linear framebuffer (direct graphics access). |
| XFree86-Misc | |
| XFree86-VidModeExtension | Configura dinamicamente le modeline e i gamma. |

### Estensioni obsolete

| Extension | Descrizione e note |
| Low Bandwidth X (LBX) | Rimpiazzato da X con tunneling sopra una connessione secure shell, dimostrato essere più veloce di LBX. |
| PEX | "PHIGS Extension a X"; supporto per l'API di scene grafica PHIGS 3D. GLX con OpenGL viene frequentemente usata al suo posto |
| XImage Extension | MIT-SHM viene usata al suo posto. |