3. Architettura del sistema X Window: una panoramica

L'architettura di X è client-server. Le applicazioni stesse sono dei client; esse comunicano con il server e inviano delle richieste, ricevendo informazioni dal server.

Il server X ha il controllo esclusivo dello schermo e dei servizi richiesti dai client. A questo punto i vantaggi di questo modello sono abbastanza chiari. Le applicazioni (client) hanno solo bisogno di sapere come comunicare con il server e non si devono preoccupare dei dettagli del dispositivo grafico fisico. Al livello base, un client dice al server cose del tipo "disegna una linea che va da qui a qui", oppure "visualizza questo testo, usando questi caratteri, in questo punto dello schermo".

È come se stessimo usando una libreria grafica per scrivere la nostra applicazione. Tuttavia il modello di X fa un passo in più. Non si limita a poter essere usato solo da un client che risiede sulla stessa macchina del server. Il protocollo usato per far comunicare client e server può funzionare anche attraverso una rete, e in realtà qualsiasi "meccanismo di comunicazione inter-processo che fornisca un flusso di byte affidabile". Ovviamente il modo preferito di far comunicare un client e un server remoto è attraverso i protocolli TCP/IP. Evidentemente il modello di X è veramente potente; l'esempio classico è quello in cui si fa girare un'applicazione che impegna pesantemente il processore su un computer Cray, un'applicazione che gestisce un database su un server Solaris, un'applicazione di posta elettronica su un mail server BSD, un programma di visualizzazione su un server SGI e poi si visualizza tutto sullo schermo di una workstation Linux.

Fin qui abbiamo visto che il server X è quello che si occupa della visualizzazione vera e propria. E, siccome è il server X che gira sulla macchina fisica su cui l'utente sta lavorando, è responsabilità del server X gestire tutta l'interazione effettiva con l'utente. Incluso leggere i movimenti del mouse e l'input della tastiera. Tutte queste informazioni sono passate al client, che ovviamente dovrà reagire ad esse.

X fornisce una libreria, chiamata Xlib, che gestisce tutte le comunicazioni client-server di basso livello. Sembra ovvio quindi che il client debba invocare le funzioni contenute in Xlib per fare quello che deve fare.

A questo punto tutto sembra andare per il verso giusto. Abbiamo un server che si occupa dell'output visivo e dell'input, applicazioni client e un meccanismo per farle comunicare tra loro. Nel figurarsi un'interazione ipotetica tra un client e un server, il client potrebbe chiedere al server di farsi assegnare un'area rettangolare dello schermo. Essendo un client, non mi interessa dove vengo messo sullo schermo. Dico solo al server: "dammi un area di dimensioni X per Y in pixel" e poi chiamo funzioni per eseguire azioni del tipo "disegna una linea da qui a qui", "dimmi se l'utente sta muovendo il mouse sopra la mia area dello schermo", e così via.