sq_fltk.cpp 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  1. #ifdef WITH_FLTK
  2. #define LUAFLTK
  3. #include <FL/Fl.H>
  4. #include <FL/Fl_Widget.H>
  5. #include <FL/Fl_Box.H>
  6. #include <FL/Fl_Button.H>
  7. #include <FL/Fl_Group.H>
  8. #include <FL/Fl_Window.H>
  9. #include <FL/Fl_Double_Window.H>
  10. #include <FL/Fl_Button.H>
  11. #include <FL/Fl_Light_Button.H>
  12. #include <FL/Fl_Check_Button.H>
  13. #include <FL/Fl_Radio_Button.H>
  14. #include <FL/Fl_Return_Button.H>
  15. #include <FL/Fl_Menu_Item.H>
  16. #include <FL/Fl_Menu_.H>
  17. #include <FL/Fl_Menu_Bar.H>
  18. #include <FL/Fl_Choice.H>
  19. #include <FL/Fl_Input_.H>
  20. #include <FL/Fl_Input.H>
  21. #include <FL/Fl_Float_Input.H>
  22. #include <FL/Fl_Int_Input.H>
  23. #include <FL/Fl_Output.H>
  24. #include <FL/Fl_Secret_Input.H>
  25. #include <FL/Fl_Scroll.H>
  26. #include <FL/Fl_Text_Display.H>
  27. #include <FL/Fl_Text_Editor.H>
  28. #include <FL/Fl_Pack.H>
  29. #include <FL/Fl_Tabs.H>
  30. #include <FL/Flv_List.H>
  31. #include <FL/Flv_Table.H>
  32. #include <FL/Fl_Image.H>
  33. #include <FL/Fl_PNG_Image.H>
  34. #include <FL/Fl_JPEG_Image.H>
  35. #include <FL/Fl_File_Chooser.H>
  36. #include <FL/Fl_Native_File_Chooser.H>
  37. #include <squirrel.h>
  38. #include "sqfltk.h"
  39. struct MyFltkUData {
  40. HSQOBJECT self;
  41. HSQOBJECT udata;
  42. HSQUIRRELVM v;
  43. };
  44. #define FLTK_TAG(tag) SQFLTK_##tag##_TYPE_TAG
  45. #define CREATE_TAG(tag) static const SQChar FLTK_TAG(tag)[] = _SC(#tag);
  46. CREATE_TAG(Fl);
  47. CREATE_TAG(Fl_Widget);
  48. CREATE_TAG(Fl_Button);
  49. CREATE_TAG(Fl_Light_Button);
  50. CREATE_TAG(Fl_Check_Button);
  51. CREATE_TAG(Fl_Radio_Button);
  52. CREATE_TAG(Fl_Return_Button);
  53. CREATE_TAG(Fl_Menu_);
  54. CREATE_TAG(Fl_Menu_Bar);
  55. CREATE_TAG(Fl_Menu_Item);
  56. CREATE_TAG(Fl_Choice);
  57. CREATE_TAG(Fl_Input_);
  58. CREATE_TAG(Fl_Float_Input);
  59. CREATE_TAG(Fl_Int_Input);
  60. CREATE_TAG(Fl_Output);
  61. CREATE_TAG(Fl_Secret_Input);
  62. CREATE_TAG(Fl_Scroll);
  63. CREATE_TAG(Fl_Group);
  64. CREATE_TAG(Fl_Pack);
  65. CREATE_TAG(Fl_Tabs);
  66. CREATE_TAG(Flv_List);
  67. CREATE_TAG(Flv_Table);
  68. CREATE_TAG(Fl_Text_Display);
  69. CREATE_TAG(Fl_Text_Editor);
  70. CREATE_TAG(Fl_Text_Editor_Buffered);
  71. CREATE_TAG(Fl_Window);
  72. CREATE_TAG(Fl_Double_Window);
  73. CREATE_TAG(Fl_Image);
  74. CREATE_TAG(Fl_PNG_Image);
  75. CREATE_TAG(Fl_JPEG_Image);
  76. CREATE_TAG(Fl_File_Chooser);
  77. CREATE_TAG(Fl_Native_File_Chooser);
  78. CREATE_TAG(Fl_Text_Buffer);
  79. static const SQChar FLTK_key[] = _SC("FLTK");
  80. static SQRESULT fltk_register_object_and_instance(HSQUIRRELVM v, int instance_idx, void *cptr){
  81. sq_pushstring(v, FLTK_key, -1);
  82. if(sq_getonregistrytable(v) < 0){
  83. sq_newtable(v);
  84. sq_pushstring(v, FLTK_key, -1);
  85. sq_push(v, -2);
  86. sq_setonregistrytable(v);
  87. }
  88. sq_pushuserpointer(v, cptr);
  89. //sq_weakref(sqvm, instance_idx);
  90. sq_push(v, instance_idx);
  91. sq_rawset(v, -3);
  92. sq_pop(v, -1);
  93. return SQ_OK;
  94. }
  95. static SQRESULT fltk_deregister_instance(HSQUIRRELVM v, void *cptr){
  96. sq_pushstring(v, FLTK_key, -1);
  97. if(sq_getonregistrytable(v) >= 0){
  98. sq_pushuserpointer(v, cptr);
  99. sq_deleteslot(v, -2, SQFalse);
  100. sq_pop(v, -1);
  101. return SQ_OK;
  102. }
  103. return SQ_ERROR;
  104. }
  105. static SQRESULT fltk_get_registered_instance(HSQUIRRELVM v, void *cptr){
  106. sq_pushstring(v, FLTK_key, -1);
  107. if(sq_getonregistrytable(v) >= 0){
  108. sq_pushuserpointer(v, cptr);
  109. if(sq_rawget(v, -2) >= 0){
  110. sq_remove(v, -2);
  111. return SQ_OK;
  112. }
  113. sq_poptop(v);
  114. }
  115. return SQ_ERROR;
  116. }
  117. #define SETUP_KLASS(v, Klass, Klass_TAG) \
  118. Klass *self = NULL; \
  119. { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(void*)Klass_TAG))) \
  120. return SQ_ERROR; }
  121. #define SETUP_FL_KLASS(v, Klass) SETUP_KLASS(v, Klass, FLTK_TAG(Klass))
  122. #define SETUP_FL_WIDGET(v) SETUP_FL_KLASS(v, Fl_Widget)
  123. #define NOTHING(a)
  124. #define AS_IS(a) a
  125. #define FLTK_CONSTRUCTOR_RELEASE_WINDOW(Klass, RELEASE_HOOK, _release_hook)\
  126. static SQInteger _##Klass##_constructor(HSQUIRRELVM sqvm)\
  127. {\
  128. const SQChar *label;\
  129. SQInteger argc, x,y,w,h;\
  130. Klass *cptr;\
  131. argc = sq_gettop(sqvm);\
  132. if(argc > 4){\
  133. sq_getinteger(sqvm, 2, &x);\
  134. sq_getinteger(sqvm, 3, &y);\
  135. sq_getinteger(sqvm, 4, &w);\
  136. sq_getinteger(sqvm, 5, &h);\
  137. if(argc == 6) sq_getstring(sqvm, 6, &label);\
  138. else label = NULL;\
  139. cptr = new Klass(x,y,w,h,label);\
  140. } else if(argc > 2){\
  141. sq_getinteger(sqvm, 2, &w);\
  142. sq_getinteger(sqvm, 3, &h);\
  143. if(argc == 4) sq_getstring(sqvm, 4, &label);\
  144. else label = NULL;\
  145. cptr = new Klass(w,h,label);\
  146. } else \
  147. return sq_throwerror(sqvm, _SC("Wrong number of parameters."));\
  148. fltk_register_object_and_instance(sqvm, 1, cptr);\
  149. sq_setinstanceup(sqvm, 1, cptr);\
  150. RELEASE_HOOK(sq_setreleasehook(sqvm,1,_release_hook));\
  151. return 1;\
  152. }
  153. #define FLTK_CONSTRUCTOR_RELEASE(Klass, RELEASE_HOOK, _release_hook)\
  154. static SQInteger _##Klass##_constructor(HSQUIRRELVM sqvm)\
  155. {\
  156. const SQChar *label;\
  157. SQInteger argc, x,y,w,h;\
  158. Klass *cptr;\
  159. argc = sq_gettop(sqvm);\
  160. if(argc > 4){\
  161. sq_getinteger(sqvm, 2, &x);\
  162. sq_getinteger(sqvm, 3, &y);\
  163. sq_getinteger(sqvm, 4, &w);\
  164. sq_getinteger(sqvm, 5, &h);\
  165. if(argc == 6) sq_getstring(sqvm, 6, &label);\
  166. else label = NULL;\
  167. cptr = new Klass(x,y,w,h,label);\
  168. fltk_register_object_and_instance(sqvm, 1, cptr);\
  169. } else \
  170. return sq_throwerror(sqvm, _SC("Wrong number of parameters."));\
  171. sq_setinstanceup(sqvm, 1, cptr);\
  172. RELEASE_HOOK(sq_setreleasehook(sqvm,1,_release_hook));\
  173. return 1;\
  174. }
  175. #define FLTK_CONSTRUCTOR(Klass) FLTK_CONSTRUCTOR_RELEASE(Klass, NOTHING, a)
  176. #define FUNC_GETSET_STR(prefix, getSelf, selfPtr, funcNAME) \
  177. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  178. {\
  179. getSelf;\
  180. SQInteger argc = sq_gettop(sqvm);\
  181. const SQChar *str = NULL;\
  182. if(argc > 1){\
  183. sq_getstring(sqvm, 2, &str);\
  184. selfPtr funcNAME(str);\
  185. return 0;\
  186. }\
  187. str = selfPtr funcNAME();\
  188. if(str) sq_pushstring(sqvm, str, -1);\
  189. else sq_pushnull(sqvm);\
  190. return 1;\
  191. }
  192. #define FUNC_GETSET_INT(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  193. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  194. {\
  195. getSelf;\
  196. SQInteger argc = sq_gettop(sqvm);\
  197. SQInteger iparm;\
  198. if(argc > 1){\
  199. sq_getinteger(sqvm, 2, &iparm);\
  200. selfPtr funcNAME((typeCast)iparm);\
  201. return 0;\
  202. }\
  203. sq_pushinteger(sqvm, selfPtr funcNAME());\
  204. return 1;\
  205. }
  206. #define FUNC_GETSET_INT_ONE_CALL(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  207. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  208. {\
  209. getSelf;\
  210. SQInteger argc = sq_gettop(sqvm);\
  211. SQInteger iparm;\
  212. if(argc > 1){\
  213. sq_getinteger(sqvm, 2, &iparm);\
  214. sq_pushinteger(sqvm, selfPtr funcNAME((typeCast)iparm));\
  215. return 1;\
  216. }\
  217. return sq_throwerror(sqvm, _SC("one integer parameter expected"));\
  218. }
  219. #define FUNC_GETSET_INT_BOOL(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  220. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  221. {\
  222. getSelf;\
  223. SQInteger argc = sq_gettop(sqvm);\
  224. SQInteger iparm;\
  225. SQBool bparm;\
  226. if(argc > 1){\
  227. sq_getinteger(sqvm, 2, &iparm);\
  228. if(argc > 2) {\
  229. sq_getbool(sqvm, 3, &bparm);\
  230. selfPtr funcNAME((typeCast)iparm, bparm == SQTrue);\
  231. return 0;\
  232. }\
  233. sq_pushbool(sqvm, selfPtr funcNAME((typeCast)iparm));\
  234. return 1;\
  235. }\
  236. return sq_throwerror(sqvm, _SC("invalid number of parameters"));\
  237. }
  238. #define FUNC_VOID_CALL(prefix, getSelf, selfPtr, funcNAME) \
  239. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  240. {\
  241. getSelf(sqvm);\
  242. selfPtr funcNAME();\
  243. return 0;\
  244. }
  245. #define FUNC_VOID_CALL_2INT(prefix, getSelf, funcNAME) \
  246. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  247. {\
  248. getSelf(sqvm);\
  249. SQInteger i1, i2;\
  250. sq_getinteger(sqvm, 2, &i1);\
  251. sq_getinteger(sqvm, 3, &i2);\
  252. self->funcNAME(i1,i2);\
  253. return 0;\
  254. }
  255. #define FUNC_VOID_CALL_4INT(prefix, getSelf, funcNAME) \
  256. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  257. {\
  258. getSelf(sqvm);\
  259. SQInteger i1, i2, i3, i4;\
  260. sq_getinteger(sqvm, 2, &i1);\
  261. sq_getinteger(sqvm, 3, &i2);\
  262. sq_getinteger(sqvm, 4, &i3);\
  263. sq_getinteger(sqvm, 5, &i4);\
  264. self->funcNAME(i1,i2,i3,i4);\
  265. return 0;\
  266. }
  267. #define FUNC_INT_CALL(prefix, getSelf, funcNAME) \
  268. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  269. {\
  270. getSelf(sqvm);\
  271. sq_pushinteger(sqvm, self->funcNAME());\
  272. return 1;\
  273. }
  274. #define FUNC_STR_CALL(prefix, getSelf, funcNAME) \
  275. static SQInteger prefix##funcNAME(HSQUIRRELVM sqvm) \
  276. {\
  277. getSelf(sqvm);\
  278. sq_pushstring(sqvm, self->funcNAME(), -1);\
  279. return 1;\
  280. }
  281. #define FL_WIDGET_GETSET_STR(funcNAME) FUNC_GETSET_STR(_flwidget_, SETUP_FL_WIDGET(sqvm), self->, funcNAME)
  282. #define FL_WIDGET_GETSET_INT0(funcNAME, typeNAME) FUNC_GETSET_INT(_flwidget_, SETUP_FL_WIDGET(sqvm), self->, funcNAME, typeNAME)
  283. #define FL_WIDGET_GETSET_INT(funcNAME) FL_WIDGET_GETSET_INT0(funcNAME, int)
  284. #define FL_WIDGET_GETSET_INT_CAST(funcNAME, castType) FL_WIDGET_GETSET_INT0(funcNAME, castType)
  285. #define FL_WIDGET_VOID_CALL(funcNAME) FUNC_VOID_CALL(_flwidget_, SETUP_FL_WIDGET, self->, funcNAME)
  286. #define FL_WIDGET_VOID_CALL_2INT(funcNAME) FUNC_VOID_CALL_2INT(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  287. #define FL_WIDGET_VOID_CALL_4INT(funcNAME) FUNC_VOID_CALL_4INT(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  288. #define FL_WIDGET_INT_CALL(funcNAME) FUNC_INT_CALL(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  289. #define FL_WIDGET_STR_CALL(funcNAME) FUNC_STR_CALL(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  290. #define GETINSTANCE_FOR_FL_KLASS(Klass)\
  291. static SQInteger getInstance_for_##Klass(HSQUIRRELVM v, Klass *widget){\
  292. if(!widget) return SQ_ERROR;\
  293. if(fltk_get_registered_instance(v, widget) == SQ_OK) return SQ_OK;\
  294. int rc;\
  295. sq_pushuserpointer(v, (void*)FLTK_TAG(Klass));\
  296. rc = sq_getonregistrytable(v);\
  297. rc = sq_createinstance(v, -1);\
  298. rc = sq_setinstanceup(v, -1, widget);\
  299. sq_replace(v, -2);\
  300. return SQ_OK;\
  301. }
  302. GETINSTANCE_FOR_FL_KLASS(Fl_Widget);
  303. GETINSTANCE_FOR_FL_KLASS(Fl_Group);
  304. static SQRESULT sq_get_fl_virtual(HSQUIRRELVM sqvm, void *self, const SQChar *func_name){
  305. //sq_reservestack(sqvm, 20);
  306. if(fltk_get_registered_instance(sqvm, self) == SQ_OK){
  307. sq_pushstring(sqvm, func_name, -1);
  308. sq_get(sqvm, -2);
  309. SQObjectType toptype = sq_gettype(sqvm, -1);
  310. if(toptype == OT_CLOSURE || toptype == OT_NATIVECLOSURE){
  311. return SQ_OK;
  312. }
  313. }
  314. return SQ_ERROR;
  315. }
  316. static void sq_call_fl_virtual(void *self, const SQChar *func_name){
  317. HSQUIRRELVM sqvm = (HSQUIRRELVM) Fl::user_data;
  318. //sq_reservestack(sqvm, 20);
  319. SQInteger top = sq_gettop(sqvm);
  320. if(sq_get_fl_virtual(sqvm, self, func_name) == SQ_OK){
  321. sq_push(sqvm, -2); //this
  322. sq_call(sqvm, 1, SQFalse, SQTrue);
  323. }
  324. sq_settop(sqvm, top);
  325. }
  326. typedef struct {
  327. HSQOBJECT callback;
  328. HSQOBJECT sender;
  329. HSQOBJECT udata;
  330. } st_mycb;
  331. //static st_mycb static_cb;
  332. static void free_st_mycb(HSQUIRRELVM sqvm, st_mycb *cb){
  333. sq_release(sqvm, &cb->callback);
  334. sq_release(sqvm, &cb->udata);
  335. sq_free((void*)cb, sizeof(st_mycb));
  336. }
  337. static void At_Widget_Destroy(Fl_Widget *widget){
  338. //printf("%d %p At_Widget_Destroy\n", __LINE__, widget);
  339. Fl_Callback_p cb = widget->callback();
  340. if(!cb || cb == Fl_Widget::default_callback) {
  341. //no need to check
  342. return;
  343. }
  344. HSQUIRRELVM sqvm = (HSQUIRRELVM) Fl::user_data;
  345. SQInteger savedTop = sq_gettop(sqvm);
  346. //printf("%d %p %d At_Widget_Destroy\n", __LINE__, widget, sq_gettop(sqvm));
  347. int rc = fltk_deregister_instance(sqvm, widget);
  348. //printf("%d %p %d At_Widget_Destroy\n", __LINE__, widget, sq_gettop(sqvm));
  349. //printf("%d %p %d %s At_Widget_Destroy\n", __LINE__, widget, rc, sq_getlasterror_str(sqvm));
  350. //if(sq_deleteslot(sqvm, -2, SQTrue) == SQ_OK){
  351. if(rc == SQ_OK){
  352. //printf("%d %p At_Widget_Destroy\n", __LINE__, widget);
  353. if(sq_gettype(sqvm, -1) != OT_NULL){
  354. //////////////////////////////nota all will have user pointer !!!!!!!!
  355. SQUserPointer ptr;
  356. sq_getuserpointer(sqvm, -1, &ptr);
  357. //free_st_mycb(sqvm, (st_mycb*)ptr);
  358. }
  359. }
  360. sq_settop(sqvm, savedTop);
  361. }
  362. static void fltk_calback_hook(Fl_Widget *sender, void* udata){
  363. //printf("Sender %p, data %p\n", sender, udata);
  364. HSQUIRRELVM sqvm = (HSQUIRRELVM) Fl::user_data;
  365. SQInteger savedTop = sq_gettop(sqvm);
  366. st_mycb *mycb = (st_mycb *)udata;
  367. sq_pushobject(sqvm, mycb->callback);
  368. sq_pushroottable(sqvm); //’this’ (function environment object)
  369. if(fltk_get_registered_instance(sqvm, sender) != SQ_OK) sq_pushnull(sqvm);
  370. sq_pushobject(sqvm, mycb->udata);
  371. sq_call(sqvm, 3, SQFalse, SQTrue);
  372. //printf("%d\n", sq_call(sqvm, 3, SQFalse, SQTrue));
  373. sq_settop(sqvm, savedTop);
  374. }
  375. static SQInteger _flwidget_callback(HSQUIRRELVM sqvm)
  376. {
  377. //printf("%d %s\n", __LINE__, __FILE__);
  378. SETUP_FL_WIDGET(sqvm);
  379. SQInteger argc = sq_gettop(sqvm);
  380. Fl_Callback_p cb = self->callback();
  381. if(cb == Fl_Widget::default_callback){
  382. cb = 0;
  383. }
  384. if(argc == 1){
  385. if(cb) sq_pushuserpointer(sqvm, (void*)cb);
  386. else sq_pushnull(sqvm);
  387. return 1;
  388. }
  389. if(argc >= 2){
  390. int ptypecb = sq_gettype(sqvm, 2);
  391. if(cb || ptypecb == OT_NULL) { //not allways the cb was set by us
  392. At_Widget_Destroy(self);
  393. if(ptypecb == OT_NULL) {
  394. self->callback((Fl_Callback*)NULL, (void*)NULL);
  395. return 0;
  396. }
  397. }
  398. st_mycb *mycb = (st_mycb *)sq_malloc(sizeof(st_mycb));
  399. sq_resetobject(&mycb->callback); //initializes the object handle (sets to NULL)
  400. sq_resetobject(&mycb->sender);
  401. sq_resetobject(&mycb->udata);
  402. sq_getstackobj(sqvm, 2, &mycb->callback);//fetches an handle of the function you passed
  403. if(sq_gettop(sqvm) > 2) { //we have user data too
  404. sq_getstackobj(sqvm, 3, &mycb->udata);
  405. sq_addref(sqvm,&mycb->udata);
  406. }
  407. if(sq_type(mycb->callback) == OT_CLOSURE || sq_type(mycb->callback) == OT_NATIVECLOSURE){
  408. sq_addref(sqvm,&mycb->callback);
  409. //sq_getstackobj(sqvm, 1, &mycb->sender);
  410. self->callback(&fltk_calback_hook, mycb);
  411. //registry for free when widget is destroyed
  412. sq_pushregistrytable(sqvm);
  413. sq_pushuserpointer(sqvm, self);
  414. sq_pushuserpointer(sqvm, mycb);
  415. sq_rawset(sqvm, -2);
  416. //printf("Button %p\n", self);
  417. }
  418. }
  419. return 0;
  420. }
  421. FL_WIDGET_GETSET_INT(align);
  422. FL_WIDGET_GETSET_INT(argument);
  423. FL_WIDGET_GETSET_INT_CAST(box, Fl_Boxtype);
  424. FL_WIDGET_GETSET_INT(color);
  425. FL_WIDGET_GETSET_INT(selection_color);
  426. FL_WIDGET_GETSET_STR(label);
  427. FL_WIDGET_GETSET_INT(labelcolor);
  428. FL_WIDGET_GETSET_INT(labelfont);
  429. FL_WIDGET_GETSET_INT(labelsize);
  430. FL_WIDGET_GETSET_INT_CAST(labeltype, Fl_Labeltype);
  431. FL_WIDGET_GETSET_INT(textfont);
  432. FL_WIDGET_GETSET_INT(textsize);
  433. FL_WIDGET_GETSET_STR(tooltip);
  434. FL_WIDGET_GETSET_INT(when);
  435. FL_WIDGET_GETSET_INT(type);
  436. FL_WIDGET_INT_CALL(x);
  437. FL_WIDGET_INT_CALL(y);
  438. FL_WIDGET_INT_CALL(w);
  439. FL_WIDGET_INT_CALL(h);
  440. FL_WIDGET_VOID_CALL_2INT(position);
  441. FL_WIDGET_VOID_CALL_2INT(size);
  442. FL_WIDGET_VOID_CALL_4INT(resize);
  443. //FL_WIDGET_STR_CALL(classId);
  444. static SQInteger _flwidget_classId(HSQUIRRELVM sqvm)
  445. {
  446. SETUP_FL_WIDGET(sqvm);
  447. if(!self) return sq_throwerror(sqvm, _SC("attempt to call method with null object"));
  448. const char *cn = self->classId();
  449. sq_pushstring(sqvm, cn, -1);
  450. return 1;
  451. }
  452. static SQInteger _flwidget_parent(HSQUIRRELVM sqvm)
  453. {
  454. SETUP_FL_WIDGET(sqvm);
  455. if(!self) return sq_throwerror(sqvm, _SC("attempt to call method with null object"));
  456. if(getInstance_for_Fl_Widget(sqvm, self->parent()) != SQ_OK) sq_pushnull(sqvm);
  457. return 1;
  458. }
  459. static SQInteger _flwidget_handle(HSQUIRRELVM sqvm)
  460. {
  461. SETUP_FL_WIDGET(sqvm);
  462. SQInteger event;
  463. sq_getinteger(sqvm, 2, &event);
  464. sq_pushinteger(sqvm, self->handle(event));
  465. return 1;
  466. }
  467. FL_WIDGET_VOID_CALL(redraw);
  468. FL_WIDGET_VOID_CALL(redraw_label);
  469. FL_WIDGET_VOID_CALL(hide);
  470. FL_WIDGET_VOID_CALL(show);
  471. #define _DECL_FL_WIDGET_FUNC(name,nparams,pmask) {_SC(#name),_flwidget_##name,nparams,pmask}
  472. static SQRegFunction fl_widget_obj_funcs[]={
  473. _DECL_FL_WIDGET_FUNC(align,-1,_SC("xi")),
  474. _DECL_FL_WIDGET_FUNC(argument,-1,_SC("xi")),
  475. _DECL_FL_WIDGET_FUNC(box,-1,_SC("xi")),
  476. _DECL_FL_WIDGET_FUNC(callback,-1,_SC("xc.")),
  477. _DECL_FL_WIDGET_FUNC(color,-1,_SC("xi")),
  478. _DECL_FL_WIDGET_FUNC(selection_color,-1,_SC("xi")),
  479. _DECL_FL_WIDGET_FUNC(label,-1,_SC("xs")),
  480. _DECL_FL_WIDGET_FUNC(labelcolor,-1,_SC("xi")),
  481. _DECL_FL_WIDGET_FUNC(labelfont,-1,_SC("xi")),
  482. _DECL_FL_WIDGET_FUNC(labelsize,-1,_SC("xi")),
  483. _DECL_FL_WIDGET_FUNC(labeltype,-1,_SC("xi")),
  484. _DECL_FL_WIDGET_FUNC(textfont,-1,_SC("xi")),
  485. _DECL_FL_WIDGET_FUNC(textsize,-1,_SC("xi")),
  486. _DECL_FL_WIDGET_FUNC(tooltip,-1,_SC("xs")),
  487. _DECL_FL_WIDGET_FUNC(type,-1,_SC("xi")),
  488. _DECL_FL_WIDGET_FUNC(when,-1,_SC("xi")),
  489. _DECL_FL_WIDGET_FUNC(handle,2,_SC("xi")),
  490. _DECL_FL_WIDGET_FUNC(redraw,1,_SC("x")),
  491. _DECL_FL_WIDGET_FUNC(redraw_label,1,_SC("x")),
  492. _DECL_FL_WIDGET_FUNC(x,1,_SC("x")),
  493. _DECL_FL_WIDGET_FUNC(y,1,_SC("x")),
  494. _DECL_FL_WIDGET_FUNC(w,1,_SC("x")),
  495. _DECL_FL_WIDGET_FUNC(h,1,_SC("x")),
  496. _DECL_FL_WIDGET_FUNC(position,3,_SC("xii")),
  497. _DECL_FL_WIDGET_FUNC(size,3,_SC("xii")),
  498. _DECL_FL_WIDGET_FUNC(resize,5,_SC("xiiii")),
  499. _DECL_FL_WIDGET_FUNC(show,1,_SC("x")),
  500. _DECL_FL_WIDGET_FUNC(hide,1,_SC("x")),
  501. _DECL_FL_WIDGET_FUNC(classId,1,_SC("x")),
  502. _DECL_FL_WIDGET_FUNC(parent,1,_SC("x")),
  503. {0,0}
  504. };
  505. #define MY_FL_CLASS(klass, myfuncs)\
  506. class My##klass : public klass {\
  507. public:\
  508. My##klass(int X, int Y, int W, int H, const char *L=0):klass(X,Y,W,H,L){}\
  509. myfuncs\
  510. };\
  511. CREATE_TAG(klass);\
  512. FLTK_CONSTRUCTOR(My##klass);
  513. MY_FL_CLASS(Fl_Box,
  514. void draw(){
  515. sq_call_fl_virtual(this, "draw");
  516. }
  517. )
  518. static SQInteger _MyFl_Box_draw(HSQUIRRELVM sqvm)
  519. {
  520. SETUP_FL_WIDGET(sqvm);
  521. ((MyFl_Box*)self)->Fl_Box::draw();
  522. return 0;
  523. }
  524. #define _DECL_FL_BOX_FUNC(name,nparams,pmask) {_SC(#name),_MyFl_Box_##name,nparams,pmask}
  525. static SQRegFunction fl_box_obj_funcs[]={
  526. _DECL_FL_BOX_FUNC(constructor,-5,_SC("xiiiis")),
  527. _DECL_FL_BOX_FUNC(draw,1,_SC("x")),
  528. {0,0}
  529. };
  530. FLTK_CONSTRUCTOR(Fl_Button);
  531. #define SETUP_FL_BUTTON(v) SETUP_FL_KLASS(v, Fl_Button)
  532. #define FL_BUTTON_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Button_, SETUP_FL_BUTTON(sqvm), self->, funcNAME, typeNAME)
  533. FL_BUTTON_GETSET_INT_CAST(down_box, Fl_Boxtype);
  534. FL_BUTTON_GETSET_INT_CAST(value, int);
  535. #define _DECL_FL_BUTTON_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Button_##name,nparams,pmask}
  536. static SQRegFunction fl_button_obj_funcs[]={
  537. _DECL_FL_BUTTON_FUNC(constructor,-5,_SC("xiiiis")),
  538. _DECL_FL_BUTTON_FUNC(down_box,-1,_SC("xi")),
  539. _DECL_FL_BUTTON_FUNC(value,-1,_SC("xi")),
  540. {0,0}
  541. };
  542. FLTK_CONSTRUCTOR(Fl_Light_Button);
  543. #define _DECL_FL_LIGHT_BUTTON_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Light_Button_##name,nparams,pmask}
  544. static SQRegFunction fl_light_button_obj_funcs[]={
  545. _DECL_FL_LIGHT_BUTTON_FUNC(constructor,-5,_SC("xiiiis")),
  546. {0,0}
  547. };
  548. FLTK_CONSTRUCTOR(Fl_Check_Button);
  549. #define _DECL_FL_CHECK_BUTTON_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Check_Button_##name,nparams,pmask}
  550. static SQRegFunction fl_check_button_obj_funcs[]={
  551. _DECL_FL_CHECK_BUTTON_FUNC(constructor,-5,_SC("xiiiis")),
  552. {0,0}
  553. };
  554. FLTK_CONSTRUCTOR(Fl_Radio_Button);
  555. #define _DECL_FL_RADIO_BUTTON_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Radio_Button_##name,nparams,pmask}
  556. static SQRegFunction fl_radio_button_obj_funcs[]={
  557. _DECL_FL_RADIO_BUTTON_FUNC(constructor,-5,_SC("xiiiis")),
  558. {0,0}
  559. };
  560. FLTK_CONSTRUCTOR(Fl_Return_Button);
  561. #define _DECL_FL_RETURN_BUTTON_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Return_Button_##name,nparams,pmask}
  562. static SQRegFunction fl_return_button_obj_funcs[]={
  563. _DECL_FL_RETURN_BUTTON_FUNC(constructor,-5,_SC("xiiiis")),
  564. {0,0}
  565. };
  566. /*
  567. FLTK_CONSTRUCTOR(Fl_Menu_Item);
  568. #define _DECL_FL_MENU_ITEM_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu_Item_##name,nparams,pmask}
  569. static SQRegFunction fl_menu_item_obj_funcs[]={
  570. _DECL_FL_MENU_ITEM_FUNC(constructor,-5,_SC("xiiiis")),
  571. {0,0}
  572. };
  573. */
  574. FLTK_CONSTRUCTOR(Fl_Menu_);
  575. #define SETUP_FL_MENU_(v) SETUP_FL_KLASS(v, Fl_Menu_)
  576. static SQInteger _Fl_Menu__copy(HSQUIRRELVM v)
  577. {
  578. SQ_FUNC_VARS(v);
  579. SETUP_FL_MENU_(v);
  580. SQInteger menu_size = sq_getsize(v, 2);
  581. sq_reservestack(v, 20);
  582. SQInteger work_top = sq_gettop(v);
  583. SQInteger nested = 0;
  584. for(int i=0; i < menu_size; ++i){
  585. sq_pushinteger(v, i);
  586. sq_rawget(v, 2);
  587. SQInteger item_size = sq_getsize(v, -1);
  588. if(item_size > 0) {
  589. const SQChar *str;
  590. SQInteger flags = 0;
  591. sq_pushinteger(v, 0);
  592. sq_rawget(v, -2);
  593. if(sq_gettype(v, -1) == OT_STRING){
  594. sq_getstring(v, -1, &str);
  595. if(item_size > 4){
  596. sq_pushinteger(v, 4);
  597. sq_rawget(v, -3);
  598. if(sq_gettype(v, -1) == OT_INTEGER){
  599. sq_getinteger(v, -1, &flags);
  600. }
  601. }
  602. //if(flags & FL_SUBMENU)
  603. self->add(str, 0,0,0,flags);
  604. }
  605. }
  606. sq_settop(v, work_top);
  607. }
  608. //self->copy(&menu_items);
  609. return 0;
  610. }
  611. #define _DECL_FL_MENU__FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu__##name,nparams,pmask}
  612. static SQRegFunction fl_menu__obj_funcs[]={
  613. _DECL_FL_MENU__FUNC(constructor,-5,_SC("xiiiis")),
  614. _DECL_FL_MENU__FUNC(copy,-2,_SC("xa.")),
  615. {0,0}
  616. };
  617. FLTK_CONSTRUCTOR(Fl_Menu_Bar);
  618. #define _DECL_FL_MENU_BAR_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu_Bar_##name,nparams,pmask}
  619. static SQRegFunction fl_menu_bar_obj_funcs[]={
  620. _DECL_FL_MENU_BAR_FUNC(constructor,-5,_SC("xiiiis")),
  621. {0,0}
  622. };
  623. FLTK_CONSTRUCTOR(Fl_Choice);
  624. #define _DECL_FL_CHOICE_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Choice_##name,nparams,pmask}
  625. static SQRegFunction fl_choice_obj_funcs[]={
  626. _DECL_FL_CHOICE_FUNC(constructor,-5,_SC("xiiiis")),
  627. {0,0}
  628. };
  629. FLTK_CONSTRUCTOR(Fl_Input_);
  630. #define SETUP_FL_INPUT_(v) SETUP_FL_KLASS(v, Fl_Input_)
  631. FUNC_GETSET_STR(_Fl_Input__, SETUP_FL_INPUT_(sqvm), self->, value);
  632. #define _DECL_FL_INPUT__FUNC(name,nparams,pmask) {_SC(#name),_Fl_Input__##name,nparams,pmask}
  633. static SQRegFunction fl_input__obj_funcs[]={
  634. _DECL_FL_INPUT__FUNC(constructor,-5,_SC("xiiiis")),
  635. _DECL_FL_INPUT__FUNC(value,-1,_SC("xs")),
  636. {0,0}
  637. };
  638. MY_FL_CLASS(Fl_Input,
  639. int handle(int event){
  640. HSQUIRRELVM sqvm = (HSQUIRRELVM) Fl::user_data;
  641. SQInteger top = sq_gettop(sqvm);
  642. if(sq_get_fl_virtual(sqvm, this, "handle") == SQ_OK){
  643. sq_push(sqvm, -2); //this
  644. sq_pushinteger(sqvm, event);
  645. if(sq_call(sqvm, 2, SQTrue, SQTrue) == SQ_OK){
  646. if(sq_gettype(sqvm, -1) == OT_INTEGER){
  647. sq_getinteger(sqvm, -1, &event);
  648. sq_settop(sqvm, top);
  649. return event;
  650. }
  651. }
  652. exit(-1);
  653. }
  654. sq_settop(sqvm, top);
  655. return Fl_Input::handle(event);
  656. }
  657. )
  658. static SQInteger _MyFl_Input_handle(HSQUIRRELVM sqvm)
  659. {
  660. SQ_FUNC_VARS_NO_TOP(sqvm);
  661. SETUP_FL_WIDGET(sqvm);
  662. SQ_GET_INTEGER(sqvm, 2, event);
  663. sq_pushinteger(sqvm, ((MyFl_Input*)self)->Fl_Input::handle(event));
  664. return 1;
  665. }
  666. #define SETUP_FL_INPUT(v) SETUP_FL_KLASS(v, Fl_Input)
  667. FUNC_GETSET_STR(_MyFl_Input_, , Fl_Input::, default_number_format);
  668. FUNC_GETSET_STR(_MyFl_Input_, SETUP_FL_INPUT(sqvm), self->, number_format);
  669. #define FL_INPUT_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_MyFl_Input_, SETUP_FL_INPUT(sqvm), self->, funcNAME, typeNAME)
  670. FL_INPUT_GETSET_INT_CAST(use_numeric_format, int);
  671. FL_INPUT_GETSET_INT_CAST(right_to_left, int);
  672. FL_INPUT_GETSET_INT_CAST(decimal_places, int);
  673. #define _DECL_FL_INPUT_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_MyFl_Input_##name,nparams,pmask,isStatic}
  674. static SQRegFunction fl_input_obj_funcs[]={
  675. _DECL_FL_INPUT_FUNC(constructor,-5,_SC("xiiiis"),SQFalse),
  676. _DECL_FL_INPUT_FUNC(handle,2,_SC("xi"),SQFalse),
  677. _DECL_FL_INPUT_FUNC(default_number_format,-1,_SC("ys"),SQTrue),
  678. _DECL_FL_INPUT_FUNC(number_format,-1,_SC("xs"),SQFalse),
  679. _DECL_FL_INPUT_FUNC(use_numeric_format,-1,_SC("xi"),SQFalse),
  680. _DECL_FL_INPUT_FUNC(right_to_left,-1,_SC("xi"),SQFalse),
  681. _DECL_FL_INPUT_FUNC(decimal_places,-1,_SC("xi"),SQFalse),
  682. {0,0}
  683. };
  684. FLTK_CONSTRUCTOR(Fl_Float_Input);
  685. #define _DECL_FL_FLOAT_INPUT_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Float_Input_##name,nparams,pmask}
  686. static SQRegFunction fl_float_input_obj_funcs[]={
  687. _DECL_FL_FLOAT_INPUT_FUNC(constructor,-5,_SC("xiiiis")),
  688. {0,0}
  689. };
  690. FLTK_CONSTRUCTOR(Fl_Int_Input);
  691. #define _DECL_FL_INT_INPUT_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Int_Input_##name,nparams,pmask}
  692. static SQRegFunction fl_int_input_obj_funcs[]={
  693. _DECL_FL_INT_INPUT_FUNC(constructor,-5,_SC("xiiiis")),
  694. {0,0}
  695. };
  696. FLTK_CONSTRUCTOR(Fl_Output);
  697. #define _DECL_FL_INT_OUTPUT_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Output_##name,nparams,pmask}
  698. static SQRegFunction fl_output_obj_funcs[]={
  699. _DECL_FL_INT_OUTPUT_FUNC(constructor,-5,_SC("xiiiis")),
  700. {0,0}
  701. };
  702. FLTK_CONSTRUCTOR(Fl_Secret_Input);
  703. #define _DECL_FL_SECRET_INPUT_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Secret_Input_##name,nparams,pmask}
  704. static SQRegFunction fl_secret_input_obj_funcs[]={
  705. _DECL_FL_SECRET_INPUT_FUNC(constructor,-5,_SC("xiiiis")),
  706. {0,0}
  707. };
  708. #define SETUP_FL_GROUP(v) SETUP_FL_KLASS(v, Fl_Group)
  709. FLTK_CONSTRUCTOR(Fl_Group);
  710. enum _Fl_Group_Funcs {add, begin, current, end, resizable};
  711. static SQRESULT _Fl_Group_dispatcher(HSQUIRRELVM sqvm, _Fl_Group_Funcs func_idx){
  712. SETUP_FL_GROUP(sqvm);
  713. switch(func_idx){
  714. case add:{
  715. SQUserPointer rsz;
  716. sq_getinstanceup(sqvm, -1, &rsz, 0);
  717. self->add((Fl_Widget*)rsz);
  718. return 0;
  719. }
  720. break;
  721. case begin:
  722. case current:
  723. case end:
  724. case resizable:
  725. break;
  726. }
  727. return 0;
  728. }
  729. static SQInteger _Fl_Group_begin(HSQUIRRELVM sqvm)
  730. {
  731. SETUP_FL_GROUP(sqvm);
  732. self->begin();
  733. return 0;
  734. }
  735. static SQInteger _Fl_Group_end(HSQUIRRELVM sqvm)
  736. {
  737. SETUP_FL_GROUP(sqvm);
  738. self->end();
  739. return 0;
  740. }
  741. static SQInteger _Fl_Group_current(HSQUIRRELVM sqvm)
  742. {
  743. Fl_Group *grp = Fl_Group::current();
  744. if(!grp || getInstance_for_Fl_Group(sqvm, grp) != SQ_OK) sq_pushnull(sqvm);
  745. return 1;
  746. }
  747. static SQInteger _Fl_Group_resizable(HSQUIRRELVM sqvm)
  748. {
  749. SETUP_FL_GROUP(sqvm);
  750. if(sq_gettop(sqvm)==1){
  751. sq_pushuserpointer(sqvm, self->resizable());
  752. return 1;
  753. }
  754. SQUserPointer rsz;
  755. sq_getinstanceup(sqvm, -1, &rsz, 0);
  756. self->resizable((Fl_Widget*)rsz);
  757. return 0;
  758. }
  759. static SQInteger _Fl_Group_add(HSQUIRRELVM sqvm)
  760. {
  761. SETUP_FL_GROUP(sqvm);
  762. SQUserPointer rsz;
  763. sq_getinstanceup(sqvm, -1, &rsz, 0);
  764. self->add((Fl_Widget*)rsz);
  765. return 0;
  766. }
  767. #define _DECL_FL_GROUP_FUNC(name,nparams,pmask, isStatic) {_SC(#name),_Fl_Group_##name,nparams,pmask, isStatic}
  768. static SQRegFunction fl_group_obj_funcs[]={
  769. _DECL_FL_GROUP_FUNC(constructor,-5,_SC("xiiiis"), SQFalse),
  770. _DECL_FL_GROUP_FUNC(begin,1,_SC("x"), SQFalse),
  771. _DECL_FL_GROUP_FUNC(end,1,_SC("x"), SQFalse),
  772. _DECL_FL_GROUP_FUNC(resizable,-1,_SC("xx"), SQFalse),
  773. _DECL_FL_GROUP_FUNC(add,2,_SC("xx"), SQFalse),
  774. _DECL_FL_GROUP_FUNC(current,1,_SC("y"), SQTrue),
  775. {0,0}
  776. };
  777. FLTK_CONSTRUCTOR(Fl_Pack);
  778. #define SETUP_FL_PACK(v) SETUP_FL_KLASS(v, Fl_Pack)
  779. #define FL_PACK_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Pack_, SETUP_FL_PACK(sqvm), self->, funcNAME, typeNAME)
  780. FL_PACK_GETSET_INT_CAST(spacing, int);
  781. FL_PACK_GETSET_INT_CAST(with_label, int);
  782. #define _DECL_FL_PACK_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Pack_##name,nparams,pmask}
  783. static SQRegFunction fl_pack_obj_funcs[]={
  784. _DECL_FL_PACK_FUNC(constructor,-5,_SC("xiiiis")),
  785. _DECL_FL_PACK_FUNC(spacing,-1,_SC("xi")),
  786. _DECL_FL_PACK_FUNC(with_label,-1,_SC("xi")),
  787. {0,0}
  788. };
  789. FLTK_CONSTRUCTOR(Flv_List);
  790. #define SETUP_FLV_LIST(v) SETUP_FL_KLASS(v, Flv_List)
  791. #define FLV_LIST_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Flv_List_, SETUP_FLV_LIST(sqvm), self->, funcNAME, typeNAME)
  792. #define FLV_LIST_GETSET_INT_ONE_CALL_CAST(funcNAME, typeNAME) FUNC_GETSET_INT_ONE_CALL(_Flv_List_, SETUP_FLV_LIST(sqvm), self->, funcNAME, typeNAME)
  793. FLV_LIST_GETSET_INT_CAST(has_scrollbar, Flv_ShowScrollbar);
  794. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature, int);
  795. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature_add, int);
  796. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature_remove, int);
  797. #define _DECL_FLV_LIST_FUNC(name,nparams,pmask) {_SC(#name),_Flv_List_##name,nparams,pmask}
  798. static SQRegFunction flv_list_obj_funcs[]={
  799. _DECL_FLV_LIST_FUNC(constructor,-5,_SC("xiiiis")),
  800. _DECL_FLV_LIST_FUNC(has_scrollbar,-1,_SC("xi")),
  801. _DECL_FLV_LIST_FUNC(feature,-1,_SC("xi")),
  802. _DECL_FLV_LIST_FUNC(feature_add,-1,_SC("xi")),
  803. _DECL_FLV_LIST_FUNC(feature_remove,-1,_SC("xi")),
  804. {0,0}
  805. };
  806. FLTK_CONSTRUCTOR(Flv_Table);
  807. #define _DECL_FLV_TABLE_FUNC(name,nparams,pmask) {_SC(#name),_Flv_Table_##name,nparams,pmask}
  808. static SQRegFunction flv_table_obj_funcs[]={
  809. _DECL_FLV_TABLE_FUNC(constructor,-5,_SC("xiiiis")),
  810. {0,0}
  811. };
  812. FLTK_CONSTRUCTOR(Fl_Scroll);
  813. #define _DECL_FL_SCROLL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Scroll_##name,nparams,pmask}
  814. static SQRegFunction fl_scroll_obj_funcs[]={
  815. _DECL_FL_SCROLL_FUNC(constructor,-5,_SC("xiiiis")),
  816. {0,0}
  817. };
  818. FLTK_CONSTRUCTOR(Fl_Tabs);
  819. #define _DECL_FL_TABS_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Tabs_##name,nparams,pmask}
  820. static SQRegFunction fl_tabs_obj_funcs[]={
  821. _DECL_FL_TABS_FUNC(constructor,-5,_SC("xiiiis")),
  822. {0,0}
  823. };
  824. static SQChar Fl_Text_Buffer_TAG[] = _SC("Fl_Text_Buffer");
  825. static SQInteger _Fl_Text_Buffer_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  826. {
  827. Fl_Text_Buffer *self = ((Fl_Text_Buffer *)p);
  828. delete self;
  829. return 1;
  830. }
  831. static SQInteger _Fl_Text_Buffer_constructor(HSQUIRRELVM v)
  832. {
  833. SQ_FUNC_VARS(v);
  834. SQ_OPT_INTEGER(v, 2, requestedSize, 0);
  835. SQ_OPT_INTEGER(v, 3, preferredGapSize, 1024);
  836. Fl_Text_Buffer *cptr = new Fl_Text_Buffer(requestedSize, preferredGapSize);
  837. //do_register_object_and_instance(sqvm, 1, cptr);
  838. sq_setinstanceup(v, 1, cptr);
  839. sq_setreleasehook(v,1, _Fl_Text_Buffer_releasehook);
  840. return 1;
  841. }
  842. #define SETUP_FL_TEXT_BUFFER(v) SETUP_KLASS(v, Fl_Text_Buffer, Fl_Text_Buffer_TAG)
  843. FUNC_GETSET_STR(_Fl_Text_Buffer_, SETUP_FL_TEXT_BUFFER(sqvm), self->, text);
  844. FUNC_INT_CALL(_Fl_Text_Buffer_, SETUP_FL_TEXT_BUFFER(sqvm), length);
  845. static SQInteger _Fl_Text_Buffer_loadfile(HSQUIRRELVM v)
  846. {
  847. SQ_FUNC_VARS(v);
  848. SETUP_FL_TEXT_BUFFER(v);
  849. SQ_GET_STRING(v, 2, file_name);
  850. SQ_OPT_INTEGER(v, 3, buflen, 128*1024);
  851. sq_pushinteger(v, self->loadfile(file_name, buflen));
  852. return 1;
  853. }
  854. static SQInteger _Fl_Text_Buffer_input_file_was_transcoded(HSQUIRRELVM v)
  855. {
  856. SQ_FUNC_VARS_NO_TOP(v);
  857. SETUP_FL_TEXT_BUFFER(v);
  858. sq_pushinteger(v, self->input_file_was_transcoded);
  859. return 1;
  860. }
  861. #define _DECL_FL_TEXT_BUFFER_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Buffer_##name,nparams,pmask}
  862. static SQRegFunction fl_text_buffer_obj_funcs[]={
  863. _DECL_FL_TEXT_BUFFER_FUNC(constructor,-1,_SC("xii")),
  864. _DECL_FL_TEXT_BUFFER_FUNC(text,-1,_SC("xs")),
  865. _DECL_FL_TEXT_BUFFER_FUNC(length,-1,_SC("xii")),
  866. _DECL_FL_TEXT_BUFFER_FUNC(loadfile,-2,_SC("xsi")),
  867. _DECL_FL_TEXT_BUFFER_FUNC(input_file_was_transcoded,1,_SC("x")),
  868. {0,0}
  869. };
  870. FLTK_CONSTRUCTOR(Fl_Text_Display);
  871. #define SETUP_FL_TEXT_DISPLAY(v) SETUP_FL_KLASS(v, Fl_Text_Display)
  872. static SQInteger _Fl_Text_Display_buffer(HSQUIRRELVM sqvm)
  873. {
  874. SETUP_FL_TEXT_DISPLAY(sqvm);
  875. SQUserPointer rsz;
  876. sq_getinstanceup(sqvm, -1, &rsz, 0);
  877. self->buffer((Fl_Text_Buffer*)rsz);
  878. return 0;
  879. }
  880. static SQInteger _Fl_Text_Display_highlight_data(HSQUIRRELVM sqvm)
  881. {
  882. SETUP_FL_TEXT_DISPLAY(sqvm);
  883. SQUserPointer rsz;
  884. return 0;
  885. }
  886. #define _DECL_FL_TEXT_DISPLAY_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Display_##name,nparams,pmask}
  887. static SQRegFunction fl_text_display_obj_funcs[]={
  888. _DECL_FL_TEXT_DISPLAY_FUNC(constructor,-5,_SC("xiiiis")),
  889. _DECL_FL_TEXT_DISPLAY_FUNC(buffer,-1,_SC("xx")),
  890. _DECL_FL_TEXT_DISPLAY_FUNC(highlight_data, 7,_SC("xxaiic.")),
  891. {0,0}
  892. };
  893. FLTK_CONSTRUCTOR(Fl_Text_Editor);
  894. #define _DECL_FL_TEXT_EDITOR_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Editor_##name,nparams,pmask}
  895. static SQRegFunction fl_text_editor_obj_funcs[]={
  896. _DECL_FL_TEXT_EDITOR_FUNC(constructor,-5,_SC("xiiiis")),
  897. {0,0}
  898. };
  899. FLTK_CONSTRUCTOR(Fl_Text_Editor_Buffered);
  900. #define SETUP_FL_TEXT_EDITOR_BUFFERED(v) SETUP_FL_KLASS(v, Fl_Text_Editor_Buffered)
  901. static SQInteger _Fl_Text_Editor_Buffered_value(HSQUIRRELVM sqvm)
  902. {
  903. SQ_FUNC_VARS(sqvm);
  904. const SQChar *txt;
  905. SETUP_FL_TEXT_EDITOR_BUFFERED(sqvm);
  906. if(_top_ > 1){
  907. sq_getstring(sqvm, 2, &txt);
  908. self->buffer()->text(txt);
  909. return 0;
  910. }
  911. txt = self->buffer()->text();
  912. sq_pushstring(sqvm, txt, -1);
  913. return 1;
  914. }
  915. #define _DECL_FL_TEXT_EDITOR_BUFFERED_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Editor_Buffered_##name,nparams,pmask}
  916. static SQRegFunction fl_text_editor_buffered_obj_funcs[]={
  917. _DECL_FL_TEXT_EDITOR_BUFFERED_FUNC(constructor,-5,_SC("xiiiis")),
  918. _DECL_FL_TEXT_EDITOR_BUFFERED_FUNC(value,-1,_SC("xs")),
  919. {0,0}
  920. };
  921. class MyFl_Window : public Fl_Window {
  922. public:
  923. MyFl_Window(int X, int Y, int W, int H, const char *L=0):Fl_Window(X,Y,W,H,L){}
  924. MyFl_Window(int W, int H, const char *L=0):Fl_Window(W,H,L){}
  925. void hide(){sq_call_fl_virtual(this, "hide");}
  926. };
  927. static SQInteger _MyFl_Window_hide(HSQUIRRELVM sqvm)
  928. {
  929. SETUP_FL_WIDGET(sqvm);
  930. ((MyFl_Window*)self)->Fl_Window::hide();
  931. return 0;
  932. }
  933. extern int sq_main_argc;
  934. extern char **sq_main_argv;
  935. static SQInteger _MyFl_Window_show_main(HSQUIRRELVM sqvm)
  936. {
  937. SETUP_FL_WIDGET(sqvm);
  938. ((MyFl_Window*)self)->Fl_Window::show(sq_main_argc, sq_main_argv);
  939. return 0;
  940. }
  941. static SQInteger _fl_window_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  942. {
  943. MyFl_Window *self = ((MyFl_Window *)p);
  944. Fl::delete_widget(self);
  945. //printf("Releasing %p\n", self);
  946. return 1;
  947. }
  948. static SQInteger _MyFl_Window_set_non_modal(HSQUIRRELVM sqvm)
  949. {
  950. SETUP_FL_WIDGET(sqvm);
  951. ((MyFl_Window*)self)->set_non_modal();
  952. return 0;
  953. }
  954. FLTK_CONSTRUCTOR_RELEASE_WINDOW(MyFl_Window, AS_IS, _fl_window_releasehook);
  955. #define _DECL_FL_WINDOW_FUNC(name,nparams,pmask) {_SC(#name),_MyFl_Window_##name,nparams,pmask}
  956. static SQRegFunction fl_window_obj_funcs[]={
  957. _DECL_FL_WINDOW_FUNC(constructor,-3,_SC("xii")),
  958. _DECL_FL_WINDOW_FUNC(show_main,1,_SC("x")),
  959. _DECL_FL_WINDOW_FUNC(hide,1,_SC("x")),
  960. _DECL_FL_WINDOW_FUNC(set_non_modal,1,_SC("x")),
  961. {0,0}
  962. };
  963. static SQInteger _fl_double_window_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  964. {
  965. Fl_Double_Window *self = ((Fl_Double_Window *)p);
  966. Fl::delete_widget(self);
  967. //printf("Releasing %p\n", self);
  968. return 1;
  969. }
  970. FLTK_CONSTRUCTOR_RELEASE_WINDOW(Fl_Double_Window, AS_IS, _fl_double_window_releasehook);
  971. #define _DECL_FL_DOUBLE_WINDOW_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Double_Window_##name,nparams,pmask}
  972. static SQRegFunction fl_double_window_obj_funcs[]={
  973. _DECL_FL_DOUBLE_WINDOW_FUNC(constructor,-3,_SC("xii")),
  974. {0,0}
  975. };
  976. static SQChar Fl_File_Chooser_TAG[] = _SC("Fl_File_Chooser");
  977. static SQInteger _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  978. {
  979. Fl_File_Chooser *self = ((Fl_File_Chooser *)p);
  980. delete self;
  981. return 1;
  982. }
  983. static SQInteger _Fl_File_Chooser_constructor(HSQUIRRELVM v)
  984. {
  985. SQ_FUNC_VARS_NO_TOP(v);
  986. SQ_GET_STRING(v, 2, pathname);
  987. SQ_GET_STRING(v, 3, pattern);
  988. SQ_GET_INTEGER(v, 4, type);
  989. SQ_GET_STRING(v, 5, title);
  990. Fl_File_Chooser *cptr = new Fl_File_Chooser(pathname, pattern, type, title);
  991. //do_register_object_and_instance(sqvm, 1, cptr);
  992. sq_setinstanceup(v, 1, cptr);
  993. sq_setreleasehook(v,1, _Fl_File_Chooser_releasehook);
  994. return 1;
  995. }
  996. #define _DECL_FL_FILE_CHOOSER_FUNC(name,nparams,pmask) {_SC(#name),_Fl_File_Chooser_##name,nparams,pmask}
  997. static SQRegFunction fl_file_chooser_obj_funcs[]={
  998. _DECL_FL_FILE_CHOOSER_FUNC(constructor,5,_SC("xssis")),
  999. {0,0}
  1000. };
  1001. static SQChar Fl_Native_File_Chooser_TAG[] = _SC("Fl_Native_File_Chooser");
  1002. static SQInteger _Fl_Native_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1003. {
  1004. Fl_Native_File_Chooser *self = ((Fl_Native_File_Chooser *)p);
  1005. delete self;
  1006. return 1;
  1007. }
  1008. static SQInteger _Fl_Native_File_Chooser_constructor(HSQUIRRELVM v)
  1009. {
  1010. SQ_FUNC_VARS(v);
  1011. SQ_OPT_INTEGER(v, 2, type, Fl_Native_File_Chooser::BROWSE_FILE);
  1012. Fl_Native_File_Chooser *cptr = new Fl_Native_File_Chooser(type);
  1013. //do_register_object_and_instance(sqvm, 1, cptr);
  1014. sq_setinstanceup(v, 1, cptr);
  1015. sq_setreleasehook(v,1, _Fl_Native_File_Chooser_releasehook);
  1016. return 1;
  1017. }
  1018. #define _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Native_File_Chooser_##name,nparams,pmask}
  1019. static SQRegFunction fl_native_file_chooser_obj_funcs[]={
  1020. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(constructor,-1,_SC("xi")),
  1021. /*
  1022. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(title,-1,_SC("xs")),
  1023. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(type,-1,_SC("xi")),
  1024. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(show,1,_SC("x")),
  1025. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(filename,1,_SC("x")),
  1026. _DECL_FL_NATIVE_FILE_CHOOSER_FUNC(directory,1,_SC("x")),
  1027. */
  1028. {0,0}
  1029. };
  1030. #define FL_FUNC_NO_ARG_NO_RET(fn) static SQInteger _fl_##fn(HSQUIRRELVM sqvm){Fl::fn();return 0;}
  1031. FL_FUNC_NO_ARG_NO_RET(check);
  1032. FL_FUNC_NO_ARG_NO_RET(do_widget_deletion);
  1033. #define FL_FUNC_NO_ARG_RET_INT(fn) static SQInteger _fl_##fn(HSQUIRRELVM sqvm){sq_pushinteger(sqvm, Fl::fn());return 1;}
  1034. FL_FUNC_NO_ARG_RET_INT(run);
  1035. FL_FUNC_NO_ARG_RET_INT(event);
  1036. FL_FUNC_NO_ARG_RET_INT(event_alt);
  1037. FL_FUNC_NO_ARG_RET_INT(event_button);
  1038. FL_FUNC_NO_ARG_RET_INT(event_button1);
  1039. FL_FUNC_NO_ARG_RET_INT(event_button2);
  1040. FL_FUNC_NO_ARG_RET_INT(event_button3);
  1041. FL_FUNC_NO_ARG_RET_INT(event_buttons);
  1042. FL_FUNC_NO_ARG_RET_INT(event_command);
  1043. FL_FUNC_NO_ARG_RET_INT(event_ctrl);
  1044. FL_FUNC_NO_ARG_RET_INT(event_dx);
  1045. FL_FUNC_NO_ARG_RET_INT(event_dy);
  1046. FL_FUNC_NO_ARG_RET_INT(event_length);
  1047. FL_FUNC_NO_ARG_RET_INT(event_shift);
  1048. FL_FUNC_NO_ARG_RET_INT(event_x);
  1049. FL_FUNC_NO_ARG_RET_INT(event_x_root);
  1050. FL_FUNC_NO_ARG_RET_INT(event_y);
  1051. FL_FUNC_NO_ARG_RET_INT(event_y_root);
  1052. FL_FUNC_NO_ARG_RET_INT(x);
  1053. FL_FUNC_NO_ARG_RET_INT(y);
  1054. FL_FUNC_NO_ARG_RET_INT(h);
  1055. FL_FUNC_NO_ARG_RET_INT(w);
  1056. FL_FUNC_NO_ARG_RET_INT(ready);
  1057. FL_FUNC_NO_ARG_RET_INT(screen_count);
  1058. #define FL_FUNC_GETSET_INT(fn) FUNC_GETSET_INT(_fl_, , Fl::, fn, int)
  1059. FL_FUNC_GETSET_INT(event_key);
  1060. FL_FUNC_GETSET_INT(event_state);
  1061. FL_FUNC_GETSET_INT(event_is_click);
  1062. FL_FUNC_GETSET_INT(event_clicks);
  1063. FL_FUNC_GETSET_INT(scrollbar_size);
  1064. FL_FUNC_GETSET_INT(visible_focus);
  1065. #define FL_FUNC_GETSET_INT_ONE_CALL(fn) FUNC_GETSET_INT_ONE_CALL(_fl_, , Fl::, fn, int)
  1066. FL_FUNC_GETSET_INT_ONE_CALL(visual);
  1067. #define FL_FUNC_GETSET_INT_BOOL(fn) FUNC_GETSET_INT_BOOL(_fl_, , Fl::, fn, Fl::Fl_Option)
  1068. FL_FUNC_GETSET_INT_BOOL(option);
  1069. #define FL_FUNC_GETSET_STR(fn) FUNC_GETSET_STR(_fl_, , Fl::, fn)
  1070. FL_FUNC_GETSET_STR(scheme);
  1071. static SQInteger _fl_delete_widget(HSQUIRRELVM v)
  1072. {
  1073. SQ_FUNC_VARS_NO_TOP(v);
  1074. SQ_GET_INSTANCE_VAR(v, 2, Fl_Widget, widget, FLTK_TAG(Fl_Widget));
  1075. Fl::delete_widget(widget);
  1076. return 0;
  1077. }
  1078. static void fltk_cb_hook(void* udata, bool freeAfter){
  1079. HSQUIRRELVM sqvm = (HSQUIRRELVM) Fl::user_data;
  1080. SQInteger savedTop = sq_gettop(sqvm);
  1081. st_mycb *mycb = (st_mycb *)udata;
  1082. sq_pushobject(sqvm, mycb->callback);
  1083. sq_pushroottable(sqvm); //’this’ (function environment object)
  1084. sq_pushobject(sqvm, mycb->udata);
  1085. sq_call(sqvm, 2, SQFalse, SQTrue);
  1086. if(freeAfter){
  1087. //cleanup
  1088. sq_release(sqvm, &mycb->callback);
  1089. sq_release(sqvm, &mycb->udata);
  1090. sq_free(mycb, sizeof(st_mycb));
  1091. }
  1092. //restore stack
  1093. sq_settop(sqvm, savedTop);
  1094. }
  1095. static SQInteger fltk_add_cb(HSQUIRRELVM v, int idx, st_mycb **cb)
  1096. {
  1097. int ptype = sq_gettype(v, idx);
  1098. if(ptype == OT_CLOSURE || ptype == OT_NATIVECLOSURE){
  1099. st_mycb *mycb = (st_mycb *)sq_malloc(sizeof(st_mycb));
  1100. memset(mycb, 0, sizeof(mycb));
  1101. sq_getstackobj(v, idx, &mycb->callback);//fetches an handle of the function you passed
  1102. sq_addref(v, &mycb->callback);
  1103. if(sq_gettop(v) > idx) { //we have user data too
  1104. sq_getstackobj(v, idx+1, &mycb->udata);
  1105. sq_addref(v,&mycb->udata);
  1106. }
  1107. *cb = mycb;
  1108. }
  1109. return 0;
  1110. }
  1111. static void fltk_add_timeout_hook(void* udata){
  1112. fltk_cb_hook(udata, true);
  1113. }
  1114. static void fltk_add_idle_hook(void* udata){
  1115. fltk_cb_hook(udata, false);
  1116. }
  1117. static SQInteger _fl_add_timeout(HSQUIRRELVM v)
  1118. {
  1119. SQ_FUNC_VARS_NO_TOP(v);
  1120. SQ_GET_FLOAT(v, 2, delay);
  1121. st_mycb *mycb;
  1122. fltk_add_cb(v, 3, &mycb);
  1123. if(mycb) Fl::add_timeout(delay, &fltk_add_timeout_hook, mycb);
  1124. return 0;
  1125. }
  1126. static SQInteger _fl_add_idle(HSQUIRRELVM v)
  1127. {
  1128. st_mycb *mycb;
  1129. fltk_add_cb(v, 2, &mycb);
  1130. if(mycb) Fl::add_idle(&fltk_add_idle_hook, mycb);
  1131. return 0;
  1132. }
  1133. static int flfk_focus_changing_handler_hook(Fl_Widget *to, Fl_Widget *from){
  1134. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  1135. SQInteger result;
  1136. SQInteger savedTop = sq_gettop(v);
  1137. sq_pushuserpointer(v, (void*)flfk_focus_changing_handler_hook);
  1138. sq_getonregistrytable(v);
  1139. if(sq_gettype(v, -1) == OT_CLOSURE){
  1140. sq_pushroottable(v);
  1141. if(getInstance_for_Fl_Widget(v, to) != SQ_OK) sq_pushnull(v);
  1142. if(getInstance_for_Fl_Widget(v, from) != SQ_OK) sq_pushnull(v);
  1143. if(sq_call(v, 3, SQTrue, SQTrue) == SQ_OK &&
  1144. sq_getinteger(v, -1, &result) == SQ_OK){
  1145. return result;
  1146. };
  1147. }
  1148. //restore stack
  1149. sq_settop(v, savedTop);
  1150. return 0;
  1151. }
  1152. static SQInteger _fl_add_focus_changing_handler(HSQUIRRELVM v)
  1153. {
  1154. sq_pushregistrytable(v);
  1155. sq_pushuserpointer(v, (void*)flfk_focus_changing_handler_hook);
  1156. sq_push(v, 2);
  1157. sq_rawset(v, -3);
  1158. Fl::add_focus_changing_handler(flfk_focus_changing_handler_hook);
  1159. return 0;
  1160. }
  1161. static SQInteger _fl_set_fonts(HSQUIRRELVM v)
  1162. {
  1163. const SQChar *filter = 0;
  1164. if(sq_gettop(v) > 1) sq_getstring(v, 2, &filter);
  1165. sq_pushinteger(v, Fl::set_fonts(filter));
  1166. return 1;
  1167. }
  1168. static SQInteger _fl_set_font(HSQUIRRELVM v)
  1169. {
  1170. const SQChar *fname = 0;
  1171. SQInteger font, new_font;
  1172. sq_getinteger(v, 2, &font);
  1173. SQObjectType ptype = sq_gettype(v, 3);
  1174. if(ptype == OT_INTEGER) {
  1175. sq_getinteger(v, 3, &new_font);
  1176. Fl::set_font((Fl_Font)font, (Fl_Font)new_font);
  1177. }
  1178. else if(ptype == OT_STRING) {
  1179. sq_getstring(v, 3, &fname);
  1180. Fl::set_font((Fl_Font)font, fname);
  1181. }
  1182. else return sq_throwerror(v, _SC("invalid parameter number 2"));
  1183. return 0;
  1184. }
  1185. static SQInteger _fl_get_font(HSQUIRRELVM v)
  1186. {
  1187. SQInteger font;
  1188. sq_getinteger(v, 2, &font);
  1189. sq_pushstring(v, Fl::get_font((Fl_Font)font), -1);
  1190. return 1;
  1191. }
  1192. static SQInteger _fl_get_font_name(HSQUIRRELVM v)
  1193. {
  1194. SQInteger font, attributes = 0;
  1195. sq_getinteger(v, 2, &font);
  1196. const char *fname = Fl::get_font_name((Fl_Font)font, &attributes);
  1197. sq_newtable(v);
  1198. sq_pushliteral(v, _SC("name"));
  1199. sq_pushstring(v, fname, -1);
  1200. sq_newslot(v, -3, SQFalse);
  1201. sq_pushliteral(v, _SC("attributes"));
  1202. sq_pushinteger(v, attributes);
  1203. sq_newslot(v, -3, SQFalse);
  1204. return 1;
  1205. }
  1206. #define _DECL_FL_FUNC(name,nparams,pmask) {_SC(#name),_fl_##name,nparams,pmask}
  1207. static SQRegFunction fl_obj_funcs[]={
  1208. _DECL_FL_FUNC(check,1,_SC("y")),
  1209. _DECL_FL_FUNC(run,1,_SC("y")),
  1210. _DECL_FL_FUNC(event,1,_SC("y")),
  1211. _DECL_FL_FUNC(event_alt,1,_SC("y")),
  1212. _DECL_FL_FUNC(event_button,1,_SC("y")),
  1213. _DECL_FL_FUNC(event_button1,1,_SC("y")),
  1214. _DECL_FL_FUNC(event_button2,1,_SC("y")),
  1215. _DECL_FL_FUNC(event_button3,1,_SC("y")),
  1216. _DECL_FL_FUNC(event_buttons,1,_SC("y")),
  1217. _DECL_FL_FUNC(event_command,1,_SC("y")),
  1218. _DECL_FL_FUNC(event_ctrl,1,_SC("y")),
  1219. _DECL_FL_FUNC(event_dx,1,_SC("y")),
  1220. _DECL_FL_FUNC(event_dy,1,_SC("y")),
  1221. _DECL_FL_FUNC(event_length,1,_SC("y")),
  1222. _DECL_FL_FUNC(event_shift,1,_SC("y")),
  1223. _DECL_FL_FUNC(event_x,1,_SC("y")),
  1224. _DECL_FL_FUNC(event_x_root,1,_SC("y")),
  1225. _DECL_FL_FUNC(event_y,1,_SC("y")),
  1226. _DECL_FL_FUNC(event_y_root,1,_SC("y")),
  1227. _DECL_FL_FUNC(x,1,_SC("y")),
  1228. _DECL_FL_FUNC(y,1,_SC("y")),
  1229. _DECL_FL_FUNC(h,1,_SC("y")),
  1230. _DECL_FL_FUNC(w,1,_SC("y")),
  1231. _DECL_FL_FUNC(ready,1,_SC("y")),
  1232. _DECL_FL_FUNC(screen_count,1,_SC("y")),
  1233. _DECL_FL_FUNC(set_fonts,-1,_SC("ys")),
  1234. _DECL_FL_FUNC(set_font,3,_SC("yi s|i")),
  1235. _DECL_FL_FUNC(get_font,2,_SC("yi")),
  1236. _DECL_FL_FUNC(get_font_name, 2,_SC("yi")),
  1237. _DECL_FL_FUNC(scheme,-1,_SC("ys")),
  1238. _DECL_FL_FUNC(visual,2,_SC("yi")),
  1239. _DECL_FL_FUNC(option,-2,_SC("yib")),
  1240. _DECL_FL_FUNC(event_key,-1,_SC("yi")),
  1241. _DECL_FL_FUNC(event_state,-1,_SC("yi")),
  1242. _DECL_FL_FUNC(event_is_click,-1,_SC("yi")),
  1243. _DECL_FL_FUNC(event_clicks,-1,_SC("yi")),
  1244. _DECL_FL_FUNC(scrollbar_size,-1,_SC("yi")),
  1245. _DECL_FL_FUNC(visible_focus,-1,_SC("yi")),
  1246. _DECL_FL_FUNC(do_widget_deletion,1,_SC("y")),
  1247. _DECL_FL_FUNC(delete_widget,2,_SC("yx")),
  1248. _DECL_FL_FUNC(add_timeout,-3,_SC("ync.")),
  1249. _DECL_FL_FUNC(add_idle,-2,_SC("yc.")),
  1250. _DECL_FL_FUNC(add_focus_changing_handler,2,_SC("yc")),
  1251. {0,0}
  1252. };
  1253. #undef _DECL_FL_FUNC
  1254. #define INT_CONST(s) { #s, s },
  1255. static const struct {
  1256. const char* name;
  1257. int value;
  1258. } fltk_constants[] = {
  1259. INT_CONST(FLVF_PERSIST_SELECT)
  1260. INT_CONST(FLVF_ROW_SELECT)
  1261. INT_CONST(FLVS_NONE)
  1262. INT_CONST(FL_ALIGN_BOTTOM)
  1263. INT_CONST(FL_ALIGN_CENTER)
  1264. INT_CONST(FL_ALIGN_CLIP)
  1265. INT_CONST(FL_ALIGN_INSIDE)
  1266. INT_CONST(FL_ALIGN_LEFT)
  1267. INT_CONST(FL_ALIGN_RIGHT)
  1268. INT_CONST(FL_ALIGN_TOP)
  1269. INT_CONST(FL_ALIGN_TOP_LEFT)
  1270. INT_CONST(FL_ALIGN_TOP_RIGHT)
  1271. INT_CONST(FL_ALIGN_WRAP)
  1272. INT_CONST(FL_ALT)
  1273. INT_CONST(FL_BACKGROUND2_COLOR)
  1274. INT_CONST(FL_BACKGROUND_COLOR)
  1275. INT_CONST(FL_BLACK)
  1276. INT_CONST(FL_BLUE)
  1277. INT_CONST(FL_BOLD)
  1278. INT_CONST(FL_BORDER_BOX)
  1279. INT_CONST(FL_BORDER_FRAME)
  1280. INT_CONST(FL_COMMAND)
  1281. INT_CONST(FL_COURIER)
  1282. INT_CONST(FL_COURIER_BOLD)
  1283. INT_CONST(FL_COURIER_BOLD_ITALIC)
  1284. INT_CONST(FL_COURIER_ITALIC)
  1285. INT_CONST(FL_CYAN)
  1286. INT_CONST(FL_DARK1)
  1287. INT_CONST(FL_DARK2)
  1288. INT_CONST(FL_DARK3)
  1289. INT_CONST(FL_DARK_BLUE)
  1290. INT_CONST(FL_DARK_CYAN)
  1291. INT_CONST(FL_DARK_GREEN)
  1292. INT_CONST(FL_DARK_MAGENTA)
  1293. INT_CONST(FL_DARK_RED)
  1294. INT_CONST(FL_DARK_YELLOW)
  1295. INT_CONST(FL_DOUBLE)
  1296. INT_CONST(FL_DOWN_BOX)
  1297. INT_CONST(FL_DOWN_FRAME)
  1298. INT_CONST(FL_ENGRAVED_BOX)
  1299. INT_CONST(FL_ENGRAVED_FRAME)
  1300. INT_CONST(FL_FLAT_BOX)
  1301. INT_CONST(FL_FOREGROUND_COLOR)
  1302. INT_CONST(FL_GREEN)
  1303. INT_CONST(FL_HELVETICA)
  1304. INT_CONST(FL_HELVETICA_BOLD)
  1305. INT_CONST(FL_HELVETICA_BOLD_ITALIC)
  1306. INT_CONST(FL_HELVETICA_ITALIC)
  1307. INT_CONST(FL_INACTIVE_COLOR)
  1308. INT_CONST(FL_INDEX)
  1309. INT_CONST(FL_ITALIC)
  1310. INT_CONST(FL_MAGENTA)
  1311. INT_CONST(FL_MENU_DIVIDER)
  1312. INT_CONST(FL_NORMAL_LABEL)
  1313. INT_CONST(FL_NO_BOX)
  1314. INT_CONST(FL_NO_LABEL)
  1315. INT_CONST(FL_RED)
  1316. INT_CONST(FL_RGB)
  1317. INT_CONST(FL_RGB8)
  1318. INT_CONST(FL_SELECTION_COLOR)
  1319. INT_CONST(FL_SHADOW_LABEL)
  1320. INT_CONST(FL_SHIFT)
  1321. INT_CONST(FL_SUBMENU)
  1322. INT_CONST(FL_TIMES)
  1323. INT_CONST(FL_TIMES_BOLD)
  1324. INT_CONST(FL_TIMES_BOLD_ITALIC)
  1325. INT_CONST(FL_TIMES_ITALIC)
  1326. INT_CONST(FL_UP_BOX)
  1327. INT_CONST(FL_WHEN_CHANGED)
  1328. INT_CONST(FL_WHEN_ENTER_KEY)
  1329. INT_CONST(FL_WHEN_ENTER_KEY_ALWAYS)
  1330. INT_CONST(FL_WHEN_ENTER_KEY_CHANGED)
  1331. INT_CONST(FL_WHEN_NEVER)
  1332. INT_CONST(FL_WHEN_NOT_CHANGED)
  1333. INT_CONST(FL_WHEN_RELEASE)
  1334. INT_CONST(FL_WHEN_RELEASE_ALWAYS)
  1335. INT_CONST(FL_WHITE)
  1336. INT_CONST(FL_YELLOW)
  1337. /* terminator */
  1338. { NULL, 0 }
  1339. };
  1340. #undef INT_CONST
  1341. #define PUSH_FL_CLASS(klass, parent, method_funcs) \
  1342. sq_pushnewclass(sqvm, _SC(#klass), _SC(#parent), (void*)FLTK_TAG(klass), method_funcs, SQFalse)
  1343. #ifdef __cplusplus
  1344. extern "C" {
  1345. #endif
  1346. SQRESULT sqext_register_fltklib(HSQUIRRELVM sqvm)
  1347. {
  1348. Fl::user_data = sqvm;
  1349. //sq_pushstring(sqvm,_SC("fltk"),-1);
  1350. //sq_newtable(sqvm);
  1351. #define INT_CONST_PREFIX_VALUE(prefix, key, value) \
  1352. sq_pushstring(sqvm, _SC(#key), -1);\
  1353. sq_pushinteger(sqvm, prefix value);\
  1354. sq_newslot(sqvm, -3, SQTrue);
  1355. #define INT_CONST_PREFIX(prefix, key) INT_CONST_PREFIX_VALUE(prefix, key, key)
  1356. #define INT_CONST(key) INT_CONST_PREFIX(, key)
  1357. //Fl class
  1358. sq_pushnewclass(sqvm, _SC("Fl"), NULL, (void*)FLTK_TAG(Fl), fl_obj_funcs, SQTrue);
  1359. INT_CONST_PREFIX(Fl::, OPTION_ARROW_FOCUS);
  1360. INT_CONST_PREFIX(Fl::, OPTION_VISIBLE_FOCUS);
  1361. INT_CONST_PREFIX(Fl::, OPTION_DND_TEXT);
  1362. INT_CONST_PREFIX(Fl::, OPTION_SHOW_TOOLTIPS);
  1363. sq_poptop(sqvm); //remove Fl class
  1364. //Fl_Widget class
  1365. sq_pushnewclass(sqvm, _SC("Fl_Widget"), NULL, (void*)FLTK_TAG(Fl_Widget), fl_widget_obj_funcs, SQTrue);
  1366. sq_pushuserpointer(sqvm, (void*)FLTK_TAG(Fl_Widget)); //push a key to be used on registrytable
  1367. sq_push(sqvm, -2);
  1368. sq_setonregistrytable(sqvm); //save a reference on registry to easy access, this will pop the Fl_Widget class
  1369. sq_poptop(sqvm);
  1370. //Fl_Box class
  1371. PUSH_FL_CLASS(Fl_Box, Fl_Widget, fl_box_obj_funcs);
  1372. //Fl_Button class
  1373. PUSH_FL_CLASS(Fl_Button, Fl_Widget, fl_button_obj_funcs);
  1374. PUSH_FL_CLASS(Fl_Light_Button, Fl_Button, fl_light_button_obj_funcs);
  1375. PUSH_FL_CLASS(Fl_Check_Button, Fl_Light_Button, fl_check_button_obj_funcs);
  1376. PUSH_FL_CLASS(Fl_Radio_Button, Fl_Button, fl_radio_button_obj_funcs);
  1377. PUSH_FL_CLASS(Fl_Return_Button, Fl_Button, fl_radio_button_obj_funcs);
  1378. PUSH_FL_CLASS(Fl_Menu_, Fl_Widget, fl_menu__obj_funcs);
  1379. PUSH_FL_CLASS(Fl_Menu_Bar, Fl_Menu_, fl_menu_bar_obj_funcs);
  1380. PUSH_FL_CLASS(Fl_Choice, Fl_Menu_, fl_choice_obj_funcs);
  1381. //Fl_Input_ class
  1382. PUSH_FL_CLASS(Fl_Input_, Fl_Widget, fl_input__obj_funcs);
  1383. PUSH_FL_CLASS(Fl_Input, Fl_Input_, fl_input_obj_funcs);
  1384. PUSH_FL_CLASS(Fl_Float_Input, Fl_Input, fl_float_input_obj_funcs);
  1385. PUSH_FL_CLASS(Fl_Int_Input, Fl_Input, fl_int_input_obj_funcs);
  1386. PUSH_FL_CLASS(Fl_Output, Fl_Input, fl_output_obj_funcs);
  1387. PUSH_FL_CLASS(Fl_Secret_Input, Fl_Input, fl_secret_input_obj_funcs);
  1388. //Fl_Group class
  1389. PUSH_FL_CLASS(Fl_Group, Fl_Widget, fl_group_obj_funcs);
  1390. PUSH_FL_CLASS(Fl_Pack, Fl_Group, fl_pack_obj_funcs);
  1391. PUSH_FL_CLASS(Fl_Tabs, Fl_Group, fl_tabs_obj_funcs);
  1392. PUSH_FL_CLASS(Fl_Scroll, Fl_Group, fl_scroll_obj_funcs);
  1393. PUSH_FL_CLASS(Fl_Text_Display, Fl_Group, fl_text_display_obj_funcs);
  1394. PUSH_FL_CLASS(Fl_Text_Editor, Fl_Text_Display, fl_text_editor_obj_funcs);
  1395. PUSH_FL_CLASS(Fl_Text_Editor_Buffered, Fl_Text_Editor, fl_text_editor_buffered_obj_funcs);
  1396. PUSH_FL_CLASS(Flv_List, Fl_Group, flv_list_obj_funcs);
  1397. PUSH_FL_CLASS(Flv_Table, Flv_List, flv_table_obj_funcs);
  1398. //Fl_Window class
  1399. PUSH_FL_CLASS(Fl_Window, Fl_Group, fl_window_obj_funcs);
  1400. //Fl_Double_Window class
  1401. PUSH_FL_CLASS(Fl_Double_Window, Fl_Window, fl_double_window_obj_funcs);
  1402. sq_pushnewclass(sqvm, Fl_Text_Buffer_TAG, NULL, (void*)Fl_Text_Buffer_TAG, fl_text_buffer_obj_funcs, SQFalse);
  1403. sq_pushconsttable(sqvm);
  1404. INT_CONST_PREFIX_VALUE(, FL_SHADOW_LABEL, FL_SHADOW_LABEL);
  1405. /* add constants to global table */
  1406. int i=0;
  1407. while (fltk_constants[i].name) {
  1408. sq_pushstring(sqvm, fltk_constants[i].name, -1);
  1409. sq_pushinteger(sqvm, fltk_constants[i].value);
  1410. sq_rawset(sqvm, -3);
  1411. ++i;
  1412. }
  1413. sq_poptop(sqvm);
  1414. //check to see if we need to release resources
  1415. Fl::do_at_widget_destroy_ = At_Widget_Destroy;
  1416. return SQ_OK;
  1417. }
  1418. #ifdef __cplusplus
  1419. }
  1420. #endif
  1421. #endif //WITH_FLTK