!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:

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).

Dans sa version actuelle (v0.04), un certain nombre de fonctionnalités n'ont pas été implémentées:

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():

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).

Gestionnaires d'évènements

Les gestionnaires d'évènemnts sous la RISC OS Lib se répartissent en deux classes.

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.

static BOOL HPExploreRawHandler(dbox dialogue, void *event, void *handle) 
{ 
wimp_eventstr *e= (wimp_eventstr *) event;
switch(e->e)	
    {
    case wimp_EMENU:		
        return(HPExploreMenuSelect(dialogue,&(e->data),handle));	
    ...
    case wimp_EBUT:		
        if(HPExploreMenuRawHandler(e, handle)) return(TRUE);		
        ... 
        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);
                    }
            }
    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.

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; 
    } 
}
... 
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; 
    }
...
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;
} 
...