Motif also supports a dialog box for getting strings from the user. It is called a prompt dialog. It's use is almost identical to that of a message dialog (including OK, Cancel and Help buttons that are accessed the same way), but you have to jump through a hoop to get the string out once the dialog's OK callback is activated. Here's some example code:
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/SelectioB.h> /* a prompt dialog is made from
a stripped-down selection box. */
#define OK 1
#define CANCEL 2
void dialogCB(Widget w,
int client_data,
XmAnyCallbackStruct *call_data)
{
char *s;
XmSelectionBoxCallbackStruct *selection;
switch (client_data)
{
case OK:
selection=(XmSelectionBoxCallbackStruct *) call_data;
XmStringGetLtoR(selection->value,
XmSTRING_DEFAULT_CHARSET, &s);
printf("string='%s'\n",s);
XtFree(selection);
break;
case CANCEL:
printf("CANCEL selected\n");
break;
}
XtUnmanageChild(w);
}
void buttonCB(Widget w,
Widget *b,
XmAnyCallbackStruct *call_data)
{
XtManageChild(*b);
}
main(int argc, char *argv[])
{
Widget toplevel, button, dialog;
Arg al[10];
int ac;
toplevel=XtInitialize(argv[0],"",NULL,0,&argc,argv);
ac=0;
XtSetArg(al[ac],XmNlabelString, XmStringCreate("Push Me",
XmSTRING_DEFAULT_CHARSET)); ac++;
button=XtCreateManagedWidget("label",xmPushButtonWidgetClass,
toplevel,al,ac);
XtAddCallback (button, XmNactivateCallback, buttonCB, &dialog);
ac = 0;
XtSetArg(al[ac], XmNselectionLabelString, XmStringCreateLtoR
("Type in a string. ", XmSTRING_DEFAULT_CHARSET)); ac++;
dialog = XmCreatePromptDialog(toplevel, "dialog", al, ac);
XtAddCallback (dialog, XmNokCallback, dialogCB, OK);
XtAddCallback (dialog, XmNcancelCallback, dialogCB, CANCEL);
XtUnmanageChild(XmSelectionBoxGetChild(dialog,
XmDIALOG_HELP_BUTTON));
XtRealizeWidget(toplevel);
XtMainLoop();
}
The code in the "Case OK:" for the dialogCB routine extracts the string. It gets it from the event record generated for the dialog, passed in call_data. Besides this special string-extraction code, and the use of a different convenience function to create a different dialog box, the rest of the program is identical to the code used to demonstrate the message dialog.