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.
46 lines
1.3 KiB
46 lines
1.3 KiB
-- 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
|
|
|