!HPExplore
par Benoît GILON
Ce programme permet de configurer certains aspects de votre imprimante
HP LaserJet qui ne sont pas pris en compte par les drivers Acorn.
Les aspects "remarquables" de ce programme sont:
- Internationalisation de l'application avec sélection
en dynamique des fichiers Resources;
- Implémentation du style tel que défini dans
le RISC OS Style Guide, et notamment d'un bouton popup menu.
- Utilisation d'un programme affichant l'aide dans la langue
de l'utilisateur (voir section précédente de ce
numéro).
Utilisation
Pour lancer l'application, double-cliquez sur l'icône !HPExplore:
L'icône apparaît alors au sein des applications installées.
Double-cliquez sur celle-ci pour faire apparaître la fenêtre
ci-dessous. La boite de dialogue principale (et l'unique fenêtre)
a l'apparence ci-contre (sur un RISC PC ce qui explique la fonte
antialiasée).
- Les icônes de la boîte de dialogue sont munies
d'aides contextuelles: n'hésitez donc pas à lancer
l'application Acorn !Help.
- Pour le groupe "Ret", il est possible, en appuyant
sur Adjust au dessus du bouton actif, de le désactiver
sans en activer un autre.
- Pour la densité, l'appui sur Adjust au dessus des flèches
a l'effet inverse de l'appui sur Select.
- L'appui sur Adjust au dessus de l'une des deux icônes
action "Abandon" et "Envoi" conserve l'affichage
de la boite de dialogue alors que l'appui sur Select la fait disparaître.
Dans sa version actuelle (v0.04), un certain nombre de fonctionnalités
n'ont pas été implémentées:
- Pas de configuration de la fonte interne par défaut,
même si l'interface est présente pour cela (manque
de documentation sur la syntaxe HP PJL);
- Pas de programmation pour un fonctionnement bidirectionnel
du port (interface imprimante bitronics et machines Acorn A5000,
A4 et RISC PC);
- Pas d'aide interactive sur les options du menu: ceci est une
fonctionnalité nouvelle RISC OS 3 et je ne l'ai pas encore
obtenu avec la RISC OS library fournie avec Desktop C.
Implémentation
Le source C complet des modules se trouve dans les pages en annexe
ainsi que sur la disquette d'accompagnement.
Initialisation
Notons dans le code quelques points à noter au sein de
la fonction principale d'initialisation (module hpexplore) example_init():
- Appel aux fonctions mtemplate_init() et mmsgs_init()
en lieu et place des fonctions classiques template_init()
et msgs_init(), ceci pour gérer la "localisation"
de l'application, les deux fonctions appelées étant
définies dans le module intern. Par la suite, presque toutes
les constantes chaîne de caractères sont remplacées
dans le source par un appel à la fonction msgs_lookup().
- Appel à une fonction menu_build() dans le
module font_menu permettant de créer l'arbre des menus
pour le choix de la fonte interne, cette structure comprend deux
niveaux: le nom de la fonte puis le style à appliquer (exemple
gras/italiques). Cette dernière retire les libellés
des menus à partir du fichier Messages par appel à
la fonction msgs_lookup().
- Création de la fenêtre principale et enregistrement
des handlers qui la concernent. Par appel à la fonction
ExploreCreateDbox() du même module. Après
création de la boite de dialogue, une fonction spéciale
du module fontmenu (HPExploreMenuMiscInit()) est appelée
afin de déterminer les offsets du bouton popup menu pour
choisir la fonte interne par rapport à l'origine du Work
Area de la boite de dialogue.
void HPExploreMenuMiscInit(dbox dialogue)
{
wimp_icon result;
wimpt_noerr(wimp_get_icon_info(dbox_syshandle(dialogue), FONT_MENU, &result));
xmenu= result.box.x1;
ymenu= result.box.y1;
dbox_fadefield(dialogue,DISGRAS);
dbox_fadefield(dialogue,DISITAL);
dbox_fadefield(dialogue,DISCONDENS);
}
Il sera ainsi possible d'afficher le menu juste en face de l'icône
FONT_MENU. Les trois icônes option en dessous du nom de
la fonte sélectionnée ne sont pas manipulables directement
par l'utilisateur, c'est pourquoi elles sont dès le départ
désactivées (N.D.A.: je n'ai pas trouvé le
moyen de le faire sous !FormEd).
- La fonction ExploreCreateDbox() enregistre deux gestionnaires
d'évènements: un pour gérer les évènements
de bas niveau (aide contextuelle) ou non gérés par
la RISC OS Lib et un autre pour gérer les actions retournées
par la RISC OS Lib (clicks sur Select au dessus icônes actives
principalement).
Gestionnaires d'évènements
Les gestionnaires d'évènemnts sous la RISC OS Lib
se répartissent en deux classes.
- Un gestionnaire traitant les évènements WIMP
bruts;
- Si les évènements n'ont pas été
traités par le gestionnaire précédent, alors
la RISC OS Lib appelle le gestionnaire d'évènements
de haut niveau défini par fenêtre active.
Gestionnaire de bas niveau
Intéressons nous d'abord au gestionnaire de bas niveau,
il est appelé lors de l'apparition d'un évènement
WIMP issu de l'appel à event_process() et qui
n'aurait pas été masqué par event_setmask().
Il doit retourner un booléen indiquant si l'évènement
a pu être traité au sein de la fonction ou non.
- La déclaration de notre fonction C et de ses paramètres
sont les suivants:
static BOOL HPExploreRawHandler(dbox dialogue, void *event, void *handle)
{
wimp_eventstr *e= (wimp_eventstr *) event;
- Dans notre cas de figure, il est utile de traiter la sélection
de la fonte à partir du pop-up menu accessible au sein
de la fenêtre. Ceci est assuré par la partie de code
suivante, wimp_EMENU est l'évènement de
sélection dans un menu.
switch(e->e)
{
case wimp_EMENU:
return(HPExploreMenuSelect(dialogue,&(e->data),handle));
...
- L'appui sur un bouton de souris alors que le curseur est au
dessus de l'icône doit être géré en
dehors de la RISC OS Lib. La fonction HPExploreMenuRawHandler
du module fontmenu gère l'apparition du popup menu.
case wimp_EBUT:
if(HPExploreMenuRawHandler(e, handle)) return(TRUE);
...
- Un problème survient lors de la gestion d'un groupe
de sélection en exclusivité, il est possible, en
appuyant sur Adjust au dessus de l'icône sélectée,
de désactiver tous les choix possibles. Il est alors important
de réactiver l'icône qui s'est ainsi trouvée
désactivée par erreur. Le code suivant réalise
ce travail.
if(e->data.but.m.bbits== wimp_BRIGHT)
{
wimp_i icon= e->data.but.m.i;
if(!dbox_getnumeric(dialogue,icon))
switch(icon)
{
case IA_OUI:
case IA_NON:
case IA_AUTO:
case PP_OUI:
case PP_NON:
case PP_AUTO:
dbox_setnumeric(dialogue,icon,TRUE);
return(TRUE);
}
}
- A partir de la version " Desktop C ", la RISC OS
Lib offre un moyen commode de gérer l'aide interactive
sur les icônes de fenêtre. L'appel à help_dboxrawevents()
et la mise en place de messages HICONn (où n est l'indice
de l'icône) au sein du fichier Messages de l'application
permet d'assurer cette fonctionnalité utile.
default:
/* Handles all interactive help requests:
* This is the simplest form of the process:
* returning constant messages (ie not
* depending upon the context) */
return(help_dboxrawevents(dialogue,event,"HICON"));
}
}
Gestionnaire de haut niveau
La fonction concernée, HPExploreHandler() traite
les actions de nature applicative.
- Un aspect important est le respect des règles établies
dans le RISC OS Style Guide notamment la gestion différenciée
lors de l'appui sur le bouton Adjust de la souris.
static void HPExploreHandler(dbox dialogue, void *handle)
{
/* Window remains open after processing */
BOOL filling= TRUE;
dbox_field idb= dbox_get(dialogue);
switch(idb)
{ ...
}
if(!filling)
{
/* Time to hide window and upd. status */
dbox_hide(dialogue);
ExploreDboxOpen= FALSE;
}
}
- Pour les icônes principales Envoi et Abandon, l'appel
à la fonction RISC OS Lib dbox_persist() permet
de savoir quel bouton de la souris a été actionné.
Si le bouton Adjust a été actionné, alors
l'affichage de la boite de dialogue persiste, sinon (bouton Select),
celle-ci disparaît après coup.
...
switch(idb)
{
case dbox_CLOSE:
/* Close window after processing */
filling= FALSE;
break;
case ICONCANCEL:
/* Clicking on an action button with the right mouse
* button will cause the window to remain visible */
filling= dbox_persist();
/* Speed's up process by hiding dialogue box before
* refreshing its contents (anyway it should be closed
* after the processing */
if(!filling) dbox_hide(dialogue);
refresh_dbox(dialogue,&vHPconfig);
break;
case ICONOK:
getconfig(dialogue);
/* Sends the config. to printer */
SendToPrinter(&vHPconfig);
/* Clicking on an action button with the right mouse
* button will cause the window to remain visible */
filling= dbox_persist();
break;
}
...
- L'action sur les flèches de réglage de la densité
obéit aux mêmes règles ce qui donne le code
suivant:
switch(idb)
{
...
case DENS_UP:
/* Clicking on the up arrow with the right mouse button
* will tend to decrease the density value */
if(dbox_persist())
decrement_density(dialogue);
else
increment_density(dialogue);
break;
case DENS_DWN:
/* Clicking on the down arrow with the right mouse button
* will tend to increase the density value */
if(dbox_persist())
increment_density(dialogue);
else
decrement_density(dialogue);
break;
}
...