Enderal SE
https://mod.pub/enderal-se/38-enderal-se
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.
87 lines
1.7 KiB
87 lines
1.7 KiB
#include "Hooks_UI.h"
|
|
#include "Hooks_Threads.h"
|
|
#include "skse64_common/SafeWrite.h"
|
|
#include "skse64_common/Utilities.h"
|
|
#include "skse64_common/BranchTrampoline.h"
|
|
#include "GameMenus.h"
|
|
#include "common/ICriticalSection.h"
|
|
#include <queue>
|
|
|
|
#include "PapyrusUI.h"
|
|
|
|
namespace
|
|
{
|
|
struct QueueEntry
|
|
{
|
|
// Allow implicit construction
|
|
QueueEntry(UIDelegate* cmd) : bIsV1(false) { data.cmd = cmd; }
|
|
QueueEntry(UIDelegate_v1* cmd) : bIsV1(true) { data.cmd_v1 = cmd; }
|
|
|
|
bool bIsV1;
|
|
|
|
union {
|
|
UIDelegate* cmd;
|
|
UIDelegate_v1* cmd_v1;
|
|
} data;
|
|
};
|
|
}
|
|
|
|
ICriticalSection g_uiQueueLock;
|
|
std::queue<QueueEntry> g_uiQueue;
|
|
|
|
void UIManager::QueueCommand(UIDelegate* cmd)
|
|
{
|
|
g_uiQueueLock.Enter();
|
|
g_uiQueue.push(cmd);
|
|
g_uiQueueLock.Leave();
|
|
}
|
|
|
|
void UIManager::QueueCommand(UIDelegate_v1* cmd)
|
|
{
|
|
g_uiQueueLock.Enter();
|
|
g_uiQueue.push(cmd);
|
|
g_uiQueueLock.Leave();
|
|
}
|
|
|
|
void UIManager::ProcessCommands(void)
|
|
{
|
|
CALL_MEMBER_FN(this, ProcessEventQueue_HookTarget)();
|
|
|
|
g_uiQueueLock.Enter();
|
|
while (!g_uiQueue.empty())
|
|
{
|
|
QueueEntry e = g_uiQueue.front();
|
|
g_uiQueue.pop();
|
|
|
|
// Old interface
|
|
if (e.bIsV1)
|
|
{
|
|
UIDelegate_v1* cmd = e.data.cmd_v1;
|
|
cmd->Run();
|
|
cmd->Dispose();
|
|
}
|
|
// New interface
|
|
else
|
|
{
|
|
UIDelegate* cmd = e.data.cmd;
|
|
cmd->Run();
|
|
delete cmd;
|
|
}
|
|
}
|
|
g_uiQueueLock.Leave();
|
|
}
|
|
|
|
void TaskInterface::AddUITask(UIDelegate_v1* task)
|
|
{
|
|
UIManager * uiManager = UIManager::GetSingleton();
|
|
if(uiManager) {
|
|
uiManager->QueueCommand(task);
|
|
}
|
|
}
|
|
|
|
RelocAddr <uintptr_t> ProcessEventQueue_HookTarget_Enter(0x00F05AF0 + 0xAB5);
|
|
|
|
void Hooks_UI_Commit(void)
|
|
{
|
|
g_branchTrampoline.Write5Call(ProcessEventQueue_HookTarget_Enter, GetFnAddr(&UIManager::ProcessCommands));
|
|
}
|
|
|