I have posted days ago
[https://forum.nim-lang.org/t/4522](https://forum.nim-lang.org/t/4522) in which
I try to bind xcgui which is a free 32bits dll for windows
Now I try to bind FLTK([http://www.fltk.org)](http://www.fltk.org\)). I can
compile FLTK, test, examples and fluid with my MSYS2+MingW64 on Win7 64 bits I
know there is already
[https://github.com/Skrylar/nfltk](https://github.com/Skrylar/nfltk), but so
bad, the test.nim can not be compiled, my msys2 halted for hours on lines
Hint: nimwidget [Processing]
CC: fltk_test
CC: fltk_enumerations
Run
However I am not trying to translated the official FLTK C header by myself
again. C's pointer are always beats me, and I found a nice FLTK binding( and
tons of examples) for freebasic by D.J.Peters on
[https://www.freebasic.net/forum/viewtopic.php?f=14=24547](https://www.freebasic.net/forum/viewtopic.php?f=14=24547)
In the work of D.J.Peters, there are prebuilt
fltk-c-1.3.3-32.dll
fltk-c-1.3.3-64.dll
libfltk-c-1.3.3-32-arm.so
libfltk-c-1.3.3-32-syslib.so
libfltk-c-1.3.3-32.so
libfltk-c-1.3.3-64-syslib.so
libfltk-c-1.3.3-64.so
Run
so I just mimicked and got the following code
import winim # for the L""
type
long = int16
Fl_Widget = int16
Fl_Window = int16
Fl_Button = int16
#~ Fl_Callback = int16
const
fltk* = "fltk-c-1.3.3-64.dll"
type
Ihandle = object
PIhandle* = ptr Ihandle
Icallback* = proc (arg: PIhandle): cint {.cdecl.}
Fl_Callback* = proc(widget: ptr Fl_Widget, pData: ptr any)
proc Fl_WindowNew(byval: long, h: long, title:cstring): ptr Fl_Window{.
cdecl, importc: "Fl_WindowNew", dynlib: fltk, discardable.}
proc Fl_ButtonNew(x: long, y: long, w: long, h: long, label: cstring) :
ptr Fl_Button{.
cdecl, importc: "Fl_ButtonNew", dynlib: fltk, discardable.}
proc Fl_WidgetSetCallback(wgt: ptr Fl_Widget, cb:Fl_Callback){.
cdecl, importc: "Fl_WidgetSetCallback", dynlib: fltk, discardable.}
proc Fl_WindowShow(win: ptr Fl_Window){.
cdecl, importc: "Fl_WindowShow", dynlib: fltk, discardable.}
proc Fl_Run(): long{.
cdecl, importc: "Fl_Run", dynlib: fltk, discardable.}
proc Fl_WidgetCopyLabel(wgt: ptr Fl_Widget; caption: ptr WCHAR){.
cdecl, importc: "Fl_WidgetCopyLabel", dynlib: fltk, discardable.}
proc ButtonClick (button: ptr FL_WIDGET, arg: ptr any):cint {.cdecl.} =
Fl_WidgetCopyLabel(button, "do it again")
var Win = Fl_WindowNew(320, 200, "What a shiny Window :-)")
var Btn = Fl_ButtonNew(10, 10, 120, 32, "click me")
#~ Fl_WidgetSetCallback(Btn, ButtonClick)
#~ Fl_WidgetSetCallback(cast[ptr Fl_Widget](Btn), (ButtonClick))
#~ Fl_WidgetSetCallback(cast[ptr Fl_Widget](Btn),
cast[Fl_Callback](ButtonClick))
Fl_WindowShow(Win)
Fl_Run()
Run
this code can run without the Fl_WidgetSetCallback line.
If I use
Fl_WidgetSetCallback(Btn, ButtonClick)
Run
I get
a.nim(45, 21) Error: type mismatch: got
but expected one of:
proc Fl_WidgetSetCallback(wgt: ptr Fl_Widget; cb: Fl_Callback)
first type mismatch at position: 2
required type: Fl_Callback
but expression 'ButtonClick' is of type: proc (button: ptr Fl_Widget,
arg: ptr GenericParam): cint{.cdecl.}
expression: Fl_WidgetSetCallback(Btn, ButtonClick)
Run
elif I use
Fl_WidgetSetCallback(cast[ptr Fl_Widget](Btn), (ButtonClick))
Run
I get
a.nim(46, 21) Error: type mismatch: got
but expected one of:
proc Fl_WidgetSetCallback(wgt: ptr Fl_Widget; cb: Fl_Callback)
first type mismatch at position: 2
required type: Fl_Callback
but expression 'ButtonClick' is of type: proc (button: ptr Fl_Widget,
arg: ptr GenericParam): cint{.cdecl.}
expression: Fl_WidgetSetCallback(cast[ptr Fl_Widget](Btn), ButtonClick)
Run
elif I use
Fl_WidgetSetCallback(cast[ptr Fl_Widget](Btn),
cast[Fl_Callback](ButtonClick))
Run
I get
a.nim(47, 53) Error: cannot cast to a non concrete type: 'Fl_Callback'
Run
Please, can anyone give clear help? Thanks