OSDN Git Service

Callback for a button works now.
authorYoshinobu Date <admin@hackerzlife.com>
Tue, 21 Jun 2011 17:13:32 +0000 (03:13 +1000)
committerYoshinobu Date <admin@hackerzlife.com>
Tue, 21 Jun 2011 17:13:32 +0000 (03:13 +1000)
modified:   xaw.c

test.js
xaw.c

diff --git a/test.js b/test.js
index 839eb32..7bf144c 100644 (file)
--- a/test.js
+++ b/test.js
@@ -5,11 +5,10 @@ var quit = function(){
 };
 var x = 1;
 var count = function (){
-       label.Top = x;
        d = new Date();
     label.Text = "count="+x+"\n"+d;
        x++;
-       setTimeout( count, 1000 );
+       //setTimeout( count, 1000 );
 };
 var chtxt = function (){
        label.Text = "Changed";
@@ -19,9 +18,10 @@ var chtxt = function (){
 var mywindow = new xawWindow("Test");
 var form = new xawForm(mywindow, "form", 0);
 var label = new xawWidget(form, "Hello world!\n"+d);
-var button = new xawWidget(form, "Klick!", "chtxt()");
+var button = new xawWidget(form, "Klick!", count);
+button.Top = 25;
 print("objects ready.\n");
-count();
+//count();
 mywindow.Show();
 
 
diff --git a/xaw.c b/xaw.c
index eee820d..54e887b 100644 (file)
--- a/xaw.c
+++ b/xaw.c
@@ -31,11 +31,22 @@ void backgroundColorChanged(Widget w,char*colorStr){
 
 
 
-/* コールバック関数 */
+/* コールバック関数 (メモリの解放どうしようか。) */
 #pragma GCC optimization_level 0
 void xawJsCallbackFunction( Widget w, XtPointer client, XtPointer called )
 {
-       //JSObjectCallAsFunction((*(jsCallbackInfo*)client).Context, (*(jsCallbackInfo*)client).Function, NULL, 0,resources,NULL);
+       jsCallbackInfo* widgetEventCallback = (jsCallbackInfo*)client;
+       assert(((*widgetEventCallback).Context != NULL) && ((*widgetEventCallback).Function != NULL) );
+       JSContextRef ctx = jsGlobalCtx;
+       const JSObjectRef f = widgetEventCallback->Function;
+       
+       if (JSValueIsString(ctx, f)) {
+               JSStringRef     jstrSource = JSValueToStringCopy(ctx, f, NULL);
+               JSEvaluateScript(ctx, jstrSource, NULL, NULL, 1, NULL); 
+               JSStringRelease(jstrSource);
+       }else {
+               JSObjectCallAsFunction(jsGlobalCtx, widgetEventCallback->Function , NULL, 0,NULL,NULL); 
+       }
 }
 #pragma GCC optimization_level reset
 
@@ -399,12 +410,15 @@ static JSObjectRef jsXawWidgetConstructor(JSContextRef ctx, JSObjectRef construc
                        
                        myWidgets[objIDc] = XtVaCreateManagedWidget(widgetName, commandWidgetClass, myWidgets[parentObjectID], XtNlabel, text,  NULL);
                        
-                       /*memmove(timeOutCallback, &((jsCallbackInfo){ctx, arguments[2]}), sizeof(jsCallbackInfo));
+                       jsCallbackInfo* widgetEventCallback = (jsCallbackInfo *)malloc( sizeof(jsCallbackInfo));
+                       if( widgetEventCallback == NULL )//stop if empty pointer for some reason
+                       {
+                               printf( "Memory alloc failed!\n" );
+                               return JSValueToObject(ctx, JSValueMakeNull(ctx), exception); 
+                       }
                        
-                       JSObjectCallAsFunction(ctx, arguments[2], NULL, 0,NULL,NULL); 
-                       tmp = args[0];
-                       XtAppAddTimeOut(app_con, (unsigned long)JSValueToNumber( ctx, args[1], jobjExp), (XtTimerCallbackProc)jsXawAppAddTimeOutCallback,(XtPointer)timeOutCallback);
-                       */
+                       memmove(widgetEventCallback, &((jsCallbackInfo){ctx, arguments[2]}), sizeof(jsCallbackInfo));
+                       XtAddCallback(myWidgets[objIDc], XtNcallback , (XtCallbackProc)xawJsCallbackFunction,(XtPointer)widgetEventCallback);
                        
                        //Construct a class and create object out of it, send it back to JavaScript.
                        widgetObj = JSObjectMake(ctx, JSClassCreate(&classDefinition), NULL);