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. 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 a livello del 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 frammenti di dati associati 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.