			Les fonctions AES
			*****************


1 Pr‚sentation
**************

	Le principe d'appel des fonctions AES repose sur le remplissage de
tableaux d'entr‚e et de r‚cup‚ration ‚ventuelle de paramŠtres dans les
tableaux de sortie. Certaines fonctions pr‚sent‚es ici sont propres au FORTH
et ne servent qu'a faciliter l'utilisation des primitives AES.

	Les tableaux d'entr‚e;

control
-------
       	laisse sur la pile l'adresse du champ control contenant les
informations suivantes:
		control	code de la fonction
		control+2	nombre de mots dans intin
		control+4	nombre de mots dans intout
		control+6	nombre d'adresses dans addrin
		control+8	nombre d'adresses dans addrout

intin
-----
	laisse sur la pile l'adresse du champ intin contenant les paramŠtres
d'entr‚e sur 2 octets chacun.

addrin
------
	laisse sur la pile l'adresse du champ addrin contenant les adresses
d'entr‚e sur 4 octets chacune.

	Les tableaux de sortie:

intout
------
	laisse sur la pile l'adresse du champ intout contenant en retour les
informations sur 2 octets renvoy‚es par la fonction.

addrout
-------
	laisse sur la pile l'adresse du champ addrout contenant en retour les
adresses sur 4 octets fournies par la fonction.

	En utilisation normale les tableaux d'entr‚e sont remplis pour vous, il
ne reste qu'… lire ‚ventuellement les informations dans les champs de sortie.
Pourtant, pour certaines fonctions qui ne seraient pas encore implant‚es un
appel "… la main" sera n‚cessaire:

	Fonctions manuelles:

actrl
-----
	fn  ii  io ad  actrl  :  remplit le champ control avec f=code de la
fonction, ii=nombre mots intin, io=nombre de mots intout, ad=nombre de
mots addrin. La partie addrout n'est pas prise en compte et initialis‚e … z‚ro
tant il y a peu de fonctions l'utilisant. Au pire il faudrait ajouter "n control 8
+ w!" aprŠs cet appel.

aintin!
-------
	remplit le champ intin selon le nombre de valeurs indiqu‚ en
control+2. Les valeurs sont prises sur la pile.

addrin!
-------
	remplit le champ addrin selon le nombre de valeurs indiqu‚ en
control+6. Les valeurs sont prises sur la pile.

aes
---
	appelle la fonction aes en supposant que les trois tableaux d'entr‚e
sont correctement remplis.

aes!
----
	suppose que le tableau control est rempli, ensuite remplit le tableau
addrin, puis le tableau intin, puis appelle l'AES.

	Voici maintenant la liste des fonctions AES, pour la syntaxe on a
respect‚ cet ordre:
		valeurs intin		valeurs addrin	nom de la fonction
	Ceci est aussi valable pour la fonction aes!. Attention, ceci n'est pas
toujours l'odre de la syntaxe en C, parfois les adresses pr‚cŠdent les autres
donn‚es (allez savoir pourquoi...).

2 Les fonctions g‚n‚rales
*************************

appl_init
---------
	d‚clare une application au GEM. La fonction est inutile, mˆme sous le
compilateur puisque le FORTH s'en charge tout seul. N‚anmoins, la valeur
retourn‚e par app_init est elle importante (dans la gestion de certains
messages ou ‚vŠnements), donc c'est une simulation de la fonction qui est
r‚alis‚e et qui renvoie le paramŠtre id:
		intout		: id de l'application en cours ou -1 si erreur.

appl_read
---------
	id  n  adr  appl_read  :  lit n octets dans le registre des ‚vŠnements et
les d‚pose … partir de l'adresse adr. Le paramŠtre id est votre identificateur.
La fonction est inutile pour tous les ‚vŠnements standards du GEM.
		intout		0 si erreur

appl_write
----------
	id  n  adr  appl_write  :  ‚crit n octets dans le registre des ‚vŠnements,
ces octets sont pris … partir de l'adresse adr. Le paramŠtre id est votre
identificateur.
		intout		0 si erreur
appl_find
---------
	" nom"  appl_find  :  renvoit l'appl_id de l'application dont le nom est
pr‚cis‚. Le nom doit contenir 8 caractŠres exactement (combl‚ avec des
blancs et sans l'extension du fichier).
		intout		appl_id ou -1 si non trouv‚.

appl_search
-----------
	mode  nom type ap_id  appl_search

appl_trecord
------------
	n  adr  appl_trecord  :  l'AES enregistre n ‚vŠnements se trouvant
d‚crits … l'adresse adr. Chaque ‚vŠnement utilise 6 octets:
	mot		: code de l'‚vŠnement
	long mot	: paramŠtres

	intout		: nombre d'‚vŠnements enr‚gistr‚s.

appl_tplay
----------
	n  sc  adr  appl_tplay  :  l'AES rejoue n ‚vŠnements … l'adresse adr. Le
paramŠtre sc indique la vitesse voulue (100=normal, 1000=x10, 50=moiti‚,
etc..)

appl_getinfo
------------
	type  appl_getinfo  :  renvoit des informations sur l'AES.

scrp_read
---------
	adr  scrp_read  :  renvoie … partir de l'adresse adr le nom du chemin
d'accŠs au clipboard (presse papier GEM). Si intout contient 0, il suffit de
cr‚er un r‚pertoire \clipbrd et de le sp‚cifier … l'aide de scrp_write.

scrp_write
----------
	adr  scrp_write  :  indique au systŠme le chemin d'accŠs au clipboard.
adr pointe sur une chaŒne termin‚e par 0, par exemple : "C:\CLIPBRD\".
Fonction … n'utiliser que si scrp_read renvoie 0 (donc que me clipboard
n'existe pas encore).

shel_get
--------
	n  adr  shel_get  :  copie n octets du buffer AES (le desktop.inf) vers
l'adresse adr.

shel_put
--------
	n  adr  shel_put  :  copie n octets de l'adresse adr vers le buffer AES.

shel_envrn
----------
	" var="  shel_envrn  :  recherche la valeur d'une variable
d'environnement.
		addrout	: adresse du premier octet de la chaŒne trouv‚e.

shel_write
----------
	mode  wisgr  wiscr  cmd  tail  shel_write

shel_read
---------
	name  tail  shel_read

shel_find
---------
	buffer  shel_find

fsel_intput
-----------
	chemin fichier  fsel_input  :  ouvre le s‚lecteur de fichiers. A cet effet
chemin et fichier sont deux chaŒnes contenant le chemin d'accŠs et le nom du
fichier par d‚faut propos‚ … l'utilisateur. Il est dangereur d'utiliser des
constantes de chaŒnes car toute modification du chemin et du fichier modifie
la chaŒne de d‚part (et donc ‚ventuellement sa longueur).
		intout		: 0 si erreur
		intout+2	: 0=annuler, autre=confirmer
		fichier et chemin modifi‚s selon les actions de l'utilisateur.

fsel_exinput
------------
	chemin  fichier  titre  fsel_exinput  :  mˆme principe que fsel_input,
sauf qu'on ajoute un texte s'affichant comme titre dans le s‚lecteur indiquant
ainsi l'op‚ration r‚alis‚e (30 caractŠres maxi).

path
----
	chemin  fichier  path  :  … utiliser en liaison avec la fonction
pr‚c‚dente. Les deux chaŒnes sont d‚pil‚es et fusionn‚es dans pad dont
l'adresse est laiss‚e sur la pile. Par exemple:
	chemin="C:\FORTH\*.FOR"	et	fichier="TEST.FOR"
	On trouvera alors dans pad="C:\FORTH\TEST.FOR". Notons que le
masque ‚ventuel dans chemin est ot‚.

form_alert
----------
	b  chaŒne  form_alert  :  ouvre une boŒte d'alerte, b correspond au
num‚ro ( 1, 2 ou 3 ) du bouton li‚ … la touche RETURN (0 si aucun). La
chaŒne a cette structure:
	" [n][ligne1|ligne2|....][bouton1|bouton2|...]",  il peut y avoir
jusqu'… 5 lignes de 30 caractŠres et trois boutons, n est le num‚ro de l'ic“ne
(0 aucune, 1=!, 2=?, 3=stop).
		intout		: num‚ro du bouton s‚lectionn‚.

form_error
----------
	n  form_error  :  affiche une boŒte d'alerte correspondant … l'erreur
TOS n. Certaines valeurs de n correspondent … un message bien pr‚cis,
d'autres … une simple boŒte "Erreur TOS #n". Pour passer de l'erreur
GEMDOS (-32 … -49) au code n correspondant on soustrait 31 … sa valeur
absolue. Exemple, le code -36 (accŠs refus‚) correspond … la boŒte 36-31=5.
	n=2, 3 ou 18		: dossier ou fichier non trouv‚.
	n=4			: m‚moire insuffisante pour ouvrir un document
suppl‚mentaire.
	n=5			: document d‚j… existant ou prot‚g‚ en ‚criture.
	n=8, 10 ou 11	: m‚moire insuffisante pour lancer l'application.
	n=15			: lecteur scp‚cifi‚ inexistant.

3 Les fichiers ressource RSC
****************************

	Ce sont eux qui contiennent traditionellement les boites de dialogue,
les menus et les messages d'alerte d'une application. Dans les paragraphes
consacr‚s … ces diff‚rents ‚l‚ments on verra comment cr‚er de tels objets
sans passer par un fichier ind‚pendant.

rsrc_load
---------
	chaŒne  rsrc_load  :  charge un fichier ressource et l'adapte … la
r‚solution actuelle, reloge les adresses.
		intout		: 0 si erreur

rsrc_free
---------
	libŠre la m‚moire utilis‚e par un fichier ressource.

rsrc_gaddr
----------
	t  i  rsrc_gaddr  :  recheche l'adresse du i‚me objet de type t dans le
fichier ressource charg‚ en m‚moire.
		t=0	arbre			t=8	tedinfo-text
		t=1	objet			t=9	tedinfo-masque
		t=2	tedinfo			t=10	tedinfo-valid
		t=3	ICONBLK			t=11	sous pointeur ICONBLK
		t=4	BITBLK			t=12	idem
		t=5	chaŒne			t=13	idem
		t=6	pointeur sur BITIMAGE	t=14	sous pointeur BITBLK
		t=7	ob_spec			t=15	idem
						t=16	idem

		intout		: 0 si erreur
		addrout	: l'adresse recherch‚e.
	Dans un fichier … un seul arbre, pour obtenir le pointeur indispensable
aux fonctions objc_draw et form_do on utilisera :	0  0  rsrc_gaddr

rsrc_saddr
----------
	t  i  adr  rsrc_saddr  :  modifie l'adresse du iŠme objet de type t, adr
est l'adresse que l'on impose.
		intout		: 0 si erreur.

rsrc_obfix
----------
	o  adr  rsrc_obfix  :  convertit les coordonn‚es de l'objet o de l'arbre
point‚ par adr en pixels … partir de valeurs en caractŠres selon la fonte
systŠme en cours.

rsrc_rcfix
----------
	h  rsrc_rcfix  :  fixe toutes les coordonn‚es et les pointeurs du
ressource dont l'adresse du header est h. Si un fichier a d‚j… ‚t‚ charg‚ par
rsrc_load, on doit utiliser rsrc_free avant cet appel.

form_center
-----------
	adr  form_center  :  calcule les coordonn‚es d'un arbre pour qu'il
apparaisse centr‚ sur l'‚cran.
		intout+2 … +8	: X,Y,L,H

form_dial
---------
	f  x  y  l  h  X  Y  L  H  form_dial  :  pr‚pare l'‚cran au dessin d'un
arbre d'objets, sans cet appel, les messages redraws ne seront pas
correctement g‚r‚s par l'AES.
	f=0	: r‚servation de l'‚cran (X,Y,L,H),  (x,y,l,h sont ind‚finis, 0 par
exemple)
	f=1	: dessin d'un rectangle qui grandit de (x,y,l,h) vers (X,Y,L,H)
	f=2	: dessin d'un rectangle qui r‚tr‚cit de (X,Y,L,H) vers (x,y,l,h)
	f=3	: lib‚ration de l'‚cran (X,Y,L,H), (x,y,l,h aussi ind‚finis)
	Les ‚tapes 1 et 2 sont optionnelles.

form_do
-------
	i  adr  form_do  :  passe le contr“le … l'AES pour la gestion du
formulaire point‚ par adr, i est l'indes du champ ‚ditable recevant le curseur
(0 si il n'y en a pas).
		intout		: index de l'objet ayant mis fin au dialogue, le bit
15 est mis en cas de double clic. Pour avoir l'index quoi qu'il arrive : intout
%h7fff and.

form_button
-----------
	o  c  adr  form_button

form_keybd
----------
	o  n  kc  adr  form_keybd

4 Les menus
***********

	Soit le menu est charg‚ dans un fichier RSC, soit il est cr‚‚ en FORTH.
C'est seulement dans ce second cas que la premiŠre partie de ce paragraphe
est … utiliser.

menu
----
	adr  menu  : cr‚e un menu. A cet effet, adr doit ˆtre l'adresse de la
premiŠre chaŒne d'un tableau de chaŒnes (type array$) organis‚ comme suit:
	- d'abord tous les titres de la barre de menu
	- une chaŒne vide
	- l'option du titre 1 (en g‚n‚ral Info)
	- une chaŒne vide
	- les otpions du titre 2
	- une chaŒne vide
	- ...
	Ainsi de suite pour chaque titre. Par exemple, pour cr‚er le menu
suivant :


	Bureau	Fichier		Il faudra 10 chaŒnes de 12 octets on
						declarera 12  10 array$  MENU
	Infos...	Charger			12 10 array$ MENU
			Sauver		Ensuite il faudra remplir le tableau
			--------		de chaines dans l'ordre. La partie
			Quitter		concernant les accessoires est g‚r‚e
						par le FORTH.

	"  Bureau "	0 MENU $!
	"  Fichier "	1 MENU $!		Toujours pr‚voir un blanc … droite
	" "		2 MENU $!		et … gauche pour les check_marks
	"  Infos... "	3 MENU $!		et l'esth‚tique.
	" "		4 MENU $!
	"  Charger "	5 MENU $!
	"  Sauver " 	6 MENU $!
	" -----------"	7 MENU $!
	"  Quitter "	8 MENU $!
	" "		9 MENU $!

	Puis pour finir :  0 MENU  menu.
	renvoie sur la pile l'adresse de l'arbre (comme celle obtenue par
rsrc_gaddr) qu'il faut conserver pour tous les appels ult‚rieurs. Par exemple :
0 MENU menu constant ARBRE.

gemindex
--------
	n  gemindex  :  fournit l'index GEM correspondant … la chaŒne n du
menu. Dans l'exemple pr‚cedent, la chaŒne nø6 (Sauver) n'est pas forc‚ment
le 6ø objet de l'arbre en m‚moire. Or c'est cet index interne qu'il nous faut
connaŒtre pour utiliser correctement les fonctions AES. Par exmple, pour
d‚sactiver l'option 7 (un trait de s‚paration):
		7 gemindex  0  ARBRE  menu_ienable

strindex
--------
	n  strindex  :  fournit le num‚ro de chaŒne d'une option dont on
connait l'index interne. Par exemple, evnt_mesag renvoie cet index
lorsqu'une entr‚e du menu a ‚t‚ selectionn‚e:
	1 ARBRE menu_bar		\ dessine le menu
	begin
		here evnt_mesag
		here w@ 10 =	\ attend l'‚vŠnement "menu selected"
	until
	here 8 + w@			\ index interne de l'option choisie
	strindex			\ son num‚ro de chaŒne
	case
		3 of ...			\ il ne peut ˆtre que 3, 5, 6 ou 8
		5 of ...			\ les autres chaŒnes n'‚tant pas des
		6 of ...			\ options.
		8 of ...
	endcase

setmenu
-------
	adr  setmenu	 :  adr est l'adresse de l'arbre d'un menu (celle renvoy‚e
par menu), le menu ainsi point‚ devient le menu courant (celui utilis‚ pour
gemindex, strindex et autres op‚rations de menu). Cette fonction n'est utile
que lors de l'utilisation de plusieurs menus.

	Les instructions qui suivent sont les appels AES proprement dits, ils sont
donc applicables … tout menu (charg‚ avec rsrc_load ou cr‚‚ en FORTH).

menu_bar
--------
	f  adr  menu_bar  :  dessine (f=1) ou annule (f=0) la barre de menu
dont l'arbre est point‚ par adr.
		intout		: 0 si erreur

menu_icheck
-----------
	i  f  adr  menu_icheck  :  met une marque (f=1) ou l'efface (f=0)
devant l'entr‚e d'index GEM i du menu point‚ par adr.
		intout		: 0 si erreur

menu_ienable
------------
	i  f  adr  menu_ienable  :  active (f=1) ou d‚sactive (f=0) l'entr‚e
d'index GEM i du menu point‚ par adr. Les options d‚sactiv‚es apparaissent
en clair.
		intout		: 0 si erreur

menu_tnormal
------------
	i  f  adr  menu_tnormal  :  passe en vid‚o inverse (f=0) ou en vid‚o
normale (f=1) le titre d'index GEM i du menu point‚ par adr. DŠs qu'une
entr‚e du menu est choisie, le titre reste en vid‚o inverse tant que
l'utilisateur ne l'a pas resatur‚.
		intout		: 0 si erreur

menu_register
-------------
	id  chaŒne  menu_register  :  intŠgre un accessoire ou une application
(sous MultiTOS) … la barre de menu. Le paramŠtre id est celui renvoy‚ par
appl_init, la chaŒne contient le texte qui apparaitra dans le premier menu
d‚roulant.
		intout		: id de l'accessoire … conserver (pour
event_mesag) ou -1 si erreur.

menu_text
---------
	i  arbre  chaŒne  menu_text  :  modifie le nom de l'otion d'index GEM i
dans l'arbre de menu. La chaŒne contient le nouveau nom. Afin de ne pas
d‚border du cadre, la longueur de la chaŒne ne devrait pas ex‚der celle de
l'ancienne.
		intout 		: 0 si erreur

menu_attach
-----------
	flag  item  adr  mdata  menu_attach

menu_istart
-----------
	flag  imenu  item  adr  menu_istart

menu_popup
----------
	xpos  ypos  menu  mdata  menu_popup

menu_settings
-------------
	flag  set  menu_settings

5 Les ‚vŠnements
****************

evnt_keybd
----------
	attend qu'une touche soit press‚e et renvoie:
		intout		: code clavier/code ASCII (octet fort/faible)

evnt_button
	c  m  s  evnt_button  :  attend un ‚vŠnement sur les buttons de la
souris.
		c	: nombre de clics maximum … attendre
		m	: bouton … surveiller (1=droit,2=gauche,3=les deux)
		s	: retour si bouton relach‚ (s=1), appuy‚ (s=2),
				peu importe (s=3)
	On obtient en retour :
		intout		: nombre de clics observ‚s
		intout+2	: mouse x lors de l'‚vŠnement
		intout+4	: mouse y
		intout+6	: copie de s
		intout+8	: ‚tat des touches sp‚ciales
				(bit0=sh_d,bit1=sh_g,bit2=ctrl,bit3=Alt).

evnt_mouse
----------
	f  x  y  l  h  evnt_mouse  :  attend l'entr‚e (f=0) ou la sortie (f=1) du
curseur de la souris d'un rectangle d‚fini par x,y,l,h.  On obtient en retour:
		intout+2	: mouse x		intout+6	: mouse k
		intout+4	: mouse y		intout+8	: tchs sp‚ciales

evnt_timer
----------
	t  evnt_timer  :  attend que le temps t (en millisecondes sur 4 octets)
s'‚coule.

evnt_dclick
-----------
	v  f  evnt_dclick  :  lit (f=0) ou fixe (f=1) la vitesse du double click. Si
f=1, v doit ˆtre un entier de 0 … 4, si f=0, v est sans signification.
		intout		: vitesse prise en compte.

evnt_mesag
----------
	adr  evnt_mesag  :  attend qu'un ‚vŠnement se produise et remplit le
buffer de 16 octets point‚ par adr. On obtient en retour:
		adr		: num‚ro de l'‚vŠnement
		adr+2		: id du programme qui l'a d‚clanch‚
		adr+4		: 0 si buffer suffisant, ou nombre d'octets
				 suppl‚mentaires (appl_read)
	Le num‚ro peut ˆtre l'un des suivants :
	10: MN_SELECTED	: adr+6=index du titre, adr+8=index de l'option
	20: WM_REDRAW	: adr+6=handle de la fenˆtre … redessiner,
					 adr+8 … adr+14=x,y,l,h
	21: WM_TOPPED	: adr+6=handle de la fenˆtre … activer.
	22: WM_CLOSED	: adr+6=handle de la fenˆtre … fermer.
	23: WM_FULLED	: adr+6=handle de la fenˆtre que l'on veut en
					 plein ‚cran.
	24: WM_ARROWED	: adr+6=handle de la fenˆtre dont on a actionn‚
				les flŠches adr+8: 0=page_up, 1=page_down,
				2=up, 3=down, 4=page_left, 5=page_right,
				 6=left, 7=right
	25: WM_HSLID	: adr+6=handle, adr+8=position du curseur
				 horizontal (0 … 1000)
	26: WM_VSLID	: adr+6=handle, adr+8=position du curseur
				 vertical (0 … 1000)
	27: WM_SIZED	: adr+6=handle, adr+8 … adr+14=x,y,l,h les
				nouvelles dimensions
	28: WM_MOVED	: adr+6=handle, adr+8 … adr+14=x,y,l,h la
				nouvelle position
	40: AC_OPEN	: adr+8=id de l'accessoire … activer (celui
				renvoy‚ par menu_register)
	41: AC_CLOSE	: adr+6=id de l'accessoire … refermer.

evnt_multi
----------
	choix  c  m  s  f1 x1 y1 l1 h1  f2 x2 y2 l2 h2  t  adr  evnt_multi  :
attend une combianison d'‚vŠnements selon le masque de bits dans choix:
	choix	bit 0	: evnt_keybd
		bit 1	: evnt_button ( c  m  s )
		bit 2	: evnt_mouse (f1 x1 y1 l1 h1)
		bit 3	: evnt_mouse (f2 x2 y2 l2 h2)
		bit 4	: evnt_mesag (buffer en adr)
		bit 5	: evnt_timer (temps t)
	Les paramŠtres inutiles doivent quand mˆme apparaitre (des 0 par
exemple). renvoie les valeurs suivantes:
	intout		: ‚vŠnement observ‚ (cod‚ comme "choix")
	intout+2	: mouse x	intout+8	: ‚tat des touches sp‚ciales
	intout+4	: mouse y	intout+10	: code touche actionn‚e
	intout+6	: mouse k	intout+12	: nombre de clicks observ‚s


6 Les fenˆtres GEM et les pages FORTH
*************************************

	L'‚criture dans une fenˆtre GEM permet une programmation propre car la
partie correspondante de l'‚cran est r‚serv‚e, les diff‚rents mouvements de fenˆtres,
ouvertures ou fermetures sont automatiquement accompagn‚s de messages GEM
permettant de redessiner les parties ‚ventuellement red‚couvertes. Cependant, …
l'int‚rieur d'une fenˆtre, rien ne nous empˆche d'y cr‚er plusieurs pages FORTH
(pour faire du multicolonnage par exemple, ou pour s‚parer dessin et texte).
Cependant, si les pages ne sont pas log‚es … l'int‚rieur d'une fenˆtre GEM il se
peut que des parties d'‚cran soient ainsi salies sant qu'aucune des applications ne
soit avertie.
	Au lancement du FORTH, la fenˆtre principale est d‚j… ouverte, avec un
programme compil‚ c'est fastopen qui s'en chargera. La page FORTH
correspondante, page0, sera automatiquement calqu‚e sur la fenˆtre. Elle permet
les sorties de texte, de graphiques, les saisies au clavier. Elle sera amplement
suffisante pour bon nombre d'applications.
	Il est … noter que le FORTH ouvre une deuxiŠme station VDI pour les
sorties de texte standard ceci afin que les r‚glages de l'utilisateur ne viennent pas
perturber le bon fonctionnement de l'‚diteur par exemple. Dans cette station VDI,
le clipping est automatiquement r‚alis‚ sur la page0 ainsi les sorties de textes mˆme
bugu‚s (‡a peut arriver) ne sortiront pas de la fenˆtre.

&page
-----
	&page  XXX  :  cr‚e un nouveau mot XXX correspondant … une page
FORTH. Il n'a pour l'instant aucune d‚finition de taille ni de position.
Lorsqu'il est ‚x‚cut‚, XXX laisse sur la pile une adresse contenant:
	adr		: x		adr+8		: x en pixels du curseur texte
	adr+2		: y		adr+10	: y en pixels du curseur texte
	adr+4		: l		adr+12	: l d'un caractŠre
	adr+6		: h		adr+14	: h d'un caractŠre

defpage
-------
	x  y  l  h  XXX defpage  :  donne des dimensions … la page XXX.
Initialise la position du curseur de texte dans la page (0,0 en haut … gauche).
Mais, la page n'est pas encore utilisable, il faut la d‚clarer comme page
active.

setpage
-------
	XXX setpage  :  fixe XXX comme page active. Toutes les sorties de
texte se feront dans cette page, si le mode relative est enclanch‚, toutes les
sorties VDI seront relatives au coin sup‚rieur gauche de cette page.

pageclip
--------
	r‚alise un clipping sur la page active afin de limiter les sorties VDI.

page0
-----
	page de base du FORTH se comportant comme cr‚‚e par &page. C'est
celle ouverte sous l'interpr‚teur ou avec fastopen dans un programme
compil‚. Ce mot laisse donc l'adresse d'une zone de 16 octets d‚crite sous
&page.

page
----
	page courante, mˆme comportement que page0.

fastopen
--------
	dans un programme compil‚ ouvre une fenˆtre plein ‚cran avec les
mˆmes attributs que sous le FORTH et renvoie ensuite son handle sur la pile.
On peut le conserver si on d‚sire agir sur cette fenetre (changer le titre par
exemple... ). Si la fenˆtre est d‚j… ouverte (comme sous l'interpr‚teur)
fastopen se contente de renvoyer le handle.

fastclose
---------
	referme la fenˆtre ouverte avec fastopen. Mˆme dans un programme
cette op‚ration n'est pas n‚cessaire puisqu'elle est automatiquement r‚alis‚e
avant la sortie du programme.

relative
--------
	mode dans lequel les coordonn‚es des fonctions VDI sont relatives au
coin sup‚rieur gauche de la page active et ou les fonctions textes du VDI sont
simul‚es dans cette page.

absolute
--------
	mode dans lequel les coordonn‚es des fonctions VDI sont absolues
(relatives … l'‚cran total) et dans lequel les fonctions texte du VDI sont
ex‚cut‚es de maniŠre normale.

cls
---
	efface la page courante et place le curseur de texte en haut … gauche.

wind_create
-----------
	def  x  y  l  h  wind_create  :  cr‚e une fenˆtre GEM (elle n'est pas
encore affich‚e), xylh sont les dimensions maximales qu'elle pourra prendre,
def est un masque de bits indiquant les ‚l‚m‚nets de la fenˆtre:
		bit 0	: nom			bit 6	: flŠche vers le haut
		bit 1	: closer (ferme)	bit 7	: flŠche vers le bas
		bit 2	: fuller (maxi)	bit 8	: ascenseur vertical
		bit 3	: mover (d‚place)	bit 9	: flŠche vers la gauche
		bit 4	: info			bit 10	: flŠche vers la droite
		bit 5	: sizer (taille)		bit 11	: ascenseur horizontal
	Il faut absolument conserver la valeur renvoy‚e, c'est le handle de la
fenˆtre, c'est … dire un identificateur qui servira dans toutes les fonctions
suivantes:
		intout		: handle ou -1 si la fenˆtre n'a pas pu ˆtre cr‚‚e.

wind_open
---------
	hdl  x  y  l  h  wind_open  :  ouvre la fenˆtre de handle hdl aux
coordonn‚es sp‚cifi‚es.
		intout		: 0 si erreur.

wind_close
----------
	hdl  wind_close  :  ferme la fenˆtre hdl. (Elle n'est pas d‚truite, on
pourra toujours la r‚ouvrir plus tard).

wind_delete
-----------
	hdl  wind_delete  :  d‚truit la fenˆtre hdl. Il faut d'abord ˆtre pass‚
par wind_close.
		intout		: 0 si erreur
wind_new
--------
	efface toutes les fenetres de l'application et initialise les compteurs de
v_hide_c ainsi que de wind_update.

wind_set
--------
	modifie une fenˆtre, il y a plusieurs syntaxes possibles:
	hdl  def  1  wind_set  :  modifie les ‚l‚ments pr‚sents de la fenˆtre hdl
					 (voir wind_create)
	hdl  chaŒne  2  wind_set  :  assigne une chaŒne de titre … la fenˆtre hdl
	hdl  chaŒne  3  wind_set  :  assigne une chaŒne d'info … la fenˆtre hdl
	hdl  pos  8  wind_set  :  position curseur horizontal (pos=1 … 1000)
	hdl  pos  9  wind_set  :  position du curseur vertical (pos=1 … 1000)
	hdl  10  wind_set  	:  active la fenˆtre hdl
	adr  obj  14  wind_set  :  installe un arbre d'objets (… partir de l'objet
				obj) point‚ par adr … la place du fond du bureau.
	hdl  t  15 wind_set  :  fixe la taille du curseur horizontal (t=1 … 1000)
	hdl  t  16 wind_set  :  fixe la taille du curseur vertical (t=1 … 1000)

	Pour toute autre valeur du flag (autre que 1,2,3,8,9,10,14,15,16), il
faut reprendre la syntaxe g‚n‚rale de wind_set:
	hdl  param1 param2 param3 param4  flag  wind_set

	hdl  x  y  l  h  5  wind_set  :  nouvelle position de la fenˆtre.

wind_get
--------
	hdl  f  wind_get  :  renvoie des informations sur la fenˆtre hdl selon la
valeur de f:
		f=4	: dimensions de l'espace de travail
		f=5	: dimensions de l'espace total
		f=6	: dimensions de l'espace total pr‚c‚dant (avant fuller)
		f=7	: dimensions de l'espace total maximal
		f=8	: position du curseur horizontal (1 … 1000)
		f=9	: position du curseur vertical (1 … 1000)
		f=10	: renvoie le handle de la fenˆtre active (hdl n'a pas de
			sens alors)
		f=11	: dimensions du premier catalogue REDRAW
		f=12	: le suivant
		f=15	: taille du curseur horizontal (1 … 1000)
		f=16	: taille du curseur vertical (1 … 1000)

	Valeurs retourn‚es:
		intout		: 0 si erreur
		intout+2	: x ou position (f=8,9) ou handle (f=10) ou
					taille (f=15,16)
		intout+4	: y
		intout+6	: l
		intout+8	: h



wind_find
---------
	x  y  wind_find  :  renvoie le handle de la fenˆtre sous les coordonn‚es
x,y.
		intout		: handle (0 si c'est le fond du bureau)

wind_update
-----------
	f  wind_update  :  gŠre le contr“le de l'‚cran et de la souris
		f=0	: l'‚cran est libre
		f=1	: vous r‚servez l'accŠs … l'‚cran pour entreprendre des
				modifications
		f=2	: l'AES reprend le contr“le de la souris (menus,
				formulaire)
		f=3	: vous prenez le cont“le de la souris.
	Lors de modifications il faut d'abord appeler wind_update avec f=1
avant d'effacer la souris.

wind_calc
---------
	f  def  x  y  l  h  wind_calc  :  fournit l'espace total (f=0) … par tir de
l'espace de travail ou l'espace de travail (f=1) … partir de l'espace total en
tenant compte des ‚l‚ments de la fenˆtre dans le masque de bits def (voir
wind_create).
		intout		: 0 si erreur
		intout+2 … intout+8	: x, y, l, h.

get_xywh
--------
	adr  get_xywh  :  ramŠne sur la pile les 4 valeurs de mots se trouvant
… l'adresse adr.

get_xyxy
--------
	adr het_xyxy  :  ramŠne sur la pile les 4 valeurs de mots se trouvant …
l'adresse adr puis transforme w et h en x' et y' pour le dialogue avec le VDI:
			x'=x+w-1	y'=y+h-1
	En effet, les rectangles VDI sont d‚finis par deux points oppos‚s et
non par la lageur et hauteur … parir du coin sup‚rieur gauche.

set_redraw
----------
	hdl  x  y  l  h  set_redraw  :  pr‚pare la boucle de redraw pour la
fenˆtre hdl. Les dimensions du rectangle sont donn‚es par evnt_mesag ou
evnt_multi.

redraw
------
	… l'aide des paramŠtres sp‚cifi‚s dans set_redraw, renvoie un … un les
rectangles … redessiner. Lors du premier appel, on r‚serve l'‚cran (1
wind_update) et on efface la souris (v_hide_c). Lorsqu'il n'y a plus de
rectangles l'‚cran est lib‚r‚ (0 wind_update) et la souris r‚affich‚e (1
v_show_c).
	renvoie 1 et x y x' y' si un rectangle est … redessiner
	renvoie 0 si c'est termin‚.


	Petit exemple:

	here evnt_mesag
	here w@ 20 =		;  c'est le message REDRAW
	if
		here 6 + w@		; le handle
		here 8 + get_xywh
		set_redraw		; pr‚pare la boucle
		begin
			redraw
		while
			....		; ici x y x' y' sont disponibles pour un
						dessin
			v_recfl		; remplit un rectangle par exemple!
		repeat
	then

7 La librairie Graf
*******************

graf_handle
-----------
	renvoie les informations suivantes:
	intout		: handle pour ouvrir une station VDI
	intout+2	: largeur caractŠre	intout+6	: largeur cellule
	intout+4	: hauteur caractŠre	intout+8	: hauteur cellule

graf_mkstate
------------
	renvoie les informations suivantes:
	intout+2	: mouse x		intout+6	: mousek
	intout+4	: mouse y		intout+8	: touches sp‚ciales

graf_mouse
----------
	f  graf_mouse  :  fixe la forme de la souris:
		f=0	flŠche			f=4	main … plat
		f=1	curseur		f=5	r‚ticule fin
		f=2	abeille			f=6	r‚ticule ‚pais
		f=3	main qui pointe	f=7	contour de r‚ticule
en plus:	f=256		d‚sactiver la souris
		f=257		activer la souris
		f>65535	consid‚r‚ comme une adresse pointant sur un
bloc de d‚finition de la souris, la d‚finition est la mˆme que pour la fonction
vsc_form du VDI.

graf_dragbox
------------
	l  h  x  y  X  Y  L  H  graf_dragbox  :  … l'int‚rieur d'un rectangle
(XYLH), permet le d‚placement d'un petit rectangle de dimensions (l,h) …
partir des coordonn‚es (x,y). Le bouton de la souris doit ˆtre appuy‚ avant
l'appel, la fonction s'arrˆte lorsqu'il est relƒch‚.
		intout		: 0 si erreur
		intout+2	: x final du petit rectangle
		intout+4	: y final
graf_growbox
------------
	x  y  l  h  X  Y  L  H  graf_growbox  :  dessine un rectangle qui
s'agrandit.

graf_movebox
------------
	l  h  x  y  x'  y'  graf_movebox  :  dessine un rectangle (l,h) qui se
d‚place de x,y … x',y'.

graf_rubberbox
--------------
	x  y  l  h  graf_rubberbox  :  dessine un rectangle dont un coin (x,y)
est fixe et dont l'angle oppos‚ suit le mouvement de la souris. (l,h) sont les
dimensions minimales du rectangle. Il faut que le bouton de la souris soit
appuy‚ avant l'appel, la fonction s'arrˆte lorsqu'il est relƒch‚.
		intout		: 0 si erreur
		intout+2	: largeur finale
		intout+4	: hauteur finale

graf_shrinkbox
--------------
	X  Y  L  H  x  y  l  h  graf_shrinkbox  :  dessine un rectangle qui va en
r‚tr‚cissant.

graf_slidebox
-------------
	p  f  dir  adr  graf_slidebox  :  dans un arbre d'objets point‚ par adr,
permet le d‚placement horizontal (dir=0) ou vertical (dir=1) d'un objet fils
d'index f … l'int‚rieur d'un objet pŠre d'index p. Il faut que le bouton de la
souris soit appuy‚ avant l'appel, la fonction s'arrˆte lorsqu'il est relƒch‚.
		intout		: position du fils de 0 (gauche ou haut) … 1000
					(droite ou bas).

graf_watchbox
-------------
	0  i  s_in  s_out  adr  graf_watchbox  :  surveille le passage de la souris
dans l'objet d'index i de l'arbre point‚ par adr. Si la souris est dedans son
ob_state=s_in, si elle est dehors alors ob_state=s_out. La fonction s'arrˆte
dŠs que le bouton est relƒch‚.
		intout		: souris en dehors (0) … la fin ou en dedans (1).

8 Les arbres d'objets
*********************

	Ce paragraphe traite la cr‚ation d'un arbre d'objets (formulaire)
directement en FORTH, c'est … dire sans passer par un fichier RSC s‚par‚.
Cette manipulation demande quelques petits calculs et surement plusieurs
essais pour les r‚glages. Le premier travail est la r‚servation des zones dans
lesquelles seront rang‚es les d‚finitions des objets.

dialogue
--------
	ob_zone  ted_zone  aut_zone  dialogue  :  entame la cr‚ation d'un
arbre.
		ob_zone	: adresse du bloc objet, 24 octets par objet.
		ted_zone	: adresse du bloc TEDINFOS, 28 octets pour
				chaque objet de type TEXT, BOXTEXT, FTEXT
				 ou FBOXTEXT.
		aut_zone	: autres structures, 14 octets pour chaque IMAGE,
				34 par ICON et 36 par USERDEF.
	Il est ‚vident qu'au d‚but ces zones sont vides.

child<<      >>
---------------

	n child<< ... >>   :  d‚clare que tous les objets cr‚‚s dans cette
structure sont les enfants de l'objet n. La structure ne peut pas ˆtre
imbriqu‚e (‡a ne veut pas dire qu'on ne pourra pas avoir d'enfants …
l'int‚rieur d'enfants).

lastobj
-------
	marque le dernier objet comme ‚tant le fin de l'arbre. Indispensable
avec des FTEXT pour ‚viter toute erreur.

	Illustrons ceci par un exemple, soit … cr‚er le formulaire suivant :
		-----------------------------------------
		|	Rechercher:________		|
		|					|
		|	Avant 	            ArriŠre	|
		| 					|
		|	   Ok		Annuler		|
		-----------------------------------------


	L'objet 0 est un BOX contenant un FTEXT, deux BUTTONs et une
IBOX qui contient deux radioBUTTONs.

	24 7 * allot constant OB_ZONE			\ 7 objets en tout
	28 allot constant TED_ZONE			\ une seule TEDINFO
								\ (celle du FTEXT)
	OB_ZONE   TED_ZONE  0 dialogue		\ le dernier
								\ paramŠtre est fictif
	"cr‚ation de la boite"				\ objet 0

	0  child<<						\ les enfants du 0
		"cr‚ation du FTEXT"                		\ objet 1
		"cr‚ation de la IBOX"			\ objet 2
		"cr‚ation du 1ø bouton (Ok)"		\ objet 3
		"cr‚ation du 2ø bouton (Annuler)"		\ objet 4
		>>

	2 child<<						\ les enfants de IBOX
		"cr‚ation du radiobouton (Avant)"		\ objet 5
		"cr‚ation du radiobouton (ArriŠre)"	\ objet 6
		>>
	lastobj							\ fini!

	Chaque objet cr‚‚ demande 24 octets ainsi utilis‚s (par exemple pour
l'objet d'index i):

		ob_zone+24*i	: pointeur sur le suivant
				+2	: pointeur sur le premier enfant
				+4	: pointeur sur le dernier enfant
				+6	: type d'objet
				+8	: flag
				+10	: state
				+12	: spec (mot long, 4 octets)
				+16	: X
				+18	: Y
				+20	: L
				+22	: H

	flag est ainsi d‚fini :		state est ainsi d‚fini:
	bit 0	: selectable			bit 0	: selected
	bit 1	: default			bit 1	: crossed (type BOX)
	bit 2	: exit				bit 2	: checked
	bit 3	: editable (FTEXT)		bit 3	: disabled
	bit 4	: radio button		bit 4	: outlined
	bit 5	: last object			bit 5	: shadowed
	bit 6	: touch exit
	bit 7	: hide tree
	bit 8	: indirect

	Les coordonn‚es sont donn‚es en caractŠres sur deux octets:
		octet faible 	: nombre de caractŠres
		octet fort	: nombre sign‚ de points … ajouter.
	Exemple : 	5 		-> 5 caractŠres
			%h0205 	-> 5 caractŠres plus 2 points.
			%hff05 	-> 5 caractŠres moins un point.
	Pour la cr‚ation des objets, voici les mots utiles:

BOX
IBOX
BOXCHAR
-------
	flag  state  spec  x  y  l  h  BOX  :  mˆme syntaxe pour les trois. spec
est un masque de bits ainsi d‚fini:
	bits 31-24	: code ASCII du caractŠre (pour BOXCHAR)
	bits 23-16	: largeur du bord (+ int‚rieur, - ext‚rieur)
	bits 15-12	: couleur de bord
	bits 11-8	: couleur caractŠre
	bit 7		: 0 transparent, 1 opaque
	bits 6-4	: style de remplissage
	bits 3-0	: couleur de remplissage.

BUTTON
STRING
TITLE
------
	flag  state  chaŒne  x  y  l  h  BUTTON  :  mˆme syntaxe pour les trois.


TEXT
BOXTEXT
-------
	flag  state  x y l h  chaŒne fonte just couleur  TEXT  :  mˆme syntaxe
pour les deux.
	La fonte est petite (5) ou normale (3), la justification centr‚e (2), …
gauche (0) ou … droite (1). couleur correspond … spec d'un BOX (bits 0 … 23).

FTEXT
FBOXTEXT
--------
	flag state x  y  l  h  chaine1 chaine2 chaine3 just couleur FTEXT  :
mˆme syntaxe pour les deux. just et couleur sont identiques … TEXT. Les trois
chaŒnes sont le texte, le masque de saisie et le masque de validation.

IMAGE
-----
	flag  state  x  y  l  h  adr  couleur  IMAGE  :  pour cet objet, l est la
largeur en octets (pair) et h la hauteur en points. La couleur est de 1 … 16.
Adr pointe sur les donn‚es, chaque mot constitue 16 points cons‚cutifs.

ICON
----
	flag state x  y  x'  y'  coul_car  chaŒne  adr  ICON  :  cr‚e une icone de
dimensions 32x32.
		x'  y'  :  coordonn‚es du caractŠre dans l'image 32x32.
		coul_car  :  couleur du caractŠre : bits15-12=couleur 1øplan,
			 	bits11-8=couleur fond,
				bits7-0=code ASCII du caractŠre.
		chaŒne  :  affich‚e sous l'icone en fonte 6x6 sur 13 caractŠres
				maximum.
		adr  :  adresse des donn‚es, 128 octets pour 32*32 points du
			masque, et 128 octets pour 32x32 points de l'icone.

USERDEF
-------
	flag  state  x  y  l  h  code  param  USERDEF  :  cr‚e un objet dont
l'aspect et le comportement est g‚r‚ par une routine de l'utilisateur. La
routine doit ˆtre un mot compil‚ ou assembl‚, il re‡oit sur une pile
provisoire (n'oublions pas qu'on se trouve dans l'AES) l'adresse d'un bloc
ainsi d‚fini:
		adr		: adresse de l'arbre
		adr+4		: index de l'objet
		adr+6		: state pr‚c‚dent
		adr+8		: nouveau state
		adr+10	: X, Y, L, H absolus de l'objet
		adr+18	: x, y, x', y' du rectangle de clipping
		adr+26	: param (sur 4 octets)
	Si les deux valeurs de state sont ‚gales, c'est qu'il faut dessiner l'objet
dans cet ‚tat (un appel de ob_draw). Si elles sont diff‚rentes, il faut
s'occuper de passer l'objet d'un ‚tat … l'autre (par exemple, l'objet a ‚t‚
s‚lectionn‚). La valeur de param est laiss‚e libre … l'utilisateur, on peut par
exemple concevoir une mˆme routine pour plusieurs objets, le param
permettant de les distinguer.
	La routine doit renvoyer un state dont les bits restants sont ceux dont
le traitement sera laiss‚ … l'AES, on renvoie 0 si on s'occupe de tout. Les
coordonn‚es sont en mode absolu par rapport … l'‚cran physique. Si une
routine VDI doit ˆtre utilis‚e, il faut sp‚cifier "absolute" avant.

objc_change
-----------
	index 0 x y l h  state  f  adr  objc_change  :  modifie le state de l'objet
d'index i dans l'arbre point‚ par adr, x y l h sont les dimensions du cadre de
clipping si l'objet doit ˆtre redessin‚ vaec son nouvel ‚tat (f=1), f=0 sinon et
x y l h sont ind‚finis.
		intout		: 0 si erreur

objc_draw
---------
	i  prof  X  Y  L  H  adr  objc_draw  :  dessine un arbre d'objets point‚
par adr, les coordonn‚es sont celles renvoy‚es par form_center, i est l'idex
du premier objet … dessiner (0 le plus souvent) et prof est le nombre de
g‚n‚rations … dessiner en profondeur (avec 2, l'AES ira jusqu'aux enfants des
enfants de l'objet de d‚part), on choisira une valeur d‚passant 7 pour avoir
tout l'arbre.
		intout		: 0 si erreur

objc_find
---------
	i  prof  x  y  adr  objc_find  :  renvoie l'index de l'objet se trouvant
sous les coordonn‚es x,y. i et prof d‚finissent la fourchette de recherche
(voir objc_draw) et adr est l'adresse de l'arbre.
		intout		: index de l'objet cherch‚ ou -1 si aucun.

objc_edit
----------
	obj  kc  idx  mode  tree  objc_edit

objc_offset
-----------
	i  adr  objc_offset  :  calcule les coordonn‚es de l'objet i de l'arbre
point‚ par adr par rapport … l'origine de l'‚cran.
		intout		: 0 si erreur
		intout+2	: x
		intout+4	: y

objc_add
--------
	p  e  adr  objc_add  :  lie l'enfant d'index e au parent d'index p dans
l'arbre d'adresse adr.
		intout		: 0 si erreur

objc_delete
-----------
	o  adr  objc_delete  :  d‚fait les liens de l'objet d'index o dans l'arbre
point‚ par adr. Les objets ne sont pas effac‚s.
		intout		: 0 si erreur





objc_order
----------
	o  p  adr  objc_order  :  donne … l'enfant d'index o la position p dans
l'ordre des enfants du mˆme parent, l'arbre est point‚ par adr.
	p=-1		: o de vient le dernier enfant
	p=0		: o devient le premier enfant
	p=1		: o devient le second enfant
	p=2		: etc...

objc_sysvar
-----------
	m  a  x1 x2  objc_sysvar  :  renvoit (m=0) ou fixe (m=1) les attributs
des objets en 3D, a dertermine quels attributs et x1,x2 sont les valeurs ( si
m=1 et sans signification si m=0).
	intout		: 0 si erreur
	intout+2	: x1 en lecture
	intout+4	: x2 en lecture

9 Les formulaires dans les fenˆtres
***********************************

	L'appel de form_do est bloquant, c'est … dire que l'utilisateur doit
absolument y r‚pondre et en sortir avant de pouvoir … nouveau utiliser le menu ou
un autre formulaire. Pour pallier … ceci, on place les formulaires dans des fenˆtres.
Ainsi on pourra passer d'un formulaire … l'autre en s‚lectionnant la fenˆtre
appropri‚e, l'accŠs au menu sera ‚galement possible.

&wdial_create
-------------
	tree &wdial_create XXXX	: cr‚e un mot XXXX correspondant … une
structure qui permettra l'inclusion de l'arbre d'objets tree dans une fenˆtre. A
ce stade rien n'est encore affich‚, seul un appel … form_center a ‚t‚ fait pour
que la premiŠre ouverture se fasse au centre de l'‚cran.
	A l'ex‚cution XXX laisse sur la pile l'adresse de la structure suivante:
	adr		: tree (long)
	adr+4		: x,y,l,h (mots) de l'espace de travail (taille de l'arbre)
	adr+12	: x,y,l,h (mots) de l'espace total.
	adr+20	: handle fenetre ou 0 (pas encore ouvert ou referm‚)
	adr+22	: index de l'objet ‚ditable contenant le curseur ou 0.
	adr+24	: position (en caractŠres) du curseur

wdial_open
----------
	i  " titre"  XXXX  wdial_open	: ouvre la fenˆtre pour la stucture
XXXX (elle contient les coordonn‚es, l'adresse de l'arbre). " titre" est le titre
de la fenˆtre, i l'index de l'objet ‚ditable qui recevra le curseur en premier ou
0 si il n'y en a pas.
	Si la fenˆtre est d‚j… ouverte, elle est ramen‚e au premier plan.
	La fonction renvoit le handle de la fenˆtre ou un code d'erreur.
	(l'arbre n'est pas dessin‚, c'est par evnt_multi et wdial_formdo que le
dessin se fera par l'interm‚diaire des REDRAWS)

wdial_close
-----------
	XXXX wdial_close	: referme la fenˆtre et le formulaire disparait.

wdial_evnt
----------
	buf  intout  wdial_evnt	: il s'agit d'un appel standardis‚ …
evnt_multi comprenant les ‚vŠnements suivants:
	evnt_mesag	(dont le buffer est buf)
	evnt_keybd
	evnt_button  (seul le bouton gauche est surveill‚)
	Il permet donc de surveiller les actions sur les fenˆtres, le menu, les
boutons des formulaires et les objets ‚ditables (FTEXT ou FBOXTEXT). Il
remplit buf (16 octets mini) et intout (14 octets mini) comme evnt_multi.
	Le fait d'imposer le paramŠtre intout permet de choisir n'importe
quelle autre zone (au lieu du intout standard) et ainsi d'effectuer d'autres
appels AES ou VDI avant de traiter l'‚vŠnement (il serait sinon effac‚ par un
autre appel).

wdial_formdo
------------
	buf  intout  wdial_formdo   : gŠre les formulaires dans les fenˆtres dŠs
qu'un ‚vŠnement a surgi. Buf et intout sont ceux de evnt_multi ou de
wdial_evnt. (Si il s'agit du intout de evnt_multi, c'est le intout standard et il
peut ˆtre effac‚ … chaque appel AES ou VDI!).
	-  pour un ‚vŠnement fenˆtre, v‚rifie qu'elle est dans la liste de celles
cr‚ees avec wdial_open et prend en charge: REDRAW, MOVED, TOPPED et
CLOSED.
	-  pour un ‚vŠnement bouton v‚rifie que le clic est au dessus d'un
objet de la fenetre au premier plan ouverte avec wdial_open et prend en
charge les boutons SELECTABLEs, le passage du curseur d'un FTEXT …
l'autre.
	-  pour un ‚vŠnement clavier v‚rifie que la fenˆtre au premier plan
contient bien un objet EDITABLE (ou un bouton DEFAULT) et prend en
charge l'‚dition complŠte du champ, le passage d'un FTEXT … l'autre (tab ou
flŠches) ainsi que la touche ENTER (bouton DEFAULT).
	Valeurs renvoy‚es:
	0	: l'‚vŠnement ne concerne pas une fenˆtre ouverte avec
wdial_open ou l'‚vŠnement a entiŠrement ‚t‚ g‚r‚ par la fonction.
	1	: l'‚vŠnement n‚cessite un compl‚ment de traitement par
l'utilisateur, on trouve alors sur la pile XXXX (la stucture concern‚e) ainsi
que  l'index i du bouton EXIT ayant provoqu‚ l'‚vŠnement:
		i=-1	: bouton CLOSER de la fenˆtre
		i>=0	: autre bouton EXIT du formulaire.
	Une fois ce compl‚ment d'action pris en charge, il faut rappeler
wdial_formdo afin de s'assurer qu'aucun autre ‚vŠnement n'‚tait en attente.
Ce n'est que lorsqu'on re‡oit 0 que l'on peut rappeler wdial_evnt pour une
autre s‚rie d'‚vŠnements. C'est pour ceci qu'il est important de d‚finir une
seconde zone 'intout' ind‚pendante de la zone standard afin d'en conserver
les valeurs sur plusieurs appels … wdial_formdo.
	A chaque appel, le masque d'‚vŠnement (dans intout) est mis … jour
pour oter ceux d‚j… trait‚s.




wdial_change
------------
	i  XXXX  wdial_change   :  permet de d‚selectionner le bouton EXIT i
ayant ‚t‚ s‚lectionn‚ par l'utilisateur. Si la fenˆtre de l'arbre d'objets est au
premier plan le bouton sera redessin‚, sinon seul son STATE est modifi‚ et il
sera correctement redessin‚ dŠs que la fenˆtre repassera en avant.

	Voici un squelette de programme utilisant ces mots:

	cr‚ation des arbres avec 'dialogue' ou chargement avec 'rsrc_load'

	arbre1  &wdial_create  fen1		\ cr‚ation des structures
	arbre2  &wdial_create  fen2
	....
	16 allot constant BUF			\ buffer MESAG
	14 allot constant OUT			\ nouvel intout

	affichage ‚ventuel d'un menu et/ou d'un formulaire (wdial_open)


	begin
		BUF  OUT wdial_evnt	\ surveille les ‚vŠnements
		r‚action aux ‚vŠnements ne concernant pas
		les formulaires (menu->ouverture de formulaires avec
		 wdial_open, autres fenˆtres...)
		begin
			BUF  OUT wdial_formdo	\ s'occupe du reste
		while				\ si autre que 0
			case
			fen1 of		\ traitement s‚par‚ par arbres
				case
				-1 of  fen1 wdial_close endof	\ fermer
				i1 of  r‚agir au bouton i1 		\ bouton EXIT
					i1  fen1  wdial_change	\ ‚tat normal
					endof
				i2 of ....
				endcase
			endof
			fen2  of	\ idem pour les autres
				....
			endof

			encase
		repeat			\ continuer formdo pour finir ‚vŠnements
	again				\ reprendre evnt, autres ‚vŠnements






global
------
	laisse sur la pile l'adresse du champ global rempli par appl_init et
rsrc_load.
	global		: version de l'AES
	global+2	: nombre d'applications simultan‚es (-1 sous MultiTOS)
	global+4	: ID renvoy‚e par appl_init
	global+6	: long mot utilisateur (FORTH l'utilise pour les menus!)
	global+10	: pointeur sur le fichier RSC charg‚ avec rsrc_load.
	global+14	: 12 octets r‚serv‚s
	global+26	: _AESmaxchar (version 4.00 ou >)
	global+28	: _AESminchar (version 4.00 ou >)