Obligement - L'Amiga au maximum

Dimanche 23 juillet 2017 - 22:34  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : Assembleur - les écrans publics
(Article écrit par Frédéric Delacroix et extrait d'Amiga News - décembre 1994)


Suite et fin de notre saga sur les écrans publics avec ce mois-ci, après avoir vu la gestion de ces écrans par leur possesseur, le point de vue d'une application désirant ouvrir une fenêtre sur un écran public.

Rappels

Un écran public est un écran Intuition ouvert par une application et mis à la disposition des autres programmes par l'attribution d'un nom. Ceux-ci peuvent alors ouvrir une fenêtre sur un écran public désigné par son nom (comme "Workbench", "DEVPAC.1" ou "AmigaNews" pour l'exemple du mois dernier, ou sur l'écran public par défaut, celui du Workbench en général).

Ouverture d'une fenêtre

Comme pour les fenêtres à l'ancienne mode, on peut ouvrir une fenétre sur un écran public grâce à la fonction "OpenWindow()" d'intuition.library. Il est toutefois conseillé d'utiliser "OpenWindowTagList()", qui prend en paramètre, en plus d'un pointeur sur une structure NewWindow optionnelle en A0, un pointeur sur une liste de tags en A1. Il y a deux façons d'ouvrir une fenêtre sur un écran public. Dans tous les cas, le champ "nw_Type" de la structure NewWindow, si elle existe, devra être PUBLICSCREEN et non pas CUSTOMSCREEN.

La première consiste à fournir le nom de l'écran public visé lors de l'ouverture de la fenêtre grâce au tag "WA_PubScreenName". Dans ce cas, le champ "ti_Data" de ce tag doit être un pointeur sur ce nom (qui doit rester valide le temps d'OpenWindow(), il ne faut donc pas utiliser le nom qu'on trouve dans les PubScreenNodes, mais une copie). Si cet écran public n'existe pas ou est en mode privé, l'écran public par défaut sera utilisé si et seulement si l'attribut "WA_PubScreenFallBack" (attribut booléen, qui peut être ajusté grâce au tag du même nom), est VRAI. Dans le cas contraire, l'ouverture de la fenêtre échoue. D'ailleurs, on peut demander l'écran public par défaut en mettant à 0 la valeur du tag "WA_PubScreenName".

La seconde méthode consiste à demander à Intuition un pointeur sur l'écran public et à fournir ce pointeur lors de l'ouverture de la fenêtre. On obtient un pointeur sur l'écran désiré, ainsi qu'une promesse que l'écran ne sera pas fermé inopinément, grâce à la fonction "LockPubScreen()". Celle-ci prend en A0 un pointeur sur le nom de l'écran désiré, ou 0 si c'est l'écran par défaut. En retour, elle renvoie en D0 un pointeur sur la structure "Screen" de l'écran demandé, ou 0 s'il n'existe pas.

Cette fonction est utilisée implicitement par la première méthode. Ce pointeur est ensuite utilisé pour indiquer à Intuition l'écran sur lequel la fenêtre doit être ouverte, par le biais du tag "WA_PubScreen". On peut aussi mettre ce pointeur dans le champ "nw_Screen" de la structure NewWindow éventuelle, mais il ne faut surtout pas oublier de mettre le champ "nw_Type" à PUBLICSCREEN et non CUSTOMSCREEN.

Une fois que la fenêtre est ouverte, on doit utiliser la fonction "UnlockPubScreen()", la présence d'un visiteur étant équivalente à un verrouillage par "LockPubScreen()". La fonction "UnlockPubScreen()" prend en A0 un pointeur sur le nom de l'écran concerné en A0 et un pointeur sur sa structure Screen en A1. Le traitement de ces arguments est un peu spécial : si le pointeur sur le nom est nul, alors le pointeur sur la structure Screen est utilisé (c'est la meilleure méthode) : dans le cas contraire, l'argument Screen est ignoré.

C'est souvent la seconde méthode qui est utilisée car elle permet, entre "LockPubScreen()" et "OpenWindow()", d'examiner les champs de la structure Screen et de sa structure DrawInfo associée, de façon à pouvoir adapter l'aspect de la fenêtre, des gadgets et des images à la résolution, largeur, hauteur, couleurs de l'écran public, avant l'ouverture proprement dite de la fenêtre.

Question de style

En dehors des programmes faisait partie d'une grosse application, je pense par exemple Devpac 3 qui ouvre la fenêtre d'assemblage sur l'écran de l'éditeur, il est bien sûr préférable de laisser l'utilisateur choisir sur quel écran une fenêtre doit s'ouvrir. Ceci se fait, par exemple grâce aux types d'outils (exploitables par l'icon.library, voir cet article), aux arguments CLI (disponibles par la fonction "ReadArgs()"), un programme de préférences gérant un fichier de configuration, voire, pour les plus perfectionnés, une requête d'écrans publics (fonctions [Un]LockPubScreenList(), voir cet article).

Une autre possibilité non négligeable est offerte par la fonction "NextPubScreen()" d'Intuition. Elle permet, étant donné un pointeur sur la structure Screen en A0 et un tampon mémoire en A1 de recopier le nom de l'écran public suivant dans ce tampon mémoire. En retour, D0 pointe sur le tampon, ou est nul si aucun écran public n'est disponible (cas hautement improbable). Le tampon mémoire doit avoir au moins MAXPUBNAME+1, c'est-à-dire 140 caractères.

Ceci permet, par exemple, d'ajouter un gadget qui permet à une fenêtre de "sauter" d'écran en écran. Attention cependant, cette fonction peut renvoyer des noms d'écrans qui sont en mode privé : il faut donc toujours tester le résultat de "LockPubScreen()". De plus, l'ordre des écrans publics n'a aucune importance, du moins pour l'instant. Cette remarque nous complique un peu la vie pour la suite.

Souvent on voudrait pouvoir ouvrir une fenêtre sur l'écran le plus en avant, ce qui est par exemple utile lursqu'on veut appeler une calculatrice sur l'écran d'une application dont on ne connaît pas le nom. Pour ce problème, les fenêtres CON: autorisent la valeur "*" pour l'option "SCREEN", et ToolManager utilise l'écran de la fenêtre active s'il est public (méthode non parfaite), pour ses docks. C'est la méthode utilisée par le programme "GetPubName" fourni avec ce même ToolManager que je vais décrire maintenant. Le fait d'inclure cet algoritme dans vos applications permet non seulement de vous affranchir de ce programme mais aussi d'utiliser cette possibilité à partir du Workbench (grâce aux types d'outils).

La fonction réalisant ceci est celle qui est nommée "LockScreen()" dans le listing suivant. Elle prend en argument un pointeur (en A0) sur le nom de l'écran public désiré (tout comme "LockScreen()). Si ce nom est différent de "*.LockPubScreen()" est appelé normalement. Dans le cas contraire, la fonction va essayer de verrouiller l'écran le plus en avant s'il est public, ou l'écran public par défaut dans le cas contraire (pas question d'ouvrir des fenêtres sur les écrans non publics, n'est-ce pas ?). Pour trouver cet écran, on examine le champ "ib_FrontScreen" de la structure "IntuitionBase" (ne pas oublier d'encadrer par "LockIBase()/UnLockIBase()), et on traverse la liste des écrans publics (en mode "LockPubScreenList()" bien sûr) à la recherche de cet écran. S'il est trouvé, on le verrouille grâce à "LockPubScreen()", dans le cas contraire, on verrouille l'écran par défaut, qu'on amène en avant (simple coquetterie). Un écran verrouillé par notre "LockScreen()" est libéré de façon tout à fait normale grâce à "UnlockPubScreen()".

Exemple

J'ai inclus la routine "PubScreen()" dans l'exemple suivant, qui se contente d'ouvrir une fenêtre sur l'écran frontal et d'attendre la fermeture. Pour voir clairement l'effet de la routine, assignez ce programme à une touche sous ToolManager et amenez un écran public en avant. Comme il me restait un peu de place, j'y ai aussi inclus une routine qui remplit la fenêtre avec un motif (grâce au tag "WA_BackFill()"), son défaut étant de ne pas utiliser les couleurs SHINEPEN/BACKGROUNDPEN de la structUre DrawInfo, mais toujours les couleurs 2 et 0 : vous remédierez facilement.

Listing (ouverture d'une fenêtre sur l'écran frontal)

Assembleur
Assembleur
Assembleur
Assembleur

Le mois prochain, nous attaquons une série sur l'écriture de bibliothèques partagées, devises et handlers, tâche instructive mais ô combien délicate...


[Retour en haut] / [Retour aux articles]