Sisteme de gestiune a ferestrelor.
In primul capitol am descris software-ul pentru un sistem interactiv ca o colectie de masini abstracte, fiecare indeplinind anumite functii si ascunzand mecanismele asociate cu acele functii. La nivel cel mai apropiat de dispozitivul fizic se afla sistemul de gestiune a ferestrelor. Aceasta mas 15215j914p ina abstracta indeplineste trei functii;
Defineste un terminal abstract care ofera clienti (utilizatorii serviciilor sale) care sunt independenti de dispozitiv.
Defineste un model imaginar pentru exprimarea intrarilor si iesirilor pentru terminalul abstract.
Gestioneaza resursele asociate dispozitivelor de Intrare / iesire.
Independenta de dispozitiv si Partajarea dispozitivelor.
Exista o mare varietate de terminale fizice. Independenta de dispozitiv se obtine prin ascunderea caracteristicilor unui anumit terminal prin intermediul abstractizarii. Partajarea dispozitivului inseamna alocarea resurselor unui terminal fizic la mai multi clienti. Un terminal abstract si clientii sai comunica prin intermediul evenimentelor.
Independenta de dispozitiv.
Se spune despre un software ca este independent de dispozitiv daca el poate fi executat pe diferite tipuri de dispozitive. Aceasta permite portabilitatea software-ului si usurinta in programare (intrucat programatorul nu trebuie sa cunoasca secventele specifice care determina comportare unui anumit terminal).
Un sistem de gestiune a ferestrelor include un nivel care defineste un terminal abstract. Acesta ofera clientilor sai un set fix de operatii virtuale, care au efect asupra hardware-ului. Operatiile virtuale apar clientului ca operatii reale, iar terminalul abstract este cel responsabil de translatarea lor in operatii concrete. Nivelul care asigura independenta de dispozitiv translateaza operatiile virtuale in operatiile corespunzatoare ale terminalului fizic. Aceste operatii sunt la randul transmise dispozitivului fizic printr-un nivel al driver-ului de dispozitiv. La instalarea sistemului de gestiune a ferestrelor pe alt terminal, trebuie modificat doar nivelul care asigura independenta de dispozitiv; restul sistemului poate sa ramana neschimbat.
In general, utilizarea abstractizarii pentru a ascunde complexitatea si a asigura portabilitatea necesita unele compromisuri. De exemplu, modelul imaginii in X Window System depinde de densitatea pixelilor pe ecran. Intrucat display-uri diferite au densitatea pixelilor diferita, acelasi software, ruland pe doua display-uri diferite poate sa produca imagini putin diferite. De exemplu, unele display-uri au pixelii petrati, in vreme ce altele - dreptunghiulari. Ca urmare, un software care deseneaza un cerc pe unul din display-uri, pe celalat va desena o elipsa.
Evenimente.
Un sistem de gestiune a ferestrelor accepta cereri de iesire conform modelului propriu al imaginii si returneaza rezultate ale intrarilor din partea operatorului sub forma de evenimente. Desi fiecare tip de eveniment este specific implementarii, in general exista urmatoarele tipuri:
n Keyboard events. Operatorul apasa o anumita tasta; este responsabilitatea clientului sa interpreteze fiecare apasare de tasta.
n Location events. Actiunile operatorului pot preciza pozitia cursorului intr-un anumit sistem de referinta. De exemplu, in X, trecerile mouse-ului peste marginile unei ferestre sunt returnate catre client ca evenimente particulare.
n Choice events. Unele actiuni ale operatorului reprezinta selectia unor optiuni. Aceste actiuni, cum ar fi apasarea unui buton al mouse-ului (button - down) sau eliberarea lui (button - up) sunt returnate clientului ca choice events.
n Value events. Unele dispozitive, cum ar fi potentiometrele, genereaza valori, care trebuie communicate clientului.
n Timing events. Esantioanele de timp pot fi utilizate in doua moduri intr-un sistem de gestiune a ferestrelor: pentru determinarea distantei in timp a doua evenimente (de exemplu pentru a genera evenimentul de dublu-click) si pentru a asigura faptul ca un client opereaza asupra evenimentelor asociate in ordinea corecta.
In fig. 3.1. se observa ce se intampla atunci cand un client acceseaza un terminal abstract. Clientul solicita un eveniment, plasat intr-o coada, determina tipul evenimentului si raspunde conform lui.
Desi, din punct de vedere al software-ului, diferitele tipuri de dispozitive sunt tratate identic la nivelul evenimentului abstract, din perspectiva operatorului ele pot avea caracteristici diferite. De exemplu, un mouse si un trackball sunt ambele dispozitive de precizare a unui punct si ambele genereaza location events, dar ele nu sunt la fel de usor de manuit de catre operator.
Partajarea dispozitivelor.
Scopul partajarii dispozitivului este sa permita existenta mai multor terminale abstracte. Fiecare exemplar este accesat de catre un client. Pentru simplificare, vom presupune in continuare ca fiecare exemplar al terminalului abstract contine doar o singura fereastra. Ca urmare, una dintre functiile sistemului de gestiune a ferestrelor, pe care clientul nu o vede, este partajarea aceluias dispozitiv fizic la mai multe procese. Fiecare client pare sa fie singurul care interactioneaza cu terminalul (vezi fig. 3.2)
Pentru a ilustra mecanismele utilizate pentru unul sau mai multi clienti, sa incepem cu cazul in care un client este singurul utilizator al terminalului fizic. Vom presupune ca pozitia curenta a cursorului este afisata pe ecran si ca nu exista hardware dedicat pentru mouse. La miscarea mouse-ului de catre operator apare urmatoarea secventa de evenimente:
La fiecare increment al miscarii, controller-ul fizic genereaza un mesaj catre software-ul drievr-ului de dispozitiv (marimea incrementului este de obicei controlabila prin driver).Driver-ul calculeaza locatia de pixel curenta si raporteaza rezultatul sistemului de gestiune a ferstrelor. Acesta genereaza instructiuni pentru mutarea imaginii cursorului la noua pozitie pe ecran. Acestea sunt transmise driver-ului de dispozitiv, care sterge vechiul bitmap pentru cursor.
Cand operatorul face un button-down, se genereaza o intrerupere care este tratata de catre driver-ul de dispozitiv. Acesta trimite un eveniment sistemului de ferestre, care la randul sau informeaza clientul ca a aparut un eveniment de button-down. In timp ce cursorul era la o anumita locatie pe ecran.
La eliberarea butonului, driver-ul informeaza sistemul de ferestre despre o alta intrerupere. Sistemul de ferestre, la randul sau, informeaza clientul.
De notat faptul ca sistemul de ferestre trateaza feedback-ul asociat cu miscarea mouse-ului. De asemenea, nivelul de abstractizare este reflectat prin evenimente de buton. Sistemul de ferestre nu informeaza clientul despre miscarile incrementale ale mouse-ului. Pozitia cursorului este raportata clientului numai asociata cu alta informatie (starea si identitatea butonului mouse-ului). Pe de alta parte, sistemul de ferestre nu trateazaobiectele de pe ecran si nici nu interpreteaza evenimentele. Maparea cursorului pe un anumit obiect si interpretarea lui button-down si button-up ca eveniment "choice" sunt tratate la un nivel mai inalt de abstractizare decat sistemul de ferestre.
Pana acum, am presupus ca terminalul fizic are un singur client. In practica, aproape intotdeauna sunt mai multi clienti. Asa cum se vede in figura 3.3., mai multi clienti interactioneaza cu sistemul de ferestre, care deci trebuie sa partajeze resursele.
Atunci cand sunt mai multi clienti, sistemul de ferestre trebuie sa efectueze o serie de operatii suplimentare. El detecteaza pozitia curenta a cursorului, decide pentru care clienti este evenimentul, mapeaza pozitia din sistemul de coordonate al display-ului intr-un sistem de coordonate bazat pe fereastra clientului si informeaza clientul despre eveniment in acest sistem de coordonate. Din punct de vedere al clientului, informatia raportata de catre sistemul de ferestre nu difera. De asemenea, driver-ul de dispozitiv nu are cunostinta de existenta mai multor clienti. Doar sistemul de ferestre trateaza acest fapt.
Conceptul de apartenenta ofera mecanismul pentru determinarea clientului care sa receptioneze un anumit eveniment. O fereastra are un proprietar (un anumit proces) si sistemul de ferestre transmite evenimentul proprietarului ferestrei unde a aparut evenimentul. Cererile de iesire din partea clientului sunt mapate la terminalul abstract corespunzator si deci la fereastra asociata cu acel terminal abstract. Orice cereri de afisare inafara domeniului ferestrei clientului sunt decupate de catre sistemul de ferestre. Evenimentele de intrare se distribuie dupa una din cele doua metode:fie sistemul de ferestre transmite evenimentul la toate ferestrele care ar putea fi interesate in acel tip de eveniment, fie sistemul de ferestre trimite evenimentul la fereastra care are focus-ul curent.
Modelul imaginii.
Terminalul abstract implementat de un sistem de ferestre ofera clientilor un model de exprimare a iesirii. Acest model stabileste baza conceptuala a interactiunilor dintre client si sistemul de ferestre. Imaginile de afisat se descriu in termenii modelului, iar locatiile evenimentelor sunt returnate in termenii elementelor modelului. In general se utilizeaza urmatoarele modele:
Gestionarea resurselor.
Am vorbit deja despre sistemul de ferestre ca manager de resurse pentru un terminal fizic. Resursele pe care un terminal fizic se presupune ca le are si sunt gestionate de catre sistemul de fisiere includ:
n Un ecran de inalta rezolutie. Se presupune ca este de tip bit-map.
n Tastatura.
n Un dispozitiv de localizare. De obicei este un mouse cu mai multe butoane, dar poate fi vorba si despre joystick, trockball, sau alte dispozitive.
n O paleta a culorilor.
n Fonturi.
Gestionarea unei singure ferestre.
O fereastra este portiunea de ecran a terminalului abstract al unui proces. Ea este suprafata in care acel proces poate desena intrucat un sistem de ferestre gestioneaza fereastra, aceasta nu este limitata de dimensiunea si forma ecranului fizic. Fiind vorba despre un ecran abstract, o fereatsra poate fi mai mare deci ecranul real. Sau poate fi reprezentata printr-un icon. Ferestrele pot avea decoratii, cum ar fi bare de titlu si puncte pentru redimensionare.
Redimensionarea unei ferestre.
Una din functiile oferite de un sistem de ferestre este redimensionarea. Operatorul poate indica sistemului de ferestre ca o anumita fereastra trebuie redimensionata si apoi sa specifice noua marime. Sistemul de ferestre raporteaya acest eveniment clientului, care are doua posibilitati: (1) sa afiseze numai o portiune a ecranului dorit, utilizand notiunea de viewport, sau (2) sa redimensioneze continutul ferestrei. In primul caz, marimea informatiei afisate nu se modifica, doar portiunea de informatie vizibila, pe cand in al doilea caz aceeasi informatie este vizibila, doar scara la care este reprezentata se modifica.
Forma ferestrelor.
In multe sisteme, cum ar fi NextStep, OpenLook, Macintosh, ferestrele sunt dreptunghiulare. Aceasta simplifica decuparea. Pe de alta parte, ferestrele dreptunghiulare ridica o serie de probleme de selectie si afisare atunci cand sunt utilizate ca regiuni pentru afisarea unor obiecte grafice. De exemplu, asa cum se vede in fig. 3.11, este dificil de separat doua linii diagonale in doua regiuni dreptunghiulare.
In unele sisteme, cum ar fi NeWS si XWindow, este posibil sa avem ferestre cu forma oarecare. In NeWS, limitele ferestrei suntreprezentate prin curbe spline, care decupeaza zona de desenare. In XWindow, limitele ferestrei pot fi reprezentate printr-un bit-map sau o colectie de dreptunghiuri.
Gestionarea mai multor ferestre.
Sistemele de ferestre gestioneaza mai multe terminale abstracte. Gestionarea resurselor terminalului fizic presupune atat gestionarea elementelor de intrare cat si a celor de iesire.
|