/* Written by Dan Heller and Paula Ferguson.
* Copyright 1994, O'Reilly & Associates, Inc.
* Permission to use, copy, and modify this program without
* restriction is hereby granted, as long as this copyright
* notice appears in each copy of the program source code.
* This program is freely distributable without licensing fees and
* is provided without guarantee or warrantee expressed or implied.
* This program is -not- in the public domain.
*/
/* ask_user_simple.c -- create a pushbutton that posts a dialog box
* that asks the user a question that requires an immediate
* response. The function that asks the question actually
* posts the dialog that displays the question, waits for and
* returns the result.
*/
#include <X11/Intrinsic.h>
#include <Xm/DialogS.h>
#include <Xm/SelectioB.h>
#include <Xm/RowColumn.h>
#include <Xm/MessageB.h>
#include <Xm/PushBG.h>
#include <Xm/PushB.h>
XtAppContext app;
#define YES 1
#define NO 2
/* main() --create a pushbutton whose callback pops up a dialog box */
main(argc, argv)
int argc;
char *argv[];
{
Widget parent, button, toplevel;
XmString label;
void pushed();
XtSetLanguageProc (NULL, NULL, NULL);
toplevel = XtVaAppInitialize (&app, "Demos",
NULL, 0, &argc, argv, NULL, NULL);
label = XmStringCreateLocalized ("/bin/rm *");
button = XtVaCreateManagedWidget ("button",
xmPushButtonWidgetClass, toplevel,
XmNlabelString, label,
NULL);
XtAddCallback (button, XmNactivateCallback,
pushed, "Remove Everything?");
XmStringFree (label);
XtRealizeWidget (toplevel);
XtAppMainLoop (app);
}
/* pushed() --the callback routine for the main app's pushbutton. */
void
pushed(widget, client_data, call_data)
Widget widget;
XtPointer client_data;
XtPointer call_data;
{
char *question = (char *) client_data;
if (AskUser (widget, question) == YES)
puts ("Yes");
else
puts ("No");
}
/*
* AskUser() -- a generalized routine that asks the user a question
* and returns the Yes/No response.
*/
int
AskUser(parent, question)
Widget parent;
char *question;
{
static Widget dialog;
XmString text, yes, no;
static int answer;
extern void response();
extern XtAppContext app;
if (!dialog) {
dialog = XmCreateQuestionDialog (parent, "dialog", NULL, 0);
yes = XmStringCreateLocalized ("Yes");
no = XmStringCreateLocalized ("No");
XtVaSetValues (dialog,
XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL,
XmNokLabelString, yes,
XmNcancelLabelString, no,
NULL);
XtSetSensitive (
XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON),
False);
XtAddCallback (dialog, XmNokCallback, response, &answer);
XtAddCallback (dialog, XmNcancelCallback, response, &answer);
XmStringFree (yes);
XmStringFree (no);
}
answer = 0;
text = XmStringCreateLocalized (question);
XtVaSetValues (dialog,
XmNmessageString, text,
NULL);
XmStringFree (text);
XtManageChild (dialog);
XtPopup (XtParent (dialog), XtGrabNone);
/* while the user hasn't provided an answer, simulate main loop.
* The answer changes as soon as the user selects one of the
* buttons and the callback routine changes its value.
*/
while (answer == 0)
XtAppProcessEvent (app, XtIMAll);
XtPopdown (XtParent (dialog));
return answer;
}
/* response() --The user made some sort of response to the
* question posed in AskUser(). Set the answer (client_data)
* accordingly and destroy the dialog.
*/
void
response(widget, client_data, call_data)
Widget widget;
XtPointer client_data;
XtPointer call_data;
{
int *answer = (int *) client_data;
XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data;
switch (cbs->reason) {
case XmCR_OK:
*answer = YES;
break;
case XmCR_CANCEL:
*answer = NO;
break;
default:
return;
break;
}
}