mirror of https://github.com/mode777/rayjs.git
				
				
				
			Support out-parameter for strings
This commit is contained in:
		
							parent
							
								
									5c2cb695e1
								
							
						
					
					
						commit
						7e0c04020e
					
				|  | @ -501,14 +501,17 @@ function main(){ | ||||||
|         const param = fun!.params![index] |         const param = fun!.params![index] | ||||||
|         param.binding = {  |         param.binding = {  | ||||||
|             jsType: `{ ${param.name}: number }`, |             jsType: `{ ${param.name}: number }`, | ||||||
|             customConverter: gen => { |             customConverter: (gen,src) => { | ||||||
|  |                 gen.declare(param.name, param.type, false, "NULL"); | ||||||
|                 gen.declare(param.name+"_out", param.type.replace(" *","")) |                 gen.declare(param.name+"_out", param.type.replace(" *","")) | ||||||
|                 gen.declare(param.name, param.type, false, "&"+param.name+"_out") |                 const body = gen.if("!JS_IsNull("+src+")") | ||||||
|                 gen.call("JS_GetPropertyStr", ["ctx","argv["+index+"]", '"'+param.name+'"'], { name: param.name+"_js", type: "JSValue" }) |                 body.statement(param.name + " = &" + param.name + "_out") | ||||||
|                 gen.call("JS_ToInt32", ["ctx",param.name,param.name+"_js"]) |                 body.call("JS_GetPropertyStr", ["ctx",src, '"'+param.name+'"'], { name: param.name+"_js", type: "JSValue" }) | ||||||
|  |                 body.call("JS_ToInt32", ["ctx",param.name,param.name+"_js"]) | ||||||
|             }, |             }, | ||||||
|             customCleanup: gen => { |             customCleanup: (gen,src) => { | ||||||
|                 gen.call("JS_SetPropertyStr", ["ctx", "argv["+index+"]", `"${param.name}"`, "JS_NewInt32(ctx,"+param.name+"_out)"]) |                 const body = gen.if("!JS_IsNull("+src+")") | ||||||
|  |                 body.call("JS_SetPropertyStr", ["ctx", src, `"${param.name}"`, "JS_NewInt32(ctx,"+param.name+"_out)"]) | ||||||
|             }  |             }  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -518,8 +521,8 @@ function main(){ | ||||||
|         const param = fun!.params![index] |         const param = fun!.params![index] | ||||||
|         param.binding = {  |         param.binding = {  | ||||||
|             jsType: `{ ${param.name}: string }`, |             jsType: `{ ${param.name}: string }`, | ||||||
|             customConverter: gen => { |             customConverter: (gen,src) => { | ||||||
|                 gen.call("JS_GetPropertyStr", ["ctx","argv["+index+"]", '"'+param.name+'"'], { name: param.name+"_js", type: "JSValue" }) |                 gen.call("JS_GetPropertyStr", ["ctx",src, '"'+param.name+'"'], { name: param.name+"_js", type: "JSValue" }) | ||||||
|                 gen.declare(param.name+"_len", "size_t"); |                 gen.declare(param.name+"_len", "size_t"); | ||||||
|                 gen.call("JS_ToCStringLen",["ctx", "&"+param.name+"_len", param.name+"_js"], { name: param.name+"_val", type: "const char *" }) |                 gen.call("JS_ToCStringLen",["ctx", "&"+param.name+"_len", param.name+"_js"], { name: param.name+"_val", type: "const char *" }) | ||||||
|                 gen.call("memcpy", ["(void *)textbuffer", param.name+"_val", param.name+"_len"]) |                 gen.call("memcpy", ["(void *)textbuffer", param.name+"_val", param.name+"_len"]) | ||||||
|  | @ -527,9 +530,9 @@ function main(){ | ||||||
|                 gen.declare(param.name, param.type, false, "textbuffer"); |                 gen.declare(param.name, param.type, false, "textbuffer"); | ||||||
|                 gen.declare(lenParam.name, lenParam.type, false, "4096") |                 gen.declare(lenParam.name, lenParam.type, false, "4096") | ||||||
|             }, |             }, | ||||||
|             customCleanup: gen => { |             customCleanup: (gen, src) => { | ||||||
|                 gen.jsCleanUpParameter("const char *", param.name + "_val") |                 gen.jsCleanUpParameter("const char *", param.name + "_val") | ||||||
|                 gen.call("JS_SetPropertyStr", ["ctx", "argv["+index+"]", `"${param.name}"`, "JS_NewString(ctx,"+param.name+")"]) |                 gen.call("JS_SetPropertyStr", ["ctx", src, `"${param.name}"`, "JS_NewString(ctx,"+param.name+")"]) | ||||||
|             }  |             }  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -544,7 +547,10 @@ function main(){ | ||||||
|     ignore("GuiListViewEx") |     ignore("GuiListViewEx") | ||||||
|     setOutParamString(getFunction(api.functions, "GuiTextBox")!, 1,2) |     setOutParamString(getFunction(api.functions, "GuiTextBox")!, 1,2) | ||||||
|     //ignore("GuiTextBox")
 |     //ignore("GuiTextBox")
 | ||||||
|     ignore("GuiTextInputBox") |     const gtib = getFunction(api.functions, "GuiTextInputBox")! | ||||||
|  |     setOutParamString(gtib,4,5) | ||||||
|  |     setOutParam(gtib, 6) | ||||||
|  |      | ||||||
|     //setOutParam(getFunction(api.functions, "GuiTextInputBox")!, 6)
 |     //setOutParam(getFunction(api.functions, "GuiTextInputBox")!, 6)
 | ||||||
|     ignore("GuiTabBar") |     ignore("GuiTabBar") | ||||||
|     ignore("GuiGetIcons") |     ignore("GuiGetIcons") | ||||||
|  |  | ||||||
|  | @ -21,8 +21,8 @@ export interface FuncBindingOptions { | ||||||
| 
 | 
 | ||||||
| export interface ParamBindingOptions { | export interface ParamBindingOptions { | ||||||
|     ignore?: boolean, |     ignore?: boolean, | ||||||
|     customConverter?: (gen: QuickJsGenerator) => void, |     customConverter?: (gen: QuickJsGenerator, src: string) => void, | ||||||
|     customCleanup?: (gen: QuickJsGenerator) => void, |     customCleanup?: (gen: QuickJsGenerator, src: string) => void, | ||||||
|     jsType?: string, |     jsType?: string, | ||||||
|     typeAlias?: string |     typeAlias?: string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -31,18 +31,20 @@ export class RayLibHeader extends QuickJsHeader { | ||||||
|             if(options.before) options.before(fun) |             if(options.before) options.before(fun) | ||||||
|             // read parameters
 |             // read parameters
 | ||||||
|             api.params = api.params || [] |             api.params = api.params || [] | ||||||
|             for (let i = 0; i < api.params.length; i++) { |             const activeParams = api.params.filter(x => !x.binding?.ignore) | ||||||
|                 if(api.params[i]?.binding?.ignore) continue; |              | ||||||
|                 const para = api.params[i] |             for (let i = 0; i < activeParams.length; i++) { | ||||||
|                 if(para.binding?.customConverter) para.binding.customConverter(fun) |                 const para = activeParams[i] | ||||||
|  |                 if(para.binding?.customConverter) para.binding.customConverter(fun, "argv["+i+"]") | ||||||
|                 else fun.jsToC(para.type,para.name,"argv["+i+"]", this.structLookup, false, para.binding?.typeAlias) |                 else fun.jsToC(para.type,para.name,"argv["+i+"]", this.structLookup, false, para.binding?.typeAlias) | ||||||
|             } |             } | ||||||
|             // call c function
 |             // call c function
 | ||||||
|             if(options.customizeCall) fun.line(options.customizeCall) |             if(options.customizeCall) fun.line(options.customizeCall) | ||||||
|             else fun.call(api.name, api.params.map(x => x.name), api.returnType === "void" ? null : {type: api.returnType, name: "returnVal"}) |             else fun.call(api.name, api.params.map(x => x.name), api.returnType === "void" ? null : {type: api.returnType, name: "returnVal"}) | ||||||
|             // clean up parameters
 |             // clean up parameters
 | ||||||
|             for (const param of api.params) { |             for (let i = 0; i < activeParams.length; i++) { | ||||||
|                 if(param.binding?.customCleanup) param.binding.customCleanup(fun) |                 const param = activeParams[i] | ||||||
|  |                 if(param.binding?.customCleanup) param.binding.customCleanup(fun, "argv["+i+"]") | ||||||
|                 else fun.jsCleanUpParameter(param.type, param.name) |                 else fun.jsCleanUpParameter(param.type, param.name) | ||||||
|             } |             } | ||||||
|             // return result
 |             // return result
 | ||||||
|  |  | ||||||
|  | @ -1502,6 +1502,8 @@ declare function guiGrid(bounds: Rectangle, text: string, spacing: number, subdi | ||||||
| declare function guiListView(bounds: Rectangle, text: string, scrollIndex: { scrollIndex: number }, active: number): number; | declare function guiListView(bounds: Rectangle, text: string, scrollIndex: { scrollIndex: number }, active: number): number; | ||||||
| /** Message Box control, displays a message */ | /** Message Box control, displays a message */ | ||||||
| declare function guiMessageBox(bounds: Rectangle, title: string, message: string, buttons: string): number; | declare function guiMessageBox(bounds: Rectangle, title: string, message: string, buttons: string): number; | ||||||
|  | /** Text Input Box control, ask for text, supports secret */ | ||||||
|  | declare function guiTextInputBox(bounds: Rectangle, title: string, message: string, buttons: string, text: { text: string }, secretViewActive: { secretViewActive: number }): number; | ||||||
| /** Color Picker control (multiple color controls) */ | /** Color Picker control (multiple color controls) */ | ||||||
| declare function guiColorPicker(bounds: Rectangle, text: string, color: Color): Color; | declare function guiColorPicker(bounds: Rectangle, text: string, color: Color): Color; | ||||||
| /** Color Panel control */ | /** Color Panel control */ | ||||||
|  |  | ||||||
|  | @ -57,7 +57,7 @@ let viewScroll = new Vector2(0,0); | ||||||
| let exitWindow = false; | let exitWindow = false; | ||||||
| let showMessageBox = false; | let showMessageBox = false; | ||||||
| 
 | 
 | ||||||
| let textInput = ""; | let textInput = { text: "" };  | ||||||
| let showTextInputBox = false; | let showTextInputBox = false; | ||||||
| 
 | 
 | ||||||
| let textInputFileName = ""; | let textInputFileName = ""; | ||||||
|  | @ -105,7 +105,7 @@ while (!exitWindow)    // Detect window close button or ESC key | ||||||
|         if (guiSpinner(new Rectangle(25, 135, 125, 30), null, spinner001Value, 0, 100, spinnerEditMode)) spinnerEditMode = !spinnerEditMode; |         if (guiSpinner(new Rectangle(25, 135, 125, 30), null, spinner001Value, 0, 100, spinnerEditMode)) spinnerEditMode = !spinnerEditMode; | ||||||
|         if (guiValueBox(new Rectangle(25, 175, 125, 30), null, valueBox002Value, 0, 100, valueBoxEditMode)) valueBoxEditMode = !valueBoxEditMode; |         if (guiValueBox(new Rectangle(25, 175, 125, 30), null, valueBox002Value, 0, 100, valueBoxEditMode)) valueBoxEditMode = !valueBoxEditMode; | ||||||
|         guiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); |         guiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); | ||||||
|         if (guiTextBox(new Rectangle(25, 215, 125, 30), textBoxText, 64, textBoxEditMode)) textBoxEditMode = !textBoxEditMode; |         if (guiTextBox(new Rectangle(25, 215, 125, 30), textBoxText, textBoxEditMode)) textBoxEditMode = !textBoxEditMode; | ||||||
| 
 | 
 | ||||||
|         guiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); |         guiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); | ||||||
| 
 | 
 | ||||||
|  | @ -162,24 +162,23 @@ while (!exitWindow)    // Detect window close button or ESC key | ||||||
|             else if (result == 1) exitWindow = true; |             else if (result == 1) exitWindow = true; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // if (showTextInputBox)
 |         if (showTextInputBox) | ||||||
|         // {
 |         { | ||||||
|         //     drawRectangle(0, 0, getScreenWidth(), getScreenHeight(), fade(RAYWHITE, 0.8));
 |             drawRectangle(0, 0, getScreenWidth(), getScreenHeight(), fade(RAYWHITE, 0.8)); | ||||||
|         //     let result = guiTextInputBox(new Rectangle(getScreenWidth()/2 - 120, getScreenHeight()/2 - 60, 240, 140), "Save", guiIconText(ICON_FILE_SAVE, "Save file as..."), "Ok;Cancel", textInput, 255, null);
 |             let result = guiTextInputBox(new Rectangle(getScreenWidth()/2 - 120, getScreenHeight()/2 - 60, 240, 140), "Save", guiIconText(ICON_FILE_SAVE, "Save file as..."), "Ok;Cancel", textInput, null); | ||||||
| 
 | 
 | ||||||
|         //     if (result == 1)
 |             if (result == 1) | ||||||
|         //     {
 |             { | ||||||
|         //         // TODO: Validate textInput value and save
 |                 // TODO: Validate textInput value and save
 | ||||||
|  |                 textInputFileName = textInput.text | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|         //         strcpy(textInputFileName, textInput);
 |             if ((result == 0) || (result == 1) || (result == 2)) | ||||||
|         //     }
 |             { | ||||||
| 
 |                 showTextInputBox = false; | ||||||
|         //     if ((result == 0) || (result == 1) || (result == 2))
 |                 textInput.text = "" | ||||||
|         //     {
 |             } | ||||||
|         //         showTextInputBox = false;
 |         } | ||||||
|         //         strcpy(textInput, "\0");
 |  | ||||||
|         //     }
 |  | ||||||
|         // }
 |  | ||||||
|         //----------------------------------------------------------------------------------
 |         //----------------------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
|     endDrawing(); |     endDrawing(); | ||||||
|  |  | ||||||
|  | @ -660,12 +660,11 @@ class RayLibHeader extends quickjs_1.QuickJsHeader { | ||||||
|                 options.before(fun); |                 options.before(fun); | ||||||
|             // read parameters
 |             // read parameters
 | ||||||
|             api.params = api.params || []; |             api.params = api.params || []; | ||||||
|             for (let i = 0; i < api.params.length; i++) { |             const activeParams = api.params.filter(x => !x.binding?.ignore); | ||||||
|                 if (api.params[i]?.binding?.ignore) |             for (let i = 0; i < activeParams.length; i++) { | ||||||
|                     continue; |                 const para = activeParams[i]; | ||||||
|                 const para = api.params[i]; |  | ||||||
|                 if (para.binding?.customConverter) |                 if (para.binding?.customConverter) | ||||||
|                     para.binding.customConverter(fun); |                     para.binding.customConverter(fun, "argv[" + i + "]"); | ||||||
|                 else |                 else | ||||||
|                     fun.jsToC(para.type, para.name, "argv[" + i + "]", this.structLookup, false, para.binding?.typeAlias); |                     fun.jsToC(para.type, para.name, "argv[" + i + "]", this.structLookup, false, para.binding?.typeAlias); | ||||||
|             } |             } | ||||||
|  | @ -675,9 +674,10 @@ class RayLibHeader extends quickjs_1.QuickJsHeader { | ||||||
|             else |             else | ||||||
|                 fun.call(api.name, api.params.map(x => x.name), api.returnType === "void" ? null : { type: api.returnType, name: "returnVal" }); |                 fun.call(api.name, api.params.map(x => x.name), api.returnType === "void" ? null : { type: api.returnType, name: "returnVal" }); | ||||||
|             // clean up parameters
 |             // clean up parameters
 | ||||||
|             for (const param of api.params) { |             for (let i = 0; i < activeParams.length; i++) { | ||||||
|  |                 const param = activeParams[i]; | ||||||
|                 if (param.binding?.customCleanup) |                 if (param.binding?.customCleanup) | ||||||
|                     param.binding.customCleanup(fun); |                     param.binding.customCleanup(fun, "argv[" + i + "]"); | ||||||
|                 else |                 else | ||||||
|                     fun.jsCleanUpParameter(param.type, param.name); |                     fun.jsCleanUpParameter(param.type, param.name); | ||||||
|             } |             } | ||||||
|  | @ -1387,14 +1387,17 @@ function main() { | ||||||
|         const param = fun.params[index]; |         const param = fun.params[index]; | ||||||
|         param.binding = { |         param.binding = { | ||||||
|             jsType: `{ ${param.name}: number }`, |             jsType: `{ ${param.name}: number }`, | ||||||
|             customConverter: gen => { |             customConverter: (gen, src) => { | ||||||
|  |                 gen.declare(param.name, param.type, false, "NULL"); | ||||||
|                 gen.declare(param.name + "_out", param.type.replace(" *", "")); |                 gen.declare(param.name + "_out", param.type.replace(" *", "")); | ||||||
|                 gen.declare(param.name, param.type, false, "&" + param.name + "_out"); |                 const body = gen.if("!JS_IsNull(" + src + ")"); | ||||||
|                 gen.call("JS_GetPropertyStr", ["ctx", "argv[" + index + "]", '"' + param.name + '"'], { name: param.name + "_js", type: "JSValue" }); |                 body.statement(param.name + " = &" + param.name + "_out"); | ||||||
|                 gen.call("JS_ToInt32", ["ctx", param.name, param.name + "_js"]); |                 body.call("JS_GetPropertyStr", ["ctx", src, '"' + param.name + '"'], { name: param.name + "_js", type: "JSValue" }); | ||||||
|  |                 body.call("JS_ToInt32", ["ctx", param.name, param.name + "_js"]); | ||||||
|             }, |             }, | ||||||
|             customCleanup: gen => { |             customCleanup: (gen, src) => { | ||||||
|                 gen.call("JS_SetPropertyStr", ["ctx", "argv[" + index + "]", `"${param.name}"`, "JS_NewInt32(ctx," + param.name + "_out)"]); |                 const body = gen.if("!JS_IsNull(" + src + ")"); | ||||||
|  |                 body.call("JS_SetPropertyStr", ["ctx", src, `"${param.name}"`, "JS_NewInt32(ctx," + param.name + "_out)"]); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|     }; |     }; | ||||||
|  | @ -1404,8 +1407,8 @@ function main() { | ||||||
|         const param = fun.params[index]; |         const param = fun.params[index]; | ||||||
|         param.binding = { |         param.binding = { | ||||||
|             jsType: `{ ${param.name}: string }`, |             jsType: `{ ${param.name}: string }`, | ||||||
|             customConverter: gen => { |             customConverter: (gen, src) => { | ||||||
|                 gen.call("JS_GetPropertyStr", ["ctx", "argv[" + index + "]", '"' + param.name + '"'], { name: param.name + "_js", type: "JSValue" }); |                 gen.call("JS_GetPropertyStr", ["ctx", src, '"' + param.name + '"'], { name: param.name + "_js", type: "JSValue" }); | ||||||
|                 gen.declare(param.name + "_len", "size_t"); |                 gen.declare(param.name + "_len", "size_t"); | ||||||
|                 gen.call("JS_ToCStringLen", ["ctx", "&" + param.name + "_len", param.name + "_js"], { name: param.name + "_val", type: "const char *" }); |                 gen.call("JS_ToCStringLen", ["ctx", "&" + param.name + "_len", param.name + "_js"], { name: param.name + "_val", type: "const char *" }); | ||||||
|                 gen.call("memcpy", ["(void *)textbuffer", param.name + "_val", param.name + "_len"]); |                 gen.call("memcpy", ["(void *)textbuffer", param.name + "_val", param.name + "_len"]); | ||||||
|  | @ -1413,9 +1416,9 @@ function main() { | ||||||
|                 gen.declare(param.name, param.type, false, "textbuffer"); |                 gen.declare(param.name, param.type, false, "textbuffer"); | ||||||
|                 gen.declare(lenParam.name, lenParam.type, false, "4096"); |                 gen.declare(lenParam.name, lenParam.type, false, "4096"); | ||||||
|             }, |             }, | ||||||
|             customCleanup: gen => { |             customCleanup: (gen, src) => { | ||||||
|                 gen.jsCleanUpParameter("const char *", param.name + "_val"); |                 gen.jsCleanUpParameter("const char *", param.name + "_val"); | ||||||
|                 gen.call("JS_SetPropertyStr", ["ctx", "argv[" + index + "]", `"${param.name}"`, "JS_NewString(ctx," + param.name + ")"]); |                 gen.call("JS_SetPropertyStr", ["ctx", src, `"${param.name}"`, "JS_NewString(ctx," + param.name + ")"]); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|     }; |     }; | ||||||
|  | @ -1427,7 +1430,9 @@ function main() { | ||||||
|     ignore("GuiListViewEx"); |     ignore("GuiListViewEx"); | ||||||
|     setOutParamString(getFunction(api.functions, "GuiTextBox"), 1, 2); |     setOutParamString(getFunction(api.functions, "GuiTextBox"), 1, 2); | ||||||
|     //ignore("GuiTextBox")
 |     //ignore("GuiTextBox")
 | ||||||
|     ignore("GuiTextInputBox"); |     const gtib = getFunction(api.functions, "GuiTextInputBox"); | ||||||
|  |     setOutParamString(gtib, 4, 5); | ||||||
|  |     setOutParam(gtib, 6); | ||||||
|     //setOutParam(getFunction(api.functions, "GuiTextInputBox")!, 6)
 |     //setOutParam(getFunction(api.functions, "GuiTextInputBox")!, 6)
 | ||||||
|     ignore("GuiTabBar"); |     ignore("GuiTabBar"); | ||||||
|     ignore("GuiGetIcons"); |     ignore("GuiGetIcons"); | ||||||
|  |  | ||||||
|  | @ -8913,14 +8913,19 @@ static JSValue js_guiDropdownBox(JSContext * ctx, JSValueConst this_val, int arg | ||||||
|     if(bounds_ptr == NULL) return JS_EXCEPTION; |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|     Rectangle bounds = *bounds_ptr; |     Rectangle bounds = *bounds_ptr; | ||||||
|     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); |     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); | ||||||
|  |     int * active = NULL; | ||||||
|     int active_out; |     int active_out; | ||||||
|     int * active = &active_out; |     if(!JS_IsNull(argv[2])) { | ||||||
|     JSValue active_js = JS_GetPropertyStr(ctx, argv[2], "active"); |         active = &active_out; | ||||||
|     JS_ToInt32(ctx, active, active_js); |         JSValue active_js = JS_GetPropertyStr(ctx, argv[2], "active"); | ||||||
|  |         JS_ToInt32(ctx, active, active_js); | ||||||
|  |     } | ||||||
|     bool editMode = JS_ToBool(ctx, argv[3]); |     bool editMode = JS_ToBool(ctx, argv[3]); | ||||||
|     bool returnVal = GuiDropdownBox(bounds, text, active, editMode); |     bool returnVal = GuiDropdownBox(bounds, text, active, editMode); | ||||||
|     JS_FreeCString(ctx, text); |     JS_FreeCString(ctx, text); | ||||||
|     JS_SetPropertyStr(ctx, argv[2], "active", JS_NewInt32(ctx,active_out)); |     if(!JS_IsNull(argv[2])) { | ||||||
|  |         JS_SetPropertyStr(ctx, argv[2], "active", JS_NewInt32(ctx,active_out)); | ||||||
|  |     } | ||||||
|     JSValue ret = JS_NewBool(ctx, returnVal); |     JSValue ret = JS_NewBool(ctx, returnVal); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | @ -8930,10 +8935,13 @@ static JSValue js_guiSpinner(JSContext * ctx, JSValueConst this_val, int argc, J | ||||||
|     if(bounds_ptr == NULL) return JS_EXCEPTION; |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|     Rectangle bounds = *bounds_ptr; |     Rectangle bounds = *bounds_ptr; | ||||||
|     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); |     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); | ||||||
|  |     int * value = NULL; | ||||||
|     int value_out; |     int value_out; | ||||||
|     int * value = &value_out; |     if(!JS_IsNull(argv[2])) { | ||||||
|     JSValue value_js = JS_GetPropertyStr(ctx, argv[2], "value"); |         value = &value_out; | ||||||
|     JS_ToInt32(ctx, value, value_js); |         JSValue value_js = JS_GetPropertyStr(ctx, argv[2], "value"); | ||||||
|  |         JS_ToInt32(ctx, value, value_js); | ||||||
|  |     } | ||||||
|     int minValue; |     int minValue; | ||||||
|     JS_ToInt32(ctx, &minValue, argv[3]); |     JS_ToInt32(ctx, &minValue, argv[3]); | ||||||
|     int maxValue; |     int maxValue; | ||||||
|  | @ -8941,7 +8949,9 @@ static JSValue js_guiSpinner(JSContext * ctx, JSValueConst this_val, int argc, J | ||||||
|     bool editMode = JS_ToBool(ctx, argv[5]); |     bool editMode = JS_ToBool(ctx, argv[5]); | ||||||
|     bool returnVal = GuiSpinner(bounds, text, value, minValue, maxValue, editMode); |     bool returnVal = GuiSpinner(bounds, text, value, minValue, maxValue, editMode); | ||||||
|     JS_FreeCString(ctx, text); |     JS_FreeCString(ctx, text); | ||||||
|     JS_SetPropertyStr(ctx, argv[2], "value", JS_NewInt32(ctx,value_out)); |     if(!JS_IsNull(argv[2])) { | ||||||
|  |         JS_SetPropertyStr(ctx, argv[2], "value", JS_NewInt32(ctx,value_out)); | ||||||
|  |     } | ||||||
|     JSValue ret = JS_NewBool(ctx, returnVal); |     JSValue ret = JS_NewBool(ctx, returnVal); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | @ -8951,10 +8961,13 @@ static JSValue js_guiValueBox(JSContext * ctx, JSValueConst this_val, int argc, | ||||||
|     if(bounds_ptr == NULL) return JS_EXCEPTION; |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|     Rectangle bounds = *bounds_ptr; |     Rectangle bounds = *bounds_ptr; | ||||||
|     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); |     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); | ||||||
|  |     int * value = NULL; | ||||||
|     int value_out; |     int value_out; | ||||||
|     int * value = &value_out; |     if(!JS_IsNull(argv[2])) { | ||||||
|     JSValue value_js = JS_GetPropertyStr(ctx, argv[2], "value"); |         value = &value_out; | ||||||
|     JS_ToInt32(ctx, value, value_js); |         JSValue value_js = JS_GetPropertyStr(ctx, argv[2], "value"); | ||||||
|  |         JS_ToInt32(ctx, value, value_js); | ||||||
|  |     } | ||||||
|     int minValue; |     int minValue; | ||||||
|     JS_ToInt32(ctx, &minValue, argv[3]); |     JS_ToInt32(ctx, &minValue, argv[3]); | ||||||
|     int maxValue; |     int maxValue; | ||||||
|  | @ -8962,7 +8975,9 @@ static JSValue js_guiValueBox(JSContext * ctx, JSValueConst this_val, int argc, | ||||||
|     bool editMode = JS_ToBool(ctx, argv[5]); |     bool editMode = JS_ToBool(ctx, argv[5]); | ||||||
|     bool returnVal = GuiValueBox(bounds, text, value, minValue, maxValue, editMode); |     bool returnVal = GuiValueBox(bounds, text, value, minValue, maxValue, editMode); | ||||||
|     JS_FreeCString(ctx, text); |     JS_FreeCString(ctx, text); | ||||||
|     JS_SetPropertyStr(ctx, argv[2], "value", JS_NewInt32(ctx,value_out)); |     if(!JS_IsNull(argv[2])) { | ||||||
|  |         JS_SetPropertyStr(ctx, argv[2], "value", JS_NewInt32(ctx,value_out)); | ||||||
|  |     } | ||||||
|     JSValue ret = JS_NewBool(ctx, returnVal); |     JSValue ret = JS_NewBool(ctx, returnVal); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | @ -8978,7 +8993,7 @@ static JSValue js_guiTextBox(JSContext * ctx, JSValueConst this_val, int argc, J | ||||||
|     textbuffer[text_len] = 0; |     textbuffer[text_len] = 0; | ||||||
|     char * text = textbuffer; |     char * text = textbuffer; | ||||||
|     int textSize = 4096; |     int textSize = 4096; | ||||||
|     bool editMode = JS_ToBool(ctx, argv[3]); |     bool editMode = JS_ToBool(ctx, argv[2]); | ||||||
|     bool returnVal = GuiTextBox(bounds, text, textSize, editMode); |     bool returnVal = GuiTextBox(bounds, text, textSize, editMode); | ||||||
|     JS_FreeCString(ctx, text_val); |     JS_FreeCString(ctx, text_val); | ||||||
|     JS_SetPropertyStr(ctx, argv[1], "text", JS_NewString(ctx,text)); |     JS_SetPropertyStr(ctx, argv[1], "text", JS_NewString(ctx,text)); | ||||||
|  | @ -9096,15 +9111,20 @@ static JSValue js_guiListView(JSContext * ctx, JSValueConst this_val, int argc, | ||||||
|     if(bounds_ptr == NULL) return JS_EXCEPTION; |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|     Rectangle bounds = *bounds_ptr; |     Rectangle bounds = *bounds_ptr; | ||||||
|     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); |     const char * text = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); | ||||||
|  |     int * scrollIndex = NULL; | ||||||
|     int scrollIndex_out; |     int scrollIndex_out; | ||||||
|     int * scrollIndex = &scrollIndex_out; |     if(!JS_IsNull(argv[2])) { | ||||||
|     JSValue scrollIndex_js = JS_GetPropertyStr(ctx, argv[2], "scrollIndex"); |         scrollIndex = &scrollIndex_out; | ||||||
|     JS_ToInt32(ctx, scrollIndex, scrollIndex_js); |         JSValue scrollIndex_js = JS_GetPropertyStr(ctx, argv[2], "scrollIndex"); | ||||||
|  |         JS_ToInt32(ctx, scrollIndex, scrollIndex_js); | ||||||
|  |     } | ||||||
|     int active; |     int active; | ||||||
|     JS_ToInt32(ctx, &active, argv[3]); |     JS_ToInt32(ctx, &active, argv[3]); | ||||||
|     int returnVal = GuiListView(bounds, text, scrollIndex, active); |     int returnVal = GuiListView(bounds, text, scrollIndex, active); | ||||||
|     JS_FreeCString(ctx, text); |     JS_FreeCString(ctx, text); | ||||||
|     JS_SetPropertyStr(ctx, argv[2], "scrollIndex", JS_NewInt32(ctx,scrollIndex_out)); |     if(!JS_IsNull(argv[2])) { | ||||||
|  |         JS_SetPropertyStr(ctx, argv[2], "scrollIndex", JS_NewInt32(ctx,scrollIndex_out)); | ||||||
|  |     } | ||||||
|     JSValue ret = JS_NewInt32(ctx, returnVal); |     JSValue ret = JS_NewInt32(ctx, returnVal); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | @ -9124,6 +9144,40 @@ static JSValue js_guiMessageBox(JSContext * ctx, JSValueConst this_val, int argc | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static JSValue js_guiTextInputBox(JSContext * ctx, JSValueConst this_val, int argc, JSValueConst * argv) { | ||||||
|  |     Rectangle* bounds_ptr = (Rectangle*)JS_GetOpaque2(ctx, argv[0], js_Rectangle_class_id); | ||||||
|  |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|  |     Rectangle bounds = *bounds_ptr; | ||||||
|  |     const char * title = JS_IsNull(argv[1]) ? NULL : (const char *)JS_ToCString(ctx, argv[1]); | ||||||
|  |     const char * message = JS_IsNull(argv[2]) ? NULL : (const char *)JS_ToCString(ctx, argv[2]); | ||||||
|  |     const char * buttons = JS_IsNull(argv[3]) ? NULL : (const char *)JS_ToCString(ctx, argv[3]); | ||||||
|  |     JSValue text_js = JS_GetPropertyStr(ctx, argv[4], "text"); | ||||||
|  |     size_t text_len; | ||||||
|  |     const char * text_val = JS_ToCStringLen(ctx, &text_len, text_js); | ||||||
|  |     memcpy((void *)textbuffer, text_val, text_len); | ||||||
|  |     textbuffer[text_len] = 0; | ||||||
|  |     char * text = textbuffer; | ||||||
|  |     int textMaxSize = 4096; | ||||||
|  |     int * secretViewActive = NULL; | ||||||
|  |     int secretViewActive_out; | ||||||
|  |     if(!JS_IsNull(argv[5])) { | ||||||
|  |         secretViewActive = &secretViewActive_out; | ||||||
|  |         JSValue secretViewActive_js = JS_GetPropertyStr(ctx, argv[5], "secretViewActive"); | ||||||
|  |         JS_ToInt32(ctx, secretViewActive, secretViewActive_js); | ||||||
|  |     } | ||||||
|  |     int returnVal = GuiTextInputBox(bounds, title, message, buttons, text, textMaxSize, secretViewActive); | ||||||
|  |     JS_FreeCString(ctx, title); | ||||||
|  |     JS_FreeCString(ctx, message); | ||||||
|  |     JS_FreeCString(ctx, buttons); | ||||||
|  |     JS_FreeCString(ctx, text_val); | ||||||
|  |     JS_SetPropertyStr(ctx, argv[4], "text", JS_NewString(ctx,text)); | ||||||
|  |     if(!JS_IsNull(argv[5])) { | ||||||
|  |         JS_SetPropertyStr(ctx, argv[5], "secretViewActive", JS_NewInt32(ctx,secretViewActive_out)); | ||||||
|  |     } | ||||||
|  |     JSValue ret = JS_NewInt32(ctx, returnVal); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static JSValue js_guiColorPicker(JSContext * ctx, JSValueConst this_val, int argc, JSValueConst * argv) { | static JSValue js_guiColorPicker(JSContext * ctx, JSValueConst this_val, int argc, JSValueConst * argv) { | ||||||
|     Rectangle* bounds_ptr = (Rectangle*)JS_GetOpaque2(ctx, argv[0], js_Rectangle_class_id); |     Rectangle* bounds_ptr = (Rectangle*)JS_GetOpaque2(ctx, argv[0], js_Rectangle_class_id); | ||||||
|     if(bounds_ptr == NULL) return JS_EXCEPTION; |     if(bounds_ptr == NULL) return JS_EXCEPTION; | ||||||
|  | @ -10248,6 +10302,7 @@ static const JSCFunctionListEntry js_raylib_core_funcs[] = { | ||||||
|     JS_CFUNC_DEF("guiGrid",4,js_guiGrid), |     JS_CFUNC_DEF("guiGrid",4,js_guiGrid), | ||||||
|     JS_CFUNC_DEF("guiListView",4,js_guiListView), |     JS_CFUNC_DEF("guiListView",4,js_guiListView), | ||||||
|     JS_CFUNC_DEF("guiMessageBox",4,js_guiMessageBox), |     JS_CFUNC_DEF("guiMessageBox",4,js_guiMessageBox), | ||||||
|  |     JS_CFUNC_DEF("guiTextInputBox",6,js_guiTextInputBox), | ||||||
|     JS_CFUNC_DEF("guiColorPicker",3,js_guiColorPicker), |     JS_CFUNC_DEF("guiColorPicker",3,js_guiColorPicker), | ||||||
|     JS_CFUNC_DEF("guiColorPanel",3,js_guiColorPanel), |     JS_CFUNC_DEF("guiColorPanel",3,js_guiColorPanel), | ||||||
|     JS_CFUNC_DEF("guiColorBarAlpha",3,js_guiColorBarAlpha), |     JS_CFUNC_DEF("guiColorBarAlpha",3,js_guiColorBarAlpha), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue