Annotation of rpl/modules/motif/XtCreateWidget.rplc, revision 1.3

1.1       bertrand    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);
1.3     ! bertrand   11:    declareObject(widget);
        !            12: 
        !            13:    declareInteger(value);
1.1       bertrand   14: 
                     15:    declareDaisyChain(current);
                     16:    declareDaisyChain(current2);
                     17: 
                     18:    char            target(name);
                     19:    char            target(class);
1.3     ! bertrand   20:    char            target(cvalue);
1.1       bertrand   21: 
1.2       bertrand   22:    ArgList         args;
1.1       bertrand   23:    Cardinal        argNum;
1.2       bertrand   24:    String          argument;
1.1       bertrand   25:    WidgetClass     wc;
1.3     ! bertrand   26:    XmString        x_string;
1.1       bertrand   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:            pullFromStack(classObject, string);
                     46:            returnOnError(freeObject(parametersObject);
                     47:                    freeObject(parentObject);
                     48:                    freeObject(classObject));
                     49: 
                     50:            pullFromStack(nameObject, string);
                     51:            returnOnError(freeObject(parametersObject);
                     52:                    freeObject(parentObject);
                     53:                    freeObject(classObject);
                     54:                    freeObject(nameObject));
                     55: 
                     56:            getString(classObject, class);
                     57:            getString(nameObject, name);
                     58: 
                     59:            Xm_widgets_classes(class, wc);
                     60: 
                     61:            returnOnError(freeObject(parametersObject);
                     62:                    freeObject(parentObject);
                     63:                    freeObject(classObject);
                     64:                    freeObject(nameObject));
                     65: 
                     66:            getDaisyChainFromList(parametersObject, current);
                     67:            argNum = 0;
                     68: 
                     69:            repeatWhile(not nullified(current))
                     70:                list = fetchElementFromDaisyChain(current);
                     71: 
                     72:                ifIsList(list) then
                     73:                    getDaisyChainFromList(list, current2);
                     74: 
                     75:                    if (nullified(current2)) then
                     76:                        executionError("Too few arguments");
                     77:                        returnOnError(freeObject(parametersObject);
                     78:                                freeObject(parentObject);
                     79:                                freeObject(classObject);
                     80:                                freeObject(nameObject));
                     81:                    endIf
                     82: 
                     83:                    ifIsString(fetchElementFromDaisyChain(current2)) then
                     84:                    orElse
                     85:                        executionError("Type mismatch error");
                     86:                        returnOnError(freeObject(parametersObject);
                     87:                                freeObject(parentObject);
                     88:                                freeObject(classObject);
                     89:                                freeObject(nameObject));
                     90:                    endIf
                     91: 
                     92:                    current2 = nextElementOfDaisyChain(current2);
                     93: 
                     94:                    if (nullified(current2)) then
                     95:                        executionError("Too few arguments");
                     96:                        returnOnError(freeObject(parametersObject);
                     97:                                freeObject(parentObject);
                     98:                                freeObject(classObject);
                     99:                                freeObject(nameObject));
                    100:                    endIf
                    101: 
                    102:                    directive = fetchElementFromDaisyChain(current2);
                    103: 
                    104:                    ifIsInteger(directive) then
                    105:                    orElse
                    106:                        ifIsString(directive) then
                    107:                        orElse
                    108:                            ifIsName(directive) then
                    109:                            orElse
                    110:                                executionError("Type mismatch error");
                    111:                                returnOnError(freeObject(parametersObject);
                    112:                                        freeObject(parentObject);
                    113:                                        freeObject(classObject);
                    114:                                        freeObject(nameObject));
                    115:                            endIf
                    116:                        endIf
                    117:                    endIf
                    118: 
                    119:                    current2 = nextElementOfDaisyChain(current2);
                    120: 
                    121:                    if (not nullified(current2)) then
                    122:                        executionError("Type mismatch error");
                    123:                        returnOnError(freeObject(parametersObject);
                    124:                                freeObject(parentObject);
                    125:                                freeObject(classObject);
                    126:                                freeObject(nameObject));
                    127:                    endIf
                    128:                orElse
                    129:                    executionError("Type mismatch error");
                    130:                    returnOnError(freeObject(parametersObject);
                    131:                            freeObject(parentObject);
                    132:                            freeObject(classObject);
                    133:                            freeObject(nameObject));
                    134:                endIf
                    135: 
                    136:                current = nextElementOfDaisyChain(current);
                    137:                postIncr(argNum);
                    138:            endWhile
1.2       bertrand  139: 
                    140:            args = allocate(size(Arg) * argNum);
                    141:            argNum = 0;
                    142:            getDaisyChainFromList(parametersObject, current);
                    143: 
                    144:            repeatWhile(not nullified(current))
                    145:                list = fetchElementFromDaisyChain(current);
                    146:                getDaisyChainFromList(list, current2);
                    147:                getString(fetchElementFromDaisyChain(current2), name);
                    148:                current2 = nextElementOfDaisyChain(current2);
                    149: 
                    150:                XmN_constants(name, argument);
                    151: 
                    152:                returnOnError(freeObject(parametersObject);
                    153:                        freeObject(parentObject);
                    154:                        freeObject(classObject);
                    155:                        freeObject(nameObject));
                    156: 
1.3     ! bertrand  157:                ifIsExternal(fetchElementFromDaisyChain(current2), WIDGET) then
        !           158:                    if ((strcmp(name, "XmNtopWidget") eq 0) or
        !           159:                            (strcmp(name, "XmNbottomWidget") eq 0) or
        !           160:                            (strcmp(name, "XmNleftWidget") eq 0) or
        !           161:                            (strcmp(name, "XmNrightWidget") eq 0)) then
        !           162:                        XtSetArg(args[argNum], argument,
        !           163:                                (XtArgVal) (*((sXtAppContext *)
        !           164:                                objectContainer(fetchElementFromDaisyChain(
        !           165:                                current2)))).widget);
        !           166:                    orElse
        !           167:                        executionError("Wait for XmN*Widget");
        !           168:                        deallocate(args);
        !           169:                        returnOnError(freeObject(parametersObject);
        !           170:                                freeObject(parentObject);
        !           171:                                freeObject(classObject);
        !           172:                                freeObject(nameObject));
        !           173:                    endIf
        !           174:                elseIfIsName(fetchElementFromDaisyChain(current2)) then
        !           175:                    directive = fetchElementFromDaisyChain(current2);
        !           176:                    dupObject(directive);
        !           177:                    intrinsic(pshcntxt);
        !           178:                    pushOnStack(directive);
        !           179:                    intrinsic(eval);
        !           180:                    pullFromStack(directive, unknown);
        !           181:                    intrinsic(pulcntxt);
1.2       bertrand  182: 
1.3     ! bertrand  183:                    ifIsInteger(directive) then
        !           184:                        getInteger(directive, value);
        !           185:                        XtSetArg(args[argNum], argument, (XtArgVal) value);
        !           186:                    elseIfIsExternal(directive, WIDGET) then
        !           187:                        if ((strcmp(name, "XmNtopWidget") eq 0) or
        !           188:                                (strcmp(name, "XmNbottomWidget") eq 0) or
        !           189:                                (strcmp(name, "XmNleftWidget") eq 0) or
        !           190:                                (strcmp(name, "XmNrightWidget") eq 0)) then
        !           191:                            XtSetArg(args[argNum], argument,
        !           192:                                    (XtArgVal) (*((sXtAppContext *)
        !           193:                                    objectContainer(directive))).widget);
        !           194:                        orElse
        !           195:                            executionError("Wait for XmN*Widget");
        !           196:                            deallocate(args);
        !           197:                            returnOnError(freeObject(parametersObject);
        !           198:                                    freeObject(parentObject);
        !           199:                                    freeObject(classObject);
        !           200:                                    freeObject(nameObject));
        !           201:                        endIf
        !           202:                    endIf
        !           203:                elseIfIsInteger(fetchElementFromDaisyChain(current2)) then
        !           204:                    getInteger(fetchElementFromDaisyChain(current2), value);
        !           205:                    XtSetArg(args[argNum], argument, (XtArgVal) value);
        !           206:                orElse // Allowed types are integer, name, widget or string
        !           207:                    getString(fetchElementFromDaisyChain(current2), cvalue);
        !           208:                    x_string = XmStringCreate(cvalue, XmFONTLIST_DEFAULT_TAG);
        !           209:                    XtSetArg(args[argNum], argument, (XtArgVal) x_string);
        !           210:                endIf
1.2       bertrand  211:            endWhile
                    212: 
1.3     ! bertrand  213:            createExternalObject(widget, WIDGET);
        !           214: 
        !           215:            target((Widget *) objectContainer(widget)) =
        !           216:                    XtCreateWidget(name, wc, (*((sXtAppContext *)
        !           217:                    objectContainer(parentObject))).widget, args, argNum);
        !           218:            XtManageChild(target((Widget *) objectContainer(widget)));
        !           219: 
        !           220:            pushOnStack(widget);
        !           221:            deallocate(args);
1.1       bertrand  222:        orElse
                    223:            executionError("Application not initialized");
                    224:            returnOnError();
                    225:        endIf
                    226: 
1.3     ! bertrand  227:        freeObject(parametersObject);
        !           228:        freeObject(parentObject);
        !           229:        freeObject(classObject);
        !           230:        freeObject(nameObject);
1.1       bertrand  231:    END
                    232: endExternalFunction
1.3     ! bertrand  233: 
        !           234: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>