                   DOCUMENTATION, CONCEPT ET UTILISATION
                     DE LA LIBRAIRIE DE FONCTIONS BIG.
                   "BIG IS GEM" version 1.80 du 03/11/93

   (Pour que les numros correspondent, imprimez avec 63 lignes / page)

1. Prsentation                                          3
  1.a Pourquoi BIG ?                                     3
  1.b Que font ces routines ?                            3
    1.b.1 Le travail sur les formulaires et les menus    3
    1.b.2 Le travail sur les fentres                    4
  1.c Les outils ncessaires                             4
  1.d Les explications                                   4
2. Visite guide : BIGdemo                               5
  2.a Le premier formulaire                              5
  2.b Un formulaire plus complet                         5
  2.c Une bote d'alerte                                 7
  2.d Un premier formulaire en fentre                   7
  2.e Un autre formulaire en fentre                     8
  2.f Un menu hirarchique                               9
  2.g La fentre de texte                                9
  2.h La fentre d'image                                10
  2.i Une fentre graphique                             10
  2.j Une fentre avec un menu droulant                10
  2.k Un pop-up libre                                   11
  2.l Gestion du timer                                  12
  2.m Icnification de fentres                         12
  2.n Fin de la visite                                  12
3. Les nouveaux types d'objets                          13
  3.a Les attributs                                     15
  3.b Dessine-moi un bouton                             16
  3.c Les menus pop-up                                  17
  3.d Les boutons slectables                           18
  3.e Les ditables tendus                             19
  3.f Dplacer le formulaire                            19
  3.g Du texte graphique                                19
  3.h Le relief                                         20
  3.i Les menus hirarchiques                           21
  3.j Les formulaires Toolbar                           21
  3.k Les raccourcis clavier                            22
4. Le travail avec les fentres                         23
  4.a Concept des fentres BIG                          23
  4.b La structure BigWind                              25
5. Les fonctions de BIG                                 29
  5.a Gnralits                                       29
    5.a.1 Les vnements                                29
    5.a.2 Le ressource inclus                           30
    5.a.3 Les variables globales                        30
    5.a.4 Les dfinitions                               32
    5.a.5 Les Cookies                                   34
  5.b Les fonctions programmeur                         34
    5.b.1 Les fonctions d'initialisation                35
      initial()                                         35
      end()                                             36
    5.b.2 Les fonctions de gestion des formulaires      36
      formm_draw()                                      36
      formm_undraw()                                    36
      formf_draw()                                      36
      formf_undraw()                                    37
      create_hierm()                                    37
      dialog()                                          37
      match()                                           38
      set_popup()                                       38
      free_popup()                                      38
      get_bkgr()                                        38
      put_bkgr()                                        39
      big_alert()                                       39
      get_string()                                      39
      parent()                                          39
      bak_rsc()                                         40
      res_rsc()                                         40
    5.b.3 Les fonctions des champs ditables            40
      set_text()                                        40
      get_text()                                        40
    5.b.4 Les fonctions diverses                        41
      path()                                            41
      exist()                                           41
      set_palette()                                     41
      timer()                                           41
      trim()                                            41
      send_mesag()                                      41
      selector()                                        42
      extension()                                       42
      first_cookie()                                    43
      next_cookie()                                     43
      vq_cookie()                                       43
      vq_cookie_c()                                     43
    5.b.5 Les fonctions de fentres                     43
      formw_draw()                                      43
      open_window()                                     44
      find_index()                                      45
      find_window()                                     46
      zone_work()                                       46
      height_sliders()                                  46
      draw_object()                                     46
      print_page()                                      46
      topped()                                          47
      closed()                                          47
      fulled()                                          47
      sized()                                           47
      moved()                                           48
6. Le source de BIGdemo                                 48
  6.a Le ressource                                      48
  6.b Le source                                         51
    6.b.1 La fonction main()                            51
    6.b.2 La gestion des formulaires                    54
    6.b.3 Les formulaires en fentre                    54
    6.b.4 La fentre texte                              55
    6.b.5 La fentre image                              56
    6.b.6 La fentre graphique                          56
7. Paramtres et pointeurs sur fonctions                57
8. Travail avec un ressource intgr                    58
9. Programmation d'accessoires                          59
10. L'icnisation des fentres                          60
11. Epilogue                                            61
  11.a Historique                                       61
  11.b Salut les copains                                62
  11.c Pour me contacter                                62








1. Prsentation
1.a Pourquoi BIG ?
Vous connaissez les programmes GNU ?  GNU signifie "Gnu is Not Unix",  avec 
rfrence rcursive.  De mme,  MINT,  le systme multitche  l'origine du 
multiTOS du Falcon signifie "Mint Is Not Tos".
Et bien,  BIG signifie "Big Is Gem" ! Ces routines sont garanties 100 % pur 
GEM,  ce qui assure une compatibilit avec toutes les machines de la  gamme 
et toutes les rsolutions (y compris le TT et le Falcon,  leurs rsolutions 
et le MultiTOS).  Elles sont le fruit de plusieurs annes de  programmation 
(et  d'utilisation) du GEM,  et grce  l'exprience  accumule,  je  pense 
qu'elles  rpondent parfaitement aux besoins d'un dveloppeur  dsireux  de 
crer des logiciels esthtiques (a compte) et d'utilisation simple.
La  librairie est place dans le Domaine Public.  Vous pouvez  donc  (c'est 
mme  conseill)  la  distribuer librement autour de  vous,  la  placer  en 
tlchargement sur un serveur ou une BBS, la faire connatre par catalogue, 
etc,  condition que le pack complet soit propos, c'est-dire les fichiers 
suivants :
BIG.H Le fichier header  inclure aux dveloppements
BIG.LIB La librairie  linker avec le programme
BIG.TXT La prsente documentation
BIGDEMO.PRG Le programme de dmo et d'exemple
BIGDEMO.RSC Le fichier ressource de la dmo
BIGDEMO.H Le fichier des dfinitions du ressource
BIGDEMO.HRD Le fichier contenant les noms d'objets du ressource
BIGDEMO.RSH  Le  fichier dcrivant le ressource de la dmo si  l'on  dsire 
l'intgrer
BIGDEMO.C Le source de la dmo
BIGDEMO.PRJ Le fichier projet pour Pure C
BIGMODIF.TXT Le ficher des modifications depuis la version prcdente.
Vous  pouvez obtenir le source complet des routines BIG en me contactant   
l'adresse indique  la fin de ce manuel. Je vous demande la somme de 100 F 
($  20)  pour les frais de disquette,  d'expdition...  et  pour  faire  si 
possible un petit bnfice.
L'utilisation  de  BIG dans des logiciels destins au commerce  est  libre. 
Toutefois,  les dons sont accepts.  Reportez-vous au chapitre 11.c pour me 
contacter.

1.b Que font ces routines ?
Elles  permettent de grer les utilisations les plus courantes de l'AES  en 
quelques appels de fonctions, que l'application travaille avec un ressource 
externe  ou  intgr,  en  programme ou  en  accessoire  de  bureau.  Elles 
permettent  galement  de  raliser  avec  la  mme  facilit  des   formes 
d'interfaces  apparues  seulement   partir des versions 4.00  et  4.10  de 
l'AES,  riches en innovations,  ou des formes non prvues par le GEM,  ceci 
mme  sur  les anciens systmes.  On peut rpartir ces  fonctions  en  deux 
groupes  :  celles  qui travaillent sur les formulaires et  les  menus,  et 
celles qui travaillent sur les fentres.  Mais la frontire entre ces  deux 
groupes  est floue puisqu'il est possible de placer des formulaires ou  des 
menus dans les fentres !

1.b.1 Le travail sur les formulaires et les menus
BIG offre la possibilit de dfinir des objets d'un look nouveau (mais  qui 
tend  se rpandre), des formulaires dplaables sur l'cran ou placs dans 
des  fentres,  une  gestion de boutons pop-up ou pop-liste et  de  boutons 
d'aide en ligne, des menus hirarchiques, des menus pop-up librement placs 
sur l'cran,  etc. Les raccourcis clavier dans les menus et les formulaires 
sont grs automatiquement par BIG.  La gestion du curseur dans les  champs 
ditables est agrmente d'quivalents clavier et il est possible de  crer 
des  champs capables de contenir plus de texte que la largeur du  champ  le 
permet (le texte dfile).  Les botes d'alerte peuvent tre dplaces comme 
les formulaires. De plus, il est possible de lier des objets ou des options 
de menus  des fonctions,  de telle sorte qu'il suffit de les cliquer  pour 
appeler la fonction correspondante. Nous entrons presque dans le domaine de 
la programmation objet ! BIG peut travailler aussi bien avec un fichier RSC 
classique qu'avec un ressource intgr.  Nous verrons comment lorsque  nous 
traiterons des appels des fonctions.

1.b.2 Le travail sur les fentres
Un  jeu  de  fonctions est consacr aux fentres afin  de  simplifier  leur 
programmation.  La possibilit de placer des formulaires dans des  fentres 
est  entirement prise en charge.  Il est galement possible de placer  des 
menus droulants dans les fentres (avec ou sans menus  hirarchiques),  ou 
des  "toolbars",  qui  sont  des petits formulaires situs en  haut  de  la 
fentre.  Les fentres contenant des images sont gres par BIG.  En ce qui 
concerne les fentres de texte (ou d'autre type de donnes), le programmeur 
aura seulement  crire la routine d'affichage (qui dpend fortement de  la 
manire dont les donnes sont stockes en mmoire). BIG se charge du reste. 
Enfin,  il est possible de dfinir pour chaque fentre la forme que prendra 
le  curseur  de  la souris quand il entrera dans la  zone  de  travail,  et 
d'indiquer  si  la  fentre  peut tre  manipule    partir  d'quivalents 
clavier.  Cette  quasi automatisation du travail sur les fentres est  sans 
doute un des points les plus attrayants de BIG, cette partie de l'AES tant 
probablement la plus ennuyeuse  programmer.

1.c Les outils ncessaires
BIG a t cr avec PURE C version 1.1 (du 20/03/93).  Si vous me  demandez 
les sources,  il seront facilement adapts  des versions plus anciennes ou 
au TURBO C,  mais ils ncessiteront sans doute une adaptation plus ample   
d'autres  compilateurs C (certaines sont dj ralises,  d'autres sont  en 
cours).
En  ce qui concerne les diteurs de ressources,  il est indispensable  d'en 
utiliser  un  qui  permette d'diter les  ob_types,  ob_flags  et  ob_state 
tendus des objets.  Dans ce domaine, il y a K-Ressource (qui commence  se 
faire vieux),  et INTERFACE (ou INTERFACE 2),  qui est sans aucun doute  le 
meilleur.  Mais n'oublions pas ORCS,  presque aussi puissant  qu'INTERFACE, 
qui est distribu en ShareWare.

1.d Les explications
Pour prsenter les possibilits de BIG,  nous allons commencer par faire un 
tour  du  propritaire  grce au programme  d'exemple  BIGdemo,  puis  nous 
entrerons  dans  les  dtails dans l'ordre suivant  :  les  nouveaux  types 
d'objets,  le concept de gestion des fentres et enfin les fonctions de BIG 
avec  leur  syntaxe,  leurs  paramtres et des  recommandations  pour  leur 
programmation.  Dans  cette  documentation,  nous ne prsenterons  que  les 
"fonctions  programmeur",  c'est--dire  celles  que  le  dveloppeur  doit 
appeler.  Les  autres,  les  "fonctions  internes"   BIG,  ne  seront  pas 
mentionnes ici.
Dans  toutes ces explications,  je m'efforcerai d'tre le  plus  explicatif 
possible. Toutefois, je supposerai que vous avez un minimum de connaissance 
en matire de programmation en langage C et en ce qui concerne le GEM.  Mon 
but  n'est pas de remplacer les ouvrages relatifs  ces questions.  Si  des 
points  restent obscurs,  je vous conseille de consulter une  documentation 
correspondant au problme, ou de me contacter personnellement.













2. Visite guide : BIGdemo
Je  vous recommande d'imprimer (au moins) cette partie de la  documentation 
afin de pouvoir lire la prsentation en la suivant sur l'cran.
Lancez BIGdemo.  Ce programme ne ralise rien de particulier.  Il est juste 
l pour montrer les possibilits des fonctions de BIG et comment elles sont 
utilises.  N'hsitez  pas  tudier son source attentivement,  toutes  les 
fonctions majeures de BIG y sont prsentes.  La dmo tourne dans toutes les 
rsolutions, mais elle n'est pas adapte aux basses rsolutions. Les icnes 
seront dformes, et certaines choses seront tranges, comme par exemple le 
menu  et certains formulaires qui sont trop larges.  J'ai simplement  voulu 
montrer  que  BIG permet de dvelopper dans toutes  les  rsolutions,  sans 
compliquer la dmo.
Un  bureau  s'affiche,  avec deux textes,  une icne et un  menu  de  trois 
options. L'icne et la bote des textes peuvent tre dplaces. L'icne est 
slectionnable par un clic simple, et dslectionnable en cliquant "dans le 
vide".
Dans  cette visite guide,  les touches du clavier seront prsentes  entre 
signes "infrieur" et "suprieur",  comme <ceci>.  Les textes des  boutons, 
options,  formulaires,  etc,  seront  prsents  entre  apostrophes,  comme 
'cela'.

2.a Le premier formulaire
Cliquez  l'option  'Infos' du menu 'BIGdemo'.  Un formulaire  se  prsente, 
affichant le numro de version de BIG.  Vous pouvez dplacer ce  formulaire 
sur l'cran en cliquant le bouton du coin suprieur droit et en gardant  le 
bouton de la souris enfonc. Le mode de dplacement de ce formulaire est la 
"bote  fantme",  c'est--dire  que le formulaire disparat  le  temps  du 
dplacement pour laisser la place  un rectangle  ses dimensions.
Cliquez le bouton 'INFOS' ou pressez la touche <Help>.  Un autre formulaire 
se  superpose  au premier.  Il indique mes coordonnes si vous  dsirez  me 
contacter  ou  recevoir  les sources complets de  BIG.  Quittez  ce  second 
formulaire en cliquant n'importe o  l'intrieur ou en pressant <Return>.
De  retour  sur la bote d'informations,  cliquez  le  bouton  'MERCI'.  Un 
troisime  formulaire  apparat,  prsentant  un mot  de  remerciement  aux 
copains qui m'ont aid  raliser BIG par leurs conseils,  leur travail  ou 
leurs encouragements. Comme prcdemment, quittez ce formulaire en cliquant 
n'importe o  l'intrieur ou en pressant <Return>.
Fermez  galement le formulaire d'infos.  Pour appeler cette  option,  vous 
auriez galement pu presser les touches <Alternate + I>, pour l'appeler par 
son  raccourci  clavier.  Si,   l'aide d'un  diteur  de  ressource,  vous 
remplacez  le  'Alt-I' de l'option de menu par  (par  exemple)  '^F',  vous 
devrez  maintenant  pressez les touches <Control + F>  pour  appeler  cette 
option.  Grce   BIG,  il n'est pas ncessaire de recompiler le  programme 
pour que le nouvel quivalent clavier prenne effet !

2.b Un formulaire plus complet
Passons au second menu,  not 'Formulaires'.  Cliquez l'option  'Formulaire 
libre'  (ou  pressez  <Control + L>).  Le formulaire qui  se  prsente  est 
nettement  plus  fourni que le premier.  Dplacez-le  sur  l'cran.  Il  se 
dplace  "en temps rel",  c'est--dire que c'est le formulaire complet  et 
plus seulement une bote fantme qui suit les mouvements de la  souris.  Le 
titre de ce formulaire est une chane graphique avec les attributs Gras  et 
Soulign.  L'ensemble  a  un aspect "3D",  comme si les objets  taient  en 
relief.
Sous  le  titre figurent deux groupes de radio boutons nots 'Cadre  1'  et 
'Cadre 2'.  Ils se prsentent sous la forme de petits boutons ronds avec le 
texte   leur droite.  Un des caractres de chaque texte est  soulign  (et 
rouge  si  vous  tes en couleur).  Pressez la  touche  <Alternate>  et  ce 
caractre. Le bouton ragit comme si vous l'aviez cliqu.
Passons au bouton ombr not 'Pop-Up'.  Quand vous le cliquez, un menu pop-
up avec deux colonnes d'options s'ouvre,  plac sous le bouton ( moins que 
vous n'ayez dplac le formulaire de telle sorte qu'il n'y ait pas assez de 
place    l'cran ;  dans ce cas,  le pop-up est dcal).  Le  menu  pop-up 
s'utilise  exactement comme un menu droulant.  Il peut contenir  plusieurs 
colonnes d'options.  Choisissez-en une.  Son texte est copi dans le bouton 
d'appel.  Re-cliquez ce bouton :  cette fois,  le pop-up est positionn  de 
manire    ce  que  la position de l'option choisie  et  celle  du  bouton 
correspondent (mme remarque : s'il n'y a pas assez de place, le pop-up est 
dcal),  et cette option est "checke". Passons  l'icne. Un nouveau menu 
pop-up  s'affiche,  mais  celui-ci  est  constitu  d'icnes.  Si  vous  en 
choisissez une, son dessin est report dans le bouton.
Il  existe  une  autre faon de changer la slection  d'un  bouton  pop-up. 
Fates  un  <Shift + clic> sur le bouton,  ou un clic sur la  petite  icne 
"option  suivante" (la flche circulaire) s'il s'agit du pop-up de  textes. 
L'option  suivant l'actuelle est active (du moins,  la  premire  active). 
Arriv "au bout",  a recommence depuis le dbut.  Si le texte du bouton ne 
correspond    aucune  des options du pop-up,  c'est la  premire  qui  est 
choisie de cette faon.
Les  deux boutons slectables se prsentent sous la forme d'un petit  carr 
avec le texte du bouton  droite.  Si le bouton est slectionn,  une croix 
est trace dans le carr.  L aussi,  un caractre est soulign (et rouge), 
pour signaler la prsence d'un raccourci clavier.
Le  bouton  'Alerte' fait afficher une alerte  de  type  BIG,  c'est--dire 
qu'elle  peut galement tre dplace  l'cran.  Toutefois,  dans ce  cas, 
elle se dplace sous forme de bote fantme.  En effet,  le dplacement  en 
temps  rel ncessite de sauver tout l'cran dans un  buffer.  Or,  BIG  ne 
comporte  (pour limiter l'occupation mmoire) qu'un seul buffer de ce  type 
et  il est dj occup pour le formulaire  principal.  Donc,  l'alerte  est 
dplace en bote fantme.  Nous reviendrons en dtail sur cela.  L'intert 
de ce bouton 'Alerte' est qu'il est li  la fonction qui affiche  l'alerte 
par  un  "pointeur sur fonction".  Il suffit de le cliquer pour  que  cette 
fonction  soit excute,  sans qu'il soit ncessaire d'effectuer toute  une 
srie de tests ! Il s'agit l d'un concept proche de la programmation objet 
qui est un des principaux atouts de BIG. Nous en reparlerons...
Le  premier des deux champs ditables comporte une petite flche de  chaque 
cot.  Tapez  du texte dans ce champ,  et continuez  taper en arrivant  au 
bout du champ.  Le texte dfile,  vous permettant de poursuivre la saisie ! 
Vous pouvez entrer 50 caractres dans ce champ.  En fait,  BIG autorise  la 
cration  d'ditables  tendus  ayant  jusqu'  255  caractres.   Si  vous 
continuez  taper en arrivant  la fin,  le dernier caractre est  remplac 
par celui qui est tap.  Si vous saisissez du texte au milieu du champ,  il 
est  saisi en mode insertion,   moins que la taille maximum du texte  soit 
atteinte. Dans ce cas, la saisie se fait en mode remplacement.
En  cliquant n'importe o dans le champ,  le curseur est positionn    cet 
endroit-l. Si on clique trop loin  droite (aprs le texte dj saisi), il 
est  positionn  la fin,  et si on clique trop   gauche,  au  dbut.  Les 
touches  flches gauche et droite utilises seules dplacent  le  curseur. 
Arriv au bout, le texte dfile. En collaboration avec la touche <Control>, 
les flches amnent le curseur au dbut du mot prcdent ou suivant (pas de 
dfilement dans ce cas).  Avec la touche <Shift>, le curseur est amen tout 
 gauche ou tout  droite du champ ditable.  Si le curseur est dj sur la 
premire  ou dernire position du champ,  le texte est dcal  jusqu'  son 
premier  ou  son dernier caractre.  Enfin,  en cliquant  sur  les  petites 
flches,  et en maintenant le bouton enfonc,  le texte dfile,  mme si le 
curseur tait sur un autre champ ditable.
Le  second  champ  ditable  est  plus  classique.   Il  offre  les   mmes 
enrichissements en ce qui concerne le dplacement du curseur, sauf bien sr 
le dfilement du texte, puisque ce n'est pas un champ "tendu".
Les combinaisons <Shift + Flche haute> et <Clr> amnent le curseur sur  le 
premier  champ du formulaire.  Les combinaisons <Shift + Flche  basse>  et 
<Shift  + Clr> l'amne sur le dernier champ (dans l'ordre  de  numrotation 
des objets dans le ressource).
Les touches <Flche basse> et <Tab> amnent le curseur sur le champ suivant 
du formulaire.  Les touches <Flche haute> et <Shift + Tab> l'amne sur  le 
champ   prcdent  (dans  l'ordre  de  numrotation  des  objets  dans   le 
ressource).
Le  bouton 'Confirme' est comme d'habitude activ par les touches  <Return> 
ou  <Enter>.  Le  bouton 'Annule' est activ par la touche  <Undo>,  et  le 
bouton  'Aide' par la touche <Help>.  Les quivalents clavier de ces  trois 
boutons font partie des routines BIG. Il suffit de changer les attributs de 
ces  boutons  dans le ressource pour modifier ces  quivalences.  Les  deux 
premiers comportent galement un quivalent clavier par caractre  soulign 
(et rouge), pour ceux qui prfrent cette mthode.
Le  bouton  'Aide'  appelle une autre bote qui vient se  superposer    la 
premire de manire  tre centre. Comme dans le formulaire d'information, 
cet appel fait partie de la gestion de BIG, il est "automatis".
Changez  quelques paramtres du formulaire,  puis  confirmez.  Rappelez  le 
formulaire.  Vos  modifications ont t enregistres.  Changez-les  encore, 
mais cette fois, annulez puis rappelez encore le formulaire. BIG a restaur 
les rglages prcdents.  Automatiquement (ou presque), BIG se charge de la 
sauvegarde et de la restauration de "l'tat" d'un formulaire.

2.c Une bote d'alerte
Cliquez  l'option  'BIG  Alerte'.  La  bote  d'alerte  qui  s'affiche  est 
dplaable  en  temps rel (puisque cette fois le buffer de  sauvegarde  de 
l'cran est inoccup), comme le formulaire de tout  l'heure. Mis  part ce 
dtail  et des icnes diffrentes et plus nombreuses que  les  habituelles, 
elle fonctionne comme une alerte GEM.

2.d Un premier formulaire en fentre
Laissons de cot l'option 'Quitter' (la visite ne fait que commencer !)  et 
passons au menu 'Fentres'.  La premire option, 'Petit formulaire' affiche 
un  formulaire dans une fentre.  Ceci prsente un immense  avantage  :  la 
gestion  du programme n'est pas bloque.  Les menus fonctionnent  toujours, 
par exemple.  Faites l'exprience de rappeler le formulaire  d'information. 
Tout  fonctionne  normalement...    un  dtail  prs  :  pour  appeler  ce 
formulaire,  vous avez d le faire par l'option de menu,  car le  raccourci 
clavier  ne  fonctionne plus.  En effet,  ce petit  formulaire  en  fentre 
comporte des champs ditables.  Dans ce cas, ce qui se passe sur le clavier 
leur est adress.  Il y a une exception, comme dans toutes les rgles : les 
deux   boutons   slectables  avec  un  caractre   soulign   fonctionnent 
normalement.  Si ce formulaire comportait des radios-boutons avec raccourci 
clavier,  ils  fonctionneraient  galement.  Simplement,  la  recherche  de 
l'quivalent  clavier  ne se fait pas dans le menu lorsque nous  sommes  en 
prsence  d'un formulaire en fentre comportant un (ou plusieurs)  champ(s) 
ditable(s).
Deux  des quatre champs ditables de ce formulaire sont des champs  tendus 
qui  autorisent la saisie de 30 caractres,  pas seulement des 10 qui  sont 
apparents.
Ce formulaire permet de changer la trame du bureau.  Choisissez-en une dans 
les  trames prsentes (qui sont des radios-boutons) et pressez  la  touche 
<Return>  ou  cliquez le bouton 'Applique'.  Le bureau est  modifi  et  la 
fentre reste ouverte.  Choisissez une autre trame et cliquez cette fois le 
bouton 'Confirme'. Le bureau est encore modifi, mais cette fois la fentre 
est ferme.
L'existence  des  formulaires  en fentre  implique  l'apparition  de  deux 
nouveaux boutons :  'Applique' et 'R.A.Z.'. Ils correspondent aux habituels 
'Confirme' et 'Annule', mais ne ferment pas la fentre. Le formulaire reste 
prsent.  Cela  est extrmement pratique pour modifier des paramtres  sans 
devoir  rappeler   chaque fois le formulaire si on ne trouve pas  tout  de 
suite  le bon rglage.  La visualisation de l'effet est immdiat,  mais  le 
formulaire de paramtrage reste disponible pour une autre modification.  Si 
la  fentre  est  ferme  par un clic dans le  bouton  de  fermeture  (coin 
suprieur gauche), cela correspond au bouton 'Annule'.
Comme  prcdemment,  BIG  se charge automatiquement de la gestion  de  ces 
boutons,  en  enregistrant  et  en restaurant  si  ncessaire  "l'tat"  du 
formulaire.
Le bouton 'INFOS', qui appelle un formulaire d'aide en ligne, fonctionne de 
la mme manire que ses semblables que nous avons dj rencontr.

2.e Un autre formulaire en fentre
Passons  l'option suivante,  'Grand formulaire'.  Un nouveau formulaire en 
fentre est prsent,  mais il est trop grand pour tenir sur l'cran  (Nous 
supposons  que  vous  n'utilisez pas de grand  cran,  ni  de  grand  cran 
virtuel,   comme  BIGSCRN  par  exemple).   La  fentre  est  donc  pourvue 
d'ascenseurs  pour pouvoir dplacer le contenu.  Vous pouvez  galement  le 
faire  dfiler en utilisant le clavier :  les quatre touches flches  sont 
quivalentes  un clic dans la flche correspondante de la fentre,  et les 
<Shift  +  flche>  sont  quivalentes  un  clic  dans  la  partie  grise 
correspondante  des  ascenseurs.  La touche <Esc> correspond au  bouton  de 
pleine ouverture, et la combinaison <Shift + Esc> au bouton de fermeture de 
la  fentre.  Cette possibilit de manipuler les fentres au  clavier  fait 
partie  des  routines BIG,  mais n'est pas obligatoirement affecte    une 
fentre.  Il faut le prciser  la cration de la fentre,  afin que  cette 
gestion se fasse.  Il y a un dernier quivalent clavier pour les fentres : 
la  combinaison <Control + Tab> amne au premier plan la  fentre  suivante 
(s'il y en a une),  qui tait jusqu'alors en arrire-plan (essayez, si vous 
n'avez pas referm la fentre du petit formulaire).  Cette possibilit  est 
active  mme  si  la  gestion de la fentre par  le  clavier  n'a  pas  t 
demande,  et  mme  si  le  formulaire  en  fentre  comporte  des  champs 
ditables.
La  gestion de la fentre  (dplacements,  dfilements,  redimensionnement, 
etc) est automatiquement gre par BIG.
Ce formulaire ne comporte pas de champs ditables.  En effet, puisque cette 
fentre possde des ascenseurs et un bouton de redimensionnement,  le champ 
ditable  pourrait se trouver "en dehors" de la fentre.  Dans ce  cas,  le 
curseur  ne  devrait pas tre dessin,  la saisie du  texte  temporairement 
impossible,  etc.  La  gestion  du formulaire  en  serait  considrablement 
complique,  et la taille du programme grossirait en consquence. J'ai donc 
opt  pour un compromis :  Il est possible de placer des  champs  ditables 
dans un formulaire en fentre,  mais BIG considre qu'il est TOUJOURS  dans 
la partie visible.  En d'autres termes :  Si vous placez des ditables dans 
un formulaire de fentre,  cette fentre ne doit pas comporter d'ascenseurs 
et ne doit pas tre redimensionnable. C'est interdit ! En contre-partie, la 
recherche  des quivalents clavier s'effectue aussi dans le  menu.  Pressez 
les touches <Alternate + I>, le formulaire d'information se prsente.
Le formulaire d'exemple comporte trois groupes de radios-boutons avec leurs 
raccourcis  clavier,  ainsi que deux boutons  slectables,  galement  avec 
raccourcis  clavier.  Il comprend galement quatres boutons  pop-up,  trois 
sous  forme de texte et un sous forme d'icnes.  Ils permettent de  changer 
les textes et l'icne du bureau.
Examinons  en dtail le comportement des deux plus grands.  Celui  qui  est 
not 'Pop-Up 1' fait appratre un menu pop-up constitu d'une seule colonne 
d'option,  mais  elles  sont  trop  nombreuses  pour  pouvoir  toutes  tre 
affiches.  Automatiquement BIG cre un "scroll-menu", c'est--dire un pop-
up muni de flches de dfilement en haut en en bas.  Ds que le curseur  de 
la  souris  est  amen sur une de ces flches,  les options  se  mettent   
dfiler dans cette direction,  jusqu'au bout, sans qu'il soit ncessaire de 
cliquer.  Le pop-up se place sous le bouton d'appel s'il y a la place  pour 
afficher  au moins quatre options et les deux flches.  Sinon,  il part  du 
haut  du bureau.  L'option qui correspond au texte du bouton (s'il y  en  a 
une)  est  "checke",  et elle est affiche en premire  position  dans  le 
scroll-menu ( moins qu'elle soit dans les dernires de la liste,  dans  ce 
cas elle peut tre dcale).
Le  second bouton pop-up est not 'Pop-List".  Cliquez-le.  Le  pop-up  qui 
apparat alors comporte huit options,  mais il est agrment d'un ascenceur 
complet situ  sa droite.  Cliquez sur une des flches haute ou basse pour 
dplacer  le  contenu du menu d'une option dans cette  direction.  Si  vous 
cliquez  sur  une partie grise de l'ascenceur,  le dcalage  est  de  huit 
options. Enfin, en cliquant le slider et en gardant enfonc le bouton de la 
souris,  vous pouvez faire dfiler le contenu du menu en temps rel.  Comme 
prcdemment, l'option correspondant au texte du bouton est checke et elle 
est place en premire position si possible. Le pop-liste est plac sous le 
bouton d'appel s'il y a assez de place,  sinon au-dessus.  Si le formulaire 
pop-up associ  ce bouton comporte moins de neuf options,  c'est un pop-up 
"normal" qui est affich.
Pour  les  besoins  de  la dmo,  les boutons  'Pop-Up  1'  et  'Pop-Up  2' 
permettent  de changer les textes figurant dans la bote du bureau,  et  le 
pop-up graphique permet de changer l'icne.
Le  bouton 'INFOS' appelle un formulaire d'aide en ligne.  Nous  retrouvons 
encore nos quatre boutons 'Applique', 'Confirme', 'R.A.Z.' et 'Annule'.

2.f Un menu hirarchique
On  appelle "menu hirarchique" les "sous-menus" qui peuvent  apparatre   
droite  ou   gauche du menu normal lorsque la souris passe  sur  certaines 
options de ce menu.  BIG permet de raliser cela de manire automatique, en 
prenant  en  charge  la gestion de ce  menu  hirarchique,  ainsi  que  des 
quivalents clavier qui pourraient s'y trouver. Si le formulaire servant de 
menu  hirarchique  est plus haut que le  bureau,  il  est  automatiquement 
transform en scroll-menu (ce n'est pas le cas dans la dmo).
Amenez le curseur de la souris sur l'option 'Fentre normale', qui comporte 
une  petite flche.  Cette flche est l pour rappeler  l'utilisateur  que 
cette  option possde un menu hirarchique,  et elle indique de  quel  cot 
(vers la droite ou la gauche) le sous-menu va se drouler.  Aprs un  petit 
dlai  d'environ une demi seconde,  le menu hirarchique s'ouvre.  Si  vous 
sortez  de  l'option du cot opos au sous-menu,  ou si  vous  dplacez  le 
curseur plus "haut" que lui, il disparat.
Le  menu  hirarchique comporte trois  options  'Texte...',  'Image...'  et 
'Histogramme'.  Amenez la souris dans le sous-menu.  Il s'utilise comme  le 
menu normal. Il disparat si vous cliquez une option, ou si vous cliquez en 
dehors,  ou  si  le curseur de la souris passe  une autre option  du  menu 
principal,  ou,  comme il a t dit,  s'il passe "au-dessus" du  sous-menu. 
Ceci  est  ncessaire  afin d'viter qu'un autre menu ne  se  droule  "par 
dessus" notre menu hirarchique.  De ce fait,  IL EST INTERDIT de placer un 
menu  hirarchique  comme  premire option d'un  mnu  droulant  (voir  le 
chapitre  3.i pour les dtails).  La routine de recherche  des  quivalents 
clavier  dans  le menu cherche galement dans les sous-menus de  manire   
activer l'option correspondante s'il y en a.

2.g La fentre de texte
Cliquez l'option 'Texte...' ou pressez <Control + T>.  Un slecteur d'objet 
apparat  afin  que  vous  puissiez choisir un texte    afficher  dans  la 
fentre.  Attention, la dmo n'est en mesure de grer seulement un texte en 
Ascii avec un 'CR LF'  la fin de chaque ligne,  et dont les lignes ont une 
longueur  maximum de 80 caractres.  N'essayez pas de charger autre  chose, 
vous  pourriez  avoir de mauvaises  surprises,  aucune  vrification  n'est 
fate !
La  fentre qui s'ouvre permet de visualiser le texte.  Elle comporte  tous 
les  attributs  standard d'une fentre (ascenseurs,  etc),  sauf  la  barre 
d'information.  Elle comporte en plus une "Toolbar",  qui est un formulaire 
de petite taille qui se place en haut de la fentre et peut servir de bote 
  outils.  Cette  fentre,  comme celle du  grand  formulaire,  peut  tre 
manipule  partir du clavier.  De plus,  chaque fois que le curseur de la 
souris  entre dans la zone de travail de la fentre,  il prend la forme  du 
curseur-texte  (les parenthses dos--dos),  et reprend la forme de  flche 
ds qu'il en sort.  Cette caractristique, comme la gestion par le clavier, 
est automatise par BIG et doit tre rclame  la cration de la  fentre. 
Ce   n'est  pas  une  fonction  vitale,   mais  c'est  agrable  en   cours 
d'utilisation d'un logiciel.
Toutes  les  fonctions de base de cette fentre sont prises en  charge  par 
BIG !  La seule chose qui est laisse  la charge du dveloppeur,  c'est la 
routine d'affichage elle-mme,  qui dpend fortement de la manire dont  le 
fichier texte est stock en mmoire,  et de ce qu'il contient.  La  routine 
d'affichage de BIGDEMO.C est trs simplifie, mais elle est suffisante dans 
cette  situation.  BIG  s'occupe de tout le reste :  gestion  des  redraws, 
dplacement  par  page  ou par  ligne,  raffichage  lorsqu'un  slider  est 
dplac,   pleine  ouverture  et  taille   prcdente,   redimensionnement, 
dplacement,  etc.  Tous  les  messages  du GEM sont traits  sans  que  le 
programme  principal (c'est--dire la partie "hors BIG" que le  programmeur 
doit crire) n'ait  s'en occuper !  Rien que pour cela,  BIG est un  grand 
pas en avant.
La Toolbar permet d'agir sur l'affichage du texte.  Les trois radio-boutons 
'Gauche',  'Centre' et 'Droite' permettent de jouer sur le calage du  texte 
dans  la fentre.  Le bouton 'Inverse' bascule l'affichage entre  noir  sur 
blanc et blanc sur noir.  Les raccourcis clavier de ces boutons sont actifs 
comme dans un formulaire ordinaire.
Le  grand  bouton pop-up permet de choisir la police de caractre  si  vous 
avez install SpeedoGDOS sur votre systme (sinon,  seule la fonte  systme 
est  disponible).  Enfin,  l'autre pop-up permet de choisir la  taille  des 
caractres  (ce  qui  peut tre disgracieux avec  la  fonte  systme).  Les 
polices Speedo tant proportionnelles pour la plupart, cela peut donner des 
rsultats imparfaits dans le sens de la largeur,  surtout dans les  grosses 
tailles,  ainsi qu'avec le dfilement horizontal de la fentre. Je n'ai pas 
voulu compliquer la dmo, mais montrer comment quelques lignes de programme 
pouvaient offrir grce  BIG de nombreuses possibilits.

2.h La fentre d'image
La  seconde option du menu hirarchique affiche une fentre  contenant  une 
image.  Le slecteur vous propose de choisir une image Degas non compresse 
(extension 'PI?').  Ne tentez pas de charger une autre image,  ni une image 
d'un  nombre  de plans de couleurs diffrent de l'actuel,  car la  dmo  ne 
vrifie rien.
Par contre,  BIG gre la palette de couleurs. La palette de l'image charge 
devient la palette active. Ds que vous cliquez sur une autre fentre (mme 
si elle appartient  un autre programme ou accessoire),  ou que vous fermez 
celle-ci, la palette par dfaut redevient active.
Cette  fentre  est galement manipulable au clavier.  La souris  prend  la 
forme  d'une  main   l'index tendu dans la zone  de  travail.  Pour  grer 
l'affichage d'une image avec BIG,  vous n'aurez mme pas besoin (comme pour 
le  texte)  d'crire la routine d'affichage !  En  effet,  la  gestion  des 
rasters  (blocs-images)  est  standardise dans la VDI  par  le  biais  des 
structures  MFDB  ("Memory Form Definition Block"  en  version  originale). 
L'image, quels que soient sa taille, son format, sa rsolution, etc, est de 
toute  manire  stocke  dans  une zone mmoire qui  lui  est  rserve  au 
chargement. Il suffit d'indiquer  BIG l'adresse de cette zone mmoire pour 
qu'il s'occupe du reste ! C'est pas beau ?

2.i Une fentre graphique
L'option   'Histogramme'  fait  apparatre  une  fentre   affichant   huit 
histogrammes de tailles diffrentes, calcules alatoirement  chaque appel 
de la fonction. Elle possde galement une ligne d'informations.
La fentre peut tre dplace et redimensionne,  (uniquement par pas de 16 
pixels,  pour  des raisons dont nous reparlerons).  Dans ce cas (ainsi  que 
dans le cas d'un retour de taille plein cran  la taille  prcdente),  il 
faut prendre garde  un dtail :  le GEM ne gnre un message de redraw que 
si  les nouvelles dimensions sont suprieures en largeur ou en hauteur  (au 
moins un des deux).  Il faut donc aiguiller le programme vers une  fonction 
qui  va  tester cela,  et qui va rafficher la fentre  si  ncessaire  (et 
seulement  dans  ce cas,  sinon la fentre pourrait  tre  raffiche  deux 
fois).  En effet, cette fentre d'histogrammes ne possde pas d'ascenceurs. 
Le graphique est redessin  l'chelle de la fentre  chaque fois.
Si la fentre est  l'arrire-plan au moment de l'appel, elle est amene au 
premier  plan.  Dans  ce  cas,  les  histogrammes  sont  recalculs  et  le 
raffichage du contenu de la fentre doit se faire dans tous les  cas.  BIG 
se charge de forcer GEM  grer ce redraw dans tous les cas.

2.j Une fentre avec un menu droulant
L'option  'Fentre menu' (ou <Control + M>) ouvre une fentre qui  contient 
un menu droulant ! Cette possibilit de placer des menus dans les fentres 
permet  de raliser des logiciels d'une utilisation trs  ergonomique.  Par 
exemple,  dans  un programme de dessin,  chaque fentre peut  contenir  une 
image, et un menu permettant de choisir les paramtres de couleurs, l'outil 
de  travail,  etc,  correspondant    cette  image.  Une  toolbar  pourrait 
galement tre utilise,  mais le nombre d'outils risquerait d'en augmenter 
la taille au dtriment de la surface de travail.
Une   autre  utilisation  intressante  des  menus  en  fentre  sont   les 
accessoires de bureau. Un accessoire ne peut placer une barre de menu (il y 
a des exceptions,  je sais...),  et c'est regrettable.  Mais il peut ouvrir 
une fentre. Il suffit de placer un menu dans cette fentre, et le tour est 
jou !
Naturellement,  BIG  s'occupe de tout.  Le menu est li  la fentre et  la 
suit dans ses dplacements. Si la fentre devient trop petite pour que l'on 
puisse  accder aux menus les plus  droite,  les deux petites  flches  de 
gauche permettent de les dcaler. Cliquez sur elles pour essayer. Les menus 
ne se droulent pas automatiquement,  du moins pas de suite. Cliquez sur un 
des  titres  'BIGdemo',   'Options'  ou  'Alertes'.  Cette  fois,  le  menu 
correspondant  se  droule,  et l'ensemble de la barre de  menu  fonctionne 
comme  d'habitude.  Vous  pouvez passer  l'autre  menu,  slectionner  une 
option,  etc.  Le menu principal est "bloqu" pendant ce temps.  Choisissez 
une option ou cliquez  cot pour fermer les menus.  Tout redevient normal. 
Le menu 'Alertes' offre mme un menu hirarchique !
BIG s'occupe aussi des quivalents clavier.  Si une fentre-menu se  trouve 
au  premier plan (fentre active),  il cherche dans son menu si une  option 
correspond  au  raccourci  clavier.  Il vaut mieux qu'il  n'y  ait  pas  de 
raccourcis  clavier identiques dans le menu principal et dans celui  de  la 
fentre,  mais  si  c'est  le  cas,  la  fentre  a  priorit.  Ds  qu'une 
correspondance  est  trouve,   la  recherche  s'interrompt.  La  recherche 
s'effectue aussi dans les menus hirarchiques s'il y en a.
Le  menu est cr dans l'diteur de ressource comme un  menu  normal.  Vous 
pouvez  laisser  ou enlever les options rserves pour les  accessoires  de 
bureau.  Elles seront supprimes pour l'affichage en fentre. BIG se charge 
de "fentriser" ce menu.
Continuons la visite par ce menu de fentre.  L'option 'Infos' est la  mme 
que  celle du menu principal.  Elle affiche le  mme  formulaire.  L'option 
'Alerte' affiche une alerte BIG,  dplaable.  L'option est alternativement 
"checke" et "d-checke"  chaque fois qu'elle est appele.
L'option  'Charger image' permet de charger une image Degas non  compresse 
(mmes  remarques que tout  l'heure) et de l'afficher dans la fentre  (l 
aussi, la palette de couleurs est gre). Fates-le.
Fates l'exprience de charger une image avec une palette de couleurs  dans 
la fentre "image",  une autre avec une palette diffrente dans la  fentre 
"menu",  et  ouvrez une autre fentre,  "texte" par exemple.  Passez  d'une 
fentre  l'autre en observant la palette courante.
L encore,  BIG s'occupe de tout :  manipulations de la fentre  partir du 
clavier,  forme  de  la souris dans la zone de travail  (une  croix  fine), 
ascenseurs,  raffichage,  palette,  etc.  Si du texte avait t plac  la 
place de l'image dans cette fentre,  nous aurions d simplement crire  la 
routine d'affichage.
Enfin,  l'option 'Icnes' est munie d'un menu hirarchique. Contrairement  
leurs homologues du menu principal,  ils peuvent tre placs,  dans le  cas 
d'un menu de fentre, en premire option d'un menu. Si le menu hirarchique 
est  plus  haut  que  le  bureau,  BIG  le  transforme  automatiquement  en 
scroll_menu.  Ce sous-menu permet d'afficher une bote d'alerte (la  mme), 
avec les 9 motifs d'icnes d'alerte proposs par BIG, plus le "sans icne". 
On peut galement les afficher par les raccourcis clavier. Certaines de ses 
options  travaillent  par  pointeur sur  fonction,  d'autres  non.  Nous  y 
reviendrons.

2.k Un pop-up libre
Nous n'avons pas fini.  Cliquez avec le bouton droit de la souris.  Un menu 
pop-up  apparat,  centr sur la position du clic (ou dcal si on  est  au 
bord de l'cran) !  Ce pop-up libre est optionnel. BIG gre le bouton droit 
de  la souris,  vous le signale lorsqu'il est cliqu,  et peut en prime  si 
vous le dsirez grer automatiquement un menu pop-up comme  celui-ci.  Dans 
l'exemple,   ce  menu  pop-up  reprend  les  diffrentes  options  du  menu 
principal.  Une  seule restriction :  il n'est pas possible de  placer  des 
menus hirarchiques lis  des options de menu pop-up.  Par contre,  BIG le 
transforme en scroll-menu s'il est trop haut.

2.l Gestion du timer
Une  autre  action est ralise par BIG,  qui n'est pas apparente  dans  la 
dmo.  A chaque fois que "rien" ne s'est pass,  ni vnement  clavier,  ni 
clic,  ni  manipulation  de  fentre,  etc,  BIG le  signale  au  programme 
principal.  Cela se produit en temps normal plusieurs fois par seconde.  Il 
est  alors possible d'en profiter pour faire quelque chose en pseudo  tche 
de  fond,   par  exemple  dcrmenter  un  compteur  pour  une   sauvegarde 
automatique,  surveiller la prise srie,  envoyer du texte   l'imprimante, 
etc.  Mais  sous  MultiTOS,  il  faut tre trs prudent avec  ce  genre  de 
fonction...

2.m Icnification de fentres
Il est parfois gnant que l'cran soit encombr de fentres,  car cela nuit 
au  confort  de travail.  En fermer certaines n'est pas toujours  la  bonne 
solution,  car leur rouverture prend parfois un certain temps, par exemple 
si  le  programme doit en recharger le contenu  partir  d'un  fichier.  La 
solution  la  plus  lgante et la plus  commode  est  "l'icnification  de 
fentre". L'AES prvoit cette possibilit depuis sa version 4.10 seulement. 
Un  nouvel attribut de fentre a t cr,  le "SMALLER".  Il  s'agit  d'un 
petit bouton triangulaire plac  gauche du bouton de pleine ouverture  (le 
FULLER).  Lorsqu'on clique ce bouton, un message d'icnification est envoy 
 l'application.  La fentre peut alors tre amene  une taille de 72 x 72 
pixels,  et tous ses autres attributs sont provisoirement annuls,  sauf le 
titre et la barre de dplacement.  En outre,  le titre est crit en  petits 
caractres.
Pour "dsicnifier" la fentre,  il faut effectuer un double-clic sur elle. 
Un autre message est alors envoy, et l'application peut demander au GEM de 
restaurer  la  fentre  avec  ses  anciennes  coordonnes  et  ses  anciens 
attributs.
Dernire possibilit : un <Control + clic> sur le SMALLER gnre un message 
"ALL_ICONIFY".  L'application doit alors se charger d'icnifier TOUTES  ses 
fentres  en  une seule icne,  et raliser l'opration inverse en  cas  de 
double-clic sur cette fentre icnifie.
BIG permet de raliser toutes ces choses mme sur les aciennes versions  de 
l'AES !  Les seules diffrences,  c'est que le SMALLER ne sera pas dessin, 
et  que  le titre de la fentre ne sera pas crit en petits  caractres  ( 
moins  que votre poste soit quip de l'AES 4.10 ou plus).  Le clic sur  le 
SMALLER  est  remplac  par un clic avec le bouton droit sur  la  barre  de 
dplacement,  avec  ou sans pression sur la touche <Control>.  Dans le  cas 
d'une icnification de toutes les fentres,  BIG effectue une icnification 
de la fentre qui a t "Control clique",  et ferme les autres fentres de 
cette  application qui sont ouvertes  ce moment.  Si  l'utilisateur  ouvre 
ensuite d'autres fentres et refait une "all iconification", une autre "all 
icne" est cre.  Lors d'un double-clic sur une fentre icnifie,  la (ou 
les) fentre(s) est (sont) restaure(s) comme auparavent.
Ralisez l'opration sur les fentres de la dmo.  Vous constaterez que les 
fentres icnifies peuvent tre dessines avec un contenu  diffrent,  qui 
n'est  actif  que lorsque la fentre est icnifie.  La  dmo  affiche  une 
petite image, diffrente s'il s'agit d'une fentre formulaire ou d'un autre 
type.

2.n Fin de la visite
Cliquez  l'option  'Quitter'.  BIG se charge de fermer les fentres  et  de 
librer  les diffrentes zones mmoire qu'il avait rserv,  le  ressource, 
etc.
Jetons  prsent un coup d'oeil (bahi !) au source BIGDEMO.C :  il ne fait 
que 1310 lignes !!! 1310 lignes (trs ares) pour raliser tout cela, avec 
seulement  trois variables globales,  utilises pour la gestion des  fontes 
SpeedoGDOS.  Certes,  ce programme est juste une dmo,  il ne ralise rien, 
mais  il  possde  une interface complte,  avec  des  choses  indites  ou 
presque.
Nous  avons  (rapidement)  fait le tour de ce que BIG peut  faire  pour  le 
programmeur :  s'occuper d'une quantit de choses qui sont ainsi fates une 
bonne fois pour toutes.  Dans un programme "sous BIG", une grande partie de 
la  programmation  de  l'interface se trouve  dans  les  routines  BIG.  Le 
dveloppeur  n'a plus qu' traiter quelques points particuliers ou des  cas 
spcifiques   son application.  Quant  la structure de  cette  interface, 
elle  se  trouve en grande partie dans le ressource  lui-mme,  comme  nous 
allons le voir trs vite.
Ce  qui  ne se voit pas dans la dmo,  c'est que grce  aux  pointeurs  sur 
fonction,  les tailles du source et du programme diminuent dans de  grandes 
proportions, du fait que certaines fonctions sont directement appeles.
Fates  encore  deux  expriences :  renommez  le  fichier  BIGDEMO.PRG  en 
BIGDEMO.ACC,  copiez-le  (ainsi que le RSC) sur la partition  de  boot,  et 
fates  un  reset  du systme.  La dmo fonctionne  dsormais  (de  manire 
simplifie)  en accessoire de bureau !  Seul le bureau a disparu.  Le  menu 
principal  est  dsormais  plac  dans une  fentre,  mais  tout  le  reste 
fonctionne  comme auparavant :  diffrentes fentres,  raccourcis  clavier, 
icnification, formulaires, etc.
Dernire exprience,  placez BIGDEMO.PRG dans le dossier AUTO, et effectuez 
  nouveau  un  reset.  Durant le boot,  un message  vous  signale  que  ce 
programme  ne  peut  tre lanc ainsi.  En effet,  il  n'est  pas  possible 
d'excuter  de  cette manire un programme sous GEM,  et  les  applications 
ralises avec BIG sont par dfinition sous GEM.  Au lieu de planter, comme 
cela se passe d'ordinaire, BIG vous prvient.

3. Les nouveaux types d'objets
Commenons  par  jeter  un  coup d'il  sur  les  nouveaux  types  d'objets 
implments par BIG.  Pour les dfinir,  nous utilisons le concept de "type 
tendu"  de  l'AES.  De  quoi s'agit-il ?  Les types  d'objets  dfinis  en 
standard  par le GEM vont du numro 20 au numro 32 (33 depuis  la  version 
3.3 de l'AES). Ce type (ob_type) tant cod sur un int (2 octets), il reste 
pas  mal de place disponible.  Pour dterminer le type  d'un  objet,  l'AES 
teste l'octet de faible poids sans s'occuper de l'autre. Nous avons donc la 
possibilit de l'utiliser  notre guise pour y stocker jusqu' 255  valeurs 
que nous appelons "type tendu" (En ralit,  les particularits du nouveau 
GEM4 se rservent les valeurs de 128  255.  Il nous reste donc les valeurs 
1    127).  Ces  objets  peuvent ensuite tre dessins  par  le  GEM  (par 
objc_draw()  ou objc_change()).  Il prendra alors l'aspect indiqu par  son 
type  normal  (l'octet de faible poids).  Mais dans BIG,  certains  de  ces 
objets  type tendu sont transforms en G_USERDEF,  ce qui signifie qu'ils 
seront  dessins  par une routine du programme et non pas par  une  routine 
GEM. Bien entendu, ces routines de dessin sont galement intgres  BIG.
BIG  utilise aussi les ob_state tendus.  En effet,  l'ob_state (ainsi  que 
l'ob_flags) des objets n'est pas entirement utilis par l'AES.  Seuls  les 
bits  0   5 de ob_state (et les bits 0  11 de  ob_flags)  sont  rservs. 
L'AES  ne teste mme pas les autres bits en temps normal.  Nous allons  les 
utiliser pour nos paramtres.
Voici ces nouveaux types d'objets et les noms utiliss dans BIG (de la mme 
faon que tous les noms d'objets GEM commencent par 'G_', les noms d'objets 
BIG commencent par 'B_') :
B_COCHE  Bouton coch.  C'est un bouton slectable qui prend l'aspect  d'un 
petit carr avec le texte du bouton  sa droite. Lorsqu'il est slectionn, 
le carr est barr de diagonales.  Un caractre du texte peut tre soulign 
en  le faisant prcder de '[',  afin de pouvoir activer le bouton  par  la 
combinaison  <Alternate  +  caractre>.   Rserv  aux  boutons  simplement 
slectables.
B_RADIO  Bouton rond.  C'est un bouton slectable qui prend  l'aspect  d'un 
petit  cercle  avec  le  texte  du  bouton    sa  droite.   Lorsqu'il  est 
slectionn,  le  cercle  contient  un petit rond  noir,  sinon  ce  cercle 
intrieur est vide.  Un caractre du texte peut tre soulign en le faisant 
prcder de '[',  afin d'activer le bouton par la combinaison <Alternate  + 
caractre>. Rserv aux radio-boutons.
B_EDIT  Champ ditable tendu,  permettant la saisie de plus de  caractres 
que  la largeur du champ.  Ces objets doivent imprativement  comporter  de 
chaque  cot  du champ lui-mme des petites flches vers la  gauche  et  la 
droite (Ascii 4 et 3). Un espace doit respectivement suivre et prcder ces 
flches.
B_FRAME  Rectangle  servant  encadrer d'autres objets pour  les  regrouper 
visuellement,  par  exemple un groupe de radio-boutons.  Le  texte  associ 
apparat en haut  gauche du cadre,   cheval sur le trait. Il est possible 
de donner des attributs graphiques  ce texte.
B_MOVE Bouton servant  dplacer le formulaire sur l'cran.  Il a  l'aspect 
d'un  triangle,  comme  si  le  coin du  formulaire  tait  corn.  Il  est 
traditionnellement plac dans l'angle suprieur droit du formulaire.
B_DEFAULT C'est le traditionnel bouton par dfaut, avec son aspect normal.
B_UNDO C'est un bouton  l'aspect normal,  mais qui pourra tre activ  par 
une  pression  sur  la  touche <Undo> (peut  par  exemple  tre  le  bouton 
'Annuler').  En  outre,  un  de ses caractres peut tre  soulign,  en  le 
faisant prcd de '['.
B_UNDER  C'est un G_BUTTON ou un B_DEFAULT dont un caractre  est  soulign 
pour qu'un quivalent clavier lui soit affect. Le caractre  soulign est 
prcd de '['.
B_HELP Bouton donnant accs  une aide en ligne, sans quitter la gestion du 
formulaire en cours.  Il sera activ par une pression sur la touche <Help>. 
Il    l'aspect d'une G_BOXTEXT 'SHADOW' et 'OUTLINE',  avec  le  texte  en 
petits caractres.
B_POPUP  Bouton "Shadowed" normal,  mais qui donne accs  la gestion  d'un 
menu pop-up associ,  sans quitter la gestion du formulaire en cours.  S'il 
est plus haut que le bureau,  le pop-up sera automatiquement transform  en 
scroll-menu.  Le bouton peut avoir une icne "option suivante" optionnelle. 
Pour cela, il doit comporter ce type tendu.
B_LIST Comme B_POPUP,  mais c'est un pop-liste qui est affich :  un pop-up 
de  huit  options  avec ascenceur.  Si le pop-up  comporte  moins  de  neuf 
options,  il  est affich en pop-up normal.  Le bouton est agrment  d'une 
icne "option suivante".
B_GRASTR  Chane  de texte avec attributs graphiques servant  de  titre  au 
formulaire.
B_HIERM Option de menu appelant un menu hirarchique,  c'est--dire un menu 
pop-up    cot  du menu principal.  Peuvent tre placs dans  un  menu  de 
fentre.  Si  le  formulaire de menu hirarchique est  trop  haut,  BIG  le 
transforme automatiquement en scroll-menu.
B_FNCP  N'importe  quel type d'objet ou option de menu qui sera li    une 
fonction  ('FNCP' signifie "FuNCtion Pointer").  Il suffit de  cliquer  cet 
objet ou cette option de menu (ou de l'invoquer par son raccourci  clavier) 
pour que la fonction soit automatiquement excute.















3.a Les attributs
Voici un tableau rcapitulatif de ces objets,  avec leur type tendu, leurs 
attributs, etc, tels qu'ils doivent tre crs dans l'diteur de ressource.

  Nom      Type     Type    ob_flags  ob_state  ob_state  Attributs
 objet    normal   tendu    normal    tendu    normal   interdits

B_COCHE  G_BUTTON B_SELEC  SELECTABLE    --        --      RBUTTON
                    (18)                                   SHADOWED

B_RADIO  G_BUTTON B_SELEC  SELECTABLE    --        --      SHADOWED
                    (18)   RBUTTON

B_EDIT   G_FTEXT  B_EDIT   EDITABLE   Nbre de      --      SELECTABLE
        G_FBOXTEXT  (25)              caractres           EXIT

B_FRAME  G_BUTTON B_FRAME     --      Attributs    --      SELECTABLE
                    (20)              graphiques           EXIT

B_MOVE   G_IBOX   B_MOVE   TOUCHEXIT     --      OUTLINED  SELECTABLE
                    (17)                         CROSSED   EXIT

B_DEFAULT G_BUTTON B_UNDER SELECTABLE 1 : fermer   --        --
                  (30)(opt)  DEFAULT  la fentre
                             EXIT

B_UNDO   G_BUTTON B_UNDO   SELECTABLE 1 : fermer   --      DEFAULT
                    (31)   EXIT       la fentre

B_UNDER  G_BUTTON B_UNDER  SELECTABLE    --        --        --
                    (30)   EXIT

B_HELP   G_BOXTEXT B_HELP  SELECTABLE n form.     --      DEFAULT
       (petit text) (21)              associ              EXIT

B_POPUP  G_BUTTON  B_POPUP SELECTABLE n form.     --      DEFAULT
         G_IMAGE  (22)(opt) SHADOWED  associ

B_LIST   G_BUTTON   B_LIST SELECTABLE n form.     --      DEFAULT
                    (23)   SHADOWED   associ

B_GRASTR G_BUTTON  B_GRASTR   --      Attributs    --      SELECTABLE
                    (19)              graphiques           EXIT

B_HIERM  G_STRING  B_HIERM    --      n form.     --        --
          (Menu)    (41)              associ

B_FNCP   Tous      B_FNCP     --      Rien  la    --        --
                    (51)              cration

Notez  que les conventions prsentes ci-dessus sont proches des  standards 
existant dj dans d'autres bibliothques GEM tendu, telle que FLY_DIAL et 
INTERFACE  (qui  ne proposent pas de systme de pointeurs sur  fonction  ni 
d'attributs graphiques, ni de menus hirarchiques, etc). Toutefois, il peut 
y  avoir  des  diffrences entre le "look" d'un type  d'objet  dessin  par 
INTERFACE et le mme dessin par BIG.  En particulier,  les B_COCHEs et les 
B_RADIOs. J'ai volontairement donn un aspect diffrent  ces deux boutons, 
afin  qu'ils ne ressemblent pas trop  leur homologues du  monde  Mac.  Mon 
opinion  personnelle  est  que  les  dveloppeurs  doivent  s'efforcer   de 
conserver    l'Atari  sa  "personnalit" et ne pas  tenter  de  lui  faire 
ressembler  d'autres machines.


3.b Dessine-moi un bouton
Voyons  prsent les dtails.  Le type normal correspond au type de l'objet 
lors  de sa cration dans l'diteur de ressource.  Ce sont les routines  de 
BIG  qui vont se charger de la transformation de l'objet en  G_USERDEF  (si 
ncessaire)  en  fonction  des autres indications de  ce  tableau.  Le  nom 
indiqu  comme type tendu est celui donn par les '#define' de  BIG.H.  La 
valeur correspondante est donne avec.  Les attributs de "ob_flags  normal" 
reprsentent  les  bits qui doivent obligatoirement tre  positionns  dans 
l'ob_flags  de  l'objet.   De  mme  pour  "ob_state  normal".  La  colonne 
"attributs  interdits"  reprsentent les paramtres qui ne  doivent  JAMAIS 
tre  activs.  En fait,  il est conseill de n'activer que ceux  qui  sont 
indiqus  dans  les  autres  colonnes,    l'exception  ventuellement  des 
ob_states 'SELECTED' et 'DISABLED'.
Les  "ob_state  tendus" sont utiliss par  les  B_FRAMEs,  les  B_GRASTRs, 
B_POPUPs,  les  B_LISTs,  les B_HELPs,  les B_HIERMs,  les B_EDITs  et  les 
B_FNCPs.  Les B_DEFAULTs et les B_UNDOs les utilisent galement, mais d'une 
manire  un  peu  spciale sur laquelle nous  reviendrons  en  parlant  des 
formulaires placs en fentre.
Comme  il  a  dj t dit,  les 10 bits les plus forts  de  ob_state  sont 
d'utilisation libre.  BIG n'utilise en fait que l'octet  haut,  c'est-dire 
les 8 bits les plus forts.  En ce qui concerne les B_POPUPs,  les  B_LISTs, 
les  B_HELPs et les B_HIERMs,  nous l'utilisons dans BIG pour y  placer  le 
numro  (dans  le  fichier ressource) du formulaire  associ    ce  bouton 
(Attention, la numrotation commence  zro). Par exemple, si le formulaire 
n  12  doit  tre appel lors de la slection  d'un  bouton  B_HELP,  nous 
positionnons dans l'ob_state de ce bouton les bits 10 et 11.  En ne  tenant 
compte  que  de l'octet suprieur,  cela correspond   la  valeur  12.  Les 
routines  de BIG appelleront automatiquement ce formulaire et  s'occuperont 
de sa gestion.
Le  principe  est le mme pour les boutons pop_up et les  options  de  menu 
hirarchique.  Nous  crons dans l'diteur de ressource un bouton  (ou  une 
option  de  menu)  ayant  les  attributs  ci-dessus,  et  l'octet  haut  de 
l'ob_state contient le numro du formulaire pop-up associ  ce bouton.  Un 
mme formulaire peut tre associ  plusieurs boutons.
En  ce qui concerne les B_FNCPs,  c'est encore plus  simple,  puisque  nous 
n'avons  rien  faire  la cration du fichier ressource (sauf prciser  le 
type  tendu,  bien sr) !  Le principe est de placer dans l'octet haut  de 
l'ob_state tendu l'index correspondant du tableau de fonctions (il ne peut 
donc y avoir "que" 256 pointeurs sur fonction par application).  Mais  cela 
est fait automatiquement par BIG.  En effet,  les routines d'initialisation 
comptent le nombre d'objets ayant B_FNCP comme type tendu,  puis rservent 
une zone mmoire de taille adquate qui sera manipule comme un tableau  de 
pointeurs sur fonction.  Au programmeur de faire pointer chaque lment  de 
ce tableau sur une fonction du programme (Nous verrons comment en  tudiant 
le  source de la dmo,  chapitre 6).  Il y a deux rgles    respecter.  La 
premire  est  que  les pointeurs doivent tre  affects  aux  lments  du 
tableau dans le mme ordre que les objets apparassent dans le ressource.
Voyons  un  exemple.   Le  ressource  comporte  trois  arbres   :   "Menu", 
"Prfrences"  et  "Choix"  (dans cet  ordre).  Dans  "Menu",  deux  objets 
(numrots  15 et 23) sont des B_FNCPs.  Dans  "Prfrences",  deux  autres 
(numros 5 et 8),  et enfin 3 objets dans le formulaire "Choix" (numros 8, 
11 et 13).  C'est dans l'ordre croissant (15, puis 23 de "Menu" ; 5, puis 8 
de "Prfrences" ;  8,  11 puis 13 de "Choix") que les lments de tableaux 
leurs sont rservs.  Lorsque l'objet 11 de "Choix" sera cliqu,  c'est  la 
fonction  dont  le  pointeur est dans le 5 lment  du  tableau  qui  sera 
excute  (Puisque  c'est  le  6  objet  dans  l'ordre,   la  numrotation 
commenant  0).
La  seconde  rgle  est que la fonction doit tre du  type  'void  fonction 
(void)',  c'est--dire qu'elle ne peut recevoir aucun paramtre et ne  doit 
en retourner aucun (Il y a une astuce pour passer outre  cette contrainte, 
voyez le chapitre 7). Cette possibilit de faire pointer des objets GEM sur 
des  fonctions  est un des plus grands intrts de  BIG.  Les  sources  des 
programmes  diminuent  normment  grce    cela,   puisqu'il  n'est  plus 
ncessaire  d'effectuer  une srie de tests jusqu'alors  incontournables  : 
Quel type d'vnement s'est-t-il produit ?  Si c'est un clic  menu,  quelle 
option ? Si c'est un bouton de formulaire, quel bouton de quel formulaire ? 
etc...
Les   objets  B_FRAMEs  et  B_GRASTRs  utilisent  l'ob_state  tendu   pour 
dterminer  les attributs graphiques de la chane de la mme faon  que  la 
fonction 'vst_effect()' de la VDI. L'octet suprieur de l'ob_state contient 
l'attribut.
bit 0 : Gras
bit 1 : Clair
bit 2 : Italique
bit 3 : Soulign
bit 4 : Contour
Si le bit 3 est mis pour un objet B_GRASTR,  le trait de soulignement ne se 
limite pas  la largeur du texte, mais  la largeur de l'objet (ob_width).
Enfin,  l'ob_state  tendu  est utilis avec les B_EDITs pour  indiquer  le 
nombre de caractres qu'il est possible de saisir dans le champ ditable.

3.c Les menus pop-up
Les formulaires d'aide et de pop-up doivent rpondre  certains impratifs. 
Les aides sont de simples formulaires sans dialogue avec l'utilisateur. Ils 
ne  contiennent  en  principe  que du texte explicatif  et  des  cadres  de 
prsentation  (Les  B_FRAMEs et les B_GRASTRs peuvent  tre  employs).  Il 
doivent comporter au moins un objet de sortie :  SELECTABLE, DEFAULT, EXIT. 
Les   autres  types  de  boutons  (RBUTTON,   B_POPUP,   etc)  sont   grs 
automatiquement dans un formulaire d'aide, mais la routine d'aide elle-mme 
devra  tre rcrite si l'on dsire par exemple que l'affichage  de  l'aide 
dpende d'un Pop-Up. A moins que l'on utilise des pointeurs sur fonction.
Les formulaires pop-up ont l'aspect d'un menu droulant. L'objet racine est 
une  G_BOX SHADOWED dont le contour est large d'un pixel vers  l'extrieur. 
Il  y  a deux types de pop-ups :  le pop-up texte et le  popup  image.  Les 
options d'un pop-up texte sont des G_STRINGs TOUCHEXIT (ceci et ce qui suit 
est  galement  valable pour les formulaires destins   devenir  des  pop-
listes).  Les deux premiers caractres sont des espaces (comme dans un menu 
normal).   Si  certaines  options  doivent  tre  inactives,   la  G_STRING 
correspondante  doit  tre DISABLED.  Il est fortement  conseill  que  les 
numros  de ces G_STRINGs soient tris de haut en bas.  L'objet  "appelant" 
d'un pop-up texte est un G_BUTTON SHADOWED SELECTABLE. S'il possde en plus 
le  type  tendu  B_POPUP (22),  une petite icne  "option  suivante"  sera 
dessine  droite du bouton (ainsi que s'il s'agit d'un B_LIST).  Cela  est 
impossible avec un pop-up image.
Les options d'un pop-up image sont des G_IMAGEs. Elles doivent toutes avoir 
les  mmes  dimensions (ob_width et ob_height),  galement  les  mmes  que 
celles de l'objet G_IMAGE qui a appel le menu pop-up. Cet objet "appelant" 
doit  tre  SHADOWED  et SELECTABLE.  Comme  l'attribut  SHADOWED  n'a  pas 
d'influence sur l'aspect visuel d'une G_IMAGE, il est conseill (comme dans 
la   dmo),   de  la  placer  dans  une  G_BOX  SHADOWED,   puisque   c'est 
traditionnellement l'ombrage qui signale la prsence d'un pop-up.
L'utilisation  de ce formulaire est exactement la mme que celle d'un  menu 
droulant classique ( ceci prs que s'il est plus haut que le bureau,  BIG 
le transforme en scroll-menu). Le pop-up tente de se placer de manire  ce 
que le texte du bouton B_POPUP et celui de la G_STRING de mme texte (ou la 
G_IMAGE de mme motif) soit superposs.  Si cela n'est pas possible car  le 
pop-up sortirait de l'cran,  il est dcal d'autant.  Si le texte d'aucune 
G_STRING  (ou le motif d'aucune G_IMAGE) ne correspond,  le coin  suprieur 
gauche  du  pop-up est cal sur le coin infrieur  gauche  du  B_POPUP.  La 
G_STRING correspondante est "checke".  Pour fermer le pop-up sans faire de 
choix,  il suffit de cliquer  ct. Si une slection a t faite, le texte 
de  la G_STRING clique est report dans le bouton B_POPUP qui a appel  le 
pop-up (sans les espaces de dbut et de fin), ou le motif de la G_IMAGE est 
report  dans la G_IMAGE B_POPUP.  Il est donc impratif qu'au  dpart,  le 
texte  du  bouton  soit au moins aussi long que celui  de  la  plus  longue 
G_STRING,  dans le cas d'un pop-up texte, ou que toutes les G_IMAGEs soient 
de  mme  dimensions  dans le cas d'un pop-up image.  Il  est  possible  de 
raliser  un  pop-up avec plusieurs colonnes de G_STRINGs ou  de  G_IMAGEs. 
Mais elles doivent recouvrir entirement l'objet racine, comme dans un menu 
droulant.
Si  le pop-up a t chang en scroll-menu,  il sera plac par BIG  sous  le 
bouton  d'appel,    condition qu'il y ait la place pour  au  moins  quatre 
options et les deux flches de scroll.  Si ce n'est pas le cas,  le  pop-up 
partira de tout en haut du bureau.
D'autre  part,  les  pop-listes  sont places par  dfaut  sous  le  bouton 
d'appel. S'il n'y a pas assez de place, elles sont places au-dessus.

3.d Les boutons slectables
Les boutons B_COCHE et B_RADIO partagent le mme type tendu (B_SELEC). Ils 
sont en ralit de la mme catgorie :  SELECTABLE.  Leur seule  diffrence 
est  que les B_RADIOs sont des radio-boutons,  d'o leur  aspect  diffrent 
pour  mieux  les distinguer.  Ces boutons peuvent  comporter  un  caractre 
soulign.  Durant la gestion du formulaire, le raccourci clavier <Alternate 
+ caractre> sera quivalent  un clic sur ce bouton.  Lors de la  cration 
du  ressource,  le  caractre  souligner doit tre  prcd  d'un  crochet 
ouvert  ('[').  La  routine  de  dessin du bouton  se  chargera  du  reste. 
Attention,  si plusieurs boutons d'un mme formulaire ont le mme caractre 
soulign,  c'est  le premier (dans l'ordre de numrotation des objets)  qui 
sera  retenu  pour le raccourci clavier.  Il est possible que  ces  boutons 
quittent  la  gestion  du formulaire  (EXIT),  ou  qu'ils  soient  inactifs 
(DISABLED).  Dans ce cas,  le clic souris et le raccourci clavier sont sans 
effet.
Lors  de  la cration d'un de ces objets dans l'diteur  de  ressource,  la 
largeur  du  G_BUTTON  ne correspond pas forcment  la  largeur  qui  sera 
occup  "physiquement" par l'objet dessin dans le formulaire,  puisque  le 
carr  ou  le  cercle est ajout  gauche du  texte.  Voici  un  conseil  : 
commencez par crer le bouton  la taille minimum,  c'est--dire la largeur 
du texte.  Activez l'option de grille de l'diteur de ressource (La  grille 
horizontale a normalement un pas de 8 pixels).  Augmentez alors la  largeur 
de ce bouton de trois "units" s'il n'y a pas de caractre soulign,  et de 
deux  s'il  y  en a un.  Ainsi,  la largeur du  bouton  dans  l'diteur  de 
ressource  est le reflet de la largeur qu'il aura une fois dessin par  les 
fonctions BIG.
Les  B_POPUPs  n'ont pas forcment de type tendu.  Le  type  optionnel  22 
permet d'avoir automatiquement une petite icne "option suivante" en  forme 
de flche circulaire  droite du bouton.  Par contre, il est obligatoire de 
lui donner l'attribut SHADOWED,  c'est lui en fait un pop-up.  Les  boutons 
B_LIST ont toujours l'icne "option suivante".
Le  type tendu des boutons B_HELP n'ont pas non plus d'influence sur  leur 
aspect.  Leur dessin est laiss au soin des routines GEM normales.  Ce type 
tendu sert  les distinguer dans le formulaire lors d'une pression sur  la 
touche Help. Si plusieurs objets possdent ce type tendu, c'est le premier 
qui  sera  retenu.  Il peut tre utile d'en avoir plusieurs  dans  le  mme 
formulaire.  Le premier formulaire d'aide pourra tre appel par la  touche 
Help,  les autres uniquement par clic souris.  Cela a l'avantage de laisser 
la  gestion  du  formulaire d'aide aux routines  BIG,  par  le  systme  de 
l'ob_state  tendu expliqu plus haut (c'est ce qui est fait dans  la  dmo 
pour le formulaire d'informations).
Les B_UNDOs ont un type tendu qui sert  la fois  les reprer lors  d'une 
pression  sur la touche <Undo> et  leur donner la possibilit  d'avoir  en 
plus un quivalent clavier par caractre soulign.
Les B_DEFAULTs n'ont pas de type tendu,  l'attribut DEFAULT est  suffisant 
pour les reprer lors d'une pression sur <Return>.  Toutefois,  ils peuvent 
avoir en plus le type tendu B_UNDER pour disposer d'un quivalent  clavier 
par caractre soulign.
Comme  nous  l'avons rapidement vu dans la visite guide  de  BIGdemo,  les 
formulaires  en  fentre  possdent  4  boutons  de  base   :   'Applique', 
'Confirme',  'R.A.Z.'  et  'Annule'  (vous  pouvez  videmment  les  nommer 
autrement).  Selon  les prfrences du programmeur,  ce sera soit la  paire 
'Applique'  et  'R.A.Z.',  soit la paire 'Confirme' et  'Annule'  qui  sera 
active par les touches <Return> et <Undo>.  La valeur '1' (le premier bit) 
doit  tre  place dans l'octet haut de l'ob_state des objets  qui  doivent 
entraner la fermeture de la fentre.
Par  exemple,  dans les formulaires en fentre de  BIGdemo,  'Applique'  et 
'R.A.Z.'  sont  activables   partir du  clavier.  'Confirme'  et  'Annule' 
ncessite un clic souris,  mais ferment automatiquement la fentre.  Fates 
l'exprience  d'oter  les attributs B_DEFAULT et B_UNDO des  deux  premiers 
pour les affecter aux deux autres,  et la fentre pourra tre ferme par le 
clavier.  On  peut  envisager  dans  un programme de  laisser  le  choix   
l'utilisateur de quelle paire de boutons peut tre active par le  clavier, 
en  modifiant  les attributs correspondants dans le ressource  en  mmoire, 
tout  en  choisissant  une  configuration  par  dfaut    la  cration  du 
ressource.

3.e Les ditables tendus
Les  objets B_EDIT sont des champs ditables "tendus",  qui autorisent  la 
saisie de plus de caractres que la largeur apparente du champ ne le laisse 
supposer. Par exemple, l'ditable lui-mme peut tre large de 15 caractres 
(largeur de la chane pvalid),  mais le texte peut avoir une longueur  plus 
importante, jusqu' 255 caractres.
Le  nombre  de  caractres  autoriss est  indiqu  dans  l'octet  haut  de 
l'ob_state.  Il  est impratif de placer les flches de part et d'autre  du 
champ,  de  la manire suivante (les flches sont reprsentes ici par  les 
caractres '<' et '>' au lieu des caractres Ascii 4 et 3) :
Texte : < _______________ >
Le  champ est prcd d'une flche  gauche et d'un espace,  il  est  suivi 
d'un  espace  et d'une flche  droite.  Ces flches  permettent  de  faire 
dfiler  le  texte    la souris.  La routine de  placement  du  curseur   
l'emplacement  du clic (lorsqu'on clique dans le champ) tient  compte  dans 
ses calculs de la prsence de ces flches s'il s'agit d'un objet B_EDIT. Si 
vous ommettez la flche de droite et son espace, le curseur sera positionn 
deux caractres  gauche de la position clique.
D'autre part, lors de la saisie des caractres, BIG considre que la chane 
pvalid  (le filtre de saisie) est actif pour la partie apparente du  texte. 
Il faut donc rserver les B_EDIT aux ditables constitus de caractres  de 
mme   type.   Par  exemple  la  chane  p_valid  sera   "XXXXXXXXXXX"   ou 
"9999999999".  Si elle est constitue de plusieurs filtres  diffrents,  on 
aura de mauvaises surprises  la saisie.

3.f Dplacer le formulaire
Les  boutons B_MOVE permettent de dplacer le formulaire  sur  l'cran.  Ce 
dplacement peut se faire "en temps rel", c'est--dire que c'est une image 
du  formulaire lui-mme que l'on dplace jusqu' la nouvelle  position,  ou 
simplement par une "bote fantme"  ses dimensions.  Toutefois, s'il n'y a 
pas  assez  de mmoire disponible pour travailler en  temps  rel  (l'cran 
entier doit tre sauv dans un buffer),  le systme de la bote fantme est 
automatiquement utilis,  mme si le dplacement en temps rel est  demand 
lors de l'appel de la fonction.  Il est possible de forcer l'utilisation de 
la bote fantme au lieu du temps rel mme s'il y a assez de mmoire.
Lorsqu'on  clique ce bouton,  et que l'on garde le bouton enfonc,  il  est 
possible  de  dplacer le formulaire.  Quand la  souris  est  relche,  le 
formulaire est "pos" au nouvel emplacement. Les dplacements du formulaire 
(ou de la "bote fantme") se font dans les limites du bureau,  moins trois 
pixels  sur chaque bord,  afin de compenser l'attribut OUTLINED  qu'ont  la 
plupart de temps les objets-racine des formulaires.

3.g Du texte graphique
Les B_FRAMEs sont des G_BUTTONs.  Seul leur type tendu les  distingue.  Le 
ct suprieur du cadre sera trac  une demi hauteur de caractre plus bas 
que  l'emplacement  du  bouton  lors  de  sa  cration  dans  l'diteur  de 
ressource.  Le  texte  sera   cheval sur cette ligne,    une  largeur  de 
caractre du bord gauche. L'ob_state tendu sert  dterminer les attributs 
graphiques de ce texte.
Les B_GRASTRs peuvent tre des G_STRINGs ou des G_BUTTONs. Le type G_BUTTON 
est  conseill,  car  il  permet de mieux  visualiser  (dans  l'diteur  de 
ressource)  la largeur de l'objet (qui est utilise si le texte  doit  tre 
soulign).

3.h Le relief
BIG permet de donner aux formulaires un aspect "3D" de manire plus  simple 
que le nouvel AES.  La "mthode BIG" est compatible avec les spcifications 
de  l'AES,  qui  utilise les bits 9 et 10 de  l'ob_flags  des  objets.  BIG 
n'utilise et ne teste que le bit 10,  nomm "BackGround" (fond), qui sert  
accorder  l'aspect de l'objet (notamment sa trame et sa couleur) avec  ceux 
de l'objet situ sous lui.
Pour raliser un formulaire 3D avec BIG, deux cas sont  distinguer : si on 
est  en  16 couleurs ou plus,  et si on est en 2 ou  4  couleurs.  Dans  le 
premier  cas,  le  plus bel effet est obtenu lorsque l'objet-racine  a  une 
trame   100 % et la couleur numro 8,  qui est dfinie comme  gris  clair. 
Dans le second cas,  le mieux est de renoncer au relief.  Il y a  toutefois 
une  possibilit de le simuler,  mais l'effet n'est gure esthtique  :  il 
faut  donner une trame  l'objet-racine (la trame  50 %  est  recommande) 
quitte  la changer pour du 100 % gris s'il y a assez de couleurs (c'est ce 
que fait la dmo).  Ensuite,  dans les deux situations, cela dpend du type 
d'objet  BIG  (jetez un coup d'il aux formulaires de la  dmo  pour  mieux 
comprendre les explications qui suivent) :
Le  texte  des objets de type B_SELECT (les B_RADIOs et les  B_COCHEs)  est 
toujours crit en mode transparent, donc ils seront toujours en accord avec 
la  trame place dessous.  D'autre part,  les dessins du petit rond  ou  du 
petit  carr donnent au moyen d'une ombre l'illusion qu'ils  sont  "sortis" 
quand  ils ne sont pas slectionns,  et qu'ils sont "enfoncs"  quand  ils 
sont  slectionns.  Il n'y a donc rien  faire de particulier pour  placer 
ces objets dans un formulaire 3D.
Les B_GRASTRs doivent avoir le bit BackGround positionn.  Dans ce cas,  le 
texte  est transparent,  et le trait de soulignement noir est doubl  d'une 
ligne blanche dcale,  pour donner une impression de relief.  Sur un  fond 
tram,  il est dconseill de donn  ces textes l'attribut Italique. Si le 
bit n'est pas mit, le texte est en mode opaque.
De  mme,  les  B_FRAMEs  sont  normalement  des  rectangles  blancs,  mais 
deviennent un cadre transparent s'il y a BackGround.  Le trac de ce  cadre 
est  galement  doubl  de  lignes  blanches  dcales.  Le  texte  devient 
transparent (mme remarque  propos de l'Italique).
Les  B_UNDERs  et les B_UNDOs deviennent transparents en  3D.  Les  boutons 
B_DEFAULT n'tant pas des G_USERDEFs, ils sont dessins normalement, c'est-
-dire blancs opaque.  L'astuce est de leur donner le type B_UNDER mme  si 
on  ne souhaite pas leur affecter de raccourci clavier,  et de  positionner 
leur bit BackGround.
Les  B_POPUPs  (ayant  le  type  tendu  22)  et  les  B_LISTs   deviennent 
transparents grce au bit BackGround et sont agrments de lignes  blanches 
sur les cts gauche et haut s'ils ne sont pas slectionns,  sur les cts 
droit et bas s'il le sont.
Enfin,  les objets ditables (mme s'ils ne sont pas B_EDITs) ayant un  bit 
BackGround  sont transforms en G_FBOXTEXTs (si ce n'taient pas  le  cas), 
ventuellement  sans cadre,  transparents.  Mais leur dessin restent    la 
charge du GEM.  Il ne suffit pas de leur donner l'attribut transparent, car 
s'il  s'agit  de  G_FTEXTs,  le  GEM gre l'dition  du  texte  de  manire 
incorrecte.
La  mthode de la trame 100 % et de la couleur n 8 ne marche pas en  moins 
de 16 couleurs,  car cette couleur devient alors noire.  On peut tester  au 
dbut  du programme le nombre de couleurs.  S'il n'y en a pas 16,  il  faut 
tramer  tous  les objets concerns,  ou les mettre en blanc (plus  de  3D). 
Sinon, on les mets en gris.
Dernier point. Un bouton DISABLED a un texte affich en gris, c'est--dire 
en trame 50 %. Sur un fond de trame de mme pourcentage et de mme couleur, 
les pixels du texte et ceux du fond peuvent soit concider exactement, soit 
tre exactement alterns.  Dans le premier cas,  le texte disparatra de la 
vue, et dans le second il paratra normalement crit. Il vaut mieux tre au 
courant de ces illusions d'optique !

3.i Les menus hirarchiques
Les  B_HIERMs  sont imprativement rservs aux G_STRINGs  des  options  de 
menu. L'ob_state tendu contient le numro du formulaire pop-up qui est li 
 cette option.  La gestion du menu hirarchique mrite qu'on s'y arrte un 
peu pour des explications.
Un dlai d'environ une demi seconde est respect, puis, si le curseur de la 
souris  est  toujours sur cette option du menu,  le sous-menu  est  affich 
(ventuellement transform en scroll-menu s'il est trop haut).  Le problme 
suivant se pose alors : Si la souris est amene sur un autre titre de menu, 
le menu correspondant est automatiquement droul par le GEM !  Evidemment, 
ce menu risque de se placer "par dessus" le menu hirarchique. Il ne sert  
rien   de   tenter  de  supprimer  la  gestion  du   menu   principal   par 
wind_update(BEG_UPDATE) ou menu_bar(0),  car alors le menu contenant  notre 
B_HIERM disparat !  La seule solution semble tre la suivante  (contactez-
moi si vous avez une autre ide) : le menu hirarchique est referm ds que 
le  curseur  de  la souris passe  "au-dessus",  c'est--dire  qu'il  a  une 
position  en  y infrieure au haut du sous-menu.  Il est donc  interdit  de 
placer  un menu hirarchique comme premire option d'un menu,  car ce  "au-
dessus"  correspondrait    l'entre  dans  la  barre  de  menu,   et  nous 
retrouverions le mme problme :  un nouveau menu pourrait tre droul sur 
le menu hirarchique.
D'autre part,  bien que l'option du menu soit un Userdef,  le GEM prend  la 
fcheuse  initiative de la considrer dslectionne ds que le curseur  de 
la  souris  la quitte pour passer sur le  menu  hirarchique.  La  fonction 
charge de dessiner cette option en normal ou en invers effectue toute une 
srie de tests et dcide en fonction du contexte (sous-menu affich ou non) 
et  de la position de la souris (sur cette option,  sur une  autre,  sortie 
cot sous-menu, sortie autre cot, place au-dessus, etc) comment elle doit 
tre dessine, et force ventuellement le bit SELECTED.
Toutes  ces  considrations ne s'appliquent qu'aux menus  hirarchiques  du 
menu  principal.  Dans le cas des menus en fentre,  la situation est  plus 
simple.  En effet,  ce n'est pas le GEM qui gre cette barre de menu, c'est 
une fonction de BIG. Si le curseur de la souris passe sur un autre titre de 
menu  alors qu'un menu hirarchique est droul,  cette fonction  prend  la 
peine de le refermer avant d'afficher le nouveau menu.  De ce fait,  il est 
possible  de placer un menu hirarchique associ  la premire option  d'un 
menu  de  fentre.  Toutefois,  pour conserver une certaine  homognit   
l'ensemble, les sous-menus disparaissent galement dans le cas des fentres 
ds que la souris passe "au-dessus".
L'option  de menu B_HIERM doit tre complte par des espaces sur toute  sa 
largeur.  En effet,  BIG place en avant-dernier caractre une petite flche 
dirige vers le cot o va se drouler le menu hirarchique (Ascii 3 ou 4). 
Dans  le cas du menu principal,  la fonction d'initialisation se charge  de 
l'opration  une  bonne  fois  pour  toutes  au  dbut  de  l'excution  du 
programme.  Si  votre application possde plusieurs barres  de  menu,  vous 
devrez  appeler  vous-mme  la fonction create_hierm()  (voir  le  chapitre 
5.b.2)   chaque changement de menu (si le nouveau menu ne possde  pas  de 
B_HIERM, c'est inutile). Dans le cas des menus de fentre, BIG se charge de 
l'opration  chaque fois qu'un menu doit tre droul,  puisque la fentre 
a  pu  tre dplace depuis le dernier calcul.  De plus,  si  le  sous-menu 
risque  de  sortir de l'cran par le bas,  il est dcal d'autant  vers  le 
haut, ou chang en scroll-menu s'il est vraiment trop haut. Cela ne se fait 
que  pour  les menus en fentre.  Pour le menu principal il n'y  a  pas  de 
dcalage,  seulement  une  mise en scroll si le menu hirarchique  sort  du 
bureau par le bas.

3.j Les formulaires Toolbar
Ce type de formulaire est cr comme n'importe quel autre. Toutefois, il ne 
doit  comporter aucun objet EXIT ou TOUCHEXIT,  ni de champ  ditable.  BIG 
n'effectue aucun test de contrle dans ce sens.  Les autres types  d'objets 
sont autoriss et grs comme partout ailleurs (raccourcis clavier, pop-ups 
et pop-listes, radio-boutons, etc). Nous verrons plus loin comment utiliser 
les toolbars.  Mais n'oublions pas que ces formulaires doivent tre le plus 
petit possible en hauteur afin de ne pas trop rduire la surface de travail 
de la fentre.  Leur objet-racine sera largi par BIG  la largeur  maximum 
de la fentre, mais ils ne pourront pas tre dcals comme c'est le cas des 
menus  en fentre.  Evitez donc de placer les options les  plus  couramment 
utilises vers la droite, car elles sont inaccessibles lorsque la taille de 
la fentre est rduite.

3.k Les raccourcis clavier
Dans  les  options  de menu,  l'inscription  des  raccourcis  clavier  doit 
rpondre  certains impratifs.  Pour ne pas en alourdir la  gestion,  j'ai 
pris  le  parti de ne pas permettre d'quivalents  clavier  comportant  des 
touches de fonction,  ni des combinaisons faisant appel  plusieurs touches 
spciales, comme <Shift + Control> par exemple. Ces raccourcis sont en fait 
rarement utiliss dans la pratique,  de sorte que cela ne devrait pas  tre 
trop  contraignant.  D'ailleurs,  la  recommandation  gnrale  en  ce  qui 
concerne  ce  point est de placer dans les menus des  raccourcis  utilisant 
uniquement  la touche <Control>,  la touche <Alternate> tant rserve  aux 
quivalents clavier dans les formulaires. D'autre part, les raccourcis sans 
touche spciale (directement le caractre) ne sont pas autoriss,  pour  le 
pas crer de conflit avec des options du genre "Texte 1".
BIG  ne  tient  pas compte des espaces de remplissage  qui  peuvent  suivre 
l'inscription du raccourci clavier. Le dernier caractre "rel" de l'option 
de  menu  est donc le caractre qui doit tre  press,  et  l'avant-dernier 
caractre est soit '^' pour la touche <Control>,  soit le caractre Ascii 7 
(un  losange  dans  un  rectangle) pour  la  touche  <Alternate>,  soit  le 
caractre Ascii 1 (la flche vers le haut) pour la touche <Shift>.
La  routine de recherche des raccourcis clavier ne fait pas  la  diffrence 
entre  les  majuscules et les minuscules (ni dans les menus,  ni  dans  les 
formulaires).  Elle ne diffrencie pas non plus la touche <Shift droit>  de 
la touche <Shift gauche>.
Etant donn que la recherche s'effectue dans le ressource en mmoire et  en 
fonction  du  code Ascii de la touche presse,  la gestion  des  raccourcis 
clavier  est indpendante du type de  clavier  (Azerty,  Qwerty,  etc),  et 
dpendante  de  l'quivalent  plac  dans  l'option  correspondante.   Pour 
modifier  un  raccourci clavier d'un programme sous BIG,  il suffit  de  le 
modifier dans le fichier ressource. Sans devoir recompiler le programme, le 
nouvel  quivalent  clavier sera actif  immdiatement.  Nous  pouvons  donc 
envisager  la  prsence  d'une option (ou  d'un  petit  programme  externe) 
permettant    l'utilisateur  de reconfigurer  entirement  l'interface  du 
logiciel  en fonction de ses prfrences personnelles.  Il aurait ainsi  la 
possibilit  d'affecter  aux  options  qu'il utilise  le  plus  souvent  un 
quivalent  clavier  ralisable  d'une  seule  main,   ou  plus  facilement 
mmorisable.
Selon  le contexte,  la recherche de correspondance entre une option ou  un 
bouton  et le raccourci clavier effectu se fait selon certaines rgles  de 
priorit.  Le  cas le plus simple est celui o un formulaire ordinaire  est 
affich.  Le menu droulant est alors inactif. La recherche se fait dans le 
formulaire seulement.
Si  la fentre de premier plan est une fentre ordinaire,  la recherche  se 
fait  dans le menu uniquement (et ses menus hirarchiques).  Si  c'est  une 
fentre avec formulaire ou toolbar, et que ce formulaire ne comporte pas de 
champs  ditables,  la recherche est fate en priorit dans le  menu,  puis 
elle continue (si rien n'a t trouv) dans le formulaire ou la toolbar  de 
la  fentre.  Si  le  formulaire de la fentre  comporte  un  ou  plusieurs 
champ(s) ditable(s), la recherche est fate uniquement dans le formulaire. 
Si la fentre comporte un menu,  c'est ce menu (et ses menus hirarchiques) 
qui ont priorit.  La recherche se poursuit ensuite dans le menu principal. 
Il  est  impossible d'avoir une fentre contenant  la fois  un  menu,  une 
toolbar et un formulaire ou toute combinaison deux  deux de ces  lments. 
BIG  ne  le  permet pas,  et il faut avouer que  cela  n'aurait  pas  grand 
intrt.


4. Le travail avec les fentres
BIG  prend en charge 95 % du travail sur les fentres.  Il les  ouvre,  les 
ferme,   les  manipule  entirement  (redraws,   dfilement,   dplacement, 
redimensionnement,  icnisation,  etc), et gre une quantit "illimite" de 
fentres par application. Entendons-nous bien : le GEM ne permet d'afficher 
qu'un nombre limit de fentres simultanment  l'cran (7 sur les  anciens 
TOS,  davantage    partir de la version 4).  BIG ne  peut  franchir  cette 
limite,  mais  il  ralise une gestion interne des  fentres  qui  existent 
toujours  dans la mmoire une fois qu'elles ont t refermes sur  l'cran. 
Un  logiciel  peut  donc  travailler virtuellement  avec  des  dizaines  de 
fentres, la seule limite tant la quantit de mmoire disponible.
En  ce  qui  concerne l'icnification  des  fentres,  le  nouvel  attribut 
"SMALLER"  est  dfini  comme prvu par l'AES  4.10  par  "#define  SMALLER 
0x4000".  La  dclaration  du  SMALLER dans  les  attributs  d'une  fentre 
entrane  l'apparition d'un nouveau bouton sur les nouveaux  systmes.  Sur 
les anciens,  cela n'a aucun effet ni aucune  concquence.  Toutefois,  BIG 
utilise et teste ce bit qui doit donc tre mit ou non selon qu'on dsire ou 
non donner  une fentre la possibilit d'tre icnifie.  Nous reparlerons 
de cela dans les chaptres 5.a.4 "Les dfinitions" et 10 "L'icnisation des 
fentres"..

4.a Concept des fentres BIG
Sous   GEM,   on   commence  par  crer  la  fentre  (avec   la   fonction 
wind_create()),  puis on l'ouvre (wind_open()) pour afficher quelque  chose 
dans  sa zone de travail.  GEM tient  jour des tableaux de donnes qui  le 
renseignent   n'importe quel moment sur une fentre donne.  BIG  fait  la 
mme chose,  mais ses tableaux contiennent beaucoup plus d'informations, et 
le nombre de tableaux (donc de fentres) n'est pas limit.
Pour  tre  prcis,  il  s'agit d'un tableau  de  structures.  C'est  cette 
structure  'BigWind' qui contient toutes les informations ncessaires   la 
gestion  des fentres par BIG.  Les routines d'initialisation du  programme 
rservent  ds  le  dbut  de l'excution une zone  mmoire  de  la  taille 
ncessaire  pour  le  nombre  de  fentres  qui  seront  utilises  par  le 
programme.  De sorte que nous n'avons qu'une seule variable globale (nomme 
'win'),  qui est de la forme "BigWind *win", c'est--dire "pointeur sur une 
structure BigWind".  A partir de l, nous pouvons accder  la structure de 
n'importe quelle fentre comme s'il s'agissait d'un tableau.  Par  exemple, 
la structure contenant les informations relatives  la troisime fentre se 
trouve  l'adresse "win[2]" (puisque la numrotation commence  0).
Voici cette structure, les dtails suivent...

typedef struct BigWind {  /* DEFINITION D'UNE FENETRE */
  int w_hg;         /* Handle GEM (ou -1 ou 0) */
  int w_type;       /* Type BIG de la fenetre */
  int w_attr;       /* Attributs (wind_create) */
  GRECT w_curr;     /* Coordonnees courantes de la fenetre */
  Oldw w_old;       /* Coordonnees avant iconification */
  int w_wmini;      /* Largeur minimum */
  int w_hmini;      /* Hauteur minimum */
  int w_wunit;      /* Unite de decalage horizontale */
  int w_hunit;      /* Unite de decalage verticale */
  Cont w_cont;      /* Selon le contenu de la fenetre */
  Palette *w_pal;   /* Pointeur sur la palette associee */
  OBJECT *w_bar;    /* Si fenetre avec menu ou toolbar : adresse arbre */
  int w_flags;      /* Pleine ouv., Clavier, Redraw, Calage, Derniere. */
  int w_mouse;      /* Forme de souris dans la fenetre */
  int w_icon;       /* Iconification : index fenetre associee */
  FNCP w_redicn;    /* Routine de redraw si fenetre iconifiee */
  FNCP w_redraw;    /* Routine de redraw normale */
  FNCP w_top;       /* Routine de premier plan */
  FNCP w_close;     /* Routine de fermeture */
  FNCP w_move;      /* Routine fenetre deplacee */
  FNCP w_size;      /* Routine redimensionnement */
  FNCP w_full;      /* Routine pleine ouverture */
  FNCP w_hslid;     /* Routine slider horizontal */
  FNCP w_vslid;     /* Routine slider vertical */
  FNCP w_uppage;    /* Routine page haut */
  FNCP w_dnpage;    /* Routine page bas */
  FNCP w_lfpage;    /* Routine page gauche */
  FNCP w_rtpage;    /* Routine page droite */
  FNCP w_upline;    /* Routine ligne haut */
  FNCP w_dnline;    /* Routine ligne bas */
  FNCP w_lfline;    /* Routine ligne gauche */
  FNCP w_rtline;    /* Routine ligne droite */
  char *w_title;    /* Pointeur sur titre de la fenetre */
  char *w_infos;    /* Pointeur sur infos de la fenetre */
  long w_wtot;      /* Largeur maxi contenu fenetre */
  long w_htot;      /* Hauteur maxi contenu fenetre */
  long w_lin;       /* 1 ligne de la fenetre */
  long w_col;       /* 1 colonne de la fenetre */
} BigWind;

L'lment 'w_curr' est une sous-structure GRECT,  dfinie comme ceci par le 
fichier AES.H :
typedef struct
{
  int g_x;  /* Coordonnee en x */
  int g_y;  /* Coordonnee en y */
  int g_w;  /* Largeur */
  int g_h;  /* Hauteur */
} GRECT;
L'lment 'w_old' une sous-structure Oldw,  utilise pour "mettre de  ct" 
les  coordonnes et les attributs de la fentre lorsqu'elle est  icnifie, 
afin de pouvoir les restaurer ensuite :
typedef struct oldw { /* DONNEES FENETRE ICONIFIEE */
  GRECT w_coord;  /* Coordonnees */
  int w_att;      /* Attributs */
} Oldw;
L'lment 'w_cont' est une union :
typedef union cont {  /* DEFINITION DU CONTENU D'UNE FENETRE */
  Form w_form;  /* Si fenetre formulaire */
  MFDB w_img;   /* Bloc d'informations si image */
  char *w_adr;  /* Si texte ou autre, adresse donnees */
} Cont;
Cette union est elle-mme compose d'une sous-structure :
typedef struct form { /* DEFINITION FENETRE FORMULAIRE */
  OBJECT *w_tree;   /* Adresse arbre */
  int w_edit;       /* Editable courant */
  int w_pos;        /* Position du curseur */
  char *w_bak;      /* Sauvegarde etat formulaire */
} Form;
Le  dernier lment de l'union,  'w_adr',  est un simple pointeur  sur  des 
donnes.   Si  la  fentre  contient  du  texte,   il  pourra  le  dsigner 
directement, sinon il pourra pointer sur une zone dcrivant ces donnes.
Le type Palette est dfini ainsi :
  typedef int Palette[3];
Enfin (ouf !),  voici la dfinition du type 'FNCP',  qui signifie "FuNCtion 
Pointer" :
  typedef void (*FNCP)(void);



4.b La structure BigWind
Voil  les  dtails promis,  la description lment par  lment  de  cette 
structure.   Tous  les  noms  d'lments  commencent  par  'w_'  pour   les 
distinguer.  Je vous conseille d'viter de donner  vos variables des  noms 
commenant  par les mmes caractres.  Pour chaque  lment,  j'indique  la 
signification  mnmonique  de  son  nom,  qui sert    s'en  souvenir  plus 
facilement, ainsi que la valeur attribue  l'initialisation.

int w_hg
     "Handle Gem".  Pour accder  une fentre,  BIG utilise  naturellement 
     les  appels  GEM.  Il est donc indispensable de le  conserver  quelque 
     part.  A l'initialisation,  cet lment contient '-1' (qui est  dfini 
     sous  le  label 'BLANK' dans le fichier BIG.H).  Cela indique  que  la 
     fentre n'a jamais t ouverte.  Ds qu'elle est cre et ouverte,  il 
     contient le handle GEM de la fentre.  Mais lorsqu'elle est  referme, 
     sa valeur n'est pas remise  '-1' mais  '0', ce qui indique qu'elle a 
     t cre, puis dtruite par le GEM, mais qu'elle existe toujours pour 
     BIG. Les valeurs contenues dans les autres lments de la structure ne 
     sont  donc plus des valeurs par dfaut,  mais elles  reprsentent  les 
     paramtres  de la fentre,  qui entreront de nouveau en action  si  la 
     cration de cette fentre est de nouveau demande au GEM.
int w_type
     "TYPE de la fentre". Il s'agit du type du point de vue de BIG. Il y a 
     plusieurs types de base. Les voici avec leurs labels de dfinitions :
     WTYP_PICT (3) La fentre contient une image. BIG se charge de tout.
     WTYP_FORM  (2)  La fentre contient un formulaire.  BIG se  charge  de 
     tout.
     WTYP_NORM  (1) La fentre est "normale",  elle contient  autre  chose, 
     probablement  du  texte.   Le  programmeur  doit  crire  la   routine 
     d'affichage, BIG se charge du reste.
     WTYP_TOOL  (0x4000)  Sauf  dans  le  cas  WTYP_FORM   (interdit),   le 
     quatorzime bit de w_type indique que la fentre contient une toolbar.
     WTYP_MENU (0x8000) Sauf dans le cas WTYP_FORM (interdit), le quinzime 
     bit de w_type indique que la fentre contient un menu.  Une fentre ne 
     peut avoir  la fois une toolbar et un menu.  BIG ne vrifie pas, mais 
     donne la priorit au menu. A l'initialisation : WTYP_NORM par dfaut.
int w_attr
     "ATTRibuts".  Il  s'agit des attributs GEM de la fentre  (ascenseurs, 
     barre de dplacement,  etc) qu'on indique  la fonction wind_create(). 
     Plusieurs  jeux  d'attributs sont dfinis par BIG pour  simplifier  le 
     travail :
     WATR_ALL  (NAME | CLOSER | FULLER | MOVER | INFO | SIZER |  UPARROW  | 
     DNARROW  |  VSLIDE | LFARROW | RTARROW | HSLIDE |  SMALLER)  Tous  les 
     attributs sont activs.
     WATR_CURR ((NAME | CLOSER | FULLER | MOVER | SIZER | UPARROW | DNARROW 
     |  VSLIDE | LFARROW | RTARROW | HSLIDE | SMALLER)) Les  attributs  les 
     plus couramment utiliss, c'est--dire tous sauf la ligne d'infos.
     WATR_FORM  (NAME  | CLOSER | MOVER | SMALLER)  Rserv  aux  fentres-
     formulaires normales (le formulaire n'est pas plus grand que l'cran). 
     Seuls  le  nom de la fentre,  le bouton de  fermeture,  la  barre  de 
     dplacement  et  l'icnification sont  actifs.  A  l'initialisation  : 
     WATR_CURR par dfaut.
GRECT  w_curr
     Coordonnes  et dimensions courantes de la fentre.  Ces  informations 
     sont mises  jour  chaque changement de taille ou d'emplacement de la 
     fentre. A l'initialisation : 0, 0, 100, 100.
Oldw  w_old
     Enregistrement  des coordonnes et des attributs d'une  fentre  avant 
     icnification, afin de les restituer au moment de la dsicnification.
int w_wmini, w_hmini
     Largeur  et  Hauteur  minimum  de  la  fentre.  Si  on  tente  de  la 
     dimensionner      des   valeurs   infrieures,    BIG   corrige.    A 
     l'initialisation : 100, 100.
int w_wunit, w_hunit
     Units de dcalage horizontale et verticale de la fentre,  en pixels. 
Lors  d'un clic sur une des flches de dfilement,  le contenu  est  dcal 
dans  la  direction demande de cette valeur.  Pour  du  texte,  ce  serait 
respectivement  la  largeur et la hauteur d'une  cellule  de  caractre.  A 
l'initialisation : 1, 1.
Cont w_cont
     "CONTenu  de la fentre".  Fix  '0L' lors de  l'initialisation,  cet 
     lment est en fait une union. Il dpend de ce qui est affich dans la 
     fentre. Voici dcrit les lments de cette union :
Form w_form
     "FORMulaire".  Si  la fentre contient un formulaire,  w_cont est  une 
     structure 'Form', dfinie par BIG. En voici la description :
OBJECT *w_tree
     Adresse du formulaire.
int w_edit
     Si  le  formulaire contient un (ou  plusieurs)  champ(s)  ditable(s), 
     numro d'objet du champ o se trouve le curseur. -1 sinon.
int w_pos
     Si  le  formulaire contient un (ou  plusieurs)  champ(s)  ditable(s), 
     position du curseur dans le champ courant. -1 sinon.
char *w_bak
     BIG  est  en  mesure  de  grer  les  boutons  'Confirme',   'Annule', 
     'Applique'  et  'R.A.Z.'  des formulaires,  en  restaurant  l'tat  du 
     formulaire en cas d'annulation ou remise  zro.  Ce pointeur  indique 
     la zone de sauvegarde de l'tat du formulaire.
Suite de l'union 'Cont' :
MFDB w_img
     "IMaGe".  Si la fentre contient une image,  w_cont est un 'MFDB'.  Le 
     MFDB (Memory Form Definition Block) est une structure standardise  de 
     la VDI,  qui contient toutes les informations ncessaires  la gestion 
     d'une  image  (son  adresse,  ses  dimensions,  etc).  Grce    cette 
     standardisation,  BIG  peut s'occuper intgralement de l'affichage  de 
     l'image dans la fentre, sans intervention du programme lui-mme.

Suite de l'union 'Cont' :
char *w_adr
     Si  la  fentre  ne contient ni une  image,  ni  un  formulaire  (elle 
     contient  alors probablement du texte ou un  graphisme  calcul),  cet 
     lment  est  un  pointeur sur char qui indique le dbut  de  la  zone 
     mmoire  o  sont  stockes  les  donnes  (le  texte).   La   routine 
     d'affichage  de  cette fentre pourra alors les  trouver  directement, 
     quelque soit la fentre courante.

Revenons  la structure principale :
Palette *w_pal
     "PALette".  Cet lment est un pointeur sur une zone de n fois 3  int, 
     'n' tant le nombre de couleurs affichables. Chacun des 3 mots dfinie 
     les  valeurs  de rouge,  vert et bleu de la  couleur.  Ainsi,  il  est 
     possible d'assico une palette de couleur  chaque fentre.  Cela  est 
     presque  indispensable pour les fentre d'images,  mais peut  s'avrer 
     utile  pour d'aurtes fentres.  Si cet lment pointe  sur  ZERO,  BIG 
     active la palette par dfaut. Pointe sur ZERO  l'initialisation.
OBJECT *w_bar
     "BARre".  Si  la  fentre contient une barre de menu ou  une  toolbar, 
     adresse de l'arbre de ce menu.
int w_flags
     Cet lment est un masque de bits. Voici sa description :
     Bit 0 : WFFULL (Window flag FULL)
     Bit 1 : WFARROW (Window Flag ARROW)
     Bit 2 : WFREDRAW (Window Flag REDRAW)
     Bit 3 : WFBOUND (Window Flag BOUNDary)
     Bit 4 : rserv
     Bit 5 : rserv
     Bit 6 : rserv
     Bit 7 : WLAST (Window LAST)
     L'octet  de faible poids de ce mot est entirement utilis ou  rserv 
     pour d'ventuelles extensions futures de BIG.  Par contre,  l'octet de 
     poids fort n'est pas utilis,  ni mme test.  Vous tes donc libre de 
     l'utiliser  votre guise si les fentres de votre programme ont besoin 
     d'autres flags.
     Le premier bit est mis si la fentre a actuellement sa taille  maximum 
     (pleine  ouverture).  Le  second  est  mis si  la  fentre  doit  tre 
     manipulable  partir du clavier.  Le troisime indique que la  fentre 
     doit  tre  systmatiquement  raffiche  dans  sa  totalit  (et  pas 
     seulement les parties caches) lorsqu'elle est amene au premier plan. 
     Le  quatrime force la zone de travail de la fentre a  toujours  tre 
     place  sur des pixels multiples de 16 (galement pour les largeur  et 
     hauteur  de cette zone).  Les trois bits suivants sont pour  l'instant 
     inutiliss.  Quant au bit 7,  il est utilis par BIG pour savoir si la 
     fentre  est  la  dernire  de  celles  qui  ont  t   dclares.   A 
     l'initialisation : WFARROW seulement.
int w_mouse
     Si cet lment est gal  zro (valeur  l'initialisation),  la souris 
     aura toujours la traditionnelle forme de flche.  Sinon, la valeur est 
     interprte comme le numro AES de la forme que la souris doit prendre 
     dans  la  zone  de travail de la fentre (lorsque la  fentre  est  au 
     premier plan).
int w_icon
     Si  la fentre est normale,  cet lment contient '-1'.  Si  elle  est 
     icnifie,  il  contient  l'index BIG de  la  fentre  associe.  Cela 
     signifie  que si elle a t icnifie seule,  c'est son propre  index, 
     mais  si  elle fait partie d'un groupe de fentres iconifies  en  une 
     seule,  c'est  l'index  de  la fentre principale,  celle  qui  a  t 
     effectivement  icnifie,  les autres tant en ralit  provisoirement 
     dtruites.  Lors  de  la dsicnification,  BIG cherchera  toutes  les 
     fentres  actuellement fermes dont cet lment est l'index  de  celle 
     dont on demande la dsicnification, et il les rouvrira.
Viennent    prsent  une srie de pointeurs sur fonctions  qui  vont  nous 
permettre  de dterminer comment la fentre va ragir dans  les  diffrents 
cas d'vnements,  et cela automatiquement.  Nous verrons plus loin comment 
affecter une fonction  un pointeur.
FNCP w_redicn
     "REDraw ICoN" Pointeur sur une routine de raffichage du contenu de la 
     fentre qui est utilise uniquement si la fentre est icnifie.  S'il 
     contient 0L,  c'est la routine normale (voir lment suivant) qui  est 
     utilise. A l'initialisation, 0L.
FNCP w_redraw
     Pointeur  sur la routine de raffichage du contenu de  la  fentre.  A 
     l'initialisation,  0L.  Ce pointeur n'est ncessaire que si la fentre 
     contient autre chose qu'une image ou un formulaire,  car dans ces  cas 
     BIG se charge du redraw.
FNCP w_close
     Pointeur   sur   la   routine  de   fermeture   de   la   fentre.   A 
     l'initialisation,  il  pointe sur la fonction 'closed()' qui ferme  la 
     fentre et demande au GEM d'oublier son existence (mais BIG a plus  de 
     mmoire).  Toutefois,  il faudra dans certains cas que le  programmeur 
     crive  cette fonction afin de librer si ncessaire la  zone  mmoire 
     occupe par exemple par le texte de la fentre.
FNCP w_move
     Pointeur  sur  une  routine qui informe le GEM que la  fentre  a  t 
     dplace,  et  qui  enregistre ses  nouvelles  coordonnes.  Pointe   
     l'initialisation sur la fonction 'moved()'.
FNCP w_size
     Pointeur  sur  une  routine qui informe le GEM que la  fentre  a  t 
     redimensionne,  et qui enregistre ses nouvelles coordonnes. Pointe  
     l'initialisation  sur la fonction 'sized()' (ou 'size_form()' dans  le 
     cas  d'une fentre formulaire).  Voyez dans le chapitre de  la  visite 
     guide ce qui a t dit  propos de la fentre d'histogrammes.
FNCP w_full
     Pointeur  sur  la  fonction  qui donne   la  fentre  ses  dimensions 
     maximales,  ou la ramne aux prcdentes si elle est dj au  maximum. 
     Cette  taille  maximum est ventuellement limite dans  le  cas  d'une 
     fentre  image  ou formulaire aux dimensions de cette image ou  de  ce 
     formulaire.  Les  nouvelles  coordonnes sont  transmises  au  GEM.  A 
     l'initialisation,  pointe sur la fonction 'fulled()' (ou  full_form()' 
     dans le cas d'une fentre formulaire).
FNCP w_hslid, w_vslid
     "Horizontal SLIDer" et "Vertical SLIDer" Pointeurs sur les fonctions  
     excuter en cas de dplacement d'un slider (horizontal ou vertical) le 
     long  de  l'ascenceur correspondant.  La fonction effectue  les  tests 
     ncessaires,   transmet  l'information  au  GEM  et  l'enregistre.   A 
     l'initialisation, pointent respectivement sur 'hslid()' et 'vslid()'.
FNCP w_uppage, w_dnpage, w_lfpage, w_rtpage
     "UP PAGE", "DowN PAGE", "LeFt PAGE" et "RighT PAGE". Pointeurs sur les 
     fonctions  excuter en cas d'vnement d'ascenceur,  c'est--dire une 
     demande de dfilement par page vers le haut,  le bas,  la gauche ou la 
     droite.   La  fonction  effectue  les  tests   ncessaires,   transmet 
     l'information  au GEM et l'enregistre.  A  l'initialisation,  pointent 
     respectivement sur 'uppage()',  'dnpage()',  'lfpage()' et 'rtpage()'. 
     Ces  fonctions dplacent le contenu de la fentre de la hauteur ou  de 
     la largeur (selon le cas) de la fentre,  ou moins si on est "au bout" 
     de l'affichage.
FNCP w_upline, w_dnline, w_lfline, rtline
     "UP LINE", "DowN LINE", "LeFt LINE" et "RighT LINE". Pointeurs sur les 
     fonctions  excuter en cas d'vnement de flches,  c'est--dire  une 
     demande de dfilement par ligne vers le haut,  le bas, la gauche ou la 
     droite.   La  fonction  effectue  les  tests   ncessaires,   transmet 
     l'information  au GEM et l'enregistre.  A  l'initialisation,  pointent 
     respectivement sur 'upline()',  'dnline()',  'lfline()' et 'rtline()'. 
     Ces  fonctions dplacent le contenu de la fentre de la hauteur ou  de 
     la  largeur  (selon le cas) de l'unit de dplacement  not  dans  les 
     lments 'w_wunit' et 'w_hunit'.
char *w_title
     Pointeur sur la chane de titre de la fentre. 0  l'initialisation.
char *w_infos
     Pointeur  sur  la  chane  de  ligne  d'infos  de  la  fentre.   0   
     l'initialisation.
long w_wtot, w_htot
     "Width   TOTal"   et  "Height   TOTal".   Ces   lments   contiennent 
     respectivement  la  largeur et la hauteur totale  de  la  fentre,  en 
     pixels. Pour une image, cela correspond aux dimensions de cette image. 
     Pour  du  texte,  la  largeur  reprsenterait  le  nombre  maximum  de 
     caractres  d'une  ligne  multipli par la largeur  d'une  cellule  de 
     caractre.  La  hauteur  serait le nombre de lignes multipli  par  la 
     hauteur d'une cellule de caractre. 0  l'initialisation.
long w_lin, w_col
     "LIGne" et "COLonne".  Reprsentent (en pixel) les premires ligne  et 
     colonne  afficher dans le coin suprieur gauche de la zone de travail 
     de la fentre,  par rapport au contenu total (w_wtot et w_htot).  0   
     l'initialisation.








5. Les fonctions de BIG
BIG  met videmment  votre disposition des fonctions.  Du point de vue  du 
dveloppeur,  ces fonctions peuvent tre rparties en deux groupes : celles 
que  le  programmeur  appelle  partir du logiciel qu'il est  en  train  de 
dvelopper,   et  celles  que  BIG  appellent  "en  interne".   Dans  cette 
documentation,  nous  ne  verrons en dtail que les  fonctions  du  premier 
groupe.

5.a Gnralits
5.a.1 Les vnements
Pour  que  les  fonctions  de BIG communiquent avec  le  GEM  et  avec  les 
fonctions  du  programme principal,  de nouveaux  types  d'vnements  sont 
utiliss.  Le  type  d'vnement  est  plac dans  l'lment  0  du  buffer 
d'vnement, qui est un tableau d'entiers. Il peut donc prendre des valeurs 
de 0  65535.  GEM n'utilise qu'une trentaine de ces valeurs,  de sorte que 
les  autres  sont disponibles.  Certains systmes (comme le  Tube  GEM)  se 
rservent dj des types d'vnements tendus.  Les nouveaux vnements  de 
BIG   sont  bien  entendus  diffrents  de  tous  les  autres   dont   j'ai 
connaissance.
Dans tous les cas, ces vnements respectent le modle GEM, c'est--dire le 
type  dans  l'lment 0 du buffer,  l'identificateur du  destinataire  dans 
l'lment  1,  et '0' dans l'lment 2,  puisqu'aucun de ces vnements  ne 
comporte  de surplus d'information.  Les lments suivants contiennent  des 
informations dpendantes du type de message.

BEV_HIERM (Big EVent HIERarchical Menu)
Une  option de menu hirarchique du menu principal a t  slectionne.  Le 
programme reoit un vnement MU_MESAG.
Mot 0 : BEV_HIERM (50).
Mot 3 : Numro du titre du menu principal.
Mot 4 : Numro de l'option du menu principal.
Mot 5 : Numro dans le ressource de l'arbre sous-menu.
Mot 6 : Numro de l'objet cliqu dans cet arbre.

BEV_FREEPU (Big EVent FREE Pop-Up)
Une  option  de pop-up libre a t slectionne.  Le  programme  reoit  un 
vnement MU_BUTTON.
Mot 0 : BEV_FREEPU (51).
Mot 3 : Numro de l'arbre pop-up.
Mot 4 : Numro de l'objet cliqu dans cet arbre.

BEV_WFORM (Big EVent Window FORMulaire)
Un objet EXIT de formulaire en fentre a t cliqu. Le programme reoit un 
vnement MU_BUTTON.
Mot 0 : BEV_WFORM (52).
Mot 3 : Index BIG de la fentre formulaire.
Mot 4 : Numro de l'objet cliqu.

BEV_WMENU (Big EVent Window MENU)
Une  option de menu en fentre a t slectionne.  Le programme reoit  un 
vnement MU_BUTTON.
Mot 0 : BEV_WMENU (53).
Mot 3 : Numro du titre de menu.
Mot 4 : Numro de l'option clique.
Mot 5 : Index BIG de la fentre contenant le menu.

BEV_WHIER (Big EVent Window HIERarchical menu)
Une option de menu hirarchique de menu en fentre a t  slectionne.  Le 
programme reoit un vnement MU_BUTTON.
Mot 0 : BEV_WHIER (54).
Mot 3 : Numro du titre de menu.
Mot 4 : Numro de l'option qui a appel le sous-menu.
Mot 5 : Numro dans le ressource de l'arbre sous-menu.
Mot 6 : Numro de l'objet cliqu dans cet arbre.
Mot 7 : Index BIG de la fentre contenant le menu.

BEV_TOOL (Big EVent TOOLbar)
Un  objet  de toolbar d'une fentre a t cliqu.  Le programme  reoit  un 
vnement MU_BUTTON.
Mot 0 : BEV_TOOL (55).
Mot 3 : Index BIG de la fentre contenant la toolbar.
Mot 4 : Numro de l'objet cliqu.

5.a.2 Le ressource inclus
BIG  possde  un  ressource  intgr qui  lui  est  propre.  Il  n'est  pas 
incompatible  que le programme lui-mme ait son ressource (externe ou  non) 
et  que BIG ajoute quelques arbres intgrs.  Ce ressource  inclus  faisant 
partie du programme lui-mme, il sera quelque part en mmoire. Il suffit de 
savoir  o pour transmettre les adresses ncessaires aux fonctions  qui  en 
ont  besoin.  L'utilisation par BIG de ce ressource inclus est  entirement 
automatise. Vous n'avez pas  vous en proccuper.
Rappelons que BIG peut travailler de la mme manire avec un RSC externe et 
un interne. Reportez-vous au chapitre 8 pour en savoir plus.
Ce  ressource  inclus compte 6 formulaires,  2 alertes libres et  1  chane 
libre.  Le  premier  formulaire est la bote d'alerte  dplaable  qui  est 
modif  et  utilis  par les appels "BIG  Alerte".  Le  formulaire  suivant 
contient  les  icnes d'alerte (BIG offre 9 motifs d'icnes au lieu  des  3 
habituels).  Le troisime contient les deux flches de dfilement des menus 
en fentre. Le quatrime contient les G_IMAGEs utilises pour le dessin des 
B_RADIOs,  des  B_COCHEs  et du bouton "option suivante"  des  pop-ups.  Le 
suivant   contient  la  G_BOX  et  les  deux  flches  utilises  pour   la 
construction  des scroll-menus.  Enfin,  le dernier contient le  formulaire 
servant  crer les pop-listes.
Quant aux alertes, la premire est celle qui est utilise pour signaler que 
le ressource (externe) n'a pas t trouv pour tre charg,  et la  seconde 
informe l'utilisateur qu'il est impossible d'ouvrir une nouvelle fentre.
La  chane libre,  pour finir,  contient le texte qui est affich  si  l'on 
tente  de lancer un programme sous BIG (donc sous GEM)  partir du  dossier 
AUTO.

5.a.3 Les variables globales
BIG travaille avec quelques variables globales,  qui sont donc  accessibles 
au programme lui-mme.  Leur nombre a t limit au maximum, mais toutefois 
certaines contraintes sont  respecter. J'ai prfr procder ainsi, plutt 
que  d'alourdir  le  travail  de certaines  fonctions  par  une  incessante 
passation de pointeurs, pas toujours facile  suivre et  comprendre.
Voici une prsentation succinte de ces variables globales. Nous verrons les 
dtails avec les fonctions.
int ap_id Identificateur de l'application.
int buf[8] Buffer d'vnements.
int mx, my, mk Position de la souris et tat des boutons.
int edit, pos Editable courant, position du curseur dans cet ditable.
int object Objet cliqu lors d'un vnement MU_BUTTON.
int kbd,  key,  clik Etat courant des touches d'tat  (Control,  Shift...), 
vnement clavier courant, nombre de clics souris.
int wind Handle GEM de la fentre clique.
int intgr "INTgR" Flag qui vaut TRUE si le ressource est  intgr,  FALSE 
s'il est externe.
OBJECT *adr_menu, *adr_desk Noms rservs pour les adresses des formulaires 
Menu   et  Bureau  du  programme  (inutilises  si  l'application  est   un 
accessoire).
FNCP *fnc Adresse de la zone des pointeurs de fonction lis aux objets.
BigWind *win Adresse de la zone des fentres (structures BigWinds).
t_ident_hard_soft desc_hard_soft Informations concernant le  hardware.  Ces 
informations  sont contenues dans une  structure  t_ident_hard_soft,  ainsi 
dfinie :
typedef struct
{
  t_machine la_machine;
  t_proc_graphique proc_graphique;
  t_cpu le_cpu;
  int v_aes;
  int v_tos;
  char multitache;
} t_ident_hard_soft;
Voici le dtail de ses lments :
t_machine la_machine Le type de machine.
t_proc_graphique proc_graphique Le processeur graphique.
t_cpu le_cpu Le micro-processeur central.
int  v_aes  La  version  de l'AES.  Le plus simple  est  de  la  tester  en 
hexadcimal,  comme par exemple "if (desc_hard_soft.v_aes ==  0x410)",  car 
cela signifie "version 4.10" !
int v_tos La version du TOS. Mme remarque que pour l'AES.
char multitache Flag qui vaut TRUE si on est sous environnement multitche, 
FALSE sinon.
t_display  work_display  Information  concernant  l'affichage.  Elles  sont 
contenue dans une structure t_display, que voici :
typedef struct t_display
{
  size_t taille;  /* taille d'un ecran */
  size_t taille_ligne; /* longueur d'une ligne en octet */
  int handle; /* Handle VDI station de travail */
  int w;  /* largeur de l'ecran */
  int h;  /* hauteur de l'ecran */
  int hc; /* taille des caracteres de baseline a topline */
  t_resolution res; /* Resolution courante, prise au demarrage */
  int mode; /* le mode courant si on est sur Falcon  */
  char une_palette; /* FALSE: pas de palette, TRUE : une palette */
  long n_color_pal; /* nombre de couleurs de la palette ou du systeme */
  long n_color; /* nombre de pinceaux disponibles simultanements */
  int n_plane;  /* profondeur de l'ecran, en nbre de plan */
  Palette *palette; /* pointeur vers la sauvegarde des feutres */
  int nb_bit_coul[3]; /* nombre de bits par couleur */
  int masque_coul[3]; /* masque pour les couleurs */
  void *phys; /* adresse physique de l'ecran */
  void *log;  /* adresse logique de l'ecran */
} t_display;
Voici les dtails :
size_t taille Taille en octet de l'cran.
size_t taille_ligne Taille en octets d'une ligne de pixels.
int handle Handle de la station de travail virtuelle VDI.
int w Largeur de tout l'cran en pixels.
int h Hauteur de tout l'cran, en pixels.
int  hc  Hauteur standard des caractres "normaux",  de la  baseline    la 
topline.
t_resolution  res La rsolution,  puisque la fonction Getrez() ne  signifie 
plus grand-chose sur Falcon.
int mode Le mode courant si on travaille sur Falcon.  Il s'agit d'un masque 
de bits dcrivant le mode vido. Voici les dtails :
Bits 0  2 :  Bits par pixels.  0 = 1 bps ;  1 = 2 bps ;  2 = 4 bps ; 3 = 8 
bps ; 4 = 16 bps.
Bit 3 : Flag 80 colonnes (40 s'il n'est pas mis).
Bit 4 : Flag VGA (mode TV s'il n'est pas mis).
Bit 5 : Flag PAL ou NTSC s'il n'est pas mis.
Bit 6 : Flag Overscan. Multiplie x et y par 1.2 (inutilis en VGA).
Bit 7 : Flag de compatibilit ST.
Bit 8 :  Flag vertical.  Mode entrelac sur crans couleur, double ligne en 
VGA.
Bits 9  15 : Rservs.
char une palette S'il n'y a pas de palette (Near True Color ou True Color), 
FALSE. TRUE sinon.
long n_color_pal Nombre de couleurs affichables simultanment.
long_n_color Nombre de pinceaux disponibles.
int n_plane Nombre de plans de couleurs.
Palette *palette Pointeur sur la sauvegarde de la palette par dfaut (celle 
qui  est active au lancement du programme).  Le type "Palette"  est  dfini 
comme ceci : "typedef int Palette[3];", il est donc adapt au format VDI de 
description des palettes de couleurs. BIG rserve une zone mmoire dsigne 
par "palette" et d'une taille suffisante :
palette = (Palette *)malloc (n_color * sizeof (Palette));
int nb_bit_coul[3] Nombre de bits par couleur.
int masque_coul[3] Masque pour les couleurs.
void *phys Adresse de l'cran physique au lancement du programme.
void *log Adresse de l'cran logique au lancement du programme.
Ces   structures  utilisent  des  dfinitions  qui  seront  prsentes   au 
paragraphe suivant.
Enfin,   les  coordonnes  du  bureau  sont  places  dans  une   structure 
t_desktop :
typedef struct t_desktop
{
  int xd, yd, wd, hd;
} t_desktop;
Cette structure est similaire  la structure GRECT.

5.a.4 Les dfinitions
Pour faciliter la programmation,  BIG propose (et utilise) des  dfinitions 
(#define)  nombreuses.  En voici la liste,  avec la  traduction  mnmonique 
(lorsque c'est ncessaire).
FALSE, TRUE Respectivement '0' et '1', ils sont utiliss dans les tests. De 
grands classiques.
NOT (!) Plus facilement lisible dans un listing que le point  d'exclamation 
trop troit.
BLANK (-1) Trs utilis par BIG,  Cette valeur est souvent transmise   une 
fonction pour lui indiquer qu'elle ne doit pas traiter les choses relatives 
  ce  paramtre.  Par exemple,  s'il n'y a pas de champ ditable  dans  un 
formulaire, le paramtre transmis pour la variable 'edit' est 'BLANK'.
ZERO (0) Plus lisible que le chiffre 0.  Attention  ne pas confondre cette 
dfinition avec 'NULL',  dfini par STDDEF.H,  ce ne sont pas les mmes  du 
tout.
MAX_ALRT  (250)  "MAXimum ALeRTe".  Taille maximum  possible  d'une  chane 
d'alerte. En fait, c'est un peu moins que cela.
BIT15  (0x8000) Le 15 bit d'un int est positionn dans certains  cas,  par 
exemple lors d'un double-clic.
max ((A,  B) ((A) > (B) ?  (A) : (B))) Macro qui retourne la valeur la plus 
leve entre deux.
min ((A,  B) ((A) < (B) ? (A) : (B))) Macro qui retourne la valeur la moins 
leve entre deux.
B_MOVE,  B_SELEC,  B_GRASTR,  B_FRAME,  B_HELP,  B_EDIT,  B_UNDO,  B_UNDER, 
B_POPUP,  B_LIST,  B_HIERM,  B_FNCP Types tendus d'objets UserDef. Voir le 
chapitre 3, "Les nouveaux types d'objets".
DLG_DESK  ((MU_KEYBD | MU_BUTTON | MU_M1 | MU_MESAG | MU_TIMER))  "DiaLoGue 
DESK"
DLG_FORM ((MU_KEYBD | MU_BUTTON | MU_TIMER)) "DiaLoGue FORMulaire"
Pour la gestion des vnements,  deux masques pour les deux situations  les 
plus courantes :  gestion du bureau avec menu et fentres,  et gestion d'un 
formulaire seulement.
BEV_HIERM,  BEV_FREEPU,  BEV_WFORM,  BEV_WMENU,  BEV_WHIER,  BEV_TOOL  Dj 
mentionns, les nouveaux types d'vnements crs par BIG. Voir le chapitre 
5.a.1.
WATR_ALL "Window ATtRibuts ALL"
WATR_CURR "Window ATtRibuts CURrents"
WATR_FORM "Window ATtRibuts FORMulaire"
Attributs GEM des fentres, trois jeux souvent employs.
WTYP_NORM (1) "Window TYPe NORMal"
WTYP_FORM (2) "Window TYPe FORMulaire"
WTYP_PICT (3) "Window TYPe PICTure"
WTYP_TOOL (0x4000) "Window TYPe TOOLbar"
WTYP_MENU (0x8000) "Window TYPe MENU"
Type BIG des fentres. Utilises dans la structure BigWind.
WFFULL (0x01) "Window Flag FULL".  Flag pour les fentres.  Ce bit est  mis 
lorsque  la  fentre  a  sa  taille  maximum.   Il  est  effac  lors  d'un 
dplacement, d'un redimensionnement, ou lorsqu'on reclique sur le bouton de 
pleine ouverture pour ramener la fentre  ses coordonnes antrieures.
WFARROW (0x02) "Window Flag ARROW".  Flag pour les fentres. Lorsque ce bit 
est mis, la fentre peut tre manipule  partir du clavier.
WFREDRAW (0x04) "Window Flag REDRAW".  Flag pour les fentres.  Lorsque  ce 
bit  est  mis,  la  fentre est toujours redessine  lorsqu'elle  passe  au 
premier plan, mme si elle n'tait pas recouverte par une autre fentre.
WFBOUND (0x08) "Window Flag BOUNDary.  Flag pour les fentres.  Lorsque  ce 
bit est mis,  la zone de travail d'une fentre est toujours positionne sur 
des pixels multiples de 16 (lors d'un dplacement),  ainsi que ses  largeur 
et hauteur (lors d'un redimensionnement).
WLAST  (0x0080)  "Window  LAST".   Flag  pour  les  fentres.  Lorsque  BIG 
initialise les fentres que le programme va utiliser,  la dernire  fentre 
de la liste est repre par ce bit.
WFCLOSE  (0x01)  "Window Formulaire CLOSE".  Il s'agit du  premier  bit  de 
l'ob_state tendu des objets EXIT d'un formulaire en fentre. Si ce bit est 
mis, la fentre est ferme.
HELP (0x6200)
UNDO (0x6100)
ENTER (0x1C0D)
RETURN (0x720D)
BACKSPC (0x0E08)
DELETE (0x537F)
TAB (0x0F09)
ARDN (0x5000) "ARrow DoWn"
ARUP (0x4800) "ARrow UP"
ARLF (0x4B00) "ARrow LeFt"
ARRT (0x4D00) "ARrow RighT"
CT_ARLF (0x7300) "ConTrol ARrow LeFt"
CT_ARRT (0x7400) "ConTrol ARrow RighT"
SH_ARDN (0x5032) "SHift ARrow DoWn"
SH_ARUP (0x4838) "SHift ARrow UP"
SH_ARLF (0x4B34) "SHift ARrow LeFt"
SH_ARRT (0x4D36) "SHift ARrow RighT"
ESC (0x011B)
CLR (0x4700)
SH_CLR (0x4737) "SHift CLR"
Ces dfinitions sont relatives au clavier.  Elles reprsentent des  touches 
ou  combinaisons  de touches invariables sur tous les  types  de  claviers. 
Elles  sont utilises par BIG pour sa gestion interne,  mais vous en  aurez 
certainement besoin  l'occasion.
Les possibilits d'icnisation de fentres n'tant pas encore  implmentes 
sur tous les compilateurs,  BIG offre une srie de dfinitions relatives   
ce  point,  qui  ne sont prises en compte que si "SMALLER" n'est  pas  dj 
dfini. Elles correspondent aux noms donns par l'AES :
SMALLER (0x4000) Dans les attributs GEM de la fentre,  cela correspond  au 
bouton d'icnification.
WM_ICONIFY  (34),   WM_UNICONIFY  (35),  WM_ALLICONIFY  (36)  Les  nouveaux 
messages, que le GEM envoie automatiquement sur les nouveaux systmes.
WF_ICONIFY (26), WF_UNICONIFY (27), WF_UNICONIFYXYWH (28) Nouvelles options 
de  la fonction wind_set(),  actives seulement avec le  nouvel  AES.  Elles 
permettent respectivement d'icnifier une fentre,  de la dsicnifier,  et 
de fixer ou de modifier les coordonnes qu'aura la fentre lorsqu'elle sera 
dsicnifie.
Les  structures  t_ident_hard_soft et t_display utilisent  les  dfinitions 
suivantes :
t_machine dfini la machine sur laquelle on se trouve :
typedef enum {
  ST,
  STE,
  TT,
  FALCON_030,
  AUTRE_MACHINE
} t_machine;
t_proc_graphique dfini le processur graphique utilis :
typedef enum
{
  PG_ST,
  PG_STE,
  PG_TT,
  PG_FALCON_030,
  AUTRE_PG,
} t_proc_graphique;
t_cpu dfini le processeur central de l'ordinateur :
typedef enum
{
  PROC_68000,
  PROC_68030,
  AUTRE_PROCESSEUR,
} t_cpu;
t_resolution dfini la rsolution courante :
typedef enum
{
  ST_BASSE = 0,
  ST_MOYENNE = 1,
  ST_HAUTE = 2,
  VGA_16COL = 4, /* le VGA TT */
  VGA_256COL = 5, /* le VGA FALCON */
  R_256C_320_480 = 7, /* le 320*480 16 col TT */
  TRUE_COLOR_320_480 = 8, /* le 320*480 Falcon sur VGA */
  INCONNU = -1 /* aucune resolution normalisee */
} t_resolution;

5.a.5 Les Cookies
BIG  offre quelques fonctions permettant une gestion limite  des  Cookies. 
Ces fonctions utilisent une structure Cookie, que voici :
typedef struct  /* DEFINITION D'UN COOKIE */
{
  long ident; /* Identificateur */
  union
  {   /* DATAs du Cookie */
    long l; /* Si la donnee est un long */
    int i[2]; /* Si la donnee est 2 int */
    char c[4];  /* Si la donnee est 4 octets */
  } datack;
} COOKIE;

5.b Les fonctions programmeur
BIG  comporte  en  tout 118 fonctions.  Je ne vais prsenter  ici  que  les 
fonctions que le programmeur doit (ou peut) appeler.  Il y en a  45,  parmi 
lesquelles une vingtaine seulement sont d'un usage trs courant,  et seront 
utilises  dans  presque  tous les  dveloppements.  Les  autres  sont  des 
fonctions  internes.  La  prsentation  des fonctions  respecte  le  modle 
suivant :
Prototypage. Le prototypage de la fonction.
Description. Ce que ralise la fonction.
Paramtres. La description de chaque paramtre et (s'il y a lieu) du retour 
de la fonction.
Remarques. (Eventuellement) Des remarques sur ce qui est fait, ce qui est  
faire, et ce qui est  ne pas faire.

5.b.1 Les fonctions d'initialisation
Prototypage
int initial (char *rsc, int menu, int desk,
             int nb_tree, OBJECT *rs_tree, char *rs_str,
             int n_wind, int acc);
Description  Cette  fonction dclare l'application,  ouvre  la  station  de 
travail, initialise la plupart des variables globales, charge le ressource, 
met en place le ressource intgr de BIG,  met en place les zones  mmoires 
pour la gestion des fentres,  des objets userdef,  des ditables  tendus, 
des  pointeurs sur fonction,  de la palette de couleurs,  rserve  l'espace 
mmoire pour la gestion des fentres par BIG,  initialise certains lments 
des  structures BigWind,  adapte la taille des objet du ressource s'il  est 
intgr, etc.
Paramtres
'rsc' est un pointeur sur une chane qui est le nom du fichier ressource   
charger, ou une chane vide en cas de ressource intgr.
'menu'  et 'desk' sont les numros d'arbres (dans le ressource) qui  seront 
pris  comme  menu principal et bureau de l'application.  Dans le  cas  d'un 
accessoire de bureau,  ces deux paramtres sont ignors. Si on dsire crer 
un  programme  sans  bureau  ou sans menu  (ou  sans  les  deux),  il  faut 
transmettre '-1' comme paramtre correspondant.
'nb_tree'  est  obligatoirement  gal  0 si le ressource  est  un  fichier 
externe.  Si  le  programme travaille avec un  ressource  intgr,  nb_tree 
indique le nombre d'arbres (menus et formulaires) de ce ressource.
'rs_tree'  et  'rs_str'  sont deux pointeurs spciaux.  Dans  le  cas  d'un 
ressource  intgr,  ils permettent d'indiquer  BIG  quel endroit  de  la 
mmoire  commencent les deux tableaux 'rs_trindex[]' et 'rs_frstr[]'  crs 
par le fichier RSH.  Sinon,  ils pointent sur ZERO.  Voyez au chapitre 8 la 
faon de les utiliser.
'n_wind'  Nombre  total  de fentres BIG avec lesquelles  le  programme  va 
travailler.
'acc'  Numro dans le ressource de la chane libre  utiliser pour  l'appel 
de la fonction menu_register() si l'application est un accessoire de bureau 
(nom  de  l'accessoire dans le menu Bureau).  Si  c'est  un  programme,  le 
paramtre est ignor, on peut transmettre '-1'.
retour  :  TRUE  si tout c'est bien pass,  FALSE sinon  (par  exemple,  le 
fichier ressource n'a pas t trouv).
Remarques Les variables 'adr_menu' et 'adr_desk' ont des noms imposs  pour 
faciliter leur gestion.  En effet,  il y a de nombreuses fonctions qui font 
appel  ces adresses, et les transmettre  chaque fois serait fastidieux et 
peu  pratique.  Si votre programme travaille avec plusieurs barres de  menu 
(ou mme plusieurs bureaux,  pourquoi pas),  l'adresse du menu courant doit 
tre dans adr_menu.  La fonction centre  l'avance tous les formulaires  et 
vide tous les champs ditables.
On  accde  aux  structures de fentres (et   leurs  lments)  comme  aux 
lments d'un tableau, par win[index].w_adr par exemple.
Il est fortement recommand de ne pas faire d'conomie avec la quantit  de 
fentres ncessaires,  et de dclarer une fentre par lment d'information 
 traiter.
Par exemple,  il est dconseill de n'avoir qu'une fentre pour afficher un 
texte ou une image, sous prtexte que les deux ne seront jamais affichs en 
mme temps.  Il vaut mieux dans ce cas avoir deux fentres distinctes,  les 
paramtres contenus dans leurs lments tant diffrents. De mme, dclarez 
une fentre par formulaire en fentre.
La  gestion du programme en sera simplifie,  quitte  fermer  une  fentre 
avant  d'en ouvrir une autre si les deux ne doivent pas tre  affiches  en 
mme temps.
Une  structure  BigWind de plus en mmoire ne reprsente  que  158  octets, 
alors  qu'une  gestion  complique de peu de  fentres  se  partageant  des 
contenus diffrents risque de prendre beaucoup plus,  sans parler du  temps 
de traitement.
Cette  fonction doit IMPERATIVEMENT tre appel par la fonction  main()  du 
programme principal ds le dbut de l'excution.

Prototypage
void end (void);
Description Cette fonction ferme toutes les fentres du  programme,  libre 
les diffrentes zones mmoires qui ont t rserves  l'initialisation  et 
en cours de programme,  libre le ressource,  ferme la station de  travail, 
restaure  la  palette  de  couleurs  et  autres  paramtres  et  quitte  le 
programme.
Remarques Cette fonction n'est pas appele par BIG.  C'est votre  programme 
qui  devra se charger de cet appel lorsque l'utilisateur demande   quitter 
l'application.
Si une zone mmoire est affecte au contenu d'une fentre,  elle doit  tre 
libre.    Si   la   fonction   de   fermeture   affecte       l'lment 
win[index].w_close  de  cette fentre ne s'en charge pas,  vous  devrez  le 
faire " la main" AVANT d'appeler end().

5.b.2 Les fonctions de gestion des formulaires
Prototypage
void formm_draw (OBJECT *adr, int ed, int flmove, MFDB *img);
Description  "Form  Move  DRAW".   Cette  fonction  affiche  un  formulaire 
dplaable.
Paramtres
'adr' Adresse de l'arbre  afficher.
'ed'  Numro  d'objet  du champ ditable dans lequel  doit  se  trouver  le 
curseur au dbut de la gestion du formulaire. Le curseur est plac  la fin 
du champ. -1 s'il n'y en a pas.
'flmove' "FLag MOVE". Si ce flag est FALSE, le dplacement du formulaire se 
fait  en  "bote fantme".  S'il est TRUE,  la fonction  rserve  une  zone 
mmoire  et y sauve l'cran afin de raliser le dplacement en temps  rl. 
S'il n'est pas possible de rserver cette mmoire,  le dplacement se  fait 
en bote fantme.
'img' Pointeur sur MFDB utilis pour sauver le fond sous le formulaire.
Remarques L'attribut OUTLINED de la bote racine est mis,  les routines  de 
dplacement  du formulaire tenant compte de lui dans  leurs  calculs.  Pour 
enlever  le  formulaire  de  l'cran   la  fin  de  la  gestion,  il  faut 
imprativement utiliser la fonction formm_undraw().

Prototypage
void formm_undraw (OBJECT *adr, MFDB *img);
Description Cette fonction efface de l'cran un formulaire dplaable qui a 
t affich par la fonction formm_draw().
Paramtres
'adr' Adresse de l'arbre.
'img' Pointeur sur le MFDB dans lequel a t sauv le fond du formulaire.
Remarques  Le  formulaire  dplaable est  affich  imprativement  par  la 
fonction formm_draw().

Prototypage
void formf_draw (OBJECT *adr, int ed);
Description  "FORMulaire Fixe DRAW".  Affiche un  formulaire  traditionnel, 
fixe.
Paramtres
'adr' Adresse de l'arbre  afficher.
'ed'  Numro d'objet du champ ditable o placer le curseur au dbut de  la 
gestion, s'il y en a, ou -1. Le curseur est plac  la fin du champ.
Remarques Cette fonction n'existe que pour des raisons de compatibilit  et 
pour  tre  complet,   mais  on  lui  prfrera  sans  doute  la   fonction 
formm_draw().  Le  formulaire affich avec cette fonction doit tre ot  de 
l'cran avec formf_undraw().

Prototypage
void formf_undraw (OBJECT *adr);
Description  Cette fonction efface de l'cran un formulaire fixe qui a  t 
affich par la fonction formf_draw().
Paramtres
'adr' Adresse de l'arbre.
Remarques La fonction doit tre utilise en complment de formf_draw().

Prototypage
void create_hierm (OBJECT *adr);
Description  Cette fonction cherche les objets B_HIERMs d'un menu et  place 
en  avant-dernier  caractre de la chane une flche vers la droite  o  la 
gauche selon le cot o va se drouler le menu hirarchique.
Paramtres
'adr' Adresse de l'arbre.
Remarques  En  ce  qui concerne le menu  principal  d'une  application,  la 
fonction initial() se charge d'appeler cette fonction.  Elle est  galement 
appele  automatiquement   chaque fois qu'un clic a lieu sur un  titre  de 
menu  en  fentre,  car la fentre a pu tre dplace,  et  les  sous-menus 
pourraient alors devoir tre drouls de l'autre cot. Mais si vous dsirez 
changer  la barre de menu (et si la nouvelle comporte des  B_HIERMs),  vous 
devez appeler cette fonction lors du premier affichage de cette barre. Lors 
des raffichages ultrieurs, ou de la ractivation de la premire barre, ce 
n'est pas ncessaire.
Les  options  de menu de type B_HIERM doivent tre  remplis  d'espaces  sur 
toute leur largeur.  L'avant-dernier caractre est remplac par une  flche 
(Ascii 3 ou 4) place par cette fonction.

Prototypage
int dialog  (int flags, OBJECT *address, int f,
             int fl_rb, int form_pu,
             MFDB *img, int fl_move);
Description Cette fonction est le cur de BIG.  C'est la boucle  principale 
qui scrute les vnements et les gre en grande partie.  Elle sera toujours 
appele au moins une fois dans un programme sous BIG.
Paramtres
'flags'  C'est  le  masque  de  bits (le mme  que  pour  la  fonction  GEM 
evnt_multi())  qui indique quels vnements doivent  tre  surveills.  BIG 
propose  des  dfinitions  toutes  faites  pour  les  situations  les  plus 
courantes (voir le chapitre 5.a.4).
'address' Adresse du formulaire  traiter, ou du bureau.
'f' "Flag".  Si ce flag est TRUE, La fonction surveille le menu, le bureau, 
les fentres, etc. S'il est FALSE, elle se limite au formulaire indiqu par 
'address',   considrant  que  les  autres  vnements  sont  bloqus   par 
wind_update().
'fl_rb' "FLag Right Button".  Si TRUE, un clic du bouton droit de la souris 
appelle un menu pop-up libre (voir paramtre suivant).
'form_pu' "FORMulaire Pop-Up". Numro d'arbre du formulaire servant de pop-
up libre en cas de clic sur le bouton droit. -1 s'il n'y en a pas.
'img' Dans le cas d'un formulaire dplaable, c'est un pointeur sur le MFDB 
qui contient le fond de ce formulaire.
'fl_move'  Indique si le formulaire est dplaable (TRUE) ou  non  (FALSE). 
Egalement FALSE si la fonction gre le bureau.
retour  :  La  fonction retourne un masque de bits  correspondant  au  type 
d'vnement qui s'est produit.  Ce masque est le mme que pour la  fonction 
GEM evnt_multi().
Remarques  Voici  un rappel du masque de bits utilis par  evnt_multi()  et 
dialog().
Bit 0 : MU_KEYBD (vnement clavier)
Bit 1 : MU_BUTTON (vnement clic souris)
Bit 2 : MU_M1 (vnement zone souris 1)
Bit 3 : MU_M2 (vnement zone souris 2)
Bit 4 : MU_MESAG (vnement message menu ou fentre)
Bit 5 : MU_TIMER (vnement timer coul)

Prototypage
int match (OBJECT *adr, int button);
Description  Cette  fonction cherche s'il y a une correspondance  entre  le 
texte  (ou  le  motif d'image) d'un bouton pop-up ou pop-liste  et  un  des 
objets de son formulaire pop-up associ.
paramtres
'adr' Adresse du formulaire dans lequel se trouve le bouton.
'button' Numro du bouton dans ce formulaire.
retour :  Numro de l'objet dans le formulaire pop-up si une occurence  est 
trouve, 0 sinon.
remarques L'objet-racine du formulaire pop-up ayant le numro 0, il ne peut 
y avoir d'occurence avec ce numro d'objet.  La fonction retourne donc 0 si 
aucune correspondance n'est trouve.

Prototypage
void set_popup (OBJECT *adr, int button, int option);
Description  Cette  fonction  place le texte (ou le  motif  d'image)  d'une 
option de menu pop-up dans le bouton associ (pop-up ou pop-list).
paramtres
'adr' Adresse du formulaire dans lequel se trouve le bouton.
'button' Numro du bouton dans ce formulaire.
'option' Numro d'objet de l'option dans le menu pop-up.

Prototypage
int free_popup (int posx, int posy, int form);
Description Cette fonction appelle un formulaire pop-up "libre", en ce sens 
que sa position n'est pas li  la position d'un bouton dans un formulaire.
Paramtres
'posx'  "POSition  X".  Coordonne  en  x du  centre  du  pop-up.  Il  sera 
ventuellement dcal s'il devait sortir de l'cran.
'posy'  "POSition  Y".  Coordonne  en  y du  centre  du  pop-up.  Il  sera 
ventuellement dcal s'il devait sortir de l'cran.
'form' Numro de l'arbre servant de pop-up.
retour :  TRUE si une option a t choisie, FALSE si le pop-up a t quitt 
en cliquant  ct.
Remarques Si un objet a t choisi,  TRUE est retourn et un vnement  est 
mis  en place par la fonction dans le buffer d'vnements.  Il est de  type 
'BEV_FREEPU'  ("Big EVent FREE Pop-Up".  Voyez sa description  au  chapitre 
5.a.1.
Si  l'objet  cliqu est de type "pointeur sur fonction",  la  fonction  est 
automatiquement excute avant le retour de la fonction.
Bien  que cette fonction soit appele en interne par la  fonction  dialog() 
(voir  le  paramtre  'fl_rb' de dialog()),  vous pouvez  avoir  besoin  de 
l'appeler directement dans certaines situations.

Prototypage
void get_bkgr (int of_x, int of_y, int of_w, int of_h, MFDB *img);
Description (GET BacKGRound).  Cette fonction sauve l'image d'une zone dans 
un MFDB, afin de la restaurer plus tard. Elle permet de mettre "de cot" le 
fond d'un formulaire ou d'un pop-up, par exemple. Ce fond sera restaur par 
la fonction put_bkgr().
Paramtres
'of_x',  'of_y',  'of_w',  'of_h' "OFfset X",  "OFfset Y",  "OFfset Width", 
"OFfset Height". Coordonnes et dimensions de la zone  sauvegarder.
'img' "IMaGe". Pointeur sur le MFDB qui dcrira la zone sauve.
Remarques Cette fonction est appele en interne par BIG,  mais vous  pouvez 
l'utiliser  pour  sauver des zones d'cran si  ncessaire.  Voir  aussi  la 
fonction put_bkgr().


Prototypage
void put_bkgr (int of_x, int of_y, int of_w, int of_h, MFDB *img);
Description (PUT BacKGRound) Cette fonction restaure l'image d'une zone qui 
a t sauve dans un MFDB, par la fonction get_bkgr().
Paramtres
'of_x',  'of_y',  'of_w',  'of_h' "OFfset X",  "OFfset Y",  "OFfset Width", 
"OFfset Height". Coordonnes et dimensions de la zone  sauvegarder.
'img' "IMaGe". Pointeur sur le MFDB qui dcrit la zone  restaurer.
Remarques Cette fonction est appele en interne par BIG,  mais vous  pouvez 
l'utiliser  pour  sauver des zones d'cran si  ncessaire.  Voir  aussi  la 
fonction get_bkgr().

Prototypage
int big_alert (int button, int number, char *str, int fl_alrt);
Description Cette fonction appelle et gre une bote d'alerte BIG, c'est--
dire sous forme de formulaire dplaable. L'appel et la bote d'alerte sont 
semblables  leurs homologues GEM.  L'alerte peut contenir jusqu' 5 lignes 
de 31 caractres maximum, et trois boutons de 20 caractres maximum.
Paramtres
'button' Numro du bouton par dfaut : 0, 1, 2 ou 3.
'number'  Numro (dans le ressource) de la chane libre contenant le  texte 
de la bote d'alerte, au mme format que pour la fonction GEM form_alert(). 
Si  cela  convient  mieux  la situation,  la  chane  peut  tre  indique 
directement dans le paramtre suivant.  'number' doit alors tre gal   -1 
(BLANK).
'str'  "STRing".  Si  on  dsire  transmettre  directement  la  chane,  le 
paramtre  prcdant  est -1.  'str' est alors un pointeur  sur  la  chane 
d'alerte. Indiquez sinon une chane vide.
'fl_alrt' "FLag ALeRT".  Si ce flag est TRUE,  l'alerte sera gre par BIG, 
comme  un formulaire dplaable.  S'il est FALSE,  ce sera une  alerte  GEM 
normale, appele par form_alert().
retour  :  Numro (1,  2 ou 3) du bouton qui a t cliqu,  comme  dans  la 
fonction GEM.
Remarques  BIG propose 9 icnes d'alerte.  Si la chane comporte un  numro 
d'icne de '0',  l'alerte sera sans icne.  Les numros 1  9 correspondent 
aux dessins suivants :
1 : Point d'exclamation
2 : Point d'interrogation
3 : Panneau Stop
4 : Panneau Sens interdit
5 : Main ouverte
6 : Lettre 'i', comme Information
7 : Bombe (pour les messages d'erreurs)
8 : Imprimante
9 : Disquette
Si on travaille en 16 couleurs ou plus,  la bote d'alerte est affiche  en 
relief, le fond tant gris (couleur n 8). Sinon, elle est affiche en fond 
blanc, sans relief.

Prototypage
char *get_string (int number);
Description  Cette fonction retourne un pointeur sur une chane  libre  (ou 
alerte libre) d'une ressource, intgr ou non.
Paramtres
'number' Numro de la chane libre dans le ressource (donn par le  fichier 
header cr par l'diteur de ressource).
retour : Pointeur sur la position de la chane en mmoire.

Prototypage
int parent (OBJECT *adr, int object);
Description Cette fonction retourne le numro de l'objet-pre d'un objet.
Paramtres
'adr' Adresse du formulaire.
'object' numro de l'objet dont on cherche le pre.
retour : Numro d'objet du pre.

Prototypage
void bak_rsc (OBJECT *tree, char **bak);
Description  "BAcKup ReSsourCe".  Cette fonction sauvegarde dans un  buffer 
"l'tat" d'un formulaire,  c'est--dire les boutons slectionns ou non, le 
texte  des  ditables et des pop-ups,  etc,  afin de les restituer  par  la 
fonction res_rsc() si le bouton 'Annule' est cliqu.
Paramtres
'tree' Adresse du formulaire.
'bak' Pointeur sur un pointeur de chane qui sert de buffer de sauvegarde  
la fonction. Ce buffer est une zone mmoire rserve  la taille ncessaire 
par la fonction.  Il sera libr par res_rsc() si celle-ci est appele,  ou 
devra l'tre par le programmeur sinon.
Remarques L'appel de cette fonction doit tre fait par le programmeur avant 
de  dessiner  le  formulaire  (par  formm_draw()  par  exemple).   Dans  un 
formulaire en fentre, il faut r-appeler cette fonction en cas de clic sur 
le bouton 'Applique' afin d'enregistrer le nouvel tat. N'oubliez pas alors 
de  faire prcder cet appel par 'Mfree (adr_bakrsc)' (o 'adr_bakrsc'  est 
l'adresse  du  buffer),  sinon,  une taille quivalente serait  rserve   
chaque fois, sans tre libre. Voir aussi la fonction res_rsc().

Prototypage
void res_rsc (OBJECT *tree, char **bak);
Description  "REStaure ReSsourCe".  Cette fonction restaure  "l'tat"  d'un 
formulaire sauv par la fonction bak_rsc().
Paramtres
'tree' Adresse du formulaire.
'bak' Pointeur sur un pointeur de chane qui sert de buffer de sauvegarde  
la fonction.  Ce buffer est une zone mmoire qui a t rserve  la  bonne 
taille par la fonction bak_rsc(). La mmoire est libre par res_rsc().
Remarques Attention : Si la gestion du formulaire est quitte par 'Annule', 
le  programmeur  doit  appeler  cette fonction  pour  restaurer  l'tat  du 
formulaire.  La zone mmoire est alors libre.  Si la gestion est  quitte 
par 'Confirme',  c'est le programmeur qui doit se charger de la  libration 
de la zone mmoire par :
Mfree (adr_bakrsc);
Sinon, la zone mmoire resterait alloue. Voir aussi la fonction bak_rsc().

5.b.3 Les fonctions des champs ditables
Prototypage
void set_text (OBJECT *adr, int object, char *string);
Description  Cette fonction place un texte dans un objet de type  G_STRING, 
G_BUTTON, G_TEXT, G_BOXTEXT, G_FTEXT, G_FBOXTEXT ou G_USERDEF (dans ce cas, 
les objets BIG comportant un texte).
Paramtres
'adr' Adresse du formulaire.
'object' numro de l'objet concern.
'string' Pointeur sur la chane  placer dans l'objet.
Remarques Voir aussi la fonction get_text().

Prototypage
char *get_text (OBJECT *adr, int object);
Description Cette fonction retourne un pointeur sur le texte d'un objet  de 
type  G_STRING,   G_BUTTON,   G_TEXT,  G_BOXTEXT,  G_FTEXT,  G_FBOXTEXT  ou 
G_USERDEF (dans ce cas, les objets BIG ayant un texte).
Paramtres
'adr' Adresse du formulaire.
'object' Numro de l'objet concern.
retour : Pointeur sur la position de la chane en mmoire.
Remarques Dans le cas d'un objet B_EDIT,  c'est un pointeur sur le dbut de 
la chane de saisie qui est retourne. Voir aussi la fonction set_text().

5.b.4 Les fonctions diverses
Prototypage
char *path (char *pat);
Description  Cette fonction retourne le chemin par dfaut de  l'application 
(le  chemin o chercher le ressource et le fichier  de  configuration,  par 
exemple).
Paramtres
'pat' est un pointeur sur une chane qui contiendra en retour le chemin par 
dfaut. Elle doit tre de taille suffisante.
retour : Un pointeur sur la chane.
Remarques La fonction place le chemin dans la variable de retour 'pat',  et 
retourne en plus un pointeur sur cette chane.

Prototypage
long exist (char *name, int att);
Description  Si  un fichier particulier existe retourne  sa  taille,  sinon 
'FALSE' (0).
Paramtres
'name'  est un pointeur sur la chane du nom du fichier    chercher,  avec 
ventuellement l'indication du chemin.  Les jockers '*' et '?' peuvent tre 
utiliss.
'att'  est  un  masque  de bits reprsentant les  ATTributs  du  fichier   
chercher, selon la rgle GEMDOS.
retour  :  La  fonction  retourne la taille du fichier  (en  octets)    la 
premire occurence trouve, FALSE si elle n'en trouve pas (ou si le fichier 
 une taille nulle !).

Prototypage
void set_palette (int index);
Description  Cette  fonction fixe de nouvelles valeurs pour la  palette  de 
couleurs.
Paramtres
'index'  est  l'index  BIG de la fentre qui a  l'adresse  de  la  nouvelle 
palette dans sa structure. Si '-1' est transmis comme index, la palette par 
dfaut est restaure.
Remarques Vous pouvez appeler directement cette fonction,  par exemple pour 
restaurer la palette par dfaut  la demande de l'utilisateur.

Prototypage
long timer (void);
Description Cette fonction retourne la valeur du timer 200 Hz au moment  o 
elle est appele.
Paramtres
retour : Valeur du timer.
Remarques Cette fonction est trs utile pour servir par exemple de compte  
rebours ou pour mesurer des intervalles de temps.

Prototypage
char *trim (char *str);
Description  Cette  fonction limine les espaces de dbut et de  fin  d'une 
chane.  La  chane transmise est modifie en mmoire,  et un  pointeur  la 
dsignant est retourn par la fonction.
Paramtres
'str' Pointeur sur la chane  traiter.
retour : Pointeur sur la position de la chane en mmoire.

Prototypage
void send_mesag (int type, int wi, int x, int y, int w, int h);
Description Cette fonction permet  l'application de s'envoyer   elle-mme 
un message, de manire  simuler un vnement.
Paramtres
'type'  Type de l'vnement (GEM ou BIG).  Il sera plac dans le mot  0  du 
buffer d'vnement.
'wi' "WIndow". Sera plac dans le mot 3 du buffer. Souvent, c'est le handle 
GEM d'une fentre.
'x' Sera plac dans le mot 4 du buffer. Souvent, c'est une coordonne en x.
'y' Sera plac dans le mot 5 du buffer. Souvent, c'est une coordonne en y.
'w' Sera plac dans le mot 6 du buffer. Souvent, c'est une largeur de zone.
'h' Sera plac dans le mot 7 du buffer. Souvent, c'est une hauteur de zone.
Remarques  Il est parfois trs utile de s'envoyer  soi-mme des  messages, 
pour gnrer un redraw par exemple.

Prototypage
int selector  (char *pat, char *ext, char *file, char *title);
Description Cette fonction appelle et gre le slecteur d'objets GEM.
Paramtres
'pat' "PATh".  Pointeur sur une chane indiquant le chemin d'accs  ouvrir 
dans le slecteur,  sans l'extension  filtrer.  Aprs la fonction,  pointe 
sur le chemin choisi dans le slecteur (la chane doit tre assez longue).
'ext' "EXTension".  Extension  filtrer dans le slecteur.  Les jockers '*' 
et '?' sont autoriss.
'file'   Pointeur   sur  une  chane  contenant  le  nom   du   fichier    
"prslectionner"  dans  le slecteur,  ou chane vide s'il n'y  a  pas  de 
fichier  par  dfaut.  Aprs la fonction,  la chane (qui doit  tre  assez 
longue) contient le nom du fichier slectionn.
'title'  Pointeur  sur la chane  afficher dans le  slecteur  d'objet,   
partir du TOS 1.4.
retour :  TRUE si le slecteur est quitt avec le bouton 'OK',  FALSE  s'il 
est quitt avec le bouton 'Annuler'.
Remarques La fonction teste le numro de version du TOS et ralise un appel 
fsel_input()  (TOS  antrieur  1.4) ou fsel_exinput() (TOS 1.4  ou  plus). 
Comme la fonction GEM, selector() retourne 0 si 'Annule' a t choisi.
Si le slecteur est appel pour choisir un fichier, il faut tester :
if (selector (path, ext, name, title) == TRUE && strlen (name))
Afin de vrifier que c'est le bouton 'OK' qui a t cliqu et qu'un nom  de 
fichier a bien t choisi (L'utilisateur pourrait confirmer sans choisir de 
fichier).
Si  le  slecteur  est appel seulement pour demander    l'utilisateur  un 
chemin (le nom du fichier n'a pas d'importance dans ce cas),  il suffit  de 
tester :
if (selector (path, "\*.*", name, title) == TRUE)
La  principale  diffrence  entre cette fonction et l'appel  direct  de  la 
fonction  GEM est que le chemin d'accs retourn par cette  fonction  aprs 
l'appel est dpouill du filtre d'extension.  Par exemple,  pour accder au 
fichier choisi par l'utilisateur,  il suffit de concatner les deux chanes 
par "strcat (path, name);" pour obtenir son chemin complet dans 'path'.

Prototypage
void extension (char *filename, char *ext);
Description Cette fonction impose une extension  un nom de fichier ou  un 
chemin d'accs.
Paramtres
'filename' Pointeur sur le nom du fichier ou sur le chemin complet.
'ext'  "EXTension".  Pointeur sur l'extension  imposer.  L'extension  doit 
tre  transmise  avec le point,  par exemple ".DOC".  Il  est  possible  de 
transmettre une chane vide ("") pour supprimer l'extension.
Remarques  Cette  fonction est extrmement pratique par exemple  pour  tre 
certain  qu'un  fichier sera sauv avec une  extension  prcise.  Aprs  la 
saisie  du  nom  de fichier dans  un  slecteur  par  l'utilisateur,  cette 
fonction   peut  tre  systmatiquement  appele  de  manire     "forcer" 
l'extension du fichier.
Elle peut galement tre utile dans le cas d'un programme grant une  srie 
de  fichiers  placs dans le mme chemin et tous de mme  nom,  dont  seule 
l'extension change (cas typique des bases de donnes). Avant chaque accs  
un fichier, l'extension voulue est impose.

Prototypage
COOKIE *first_cookie (void);
Description  Cette fonction retourne un pointeur sur le premier  Cookie  du 
cookie jar, ou un pointeur nul s'il n'y en a pas.
Paramtres
retour : Pointeur sur le cookie.

Prototypage
COOKIE *next_cookie (COOKIE *ck);
Description  Cette fonction retourne un pointeur sur le Cookie  suivant  du 
cookie jar, ou un pointeur nul s'il n'y en a plus.
Paramtres
'ck' Pointeur sur le cookie prcdent.
retour : Pointeur sur le cookie.
Remarques Cette fonction s'utilise en collaboration avec first_cookie().

Prototypage
COOKIE *vq_cookie (long id);
Description  Cette fonction cherche un Cookie  d'identificateur  donn,  et 
retourne  un  pointeur sur ce Cookie,  ou un pointeur nul  s'il  n'est  pas 
trouv.
Paramtres
'id' Pointeur sur le cookie prcdent
retour : Pointeur sur le Cookie.
Remarques Cette fonction utilise first_cookie() et next_cookie().

Prototypage
COOKIE *vq_cookie_c (char *c);
Description  Cette  fonction cherche un Cookie par les  caractres  de  son 
identificateur,  et retourne un pointeur sur ce Cookie,  ou un pointeur nul 
s'il n'est pas trouv.
Paramtres
'c' Pointeur sur la chane de caractre qui dfinie le cookie.
retour : Pointeur sur le Cookie.
Remarques Cette fonction utilise vq_cookie().

5.b.5 Les fonctions de fentres
Prototypage
int formw_draw  (OBJECT *adr, int index,
                 int title, int infos, int wed, int fb,
                 int attr, FNCP ricn);
Description  Cette  fonction ouvre une fentre formulaire,  et y  place  le 
formulaire.
Paramtres
'adr' Adresse du formulaire.
'index' Index BIG de la fentre  ouvrir.
'title' Numro de la chane libre contenant le titre de la fentre (-1 s'il 
n'y en a pas).
'infos'  Numro  de  la  chane  libre  contenant  le  texte  de  la  ligne 
d'informations de la fentre (-1 s'il n'y en a pas).
'wed' "Window EDitable" Numro d'objet du champ ditable o doit se trouver 
le curseur au dbut de la gestion (-1 s'il n'y en a pas).
'fb'  "Flag  Boundary" Ce flag force le bit correspondant de  la  structure 
BigWind,  afin que la zone de travail de la fentre soit toujours cale sur 
des multiples de 16.
'attr' "ATTRibuts". Attributs GEM de la fentre.
'ricn' "Redraw ICoN". Routine de dessin du contenu de la fentre  utiliser 
si elle est icnifie.   Si gal  0,  ce sera la routine normale qui  sera 
toujours utilise.
retour :  TRUE si la fentre a t correctement cre et ouverte,  FALSE  en 
cas de problme.
Remarques  La  fonction recherche s'il existe un bouton de  dplacement  de 
formulaire,  et le cache (HIDETREE) si elle en trouve un.  Ceci pour le cas 
o  un  mme formulaire serait utilis par le programme en "normal"  et  en 
fentre.  Le programmeur ne doit pas oublier de rendre  nouveau visible ce 
bouton  si  le formulaire doit ensuite tre  affich  normalement.  D'autre 
part,  la bote racine est dote d'une bordure d'un pixel vers l'extrieur, 
et  l'ventuel attribut OUTLINED est annul.  Si la fentre n'a jamais  t 
ouverte, la fonction centre le formulaire.
L'option de calage sur des multiples de 16 est trs utile. Cela est parfois 
ncessaire  du fait que le formulaire peut contenir des objets trams  (des 
G_BOXs  par exemple).  Si le formulaire est dplac n'importe o  et  qu'un 
redraw est fait sur une partie de l'objet seulement,  le motif de la  trame 
risque d'tre dcal. Le calage vite ce dsagrment.
La gestion de la fentre par le clavier est toujours mise s'il n'y a pas de 
champ  ditable,  et  toujours annule sinon.  Rappelons que  sous  BIG  un 
formulaire en fentre avec des champs ditables ne doit pas tre plac dans 
une  fentre avec ascenseurs ou case de redimensionnement (voir  paragraphe 
2.e).
Si la fentre a t dj ouverte,  puis referme, ses anciennes coordonnes 
sont utilises.
L'tat du formulaire est sauvegard par bak_rsc() dans la zone dsigne par 
l'lment win[index].w_cont.w_form.w_bak.
S'il y a dj trop de fentres ouvertes,  la fonction se charge  d'afficher 
la bote d'alerte correspondante du ressource inclus de BIG.

Prototypage
int open_window (int index, int type, int attr,
                 int x, int y, int w, int h,
                 int wm, int hm, int wu, int hu,
                 int fa, int fb, int fmouse,
                 FNCP ricn, FNCP redr, FNCP clos,
                 char *title, char *info,
                 long wt, long ht,
                 int fmenu, int ftool, int bar);
Description Cette fonction cre et ouvre une fentre.
Paramtres
'index' Index BIG de la fentre  ouvrir.
'type' type BIG de la fentre  ouvrir.
'attr' "ATTRibuts". Attributs GEM de la fentre  ouvrir.
'x'  Position en x de l'angle suprieur gauche de la fentre   ouvrir.  Il 
s'agit de la fentre elle-mme, pas seulement la zone de travail.
'y'  Position en y de l'angle suprieur gauche de la fentre   ouvrir.  Il 
s'agit de la fentre elle-mme, pas seulement la zone de travail.
'w' Largeur de la fentre  ouvrir.  Il s'agit de la fentre elle-mme, pas 
seulement la zone de travail.
'h' Hauteur de la fentre  ouvrir.  Il s'agit de la fentre elle-mme, pas 
seulement la zone de travail.
'wm' "Width Mini".  Largeur minimum que pourra prendre la fentre durant sa 
gestion.  Il  s'agit  de la fentre elle-mme,  pas seulement  la  zone  de 
travail.
'hm' "Height Mini". Hauteur minimum que pourra prendre la fentre durant sa 
gestion.  Il  s'agit  de la fentre elle-mme,  pas seulement  la  zone  de 
travail.
'wu' "Width Unit". Unit de dcalage horizontale de la fentre.
'hu' "Height Unit". Unit de dcalage verticale de la fentre.
'fa' "Flag Arrow".  Si ce flag est TRUE, la fentre pourra tre manipule  
partir du clavier. Elle ne le pourra pas s'il est FALSE.
'fb'  "Flag  Boundary" Ce flag force le bit correspondant de  la  structure 
BigWind,  afin que la zone de travail de la fentre soit toujours cale sur 
des multiples de 16.  Il peut tre mis pour tous les types de fentre, afin 
d'viter  qu'une trame soit dforme  la suite d'un redraw (si la  fentre 
comporte une barre de menu ou une toolbar, les calculs en tiennent compte). 
Relisez  ce  qui  a t expliqu  ce propos dans  la  prsentation  de  la 
fonction formw_draw().
'fmouse' "Flag MOUSE". C'est le numro de forme que le curseur de la souris 
prendra  lorsqu'il sera amen dans la zone de travail de la  fentre  (voir 
fonction  GEM  graf_mouse()).  0  pour garder la  traditionnelle  forme  de 
flche.
'ricn' "Redraw ICoN". Routine de dessin du contenu de la fentre  utiliser 
si elle est icnifie.  Si gal  0,  ce sera la routine normale (paramtre 
suivant) qui sera toujours utilise.
'redr' Pointeur sur la fonction a excuter en cas de message de redraw  sur 
cette fentre.
'clos'  Pointeur sur la fonction a excuter en cas de message de  fermeture 
de la fentre.
'title' Pointeur sur la chane du titre de la fentre,  ou chane vide s'il 
n'y en a pas.
'info' Pointeur sur la chane de la ligne d'infos de la fentre,  ou chane 
vide s'il n'y en a pas.
'wt' "Width Totale". Largeur totale du contenu de la fentre, en pixels.
'ht' "Height Totale". Hauteur totale du contenu de la fentre, en pixels.
'fmenu'  "Flag MENU".TRUE si la fentre doit comporter une barre  de  menu, 
FALSE sinon.
'ftool'  "Flag TOOL".TRUE si la fentre doit comporter une  toolbar,  FALSE 
sinon.
'bar'  Numro de l'arbre qui est le menu ou la toolbar de  la  fentre,  -1 
s'il  n'y en pas.  Une fentre ne peut comporter  la fois un menu  et  une 
toolbar.  Si  les deux paramtres 'fmenu' et 'ftool' sont TRUE,  BIG  donne 
priorit au menu.
retour :  TRUE si la fentre a t correctement cre et ouverte,  FALSE en 
cas de problme (trop de fentres ouvertes).
Remarques C'est la fonction BIG la plus "lourde",  avec ses 24  paramtres. 
Si  la fentre n'a jamais t ouverte,  les lments de sa  structure  sont 
initialiss  avec des valeurs par dfaut ou contenues dans  les  paramtres 
qui sont transmis.  Si elle a dj t ouverte,  puis referme, les valeurs 
de certains lments sont "rafrachis" au moyen des nouveaux paramtres. Si 
elle est dj ouverte,  le rafrachissement est fait,  puis elle est amene 
au premier plan.
Voyez ce qui a t dit pour la fonction formw_draw()  propos du calage  de 
la fentre sur des multiples de 16.
Le  paramtre  'redr' doit tre 0 si la fentre est de  type  WTYP_IMAG  ou 
WTYP_FORM,  car  dans  ce  cas les routines de BIG se  chargent  du  redraw 
automatiquement  (voir la fonction print_page()).  Dans le cas  d'un  autre 
contenu  (texte,  graphique calcul,  etc),  le programmeur doit crire  la 
routine de dessin et l'indiquer par ce paramtre.
Le  paramtre 'clos' indique la fonction  excuter au moment de fermer  la 
fentre.  Cette fonction ne peut pas toujours se contenter de fermer et  de 
dtruire  la fentre,  elle doit parfois aussi librer les  zones  mmoires 
rserves s'il y en a (voir la fonction closed()).
S'il y a dj trop de fentres ouvertes,  la fonction se charge  d'afficher 
la bote d'alerte correspondante du ressource intgr de BIG.

Prototypage
int find_index (int wh);
Description  Cette fonction cherche l'index BIG d'une fentre a  partir  de 
son handle GEM.
Paramtres
'wh'  "Window  Handle".  Handle GEM de la fentre concerne.  Si  '-1'  est 
transmis, la fonction cherche le premier index BIG disponible.
retour :  La fonction retourne l'index BIG de la fentre,  ou -1 si  aucune 
correspondance n'est trouve.
Remarques  En  transmettant '-1' (BLANK) comme  paramtre,  on  obtient  en 
retour le premier index BIG libre, c'est--dire la premire fentre n'ayant 
encore  jamais  t ouverte,  ou '-1' s'il elles l'ont  toutes  t.  Cette 
possibilit est en principe inutile.


Prototypage
int find_window (int mx, int my);
Description  Cette fonction cherche si la zone de travail d'une fentre  se 
trouve  une position donne.
Paramtres
'mx' "Mouse X". Coordonne en x de la position donne.
'my' "Mouse Y". Coordonne en y de la position donne.
retour  :  Handle  GEM de la fentre dont la zone de travail passe  par  ce 
point, FALSE s'il n'y en a pas.
Remarques Attention, la fonction retourne le handle GEM, pas l'index BIG.

Prototypage
void zone_work (int index, int *xw, int *yw, int *ww, int *hw);
Description  Cette fonction calcule les coordonnes de la zone  de  travail 
d'une fentre, quels que soient ses attributs et son type.
Paramtres
'index' Index BIG de la fentre.
'xw',  'yw',  'ww', 'hw' Variables de retour : coordonnes et dimensions de 
la zone de travail de la fentre.
Remarques  Si  la fentre possde un menu droulant  ou  une  toolbar,  les 
coordonnes  retournes ne reprsentent que la zone de  travail  proprement 
dite,  sans le menu ou la toolbar.  Sous BIG,  il est conseill  d'utiliser 
cette  fonction  systmatiquement,  plutt que la  fonction  GEM  'wind_get 
(WF_WORKXYWH)', qui ne tiendrait pas compte du menu ou de la toolbar.

Prototypage
void height_sliders (int index);
Description Cette fonction calcule et fixe les positions et les tailles des 
sliders d'une fentre.
Paramtres
'index' Index BIG de la fentre  traiter.

Prototypage
void draw_object (int object, int index);
Description Dessine un objet faisant partie d'un formulaire,  d'une toolbar 
ou d'un menu en fentre, en ne dessinant que la partie visible.
Paramtres
'object' Numro de l'objet  dessiner.
'index' Index BIG de la fentre qui contient le formulaire,  la toolbar  ou 
le menu.
Remarques Cette fonction s'utilise comme la fonction GEM objc_draw(),  mais 
uniquement pour les formulaires,  toolbars ou menus en fentre. Elle permet 
de  dessiner  un ou plusieurs objet(s) qui sont partiellement  hors  de  la 
fentre ou de l'cran, ou qui sont recouverts par une autre fentre.

Prototypage
void print_page (int index);
Description  Cette  fonction  affiche le contenu entier  d'une  fentre  en 
tenant compte des parties recouvertes par d'autres fentres, etc.
Paramtres
'index' Index BIG de la fentre concerne.
Remarques Si la fentre contient un formulaire,  il est redessin au  moyen 
des fonctions GEM.  Si elle contient un menu ou une toolbar, il ou elle est 
redessin(e) de mme.  Si le contenu est une image, La fonction vro_cpyfm() 
est  utilise si une image est effectivement stocke   l'adresse  indique 
par  win[index].w_cont.w_img.w_blk  (la  copie est dcale  si  la  fentre 
possde en plus un menu ou une toolbar).  Sinon, la fentre est "vide" par 
un  rectangle blanc.  Dans les autres cas,  la fonction appelle la  routine 
d'affichage indique par le pointeur sur fonction win[index].w_redraw.
Cette fonction ne gnre pas de message de redraw artificiel,  elle demande 
directement la liste des rectangles de cette fentre (qui est en permanence 
disponible,  il suffit de la demander au GEM).  Il ne faut l'appeler que si 
un  message de redraw n'est PAS envoy,  sinon la fentre  serait  dessine 
deux fois.

Prototypage
void topped (void);
Description Cette fonction fait passer une fentre au premier plan.
Remarques La fonction cherche dans le mot 3 du buffer d'vnements (buf[3]) 
le handle GEM de la fentre  traiter.
Il est commode d'appeler cette fonction  partir d'une fonction de mise  au 
premier  plan  spcialement crite pour une fentre  en  particulier.  Cela 
permet  par  exemple de tester si on doit amener effectivement  la  fentre 
clique au premier plan, ou si on doit simplement activer une option (si la 
fentre  est un formulaire).  Il suffit d'appeler topped pour la mettre  en 
premier plan, ou de faire autre chose sinon.

Prototypage
void closed (void);
Description Cette fonction ferme une fentre et la dtruit du point de  vue 
du GEM.
Remarques  L'lment  win[index].w_hg de la structure BigWind est mis    0 
pour  indiquer  que  la  fentre   dj  t  ouverte,  mais  qu'elle  est 
actuellement ferme.
Si  la fentre contenait un formulaire,  La zone mmoire rserve  pour  la 
sauvegarde  de son tat est libre.  Si elle possdait un  menu,  la  zone 
mmoire  rserve  pour la construction de ce menu  est  libre.  Si  elle 
possdait une toolbar, le pointeur w_bar est annul.
Cette  fonction  cherche  dans le mot 3 du  buffer  d'vnements  (variable 
globale  'buf')  le  handle GEM de la fentre   fermer,  ce  qui  explique 
qu'aucun paramtre ne lui soit transmis.
Toutefois,  Si vous avez une fentre contenant du texte par  exemple,  vous 
devrez sans doute crer une fonction de fermeture de fentre et  l'affecter 
comme pointeur sur fonction  l'lment win[index].w_close de la  structure 
BigWind,  afin  que votre fonction libre la zone mmoire rserve pour  le 
texte.  Le plus simple est que votre fonction appelle elle-mme la fonction 
closed(),  mais  vous  devrez avant cet appel mettre le handle  GEM  de  la 
fentre dans le mot 3 du buffer d'vnements par :
buf[3] = win[index].w_hg;
closed();

Prototypage
void fulled (void);
Description  Cette fonction met la fentre en pleine taille ou la ramne   
sa taille prcdente.
Remarques La fonction cherche dans le mot 3 du buffer d'vnements (buf[3]) 
le handle GEM de la fentre  traiter. Elle tient compte de l'ventuel flag 
de calage sur des multiples de 16 pixels et met  jour le bit WFFULL.
Pour  le  retour   la taille prcdente,  elle  utilise  la  fonction  GEM 
wind_get() avec le paramtre 'WF_PREVXYWH'. Toutefois, sur les anciens TOS, 
si une fentre est aggrandie  sa taille maximale,  puis qu'on passe   une 
autre en utilisant le raccourci clavier <Control + Tab>,  et qu'on  revient 
sur la premire,  le GEM a "oubli" ses dimensions antrieures. Dans le cas 
d'une fentre image, si cette image est plus petite que l'cran, la fentre 
aura comme "pleine taille" les dimensions de l'image et non de l'cran.
Il  est commode d'appeler cette fonction  partir d'une fonction de  pleine 
ouverture crite pour une fentre en particulier.

Prototypage
void sized (void);
Description Cette fonction redimensionne une fentre.
Remarques La fonction cherche dans le mot 3 du buffer d'vnements (buf[3]) 
le handle GEM de la fentre  traiter. Elle annule le bit WFFULL.
Il  est  commode  d'appeler  cette fonction    partir  d'une  fonction  de 
redimensionnement spcialement crite pour une fentre en particulier.

Prototypage
void moved (void);
Description Cette fonction dplace une fentre.
Remarques La fonction cherche dans le mot 3 du buffer d'vnements (buf[3]) 
le handle GEM de la fentre  traiter. Elle tient compte de l'ventuel flag 
de calage sur des multiples de 16 pixels et annule le bit WFFULL.
Il  est  commode  d'appeler  cette fonction    partir  d'une  fonction  de 
dplacement spcialement crite pour une fentre en particulier.


6. Le source de BIGdemo
Mme  s'il n'est pas trs compliqu en soit,  le concept  de  programmation 
sous  BIG doit sans doute paratre un peu confus  celui qui l'aborde  pour 
la premire fois. Si vous avez lu la prsente documentation jusque l, vous 
savez  en principe tout ce qu'il y a  savoir pour commencer   travailler. 
Pourtant, il est probable que dans la pratique ce ne soit pas aussi clair !
Nous  allons  aborder l'tude du source de la dmo.  Je vous  conseille  de 
l'tudier attentivement,  il contient sans doute la rponse  la plupart de 
vos questions.  Pour celles qui resteraient sans rponse,  ou s'il subsiste 
des doutes, n'hsitez pas  me contacter.
Il  serait fastidieux d'examiner toutes les lignes du source une  par  une, 
nous nous contenterons de dtailler les parties relatives  BIG.

6.a Le ressource
Comme nous l'avons dj fait remarqu,  une grande partie des  informations 
et  de la structure du programme se trouve dans  le  ressource.  Jetons-lui 
donc un coup d'il.
* Le  premier  arbre  est celui du menu.  Les options  "BIGdemo  /  Infos", 
"Formulaires  /  Formulaire  libre",   "Fentres  /  Petit  formulaire"  et 
"Fentres  /  Grand formulaire" sont de type  pointeur  sur  fonction.  Une 
fonction  doit donc leur tre associe.  Nous n'avons rien d'autre   faire 
que d'indiquer le type B_FNCP (51) comme type tendu.
L'option  "Fentre  / Fentre normale" doit appeler un  menu  hirarchique. 
Nous plaons une petite flche  droite de l'option (BIG remplace  l'avant-
dernier caractre par une flche vers la droite ou la gauche),  et  surtout 
nous  signalons  le type B_HIERM (41),  ainsi que le numro  du  formulaire 
associ  dans  l'octet  haut  de l'ob_state  tendu  (la  numrotation  des 
formulaires commence  zro).
* Le bureau n'appelle pas de commentaire particulier. La bote de fond sera 
redimensionne  par  BIG  en  fonction  de la  taille  du  bureau  dans  la 
rsolution  courante.   Les  autres  objets  ne  possdent  aucun  attribut 
particulier.   BIG  traite  le  bureau  un  peu  diffremment  des   autres 
formulaires,  et  informe le programme de tout ce qui s'y passe.  C'est  le 
programme  qui  doit  agir en consquence.  Mais les objets  du  bureau  ne 
doivent possder AUCUN flag EXIT, TOUCHEXIT, etc.
* Le formulaire principal de la dmo est plus complexe.  Comme nous voulons 
qu'il  ait  un look "3D",  nous donnons une trame 50 %  la B_BOX  qui  est 
l'objet-racine  de  ce formulaire.  Comme nous le verrons dans  l'tude  du 
source,  cette  trame  sera remplace en mode 16 couleurs ou plus  par  une 
trame 100 % de couleur 8 (gris clair), car l'effet de relief est ainsi bien 
plus beau.
La  chane  graphique porte le type tendu B_GRASTR (19) et  les  attributs 
graphiques dans l'ob_state.  De mme pour les deux cadres B_FRAME (20). Les 
radio-boutons  sont  de type B_SELEC (18) avec les  attributs  obligatoires 
SELECTABLE  et  RBUTTON.  Les boutons cochs  sont  identiques,  sans  tre 
RBUTTON.   Nous   indiquons  pour  chacun  de  ces  boutons  le   caractre 
d'quivalent  clavier en le faisant prcder d'un '['.  BIG se chargera  du 
reste, mais nous devons nous assurer qu'un caractre n'est pas utilis deux 
fois  dans  le  mme formulaire.  Le bouton d'alerte est  un  pointeur  sur 
fonction. Plaons le type B_FNCP.
Nous  affectons  au  pop-up texte le type tendu B_POPUP  afin  qu'il  soit 
dessin en accord avec le fond (pour les besoins de la 3D),  et qu'il  soit 
muni d'une icne "option suivante". Le pop-up image n'a pas de type tendu, 
mais (comme le pop-up texte) il est obligatoirement SELECTABLE et SHADOWED. 
De  plus,  le numro du formulaire associ est plac dans l'octet  haut  de 
l'ob_state  de  chacun des deux pop-ups.  La rgle sous GEM est  de  donner 
l'attribut  SHADOWED  aux  boutons pop-up,  afin  de  les  distinguer  plus 
facilement.  C'est  une obligation sous BIG.  Mais comme cet  attribut  n'a 
aucune consquence visuelle sur un objet de type G_IMAGE,  nous plaons cet 
objet  dans  une  G_BOX  SHADOWED pour  respecter  la  tradition.  Je  vous 
conseille de faire toujours ainsi dans le cas de pop-up image.
Le premier des deux champs ditables est de type B_EDIT.  Nous plaons donc 
dans  l'ob_state  la  longueur (en caractres) du texte  qu'il  va  pouvoir 
accueillir (50, vous pouvez la changer). N'oublions pas les petites flches 
de part et d'autre,  ni les espaces qui les accompagnent (voir le  chapitre 
3.e).
Le  bouton  de dplacement du formulaire est plac dans le  coin  suprieur 
droit.  C'est  une  G_IBOX OUTLINED,  CROSSED et TOUCHEXIT de  type  tendu 
B_MOVE (17).
Le bouton 'Confirme' sera le bouton par dfaut.  Nous lui donnons en  outre 
le type B_UNDER afin qu'il ait un quivalent clavier par caractre soulign 
et  qu'il  soit  dessin en 3D.  'Annule' doit tre activ  par  la  touche 
<Undo>,  donnons-lui donc le type tendu B_UNDO (31), et nous lui affectons 
galement  un caractre soulign.  Nous plaons galement un bouton  d'aide 
qui  sera  activ  par la touche <Help>,  sous  la  forme  d'une  G_BOXTEXT 
OUTLINED,  SHADOWED en petit texte,  de type B_HELP (21),  et le numro  du 
formulaire d'aide associ dans l'ob_state tendu du bouton.
Afin que l'ensemble ait un aspect 3D,  nous activons le bit BackGround  (le 
bit  10  d'ob_flags)  la chane de titre,  aux deux  B_FRAMEs,  au  pop-up 
texte, aux ditables et aux deux boutons de sortie.
* Nous  trouvons ensuite les deux formulaires pop-up texte utiliss par  la 
dmo.  Les options sont des G_STRINGs qui peuvent tre DISABLED.  Nous  les 
faisons prcder par deux espaces pour rserver la place de la  check-mark. 
La surface entire de la bote racine doit tre recouverte. Cette bote est 
SHADOWED,  toujours pour respecter les normes. Il est interdit de placer un 
B_FNCP dans un pop-up.  Le premier de ces pop-ups est videmment trop  haut 
(avec ses 60 options) pour tre affich sur l'cran.  Il sera affich  soit 
en pop-liste, soit en scroll-menu.
* La  bote  d'information possde deux boutons  B_HELP.  Le  premier  dans 
l'ordre de numrotation ('Contact') sera activ par la touche <Help>,  mais 
pas le second, qu'il faudra imprativement cliquer  la souris. Par contre, 
il  sera  gr internement par BIG comme une  aide,  sans  intervention  du 
programme  lui-mme.  L'image  est adapte  la haute  rsolution  et  sera 
dforme en couleur,  ce qui n'est pas bien grave pour la dmo. Je n'ai pas 
voulu compliquer les choses.
* Le  formulaire suivant est une aide.  Nous y trouvons  un  B_GRASTR,  des 
B_FRAMEs,  et un bouton de sortie dont la prsence est obligatoire avec les 
attributs EXIT, SELECTABLE et DEFAULT.
* Nous  arrivons  au petit formulaire  en  fentre.  Seule  nouveaut,  les 
boutons 'Confirme' et 'Annule' doivent fermer la fentre.  Nous devons pour 
cela positionner le premier bit de l'octet haut de l'ob_state.  Les boutons 
'Applique  '  et  'R.A.Z.' seront respectivement activs  par  les  touches 
<Return>  et  <Undo>,  mais  sans fermer  la  fentre.  Vous  pouvez  faire 
l'exprience  d'oter le bit de fermeture des deux premiers pour les  placer 
dans les deux autres.  Ce formulaire possde en outre des radio-boutons qui 
sont en fait des G_BOXs dont le dessin est confi au GEM, et quatres champs 
ditables, dont deux tendus.
Ce formulaire tant destin  tre dessin en 3D,  nous donnons une trame  
l'objet-racine  et nous positionnons le bit BackGround des  objets  lorsque 
cela est ncessaire (les ditables, les boutons et le titre).
* Le grand formulaire ne prsente rien de nouveau.
* L'arbre suivant est le menu de fentre. Dans l'diteur de ressource, nous 
le  crons  comme un menu ordinaire.  BIG se chargera de  le  "fentriser". 
L'option 'Infos' est un B_FNCP. L'option 'Icnes' du menu 'Alertes' est une 
B_HIERM.  L'octet haut de son ob_state reoit donc le numro du  formulaire 
associ : 15 dans ce cas.
* Voici ensuite le menu hirarchique du menu principal.  Il est cr  comme 
un pop-up ordinaire,  mais on peut y placer n'importe quel type d'objet, ou 
un mlange de plusieurs types. A part cela, mmes remarques. Dans le cas de 
la dmo, les 2 premires options sont de type B_FNCP, pas la troisime.
* Nous arrivons au pop-up image.  Il est constitu de G_IMAGEs.  Les  mmes 
remarques que pour les pop-ups texte s'appliquent ici.
* L'arbre suivant est le pop-up libre,  en tout point semblable  un pop-up 
texte appel par un bouton de formulaire, mais il peut possder des B_FNCPs 
(c'est le cas dans la dmo).
* Le formulaire d'aide "CONTACT" a une particularit :  il ne comporte  pas 
de bouton de sortie.  Pourtant,  nous avons vu que c'est obligatoire  !  En 
fait,  une  G_IBOX  EXIT DEFAULT SELECTABLE sans cadre  recouvre  toute  la 
surface du formulaire. Ainsi, on peut cliquer n'importe o pour sortir.
* Un autre formulaire d'aide vient alors.
* Le formulaire suivant est le menu hirarchique du menu en fentre. Seules 
les deux premires options sont "normales", les autres tant des B_FNCPs.
* Ensuite nous trouvons le formulaire de remerciements, qui est bti sur le 
mme modle que celui du contact.
* Nous  dcouvrons    prsent  la toolbar de  la  fentre  texte.  Un  tel 
formulaire est construit comme n'importe quel autre,  avec des  quivalents 
claviers, des pop-ups, etc. Sont bannis les objets EXIT ou TOUCHEXIT, ainsi 
que  les  champs ditables.  L encore,  nous donnons un aspect  de  relief 
(trame pour l'objet-racine, bit BackGround o c'est ncessaire).
* Enfin,  viennent les deux formulaires pop-ups appels par la toolbar.  Le 
premier pour les tailles de caractre, le second pour les polices. Celui-ci 
est  constitu de 41 G_STRINGs,  dont seule la premire est pour  l'instant 
active. C'est la police "Systme", par dfaut. Les autres chanes sont pour 
l'instant DISABLEDs,  et contiennent des textes de remplissage provisoires. 
La  dmo  devra les remplacer par les noms des  polices  charges,  et  les 
activer.
* Aprs  les formulaires viennent les chanes libres.  La premire  est  en 
fait  une alerte.  Elle peut tre constitue de 5 lignes de  31  caractres 
chacune (le premier tant gnralement un espace,  il en reste 30), et de 3 
boutons  de  20  caractres  chacun.   9  dessins  d'icnes  sont    votre 
disposition  (Voir la description de la fonction big_alerte()  au  chapitre 
5.b.2).
* L'alerte suivante est celle qui est affiche par le menu hirarchique  de 
la  fentre avec  chaque fois une icne diffrente,  et la  troisime  est 
celle appele par le bouton 'Alerte' du formulaire principal.
* Les  chanes suivantes sont dans l'ordre les titres des  fentres  'Petit 
formulaire' et 'Grand formulaire', les textes de slecteur d'objet 'Charger 
texte' et 'Charger image', Les titres des deux fentres correspondantes, le 
titre  de la fentre avec menu,  celui de la fentre d'histogrammes  et  sa 
ligne d'informations. On trouve ensuite la chane qui sera utilise lorsque 
la dmo est lance en accessoire :  celle qui apparatra dans le menu, puis 
celle  qui  servira  de titre  la fentre principale  ouverte  en  cas  de 
fonctionnement  en accessoire de bureau.  Il est recommand,  surtout  sous 
BIG,  de  placer  TOUS  les  textes  utiliss  par  l'application  dans  le 
ressource. Premire raison : c'est du pur GEM. Seconde raison : dans le cas 
d'un  ressource externe,  cela rend plus facile la modification  (pour  une 
traduction  ou un changement de raccourcis clavier par  exemple)  puisqu'il 
n'est  pas  ncessaire de recompiler le source.  De plus,  (surtout  si  le 
ressource est intgr), cela homognise la faon de traiter ces chanes.
* Finalement,  les  deux  derniers  objets du ressource  sont  deux  images 
libres :   celles  qui  seront  utilises  pour  le  dessin  des   fentres 
icnifies.  Une image pour les fentres de type formulaire, une image pour 
les autres.
Nous  avons  fait le tour du ressource de la dmo.  Comme vous  l'avez  vu, 
beaucoup  de choses y figurent,  non seulement l'aspect des formulaires  et 
des objets, mais aussi une bonne partie de la structure du programme, grce 
aux pointeurs sur fonctions et aux pop-ups et aides associs.


6.b Le source
J'ai essay de raliser une dmo complte,  prsentant la programmation  de 
tous les aspects importants de BIG.  Ainsi, certains appels de fonctions se 
font  par  B_FNCP  et d'autres non,  afin de montrer  comment  traiter  les 
vnements  BIG  et  d'autres points.  S'il  s'tait  agit  d'un  programme 
"normal",  certaines  parties auraient t traites de manire encore  plus 
simple.  Cette  dmo,  comme son nom l'indique,  est une dmonstration  non 
seulement de ce que BIG peut raliser comme type d'interface, mais aussi de 
comment programmer tous les dtails de BIG. Le source aurait pu tre encore 
plus court !
La  premire  ligne " #include <big.h> " est  particulirement  importante, 
c'est elle qui ouvre la porte  BIG. Vous noterez que la dmo n'utilise que 
trois  variables  globales,   ncessaires  pour  la  gestion  des   polices 
SpeedoGDOS,  qui n'a rien  voir avec l'interface proprement dite  (j'avoue 
avoir  inclu cette gestion  la dmo pour me faire un  petit  plaisir).  La 
programmation  d'une  interface sous BIG ne  ncessite  normalement  aucune 
autre globale que celles qui sont dfinies par BIG.H.
Ensuite,  nous  signalons  au  compilateur que  nous  travaillons  avec  un 
ressource  externe,  au moyen de la dfinition 'INTGR'.  Suivent alors  des 
instructions  destines  au  prprocesseur  afin  que  le  programme   soit 
correctement compil.  Vous pouvez faire l'exprience de recompiler la dmo 
en  remplaant  '0'  par  '1'  dans  la  ligne  "#define  INTGR  0",   elle 
fonctionnera dsormais avec un ressource intgr sans autre modification.
Nous dfinissons le nombre maximum de fentres avec lesquelles nous  allons 
travailler (7), et nous leur dfinissons  chacune un nom, par commodit.

6.b.1 La fonction main()
Le premier appel du programme est la fonction initial().  Sous BIG, il faut 
TOUJOURS  commencer par cela.  Par cette simple ligne,  nous  chargeons  le 
ressource (externe),  nous crons et mettons en place les objets  USERDEFs, 
le  tableau des structures de fentres,  celui des pointeurs sur  fonction, 
nous imposons le bureau de l'application et son menu,  et nous initialisons 
les  principales  variables  globales,  ainsi  que  certains  lments  des 
structures  de  fentres   des valeurs par dfaut.  Si  le  ressource  est 
intgr,  les  coordonnes  et  dimensions des objets sont  adaptes    la 
rsolution courante,  s'il s'agit d'un accessoire il est dclar au GEM  et 
son titre plac dans le menu.  A elle seule,  cette fonction fait gagner de 
nombreuses lignes de programme (et pas mal de temps !).
La dmo utilise 22 objets B_FNCPs.  Nous devons "relier" les fonctions  aux 
objets correspondants,  ce qui est fait par la srie de lignes qui suit. La 
ligne  "fnc[0]  =  (void *) aff_infos;" relie l'option  du  menu  principal 
'Infos'  (qui  est  le premier objet B_FNCP du  ressource)    la  fonction 
aff_infos(). Les lignes suivantes font la mme chose, mais vous remarquerez 
qu'il  faut absolument traiter les objets dans l'ordre o ils sont dans  le 
ressource  (revoyez  le  chapitre  3.b).  Il  faut  bien  entendu  que  les 
diffrentes  fonctions  ait  t  correctement  prototypes.  Il  faut  les 
affecter  dans cet ordre,  car c'est ainsi que la fonction initial()  place 
dans  l'octet haut de l'ob_state de chaque B_FNCP l'index  de  tableau.  Je 
rappelle que cela implique qu'il ne peut y avoir plus de 256 pointeurs  sur 
fonction  par application.  Cette limite est assez large et ne devrait  pas 
poser de problmes particuliers.
Vous noterez galement qu'une mme fonction peut tre affecte  des objets 
diffrents.  La  fonction  aff_infos() est relie aussi   l'lment  5  du 
tableau.
Nous rencontrons ensuite le chargement des fontes vectorielles  SpeedoGDOS. 
Aprs  un  test de la prsence de Speedo,  nous lui  demandons  de  charger 
toutes les fontes disponibles.  Une boucle nous permet ensuite de rcuprer 
le  nom de chacune d'entre elle et de le placer dans le  formulaire  pop-up 
qui  est destin  les afficher (sans oublier d'en activer les options  qui 
taient DISABLED). Nous initialisons galement  des valeurs par dfaut les 
variables de gestion des polices.
Si nous travaillons en mode 16 couleurs ou plus, nous excutons la fonction 
relief(),  qui modifie la trame et la couleur des objets-racines des arbres 
concerns.
Nous  pouvons  aprs  cela  aborder directement  la  boucle  principale  du 
programme, tout est dj prt ! Il s'agit d'une grande boucle 'do...while'. 
Si  on tourne en accessoire,  et que celui-ci n'est pas  actif,  nous  nous 
tournons de suite vers une boucle secondaire (dans la fonction acc_loop()), 
qui attend que l'accessoire soit appel.  Nous y reviendrons.  La ligne  la 
plus importante de la boucle principale est :
evnt = dialog (DLG_DESK, adr_desk, TRUE, TRUE, PU_LIBRE, &img, FALSE);
Cet appel de la fonction dialog() ralise une quantit de choses. Examinons 
les paramtres transmis.
'DLG_DESK' C'est un masque de bits dfini par BIG.H.  Il signale qu'il faut 
scruter un bureau. Seront donc surveills : le clavier (pour la gestion des 
raccourcis  clavier  et des fentres manipulables au  clavier),  les  clics 
souris (pour l'icne et les textes),  la zone o se trouve la souris  (pour 
les changements de forme dans les fentres),  les messages (pour le menu et 
les fentres),  et le timer,  pour reprendre la main  tout moment et  pour 
les  menus  hirarchiques,  le traitement de la palette de couleurs  et  la 
gestion du clic droit.
'adr_desk' est l'adresse du formulaire  traiter, le bureau dans ce cas.
'TRUE' Ce flag signale  la fonction que nous travaillons sur un bureau. La 
fonction  ragit de manire un peu diffrente dans le cas d'un bureau  (par 
rapport   un formulaire).  Elle retourne au programme principal  tous  les 
vnements de clic qui se produisent sur le bureau, afin que le programmeur 
puisse crer un bureau correspondant aux besoins de son application.
'TRUE' Oui,  un clic sur le bouton droit de la souris doit appeler un "pop-
up libre".
'PU_LIBRE' C'est le numro d'arbre (dans le ressource) du formulaire pop-up 
libre.
'&img' Inutilis dans le cas du bureau,  ce serait un pointeur sur le  MFDB 
dcrivant le fond du formulaire.
'FALSE'  Egalement  inutilis  ici (doit tre  FALSE),  c'est  le  flag  de 
dplacement du formulaire.
La  fonction traite ensuite les vnements reus en retour.  Elle  commence 
par  les  vnements  MU_MESAG.  Le premier type  trait  est  MN_SELECTED, 
vnement de menu. Trois options seulement sont traites ici ('Big Alerte', 
'Quitter'  et 'Fentre menu').  Les autres tant des B_FNCPs,  la  fonction 
dialog()  fait  le  ncessaire pour que  la  fonction  correspondante  soit 
excute.  Je  vous  conseille de ne pas traiter l'option  'Quitter'  d'une 
application  par  pointeur,  mais de revenir  la  boucle  principale  pour 
sortir. C'est plus lisible et plus logique.
Ensuite sont traits les vnements de menu hirarchique du menu principal, 
qui  sont d'un type propre  BIG.  Etant donn que dans la dmo,  il n'y  a 
qu'une option de ce menu hirarchique qui ne soit pas un B_FNCP,  il n'y  a 
pas  d'autres  tests  faire.  Sinon,  il faudrait videmment  chercher  de 
quelle option il s'agit.
Nous  surveillons ensuite,  pour le cas o nous serions en  accessoire,  le 
message  AC_CLOSE,  qui  survient lorsque l'accessoire est  ferm  par  une 
intervention extrieure,  gnralement parce que nous avons lanc ou quitt 
une autre application (cela ne se produit pas sous MultiTOS).  Dans la mme 
situation,  nous devons galement noter que l'accessoire est ferm si  nous 
fermons sa fentre principale, ce qui est fait par le test suivant.
Nous traitons ensuite les vnements MU_BUTTON.  Mais comme plusieurs types 
d'vnements  BIG  sont   base  de  MU_BUTTON,  il  faut  dtailler.  Nous 
commenons  par  les vnements de pop-up libre  (BEV_FREEPU).  Seules  les 
options  'Big alerte' et 'Fentre menu' sont  examiner,  les autres  tant 
des B_FNCPs.
Nous  examinons  ensuite  les  MU_BUTTON  /  BEV_WFORM,   c'est--dire  les 
formulaires en fentre. Si un clic a eu lieu dans un de ces formulaires, le 
message  arrive  ici.  Nous  traitons  sparemment le  petit  et  le  grand 
formulaire  en fentre,  en ne nous intressant qu'aux  boutons  EXIT,  les 
autres (pop-up, slectables, radio-boutons, etc) tant grs par l'appel de 
dialog().
Nous  n'avons  pas  grand-chose  faire.  Si le bouton  est  'Confirme'  ou 
'Applique', nous librons la mmoire de sauvegarde de l'tat du formulaire, 
et nous enregistrons le nouvel tat.  Dans le cas de 'Confirme', dialog() a 
dj fait le ncessaire pour que la fentre soit ferme.  Nous devons aussi 
appeler  la  fonction de dmo objets_desk() (pour le grand  formulaire)  ou 
trame_desk()  (pour le petit).  Si le bouton est 'Annule'  ou  'RAZ',  nous 
restaurons l'tat antrieur,  la mmoire est automatiquement libre.  Mme 
remarque  pour  la fermeture de la fentre.  Pour  le  bouton  'RAZ',  nous 
demandons    rafficher  le  contenu de la  fentre  pour  actualiser  les 
modifications. C'est tout !
Nous traitons ensuite les vnements MU_BUTTON / BEV_WMENU,  les vnements 
de  menu  en  fentre.  Premier cas :  il s'agit de la  fentre  avec  menu 
"normale".  L'option 'Infos' est un B_FNCP,  nous la laissons de cot. Pour 
les  autres,  nous forons l'tat SELECTED du titre de menu (il  n'est  pas 
slectionn  automatiquement  si  la fonction est  appele  par  quivalent 
clavier), et nous traitons l'opration. Pour l'alerte, vous remarquerez que 
la  check-mark est place dans ce menu avec la fonction  GEM  menu_icheck() 
comme s'il s'agissait d'un menu normal.
Second  cas  :  il  s'agit  de la fentre avec  menu  qui  est  la  fentre 
principale de la dmo lors d'un fonctionnement en accessoire.  Dans ce cas, 
le menu principal se trouve dans cette fentre.  Nous procdons de mme, en 
ne nous occupant que des options qui ne sont pas des B_FNCPs.
Nous examinons ensuite les vnements MU_BUTTON / BEV_WHIER, les vnements 
de menu hirarchique de menu en fentre.  L encore,  il peut s'agir de  la 
fentre  avec menu ordinaire ou de celle de l'accessoire.  Dans le  premier 
cas, seules les deux premires options sont  traiter, les autres tant des 
B_FNCPs.  Nous  nous contentons d'appeler la fonction icone()  aprs  avoir 
plac  dans  le mot 6 du buffer ce qu'elle va y chercher  :  le  numro  de 
l'option  clique.  Dans l'autre cas,  seule l'option d'histogrammes est   
traiter.
Ensuite,  nous nous occupons des vnements de type BEV_TOOL, les clics sur 
des objets d'une toolbar.  Dans la dmo, nous devons seulement agir dans le 
cas d'un choix de police ou de taille de caractre, et appeler une fonction 
qui modifie les variables globales correspondantes.  Ensuite,  et mme s'il 
s'agit  d'autres  objets,  nous  raffichons  le  contenu  de  la  fentre. 
Normalement,  nous  ne devrions effectuer le redraw que si un  paramtre  a 
effectivement t chang. Ce n'est pas le cas dans la dmo.
Il  reste    traiter les clics souris directement sur  le  bureau.  Je  ne 
dcrirais pas en dtail cette partie qui ne prsente aucune difficult (par 
prcaution, nous vrifions qu'il n'y a pas de fentre  l'endroit du clic). 
La manire de traiter le bureau dpend fortement de l'application.  Dans la 
dmo je me suis content de crer quelque chose de trs gnral.
Le  seul impratif,  c'est que les objets du bureau n'ait pas  un  ob_flags 
EXIT ou TOUCHEXIT ou autre chose (sauf ventuellement  LASTOB).  Sinon,  la 
fonction  dialog()  tenterait de les traiter   sa  faon.  En  fait,  elle 
travaille de la faon suivante :  si le clic a lieu dans la zone de travail 
d'une fentre,  il est trait par dialog(). s'il a lieu sur un des lments 
de la fentre (bouton de redimensionnement par exemple),  il est ignor (le 
GEM va gnrer un MU_MESAG qui sera trait sparment).  S'il a lieu sur un 
des objets du formulaire dont dialog() a reu l'adresse en paramtre,  elle 
tente de le grer en fonction des flags de cet objet.  Enfin, elle retourne 
l'vnement au programme.
Pour un bureau,  qui ncessite une gestion  chaque fois particulire, nous 
voulons que dialog() nous signale simplement le clic sans rien faire,  afin 
que nous dcidions de ce qui doit tre ralis.  Dans la dmo,  si  l'icne 
tait   EXIT   et   SELECTABLE,   dialog()   la   slectionnerait   et   la 
dslectionnerait    chaque  clic sur l'icne,  mais  ne  pourrait  ni  la 
dplacer ni la dslectionner lors d'un clic "dans le vide".  En  procdant 
ainsi,  nous devons faire les choses " la main",  mais nous faisons ce que 
nous voulons.
La  fin de la boucle 'do...while' teste la variable 'quit',  qui  est  mise 
'TRUE' si la sortie du programme est demande. Si des fontes Speedo ont t 
charges,  elle  sont  libres,  puis  la fonction  end()  est  simplement 
appele, en lui signalant que nous travaillons avec un ressource externe.
Cette  fonction libre les diffrentes zones mmoire qui ont t  rserves 
(pour les structures de fentre, les userdefs, les pointeurs sur fonctions, 
les ditables tendus,  le buffer d'cran et la palette par  dfaut),  elle 
ferme toutes les fentres (du moins,  celles qui sont  notre application), 
elle libre le ressource, ote le menu et restaure le bureau GEM.

6.b.2 La gestion des formulaires
Nous arrivons  la fonction qui gre le 'formulaire libre' de la dmo. Nous 
devons  dclarer  un MFDB qui dcrira le fond du  formulaire.  Il  ne  sera 
utilis que si nous demandons un dplacement du formulaire en bote fantme 
(ou s'il n'y a pas assez de mmoire pour le raliser en temps  rel).  Nous 
inversons le titre de menu du menu principal ou de la fentre en accessoire 
(pour  le cas o la fonction a t appele par raccourci clavier ou  pop-up 
libre),  nous bloquons l'AES par wind_update(), nous demandons l'adresse du 
formulaire  (des instructions de prprocesseur et la dfinition 'INTGR'  du 
dbut  du  source  signalent au compilateur  si nous  travaillons  avec  un 
ressource  intgr  ou non),  et nous sauvegardons son tat  dans  la  zone 
dsigne par le pointeur 'adr_bakrsc' au moyen de la fonction bak_rsc(). La 
trame du fond et des champs ditables est modifie si nous nous trouvons en 
16 couleurs ou plus.
Nous pouvons enfin demander l'affichage par formm_draw().  Nous prcisons  
cette  fonction  l'adresse  du formulaire,  le champ ditable  o  doit  se 
trouver  le curseur au dpart,  que nous dsirons un dplacement  en  temps 
rel,  et  quelle est l'adresse du MFDB de sauvegarde du fond s'il  fallait 
procder    un  dplacement  en  bote  fantme  faute  de  mmoire.   Les 
diffrentes initialisations,  rservation mmoire, sauvegardes d'images, et 
calculs sont raliss par la fonction.
Nous  pouvons entrer alors dans la boucle de traitement,  base encore  une 
fois  sur dialog().  Dans ce cas,  les vnements  surveiller  sont  moins 
nombreux que pour le bureau. Seulement le clavier (pour les ditables), les 
clics (pour les diffrents objets) et comme toujours, le timer, pour garder 
la main.  dialog() s'occupe de tout (pop-ups,  aide, dplacement, pointeurs 
sur fonction, ditables tendus ou non, gestion du curseur, etc.
Nous avons juste  nous occuper de la sortie.  Si 'Confirme' a t  choisi, 
rien    faire.  Si c'est 'Annule',  nous restaurons  l'tat  antrieur  du 
formulaire.
Il  ne nous reste plus qu' oter le formulaire de  l'cran.  formm_undraw() 
s'en charge,  et libre les zones mmoire rserves par  formm_draw().  Par 
contre,  c'est   nous que revient la responsabilit de librer la  mmoire 
d'tat du formulaire.
La  fonction  aff_infos()  est  presque  identique.  Il  y  juste  un  test 
supplmentaire au dbut : si les infos ont t demandes  partir d'un menu 
de fentre, il faut inverser le titre de menu correspondant. Comme il n'y a 
ni  bouton 'Annule',  ni de dialogue avec l'utilisateur,  inutile de  grer 
l'tat  du formulaire.  Le dplacement tant demand en bote  fantme,  le 
pointeur sur MFDB prend ici toute son importance.
La  fonction test_alerte() est celle qui est appele par le  bouton  B_FNCP 
'Alerte' du formulaire libre. Elle ralise un simple appel big_alert().

6.b.3 Les formulaires en fentre
L'appel  de  formulaires en fentre est encore plus simple  que  celui  des 
formulaires "bloquant" (qui bloquent le menu, les fentres, etc).
Commenons par la fonction pform_wind(),  qui prsente le petit formulaire. 
Comme d'habitude, nous demandons l'adresse de l'arbre (ressource intgr ou 
non)  et  nous inversons le titre de menu.  Une boucle cherche  ensuite  la 
correspondance  entre la trame actuelle du bureau et celles  du  formulaire 
afin de slectionner la bonne. Nous n'avons plus qu'a ouvrir la fentre par 
formw_draw() et a rinverser le titre de menu. Il n'y a pas plus simple.
A  formw_draw() sont transmis l'adresse du formulaire,  l'index BIG  de  la 
fentre   ouvrir (qui a t dclare par initial()),  le numro  (dans  le 
ressource)  de  la chane libre qui doit tre le titre de  la  fentre,  le 
numro  de  la chane pour la ligne d'infos (il n'y en a pas dans  ce  cas, 
nous transmettons 'BLANK',  c'est--dire '-1'),  le numro de l'ditable o 
doit  tre  le curseur  l'ouverture de la fentre,  le flag  rclamant  un 
calage  du  formulaire  sur des multiples de  16,  puisqu'il  contient  des 
trames,  les attributs que doit possder la fentre (Nous utilisons ici une 
dfinition de BIG :  seuls NAME,  CLOSER, MOVER et SMALLER sont actifs), et 
enfin  un  pointeur sur la fonction qui sera utilise  pour  redessiner  le 
contenu de la fentre lorsqu'elle sera icnifie (lorsqu'elle ne l'est pas, 
nous n'avons rien  faire pour les fentres formulaires).
L'ouverture  de  la fentre du grand formulaire est fate par  la  fonction 
gform_wind().  Elle  est  encore plus simple,  puisque nous n'avons  pas   
tester  la  trame.  Bien  qu'il  comporte un fond tram  (en  moins  de  16 
couleurs),  nous ne demandons pas le calage de la fentre sur des multiples 
de 16, afin de dmontrer l'utilit de cette option. Fates cette exprience 
(si  vous  tes en 2 ou 4 couleurs) :  Affichez  le  grand  formulaire,  et 
dplacez  sa fentre de quelques pixels seulement.  Affichez par dessus  la 
fentre du petit formulaire, et dplacez-la jusqu' la faire presque sortir 
de  l'cran vers le bas.  La trame du grand formulaire  est  dforme...   
moins que vous n'ayez dplac sa fentre de 16 pixels exactement.
Je  ne  dcrirai pas les fonctions trame_desk() et objets_desk()  qui  sont 
appeles  par  main()  si un bouton 'Confirme' ou  'Applique'  est  cliqu, 
respectivement  dans  la  fentre du petit  et  du  grand  formulaire.  Ces 
fentres tant ouvertes,  c'est la boucle principale du programme (celle de 
main()) qui gre tout ce qui s'y passe, grce  dialog().

6.b.4 La fentre texte
La  fonction charge_texte() ouvre la fentre de texte.  Je  n'entrerai  pas 
dans les dtails du chargement lui-mme.  Ce n'est pas un modle du  genre, 
mais  il est suffisant pour la dmo.  Ce qui est important,  c'est  que  le 
texte  est charg dans une zone mmoire,  qui doit donc tre libre    un 
moment ou  un autre.  Dans un programme rel, j'aurai choisi de la librer 
seulement au moment de quitter ou par une option 'Abandon'.  Dans la  dmo, 
cette zone doit tre libre  chaque fermeture de la fentre. La structure 
BigWind  de  cette  fentre  doit  donc  avoir  comme  paramtre  'w_close' 
l'adresse d'une fonction qui se chargera de cela en plus de la fermeture de 
la fentre.
Il faut aussi placer dans 'w_redraw' l'adresse de la fonction qui affichera 
le texte lui-mme.  Le plus important est donc l'appel 'open_window()'. Les 
lignes qui prcdent cet appel chargent le texte (notez l'utilisation de la 
fonction  selector())  et  comptent le nombre  de  lignes.  Nous  demandons 
galement   la VDI les dimensions des cellules de caractres de la  police 
courante (la police systme de taille 13 est utilise par dfaut).
Nous  appelons  open_window()  en lui prcisant l'index  de  la  fentre   
ouvrir,  son type BIG (WTYP_NORM), ces attributs GEM (WATR_CURR : tous sauf 
la ligne d'infos),  les coordonnes de dpart,  ses dimensions minimum, les 
units  de  dcalage  (la  taille  d'une  cellule),   un  flag  de  fentre 
manipulable  au clavier,  pas de calage sur les multiples de 16 (malgr  la 
trame  de  la toolbar) et la forme de la souris dans la  zone  de  travail. 
Viennent  ensuite les pointeurs sur les fonctions d'affichage (en icne  et 
en normale) et de fermeture de la fentre, des pointeurs sur les chanes de 
titre et d'infos (la seconde est vide),  les largeur et hauteur totales  de 
la  fentre  (en pixels).  Nous devons raliser des "casts"  pour  que  les 
paramtres  transmis soient bien de type 'long'.  Enfin,  sont transmis  un 
flag  FALSE signalant que la fentre n'a pas de menu,  un autre  TRUE  pour 
indiquer la prsence d'une toolbar et le numro d'arbre de cette toolbar.
Cela fait beaucoup de paramtres,  mais c'est tout ce qu'il y a  faire.  A 
partir  de maintenant,  nous n'avons plus  nous occuper de cette  fentre. 
Elle sera dplace,  redessine, icnise, son contenu dfilera sans aucune 
intervention de notre part (mme dans le cas des versions les plus rcentes 
du  GEM,  qui autorisent la manipulation des fentres  d'arrire-plan).  La 
fonction   d'affichage   (aff_texte()   dans   la   dmo)   sera    appele 
automatiquement lorsque cela sera ncessaire (Je vous laisse examiner cette 
fonction, qui n'est pas non plus un modle, et qui est imparfaite notamment 
en ce qui concerne le traitement des polices proportionnelles), de mme que 
winicn() si la fentre est icnise.  S'il n'y a plus de fentre disponible 
dans  les  tableaux  du GEM,  l'alerte du ressource  intgr  de  BIG  sera 
affiche pour le signaler  l'utilisateur.
Quant    la  fonction close_txt(),  elle appelle closed()  (qui  ferme  la 
fentre  et modifie l'lment w_hg) et libre la mmoire  du  texte.  Comme 
closed() cherche dans buf[3] le handle GEM de la fentre,  nous l'y plaons 
un peu artificiellement avant l'appel.
Nous  avons  dj  mentionn  la  fonction  set_font().  Elle  est  appele 
lorsqu'une fonte ou une taille de caractre  t choisie dans la  toolbar, 
et elle se contente de modifier les variables globales correspondantes, qui 
seront ensuite utilises par la fonction d'affichage du texte. Notez que la 
taille est lue directement dans le bouton pop-up de la toolbar.  Ainsi,  si 
vous  voulez  que la dmo soit en mesure d'afficher  d'autres  tailles,  il 
suffit  de les ajouter dans le formulaire pop-up correspondant,  sans  mme 
devoir recompiler la dmo !

6.b.5 La fentre image
La fonction charge_image() ressemble  celle du texte. Elle est un peu plus 
complexe  du  fait qu'elle peut tre appele pour ouvrir la  fentre  image 
normale,  ou   partir de la fentre avec menu,  l'image devant alors  tre 
place dans celle-ci. Il y a donc plusieurs tests pour cela.
L'image est charge dans une zone mmoire,  et l'lment w_cont.w_img de la 
structure de fentre correspondante doit tre rempli avec les dimensions de 
l'image.  De mme pour l'lment.w_pal avec la palette de couleurs de cette 
image.
L'appel  open_window() est presque le mme que pour le texte.  Le type BIG 
de  la  fentre  implique  que  BIG se  chargera  de  tous  les  affichages 
ncessaires. Nous transmettons donc un 'ZERO' comme fonction de redraw. Les 
variables  'ftool',  'fmenu' et 'menu' contiennent respectivement  'FALSE', 
'FALSE' et 'BLANK' dans le cas de la fentre image, et contiennent 'FALSE', 
'TRUE' et le numro du menu dans le cas de la fentre avec menu.
Le  redraw  de l'image est fait  partir des  informations  contenues  dans 
w_cont.w_img.w_blk. S'il n'y en a pas, c'est que l'image n'a pas encore t 
charge. BIG trace alors un rectangle blanc dans la fentre pour la vider.
La  fonction  de fermeture de fentre n'est pas la mme selon  la  fentre, 
puisque la mmoire du menu doit tre libre si c'est elle qui est  ferme. 
La fonction close_img() travaille comme son homologue du texte,  mais  doit 
en plus librer la mmoire de la palette de couleur. Quant  close_wmenu(), 
elle fait de mme avec en plus la libration de la mmoire de menu.

6.b.6 La fentre graphique
La fentre d'histogrammes est cre et ouverte par la fonction cree_histo(). 
Une zone mmoire pour les donnes est rserve, puis des valeurs alatoires 
sont tires pour les histogrammes et places dans cette zone.
L'ouverture  de la fentre se fait comme nous l'avons dj  vu,  mais  nous 
avons  besoin  que  cette  fentre  ait  une  fonction  spciale  pour   le 
redimensionnement,  la  pleine taille (ou retour) et un  flag  particulier. 
Comme  ces trois choses ne font pas partie des paramtres  d'open_window(), 
nous devons les traiter "manuellement".
Les histogrammes doivent toujours remplir la totalit de la  fentre.  nous 
avons  donc  besoin de fonctions de "size" et de "full" qui  s'occupent  de 
cela,  et raffichent la totalit de la fentre dans le cas o un redraw ne 
concernerait qu'une partie (par exemple, le retour de la pleine taille  la 
prcdente).  Le  flag 'WFREDRAW' impose galement un redraw  chaque  fois 
que la fentre est passe au premier plan.  Ainsi,  si les donnes ont  t 
modifies,  l'affichage  sera actualis  chaque fois en totalit,  et  pas 
seulement  la partie indique par la liste des rectangles  de  l'AES.  Cela 
peut  tre  indispensable  dans  certaines  applications,  par  exemple  un 
tableur.  Des  valeurs  sont changes dans la feuille de  calcul,  puis  la 
fentre graphique, jusque l en arrire-plan, est amene en premier.
Nous  plaons donc dans les lments w_size et w_full les adresses  de  nos 
fonctions correspondantes, et nous forons le bit WFREDRAW de w_flags.
Les histogrammes affichs tant trams,  nous demandons que la fentre soit 
toujours  cale  sur  des multiples de 16,  par le  paramtre  'fb'  de  la 
fonction open_window().
La   fonction   aff_histo()  ne  devrait   pas   ncessiter   d'explication 
particulire. sized_histo() ne demande l'affichage de la fentre que si les 
nouvelles dimensions sont toutes deux plus petites que les  anciennes,  car 
dans  ce  cas le GEM ne gnre pas de redraw.  fulled_histo()  a  la  tche 
simplifie  :  le GEM enverra toujours un redraw pour le passage en  pleine 
taille, et jamais pour le retour  la taille prcdente. Pour le passage en 
pleine  taille,  nous  appelons  quand mme la fonction  fulled()  afin  de 
bnficier  du  calage  sur  les multiples de  16  sans  faire  de  calcul. 
close_histo()  fait  comme  ses consurs texte et  image,  elle  libre  la 
mmoire rserve pour les donnes.
La fonction close_wmenu() ferme la fentre avec menu en librant les  zones 
mmoires rserves pour l'image et la palette de couleurs.
Autre fonction,  icones() rcupre dans buf[6] l'option clique (ou appele 
par  quivalent clavier) dans le menu hirarchique du menu de  fentre,  et 
choisi l'icne selon cette option.
La  fonction winicn() est charge du redraw des fentres  lorsqu'elle  sont 
icnises. Elle se contente de vider la fentre et d'y centrer une image ou 
une autre,  selon qu'il s'agit d'une fentre formulaire ou d'un autre type. 
Les  images  proviennent  du  ressource  et  peuvent  donc  aisment   tre 
modifies.
La fonction red_acc() est charge du redraw de la fentre principale en cas 
de  fonctionnement en accessoire.  Il aurait t souhaitable de  placer  le 
bureau  dans  cette fentre et de le grer comme le bureau normal  dans  le 
fonctionnement  en programme,  mais,  encore une fois,  je n'ai  pas  voulu 
compliquer les choses.  Le contenu de la fentre est donc simplement tram. 
Dans ce cas, les options relatives au bureau (changement de trame, d'icne, 
etc) sont inactives.
La fonction clos_acc() est appele en cas de message AC_CLOSE, de fermeture 
de la fentre principale de l'accessoire ou si on clique l'option 'quitter' 
de l'accessoire (menu en fentre).  Elle rend leurs coordonnes d'originine 
 toutes les fentres si elle taient icnifies,  et les ferme du point de 
vue  de  BIG,  mais  PAS  du point de vue  du  GEM.  Voyez  le  chaptre  9 
"Programmation d'accessoires" pour en savoir plus.
Autre fonction,  acc_loop() est utilise si on tourne en  accessoire.  Elle 
attend  simplement  de  la part du GEM le  message  AC_OPEN  signalant  que 
l'accessoire  a  t  appel.  Elle ouvre alors la  fentre  principale  de 
l'accessoire en y plaant le menu de l'application, et retourne  la boucle 
principale.
Dernire fonction,  relief() est appele au dbut du programme si on est en 
16 couleurs ou plus,  afin que les trames de certains objets-racines soient 
modifies pour l'effet de 3D.
Ce  programme  BIGDEMO.PRG a t cr avec des paramtres minimum  et  trs 
simples.  Pour  la compilation,  les seules options actives sont  "Default 
char  is unsigned" (-K) et "Use absolute calls" (-P).  Aucune option  n'est 
active dans le linker.  La librairie BIG.LIB a t compile avec les mmes 
options.   Ainsi,   BIG   n'impose  pratiquement  pas  de  contraintes   de 
compilation.
Il peut tre utile et commode de travailler avec deux fichiers BIG.LIB.  Le 
premier  serait compil avec les informations de dbuggage (option  -Y)  et 
serait  utilis pendant le dveloppement afin d'avoir accs  aux  variables 
gobales sous debugger. Le second serait compil sans ces informations, pour 
la comilation dfinitive du travail ralis.

7. Paramtres et pointeurs sur fonctions
Les  fonctions appeles par les objets B_FNCP sont de type  'void  fonction 
(void)'.  Elle  ne  peuvent  donc recevoir de paramtres  ni  retourner  de 
valeur.  Il  y  a  des  situations  o  cela  est  gnant,  car  il  faudra 
imprativement  transmettre des informations  la fonction,  et elle  devra 
rpondre quelque chose. Comment faire ?
Il suffit de mettre en place une zone mmoire, ou une structure globale, ou 
un  tableau  de  paramtres,  selon le  contexte,  o  seront  places  les 
informations    changer avec la fonction.  C'est exactement ce  que  font 
l'AES et la VDI avec les tableaux contrl[],  intin[],  ptsout[],  global[], 
etc.
La dmo, volontairement simple, ne prsente pas d'exemple de cette mthode, 
mais  c'est  un peu ce qui est ralis par la  fonction  close_txt().  Elle 
appelle la fonction closed() qui est charge de fermer une  fentre.  Mais, 
tant dclare 'void closed (void)',  on ne peut lui transmettre le  handle 
de  la fentre dont il s'agit.  close_txt() place donc le handle GEM de  la 
fentre    fermer dans le mot 3 du tableau buf[],  qui  est  une  variable 
globale,  puis  elle  appelle closed().  Celle-ci va chercher  dans  buf[3] 
l'information dont elle a besoin : le handle GEM de la fentre  fermer.

8. Travail avec un ressource intgr
Il  est  tout    fait possible de  dvelopper  avec  BIG  une  application 
utilisant un ressource intgr au lieu d'un fichier RSC externe.
Pour  raliser cela,  il est ncessaire d'utiliser un diteur de  ressource 
capable  de  gnrer un fichier "RSH" contenant sous forme de source  C  la 
description du ressource. Il suffit ensuite de placer au dbut du programme 
la ligne ' #include "PROGNAME.RSH" ' et le tour est jou.
Voici une description de la syntaxe habituelle,  utilise par les  diteurs 
de ressource Interface et ORCS :
Les  adresses  des  objets  sont places  dans  un  tableau  'rs_trindex[]' 
(ReSsource TRee INDEX). L'adresse de l'arbre lui-mme (l'objet 0) s'obtient 
par exemple par :

adr = rs_trindex[DESK];
Et l'adresse d'un objet particulier par :
adr_object = adr[OBJECT];
ou :
adr_object = rs_trindex[DESK][OBJECT];
Avec :
OBJECT *adr, *adr_object;
Les  adresses  des chanes et alertes libres se trouvent  dans  le  tableau 
'rs_frstr[]' (ReSsource FRee STRing).
Il  est  ncessaire  que BIG sache de quelle manire il  peut  accder  aux 
adresses  des lments du ressource.  La fonction initial() met   TRUE  la 
variable  intgr si le ressource est intgr,  et  FALSE s'il est  externe. 
Par exemple,  la fonction (interne  BIG) 'pop-up()' utilise ce flag de  la 
manire  suivante :  elle cherche dans l'ob_state tendu du  bouton  pop-up 
cliqu le numro du formulaire qui lui est associ.  Puis,  si le ressource 
est    externe,    elle   cherche   l'adresse   de   ce   formulaire    par 
'rsrc_gaddr(numero)', sinon par 'rs_trindex[numero]'.
Si nous travaillons avec un ressource intgr,  nous transmettons  BIG par 
les paramtres de la fonction initial() les adresses de dpart des tableaux 
rs_trindex[] et rs_frstr[]. Ces adresses sont alors simplement copies dans 
deux  variables  internes  de  BIG afin  d'tre  utilises  quand  il  sera 
ncessaire  d'obtenir une adresse.  Si nous travaillons avec  un  ressource 
externe  (dans ce cas,  le paramtre nb_tree est gal   0),  nous  pouvons 
transmettre des '0' pour faire propre, mais initial() ignore simplement ces 
paramtres.
Etudiez le source de la dmo pour voir comment ceci est trait.  Il  suffit 
de changer le '0' en '1' dans la ligne ' #define INTGR 0 ' pour  recompiler 
la   dmo  avec  un  ressource  intgr.   Cette  dfinition  et   quelques 
instructions  destines  au compilateur font la diffrence entre  ces  deux 
situations  et le programme est toujours compil comme il convient.  Si  le 
ressource  est intgr,  nous incluons le fichier  'BIGDEMO.RSH',  et  nous 
transmettons      initial()  les  adresses  des  tableaux   par   '(OBJECT 
*)rs_trindex'  et  '(char  *)rs_frstr',  ainsi que le  nombre  d'arbres  du 
ressource :  20 (formulaires et menus).  Si le ressource est externe,  nous 
incluons simplement le fichier 'BIGDEMO.H' (les dfinitions) et les  autres 
paramtres  sont  mis  0.  Plus loin dans le source (par exemple  dans  la 
fonction 'pform_wind()') nous utilisons encore la dfinition 'INTGR' et des 
instructions  de  compilation  pour chercher l'adresse  du  formulaire  par 
rsrc_gaddr() ou par rs_trindex[], selon le cas.
Dernier  point  :  si  le ressource est intgr,  les  coordonnes  et  les 
dimensions des objets doivent tre adapts  la rsolution courante, par la 
fonction  GEM  rsrc_obfix()  (ce qui est fait automatiquement  par  GEM  au 
chargement  d'un  ressource externe).  La fonction  initial()  s'en  charge 
automatiquement pour les ressources intgrs.  Un conseil :  dans l'diteur 
de ressource, calez toujours les objets sur un offset de caractre.

9. Programmation d'accessoires
Je rappelle pour mmoire que le programme BIGDEMO.PRG peut tre renomm  en 
BIGDEMO.ACC et tre lanc comme accessoire.
La  programmation d'accessoires de bureau sous BIG est encore  plus  simple 
que directement sous GEM, puisque certaines oprations sont automatiquement 
ralises. Rappelons brivement le principe :
Un  accessoire de bureau est une application comme n'importe quelle  autre. 
Normalement,  un accessoire ne peut possder de barre de menu,  mais  ainsi 
que  la  dmo le montre,  il est facile de contourner cette  limite  en  le 
plaant  dans  une  fentre  particulire  (d'autres  procds,   comme  le 
protocole  Tube  GEM,  permettent de le placer comme menu  normal,  mais   
condition  que l'application principale actuellement en  cours  reconnaisse 
galement ce protocole).  La principale caractristique d'un accessoire est 
qu'il  ne  s'arrte  jamais de tourner.  Il est  formellement  interdit  de 
quitter  un accessoire de bureau par appl_exit() ou toute autre fonction  ! 
Il  s'installe automatiquement pendant le boot,  et est interrompu  par  un 
reset ou une extinction du poste de travail.
Pour dclarer un accessoire au GEM, il faut obligatoirement avoir recours  
la fonction GEM menu_register(), qui est de la forme :
int menu_register (int me_rapid, char *me_rpstring);
Le premier paramtre est le numro d'identification de l'application, celui 
qui est retourn par l'appel de la fonction appl_init().  Le second est  la 
chane  de caractre qui doit tre le nom de l'accessoire dans  le  premier 
menu (Bureau).  C'est sur cette option du menu que l'utilisateur va cliquer 
pour appeler l'accessoire.  La fonction retourne un numro d'identification 
de l'accessoire.
Sur les anciennes versions du GEM,  il n'tait pas possible d'avoir plus de 
six accessoires simultanment.  Il n'y a dsormais plus de limites. D'autre 
part,  il  est galement possible sous MultiTOS d'utiliser  cette  fonction 
pour  changer  le  nom qui s'affiche dans le menu mme dans  le  cas  d'une 
application lance en programme. Mais cela ne nous concerne pas.
Ce  qu'il faut savoir,  c'est que cette fonction a parfois un  comportement 
capricieux.  Il arrive que l'accessoire soit correctement enregistr par le 
GEM,  mais  que  son nom n'apparasse pas dans le menu !  Si on  lance  une 
application  quelconque qui rinitialise la barre de menu en installant  la 
sienne,  tout rentre dans l'ordre...  En fait,  cela dpend de l'ordre dans 
lequel   sont  faites  les  diffrentes  initialisations  (dclaration   de 
l'application,  chargement du ressource, etc). C'est en modifiant cet ordre 
que l'on peut corriger le dfaut.  Malheureusement,  l'ordre est  diffrent 
selon que l'on travaille avec un ressource externe ou intgr ! La fonction 
initial() de BIG s'occupe de tout cela pour nous. Merci.
Nous  avons  install  notre accessoire.  Que fait-il  ?  Il  attend  qu'on 
l'appelle  (on peut aussi lui faire raliser de petites tches  pendant  ce 
temps,  mais laissons cela de ct).  Quand on appelle un accessoire en  le 
cliquant dans le menu, il reoit un vnement (de type MU_MESAG si on tait 
dans  une  boucle  evnt_multi).  Le buffer de message  contient  alors  les 
lments suivants :
  Mot 0 : AC_OPEN (40)
  Mot 4 : Identificateur de l'accessoire (retourn par menu_register).
Lorsque notre accessoire reoit ce message, c'est qu'on l'a appel (il peut 
vrifier  avec le mot 4 que c'est bien de lui qu'il s'agit,  mais sinon  il 
n'aurait  rien reu).  Ce qui suit dpend videmment de  l'accessoire  lui-
mme.  Il ouvre un formulaire,  une fentre,  etc.  Il fait ce qu'il  veut, 
tant  dsormais l'application "de premier plan".  Notez que s'il ouvre  un 
formulaire, il doit bloquer le menu. Rien d'autre que lui n'est actif. Mais 
il  peut  aussi,  c'est ce que fait BIGDEMO.ACC,  ouvrir une  ou  plusieurs 
fentre(s) et tourner dans une boucle de type evnt_multi.  Dans ce cas,  il 
se peux que des options de menu d'une autre application soient cliques, ou 
qu'on active une autre fentre,  etc. Normalement, le GEM envoie le message 
correspondant  ce qui c'est pass au bon destinataire. Il n'y a donc pas  
se proccuper de cela.
Mais  il  faut  savoir que le GEM  envoie  les  compte-rendus  d'vnements 
clavier   l'application qui a une fentre en premier plan.  Cela  signifie 
que si votre accessoire est ouvert,  mais que sa fentre est en arrire, il 
ne recevra pas de messages de raccourcis clavier, par exemple.
Autre point important :  dans la mme situation (la fentre de l'accessoire 
est en arrire),  un clic est fait par exemple sur la barre de  dplacement 
d'une  autre  fentre.  L'application  laquelle cette  fentre  appartient 
recevra  donc un vnement de type MU_MESAG.  Mais l'accessoire recevra  un 
MU_BUTTON ! Il devra videmment l'ignorer dans ce contexte.
Il  peut  arriver  finalement que l'accessoire soit  ferm  par  une  autre 
intervention  que l'utilisateur.  Imaginons que nous nous trouvons  sur  le 
bureau.  Nous ouvrons une fentre appartenant  notre accessoire, puis nous 
passons  sans  la  fermer   une fentre d'un disque  et  nous  lanons  un 
programme  !  Autre  situation :  nous sommes dans un  programme,  et  nous 
ouvrons une fentre de l'accessoire. Sans la fermer, nous cliquons l'option 
'Quitter'  du  programme principal.  Que ce passe-t-il dans  ces  cas  (les 
explications   qui   suivent  ne  concernent  pas  le   fonctionnement   en 
multitche) ?
L'accessoire  va recevoir un autre vnement,  galement de type  MU_MESAG, 
constitu ainsi :
  Mot 0 : AC_CLOSE (41)
  Mot 3 : Identificateur de l'accessoire (retourn par menu_register).
Ce message est envoy pour information,  afin d'avertir l'accessoire  qu'il 
est  dsormais  considr ferm,  et qu'il doit retourner  dans  sa  boucle 
d'attente  du  message AC_OPEN,  sans quoi il ne pourra plus  tre  ouvert, 
puisqu'il ne traitera plus ce message.  Mais une autre chose est faite  par 
le   GEM  :   toutes  les  fentres  appartenant    cet  accessoire   sont 
automatiquement fermes et dtruites par le GEM, contrairement  ce qui est 
dit dans certains ouvrages !  Si l'accessoire tente  prsent de fermer une 
de ses fentres, alors qu'elle n'existe plus, il se produit dans la plupart 
des cas un blocage du systme sans autre recours que le reset.
Etudiez  comment est fate la fonction clos_acc() de la  dmo.  La  fentre 
principale  de l'accessoire n'est ferme et dtruite (par  wind_close()  et 
wind_delete())  que  si le mot 0 du buffer est diffrent  de  AC_CLOSE  (la 
fonction closed() de BIG fait de mme).
En  rsum,  la  programmation  d'accessoires de  bureau  est  relativement 
simple.  Il  y a certaines prcations  prendre avec les caprices  du  GEM, 
mais BIG est d'une aide prcieuse.  Il faut galement tre prudent avec  la 
gestion des vnements,  et n'oublier aucun cas particulier.  La difficult 
est  la mise au point de l'application,  puisqu'il est videmment  beaucoup 
plus  dlicat  de  debugger  un accessoire  (plus  question  d'en  "tracer" 
l'excution).  N'oublions pas qu'un accessoire qui plante plante  galement 
tout le systme et les autres applications !  Le mieux est de le laisser   
l'tat  de  PRG  pour la programmation proprement dite  de  ce  qu'il  doit 
accomplir, et de "l'accessoiriser" le plus tard possible. Pour raliser une 
application fonctionnant  la fois en accessoire et en programme, inspirez-
vous  de la dmo.  Un flag (variable globale '_app' dans le cas du Pure  C) 
signale si l'application a t lance en accessoire ou en programme,  et un 
autre rappelle si l'accessoire est actif ou en attente.
Sous BIG, vous aurez juste  transmettre  initial() le numro de la chane 
libre  destine   devenir le titre de l'accessoire,    crire  la  boucle 
d'attente du message AC_OPEN et  traiter le message AC_CLOSE.

10. L'icnisation des fentres
L'icnisation  des fentre est ralise par BIG de manire  diffrente  sur 
une  ancienne  version de l'AES et sur une version suprieure  ou  gale   
4.10.  En  effet,  c'est   partir de cette version que  cette  trs  utile 
fonctionalit  t implmente.
Sur  les  versions rcentes,  l'opration est ralise par  l'appel  de  la 
fonction  wind_set(WF_ICONIFY,...) avec son nouveau paramtre.  La  fentre 
est icnifie par le GEM,  qui met son titre en petits caractres. De mme, 
la  dsicnification est effectue par  wind_set(WF_UNICONIFY,...),  et  la 
suite est confie au GEM.
Sur  les systmes plus anciens,  c'est BIG qui se charge de fermer puis  de 
dtruire la fentre,  et d'en ouvrir une autre de petite taille, considre 
comme  fentre  icnifie.  Dans ce cas,  le titre reste en  caractres  de 
taille normale.
Une autre diffrence est l'emplacement des fenetres icnifies. Le GEM les 
place  la droite les unes des autres  partir de l'angle infrieur  gauche 
du  bureau  (elles peuvent ensuite tre dplaces).  BIG place  la  fentre 
icnifie galement en bas du bureau,  mais  la mme position en x qu'elle 
avait avant icnification.
Mme  sous  AES rcent,  pour savoir si une fentre est icnifie  il  vaut 
mieux      tester      "if(win[index].w_icon>BLANK)",      car      l'appel 
wind_get(WF_ICONIFY,...) n'est pas toujours correctement implment sur les 
compilateurs et risque d'entraner un plantage.
Lorsque BIG icnifie une seule fentre,  il place dans l'lment w_icon  de 
la  structure  BigWind l'index de cette fentre (qui est  -1 tant  que  la 
fentre est normale).  Dans le cas d'icnification multiple, la fentre qui 
a  t  utilise pour la demande d'icnification est  rellement  icnifie 
comme explique ci-dessus,  les autres tant simplement fermes.  L'lment 
w_icon  de  toutes  ces  fentres  contient  l'index  BIG  de  la   fentre 
"matresse".  Ainsi,  au moment de la dsicnifier,  BIG peut dterminer si 
d'autres fentres doivent tre rouvertes en les parcourant et en cherchant 
celles  dont  w_icon  contient l'index de la fentre  dont  on  demande  la 
dsicnification.
Enfin,  un point doit tre soulev.  Les anciens systmes ne peuvent ouvrir 
simultanment  qu'un  nombre limit de  fentres.  Imaginons  la  situation 
suivante, sur un poste n'autorisant que 7 fentres : Ouvrons 5 fentres, et 
icnifions-les  en  une  seule.  Ouvrons  ensuite  4  autres  fentres,  et 
demandons la dsicnification des premires. Il y a 2 fentres en trop, qui 
ne seront simplement pas restaures, sans message d'information.
Lorsque  c'est une fentre avec palette qui est icnifie,  la palette  par 
dfaut  est restaure.  La palette de la fentre est restaure lors  de  la 
dsicnification, si la fentre se retrouve au premier plan.

11. Epilogue
11.a Historique
Nous arrivons au bout de cette prsentation de BIG.  Au dpart,  ce n'tait 
que  quelques  fonctions dans mes dveloppements.  Peu    peu,  elles  ont 
grandi,  en  volume  et en qualit.  A chaque  nouveau  programme,  je  les 
recopiais  et  j'ajoutais des options,  des  pointeurs,  des  automatismes. 
Lorsque des copains m'ont demand s'ils pouvaient les utiliser,  je me suis 
rendu  compte  que  j'tais le seul  pouvoir le  faire,  car  il  y  avait 
toujours une quantit de petits dtails propres  chaque  application,  qui 
devaient tre modifis  chaque fois.  Mais j'tais le seul  m'y retrouver 
dans cette jungle !
Alors  j'ai pris mon courage  deux mains et j'ai tout rcrit  de  manire 
que  cela puisse tre utilis dans toutes les situations,  dans toutes  les 
applications,  avec  un  minimum de contraintes,  un minimum  de  variables 
globales, le plus de simplicit possible et une compatibilit de 100 % avec 
toutes  les machines de la gamme,  mme celles qui taient  venir  (Et  la 
premire  version beta de BIG que j'ai test sur Falcon a  fonctionn...   
95 %).
En  dveloppant  ces routines,  je me suis pris au jeu et j'ai  commenc   
ajouter des quantits de choses que je n'avais jamais song  inclure  mes 
programmes  :  menus  hirarchiques  et en  fentre,  forme  de  la  souris 
variable,  gestion automatique de la palette,  formulaires dplaables, 3D, 
scroll-menus,  etc.  Je tenais  crer quelque chose de complet,  reprenant 
tout ce qui existait dj dans d'autres librairies, dans le nouveau GEM, et 
tout  ce que j'avais pu voir de plaisant dans  certaines  applications,  en 
bannissant toutefois tout ce qui pourrait rendre la communication logiciel-
utilisateur complique.
Il fallait bien que je m'arrte.  Mais BIG va sans doute encore tre encore 
amlior.  On pourrait par exemple intgrer la gestion des icnes  couleurs 
sur  tous les systmes (j'y ai renonc  cause de la taille de la  fonction 
ncessaire  au  chargement  du  nouveau  type  de  fichier  ressource).  Le 
dplacement des formulaires pourrait tre amlior en vitesse,  les  champs 
ditables pourraient accepter les petits caractres,  ce que le GEM  refuse 
dans ses anciennes versions, etc.
BIG  peut  sans  doute tre fortement optimis.  Mais  je  n'ai  fait  pour 
l'instant  que peu d'efforts dans ce sens,  car je prfre attendre  d'tre 
sr qu'il n'y ait plus de bug.  Un source parfaitement optimis, c'est trs 
beau,  mais  il  est  parfois  moins vident  de  s'y  retrouver  pour  une 
modification ou une correction.

11.b Salut les copains
Je  tiens  remercier une dernire fois les copains et qui m'ont  aid  (ou 
qui m'ont pouss) dans le dveloppement de BIG. Dans le dsordre :
Pierre-Louis Lamballais, de la socit PARX SoftWare, auteur du gnial Tube 
GEM,  qui m'a appris beaucoup de choses  propos de la faon de  travailler 
sous GEM. La gestion des fentres de BIG, entre autres, est fortement base 
sur ses excellentes ides.
Alexandre  Lemaresquier,  de  de la socit  Brainstorm,  qui  m'a  signal 
plusieurs  caprices du GEM et m'a fait profiter de  son  exprience.  C'est 
galement sur ses suggestions que les ditables tendus existent.
Jol Houplon,  qui m'a littralement harcel au moindre bug et pour l'ajout 
de certaines fonctions.
Marc  Abramson,  qui  m'a  aid dans le debuggage et m'a fait  pas  mal  de 
publicit.  Il a fait faire aux versions 1.80 et suivantes de BIG un  grand 
pas  en avant surtout en ce qui concerne la compatibilit avec  toutes  les 
machines.
Patrick  Merminod,  qui a non seulement trouv un grand nombre de  bugs  et 
imprcisions,  mais  qui m'a en plus donn la solution  chaque  fois  pour 
m'viter de chercher.
David Ren,  qui m'a aid  trouver les solutions de certains problmes  et 
qui m'a prt son Falcon.
Isabelle  Rochat,  qui  a  effectu la traduction de  la  doc  en  anglais, 
demande par Atari France pour le kit dveloppeur.
Thierry  Rodolofo,  qui m'a aid  intgrer la gestion de SpeedoGDOS    la 
dmo.
Lionel  Brule,  qui  a ralis une traduction de BIG  pour  le  compilateur 
Lattice.
Tous  ceux  qui  m'ont encourag    poursuivre  :  Bruno  Christen,  Felix 
Marciano,   Jean-Marc  Gigan,  Frdric  Collet,  Jean-Luc  Caradeau,  Eric 
Cassegrain...
Et  tous  ceux qui m'ont suggr des amliorations ou des  options  qui  se 
trouvent dsormais dans BIG :  Denis Casanova, Gilles Barges, Jean-Franois 
Obert, Alain Vigne, j'en oublie sans doute...

11.c Pour me contacter
Vous  pouvez  me  contacter pour me demander de  vous  faire  parvenir  les 
sources complets des routines BIG. Pour cela, je vous demande en change la 
somme de 100 F ($ 20) pour la disquette et les frais d'envoi (et pour qu'il 
me reste un petit quelque chose).
Prcisez-le  moi si vous souhaitez utilisez BIG avec un  autre  compilateur 
que le Pure C,  je vous adresserai la bonne version si elle existe,  ou  si 
vous  prfrez  avoir  un fichier objet  au  standard  DRI,  plutt  qu'une 
librairie  au  format  de  Pure  C  (par  exemple  si  vous  travaillez  en 
assembleur).
Contactez-moi  aussi si vous avez des questions,  si vous avez  trouv  des 
bugs, si vous avez des suggestions  me faire pour tendre les possibilits 
de  BIG,  si  vous voulez me fliciter (j'espre) et mme  si  vous  voulez 
m'engueuler (pourquoi pas).
Si  vous  possdez  le gnialissime  logiciel  Papyrus,  dites-le  moi,  la 
prsente documentation existe en version mise en page,  je vous enverrai le 
fichier PAP.
Et  surtout,  si  vous me demandez les sources et que vous  les  amliorez, 
fates-m'en profiter !
Dans  tous  les  cas,  cela  me  permettra de  vous  tenir  au  courant  de 
l'volution  de  BIG,  et  de vous faire parvenir si vous  le  dsirez  des 
versions plus rcentes.
Voici mes coordonnes :
               Claude ATTARD
               36, rue Raspail
               94200 Ivry sur Seine
               (France)

Dernier point :  L'utilisation de BIG dans des dveloppements destins  la 
commercialisation est libre.  Toutefois, j'accepterai avec grand plaisir un 
petit quelque chose en proportion avec le prix de vente du  logiciel.  Cela 
parait correct, non ?
Ami dveloppeur,  je te souhaite autant de plaisir  utiliser BIG que  j'en 
ai eu  le dvelopper. Ce n'est pas peu dire !

