Programmare in C su Amiga - digitanto.it fileAMIGA Programmare in C su Amiga di Dario de Judicibus...

6
AMIGA Programmare in C su Amiga di Dario de Judicibus ottava puntata Continuiamo con questa puntata il nostro viaggio nei segreti di Intuition, in modo da preparare, un passo alla volta, una solida base su cui costruire programmi in grado di sfruttare appieno uno dei più interessanti componenti del sistema operativo dell'A miga Errata corrige Nella 6' puntata c'è una inesattezza. L'ultimo paragrafo prima della conclusio- ne avvertiva che il programmino d'esem- pio non doveva essere lanciato da CLI in quanto non verificava l'esistenza dello schermo del WorkBench. In realtà questo non è esatto, in quanto una finestra CLI "poggia» comunque su uno schermo WorkBench, anche se non è stata lancia- ta l'applicazione associata che gestisce menu ed icone attraverso il comando LoadWB. Inoltre, essendo il Workbench uno schermo standard, come spiegato nel presente articolo, esso viene automa- ticamente aperto da Intuition se vi si apre una finestra. Ci scusiamo con i lettori dell'imprecisione. 186 L'esercizio della scorsa puntata aveva principalmente due obiettivi: il primo era quello di familiarizzare il lettore con lntuition, essendo il primo esercizio di programmazione in C proposto ai lettori da quando abbiamo iniziato ad affronta- re lntuition; il secondo, quello di dimo- strare alcuni dei limiti imposti da intui- tion per quello che riguarda le dimensio- ni degli schermi. Se siete riusciti a scrivere il program- ma in questione (vedi figura 1). vi sarete certamente resi conto che, pur essendo di dimensioni relativamente ridotte, e di conseguenza offrendo funzionalità ab- bastanza scarse, una volta lanciato lo, è possibile spostare la finestra qua e là per tutto il tempo che si vuole, fino a che non si chiude il tutto selezionando il gadget di chiusura della finestra. Que- sta è di fatto la vera potenza di lntui- tion: pur non limitandovi nelle vostre scelte e nel grado di controllo che desi- derate avere dell'ambiente creato (schermi, finestre, gadget. menu ...). In- tuition è in grado di gestire in modo automatico tutto ciò di cui non volete interessarvi personalmente, secondo determinati schemi in buona parte an- ch'essi definibili dal programmatore. È insomma un perfetto maggiordomo, che vi lascia fare tutto (o quasi) quello che volete, ma è pronto a sostituirvi nel fare gli onori di casa non appena gli restituite il controllo. Tornando al nostro esercizio, come potete vedere in figura 1, si tratta pro- prio di un programmino elementare. In pratica, una volta aperta la libreria di lntuition, si apre uno schermo di dimensioni 1OOx 100 in alta risoluzione ed una finestrella 60x60. A questo pun- to ci si mette in attesa sulla porta utilizzata da lntuition per fornire infor- mazioni e ricevere istruzioni relativa- mente a quella specifica finestra. Dato che l'unico messaggio che abbiamo ri- chiesto a lntuition è quello relativo alla selezione del gadget di chiusura della finestra, potremo tranquillamente muo- vere la finestra per lo schermo senza per questo uscire dal programma. È importante capire a questo punto che, se avessimo informato Intuition che de- sideravamo anche essere avvisati di al- tre operazioni effettuate dall'utente, avremmo dovuto intercettare il conte- nuto del messaggio inviato (vedi quinta puntata - MCmicrocomputer n. 78). replicare al messaggio, effettuare even- tuali operazioni previste a fronte del messaggio ricevuto e rimetterci in atte- sa di quello successivo a meno che non si fosse trattato della selezione del gad- get di chiusura. In quest'ultimo caso, saremmo usciti dal programma dopo. aver fatto le stesse operazioni di chiusu- ra riportate anche nel nostro program- mino. In realtà il codice proposto non è molto educato, dato che, ricevuto il messaggio, se ne esce tranquillamente senza neanche un grazie ad lntuition. Chi ha letto con attenzione la quinta puntata, si ricorderà certamente che bisogna sempre replicare ad un mes- saggio ricevuto, per evitare di lasciare appese aree di memoria od addirittura interi task. Per fortuna Intuition è abba- stanza intelligente da cavarsela anche da solo, in questo caso! Può anche succedere che tutto sembri funzionare lo stesso (non è sempre facile accorger- si di aver perso qualche byte!). ma, dato che non sempre sappiamo come si comporta internamente lntuition, non è detto che in una versione successiva le cose vadano altrettanto bene. Morale della favola: scrivete sempre program- mi educati, anche se questo vi costa qualche riga in più. Per quello che riguarda il funziona- mento del programma, avrete notato come, pur avendo definito uno schermo molto piccolo, questi sembra ricoprire l'intero schermo fisico. Se tuttavia spo- state la finestra, vi accorgerete di non poter andare più in là di un rettangolo ben definito, guarda caso 1OOx 100 pixel. Questo è il motivo perché, a meno di ragioni contingenti, si definiscono sem- pre schermi che assumino orizzontal- mente la massima estensione. Analoga- mente, se la loro altezza è inferiore a quella disponibile verticalmente, il loro angolo superiore sinistro va posizionato in modo che il bordo inferiore dello schermo non sia al di sopra di quello del monitor. Questa, che è una limitazione imposta da lntuition 1.1, rimane comun- que una regola pratica in lntuition 1.2. MCmicrocomputer n. 81 - gennaio 1989

Transcript of Programmare in C su Amiga - digitanto.it fileAMIGA Programmare in C su Amiga di Dario de Judicibus...

AMIGA

Programmare in C su Amigadi Dario de Judicibus

ottava puntata

Continuiamo con questapuntata il nostro viaggio neisegreti di Intuition, in mododa preparare, un passo allavolta, una solida base su cuicostruire programmi in gradodi sfruttare appieno uno deipiù interessanti componentidel sistema operativodell'A miga

Errata corrige

Nella 6' puntata c'è una inesattezza.L'ultimo paragrafo prima della conclusio-ne avvertiva che il programmino d'esem-pio non doveva essere lanciato da CLI inquanto non verificava l'esistenza delloschermo del WorkBench. In realtà questonon è esatto, in quanto una finestra CLI"poggia» comunque su uno schermoWorkBench, anche se non è stata lancia-ta l'applicazione associata che gestiscemenu ed icone attraverso il comandoLoadWB. Inoltre, essendo il Workbenchuno schermo standard, come spiegatonel presente articolo, esso viene automa-ticamente aperto da Intuition se vi si apreuna finestra. Ci scusiamo con i lettoridell'imprecisione.

186

L'esercizio della scorsa puntata avevaprincipalmente due obiettivi: il primoera quello di familiarizzare il lettore conlntuition, essendo il primo esercizio diprogrammazione in C proposto ai lettorida quando abbiamo iniziato ad affronta-re lntuition; il secondo, quello di dimo-strare alcuni dei limiti imposti da intui-tion per quello che riguarda le dimensio-ni degli schermi.

Se siete riusciti a scrivere il program-ma in questione (vedi figura 1). vi saretecertamente resi conto che, pur essendodi dimensioni relativamente ridotte, e diconseguenza offrendo funzionalità ab-bastanza scarse, una volta lanciato lo, èpossibile spostare la finestra qua e làper tutto il tempo che si vuole, fino ache non si chiude il tutto selezionando ilgadget di chiusura della finestra. Que-sta è di fatto la vera potenza di lntui-tion: pur non limitandovi nelle vostrescelte e nel grado di controllo che desi-derate avere dell'ambiente creato(schermi, finestre, gadget. menu ...). In-tuition è in grado di gestire in modoautomatico tutto ciò di cui non voleteinteressarvi personalmente, secondodeterminati schemi in buona parte an-ch'essi definibili dal programmatore. Èinsomma un perfetto maggiordomo,che vi lascia fare tutto (o quasi) quelloche volete, ma è pronto a sostituirvi nelfare gli onori di casa non appena glirestituite il controllo.

Tornando al nostro esercizio, comepotete vedere in figura 1, si tratta pro-prio di un programmino elementare.

In pratica, una volta aperta la libreriadi lntuition, si apre uno schermo didimensioni 1OOx 100 in alta risoluzioneed una finestrella 60x60. A questo pun-to ci si mette in attesa sulla portautilizzata da lntuition per fornire infor-mazioni e ricevere istruzioni relativa-mente a quella specifica finestra. Datoche l'unico messaggio che abbiamo ri-chiesto a lntuition è quello relativo allaselezione del gadget di chiusura dellafinestra, potremo tranquillamente muo-vere la finestra per lo schermo senzaper questo uscire dal programma. Èimportante capire a questo punto che,se avessimo informato Intuition che de-sideravamo anche essere avvisati di al-tre operazioni effettuate dall'utente,

avremmo dovuto intercettare il conte-nuto del messaggio inviato (vedi quintapuntata - MCmicrocomputer n. 78).replicare al messaggio, effettuare even-tuali operazioni previste a fronte delmessaggio ricevuto e rimetterci in atte-sa di quello successivo a meno che nonsi fosse trattato della selezione del gad-get di chiusura. In quest'ultimo caso,saremmo usciti dal programma dopo.aver fatto le stesse operazioni di chiusu-ra riportate anche nel nostro program-mino.

In realtà il codice proposto non èmolto educato, dato che, ricevuto ilmessaggio, se ne esce tranquillamentesenza neanche un grazie ad lntuition.Chi ha letto con attenzione la quintapuntata, si ricorderà certamente chebisogna sempre replicare ad un mes-saggio ricevuto, per evitare di lasciareappese aree di memoria od addiritturainteri task. Per fortuna Intuition è abba-stanza intelligente da cavarsela ancheda solo, in questo caso! Può anchesuccedere che tutto sembri funzionarelo stesso (non è sempre facile accorger-si di aver perso qualche byte!). ma, datoche non sempre sappiamo come sicomporta internamente lntuition, non èdetto che in una versione successiva lecose vadano altrettanto bene. Moraledella favola: scrivete sempre program-mi educati, anche se questo vi costaqualche riga in più.

Per quello che riguarda il funziona-mento del programma, avrete notatocome, pur avendo definito uno schermomolto piccolo, questi sembra ricoprirel'intero schermo fisico. Se tuttavia spo-state la finestra, vi accorgerete di nonpoter andare più in là di un rettangoloben definito, guarda caso 1OOx 100pixel.

Questo è il motivo perché, a meno diragioni contingenti, si definiscono sem-pre schermi che assumino orizzontal-mente la massima estensione. Analoga-mente, se la loro altezza è inferiore aquella disponibile verticalmente, il loroangolo superiore sinistro va posizionatoin modo che il bordo inferiore delloschermo non sia al di sopra di quello delmonitor. Questa, che è una limitazioneimposta da lntuition 1.1, rimane comun-que una regola pratica in lntuition 1.2.

MCmicrocomputer n. 81 - gennaio 1989

AMIGA

l' ------------------------------ --- -.-.-.---------.----- '1/" - Esercizio 117 .- DUlo de Judiclbus -- 1S Ottobre 1988 -. Esercizio M7 - "/l' --------- .. -------------------------------------------------------·------·1

'include "exec/types.h"liinclude ";ntultion/intultion.h"'include "proto/inlultion.h"

slrucl InluitlonBase *InluitionBase;slrucl llewScreen ns " '* struttura di definizlone dello scheno l00J.100 .•Zp. ",

O, O,100 ,100 ,I, O,l, HI RES, CUSTOHSCREEH, HUll, "Prov." ,HUll, NUll);

slrucl IlewWindow n'W '" '" struttura di definizione della t;nestra 60.60. */

slrucl Sereen ·s;strucl Wlndow ·w;

Mdefine IrlTUB "'nluition.library"Ideflne ItlTV[R 33l

main()(

'* --- allrl l" finestrd 60.160 con l'angolo sup_ sin_ a (20,20) ----------- *'1f «w'" (struct \·hndow *)OpenWindow(&nw» "'''' IlULL) exit(rAlS();

sono chiuse. Tale schermo va conside-rato quindi come uno schermo base,che viene automaticamente apertoquando tutti gli altri schermi sono chiu-si, se non lo è già. Esso infatti devefornire un piano di lavoro per l'utentedel sistema.

3. Uno schermo standard non è maiaperto esplicitamente. Basta semplice-mente indicarlo nell'apposito campodella finestra da aprire (NewWindow.Type) e, quando viene chiamata la fun-zione OpenWindowO, Intuition verificase lo schermo già esiste e, in casocontrario, lo apre. Viceversa uno scher-mo utente va aperto e'splicitamente uti-lizzando la funzione OpenScreenO.

4. In linea di massima, mentre èsempre possibile modificare anche inmodo dinamico le caratteristiche di unoschermo utente (colori, risoluzione, evia dicendo). non si dovrebbero maicambiare quelle di uno schermo sta n-dard, dato che è condivisi bile da piùapplicazioni.

Per il momento l'unico schermo stan-dard disponibile è quello del Work-Bench, a cui, come abbiamo già visto, èassociato il tipo WBENCHSCREEN. Sitratta, come detto sopra, di uno scher-mo standard privilegiato, che si discostaun po' dalle regole enunciate. In teoria,tuttavia, è possibile che in futuro altrischermi standard facciano la loro com-parsa.

Un'altra caratteristica che distingue loschermo di WorkBench dagli altri scher-mi standard è quella di poter esserechiuso e poi riaperto da un programma.Tale tecnica è spesso usata da pro-grammi grafici che, necessitando dimolta memoria, chiudono il WorkBenchper mezzo della funzione CloseWorkBenchO, in modo da poter riutilizzare lamemoria rilasciata dal sistema, salvopoi, prima di terminare, riaprirlo con lafunzione OpenWorkBenchO. Intuitionsi assume l'onere di «ricordare» even-tuali finestre aperte e di far ritrovareall'utente lo schermo di WorkBench co-sì come lo aveva lasciato. Dato inoltreche il WorkBench è qualcosa di più diun normale schermo standard, comeavrete già capito, ma è una vera epropria applicazione, con icone, menu, ecosì via, esso ha altri privilegi, come

Schermi standard ed utenteEsistono fondamentalmente due tipi

di schermi:1. quelli standard [standard screensl, e2. quelli utente [custom screensl.

Gli schermi standard hanno quattrocaratteristiche che li differenziano daquelli utente.

1. Uno schermo standard è condivisi-bile da più applicazioni che, nei limitipratici imposti dal sistema (memoria).possono aprirvi quante finestre voglio-no. Intuition gestisce direttamente talischermi che occupano sempre le di-mensioni massime disponibili sulloschermo fisico.

2. Se tutte le finestre di uno scher-mo standard vengono chiuse, allora an-che lo schermo viene automaticamentechiuso. L'unico schermo standard chesi comporta diversamente, a riguardo, èproprio quello del WorkBench, il qualerimane aperto anche se tutte le finestre

per quello che riguarda la gestione dischermi e finestre;- alcune utili funzioni di Intuition.

Una eccezione (solo 1.2) potrebbeessere quella in cui si hanno tre o piùschermi che dividano a fasce la dimen-sione verticale.

Figura l . Soluzione all'esercizio della 6' puntata.

'* -.. chiudi tutto ed esci ------- .. _-_ .. _.---.-------------._ .. _.. -- .... *'Cl O'ieWl ndo\~(w) ;

Cl oseSCI'cen (s) ;exit(IRU[);

'* --- apri la I1brcria di tnlultion ------------------------------------- */IntuitlonBase:: (struct IntUltionBase ")OpenLlbra'"y(1rnUB,IIlTV(R);1f (IntuitionBase "'''' lJUll) exit(fAlS[);

'* --- dspetta un QUdlunQue segndle attraverso IOCHP - .. ----- ..... -------- *'W,1it (1 «1-/- >UserPort .>mp _SI gB 1t ) ;

10,10,60,60, O, l,ClOSEHIIlOOH,HIUOOHClOSE I SflART_ RHRESHI ACTIVAH IHIHOOHORAGI IIOCARERHRESH,flUll, flUll, "r i ne, t r." ,tlUll, HUll, O, O, O, O, CUSTOIISCREEN

);

'* .-. dpri 10 schermo 1001100 (2 1l1anl) ------------------------ .. ------- *'Jf ((s '" (struct Screen *)OllcnScreen(&ns» "'= rlUll) e.tlt(rAlS();nW.SCI'een '" s;

IntroduzioneNelle due puntate precedenti abbia-

mo parlato di schermi e finestre. Abbia-mo visto le strutture che ci permettonodi definire uno schermo od una finestra,spiegando in dettaglio alcuni campi orimandando in seguito la spiegazione diquelli più complessi. Abbiamo altresìvisto come aprire e chiudere sia scher-mi che finestre, anche se, per il mo-mento, non sappiamo ancora come ge-stire l'interfaccia con l'utente (IDCMP).le operazioni di scrittura e lettura, equelle di tipo grafico. Abbiamo inoltreaccennato come Intuition 1.2 metta adisposizione alcuni campi per una ge-stione più coerente delle dimensioni dischermi e finestre nei due standardPAL ed NTSC. In questa puntata analiz-zeremo:

schermi standard ed utente;- le differenze tra Intuition 1.1 ed 1.2

MCmicrocomputer n. 81 - gennaio 1989 187

AMIGA

#include "exec/types.h"Il'lnclude "yraphics/yfx.h"Ninclude "gr"phics/gfxbase.n"$ll ne 1 ude "grapn Ics/gfxc;dcros. h"

struct GfxBasestrur! GfxBase *Gfx8dse:

oh] i t ter;"lOfl i 51;'SHfl 1St;

bltnode 'blthd,'blttl;bltnode "bsblthd,"bsblttl;Intcrrupt vbsrv,timsrv,bltsrv:1151 Textronls;

Textfonl "Defaultront;"odes;VBlank;Debug;BeamSync;

system_bplconO;

SprlleRes.erved:bylereserved;flags;Bl itlock:81 i tr/est;list 81HWaitQ;Idsk "Bllt!hlOer;

lls! TOf_WdllQ;

linee '" GfxBase->UormalOisplayRows; 1* ~Iumero l:IdSSllhO di linf'e *1colonne'" GfxBase->PlormaIOlspldyColulhns; l° Humero masSimo di colonne '1

CloseL lhrary(GfxBdSe);

Figura 3 . Esempio di utilizzo di alcuni campi di GfxBase.

'I'I

j* AllIiYd con standdrd PAlj* Agigcl con standdrd flTSC

1* Alldya con at taccato un GenLock *1/. flltll]d senld GenLock ./

if «GfxBase : (struc! Gf .•.Base *)OpenLlbrclry(GrxUB,GfXVrR» ;o'" IlUIL)eXl' (rAlSE);

i f (GfxBdse.>Displayrlags & PAL)el se

H (GfxBase->Olsplayf1ays & GEHLOC)cl se

main()(

#define GfXLIB "yraphics.llbrdry".ueflne CrXV(R 33l

lihflode;"Act l'''lewi

"COpIOl! ;

l ibraryVie .••.

coplni t

structstrurtst,"udloogloogUWOROUWORO

slructstruc!struc!slructstructUWOROBYT[RYT[

SHORTSHORTUBYTEUBYTEUSHORTSHORTshortstructstruc!sl,"uC!

l' . . 'I Prototipo: vOld ShowTitle(struct Screen *,long)

/' , .. '/

l' ;; 'IuwORO OIs,playFldg's;.,

Protot ipo: vOld IIoveScreen(struct Screen • ,long. long)

U1 i 11llO: ShowT il 1e(schenno, 1Il0S,tl'a);

puntdlore dd uno schermose tRU[ Il titolo va sopra le finestre di fondose fAlSE Il titolo '1cl sotto d tutte le flnestre

schermomost ra

lnfOI-m<lll0nl lnterne ./lnformdllonl Interne '1

st'"llCt SIl:"pleSp,-ite "Sll'"pleSpntes;Ih:ORO IldxOI~pldyRow; /. 11011US.\REUHORO IkuOlsplayColu~n; l' flOlI USARE

- 1 - Questo e un CMlpO che Cl Interessd

l' 'I- 2 - Questi sono altri due campi che Cl interess,ana

Ut i l i ZIO: 'IoveScreen (scherlllò, Oel tdX, Del taY);

\, ....................................................................• IUWORO Ilorlha 1Oi sp 1dyRow\;UWORO IlormalOlspldyColulllns;

/' '/

schernoOeltdXDel tdY

puntdtore ad uno schrrmoignordtonumero d i l i nl'e di cu i ablJdssare od alldre lo schermo

Protot lpa: vOld ScreenToBad:.(struct Scrf'en *)

l° Punt.ltore allo s,prlte del 1I0use °1I- Puntatore allo sprlte del mouse *1

Prototipo: vo\cl ScreenToFront(struct Screen 0)

puntatore ad uno scherlllo

Utilizzo: fatto'" I-IBcnchloBdck();

puntalore ad uno schermoscherno

UtililZO: SCT"ccnTolront(schermo);

f..,tto TRU( se lo Hhen:-,o del Wod.Bench era dpertofAlS[ \e 10 schcl'l"o del l-Iod,Bench crd (hlUSO

Protot lpO: long ""'Bl'nchToBdck(vo\d)

Ut 11 i zzo: Screen ToBack (schermo) ;Norma I OPHX;1l0rnclloPlff;SlUndlSemdphore "LdstChancerlel"1Ory;"LCllptr;HicrosPerllne;I~Inol spl dYCOI u.n;re\erved[2] ;hedlcy[4) ;hedleyZ(4] ;hcdley_count;heclley_flag\;hedl ey _ CQunt 1;hrdley_tmp;hedleyJ(J) ;hedley sprltes{4}hedl ey -\Prl t l'si [4]

UWORDUWORDstructUWOROUWORDUWOROUlOfIGUlOIiGUlOIiGSHORIUSHORISHORTSHORTUlOllGUlOllGULOIJG

);

/' -- 'I Prototlpo: lony HflenchToF,'ont(struct Screl'n ')- 3 - Qu('ste sono tre costantl che (I lntereS~dno

fat to '" \.'BcnchToFront (schermo);l' ."defll1C /lISeudcflnr ClrHOC"def 1 ne PAl

. 'I Ut llllZO:

fatto lRur se lo Hhel"nQ del Wod,llench erd ,lpertofALSr s.e 10 scherno del Wod,Ocnch erd ChlUSO

l' ............................... '/

Figura 2 . Struttura GfxBase. Figura 4 . Funzioni che operano sugli schermi.

quello di poter essere personalizzatodall'utente tramite il comando Prefe-rences.

Per quello che riguarda gli schermiutente, invece, è opportuno spenderedue parole su come vengono gestite learee grafiche in memoria.

Innanzitutto, come già accennato nel-la scorsa puntata, gli schermi sono ba-sati su una struttura chiamata View-

Porto Una o più ViewPort formano unaView, che quindi descrive in modoesaustivo la schermata che compare sulvostro monitor. Non entreremo nei det-tagli tecnici dato che nella maggior par-te dei casi i puntatori a queste ed altrestrutture saranno utilizzati solo comeidentificatori delle aree grafiche su cui sivuole operare, senza peraltro saperecosa realmente contengono (come ab-

biamo fatto con i File Handle dell'Ami-gaDOS). Ad ogni ViewPort è associataun'area grafica detta raster, rappresen·tata da una struttura chiamata BitMap.Tale area può raggiungere al massimole dimensioni di 1024xl 024 pixel. Men-tre la struttura BitMap descrive l'areagrafica su cui si vuole operare, la strut-tura RastPort contiene informazioni re·lative al modo con cui le routine grafi-

188 MCmicrocomputer n. 81 . gennaio 1989

AMIGA

Ut 111110: ltoveWlndow(finestra,DelldX,Oel taY);

UIlllllo: SIICWlndol1(flllcstrd,Oe1t<lX,OcltdY):

UtllillO: h'lndo.i1oBdck(flnestr,l);

la massima estensione verticale. Per farciò dovete prima aprire la libreria graficae poi utilizzare alcune informazioni con-tenute nella struttura GfxBase (vedi fi-gura 2).

Queste sono:NormalDisplayRowsche contiene il numero massimo di li-nee utilizzabili in modo non interlacciato(200 o 256);

occuparsi degli aspetti relativi alla me-morizzazione delle aree grafiche.

Se aprite lo schermo normale, baste-rà specificare l'altezza dello schermocome segue:

NewScreen.Height = STDSCREENHEIGHT;

come già accennato nella scorsa punta-ta. Lo schermo si adatterà automatica-mente allo standard usato dal vostroAmiga. Se viceversa fornite una vostraBitMap (selezionando quindi CUSTOMBITMAP), allora dovrete sapere a priori

punteltore ad unti finestraspostancnto Orlzzontdle In pixelspost,}rlento vert le"le In pnel

puntellor'e dd und finestraIncr'emC'nto or lZlonl,lle In pnellnCt'cmcnlo v{'r-t I (.Il e in p ),;c1

TRUE se tutto e andato Lene, altrlmentl fMSEpuntatore ad und finestranuoII'" larghelld rlinllld (zero se (ome 4uella iniZiale)nuova dltelld 1lI1nllDd (zero se CO'H! 4ue11.'1 lnlliale)

nuova ldryhclld IlldSSUl4 (zero se (Oale quelld iniziale)nuova altezzd massill4 (zero se (ome quella lnl11.:l1e)

f inC'strdDel t"XOellaY

flnestraDel t"XDel taY

(al lo

flnestl-a

l1inlarg/hnAl t

HdxLdrgHdXA Il

un altro discorso ... Sta di fatto che sevolete scrivere programmi che utilizzinol'intero schermo fisico in entrambi isistemi (PAL ed NTSC). ora ne avete lapossibilità.

Vediamo dunque come sia possibiledimensionare l'altezza degli schermi inbase allo standard usato, sia nel casoche utilizziate una propria BitMap, sia inquello che lasciate che sia Intuition ad

Utll1110: \'/indoIlToF,-ont(ftneslrJ);

Figura 5 - Funzioni che operano sulle finestre.

Prolotlpo: vOld \./lndoliToFront (stl"u(l \./lnduI,c ,);

P.·OtOllPO: vOld h'lndoIiToBdcl(str"uCl ì.'lntJw ');

Protolipo: vOld ~'ove\.hndow(struct Wlndow ., long, long);

finestra puntatore .ld una finestraTltfinestra puntdtore <'Jduna stringa, O (n('ssun titolo) o -1

(nessuna modI f 1ea)TitSehenno puntatore ad una stringa, O (nessun titolo) o -1

(nessuna !loddlca)

Ut Il i llO: Set\.li ndowT l t 1es (f i nestra, Ti tr l nest ra, Tl tSehC'rmo);

Prototipo: ,",oid SetWindowTitles(struct Window ·,char ·,ehar .);

puntatore <lfi und flnestr"d

linee inferiore a quello PAL usato inEuropa ed Australia, ci tocca spessoconvivere con quella benedetta fascianera, in fondo allo schermo? Se nelleprime versioni del sistema operativoquesta era una caratteristica a cui, vo-lenti o noienti, bisognava adattarsi, In-tuition 1.2 (e seguenti) mette a disposi-zione del programmatore il modo discrivere programmi capaci loro di adat-tarsi all'utente americano od europeo, enon viceversa I Che poi molte softwarehouse continuino ad ignorare tutto ciò è

Ulllizzo: fatto = Windo .•..llmils(flnestra,Hinlarg.HinAlt.H.,uLarg,Hd .•.Alt);

Prototipo: long = WindowLimits(slruct Window ·,long,loog,long,lony);

P.·OlOtlpO: vOld Slle\.llndol/(struet \.lIndo"" ',long,long);

lntuition 1.2Chi di voi non ha maledetto almeno

una volta il fatto che, essendo la mag-gior parte dei programmi che girano suAmiga basati sullo standard americanoNTSC, ed avendo questi un numero di

che dovranno operare su tale area. Ve-dremo infatti che, ogni qual volta chia-meremo una routine grafica per dise-gnare una figura, cambiare il colore del-la penna, scrivere del testo, e così via,dovremo anche specificare il puntatorealla struttura RastPort associata all'areasu cui stiamo lavorando.

Sia gli schermi che le finestre hannoquindi associata una struttura RastPort.Questo vuoi dire che possiamo scrivereo disegnare sia in una finestra, sia diret-tamente in uno schermo. Quest'ultimapossibilità richiede tuttavia una buonaconoscenza sia di Intuition che dellestrutture grafiche menzionate. Mentreinfatti Intuition è in grado, se richiesto,di gestire tutti i possibili problemi chepossono sorgere dal sovrapporsi di piùfinestre, dal fatto che una finestra puòessere spostata o se ne possono cam-biare le dimensioni, e dalla sovrapposi-zione di menu e finestre, le aree grafi-che relative allo schermo stesso devo-no sempre essere gestite dall'utente.Di fatto si preferisce utilizzare un parti-colare tipo di finestra, che vedremo inseguito, chiamata BackDrop, qualora sidesideri avere un'area grafica a tuttoschermo.

A questo punto è chiaro cosa ,è unoschermo «CustomBitMap». E unoschermo la cui area di lavoro è fornitadall'utente, e può quindi contenere del-le figure predefinite. Ad esempio, utiliz-zando questa tecnica, è possibile avereuno schermo il cui sfondo contiene unatassellatura [pattern] od addirittura dellevere e proprie immagini (anche unavostra fotografia, per i più megalo-mani!).

Una tecnica molto utilizzata è quelladel doppio buffer che permette, grazie adue BitMap che si possono alternaresul monitor, di effettuare operazioni gra-fiche sull'area nascosta per poi fareapparire il risultato finale sullo schermo.In questo modo il disegno non viene«costruito» di fronte all'utente, ma ap-pare all'improvviso già completato. Sitratta indubbiamente di una tecnicaavanzata che richiede una certa abilitànella programmazione in C, ed una buo-na conoscenza delle strutture grafichebase.

Dopo questa breve puntata in profon-dità, torniamo ad Intuition per evidenzia--re alcune possibilità fornite dalla versio-ne 1.2.

MCmicrocomputer n. 81 - gennaio 1989 189

,. Ricordo che il prototipo di una funzione descrive la funzione stessa relativamente altipo di parametri passati e a quello di un eventuale valore di ritorno. Se quest'ultimo non èprevisto. la funzione è definita di tipo void.

In genere i prototipi sono posizionati all'inizio del codice sorgente. od in un eventualefile di inclusione posto nella directory prato2. In seguito useremo la seguente terminologia italiana per definire le operazioni che unutente può effettuare su di una finestra o su uno schermo:

spostamento - operazione effettuata per mezzo della barra di spostamento [drag bar] eche consente di spostare una finestra in uno schermo. o di muovere verticalmente lostesso schermo (scorrimento);

ridimensionamento - operazione effettuata per mezzo del gadget di ridimensiona-mento [sizing gadget] e che permette di variare le dimensioni di una finestra;

retro-fronte - operazione effettuata per mezzo del gadget di retro-fronte [front gadget]e che permette di spostare una finestra normale (od uno schermo) di fronte a tutte lealtre;

fronte-retro - operazione effettuata per mezzo di fronte-retro [back gadget] e chepermette di spostare una finestra normale (od uno schermo) dietro a tutte le altre;

chiusura - operazione effettuata per mezzo del gadget di chiusura [close gadget] e chepermette di chiudere una finestra.

Le due operazioni di fronte-retro e retro-fronte saranno anche dette «operazioni diprofondità».3. Ricordo che uno schermo può avere due titoli: uno è quello associato allo schermostesso [default titlel. l'altro dipende da quale finestra è attiva [current title]. Ouando unoschermo viene aperto. i due titoli coincidono. Ouando una finestra è attivata. tuttavia.lntuition controlla se per caso il programmatore ha associato a quella finestra un titolocorrente per lo schermo a cui essa appartiene (per mezzo della funzioneSetWindowTitlesO appunto). Se così è. il titolo di default viene sostituito da quellocorrente fintanto che quella finestra resta attiva. La prossima volta che lanciate unaapplicazione che apre finestre sullo schermo del WorkBench. osservate con attenzione labarra che di solito contiene il numero della versione del WorkBench e la memoriadisponibile. Prima o poi vi capiterà di osservare il titolo cambiare all'attivazione di una dellefinestre menzionate (è il caso di FACC. ad esempio).

AMIGA

NormalDisplayColumnsche contiene il numero massimo di co-lonne utilizzabili in bassa risoluzione(320);DisplayFlagsche contiene varie informazioni tra cuilo standard usato. Due costanti predefi-nite in graphics/gfxbase.h possono es-sere utilizzate per determinare quale:PAL ed NTSC.

Uno scheletro è riportato in figura 3.Dimensionare correttamente lo

schermo. tuttavia. non è sufficiente alfine di ottenere una completa portabilitàdei nostri programmi tra Amiga di nazio-ni diverse. Senza per ora entrare inconsiderazioni come quelle relative allevarie tastiere nazionali. ma limitandoci aiproblemi con Intuition. dobbiamo di-mensionare correttamente anche fine-stre. gadget. menu.

Per .quello che riguarda le finestre. cene sono di due tipi:1. quelle a dimensione fissa. e2. quelle a dimensione variabile.

Il primo tipo è relativamente sempliceda trattare. Se la dimensione verticaledella finestra deve essere quella massi-ma dello schermo. od un certo deltarispetto a quest'ultima. basterà usare ilvalore in NormalDisplayRows. Se vice-versa deve essere un valore fisso indi-pendentemente dalle dimensioni massi-

Note

me dello schermo. basterà utilizzare unvalore inferiore a 200. In quest'ultimocaso. infatti. non si può pretendere diriuscire comunque a visualizzare unafinestra alta. diciamo. 245 pixel su unoschermo NTSC.

Nel secondo caso. oltre alle dimensio-ni iniziali della finestra (Height). bisogne-rà tener conto anche di quelle massime(MaxHeight). dato che l' utente può mo-dificare le dimensioni della finestra permezzo del gadget di ridimensionamento[sizing gadget]. Se l'altezza della finestraè già quella massima. basterà porre azero MaxHeight. altrimenti bisogneràimpostarlo allo stesso valore assunto daNormalDisplayRows.

Nel caso che la finestra sia stataaperta nello schermo del WorkBench. sipossono utilizzare anche le informazionifornite da una nuova funzione [1.2]. cioèGetScreenDataO.

Vedremo in seguito come comportarcianche per altri oggetti come ad esempioi gadget.

Altre differenze rispetto Intuition 1.1per quello che riguarda schermi e fine-stre sono le seguenti:• Due nuove costanti da usare in New-Screen.Flags:SCREENBEHINDavverte Intuition che questo schermo vaaperto dietro a tutti gli altri; sarà cura delprogramma decidere quando portarlo difronte. Questa tecnica è particolarmenteutile quando il programma deve prepara-re alcune immagini sullo schermo. dopo

che questo è già stato aperto. per poivisualizzarlo quando presentabile.SCREENQUIETavverte Intuition che non deve assoluta-mente disegnare la barra del titolo e igadget di sistema quando lo schermo èaperto. Questo serve ad evitare cheIntuition copra con questi elementi lazona superiore dello schermo. interfe-rendo così con eventuali operazioni gra-fiche del programma. I gadget di scorri-mento e di fronte-retro in ogni caso. purinvisibili. continuano a funzionare rego-larmente. Questo segnalatore non disa-bilita viceversa la presentazione dei me-nu a discesa. che devono comunqueessere intercettati dal programma (ve-dremo come quando parleremo di me-nu) per evitare che interferiscano con lesue operazioni grafiche. Questo generedi problemi. che analizzeremo in detta-glio in seguito, non riguardano soltantola possibile cancellazione di aree, giàdisegnate 'dal programma. ma anchepossibili interferenze con operazioni gra-fiche in corso.

Di fatto i rischi sono due: il primo èquello di coprire. e quindi cancellare.immagini disegnate dal programma di-rettamente sullo schermo; il secondo èquello di disegnare sopra gli elementigestiti da Intuition. cioè i menu, la barradel titolo ed i gadget di sistema.

Nel caso delle finestre, invece, il pro-blema può essere risolto scegliendo unaopportuna tecnica di restauro [refresh]del raster della finestra.• Una nuova funzione per attivare unafinestra. particolarmente utile per quelleapplicazioni che aprono più di una fine-stra per operazioni di ingresso ed uscita[I/O].

Il prototipo (vedi nota 1) è il seguente:

void ActivateWindow( struct Window * );

Questa funzione è utilizzata, ad esem-pio. dal WorkBench quando richiamatel'operazione Rename da menu. Quellalunga stringa alta un carattere e largaquanto lo schermo. altro non è che unafinestra contenente un gadget di stringa.ed attivata automaticamente dalla fun-zione in questione.• Una nuova funzione per restaurare ibordi di una finestra nel caso che ilvostro programma vi abbia disegnatosopra.

Il prototipo è:

void RefreshWindowFrame (struct Window*);

Altre novità della versione 1.2 sarannoanalizzate in seguito. essendo legate adargomenti non ancora trattati.

Spesso useremo la notazione "[1.2J"per indicare funzionalità tipiche di questaversione.

Analogamente. conto al più presto diintrodurre la stessa notazione anche perquello che riguarda la più recente versio-ne 1.3.

190 MCmicrocomputer n. 81 - gennaio 1989

AMIGA

l' 'Scheletro per l'utilizzo delle funzioni di InlUltion descritte nel testo •.>>> rlotdre che non e st",to riportdlo tutto il codice dell 'esempio! <<< •......................................................................... 'I

l'Apri una f l nes t l'il spec i f icando che Sl 'o'og I iona ricevere SOLO e ..••.enllcornspondcnti aJld pressione su di uno qualunque dei tasti del mousc.

'IflewW; ndow. Fl 09 s o RHBTRA p ISIIAR T_ REFRESH IACI I VA TE IIIOCARERHR ESH;l1ewWi ndow.1 OCIIPFI dlJS = l-lOUS[BUTTOf'JS;H «w = (struct Window ")OpcnWindow{&nw» == fJULL) cxlt(FALS[);

Un'ultima cosa su CloseScreenO: sechiudete uno schermo senza aver primachiuso tutte le sue finestre, e poi andatea chiuderne una, il sistema cade [crash].Attenti quindi a rispettare il giusto ordinedi chiusura.

l'

\.ola i t (1«1~. >Uscl'Por-t ->mp _ Si fJBi t);funz i one(pdrilmet rl);

l'•. Ripeti il blocco di soprd qUdnte \lolte \luoi, con funlloni differenti., I

Wai t (1«\I·>UserPol-t ->mp _ SiUBi t):futlzione(pdl-amctrl) ;

Hettitl in dttCSd sulla porta IDCHP, in modo da svegliarti ogni voltache l'utente preme un tasto del mouse. Appena svegl iato esegui unaqU<llunque delle funzioni descritte (con un minimo di criterio, tuttavia!)

'j

Wcli t (l «w->Us erPort - >Il\P_Si yBil) ;F un l ione(pdramet r i) ;

ConclusioneBene, anche per questa volta è tutto.

Avete abbastanza materiale per sbizzar-rirvi. Vi suggerisco di provare a creare,aprire e chiudere schermi e finestre divari colori, dimensioni e risoluzione, inmodo da acquisire una certa dimesti-chezza con i parametri descritti in questae nelle due puntate precedenti. Provateanche alcune delle funzioni descrittepoco fa usando la stessa tecnica usatanel programmino di esempio in figura 1eseguendo lo scheletro riportato in figu-ra 6.

La prossima volta entreremo più neldettaglio nella gestione delle finestre.Alla prossima puntata allora, e buondivertimento! Me

Funzioni per le finestreÈ possibile operare su una finestra e

su alcune sue caratteristiche per mezzodelle seguenti funzioni di Intuition i cuiprototipi sono riportati in figura 5:WindowLimitsOQuesta funzione permette di modificaresia i limiti massimi che quelli minimi diuna finestra. Qualora per uno o più limitisi intenda lasciare il valore originale,basterà porre a zero il campo relativo.SetWindowTitlesOQuesta funzione cambia il titolo di unafinestra, il titolo che ha lo schermoquando questa finestra è attiva (vedinota 3), oppure entrambi.MoveWindowOQuesta funzione muove una finestradell'ammontare specificato, sia vertical-mente che orizzontalmente.SizeWindowOQuesta funzione modifica le dimensionidi una finestra.WindowToBackOSposta una finestra dietro a tutte le altrenello stesso schermo (fronte-retro).WindowToFrontOSposta una finestra davanti a tutte lealtre nello stesso schermo (retro-fronte).

Esistono altre funzioni che operanosulle finestre o su oggetti collegati adesse (menu, gadget, requester). Alcunele vedremo quando tratteremo esplicita-mente tali oggetti, altre richiedono unaprofonda COnoscenza degli elementi gra-fici che stanno alla base di Intuition. Valeper quest'ultime lo stesso discorso giàfatto per le funzioni che operano suglischermi.

MoveScreenOQuesta funzione serve a spostare verti-calmente uno schermo di un certo nu-mero di linee specificate. Il secondoparametro (vedi figura 4) non è usato,non potendosi spostare gli schermi oriz-zontalmente.Screen ToBackOSposta uno schermo dietro a tutti gli altri(fronte-retro).ScreenToFrontOSposta uno schermo di fronte a tutti glialtri (retro-fronte).WBench ToBackOSposta lo schermo del WorkBench die-tro a tutti gli altri (fronte-retro). Funzionasolo se lo schermo del WorkBench èaperto, cioè non apre automaticamentetale schermo qualora sia stato chiuso.WBench ToFrontOSposta lo schermo del WorkBench difronte a tutti gli altri (retro-fronte). Fun-ziona solo se lo schermo del WorkBenchè aperto, cioè non apre automaticamen-te tale schermo qualora sia stato chiuso.

Esistono altre funzioni che richiedonouna maggiore conoscenza degli elemen-ti grafici che stanno alla base di Intuition,e vengono quindi utilizzate solo da pro-grammatori esperti. Dato che c'è ancoramolto da dire sulle funzionalità più ele-mentari sia di Intuition che dell'Amiga ingenerale, non entreremo ulteriormentenel dettaglio.

Vediamo ora alcune delle molte fun-zioni che Intuition ci mette a disposi-zione.

Figura 6 . Scheletro per gli esercizi.

l'* OK, questa e l'ultima volta, pOI chiudi. Han e necessdria qUIndi il* gadyet dl chlusurd.'j

W'ai t (l«H->UserPol-t ->mp _ Si fJBi t);Cl 0$('\.1] ndol-l(w);

Alcune utili funzioni di Intuition

Funzioni per gli schermi

È possibile operare su uno schermo esu alcune sue caratteristiche per mezzodelle seguenti funzioni di Intuition i cuiprototipi sono riportati in figura 4:ShowTitleOQuesta funzione serve a specificare sela barra del titolo di uno schermo debbaessere posizionata sopra o sotto adun'eventuale finestra di fondo [backdropwindow]. Come spiegheremo nella pros-sima puntata, una finestra di fondo ha lacaratteristica di essere agganciata alloschermo a cui appartiene, in modo taleche qualunque operazione di profondità(vedi nota 2) sulle finestre normali nonmodifichi comunque questa posizioneprivilegiata. Mentre la barra di scorri-mento di uno schermo viene sempreoccultata da una normale finestra che visi sovrapponga, una finestra di fondo siposiziona sempre dietro ad essa. Perevitare che operazioni grafiche su talefinestra cancellino anche parzialmente iltitolo dello schermo, è quindi necessariousare ShowTitleO specificando FALSEcome secondo parametro.

MCmicrocomputer n. 81 - gennaio 1989 191