Un widget de type Toggle est un bouton (ou une entrée de menu) qui possède deux valeurs: On ou Off. Il peut avoir la forme d'un carré (square) ou d'un diamant (diamond).
Les Toggle widgets possèdent, comme les boutons poussoirs, un label qui peut être de type texte ou bien de type pixmap (un dessin).
On peut grouper plusieurs Toggle widgets pour contrôler leur comportement les uns par rapport aux autres. Motif fournit deux types de Toggle widgets qui réagissent différemment lorsqu'ils sont regroupés :
On crée les Toggle widgets de manière standard : à l'aide des fonctions XmCreateToggleButton() ou encore XtVaCreateManagedWidget() avec comme classe de widget xmToggleButtonWidgetClass... etc...
La fonction de Callbacks d'un widget de type Toggle est standard :
On peut regrouper "à la main" des RadioBox ou des CheckBox widgets dans une RowCOlumn ou une Form, comme dans le programme d'exemple toggle.c.
Motif propose cependant des fonctions de convénience effectuant ce travail : XmCreateSimpleRadioBox() et XmCreateSimpleCheckBox(). Il en existe d'autres...
Ces fonctions permettent de créer plusieurs Toggle widgets d'un seul coup. Il sont automatiquement rassemblés dans une RowColumn, et la plupars de leurs ressources, comme XmNindicatorType, sont positionnées par la fonction de convénience.
Ces fonctions sont trés pratiques mais ne permettent pas de tout faire.
Ressources les plus importantes :
Le Pixmap est un type X standard. Pour charger un pixmap on utilisera la fonction XmGetPixmap(). Callbacks des Toggle widgets
On précise la fonction de callback en positionnant la ressource XmNvalueChangedCallback.
Le champ set de la structure XmToggleCallbackStruct permet de savoir si le widget est séléctionné ou non. Avec l'exemple ci-dessus, si cbk->set vaut True alors le widget w est séléctionné.
toggle_cbk(Widget w, XtPointerData data, XmToggleCallbackStruct *cbk)
Petit programme d'exemple : toggle.c
#include <Xm/Xm.h>
#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>
/*--------------------------*/
main(int argc, char **argv)
/*--------------------------*/
{
Widget toplevel, rowcol, toggle1, toggle2;
XtAppContext app;
void toggle1_cbk(), toggle2_cbk();
toplevel = XtVaAppInitialize(&app, "Toggle", NULL, 0,
&argc, argv, NULL, NULL);
rowcol = XtVaCreateWidget("rowcol",
xmRowColumnWidgetClass, toplevel,
XmNwidth, 300,
XmNheight, 200,
NULL);
toggle1 = XtVaCreateManagedWidget("Dolby ON/OFF",
xmToggleButtonWidgetClass, rowcol, NULL);
XtAddCallback(toggle1, XmNvalueChangedCallback,
toggle1_cbk, NULL);
toggle2 = XtVaCreateManagedWidget("Dolby B/C",
xmToggleButtonWidgetClass, rowcol, NULL);
XtAddCallback(toggle2, XmNvalueChangedCallback,
toggle2_cbk, NULL);
XtManageChild(rowcol);
XtRealizeWidget(toplevel);
XtAppMainLoop(app);
}
/*-------------------------------------------------------*/
void toggle1_cbk(Widget widget, XtPointer client_data,
XmToggleButtonCallbackStruct *state)
/*-------------------------------------------------------*/
{
printf("%s: %s\n", XtName(widget),
state->set? "on" : "off");
}
/*-------------------------------------------------------*/
void toggle2_cbk(Widget widget, XtPointer client_data,
XmToggleButtonCallbackStruct *state)
/*-------------------------------------------------------*/
{
printf("%s: %s\n", XtName(widget), state->set? "B" : "C");
}
Grouper des Toggle widgets automatiquement
michel.buffa@essi.fr