diff --git a/src/jtk/event.d b/src/jtk/event.d index ff4983f..934898f 100644 --- a/src/jtk/event.d +++ b/src/jtk/event.d @@ -1,5 +1,10 @@ module jtk.event; +import core.thread; +import core.sync.mutex; +import std.container.dlist; +import jtk.timer; + struct Event { enum Type : ubyte @@ -26,9 +31,7 @@ struct Event struct TimerEvent { - uint timer_id; - void * user1; - void * user2; + Timer timer; }; struct WindowResizeEvent @@ -46,3 +49,42 @@ struct Event WindowResizeEvent resize_event; }; } + +private extern(C) void jtk_wait_event(Event * event, ulong time_to_wait); + +private __gshared DList!(Event *) * event_list; +private __gshared Mutex event_list_mutex; + +Event * check_event() +{ + Event * rv = null; + event_list_mutex.lock_nothrow(); + if (!event_list.empty) + { + rv = event_list.front; + event_list.removeFront(); + } + event_list_mutex.unlock_nothrow(); + return rv; +} + +private void event_thread() +{ + for (;;) + { + Event * event = new Event; + ulong time_until_next_timer_expiry = + jtk.timer.Timer.time_to_next_timer_expiration(); + jtk_wait_event(event, time_until_next_timer_expiry); + event_list_mutex.lock_nothrow(); + event_list.insertBack(event); + event_list_mutex.unlock_nothrow(); + } +} + +package void event_init() +{ + event_list = new DList!(Event *); + event_list_mutex = new Mutex; + new Thread(&event_thread).start(); +} diff --git a/src/jtk/init.d b/src/jtk/init.d index d6de12c..1fc6485 100644 --- a/src/jtk/init.d +++ b/src/jtk/init.d @@ -1,5 +1,6 @@ module jtk.init; +static import jtk.event; static import jtk.timer; private extern(C) bool jtk_init(); @@ -11,6 +12,7 @@ bool init() return false; } + jtk.event.event_init(); jtk.timer.Timer.timer_init(); return true;