sq_fltk.cpp 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339
  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_Round_Button.H>
  16. #include <FL/Fl_Menu_Item.H>
  17. #include <FL/Fl_Menu_.H>
  18. #include <FL/Fl_Menu_Bar.H>
  19. #include <FL/Fl_Choice.H>
  20. #include <FL/Fl_Input_.H>
  21. #include <FL/Fl_Input.H>
  22. #include <FL/Fl_Float_Input.H>
  23. #include <FL/Fl_Int_Input.H>
  24. #include <FL/Fl_Output.H>
  25. #include <FL/Fl_Secret_Input.H>
  26. #include <FL/Fl_Scroll.H>
  27. #include <FL/Fl_Text_Display.H>
  28. #include <FL/Fl_Text_Editor.H>
  29. #include <FL/Fl_Pack.H>
  30. #include <FL/Fl_Tabs.H>
  31. #include <FL/Flv_List.H>
  32. #include <FL/Flv_Table.H>
  33. #include <FL/Fl_Image.H>
  34. #include <FL/Fl_PNG_Image.H>
  35. #include <FL/Fl_JPEG_Image.H>
  36. #include <FL/Fl_File_Chooser.H>
  37. #include <FL/Fl_Native_File_Chooser.H>
  38. #include <squirrel.h>
  39. #include "sqfltk.h"
  40. struct MyFltkUData {
  41. HSQOBJECT self;
  42. HSQOBJECT udata;
  43. HSQUIRRELVM v;
  44. };
  45. #define FLTK_TAG(tag) SQFLTK_##tag##_TYPE_TAG
  46. #define CREATE_TAG(tag) static const SQChar FLTK_TAG(tag)[] = _SC(#tag);
  47. CREATE_TAG(Fl);
  48. CREATE_TAG(Fl_Widget);
  49. CREATE_TAG(Fl_Button);
  50. CREATE_TAG(Fl_Light_Button);
  51. CREATE_TAG(Fl_Check_Button);
  52. CREATE_TAG(Fl_Radio_Button);
  53. CREATE_TAG(Fl_Return_Button);
  54. CREATE_TAG(Fl_Round_Button);
  55. CREATE_TAG(Fl_Menu_);
  56. CREATE_TAG(Fl_Menu_Bar);
  57. CREATE_TAG(Fl_Menu_Item);
  58. CREATE_TAG(Fl_Choice);
  59. CREATE_TAG(Fl_Input_);
  60. CREATE_TAG(Fl_Float_Input);
  61. CREATE_TAG(Fl_Int_Input);
  62. CREATE_TAG(Fl_Output);
  63. CREATE_TAG(Fl_Secret_Input);
  64. CREATE_TAG(Fl_Scroll);
  65. CREATE_TAG(Fl_Group);
  66. CREATE_TAG(Fl_Pack);
  67. CREATE_TAG(Fl_Tabs);
  68. CREATE_TAG(Flv_Style);
  69. CREATE_TAG(Flv_Style_List);
  70. CREATE_TAG(Flv_List);
  71. CREATE_TAG(Flv_Table);
  72. CREATE_TAG(Fl_Text_Display);
  73. CREATE_TAG(Fl_Text_Editor);
  74. CREATE_TAG(Fl_Text_Editor_Buffered);
  75. CREATE_TAG(Fl_Window);
  76. CREATE_TAG(Fl_Double_Window);
  77. CREATE_TAG(Fl_Image);
  78. CREATE_TAG(Fl_PNG_Image);
  79. CREATE_TAG(Fl_JPEG_Image);
  80. CREATE_TAG(Fl_File_Chooser);
  81. CREATE_TAG(Fl_Native_File_Chooser);
  82. CREATE_TAG(Fl_Text_Buffer);
  83. static const SQChar FLTK_key[] = _SC("FLTK");
  84. static const SQChar FLTK_constructor_Mask[] = _SC("xiiii s|o");
  85. static SQRESULT fltk_register_object_and_instance(HSQUIRRELVM v, int instance_idx, void *cptr){
  86. sq_pushstring(v, FLTK_key, -1);
  87. if(sq_getonregistrytable(v) < 0){
  88. sq_newtable(v);
  89. sq_pushstring(v, FLTK_key, -1);
  90. sq_push(v, -2);
  91. sq_setonregistrytable(v);
  92. }
  93. sq_pushuserpointer(v, cptr);
  94. //sq_weakref(v, instance_idx);
  95. sq_push(v, instance_idx);
  96. sq_rawset(v, -3);
  97. sq_pop(v, -1);
  98. return SQ_OK;
  99. }
  100. static SQRESULT fltk_deregister_instance(HSQUIRRELVM v, void *cptr){
  101. sq_pushstring(v, FLTK_key, -1);
  102. if(sq_getonregistrytable(v) >= 0){
  103. sq_pushuserpointer(v, cptr);
  104. sq_deleteslot(v, -2, SQFalse);
  105. sq_pop(v, -1);
  106. return SQ_OK;
  107. }
  108. return SQ_ERROR;
  109. }
  110. static SQRESULT fltk_get_registered_instance(HSQUIRRELVM v, void *cptr){
  111. sq_pushstring(v, FLTK_key, -1);
  112. if(sq_getonregistrytable(v) >= 0){
  113. sq_pushuserpointer(v, cptr);
  114. if(sq_rawget(v, -2) >= 0){
  115. sq_remove(v, -2);
  116. return SQ_OK;
  117. }
  118. sq_poptop(v);
  119. }
  120. return SQ_ERROR;
  121. }
  122. static SQInteger getInstance_for_Fl_Klass(HSQUIRRELVM v, const SQChar *klass, SQUserPointer *ptr){
  123. if(!ptr) return SQ_ERROR;
  124. if(SQ_SUCCEEDED(fltk_get_registered_instance(v, ptr))) return SQ_OK;
  125. sq_pushstring(v, klass, -1);
  126. if(SQ_SUCCEEDED(sq_getonroottable(v))
  127. && SQ_SUCCEEDED(sq_createinstance(v, -1))
  128. && SQ_SUCCEEDED(sq_setinstanceup(v, -1, ptr))){
  129. sq_replace(v, -2); //remove Fl_widget class from stack
  130. return SQ_OK;
  131. }
  132. return SQ_ERROR;
  133. }
  134. #define SETUP_KLASS(v, Klass, Klass_TAG) \
  135. Klass *self = NULL; \
  136. { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(void*)Klass_TAG))) \
  137. return SQ_ERROR; }
  138. #define SETUP_FL_KLASS(v, Klass) SETUP_KLASS(v, Klass, FLTK_TAG(Klass))
  139. #define SETUP_FL_WIDGET(v) SETUP_FL_KLASS(v, Fl_Widget)
  140. #define NOTHING(a)
  141. #define AS_IS(a) a
  142. #define FLTK_CONSTRUCTOR_RELEASE_WINDOW(Klass, RELEASE_HOOK, _release_hook)\
  143. static SQInteger _##Klass##_constructor(HSQUIRRELVM v)\
  144. {\
  145. const SQChar *label = NULL;\
  146. SQInteger argc, x,y,w,h;\
  147. Klass *cptr;\
  148. argc = sq_gettop(v);\
  149. if(argc > 4){\
  150. sq_getinteger(v, 2, &x);\
  151. sq_getinteger(v, 3, &y);\
  152. sq_getinteger(v, 4, &w);\
  153. sq_getinteger(v, 5, &h);\
  154. if(argc > 5 && sq_gettype(v, 6) == OT_STRING) sq_getstring(v, 6, &label);\
  155. cptr = new Klass(x,y,w,h,label);\
  156. } else if(argc > 2){\
  157. sq_getinteger(v, 2, &w);\
  158. sq_getinteger(v, 3, &h);\
  159. if(argc > 3 && sq_gettype(v, 4) == OT_STRING) sq_getstring(v, 4, &label);\
  160. cptr = new Klass(w,h,label);\
  161. } else \
  162. return sq_throwerror(v, _SC("Wrong number of parameters."));\
  163. fltk_register_object_and_instance(v, 1, cptr);\
  164. sq_setinstanceup(v, 1, cptr);\
  165. RELEASE_HOOK(sq_setreleasehook(v,1,_release_hook));\
  166. return 1;\
  167. }
  168. #define FLTK_CONSTRUCTOR_RELEASE(Klass, RELEASE_HOOK, _release_hook)\
  169. static SQInteger _##Klass##_constructor(HSQUIRRELVM v)\
  170. {\
  171. const SQChar *label = NULL;\
  172. SQInteger argc, x,y,w,h;\
  173. Klass *cptr;\
  174. argc = sq_gettop(v);\
  175. if(argc > 4){\
  176. sq_getinteger(v, 2, &x);\
  177. sq_getinteger(v, 3, &y);\
  178. sq_getinteger(v, 4, &w);\
  179. sq_getinteger(v, 5, &h);\
  180. if(argc > 5 && sq_gettype(v, 6) == OT_STRING) sq_getstring(v, 6, &label);\
  181. cptr = new Klass(x,y,w,h,label);\
  182. fltk_register_object_and_instance(v, 1, cptr);\
  183. } else \
  184. return sq_throwerror(v, _SC("Wrong number of parameters."));\
  185. sq_setinstanceup(v, 1, cptr);\
  186. RELEASE_HOOK(sq_setreleasehook(v,1,_release_hook));\
  187. return 1;\
  188. }
  189. #define FLTK_CONSTRUCTOR(Klass) FLTK_CONSTRUCTOR_RELEASE(Klass, NOTHING, a)
  190. #define FUNC_GETSET_STR(prefix, getSelf, selfPtr, funcNAME) \
  191. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  192. {\
  193. getSelf;\
  194. SQInteger argc = sq_gettop(v);\
  195. const SQChar *str = NULL;\
  196. if(argc > 1){\
  197. if(sq_gettype(v, 2) == OT_STRING) sq_getstring(v, 2, &str);\
  198. selfPtr funcNAME(str);\
  199. return 0;\
  200. }\
  201. str = selfPtr funcNAME();\
  202. if(str) sq_pushstring(v, str, -1);\
  203. else sq_pushnull(v);\
  204. return 1;\
  205. }
  206. #define FUNC_GETSET_INT(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  207. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  208. {\
  209. getSelf;\
  210. SQInteger argc = sq_gettop(v);\
  211. SQInteger iparm;\
  212. if(argc > 1){\
  213. sq_getinteger(v, 2, &iparm);\
  214. selfPtr funcNAME((typeCast)iparm);\
  215. return 0;\
  216. }\
  217. sq_pushinteger(v, selfPtr funcNAME());\
  218. return 1;\
  219. }
  220. #define FUNC_GETSET_INT_ONE_CALL(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  221. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  222. {\
  223. getSelf;\
  224. SQInteger argc = sq_gettop(v);\
  225. SQInteger iparm;\
  226. if(argc > 1){\
  227. sq_getinteger(v, 2, &iparm);\
  228. sq_pushinteger(v, selfPtr funcNAME((typeCast)iparm));\
  229. return 1;\
  230. }\
  231. return sq_throwerror(v, _SC("one integer parameter expected"));\
  232. }
  233. #define FUNC_GETSET_INT_BOOL(prefix, getSelf, selfPtr, funcNAME, typeCast) \
  234. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  235. {\
  236. getSelf;\
  237. SQInteger argc = sq_gettop(v);\
  238. SQInteger iparm;\
  239. SQBool bparm;\
  240. if(argc > 1){\
  241. sq_getinteger(v, 2, &iparm);\
  242. if(argc > 2) {\
  243. sq_getbool(v, 3, &bparm);\
  244. selfPtr funcNAME((typeCast)iparm, bparm == SQTrue);\
  245. return 0;\
  246. }\
  247. sq_pushbool(v, selfPtr funcNAME((typeCast)iparm));\
  248. return 1;\
  249. }\
  250. return sq_throwerror(v, _SC("invalid number of parameters"));\
  251. }
  252. #define FUNC_VOID_CALL(prefix, getSelf, selfPtr, funcNAME) \
  253. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  254. {\
  255. getSelf(v);\
  256. selfPtr funcNAME();\
  257. return 0;\
  258. }
  259. #define FUNC_VOID_CALL_2INT(prefix, getSelf, funcNAME) \
  260. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  261. {\
  262. getSelf(v);\
  263. SQInteger i1, i2;\
  264. sq_getinteger(v, 2, &i1);\
  265. sq_getinteger(v, 3, &i2);\
  266. self->funcNAME(i1,i2);\
  267. return 0;\
  268. }
  269. #define FUNC_VOID_CALL_4INT(prefix, getSelf, funcNAME) \
  270. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  271. {\
  272. getSelf(v);\
  273. SQInteger i1, i2, i3, i4;\
  274. sq_getinteger(v, 2, &i1);\
  275. sq_getinteger(v, 3, &i2);\
  276. sq_getinteger(v, 4, &i3);\
  277. sq_getinteger(v, 5, &i4);\
  278. self->funcNAME(i1,i2,i3,i4);\
  279. return 0;\
  280. }
  281. #define FUNC_INT_CALL(prefix, getSelf, funcNAME) \
  282. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  283. {\
  284. getSelf(v);\
  285. sq_pushinteger(v, self->funcNAME());\
  286. return 1;\
  287. }
  288. #define FUNC_SET_INT(prefix, getSelf, funcNAME) \
  289. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  290. {\
  291. getSelf(v);\
  292. SQInteger iparam; sq_getinteger(v, 2, &iparam);\
  293. self->funcNAME(iparam));\
  294. return 0;\
  295. }
  296. #define FUNC_STR_CALL(prefix, getSelf, funcNAME) \
  297. static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
  298. {\
  299. getSelf(v);\
  300. sq_pushstring(v, self->funcNAME(), -1);\
  301. return 1;\
  302. }
  303. #define FL_WIDGET_GETSET_STR(funcNAME) FUNC_GETSET_STR(_flwidget_, SETUP_FL_WIDGET(v), self->, funcNAME)
  304. #define FL_WIDGET_GETSET_INT0(funcNAME, typeNAME) FUNC_GETSET_INT(_flwidget_, SETUP_FL_WIDGET(v), self->, funcNAME, typeNAME)
  305. #define FL_WIDGET_GETSET_INT(funcNAME) FL_WIDGET_GETSET_INT0(funcNAME, int)
  306. #define FL_WIDGET_GETSET_INT_CAST(funcNAME, castType) FL_WIDGET_GETSET_INT0(funcNAME, castType)
  307. #define FL_WIDGET_VOID_CALL(funcNAME) FUNC_VOID_CALL(_flwidget_, SETUP_FL_WIDGET, self->, funcNAME)
  308. #define FL_WIDGET_VOID_CALL_2INT(funcNAME) FUNC_VOID_CALL_2INT(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  309. #define FL_WIDGET_VOID_CALL_4INT(funcNAME) FUNC_VOID_CALL_4INT(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  310. #define FL_WIDGET_INT_CALL(funcNAME) FUNC_INT_CALL(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  311. #define FL_WIDGET_STR_CALL(funcNAME) FUNC_STR_CALL(_flwidget_, SETUP_FL_WIDGET, funcNAME)
  312. #define GETINSTANCE_FOR_FL_KLASS(Klass)\
  313. static SQInteger getInstance_for_##Klass(HSQUIRRELVM v, Klass *widget){\
  314. if(!widget) return SQ_ERROR;\
  315. if(fltk_get_registered_instance(v, widget) == SQ_OK) return SQ_OK;\
  316. int rc;\
  317. sq_pushuserpointer(v, (void*)FLTK_TAG(Klass));\
  318. rc = sq_getonregistrytable(v);\
  319. rc = sq_createinstance(v, -1);\
  320. rc = sq_setinstanceup(v, -1, widget);\
  321. sq_replace(v, -2);\
  322. return SQ_OK;\
  323. }
  324. GETINSTANCE_FOR_FL_KLASS(Fl_Widget);
  325. GETINSTANCE_FOR_FL_KLASS(Fl_Group);
  326. static SQRESULT fltk_pushinstance(HSQUIRRELVM v, const SQChar *klass, SQUserPointer self){
  327. sq_pushstring(v, klass,-1);
  328. if(sq_getonroottable(v) == SQ_OK){
  329. if(sq_createinstance(v, -1) == SQ_OK){
  330. sq_setinstanceup(v, -1, self);
  331. return 1;
  332. }
  333. }
  334. return SQ_ERROR;
  335. }
  336. static SQRESULT sq_get_fl_virtual(HSQUIRRELVM v, void *self, const SQChar *func_name){
  337. //sq_reservestack(v, 20);
  338. if(fltk_get_registered_instance(v, self) == SQ_OK){
  339. sq_pushstring(v, func_name, -1);
  340. sq_get(v, -2);
  341. SQObjectType toptype = sq_gettype(v, -1);
  342. if(toptype == OT_CLOSURE || toptype == OT_NATIVECLOSURE){
  343. return SQ_OK;
  344. }
  345. }
  346. return SQ_ERROR;
  347. }
  348. static void sq_call_fl_virtual(void *self, const SQChar *func_name){
  349. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  350. //sq_reservestack(v, 20);
  351. SQInteger top = sq_gettop(v);
  352. if(sq_get_fl_virtual(v, self, func_name) == SQ_OK){
  353. sq_push(v, -2); //this
  354. sq_call(v, 1, SQFalse, SQTrue);
  355. }
  356. sq_settop(v, top);
  357. }
  358. typedef struct {
  359. HSQOBJECT callback;
  360. HSQOBJECT sender;
  361. HSQOBJECT udata;
  362. } st_mycb;
  363. //static st_mycb static_cb;
  364. static void free_st_mycb(HSQUIRRELVM v, st_mycb *cb){
  365. sq_release(v, &cb->callback);
  366. sq_release(v, &cb->udata);
  367. sq_free((void*)cb, sizeof(st_mycb));
  368. }
  369. static void At_Widget_Destroy(Fl_Widget *widget){
  370. //printf("%d %p At_Widget_Destroy\n", __LINE__, widget);
  371. Fl_Callback_p cb = widget->callback();
  372. if(!cb || cb == Fl_Widget::default_callback) {
  373. //no need to check
  374. return;
  375. }
  376. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  377. SQInteger savedTop = sq_gettop(v);
  378. //printf("%d %p %d At_Widget_Destroy\n", __LINE__, widget, sq_gettop(v));
  379. int rc = fltk_deregister_instance(v, widget);
  380. //printf("%d %p %d At_Widget_Destroy\n", __LINE__, widget, sq_gettop(v));
  381. //printf("%d %p %d %s At_Widget_Destroy\n", __LINE__, widget, rc, sq_getlasterror_str(v));
  382. //if(sq_deleteslot(v, -2, SQTrue) == SQ_OK){
  383. if(rc == SQ_OK){
  384. //printf("%d %p At_Widget_Destroy\n", __LINE__, widget);
  385. if(sq_gettype(v, -1) != OT_NULL){
  386. //////////////////////////////nota all will have user pointer !!!!!!!!
  387. SQUserPointer ptr;
  388. sq_getuserpointer(v, -1, &ptr);
  389. //free_st_mycb(v, (st_mycb*)ptr);
  390. }
  391. }
  392. sq_settop(v, savedTop);
  393. }
  394. static void fltk_calback_hook(Fl_Widget *sender, void* udata){
  395. //printf("Sender %p, data %p\n", sender, udata);
  396. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  397. SQInteger savedTop = sq_gettop(v);
  398. st_mycb *mycb = (st_mycb *)udata;
  399. sq_pushobject(v, mycb->callback);
  400. sq_pushroottable(v); //’this’ (function environment object)
  401. if(fltk_get_registered_instance(v, sender) != SQ_OK) sq_pushnull(v);
  402. sq_pushobject(v, mycb->udata);
  403. sq_call(v, 3, SQFalse, SQTrue);
  404. //printf("%d\n", sq_call(v, 3, SQFalse, SQTrue));
  405. sq_settop(v, savedTop);
  406. }
  407. static SQInteger _flwidget_callback(HSQUIRRELVM v)
  408. {
  409. //printf("%d %s\n", __LINE__, __FILE__);
  410. SETUP_FL_WIDGET(v);
  411. SQInteger argc = sq_gettop(v);
  412. Fl_Callback_p cb = self->callback();
  413. if(cb == Fl_Widget::default_callback){
  414. cb = 0;
  415. }
  416. if(argc == 1){
  417. if(cb) sq_pushuserpointer(v, (void*)cb);
  418. else sq_pushnull(v);
  419. return 1;
  420. }
  421. if(argc >= 2){
  422. int ptypecb = sq_gettype(v, 2);
  423. if(cb || ptypecb == OT_NULL) { //not allways the cb was set by us
  424. At_Widget_Destroy(self);
  425. if(ptypecb == OT_NULL) {
  426. self->callback((Fl_Callback*)NULL, (void*)NULL);
  427. return 0;
  428. }
  429. }
  430. st_mycb *mycb = (st_mycb *)sq_malloc(sizeof(st_mycb));
  431. sq_resetobject(&mycb->callback); //initializes the object handle (sets to NULL)
  432. sq_resetobject(&mycb->sender);
  433. sq_resetobject(&mycb->udata);
  434. sq_getstackobj(v, 2, &mycb->callback);//fetches an handle of the function you passed
  435. if(sq_gettop(v) > 2) { //we have user data too
  436. sq_getstackobj(v, 3, &mycb->udata);
  437. sq_addref(v,&mycb->udata);
  438. }
  439. if(sq_type(mycb->callback) == OT_CLOSURE || sq_type(mycb->callback) == OT_NATIVECLOSURE){
  440. sq_addref(v,&mycb->callback);
  441. //sq_getstackobj(v, 1, &mycb->sender);
  442. self->callback(&fltk_calback_hook, mycb);
  443. //registry for free when widget is destroyed
  444. sq_pushregistrytable(v);
  445. sq_pushuserpointer(v, self);
  446. sq_pushuserpointer(v, mycb);
  447. sq_rawset(v, -2);
  448. //printf("Button %p\n", self);
  449. }
  450. }
  451. return 0;
  452. }
  453. FL_WIDGET_GETSET_INT(align);
  454. FL_WIDGET_GETSET_INT(argument);
  455. FL_WIDGET_GETSET_INT_CAST(box, Fl_Boxtype);
  456. FL_WIDGET_GETSET_INT(color);
  457. FL_WIDGET_GETSET_INT(selection_color);
  458. FL_WIDGET_GETSET_STR(label);
  459. FL_WIDGET_GETSET_INT(labelcolor);
  460. FL_WIDGET_GETSET_INT(labelfont);
  461. FL_WIDGET_GETSET_INT(labelsize);
  462. FL_WIDGET_GETSET_INT_CAST(labeltype, Fl_Labeltype);
  463. FL_WIDGET_GETSET_INT(textfont);
  464. FL_WIDGET_GETSET_INT(textsize);
  465. FL_WIDGET_GETSET_STR(tooltip);
  466. FL_WIDGET_GETSET_INT(when);
  467. FL_WIDGET_GETSET_INT(type);
  468. FL_WIDGET_GETSET_INT(x);
  469. FL_WIDGET_GETSET_INT(y);
  470. FL_WIDGET_GETSET_INT(w);
  471. FL_WIDGET_GETSET_INT(h);
  472. FL_WIDGET_VOID_CALL_2INT(position);
  473. FL_WIDGET_VOID_CALL_2INT(size);
  474. FL_WIDGET_VOID_CALL_4INT(resize);
  475. //FUNC_SET_INT(_flwidget_, SETUP_FL_WIDGET, clear_flag);
  476. //FL_WIDGET_STR_CALL(classId);
  477. static SQInteger _flwidget_classId(HSQUIRRELVM v)
  478. {
  479. SETUP_FL_WIDGET(v);
  480. if(!self) return sq_throwerror(v, _SC("attempt to call method with null object"));
  481. const char *cn = self->classId();
  482. sq_pushstring(v, cn, -1);
  483. return 1;
  484. }
  485. static SQInteger _flwidget_parent(HSQUIRRELVM v)
  486. {
  487. SETUP_FL_WIDGET(v);
  488. if(!self) return sq_throwerror(v, _SC("attempt to call method with null object"));
  489. if(getInstance_for_Fl_Widget(v, self->parent()) != SQ_OK) sq_pushnull(v);
  490. return 1;
  491. }
  492. static SQInteger _flwidget_parent_root(HSQUIRRELVM v)
  493. {
  494. SETUP_FL_WIDGET(v);
  495. if(!self) return sq_throwerror(v, _SC("attempt to call method with null object"));
  496. if(getInstance_for_Fl_Widget(v, self->parent_root()) != SQ_OK) sq_pushnull(v);
  497. return 1;
  498. }
  499. static SQInteger _flwidget_handle(HSQUIRRELVM v)
  500. {
  501. SETUP_FL_WIDGET(v);
  502. SQInteger event;
  503. sq_getinteger(v, 2, &event);
  504. sq_pushinteger(v, self->handle(event));
  505. return 1;
  506. }
  507. FL_WIDGET_VOID_CALL(redraw);
  508. FL_WIDGET_VOID_CALL(redraw_label);
  509. FL_WIDGET_VOID_CALL(hide);
  510. FL_WIDGET_VOID_CALL(show);
  511. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_flwidget_##name,nparams,pmask}
  512. static SQRegFunction fl_widget_obj_funcs[]={
  513. _DECL_FUNC(align,-1,_SC("xi")),
  514. _DECL_FUNC(argument,-1,_SC("xi")),
  515. _DECL_FUNC(box,-1,_SC("xi")),
  516. _DECL_FUNC(callback,-1,_SC("xc.")),
  517. _DECL_FUNC(color,-1,_SC("xi")),
  518. _DECL_FUNC(selection_color,-1,_SC("xi")),
  519. _DECL_FUNC(label,-1,_SC("x s|o")),
  520. _DECL_FUNC(labelcolor,-1,_SC("xi")),
  521. _DECL_FUNC(labelfont,-1,_SC("xi")),
  522. _DECL_FUNC(labelsize,-1,_SC("xi")),
  523. _DECL_FUNC(labeltype,-1,_SC("xi")),
  524. _DECL_FUNC(textfont,-1,_SC("xi")),
  525. _DECL_FUNC(textsize,-1,_SC("xi")),
  526. _DECL_FUNC(tooltip,-1,_SC("xs")),
  527. _DECL_FUNC(type,-1,_SC("xi")),
  528. _DECL_FUNC(when,-1,_SC("xi")),
  529. _DECL_FUNC(handle,2,_SC("xi")),
  530. _DECL_FUNC(redraw,1,_SC("x")),
  531. _DECL_FUNC(redraw_label,1,_SC("x")),
  532. _DECL_FUNC(x,-1,_SC("xn")),
  533. _DECL_FUNC(y,-1,_SC("xn")),
  534. _DECL_FUNC(w,-1,_SC("xn")),
  535. _DECL_FUNC(h,-1,_SC("xn")),
  536. _DECL_FUNC(position,3,_SC("xii")),
  537. _DECL_FUNC(size,3,_SC("xii")),
  538. _DECL_FUNC(resize,5,_SC("xiiii")),
  539. _DECL_FUNC(show,1,_SC("x")),
  540. _DECL_FUNC(hide,1,_SC("x")),
  541. _DECL_FUNC(classId,1,_SC("x")),
  542. _DECL_FUNC(parent,1,_SC("x")),
  543. _DECL_FUNC(parent_root,1,_SC("x")),
  544. // _DECL_FUNC(clear_flag,2,_SC("xi")),
  545. {0,0}
  546. };
  547. #undef _DECL_FUNC
  548. #define MY_FL_CLASS(klass, myfuncs)\
  549. class My##klass : public klass {\
  550. public:\
  551. My##klass(int X, int Y, int W, int H, const char *L=0):klass(X,Y,W,H,L){}\
  552. myfuncs\
  553. };\
  554. CREATE_TAG(klass);\
  555. FLTK_CONSTRUCTOR(My##klass);
  556. MY_FL_CLASS(Fl_Box,
  557. void draw(){
  558. sq_call_fl_virtual(this, "draw");
  559. }
  560. )
  561. static SQInteger _MyFl_Box_draw(HSQUIRRELVM v)
  562. {
  563. SETUP_FL_WIDGET(v);
  564. ((MyFl_Box*)self)->Fl_Box::draw();
  565. return 0;
  566. }
  567. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_MyFl_Box_##name,nparams,pmask}
  568. static SQRegFunction fl_box_obj_funcs[]={
  569. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  570. _DECL_FUNC(draw,1,_SC("x")),
  571. {0,0}
  572. };
  573. #undef _DECL_FUNC
  574. FLTK_CONSTRUCTOR(Fl_Button);
  575. #define SETUP_FL_BUTTON(v) SETUP_FL_KLASS(v, Fl_Button)
  576. #define FL_BUTTON_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Button_, SETUP_FL_BUTTON(v), self->, funcNAME, typeNAME)
  577. FL_BUTTON_GETSET_INT_CAST(down_box, Fl_Boxtype);
  578. FL_BUTTON_GETSET_INT_CAST(value, int);
  579. static SQRESULT _Fl_Button_setonly(HSQUIRRELVM v){
  580. SQ_FUNC_VARS_NO_TOP(v);
  581. SETUP_FL_BUTTON(v);
  582. self->setonly();
  583. return 0;
  584. }
  585. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Button_##name,nparams,pmask}
  586. static SQRegFunction fl_button_obj_funcs[]={
  587. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  588. _DECL_FUNC(down_box,-1,_SC("xi")),
  589. _DECL_FUNC(value,-1,_SC("xi")),
  590. _DECL_FUNC(setonly,1,_SC("x")),
  591. {0,0}
  592. };
  593. #undef _DECL_FUNC
  594. FLTK_CONSTRUCTOR(Fl_Light_Button);
  595. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Light_Button_##name,nparams,pmask}
  596. static SQRegFunction fl_light_button_obj_funcs[]={
  597. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  598. {0,0}
  599. };
  600. #undef _DECL_FUNC
  601. FLTK_CONSTRUCTOR(Fl_Check_Button);
  602. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Check_Button_##name,nparams,pmask}
  603. static SQRegFunction fl_check_button_obj_funcs[]={
  604. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  605. {0,0}
  606. };
  607. #undef _DECL_FUNC
  608. FLTK_CONSTRUCTOR(Fl_Radio_Button);
  609. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Radio_Button_##name,nparams,pmask}
  610. static SQRegFunction fl_radio_button_obj_funcs[]={
  611. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  612. {0,0}
  613. };
  614. #undef _DECL_FUNC
  615. FLTK_CONSTRUCTOR(Fl_Return_Button);
  616. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Return_Button_##name,nparams,pmask}
  617. static SQRegFunction fl_return_button_obj_funcs[]={
  618. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  619. {0,0}
  620. };
  621. #undef _DECL_FUNC
  622. FLTK_CONSTRUCTOR(Fl_Round_Button);
  623. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Round_Button_##name,nparams,pmask}
  624. static SQRegFunction fl_round_button_obj_funcs[]={
  625. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  626. {0,0}
  627. };
  628. #undef _DECL_FUNC
  629. /*
  630. FLTK_CONSTRUCTOR(Fl_Menu_Item);
  631. #define _DECL_FL_MENU_ITEM_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu_Item_##name,nparams,pmask}
  632. static SQRegFunction fl_menu_item_obj_funcs[]={
  633. _DECL_FL_MENU_ITEM_FUNC(constructor,-5,FLTK_constructor_Mask),
  634. {0,0}
  635. };
  636. */
  637. FLTK_CONSTRUCTOR(Fl_Menu_);
  638. #define SETUP_FL_MENU_(v) SETUP_FL_KLASS(v, Fl_Menu_)
  639. static SQInteger _Fl_Menu__copy(HSQUIRRELVM v)
  640. {
  641. SQ_FUNC_VARS(v);
  642. SETUP_FL_MENU_(v);
  643. SQInteger menu_size = sq_getsize(v, 2);
  644. sq_reservestack(v, 20);
  645. SQInteger work_top = sq_gettop(v);
  646. SQInteger nested = 0;
  647. for(int i=0; i < menu_size; ++i){
  648. sq_pushinteger(v, i);
  649. sq_rawget(v, 2);
  650. SQInteger item_size = sq_getsize(v, -1);
  651. if(item_size > 0) {
  652. const SQChar *str;
  653. SQInteger flags = 0;
  654. sq_pushinteger(v, 0);
  655. sq_rawget(v, -2);
  656. if(sq_gettype(v, -1) == OT_STRING){
  657. sq_getstring(v, -1, &str);
  658. if(item_size > 4){
  659. sq_pushinteger(v, 4);
  660. sq_rawget(v, -3);
  661. if(sq_gettype(v, -1) == OT_INTEGER){
  662. sq_getinteger(v, -1, &flags);
  663. }
  664. }
  665. //if(flags & FL_SUBMENU)
  666. self->add(str, 0,0,0,flags);
  667. }
  668. }
  669. sq_settop(v, work_top);
  670. }
  671. //self->copy(&menu_items);
  672. return 0;
  673. }
  674. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu__##name,nparams,pmask}
  675. static SQRegFunction fl_menu__obj_funcs[]={
  676. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  677. _DECL_FUNC(copy,-2,_SC("xa.")),
  678. {0,0}
  679. };
  680. #undef _DECL_FUNC
  681. FLTK_CONSTRUCTOR(Fl_Menu_Bar);
  682. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu_Bar_##name,nparams,pmask}
  683. static SQRegFunction fl_menu_bar_obj_funcs[]={
  684. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  685. {0,0}
  686. };
  687. #undef _DECL_FUNC
  688. FLTK_CONSTRUCTOR(Fl_Choice);
  689. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Choice_##name,nparams,pmask}
  690. static SQRegFunction fl_choice_obj_funcs[]={
  691. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  692. {0,0}
  693. };
  694. #undef _DECL_FUNC
  695. FLTK_CONSTRUCTOR(Fl_Input_);
  696. #define SETUP_FL_INPUT_(v) SETUP_FL_KLASS(v, Fl_Input_)
  697. FUNC_GETSET_STR(_Fl_Input__, SETUP_FL_INPUT_(v), self->, value);
  698. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Input__##name,nparams,pmask}
  699. static SQRegFunction fl_input__obj_funcs[]={
  700. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  701. _DECL_FUNC(value,-1,_SC("xs")),
  702. {0,0}
  703. };
  704. #undef _DECL_FUNC
  705. MY_FL_CLASS(Fl_Input,
  706. int handle(int event){
  707. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  708. SQInteger top = sq_gettop(v);
  709. if(sq_get_fl_virtual(v, this, "handle") == SQ_OK){
  710. sq_push(v, -2); //this
  711. sq_pushinteger(v, event);
  712. if(sq_call(v, 2, SQTrue, SQTrue) == SQ_OK){
  713. if(sq_gettype(v, -1) == OT_INTEGER){
  714. sq_getinteger(v, -1, &event);
  715. sq_settop(v, top);
  716. return event;
  717. }
  718. }
  719. exit(-1);
  720. }
  721. sq_settop(v, top);
  722. return Fl_Input::handle(event);
  723. }
  724. )
  725. #define SETUP_FL_INPUT(v) SETUP_FL_KLASS(v, Fl_Input)
  726. static SQInteger _MyFl_Input_handle(HSQUIRRELVM v)
  727. {
  728. SQ_FUNC_VARS_NO_TOP(v);
  729. SETUP_FL_INPUT(v);
  730. SQ_GET_INTEGER(v, 2, event);
  731. sq_pushinteger(v, ((MyFl_Input*)self)->Fl_Input::handle(event));
  732. return 1;
  733. }
  734. FUNC_GETSET_STR(_MyFl_Input_, , Fl_Input::, default_number_format);
  735. FUNC_GETSET_STR(_MyFl_Input_, SETUP_FL_INPUT(v), self->, number_format);
  736. #define FL_INPUT_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_MyFl_Input_, SETUP_FL_INPUT(v), self->, funcNAME, typeNAME)
  737. FL_INPUT_GETSET_INT_CAST(use_numeric_format, int);
  738. FL_INPUT_GETSET_INT_CAST(right_to_left, int);
  739. FL_INPUT_GETSET_INT_CAST(decimal_places, int);
  740. #define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_MyFl_Input_##name,nparams,pmask,isStatic}
  741. static SQRegFunction fl_input_obj_funcs[]={
  742. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask,SQFalse),
  743. _DECL_FUNC(handle,2,_SC("xi"),SQFalse),
  744. _DECL_FUNC(default_number_format,-1,_SC("ys"),SQTrue),
  745. _DECL_FUNC(number_format,-1,_SC("xs"),SQFalse),
  746. _DECL_FUNC(use_numeric_format,-1,_SC("xi"),SQFalse),
  747. _DECL_FUNC(right_to_left,-1,_SC("xi"),SQFalse),
  748. _DECL_FUNC(decimal_places,-1,_SC("xi"),SQFalse),
  749. {0,0}
  750. };
  751. #undef _DECL_FUNC
  752. FLTK_CONSTRUCTOR(Fl_Float_Input);
  753. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Float_Input_##name,nparams,pmask}
  754. static SQRegFunction fl_float_input_obj_funcs[]={
  755. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  756. {0,0}
  757. };
  758. #undef _DECL_FUNC
  759. FLTK_CONSTRUCTOR(Fl_Int_Input);
  760. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Int_Input_##name,nparams,pmask}
  761. static SQRegFunction fl_int_input_obj_funcs[]={
  762. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  763. {0,0}
  764. };
  765. #undef _DECL_FUNC
  766. FLTK_CONSTRUCTOR(Fl_Output);
  767. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Output_##name,nparams,pmask}
  768. static SQRegFunction fl_output_obj_funcs[]={
  769. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  770. {0,0}
  771. };
  772. #undef _DECL_FUNC
  773. FLTK_CONSTRUCTOR(Fl_Secret_Input);
  774. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Secret_Input_##name,nparams,pmask}
  775. static SQRegFunction fl_secret_input_obj_funcs[]={
  776. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  777. {0,0}
  778. };
  779. #undef _DECL_FUNC
  780. #define SETUP_FL_GROUP(v) SETUP_FL_KLASS(v, Fl_Group)
  781. FLTK_CONSTRUCTOR(Fl_Group);
  782. enum _Fl_Group_Funcs {add, begin, current, end, resizable};
  783. static SQRESULT _Fl_Group_dispatcher(HSQUIRRELVM v, _Fl_Group_Funcs func_idx){
  784. SETUP_FL_GROUP(v);
  785. switch(func_idx){
  786. case add:{
  787. SQUserPointer rsz;
  788. sq_getinstanceup(v, -1, &rsz, 0);
  789. self->add((Fl_Widget*)rsz);
  790. return 0;
  791. }
  792. break;
  793. case begin:
  794. case current:
  795. case end:
  796. case resizable:
  797. break;
  798. }
  799. return 0;
  800. }
  801. static SQInteger _Fl_Group_begin(HSQUIRRELVM v)
  802. {
  803. SETUP_FL_GROUP(v);
  804. self->begin();
  805. return 0;
  806. }
  807. static SQInteger _Fl_Group_end(HSQUIRRELVM v)
  808. {
  809. SETUP_FL_GROUP(v);
  810. self->end();
  811. return 0;
  812. }
  813. static SQInteger _Fl_Group_current(HSQUIRRELVM v)
  814. {
  815. Fl_Group *grp = Fl_Group::current();
  816. if(!grp || getInstance_for_Fl_Group(v, grp) != SQ_OK) sq_pushnull(v);
  817. return 1;
  818. }
  819. static SQInteger _Fl_Group_resizable(HSQUIRRELVM v)
  820. {
  821. SETUP_FL_GROUP(v);
  822. if(sq_gettop(v)==1){
  823. sq_pushuserpointer(v, self->resizable());
  824. return 1;
  825. }
  826. SQUserPointer rsz;
  827. sq_getinstanceup(v, -1, &rsz, 0);
  828. self->resizable((Fl_Widget*)rsz);
  829. return 0;
  830. }
  831. static SQInteger _Fl_Group_add(HSQUIRRELVM v)
  832. {
  833. SETUP_FL_GROUP(v);
  834. SQUserPointer rsz;
  835. sq_getinstanceup(v, -1, &rsz, 0);
  836. self->add((Fl_Widget*)rsz);
  837. return 0;
  838. }
  839. #define _DECL_FUNC(name,nparams,pmask, isStatic) {_SC(#name),_Fl_Group_##name,nparams,pmask, isStatic}
  840. static SQRegFunction fl_group_obj_funcs[]={
  841. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask, SQFalse),
  842. _DECL_FUNC(begin,1,_SC("x"), SQFalse),
  843. _DECL_FUNC(end,1,_SC("x"), SQFalse),
  844. _DECL_FUNC(resizable,-1,_SC("xx"), SQFalse),
  845. _DECL_FUNC(add,2,_SC("xx"), SQFalse),
  846. _DECL_FUNC(current,1,_SC("y"), SQTrue),
  847. {0,0}
  848. };
  849. #undef _DECL_FUNC
  850. FLTK_CONSTRUCTOR(Fl_Pack);
  851. #define SETUP_FL_PACK(v) SETUP_FL_KLASS(v, Fl_Pack)
  852. #define FL_PACK_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Pack_, SETUP_FL_PACK(v), self->, funcNAME, typeNAME)
  853. FL_PACK_GETSET_INT_CAST(spacing, int);
  854. FL_PACK_GETSET_INT_CAST(with_label, int);
  855. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Pack_##name,nparams,pmask}
  856. static SQRegFunction fl_pack_obj_funcs[]={
  857. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  858. _DECL_FUNC(spacing,-1,_SC("xi")),
  859. _DECL_FUNC(with_label,-1,_SC("xi")),
  860. {0,0}
  861. };
  862. #undef _DECL_FUNC
  863. #define SETUP_FLV_STYLE(v) SETUP_FL_KLASS(v, Flv_Style)
  864. #define FLV_STYLE_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Flv_Style_, SETUP_FLV_STYLE(v), self->, funcNAME, typeNAME)
  865. #define FLV_STYLE_GETSET_INT(funcNAME) FLV_STYLE_GETSET_INT_CAST(funcNAME, int)
  866. //no constructor for Flv_Style
  867. /*
  868. static SQInteger Flv_Style_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v){
  869. Flv_Style *self = (Flv_Style*)p;
  870. if(self) delete self;
  871. return 0;
  872. }
  873. static SQInteger Flv_Style_constructor(HSQUIRRELVM v){
  874. SQ_FUNC_VARS_NO_TOP(v);
  875. SETUP_FLV_STYLE(v);
  876. self = new Flv_Style();
  877. sq_setinstanceup(v, 1, self);
  878. sq_setreleasehook(v, 1, Flv_Style_release_hook);
  879. return 1;
  880. }
  881. */
  882. /*
  883. #define RET_BOOL_IF(n, nc, nm) if(name[n] == nc) {sq_pushbool(v, self->nm()); return 1;}
  884. #define GET_SET_BOOL_IF(n, nc, nm) if(name[n] == nc) {if(_top_ > 1) {SQ_GET_BOOL(v, 2, bparm); self->nm(bparm); return 0;} \
  885. else {sq_pushbool(v, self->nm()); return 1;}}
  886. #define GET_SET_INT_IF(n, nc, nm) if(name[n] == nc) {if(_top_ > 1) {SQ_GET_INTEGER(v, 2, iparm); self->nm(iparm); return 0;} \
  887. else {sq_pushinteger(v, self->nm()); return 1;}}
  888. static SQInteger Flv_Style_class(HSQUIRRELVM v){
  889. SQ_FUNC_VARS(v);
  890. Flv_Style *self;
  891. if(sq_getinstanceup(v, 1, (void**)&self, (void*)FLTK_TAG(Flv_Style)) < 0) return SQ_ERROR;
  892. if(sq_getclosurename(v, 0) == SQ_OK) {
  893. SQ_GET_STRING(v, -1, name);
  894. sq_poptop(v);
  895. printf("%d %s %p %d\n", __LINE__, name, self, _top_);
  896. SQChar c = name[0];
  897. if(c == 'a'){
  898. //add
  899. //align
  900. //align_defined
  901. RET_BOOL_IF(6, 'd', align_defined);
  902. //all_clear
  903. //all_defined
  904. RET_BOOL_IF(4, 'd', all_defined);
  905. }
  906. else if(c == 'b'){
  907. //background
  908. //background_defined
  909. RET_BOOL_IF(11, 'd', background_defined);
  910. //border
  911. GET_SET_INT_IF(1, 'o', border);
  912. //border_color
  913. //border_color_defined
  914. RET_BOOL_IF(7, 'c', border_color_defined);
  915. //border_defined
  916. RET_BOOL_IF(7, 'd', border_defined);
  917. //border_spacing
  918. GET_SET_INT_IF(7, 's', border_spacing);
  919. //border_spacing_defined
  920. RET_BOOL_IF(15, 'd', border_spacing_defined);
  921. //bottom_border
  922. }
  923. else if(c == 'c'){
  924. //cell_style
  925. //clear_align
  926. //clear_all
  927. //clear_background
  928. //clear_border
  929. //clear_border_color
  930. //clear_border_spacing
  931. //clear_editor
  932. //clear_font
  933. //clear_font_size
  934. //clear_foreground
  935. //clear_frame
  936. //clear_height
  937. //clear_locked
  938. //clear_resizable
  939. //clear_x_margin
  940. //clear_y_margin
  941. //clear_width
  942. }
  943. else if(c == 'e'){
  944. //editor
  945. //editor_defined
  946. RET_BOOL_IF(7, 'd', editor_defined);
  947. }
  948. else if(c == 'f'){
  949. //font
  950. //font_defined
  951. RET_BOOL_IF(5, 'd', font_defined);
  952. //font_size
  953. GET_SET_INT_IF(5, 's', font_size);
  954. //font_size_defined
  955. RET_BOOL_IF(10, 'd', font_size_defined);
  956. //foreground
  957. //foreground_defined
  958. RET_BOOL_IF(11, 'd', foreground_defined);
  959. //frame
  960. //frame_defined
  961. RET_BOOL_IF(6, 'd', frame_defined);
  962. }
  963. else if(c == 'h'){
  964. //height
  965. GET_SET_INT_IF(2, 'i', height);
  966. //height_defined
  967. RET_BOOL_IF(7, 'd', height_defined);
  968. }
  969. else if(c == 'i'){
  970. //inner_bottom_border
  971. //inner_left_border
  972. //inner_right_border
  973. //inner_top_border
  974. }
  975. else if(c == 'l'){
  976. //left_border
  977. //locked
  978. GET_SET_BOOL_IF(2, 'c', locked);
  979. //locked_defined
  980. RET_BOOL_IF(7, 'd', locked_defined);
  981. }
  982. else if(c == 'r'){
  983. //resizable
  984. GET_SET_BOOL_IF(2, 's', resizable);
  985. //resizable_defined
  986. RET_BOOL_IF(10, 'd', resizable_defined);
  987. //right_border
  988. }
  989. else if(c == 't'){
  990. //top_border
  991. }
  992. else if(c == 'x'){
  993. //x_margin_defined
  994. RET_BOOL_IF(9, 'd', x_margin_defined);
  995. //x_margin
  996. GET_SET_INT_IF(2, 'm', x_margin);
  997. }
  998. else if(c == 'y'){
  999. //y_margin_defined
  1000. RET_BOOL_IF(9, 'd', y_margin_defined);
  1001. //y_margin
  1002. GET_SET_INT_IF(2, 'm', y_margin);
  1003. }
  1004. else if(c == 'w'){
  1005. //width_defined
  1006. RET_BOOL_IF(6, 'd', width_defined);
  1007. //width
  1008. GET_SET_INT_IF(2, 'd', width);
  1009. }
  1010. }
  1011. return SQ_ERROR;
  1012. }
  1013. */
  1014. FLV_STYLE_GETSET_INT(border);
  1015. FLV_STYLE_GETSET_INT(border_spacing);
  1016. FLV_STYLE_GETSET_INT(font_size);
  1017. FLV_STYLE_GETSET_INT(height);
  1018. FLV_STYLE_GETSET_INT(x_margin);
  1019. FLV_STYLE_GETSET_INT(y_margin);
  1020. FLV_STYLE_GETSET_INT(width);
  1021. FLV_STYLE_GETSET_INT_CAST(align, Fl_Align);
  1022. FLV_STYLE_GETSET_INT_CAST(border_color, Fl_Color);
  1023. FLV_STYLE_GETSET_INT_CAST(foreground, Fl_Color);
  1024. FLV_STYLE_GETSET_INT_CAST(background, Fl_Color);
  1025. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Flv_Style_##name,nparams,pmask}
  1026. static SQRegFunction flv_style_obj_funcs[]={
  1027. //no constructor for Flv_Style
  1028. //{_SC("constructor"), Flv_Style_constructor, -1,_SC("xi")},
  1029. _DECL_FUNC(border,-1,_SC("xn")),
  1030. _DECL_FUNC(border_spacing,-1,_SC("xn")),
  1031. _DECL_FUNC(font_size,-1,_SC("xn")),
  1032. _DECL_FUNC(height,-1,_SC("xn")),
  1033. _DECL_FUNC(x_margin,-1,_SC("xn")),
  1034. _DECL_FUNC(y_margin,-1,_SC("xn")),
  1035. _DECL_FUNC(width,-1,_SC("xn")),
  1036. _DECL_FUNC(align,-1,_SC("xi")),
  1037. _DECL_FUNC(border_color,-1,_SC("xi")),
  1038. _DECL_FUNC(foreground,-1,_SC("xi")),
  1039. _DECL_FUNC(background,-1,_SC("xi")),
  1040. {0,0}
  1041. };
  1042. #undef _DECL_FUNC
  1043. #define SETUP_FLV_STYLE_LIST(v) SETUP_FL_KLASS(v, Flv_Style_List)
  1044. static SQRESULT _Flv_Style_List_get(HSQUIRRELVM v){
  1045. SQ_FUNC_VARS_NO_TOP(v);
  1046. SETUP_FLV_STYLE_LIST(v);
  1047. SQ_GET_INTEGER(v, 2, idx);
  1048. fltk_pushinstance(v, FLTK_TAG(Flv_Style), &self->get(idx));
  1049. return 1;
  1050. }
  1051. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Flv_Style_List_##name,nparams,pmask}
  1052. static SQRegFunction flv_style_list_obj_funcs[]={
  1053. _DECL_FUNC(get,-1,_SC("xi")),
  1054. {0,0}
  1055. };
  1056. #undef _DECL_FUNC
  1057. FLTK_CONSTRUCTOR(Flv_List);
  1058. #define SETUP_FLV_LIST(v) SETUP_FL_KLASS(v, Flv_List)
  1059. #define FLV_LIST_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_Flv_List_, SETUP_FLV_LIST(v), self->, funcNAME, typeNAME)
  1060. #define FLV_LIST_GETSET_INT(funcNAME) FLV_LIST_GETSET_INT_CAST(funcNAME, int)
  1061. #define FLV_LIST_GETSET_INT_ONE_CALL_CAST(funcNAME, typeNAME) FUNC_GETSET_INT_ONE_CALL(_Flv_List_, SETUP_FLV_LIST(v), self->, funcNAME, typeNAME)
  1062. FLV_LIST_GETSET_INT_CAST(has_scrollbar, Flv_ShowScrollbar);
  1063. FLV_LIST_GETSET_INT(scrollbar_width);
  1064. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature, int);
  1065. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature_add, int);
  1066. FLV_LIST_GETSET_INT_ONE_CALL_CAST(feature_remove, int);
  1067. FLV_LIST_GETSET_INT(rows);
  1068. FLV_LIST_GETSET_INT(row);
  1069. static SQRESULT _Flv_List_global_style(HSQUIRRELVM v){
  1070. SQ_FUNC_VARS_NO_TOP(v);
  1071. SETUP_FLV_LIST(v);
  1072. fltk_pushinstance(v, FLTK_TAG(Flv_Style), &self->global_style);
  1073. return 1;
  1074. }
  1075. static SQRESULT _Flv_List_row_style(HSQUIRRELVM v){
  1076. SQ_FUNC_VARS_NO_TOP(v);
  1077. SETUP_FLV_LIST(v);
  1078. fltk_pushinstance(v, FLTK_TAG(Flv_Style_List), &self->row_style);
  1079. return 1;
  1080. }
  1081. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Flv_List_##name,nparams,pmask}
  1082. static SQRegFunction flv_list_obj_funcs[]={
  1083. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1084. _DECL_FUNC(has_scrollbar,-1,_SC("xi")),
  1085. _DECL_FUNC(scrollbar_width,-1,_SC("xi")),
  1086. _DECL_FUNC(feature,-1,_SC("xi")),
  1087. _DECL_FUNC(feature_add,-1,_SC("xi")),
  1088. _DECL_FUNC(feature_remove,-1,_SC("xi")),
  1089. _DECL_FUNC(rows,-1,_SC("xi")),
  1090. _DECL_FUNC(row,-1,_SC("xi")),
  1091. _DECL_FUNC(global_style,1,_SC("x")),
  1092. _DECL_FUNC(row_style,1,_SC("x")),
  1093. {0,0}
  1094. };
  1095. #undef _DECL_FUNC
  1096. FLTK_CONSTRUCTOR(Flv_Table);
  1097. #define SETUP_FLV_TABLE(v) SETUP_FL_KLASS(v, Flv_Table)
  1098. #define FLV_TABLE_GETSET_INT0(funcNAME, typeNAME) FUNC_GETSET_INT(_Flv_Table_, SETUP_FLV_TABLE(v), self->, funcNAME, typeNAME)
  1099. #define FLV_TABLE_GETSET_INT(funcNAME) FLV_TABLE_GETSET_INT0(funcNAME, int)
  1100. FLV_TABLE_GETSET_INT(cols);
  1101. FLV_TABLE_GETSET_INT(col);
  1102. static SQRESULT _Flv_Table_col_style(HSQUIRRELVM v){
  1103. SQ_FUNC_VARS_NO_TOP(v);
  1104. SETUP_FLV_TABLE(v);
  1105. fltk_pushinstance(v, FLTK_TAG(Flv_Style_List), &self->col_style);
  1106. return 1;
  1107. }
  1108. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Flv_Table_##name,nparams,pmask}
  1109. static SQRegFunction flv_table_obj_funcs[]={
  1110. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1111. _DECL_FUNC(cols,-1,_SC("xi")),
  1112. _DECL_FUNC(col,-1,_SC("xi")),
  1113. _DECL_FUNC(col_style,1,_SC("x")),
  1114. {0,0}
  1115. };
  1116. #undef _DECL_FUNC
  1117. CREATE_TAG(Flv_Data_Table);
  1118. #define SETUP_FLV_DATA_TABLE(v) SETUP_FL_KLASS(v, Flv_Data_Table)
  1119. #define FL_Key_Space 32
  1120. #define FL_Key_Plus 61
  1121. #define FL_Key_Minus 45
  1122. #define FL_KP_Plus 65451
  1123. #define FL_KP_Minus 65453
  1124. #define FL_KP_Times 65450
  1125. #define FL_KP_Division 65455
  1126. #define FL_KP_Dot 65454
  1127. #define FL_Key_0 '0'
  1128. #define FL_Key_9 '9'
  1129. #define FL_KP_0 FL_KP + '0'
  1130. #define FL_KP_1 FL_KP + '1'
  1131. #define FL_KP_2 FL_KP + '2'
  1132. #define FL_KP_3 FL_KP + '3'
  1133. #define FL_KP_4 FL_KP + '4'
  1134. #define FL_KP_5 FL_KP + '5'
  1135. #define FL_KP_6 FL_KP + '6'
  1136. #define FL_KP_7 FL_KP + '7'
  1137. #define FL_KP_8 FL_KP + '8'
  1138. #define FL_KP_9 FL_KP + '9'
  1139. class Flv_Data_Table : public Flv_Table
  1140. {
  1141. public:
  1142. int selection_count, _draw_offset;
  1143. bool _forPrint;
  1144. Fl_Menu_Button *_popup_menu;
  1145. Flv_Data_Table(int X, int Y, int W=340, int H=202, const char *L=0):
  1146. Flv_Table(X, Y, W, H, L)
  1147. {
  1148. _draw_offset = 5;
  1149. selection_count = 0;
  1150. _forPrint = false;
  1151. _popup_menu = 0;
  1152. callback_when( FLVEcb_ROW_CHANGED | FLVEcb_CLICKED);
  1153. selection_color(FL_BLUE);
  1154. feature(FLVF_ROW_HEADER | FLVF_DIVIDERS | //flvw.FLVF_MULTI_SELECT,
  1155. FLVF_ROW_SELECT | FLVF_PERSIST_SELECT);
  1156. has_scrollbar( FLVS_VERTICAL_ALWAYS );
  1157. Flv_Style &gs = global_style;
  1158. gs.resizable(true);
  1159. gs.width(80);
  1160. gs.height(22);
  1161. dead_space_color(FL_WHITE);
  1162. row_style.get(-1).align(FL_ALIGN_CLIP);
  1163. col_style.get(-1).align(FL_ALIGN_CLIP);
  1164. }
  1165. void resize(int x, int y, int w, int h)
  1166. {
  1167. Flv_Table::resize(x, y, w, h);
  1168. //calc_cols();
  1169. }
  1170. void textsize(Fl_Fontsize s)
  1171. {
  1172. global_style.font_size(s);
  1173. global_style.height(s + 8);
  1174. //calc_cols();
  1175. }
  1176. Fl_Fontsize textsize() const
  1177. {
  1178. return global_style.font_size();
  1179. }
  1180. void get_style(Flv_Style &s, int R, int C )
  1181. {
  1182. Flv_Table::get_style(s, R, C);
  1183. if(R >= 0 && C >= 0)
  1184. {
  1185. Flv_Style &rs = row_style.get(R);
  1186. Flv_Style &cs = col_style.get(C);
  1187. Fl_Color have_bg = 0;
  1188. if(cs.background_defined()) have_bg = cs.background();
  1189. else if(rs.background_defined()) have_bg = rs.background();
  1190. if((R % 2) == 0)
  1191. {
  1192. if(have_bg)
  1193. //s:background(fltk.fl_color_average(207, have_bg, 0.5))
  1194. s.background(have_bg);
  1195. else
  1196. s.background(207);
  1197. }
  1198. else
  1199. {
  1200. if(have_bg)
  1201. //s:background(have_bg)
  1202. s.background(fl_color_average(FL_WHITE, have_bg, 0.5));
  1203. else
  1204. s.background(FL_WHITE);
  1205. }
  1206. }
  1207. else if(_forPrint)
  1208. {
  1209. s.frame(FL_NO_BOX);
  1210. }
  1211. }
  1212. virtual void draw_cell( int Offset, int &X, int &Y, int &W, int &H, int R, int C ){
  1213. Flv_Style s;
  1214. get_style(s, R, C);
  1215. Flv_Table::draw_cell(Offset, X, Y, W, H, R, C);
  1216. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  1217. SQInteger top = sq_gettop(v);
  1218. if(sq_get_fl_virtual(v, this, "get_value") == SQ_OK){
  1219. sq_push(v, -2); //this
  1220. sq_pushinteger(v, R);
  1221. sq_pushinteger(v, C);
  1222. if(sq_call(v, 3, SQTrue, SQTrue) == SQ_OK){
  1223. if(sq_gettype(v, -1) == OT_STRING){
  1224. const SQChar *str;
  1225. sq_getstring(v, -1, &str);
  1226. fl_draw(str, X-Offset+_draw_offset, Y, W-_draw_offset*3, H, s.align());
  1227. }
  1228. }
  1229. }
  1230. sq_settop(v, top);
  1231. }
  1232. int handle(int event){
  1233. switch(event)
  1234. {
  1235. case FL_KEYBOARD:
  1236. {
  1237. int key = Fl::event_key();
  1238. //printf("%d\n", key);
  1239. switch(key)
  1240. {
  1241. case FL_KP+'3':
  1242. Fl::e_keysym = FL_Page_Down; //PageDown
  1243. break;
  1244. case FL_KP+'2':
  1245. Fl::e_keysym = FL_Down; //ArrowDown
  1246. break;
  1247. case FL_KP+'8':
  1248. Fl::e_keysym = FL_Up; //ArrowUp
  1249. break;
  1250. case FL_KP+'9':
  1251. Fl::e_keysym = FL_Page_Up; //PageUp
  1252. break;
  1253. case FL_KP+'0':
  1254. mark_row(false, true); //PageUp
  1255. break;
  1256. //case FL_Menu: grid->show_popup_menu(); //PageUp
  1257. //break;
  1258. case FL_KP_Plus:
  1259. case FL_KP_Minus:
  1260. case FL_Key_Plus:
  1261. case FL_Key_Minus:
  1262. //printf("Key = %d\n", key);
  1263. if(Fl::event_ctrl())
  1264. {
  1265. switch(key)
  1266. {
  1267. case FL_KP_Plus:
  1268. case FL_Key_Plus:
  1269. textsize(textsize()+1);
  1270. redraw();
  1271. break;
  1272. case FL_KP_Minus:
  1273. case FL_Key_Minus:
  1274. {
  1275. int tsize = textsize();
  1276. if(tsize > 9)
  1277. {
  1278. textsize(tsize-1);
  1279. redraw();
  1280. }
  1281. }
  1282. break;
  1283. }
  1284. }
  1285. break;
  1286. //default:
  1287. //handled = handle_key(key);
  1288. }
  1289. }
  1290. break;
  1291. case FL_PUSH:
  1292. {
  1293. switch(Fl::event_button())
  1294. {
  1295. case FL_LEFT_MOUSE:
  1296. take_focus();
  1297. break;
  1298. case FL_RIGHT_MOUSE:
  1299. show_popup_menu();
  1300. return 1;
  1301. break;
  1302. }
  1303. }
  1304. break;
  1305. case FL_RELEASE:
  1306. {
  1307. mark_row(true);
  1308. }
  1309. break;
  1310. }
  1311. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  1312. SQInteger top = sq_gettop(v);
  1313. if(sq_get_fl_virtual(v, this, "handle") == SQ_OK){
  1314. sq_push(v, -2); //this
  1315. sq_pushinteger(v, event);
  1316. if(sq_call(v, 2, SQTrue, SQTrue) == SQ_OK){
  1317. if(sq_gettype(v, -1) == OT_INTEGER){
  1318. sq_getinteger(v, -1, &event);
  1319. sq_settop(v, top);
  1320. return event;
  1321. }
  1322. }
  1323. //exit(-1);
  1324. }
  1325. sq_settop(v, top);
  1326. return Flv_Table::handle(event);
  1327. }
  1328. void show_popup_menu()
  1329. {
  1330. if(_popup_menu) _popup_menu->popup();
  1331. }
  1332. void set_popup_menu(Fl_Menu_Button *popup)
  1333. {
  1334. _popup_menu=popup;
  1335. }
  1336. Fl_Menu_Button *get_popup_menu()
  1337. {
  1338. return _popup_menu;
  1339. }
  1340. virtual Fl_Color get_multi_select_color()
  1341. {
  1342. return fl_color_average(FL_RED, FL_WHITE, 0.5);;
  1343. }
  1344. void clear_selection()
  1345. {
  1346. if(selection_count == 0) return;
  1347. Fl_Color scolor = get_multi_select_color();
  1348. for(int i=0; i < rows(); ++i)
  1349. {
  1350. Flv_Style *rs = row_style.find(i);
  1351. if(!rs) continue;
  1352. if(rs->background_defined() && rs->background() == scolor)
  1353. {
  1354. rs->clear_background();
  1355. }
  1356. }
  1357. selection_count = 0;
  1358. }
  1359. void mark_row(bool withCtrl, bool withAdvance=false){
  1360. if(!withCtrl || Fl::event_ctrl())
  1361. {
  1362. //this->on_Mark_Row();
  1363. Flv_Style &rs = row_style.get(row());
  1364. Fl_Color scolor = get_multi_select_color();
  1365. if(rs.background_defined() && rs.background() == scolor)
  1366. {
  1367. --selection_count;
  1368. rs.clear_background();
  1369. }
  1370. else
  1371. {
  1372. ++selection_count;
  1373. rs.background(scolor);
  1374. }
  1375. //return 1;
  1376. }
  1377. if(withAdvance){
  1378. int next_row = row()+1;
  1379. if(rows() > next_row) row(next_row);
  1380. }
  1381. }
  1382. };
  1383. static SQInteger _Flv_Data_Table_handle(HSQUIRRELVM v)
  1384. {
  1385. SQ_FUNC_VARS_NO_TOP(v);
  1386. SETUP_FLV_DATA_TABLE(v);
  1387. SQ_GET_INTEGER(v, 2, event);
  1388. sq_pushinteger(v, ((Flv_Data_Table*)self)->Flv_Table::handle(event));
  1389. return 1;
  1390. }
  1391. static SQInteger _Flv_Data_Table_draw_offset(HSQUIRRELVM v)
  1392. {
  1393. SQ_FUNC_VARS(v);
  1394. SETUP_FLV_DATA_TABLE(v);
  1395. if(_top_ > 1){
  1396. SQ_GET_INTEGER(v, 2, offset);
  1397. ((Flv_Data_Table*)self)->_draw_offset = offset;
  1398. return 0;
  1399. }
  1400. sq_pushinteger(v, ((Flv_Data_Table*)self)->_draw_offset);
  1401. return 1;
  1402. }
  1403. FLTK_CONSTRUCTOR(Flv_Data_Table);
  1404. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Flv_Data_Table_##name,nparams,pmask}
  1405. static SQRegFunction flv_data_table_obj_funcs[]={
  1406. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1407. _DECL_FUNC(handle,2,_SC("xi")),
  1408. _DECL_FUNC(draw_offset, -1,_SC("xn")),
  1409. {0,0}
  1410. };
  1411. #undef _DECL_FUNC
  1412. FLTK_CONSTRUCTOR(Fl_Scroll);
  1413. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Scroll_##name,nparams,pmask}
  1414. static SQRegFunction fl_scroll_obj_funcs[]={
  1415. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1416. {0,0}
  1417. };
  1418. #undef _DECL_FUNC
  1419. FLTK_CONSTRUCTOR(Fl_Tabs);
  1420. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Tabs_##name,nparams,pmask}
  1421. static SQRegFunction fl_tabs_obj_funcs[]={
  1422. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1423. {0,0}
  1424. };
  1425. #undef _DECL_FUNC
  1426. static SQChar Fl_Text_Buffer_TAG[] = _SC("Fl_Text_Buffer");
  1427. static SQInteger _Fl_Text_Buffer_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1428. {
  1429. Fl_Text_Buffer *self = ((Fl_Text_Buffer *)p);
  1430. delete self;
  1431. return 1;
  1432. }
  1433. static SQInteger _Fl_Text_Buffer_constructor(HSQUIRRELVM v)
  1434. {
  1435. SQ_FUNC_VARS(v);
  1436. SQ_OPT_INTEGER(v, 2, requestedSize, 0);
  1437. SQ_OPT_INTEGER(v, 3, preferredGapSize, 1024);
  1438. Fl_Text_Buffer *cptr = new Fl_Text_Buffer(requestedSize, preferredGapSize);
  1439. //do_register_object_and_instance(v, 1, cptr);
  1440. sq_setinstanceup(v, 1, cptr);
  1441. sq_setreleasehook(v,1, _Fl_Text_Buffer_releasehook);
  1442. return 1;
  1443. }
  1444. #define SETUP_FL_TEXT_BUFFER(v) SETUP_KLASS(v, Fl_Text_Buffer, Fl_Text_Buffer_TAG)
  1445. FUNC_GETSET_STR(_Fl_Text_Buffer_, SETUP_FL_TEXT_BUFFER(v), self->, text);
  1446. FUNC_INT_CALL(_Fl_Text_Buffer_, SETUP_FL_TEXT_BUFFER(v), length);
  1447. static SQInteger _Fl_Text_Buffer_loadfile(HSQUIRRELVM v)
  1448. {
  1449. SQ_FUNC_VARS(v);
  1450. SETUP_FL_TEXT_BUFFER(v);
  1451. SQ_GET_STRING(v, 2, file_name);
  1452. SQ_OPT_INTEGER(v, 3, buflen, 128*1024);
  1453. sq_pushinteger(v, self->loadfile(file_name, buflen));
  1454. return 1;
  1455. }
  1456. static SQInteger _Fl_Text_Buffer_input_file_was_transcoded(HSQUIRRELVM v)
  1457. {
  1458. SQ_FUNC_VARS_NO_TOP(v);
  1459. SETUP_FL_TEXT_BUFFER(v);
  1460. sq_pushinteger(v, self->input_file_was_transcoded);
  1461. return 1;
  1462. }
  1463. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Buffer_##name,nparams,pmask}
  1464. static SQRegFunction fl_text_buffer_obj_funcs[]={
  1465. _DECL_FUNC(constructor,-1,_SC("xii")),
  1466. _DECL_FUNC(text,-1,_SC("xs")),
  1467. _DECL_FUNC(length,-1,_SC("xii")),
  1468. _DECL_FUNC(loadfile,-2,_SC("xsi")),
  1469. _DECL_FUNC(input_file_was_transcoded,1,_SC("x")),
  1470. {0,0}
  1471. };
  1472. #undef _DECL_FUNC
  1473. FLTK_CONSTRUCTOR(Fl_Text_Display);
  1474. #define SETUP_FL_TEXT_DISPLAY(v) SETUP_FL_KLASS(v, Fl_Text_Display)
  1475. static SQInteger _Fl_Text_Display_buffer(HSQUIRRELVM v)
  1476. {
  1477. SETUP_FL_TEXT_DISPLAY(v);
  1478. SQUserPointer rsz;
  1479. sq_getinstanceup(v, -1, &rsz, 0);
  1480. self->buffer((Fl_Text_Buffer*)rsz);
  1481. return 0;
  1482. }
  1483. static SQInteger _Fl_Text_Display_highlight_data(HSQUIRRELVM v)
  1484. {
  1485. SETUP_FL_TEXT_DISPLAY(v);
  1486. SQUserPointer rsz;
  1487. return 0;
  1488. }
  1489. #define _DECL_FL_TEXT_DISPLAY_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Display_##name,nparams,pmask}
  1490. static SQRegFunction fl_text_display_obj_funcs[]={
  1491. _DECL_FL_TEXT_DISPLAY_FUNC(constructor,-5,FLTK_constructor_Mask),
  1492. _DECL_FL_TEXT_DISPLAY_FUNC(buffer,-1,_SC("xx")),
  1493. _DECL_FL_TEXT_DISPLAY_FUNC(highlight_data, 7,_SC("xxaiic.")),
  1494. {0,0}
  1495. };
  1496. FLTK_CONSTRUCTOR(Fl_Text_Editor);
  1497. #define _DECL_FL_TEXT_EDITOR_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Editor_##name,nparams,pmask}
  1498. static SQRegFunction fl_text_editor_obj_funcs[]={
  1499. _DECL_FL_TEXT_EDITOR_FUNC(constructor,-5,FLTK_constructor_Mask),
  1500. {0,0}
  1501. };
  1502. FLTK_CONSTRUCTOR(Fl_Text_Editor_Buffered);
  1503. #define SETUP_FL_TEXT_EDITOR_BUFFERED(v) SETUP_FL_KLASS(v, Fl_Text_Editor_Buffered)
  1504. static SQInteger _Fl_Text_Editor_Buffered_value(HSQUIRRELVM v)
  1505. {
  1506. SQ_FUNC_VARS(v);
  1507. const SQChar *txt;
  1508. SETUP_FL_TEXT_EDITOR_BUFFERED(v);
  1509. if(_top_ > 1){
  1510. sq_getstring(v, 2, &txt);
  1511. self->buffer()->text(txt);
  1512. return 0;
  1513. }
  1514. txt = self->buffer()->text();
  1515. sq_pushstring(v, txt, -1);
  1516. return 1;
  1517. }
  1518. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Text_Editor_Buffered_##name,nparams,pmask}
  1519. static SQRegFunction fl_text_editor_buffered_obj_funcs[]={
  1520. _DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
  1521. _DECL_FUNC(value,-1,_SC("xs")),
  1522. {0,0}
  1523. };
  1524. #undef _DECL_FUNC
  1525. class MyFl_Window : public Fl_Double_Window {
  1526. public:
  1527. MyFl_Window(int X, int Y, int W, int H, const char *L=0):Fl_Double_Window(X,Y,W,H,L){}
  1528. MyFl_Window(int W, int H, const char *L=0):Fl_Double_Window(W,H,L){}
  1529. void hide(){sq_call_fl_virtual(this, "hide");}
  1530. };
  1531. static SQInteger _MyFl_Window_hide(HSQUIRRELVM v)
  1532. {
  1533. SETUP_FL_WIDGET(v);
  1534. ((MyFl_Window*)self)->Fl_Double_Window::hide();
  1535. return 0;
  1536. }
  1537. extern int sq_main_argc;
  1538. extern char **sq_main_argv;
  1539. static SQInteger _MyFl_Window_show_main(HSQUIRRELVM v)
  1540. {
  1541. SETUP_FL_WIDGET(v);
  1542. int i;
  1543. Fl::args(sq_main_argc, sq_main_argv, i);
  1544. ((MyFl_Window*)self)->Fl_Double_Window::show(sq_main_argc, sq_main_argv);
  1545. return 0;
  1546. }
  1547. static SQInteger _fl_window_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1548. {
  1549. MyFl_Window *self = ((MyFl_Window *)p);
  1550. Fl::delete_widget(self);
  1551. //printf("Releasing %p\n", self);
  1552. return 1;
  1553. }
  1554. static SQInteger _MyFl_Window_set_non_modal(HSQUIRRELVM v)
  1555. {
  1556. SETUP_FL_WIDGET(v);
  1557. ((MyFl_Window*)self)->set_non_modal();
  1558. return 0;
  1559. }
  1560. FLTK_CONSTRUCTOR_RELEASE_WINDOW(MyFl_Window, AS_IS, _fl_window_releasehook);
  1561. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_MyFl_Window_##name,nparams,pmask}
  1562. static SQRegFunction fl_window_obj_funcs[]={
  1563. _DECL_FUNC(constructor,-3,_SC("xii")),
  1564. _DECL_FUNC(show_main,1,_SC("x")),
  1565. _DECL_FUNC(hide,1,_SC("x")),
  1566. _DECL_FUNC(set_non_modal,1,_SC("x")),
  1567. {0,0}
  1568. };
  1569. #undef _DECL_FUNC
  1570. static SQInteger _fl_double_window_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1571. {
  1572. Fl_Double_Window *self = ((Fl_Double_Window *)p);
  1573. Fl::delete_widget(self);
  1574. //printf("Releasing %p\n", self);
  1575. return 1;
  1576. }
  1577. FLTK_CONSTRUCTOR_RELEASE_WINDOW(Fl_Double_Window, AS_IS, _fl_double_window_releasehook);
  1578. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Double_Window_##name,nparams,pmask}
  1579. static SQRegFunction fl_double_window_obj_funcs[]={
  1580. _DECL_FUNC(constructor,-3,_SC("xii")),
  1581. {0,0}
  1582. };
  1583. #undef _DECL_FUNC
  1584. static SQChar Fl_File_Chooser_TAG[] = _SC("Fl_File_Chooser");
  1585. static SQInteger _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1586. {
  1587. Fl_File_Chooser *self = ((Fl_File_Chooser *)p);
  1588. delete self;
  1589. return 1;
  1590. }
  1591. static SQInteger _Fl_File_Chooser_constructor(HSQUIRRELVM v)
  1592. {
  1593. SQ_FUNC_VARS_NO_TOP(v);
  1594. SQ_GET_STRING(v, 2, pathname);
  1595. SQ_GET_STRING(v, 3, pattern);
  1596. SQ_GET_INTEGER(v, 4, type);
  1597. SQ_GET_STRING(v, 5, title);
  1598. Fl_File_Chooser *cptr = new Fl_File_Chooser(pathname, pattern, type, title);
  1599. //do_register_object_and_instance(v, 1, cptr);
  1600. sq_setinstanceup(v, 1, cptr);
  1601. sq_setreleasehook(v,1, _Fl_File_Chooser_releasehook);
  1602. return 1;
  1603. }
  1604. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_File_Chooser_##name,nparams,pmask}
  1605. static SQRegFunction fl_file_chooser_obj_funcs[]={
  1606. _DECL_FUNC(constructor,5,_SC("xssis")),
  1607. {0,0}
  1608. };
  1609. #undef _DECL_FUNC
  1610. static SQChar Fl_Native_File_Chooser_TAG[] = _SC("Fl_Native_File_Chooser");
  1611. static SQInteger _Fl_Native_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1612. {
  1613. Fl_Native_File_Chooser *self = ((Fl_Native_File_Chooser *)p);
  1614. delete self;
  1615. return 1;
  1616. }
  1617. static SQInteger _Fl_Native_File_Chooser_constructor(HSQUIRRELVM v)
  1618. {
  1619. SQ_FUNC_VARS(v);
  1620. SQ_OPT_INTEGER(v, 2, type, Fl_Native_File_Chooser::BROWSE_FILE);
  1621. Fl_Native_File_Chooser *cptr = new Fl_Native_File_Chooser(type);
  1622. //do_register_object_and_instance(v, 1, cptr);
  1623. sq_setinstanceup(v, 1, cptr);
  1624. sq_setreleasehook(v,1, _Fl_Native_File_Chooser_releasehook);
  1625. return 1;
  1626. }
  1627. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Native_File_Chooser_##name,nparams,pmask}
  1628. static SQRegFunction fl_native_file_chooser_obj_funcs[]={
  1629. _DECL_FUNC(constructor,-1,_SC("xi")),
  1630. /*
  1631. _DECL_FUNC(title,-1,_SC("xs")),
  1632. _DECL_FUNC(type,-1,_SC("xi")),
  1633. _DECL_FUNC(show,1,_SC("x")),
  1634. _DECL_FUNC(filename,1,_SC("x")),
  1635. _DECL_FUNC(directory,1,_SC("x")),
  1636. */
  1637. {0,0}
  1638. };
  1639. #undef _DECL_FUNC
  1640. #define FL_FUNC_NO_ARG_NO_RET(fn) static SQInteger _fl_##fn(HSQUIRRELVM v){Fl::fn();return 0;}
  1641. FL_FUNC_NO_ARG_NO_RET(check);
  1642. FL_FUNC_NO_ARG_NO_RET(do_widget_deletion);
  1643. #define FL_FUNC_NO_ARG_RET_INT(fn) static SQInteger _fl_##fn(HSQUIRRELVM v){sq_pushinteger(v, Fl::fn());return 1;}
  1644. FL_FUNC_NO_ARG_RET_INT(run);
  1645. FL_FUNC_NO_ARG_RET_INT(event);
  1646. FL_FUNC_NO_ARG_RET_INT(event_alt);
  1647. FL_FUNC_NO_ARG_RET_INT(event_button);
  1648. FL_FUNC_NO_ARG_RET_INT(event_button1);
  1649. FL_FUNC_NO_ARG_RET_INT(event_button2);
  1650. FL_FUNC_NO_ARG_RET_INT(event_button3);
  1651. FL_FUNC_NO_ARG_RET_INT(event_buttons);
  1652. FL_FUNC_NO_ARG_RET_INT(event_command);
  1653. FL_FUNC_NO_ARG_RET_INT(event_ctrl);
  1654. FL_FUNC_NO_ARG_RET_INT(event_dx);
  1655. FL_FUNC_NO_ARG_RET_INT(event_dy);
  1656. FL_FUNC_NO_ARG_RET_INT(event_length);
  1657. FL_FUNC_NO_ARG_RET_INT(event_shift);
  1658. FL_FUNC_NO_ARG_RET_INT(event_x);
  1659. FL_FUNC_NO_ARG_RET_INT(event_x_root);
  1660. FL_FUNC_NO_ARG_RET_INT(event_y);
  1661. FL_FUNC_NO_ARG_RET_INT(event_y_root);
  1662. FL_FUNC_NO_ARG_RET_INT(x);
  1663. FL_FUNC_NO_ARG_RET_INT(y);
  1664. FL_FUNC_NO_ARG_RET_INT(h);
  1665. FL_FUNC_NO_ARG_RET_INT(w);
  1666. FL_FUNC_NO_ARG_RET_INT(ready);
  1667. FL_FUNC_NO_ARG_RET_INT(screen_count);
  1668. #define FL_FUNC_GETSET_INT(fn) FUNC_GETSET_INT(_fl_, , Fl::, fn, int)
  1669. FL_FUNC_GETSET_INT(event_key);
  1670. FL_FUNC_GETSET_INT(event_state);
  1671. FL_FUNC_GETSET_INT(event_is_click);
  1672. FL_FUNC_GETSET_INT(event_clicks);
  1673. FL_FUNC_GETSET_INT(scrollbar_size);
  1674. FL_FUNC_GETSET_INT(visible_focus);
  1675. #define FL_FUNC_GETSET_INT_ONE_CALL(fn) FUNC_GETSET_INT_ONE_CALL(_fl_, , Fl::, fn, int)
  1676. FL_FUNC_GETSET_INT_ONE_CALL(visual);
  1677. #define FL_FUNC_GETSET_INT_BOOL(fn) FUNC_GETSET_INT_BOOL(_fl_, , Fl::, fn, Fl::Fl_Option)
  1678. FL_FUNC_GETSET_INT_BOOL(option);
  1679. #define FL_FUNC_GETSET_STR(fn) FUNC_GETSET_STR(_fl_, , Fl::, fn)
  1680. FL_FUNC_GETSET_STR(scheme);
  1681. static SQInteger _fl_delete_widget(HSQUIRRELVM v)
  1682. {
  1683. SQ_FUNC_VARS_NO_TOP(v);
  1684. SQ_GET_INSTANCE_VAR(v, 2, Fl_Widget, widget, FLTK_TAG(Fl_Widget));
  1685. Fl::delete_widget(widget);
  1686. return 0;
  1687. }
  1688. static void fltk_cb_hook(void* udata, bool freeAfter){
  1689. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  1690. SQInteger savedTop = sq_gettop(v);
  1691. st_mycb *mycb = (st_mycb *)udata;
  1692. sq_pushobject(v, mycb->callback);
  1693. sq_pushroottable(v); //’this’ (function environment object)
  1694. sq_pushobject(v, mycb->udata);
  1695. sq_call(v, 2, SQFalse, SQTrue);
  1696. if(freeAfter){
  1697. //cleanup
  1698. sq_release(v, &mycb->callback);
  1699. sq_release(v, &mycb->udata);
  1700. sq_free(mycb, sizeof(st_mycb));
  1701. }
  1702. //restore stack
  1703. sq_settop(v, savedTop);
  1704. }
  1705. static SQInteger fltk_add_cb(HSQUIRRELVM v, int idx, st_mycb **cb)
  1706. {
  1707. int ptype = sq_gettype(v, idx);
  1708. if(ptype == OT_CLOSURE || ptype == OT_NATIVECLOSURE){
  1709. st_mycb *mycb = (st_mycb *)sq_malloc(sizeof(st_mycb));
  1710. memset(mycb, 0, sizeof(mycb));
  1711. sq_getstackobj(v, idx, &mycb->callback);//fetches an handle of the function you passed
  1712. sq_addref(v, &mycb->callback);
  1713. if(sq_gettop(v) > idx) { //we have user data too
  1714. sq_getstackobj(v, idx+1, &mycb->udata);
  1715. sq_addref(v,&mycb->udata);
  1716. }
  1717. *cb = mycb;
  1718. }
  1719. return 0;
  1720. }
  1721. static void fltk_add_timeout_hook(void* udata){
  1722. fltk_cb_hook(udata, true);
  1723. }
  1724. static void fltk_add_idle_hook(void* udata){
  1725. fltk_cb_hook(udata, false);
  1726. }
  1727. static SQInteger _fl_add_timeout(HSQUIRRELVM v)
  1728. {
  1729. SQ_FUNC_VARS_NO_TOP(v);
  1730. SQ_GET_FLOAT(v, 2, delay);
  1731. st_mycb *mycb;
  1732. fltk_add_cb(v, 3, &mycb);
  1733. if(mycb) Fl::add_timeout(delay, &fltk_add_timeout_hook, mycb);
  1734. return 0;
  1735. }
  1736. static SQInteger _fl_add_idle(HSQUIRRELVM v)
  1737. {
  1738. st_mycb *mycb;
  1739. fltk_add_cb(v, 2, &mycb);
  1740. if(mycb) Fl::add_idle(&fltk_add_idle_hook, mycb);
  1741. return 0;
  1742. }
  1743. static int flfk_focus_changing_handler_hook(Fl_Widget *to, Fl_Widget *from){
  1744. HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
  1745. SQInteger result;
  1746. SQInteger savedTop = sq_gettop(v);
  1747. sq_pushuserpointer(v, (void*)flfk_focus_changing_handler_hook);
  1748. sq_getonregistrytable(v);
  1749. if(sq_gettype(v, -1) == OT_CLOSURE){
  1750. sq_pushroottable(v);
  1751. if(getInstance_for_Fl_Widget(v, to) != SQ_OK) sq_pushnull(v);
  1752. if(getInstance_for_Fl_Widget(v, from) != SQ_OK) sq_pushnull(v);
  1753. if(sq_call(v, 3, SQTrue, SQTrue) == SQ_OK &&
  1754. sq_getinteger(v, -1, &result) == SQ_OK){
  1755. return result;
  1756. };
  1757. }
  1758. //restore stack
  1759. sq_settop(v, savedTop);
  1760. return 0;
  1761. }
  1762. static SQInteger _fl_add_focus_changing_handler(HSQUIRRELVM v)
  1763. {
  1764. sq_pushregistrytable(v);
  1765. sq_pushuserpointer(v, (void*)flfk_focus_changing_handler_hook);
  1766. sq_push(v, 2);
  1767. sq_rawset(v, -3);
  1768. Fl::add_focus_changing_handler(flfk_focus_changing_handler_hook);
  1769. return 0;
  1770. }
  1771. static SQInteger _fl_set_fonts(HSQUIRRELVM v)
  1772. {
  1773. const SQChar *filter = 0;
  1774. if(sq_gettop(v) > 1) sq_getstring(v, 2, &filter);
  1775. sq_pushinteger(v, Fl::set_fonts(filter));
  1776. return 1;
  1777. }
  1778. static SQInteger _fl_set_font(HSQUIRRELVM v)
  1779. {
  1780. const SQChar *fname = 0;
  1781. SQInteger font, new_font;
  1782. sq_getinteger(v, 2, &font);
  1783. SQObjectType ptype = sq_gettype(v, 3);
  1784. if(ptype == OT_INTEGER) {
  1785. sq_getinteger(v, 3, &new_font);
  1786. Fl::set_font((Fl_Font)font, (Fl_Font)new_font);
  1787. }
  1788. else if(ptype == OT_STRING) {
  1789. sq_getstring(v, 3, &fname);
  1790. Fl::set_font((Fl_Font)font, fname);
  1791. }
  1792. else return sq_throwerror(v, _SC("invalid parameter number 2"));
  1793. return 0;
  1794. }
  1795. static SQInteger _fl_get_font(HSQUIRRELVM v)
  1796. {
  1797. SQInteger font;
  1798. sq_getinteger(v, 2, &font);
  1799. sq_pushstring(v, Fl::get_font((Fl_Font)font), -1);
  1800. return 1;
  1801. }
  1802. static SQInteger _fl_get_font_name(HSQUIRRELVM v)
  1803. {
  1804. SQInteger font, attributes = 0;
  1805. sq_getinteger(v, 2, &font);
  1806. const char *fname = Fl::get_font_name((Fl_Font)font, &attributes);
  1807. sq_newtable(v);
  1808. sq_pushliteral(v, _SC("name"));
  1809. sq_pushstring(v, fname, -1);
  1810. sq_newslot(v, -3, SQFalse);
  1811. sq_pushliteral(v, _SC("attributes"));
  1812. sq_pushinteger(v, attributes);
  1813. sq_newslot(v, -3, SQFalse);
  1814. return 1;
  1815. }
  1816. static SQInteger _fl_fl_font(HSQUIRRELVM v)
  1817. {
  1818. SQ_FUNC_VARS_NO_TOP(v);
  1819. SQ_GET_INTEGER(v, 2, font);
  1820. SQ_GET_INTEGER(v, 3, font_size);
  1821. fl_font(font, font_size);
  1822. return 0;
  1823. }
  1824. static SQInteger _fl_fl_height(HSQUIRRELVM v)
  1825. {
  1826. SQ_FUNC_VARS(v);
  1827. if(_top_ > 1){
  1828. SQ_GET_INTEGER(v, 2, font);
  1829. SQ_GET_INTEGER(v, 2, font_size);
  1830. sq_pushinteger(v, fl_height(font, font_size));
  1831. }
  1832. else sq_pushinteger(v, fl_height());
  1833. return 1;
  1834. }
  1835. static SQInteger _fl_fl_width(HSQUIRRELVM v)
  1836. {
  1837. SQ_FUNC_VARS(v);
  1838. SQ_GET_STRING(v, 2, str);
  1839. SQ_OPT_INTEGER(v, 3, size, str_size);
  1840. sq_pushfloat(v, fl_width(str, size));
  1841. return 1;
  1842. }
  1843. static SQInteger _fl_fl_descent(HSQUIRRELVM v)
  1844. {
  1845. sq_pushinteger(v, fl_descent());
  1846. return 1;
  1847. }
  1848. //void fl_cursor(Fl_Cursor, Fl_Color fg=FL_BLACK, Fl_Color bg=FL_WHITE);
  1849. static SQInteger _fl_fl_cursor(HSQUIRRELVM v)
  1850. {
  1851. SQ_FUNC_VARS(v);
  1852. SQ_GET_INTEGER(v, 2, cursor);
  1853. SQ_OPT_INTEGER(v, 3, fg, FL_BLACK);
  1854. SQ_OPT_INTEGER(v, 4, bg, FL_WHITE);
  1855. fl_cursor((Fl_Cursor)cursor, fg, bg);
  1856. return 0;
  1857. }
  1858. #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_fl_##name,nparams,pmask}
  1859. static SQRegFunction fl_obj_funcs[]={
  1860. _DECL_FUNC(check,1,_SC("y")),
  1861. _DECL_FUNC(run,1,_SC("y")),
  1862. _DECL_FUNC(event,1,_SC("y")),
  1863. _DECL_FUNC(event_alt,1,_SC("y")),
  1864. _DECL_FUNC(event_button,1,_SC("y")),
  1865. _DECL_FUNC(event_button1,1,_SC("y")),
  1866. _DECL_FUNC(event_button2,1,_SC("y")),
  1867. _DECL_FUNC(event_button3,1,_SC("y")),
  1868. _DECL_FUNC(event_buttons,1,_SC("y")),
  1869. _DECL_FUNC(event_command,1,_SC("y")),
  1870. _DECL_FUNC(event_ctrl,1,_SC("y")),
  1871. _DECL_FUNC(event_dx,1,_SC("y")),
  1872. _DECL_FUNC(event_dy,1,_SC("y")),
  1873. _DECL_FUNC(event_length,1,_SC("y")),
  1874. _DECL_FUNC(event_shift,1,_SC("y")),
  1875. _DECL_FUNC(event_x,1,_SC("y")),
  1876. _DECL_FUNC(event_x_root,1,_SC("y")),
  1877. _DECL_FUNC(event_y,1,_SC("y")),
  1878. _DECL_FUNC(event_y_root,1,_SC("y")),
  1879. _DECL_FUNC(x,1,_SC("y")),
  1880. _DECL_FUNC(y,1,_SC("y")),
  1881. _DECL_FUNC(h,1,_SC("y")),
  1882. _DECL_FUNC(w,1,_SC("y")),
  1883. _DECL_FUNC(ready,1,_SC("y")),
  1884. _DECL_FUNC(screen_count,1,_SC("y")),
  1885. _DECL_FUNC(set_fonts,-1,_SC("ys")),
  1886. _DECL_FUNC(set_font,3,_SC("yi s|i")),
  1887. _DECL_FUNC(get_font,2,_SC("yi")),
  1888. _DECL_FUNC(get_font_name, 2,_SC("yi")),
  1889. _DECL_FUNC(scheme,-1,_SC("ys")),
  1890. _DECL_FUNC(visual,2,_SC("yi")),
  1891. _DECL_FUNC(option,-2,_SC("yib")),
  1892. _DECL_FUNC(event_key,-1,_SC("yi")),
  1893. _DECL_FUNC(event_state,-1,_SC("yi")),
  1894. _DECL_FUNC(event_is_click,-1,_SC("yi")),
  1895. _DECL_FUNC(event_clicks,-1,_SC("yi")),
  1896. _DECL_FUNC(scrollbar_size,-1,_SC("yi")),
  1897. _DECL_FUNC(visible_focus,-1,_SC("yi")),
  1898. _DECL_FUNC(do_widget_deletion,1,_SC("y")),
  1899. _DECL_FUNC(delete_widget,2,_SC("yx")),
  1900. _DECL_FUNC(add_timeout,-3,_SC("ync.")),
  1901. _DECL_FUNC(add_idle,-2,_SC("yc.")),
  1902. _DECL_FUNC(add_focus_changing_handler,2,_SC("yc")),
  1903. //globals made static on Fl
  1904. _DECL_FUNC(fl_cursor, -2,_SC("yiii")),
  1905. _DECL_FUNC(fl_font,3,_SC("yii")),
  1906. _DECL_FUNC(fl_width,-2,_SC("ysi")),
  1907. _DECL_FUNC(fl_height,-1,_SC("yii")),
  1908. _DECL_FUNC(fl_descent,1,_SC("y")),
  1909. {0,0}
  1910. };
  1911. #undef _DECL_FUNC
  1912. #define INT_CONST(s) { #s, s },
  1913. static const struct {
  1914. const char* name;
  1915. int value;
  1916. } fltk_constants[] = {
  1917. INT_CONST(FLVF_PERSIST_SELECT)
  1918. INT_CONST(FLVF_ROW_HEADER)
  1919. INT_CONST(FLVF_DIVIDERS)
  1920. INT_CONST(FLVS_VERTICAL_ALWAYS)
  1921. INT_CONST(FLVF_ROW_SELECT)
  1922. INT_CONST(FLVS_NONE)
  1923. INT_CONST(FL_ALIGN_BOTTOM)
  1924. INT_CONST(FL_ALIGN_CENTER)
  1925. INT_CONST(FL_ALIGN_CLIP)
  1926. INT_CONST(FL_ALIGN_INSIDE)
  1927. INT_CONST(FL_ALIGN_LEFT)
  1928. INT_CONST(FL_ALIGN_RIGHT)
  1929. INT_CONST(FL_ALIGN_TOP)
  1930. INT_CONST(FL_ALIGN_TOP_LEFT)
  1931. INT_CONST(FL_ALIGN_TOP_RIGHT)
  1932. INT_CONST(FL_ALIGN_WRAP)
  1933. INT_CONST(FL_ALT)
  1934. INT_CONST(FL_BACKGROUND2_COLOR)
  1935. INT_CONST(FL_BACKGROUND_COLOR)
  1936. INT_CONST(FL_BLACK)
  1937. INT_CONST(FL_BLUE)
  1938. INT_CONST(FL_BOLD)
  1939. INT_CONST(FL_BORDER_BOX)
  1940. INT_CONST(FL_BORDER_FRAME)
  1941. INT_CONST(FL_COMMAND)
  1942. INT_CONST(FL_COURIER)
  1943. INT_CONST(FL_COURIER_BOLD)
  1944. INT_CONST(FL_COURIER_BOLD_ITALIC)
  1945. INT_CONST(FL_COURIER_ITALIC)
  1946. INT_CONST(FL_CURSOR_DEFAULT)
  1947. INT_CONST(FL_CURSOR_WAIT)
  1948. INT_CONST(FL_CYAN)
  1949. INT_CONST(FL_DARK1)
  1950. INT_CONST(FL_DARK2)
  1951. INT_CONST(FL_DARK3)
  1952. INT_CONST(FL_DARK_BLUE)
  1953. INT_CONST(FL_DARK_CYAN)
  1954. INT_CONST(FL_DARK_GREEN)
  1955. INT_CONST(FL_DARK_MAGENTA)
  1956. INT_CONST(FL_DARK_RED)
  1957. INT_CONST(FL_DARK_YELLOW)
  1958. INT_CONST(FL_DOUBLE)
  1959. INT_CONST(FL_DOWN_BOX)
  1960. INT_CONST(FL_DOWN_FRAME)
  1961. INT_CONST(FL_ENGRAVED_BOX)
  1962. INT_CONST(FL_ENGRAVED_FRAME)
  1963. INT_CONST(FL_FLAT_BOX)
  1964. INT_CONST(FL_FOREGROUND_COLOR)
  1965. INT_CONST(FL_GREEN)
  1966. INT_CONST(FL_HELVETICA)
  1967. INT_CONST(FL_HELVETICA_BOLD)
  1968. INT_CONST(FL_HELVETICA_BOLD_ITALIC)
  1969. INT_CONST(FL_HELVETICA_ITALIC)
  1970. INT_CONST(FL_INACTIVE_COLOR)
  1971. INT_CONST(FL_INDEX)
  1972. INT_CONST(FL_ITALIC)
  1973. INT_CONST(FL_MAGENTA)
  1974. INT_CONST(FL_MENU_DIVIDER)
  1975. INT_CONST(FL_NORMAL_LABEL)
  1976. INT_CONST(FL_NO_BOX)
  1977. INT_CONST(FL_NO_LABEL)
  1978. INT_CONST(FL_RADIO_BUTTON)
  1979. INT_CONST(FL_RED)
  1980. INT_CONST(FL_RGB)
  1981. INT_CONST(FL_RGB8)
  1982. INT_CONST(FL_SELECTION_COLOR)
  1983. INT_CONST(FL_SHADOW_LABEL)
  1984. INT_CONST(FL_SHIFT)
  1985. INT_CONST(FL_SUBMENU)
  1986. INT_CONST(FL_TIMES)
  1987. INT_CONST(FL_TIMES_BOLD)
  1988. INT_CONST(FL_TIMES_BOLD_ITALIC)
  1989. INT_CONST(FL_TIMES_ITALIC)
  1990. INT_CONST(FL_UP_BOX)
  1991. INT_CONST(FL_WHEN_CHANGED)
  1992. INT_CONST(FL_WHEN_ENTER_KEY)
  1993. INT_CONST(FL_WHEN_ENTER_KEY_ALWAYS)
  1994. INT_CONST(FL_WHEN_ENTER_KEY_CHANGED)
  1995. INT_CONST(FL_WHEN_NEVER)
  1996. INT_CONST(FL_WHEN_NOT_CHANGED)
  1997. INT_CONST(FL_WHEN_RELEASE)
  1998. INT_CONST(FL_WHEN_RELEASE_ALWAYS)
  1999. INT_CONST(FL_WHITE)
  2000. INT_CONST(FL_YELLOW)
  2001. /* terminator */
  2002. { NULL, 0 }
  2003. };
  2004. #undef INT_CONST
  2005. #define PUSH_FL_CLASS(klass, parent, method_funcs) \
  2006. sq_pushnewclass(v, _SC(#klass), _SC(#parent), (void*)FLTK_TAG(klass), method_funcs, SQFalse)
  2007. #ifdef __cplusplus
  2008. extern "C" {
  2009. #endif
  2010. SQRESULT sqext_register_fltklib(HSQUIRRELVM v)
  2011. {
  2012. Fl::user_data = v;
  2013. //sq_pushstring(v,_SC("fltk"),-1);
  2014. //sq_newtable(v);
  2015. #define INT_CONST_PREFIX_VALUE(prefix, key, value) \
  2016. sq_pushstring(v, _SC(#key), -1);\
  2017. sq_pushinteger(v, prefix value);\
  2018. sq_newslot(v, -3, SQTrue);
  2019. #define INT_CONST_PREFIX(prefix, key) INT_CONST_PREFIX_VALUE(prefix, key, key)
  2020. #define INT_CONST(key) INT_CONST_PREFIX(, key)
  2021. //Fl class
  2022. sq_pushnewclass(v, _SC("Fl"), NULL, (void*)FLTK_TAG(Fl), fl_obj_funcs, SQTrue);
  2023. INT_CONST_PREFIX(Fl::, OPTION_ARROW_FOCUS);
  2024. INT_CONST_PREFIX(Fl::, OPTION_VISIBLE_FOCUS);
  2025. INT_CONST_PREFIX(Fl::, OPTION_DND_TEXT);
  2026. INT_CONST_PREFIX(Fl::, OPTION_SHOW_TOOLTIPS);
  2027. sq_poptop(v); //remove Fl class
  2028. //Fl_Widget class
  2029. sq_pushnewclass(v, FLTK_TAG(Fl_Widget), NULL, (void*)FLTK_TAG(Fl_Widget), fl_widget_obj_funcs, SQTrue);
  2030. sq_pushuserpointer(v, (void*)FLTK_TAG(Fl_Widget)); //push a key to be used on registrytable
  2031. sq_push(v, -2);
  2032. sq_setonregistrytable(v); //save a reference on registry to easy access, this will pop the Fl_Widget class
  2033. sq_poptop(v);
  2034. sq_pushnewclass(v, FLTK_TAG(Flv_Style), NULL, (void*)FLTK_TAG(Flv_Style), flv_style_obj_funcs, SQFalse);
  2035. sq_pushnewclass(v, FLTK_TAG(Flv_Style_List), NULL, (void*)FLTK_TAG(Flv_Style_List), flv_style_list_obj_funcs, SQFalse);
  2036. //Fl_Box class
  2037. PUSH_FL_CLASS(Fl_Box, Fl_Widget, fl_box_obj_funcs);
  2038. //Fl_Button class
  2039. PUSH_FL_CLASS(Fl_Button, Fl_Widget, fl_button_obj_funcs);
  2040. PUSH_FL_CLASS(Fl_Light_Button, Fl_Button, fl_light_button_obj_funcs);
  2041. PUSH_FL_CLASS(Fl_Check_Button, Fl_Light_Button, fl_check_button_obj_funcs);
  2042. PUSH_FL_CLASS(Fl_Radio_Button, Fl_Button, fl_radio_button_obj_funcs);
  2043. PUSH_FL_CLASS(Fl_Return_Button, Fl_Button, fl_radio_button_obj_funcs);
  2044. PUSH_FL_CLASS(Fl_Round_Button, Fl_Light_Button, fl_round_button_obj_funcs);
  2045. PUSH_FL_CLASS(Fl_Menu_, Fl_Widget, fl_menu__obj_funcs);
  2046. PUSH_FL_CLASS(Fl_Menu_Bar, Fl_Menu_, fl_menu_bar_obj_funcs);
  2047. PUSH_FL_CLASS(Fl_Choice, Fl_Menu_, fl_choice_obj_funcs);
  2048. //Fl_Input_ class
  2049. PUSH_FL_CLASS(Fl_Input_, Fl_Widget, fl_input__obj_funcs);
  2050. PUSH_FL_CLASS(Fl_Input, Fl_Input_, fl_input_obj_funcs);
  2051. PUSH_FL_CLASS(Fl_Float_Input, Fl_Input, fl_float_input_obj_funcs);
  2052. PUSH_FL_CLASS(Fl_Int_Input, Fl_Input, fl_int_input_obj_funcs);
  2053. PUSH_FL_CLASS(Fl_Output, Fl_Input, fl_output_obj_funcs);
  2054. PUSH_FL_CLASS(Fl_Secret_Input, Fl_Input, fl_secret_input_obj_funcs);
  2055. //Fl_Group class
  2056. PUSH_FL_CLASS(Fl_Group, Fl_Widget, fl_group_obj_funcs);
  2057. PUSH_FL_CLASS(Fl_Pack, Fl_Group, fl_pack_obj_funcs);
  2058. PUSH_FL_CLASS(Fl_Tabs, Fl_Group, fl_tabs_obj_funcs);
  2059. PUSH_FL_CLASS(Fl_Scroll, Fl_Group, fl_scroll_obj_funcs);
  2060. PUSH_FL_CLASS(Fl_Text_Display, Fl_Group, fl_text_display_obj_funcs);
  2061. PUSH_FL_CLASS(Fl_Text_Editor, Fl_Text_Display, fl_text_editor_obj_funcs);
  2062. PUSH_FL_CLASS(Fl_Text_Editor_Buffered, Fl_Text_Editor, fl_text_editor_buffered_obj_funcs);
  2063. PUSH_FL_CLASS(Flv_List, Fl_Group, flv_list_obj_funcs);
  2064. PUSH_FL_CLASS(Flv_Table, Flv_List, flv_table_obj_funcs);
  2065. PUSH_FL_CLASS(Flv_Data_Table, Flv_Table, flv_data_table_obj_funcs);
  2066. //Fl_Window class
  2067. PUSH_FL_CLASS(Fl_Window, Fl_Group, fl_window_obj_funcs);
  2068. //Fl_Double_Window class
  2069. PUSH_FL_CLASS(Fl_Double_Window, Fl_Window, fl_double_window_obj_funcs);
  2070. sq_pushnewclass(v, Fl_Text_Buffer_TAG, NULL, (void*)Fl_Text_Buffer_TAG, fl_text_buffer_obj_funcs, SQFalse);
  2071. sq_pushconsttable(v);
  2072. INT_CONST_PREFIX_VALUE(, FL_SHADOW_LABEL, FL_SHADOW_LABEL);
  2073. /* add constants to global table */
  2074. int i=0;
  2075. while (fltk_constants[i].name) {
  2076. sq_pushstring(v, fltk_constants[i].name, -1);
  2077. sq_pushinteger(v, fltk_constants[i].value);
  2078. sq_rawset(v, -3);
  2079. ++i;
  2080. }
  2081. sq_poptop(v);
  2082. //check to see if we need to release resources
  2083. Fl::do_at_widget_destroy_ = At_Widget_Destroy;
  2084. return SQ_OK;
  2085. }
  2086. #ifdef __cplusplus
  2087. }
  2088. #endif
  2089. #endif //WITH_FLTK