/* 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. */ /* reason.c -- examine the reason field of the callback structure * passed as the call_data of the callback function. This field * indicates which action area button in the dialog was pressed. */ #include <Xm/RowColumn.h> #include <Xm/MessageB.h> #include <Xm/PushB.h> /* main() --create a pushbutton whose callback pops up a dialog box */ int main(argc, argv) int argc; char *argv[]; { XtAppContext app; Widget toplevel, rc, pb; extern void pushed(); XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); rc = XtVaCreateWidget ("rowcol", xmRowColumnWidgetClass, toplevel, NULL); pb = XtVaCreateManagedWidget ("Hello", xmPushButtonWidgetClass, rc, NULL); XtAddCallback (pb, XmNactivateCallback, pushed, "Hello World"); pb = XtVaCreateManagedWidget ("Goodbye", xmPushButtonWidgetClass, rc, NULL); XtAddCallback (pb, XmNactivateCallback, pushed, "Goodbye World"); XtManageChild (rc); XtRealizeWidget (toplevel); XtAppMainLoop (app); } /* pushed() --the callback routine for the main app's pushbuttons. * Create and popup a dialog box that has callback functions for * the OK, Cancel and Help buttons. */ void pushed(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { static Widget dialog; char *message = (char *) client_data; XmString t = XmStringCreateLocalized (message); /* See if we've already created this dialog -- if so, * we don't need to create it again. Just set the message * and manage it (repop it up). */ if (!dialog) { extern void callback(); Arg args[5]; int n = 0; XtSetArg (args[n], XmNautoUnmanage, False); n++; dialog = XmCreateMessageDialog (widget, "notice", args, n); XtAddCallback (dialog, XmNokCallback, callback, "Hi"); XtAddCallback (dialog, XmNcancelCallback, callback, "Foo"); XtAddCallback (dialog, XmNhelpCallback, callback, "Bar"); } XtVaSetValues (dialog, XmNmessageString, t, NULL); XmStringFree (t); XtManageChild (dialog); XtPopup (XtParent (dialog), XtGrabNone); } /* callback() --One of the dialog buttons was selected. * Determine which one by examining the "reason" parameter. */ void callback(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { char *button; char *message = (char *) client_data; XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data; switch (cbs->reason) { case XmCR_OK : button = "OK"; break; case XmCR_CANCEL : button = "Cancel"; break; case XmCR_HELP : button = "Help"; break; } printf ("%s was selected: %s\n", button, message); if (cbs->reason != XmCR_HELP) { /* the ok and cancel buttons "close" the widget */ XtPopdown (XtParent (widget)); } }