SISTEMI A FINESTRE

Window Management Systems (WMS)

Sistema a finestre: sistema software che poggia sul sistema operativo e si pone fra le applicazioni ed i dispositivi di I/O in modo da gestire le operazioni di interazione fra utente ed applicazione.

Compiti di un sistema a finestre:

Meccanismo generale tra WMS, utente ed applicazione:

L'utente compie azioni sui dispositivi di input. In corrispondenza di tali azioni, il WMS genera eventi e li smista alle applicazioni. L'applicazione interpreta l'evento e si comporta di conseguenza.

L'applicazione fa richieste al WMS per ottenere risorse che gli permettano di fornire l'output all'utente. Le risorse sono strutture dati per l'applicazione, e appaiono all'utente (tramite di dispositivi di output) come finestre, testo, grafica. L'utente vede cosi' i risultati e il feedback delle proprie azioni.

Architettura client/server

Un WMS puo' essere collegato as una singola piattaforma sulla quale girano tutte le applicazioni che ne fanno uso, oppure avere una architettura distribuita di tipo client/server.

Server

Processo responsabile di tutti i dispositivi di I/O (schermo, tastiera, mouse): Server di solito sulla stessa macchina a cui sono collegati i dispositivi.

Client

Applicazione che puo' anche girare su una macchina diversa da quella del server e che comunica con il server via rete attraverso un protocollo comune.

Tutto l'I/O dell'applicazione e' gestito dal server. Il client fa richieste al server (es. chiede di scrivere o visualizzare qualcosa) e riceve dal server sia risposte alle sue richieste che eventi generati dalle azioni dell'utente.

Comunicazione fra client e server

Client invia richieste al server.

Server invia al client risorse sotto forma di link a strutture dati che risiedono sul server.

Client puo' agire su queste strutture mediante determinate operazioni primitive fornite dalla API.

Server invia al client anche eventi che possono essere prodotti in conseguenze delle azioni compiute dall'utente sui dispositivi.

Il computer su cui risiede i client non ha bisogno di tutto lo strato di software che costituisce il WMS, ma solo delle librerie che costituiscono l'API e del relativo protocollo di comunicazione.


Il client e' quello che ci mette la CPU, il server e' quello che ci mette schermo e dispositivi di input. Notare che i ruoli di client e server qui sono invertiti rispetto ad altri contesti.

Risorse

Risorsa: struttura dati mantenuta e gestita dal server per conto di uno o piu' client.

Risorse possono essere:

Il server puo' creare, modificare e distruggere le risorse su richiesta del client. Nota: per l'applicazione una risorsa e' una struttura dati. Per l'utente e' un potenziale output grafico. Es: una finestra che nello stato corrente puo' essere mappata (visibile) oppure non mappata (nascosta).

Richieste

Quando il client ha bisogno di un servizio da parte del server, manda una richiesta.

Richieste tipiche:

Gli esempi di richieste precedenti sono fatti riferendosi a risorsa finestra, vi sono richieste per altri tipi di risorse.

Per soddisfare una richiesta, il server puo' dover compiere una delle operazioni seguenti:

Il server inserisce tutte le richieste provenienti dai vari client in una coda e le prende in considerazione quando ha tempo.

Protocollo di cominicazione fra client e server e' asincrono. Il client non aspetta la risposta alla richiesta ma va avanti (anche con altre richieste). Ci possono essere dei ritardi.

Finestre

Finestra: area rettangolare sullo schermo.

Componenti di una finestra:

Finestra identificata dal server in modo univoco.

Client puo' agire su una finestra facendo richieste al server tramite l'identificatore 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).

Relazioni tra finestre:

1. Gerarchia delle finestre

Le finestre sono organizzate secondo una struttura ad albero (albero delle finestre) che implementa il concetto di annidamento.
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. iconificata o ricoperta da altre). Una finestra e' visibile solo se le finestre da cui discende sono visibili.

2. Stack delle finestre

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

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


Le finestre sono tenute in una pila e visualizzate di consegnenza.

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.

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

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 l'area occupata sullo schermo dalla finestra e' piu' grande della dimensione effettiva della finestra a causa dello spessore del bordo.

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.

La visualizzazione ha effetto purche':

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

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

Mantenimento del contenuto delle finestre

Quando una finestra viene oscurata o resa invisibile e poi torna visibile, e' necessario rispristinare il suo contenuto.

Alcune possibilita':

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 possono anche essere utilizzati dal server per avvisare un client del cambio di stato delle sue finestre.

Un evento e' sempre collegato ad una finestra (event window) che e' quella a cui si riferisce l'azione dell'utente oppure quella che ha cambiato stato.

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

Azioni del server quando accade una potenziale causa di evento

Notifica di un evento a un client

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:

Gestione dei dispositivi di input

Il server puo' gestire diversi dispositivi di input. I piu' comuni sono mouse e tastiera.

Mouse

Il mouse permette essenzialmente di: Presenza di 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 doopio click o triplo click.

Sono distinti pressione e rilascio (es. 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. comparsa di menu' pull-down).

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 questo tipo si chiama focus window.

La focus window puo' essere stabilita in due modi a seconda della modalita' di funzionamento del server:

Window manager (WM)

Window manager: e' un client particolare che ha il compito di gestire l'assetto delle finestre nell'ambito del desktop o workspace.

Compiti principali del WM:

WM dialoga con il server attraverso richieste ed eventi.

WM puo' chiedere al server di ridirigergli tutte le richieste provenienti da altri client e riguardanti la struttura di una finestra.

Esempio:
Wm puo' fare mapping di finestre arricchendo la finestra con un frame (bordo, cornice) che offre all'utente i controlli sulla finestra stessa.
WM crea una finestra piu' grande di quella richiesta dal client e ritaglia la finestra del client come sottofinestra.
Eventi che hanno origine nel frame sono mandati a WM.
Eventi che hanno origine nella finestra interna sono inviati al client.



PROGRAMMAZIONE GUIDATA DA EVENTI

(event-driven programming)

Applicazione interattiva implementata come client nel contesto di un WMS.

Il comportamento dell'applicazione e' di tipo reattivo. Le reazioni sono scatenate dagli eventi prodotti dal WMS a seguito delle azioni dell'utente. Gli eventi determinano il flusso del programma. Tipi di interazione:

a. Interazione bloccante

L'applicazione si pone in attesa di un evento e interrompe ogni altra attivita' (liberando la CPU).

Schema di funzionamento di un programma guidato da eventi con interazione bloccante:

I passi 3,4 e 5 costituiscono il ciclo degli eventi.

Il ciclo degli eventi puo' essere implementato come un loop infinito o come un loop che prevede una condizione di uscita corrispondente alla terminazione dell'applicazione.

All'interno del ciclo si effettua una selezione (case o switch) che puo' dipendere sia dal tipo di evento che dallo stato in cui si trova il programma.

Ad ogni scelta corrisponde un insieme di istruzioni (procedura) che costituisce la reazione del programma all'evento. Tale reazione puo' comportare:

Schema dellinterazione:

Nota: importante che l'attesa del programma sia bloccante in contesti di time-sharing.

Procedure callback

Alternativa a scrivere uno switch nell'event loop.

Callback: procedura dell'applicazione che viene eseguita al verificarsi di un dato evento

In fase di inizializzazione, la procedura viene definita e registrata cioe' collegata all'evento in questione.

L'interfaccia di programmazione puo' fornire un meccanismo che gestisce l'associazione evento-callback e implementa automaticamente il ciclo degli eventi.

Ciclo degli eventi consiste dei passi:

Il programmatore deve:

b. Interazione non bloccante

Necessita' di un programma di gestire sia operazioni di reazione ad eventi, sia operazioni autonome (che il programma esegue anche quando l'utente non produce eventi.

L'applicazione monitora se arrivano eventi e nel frattempo esegue le sue operazioni (consumando CPU). Se arriva un evento, allora interrompe la sua normale attivita' per reagire all'evento.

Due possibilita':

Toolkit

Toolkit: API di livello piu' alto rispetto alla libreria di base fornita dal WMS.

Toolkit ha il compito di semplificare e standardizzare l'uso di richieste ed eventi da parte dell'applicazione.

Widgets

Toolkit implementa l'interazione con l'utente attraverso oggetti di finestra o widget (= window object: bottoni, menu'...).

Dal punto di vista del programmatore un widget e' una struttura dati caratterizzata da:

In genere widget di un toolkit sono organizzati in classi secondo la filosofia object oriented. Creare un widget = creare un'istanza della classe opportuna.

Due tipi findamentali di widget:

Gestione degli eventi nei widget

Eventi dispatching: in un programma realizzato tramite un toolkit, gli eventi inviati dal WMS non sono visibili direttamente, ma solo attraverso i widget.

Toolkit gestisce direttamente la coda degli eventi tramite un event loop.

Quando arriva un evento dal WMS, il toolkit attiva il widget a cui l'evento si riferisce (cioe' il widget che corrisponde alla event window).

Widget puo' gestire un evento come:

Nota: evento di widget puo' essere causato anche da una sequenza di eventi del WMS (es. doppio click).

Esempi:




Toolkit per la progettazione di interfacce grafiche

(GUI Designer)

Programma interattivo che permette la progettazione di interfacce grafiche basate su un dato toolkit.

Esempi:

Il GUI Designer produce il codice relativo all'interfaccia.

Il programmatore deve solo riempire il corpo delle procedure callback che corrispondono alle azioni dei widget istanziati.