History

trying to fix dependency shutdown

SamGondelman committed 8 years ago

Commit 79548651 parent 01c4b5716 files · +159 −190Browse files

Showing the changes to interface/src/Application.cpp (1 of 16 files). Show all

Unified · Split

interface/src/Application.cpp+125−127
@@ -1138,33 +1138,34 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 1137 unmodified lines
11381138 domainCheckInTimer->deleteLater();
11391139 });
11401140
1141+ {
1142+ auto audioIO = DependencyManager::get<AudioClient>().data();
1143+ audioIO->setPositionGetter([] {
1144+ auto avatarManager = DependencyManager::get<AvatarManager>();
1145+ auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr;
11411146
1142− auto audioIO = DependencyManager::get<AudioClient>();
1143− audioIO->setPositionGetter([]{
1144− auto avatarManager = DependencyManager::get<AvatarManager>();
1145− auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr;
1146−
1147− return myAvatar ? myAvatar->getPositionForAudio() : Vectors::ZERO;
1148− });
1149− audioIO->setOrientationGetter([]{
1150− auto avatarManager = DependencyManager::get<AvatarManager>();
1151− auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr;
1147+ return myAvatar ? myAvatar->getPositionForAudio() : Vectors::ZERO;
1148+ });
1149+ audioIO->setOrientationGetter([] {
1150+ auto avatarManager = DependencyManager::get<AvatarManager>();
1151+ auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr;
11521152
1153− return myAvatar ? myAvatar->getOrientationForAudio() : Quaternions::IDENTITY;
1154− });
1153+ return myAvatar ? myAvatar->getOrientationForAudio() : Quaternions::IDENTITY;
1154+ });
11551155
1156− recording::Frame::registerFrameHandler(AudioConstants::getAudioFrameName(), [=](recording::Frame::ConstPointer frame) {
1157− audioIO->handleRecordedAudioInput(frame->data);
1158− });
1156+ recording::Frame::registerFrameHandler(AudioConstants::getAudioFrameName(), [=](recording::Frame::ConstPointer frame) {
1157+ audioIO->handleRecordedAudioInput(frame->data);
1158+ });
11591159
1160− connect(audioIO.data(), &AudioClient::inputReceived, [](const QByteArray& audio){
1161− static auto recorder = DependencyManager::get<recording::Recorder>();
1162− if (recorder->isRecording()) {
1163− static const recording::FrameType AUDIO_FRAME_TYPE = recording::Frame::registerFrameType(AudioConstants::getAudioFrameName());
1164− recorder->recordFrame(AUDIO_FRAME_TYPE, audio);
1165− }
1166− });
1167− audioIO->startThread();
1160+ connect(audioIO, &AudioClient::inputReceived, [](const QByteArray& audio) {
1161+ static auto recorder = DependencyManager::get<recording::Recorder>();
1162+ if (recorder->isRecording()) {
1163+ static const recording::FrameType AUDIO_FRAME_TYPE = recording::Frame::registerFrameType(AudioConstants::getAudioFrameName());
1164+ recorder->recordFrame(AUDIO_FRAME_TYPE, audio);
1165+ }
1166+ });
1167+ audioIO->startThread();
1168+ }
11681169
11691170 // Make sure we don't time out during slow operations at startup
11701171 updateHeartbeat();
@@ -1263,27 +1264,29 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 92 unmodified lines
12631264 // Inititalize sample before registering
12641265 _sampleSound = DependencyManager::get<SoundCache>()->getSound(PathUtils::resourcesUrl("sounds/sample.wav"));
12651266
1266− auto scriptEngines = DependencyManager::get<ScriptEngines>().data();
1267− scriptEngines->registerScriptInitializer([this](ScriptEnginePointer engine){
1268− registerScriptEngineWithApplicationServices(engine);
1269− });
1267+ {
1268+ auto scriptEngines = DependencyManager::get<ScriptEngines>().data();
1269+ scriptEngines->registerScriptInitializer([this](ScriptEnginePointer engine) {
1270+ registerScriptEngineWithApplicationServices(engine);
1271+ });
12701272
1271− connect(scriptEngines, &ScriptEngines::scriptCountChanged, scriptEngines, [this] {
1272− auto scriptEngines = DependencyManager::get<ScriptEngines>();
1273− if (scriptEngines->getRunningScripts().isEmpty()) {
1274− getMyAvatar()->clearScriptableSettings();
1275− }
1276− }, Qt::QueuedConnection);
1273+ connect(scriptEngines, &ScriptEngines::scriptCountChanged, this, [this] {
1274+ auto scriptEngines = DependencyManager::get<ScriptEngines>();
1275+ if (scriptEngines->getRunningScripts().isEmpty()) {
1276+ getMyAvatar()->clearScriptableSettings();
1277+ }
1278+ }, Qt::QueuedConnection);
12771279
1278− connect(scriptEngines, &ScriptEngines::scriptsReloading, scriptEngines, [this] {
1279− getEntities()->reloadEntityScripts();
1280− loadAvatarScripts(getMyAvatar()->getScriptUrls());
1281− }, Qt::QueuedConnection);
1280+ connect(scriptEngines, &ScriptEngines::scriptsReloading, this, [this] {
1281+ getEntities()->reloadEntityScripts();
1282+ loadAvatarScripts(getMyAvatar()->getScriptUrls());
1283+ }, Qt::QueuedConnection);
12821284
1283− connect(scriptEngines, &ScriptEngines::scriptLoadError,
1284− scriptEngines, [](const QString& filename, const QString& error){
1285− OffscreenUi::asyncWarning(nullptr, "Error Loading Script", filename + " failed to load.");
1286− }, Qt::QueuedConnection);
1285+ connect(scriptEngines, &ScriptEngines::scriptLoadError,
1286+ this, [](const QString& filename, const QString& error) {
1287+ OffscreenUi::asyncWarning(nullptr, "Error Loading Script", filename + " failed to load.");
1288+ }, Qt::QueuedConnection);
1289+ }
12871290
12881291 #ifdef _WIN32
12891292 WSADATA WsaData;
@@ -1353,10 +1356,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 63 unmodified lines
13531356 // so we defer the setup of the `scripting::Audio` class until this point
13541357 {
13551358 auto audioScriptingInterface = DependencyManager::set<AudioScriptingInterface, scripting::Audio>();
1356− connect(audioIO.data(), &AudioClient::mutedByMixer, audioScriptingInterface.data(), &AudioScriptingInterface::mutedByMixer);
1357− connect(audioIO.data(), &AudioClient::receivedFirstPacket, audioScriptingInterface.data(), &AudioScriptingInterface::receivedFirstPacket);
1358− connect(audioIO.data(), &AudioClient::disconnected, audioScriptingInterface.data(), &AudioScriptingInterface::disconnected);
1359− connect(audioIO.data(), &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) {
1359+ auto audioIO = DependencyManager::get<AudioClient>().data();
1360+ connect(audioIO, &AudioClient::mutedByMixer, audioScriptingInterface.data(), &AudioScriptingInterface::mutedByMixer);
1361+ connect(audioIO, &AudioClient::receivedFirstPacket, audioScriptingInterface.data(), &AudioScriptingInterface::receivedFirstPacket);
1362+ connect(audioIO, &AudioClient::disconnected, audioScriptingInterface.data(), &AudioScriptingInterface::disconnected);
1363+ connect(audioIO, &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) {
13601364 auto audioClient = DependencyManager::get<AudioClient>();
13611365 auto audioScriptingInterface = DependencyManager::get<AudioScriptingInterface>();
13621366 auto myAvatarPosition = DependencyManager::get<AvatarManager>()->getMyAvatar()->getWorldPosition();
@@ -1688,23 +1692,26 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 325 unmodified lines
16881692 userInputMapper->registerDevice(_touchscreenVirtualPadDevice->getInputDevice());
16891693 }
16901694
1691− // this will force the model the look at the correct directory (weird order of operations issue)
1692− scriptEngines->reloadLocalFiles();
1693−
1694− // do this as late as possible so that all required subsystems are initialized
1695− // If we've overridden the default scripts location, just load default scripts
1696− // otherwise, load 'em all
1697−
1698− // we just want to see if --scripts was set, we've already parsed it and done
1699− // the change in PathUtils. Rather than pass that in the constructor, lets just
1700− // look (this could be debated)
1701− QString scriptsSwitch = QString("--").append(SCRIPTS_SWITCH);
1702− QDir defaultScriptsLocation(getCmdOption(argc, constArgv, scriptsSwitch.toStdString().c_str()));
1703− if (!defaultScriptsLocation.exists()) {
1704− scriptEngines->loadDefaultScripts();
1705− scriptEngines->defaultScriptsLocationOverridden(true);
1706− } else {
1707− scriptEngines->loadScripts();
1695+ {
1696+ auto scriptEngines = DependencyManager::get<ScriptEngines>().data();
1697+ // this will force the model the look at the correct directory (weird order of operations issue)
1698+ scriptEngines->reloadLocalFiles();
1699+
1700+ // do this as late as possible so that all required subsystems are initialized
1701+ // If we've overridden the default scripts location, just load default scripts
1702+ // otherwise, load 'em all
1703+
1704+ // we just want to see if --scripts was set, we've already parsed it and done
1705+ // the change in PathUtils. Rather than pass that in the constructor, lets just
1706+ // look (this could be debated)
1707+ QString scriptsSwitch = QString("--").append(SCRIPTS_SWITCH);
1708+ QDir defaultScriptsLocation(getCmdOption(argc, constArgv, scriptsSwitch.toStdString().c_str()));
1709+ if (!defaultScriptsLocation.exists()) {
1710+ scriptEngines->loadDefaultScripts();
1711+ scriptEngines->defaultScriptsLocationOverridden(true);
1712+ } else {
1713+ scriptEngines->loadScripts();
1714+ }
17081715 }
17091716
17101717 // Make sure we don't time out during slow operations at startup
@@ -1754,13 +1761,16 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 43 unmodified lines
17541761 cameraMenuChanged();
17551762 }
17561763
1757− // set the local loopback interface for local sounds
1758− AudioInjector::setLocalAudioInterface(audioIO.data());
1759− auto audioScriptingInterface = DependencyManager::get<AudioScriptingInterface>();
1760− audioScriptingInterface->setLocalAudioInterface(audioIO.data());
1761− connect(audioIO.data(), &AudioClient::noiseGateOpened, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateOpened);
1762− connect(audioIO.data(), &AudioClient::noiseGateClosed, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateClosed);
1763− connect(audioIO.data(), &AudioClient::inputReceived, audioScriptingInterface.data(), &AudioScriptingInterface::inputReceived);
1764+ {
1765+ auto audioIO = DependencyManager::get<AudioClient>().data();
1766+ // set the local loopback interface for local sounds
1767+ AudioInjector::setLocalAudioInterface(audioIO);
1768+ auto audioScriptingInterface = DependencyManager::get<AudioScriptingInterface>();
1769+ audioScriptingInterface->setLocalAudioInterface(audioIO);
1770+ connect(audioIO, &AudioClient::noiseGateOpened, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateOpened);
1771+ connect(audioIO, &AudioClient::noiseGateClosed, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateClosed);
1772+ connect(audioIO, &AudioClient::inputReceived, audioScriptingInterface.data(), &AudioScriptingInterface::inputReceived);
1773+ }
17641774
17651775 this->installEventFilter(this);
17661776
@@ -2174,11 +2184,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 407 unmodified lines
21742184 QVariant testProperty = property(hifi::properties::TEST);
21752185 qDebug() << testProperty;
21762186 if (testProperty.isValid()) {
2177− auto scriptEngines = DependencyManager::get<ScriptEngines>();
21782187 const auto testScript = property(hifi::properties::TEST).toUrl();
21792188
21802189 // Set last parameter to exit interface when the test script finishes, if so requested
2181− scriptEngines->loadScript(testScript, false, false, false, false, quitWhenFinished);
2190+ DependencyManager::get<ScriptEngines>()->loadScript(testScript, false, false, false, false, quitWhenFinished);
21822191
21832192 // This is done so we don't get a "connection time-out" message when we haven't passed in a URL.
21842193 if (arguments().contains("--url")) {
@@ -2456,6 +2465,15 @@ void Application::cleanupBeforeQuit() { · 271 unmodified lines
24562465 // Clear any queued processing (I/O, FBX/OBJ/Texture parsing)
24572466 QThreadPool::globalInstance()->clear();
24582467
2468+ // These classes hold ScriptEnginePointers, so they must be destroyed before ScriptEngines
2469+ {
2470+ DependencyManager::destroy<RecordingScriptingInterface>();
2471+ DependencyManager::destroy<StandAloneJSConsole>();
2472+ EntityTreePointer tree = getEntities()->getTree();
2473+ tree->setSimulation(nullptr);
2474+ DependencyManager::destroy<EntityTreeRenderer>();
2475+ }
2476+
24592477 DependencyManager::get<ScriptEngines>()->shutdownScripting(); // stop all currently running global scripts
24602478 DependencyManager::destroy<ScriptEngines>();
24612479
@@ -2493,6 +2511,8 @@ void Application::cleanupBeforeQuit() { · 31 unmodified lines
24932511 DependencyManager::destroy<EyeTracker>();
24942512 #endif
24952513
2514+ DependencyManager::destroy<ContextOverlayInterface>(); // Must be destroyed before TabletScriptingInterface
2515+
24962516 // stop QML
24972517 DependencyManager::destroy<TabletScriptingInterface>();
24982518 DependencyManager::destroy<ToolbarScriptingInterface>();
@@ -2504,10 +2524,6 @@ void Application::cleanupBeforeQuit() { · 5 unmodified lines
25042524 _snapshotSoundInjector->stop();
25052525 }
25062526
2507− // FIXME: something else is holding a reference to AudioClient,
2508− // so it must be explicitly synchronously stopped here
2509− DependencyManager::get<AudioClient>()->cleanupBeforeQuit();
2510−
25112527 // destroy Audio so it and its threads have a chance to go down safely
25122528 // this must happen after QML, as there are unexplained audio crashes originating in qtwebengine
25132529 DependencyManager::destroy<AudioClient>();
@@ -2547,9 +2563,6 @@ Application::~Application() { · 33 unmodified lines
25472563 _entityClipboard->eraseAllOctreeElements();
25482564 _entityClipboard.reset();
25492565
2550− EntityTreePointer tree = getEntities()->getTree();
2551− tree->setSimulation(nullptr);
2552−
25532566 _octreeProcessor.terminate();
25542567 _entityEditSender.terminate();
25552568
@@ -3239,8 +3252,7 @@ void Application::showHelp() { · 683 unmodified lines
32393252 QUrlQuery queryString;
32403253 queryString.addQueryItem("handControllerName", handControllerName);
32413254 queryString.addQueryItem("defaultTab", defaultTab);
3242− auto tabletScriptingInterface = DependencyManager::get<TabletScriptingInterface>();
3243− TabletProxy* tablet = dynamic_cast<TabletProxy*>(tabletScriptingInterface->getTablet(SYSTEM_TABLET));
3255+ TabletProxy* tablet = dynamic_cast<TabletProxy*>(DependencyManager::get<TabletScriptingInterface>()->getTablet(SYSTEM_TABLET));
32443256 tablet->gotoWebScreen(PathUtils::resourcesUrl() + INFO_HELP_PATH + "?" + queryString.toString());
32453257 DependencyManager::get<HMDScriptingInterface>()->openTablet();
32463258 //InfoView::show(INFO_HELP_PATH, false, queryString.toString());
@@ -3545,6 +3557,10 @@ static void dumpEventQueue(QThread* thread) { · 298 unmodified lines
35453557
35463558 bool Application::event(QEvent* event) {
35473559
3560+ if (_aboutToQuit) {
3561+ return false;
3562+ }
3563+
35483564 if (!Menu::getInstance()) {
35493565 return false;
35503566 }
@@ -3937,10 +3953,6 @@ void Application::maybeToggleMenuVisible(QMouseEvent* event) const { · 386 unmodified lines
39373953 void Application::mouseMoveEvent(QMouseEvent* event) {
39383954 PROFILE_RANGE(app_input_mouse, __FUNCTION__);
39393955
3940− if (_aboutToQuit) {
3941− return;
3942− }
3943−
39443956 maybeToggleMenuVisible(event);
39453957
39463958 auto& compositor = getApplicationCompositor();
@@ -4005,11 +4017,9 @@ void Application::mousePressEvent(QMouseEvent* event) { · 58 unmodified lines
40054017 event->screenPos(), event->button(),
40064018 event->buttons(), event->modifiers());
40074019
4008− if (!_aboutToQuit) {
4009− getOverlays().mousePressEvent(&mappedEvent);
4010− if (!_controllerScriptingInterface->areEntityClicksCaptured()) {
4011− getEntities()->mousePressEvent(&mappedEvent);
4012− }
4020+ getOverlays().mousePressEvent(&mappedEvent);
4021+ if (!_controllerScriptingInterface->areEntityClicksCaptured()) {
4022+ getEntities()->mousePressEvent(&mappedEvent);
40134023 }
40144024
40154025 _controllerScriptingInterface->emitMousePressEvent(&mappedEvent); // send events to any registered scripts
@@ -4035,14 +4045,11 @@ void Application::mouseDoublePressEvent(QMouseEvent* event) { · 19 unmodified lines
40354045 event->screenPos(), event->button(),
40364046 event->buttons(), event->modifiers());
40374047
4038− if (!_aboutToQuit) {
4039− getOverlays().mouseDoublePressEvent(&mappedEvent);
4040− if (!_controllerScriptingInterface->areEntityClicksCaptured()) {
4041− getEntities()->mouseDoublePressEvent(&mappedEvent);
4042− }
4048+ getOverlays().mouseDoublePressEvent(&mappedEvent);
4049+ if (!_controllerScriptingInterface->areEntityClicksCaptured()) {
4050+ getEntities()->mouseDoublePressEvent(&mappedEvent);
40434051 }
40444052
4045−
40464053 // if one of our scripts have asked to capture this event, then stop processing it
40474054 if (_controllerScriptingInterface->isMouseCaptured()) {
40484055 return;
@@ -4061,10 +4068,8 @@ void Application::mouseReleaseEvent(QMouseEvent* event) { · 12 unmodified lines
40614068 event->screenPos(), event->button(),
40624069 event->buttons(), event->modifiers());
40634070
4064− if (!_aboutToQuit) {
4065− getOverlays().mouseReleaseEvent(&mappedEvent);
4066− getEntities()->mouseReleaseEvent(&mappedEvent);
4067− }
4071+ getOverlays().mouseReleaseEvent(&mappedEvent);
4072+ getEntities()->mouseReleaseEvent(&mappedEvent);
40684073
40694074 _controllerScriptingInterface->emitMouseReleaseEvent(&mappedEvent); // send events to any registered scripts
40704075
@@ -4215,7 +4220,6 @@ bool Application::shouldPaint() const { · 144 unmodified lines
42154220 return false;
42164221 }
42174222
4218−
42194223 auto displayPlugin = getActiveDisplayPlugin();
42204224
42214225 #ifdef DEBUG_PAINT_DELAY
@@ -5439,6 +5443,10 @@ static bool domainLoadingInProgress = false; · 1217 unmodified lines
54395443 void Application::update(float deltaTime) {
54405444 PROFILE_RANGE_EX(app, __FUNCTION__, 0xffff0000, (uint64_t)_renderFrameCount + 1);
54415445
5446+ if (_aboutToQuit) {
5447+ return;
5448+ }
5449+
54425450 if (!_physicsEnabled) {
54435451 if (!domainLoadingInProgress) {
54445452 PROFILE_ASYNC_BEGIN(app, "Scene Loading", "");
@@ -5705,15 +5713,13 @@ void Application::update(float deltaTime) { · 260 unmodified lines
57055713 _entitySimulation->handleDeactivatedMotionStates(deactivations);
57065714 });
57075715
5708− if (!_aboutToQuit) {
5709− // handleCollisionEvents() AFTER handleChangedMotionStates()
5710− {
5711− PROFILE_RANGE(simulation_physics, "CollisionEvents");
5712− avatarManager->handleCollisionEvents(collisionEvents);
5713− // Collision events (and their scripts) must not be handled when we're locked, above. (That would risk
5714− // deadlock.)
5715− _entitySimulation->handleCollisionEvents(collisionEvents);
5716− }
5716+ // handleCollisionEvents() AFTER handleChangedMotionStates()
5717+ {
5718+ PROFILE_RANGE(simulation_physics, "CollisionEvents");
5719+ avatarManager->handleCollisionEvents(collisionEvents);
5720+ // Collision events (and their scripts) must not be handled when we're locked, above. (That would risk
5721+ // deadlock.)
5722+ _entitySimulation->handleCollisionEvents(collisionEvents);
57175723 }
57185724
57195725 {
@@ -5731,11 +5737,9 @@ void Application::update(float deltaTime) { · 11 unmodified lines
57315737 }
57325738 auto t4 = std::chrono::high_resolution_clock::now();
57335739
5734− if (!_aboutToQuit) {
5735− // NOTE: the getEntities()->update() call below will wait for lock
5736− // and will provide non-physical entity motion
5737− getEntities()->update(true); // update the models...
5738− }
5740+ // NOTE: the getEntities()->update() call below will wait for lock
5741+ // and will provide non-physical entity motion
5742+ getEntities()->update(true); // update the models...
57395743
57405744 auto t5 = std::chrono::high_resolution_clock::now();
57415745
@@ -6639,16 +6643,12 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe · 897 unmodified lines
66396643 DependencyManager::get<PickScriptingInterface>()->registerMetaTypes(scriptEngine.data());
66406644
66416645 // connect this script engines printedMessage signal to the global ScriptEngines these various messages
6642− connect(scriptEngine.data(), &ScriptEngine::printedMessage,
6643− DependencyManager::get<ScriptEngines>().data(), &ScriptEngines::onPrintedMessage);
6644− connect(scriptEngine.data(), &ScriptEngine::errorMessage,
6645− DependencyManager::get<ScriptEngines>().data(), &ScriptEngines::onErrorMessage);
6646− connect(scriptEngine.data(), &ScriptEngine::warningMessage,
6647− DependencyManager::get<ScriptEngines>().data(), &ScriptEngines::onWarningMessage);
6648− connect(scriptEngine.data(), &ScriptEngine::infoMessage,
6649− DependencyManager::get<ScriptEngines>().data(), &ScriptEngines::onInfoMessage);
6650− connect(scriptEngine.data(), &ScriptEngine::clearDebugWindow,
6651− DependencyManager::get<ScriptEngines>().data(), &ScriptEngines::onClearDebugWindow);
6646+ auto scriptEngines = DependencyManager::get<ScriptEngines>().data();
6647+ connect(scriptEngine.data(), &ScriptEngine::printedMessage, scriptEngines, &ScriptEngines::onPrintedMessage);
6648+ connect(scriptEngine.data(), &ScriptEngine::errorMessage, scriptEngines, &ScriptEngines::onErrorMessage);
6649+ connect(scriptEngine.data(), &ScriptEngine::warningMessage, scriptEngines, &ScriptEngines::onWarningMessage);
6650+ connect(scriptEngine.data(), &ScriptEngine::infoMessage, scriptEngines, &ScriptEngines::onInfoMessage);
6651+ connect(scriptEngine.data(), &ScriptEngine::clearDebugWindow, scriptEngines, &ScriptEngines::onClearDebugWindow);
66526652
66536653 }
66546654
@@ -6956,10 +6956,9 @@ void Application::showDialog(const QUrl& widgetUrl, const QUrl& tabletUrl, const · 301 unmodified lines
69566956 }
69576957
69586958 void Application::showScriptLogs() {
6959− auto scriptEngines = DependencyManager::get<ScriptEngines>();
69606959 QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();
69616960 defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/debugging/debugWindow.js");
6962− scriptEngines->loadScript(defaultScriptsLoc.toString());
6961+ DependencyManager::get<ScriptEngines>()->loadScript(defaultScriptsLoc.toString());
69636962 }
69646963
69656964 void Application::showAssetServerWidget(QString filePath) {
@@ -7523,7 +7522,6 @@ void Application::openUrl(const QUrl& url) const { · 557 unmodified lines
75237522 }
75247523
75257524 void Application::loadDialog() {
7526− auto scriptEngines = DependencyManager::get<ScriptEngines>();
75277525 ModalDialogListener* dlg = OffscreenUi::getOpenFileNameAsync(_glWidget, tr("Open Script"),
75287526 getPreviousScriptLocation(),
75297527 tr("JavaScript Files (*.js)"));