You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
8 years ago
|
-- see copyright notice in wxLdb.lua
|
||
|
|
||
|
local wx = require( "wx" )
|
||
|
|
||
|
local coroutine = coroutine
|
||
|
local assert = assert
|
||
|
local debug = debug
|
||
|
|
||
|
module( "mainthread" )
|
||
|
|
||
|
local mainObj = nil
|
||
|
local eventsData = {}
|
||
|
local id = 194283
|
||
|
|
||
|
function init( obj )
|
||
|
assert( coroutine.running() == nil )
|
||
|
assert( obj ~= nil )
|
||
|
assert( mainObj == nil )
|
||
|
mainObj = obj
|
||
|
mainObj:Connect( wx.wxEVT_NULL, function( event )
|
||
|
if event:GetId() == id then
|
||
|
local data = assert( eventsData[event:GetInt()] )
|
||
|
eventsData[event:GetInt()] = nil
|
||
|
local ok, msg = coroutine.resume( data.coroutine, data.func() )
|
||
|
assert( ok, debug.traceback( data.coroutine, msg ) )
|
||
|
end
|
||
|
end )
|
||
|
end
|
||
|
|
||
|
function execute( f )
|
||
|
assert( mainObj ~= nil )
|
||
|
if coroutine.running() == nil then
|
||
|
return f()
|
||
|
else
|
||
|
local e = wx.wxCommandEvent() -- event ID is wxEVT_NULL ; if someone else post this event for another purpose, it will conflict with this system...
|
||
|
local data = {}
|
||
|
data.coroutine = coroutine.running()
|
||
|
data.func = f
|
||
|
local dataId = #eventsData + 1 -- we don't care if dataId does not increment each time a new event is created ; in any case, we are sure that, by definition of the length operator, eventsData[#eventsData+1] is nil
|
||
|
eventsData[dataId] = data
|
||
|
e:SetInt( dataId )
|
||
|
e:SetId( id )
|
||
|
wx.wxPostEvent( mainObj, e )
|
||
|
return coroutine.yield()
|
||
|
end
|
||
|
end
|