Files
XCEngine/new_editor/app/Bootstrap/ApplicationRunLoop.cpp

68 lines
1.9 KiB
C++

#include "Bootstrap/Application.h"
#include "Platform/Win32/EditorWindow.h"
#include "Platform/Win32/EditorWindowManager.h"
#include <XCEditor/Foundation/UIEditorRuntimeTrace.h>
namespace XCEngine::UI::Editor {
void Application::TickSmokeTest() {
if (!m_smokeTestEnabled || m_smokeTestCloseRequested || m_windowManager == nullptr) {
return;
}
++m_smokeTestRenderedFrames;
if (m_smokeTestRenderedFrames < m_smokeTestFrameLimit) {
return;
}
if (App::EditorWindow* primaryWindow = m_windowManager->FindPrimaryWindow();
primaryWindow != nullptr &&
primaryWindow->GetHwnd() != nullptr) {
PostMessageW(primaryWindow->GetHwnd(), WM_CLOSE, 0, 0);
m_smokeTestCloseRequested = true;
AppendUIEditorRuntimeTrace("smoke", "frame budget reached, requested WM_CLOSE");
}
}
int Application::Run(HINSTANCE hInstance, int nCmdShow) {
if (!Initialize(hInstance, nCmdShow)) {
Shutdown();
return 1;
}
MSG message = {};
while (true) {
while (PeekMessageW(&message, nullptr, 0U, 0U, PM_REMOVE)) {
if (message.message == WM_QUIT) {
Shutdown();
return static_cast<int>(message.wParam);
}
TranslateMessage(&message);
DispatchMessageW(&message);
}
if (m_windowManager != nullptr) {
m_windowManager->DestroyClosedWindows();
m_windowManager->ProcessPendingGlobalTabDragStarts();
m_windowManager->ProcessPendingDetachRequests();
m_windowManager->DestroyClosedWindows();
if (!m_windowManager->HasWindows()) {
break;
}
m_windowManager->RenderAllWindows();
TickSmokeTest();
} else {
break;
}
}
Shutdown();
return 0;
}
} // namespace XCEngine::UI::Editor