--- rpl/modules/motif/XtAddCallback.rplc 2017/07/10 07:25:24 1.1 +++ rpl/modules/motif/XtAddCallback.rplc 2017/07/30 21:59:40 1.6 @@ -4,19 +4,22 @@ declareExternalFunction(XtAddCallback) declareObject(widget); declareObject(callbackName); + declareObject(callbackObject); declareObject(callbackProc); - declareObject(subList); - declareObject(procStatus); + declareDaisyChain(tmp); - string type; + sXtCallback *sCallback; - String callback; + string type; + + String callback; HEADER declareHelpString("Add callback to a widget\n" " 3: widget\n" " 2: callback name (XmNactivateCallback)\n" - " 1: expression\n"); + " 1: expression\n" + " -> 1: callback\n"); numberOfArguments(3); FUNCTION if (initializationDone eq true) then @@ -47,21 +50,24 @@ declareExternalFunction(XtAddCallback) freeObject(callbackName); freeObject(widget)); endIf - // Adding a copy of expression in a list. - - dupObject(callbackProc); - - createListObject(subList); - createObject(procStatus); - - objectContainer(procStatus) = address(procStatus(rpl_arguments)); + createExternalObject(callbackObject, CALLBACK); - insertObjectIntoList(subList, callbackProc); - insertObjectIntoList(subList, procStatus); - insertObjectIntoList(callbacksList, subList); + sCallback = allocate(size(sXtCallback)); + sCallback->status = procStatus(rpl_arguments); + sCallback->callback = callbackProc; + sCallback->widget = target(objectContainer(Widget, widget)); + objectOf(callbackObject) = sCallback; + + XtAddCallback(target(objectContainer(Widget, widget)), + callback, rplCallback, (XtPointer) sCallback); + + tmp = allocate(size(daisyChain)); + tmp->next = lCallbacks; + tmp->data = callbackObject; + lCallbacks = tmp; - XtAddCallback(target((Widget *) objectContainer(widget)), - callback, rplCallback, (XtPointer) subList); + dupObject(callbackObject); + pushOnStack(callbackObject); orElse executionError("Application not initialized"); returnOnError();