Librairie Icon

Un article de GuruMed.

Par Iliak

Le Workbench (WB) est l'interface graphique de l'Amiga. Celui-ci permet de représenter simplement et graphiquement les disques, les répertoires et le fichiers. Dans ce chapitre, nous allons aborder deux librarys, la workbench.library et la icon.library du WorkBench 3.5. La première permet aux applications de communiquer avec le WorkBench, tandis que la deuxième permet aux applications d'afficher des icônes sur le bureau.

Dans un premier temps, nous allons étudier l'icon.library afin d'afficher des icones et apres la workbench.library

Sommaire

Présentation de l'icon.library

Afin d'afficher des icones, le WorkBench a besoin d'un fichier se terminant par un '.info' et portant le même nom que le fichier à afficher. Ainsi pour afficher le fichier 'toto', il faut avoir son fichier icone nomé 'toto.info' dans le même répertoire. Par défaut, le système fournis quatre types d'icones :

  • Disque : un disque dur
  • Répertoire : par exemple Sys:Devs/
  • Projet : un fichier de données
  • Objet : un exécutable

Pour créer des icones, vous devez utiliser le logiciel IconEdit fournis avec le système, ou la créer vous même au sein de votre programme. Vous devez absolument respecter le tableau ci-dessus sinon vous aurez des problèmes pour fa ire marcher votre application si vous désirez le lancer depuis le WorkBench. Il existe un cas particulier pour nommer les icones, les disques. Dans TOUS les cas, l'icone pour un disque ce nomme 'disk.info', a le type disk et se situe à la racine du disque (disquette ou disque dur). En plus du fait de fournir une interface graphique, l'icon.library est un pillier centrale entre votre application et le workbench. En effet, vous pouvez stocker des informations à l'intérieur des icones, comme par exemple la taille de la pile, des arguments, la priorité ...

Structure

Tout d'abord voici à quoi ressemble la structure DiskObject (voir include:workbench/workbench.h">) :

	
struct DiskObject
{
	UWORD			do_Magic;
	UWORD			do_Version;
	struct Gadget		do_Gadget;
	UBYTE			do_Type;
	char			*do_DefaultTool;
	char			**do_ToolTypes;
	LONG			do_CurrentX;
	LONG			do_CurrentY;
	struct DrawerData	*do_DrawerData;
	char			*do_ToolWindow;
	LONG			do_StackSize;
};
  • do_Magic : Numéro qui permet à la library de savoir à coups sur que c'est une icone. Cette valeur est WB_DISKMAGIC.
  • do_Version : Permet de savoir et garder garder la compatibilité de l'icone.
  • do_Gadget : Structure Gadget qui contient les images de l'icone.
  • do_Type : Type de l'icone :
    • WBDISK : Icon d'un disque
    • WBDRAWER : Icone d'un répertoire
    • WBTOOL : Icone d'un éxecutable
    • WBPROJECT : Icone d'un fichier de données
    • WBGARBAGE : Icone d'une poubelle
    • WBKICK : Icone d'un disque de boot
    • WBAPPICON : Icone d'un AppIcone (voir plus loin)
  • do_DefaultTool : Utilisable seulement sur le icones de type projet et disque. Chemin indiquant l'action par défaut à effectuer lorsque l'on double clic sur l'icone pour un projet. Pour un disque l'action par défaut est "Sys:System/diskCopy".
  • do_ToolTypes : Permet de passer des chaines de caractere au programme. Ni l'icon.library, ni le WorkBench ne regarde ces chaines. Elles servent juste à passer des arguments au programme via l'icone .
  • do_CurrentX, do_CurrentY : Position de l'icone dans la fenêtre. En cas ou l'icone n'a pas de position pré-définie elle a comme valeur NO_ICON_POSITION.
  • do_DrawerData : Si l'icone est du type WBDISK, WBDRAWER ou WBGARBAGE alors ce champ est valide. Il indique au WorkBench comment ouvrir le répertoire et aussi sauvegarder vos préférences. Cette structure à la forme suivante :
	
struct DrawerData
{
	struct	NewWindow	dd_NewWindow; // voir l'include intuition/intuition.h
	LONG			dd_CurrentX;  // Position X
	LONG			dd_CurrentY;  // Position Y
};
  • do_ToolWindow : Ne pas utiliser, pour un usage futur.
  • do_StackSize : Taille de la pile du programme en bytes. Si cette valeur est absente une pile de 4Ko sera attribuée au programme.


Les gadgets

Afin de garder l'image de l'icone, le WorkBench utilise une structure Gadget (voir ). Etant donné que tous les champs de cette structure ne sont pas utilisé, ils sont laissé à 0 et ne doivent pas être modifiés. Voici la liste des champs utilisés :

  • Width : Largeur de la zone réactive de l'icone
  • Height : Hauteur de la zone réactive de l'icone
  • Flags : Doit absolument être du type GADIMAGE. Trois méthodes de surbrillance existent :
    • GADHCOMP : Complète l'image de l'icone
    • GADHIMAGE : Utilise une auter image
    • GADGBACKFILL : Similaire à GADHCOMP mais évite "l'anneau" autour de l'image
  • Activation : Soit RELVERIFY ou GADGIMMEDIAT.
  • Type : Doit être BOOLGADGET
  • GadgetRender : Pointeur vers l'image complémentaire.


Les tooltypes

Nous avons dis que l'on pouvait utiliser l'icone afin de passer des arguments à notre programme. Cela se fait par l'intermédiaire du champ do_ToolTypes. Pour modifier ce champ, vous devez sélectionner l'icone et dans le menu du WorkBench faire "Information". Vous obtiendrez la liste des ToolTypes. Du point de vue programmation, les ToolTypes sont une série de pointeur vers des chaines de 128 caractères au maximum. De plus vous ne devez utiliser que des caractères imprimables (fortement conseillé) et la casse est sensible, ainsi "Toto" est différent de "TOTO".

Le format standard des ToolType est =[|...]. Bien évidement, des valeurs reservées existent :

  • DONOTWAIT=n : Le Workbench n'attends pas un message de retour de la part de la tache
  • STARTPRI=n : Défini l'ordre de lancement dans le répertoire WBStartup
  • TOOLPRI=n : Défini la priorité de la tache sous exec

Afin de lire les Tooltypes, le système fournit FindToolType() qui permet de récupérer la valeur d'un ToolType et MatchToolValue() permet de savoir si un ToolType a une certaine valeur.

Exemple d'utilisation des tooltypes Cette procédure va lire tous les toolstypes d'une icone. Comme argument, elle prend le message que le WorkBench vous envoit au démarrage.

	
void showToolTypes(struct WBArg *wbarg)
{
	struct	DiskObject *dobj;
	char	**toolarray;
	char	*s;
	BOOL	success = FALSE;
    printf("Lock=0x%lx, Nom=%s\n", wbarg->wa_Lock, wbarg->wa_Name);

	if((*wbarg->wa_Name) && (dobj=GetDiskObject(wbarg->wa_Name)))
	{
		printf("We have read the DiskObject (icon) for this arg\n");
		toolarray = (char **)dobj->do_ToolTypes;

		if(s=(char *)FindToolType(toolarray,"FILETYPE"))
		{
			fprintf(conwin,"    Found tooltype FILETYPE with value %s\n",s);
		}
		if(s=(char *)FindToolType(toolarray,"FLAGS"))
		{
			fprintf(conwin,"    Found tooltype FLAGS with value %s\n",s);
			if(MatchToolValue(s,"BOLD"))
				fprintf(conwin,"      BOLD flag requested\n");
			if(MatchToolValue(s,"ITALICS"))
				fprintf(conwin,"      ITALICS flag requested\n");
			}
		/* Free the diskobject we got */
		FreeDiskObject(dobj);
		success = TRUE;
	}
	else if(!(*wbarg->wa_Name)){
		fprintf(conwin,"  Must be a disk or drawer icon\n");
	}
	else
	{
		fprintf(conwin,"  Can't find any DiskObject (icon) for this WBArg\n");
	}
}