#include "event/Event.hpp" #include "event/EvtContext.hpp" #include "event/EvtThread.hpp" #include "event/Input.hpp" #include "event/Queue.hpp" #include "event/Scheduler.hpp" #include #include #include #include SEvent Event::s_startEvent = SEvent(1, 0); SEvent Event::s_shutdownEvent = SEvent(1, 0); int32_t Event::s_netServer; int32_t Event::s_threadSlotCount; SCritSect* Event::s_threadSlotCritsects; EvtThread** Event::s_threadSlots; uint32_t Event::s_mainThread; TSGrowableArray Event::s_schedulerThreads; ATOMIC32 Event::s_threadListContention { -1 }; SCritSect Event::s_threadListCritsect; TSList> Event::s_threadList; EvtContext* Event::s_currentEvtContext; ATOMIC32 Event::s_interactiveCount; #if defined(WHOA_SYSTEM_MAC) bool Event::s_shouldLoopTerminate; #endif void OsNetPump(uint32_t timeout) { // TODO } void EventInitialize(int32_t threadCount, int32_t netServer) { IEvtInputInitialize(); int32_t v2 = threadCount; if (threadCount < 1) { v2 = 1; } IEvtSchedulerInitialize(v2, netServer); // TODO // OsInputSetEventPollProc(&sub_47DCA0); } int32_t EventIsControlKeyDown() { return EventIsKeyDown(KEY_LCONTROL) || EventIsKeyDown(KEY_RCONTROL); } int32_t EventIsKeyDown(KEY key) { // TODO return 0; } int32_t EventIsShiftKeyDown() { return EventIsKeyDown(KEY_LSHIFT) || EventIsKeyDown(KEY_RSHIFT); } HEVENTCONTEXT EventCreateContextEx(int32_t interactive, int32_t (*initializeHandler)(const void*, void*), int32_t (*destroyHandler)(const void*, void*), uint32_t idleTime, uint32_t debugFlags) { return IEvtSchedulerCreateContext(interactive, initializeHandler, destroyHandler, idleTime, debugFlags); } void EventDoMessageLoop() { IEvtSchedulerProcess(); } void EventPostCloseEx(HEVENTCONTEXT contextHandle) { if (!contextHandle) { contextHandle = PropGet(PROP_EVENTCONTEXT); } if (contextHandle) { uint32_t contextId = *reinterpret_cast(contextHandle); int32_t findMask; EvtContext* context = TSingletonInstanceId::s_idTable.Ptr( contextId, 0, &findMask ); if (context) { context->m_critsect.Enter(); if (context->m_schedState == EvtContext::SCHEDSTATE_ACTIVE) { context->m_schedState = EvtContext::SCHEDSTATE_CLOSED; } context->m_critsect.Leave(); if (findMask != -1) { TSingletonInstanceId::s_idTable.Unlock( findMask & (INSTANCE_TABLE_SLOT_COUNT - 1), findMask >= INSTANCE_TABLE_SLOT_COUNT ); } } } } void EventRegister(EVENTID id, EVENTHANDLERFUNC handler) { EventRegisterEx(id, handler, nullptr, 0.0f); } void EventRegisterEx(EVENTID id, EVENTHANDLERFUNC handler, void* param, float priority) { if (id < 0 || id > EVENTIDS || handler == nullptr) { // TODO // SErrSetLastError(0x57u); return; } HEVENTCONTEXT hContext = PropGet(PROP_EVENTCONTEXT); uint32_t contextId = *reinterpret_cast(hContext); int32_t findMask; EvtContext* context = TSingletonInstanceId::s_idTable.Ptr( contextId, 0, &findMask ); if (context) { IEvtQueueRegister(context, id, handler, param, priority); if (findMask != -1) { TSingletonInstanceId::s_idTable.Unlock( findMask & (INSTANCE_TABLE_SLOT_COUNT - 1), findMask >= INSTANCE_TABLE_SLOT_COUNT ); } } }