Les chaînes de caractères sous MOTIF


Table des matières :


Introduction :


Motif reconnaît deux types de chaînes de caractères :

  1. les chaines de type char *, les chaînes de caractères que nous connaissons déjà (au sens de la programmation en langage C).
  2. les chaînes de type XmString. Le programmeur n'a pas besoin de connaître les détails concernant ce type d'objet. Après avoir vu la complexité de l'affichage de texte à l`aide des fonctions de la Xlib, vous vous doutez bien que MOTIF doit stocker dans le type String des informations telles que la taille en pixels de la chaîne en fonction de la police de caractères utilisée, le jambage, la baseline, etc...

MOTIF fournit de nombreuses fonctions de manipulation de chaînes de type XmString (concatenation, recopie, etc...) et de conversion entre les char * et les XmString.

En voici quelques unes :

pour plus d'informations, voir le man de ces différentes fonctions. Leur utilisation est relativement simple.


Spécifier une police de caractères


Dans une application MOTIF, une police de caractères est une variable de type XmFontList, créée à partir d'un objet Xlib de type XFontStruct, déjà étudié dans la partie du cours Xlib consacrée à l'affichage de texte. Typiquement, voici les étapes nécessaires pour modifier la police de caractères utilisée par un widget :

  1. Charger une police de caractères à l'aide de fonctions Xlib. La fonction load_font() (cf le cours Xlib pour des explications détaillées) fait parfaitement l'affaire :

    
    
    /*-----------------------------*/
    load_font(font_info, font_name)
    /*-----------------------------*/
    XFontStruct **font_info;
    char *font_name;
    {
        /* on accede a la fonte */
        if((*font_info = XLoadQueryFont(display, font_name)) 
             == NULL) {
           (void) fprintf(stderr,
                  "Police de caractéres %s non trouvée \n",
                  font_name);
           exit (-1);
        }
    }
    
    
    
  2. Créer un objet de type XmStringCharSet. En général on lui donne la valeur XmSTRING_DEFAULT_CHARSET. Cet objet, une fois initialisé, va contenir toutes les informations concernant une police de caractères : taille des caractères, jambage, etc... il sera utilisé par les fonctions de création de XmString telles que XmStringCreateLtoR().

  3. Appeler la fonction XmFontListCreate(XFontStruct *fnt, XmStringCharSet charset), qui effectue deux actions :


Exemple d'utilisation


Ce petit exemple montre comment on peut changer la fonte de caractères d'un PushButton figurant dans une barre de menu.

Etudier en particulier le rôle de chacun des deux objets charset et menu_bar_font.



   XFontStruct *fnt;
   XmFontList menu_bar_font;  /* font pour les boutons du menu */
   XmStringCharSet charset = 
           (XmStringCharSet) XmSTRING_DEFAULT_CHARSET;	
   .
   .
   .
   /* C'EST ICI QUE C'EST INTERESSANT !!! */
   load_font(&fnt,"vr-20");
   menu_bar_font = XmFontListCreate(fnt, charset);

   menu_bar = XmCreateMenuBar (parent, "menu_bar", NULL, 0); 
   XtManageChild (menu_bar);

   menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", NULL, 0);

   /* ET ICI  AUSSI !!! */
   label_string = XmStringCreateLtoR("Exit" , charset);

   n = 0;
   XtSetArg (args[n], XmNlabelString, label_string);  n++;    
   XtSetArg (args[n], XmNalignment,XmALIGNMENT_CENTER);  n++;    
   XtSetArg (args[n], XmNfontList, menu_bar_font);  n++;    
   button = XmCreatePushButton (menu_pane, "Quit", args, n);
   XtManageChild (button);



michel.buffa@essi.fr