Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Amiga E - utilisation d'une AppIcon
(Article écrit par Yann Armand et Pierre Girard et extrait d'Amiga News - novembre 1995)
|
|
Description
Ce mois-ci, un petit programme qui va vous rendre bien des services. Il peut, en effet, lancer vos fichiers texte ou image
directement depuis le Workbench, et avec l'utilitaire que vous souhaitez !
Une AppIcon : quèsaco ?
Une AppIcon est une icône qui ne renvoie pas directement à un programme, mais qui peut exécuter une action quand on "lâche"
une autre icône dessus. Il existe d'autres types d'éléments graphiques qui sont "App" (menus, fenêtre de requête...).
Essayez donc de déposer une icône dans une fenêtre de requête Reqtools et vous verrez ce qui se passe ! Mais, entrons tout
de suite dans le vif du sujet.
Le programme
Après la description générale de ce qu'est une AppIcon, nous allons maintenant nous intéresser à un petit programme pratique,
dérogeant ainsi à la règle que nous nous étions fixée, d'alterner entre les exemples concrets et la théorie. Attention, le
programme de ce mois-ci ne fonctionne qu'avec un système 2.04 ou plus. Il ouvre une AppIcon et exécute une action quand on
dépose une icône sur celle-ci. Ce n'est pas clair ? Par exemple, tapons au clavier : "AppIcon c:muchmore". Une AppIcon apparaît
alors, représentant l'icône de Muchmore et chaque fois que l'on dépose, depuis le Workbench, un fichier texte dessus, l'AppIcon
invoque Muchmore et affiche le texte. Il est à noter qu'il faut donner le chemin complet d'accès à Muchmore. De plus, le programme
à invoquer doit absolument posséder une icône (nom.info), car notre programme duplique celle-ci pour afficher l'AppIcon.
Description
Attention ! Cet article et ceux à venir ne seront peut-être pas aussi "propres" que ceux des mois précédents. En effet, toutes
les procédures "propres" sont longues et nous préfèrerons désormais privilégier les routines essentielles. C'est ainsi que ce
mois-ci, il aurait été mieux de faire une procédure Main() HANDLE suivie d'un EXCEPT pour gérer les erreurs (cf
Amiga News du mois dernier), car le CleanUp(0) du début n'est vraiment pas
beau.
Nous passons sur le chargement des modules qui doit dorénavant vous être familier, vous chercherez vous-même leur utilisation.
Étant donné la taille du programme, nous inclurons toute la routine dans une procédure Main(). Le programme se lance à partir du
Shell et requiert un argument que nous stockons dans la variable "programme". Si cet argument est absent, le programme quitte en
catastrophe avec la fonction CleanUp() du E. Ensuite, nous procédons à l'ouverture des différentes bibliothèques avant de créer
un port message (myport) qui va nous permettre de déterminer si une icône a été déposée sur notre AppIcon.
Les deux lignes suivantes représentent le coeur de notre programme. La fonction AddAppIconA() ajoute une AppIcon au Workbench.
La syntaxe exacte est "AddAppIconA(id, userdata, text, msgport, lock, diskobj, taglist)". Les variables "id" et "userdata" sont
destinées à l'utilisateur (qui peut donner un numéro d'identification...). "Text" détermine le nom de l'AppIcon et "msgport" est
le nom du port message à utiliser. "Lock" est inutilisé (NULL) et "diskobj" est un pointeur sur une structure DiskObject. Pour
initialiser cette structure, nous utilisons, à la ligne suivante, la fonction GetDiskObject() de l'icon.library. Celle-ci
renvoie dans la variable "diskobj" la structure DiskObject de l'icône du programme appelé. Les tags sont ensuite initialisés
avec le type MTYPE_APPICON ainsi qu'avec TAG_DONE qui termine l'initialisation. Le reste du programme est assez classique et
ne mérite que peu d'explications.
Le traitement des données se fait à l'intérieur d'une boucle REPEAT-WHILE qui ne se termine que quand le message reçu correspond
à "Ctrl-C" (testé par CheckSignal (SIGBREAK_CTRL_C)). Il convient tout d'abord de faire un WaitPort() pour attendre un message.
Quand un message est présent (une icône lâchée ou un double-clic sur l'AppIcon), un GetMsg(myport) se charge de le stocker dans
la variable "appmsg". La ligne suivante nous permet d'utiliser les arguments récupérés (de l'icône déposée sur l'AppIcon) comme
des arguments Workbench. La fonction CurrentDir() de la dos.library "pose" un lock sur le répertoire de l'icône, ce qui va nous
permettre de réaliser les opérations qui nous intéressent, sans avoir à nous soucier du chemin complet pour accéder à l'icône.
L'ancien lock (répertoire courant) est stocké dans la variable "old_lock". Pour expliquer la syntaxe, il faut savoir que la
structure wbarg contient seulement deux entrées : un pointeur sur un "lock" et une chaîne de caractères liée à ce "lock"
(qui correspond ici au nom de l'icône).
On lance !
Il ne nous reste plus qu'à créer notre ligne de commande. Nous stockons le nom du programme dans la chaîne de caractères
"commande". Il faut ensuite ajouter un espace, puis le nom de l'icône (wb_args.name), et ceci grâce à la fonction StrAdd() du E.
La commande entière est alors exécutée à l'aide de la fonction Execute() de la bibliothèque DOS.
On remet tout en ordre
Tout d'abord, nous revenons à l'ancien répertoire avec CurrentDir(old_lock). Ensuite, il nous faut renvoyer le message à l'aide
d'un ReplyMsg(appmsg), et ceci est indispensable, sinon notre programme reste bloqué. Si un "Ctrl-C" ou une erreur a lieu, il
faut quand même fermer l'AppIcon, le port message et les différentes bibliothèques.
Conclusion
Ce programme est réduit à sa plus simple expression. Il peut être amélioré par exemple en mettant un ">nil:" dans la commande
pour ne pas avoir de retour de texte dans la fenêtre Shell. Pour sortir du programme, il faut faire un "Ctrl-C", mais celui-ci
ne prend pas effet immédiatement, car le waitport() est en attente.
Nous vous conseillons de faire un "Ctrl-C" et, par exemple, de double-cliquer sur l'AppIcon.
Le mois prochain, nous verrons comment améliorer sensiblement ce petit programme qui peut devenir, il est vrai, très pratique.
/* AppIcon : Ajoute une AppIcon aux programmes
qui n'en possèdent pas*/
OPT OSVERSION=37
MODULE 'workbench/workbench'
MODULE 'workbench/startup'
MODULE 'dos/dos'
MODULE 'utility/tagitem'
MODULE 'wb'
MODULE 'icon'
MODULE 'exec/ports'
MODULE 'exec/nodes'
DEF old_lock,testctrl_c
DEF myport,appicon,res: PTR TO mp
DEF diskobj: PTR TO diskobject
DEF appmsg: PTR TO appmessage
DEF wb_args: PTR TO wbarg
DEF commande[200]: STRING
DEF programme[200]: STRING
PROC main()
IF StrCmp(arg,'',1) THEN CleanUp(0) ELSE StrCopy(programme,arg)
IF workbenchbase:=OpenLibrary('workbench.library',37)
IF iconbase:=OpenLibrary('icon.library',37)
IF myport:=CreateMsgPort()
IF diskobj:=GetDiskObject(programme)
IF appicon:=AddAppIconA(0,0,'Display me',myport,NIL,
diskobj,[MTYPE_APPICON,TAG_DONE])
REPEAT
res:=WaitPort(myport)
IF appmsg:=GetMsg(myport)
wb_args:=appmsg.arglist
old_lock:=CurrentDir(wb_args.lock)
StrCopy(commande,programme)
StrAdd(commande,' ')
StrAdd(commande,wb_args.name,ALL)
Execute(commande,NIL,stdout)
CurrentDir(old_lock)
testctrl_c:=CheckSignal(SIGBREAKF_CTRL_C)
WHILE appmsg:=GetMsg(myport) DO Reply-
Msg(appmsg)
ENDIF
UNTIL testctrl_c<>0
RemoveAppIcon(appicon)
ENDIF
ENDIF
DeleteMsgPort(myport)
ENDIF
CloseLibrary(iconbase)
ENDIF
CloseLibrary(workbenchbase)
ENDIF
ENDPROC
|
|