La méthode proposée ici permet de faire en sorte que les
couleurs des widgets de l'interface Motif ne soient pas affectés
par
le fait que l'on utilise une colormap privée. Même si
on a spécifié des couleurs dans le fichier de ressources,
ces couleurs
seront bien utilisées par Motif.
*.background: #e0e0e0 *.foreground: #383830 *selectColor: #00ffd0 *topShadowColor: #f0f0f0 *bottomShadowColor: #a0a0a0 *highlightThickness: 1... Xt regarde dans la colormap existante, c'est-à-dire la colormap standard, dans quelles cases se trouvent les couleurs les plus proches. Si par la suite on remplace la colormap standard par une autre à nous (une colormap privée, les couleurs ne correspondront plus et lorsque l'application récupèrera le focus de la souris, il y a fort à parier pour que les couleurs de l'interface prennent une couleur horrible.
La solution va donc consister à "faire à la main" ce
que fait la fonction XtVaAppInitialize(...), sauf la lecture du fichier
de ressources.
La lecture du fichier de ressources se fait à l'aide de la fonction XtGetApplicationResources(...). Cette fonction permet de lire le fichier de ressources, mais aussi de spécifier des ressources propres à notre application.
Exemple de ressources propres que l'on peut spécifier dans le fichier de ressources :
! Ressources propres a l'application
*.TextureDir: ./textures *.resourceFileLoaded: TrueCet exemple indique que l'on spécifie dans le fichier de ressources un répertoire où on va lire des textures (des images). Le type de la valeur attendue est une chaîne de caractères. On attend aussi une ressource de nom "resourceFileLoaded" de type booléen. Cette dernière ressource est utile, nous allons le voir, pour pouvoir tester si le fichier de ressources a bien été lu par l'application.
/* Contexte general */ XtAppContext app_context; Display *dpy = NULL; int screen; Window root; Visual *visual; GC gc;
Colormap cmap; XGCValues gcv;
/ * Pour les ressources propres à l'application */
typedef struct _my_application_instance_variables{
Bool resourceLoaded;
} _my_app_inst_rec;
static XtResource my_app_resources[] =
{
{
"resourceFileLoaded", /* Noms attendus dans le fichier de ressources */
"ResourceFileLoaded",
XtRBool, sizeof (Bool), /* type de la ressource */
XtOffsetOf(_my_app_inst_rec, resourceLoaded), /* variable qui va recevoir
le résultat */
XtRString, "False" /* valeur par défaut si la ressource
n'est pas présente */
}
};
/* Structure où vont être stockées les valeurs des ressources propres */ _my_app_inst_rec ir;
/*... dans le programme principal ... */
...
/*----------------------------------------------*/
/* 1) Ouverture du toolkit, en plusieurs etapes */
/*----------------------------------------------*/
XtToolkitInitialize();
app_context = XtCreateApplicationContext();
dpy = XtOpenDisplay(app_context, NULL, NULL, "AffImage", NULL, 0,
&argc, argv);
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
visual = DefaultVisual(dpy, screen);
if (!dpy) {
fprintf(stderr, "%s: Unable to open display\n", argv[0]);
exit(0);
}
/*------------------------------------------------------------------------*/
/* 2) Creation du top_level, le fichier de resources s'appelle "AffImage" */
*------------------------------------------------------------------------*/
top_wid = XtAppCreateShell(NULL, "AffImage", applicationShellWidgetClass,
dpy, NULL, 0);
/*---------------------------------------*/ /* 3) Installation d'une colormap privée */ /*---------------------------------------*/
/* - a) Création de la colormap, en mode AllocNone car on ne va pas utiliser toutes les colorcells, on va en laisser quelques unes pour Motif, pour être sûrs que les couleurs des widgets existent */ cmap = XCreateColormap(dpy, root, visual, AllocNone);
/* - b) Remplissage de la colormap avec nos couleurs (on laisse une vingtaine de couleurs pour Motif) */ Lut_VisuColor(dpy, cmap);
/* - c) On associe cette colormap à la fenêtre top-level. */ XtVaSetValues(top_wid, XmNcolormap, cmap, XtNvisual, visual,NULL);
/*-------------------------------------*/ /* 4) Lecture du fichier de ressources */ /*-------------------------------------*/ XtGetApplicationResources(top_wid, &ir, my_app_resources, XtNumber(my_app_resources), NULL, 0);
/*---------------------------------------------------------------------*/ /* 5) Vérification de la bonne lecture du fichier. Si la ressource "resourceFileLoaded ne vaut pas True, le fichier n'a pas été lu */ /*---------------------------------------------------------------------*/
if (!ir.resourceLoaded) {
fprintf(stderr,
"%s: Fichier de ressources de nom AffImage non trouve.\n",
argv[0]);
fprintf(stderr, "Assurez-vous que XFILESEARCHPATH ou XAPPLRESDIR est b
ien positionnee,\n");
fprintf(stderr, "et que le fichier AffImage se trouve dans le chemin d
e recherche,\n ou bien utilisez xrdb pour ajouter le contenu du fichier AffImage
au serveur X.\n");
/* exit(0); */
}
}

Nous nous inspirons ici de ce que font les programmes Netscape ou Xv,
mais le traitement demeure cependant original. Voici la colormap que nous
allons utiliser :