| @@ -213,22 +213,21 @@ private: | |||
| updateLoginButtonStates (true); | |||
| WeakReference<Component> weakThis (this); | |||
| auto completionCallback = [this, weakThis] (const String& errorMessage) | |||
| auto completionCallback = [weakThis = SafePointer<LoginFormComponent> { this }] (const String& errorMessage) | |||
| { | |||
| if (weakThis == nullptr) | |||
| return; | |||
| updateLoginButtonStates (false); | |||
| weakThis->updateLoginButtonStates (false); | |||
| if (errorMessage.isNotEmpty()) | |||
| { | |||
| showErrorMessage (errorMessage); | |||
| weakThis->showErrorMessage (errorMessage); | |||
| } | |||
| else | |||
| { | |||
| hideErrorMessage(); | |||
| mainWindow.hideLoginFormOverlay(); | |||
| weakThis->hideErrorMessage(); | |||
| weakThis->mainWindow.hideLoginFormOverlay(); | |||
| ProjucerApplication::getApp().getCommandManager().commandStatusChanged(); | |||
| } | |||
| }; | |||
| @@ -1113,8 +1113,7 @@ void ProjucerApplication::createNewProjectFromClipboard() | |||
| return; | |||
| } | |||
| WeakReference<ProjucerApplication> parent { this }; | |||
| openFile (tempFile, [parent, cleanup] (bool openedSuccessfully) | |||
| openFile (tempFile, [parent = WeakReference<ProjucerApplication> { this }, cleanup] (bool openedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -1172,8 +1171,7 @@ void ProjucerApplication::closeAllMainWindows (std::function<void (bool)> callba | |||
| void ProjucerApplication::closeAllMainWindowsAndQuitIfNeeded() | |||
| { | |||
| WeakReference<ProjucerApplication> parent; | |||
| closeAllMainWindows ([parent] (bool closedSuccessfully) | |||
| closeAllMainWindows ([parent = WeakReference<ProjucerApplication> { this }] (bool closedSuccessfully) | |||
| { | |||
| #if JUCE_MAC | |||
| ignoreUnused (parent, closedSuccessfully); | |||
| @@ -346,9 +346,7 @@ void LatestVersionCheckerAndUpdater::addNotificationToOpenProjects (const Versio | |||
| { | |||
| if (auto* project = window->getProject()) | |||
| { | |||
| Component::SafePointer<MainWindow> safeWindow (window); | |||
| auto ignore = [safeWindow] | |||
| auto ignore = [safeWindow = Component::SafePointer<MainWindow> { window }] | |||
| { | |||
| if (safeWindow != nullptr) | |||
| safeWindow->getProject()->removeProjectMessage (ProjectMessages::Ids::newVersionAvailable); | |||
| @@ -247,9 +247,10 @@ void MainWindow::closeCurrentProject (OpenDocumentManager::SaveIfNeeded askUserT | |||
| pcc->hideEditor(); | |||
| } | |||
| SafePointer<MainWindow> parent { this }; | |||
| ProjucerApplication::getApp().openDocumentManager | |||
| .closeAllDocumentsUsingProjectAsync (*currentProject, askUserToSave, [parent, askUserToSave, callback] (bool closedSuccessfully) | |||
| .closeAllDocumentsUsingProjectAsync (*currentProject, | |||
| askUserToSave, | |||
| [parent = SafePointer<MainWindow> { this }, askUserToSave, callback] (bool closedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -291,8 +292,8 @@ void MainWindow::closeCurrentProject (OpenDocumentManager::SaveIfNeeded askUserT | |||
| void MainWindow::moveProject (File newProjectFileToOpen, OpenInIDE openInIDE) | |||
| { | |||
| SafePointer<MainWindow> parent { this }; | |||
| closeCurrentProject (OpenDocumentManager::SaveIfNeeded::no, [parent, newProjectFileToOpen, openInIDE] (bool) | |||
| closeCurrentProject (OpenDocumentManager::SaveIfNeeded::no, | |||
| [parent = SafePointer<MainWindow> { this }, newProjectFileToOpen, openInIDE] (bool) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -360,9 +361,10 @@ void MainWindow::openFile (const File& file, std::function<void (bool)> callback | |||
| if (result.wasOk()) | |||
| { | |||
| SafePointer<MainWindow> parent { this }; | |||
| auto sharedDoc = std::make_shared<std::unique_ptr<Project>> (std::move (newDoc)); | |||
| closeCurrentProject (OpenDocumentManager::SaveIfNeeded::yes, [parent, sharedDoc, callback] (bool saveResult) | |||
| closeCurrentProject (OpenDocumentManager::SaveIfNeeded::yes, | |||
| [parent = SafePointer<MainWindow> { this }, | |||
| sharedDoc = std::make_shared<std::unique_ptr<Project>> (std::move (newDoc)), | |||
| callback] (bool saveResult) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -472,8 +474,7 @@ void MainWindow::openPIP (const File& pipFile, std::function<void (bool)> callba | |||
| return; | |||
| } | |||
| SafePointer<MainWindow> parent { this }; | |||
| openFile (generator->getJucerFile(), [parent, generator, callback] (bool openedSuccessfully) | |||
| openFile (generator->getJucerFile(), [parent = SafePointer<MainWindow> { this }, generator, callback] (bool openedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -768,18 +769,18 @@ void MainWindowList::closeWindow (MainWindow* w) | |||
| else | |||
| #endif | |||
| { | |||
| WeakReference<MainWindowList> parent { this }; | |||
| w->closeCurrentProject (OpenDocumentManager::SaveIfNeeded::yes, [parent, w] (bool closedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| if (closedSuccessfully) | |||
| { | |||
| parent->windows.removeObject (w); | |||
| parent->saveCurrentlyOpenProjectList(); | |||
| } | |||
| }); | |||
| w->closeCurrentProject (OpenDocumentManager::SaveIfNeeded::yes, | |||
| [parent = WeakReference<MainWindowList> { this }, w] (bool closedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| if (closedSuccessfully) | |||
| { | |||
| parent->windows.removeObject (w); | |||
| parent->saveCurrentlyOpenProjectList(); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| @@ -176,7 +176,6 @@ void OpenDocumentManager::saveIfNeededAndUserAgrees (OpenDocumentManager::Docume | |||
| return; | |||
| } | |||
| WeakReference<OpenDocumentManager> parent { this }; | |||
| AlertWindow::showYesNoCancelBox (AlertWindow::QuestionIcon, | |||
| TRANS("Closing document..."), | |||
| TRANS("Do you want to save the changes to \"") | |||
| @@ -185,7 +184,7 @@ void OpenDocumentManager::saveIfNeededAndUserAgrees (OpenDocumentManager::Docume | |||
| TRANS("Discard changes"), | |||
| TRANS("Cancel"), | |||
| nullptr, | |||
| ModalCallbackFunction::create ([parent, doc, callback] (int r) | |||
| ModalCallbackFunction::create ([parent = WeakReference<OpenDocumentManager> { this }, doc, callback] (int r) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -241,8 +240,8 @@ void OpenDocumentManager::closeDocumentAsync (Document* doc, SaveIfNeeded saveIf | |||
| if (saveIfNeeded == SaveIfNeeded::yes) | |||
| { | |||
| WeakReference<OpenDocumentManager> parent { this }; | |||
| saveIfNeededAndUserAgrees (doc, [parent, doc, callback] (FileBasedDocument::SaveResult result) | |||
| saveIfNeededAndUserAgrees (doc, | |||
| [parent = WeakReference<OpenDocumentManager> { this }, doc, callback] (FileBasedDocument::SaveResult result) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -667,8 +667,8 @@ void CppCodeEditorComponent::insertComponentClass() | |||
| asyncAlertWindow->addButton (TRANS ("Insert Code"), 1, KeyPress (KeyPress::returnKey)); | |||
| asyncAlertWindow->addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey)); | |||
| SafePointer<CppCodeEditorComponent> parent { this }; | |||
| asyncAlertWindow->enterModalState (true, ModalCallbackFunction::create ([parent, classNameField] (int result) | |||
| asyncAlertWindow->enterModalState (true, | |||
| ModalCallbackFunction::create ([parent = SafePointer<CppCodeEditorComponent> { this }, classNameField] (int result) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -262,10 +262,9 @@ public: | |||
| m.addSubMenu ("Relative to", compLayout->getRelativeTargetMenu (component, (int) dimension)); | |||
| } | |||
| SafePointer<PositionPropertyBase> ref (this); | |||
| m.showMenuAsync (PopupMenu::Options().withTargetComponent (&button), | |||
| [ref, compLayout, callback, xAnchor, yAnchor, xMode, yMode, sizeW, sizeH, p, rpr] (int menuResult) mutable | |||
| [compLayout, callback, xAnchor, yAnchor, xMode, yMode, sizeW, sizeH, p, rpr, | |||
| ref = SafePointer<PositionPropertyBase> { this }] (int menuResult) mutable | |||
| { | |||
| if (menuResult == 0 || ref == nullptr) | |||
| { | |||
| @@ -694,8 +694,7 @@ public: | |||
| void saveAsync (std::function<void (bool)> callback) override | |||
| { | |||
| WeakReference<JucerComponentDocument> parent { this }; | |||
| SourceCodeDocument::saveAsync ([parent, callback] (bool saveResult) | |||
| SourceCodeDocument::saveAsync ([parent = WeakReference<JucerComponentDocument> { this }, callback] (bool saveResult) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -720,8 +719,7 @@ public: | |||
| if (auto* header = odm.openFile (nullptr, getFile().withFileExtension (".h"))) | |||
| { | |||
| WeakReference<JucerComponentDocument> parent { this }; | |||
| header->saveAsync ([parent, callback] (bool saveResult) | |||
| header->saveAsync ([parent = WeakReference<JucerComponentDocument> { this }, callback] (bool saveResult) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -78,25 +78,25 @@ public: | |||
| void deleteItem() override | |||
| { | |||
| WeakReference<ExporterItem> safeThis { this }; | |||
| auto resultCallback = [safeThis = WeakReference<ExporterItem> { this }] (int result) | |||
| { | |||
| if (safeThis == nullptr || result == 0) | |||
| return; | |||
| safeThis->closeSettingsPage(); | |||
| auto parent = safeThis->exporter->settings.getParent(); | |||
| parent.removeChild (safeThis->exporter->settings, | |||
| safeThis->project.getUndoManagerFor (parent)); | |||
| }; | |||
| AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||
| "Delete Exporter", | |||
| "Are you sure you want to delete this export target?", | |||
| "", | |||
| "", | |||
| nullptr, | |||
| ModalCallbackFunction::create ([safeThis] (int result) | |||
| { | |||
| if (safeThis == nullptr) | |||
| return; | |||
| if (result == 0) | |||
| return; | |||
| safeThis->closeSettingsPage(); | |||
| auto parent = safeThis->exporter->settings.getParent(); | |||
| parent.removeChild (safeThis->exporter->settings, safeThis->project.getUndoManagerFor (parent)); | |||
| })); | |||
| ModalCallbackFunction::create (std::move (resultCallback))); | |||
| } | |||
| void addSubItems() override | |||
| @@ -244,14 +244,13 @@ public: | |||
| void deleteItem() override | |||
| { | |||
| WeakReference<ConfigItem> parent { this }; | |||
| AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||
| "Delete Configuration", | |||
| "Are you sure you want to delete this configuration?", | |||
| "", | |||
| "", | |||
| nullptr, | |||
| ModalCallbackFunction::create ([parent] (int result) | |||
| ModalCallbackFunction::create ([parent = WeakReference<ConfigItem> { this }] (int result) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -538,14 +538,14 @@ public: | |||
| if (correspondingItem.isValid()) | |||
| { | |||
| WeakReference<SourceFileItem> parent { this }; | |||
| AlertWindow::showOkCancelBox (AlertWindow::NoIcon, | |||
| "File Rename", | |||
| "Do you also want to rename the corresponding file \"" + correspondingFile.getFileName() + "\" to match?", | |||
| {}, | |||
| {}, | |||
| nullptr, | |||
| ModalCallbackFunction::create ([parent, oldFile, newFile, correspondingFile, correspondingItem] (int result) mutable | |||
| ModalCallbackFunction::create ([parent = WeakReference<SourceFileItem> { this }, | |||
| oldFile, newFile, correspondingFile, correspondingItem] (int result) mutable | |||
| { | |||
| if (parent == nullptr || result == 0) | |||
| return; | |||
| @@ -330,8 +330,7 @@ void ProjectContentComponent::saveDocumentAsync() | |||
| { | |||
| if (currentDocument != nullptr) | |||
| { | |||
| SafePointer<ProjectContentComponent> parent { this }; | |||
| currentDocument->saveAsync ([parent] (bool savedSuccessfully) | |||
| currentDocument->saveAsync ([parent = SafePointer<ProjectContentComponent> { this }] (bool savedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -352,8 +351,7 @@ void ProjectContentComponent::saveAsAsync() | |||
| { | |||
| if (currentDocument != nullptr) | |||
| { | |||
| SafePointer<ProjectContentComponent> parent { this }; | |||
| currentDocument->saveAsAsync ([parent] (bool savedSuccessfully) | |||
| currentDocument->saveAsAsync ([parent = SafePointer<ProjectContentComponent> { this }] (bool savedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -725,10 +725,9 @@ void Project::saveProject (Async async, | |||
| registerRecentFile (getFile()); | |||
| } | |||
| WeakReference<Project> ref (this); | |||
| saver = std::make_unique<ProjectSaver> (*this); | |||
| saver->save (async, exporterToSave, [ref, onCompletion] (Result result) | |||
| saver->save (async, exporterToSave, [ref = WeakReference<Project> { this }, onCompletion] (Result result) | |||
| { | |||
| if (ref == nullptr) | |||
| return; | |||
| @@ -1040,9 +1039,8 @@ void Project::saveAndMoveTemporaryProject (bool openInIDE) | |||
| // reload project from new location | |||
| if (auto* window = ProjucerApplication::getApp().mainWindowList.getMainWindowForFile (getFile())) | |||
| { | |||
| Component::SafePointer<MainWindow> safeWindow (window); | |||
| MessageManager::callAsync ([safeWindow, newDirectory, oldJucerFileName, openInIDE]() mutable | |||
| MessageManager::callAsync ([newDirectory, oldJucerFileName, openInIDE, | |||
| safeWindow = Component::SafePointer<MainWindow> { window }]() mutable | |||
| { | |||
| if (safeWindow != nullptr) | |||
| safeWindow->moveProject (newDirectory.getChildFile (oldJucerFileName), | |||
| @@ -54,8 +54,8 @@ void ProjectSaver::saveProjectAsync (ProjectExporter* exporterToSave, std::funct | |||
| { | |||
| jassert (saveThread == nullptr); | |||
| WeakReference<ProjectSaver> ref (this); | |||
| saveThread = std::make_unique<SaveThreadWithProgressWindow> (*this, exporterToSave, [ref, onCompletion] (Result result) | |||
| saveThread = std::make_unique<SaveThreadWithProgressWindow> (*this, exporterToSave, | |||
| [ref = WeakReference<ProjectSaver> { this }, onCompletion] (Result result) | |||
| { | |||
| if (ref == nullptr) | |||
| return; | |||
| @@ -177,8 +177,7 @@ private: | |||
| asyncAlertWindow->addButton (TRANS ("Create Files"), 1, KeyPress (KeyPress::returnKey)); | |||
| asyncAlertWindow->addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey)); | |||
| WeakReference<NewComponentFileWizard> safeThis { this }; | |||
| asyncAlertWindow->enterModalState (true, ModalCallbackFunction::create ([safeThis, parent] (int result) | |||
| auto resultCallback = [safeThis = WeakReference<NewComponentFileWizard> { this }, parent] (int result) | |||
| { | |||
| if (safeThis == nullptr) | |||
| return; | |||
| @@ -195,21 +194,24 @@ private: | |||
| if (className == build_tools::makeValidIdentifier (className, false, true, false)) | |||
| { | |||
| safeThis->askUserToChooseNewFile (className + ".h", "*.h;*.cpp", parent, [safeThis, parent, className] (File newFile) | |||
| { | |||
| if (safeThis == nullptr) | |||
| return; | |||
| safeThis->askUserToChooseNewFile (className + ".h", "*.h;*.cpp", | |||
| parent, | |||
| [safeThis, parent, className] (File newFile) | |||
| { | |||
| if (safeThis == nullptr) | |||
| return; | |||
| if (newFile != File()) | |||
| safeThis->createFiles (parent, className, newFile); | |||
| }); | |||
| if (newFile != File()) | |||
| safeThis->createFiles (parent, className, newFile); | |||
| }); | |||
| return; | |||
| } | |||
| safeThis->createNewFileInternal (parent); | |||
| }; | |||
| }), false); | |||
| asyncAlertWindow->enterModalState (true, ModalCallbackFunction::create (std::move (resultCallback)), false); | |||
| } | |||
| std::unique_ptr<AlertWindow> asyncAlertWindow; | |||
| @@ -2938,12 +2938,10 @@ public: | |||
| setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor()); | |||
| #if JUCE_LINUX || JUCE_BSD | |||
| SafePointer<VSTPluginWindow> safeThis (this); | |||
| MessageManager::callAsync ([this, safeThis] | |||
| MessageManager::callAsync ([safeThis = SafePointer<VSTPluginWindow> { this }] | |||
| { | |||
| if (safeThis != nullptr) | |||
| componentMovedOrResized (true, true); | |||
| safeThis->componentMovedOrResized (true, true); | |||
| }); | |||
| #else | |||
| componentMovedOrResized (true, true); | |||
| @@ -130,12 +130,10 @@ public: | |||
| static BluetoothMidiPairingWindowClass cls; | |||
| window.reset (cls.createInstance()); | |||
| WeakReference<BluetoothMidiSelectorWindowHelper> safeThis (this); | |||
| auto deletionCB = [=] | |||
| auto deletionCB = [safeThis = WeakReference<BluetoothMidiSelectorWindowHelper> { this }] | |||
| { | |||
| if (auto* t = safeThis.get()) | |||
| delete t; | |||
| if (safeThis != nullptr) | |||
| delete safeThis.get(); | |||
| }; | |||
| callbacks.reset (new BluetoothMidiPairingWindowClass::Callbacks { std::move (exitCB), | |||
| @@ -1753,12 +1753,10 @@ void Component::exitModalState (int returnValue) | |||
| } | |||
| else | |||
| { | |||
| WeakReference<Component> target (this); | |||
| MessageManager::callAsync ([=] | |||
| MessageManager::callAsync ([target = WeakReference<Component> { this }, returnValue] | |||
| { | |||
| if (auto* c = target.get()) | |||
| c->exitModalState (returnValue); | |||
| if (target != nullptr) | |||
| target->exitModalState (returnValue); | |||
| }); | |||
| } | |||
| } | |||
| @@ -2306,12 +2304,10 @@ void Component::internalModalInputAttempt() | |||
| //============================================================================== | |||
| void Component::postCommandMessage (int commandID) | |||
| { | |||
| WeakReference<Component> target (this); | |||
| MessageManager::callAsync ([=] | |||
| MessageManager::callAsync ([target = WeakReference<Component> { this }, commandID] | |||
| { | |||
| if (auto* c = target.get()) | |||
| c->handleCommandMessage (commandID); | |||
| if (target != nullptr) | |||
| target->handleCommandMessage (commandID); | |||
| }); | |||
| } | |||
| @@ -207,7 +207,7 @@ void ModalComponentManager::handleAsyncUpdate() | |||
| Component::SafePointer<Component> compToDelete (item->autoDelete ? item->component : nullptr); | |||
| for (int j = item->callbacks.size(); --j >= 0;) | |||
| item->callbacks.getUnchecked(j)->modalStateFinished (item->returnValue); | |||
| item->callbacks.getUnchecked (j)->modalStateFinished (item->returnValue); | |||
| compToDelete.deleteAndZero(); | |||
| } | |||
| @@ -198,7 +198,10 @@ public: | |||
| static ModalComponentManager::Callback* create (void (*functionToCall) (int, ParamType), | |||
| ParamType parameterValue) | |||
| { | |||
| return create ([=] (int r) { functionToCall (r, parameterValue); }); | |||
| return create ([functionToCall, parameterValue] (int r) | |||
| { | |||
| functionToCall (r, parameterValue); | |||
| }); | |||
| } | |||
| //============================================================================== | |||
| @@ -228,7 +231,10 @@ public: | |||
| ParamType1 parameterValue1, | |||
| ParamType2 parameterValue2) | |||
| { | |||
| return create ([=] (int r) { functionToCall (r, parameterValue1, parameterValue2); }); | |||
| return create ([functionToCall, parameterValue1, parameterValue2] (int r) | |||
| { | |||
| functionToCall (r, parameterValue1, parameterValue2); | |||
| }); | |||
| } | |||
| //============================================================================== | |||
| @@ -258,8 +264,10 @@ public: | |||
| static ModalComponentManager::Callback* forComponent (void (*functionToCall) (int, ComponentType*), | |||
| ComponentType* component) | |||
| { | |||
| WeakReference<Component> comp (component); | |||
| return create ([=] (int r) { functionToCall (r, static_cast<ComponentType*> (comp.get())); }); | |||
| return create ([functionToCall, comp = WeakReference<Component> { component }] (int r) | |||
| { | |||
| functionToCall (r, static_cast<ComponentType*> (comp.get())); | |||
| }); | |||
| } | |||
| //============================================================================== | |||
| @@ -290,8 +298,10 @@ public: | |||
| ComponentType* component, | |||
| ParamType param) | |||
| { | |||
| WeakReference<Component> comp (component); | |||
| return create ([=] (int r) { functionToCall (r, static_cast<ComponentType*> (comp.get()), param); }); | |||
| return create ([functionToCall, param, comp = WeakReference<Component> { component }] (int r) | |||
| { | |||
| functionToCall (r, static_cast<ComponentType*> (comp.get()), param); | |||
| }); | |||
| } | |||
| private: | |||
| @@ -192,8 +192,10 @@ void Desktop::handleAsyncUpdate() | |||
| { | |||
| // The component may be deleted during this operation, but we'll use a SafePointer rather than a | |||
| // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer). | |||
| WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent()); | |||
| focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus.get()); }); | |||
| focusListeners.call ([currentFocus = WeakReference<Component> { Component::getCurrentlyFocusedComponent() }] (FocusChangeListener& l) | |||
| { | |||
| l.globalFocusChanged (currentFocus.get()); | |||
| }); | |||
| } | |||
| //============================================================================== | |||
| @@ -392,8 +392,8 @@ void MultiDocumentPanel::closeDocumentAsync (Component* component, | |||
| { | |||
| if (checkItsOkToCloseFirst) | |||
| { | |||
| SafePointer<MultiDocumentPanel> parent { this }; | |||
| tryToCloseDocumentAsync (component, [parent, component, callback] (bool closedSuccessfully) | |||
| tryToCloseDocumentAsync (component, | |||
| [parent = SafePointer<MultiDocumentPanel> { this }, component, callback] (bool closedSuccessfully) | |||
| { | |||
| if (parent == nullptr) | |||
| return; | |||
| @@ -490,10 +490,10 @@ public: | |||
| auto chooserIntent = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidIntent, AndroidIntent.createChooser, | |||
| intent.get(), javaString ("Choose share target").get())); | |||
| WeakReference<ContentSharerNativeImpl> weakRef (this); | |||
| startAndroidActivityForResult (chooserIntent, 1003, | |||
| [weakRef] (int /*requestCode*/, int resultCode, LocalRef<jobject> /*intentData*/) mutable | |||
| [weakRef = WeakReference<ContentSharerNativeImpl> { this }] (int /*requestCode*/, | |||
| int resultCode, | |||
| LocalRef<jobject> /*intentData*/) mutable | |||
| { | |||
| if (weakRef != nullptr) | |||
| weakRef->sharingFinished (resultCode); | |||
| @@ -680,10 +680,11 @@ private: | |||
| AndroidIntent.createChooser, | |||
| intent.get(), | |||
| javaString ("Choose share target").get())); | |||
| WeakReference<ContentSharerNativeImpl> weakRef (this); | |||
| startAndroidActivityForResult (chooserIntent, 1003, | |||
| [weakRef] (int /*requestCode*/, int resultCode, LocalRef<jobject> /*intentData*/) mutable | |||
| [weakRef = WeakReference<ContentSharerNativeImpl> { this }] (int /*requestCode*/, | |||
| int resultCode, | |||
| LocalRef<jobject> /*intentData*/) mutable | |||
| { | |||
| if (weakRef != nullptr) | |||
| weakRef->sharingFinished (resultCode); | |||
| @@ -151,10 +151,8 @@ public: | |||
| if (currentFileChooser != nullptr) | |||
| { | |||
| WeakReference<Native> myself (this); | |||
| startAndroidActivityForResult (LocalRef<jobject> (env->NewLocalRef (intent.get())), /*READ_REQUEST_CODE*/ 42, | |||
| [myself] (int requestCode, int resultCode, LocalRef<jobject> intentData) mutable | |||
| [myself = WeakReference<Native> { this }] (int requestCode, int resultCode, LocalRef<jobject> intentData) mutable | |||
| { | |||
| if (myself != nullptr) | |||
| myself->onActivityResult (requestCode, resultCode, intentData); | |||
| @@ -680,12 +680,11 @@ private: | |||
| } | |||
| else | |||
| { | |||
| Component::SafePointer<FilePreviewComponent> safeComp (comp); | |||
| File selectedFile (path); | |||
| MessageManager::callAsync ([safeComp, selectedFile]() mutable | |||
| MessageManager::callAsync ([safeComp = Component::SafePointer<FilePreviewComponent> { comp }, | |||
| selectedFile = File { path }]() mutable | |||
| { | |||
| safeComp->selectedFileChanged (selectedFile); | |||
| if (safeComp != nullptr) | |||
| safeComp->selectedFileChanged (selectedFile); | |||
| }); | |||
| } | |||
| } | |||
| @@ -482,14 +482,11 @@ void ComboBox::showPopupIfNotActive() | |||
| { | |||
| menuActive = true; | |||
| SafePointer<ComboBox> safePointer (this); | |||
| // as this method was triggered by a mouse event, the same mouse event may have | |||
| // exited the modal state of other popups currently on the screen. By calling | |||
| // showPopup asynchronously, we are giving the other popups a chance to properly | |||
| // close themselves | |||
| MessageManager::callAsync ([safePointer]() mutable { if (safePointer != nullptr) safePointer->showPopup(); }); | |||
| MessageManager::callAsync ([safePointer = SafePointer<ComboBox> { this }]() mutable { if (safePointer != nullptr) safePointer->showPopup(); }); | |||
| repaint(); | |||
| } | |||
| } | |||
| @@ -1875,10 +1875,8 @@ void TextEditor::mouseDown (const MouseEvent& e) | |||
| menuActive = true; | |||
| SafePointer<TextEditor> safeThis (this); | |||
| m.showMenuAsync (PopupMenu::Options(), | |||
| [safeThis] (int menuResult) | |||
| [safeThis = SafePointer<TextEditor> { this }] (int menuResult) | |||
| { | |||
| if (auto* editor = safeThis.getComponent()) | |||
| { | |||
| @@ -631,15 +631,14 @@ private: | |||
| auto options = Microsoft::WRL::Make<CoreWebView2EnvironmentOptions>(); | |||
| WeakReference<WebView2> weakThis (this); | |||
| auto hr = createWebViewEnvironmentWithOptions (nullptr, | |||
| userDataFolder != File() ? userDataFolder.getFullPathName().toWideCharPointer() : nullptr, | |||
| options.Get(), | |||
| Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>( | |||
| [this, weakThis] (HRESULT, ICoreWebView2Environment* env) -> HRESULT | |||
| [weakThis = WeakReference<WebView2> { this }] (HRESULT, ICoreWebView2Environment* env) -> HRESULT | |||
| { | |||
| if (weakThis != nullptr) | |||
| webViewEnvironment = env; | |||
| weakThis->webViewEnvironment = env; | |||
| return S_OK; | |||
| }).Get()); | |||
| @@ -657,22 +656,22 @@ private: | |||
| webViewEnvironment->CreateCoreWebView2Controller ((HWND) peer->getNativeHandle(), | |||
| Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler> ( | |||
| [this, weakThis] (HRESULT, ICoreWebView2Controller* controller) -> HRESULT | |||
| [weakThis = WeakReference<WebView2> { this }] (HRESULT, ICoreWebView2Controller* controller) -> HRESULT | |||
| { | |||
| if (weakThis != nullptr) | |||
| { | |||
| isCreating = false; | |||
| weakThis->isCreating = false; | |||
| if (controller != nullptr) | |||
| { | |||
| webViewController = controller; | |||
| controller->get_CoreWebView2 (webView.resetAndGetPointerAddress()); | |||
| weakThis->webViewController = controller; | |||
| controller->get_CoreWebView2 (weakThis->webView.resetAndGetPointerAddress()); | |||
| addEventHandlers(); | |||
| componentMovedOrResized (true, true); | |||
| weakThis->addEventHandlers(); | |||
| weakThis->componentMovedOrResized (true, true); | |||
| if (webView != nullptr && urlRequest.url.isNotEmpty()) | |||
| webView->Navigate (urlRequest.url.toWideCharPointer()); | |||
| if (weakThis->webView != nullptr && weakThis->urlRequest.url.isNotEmpty()) | |||
| weakThis->webView->Navigate (weakThis->urlRequest.url.toWideCharPointer()); | |||
| } | |||
| } | |||
| @@ -530,8 +530,8 @@ struct CameraDevice::Pimpl | |||
| if (cameraOpenCallback == nullptr || scopedCameraDevice != nullptr) | |||
| return; | |||
| WeakReference<Pimpl> safeThis (this); | |||
| RuntimePermissions::request (RuntimePermissions::camera, [safeThis] (bool granted) mutable | |||
| RuntimePermissions::request (RuntimePermissions::camera, | |||
| [safeThis = WeakReference<Pimpl> { this }] (bool granted) mutable | |||
| { | |||
| if (safeThis != nullptr) | |||
| safeThis->continueOpenRequest (granted); | |||
| @@ -1189,13 +1189,15 @@ private: | |||
| env->CallVoidMethod (jImage, AndroidImage.close); | |||
| WeakReference<ImageReader> safeThis (this); | |||
| owner.callListeners (image); | |||
| // Android may take multiple pictures before it handles a request to stop. | |||
| if (hasNotifiedListeners.compareAndSetBool (1, 0)) | |||
| MessageManager::callAsync ([safeThis, image]() mutable { if (safeThis != nullptr) safeThis->owner.notifyPictureTaken (image); }); | |||
| MessageManager::callAsync ([safeThis = WeakReference<ImageReader> { this }, image]() mutable | |||
| { | |||
| if (safeThis != nullptr) | |||
| safeThis->owner.notifyPictureTaken (image); | |||
| }); | |||
| } | |||
| struct ImageBuffer | |||
| @@ -2183,14 +2185,10 @@ private: | |||
| JUCE_CAMERA_LOG ("cameraCaptureSessionConfigureFailed()"); | |||
| ignoreUnused (session); | |||
| WeakReference<CaptureSession> weakRef (this); | |||
| MessageManager::callAsync ([this, weakRef]() | |||
| MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }] | |||
| { | |||
| if (weakRef == nullptr) | |||
| return; | |||
| configuredCallback.captureSessionConfigured (nullptr); | |||
| if (weakRef != nullptr) | |||
| weakRef->configuredCallback.captureSessionConfigured (nullptr); | |||
| }); | |||
| } | |||
| @@ -2218,17 +2216,18 @@ private: | |||
| captureSession = GlobalRef (session); | |||
| } | |||
| WeakReference<CaptureSession> weakRef (this); | |||
| MessageManager::callAsync ([this, weakRef]() | |||
| MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }] | |||
| { | |||
| if (weakRef == nullptr) | |||
| return; | |||
| stillPictureTaker.reset (new StillPictureTaker (captureSession, captureRequestBuilder, | |||
| previewCaptureRequest, handler, autoFocusMode)); | |||
| weakRef->stillPictureTaker.reset (new StillPictureTaker (weakRef->captureSession, | |||
| weakRef->captureRequestBuilder, | |||
| weakRef->previewCaptureRequest, | |||
| weakRef->handler, | |||
| weakRef->autoFocusMode)); | |||
| configuredCallback.captureSessionConfigured (this); | |||
| weakRef->configuredCallback.captureSessionConfigured (weakRef.get()); | |||
| }); | |||
| } | |||
| @@ -2542,18 +2541,11 @@ private: | |||
| cameraLensFacing (cameraLensFacingToUse), | |||
| streamConfigurationMap (streamConfigurationMapToUse) | |||
| { | |||
| WeakReference<CaptureSessionMode<Mode>> weakRef (this); | |||
| if (weakRef == nullptr) | |||
| return; | |||
| // async so that the object is fully constructed before the callback gets invoked | |||
| MessageManager::callAsync ([this, weakRef]() | |||
| MessageManager::callAsync ([weakRef = WeakReference<CaptureSessionMode<Mode>> { this }] | |||
| { | |||
| if (weakRef == nullptr) | |||
| return; | |||
| previewDisplay.addListener (this); | |||
| if (weakRef != nullptr) | |||
| weakRef->previewDisplay.addListener (weakRef.get()); | |||
| }); | |||
| } | |||
| @@ -1716,9 +1716,7 @@ private: | |||
| //============================================================================== | |||
| void systemVolumeChanged() | |||
| { | |||
| WeakReference<SystemVolumeListener> weakThis (this); | |||
| MessageManager::callAsync ([weakThis]() mutable | |||
| MessageManager::callAsync ([weakThis = WeakReference<SystemVolumeListener> { this }]() mutable | |||
| { | |||
| if (weakThis == nullptr) | |||
| return; | |||
| @@ -407,9 +407,7 @@ private: | |||
| if (error.isNotEmpty()) | |||
| { | |||
| WeakReference<CaptureSession> weakRef (this); | |||
| MessageManager::callAsync ([weakRef, error]() mutable | |||
| MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }, error]() mutable | |||
| { | |||
| if (weakRef != nullptr) | |||
| weakRef->owner.cameraOpenCallback ({}, error); | |||
| @@ -423,9 +421,7 @@ private: | |||
| if (error.isNotEmpty()) | |||
| { | |||
| WeakReference<CaptureSession> weakRef (this); | |||
| MessageManager::callAsync ([weakRef, error]() mutable | |||
| MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }, error]() mutable | |||
| { | |||
| if (weakRef != nullptr) | |||
| weakRef->owner.cameraOpenCallback ({}, error); | |||
| @@ -496,8 +496,7 @@ private: | |||
| { | |||
| handleImageCapture (image); | |||
| WeakReference<Pimpl> weakRef (this); | |||
| MessageManager::callAsync ([weakRef, image]() mutable | |||
| MessageManager::callAsync ([weakRef = WeakReference<Pimpl> { this }, image]() mutable | |||
| { | |||
| if (weakRef != nullptr && weakRef->pictureTakenCallback != nullptr) | |||
| weakRef->pictureTakenCallback (image); | |||
| @@ -435,9 +435,8 @@ private: | |||
| //============================================================================== | |||
| void notifyOwnerPreparationFinished (const URL& url, Result r, AVPlayer* preparedPlayer) | |||
| { | |||
| WeakReference<PlayerAsyncInitialiser> safeThis (this); | |||
| MessageManager::callAsync ([safeThis, url, r, preparedPlayer]() mutable | |||
| MessageManager::callAsync ([url, preparedPlayer, r, | |||
| safeThis = WeakReference<PlayerAsyncInitialiser> { this }]() mutable | |||
| { | |||
| if (safeThis != nullptr) | |||
| safeThis->owner.playerPreparationFinished (url, r, preparedPlayer); | |||
| @@ -530,9 +529,7 @@ private: | |||
| void playbackReachedEndTime() | |||
| { | |||
| WeakReference<PlayerControllerBase> safeThis (this); | |||
| MessageManager::callAsync ([safeThis]() mutable | |||
| MessageManager::callAsync ([safeThis = WeakReference<PlayerControllerBase> { this }]() mutable | |||
| { | |||
| if (safeThis != nullptr) | |||
| safeThis->owner.playbackReachedEndTime(); | |||
| @@ -258,8 +258,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster | |||
| return; | |||
| } | |||
| WeakReference<Pimpl> weakRef (this); | |||
| MessageManager::callAsync ([weakRef, image]() mutable | |||
| MessageManager::callAsync ([weakRef = WeakReference<Pimpl> { this }, image]() mutable | |||
| { | |||
| if (weakRef == nullptr) | |||
| return; | |||