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

CVSweb interface <joel.bertrand@systella.fr>