[Date Prev] [Date Next] [Thread Prev] [Thread Next] Date Index Thread Index Search archive:
Date:Mon Nov 7 14:22:07 1997 
Subject:Converting Openlook to Motif 
From:Robin Popplestone 
Volume-ID:971107.02 



Quoth Iain McKay:

>I was wondering if anyone could point me to any useful resources
>that could aid me.

I wrote a set of functions that spanned OpenLook and Motif.
In other words, for Motif I compiled setup_Motif.p, and for OpenLook
I compiled setup_OpenLook.p, in both cases getting the same collection
of POP functions.

Motif is a b..... to work with.

Mostly I used Poplog widgets for the graphics etc. so those carried
across.

/*

         CONTENTS - (Use <ENTER> g to access required sections)

 --    CB_Slider_var makes a slider widget set the value of a POP-11 variable
 --  value_Slider provides access to the value of a slider.
 --  mk_ControlWidget allows you to lay out other widgets horizontally
 --    mk_MenuButton

*/

uses lexical_args;
compile_mode:pop11 +defpdr +varsch +constr;

uses Xm;
loadinclude xpt_coretypes;

vars procedure(
    notify_user
    mk_ControlWidget_h,
    mk_LabelWidget,
    CB_Help,
    Menu_Help = newassoc([]),
);
;;;



exload_batch;
    uses
        xtApplicationShellWidget,
    xmRowColumnWidget,
    xmPushButtonWidget,
    xmScaleWidget;
endexload_batch;

define lconstant ConsArgList(len);
    lvars len = len fi_>> 1;
    nc_consXptArgList((), len), len
enddefine;


loadinclude XmConstants;    ;;; rather than: include XmConstants


define mk_ApplicationWidget(Name_icon,Name_title,x,y);
      XtAppCreateShell(Name_icon, Name_title, xtApplicationShellWidget,
                        XptDefaultDisplay,
                        [{allowShellResize ^true}]);
enddefine;

/*
mk_Button creates a button-widget which may be used in menus.
-------------------------------------------------------------
*/

define mk_Button(Name,W_parent,CB);
    let Button =
        XtVaCreateManagedWidget(Name, xmPushButtonWidget, W_parent,
            #| XmN default, default |#),
        Menu_help = Menu_Help(W_parent)
    in
        XtAddCallback(Button, XmN activateCallback, CB, 'data');



/*        if Menu_help then
            let Button_help = XtCreateManagedWidget(Name, xmPushButtonWidget,
                    Menu_help, XptArgList([]))
            in
                XtAddCallback(Button_help,XmN activateCallback,
                    CB_Help(%CB%),'Data');
            endlet
        endif;
        */

        Button;
    endlet
enddefine;

/*
mk_Slider.. creates a slider widget for inputting numeric values
--------------------------------------------------------------------------
*/


define mk_Slider_h(Name,dx,v_max,W_parent,CB);
    let
        Slider = XtCreateManagedWidget(
                     'Name', xmScaleWidget,
                     W_parent,
                     [{width ^dx}
                      {orientation ^XmHORIZONTAL}
                      {maximum ^v_max}
                      ]),
        label = XmStringCreateLtoR(Name, XmSTRING_DEFAULT_CHARSET)
    in
        XtAddCallback(Slider, XmN dragCallback, CB, "mk_Slider_h");
        XtAddCallback(Slider, XmN valueChangedCallback, CB, "mk_Slider_h"),
        label -> XptValue(Slider, XmN titleString, TYPESPEC(:XmString));
        true -> XptValue(Slider, XmN showValue, TYPESPEC(:XptBoolean));

        Slider
    endlet
enddefine;


/*
value_Slider provides access to the value of a slider.
----------------------------------------------------

*/

vars procedure value_Slider = XptValue(% XmN value %);


/*
  CB_Slider_var makes a slider widget set the value of a POP-11 variable
---------------------------------------------------------------------
*/

define CB_Slider_var(widget, clientdata, calldata,Var);
    lvars  widget clientdata calldata,Var;

    l_typespec calldata: XmScaleCallbackStruct;
/*    exacc :int calldata.value -> valof(Var);
    valof(Var)=>
*/
   value_Slider(widget) -> valof(Var);
;;;    valof(Var)=>
    notify_user(Var ><' = '>< valof(Var),false);

enddefine;



/*
mk_ControlWidget allows you to lay out other widgets horizontally
-------------------------------------------------------------------
*/

define mk_ControlWidget_g(Name,W_parent,d);
    XtCreateManagedWidget(
        Name, xmRowColumnWidget,
        W_parent,
        [{orientation ^d}]);

enddefine;


vars procedure(
  mk_ControlWidget_h = mk_ControlWidget_g(%XmHORIZONTAL%),
  mk_ControlWidget_v = mk_ControlWidget_g(%XmVERTICAL%),
  mk_ControlWidget   = mk_ControlWidget_g(%XmHORIZONTAL%),
);



define CaptionedWidget(title, class, parent, args);
    lvars title class parent args;
/*    vars rowcol label w;

    XtVaCreateManagedWidget(
        'rowcol',
         xmRowColumnWidget,
         parent,
        XptVaArgList([
                {isAligned ^true}
                {entryAlignment ^XmALIGNMENT_END}
                {resizeWidth ^true}
                {orientation ^XmHORIZONTAL}])) -> rowcol;
    XtVaCreateManagedWidget('label', GC_Label, rowcol,
            XptVaArgList([
                {recomputeSize ^false}
                {width 100}
                {traversalOn ^false}
                {labelString ^title}])) -> label; */
    XtVaCreateManagedWidget('widget', class, parent, XptVaArgList(args))
enddefine;


/*
mk_MenuBar makes a bar on which one can hang menu-buttons.
----------------------------------------------------------
*/

define mk_MenuBar(W_parent);
  let menubar =
    XmCreateMenuBar(W_parent, nullstring,
                ConsArgList(#| XmN orientation, XmHORIZONTAL |#))
  in
    XtManageChild(menubar);
    menubar;
  endlet
enddefine;


/*
  mk_MenuButton makes a button which will create a pull-down menu
-------------------------------------------------------------------
In Motif, we believe that the parent of a menu-button has to be a menu-bar.

*/

define mk_MenuButton_g(Name,MenuBar,do_help);
  let
    Menu = XmCreatePulldownMenu(MenuBar, 'menu', ConsArgList(0)),
    Button    =
                XtVaCreateManagedWidget(Name, xmCascadeButtonWidget, MenuBar,
        #| XmN subMenuId, Menu |#)
    in

;;;    if do_help then

;;;    endif;

    (Button,Menu)
  endlet;
enddefine;


vars procedure mk_MenuButton = mk_MenuButton_g(%true%);

define mk_HelpButton(W);
  mk_MenuButton_g('Help',W,false);
enddefine;



/*



vars W_test = mk_ApplicationWidget('pat','anna',45,45);
vars W_control = mk_ControlWidget('test',W_test);

vars uppercontrol = W_control;

    XmCreateMenuBar(uppercontrol, nullstring,
                ConsArgList(#| XmN orientation, XmVERTICAL |#)) -> menubar;
    XtManageChild(menubar);

    XmCreatePulldownMenu(menubar, 'menu', ConsArgList(0)) -> file_menu;
    XtVaCreateManagedWidget('File', xmCascadeButtonWidget, menubar,
        #| XmN subMenuId, file_menu |#) -> /* file_widget */;


vars label = 'The Damn Button';
vars parent = file_menu;

    XtVaCreateManagedWidget(label, xmPushButtonWidget, parent,
                    #| XmN default, default |#) -> button;
;;; XtAddCallback(button, XmN activateCallback, cb, client);


        XtRealizeWidget(W_test);






*/


vars setup_Motif = true;