OSDN Git Service

Change on logic of setTimeout. Debuged.
[localjavascript/localJS-dev.git] / xaw.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "xaw.h"
5
6 //***  Strong suggetion for mac users to overwrite Intrinsic.h  ***
7 //***  Define Boolean as unsigned char  ***
8
9 void functionLoader_Gui(JSGlobalContextRef ctx, JSObjectRef jobjGlobal);
10 XtAppContext app_con;
11 JSContextRef jsGlobalCtx;
12 const XtOrientation xawOrientationDirection[]={XtorientHorizontal, XtorientVertical};
13
14 Widget *myWidgets;
15 int objIDc = 0;
16
17 volatile jsCallbackInfo *myCallBacks;
18
19 unsigned long getColorFromStr(Display *display, char *color){
20         Colormap cmap;
21         XColor c0,c1;
22         cmap = DefaultColormap(display,0);
23         XAllocNamedColor(display,cmap,color,&c1,&c0);
24         return c1.pixel;
25 }
26
27 void backgroundColorChanged(Widget w,char*colorStr){
28         Pixel  pixel=getColorFromStr(XtDisplay(w),colorStr);
29         XtVaSetValues(w, XtNbackground,pixel, NULL );
30 }
31
32
33
34 /* コールバック関数 */
35 #pragma GCC optimization_level 0
36 void xawJsCallbackFunction( Widget w, XtPointer client, XtPointer called )
37 {
38         //JSObjectCallAsFunction((*(jsCallbackInfo*)client).Context, (*(jsCallbackInfo*)client).Function, NULL, 0,resources,NULL);
39 }
40 #pragma GCC optimization_level reset
41
42 static JSValueRef jsXawWindowGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
43 {
44         JSValueRef result = NULL;
45         //printf("Get:");
46         size_t          len     = JSStringGetMaximumUTF8CStringSize(propertyName);
47         char* pname   =  (char*)malloc(len);
48         
49         JSStringGetUTF8CString(propertyName, pname, len);
50         //printf("%s\n",pname);
51         
52         if (!strcmp(pname, "test")) {
53                 result = JSValueMakeNumber(ctx, 1.23);
54         }
55         
56         free(pname);
57         return result;
58 }
59 static bool jsXawWindowSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef jsPropertyName, JSValueRef value, JSValueRef* exception)
60 {
61         printf("Set\n");
62         bool setSuccess = FALSE;
63         size_t          len     = JSStringGetMaximumUTF8CStringSize(jsPropertyName);
64         char*           propertyName   =  (char*)malloc(len);
65         JSStringGetUTF8CString(jsPropertyName, propertyName, len);
66         
67         
68         if(!strcmp( propertyName, "direction" ))
69         {
70                 setSuccess = TRUE;
71         }
72         
73         
74         
75         free(propertyName);
76         return setSuccess;
77 }
78
79 static JSValueRef jsXawWindowShow(
80                                                                   JSContextRef        ctx,
81                                                                   JSObjectRef         jobj,
82                                                                   JSObjectRef         jobjThis,
83                                                                   size_t              argLen,
84                                                                   const JSObjectRef   args[],
85                                                                   JSValueRef*         jobjExp)
86 {
87         jsGlobalCtx = ctx;
88         
89         const int parentObjectID = (int)JSObjectGetPrivate(jobjThis); 
90         
91         XtRealizeWidget( myWidgets[parentObjectID] );
92         XtAppMainLoop( app_con );
93         
94     // undefined を作って返す
95     return JSValueMakeUndefined(ctx);
96 }
97
98 static JSObjectRef jsXawWindowConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
99 {
100         myWidgets = (Widget *)realloc( (void*)myWidgets, sizeof(Widget)*(objIDc+1) );
101         if( myWidgets == NULL )//ポインタが空っぽだったら実行停止。
102         {
103                 printf( "Memory alloc failed!\n" );
104                 exit( 1 );
105         }
106         
107         
108         /********************************************************************************\
109          Create a whole new class definition for to create new window object with get-set. 
110          \********************************************************************************/
111         
112         JSClassDefinition classDefinition       = kJSClassDefinitionEmpty;
113         classDefinition.className = "Window";
114         classDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
115         classDefinition.getProperty = (JSObjectGetPropertyCallback)jsXawWindowGetProperty;
116         classDefinition.setProperty = (JSObjectSetPropertyCallback)jsXawWindowSetProperty;
117         
118         /********************************************************************************\
119          Call XAW to put xwindow instance up.
120          var mywindow = new xawWindow("form", 0);
121          \********************************************************************************/
122         
123         char* windowName = "Untitled Window";
124         double windowDirection = 0;
125         
126         if (argumentCount) {
127         JSStringRef     jstrArg = JSValueToStringCopy(ctx, arguments[0], exception);
128         size_t          len     = JSStringGetMaximumUTF8CStringSize(jstrArg);
129         windowName   =  (char*)malloc(len);
130                 
131         JSStringGetUTF8CString(jstrArg, windowName, len);
132         JSStringRelease(jstrArg);
133     }
134         
135         myWidgets[objIDc] = XtVaAppInitialize( &app_con, windowName, NULL, 0, &g_argc, g_argv, NULL, NULL);
136         
137         //Construct a class and create object out of it
138         JSObjectRef windowObj = JSObjectMake(ctx, JSClassCreate(&classDefinition), NULL);
139         functionWrapper(ctx, constructor, "Show", (JSObjectCallAsFunctionCallback)jsXawWindowShow);
140         JSObjectSetPrivate(windowObj, (void*)objIDc);
141         
142         
143         objIDc++;
144         return windowObj;  
145         
146 }
147
148 static JSValueRef jsXawFormGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
149 {
150         printf("Get:");
151         size_t          len     = JSStringGetMaximumUTF8CStringSize(propertyName);
152         char* pname   =  (char*)malloc(len);
153         
154         JSStringGetUTF8CString(propertyName, pname, len);
155         printf("%s\n",pname);
156         free(pname);
157         return JSValueMakeNumber(ctx, 1.23);
158 }
159 static bool jsXawFormSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef jsPropertyName, JSValueRef value, JSValueRef* exception)
160 {
161         printf("Set\n");
162         bool setSuccess = FALSE;
163         size_t          len     = JSStringGetMaximumUTF8CStringSize(jsPropertyName);
164         char*           propertyName   =  (char*)malloc(len);
165         JSStringGetUTF8CString(jsPropertyName, propertyName, len);
166         
167         
168         if(!strcmp( propertyName, "direction" ))
169         {
170                 setSuccess = TRUE;
171         }
172         
173         
174         free(propertyName);
175         return setSuccess;
176 }
177 static JSObjectRef jsXawFormConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
178 {
179         const int parentObjectID = (int)JSObjectGetPrivate(JSValueToObject(ctx,arguments[0],exception)); 
180         //myWidgets[parentObjectID] is the way of access of parental Widget of the Widget this function is about to create 
181         //printf("recieved:%d\n", parentObjectID);
182         //printf("FormConstructor: arg count = %d\n", argumentCount);
183         
184         //Add heap area to accomodate a new Widget
185         myWidgets = (Widget *)realloc( (void*)myWidgets, sizeof(Widget)*(objIDc+1) );
186         if( myWidgets == NULL )//stop if empty pointer for some reason
187         {
188                 printf( "Memory alloc failed!\n" );
189                 return JSValueToObject(ctx, JSValueMakeNull(ctx), exception); 
190         }
191         
192         /********************************************************************************\
193          Create a whole new class definition for to create new window object with get-set. 
194          \********************************************************************************/
195         
196         JSClassDefinition classDefinition       = kJSClassDefinitionEmpty;
197         classDefinition.className = "Form";
198         classDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
199         classDefinition.getProperty = (JSObjectGetPropertyCallback)jsXawFormGetProperty;
200         classDefinition.setProperty = (JSObjectSetPropertyCallback)jsXawFormSetProperty;
201         
202         
203         /********************************************************************************\
204          Call XAW to put xwindow instance up.
205          var form = new xawForm(mywindow, "form", 0);
206          \********************************************************************************/
207         
208         
209         char* formName = "Untitled form";
210         double formDirection = 0;
211         
212         
213         if (argumentCount >= 2) {
214         JSStringRef     jstrArg = JSValueToStringCopy(ctx, arguments[1], exception);
215         size_t          len     = JSStringGetMaximumUTF8CStringSize(jstrArg);
216         formName   =  (char*)malloc(len);
217                 
218         JSStringGetUTF8CString(jstrArg, formName, len);
219         JSStringRelease(jstrArg);
220     }
221         
222         XtOrientation o = XtorientVertical;
223         if (argumentCount == 3) {
224                 formDirection = JSValueToNumber(ctx, arguments[2], exception);
225                 o = (formDirection==0)?XtorientVertical:XtorientHorizontal;
226         }
227         
228         myWidgets[objIDc] = XtVaCreateManagedWidget(formName, formWidgetClass, myWidgets[parentObjectID], XtNorientation, o, NULL);
229         
230         //Construct a class and create object out of it, send it back to JavaScript.
231         JSObjectRef formObj = JSObjectMake(ctx, JSClassCreate(&classDefinition), NULL);
232         JSObjectSetPrivate(formObj, (void*)objIDc);
233         
234         
235         objIDc++;
236         return formObj;
237 }
238
239 static JSValueRef jsXawLabelGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef jsPropertyName, JSValueRef* exception)
240 {
241         int objectID = (int)JSObjectGetPrivate(object);
242         
243         JSValueRef result = JSValueMakeUndefined(ctx);
244         
245         size_t          len     = JSStringGetMaximumUTF8CStringSize(jsPropertyName);
246         char* propertyName   =  (char*)malloc(len);
247         
248         JSStringGetUTF8CString(jsPropertyName, propertyName, len);
249
250         if(!strcmp( propertyName, "Text" ))
251         {
252                 char *str;
253                 Arg args[1];
254                 XtSetArg(args[0],XtNlabel,(XtArgVal)&str);
255                 XtGetValues(myWidgets[objectID],args,1);
256                 JSStringRef mystring = JSStringCreateWithUTF8CString(str);
257                 result = JSValueMakeString(ctx, mystring);
258                 free(str);
259         }
260         
261         
262         free(propertyName);
263         return result;
264 }
265 static bool jsXawLabelSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef jsPropertyName, JSValueRef value, JSValueRef* exception)
266 {
267         int objectID = (int)JSObjectGetPrivate(object);
268         //printf("jsXawWidget[%d].Set.", objectID );
269         bool setSuccess = FALSE;
270         size_t          len     = JSStringGetMaximumUTF8CStringSize(jsPropertyName);
271         char*           propertyName   =  (char*)malloc(len);
272         JSStringGetUTF8CString(jsPropertyName, propertyName, len);
273         
274         
275         
276         
277         
278         if(!strcmp( propertyName, "direction" ))
279         {
280                 setSuccess = TRUE;
281         }else if(!strcmp( propertyName, "Text" ))
282         {
283                 JSStringRef strOfSetValueTo = JSValueToStringCopy(ctx, value, *exception);
284                 len     = JSStringGetMaximumUTF8CStringSize(strOfSetValueTo);
285                 char*           strOfSetTo   =  (char*)malloc(len);
286                 JSStringGetUTF8CString(strOfSetValueTo, strOfSetTo, len);
287                 
288                 Arg args[1];
289                 XtSetArg(args[0],XtNlabel,(XtArgVal)strOfSetTo);
290                 XtSetValues(myWidgets[objectID],args,1);
291                 //XClearArea(XtDisplay(myWidgets[objectID]), XtWindow(myWidgets[objectID]), 0, 0, 0, 0, True);//NG. BadWindow
292                 setSuccess = TRUE;
293         }else if((!strcmp( propertyName, "Left" )) && (JSValueIsNumber(ctx, value)))
294         {
295                 Arg args[1];
296                 XtSetArg(args[0],XtNhorizDistance,(XtArgVal)((int)JSValueToNumber(ctx, value, *exception)));
297                 XtSetValues(myWidgets[objectID],args,1);
298                 setSuccess = TRUE;
299         }else if((!strcmp( propertyName, "Top" )) && (JSValueIsNumber(ctx, value)))
300         {
301                 Arg args[1];
302                 XtSetArg(args[0],XtNvertDistance,(XtArgVal)((int)JSValueToNumber(ctx, value, *exception)));
303                 XtSetValues(myWidgets[objectID],args,1);
304                 setSuccess = TRUE;
305         }else if(!strcmp( propertyName, "Location" ))
306         {//Yet to be done
307                 setSuccess = TRUE;
308         }
309         
310         
311         free(propertyName);
312         return setSuccess;
313 }
314 static JSObjectRef jsXawWidgetConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
315 {
316         const int parentObjectID = (int)JSObjectGetPrivate(JSValueToObject(ctx,arguments[0],exception)); 
317         //myWidgets[parentObjectID] is the way of access of parental Widget of the Widget this function is about to create 
318         //printf("recieved:%d\n", parentObjectID);
319         //printf("WidgetConstructor: arg count = %d\n", argumentCount);
320         
321         //Add heap area to accomodate a new Widget
322         myWidgets = (Widget *)realloc( (void*)myWidgets, sizeof(Widget)*(objIDc+1) );
323         if( myWidgets == NULL )//stop if empty pointer for some reason
324         {
325                 printf( "Memory alloc failed!\n" );
326                 return JSValueToObject(ctx, JSValueMakeNull(ctx), exception); 
327         }
328         
329         if (argumentCount >= 2)
330         {
331                 char widgetName[8]={'W','i','d','g','e','t','_',(char)objIDc+48};
332                 printf("Untitled Widget%d on %d. Initializing...\n", objIDc, parentObjectID);
333                 double widgetDirection = 0;
334                 
335                 /********************************************************************************\
336                  Create a whole new class definition for to create new window object with get-set. 
337                  \********************************************************************************/
338                 
339                 JSClassDefinition classDefinition       = kJSClassDefinitionEmpty;
340                 classDefinition.className = "Widget";
341                 classDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
342                 JSObjectRef widgetObj = NULL;
343                 
344                 /********************************************************************************\
345                  Determine what kind of widget is required to be made 
346                  \********************************************************************************/
347                 
348                 if((argumentCount == 2) && JSValueIsString(ctx, arguments[1]))
349                 {//Label
350                         printf("Label selected for widget %d on %d.\n", objIDc,parentObjectID);
351                         
352                         
353                         classDefinition.getProperty = (JSObjectGetPropertyCallback)jsXawLabelGetProperty;
354                         classDefinition.setProperty = (JSObjectSetPropertyCallback)jsXawLabelSetProperty;
355                         
356                         /********************************************************************************\
357                          Call XAW to put xwindow instance up.
358                          var Widget = new xawWidget(mywindow, "Widget", 0);
359                          \********************************************************************************/
360                         
361                         
362                         JSStringRef     jstrArg = JSValueToStringCopy(ctx, arguments[1], exception);
363                         size_t          len     = JSStringGetMaximumUTF8CStringSize(jstrArg);
364                         char* text   =  (char*)malloc(len);
365                         
366                         JSStringGetUTF8CString(jstrArg, text, len);
367                         JSStringRelease(jstrArg);
368                         
369                         
370                         myWidgets[objIDc] = XtVaCreateManagedWidget(widgetName, labelWidgetClass, myWidgets[parentObjectID], XtNlabel, text, NULL);
371                         
372                         //Construct a class and create object out of it, send it back to JavaScript.
373                         widgetObj = JSObjectMake(ctx, JSClassCreate(&classDefinition), NULL);
374                         JSObjectSetPrivate(widgetObj, (void*)objIDc);
375                         free(text);
376                         text = NULL;
377                         
378                 }else if((argumentCount == 3) && JSValueIsString(ctx, arguments[1]))
379                 {//Button
380                         printf("Button selected for widget %d on %d.\n", objIDc,parentObjectID);
381                         
382                         
383                         classDefinition.getProperty = (JSObjectGetPropertyCallback)jsXawLabelGetProperty;
384                         classDefinition.setProperty = (JSObjectSetPropertyCallback)jsXawLabelSetProperty;
385                         
386                         /********************************************************************************\
387                          Call XAW to put xwindow instance up.
388                          var Widget = new xawWidget(mywindow, "Widget", 0);
389                          \********************************************************************************/
390                         
391                         
392                         JSStringRef     jstrArg = JSValueToStringCopy(ctx, arguments[1], exception);
393                         size_t          len     = JSStringGetMaximumUTF8CStringSize(jstrArg);
394                         char* text   =  (char*)malloc(len);
395                         
396                         JSStringGetUTF8CString(jstrArg, text, len);
397                         JSStringRelease(jstrArg);
398                         
399                         
400                         myWidgets[objIDc] = XtVaCreateManagedWidget(widgetName, commandWidgetClass, myWidgets[parentObjectID], XtNlabel, text,  NULL);
401                         
402                         /*memmove(timeOutCallback, &((jsCallbackInfo){ctx, arguments[2]}), sizeof(jsCallbackInfo));
403                         
404                         JSObjectCallAsFunction(ctx, arguments[2], NULL, 0,NULL,NULL); 
405                         tmp = args[0];
406                         XtAppAddTimeOut(app_con, (unsigned long)JSValueToNumber( ctx, args[1], jobjExp), (XtTimerCallbackProc)jsXawAppAddTimeOutCallback,(XtPointer)timeOutCallback);
407                         */
408                         
409                         //Construct a class and create object out of it, send it back to JavaScript.
410                         widgetObj = JSObjectMake(ctx, JSClassCreate(&classDefinition), NULL);
411                         JSObjectSetPrivate(widgetObj, (void*)objIDc);
412                         free(text);
413                         text = NULL;
414                         
415                 }else {
416                         printf("Nothing selected for widget %d on %d.\n", objIDc,parentObjectID);
417                 }
418                 
419                 
420                 
421                 
422                 //XtAddCallback( myWidgets[objIDc], XtNcallback, xawJsCallbackFunction, callinfo );
423                 
424                 objIDc++;
425                 return widgetObj;
426         }
427         return NULL;
428 }
429 #pragma GCC optimization_level 0
430 void jsXawAppAddTimeOutCallback(XtPointer client)
431 {
432         jsCallbackInfo* timeOutCallback = (jsCallbackInfo*)client;
433         assert(((*timeOutCallback).Context != NULL) && ((*timeOutCallback).Function != NULL) );
434         //printf("timeout.\n");
435         JSContextRef ctx = jsGlobalCtx;//timeOutCallback->Context does not work.
436         const JSObjectRef f = timeOutCallback->Function;
437         
438         if (JSValueIsString(ctx, f)) {
439                 JSStringRef     jstrSource = JSValueToStringCopy(ctx, f, NULL);
440                 JSEvaluateScript(ctx, jstrSource, NULL, NULL, 1, NULL); 
441                 JSStringRelease(jstrSource);
442         }else {
443                 JSObjectCallAsFunction(jsGlobalCtx, timeOutCallback->Function , NULL, 0,NULL,NULL); 
444         }
445         
446         free(timeOutCallback);
447         timeOutCallback = NULL;
448         
449 }
450 #pragma GCC optimization_level reset
451
452 static JSValueRef jsXawAppAddTimeOut(
453                                                                          JSContextRef        ctx,
454                                                                          JSObjectRef         jobj,
455                                                                          JSObjectRef         jobjThis,
456                                                                          size_t              argLen,
457                                                                          const JSObjectRef   args[],
458                                                                          JSValueRef*         jobjExp)
459 {
460         if ( argLen == 2 && JSValueIsNumber(ctx,args[1]) ) {
461                 jsCallbackInfo* timeOutCallback = (jsCallbackInfo *)malloc( sizeof(jsCallbackInfo));
462                 if( timeOutCallback == NULL )//stop if empty pointer for some reason
463                 {
464                         printf( "Memory alloc failed!\n" );
465                         return JSValueToObject(ctx, JSValueMakeNull(ctx), jobjExp); 
466                 }
467                 
468                 memmove(timeOutCallback, &((jsCallbackInfo){ctx, args[0]}), sizeof(jsCallbackInfo));
469                 XtAppAddTimeOut(app_con, (unsigned long)JSValueToNumber( ctx, args[1], jobjExp), (XtTimerCallbackProc)jsXawAppAddTimeOutCallback,(XtPointer)timeOutCallback);
470     }
471         
472     return JSValueMakeUndefined(ctx);
473 }
474
475
476 void functionLoader_Gui(JSGlobalContextRef ctx, JSObjectRef jobjGlobal)
477 {
478         assert(sizeof( ( (void*)1 ) )  >=  sizeof( (int)1 ) );
479         JSObjectRef Window, Form;
480         classWrapper(ctx, jobjGlobal, "xawWindow", &Window, jsXawWindowConstructor);\
481         classWrapper(ctx, jobjGlobal, "xawForm", &Form, jsXawFormConstructor);
482         classWrapper(ctx, jobjGlobal, "xawWidget", &Form, jsXawWidgetConstructor);
483         
484         functionWrapper(ctx, jobjGlobal, "setTimeout", (JSObjectCallAsFunctionCallback)jsXawAppAddTimeOut);
485         
486 }