--- rpl/modules/motif/XtCreateWidget.rplc 2017/07/06 10:18:04 1.3 +++ rpl/modules/motif/XtCreateWidget.rplc 2017/08/22 11:22:04 1.8 @@ -18,6 +18,7 @@ declareExternalFunction(XtCreateWidget) char target(name); char target(class); char target(cvalue); + char target(command); ArgList args; Cardinal argNum; @@ -42,6 +43,13 @@ declareExternalFunction(XtCreateWidget) returnOnError(freeObject(parametersObject); freeObject(parentObject)); + ifIsExternal(parentObject, WIDGET) then + orElse + executionError("Type mismatch error"); + returnOnError(freeObject(parametersObject); + freeObject(parentObject)); + endIf + pullFromStack(classObject, string); returnOnError(freeObject(parametersObject); freeObject(parentObject); @@ -144,10 +152,10 @@ declareExternalFunction(XtCreateWidget) repeatWhile(not nullified(current)) list = fetchElementFromDaisyChain(current); getDaisyChainFromList(list, current2); - getString(fetchElementFromDaisyChain(current2), name); + getString(fetchElementFromDaisyChain(current2), command); current2 = nextElementOfDaisyChain(current2); - XmN_constants(name, argument); + XmN_constants(command, argument); returnOnError(freeObject(parametersObject); freeObject(parentObject); @@ -155,14 +163,13 @@ declareExternalFunction(XtCreateWidget) 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 + if ((strcmp(command, "XmNtopWidget") eq 0) or + (strcmp(command, "XmNbottomWidget") eq 0) or + (strcmp(command, "XmNleftWidget") eq 0) or + (strcmp(command, "XmNrightWidget") eq 0)) then XtSetArg(args[argNum], argument, - (XtArgVal) (*((sXtAppContext *) - objectContainer(fetchElementFromDaisyChain( - current2)))).widget); + (XtArgVal) target(objectContainer(Widget, + fetchElementFromDaisyChain(current2)))); orElse executionError("Wait for XmN*Widget"); deallocate(args); @@ -184,13 +191,13 @@ declareExternalFunction(XtCreateWidget) 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); + if ((strcmp(command, "XmNtopWidget") eq 0) or + (strcmp(command, "XmNbottomWidget") eq 0) or + (strcmp(command, "XmNleftWidget") eq 0) or + (strcmp(command, "XmNrightWidget") eq 0)) then + XtSetArg(args[argNum], argument, + (XtArgVal) target(objectContainer(Widget, + directive))); orElse executionError("Wait for XmN*Widget"); deallocate(args); @@ -208,14 +215,17 @@ declareExternalFunction(XtCreateWidget) x_string = XmStringCreate(cvalue, XmFONTLIST_DEFAULT_TAG); XtSetArg(args[argNum], argument, (XtArgVal) x_string); endIf + + current = nextElementOfDaisyChain(current); + postIncr(argNum); endWhile createExternalObject(widget, WIDGET); + objectOf(widget) = allocate(size(Widget)); - target((Widget *) objectContainer(widget)) = - XtCreateWidget(name, wc, (*((sXtAppContext *) - objectContainer(parentObject))).widget, args, argNum); - XtManageChild(target((Widget *) objectContainer(widget))); + target(objectContainer(Widget, widget)) = + XtCreateWidget(name, wc, target( + objectContainer(Widget, parentObject)), args, argNum); pushOnStack(widget); deallocate(args);