File:  [local] / rpl / modules / motif / XtAddCallback.rplc
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Sun Jul 30 21:59:40 2017 UTC (6 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, rpl-4_1_33, rpl-4_1_32, rpl-4_1_31, rpl-4_1_30, rpl-4_1_29, rpl-4_1_28, rpl-4_1_27, HEAD
Ajout d'une série de patches pour gérer les instructions de type A->B
dans les bibliothèques externes.

    1: #include "src/rplexternals.h"
    2: #include "motif.h"
    3: 
    4: declareExternalFunction(XtAddCallback)
    5:     declareObject(widget);
    6:     declareObject(callbackName);
    7:     declareObject(callbackObject);
    8:     declareObject(callbackProc);
    9:     declareDaisyChain(tmp);
   10: 
   11:     sXtCallback             *sCallback;
   12: 
   13:     string                  type;
   14: 
   15:     String                  callback;
   16: 
   17:     HEADER
   18:         declareHelpString("Add callback to a widget\n"
   19:                 "    3: widget\n"
   20:                 "    2: callback name (XmNactivateCallback)\n"
   21:                 "    1: expression\n"
   22:                 " -> 1: callback\n");
   23:         numberOfArguments(3);
   24:     FUNCTION
   25:         if (initializationDone eq true) then
   26:             pullFromStack(callbackProc, unknown);
   27:             returnOnError(freeObject(callbackProc));
   28: 
   29:             pullFromStack(callbackName, string);
   30:             returnOnError(freeObject(callbackProc); freeObject(callbackName));
   31: 
   32:             pullFromStack(widget, external);
   33:             returnOnError(freeObject(callbackProc); freeObject(callbackName);
   34:                     freeObject(widget));
   35: 
   36:             ifIsExternal(widget, WIDGET) then
   37:             orElse
   38:                 executionError("Type mismatch error");
   39:                 returnOnError(freeObject(callbackProc);
   40:                         freeObject(callbackName); freeObject(widget));
   41:             endIf
   42: 
   43:             getString(callbackName, type);
   44: 
   45:             if (strcmp(type, "XmNactivateCallback") eq 0) then
   46:                 callback = XmNactivateCallback;
   47:             orElse
   48:                 executionError("Unknown callback type");
   49:                 returnOnError(freeObject(callbackProc);
   50:                         freeObject(callbackName); freeObject(widget));
   51:             endIf
   52: 
   53:             createExternalObject(callbackObject, CALLBACK);
   54: 
   55:             sCallback = allocate(size(sXtCallback));
   56:             sCallback->status = procStatus(rpl_arguments);
   57:             sCallback->callback = callbackProc;
   58:             sCallback->widget = target(objectContainer(Widget, widget));
   59:             objectOf(callbackObject) = sCallback;
   60: 
   61:             XtAddCallback(target(objectContainer(Widget, widget)),
   62:                     callback, rplCallback, (XtPointer) sCallback);
   63: 
   64:             tmp = allocate(size(daisyChain));
   65:             tmp->next = lCallbacks;
   66:             tmp->data = callbackObject;
   67:             lCallbacks = tmp;
   68: 
   69:             dupObject(callbackObject);
   70:             pushOnStack(callbackObject);
   71:         orElse
   72:             executionError("Application not initialized");
   73:             returnOnError();
   74:         endIf
   75:     END
   76: endExternalFunction
   77: 
   78: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>