Obligement - L'Amiga au maximum

Samedi 31 mai 2025 - 16:56  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


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 marqueurs 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 marqueur "WA_PubScreenName". Dans ce cas, le champ "ti_Data" de ce marqueur 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 marqueur 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 marqueur "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 marqueurs "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 marqueur "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, périphériques logiques et gestionnaires, tâche instructive mais ô combien délicate...


[Retour en haut] / [Retour aux articles]