diff --git a/src/xswiftbus/plugin.cpp b/src/xswiftbus/plugin.cpp index a06acdd95..3cb04d308 100644 --- a/src/xswiftbus/plugin.cpp +++ b/src/xswiftbus/plugin.cpp @@ -53,8 +53,6 @@ namespace XSwiftBus m_planeViewSubMenu = m_menu.subMenu("Follow Plane View"); planeViewOwnAircraftMenuItem = m_planeViewSubMenu.item("Own Aircraft", [this] { switchToOwnAircraftView(); }); - readConfig(); - /*m_dbusThread = std::thread([this]() { while(!m_shouldStop) @@ -63,9 +61,9 @@ namespace XSwiftBus } });*/ - XPLMRegisterFlightLoopCallback(flightLoopCallback, -1, this); - - startServer(); + // Delay the start of XSwiftBus. + // http://www.xsquawkbox.net/xpsdk/mediawiki/DeferredInitialization + XPLMRegisterFlightLoopCallback(startServerDeferred, -1, this); } CPlugin::~CPlugin() @@ -87,6 +85,10 @@ namespace XSwiftBus void CPlugin::startServer() { + XPLMRegisterFlightLoopCallback(flightLoopCallback, -1, this); + + readConfig(); + m_service = std::make_unique(); m_traffic = std::make_unique(); m_weather = std::make_unique(); @@ -167,9 +169,21 @@ namespace XSwiftBus } } + float CPlugin::startServerDeferred(float, float, int, void *refcon) + { + auto *plugin = static_cast(refcon); + if (! plugin->m_isRunning) + { + plugin->startServer(); + plugin->m_isRunning = true; + } + return 0; + } + float CPlugin::flightLoopCallback(float, float, int, void *refcon) { auto *plugin = static_cast(refcon); + plugin->m_dbusDispatcher.runOnce(); if (plugin->m_service) { plugin->m_service->process(); } if (plugin->m_weather) { plugin->m_weather->process(); } diff --git a/src/xswiftbus/plugin.h b/src/xswiftbus/plugin.h index a9990fb50..02c3b8536 100644 --- a/src/xswiftbus/plugin.h +++ b/src/xswiftbus/plugin.h @@ -78,12 +78,14 @@ namespace XSwiftBus DataRef m_ownAircraftPositionZ; std::thread m_dbusThread; + bool m_isRunning = false; bool m_shouldStop = false; void readConfig(); void startServer(); void switchToOwnAircraftView(); + static float startServerDeferred(float, float, int, void *refcon); static float flightLoopCallback(float, float, int, void *refcon); static int orbitOwnAircraftFunc(XPLMCameraPosition_t *cameraPosition, int isLosingControl, void *refcon); };