File:  [local] / rpl / modules / motif / XtCreateWidget.rplc
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Mon Jul 10 14:47:59 2017 UTC (6 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Patches pour motif.

    1: #include "src/rplexternals.h"
    2: #include "motif.h"
    3: 
    4: declareExternalFunction(XtCreateWidget)
    5:     declareObject(nameObject);
    6:     declareObject(classObject);
    7:     declareObject(parentObject);
    8:     declareObject(parametersObject);
    9:     declareObject(list);
   10:     declareObject(directive);
   11:     declareObject(widget);
   12: 
   13:     declareInteger(value);
   14: 
   15:     declareDaisyChain(current);
   16:     declareDaisyChain(current2);
   17: 
   18:     char            target(name);
   19:     char            target(class);
   20:     char            target(cvalue);
   21:     char            target(command);
   22: 
   23:     ArgList         args;
   24:     Cardinal        argNum;
   25:     String          argument;
   26:     WidgetClass     wc;
   27:     XmString        x_string;
   28: 
   29:     HEADER
   30:         declareHelpString("Create a Motif widget\n"
   31:                 "    4: name\n"
   32:                 "    3: class\n"
   33:                 "    2: parent\n"
   34:                 "    1: { parameters }\n"
   35:                 " -> 1: widget\n");
   36:         numberOfArguments(4);
   37:     FUNCTION
   38:         if (initializationDone eq true) then
   39:             pullFromStack(parametersObject, list);
   40:             returnOnError(freeObject(parametersObject));
   41: 
   42:             pullFromStack(parentObject, external);
   43:             returnOnError(freeObject(parametersObject);
   44:                     freeObject(parentObject));
   45: 
   46:             ifIsExternal(parentObject, WIDGET) then
   47:             orElse
   48:                 executionError("Type mismatch error");
   49:                 returnOnError(freeObject(parametersObject);
   50:                         freeObject(parentObject));
   51:             endIf
   52: 
   53:             pullFromStack(classObject, string);
   54:             returnOnError(freeObject(parametersObject);
   55:                     freeObject(parentObject);
   56:                     freeObject(classObject));
   57: 
   58:             pullFromStack(nameObject, string);
   59:             returnOnError(freeObject(parametersObject);
   60:                     freeObject(parentObject);
   61:                     freeObject(classObject);
   62:                     freeObject(nameObject));
   63: 
   64:             getString(classObject, class);
   65:             getString(nameObject, name);
   66: 
   67:             Xm_widgets_classes(class, wc);
   68: 
   69:             returnOnError(freeObject(parametersObject);
   70:                     freeObject(parentObject);
   71:                     freeObject(classObject);
   72:                     freeObject(nameObject));
   73: 
   74:             getDaisyChainFromList(parametersObject, current);
   75:             argNum = 0;
   76: 
   77:             repeatWhile(not nullified(current))
   78:                 list = fetchElementFromDaisyChain(current);
   79: 
   80:                 ifIsList(list) then
   81:                     getDaisyChainFromList(list, current2);
   82: 
   83:                     if (nullified(current2)) then
   84:                         executionError("Too few arguments");
   85:                         returnOnError(freeObject(parametersObject);
   86:                                 freeObject(parentObject);
   87:                                 freeObject(classObject);
   88:                                 freeObject(nameObject));
   89:                     endIf
   90: 
   91:                     ifIsString(fetchElementFromDaisyChain(current2)) then
   92:                     orElse
   93:                         executionError("Type mismatch error");
   94:                         returnOnError(freeObject(parametersObject);
   95:                                 freeObject(parentObject);
   96:                                 freeObject(classObject);
   97:                                 freeObject(nameObject));
   98:                     endIf
   99: 
  100:                     current2 = nextElementOfDaisyChain(current2);
  101: 
  102:                     if (nullified(current2)) then
  103:                         executionError("Too few arguments");
  104:                         returnOnError(freeObject(parametersObject);
  105:                                 freeObject(parentObject);
  106:                                 freeObject(classObject);
  107:                                 freeObject(nameObject));
  108:                     endIf
  109: 
  110:                     directive = fetchElementFromDaisyChain(current2);
  111: 
  112:                     ifIsInteger(directive) then
  113:                     orElse
  114:                         ifIsString(directive) then
  115:                         orElse
  116:                             ifIsName(directive) then
  117:                             orElse
  118:                                 executionError("Type mismatch error");
  119:                                 returnOnError(freeObject(parametersObject);
  120:                                         freeObject(parentObject);
  121:                                         freeObject(classObject);
  122:                                         freeObject(nameObject));
  123:                             endIf
  124:                         endIf
  125:                     endIf
  126: 
  127:                     current2 = nextElementOfDaisyChain(current2);
  128: 
  129:                     if (not nullified(current2)) then
  130:                         executionError("Type mismatch error");
  131:                         returnOnError(freeObject(parametersObject);
  132:                                 freeObject(parentObject);
  133:                                 freeObject(classObject);
  134:                                 freeObject(nameObject));
  135:                     endIf
  136:                 orElse
  137:                     executionError("Type mismatch error");
  138:                     returnOnError(freeObject(parametersObject);
  139:                             freeObject(parentObject);
  140:                             freeObject(classObject);
  141:                             freeObject(nameObject));
  142:                 endIf
  143: 
  144:                 current = nextElementOfDaisyChain(current);
  145:                 postIncr(argNum);
  146:             endWhile
  147: 
  148: uprintf("%d\n", argNum);
  149:             args = allocate(size(Arg) * argNum);
  150:             argNum = 0;
  151:             getDaisyChainFromList(parametersObject, current);
  152: 
  153:             repeatWhile(not nullified(current))
  154:                 list = fetchElementFromDaisyChain(current);
  155:                 getDaisyChainFromList(list, current2);
  156:                 getString(fetchElementFromDaisyChain(current2), command);
  157:                 current2 = nextElementOfDaisyChain(current2);
  158: 
  159:                 XmN_constants(command, argument);
  160: 
  161:                 returnOnError(freeObject(parametersObject);
  162:                         freeObject(parentObject);
  163:                         freeObject(classObject);
  164:                         freeObject(nameObject));
  165: 
  166:                 ifIsExternal(fetchElementFromDaisyChain(current2), WIDGET) then
  167:                     if ((strcmp(command, "XmNtopWidget") eq 0) or
  168:                             (strcmp(command, "XmNbottomWidget") eq 0) or
  169:                             (strcmp(command, "XmNleftWidget") eq 0) or
  170:                             (strcmp(command, "XmNrightWidget") eq 0)) then
  171: /*
  172:                         XtSetArg(args[argNum], argument,
  173:                                 (XtArgVal) (*((sXtAppContext *)
  174:                                 objectContainer(fetchElementFromDaisyChain(
  175:                                 current2)))).widget);
  176: */
  177:                         XtSetArg(args[argNum], argument,
  178:                                 (XtArgVal) target((Widget *) objectContainer(
  179:                                 fetchElementFromDaisyChain(current2))));
  180:                     orElse
  181:                         executionError("Wait for XmN*Widget");
  182:                         deallocate(args);
  183:                         returnOnError(freeObject(parametersObject);
  184:                                 freeObject(parentObject);
  185:                                 freeObject(classObject);
  186:                                 freeObject(nameObject));
  187:                     endIf
  188:                 elseIfIsName(fetchElementFromDaisyChain(current2)) then
  189:                     directive = fetchElementFromDaisyChain(current2);
  190:                     dupObject(directive);
  191:                     intrinsic(pshcntxt);
  192:                     pushOnStack(directive);
  193:                     intrinsic(eval);
  194:                     pullFromStack(directive, unknown);
  195:                     intrinsic(pulcntxt);
  196: 
  197:                     ifIsInteger(directive) then
  198:                         getInteger(directive, value);
  199:                         XtSetArg(args[argNum], argument, (XtArgVal) value);
  200:                     elseIfIsExternal(directive, WIDGET) then
  201:                         if ((strcmp(command, "XmNtopWidget") eq 0) or
  202:                                 (strcmp(command, "XmNbottomWidget") eq 0) or
  203:                                 (strcmp(command, "XmNleftWidget") eq 0) or
  204:                                 (strcmp(command, "XmNrightWidget") eq 0)) then
  205:                         XtSetArg(args[argNum], argument,
  206:                                 (XtArgVal) target((Widget *) objectContainer(
  207:                                 directive)));
  208:                         orElse
  209:                             executionError("Wait for XmN*Widget");
  210:                             deallocate(args);
  211:                             returnOnError(freeObject(parametersObject);
  212:                                     freeObject(parentObject);
  213:                                     freeObject(classObject);
  214:                                     freeObject(nameObject));
  215:                         endIf
  216:                     endIf
  217:                 elseIfIsInteger(fetchElementFromDaisyChain(current2)) then
  218:                     getInteger(fetchElementFromDaisyChain(current2), value);
  219:                     XtSetArg(args[argNum], argument, (XtArgVal) value);
  220:                 orElse // Allowed types are integer, name, widget or string
  221:                     getString(fetchElementFromDaisyChain(current2), cvalue);
  222:                     x_string = XmStringCreate(cvalue, XmFONTLIST_DEFAULT_TAG);
  223:                     XtSetArg(args[argNum], argument, (XtArgVal) x_string);
  224:                 endIf
  225: 
  226:                 current = nextElementOfDaisyChain(current);
  227:                 postIncr(argNum);
  228:             endWhile
  229: 
  230:             createExternalObject(widget, WIDGET);
  231:             objectContainer(widget) = allocate(size(Widget));
  232: 
  233:             target((Widget *) objectContainer(widget)) =
  234:                     XtCreateWidget(name, wc, target((Widget *)
  235:                     objectContainer(parentObject)), args, argNum);
  236:             XtManageChild(target((Widget *) objectContainer(widget)));
  237: 
  238:             pushOnStack(widget);
  239:             deallocate(args);
  240:         orElse
  241:             executionError("Application not initialized");
  242:             returnOnError();
  243:         endIf
  244: 
  245:         freeObject(parametersObject);
  246:         freeObject(parentObject);
  247:         freeObject(classObject);
  248:         freeObject(nameObject);
  249:     END
  250: endExternalFunction
  251: 
  252: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>