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

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: 
1.4     ! bertrand   45:            ifIsExternal(widget, WIDGET) then
        !            46:            orElse
        !            47:                executionError("Type mismatch error");
        !            48:                returnOnError(freeObject(parametersObject);
        !            49:                        freeObject(parentObject));
        !            50:            endIf
        !            51: 
1.1       bertrand   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
1.2       bertrand  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: 
1.3       bertrand  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);
1.2       bertrand  189: 
1.3       bertrand  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
1.2       bertrand  218:            endWhile
                    219: 
1.3       bertrand  220:            createExternalObject(widget, WIDGET);
                    221: 
                    222:            target((Widget *) objectContainer(widget)) =
1.4     ! bertrand  223:                    XtCreateWidget(name, wc, target((sXtAppContext *)
        !           224:                    objectContainer(parentObject)).widget, args, argNum);
1.3       bertrand  225:            XtManageChild(target((Widget *) objectContainer(widget)));
                    226: 
                    227:            pushOnStack(widget);
                    228:            deallocate(args);
1.1       bertrand  229:        orElse
                    230:            executionError("Application not initialized");
                    231:            returnOnError();
                    232:        endIf
                    233: 
1.3       bertrand  234:        freeObject(parametersObject);
                    235:        freeObject(parentObject);
                    236:        freeObject(classObject);
                    237:        freeObject(nameObject);
1.1       bertrand  238:    END
                    239: endExternalFunction
1.3       bertrand  240: 
                    241: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>