# Like my usecase is that I pass in "cell" into the listener proc. # That works because I pass in "data" to the g_timeout_add_full # Now this is allocCallback: proc allocCallback(fn: TimeoutProc): tuple[call: GSourceFunc, data: ptr TimeoutProc, destroy: GDestroyNotify] = proc call(data: pointer): cbool {.cdecl.} = let fn = cast[ptr TimeoutProc](data) result = cbool(ord(fn[]())) proc destroy(data: pointer) {.cdecl.} = let fn = cast[ptr TimeoutProc](data) reset(fn[]) deallocShared(fn) result.call = call result.destroy = destroy result.data = cast[ptr TimeoutProc](allocShared0(sizeof(ptr TimeoutProc))) when defined(gcDestructors): `=wasMoved`(result.data[]) result.data[] = fn # And I'm understanding nothing