/* Main Routine - Creates a Motif Dialog with Scale and OK Push */
/* Button Child Widgets */

/* UFUN includes */
#include <Xm/XmAll.h>
#include <uf.h>
#include <uf_ui_xt.h>

/*  Local Function Declarations */

static void ok_dialog(  Widget widget, XtPointer client,
                        XtPointer call );

static Widget makeButton( Widget   parent, char    *label,
                          Widget   top_attachment);

static Widget makeScale( Widget   parent, int      min,
                         int      max,    String   label);

static void create_dialog(Position x, Position y, Widget parent);

static Widget main;

void ufusr ( char *param, int *ret, int len)
{
        Widget          defaultParent;
        int              initialize_rcode,
                        uf_is_initialized, rcode;
        Position        x, y;
        char            msg[132];

      /*  Always initialize Ufun if it already isn't initialized */
        uf_is_initialized = UF_is_initialized();
        if( uf_is_initialized == 0 )
        {
            initialize_rcode = UF_initialize();
            if( initialize_rcode != 0 )
            {
                printf("Could not initialize User Function\n");
                return;
            }
        }

        /* GET PARENT FOR MOTIF DIALOG ***********************/
        defaultParent = UF_UI_get_default_parent();

        /* CREATE MAIN WIDGET OF DIALOG */

        rcode = UF_UI_get_DA2_coords(&x, &y);
        if (rcode != UF_UI_SUCCESS)
        {
            UF_get_fail_message(rcode,msg);
            UF_UI_set_status(msg);
        }

        create_dialog(x, y, defaultParent);



        /* RUN THE DIALOG ************************************/
        /* NOTE: this function will not return until the     */
        /* OK button is activated -- see ok_dialog(), below */
        rcode = UF_UI_run_dialog( main);

        if (rcode != UF_UI_SUCCESS)
        {
            UF_get_fail_message(rcode,msg);
            UF_UI_set_status(msg);
        }
}

/* Create the main custom dialog */

static void create_dialog(Position x, Position y, Widget parent)
{
    int inx=0;
    Arg arglist[20];
    Widget scale, ok_button;

    XtSetArg(arglist[inx], XmNx, x); inx++;
    XtSetArg(arglist[inx], XmNy, y); inx++;
    XtSetArg(arglist[inx], XmNdefaultPosition, FALSE); inx++;
    main = XmCreateFormDialog( parent, "TestMain",
                               arglist, inx );

         /* CREATE CHILD WIDGETS */
    scale   = makeScale( main, 0, 50, "Scale Value" );
    ok_button = makeButton( main, "OK", scale );
    XtAddCallback( ok_button, XmNactivateCallback,
                   ok_dialog, NULL );

     XtManageChild( scale);
     XtManageChild( ok_button);
}

/* Activation Callback for the OK Button */

static void ok_dialog( Widget widget, XtPointer client,
                       XtPointer call )
{
    int rcode;
    char msg[132];

   /*  ... PROCESS DIALOG RESULTS ...*/

/* TERMINATE THE MOTIF DIALOG ************************/
        rcode =  UF_UI_exit_dialog();
        if (rcode != UF_UI_SUCCESS)
        {
            UF_get_fail_message(rcode,msg);
            UF_UI_set_status(msg);
        }
        UF_terminate();
}


/* Make a Scale Widget */

static Widget makeScale( Widget parent, int min,
                         int max,  String label)

{
        Arg      arglist[20];
        int      inx         = 0;
        Widget   scaleWidget = NULL;
        XmString xmLabel     = NULL;

        inx = 0;
        XtSetArg( arglist[inx], XmNmaximum, max ); inx++;
        XtSetArg( arglist[inx], XmNminimum, min ); inx++;
        XtSetArg( arglist[inx], XmNorientation, XmHORIZONTAL );
        inx++;
        XtSetArg( arglist[inx], XmNshowValue, True ); inx++;
        XtSetArg( arglist[inx], XmNscaleMultiple, 1 ); inx++;
        XtSetArg( arglist[inx], XmNrightAttachment,
                  XmATTACH_WIDGET); inx++;
        XtSetArg( arglist[inx], XmNrightWidget, parent); inx++;
        XtSetArg( arglist[inx], XmNleftAttachment,
                  XmATTACH_WIDGET); inx++;
        XtSetArg( arglist[inx], XmNleftWidget, parent); inx++;
        if ( label != NULL )
        {
          xmLabel = XmStringCreateSimple( label );
          XtSetArg( arglist[inx], XmNtitleString, xmLabel );
          inx++;
        }
        scaleWidget = XmCreateScale( parent, "testScale", arglist,
                                     inx );

        if ( xmLabel != NULL ) XmStringFree( xmLabel );
        return scaleWidget;
}

/* Make a Push Button Widget */

static Widget makeButton(  Widget   parent, char    *label,
                           Widget   top_attachment)
{
        Widget button;
        Arg arglist[10];
        int  inx=0;
        XmString xms;

        xms = XmStringCreateSimple(label);
        XtSetArg( arglist[inx], XmNlabelString, xms);   inx++;
        XtSetArg( arglist[inx], XmNtopAttachment, XmATTACH_WIDGET);
        inx++;
        XtSetArg( arglist[inx], XmNtopWidget, top_attachment);
        inx++;
        XtSetArg( arglist[inx], XmNrightAttachment,
                  XmATTACH_WIDGET); inx++;
        XtSetArg( arglist[inx], XmNrightWidget, parent); inx++;
        XtSetArg( arglist[inx], XmNleftAttachment,
                  XmATTACH_WIDGET); inx++;
        XtSetArg( arglist[inx], XmNleftWidget, parent); inx++;

        button = XmCreatePushButton( parent, "testButton",
                                     arglist, inx);
        XmStringFree(xms);

        return(button);
}


int ufusr_ask_unload(void)
{
   return ( UF_UNLOAD_SEL_DIALOG );
}




 
Figure This is the custom dialog that will appear with this example code. This dialog will appear in the current DA2 location, which by default will be under the DA1 dialog. Its parent is Unigraphics.