--- rpl/modules/motif/XtCreateWidget.rplc 2017/07/05 19:07:19 1.2 +++ rpl/modules/motif/XtCreateWidget.rplc 2017/07/06 10:18:04 1.3 @@ -8,17 +8,22 @@ declareExternalFunction(XtCreateWidget) declareObject(parametersObject); declareObject(list); declareObject(directive); + declareObject(widget); + + declareInteger(value); declareDaisyChain(current); declareDaisyChain(current2); char target(name); char target(class); + char target(cvalue); ArgList args; Cardinal argNum; String argument; WidgetClass wc; + XmString x_string; HEADER declareHelpString("Create a Motif widget\n" @@ -149,14 +154,81 @@ declareExternalFunction(XtCreateWidget) freeObject(classObject); freeObject(nameObject)); + ifIsExternal(fetchElementFromDaisyChain(current2), WIDGET) then + if ((strcmp(name, "XmNtopWidget") eq 0) or + (strcmp(name, "XmNbottomWidget") eq 0) or + (strcmp(name, "XmNleftWidget") eq 0) or + (strcmp(name, "XmNrightWidget") eq 0)) then + XtSetArg(args[argNum], argument, + (XtArgVal) (*((sXtAppContext *) + objectContainer(fetchElementFromDaisyChain( + current2)))).widget); + orElse + executionError("Wait for XmN*Widget"); + deallocate(args); + returnOnError(freeObject(parametersObject); + freeObject(parentObject); + freeObject(classObject); + freeObject(nameObject)); + endIf + elseIfIsName(fetchElementFromDaisyChain(current2)) then + directive = fetchElementFromDaisyChain(current2); + dupObject(directive); + intrinsic(pshcntxt); + pushOnStack(directive); + intrinsic(eval); + pullFromStack(directive, unknown); + intrinsic(pulcntxt); + ifIsInteger(directive) then + getInteger(directive, value); + XtSetArg(args[argNum], argument, (XtArgVal) value); + elseIfIsExternal(directive, WIDGET) then + if ((strcmp(name, "XmNtopWidget") eq 0) or + (strcmp(name, "XmNbottomWidget") eq 0) or + (strcmp(name, "XmNleftWidget") eq 0) or + (strcmp(name, "XmNrightWidget") eq 0)) then + XtSetArg(args[argNum], argument, + (XtArgVal) (*((sXtAppContext *) + objectContainer(directive))).widget); + orElse + executionError("Wait for XmN*Widget"); + deallocate(args); + returnOnError(freeObject(parametersObject); + freeObject(parentObject); + freeObject(classObject); + freeObject(nameObject)); + endIf + endIf + elseIfIsInteger(fetchElementFromDaisyChain(current2)) then + getInteger(fetchElementFromDaisyChain(current2), value); + XtSetArg(args[argNum], argument, (XtArgVal) value); + orElse // Allowed types are integer, name, widget or string + getString(fetchElementFromDaisyChain(current2), cvalue); + x_string = XmStringCreate(cvalue, XmFONTLIST_DEFAULT_TAG); + XtSetArg(args[argNum], argument, (XtArgVal) x_string); + endIf endWhile + createExternalObject(widget, WIDGET); + + target((Widget *) objectContainer(widget)) = + XtCreateWidget(name, wc, (*((sXtAppContext *) + objectContainer(parentObject))).widget, args, argNum); + XtManageChild(target((Widget *) objectContainer(widget))); + + pushOnStack(widget); + deallocate(args); orElse executionError("Application not initialized"); returnOnError(); endIf - setFalse(initializationDone); + freeObject(parametersObject); + freeObject(parentObject); + freeObject(classObject); + freeObject(nameObject); END endExternalFunction + +// vim: ts=4