Paola Magillo, Univestita' di Genova, Corso di Interfacce Utente per Informatica, a.a. 2002-2003.

FINESTRE, EVENTI E LORO GESTIONE

Che cosa e' una finestra?

Finestra: area rettangolare sullo schermo, su cui e' possibile visualizzare testo / grafica, catturare eventi.
Funziona come unita' autonoma di I/O.

Una finestra e' identificata dal server in modo univoco.

Client puo' agire su una finestra facendo richieste al server tramite l'identificatore (link) della finestra.

Non e' necessario che un client indirizzi solamente le finestre da esso create. Puo' anche agire su altre finestre purche' ne conosca l'identificatore (es: window manager e' un client che gestisce posizione e dimensione di tutte le finestre di uno schermo - ved. piu' avanti).

Precisazione

Finestre qui non sono solo quelle che si stagliano sullo sfondo del desktop. Sono anche tutte le loro sottoparti dotate di capacita' di I/O gestite in modo indipendente.
Esempio: in finestra che ha un pannello di sfondo con due bottoni, i bottoni sono a loro volta finestre, infatti hanno capacita' di interazione indipendente (sono sensibili a click del mouse, al contratio del pannello di sfondo in cui si trovano).

Gerarchia delle finestre

Le finestre sono organizzate secondo una struttura ad albero (albero delle finestre) che rispecchia la relazione di contenimento o annidamento.
Contenimento = Una finestra e' ritagliata dentro un'altra finestra.

Una sottofinestra e' vincolata a rispettare l'annidamento. Se spostata fuori dall'area della finestra da cui discende, la parte esterna non e' visibile.

Una finestra puo' esistere ma non essere visibile (es. non mappata, iconificata o ricoperta da altre finestre). Una finestra e' visibile solo se le finestre da cui discende sono visibili.

Finestre a top-level

Ogni finestra top-level appartiene ad un'applicazione. Le sue sotto-finestre appartengono alla stessa applicazione.

Componenti di una finestra top-level:

Bordo e' gestito dal window namager (ved. dopo), particolare applicazione che riceve dal server compito di gestire in modo uniforme le finestre top-level di tutte le diverse applicazioni che girano sul sistema.

Interno e' gestito dall'applicazione. In genere strutturato in sotto-finestre che svolgono funzioni diverse nell'interazione con l'utente (bottoni, aree testuali...).

Stack delle finestre

Consideriamo solo finestre top-level.

Diverse finestre di diverse applicazioni possono coesistere su una stessa porzione di schermo sovrapponendosi parzialmente o totalmente.

Il sistema tiene un ordinamento (pila o stack) delle finestre. La posizione nello stack (sopra/sotto) decide quale finestra va a coprire l'altra in caso di coesistenza della stessa area dello schermo.

Nota: a differenza di quanto avviene nell'albero delle finestre, qui la sovrapposizione fra due finestre e' accidentale e transitoria.


Stack in generale vale per un insieme di finestre sorelle (sotto-finestre della stessa finestra a stesso livello nella gerarchia di contenimento).
Il caso piu' significativo e' lo stack tra finestre top-level (figlie della root window, cioe' finestre disegnate direttamente sullo sfondo del desktop).

Su richiesta delle applicazioni o in conseguenza di azioni dell'utente e' possibile cambiare l'ordine nella pila.

E' possibile modificare la posizione nella pila di una finestra rispetto alle finestre che stanno al suo stesso livello nella gerarchia ad albero. In genere si agisce sulle top-level.

Una sottofinestra segue la finestra da cui discende in ogni suo spostamento nella pila.

Mapping di finestre

Creazione di una finestra da parte del server consiste nell'allocazione ed inizializzazione della corrispondente struttura dati.

Una finestra creata non e' necessariamente visualizzata sullo schermo.

Client puo' richiedere la visualizzazione di una finestra attraverso mapping.

Una finestra mappata e' visibile ha purche':

Per rendere non piu' visualizzata una finestra: operazione di unmapping. Unmapping di una finestra provoca automaticamente unmapping delle sue discendenti.

Esempio: iconificazione di una finestra = unmapping della finestra e contemporaneo mapping dell'icona.

Sistemi di coordinate

Ogni finestra ha un sistema di riferimento a coordinate intere. Ogni pixel una unita'.

Una finestra e' caratterizzata da:

La posizione cambia in corrispondenza di azioni di spostamento.
Il sistema di coordinate cambia in corrispondenza di azioni di ridimensionamento.

In generale, per una finestra top-level, l'area occupata sullo schermo dalla finestra e' piu' grande della dimensione effettiva della finestra a causa dello spessore del bordo.

Eventi

Evento: messaggio inviato da server a client per notificare che qualcosa e' successo o qualche condizione e' cambiata.

Il server genera eventi come conseguenza di un'azione compiuta dall'utente oppure come conseguenza di una richiesta fatta da un client.

Azioni piu' comuni che generano eventi:

Eventi sono anche utilizzati dal server per avvisare un client del cambio di stato delle sue finestre. Es: quando una finestra viene coperta / scoperta da un'altra.

Un evento accade sempre in una finestra (source window = finestra sorgente): la finestra dove e' avvenuta l'azione dell'utente oppure la finestra che ha cambiato stato.

Per essere abilitato a ricevere eventi, il client deve fare una richiesta esplicita al server in cui indica:

Quando accade una potenziale causa di evento, il server:

La finestra sulla quale un evento viene intercettato e notificato (che e' o la source window o una sua antenata nella gerarchia) e' chiamata event window.

Il client ha una coda FIFO in cui raccoglie gli eventi che gli vengono mandati dal server (sono solo gli eventi che lo riguardano) nell'ordine in cui sono stati generati.

Informazioni associate a un evento

Un evento porta con se' un pacchetto di informazioni:

Eventi da mouse

Il mouse permette essenzialmente di:

Associato al mouse c'e' un cursore (eco) descritto da una bitmap che viene mantenuta dal server e viene visualizzata come immagine digitale sullo schermo.

Cursore e' caratterizzato da un suo punto interno (hotspot). Questo punto rappresenta la posizione del mouse e viene monitorato dal server.

Il client puo' chiedere al server di notificare eventi quando:

Eventi relativi a pressione di bottoni sono caratterizzati da un "time stamp" per discriminare fra pressioni singole e sequenze tipo doppio click o triplo click.

Sono distinti pressione e rilascio (utile per per menu' pop-up, operazioni di drag).

Eventi di spostamento sono onerosi da gestire. Client puo' chiedere al server di generare un evento all'inizio e uno alla fine del movimento.

Eventi di entrata ed uscita sono utili per evitare che le applicazioni debbano monitorare continuamente la posizione del mouse (es. mentre l'utente scorre tra le opzioni di un menu' pull-down).

Eventi da tastiera

Server genera un evento ogni volta che un tasto viene premuto o rilasciato.

Evento e' caratterizzato dal codice del tasto piu' dalla presenza di modificatori dovuti alla pressione contemporanea di piu' tasti (es. control, alt...).

La finestra a cui si riferisce un evento di tastiera si chiama focus window.

Sono possibili varie convenzioni per stabilire la focus window:

Mantenimento del contenuto delle finestre

Il contenuto (grafico, testuale) di una finestra e' il risultato delle operazioni eseguite (mediante richieste al server) dal client sulla finestra.

Quando una finestra viene oscurata o resa invisibile e poi torna visibile, e' necessario ripristinare il suo contenuto. Di questo puo' incaricarsi:

  1. Il server, che deve avere tenuto copia locale del contenuto della finestra (backing store), eseguendo tutti gli aggiornamenti anche sulla copia.
    Non richiede intervento del client, e' molto oneroso per il server.
  2. Il client, inviando al server le richieste necessarie a riprodurre il contenuto della finestra: E' piu' laborioso per programmatore e client.

La strategia 1 ha uso molto limitato e per finestre transitorie (es. menu' pop-up): server salva copia solo del contenuto dell'area della finestra che cade sotto ad una particolare finestra che viene mappata temporaneamente sopra di essa.

Ordinariamente e' usata la strategia 2.