!TopTen
Un accès rapide aux documents récemment ouverts
La version actuelle est v0.6.9 du 4 Juin 2003, rapports d'anomalie et commentaires sont les bienvenus.
Auteur: Benoît GILON
Fichiers archive ZIP à charger
Présentation
!TopTen est une application simple que j'ai écris après l'étude du module !SmartDir de Tony Houghton décrit dans le numéro de Caugers (Vol. 5 N° 2 - Janvier 1998). Je voulais aussi écrire une application exemple qui pourrait être de quelque utilité pout tout utilisateur de plate-forme RISC OS; Ainsi est né !TopTen.
!TopTen, contrairement de l'application !TinyDir d'Acorn ou du système "PinBoard" de RiscOS 3.1, trouve son "frère jumeau" dans l'entrée de menu "Documents" du menu "Démarrer" du shell Windows 95/NT 4.0 et par conséquent se comporte comme une pile FIFO (premier entré, premier sorti) de références de documents.
- !TopTen offre une boite de dialogue afin que l'utilisateur y fixe ses préférences; il peut alors sauvegarder ces dernières sur le vif ou en sortie de l'application.
- Au démarrage, !TopTen lit un fichier qui contient les références de documents déjà consultés et sauve les entrées de la pile FIFO dans ce fichier lors de la terminaison de l'application.
- !TopTen est constitué de deux composants:
- Un module nommé TopTenSupport qui installe un filtre post-WimpPoll intéresé par les évènements du type UserMessage, UserMessageRecorded et UserMessageAcknowledge et pour les messages Data_Open, Data_Load et Data_LoadAck, aussitôt que le module a rassemblé suffisamment de données, il stoque une valeur non nulle dans un mot mémoire qu'une application a auparavant déclaré comme son PollWord.
- Une tâche WIMP (!TopTen) qui collecte toutes les informations et mes à jour ses structures de données interne (dont le menu de l'historique des documents).
- À tout moment, l'utilisateur peut fixer le nombre maximum d'entrées dans la pile FIFO de références; il peut aussi faire en sorte que le programme ne tienne pas compte des informations relatives à certain types d'objets (applications et répertoires) de sorte que la pile ne se remplisse pas trop vite.
- À tout moment, l'utilisateur peut limiter l'affichage des références dans le menu historique à la queue des dénominations de fichiers.
- L'utilisateur peut aussi lancer son application en utilisant l'application enregsitrée pour le traiter au sein de !TopTen plutot que l'application par défaut enregistrée pour ce type de fichier. Détail intéressant, !TopTen a la faculté de booter préalablement cette application où qu'elle se trouve sur votre disque. Cette fonctionnalité est encore en cours de développement et donc indisponible pour le public.
- Grâce à l'apparition d'une nouvelle entrée de menu dans le menu attaché à l'icône, l'utilisateur peut geler l'évolution du menu historique des documents et donc rendre !TopTen imperméable à toute ouverture de document sur le bureau.
- !TopTen est une application s'appuyant sur la toolbox d'Acorn. A ce titre, elle bénéficie de tous les enrichissements associés dont des messages explicites pour le système d'aide contextuelle Acorn.
Implémentation
Reconnaissance du module et détermination de l'addresse du PollWord
Lors du démarrage de l'application, cette dernière a besoin de connaitre l'adresse du "PollWord" du module, ce dernier se trouvant proche du sommet de la zone privée de l'instance du module.
Fichier Include, faisant partie du composant "tâche WIMP" de !TopTen
typedef struct
{
const char mark[8];
int pollword;
int my_ref;
int your_ref;
int my_tsk;
int your_tsk;
enum {
IDLE= 0,
WAITING,
RAISED
} state;
int file_type;
char *path_name;
size_t mlen1;
} tvpoll;
#ifdef MODMAN
#define EXT
#else
#define EXT extern
#endif
EXT _kernel_oserror *mod_init(void);
EXT tvpoll *pvpoll; /* Address of structure in the Module instance's private area */
EXT int *ppollword; /* Address of pollword */
#undef EXT
Fichier C chargé de la communication avec le module ToptenSupport
#define MODMAN
#include "ui.h"
static const char modname[] = "TopTenSupport";
static const char mark[] = "Gotcha";
...
_kernel_oserror *mod_init(void)
{
_kernel_swi_regs r;
_kernel_oserror *p;
char *pmem;
size_t imot;
r.r[0]= 18;
r.r[1]= (int) modname;
p= _kernel_swi(OS_Module, &r, &r);
if(!p) {
atexit(mod_finalize);
pmem= (char *) r.r[4];
/* Don't go further than 512 words from the top of the area */
for(imot= 0; imot < 512; imot++, pmem+= 4)
if(!memcmp(pmem, mark, sizeof(mark) - 1)) break;
/* return "Unable to find module's mark" error if required */
if(imot == 512) return (_kernel_oserror *) &monerr0;
pvpoll= (tvpoll *) (pmem - offsetof(tvpoll, mark));
ppollword= &(pvpoll->pollword);
}
return p;
}
Quelque part dans le code du module ToptenSupport
static struct
{
const char mark[8];
int pollword;
int my_ref;
int your_ref;
int my_tsk;
int your_tsk;
enum {
IDLE= 0,
WAITING,
RAISED
} state;
int file_type;
char *path_name;
size_t mlen1;
} vpoll =
{
"Gotcha", 0, 0, 0, 0, 0, IDLE,
0, NULL, 0
};
Création dynamique d'entrée de menu à partir d'un canevas en mémoire
Cette fonction est appelée dès que une entrée dans le menu "historique" est à créer.
static void new_fname(const char *const path_name, const int file_type, const int tskapp)
{
static MenuTemplateEntry mte =
{
0,
-1, /* ComponentId */
NULL, 0,
NULL, NULL,
0, 0,
NULL, 0
};
char buffer[256];
_kernel_oserror *p;
/* Allocate a new structure for storing the new document reference's properties */
tfname *pfn= (tfname *) malloc(sizeof(tfname));
char *ppath;
if(!pfn) return;
pfn->ppathname= ppath= malloc(strlen(path_name) + 1);
if(!ppath) {
free(pfn);
return;
}
/* The function below is useless for now but will serve in a next release of !TopTen */
ppath= get_leaf(strcpy(ppath, path_name));
pfn->ftype= file_type;
pfn->appname= NULL;
mte.text= ppath;
mte.max_text= strlen(path_name) + 1;
if(pformhstring)
{
/* Setup automatic reply to Help_Request messages */
sprintf(buffer, pformhstring, path_name, file_type);
mte.max_entry_help= strlen(buffer) + 1;
mte.help_message= buffer;
}
p= menu_add_entry(0, fmenuoid, Menu_AddEntryAtEnd, (char *) &mte, &(pfn->cid));
if(p) {
free(pfn->ppathname);
free(pfn);
return;
}
AddTail((struct List *) &fnamelist, (struct Node *) &pfn->mnode);
/* If first time this function is called, then grey out the Open entry (originally greyed) */
if(!nitems++) (void) menu_set_fade(0, ibarmenuoid, KOPENENTRY, 0);
}
Autres points d'intérêt potentiels
- Le module leaf en charge de retourner la queue d'une dénomination complète de fichier selon le choix "Directory Level" (ajusté par l'utilisateur dans la fenêtre "Choices").
- Nouveauté de la v0.6.5: !TopTen implémente un mécanisme d'internationalisation d'applications qui fonctionne avec toutes les versions de la toolbox connues à ce jour. Malheureusement, la dernière version de la toolbox prend en compte le Territory et non plus le country comme dans les versions précédentes: il a donc fallu effectuer une petite gymnastique pour arriver à mes fins. Le module à étudier s'appelle SetRes et se trouve dans le répertoire Support de TopTen. Un des paramètres passés à la fonction toolbox_initialize est "<TopTenR$Dir>" et non plus "<TopTen$Dir>". C'est le rôle du module SetRes de positionner cette variable d'environnemnt.
à suivre
Quelques problèmes survenus lors du développement de !TopTen
J'ai découvert que certaines applications sous WIMP n'adoptaient pas un comportement tout à fait conforme au protocole standard Acorn, lorsque ces dernières reçoivent un message UserMessageRecorded avec un code action DataLoad ou Data_Open provenant d'une tâche comme le Filer, elles ne répondaient pas à ce dernier avec un message dont l'action est DataLoadAck mais se contentaient de renvoyer un message UsermessageAcknowledge au WIMP de sorte que le message original ne soit pas retourné tel quel à la tache Filer.
Voici quelles sont les applications en cause:
à suivre
Points d'amélioration (prévus pour la v0.7.5)
- Tenir enfin compte des documents résidant sur un support amovible;
- Offrir une base de référence d'applications pour lesquelles nous n'avons pas de relation directe entre le nom de la tâche Wimp (App) et la variable d'environnement App$Dir donnant le répertoire racine de l'application;
- Possibilité pour l'utilisateur de choisir son mode d'activation du document (alternativement, il peut cliquer sur Adjust au lieu de Select).
à suivre