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;
|