New upstream version 7.0.2~ds0
authorIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Wed, 17 Aug 2022 05:55:26 +0000 (07:55 +0200)
committerIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Wed, 17 Aug 2022 05:55:26 +0000 (07:55 +0200)
260 files changed:
BREAKING-CHANGES.txt
CMakeLists.txt
ChangeList.txt
README.md
docs/CMake API.md
examples/Audio/AudioPlaybackDemo.h
examples/Audio/MidiDemo.h
examples/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/Info-App.plist
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2017/resources.rc
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2019/resources.rc
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2022/resources.rc
examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72.png [deleted file]
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png [deleted file]
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png [deleted file]
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png [deleted file]
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png [deleted file]
examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon@2x.png [deleted file]
examples/DemoRunner/Builds/iOS/Info-App.plist
examples/DemoRunner/DemoRunner.jucer
examples/DemoRunner/JuceLibraryCode/JuceHeader.h
examples/DemoRunner/Source/Main.cpp
examples/DemoRunner/Source/UI/MainComponent.cpp
examples/GUI/MDIDemo.h
examples/GUI/OpenGLAppDemo.h
examples/GUI/OpenGLDemo.h
examples/Plugins/ARAPluginDemo.h
examples/Utilities/PushNotificationsDemo.h
extras/AudioPerformanceTest/AudioPerformanceTest.jucer
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/Android/app/build.gradle
extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json
extras/AudioPluginHost/AudioPluginHost.jucer
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/Android/app/build.gradle
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72.png [deleted file]
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png [deleted file]
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png [deleted file]
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png [deleted file]
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon.png [deleted file]
extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon@2x.png [deleted file]
extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp
extras/AudioPluginHost/Source/Plugins/ARAPlugin.h
extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp
extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp
extras/AudioPluginHost/Source/UI/MainHostWindow.cpp
extras/AudioPluginHost/Source/UI/PluginWindow.h
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
extras/Build/CMake/JUCECheckAtomic.cmake
extras/Build/CMake/JUCEModuleSupport.cmake
extras/Build/CMake/JUCEUtils.cmake
extras/Build/juce_build_tools/juce_build_tools.h
extras/Build/juce_build_tools/utils/juce_Icons.cpp
extras/Build/juceaide/Main.cpp
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle
extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png [deleted file]
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png [deleted file]
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png [deleted file]
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png [deleted file]
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon.png [deleted file]
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png [deleted file]
extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer
extras/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2017/resources.rc
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2019/resources.rc
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2022/resources.rc
extras/Projucer/JuceLibraryCode/JuceHeader.h
extras/Projucer/Projucer.jucer
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Source/Main.cpp
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
modules/juce_analytics/juce_analytics.h
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/native/juce_ios_Audio.cpp
modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp
modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h [deleted file]
modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp
modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
modules/juce_audio_plugin_client/juce_audio_plugin_client.h
modules/juce_audio_processors/format_types/juce_ARACommon.cpp
modules/juce_audio_processors/format_types/juce_ARACommon.h
modules/juce_audio_processors/format_types/juce_ARAHosting.cpp
modules/juce_audio_processors/format_types/juce_ARAHosting.h
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp
modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
modules/juce_audio_processors/juce_audio_processors.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/juce_audio_processors_ara.cpp
modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp
modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h [new file with mode: 0644]
modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp
modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h
modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_box2d/juce_box2d.h
modules/juce_core/files/juce_File.h
modules/juce_core/juce_core.cpp
modules/juce_core/juce_core.h
modules/juce_core/misc/juce_RuntimePermissions.h
modules/juce_core/native/juce_BasicNativeHeaders.h
modules/juce_core/native/juce_android_AndroidDocument.cpp
modules/juce_core/native/juce_android_Files.cpp
modules/juce_core/native/juce_android_JNIHelpers.cpp
modules/juce_core/native/juce_android_JNIHelpers.h
modules/juce_core/native/juce_android_Network.cpp
modules/juce_core/native/juce_android_Threads.cpp
modules/juce_core/native/juce_linux_Files.cpp
modules/juce_core/native/juce_mac_Files.mm
modules/juce_core/native/juce_mac_ObjCHelpers.h
modules/juce_core/native/juce_mac_SystemStats.mm
modules/juce_core/native/juce_posix_SharedCode.h
modules/juce_core/native/juce_win32_SystemStats.cpp
modules/juce_core/streams/juce_AndroidDocumentInputSource.h [new file with mode: 0644]
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/system/juce_SystemStats.h
modules/juce_core/text/juce_LocalisedStrings.h
modules/juce_core/unit_tests/juce_UnitTest.cpp
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/juce_data_structures.h
modules/juce_data_structures/values/juce_ValueTree.cpp
modules/juce_dsp/frequency/juce_Windowing.cpp
modules/juce_dsp/frequency/juce_Windowing.h
modules/juce_dsp/juce_dsp.h
modules/juce_events/juce_events.h
modules/juce_events/messages/juce_ApplicationBase.cpp
modules/juce_events/messages/juce_MessageManager.cpp
modules/juce_events/messages/juce_MessageManager.h
modules/juce_graphics/colour/juce_Colours.cpp
modules/juce_graphics/juce_graphics.h
modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h
modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h
modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp
modules/juce_gui_basics/buttons/juce_HyperlinkButton.h
modules/juce_gui_basics/desktop/juce_Desktop.cpp
modules/juce_gui_basics/desktop/juce_Displays.cpp
modules/juce_gui_basics/desktop/juce_Displays.h
modules/juce_gui_basics/drawables/juce_Drawable.cpp
modules/juce_gui_basics/drawables/juce_Drawable.h
modules/juce_gui_basics/drawables/juce_SVGParser.cpp
modules/juce_gui_basics/filebrowser/juce_FileChooser.h
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/keyboard/juce_TextInputTarget.h
modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp
modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h
modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp
modules/juce_gui_basics/menus/juce_MenuBarComponent.h
modules/juce_gui_basics/misc/juce_DropShadower.cpp
modules/juce_gui_basics/misc/juce_DropShadower.h
modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp
modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp
modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm
modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm
modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm
modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp
modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp
modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm
modules/juce_gui_basics/native/juce_ios_Windowing.mm
modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h
modules/juce_gui_basics/native/juce_mac_MainMenu.mm
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
modules/juce_gui_basics/native/juce_mac_Windowing.mm
modules/juce_gui_basics/widgets/juce_ListBox.cpp
modules/juce_gui_basics/widgets/juce_ListBox.h
modules/juce_gui_basics/widgets/juce_Slider.cpp
modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp
modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h
modules/juce_gui_basics/widgets/juce_TableListBox.cpp
modules/juce_gui_basics/widgets/juce_TextEditor.cpp
modules/juce_gui_basics/widgets/juce_TextEditor.h
modules/juce_gui_basics/widgets/juce_TreeView.cpp
modules/juce_gui_basics/widgets/juce_TreeView.h
modules/juce_gui_basics/windows/juce_DialogWindow.cpp
modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp
modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h
modules/juce_gui_extra/juce_gui_extra.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp
modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp
modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp
modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm
modules/juce_opengl/geometry/juce_Matrix3D.h
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGL_osx.h
modules/juce_osc/juce_osc.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_product_unlocking/native/java/app/com/rmsl/juce/JuceBillingClient.java [new file with mode: 0644]
modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java [deleted file]
modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp
modules/juce_video/juce_video.h
modules/juce_video/native/juce_ios_CameraDevice.h
modules/juce_video/native/juce_mac_CameraDevice.h

index 90568f220f19c845e36a6d8828d3ccd6fa3033b6..000e4d367ce2c8001918ca13723601a35da0520f 100644 (file)
@@ -1,6 +1,38 @@
 JUCE breaking changes
 =====================
 
+Version 7.0.2
+=============
+
+Change
+------
+The Matrix3D (Vector3D<Type> vector) constructor has been replaced with an
+explicit static Matrix3D fromTranslation (Vector3D<Type> vector) function, and a
+bug in the behaviour of the multipication operator that reversed the order of
+operations has been addressed.
+
+Possible Issues
+---------------
+Code using the old constructor will not compile. Code that relied upon the order
+of multiplication operations will return different results.
+
+Workaround
+----------
+Code that was using the old constructor must use the new static function. Code
+that relied on the order of multiplication operations will need to have the
+order of the arguments reversed. With the old code A * B was returning BA rather
+than AB.
+
+Rationale
+---------
+Previously a matrix multipled by a vector would return a matrix, rather than a
+vector, as the multiplied-by vector would be automatically converted into a
+matrix during the operation. Removing the converting constructor makes
+everything much more explicit and there is no confusion about dimensionality.
+The current multiplication routine also included a bug where A * B resulted in
+BA rather than AB, which needed to be addressed.
+
+
 Version 7.0.0
 =============
 
index 6c7640300c70c8ff119645ee5bd6819d2053c69a..438e2bbca8b029e60930f0d4c20f8fcd47ae04f6 100644 (file)
@@ -23,7 +23,7 @@
 
 cmake_minimum_required(VERSION 3.15)
 
-project(JUCE VERSION 7.0.1 LANGUAGES C CXX)
+project(JUCE VERSION 7.0.2 LANGUAGES C CXX)
 
 include(CMakeDependentOption)
 
index 9eaf8a5e2ebb2418631db23152badd3b27c57b7c..43cd12a5362d93727b6de0420c011ed5c2ccc309 100644 (file)
@@ -3,6 +3,12 @@
 This file just lists the more notable headline features. For more detailed info\r
 about changes and bugfixes please see the git log and BREAKING-CHANGES.txt.\r
 \r
+Version 7.0.2\r
+  - Fixed accessibility table navigation\r
+  - Fixed Android file access on older APIs\r
+  - Improved Linux VST3 threading\r
+  - Improved ARA integration\r
+\r
 Version 7.0.1\r
   - Fixed some Xcode and MSVC compiler warnings\r
   - Improved VST3 bus configuration and channel handling\r
index 3faaced1f17eacebf8c8ee2d51421ce322c8852a..5024834cd2aee69f613d8bb1ffa5b366f71a2211 100644 (file)
--- a/README.md
+++ b/README.md
@@ -74,18 +74,45 @@ of the target you wish to build.
 
 Please see our [contribution guidelines](.github/contributing.md).
 
-## License
+## Licensing
 
 The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_core and juce_events)
 are permissively licensed under the terms of the
 [ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
 Other modules are covered by a
-[GPL/Commercial license](https://www.gnu.org/licenses/gpl-3.0.en.html).
+[GPL](https://www.gnu.org/licenses/gpl-3.0.en.html)/Commercial license.
 
 There are multiple commercial licensing tiers for JUCE, with different terms for each:
 - JUCE Personal (developers or startup businesses with revenue under 50K USD) - free
-- JUCE Indie (small businesses with revenue under 500K USD) - $40/month
-- JUCE Pro (no revenue limit) - $130/month
+- JUCE Indie (small businesses with revenue under 500K USD) - $40/month or $800 perpetual
+- JUCE Pro (no revenue limit) - $130/month or $2600 perpetual
 - JUCE Educational (no revenue limit) - free for bona fide educational institutes
 
 For full terms see [LICENSE.md](LICENSE.md).
+
+The JUCE framework contains the following dependencies:
+- [Oboe](modules/juce_audio_devices/native/oboe/) ([Apache 2.0](modules/juce_audio_devices/native/oboe/LICENSE))
+- [FLAC](modules/juce_audio_formats/codecs/flac/) ([BSD](modules/juce_audio_formats/codecs/flac/Flac%20Licence.txt))
+- [Ogg Vorbis](modules/juce_audio_formats/codecs/oggvorbis/) ([BSD](modules/juce_audio_formats/codecs/oggvorbis/Ogg%20Vorbis%20Licence.txt))
+- [CoreAudioUtilityClasses](modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/) ([Apple](modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUBase.cpp))
+- [AUResources.r](modules/juce_audio_plugin_client/AUResources.r) ([Apple](modules/juce_audio_plugin_client/AUResources.r))
+- [LV2](modules/juce_audio_processors/format_types/LV2_SDK/) ([ISC](modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING))
+- [pslextensions](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h) ([Public domain](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h))
+- [VST3](modules/juce_audio_processors/format_types/VST3_SDK/) ([Proprietary Steinberg VST3/GPLv3](modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt))
+- [zlib](modules/juce_core/zip/zlib/) ([zlib](modules/juce_core/zip/zlib/README))
+- [Box2D](modules/juce_box2d/box2d/) ([zlib](modules/juce_box2d/box2d/Box2D.h))
+- [jpeglib](modules/juce_graphics/image_formats/jpglib/) ([Independent JPEG Group License](modules/juce_graphics/image_formats/jpglib/README))
+- [pnglib](modules/juce_graphics/image_formats/pnglib/) ([zlib](modules/juce_graphics/image_formats/pnglib/LICENSE))
+- [GLEW](modules/juce_opengl/opengl/juce_gl.h) ([BSD](modules/juce_opengl/opengl/juce_gl.h)), including [Mesa](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h)) and [Khronos](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h))
+
+The JUCE examples are licensed under the terms of the
+[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
+
+Dependencies in the examples:
+- [reaper-sdk](examples/Plugins/extern/) ([zlib](examples/Plugins/extern/LICENSE.md))
+
+Dependencies in the bundled applications:
+- [Projucer icons](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp) ([MIT](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp))
+
+Dependencies in the build system:
+- [Android Gradle](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt) ([Apache 2.0](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt))
index f03752b69e4d564eae76bece2ba565cfcf1c27f5..059c73ab7db744c6d7143811d7c7e93fdd8d843f 100644 (file)
@@ -331,12 +331,14 @@ attributes directly to these creation functions, rather than adding them later.
 
 `LAUNCH_STORYBOARD_FILE`
 - A custom launch storyboard file to use on iOS. If not supplied, a default storyboard will be
-  used.
+  used. If this is specified, then this will take precedence over a LaunchImage inside a custom
+  xcassets directory.
 
 `CUSTOM_XCASSETS_FOLDER`
 - A path to an xcassets directory, containing icons and/or launch images for this target. If this
-  is specified, the ICON_BIG and ICON_SMALL arguments will not have an effect on iOS, and a launch
-  storyboard will not be used.
+  is specified, the ICON_BIG and ICON_SMALL arguments will not have an effect on iOS. LaunchImages
+  have been deprecated from iOS 13 onward, but if your xcassets folder contains a LaunchImage and
+  a custom storyboard hasn't been specified, then it will be used.
 
 `TARGETED_DEVICE_FAMILY`
 - Specifies the device families on which the product must be capable of running. Allowed values
@@ -544,7 +546,7 @@ attributes directly to these creation functions, rather than adding them later.
   `AAX_ePlugInCategory_NoiseReduction`, `AAX_ePlugInCategory_Dither`,
   `AAX_ePlugInCategory_SoundField`, `AAX_ePlugInCategory_HWGenerators`,
   `AAX_ePlugInCategory_SWGenerators`, `AAX_ePlugInCategory_WrappedPlugin`,
-  `AAX_ePlugInCategory_Effect`
+  `AAX_EPlugInCategory_Effect`
 
 `PLUGINHOST_AU`
 - May be either TRUE or FALSE (defaults to FALSE). If TRUE, will add the preprocessor definition
index b374560953b531b048d66b0472df30552b600bad..dd457ce5c17e519f606325144315a86f259ca4e8 100644 (file)
 \r
 #include "../Assets/DemoUtilities.h"\r
 \r
+inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
+{\r
+   #if JUCE_ANDROID\r
+    if (auto doc = AndroidDocument::fromDocument (url))\r
+        return std::make_unique<AndroidDocumentInputSource> (doc);\r
+   #endif\r
+\r
+   #if ! JUCE_IOS\r
+    if (url.isLocalFile())\r
+        return std::make_unique<FileInputSource> (url.getLocalFile());\r
+   #endif\r
+\r
+    return std::make_unique<URLInputSource> (url);\r
+}\r
+\r
 //==============================================================================\r
 class DemoThumbnailComp  : public Component,\r
                            public ChangeListener,\r
@@ -83,23 +98,9 @@ public:
 \r
     void setURL (const URL& url)\r
     {\r
-        InputSource* inputSource = nullptr;\r
-\r
-       #if ! JUCE_IOS\r
-        if (url.isLocalFile())\r
-        {\r
-            inputSource = new FileInputSource (url.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (inputSource == nullptr)\r
-                inputSource = new URLInputSource (url);\r
-        }\r
-\r
-        if (inputSource != nullptr)\r
+        if (auto inputSource = makeInputSource (url))\r
         {\r
-            thumbnail.setSource (inputSource);\r
+            thumbnail.setSource (inputSource.release());\r
 \r
             Range<double> newRange (0.0, thumbnail.getTotalLength());\r
             scrollbar.setRangeLimits (newRange);\r
@@ -210,7 +211,6 @@ public:
         }\r
     }\r
 \r
-\r
 private:\r
     AudioTransportSource& transportSource;\r
     Slider& zoomSlider;\r
@@ -313,7 +313,7 @@ public:
         zoomSlider.onValueChange = [this] { thumbnail->setZoomFactor (zoomSlider.getValue()); };\r
         zoomSlider.setSkewFactor (2);\r
 \r
-        thumbnail.reset (new DemoThumbnailComp (formatManager, transportSource, zoomSlider));\r
+        thumbnail = std::make_unique<DemoThumbnailComp> (formatManager, transportSource, zoomSlider);\r
         addAndMakeVisible (thumbnail.get());\r
         thumbnail->addChangeListener (this);\r
 \r
@@ -445,34 +445,30 @@ private:
         transportSource.setSource (nullptr);\r
         currentAudioFileSource.reset();\r
 \r
-        AudioFormatReader* reader = nullptr;\r
+        const auto source = makeInputSource (audioURL);\r
 \r
-       #if ! JUCE_IOS\r
-        if (audioURL.isLocalFile())\r
-        {\r
-            reader = formatManager.createReaderFor (audioURL.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (reader == nullptr)\r
-                reader = formatManager.createReaderFor (audioURL.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)));\r
-        }\r
+        if (source == nullptr)\r
+            return false;\r
 \r
-        if (reader != nullptr)\r
-        {\r
-            currentAudioFileSource.reset (new AudioFormatReaderSource (reader, true));\r
+        auto stream = rawToUniquePtr (source->createInputStream());\r
 \r
-            // ..and plug it into our transport source\r
-            transportSource.setSource (currentAudioFileSource.get(),\r
-                                       32768,                   // tells it to buffer this many samples ahead\r
-                                       &thread,                 // this is the background thread to use for reading-ahead\r
-                                       reader->sampleRate);     // allows for sample rate correction\r
+        if (stream == nullptr)\r
+            return false;\r
 \r
-            return true;\r
-        }\r
+        auto reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream)));\r
+\r
+        if (reader == nullptr)\r
+            return false;\r
 \r
-        return false;\r
+        currentAudioFileSource = std::make_unique<AudioFormatReaderSource> (reader.release(), true);\r
+\r
+        // ..and plug it into our transport source\r
+        transportSource.setSource (currentAudioFileSource.get(),\r
+                                   32768,                   // tells it to buffer this many samples ahead\r
+                                   &thread,                 // this is the background thread to use for reading-ahead\r
+                                   currentAudioFileSource->getAudioFormatReader()->sampleRate);     // allows for sample rate correction\r
+\r
+        return true;\r
     }\r
 \r
     void startOrStop()\r
@@ -512,7 +508,7 @@ private:
 \r
             if (FileChooser::isPlatformDialogAvailable())\r
             {\r
-                fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
+                fileChooser = std::make_unique<FileChooser> ("Select an audio file...", File(), "*.wav;*.mp3;*.aif");\r
 \r
                 fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
                                           [this] (const FileChooser& fc) mutable\r
index b5e732e921ececdfd9bc7b118127ef78356de026..35e9db0e15484e98c0cd07b3a6c6cdbf28ca60ed 100644 (file)
@@ -241,16 +241,17 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    struct MidiDeviceListBox : public ListBox,\r
-                               private ListBoxModel\r
+    struct MidiDeviceListBox : private ListBoxModel,\r
+                               public ListBox\r
     {\r
         MidiDeviceListBox (const String& name,\r
                            MidiDemo& contentComponent,\r
                            bool isInputDeviceList)\r
-            : ListBox (name, this),\r
+            : ListBox (name),\r
               parent (contentComponent),\r
               isInput (isInputDeviceList)\r
         {\r
+            setModel (this);\r
             setOutlineThickness (1);\r
             setMultipleSelectionEnabled (true);\r
             setClickingTogglesRowSelection (true);\r
index 51f433f02e23e7e7253db7a5ba1093074a688b46..3d59811a63145ad336439a0f29ae69416a3a9078 100644 (file)
@@ -42,11 +42,17 @@ function(_juce_add_pips)
     endif()
 
     if(NOT (TARGET juce_ara_sdk
-            AND (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")))
+            AND (CMAKE_SYSTEM_NAME STREQUAL "Windows"
+                 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"
+                 OR CMAKE_SYSTEM_NAME STREQUAL "Linux")))
         list(REMOVE_ITEM headers
              "${CMAKE_CURRENT_SOURCE_DIR}/ARAPluginDemo.h")
     endif()
 
+    if(NOT TARGET juce_vst2_sdk)
+        list(REMOVE_ITEM headers "${CMAKE_CURRENT_SOURCE_DIR}/ReaperEmbeddedViewPluginDemo.h")
+    endif()
+
     foreach(header IN ITEMS ${headers})
         juce_add_pip(${header} added_target)
         target_link_libraries(${added_target} PUBLIC
index 349684894e32a2d673274bd590adb01c7b486d70..585547ffb8b935052927a45db4181495a4e831af 100644 (file)
@@ -12,7 +12,7 @@ add_subdirectory (${OBOE_DIR} ./oboe)
 add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")
 set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")
 
-add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.1]] [[-DJUCE_APP_VERSION_HEX=0x70001]])
+add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.2]] [[-DJUCE_APP_VERSION_HEX=0x70002]])
 
 include_directories( AFTER
     "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src"
@@ -32,9 +32,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.1]] [[-DJUCE_APP_VERSION_HEX=0x70001]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.2]] [[-DJUCE_APP_VERSION_HEX=0x70002]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.1]] [[-DJUCE_APP_VERSION_HEX=0x70001]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.2]] [[-DJUCE_APP_VERSION_HEX=0x70002]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -749,6 +749,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -1067,6 +1068,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
@@ -2719,6 +2721,7 @@ set_source_files_properties(
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -3037,6 +3040,7 @@ set_source_files_properties(
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
index 29d7f2a5762eadf899727e4964f9cea943062310..c8b3a2a6b8c6ab8e522e67436dea1196b2396fd5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.1"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.2"
           package="com.rmsl.jucedemorunner">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
index 7ab8f1ec5858adf3d2f5e39ba917c8643f03df9c..316d4b10c112c08a60aa68a791913347d324f137 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.1" "-DJUCE_APP_VERSION_HEX=0x70001" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.2" "-DJUCE_APP_VERSION_HEX=0x70002" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := DemoRunner
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.1" "-DJUCE_APP_VERSION_HEX=0x70001" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.2" "-DJUCE_APP_VERSION_HEX=0x70002" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := DemoRunner
 
index 52996c3fe6037ac3d8434af1411734fbd7759f85..c647f0b0af5b1c917883dc44ab0ed41a8266b22f 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
index f2298cc22330d1551d15e699c82967240be20e16..fecf91cc5ddabf598bb1d5fced6dacbd9f11d23b 100644 (file)
@@ -24,9 +24,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index bcd5def49f26b6b3bc04f147f6db785e579179f1..1d4e3d0806b974cfe5aa18ea364403b49366ad27 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index ca043820cf44e9b8f1b2f5807f70a075f1abdfcf..8ab0de032bc2345c8cbdcd624944560d458ae8fa 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 61b80dc78e0730b5130cd2b6294d71f2bbd45315..3adeec39e7b6582f0829b4c72ce51141ad786795 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index e86dc64492a0436cfd1c76525ab64538f8ba5ca2..7bb91c62fbf10338dd869b61d46a7d9e068c283a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 699225966b16cef29507cbefca19c2539ddf33da..453ecdeb0c6d81efd3a1735744af54f9cb1d6c39 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 61b80dc78e0730b5130cd2b6294d71f2bbd45315..3adeec39e7b6582f0829b4c72ce51141ad786795 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index dff6b733c22fd18dc447d24cf8b79ea0dce9cbe3..7028be67db1445e5c60da4ef1dc3e3f0cc6cf73e 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 5cd4bfcd08e96b0ca9f682d809541f975b8e2bbd..5a4173514606f47b39ef7772e9bce5ea18751c89 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 61b80dc78e0730b5130cd2b6294d71f2bbd45315..3adeec39e7b6582f0829b4c72ce51141ad786795 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index 7c084b25c06daacd00382a4d6e1e1fbad3cb1d61..8fe50429873fe55b25e0aaaa3f0e0cbe0f7ddb10 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
                                OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
                                OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
                                OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
                                OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
index e216154693dd420d5c9f689eda90fbf67703e977..a3b52e1ce37d0088e7b4d7d64237c81c48183777 100644 (file)
       "filename": "Icon-Spotlight-40@3x.png",\r
       "scale": "3x"\r
     },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "iphone",\r
       "size": "60x60",\r
       "filename": "Icon-Spotlight-40@2x-1.png",\r
       "scale": "2x"\r
     },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50@2x.png",\r
-      "scale": "2x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "ipad",\r
       "size": "76x76",\r
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72.png
deleted file mode 100644 (file)
index 20bcab8..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72.png and /dev/null differ
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png
deleted file mode 100644 (file)
index 5e73c38..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png and /dev/null differ
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png
deleted file mode 100644 (file)
index 8248231..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png and /dev/null differ
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png
deleted file mode 100644 (file)
index 4a90fbc..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png and /dev/null differ
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png
deleted file mode 100644 (file)
index d3ac3a6..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png and /dev/null differ
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon@2x.png
deleted file mode 100644 (file)
index 4dc865c..0000000
Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ
index ca8c27b89aac3c19cbaaaaf6137addeb3268d0da..1e2540691bd808be6920585fc4de477c03b7b880 100644 (file)
@@ -30,9 +30,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 5328e5f2de489e5e76c81c6c2f07dc726a633e8e..7bb3ab6c4715d253d0eb5e8e949f18707f7be817 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"\r
-              bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.1" companyName="Raw Material Software Limited"\r
+              bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.2" companyName="Raw Material Software Limited"\r
               companyCopyright="Copyright (c) 2020 - Raw Material Software Limited"\r
               companyWebsite="https://www.juce.com/" companyEmail="info@juce.com"\r
               id="yj7xMM" reportAppUsage="0" useAppConfig="0" addUsingNamespaceToJuceHeader="1"\r
index ab0c8fc6ac4e3f5e79518ab90b3cae9229ab4e4b..7b3ed11a3eb4cd2531ea5a70ddf60bd44964131a 100644 (file)
@@ -54,7 +54,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "DemoRunner";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "7.0.1";\r
-    const int          versionNumber  = 0x70001;\r
+    const char* const  versionString  = "7.0.2";\r
+    const int          versionNumber  = 0x70002;\r
 }\r
 #endif\r
index 561e0823c7423fb8c8605151991623554f07cde1..69084f3e91d06c2b6a00d8ee811e5c24ab378cc9 100644 (file)
@@ -153,6 +153,13 @@ private:
 \r
         void closeButtonPressed() override    { JUCEApplication::getInstance()->systemRequestedQuit(); }\r
 \r
+       #if JUCE_IOS || JUCE_ANDROID\r
+        void parentSizeChanged() override\r
+        {\r
+            getMainComponent().resized();\r
+        }\r
+       #endif\r
+\r
         //==============================================================================\r
         MainComponent& getMainComponent()    { return *dynamic_cast<MainComponent*> (getContentComponent()); }\r
 \r
index e6a59a8ea720d860a1756893e0591e90a6daadd1..ceff6d5bbd24c191e6c4c3361fc7bc4377968120 100644 (file)
@@ -358,7 +358,7 @@ void MainComponent::resized()
         auto bounds = getLocalBounds();\r
 \r
         if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (getScreenBounds()))\r
-            return display->safeAreaInsets.subtractedFrom (bounds);\r
+            return display->safeAreaInsets.subtractedFrom (display->keyboardInsets.subtractedFrom (bounds));\r
 \r
         return bounds;\r
     }();\r
index e5564d3bc479d65144c9bbb5e054c7edbafe3f0e..0c877583c0b439e63960d8ce6dc86080418d1b79 100644 (file)
@@ -151,6 +151,12 @@ public:
         }\r
     }\r
 \r
+    void activeDocumentChanged() override\r
+    {\r
+        if (auto* activeDoc = getActiveDocument())\r
+            Logger::outputDebugString ("activeDocumentChanged() to " + activeDoc->getName());\r
+    }\r
+\r
 private:\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DemoMultiDocumentPanel)\r
 };\r
@@ -171,9 +177,26 @@ public:
         showInTabsButton.onClick = [this] { updateLayoutMode(); };\r
         addAndMakeVisible (showInTabsButton);\r
 \r
-        addNoteButton.onClick = [this] { addNote ("Note " + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!"); };\r
+        oneDocShouldBeFullscreenButton.onClick = [this]\r
+        {\r
+            multiDocumentPanel.useFullscreenWhenOneDocument (oneDocShouldBeFullscreenButton.getToggleState());\r
+        };\r
+        addAndMakeVisible (oneDocShouldBeFullscreenButton);\r
+        oneDocShouldBeFullscreenButton.setToggleState (false, juce::sendNotification);\r
+\r
+        addNoteButton.onClick = [this]\r
+        {\r
+            addNote ("Note " + String (noteCounter), "Hello World! " + String (noteCounter));\r
+            ++noteCounter;\r
+        };\r
         addAndMakeVisible (addNoteButton);\r
 \r
+        closeActiveDocumentButton.onClick = [this]\r
+        {\r
+            multiDocumentPanel.closeDocumentAsync (multiDocumentPanel.getActiveDocument(), false, [] (auto) {});\r
+        };\r
+        addAndMakeVisible (closeActiveDocumentButton);\r
+\r
         closeApplicationButton.onClick = [this]\r
         {\r
             multiDocumentPanel.closeAllDocumentsAsync (true, [] (bool allSaved)\r
@@ -191,7 +214,7 @@ public:
         addNote ("Notes Demo", "You can drag-and-drop text files onto this page to open them as notes..");\r
         addExistingNotes();\r
 \r
-        setSize (500, 500);\r
+        setSize (650, 500);\r
     }\r
 \r
     void paint (Graphics& g) override\r
@@ -203,10 +226,15 @@ public:
     {\r
         auto area = getLocalBounds();\r
 \r
-        auto buttonArea = area.removeFromTop (28).reduced (2);\r
-        closeApplicationButton.setBounds (buttonArea.removeFromRight (150));\r
-        addNoteButton         .setBounds (buttonArea.removeFromRight (150));\r
-        showInTabsButton      .setBounds (buttonArea);\r
+        auto topButtonRow = area.removeFromTop (28).reduced (2);\r
+\r
+        showInTabsButton              .setBounds (topButtonRow.removeFromLeft (150));\r
+\r
+        closeApplicationButton        .setBounds (topButtonRow.removeFromRight (150));\r
+        addNoteButton                 .setBounds (topButtonRow.removeFromRight (150));\r
+        closeActiveDocumentButton     .setBounds (topButtonRow.removeFromRight (150));\r
+\r
+        oneDocShouldBeFullscreenButton.setBounds (area.removeFromTop (28).reduced (2).removeFromLeft (240));\r
 \r
         multiDocumentPanel.setBounds (area);\r
     }\r
@@ -261,11 +289,14 @@ private:
         createNotesForFiles (files);\r
     }\r
 \r
-    ToggleButton showInTabsButton { "Show with tabs" };\r
-    TextButton addNoteButton          { "Create a new note" },\r
-               closeApplicationButton { "Close app" };\r
+    ToggleButton showInTabsButton               { "Show with tabs" };\r
+    ToggleButton oneDocShouldBeFullscreenButton { "Fill screen when only one note is open" };\r
+    TextButton   addNoteButton                  { "Create a new note" },\r
+                 closeApplicationButton         { "Close app" },\r
+                 closeActiveDocumentButton      { "Close active document" };\r
 \r
     DemoMultiDocumentPanel multiDocumentPanel;\r
+    int noteCounter = 1;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MDIDemo)\r
 };\r
index d1b923acdba932a1cee73fb3155e05637720ed72..ee5cbd65819cb78f8ec480d2f0060867c28ff560 100644 (file)
@@ -93,10 +93,10 @@ public:
 \r
     Matrix3D<float> getViewMatrix() const\r
     {\r
-        Matrix3D<float> viewMatrix ({ 0.0f, 0.0f, -10.0f });\r
-        Matrix3D<float> rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f });\r
+        auto viewMatrix = Matrix3D<float>::fromTranslation ({ 0.0f, 0.0f, -10.0f });\r
+        auto rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f });\r
 \r
-        return rotationMatrix * viewMatrix;\r
+        return viewMatrix * rotationMatrix;\r
     }\r
 \r
     void render() override\r
index c1bd9cba2f1bc6e0b1bc19d583413bcb5f7e3a5b..8718acdf3cfba5b06b77d6f53bbda2b29d426b73 100644 (file)
@@ -893,10 +893,10 @@ public:
     {\r
         const ScopedLock lock (mutex);\r
 \r
-        auto viewMatrix = draggableOrientation.getRotationMatrix() * Vector3D<float> (0.0f, 1.0f, -10.0f);\r
+        auto viewMatrix = Matrix3D<float>::fromTranslation ({ 0.0f, 1.0f, -10.0f }) * draggableOrientation.getRotationMatrix();\r
         auto rotationMatrix = Matrix3D<float>::rotation ({ rotation, rotation, -0.3f });\r
 \r
-        return rotationMatrix * viewMatrix;\r
+        return viewMatrix * rotationMatrix;\r
     }\r
 \r
     void setTexture (OpenGLUtils::DemoTexture* t)\r
index abca95660dff322787ff7d4020ec020db354b3ad..9d59439a03b1a9df6d98bc6904eaa6f9a970577c 100644 (file)
@@ -393,6 +393,8 @@ public:
         return success;\r
     }\r
 \r
+    using ARAPlaybackRenderer::processBlock;\r
+\r
 private:\r
     //==============================================================================\r
     // We're subclassing here only to provide a proper default c'tor for our shared resource\r
@@ -549,6 +551,8 @@ public:
         });\r
     }\r
 \r
+    using ARAEditorRenderer::processBlock;\r
+\r
 private:\r
     void configure()\r
     {\r
@@ -615,6 +619,27 @@ protected:
     }\r
 };\r
 \r
+struct PlayHeadState\r
+{\r
+    void update (AudioPlayHead* aph)\r
+    {\r
+        const auto info = aph->getPosition();\r
+\r
+        if (info.hasValue() && info->getIsPlaying())\r
+        {\r
+            isPlaying.store (true);\r
+            timeInSeconds.store (info->getTimeInSeconds().orFallback (0));\r
+        }\r
+        else\r
+        {\r
+            isPlaying.store (false);\r
+        }\r
+    }\r
+\r
+    std::atomic<bool>   isPlaying     { false };\r
+    std::atomic<double> timeInSeconds { 0.0 };\r
+};\r
+\r
 //==============================================================================\r
 class ARADemoPluginAudioProcessorImpl  : public AudioProcessor,\r
                                          public AudioProcessorARAExtension\r
@@ -630,11 +655,13 @@ public:
     //==============================================================================\r
     void prepareToPlay (double sampleRate, int samplesPerBlock) override\r
     {\r
-         prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision());\r
+        playHeadState.isPlaying.store (false);\r
+        prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision());\r
     }\r
 \r
     void releaseResources() override\r
     {\r
+        playHeadState.isPlaying.store (false);\r
         releaseResourcesForARA();\r
     }\r
 \r
@@ -653,10 +680,15 @@ public:
 \r
         ScopedNoDenormals noDenormals;\r
 \r
-        if (! processBlockForARA (buffer, isRealtime(), getPlayHead()))\r
+        auto* audioPlayHead = getPlayHead();\r
+        playHeadState.update (audioPlayHead);\r
+\r
+        if (! processBlockForARA (buffer, isRealtime(), audioPlayHead))\r
             processBlockBypassed (buffer, midiMessages);\r
     }\r
 \r
+    using AudioProcessor::processBlock;\r
+\r
     //==============================================================================\r
     const String getName() const override                             { return "ARAPluginDemo"; }\r
     bool acceptsMidi() const override                                 { return true; }\r
@@ -674,6 +706,8 @@ public:
     void getStateInformation (MemoryBlock&) override                  {}\r
     void setStateInformation (const void*, int) override              {}\r
 \r
+    PlayHeadState playHeadState;\r
+\r
 private:\r
     //==============================================================================\r
     static BusesProperties getBusesProperties()\r
@@ -1043,8 +1077,8 @@ public:
         void paint (Graphics& g) override { g.fillAll (juce::Colours::yellow.darker (0.2f)); }\r
     };\r
 \r
-    OverlayComponent(std::function<AudioPlayHead*()> getAudioPlayheadIn)\r
-        : getAudioPlayhead (std::move (getAudioPlayheadIn))\r
+    OverlayComponent (PlayHeadState& playHeadStateIn)\r
+        : playHeadState (&playHeadStateIn)\r
     {\r
         addChildComponent (playheadMarker);\r
         setInterceptsMouseClicks (false, false);\r
@@ -1074,12 +1108,9 @@ public:
 private:\r
     void doResize()\r
     {\r
-        auto* aph = getAudioPlayhead();\r
-        const auto info = aph->getPosition();\r
-\r
-        if (info.hasValue() && info->getIsPlaying())\r
+        if (playHeadState->isPlaying.load())\r
         {\r
-            const auto markerX = info->getTimeInSeconds().orFallback (0) * pixelPerSecond;\r
+            const auto markerX = playHeadState->timeInSeconds.load() * pixelPerSecond;\r
             const auto playheadLine = getLocalBounds().withTrimmedLeft ((int) (markerX - markerWidth / 2.0) - horizontalOffset)\r
                                                       .removeFromLeft ((int) markerWidth);\r
             playheadMarker.setVisible (true);\r
@@ -1098,7 +1129,7 @@ private:
 \r
     static constexpr double markerWidth = 2.0;\r
 \r
-    std::function<AudioPlayHead*()> getAudioPlayhead;\r
+    PlayHeadState* playHeadState;\r
     double pixelPerSecond = 1.0;\r
     int horizontalOffset = 0;\r
     PlayheadMarkerComponent playheadMarker;\r
@@ -1110,9 +1141,9 @@ class DocumentView  : public Component,
                       private ARAEditorView::Listener\r
 {\r
 public:\r
-    explicit DocumentView (ARADocument& document, std::function<AudioPlayHead*()> getAudioPlayhead)\r
+    explicit DocumentView (ARADocument& document, PlayHeadState& playHeadState)\r
         : araDocument (document),\r
-          overlay (std::move (getAudioPlayhead))\r
+          overlay (playHeadState)\r
     {\r
         addAndMakeVisible (tracksBackground);\r
 \r
@@ -1371,8 +1402,7 @@ public:
         if (auto* editorView = getARAEditorView())\r
         {\r
             auto* document = ARADocumentControllerSpecialisation::getSpecialisedDocumentController(editorView->getDocumentController())->getDocument();\r
-            documentView = std::make_unique<DocumentView> (*document,\r
-                                                           [this]() { return getAudioProcessor()->getPlayHead(); });\r
+            documentView = std::make_unique<DocumentView> (*document, p.playHeadState );\r
         }\r
 \r
         addAndMakeVisible (documentView.get());\r
index 1e3f9839d0fef16b131bedfbcc214896673dd41f..9788dd6691dd37522018110bd66e96781d8b02eb 100644 (file)
@@ -197,7 +197,8 @@ public:
                 NativeMessageBox::showAsync (MessageBoxOptions()\r
                                                .withIconType (MessageBoxIconType::InfoIcon)\r
                                                .withTitle ("Device token")\r
-                                               .withMessage (token),\r
+                                               .withMessage (token)\r
+                                               .withButton ("OK"),\r
                                              nullptr);\r
         };\r
 \r
@@ -315,7 +316,8 @@ private:
             NativeMessageBox::showAsync (MessageBoxOptions()\r
                                            .withIconType (MessageBoxIconType::InfoIcon)\r
                                            .withTitle ("Incorrect notifications setup")\r
-                                           .withMessage ("Please make sure that " + requiredFields + " are set."),\r
+                                           .withMessage ("Please make sure that " + requiredFields + " are set.")\r
+                                           .withButton ("OK"),\r
                                          nullptr);\r
 \r
             return;\r
@@ -568,7 +570,8 @@ private:
                                        .withTitle ("Received notification")\r
                                        .withMessage ("ID: " + n.identifier\r
                                                      + ", title: " + n.title\r
-                                                     + ", body: " + n.body),\r
+                                                     + ", body: " + n.body)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -586,7 +589,8 @@ private:
                                                      + ", title: " + n.title\r
                                                      + ", body: " + n.body\r
                                                      + ", action: " + actionIdentifier\r
-                                                     + ", optionalResponse: " + optionalResponse),\r
+                                                     + ", optionalResponse: " + optionalResponse)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
 \r
         PushNotifications::getInstance()->removeDeliveredNotification (n.identifier);\r
@@ -599,7 +603,8 @@ private:
                                        .withTitle ("Notification dismissed by a user")\r
                                        .withMessage ("ID: " + n.identifier\r
                                                      + ", title: " + n.title\r
-                                                     + ", body: " + n.body),\r
+                                                     + ", body: " + n.body)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -613,7 +618,8 @@ private:
         NativeMessageBox::showAsync (MessageBoxOptions()\r
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Received notification list")\r
-                                       .withMessage (text),\r
+                                       .withMessage (text)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -627,7 +633,8 @@ private:
         NativeMessageBox::showAsync (MessageBoxOptions()\r
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Pending notification list")\r
-                                       .withMessage (text),\r
+                                       .withMessage (text)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -636,7 +643,8 @@ private:
         NativeMessageBox::showAsync (MessageBoxOptions()\r
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Device token refreshed")\r
-                                       .withMessage (token),\r
+                                       .withMessage (token)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -646,7 +654,8 @@ private:
         NativeMessageBox::showAsync (MessageBoxOptions()\r
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Remote notifications deleted")\r
-                                       .withMessage ("Some of the pending messages were removed!"),\r
+                                       .withMessage ("Some of the pending messages were removed!")\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -655,7 +664,8 @@ private:
         NativeMessageBox::showAsync (MessageBoxOptions()\r
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Upstream message sent")\r
-                                       .withMessage ("Message id: " + messageId),\r
+                                       .withMessage ("Message id: " + messageId)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -665,7 +675,8 @@ private:
                                        .withIconType (MessageBoxIconType::InfoIcon)\r
                                        .withTitle ("Upstream message sending error")\r
                                        .withMessage ("Message id: " + messageId\r
-                                                     + "\nerror: " + error),\r
+                                                     + "\nerror: " + error)\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
     }\r
 \r
@@ -1223,7 +1234,8 @@ private:
                                        .withMessage ("In order to be able to test remote notifications "\r
                                                      "ensure that the app is signed and that you register "\r
                                                      "the bundle ID for remote notifications in "\r
-                                                     "Apple Developer Center."),\r
+                                                     "Apple Developer Center.")\r
+                                       .withButton ("OK"),\r
                                      nullptr);\r
        #endif\r
     }\r
index 7731ae5aec5f5d8047002ac2c181825e2b0b85d8..22ae461625ce3ece3a718bf65daf6cef2b12fe7a 100644 (file)
@@ -92,8 +92,8 @@
                    androidCpp11="1" targetFolder="Builds/Android" extraCompilerFlags="-mfpu=neon -mfloat-abi=hard -ffast-math -funroll-loops --param max-unroll-times=8 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -DJUCE_DISABLE_ASSERTIONS=1"\r
                    gradleToolchainVersion="3.6" androidMinimumSDK="23">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION name="Debug" androidArchitectures="arm64-v8a" isDebug="1" targetName="AudioPerformanceTest"/>\r
-        <CONFIGURATION name="Release" androidArchitectures="arm64-v8a" isDebug="0" optimisation="6"\r
+        <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPerformanceTest"/>\r
+        <CONFIGURATION name="Release" isDebug="0" optimisation="6"\r
                        targetName="AudioPerformanceTest"/>\r
       </CONFIGURATIONS>\r
       <MODULEPATHS>\r
index c5991e6a29146404d4383f0d3b78ec76a9d5465b..b2721c9cd5c5d44308355c93019e72f995c1a327 100644 (file)
@@ -23,9 +23,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -721,6 +721,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -943,6 +944,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
@@ -2389,6 +2391,7 @@ set_source_files_properties(
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -2611,6 +2614,7 @@ set_source_files_properties(
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
index ee50f9219e2c9142e4d5ad1da58bf52069a1f07c..74166841d80185ed069948f06e0d5c307ad4c708 100644 (file)
@@ -47,7 +47,7 @@ android {
     productFlavors {
         debug_ {
             ndk {
-                abiFilters "arm64-v8a"
+                abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
             }
             externalNativeBuild {
                 cmake {
@@ -58,9 +58,6 @@ android {
             dimension "default"
        }
         release_ {
-            ndk {
-                abiFilters "arm64-v8a"
-            }
             externalNativeBuild {
                 cmake {
                     arguments "-DJUCE_BUILD_CONFIGURATION=RELEASE", "-DCMAKE_CXX_FLAGS_RELEASE=-Ofast", "-DCMAKE_C_FLAGS_RELEASE=-Ofast"
index 39e144719e96f89144c003d2fd190c38fc2cffbb..85998ab5935ccf9af49404e4324b3c8311d494a4 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := AudioPerformanceTest
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := AudioPerformanceTest
 
index 66c23fcc8011713225db3aab0b3be00dcb762c7b..4b040710b1ed9a9445abe4610cf69bdc2e4ba22a 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index bc3bd4d1f0ff50797bc998f52554bb57b48e0cf6..03a877a6c71eaf48bc2ebd2de55dd52e1f8f2d1f 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 2c6f134faa258311c25663ac5c10d46d645c3ead..d8d4fa21f7144d32dec0aa1ada4163b97bbdacf5 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index f117fded5e08d6a67e28dfcb64d79ffbeb515985..dd6e81db22fb43b6ca7fe50477f1b419171bccf4 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                USE_HEADERMAP = NO;
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                USE_HEADERMAP = NO;
index e216154693dd420d5c9f689eda90fbf67703e977..a3b52e1ce37d0088e7b4d7d64237c81c48183777 100644 (file)
       "filename": "Icon-Spotlight-40@3x.png",\r
       "scale": "3x"\r
     },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "iphone",\r
       "size": "60x60",\r
       "filename": "Icon-Spotlight-40@2x-1.png",\r
       "scale": "2x"\r
     },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50@2x.png",\r
-      "scale": "2x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "ipad",\r
       "size": "76x76",\r
index 09277e3d820005fd4b3054ee589f0e520ad8efaf..5e1d2c72f5bfe09e2057706b61e6c6cfd5e94500 100644 (file)
                    microphonePermissionNeeded="1" androidBluetoothNeeded="1" smallIcon="c97aUr"\r
                    bigIcon="c97aUr" androidExtraAssetsFolder="../../examples/Assets">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
-                       optimisation="1" linkTimeOptimisation="0" targetName="Plugin Host"\r
-                       recommendedWarnings="LLVM"/>\r
+        <CONFIGURATION name="Debug" isDebug="1" optimisation="1" linkTimeOptimisation="0"\r
+                       targetName="Plugin Host" recommendedWarnings="LLVM"/>\r
         <CONFIGURATION name="Release" isDebug="0" optimisation="3" linkTimeOptimisation="1"\r
                        targetName="Plugin Host" recommendedWarnings="LLVM"/>\r
       </CONFIGURATIONS>\r
index e191d43fa661ec9f619c5eda70b0ab11fa8270d5..ced1756654c80171aa1a1cc0edaf784abfe94215 100644 (file)
@@ -32,9 +32,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
     if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64"))
         set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
         set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
@@ -754,6 +754,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -976,6 +977,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
@@ -2577,6 +2579,7 @@ set_source_files_properties(
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -2799,6 +2802,7 @@ set_source_files_properties(
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
index 10f55263d03a2baf914cb0a03f904904e10f2d16..9904208084d2cd1fe4dbba2de9f7a662c8a2f722 100644 (file)
@@ -47,7 +47,7 @@ android {
     productFlavors {
         debug_ {
             ndk {
-                abiFilters "armeabi-v7a", "x86"
+                abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
             }
             externalNativeBuild {
                 cmake {
index b3af118bec8a190d596e3dbdb7660444dd6816ff..fb0581a48b73ef1d9723eb3646090d8308805d94 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := AudioPluginHost
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := AudioPluginHost
 
index 3804671bbe7ae379d5fe57aad457171b17b55534..7108cf0d0ded81003a12174c5d8d471fd505b67f 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index bf7d83b5e9bf8b595b57c3e3144f0f06c37ad6ef..ff0d416bfb80409a82c6a8f72e5129d9a2c04d9a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index c1ba13c7dcd61768715114fb6bfa69d93d2c9b8b..71f69c73221b674758c6539628d16cf0ffffd3fb 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index a44827ccd7c8e09e8e2094960b6be189fd6635a3..563ae87da3eaafa976750d3cd86ce5515b549f58 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 3b4beb2105e394b1c77df402f71a6da04b8af3da..5c056fd722e4a6cf2d4d2dce4f868014855757ce 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 763931e719a9ca6432c3b1dbab1bd67e5b614253..7022f9a11a551b1196ba15276386fb7e59ae173b 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 431df436a3a6ea6649bef05d7bbc7dee9f0f1b5f..46ac064070be2f5a05ea8e34c9705b2968173873 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index d6823c8283168165aa57db25aca4cd3eb7000528..a724850956672c4f68fef238e553df729820ff2a 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
                                OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
                                OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "Plugin Host";
                                USE_HEADERMAP = NO;
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
                                OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
                                OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "Plugin Host";
                                USE_HEADERMAP = NO;
index e216154693dd420d5c9f689eda90fbf67703e977..a3b52e1ce37d0088e7b4d7d64237c81c48183777 100644 (file)
       "filename": "Icon-Spotlight-40@3x.png",\r
       "scale": "3x"\r
     },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "iphone",\r
       "size": "60x60",\r
       "filename": "Icon-Spotlight-40@2x-1.png",\r
       "scale": "2x"\r
     },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50@2x.png",\r
-      "scale": "2x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "ipad",\r
       "size": "76x76",\r
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72.png
deleted file mode 100644 (file)
index f6958df..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72.png and /dev/null differ
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png
deleted file mode 100644 (file)
index 1ce0b56..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png and /dev/null differ
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png
deleted file mode 100644 (file)
index 34d611e..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png and /dev/null differ
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png
deleted file mode 100644 (file)
index fb85c66..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png and /dev/null differ
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon.png
deleted file mode 100644 (file)
index ca140a6..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon.png and /dev/null differ
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon@2x.png
deleted file mode 100644 (file)
index 0e9ec6b..0000000
Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ
index ef6cca4581986cf0790ed87a4ca90aea1025cc68..4141210d84f9697fcc95e218e33982be6b36f39b 100644 (file)
@@ -25,7 +25,7 @@
 \r
 #include "ARAPlugin.h"\r
 \r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
 \r
 const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlRootTag         { "ARATestHostContext" };\r
 const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlAudioFileAttrib { "AudioFile" };\r
index be6353b9b5ec26c281741832cfccc9d525ab96d7..33cb6e76b93d98d7d609682c34877f40c643f459 100644 (file)
@@ -27,7 +27,7 @@
 \r
 #include <juce_core/system/juce_TargetPlatform.h>\r
 \r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
 \r
 #include <JuceHeader.h>\r
 \r
@@ -179,7 +179,7 @@ class PlaybackRegion
         properties.transformationFlags = ARA::kARAPlaybackTransformationNoChanges;\r
         properties.startInModificationTime = 0.0;\r
         const auto& formatReader = audioSource.getFormatReader();\r
-        properties.durationInModificationTime = formatReader.lengthInSamples / formatReader.sampleRate;\r
+        properties.durationInModificationTime = (double) formatReader.lengthInSamples / formatReader.sampleRate;\r
         properties.startInPlaybackTime = 0.0;\r
         properties.durationInPlaybackTime = properties.durationInModificationTime;\r
         properties.musicalContextRef = sequence.getMusicalContext().getPluginRef();\r
index 9645492d0e0f5689806c9f65784bdfd4c49d168c..0701dd82c1d722ee9c5942fa03eaa9e620669eed 100644 (file)
@@ -106,7 +106,7 @@ void PluginGraph::addPluginCallback (std::unique_ptr<AudioPluginInstance> instan
     }\r
     else\r
     {\r
-       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
         if (useARA == PluginDescriptionAndPreference::UseARA::yes\r
             && instance->getPluginDescription().hasARAExtension)\r
         {\r
@@ -410,7 +410,7 @@ void PluginGraph::createNodeFromXml (const XmlElement& xml)
                                                                 graph.getBlockSize(),\r
                                                                 errorMessage);\r
 \r
-           #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+           #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
             if (instance\r
                 && description.useARA == PluginDescriptionAndPreference::UseARA::yes\r
                 && description.pluginDescription.hasARAExtension)\r
index e68e0c0910f031fbff428495f7bdc06f544b6461..195f47ae6c659f4a2caa1dd245ac7f8138558528 100644 (file)
@@ -427,7 +427,7 @@ struct GraphEditorPanel::PluginComponent   : public Component,
         menu->addItem ("Show all parameters", [this] { showWindow (PluginWindow::Type::generic); });\r
         menu->addItem ("Show debug log", [this] { showWindow (PluginWindow::Type::debug); });\r
 \r
-       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
         if (auto* instance = dynamic_cast<AudioPluginInstance*> (getProcessor()))\r
             if (instance->getPluginDescription().hasARAExtension && isNodeUsingARA())\r
                 menu->addItem ("Show ARA host controls", [this] { showWindow (PluginWindow::Type::araHost); });\r
index 2f5338f1c57b0e33771d1f00ee1febe96f1b6f59..b911a6e8bd4f0d6e010ff1866d2e7c0d7e05a9f5 100644 (file)
@@ -662,7 +662,7 @@ static void addToMenu (const KnownPluginList::PluginTree& tree,
 \r
         addPlugin (PluginDescriptionAndPreference { plugin, PluginDescriptionAndPreference::UseARA::no }, name);\r
 \r
-       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
         if (plugin.hasARAExtension)\r
         {\r
             name << " (ARA)";\r
index b53fb7be008d252bc39d1d2a6048e07c2ba876d2..c84518ac8ce5d6d7c3fa31f6bd8e2529aa090ffe 100644 (file)
@@ -245,7 +245,7 @@ private:
 \r
         if (type == PluginWindow::Type::araHost)\r
         {\r
-           #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+           #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
             if (auto* araPluginInstanceWrapper = dynamic_cast<ARAPluginInstanceWrapper*> (&processor))\r
                 if (auto* ui = araPluginInstanceWrapper->createARAHostEditor())\r
                     return ui;\r
index b91df6b11cd17e9c38f2f22227849431311b5b23..58dd5d452d0937f1acf861107da931cae105dd98 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder
 
index 6ee40c575acade4acd4b00e7e066a7e898ddf7d9..835c8731c7738b93e2c109554e55868b95c8dcb0 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
                                        "JUCE_STANDALONE_APPLICATION=1",
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
                                        "JUCE_STANDALONE_APPLICATION=1",
index 2135aa0e7d218fd5a84ab295229cb5240234e1a4..71be7f930c0ea2cd5a576dc2e11888ae84071687 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 213893c20d1e3723ab5bcef5247ac1dbdba1a3e5..5284ca0c1b3ba13488d32bd69b53875aacf58c52 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 4ffe75bee13d1f7504494c45f00a0583f2131eed..46bfd6a4a7d072ce61f0f70619b656cd4d490ab6 100644 (file)
@@ -29,7 +29,19 @@ function(_juce_create_atomic_target target_name)
         return()
     endif()
 
-    set(test_file_contents
+    set(test_atomic_with_is_lock_free_file_contents
+            [[
+            #include <atomic>
+
+            int main (int argc, char** argv)
+            {
+                std::atomic<long long> ll { static_cast<long long> (argc) };
+                ll ^= static_cast<long long> (ll.is_lock_free());
+                return static_cast<int> (ll);
+            }
+        ]])
+
+    set(test_simple_atomic_file_contents
         [[
             #include <atomic>
 
@@ -47,7 +59,7 @@ function(_juce_create_atomic_target target_name)
     string(RANDOM LENGTH 16 random_dir_string)
     set(test_bindir "${CMAKE_CURRENT_BINARY_DIR}/check_atomic_dir_${random_dir_string}")
 
-    file(WRITE "${test_file_name}" "${test_file_contents}")
+    file(WRITE "${test_file_name}" "${test_atomic_with_is_lock_free_file_contents}")
 
     try_compile(compile_result "${test_bindir}" "${test_file_name}"
         OUTPUT_VARIABLE test_build_output_0
@@ -64,15 +76,37 @@ function(_juce_create_atomic_target target_name)
             CXX_EXTENSIONS FALSE)
 
         if (NOT compile_result)
-            message(FATAL_ERROR
-                "First build output:\n"
-                "${test_build_output_0}"
-                "\n\nSecond build output:\n"
-                "${test_build_output_1}"
-                "\n\nJUCE requires support for std::atomic, but this system cannot "
-                "successfully compile a program which uses std::atomic. "
-                "You may need to install a dedicated libatomic package using your "
-                "system's package manager.")
+            file(WRITE "${test_file_name}" "${test_simple_atomic_file_contents}")
+
+            try_compile(compile_result "${test_bindir}" "${test_file_name}"
+                    OUTPUT_VARIABLE test_build_output_2
+                    LINK_LIBRARIES atomic
+                    CXX_STANDARD 14
+                    CXX_STANDARD_REQUIRED TRUE
+                    CXX_EXTENSIONS FALSE)
+
+            if (NOT compile_result)
+                message(FATAL_ERROR
+                    "First build output:\n"
+                    "${test_build_output_0}"
+                    "\n\nSecond build output:\n"
+                    "${test_build_output_1}"
+                    "\n\nThird build output:\n"
+                    "${test_build_output_2}"
+                    "\n\nJUCE requires support for std::atomic, but this system cannot "
+                    "successfully compile a program which uses std::atomic. "
+                    "You may need to install a dedicated libatomic package using your "
+                    "system's package manager.")
+            else()
+                message(WARNING
+                    "First build output:\n"
+                    "${test_build_output_0}"
+                    "\n\nSecond build output:\n"
+                    "${test_build_output_1}"
+                    "\n\nIf you are seeing this warning it means that the libatomic library"
+                    "on this system doesn't support is_lock_free."
+                    "Please let the JUCE team know.")
+            endif()
         endif()
 
         target_link_libraries("${target_name}" INTERFACE atomic)
index 5fe0323a9c21ea75dcb237c69367a5e59f7b405e..555a72c476a34b95fda9a173a08de79f5ae0c17c 100644 (file)
@@ -83,8 +83,10 @@ endfunction()
 
 macro(_juce_make_absolute path)
     if(NOT IS_ABSOLUTE "${${path}}")
-        get_filename_component("${path}" "${${path}}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
+        get_filename_component(${path} "${${path}}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
     endif()
+
+    string(REGEX REPLACE "\\\\" "/" ${path} "${${path}}")
 endmacro()
 
 macro(_juce_make_absolute_and_check path)
index 9b2a9cda9d13c37983d06e35ce8592716d907667..7f7c13b8db90b9881560cda3e2225ea6872b73b0 100644 (file)
@@ -322,6 +322,7 @@ function(_juce_write_configure_time_info target)
     _juce_append_target_property(file_content PLUGIN_AU_MAIN_TYPE                  ${target} JUCE_AU_MAIN_TYPE_CODE)
     _juce_append_target_property(file_content IS_AU_SANDBOX_SAFE                   ${target} JUCE_AU_SANDBOX_SAFE)
     _juce_append_target_property(file_content IS_PLUGIN_SYNTH                      ${target} JUCE_IS_SYNTH)
+    _juce_append_target_property(file_content IS_PLUGIN_ARA_EFFECT                 ${target} JUCE_IS_ARA_EFFECT)
     _juce_append_target_property(file_content SUPPRESS_AU_PLIST_RESOURCE_USAGE     ${target} JUCE_SUPPRESS_AU_PLIST_RESOURCE_USAGE)
     _juce_append_target_property(file_content HARDENED_RUNTIME_ENABLED             ${target} JUCE_HARDENED_RUNTIME_ENABLED)
     _juce_append_target_property(file_content APP_SANDBOX_ENABLED                  ${target} JUCE_APP_SANDBOX_ENABLED)
@@ -1343,10 +1344,11 @@ function(_juce_set_fallback_properties target)
     _juce_set_property_if_not_set(${target} BUILD_VERSION "${final_version}")
 
     get_target_property(custom_xcassets ${target} JUCE_CUSTOM_XCASSETS_FOLDER)
+    get_target_property(custom_storyboard ${target} JUCE_LAUNCH_STORYBOARD_FILE)
 
     set(needs_storyboard TRUE)
 
-    if(custom_xcassets)
+    if((NOT custom_storyboard) AND custom_xcassets AND (EXISTS "${custom_xcassets}/LaunchImage.launchimage"))
         set(needs_storyboard FALSE)
     endif()
 
@@ -1909,7 +1911,8 @@ function(juce_add_pip header)
 
             juce_add_plugin(${JUCE_PIP_NAME}
                 FORMATS AU VST3
-                IS_ARA_EFFECT TRUE)
+                IS_ARA_EFFECT TRUE
+                ${extra_target_args})
         else()
             set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in")
 
index 2776b4cd74383f78e168c9325cab88bda87d7be5..6a77694793138c3efa5da1218be6444916b5f7ba 100644 (file)
@@ -34,7 +34,7 @@
 \r
   ID:                 juce_build_tools\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE Build Tools\r
   description:        Classes for generating intermediate files for JUCE projects.\r
   website:            http://www.juce.com/juce\r
index fe3d036fb0e2a8155c1980e4ce7068bb41f113a5..ef5007261257821fe0f3b1eb9070345e0bb773d8 100644 (file)
@@ -341,8 +341,6 @@ namespace build_tools
         { "iphone",          "29x29",     "Icon-29@3x.png",                    "3x", 87   },\r
         { "iphone",          "40x40",     "Icon-Spotlight-40@2x.png",          "2x", 80   },\r
         { "iphone",          "40x40",     "Icon-Spotlight-40@3x.png",          "3x", 120  },\r
-        { "iphone",          "57x57",     "Icon.png",                          "1x", 57   },\r
-        { "iphone",          "57x57",     "Icon@2x.png",                       "2x", 114  },\r
         { "iphone",          "60x60",     "Icon-60@2x.png",                    "2x", 120  },\r
         { "iphone",          "60x60",     "Icon-@3x.png",                      "3x", 180  },\r
         { "ipad",            "20x20",     "Icon-Notifications-20.png",         "1x", 20   },\r
@@ -351,10 +349,6 @@ namespace build_tools
         { "ipad",            "29x29",     "Icon-Small@2x-1.png",               "2x", 58   },\r
         { "ipad",            "40x40",     "Icon-Spotlight-40.png",             "1x", 40   },\r
         { "ipad",            "40x40",     "Icon-Spotlight-40@2x-1.png",        "2x", 80   },\r
-        { "ipad",            "50x50",     "Icon-Small-50.png",                 "1x", 50   },\r
-        { "ipad",            "50x50",     "Icon-Small-50@2x.png",              "2x", 100  },\r
-        { "ipad",            "72x72",     "Icon-72.png",                       "1x", 72   },\r
-        { "ipad",            "72x72",     "Icon-72@2x.png",                    "2x", 144  },\r
         { "ipad",            "76x76",     "Icon-76.png",                       "1x", 76   },\r
         { "ipad",            "76x76",     "Icon-76@2x.png",                    "2x", 152  },\r
         { "ipad",            "83.5x83.5", "Icon-83.5@2x.png",                  "2x", 167  },\r
index e128608c690629f597a7359b1c5f064fd482e392..0892dcad0235f318350f3c1e250217c06b732fda 100644 (file)
@@ -270,6 +270,7 @@ juce::build_tools::PlistOptions parsePlistOptions (const juce::File& file,
     updateField ("PLUGIN_AU_MAIN_TYPE",                  result.auMainType);\r
     updateField ("IS_AU_SANDBOX_SAFE",                   result.isAuSandboxSafe);\r
     updateField ("IS_PLUGIN_SYNTH",                      result.isPluginSynth);\r
+    updateField ("IS_PLUGIN_ARA_EFFECT",                 result.isPluginARAEffect);\r
     updateField ("SUPPRESS_AU_PLIST_RESOURCE_USAGE",     result.suppressResourceUsage);\r
     updateField ("BUNDLE_ID",                            result.bundleIdentifier);\r
     updateField ("ICON_FILE",                            result.iconFile);\r
index e0db546b6f7aed0062aeb65faf6740e065c2398f..e75d8c21620deabc53af2c07f20c18ff98d1a650 100644 (file)
@@ -23,9 +23,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70001]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70002]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -725,6 +725,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -947,6 +948,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
@@ -2473,6 +2475,7 @@ set_source_files_properties(
     "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h"
+    "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h"
     "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp"
@@ -2695,6 +2698,7 @@ set_source_files_properties(
     "../../../../../modules/juce_core/network/juce_URL.h"
     "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
     "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+    "../../../../../modules/juce_core/streams/juce_AndroidDocumentInputSource.h"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
     "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
     "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
index 16896ee5f333061f502239ee0702ebac063b91a8..fd520d30037aac4ee09254bac178a03120a479f0 100644 (file)
@@ -47,7 +47,7 @@ android {
     productFlavors {
         debug_ {
             ndk {
-                abiFilters "armeabi-v7a", "x86"
+                abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
             }
             externalNativeBuild {
                 cmake {
index 158da4f8de299c4fca2499d2b985029fe8c9ecd6..440409737a5c718f3032fa1cf68c48c015951d98 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
 
index bea59e017a5a3a9fd0f9a1a4873bb2a6edab11d8..5d700e9f3af46321a3cfd8a7d8dcb10e63b7a557 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index 963df9e731369c07d65ddc31780de9866bf1cb96..4296299fdf822478fefdf3b8befa45f13d4a3e29 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 4e18658ea9cd035e6689acfd3ac14aa2cfeb136b..44a2998b5e428b5daa227aa3efa271adacad1bae 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 1d29545bfed90d40b36ad133d28d73154994503b..4940ed4abaa4c0f7a1964b370ca2cdbc190212c6 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
-                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+                               OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
index e216154693dd420d5c9f689eda90fbf67703e977..a3b52e1ce37d0088e7b4d7d64237c81c48183777 100644 (file)
       "filename": "Icon-Spotlight-40@3x.png",\r
       "scale": "3x"\r
     },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "iphone",\r
-      "size": "57x57",\r
-      "filename": "Icon@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "iphone",\r
       "size": "60x60",\r
       "filename": "Icon-Spotlight-40@2x-1.png",\r
       "scale": "2x"\r
     },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "50x50",\r
-      "filename": "Icon-Small-50@2x.png",\r
-      "scale": "2x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72.png",\r
-      "scale": "1x"\r
-    },\r
-    {\r
-      "idiom": "ipad",\r
-      "size": "72x72",\r
-      "filename": "Icon-72@2x.png",\r
-      "scale": "2x"\r
-    },\r
     {\r
       "idiom": "ipad",\r
       "size": "76x76",\r
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png
deleted file mode 100644 (file)
index 52ec77a..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72.png and /dev/null differ
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png
deleted file mode 100644 (file)
index 54b2c96..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png and /dev/null differ
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png
deleted file mode 100644 (file)
index 3328c84..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png and /dev/null differ
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png
deleted file mode 100644 (file)
index 6650647..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png and /dev/null differ
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon.png
deleted file mode 100644 (file)
index 3ce58cf..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon.png and /dev/null differ
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png
deleted file mode 100644 (file)
index 21c396f..0000000
Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ
index bc5acc0d30ae748835e13e3d5e30be4b43f5adc3..a6441828dd0f1b48c4fe3005b832ee6e293cb11a 100644 (file)
                    androidCpp11="1" targetFolder="Builds/Android" bigIcon="Ww6bQw"\r
                    gradleToolchainVersion="3.6">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
-                       optimisation="6" targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
+        <CONFIGURATION name="Debug" isDebug="1" optimisation="6"\r
+                       targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
         <CONFIGURATION name="Release" isDebug="0" targetName="JUCE Network Graphics Demo"/>\r
       </CONFIGURATIONS>\r
       <MODULEPATHS>\r
index 6f21d6bc3b2ddcd38d055b6cbc7be7b766a3d8fe..a0f93a7fa3b9c41fd477e32ea603bb2b382e2f4b 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.1" "-DJUCE_APP_VERSION_HEX=0x70001" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.2" "-DJUCE_APP_VERSION_HEX=0x70002" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := Projucer
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.1" "-DJUCE_APP_VERSION_HEX=0x70001" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.2" "-DJUCE_APP_VERSION_HEX=0x70002" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_APP := Projucer
 
index fbbdb09d1c8b6b98120209ee058c76ea849768db..255ae69c3ac3a7f5ab873dd24c085bcb59e0f1b0 100644 (file)
@@ -22,9 +22,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.1</string>\r
+    <string>7.0.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 102ec193721c344ed36c74df9b659eb0dcb19e92..ff3b8511d66f8278d8d6ba69a0d484dddca5f42c 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_build_tools=1",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_MODULE_AVAILABLE_juce_cryptography=1",
                                        "JUCE_WEB_BROWSER=0",
                                        "JUCE_STANDALONE_APPLICATION=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_build_tools=1",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_MODULE_AVAILABLE_juce_cryptography=1",
                                        "JUCE_WEB_BROWSER=0",
                                        "JUCE_STANDALONE_APPLICATION=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=7.0.1",
-                                       "JUCE_APP_VERSION_HEX=0x70001",
+                                       "JUCE_APP_VERSION=7.0.2",
+                                       "JUCE_APP_VERSION_HEX=0x70002",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
index f92cdb18720854a29d2dde81abd6f42a6166efb3..83c0c597ba2e661de3d705ddab93b64263ddd0d8 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index ef1cbed5c394826d9263597acb8393adc8072ea8..748c79a530bbc3e5b9b06ef043a7b7519ac0bae7 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index b4d97f2343c2be148c121714da9524456c351ef5..842cf6811448db2d1d3e7d284626030b0610eb5c 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index e0ed5ea087ca7b0cb6f71b8a3bc6c2b9ce4eb8a8..ba0a4ff2465ace8ea3045ab23622600e1f1f2b8e 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 416c18b1386d438abd771e5dbb3c0fb01933f42d..c3b4cd56b4177c6b3b4bdb0282b94a7ff1731620 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index b4d97f2343c2be148c121714da9524456c351ef5..842cf6811448db2d1d3e7d284626030b0610eb5c 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index 35340f2ae21e3c1296075d3d1cb639694661bd31..6a8f866dab7dca02b5eabce6efcef6bf8f8f44d8 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 114af8d8bb22252546c52faeee5c7ad2ab153853..dcac9aaeec30910ff88cd8014fde9cb4afcc965c 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index b4d97f2343c2be148c121714da9524456c351ef5..842cf6811448db2d1d3e7d284626030b0610eb5c 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,1,0\r
+FILEVERSION  7,0,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.1\0"\r
+      VALUE "FileVersion",  "7.0.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.1\0"\r
+      VALUE "ProductVersion",  "7.0.2\0"\r
     END\r
   END\r
 \r
index 05270d7adc44fd340c30304e3e605cafdb6a4616..1653f92775cb0b5d73c2dbeb973802741283eecf 100644 (file)
@@ -44,7 +44,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "Projucer";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "7.0.1";\r
-    const int          versionNumber  = 0x70001;\r
+    const char* const  versionString  = "7.0.2";\r
+    const int          versionNumber  = 0x70002;\r
 }\r
 #endif\r
index 93041af3640fff5cbc19b12b0c6032046fcbf9e2..d27c80ca87415b68b12d93301d8ae76360658a16 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              version="7.0.1" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+              version="7.0.2" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="Raw Material Software Limited"\r
               companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
               addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
index 2efff4150f3c6ab1d408acf1e0cc231723329b35..563f18bebc95cdd0c7178088c9f110671f2163d2 100644 (file)
@@ -499,6 +499,9 @@ public:
     {\r
         vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
                                           getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::linux), TargetOS::linux);\r
+\r
+        araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr },\r
+                                  getAppSettings().getStoredPath (Ids::araPath, TargetOS::linux), TargetOS::linux);\r
     }\r
 \r
     //==============================================================================\r
index 418402929ac0c37b42117a45a55fad78166fbb69..6344807c9c1fe8958eb9b72c4eab8604845345f7 100644 (file)
@@ -167,8 +167,21 @@ public:
 \r
     String getCustomResourceFoldersString() const           { return customXcodeResourceFoldersValue.get().toString().replaceCharacters ("\r\n", "::"); }\r
     String getCustomXcassetsFolderString() const            { return customXcassetsFolderValue.get(); }\r
+\r
+    Optional<build_tools::RelativePath> getCustomXcassetsFolder() const\r
+    {\r
+        const auto customXcassetsPath = getCustomXcassetsFolderString();\r
+\r
+        if (customXcassetsPath.isEmpty())\r
+            return {};\r
+\r
+        return build_tools::RelativePath { customXcassetsPath, build_tools::RelativePath::projectFolder };\r
+    }\r
+\r
     String getCustomLaunchStoryboardString() const          { return customLaunchStoryboardValue.get(); }\r
-    bool shouldAddStoryboardToProject() const               { return getCustomLaunchStoryboardString().isNotEmpty() || getCustomXcassetsFolderString().isEmpty(); }\r
+\r
+    bool shouldAddStoryboardToProject() const               { return getCustomLaunchStoryboardString().isNotEmpty()\r
+                                                                  || (! customXcassetsFolderContainsLaunchImage()); }\r
 \r
     bool isHardenedRuntimeEnabled() const                   { return hardenedRuntimeValue.get(); }\r
     Array<var> getHardenedRuntimeOptions() const            { return *hardenedRuntimeOptionsValue.get().getArray(); }\r
@@ -301,8 +314,8 @@ public:
         {\r
             props.add (new TextPropertyComponent (customXcassetsFolderValue, "Custom Xcassets Folder", 128, false),\r
                        "If this field is not empty, your Xcode project will use the custom xcassets folder specified here "\r
-                       "for the app icons and launchimages, and will ignore the Icon files specified above. This will also prevent "\r
-                       "a launch storyboard from being used.");\r
+                       "for the app icons, and will ignore the Icon files specified above. If the provided xcassets folder "\r
+                       "contains a launchimage it will be used, unless a custom storyboard is specified.");\r
 \r
             props.add (new TextPropertyComponent (customLaunchStoryboardValue, "Custom Launch Storyboard", 256, false),\r
                        "If this field is not empty then the specified launch storyboard file will be added to the project as an Xcode "\r
@@ -2681,7 +2694,7 @@ private:
         folders.removeEmptyStrings();\r
 \r
         for (auto& crf : folders)\r
-            addCustomResourceFolder (crf);\r
+            addCustomResourceFolder (build_tools::RelativePath { crf, build_tools::RelativePath::projectFolder });\r
     }\r
 \r
     void addSubprojects() const\r
@@ -2787,19 +2800,43 @@ private:
 \r
     void addXcassets() const\r
     {\r
-        auto customXcassetsPath = getCustomXcassetsFolderString();\r
-\r
-        if (customXcassetsPath.isEmpty())\r
-            addDefaultXcassetsFolders();\r
+        if (const auto customXcassetsPath = getCustomXcassetsFolder())\r
+            addCustomResourceFolder (*customXcassetsPath, "folder.assetcatalog");\r
         else\r
-            addCustomResourceFolder (customXcassetsPath, "folder.assetcatalog");\r
+            addDefaultXcassetsFolders();\r
     }\r
 \r
-    void addCustomResourceFolder (String folderPathRelativeToProjectFolder, const String fileType = "folder") const\r
+    File makeFile (const build_tools::RelativePath& path) const\r
     {\r
-        auto folderPath = build_tools::RelativePath (folderPathRelativeToProjectFolder, build_tools::RelativePath::projectFolder)\r
-                                       .rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder)\r
-                                       .toUnixStyle();\r
+        switch (path.getRoot())\r
+        {\r
+            case build_tools::RelativePath::projectFolder:\r
+                return getProject().getProjectFolder().getChildFile (path.toUnixStyle());\r
+\r
+            case build_tools::RelativePath::buildTargetFolder:\r
+                return getTargetFolder().getChildFile (path.toUnixStyle());\r
+\r
+            case build_tools::RelativePath::unknown:\r
+                jassertfalse;\r
+        }\r
+\r
+        return {};\r
+    }\r
+\r
+    bool customXcassetsFolderContainsLaunchImage() const\r
+    {\r
+        if (const auto xcassetsFolder = getCustomXcassetsFolder())\r
+            return makeFile (*xcassetsFolder).getChildFile ("LaunchImage.launchimage").exists();\r
+\r
+        return false;\r
+    }\r
+\r
+    void addCustomResourceFolder (const build_tools::RelativePath& path, const String fileType = "folder") const\r
+    {\r
+        jassert (path.getRoot() == build_tools::RelativePath::projectFolder);\r
+\r
+        auto folderPath = path.rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder)\r
+                              .toUnixStyle();\r
 \r
         auto fileRefID = createFileRefID (folderPath);\r
 \r
index 92120566dc7087987007dbb0c2e98a95f026ee68..2c7ebd710b9d019acd752050d780bd95299c47a6 100644 (file)
@@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner
 
@@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70001" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70002" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0"
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner
 
index 67a020720df3134c984c3ba96a8ffb8b5b99cba8..3d05bd8ea1e6a17b6dd46819dad345cd7308a3bd 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x70001",
+                                       "JUCE_PROJUCER_VERSION=0x70002",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
index 9b03accbbe7341acaaf7151af1c039afecea4392..8c216b9fb3dbaa9d6a0b43cafbe419c25c079b31 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index e8f791312db1f58116c7bd08f782dfff4222f61d..aaaf298f3ec8478a282429694a9519513ace1562 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index ff96989196cf5749be7f6386daa05efdc4d07af8..9928fd8d93f9bed4ae099dc8571923f8e210e369 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index 5f251458dd4983ecd1c7d6fc1c25b479daaedfe9..a60b3465dcc5286ac860da2c2176cea928767739 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 91873108fcbb1357eca9109b7ce770439eb597cf..20584fb47a60599473d9e0d38a4aa2b896e7e36e 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index f34e2d5db3bc488d6bb1be70fe957a9881494809..dfe10afe9c06fc5a581cab55a03b8f617383aeba 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index b78d5c1f76196a2bc7fb320813e6937cc1b5f083..db4abf2597a1068b4dcac6a04cddefd0b217feb0 100644 (file)
@@ -92,11 +92,29 @@ int main (int argc, char **argv)
     else\r
         runner.runAllTests (seed);\r
 \r
-    Logger::setCurrentLogger (nullptr);\r
+    std::vector<String> failures;\r
 \r
     for (int i = 0; i < runner.getNumResults(); ++i)\r
-        if (runner.getResult(i)->failures > 0)\r
-            return 1;\r
+    {\r
+        auto* result = runner.getResult (i);\r
+\r
+        if (result->failures > 0)\r
+            failures.push_back (result->unitTestName + " / " + result->subcategoryName + ": " + String (result->failures) + " test failure" + (result->failures > 1 ? "s" : ""));\r
+    }\r
+\r
+    if (! failures.empty())\r
+    {\r
+        logger.writeToLog (newLine + "Test failure summary:" + newLine);\r
+\r
+        for (const auto& failure : failures)\r
+            logger.writeToLog (failure);\r
+\r
+        Logger::setCurrentLogger (nullptr);\r
+        return 1;\r
+    }\r
+\r
+    logger.writeToLog (newLine + "All tests completed successfully");\r
+    Logger::setCurrentLogger (nullptr);\r
 \r
     return 0;\r
 }\r
index acfad0b31bf12f84645a1d889b91b0f58f3ab4be..42b8349d0999de4a7f08ebfb0605b40dbbe55a73 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
index b7d5cfa7de0c255c387de4b839c1a3068181ba37..473d86c6191715d97f9cbf7f23ecfcc6a4ebb2a3 100644 (file)
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
       <Filter>JUCE Modules\juce_core\network</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+      <Filter>JUCE Modules\juce_core\streams</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
       <Filter>JUCE Modules\juce_core\streams</Filter>\r
     </ClInclude>\r
index 2c96fd16c09cd2190751ef3e97299b2d4084f8e0..42eae71cbb0a64c0e5fbb917b43c867524cd2221 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_analytics\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE analytics classes\r
   description:        Classes to collect analytics and send to destinations\r
   website:            http://www.juce.com/juce\r
index 5a7ad2f579f9c6ca8aefc0df6a25048add9b2609..46d5883abc5216cd6e47d9b6cc9ae6810f37c21b 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_basics\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE audio and MIDI data classes\r
   description:        Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
   website:            http://www.juce.com/juce\r
index 1e80fb2063fdc71e6ed2528224db0b659e2e9511..6695c0aca10f4938f20e4cfd50e44ef42abcd4e2 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_devices\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE audio and MIDI I/O device classes\r
   description:        Classes to play and record from audio and MIDI I/O devices\r
   website:            http://www.juce.com/juce\r
index a3821a6e3407152f5400dca36bafc754ccefcf83..12c8b3389d081b56b9f341ae370ba7c795b797f1 100644 (file)
@@ -293,10 +293,8 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
             options |= (AVAudioSessionCategoryOptionDefaultToSpeaker\r
                       | AVAudioSessionCategoryOptionAllowBluetooth);\r
 \r
-           #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
             if (@available (iOS 10.0, *))\r
                 options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;\r
-           #endif\r
         }\r
 \r
         JUCE_NSERROR_CHECK ([[AVAudioSession sharedInstance] setCategory: category\r
@@ -705,13 +703,17 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
     JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
     Image getIcon (int size)\r
     {\r
-        if (interAppAudioConnected)\r
+        if (@available (macCatalyst 14.0, *))\r
         {\r
-            UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size);\r
-            if (hostUIImage != nullptr)\r
-                return juce_createImageFromUIImage (hostUIImage);\r
+            if (interAppAudioConnected)\r
+            {\r
+                UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size);\r
+                if (hostUIImage != nullptr)\r
+                    return juce_createImageFromUIImage (hostUIImage);\r
+            }\r
         }\r
-        return Image();\r
+\r
+        return {};\r
     }\r
     JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
    #endif\r
@@ -731,7 +733,6 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
                                             &dataSize);\r
         if (err == noErr)\r
         {\r
-           #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
             if (@available (iOS 10.0, *))\r
             {\r
                 [[UIApplication sharedApplication] openURL: (NSURL*) hostUrl\r
@@ -740,7 +741,6 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
 \r
                 return;\r
             }\r
-           #endif\r
 \r
             JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
             [[UIApplication sharedApplication] openURL: (NSURL*) hostUrl];\r
index da65398737fef1ae6e054bf2996a4ec16313e4ca..8e389f52ce9a571e76c53a5f84e505580bf0911e 100644 (file)
@@ -274,7 +274,8 @@ public:
         if (! remainingSamples.isEmpty())\r
             for (int i = numDestChannels; --i >= 0;)\r
                 if (destSamples[i] != nullptr)\r
-                    zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int));\r
+                    zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile),\r
+                             (size_t) remainingSamples.getLength() * sizeof (int));\r
 \r
         return true;\r
     }\r
index d1e0efdb60c4d07fcb5e1bc0e9d5e1a862be5a1b..b47c4a4d39a8eac890930cb44f267e19230af0e5 100644 (file)
@@ -216,7 +216,8 @@ public:
         if (! remainingSamples.isEmpty())\r
             for (int i = numDestChannels; --i >= 0;)\r
                 if (destSamples[i] != nullptr)\r
-                    zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int));\r
+                    zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile),\r
+                             (size_t) remainingSamples.getLength() * sizeof (int));\r
 \r
         return true;\r
     }\r
index 6586d5c91614a781f279dd91b58b22867f8df66f..8eb69c2c9684093e9ffaf0d653f83bcbb2c563d7 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_formats\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE audio file format codecs\r
   description:        Classes for reading and writing various audio file formats.\r
   website:            http://www.juce.com/juce\r
index f9aaafe5c933d05a8fb55f465f4f342bd6b2b058..d1b055e69724bfd62e2d28391bed82ef871fa358 100644 (file)
@@ -41,28 +41,4 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100)
 JUCE_END_IGNORE_WARNINGS_MSVC\r
 JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-namespace juce\r
-{\r
-\r
-#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept\r
-{\r
-   #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
-    DBG (diagnosis);\r
-   #endif\r
-\r
-    logAssertion (file, line);\r
-\r
-   #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
-    if (juce_isRunningUnderDebugger())\r
-        JUCE_BREAK_IN_DEBUGGER;\r
-    JUCE_ANALYZER_NORETURN\r
-   #endif\r
-}\r
-#endif\r
-\r
-ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name);\r
-\r
-} // namespace juce\r
-\r
 #endif\r
diff --git a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h
deleted file mode 100644 (file)
index 766c39c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2022 - Raw Material Software Limited\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
-   Agreement and JUCE Privacy Policy.\r
-\r
-   End User License Agreement: www.juce.com/juce-7-licence\r
-   Privacy Policy: www.juce.com/juce-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-#if JucePlugin_Enable_ARA\r
-// Configure ARA debug support prior to including ARA SDK headers\r
-namespace juce\r
-{\r
-\r
-#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-\r
-#define ARA_ENABLE_INTERNAL_ASSERTS 1\r
-\r
-extern JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept;\r
-\r
-#if !defined(ARA_HANDLE_ASSERT)\r
-#define ARA_HANDLE_ASSERT(file, line, diagnosis)    juce::handleARAAssertion (file, line, diagnosis)\r
-#endif\r
-\r
-#if JUCE_LOG_ASSERTIONS\r
-#define ARA_ENABLE_DEBUG_OUTPUT 1\r
-#endif\r
-\r
-#else\r
-\r
-#define ARA_ENABLE_INTERNAL_ASSERTS 0\r
-\r
-#endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-\r
-} // namespace juce\r
-\r
-#endif\r
index dc2e6cc830ee574c15367541cbfa4fd87bc1abbb..6fba7a1e447890da9ff1532ace261d9921ccd02f 100644 (file)
@@ -23,7 +23,7 @@
   ==============================================================================\r
 */\r
 \r
-#if JucePlugin_Build_LV2\r
+#if JucePlugin_Build_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
 \r
 #ifndef _SCL_SECURE_NO_WARNINGS\r
  #define _SCL_SECURE_NO_WARNINGS\r
index 1e77dee85825cf6b7f2d59b5b9a1d6fe3391f9d3..b80ae5a5bbd09a02e1dbd4117f614363ff47ef86 100644 (file)
@@ -125,6 +125,34 @@ using namespace Steinberg;
 //==============================================================================\r
 #if JUCE_LINUX || JUCE_BSD\r
 \r
+enum class HostMessageThreadAttached { no, yes };\r
+\r
+class HostMessageThreadState\r
+{\r
+public:\r
+    template <typename Callback>\r
+    void setStateWithAction (HostMessageThreadAttached stateIn, Callback&& action)\r
+    {\r
+        const std::lock_guard<std::mutex> lock { m };\r
+        state = stateIn;\r
+        action();\r
+    }\r
+\r
+    void assertHostMessageThread()\r
+    {\r
+        const std::lock_guard<std::mutex> lock { m };\r
+\r
+        if (state == HostMessageThreadAttached::no)\r
+            return;\r
+\r
+        JUCE_ASSERT_MESSAGE_THREAD\r
+    }\r
+\r
+private:\r
+    HostMessageThreadAttached state = HostMessageThreadAttached::no;\r
+    std::mutex m;\r
+};\r
+\r
 class EventHandler final  : public Steinberg::Linux::IEventHandler,\r
                             private LinuxEventLoopInternal::Listener\r
 {\r
@@ -141,7 +169,8 @@ public:
         LinuxEventLoopInternal::deregisterLinuxEventLoopListener (*this);\r
 \r
         if (! messageThread->isRunning())\r
-            messageThread->start();\r
+            hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::no,\r
+                                                       [this]() { messageThread->start(); });\r
     }\r
 \r
     JUCE_DECLARE_VST3_COM_REF_METHODS\r
@@ -173,6 +202,17 @@ public:
             refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.erase (runLoop); });\r
     }\r
 \r
+    /* Asserts if it can be established that the calling thread is different from the host's message\r
+       thread.\r
+\r
+       On Linux this can only be determined if the host has already registered its run loop. Until\r
+       then JUCE messages are serviced by a background thread internal to the plugin.\r
+    */\r
+    static void assertHostMessageThread()\r
+    {\r
+        hostMessageThreadState.assertHostMessageThread();\r
+    }\r
+\r
 private:\r
     //==============================================================================\r
     /*  Connects all known FDs to a single host event loop instance. */\r
@@ -240,7 +280,8 @@ private:
             if (messageThread->isRunning())\r
                 messageThread->stop();\r
 \r
-            MessageManager::getInstance()->setCurrentThreadAsMessageThread();\r
+            hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::yes,\r
+                                                       [] { MessageManager::getInstance()->setCurrentThreadAsMessageThread(); });\r
         }\r
     }\r
 \r
@@ -283,13 +324,26 @@ private:
     std::multiset<Steinberg::Linux::IRunLoop*> hostRunLoops;\r
     AttachedEventLoop attachedEventLoop;\r
 \r
+    static HostMessageThreadState hostMessageThreadState;\r
+\r
     //==============================================================================\r
     JUCE_DECLARE_NON_MOVEABLE (EventHandler)\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventHandler)\r
 };\r
 \r
+HostMessageThreadState EventHandler::hostMessageThreadState;\r
+\r
 #endif\r
 \r
+static void assertHostMessageThread()\r
+{\r
+   #if JUCE_LINUX || JUCE_BSD\r
+    EventHandler::assertHostMessageThread();\r
+   #else\r
+    JUCE_ASSERT_MESSAGE_THREAD\r
+   #endif\r
+}\r
+\r
 //==============================================================================\r
 class InParameterChangedCallbackSetter\r
 {\r
@@ -968,25 +1022,8 @@ public:
     //==============================================================================\r
     tresult PLUGIN_API setComponentState (IBStream* stream) override\r
     {\r
-        if (! MessageManager::existsAndIsCurrentThread())\r
-       #if JUCE_LINUX || JUCE_BSD\r
-        {\r
-            tresult result = kResultOk;\r
-            WaitableEvent finishedEvent;\r
-\r
-            MessageManager::callAsync ([&]\r
-            {\r
-                result = setComponentState (stream);\r
-                finishedEvent.signal();\r
-            });\r
-\r
-            finishedEvent.wait();\r
-            return result;\r
-        }\r
-       #else\r
         // As an IEditController member, the host should only call this from the message thread.\r
-        jassertfalse;\r
-       #endif\r
+        assertHostMessageThread();\r
 \r
         if (auto* pluginInstance = getPluginInstance())\r
         {\r
@@ -1965,7 +2002,12 @@ private:
                     owner->lastScaleFactorReceived = editorScaleFactor;\r
 \r
                 if (component != nullptr)\r
+                {\r
+                   #if JUCE_LINUX || JUCE_BSD\r
+                    const MessageManagerLock mmLock;\r
+                   #endif\r
                     component->setEditorScaleFactor (editorScaleFactor);\r
+                }\r
             }\r
 \r
             return kResultTrue;\r
@@ -2776,7 +2818,7 @@ public:
     {\r
         // The VST3 spec requires that this function is called from the UI thread.\r
         // If this assertion fires, your host is misbehaving!\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        assertHostMessageThread();\r
 \r
         if (state == nullptr)\r
             return kInvalidArgument;\r
index 3e4cdbb576ff3979522a44a6c42454dee791d13a..39fd87e8e23f03ccf16fb3e9ff97a99a7b6f39b0 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_plugin_client\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE audio plugin wrapper classes\r
   description:        Classes for building VST, VST3, AU, AUv3 and AAX plugins.\r
   website:            http://www.juce.com/juce\r
 #endif\r
 \r
 #include "utility/juce_CreatePluginFilter.h"\r
-\r
-#if JucePlugin_Enable_ARA\r
- #include "ARA/juce_ARA_Wrapper.h"\r
-#endif\r
index d118366faeea346ad2be00a7737a4d4bebb8d912..2deb3f823fad8070ffca8be598dedb3e9e7d9672 100644 (file)
@@ -23,9 +23,7 @@
   ==============================================================================\r
 */\r
 \r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS))\r
-\r
-#include <ARA_Library/Debug/ARADebug.h>\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX))\r
 \r
 namespace juce\r
 {\r
@@ -48,8 +46,21 @@ static ARA::ARAInterfaceConfiguration createInterfaceConfig (const ARA::ARAFacto
                                &assertFunction);\r
 }\r
 \r
+/*  If the provided ARAFactory is not yet in use it constructs a new shared_ptr that will call the\r
+    provided onDelete function inside the custom deleter of this new shared_ptr instance.\r
+\r
+    The onDelete function is responsible for releasing the resources that guarantee the validity of\r
+    the wrapped ARAFactory*.\r
+\r
+    If however the ARAFactory is already in use the function will just return a copy of the already\r
+    existing shared_ptr and call the onDelete function immediately. This is to ensure that the\r
+    ARAFactory is only uninitialised when no plugin instance can be using it.\r
+\r
+    On both platforms the onDelete function is used to release resources that ensure that the module\r
+    providing the ARAFactory* remains loaded.\r
+*/\r
 static std::shared_ptr<const ARA::ARAFactory> getOrCreateARAFactory (const ARA::ARAFactory* ptr,\r
-                                                                     std::function<void (const ARA::ARAFactory*)> onDelete)\r
+                                                                     std::function<void()> onDelete)\r
 {\r
     JUCE_ASSERT_MESSAGE_THREAD\r
 \r
@@ -58,14 +69,17 @@ static std::shared_ptr<const ARA::ARAFactory> getOrCreateARAFactory (const ARA::
     auto& cachePtr = cache[ptr];\r
 \r
     if (const auto obj = cachePtr.lock())\r
+    {\r
+        onDelete();\r
         return obj;\r
+    }\r
 \r
     const auto interfaceConfig = createInterfaceConfig (ptr);\r
     ptr->initializeARAWithConfiguration (&interfaceConfig);\r
     const auto obj = std::shared_ptr<const ARA::ARAFactory> (ptr, [deleter = std::move (onDelete)] (const ARA::ARAFactory* factory)\r
                                                              {\r
                                                                  factory->uninitializeARA();\r
-                                                                 deleter (factory);\r
+                                                                 deleter();\r
                                                              });\r
     cachePtr = obj;\r
     return obj;\r
index 4811733bf8704ac5d9ec4a8c2bcdadd503557ebf..bbf55c5a7005663b7721c96efc2d9c6b3e43c622 100644 (file)
@@ -75,6 +75,8 @@ struct ARAFactoryResult
     String errorMessage;\r
 };\r
 \r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-field-initializers")\r
+\r
 template <typename Obj, typename Member, typename... Ts>\r
 constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts)\r
 {\r
@@ -82,4 +84,6 @@ constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts)
              std::forward<Ts> (ts)... };\r
 }\r
 \r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
 } // namespace juce\r
index d406ffd240a08b3577bd7c83c2bc5c3089de1063..46204dea43638c774892ab5cc20e496c930065d6 100644 (file)
   ==============================================================================\r
 */\r
 \r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS))\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX))\r
 \r
 #include "juce_ARAHosting.h"\r
-#include <ARA_Library/Debug/ARADebug.h>\r
 \r
 #include <ARA_Library/Dispatch/ARAHostDispatch.cpp>\r
 \r
@@ -278,8 +277,18 @@ class ARAHostDocumentController::Impl
 public:\r
     Impl (ARAFactoryWrapper araFactoryIn,\r
           std::unique_ptr<ARA::Host::DocumentControllerHostInstance>&& dcHostInstanceIn,\r
-          const ARA::ARADocumentControllerInstance* documentControllerInstance)\r
+          const ARA::ARADocumentControllerInstance* documentControllerInstance,\r
+          std::unique_ptr<ARA::Host::AudioAccessControllerInterface>&& audioAccessControllerIn,\r
+          std::unique_ptr<ARA::Host::ArchivingControllerInterface>&& archivingControllerIn,\r
+          std::unique_ptr<ARA::Host::ContentAccessControllerInterface>&& contentAccessControllerIn,\r
+          std::unique_ptr<ARA::Host::ModelUpdateControllerInterface>&& modelUpdateControllerIn,\r
+          std::unique_ptr<ARA::Host::PlaybackControllerInterface>&& playbackControllerIn)\r
         : araFactory (std::move (araFactoryIn)),\r
+          audioAccessController (std::move (audioAccessControllerIn)),\r
+          archivingController (std::move (archivingControllerIn)),\r
+          contentAccessController (std::move (contentAccessControllerIn)),\r
+          modelUpdateController (std::move (modelUpdateControllerIn)),\r
+          playbackController (std::move (playbackControllerIn)),\r
           dcHostInstance (std::move (dcHostInstanceIn)),\r
           documentController (documentControllerInstance)\r
     {\r
@@ -300,16 +309,23 @@ public:
                     std::unique_ptr<ARA::Host::PlaybackControllerInterface>&& playbackController)\r
     {\r
         std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance =\r
-            std::make_unique<ARA::Host::DocumentControllerHostInstance> (audioAccessController.release(),\r
-                                                                         archivingController.release(),\r
-                                                                         contentAccessController.release(),\r
-                                                                         modelUpdateController.release(),\r
-                                                                         playbackController.release());\r
+            std::make_unique<ARA::Host::DocumentControllerHostInstance> (audioAccessController.get(),\r
+                                                                         archivingController.get(),\r
+                                                                         contentAccessController.get(),\r
+                                                                         modelUpdateController.get(),\r
+                                                                         playbackController.get());\r
 \r
         const auto documentProperties = makeARASizedStruct (&ARA::ARADocumentProperties::name, documentName.toRawUTF8());\r
 \r
         if (auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties))\r
-            return std::make_unique<Impl> (std::move (araFactory), std::move (dcHostInstance), dci);\r
+            return std::make_unique<Impl> (std::move (araFactory),\r
+                                           std::move (dcHostInstance),\r
+                                           dci,\r
+                                           std::move (audioAccessController),\r
+                                           std::move (archivingController),\r
+                                           std::move (contentAccessController),\r
+                                           std::move (modelUpdateController),\r
+                                           std::move (playbackController));\r
 \r
         return {};\r
     }\r
@@ -386,6 +402,13 @@ public:
 \r
 private:\r
     ARAFactoryWrapper araFactory;\r
+\r
+    std::unique_ptr<ARA::Host::AudioAccessControllerInterface>   audioAccessController;\r
+    std::unique_ptr<ARA::Host::ArchivingControllerInterface>     archivingController;\r
+    std::unique_ptr<ARA::Host::ContentAccessControllerInterface> contentAccessController;\r
+    std::unique_ptr<ARA::Host::ModelUpdateControllerInterface>   modelUpdateController;\r
+    std::unique_ptr<ARA::Host::PlaybackControllerInterface>      playbackController;\r
+\r
     std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance;\r
     ARA::Host::DocumentController documentController;\r
 };\r
index 632cb824bca35eaef5ca86fb38dc207322ee182e..08862331a2afd51947e647cf8ebb969ec8d0b7c6 100644 (file)
@@ -25,7 +25,7 @@
 \r
 #pragma once\r
 \r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) || DOXYGEN\r
 \r
 // Include ARA SDK headers\r
 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments")\r
index 53c50487654b3b2325fe61631a0744d038fe3598..162484190fc3ed7caeeaca37ba856fbbdca8c1ee 100644 (file)
@@ -67,13 +67,4 @@ private:
 \r
 #endif\r
 \r
-//==============================================================================\r
-#if (! defined (MAC_OS_X_VERSION_10_12)) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12)\r
-enum\r
-{\r
-    /** Custom AudioUnit property used to indicate MPE support */\r
-    kAudioUnitProperty_SupportsMPE = 58\r
-};\r
-#endif\r
-\r
 }\r
index ec695c4f81985227e6a2684354fe3c95bc05905d..e5d40290fc4a138ea251adcd4bbb9bae278016bf 100644 (file)
@@ -488,7 +488,7 @@ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (AudioUnitSharedPtr
         {\r
             jassert (audioUnitFactory.outFactory != nullptr);\r
             return getOrCreateARAFactory (audioUnitFactory.outFactory,\r
-                                          [owningAuPtr = std::move (audioUnit)] (const ARA::ARAFactory*) {});\r
+                                          [owningAuPtr = std::move (audioUnit)]() {});\r
         }\r
     }\r
    #else\r
index 53419384ff7e0b3b7a1a5ddae11fafb8489d9d40..9ac149d798584cbf8be240b51be88baa98d45b95 100644 (file)
@@ -23,7 +23,7 @@
   ==============================================================================\r
 */\r
 \r
-#if JUCE_PLUGINHOST_LV2\r
+#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
 \r
 #include "juce_LV2Common.h"\r
 #include "juce_LV2Resources.h"\r
index 0518de268ed9a255e3ebea4f1a7aa12145e60a63..f2eefe3f139259d85f9da27597f05a220966c18c 100644 (file)
@@ -26,7 +26,7 @@
 namespace juce\r
 {\r
 \r
-#if JUCE_PLUGINHOST_LV2 || DOXYGEN\r
+#if (JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))) || DOXYGEN\r
 \r
 /**\r
     Implements a plugin format for LV2 plugins.\r
index 31bf6ff482648849da0800ac7fd748f8c45e4c7f..cfa7b3cf26fc1a513503f5f3127e598a5f529c00 100644 (file)
@@ -29,7 +29,7 @@
 #include "juce_VST3Common.h"\r
 #include "juce_ARACommon.h"\r
 \r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
 #include <ARA_API/ARAVST3.h>\r
 \r
 namespace ARA\r
@@ -840,7 +840,7 @@ struct DescriptionFactory
         // The match is determined by the two classes having the same name.\r
         std::unordered_set<String> araMainFactoryClassNames;\r
 \r
-       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+       #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
         for (Steinberg::int32 i = 0; i < numClasses; ++i)\r
         {\r
             PClassInfo info;\r
@@ -1390,7 +1390,7 @@ static int compareWithString (Type (&charArray)[N], const String& str)
 template <typename Callback>\r
 static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb)\r
 {\r
-   #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+   #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
     const auto numClasses = pluginFactory->countClasses();\r
     for (Steinberg::int32 i = 0; i < numClasses; ++i)\r
     {\r
@@ -1413,7 +1413,7 @@ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (Steinberg::IPluginF
 {\r
     std::shared_ptr<const ARA::ARAFactory> factory;\r
 \r
-   #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+   #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
     forEachARAFactory (pluginFactory,\r
                        [&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo)\r
                        {\r
@@ -1424,7 +1424,7 @@ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (Steinberg::IPluginF
                                    == Steinberg::kResultOk)\r
                                {\r
                                    factory = getOrCreateARAFactory (source->getFactory(),\r
-                                                                    [source] (const ARA::ARAFactory*) { source->release(); });\r
+                                                                    [source]() { source->release(); });\r
                                    return false;\r
                                }\r
                                jassert (source == nullptr);\r
index 499c39ccbe41dfabab0a89229d22291c9d7256f9..fbbc1a4f6be3f376cb755ea3ab90b75f226d9971 100644 (file)
@@ -3262,10 +3262,9 @@ private:
         if (! isWindowSizeCorrectForPlugin (w, h))\r
         {\r
             updateSizeFromEditor (w, h);\r
+            embeddedComponent.updateHWNDBounds();\r
             sizeCheckCount = 0;\r
         }\r
-\r
-        embeddedComponent.updateHWNDBounds();\r
     }\r
 \r
     void checkPluginWindowSize()\r
@@ -3349,6 +3348,7 @@ private:
 \r
                    #if JUCE_WINDOWS\r
                     r->resizeToFit();\r
+                    r->embeddedComponent.updateHWNDBounds();\r
                    #endif\r
                     r->componentMovedOrResized (true, true);\r
                 }\r
index df3a1e8a9671b658d3eeb95a1b730f1ac3b3525b..b0ff4b67b46d9b8e8fb99921369b7ca87095200e 100644 (file)
@@ -229,7 +229,7 @@ private:
   #include "format_types/juce_VST3PluginFormat_test.cpp"\r
  #endif\r
 \r
- #if JUCE_PLUGINHOST_LV2\r
+ #if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
   #include "format_types/juce_LV2PluginFormat_test.cpp"\r
  #endif\r
 #endif\r
index 1664b90aeadc864fd7e74002a008e497b840b3a8..bf9b568d0b5dcc8cf8eaaf5d9543474391f68d42 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_processors\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE audio processor classes\r
   description:        Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
   website:            http://www.juce.com/juce\r
 #include "utilities/juce_ParameterAttachments.h"\r
 #include "utilities/juce_AudioProcessorValueTreeState.h"\r
 #include "utilities/juce_PluginHostType.h"\r
+#include "utilities/ARA/juce_ARADebug.h"\r
 #include "utilities/ARA/juce_ARA_utils.h"\r
 \r
 //==============================================================================\r
index d8e35ca4e1608774093469ffea1a8f33b9368ba4..55ac39e46cb11da645a05b5dfd8dde4fea21022d 100644 (file)
 #include <juce_core/system/juce_CompilerWarnings.h>\r
 #include <juce_core/system/juce_TargetPlatform.h>\r
 \r
+#include "utilities/ARA/juce_ARADebug.h"\r
+\r
 /* Having WIN32_LEAN_AND_MEAN defined at the point of including ARADebug.c will produce warnings.\r
 \r
    To prevent such problems it's easiest to have it in its own translation unit.\r
 */\r
 \r
-#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS)\r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
 \r
 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes")\r
  #include <ARA_Library/Debug/ARADebug.c>\r
index 22b2d11818dd038b82ca0c511daa3ad9b275d4a6..6af13097c7bc7365e84470e366a29e3293709f17 100644 (file)
@@ -23,7 +23,7 @@
   ==============================================================================\r
 */\r
 \r
-#if JUCE_PLUGINHOST_LV2\r
+#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
  #ifndef _CRT_SECURE_NO_WARNINGS\r
   #define _CRT_SECURE_NO_WARNINGS\r
  #endif\r
diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h b/modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h
new file mode 100644 (file)
index 0000000..1f80a51
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#pragma once\r
+\r
+#include <juce_core/system/juce_PlatformDefs.h>\r
+\r
+#ifndef JUCE_API\r
+ #define JUCE_API\r
+#endif\r
+\r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+ #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
+  #define ARA_ENABLE_INTERNAL_ASSERTS 1\r
+ #else\r
+  #define ARA_ENABLE_INTERNAL_ASSERTS 0\r
+ #endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
+\r
+//==============================================================================\r
+ #if ARA_ENABLE_INTERNAL_ASSERTS\r
+\r
+JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept;\r
+\r
+  #if !defined(ARA_HANDLE_ASSERT)\r
+   #define ARA_HANDLE_ASSERT(file, line, diagnosis)    juce::handleARAAssertion (file, line, diagnosis)\r
+  #endif\r
+\r
+  #if JUCE_LOG_ASSERTIONS\r
+   #define ARA_ENABLE_DEBUG_OUTPUT 1\r
+  #endif\r
+\r
+ #endif\r
+\r
+} // namespace juce\r
+\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes")\r
+ #include <ARA_Library/Debug/ARADebug.h>\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+#endif\r
index cbbe5df00a3a11f380c2efabaf73cdea85535d4c..dc7414c5b3ed1a8c29fafa0509324c50f41be9e7 100644 (file)
@@ -799,7 +799,7 @@ bool ARAOutputStream::write (const void* dataToWrite, size_t numberOfBytes)
     if (! archiveWriter->writeBytesToArchive ((ARA::ARASize) position, numberOfBytes, (const ARA::ARAByte*) dataToWrite))\r
         return false;\r
 \r
-    position += numberOfBytes;\r
+    position += (int64) numberOfBytes;\r
     return true;\r
 }\r
 \r
index 01762924e4d7736ed60b9799a3f4e04476481018..e23aeded75bbd527a812fd4f8af7f3d3b363f4ff 100644 (file)
@@ -134,6 +134,8 @@ public:
         return false;\r
     }\r
 \r
+    using ARARenderer::processBlock;\r
+\r
     // Shadowing templated getters to default to JUCE versions of the returned classes\r
     /** Returns the PlaybackRegions\r
      *\r
@@ -195,6 +197,8 @@ public:
         return true;\r
     }\r
 \r
+    using ARARenderer::processBlock;\r
+\r
 private:\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorRenderer)\r
 };\r
index ed914026941182024b94e91437fe19f527b11e6d..9109d198b8916341cbb619b353a4d746dfbdd6bc 100644 (file)
   ==============================================================================\r
 */\r
 \r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
+namespace juce\r
+{\r
+ #if ARA_ENABLE_INTERNAL_ASSERTS\r
+JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept\r
+{\r
+  #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
+    DBG (diagnosis);\r
+  #endif\r
+\r
+    logAssertion (file, line);\r
+\r
+  #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
+    if (juce_isRunningUnderDebugger())\r
+        JUCE_BREAK_IN_DEBUGGER;\r
+    JUCE_ANALYZER_NORETURN\r
+  #endif\r
+}\r
+ #endif\r
+}\r
+#endif\r
+\r
 #if JucePlugin_Enable_ARA\r
 #include "juce_ARADocumentControllerCommon.cpp"\r
 #include "juce_ARADocumentController.cpp"\r
 #include "juce_ARAModelObjects.cpp"\r
 #include "juce_ARAPlugInInstanceRoles.cpp"\r
 #include "juce_AudioProcessor_ARAExtensions.cpp"\r
+\r
+ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name);\r
 #endif\r
index 847425ac535622c4fdf421c511f4268a568ecdec..6d0c1a72dced0692e3f4923b07d9441709e6b4c3 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_utils\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE extra audio utility classes\r
   description:        Classes for audio-related GUI and miscellaneous tasks.\r
   website:            http://www.juce.com/juce\r
index 87cbb4ae91af0c023b3401fce3394e656f17809e..cf952719367c9c8667840644ab84658a210044d6 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_box2d\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE wrapper for the Box2D physics engine\r
   description:        The Box2D physics engine and some utility classes.\r
   website:            http://www.juce.com/juce\r
index f81ec27f879caf90b0aa551b692f267d2fe6ebb7..e8ee95ac8c3128f1fc2575e2c4a42b3450cc62c8 100644 (file)
@@ -516,9 +516,11 @@ public:
 \r
     /** Copies a file.\r
 \r
-        Tries to copy a file to a different location.\r
-        If the target file already exists, this will attempt to delete it first, and\r
-        will fail if this can't be done.\r
+        Tries to copy a file to a different location. If the target file already exists,\r
+        this will attempt to delete it first, and will fail if this can't be done.\r
+\r
+        Note that the target file isn't the directory to put it in, it's the actual\r
+        filename that you want the new file to have.\r
 \r
         @returns    true if the operation succeeds\r
     */\r
index 067a189abc50f45c412a8533a005125743bb8629..e79c1c91f40756cbbf0952f2ad7bc9f99865a514 100644 (file)
 \r
 #undef check\r
 \r
-//==============================================================================\r
-#ifndef    JUCE_STANDALONE_APPLICATION\r
- JUCE_COMPILER_WARNING ("Please re-save your project with the latest Projucer version to avoid this warning")\r
- #define   JUCE_STANDALONE_APPLICATION 0\r
-#endif\r
-\r
 //==============================================================================\r
 #include "containers/juce_AbstractFifo.cpp"\r
 #include "containers/juce_ArrayBase.cpp"\r
index 4f6b2838f31256abbf0c327bbfe87d4a1e0ff529..1aafb16f06ce2ccb7da7d2d5854944f8ba65ca3c 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_core\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE core classes\r
   description:        The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.\r
   website:            http://www.juce.com/juce\r
@@ -344,6 +344,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC
 #include "memory/juce_AllocationHooks.h"\r
 #include "memory/juce_Reservoir.h"\r
 #include "files/juce_AndroidDocument.h"\r
+#include "streams/juce_AndroidDocumentInputSource.h"\r
 \r
 #if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS)\r
  #include "native/juce_mac_ObjCHelpers.h"\r
index c09e254718d6f05e4a37218105f440a0cd558356..3f1cd113db1f5c77259c066041f6741928fdf289 100644 (file)
@@ -46,7 +46,7 @@ namespace juce
     New code:\r
 \r
         RuntimePermissions::request (\r
-            RuntimePermissions::audioRecording,\r
+            RuntimePermissions::recordAudio,\r
             [this] (bool wasGranted)\r
             {\r
                  if (! wasGranted)\r
index c45ac6e3b3619c762e8d90f56896aa0a45656b78..e0d78f4d8a3d8fa9896477509bca5c4f0ff06daf 100644 (file)
 #if JUCE_MAC || JUCE_IOS\r
 \r
  #if JUCE_IOS\r
-  #if JUCE_MODULE_AVAILABLE_juce_opengl && defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
+  #if JUCE_MODULE_AVAILABLE_juce_opengl\r
    #define GLES_SILENCE_DEPRECATION 1\r
   #endif\r
 \r
+  #define Component CarbonDummyCompName\r
   #import <Foundation/Foundation.h>\r
+  #undef Component\r
+\r
   #import <UIKit/UIKit.h>\r
   #import <CoreData/CoreData.h>\r
   #import <MobileCoreServices/MobileCoreServices.h>\r
   #include <sys/fcntl.h>\r
  #else\r
-  #if JUCE_MODULE_AVAILABLE_juce_opengl && defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14\r
+  #if JUCE_MODULE_AVAILABLE_juce_opengl\r
    #define GL_SILENCE_DEPRECATION 1\r
   #endif\r
 \r
   #import <Cocoa/Cocoa.h>\r
-  #if (! defined MAC_OS_X_VERSION_10_12) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12\r
-   #define NSEventModifierFlagCommand       NSCommandKeyMask\r
-   #define NSEventModifierFlagControl       NSControlKeyMask\r
-   #define NSEventModifierFlagHelp          NSHelpKeyMask\r
-   #define NSEventModifierFlagNumericPad    NSNumericPadKeyMask\r
-   #define NSEventModifierFlagOption        NSAlternateKeyMask\r
-   #define NSEventModifierFlagShift         NSShiftKeyMask\r
-   #define NSCompositingOperationSourceOver NSCompositeSourceOver\r
-   #define NSEventMaskApplicationDefined    NSApplicationDefinedMask\r
-   #define NSEventTypeApplicationDefined    NSApplicationDefined\r
-   #define NSEventTypeCursorUpdate          NSCursorUpdate\r
-   #define NSEventTypeMouseMoved            NSMouseMoved\r
-   #define NSEventTypeLeftMouseDown         NSLeftMouseDown\r
-   #define NSEventTypeRightMouseDown        NSRightMouseDown\r
-   #define NSEventTypeOtherMouseDown        NSOtherMouseDown\r
-   #define NSEventTypeLeftMouseUp           NSLeftMouseUp\r
-   #define NSEventTypeRightMouseUp          NSRightMouseUp\r
-   #define NSEventTypeOtherMouseUp          NSOtherMouseUp\r
-   #define NSEventTypeLeftMouseDragged      NSLeftMouseDragged\r
-   #define NSEventTypeRightMouseDragged     NSRightMouseDragged\r
-   #define NSEventTypeOtherMouseDragged     NSOtherMouseDragged\r
-   #define NSEventTypeScrollWheel           NSScrollWheel\r
-   #define NSEventTypeKeyDown               NSKeyDown\r
-   #define NSEventTypeKeyUp                 NSKeyUp\r
-   #define NSEventTypeFlagsChanged          NSFlagsChanged\r
-   #define NSEventMaskAny                   NSAnyEventMask\r
-   #define NSWindowStyleMaskBorderless      NSBorderlessWindowMask\r
-   #define NSWindowStyleMaskClosable        NSClosableWindowMask\r
-   #define NSWindowStyleMaskFullScreen      NSFullScreenWindowMask\r
-   #define NSWindowStyleMaskMiniaturizable  NSMiniaturizableWindowMask\r
-   #define NSWindowStyleMaskResizable       NSResizableWindowMask\r
-   #define NSWindowStyleMaskTitled          NSTitledWindowMask\r
-   #define NSAlertStyleCritical             NSCriticalAlertStyle\r
-   #define NSControlSizeRegular             NSRegularControlSize\r
-   #define NSEventTypeMouseEntered          NSMouseEntered\r
-   #define NSEventTypeMouseExited           NSMouseExited\r
-   #define NSAlertStyleInformational        NSInformationalAlertStyle\r
-   #define NSEventTypeTabletPoint           NSTabletPoint\r
-   #define NSEventTypeTabletProximity       NSTabletProximity\r
-   #define NSEventTypeFlagsChanged          NSFlagsChanged\r
-   #define NSEventTypeAppKitDefined         NSAppKitDefined\r
-   #define NSEventTypeSystemDefined         NSSystemDefined\r
-   #define NSEventTypeApplicationDefined    NSApplicationDefined\r
-   #define NSEventTypePeriodic              NSPeriodic\r
-   #define NSEventTypeSmartMagnify          NSEventTypeSmartMagnify\r
-  #endif\r
   #import <CoreAudio/HostTime.h>\r
   #include <sys/dir.h>\r
  #endif\r
index 5b09605fc1905ea3d27a74c4482e3320927c8a60..e3dba249e46e29d6c12a29e98fc57226d7864427 100644 (file)
@@ -417,14 +417,18 @@ struct AndroidDocument::Utils
             return false;\r
         }\r
 \r
-        std::unique_ptr<InputStream>  createInputStream()  const override\r
+        std::unique_ptr<InputStream> createInputStream() const override\r
         {\r
-            return makeStream<AndroidContentUriInputStream>  (AndroidStreamHelpers::StreamKind::input);\r
+            auto result = std::make_unique<AndroidContentUriInputStream> (uri);\r
+            return result->openedSuccessfully() ? std::move (result) : nullptr;\r
         }\r
 \r
         std::unique_ptr<OutputStream> createOutputStream() const override\r
         {\r
-            return makeStream<AndroidContentUriOutputStream> (AndroidStreamHelpers::StreamKind::output);\r
+            auto stream = AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::output);\r
+\r
+            return stream.get() != nullptr ? std::make_unique<AndroidContentUriOutputStream> (std::move (stream))\r
+                                           : nullptr;\r
         }\r
 \r
         AndroidDocumentInfo getInfo() const override\r
@@ -507,15 +511,6 @@ struct AndroidDocument::Utils
         NativeInfo getNativeInfo() const override { return { uri }; }\r
 \r
     private:\r
-        template <typename Stream>\r
-        std::unique_ptr<Stream> makeStream (AndroidStreamHelpers::StreamKind kind) const\r
-        {\r
-            auto stream = AndroidStreamHelpers::createStream (uri, kind);\r
-\r
-            return stream.get() != nullptr ? std::make_unique<Stream> (std::move (stream))\r
-                                           : nullptr;\r
-        }\r
-\r
         GlobalRef uri;\r
     };\r
 \r
index 1c45ce973cd3ebd98c4d9306d329808f5f40741f..efd43534d20053b2e0464e1a985022880575a218 100644 (file)
@@ -45,7 +45,7 @@ DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver")
  METHOD (releasePersistableUriPermission,   "releasePersistableUriPermission",  "(Landroid/net/Uri;I)V") \\r
  METHOD (getPersistedUriPermissions,        "getPersistedUriPermissions",       "()Ljava/util/List;")\r
 \r
-DECLARE_JNI_CLASS (ContentResolver19, "android/content/ContentResolver")\r
+DECLARE_JNI_CLASS_WITH_MIN_SDK (ContentResolver19, "android/content/ContentResolver", 19)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
@@ -79,7 +79,8 @@ DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream")
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
  METHOD (close, "close", "()V") \\r
- METHOD (read,  "read",  "([B)I")\r
+ METHOD (read,  "read",  "([B)I") \\r
+ METHOD (skip,  "skip",  "(J)J")\r
 \r
 DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream")\r
 #undef JNI_CLASS_MEMBERS\r
@@ -550,15 +551,38 @@ private:
     jsize size = 0;\r
 };\r
 \r
+//==============================================================================\r
+struct AndroidStreamHelpers\r
+{\r
+    enum class StreamKind { output, input };\r
+\r
+    static LocalRef<jobject> createStream (const GlobalRef& uri, StreamKind kind)\r
+    {\r
+        auto* env = getEnv();\r
+        auto contentResolver = AndroidContentUriResolver::getContentResolver();\r
+\r
+        if (contentResolver == nullptr)\r
+            return {};\r
+\r
+        return LocalRef<jobject> (env->CallObjectMethod (contentResolver.get(),\r
+                                                         kind == StreamKind::input ? ContentResolver.openInputStream\r
+                                                                                   : ContentResolver.openOutputStream,\r
+                                                         uri.get()));\r
+    }\r
+};\r
+\r
 //==============================================================================\r
 struct AndroidContentUriInputStream :  public InputStream\r
 {\r
-    explicit AndroidContentUriInputStream (LocalRef<jobject>&& streamIn)\r
-        : stream (std::move (streamIn)) {}\r
+    explicit AndroidContentUriInputStream (const GlobalRef& uriIn)\r
+        : uri (uriIn),\r
+          stream (AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::input))\r
+    {}\r
 \r
     ~AndroidContentUriInputStream() override\r
     {\r
         getEnv()->CallVoidMethod (stream.get(), AndroidInputStream.close);\r
+        jniCheckHasExceptionOccurredAndClear();\r
     }\r
 \r
     int64 getTotalLength() override { return -1; }\r
@@ -569,30 +593,36 @@ struct AndroidContentUriInputStream :  public InputStream
     {\r
         auto* env = getEnv();\r
 \r
-        if ((jsize) maxBytesToRead > byteArray.getSize())\r
+        if ((jsize) maxBytesToRead != byteArray.getSize())\r
             byteArray = CachedByteArray { (jsize) maxBytesToRead };\r
 \r
         const auto result = env->CallIntMethod (stream.get(), AndroidInputStream.read, byteArray.getNativeArray());\r
 \r
-        if (result != -1)\r
-        {\r
-            pos += result;\r
-\r
-            auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr);\r
-            std::memcpy (destBuffer, rawBytes, static_cast<size_t> (result));\r
-            env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0);\r
-        }\r
-        else\r
+        if (jniCheckHasExceptionOccurredAndClear() || result == -1)\r
         {\r
             exhausted = true;\r
+            return -1;\r
         }\r
 \r
+        pos += result;\r
+\r
+        auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr);\r
+        std::memcpy (destBuffer, rawBytes, static_cast<size_t> (result));\r
+        env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0);\r
+\r
         return result;\r
     }\r
 \r
     bool setPosition (int64 newPos) override\r
     {\r
-        return (newPos == pos);\r
+        if (newPos == pos)\r
+            return true;\r
+\r
+        if (pos < newPos)\r
+            return skipImpl (newPos - pos);\r
+\r
+        AndroidContentUriInputStream (uri).swap (*this);\r
+        return skipImpl (newPos);\r
     }\r
 \r
     int64 getPosition() override\r
@@ -600,6 +630,37 @@ struct AndroidContentUriInputStream :  public InputStream
         return pos;\r
     }\r
 \r
+    bool openedSuccessfully() const { return stream != nullptr; }\r
+\r
+    void skipNextBytes (int64 num) override\r
+    {\r
+        skipImpl (num);\r
+    }\r
+\r
+private:\r
+    bool skipImpl (int64 num)\r
+    {\r
+        if (stream == nullptr)\r
+            return false;\r
+\r
+        const auto skipped = getEnv()->CallLongMethod (stream, AndroidInputStream.skip, (jlong) num);\r
+\r
+        if (jniCheckHasExceptionOccurredAndClear())\r
+            return false;\r
+\r
+        pos += skipped;\r
+        return skipped == num;\r
+    }\r
+\r
+    auto tie() { return std::tie (uri, byteArray, stream, pos, exhausted); }\r
+\r
+    void swap (AndroidContentUriInputStream& other) noexcept\r
+    {\r
+        auto toSwap = other.tie();\r
+        tie().swap (toSwap);\r
+    }\r
+\r
+    GlobalRef uri;\r
     CachedByteArray byteArray;\r
     GlobalRef stream;\r
     int64 pos = 0;\r
index 3d68d0f9ed0ffd1fe6f88c50e98be8c082446b77..972c6e1dd954a91847a11bfcca1cd086c231a20a 100644 (file)
@@ -66,7 +66,7 @@ static const uint8 invocationHandleByteCode[] =
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD       (findClass,            "findClass",            "(Ljava/lang/String;)Ljava/lang/Class;") \\r
+ METHOD       (loadClass,            "loadClass",            "(Ljava/lang/String;Z)Ljava/lang/Class;") \\r
  STATICMETHOD (getSystemClassLoader, "getSystemClassLoader", "()Ljava/lang/ClassLoader;")\r
 \r
  DECLARE_JNI_CLASS (JavaClassLoader, "java/lang/ClassLoader")\r
@@ -149,7 +149,7 @@ static File getCodeCacheDirectory()
     return File("/data/data/" + bundleId + "/code_cache");\r
 }\r
 \r
-void JNIClassBase::initialise (JNIEnv* env)\r
+void JNIClassBase::initialise (JNIEnv* env, jobject context)\r
 {\r
     auto sdkVersion = getAndroidSDKVersion();\r
 \r
@@ -158,9 +158,16 @@ void JNIClassBase::initialise (JNIEnv* env)
         LocalRef<jstring> classNameAndPackage (javaString (String (classPath).replaceCharacter (L'/', L'.')));\r
         static Array<GlobalRef> byteCodeLoaders;\r
 \r
-        if (! SystemJavaClassComparator::isSystemClass(this))\r
+        if (! SystemJavaClassComparator::isSystemClass (this))\r
         {\r
-            LocalRef<jobject> defaultClassLoader (env->CallStaticObjectMethod (JavaClassLoader, JavaClassLoader.getSystemClassLoader));\r
+            // We use the context's class loader, rather than the 'system' class loader, because we\r
+            // may need to load classes from our library dependencies (such as the BillingClient\r
+            // library), and the system class loader is not aware of those libraries.\r
+            const LocalRef<jobject> defaultClassLoader { env->CallObjectMethod (context,\r
+                                                                                env->GetMethodID (env->FindClass ("android/content/Context"),\r
+                                                                                                  "getClassLoader",\r
+                                                                                                  "()Ljava/lang/ClassLoader;")) };\r
+\r
             tryLoadingClassWithClassLoader (env, defaultClassLoader.get());\r
 \r
             if (classRef == nullptr)\r
@@ -229,7 +236,7 @@ void JNIClassBase::initialise (JNIEnv* env)
                     if (byteCodeClassLoader != nullptr)\r
                     {\r
                         tryLoadingClassWithClassLoader (env, byteCodeClassLoader.get());\r
-                        byteCodeLoaders.add (GlobalRef(byteCodeClassLoader));\r
+                        byteCodeLoaders.add (GlobalRef (byteCodeClassLoader));\r
                     }\r
                 }\r
             }\r
@@ -249,9 +256,9 @@ void JNIClassBase::tryLoadingClassWithClassLoader (JNIEnv* env, jobject classLoa
 \r
     // Android SDK <= 19 has a bug where the class loader might throw an exception but still return\r
     // a non-nullptr. So don't assign the result of this call to a jobject just yet...\r
-    auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.findClass, classNameAndPackage.get());\r
+    auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.loadClass, classNameAndPackage.get(), (jboolean) true);\r
 \r
-    if (jthrowable exception = env->ExceptionOccurred ())\r
+    if (jthrowable exception = env->ExceptionOccurred())\r
     {\r
         env->ExceptionClear();\r
         classObj = nullptr;\r
@@ -268,11 +275,11 @@ void JNIClassBase::release (JNIEnv* env)
         env->DeleteGlobalRef (classRef);\r
 }\r
 \r
-void JNIClassBase::initialiseAllClasses (JNIEnv* env)\r
+void JNIClassBase::initialiseAllClasses (JNIEnv* env, jobject context)\r
 {\r
     const Array<JNIClassBase*>& classes = getClasses();\r
     for (int i = classes.size(); --i >= 0;)\r
-        classes.getUnchecked(i)->initialise (env);\r
+        classes.getUnchecked(i)->initialise (env, context);\r
 }\r
 \r
 void JNIClassBase::releaseAllClasses (JNIEnv* env)\r
index 441d9f79eb83750c23b82b282b169dc20f28367c..bdfa4c3880495c4618ec29c119b66c3d8a1065df 100644 (file)
@@ -177,7 +177,7 @@ public:
 \r
     operator jclass() const noexcept  { return classRef; }\r
 \r
-    static void initialiseAllClasses (JNIEnv*);\r
+    static void initialiseAllClasses (JNIEnv*, jobject context);\r
     static void releaseAllClasses (JNIEnv*);\r
 \r
     const char* getClassPath() const noexcept { return classPath; }\r
@@ -202,7 +202,7 @@ private:
     jclass classRef = nullptr;\r
 \r
     static Array<JNIClassBase*>& getClasses();\r
-    void initialise (JNIEnv*);\r
+    void initialise (JNIEnv*, jobject context);\r
     void release (JNIEnv*);\r
     void tryLoadingClassWithClassLoader (JNIEnv* env, jobject classLoader);\r
 \r
@@ -358,7 +358,7 @@ DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
   STATICMETHOD (dumpReferenceTables, "dumpReferenceTables", "()V")\r
 \r
-  DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
+DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JUCE_LOG_JNI_REFERENCES_TABLE getEnv()->CallStaticVoidMethod (AndroidDebug, AndroidDebug.dumpReferenceTables);\r
@@ -371,6 +371,12 @@ DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle")
 DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getRealMetrics, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V")\r
+\r
+DECLARE_JNI_CLASS (AndroidDisplay17, "android/view/Display")\r
+#undef JNI_CLASS_MEMBERS\r
+\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
   METHOD (constructor,           "<init>",      "()V") \\r
   METHOD (constructorWithLooper, "<init>",      "(Landroid/os/Looper;)V") \\r
@@ -557,11 +563,18 @@ DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri")
  METHOD (findViewById,              "findViewById",              "(I)Landroid/view/View;") \\r
  METHOD (getRootView,               "getRootView",               "()Landroid/view/View;") \\r
  METHOD (addOnLayoutChangeListener, "addOnLayoutChangeListener", "(Landroid/view/View$OnLayoutChangeListener;)V") \\r
- METHOD (announceForAccessibility,  "announceForAccessibility",  "(Ljava/lang/CharSequence;)V") \\r
+ METHOD (announceForAccessibility,  "announceForAccessibility",  "(Ljava/lang/CharSequence;)V")  \\r
 \r
 DECLARE_JNI_CLASS (AndroidView, "android/view/View")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (setOnApplyWindowInsetsListener, "setOnApplyWindowInsetsListener", "(Landroid/view/View$OnApplyWindowInsetsListener;)V") \\r
+ METHOD (getRootWindowInsets, "getRootWindowInsets", "()Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidView23, "android/view/View", 23)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
  METHOD (addView,                       "addView",                       "(Landroid/view/View;)V") \\r
  METHOD (removeView,                    "removeView",                    "(Landroid/view/View;)V") \\r
@@ -725,7 +738,6 @@ DECLARE_JNI_CLASS (JavaMap, "java/util/Map")
 DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
-\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
   METHOD (constructor, "<init>", "()V") \\r
   METHOD (getClass, "getClass", "()Ljava/lang/Class;") \\r
@@ -761,7 +773,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION")
  METHOD (registerActivityLifecycleCallbacks,   "registerActivityLifecycleCallbacks",   "(Landroid/app/Application$ActivityLifecycleCallbacks;)V") \\r
  METHOD (unregisterActivityLifecycleCallbacks, "unregisterActivityLifecycleCallbacks", "(Landroid/app/Application$ActivityLifecycleCallbacks;)V")\r
 \r
- DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application")\r
+DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
@@ -769,7 +781,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION")
  METHOD (getHolder,       "getHolder",       "()Landroid/view/SurfaceHolder;") \\r
  METHOD (getParent,       "getParent",       "()Landroid/view/ViewParent;")\r
 \r
- DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView")\r
+DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 \r
@@ -778,7 +790,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION")
  METHOD (addCallback,    "addCallback",    "(Landroid/view/SurfaceHolder$Callback;)V") \\r
  METHOD (removeCallback, "removeCallback", "(Landroid/view/SurfaceHolder$Callback;)V")\r
 \r
- DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder")\r
+DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
index e9e11022de0df8c836feeda1441358bb896364d4..f5a3afa89b6e05b4b5e4dc5909e945b49d9e423c 100644 (file)
@@ -312,25 +312,6 @@ String URL::getFileName() const
     return toString (false).fromLastOccurrenceOf ("/", false, true);\r
 }\r
 \r
-struct AndroidStreamHelpers\r
-{\r
-    enum class StreamKind { output, input };\r
-\r
-    static LocalRef<jobject> createStream (const GlobalRef& uri, StreamKind kind)\r
-    {\r
-        auto* env = getEnv();\r
-        auto contentResolver = AndroidContentUriResolver::getContentResolver();\r
-\r
-        if (contentResolver == nullptr)\r
-            return {};\r
-\r
-        return LocalRef<jobject> (env->CallObjectMethod (contentResolver.get(),\r
-                                                         kind == StreamKind::input ? ContentResolver.openInputStream\r
-                                                                                   : ContentResolver.openOutputStream,\r
-                                                         uri.get()));\r
-    }\r
-};\r
-\r
 //==============================================================================\r
 class WebInputStream::Pimpl\r
 {\r
index 71d76de0952736d736f4030bf6cc444dfbcc6a2e..796328aa0ca2b3d5a0fcf2f446bec87abc56131b 100644 (file)
@@ -58,6 +58,7 @@ JNIEnv* getEnv() noexcept
 \r
 static void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context)\r
 {\r
+    JNIClassBase::initialiseAllClasses (env, context);\r
     Thread::initialiseJUCE (env, context);\r
 }\r
 \r
@@ -89,8 +90,6 @@ extern "C" jint JNIEXPORT JNI_OnLoad (JavaVM* vm, void*)
         env->ExceptionClear();\r
     }\r
 \r
-    JNIClassBase::initialiseAllClasses (env);\r
-\r
     return JNI_VERSION_1_2;\r
 }\r
 \r
index f661e4ab468fb7265aee341779db3b3a1f471489..38429ba69eed869d7901ab881fc1c10356dd34f5 100644 (file)
@@ -145,11 +145,10 @@ File File::getSpecialLocation (const SpecialLocationType type)
 \r
         case currentExecutableFile:\r
         case currentApplicationFile:\r
-           #if ! JUCE_STANDALONE_APPLICATION\r
-            return juce_getExecutableFile();\r
-           #endif\r
-            // deliberate fall-through if this is not a shared-library\r
-            JUCE_FALLTHROUGH\r
+        {\r
+            const auto f = juce_getExecutableFile();\r
+            return f.isSymbolicLink() ? f.getLinkedTarget() : f;\r
+        }\r
 \r
         case hostApplicationPath:\r
         {\r
index aefa7631783d635ae888427b1755d8e0d81bc370..dcee53f11a56ab54301928f5cbcf21f1e7707dea 100644 (file)
@@ -285,7 +285,6 @@ bool File::moveToTrash() const
 \r
     JUCE_AUTORELEASEPOOL\r
     {\r
-       #if JUCE_MAC || (JUCE_IOS && (defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0))\r
         if (@available (macOS 10.8, iOS 11.0, *))\r
         {\r
             NSError* error = nil;\r
@@ -293,7 +292,6 @@ bool File::moveToTrash() const
                                                  resultingItemURL: nil\r
                                                             error: &error];\r
         }\r
-       #endif\r
 \r
        #if JUCE_IOS\r
         return deleteFile();\r
@@ -410,7 +408,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
       #if JUCE_IOS\r
         ignoreUnused (parameters);\r
 \r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
         if (@available (iOS 10.0, *))\r
         {\r
             [[UIApplication sharedApplication] openURL: filenameAsURL\r
@@ -419,7 +416,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
 \r
             return true;\r
         }\r
-       #endif\r
 \r
         JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
         return [[UIApplication sharedApplication] openURL: filenameAsURL];\r
index 55cb01a236ae9abd54c0f58fa34ebe45f4897c43..8995472d650615cc23197e7a690805dd9687826f 100644 (file)
@@ -342,6 +342,15 @@ namespace detail
     {\r
         return joinCompileTimeStr (v, makeCompileTimeStr (others...));\r
     }\r
+\r
+    template <typename Functor, typename Return, typename... Args>\r
+    static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const)\r
+    {\r
+        return static_cast<Return (*) (Args...)> (functor);\r
+    }\r
+\r
+    template <typename Functor>\r
+    static constexpr auto toFnPtr (Functor functor) { return toFnPtr (functor, &Functor::operator()); }\r
 } // namespace detail\r
 \r
 //==============================================================================\r
@@ -386,6 +395,9 @@ struct ObjCClass
         jassert (b); ignoreUnused (b);\r
     }\r
 \r
+    template <typename Fn>\r
+    void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, detail::toFnPtr (callbackFn)); }\r
+\r
     template <typename Result, typename... Args>\r
     void addMethod (SEL selector, Result (*callbackFn) (id, SEL, Args...))\r
     {\r
@@ -508,4 +520,57 @@ private:
     BlockType block;\r
 };\r
 \r
+//==============================================================================\r
+class ScopedNotificationCenterObserver\r
+{\r
+public:\r
+    ScopedNotificationCenterObserver() = default;\r
+\r
+    ScopedNotificationCenterObserver (id observerIn, SEL selector, NSNotificationName nameIn, id objectIn)\r
+        : observer (observerIn), name (nameIn), object (objectIn)\r
+    {\r
+        [[NSNotificationCenter defaultCenter] addObserver: observer\r
+                                                 selector: selector\r
+                                                     name: name\r
+                                                   object: object];\r
+    }\r
+\r
+    ~ScopedNotificationCenterObserver()\r
+    {\r
+        if (observer != nullptr && name != nullptr)\r
+        {\r
+            [[NSNotificationCenter defaultCenter] removeObserver: observer\r
+                                                            name: name\r
+                                                          object: object];\r
+        }\r
+    }\r
+\r
+    ScopedNotificationCenterObserver (ScopedNotificationCenterObserver&& other) noexcept\r
+    {\r
+        swap (other);\r
+    }\r
+\r
+    ScopedNotificationCenterObserver& operator= (ScopedNotificationCenterObserver&& other) noexcept\r
+    {\r
+        auto moved = std::move (other);\r
+        swap (moved);\r
+        return *this;\r
+    }\r
+\r
+    ScopedNotificationCenterObserver (const ScopedNotificationCenterObserver&) = delete;\r
+    ScopedNotificationCenterObserver& operator= (const ScopedNotificationCenterObserver&) = delete;\r
+\r
+private:\r
+    void swap (ScopedNotificationCenterObserver& other) noexcept\r
+    {\r
+        std::swap (other.observer, observer);\r
+        std::swap (other.name, name);\r
+        std::swap (other.object, object);\r
+    }\r
+\r
+    id observer = nullptr;\r
+    NSNotificationName name = nullptr;\r
+    id object = nullptr;\r
+};\r
+\r
 } // namespace juce\r
index f3b25cad00cc673adcf5b87e9e86663947234aa5..077cce685dcc54a3a6a76e8a2803658115ddc98b 100644 (file)
@@ -95,14 +95,12 @@ static String getOSXVersion()
         {\r
             const String systemVersionPlist ("/System/Library/CoreServices/SystemVersion.plist");\r
 \r
-           #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
             if (@available (macOS 10.13, *))\r
             {\r
                 NSError* error = nullptr;\r
                 return [NSDictionary dictionaryWithContentsOfURL: createNSURLFromFile (systemVersionPlist)\r
                                                            error: &error];\r
             }\r
-           #endif\r
 \r
             return [NSDictionary dictionaryWithContentsOfFile: juceStringToNS (systemVersionPlist)];\r
         }();\r
index 700e191e9e1913b1c2c18413f9832becc8f9773e..66ff9669b78222c8ba5d775ab4c8a8dd700629d3 100644 (file)
@@ -167,7 +167,7 @@ int juce_siginterrupt (int sig, int flag)
 //==============================================================================\r
 namespace\r
 {\r
-   #if JUCE_LINUX || (JUCE_IOS && ! __DARWIN_ONLY_64_BIT_INO_T) // (this iOS stuff is to avoid a simulator bug)\r
+   #if JUCE_LINUX || (JUCE_IOS && (! TARGET_OS_MACCATALYST) && (! __DARWIN_ONLY_64_BIT_INO_T)) // (this iOS stuff is to avoid a simulator bug)\r
     using juce_statStruct = struct stat64;\r
     #define JUCE_STAT  stat64\r
    #else\r
index 7cfc79d5a0e509a88e4b9136b0546d31cf578304..2fa3befbe5db163c62d3a799967c1f11d68ef9af 100644 (file)
@@ -191,7 +191,7 @@ static DebugFlagsInitialiser debugFlagsInitialiser;
 \r
 //==============================================================================\r
 #if JUCE_MINGW\r
- static uint32 getWindowsVersion()\r
+ static uint64 getWindowsVersion()\r
  {\r
      auto filename = _T("kernel32.dll");\r
      DWORD handle = 0;\r
@@ -207,7 +207,7 @@ static DebugFlagsInitialiser debugFlagsInitialiser;
 \r
              if (VerQueryValue (data, (LPCTSTR) _T("\\"), (void**) &info, &verSize))\r
                  if (size > 0 && info != nullptr && info->dwSignature == 0xfeef04bd)\r
-                     return (uint32) info->dwFileVersionMS;\r
+                     return ((uint64) info->dwFileVersionMS << 32) | (uint64) info->dwFileVersionLS;\r
          }\r
      }\r
 \r
@@ -240,24 +240,27 @@ static DebugFlagsInitialiser debugFlagsInitialiser;
 SystemStats::OperatingSystemType SystemStats::getOperatingSystemType()\r
 {\r
    #if JUCE_MINGW\r
-    auto v = getWindowsVersion();\r
-    auto major = (v >> 16) & 0xff;\r
-    auto minor = (v >> 0)  & 0xff;\r
+    const auto v = getWindowsVersion();\r
+    const auto major = (v >> 48) & 0xffff;\r
+    const auto minor = (v >> 32) & 0xffff;\r
+    const auto build = (v >> 16) & 0xffff;\r
    #else\r
-    auto versionInfo = getWindowsVersionInfo();\r
-    auto major = versionInfo.dwMajorVersion;\r
-    auto minor = versionInfo.dwMinorVersion;\r
+    const auto versionInfo = getWindowsVersionInfo();\r
+    const auto major = versionInfo.dwMajorVersion;\r
+    const auto minor = versionInfo.dwMinorVersion;\r
+    const auto build = versionInfo.dwBuildNumber;\r
    #endif\r
 \r
     jassert (major <= 10); // need to add support for new version!\r
 \r
-    if (major == 10)                 return Windows10;\r
-    if (major == 6 && minor == 3)    return Windows8_1;\r
-    if (major == 6 && minor == 2)    return Windows8_0;\r
-    if (major == 6 && minor == 1)    return Windows7;\r
-    if (major == 6 && minor == 0)    return WinVista;\r
-    if (major == 5 && minor == 1)    return WinXP;\r
-    if (major == 5 && minor == 0)    return Win2000;\r
+    if (major == 10 && build >= 22000) return Windows11;\r
+    if (major == 10)                   return Windows10;\r
+    if (major == 6 && minor == 3)      return Windows8_1;\r
+    if (major == 6 && minor == 2)      return Windows8_0;\r
+    if (major == 6 && minor == 1)      return Windows7;\r
+    if (major == 6 && minor == 0)      return WinVista;\r
+    if (major == 5 && minor == 1)      return WinXP;\r
+    if (major == 5 && minor == 0)      return Win2000;\r
 \r
     jassertfalse;\r
     return UnknownOS;\r
@@ -269,6 +272,7 @@ String SystemStats::getOperatingSystemName()
 \r
     switch (getOperatingSystemType())\r
     {\r
+        case Windows11:         name = "Windows 11";        break;\r
         case Windows10:         name = "Windows 10";        break;\r
         case Windows8_1:        name = "Windows 8.1";       break;\r
         case Windows8_0:        name = "Windows 8.0";       break;\r
diff --git a/modules/juce_core/streams/juce_AndroidDocumentInputSource.h b/modules/juce_core/streams/juce_AndroidDocumentInputSource.h
new file mode 100644 (file)
index 0000000..7b25245
--- /dev/null
@@ -0,0 +1,79 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+    An InputSource backed by an AndroidDocument.\r
+\r
+    @see InputSource, AndroidDocument\r
+\r
+    @tags{Core}\r
+*/\r
+class JUCE_API  AndroidDocumentInputSource   : public InputSource\r
+{\r
+public:\r
+    //==============================================================================\r
+    /** Creates a new AndroidDocumentInputSource, backed by the provided document.\r
+    */\r
+    explicit AndroidDocumentInputSource (const AndroidDocument& doc)\r
+        : document (doc) {}\r
+\r
+    //==============================================================================\r
+    /** Returns a new InputStream to read this item.\r
+\r
+        @returns            an inputstream that the caller will delete, or nullptr if\r
+                            the document can't be opened.\r
+    */\r
+    InputStream* createInputStream() override\r
+    {\r
+        return document.createInputStream().release();\r
+    }\r
+\r
+    /** @internal\r
+\r
+        An AndroidDocument doesn't use conventional filesystem paths.\r
+        Use the member functions of AndroidDocument to locate relative items.\r
+\r
+        @param relatedItemPath  the relative pathname of the resource that is required\r
+        @returns            an input stream if relatedItemPath was empty, otherwise\r
+                            nullptr.\r
+    */\r
+    InputStream* createInputStreamFor (const String& relatedItemPath) override\r
+    {\r
+        return relatedItemPath.isEmpty() ? document.createInputStream().release() : nullptr;\r
+    }\r
+\r
+    /** Returns a hash code that uniquely represents this item.\r
+    */\r
+    int64 hashCode() const override\r
+    {\r
+        return document.getUrl().toString (true).hashCode64();\r
+    }\r
+\r
+private:\r
+    AndroidDocument document;\r
+};\r
+\r
+} // namespace juce\r
index a84c76a4f2a7f8e4e18ace6ecce25b900971c1ec..71611f104401613a8ca2ef148f19e32f5fe2d025 100644 (file)
@@ -29,7 +29,7 @@
 */\r
 #define JUCE_MAJOR_VERSION      7\r
 #define JUCE_MINOR_VERSION      0\r
-#define JUCE_BUILDNUMBER        1\r
+#define JUCE_BUILDNUMBER        2\r
 \r
 /** Current JUCE version number.\r
 \r
index 36249dead878d5368a91d22ab28a32b118665cdb..37924f085737ff668aea9890652e1e9eabe7bd7e 100644 (file)
@@ -71,7 +71,8 @@ public:
         Windows7        = Windows | 4,\r
         Windows8_0      = Windows | 5,\r
         Windows8_1      = Windows | 6,\r
-        Windows10       = Windows | 7\r
+        Windows10       = Windows | 7,\r
+        Windows11       = Windows | 8\r
     };\r
 \r
     /** Returns the type of operating system we're running on.\r
index e839dddcc2b7fcb1b030a5e73d68caab50df3454..32790de89607fda0477237f756ef5daf2101f0ae 100644 (file)
@@ -50,7 +50,7 @@ namespace juce
     "goodbye" = "au revoir"\r
     @endcode\r
 \r
-    If the strings need to contain a quote character, they can use '\"' instead, and\r
+    If the strings need to contain a quote character, they can use `\"` instead, and\r
     if the first non-whitespace character on a line isn't a quote, then it's ignored,\r
     (you can use this to add comments).\r
 \r
index 1b218eed82ae23365ba4c4c46b24f5528fbdbb6c..564d55eaedc8e809bbd09fae8ffcf9b1d5145f4d 100644 (file)
@@ -194,6 +194,11 @@ bool UnitTestRunner::shouldAbortTests()
     return false;\r
 }\r
 \r
+static String getTestNameString (const String& testName, const String& subCategory)\r
+{\r
+    return testName + " / " + subCategory;\r
+}\r
+\r
 void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCategory)\r
 {\r
     endTest();\r
@@ -203,7 +208,7 @@ void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCatego
     results.add (new TestResult (testName, subCategory));\r
 \r
     logMessage ("-----------------------------------------------------------------");\r
-    logMessage ("Starting test: " + testName + " / " + subCategory + "...");\r
+    logMessage ("Starting tests in: " + getTestNameString (testName, subCategory) + "...");\r
 \r
     resultsUpdated();\r
 }\r
@@ -226,7 +231,7 @@ void UnitTestRunner::endTest()
         }\r
         else\r
         {\r
-            logMessage ("All tests completed successfully");\r
+            logMessage ("Completed tests in " + getTestNameString (r->unitTestName, r->subcategoryName));\r
         }\r
     }\r
 }\r
index 6ce3e0d3d658df6b8751e8a7146dfdbea35affb6..77fa22af5e8f2413def5a61c02e3384b76871d12 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_cryptography\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE cryptography classes\r
   description:        Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
   website:            http://www.juce.com/juce\r
index 176392e9a5c1b84332df382c3f8d370bd5344e3d..3ed772b81fa4e10f7d377e2f9eeac061891eeeb2 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_data_structures\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE data model helper classes\r
   description:        Classes for undo/redo management, and smart data structures.\r
   website:            http://www.juce.com/juce\r
index 241a558eec336bdcee7fa7a7e4305c41c63c2b79..251d9f69b50b980d002727ec31e420009dcd8bfc 100644 (file)
@@ -669,6 +669,9 @@ void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoMa
 {\r
     jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
 \r
+    if (source == *this)\r
+        return;\r
+\r
     if (source.object == nullptr)\r
         removeAllProperties (undoManager);\r
     else if (object != nullptr)\r
@@ -679,6 +682,9 @@ void ValueTree::copyPropertiesAndChildrenFrom (const ValueTree& source, UndoMana
 {\r
     jassert (object != nullptr || source.object == nullptr); // Trying to copy to a null ValueTree will fail!\r
 \r
+    if (source == *this)\r
+        return;\r
+\r
     copyPropertiesFrom (source, undoManager);\r
     removeAllChildren (undoManager);\r
 \r
index 3a12366ab5978f28dbd6dffc14d115911d131118..e8f561195a65fd9005523a7314ed22e2ee66b220 100644 (file)
@@ -166,7 +166,7 @@ void WindowingFunction<FloatType>::fillWindowingTables (FloatType* samples, size
 }\r
 \r
 template <typename FloatType>\r
-void WindowingFunction<FloatType>::multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept\r
+void WindowingFunction<FloatType>::multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept\r
 {\r
     FloatVectorOperations::multiply (samples, windowTable.getRawDataPointer(), jmin (static_cast<int> (size), windowTable.size()));\r
 }\r
index 1b18cf0830ce807014b54b7247a4f8ae0bdd7fee..573e89bbf45b160d316b0cab0ae3549af0d8d16a 100644 (file)
@@ -94,7 +94,7 @@ public:
                                      bool normalise = true, FloatType beta = 0) noexcept;\r
 \r
     /** Multiplies the content of a buffer with the given window. */\r
-    void multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept;\r
+    void multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept;\r
 \r
     /** Returns the name of a given windowing method. */\r
     static const char* getWindowingMethodName (WindowingMethod) noexcept;\r
index d6e8e99cbd7699b8bc33d2757a04e29c7c5862b9..17ca0c084323dd8a0c4c47e6f2c49b819fdaee88 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_dsp\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE DSP classes\r
   description:        Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
   website:            http://www.juce.com/juce\r
index 1a78e86fdf15a5b9f6425d33b38e649e039f6614..6f7e50604e7defaff9727674081c566d30d40c64 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_events\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE message and event handling classes\r
   description:        Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
   website:            http://www.juce.com/juce\r
index 2ca5dfeff7902aa0b3c2ab9800a8812f283dea2c..604a649e6554c93d342c4588f97a100987c9ee98 100644 (file)
@@ -279,8 +279,8 @@ bool JUCEApplicationBase::initialiseApp()
     }\r
    #endif\r
 \r
-   #if JUCE_WINDOWS && JUCE_STANDALONE_APPLICATION && (! defined (_CONSOLE)) && (! JUCE_MINGW)\r
-    if (AttachConsole (ATTACH_PARENT_PROCESS) != 0)\r
+   #if JUCE_WINDOWS && (! defined (_CONSOLE)) && (! JUCE_MINGW)\r
+    if (isStandaloneApp() && AttachConsole (ATTACH_PARENT_PROCESS) != 0)\r
     {\r
         // if we've launched a GUI app from cmd.exe or PowerShell, we need this to enable printf etc.\r
         // However, only reassign stdout, stderr, stdin if they have not been already opened by\r
index 153ac624701e5cfaf4db9050beec0a0418048633..cca2d4925a21b73694273be14bcb78b8fcf546b7 100644 (file)
@@ -225,6 +225,8 @@ void MessageManager::deregisterBroadcastListener (ActionListener* const listener
 //==============================================================================\r
 bool MessageManager::isThisTheMessageThread() const noexcept\r
 {\r
+    const std::lock_guard<std::mutex> lock { messageThreadIdMutex };\r
+\r
     return Thread::getCurrentThreadId() == messageThreadId;\r
 }\r
 \r
@@ -232,10 +234,10 @@ void MessageManager::setCurrentThreadAsMessageThread()
 {\r
     auto thisThread = Thread::getCurrentThreadId();\r
 \r
-    if (messageThreadId != thisThread)\r
-    {\r
-        messageThreadId = thisThread;\r
+    const std::lock_guard<std::mutex> lock { messageThreadIdMutex };\r
 \r
+    if (std::exchange (messageThreadId, thisThread) != thisThread)\r
+    {\r
        #if JUCE_WINDOWS\r
         // This is needed on windows to make sure the message window is created by this thread\r
         doPlatformSpecificShutdown();\r
index 9a5c26e697a09bc1895c5598ed7e47d8107d50de..8687a057cf480adaa7e27771ac5a0d5c3552ef93 100644 (file)
@@ -328,6 +328,7 @@ private:
     Atomic<int> quitMessagePosted { 0 }, quitMessageReceived { 0 };\r
     Thread::ThreadID messageThreadId;\r
     Atomic<Thread::ThreadID> threadWithLock;\r
+    mutable std::mutex messageThreadIdMutex;\r
 \r
     static bool postMessageToSystemQueue (MessageBase*);\r
     static void* exitModalLoopCallback (void*);\r
index 3dff46488d7ab24becfe271c764cc2c974b8d726..cd162852f4c4ab8f179e8112ca7eed537390a534 100644 (file)
@@ -38,6 +38,7 @@ Colour Colours::findColourForName (const String& colourName,
         { 0x06bdcc29, 0xffffffff }, /* white */\r
         { 0x002e305a, 0xff0000ff }, /* blue */\r
         { 0x00308adf, 0xff808080 }, /* grey */\r
+        { 0x00308a63, 0xff808080 }, /* gray */\r
         { 0x05e0cf03, 0xff008000 }, /* green */\r
         { 0x0001b891, 0xffff0000 }, /* red */\r
         { 0xd43c6474, 0xffffff00 }, /* yellow */\r
@@ -64,6 +65,7 @@ Colour Colours::findColourForName (const String& colourName,
         { 0x67cd1799, 0xff008b8b }, /* darkcyan */\r
         { 0x31bbd168, 0xffb8860b }, /* darkgoldenrod */\r
         { 0x67cecf55, 0xff555555 }, /* darkgrey */\r
+        { 0x67ceced9, 0xff555555 }, /* darkgray */\r
         { 0x920b194d, 0xff006400 }, /* darkgreen */\r
         { 0x923edd4c, 0xffbdb76b }, /* darkkhaki */\r
         { 0x5c293873, 0xff8b008b }, /* darkmagenta */\r
@@ -75,11 +77,13 @@ Colour Colours::findColourForName (const String& colourName,
         { 0x61be858a, 0xff8fbc8f }, /* darkseagreen */\r
         { 0xc2b0f2bd, 0xff483d8b }, /* darkslateblue */\r
         { 0xc2b34d42, 0xff2f4f4f }, /* darkslategrey */\r
+        { 0xc2b34cc6, 0xff2f4f4f }, /* darkslategray */\r
         { 0x7cf2b06b, 0xff00ced1 }, /* darkturquoise */\r
         { 0xc8769375, 0xff9400d3 }, /* darkviolet */\r
         { 0x25832862, 0xffff1493 }, /* deeppink */\r
         { 0xfcad568f, 0xff00bfff }, /* deepskyblue */\r
         { 0x634c8b67, 0xff696969 }, /* dimgrey */\r
+        { 0x634c8aeb, 0xff696969 }, /* dimgray */\r
         { 0x45c1ce55, 0xff1e90ff }, /* dodgerblue */\r
         { 0xef19e3cb, 0xffb22222 }, /* firebrick */\r
         { 0xb852b195, 0xfffffaf0 }, /* floralwhite */\r
@@ -106,11 +110,13 @@ Colour Colours::findColourForName (const String& colourName,
         { 0x21234e3c, 0xfffafad2 }, /* lightgoldenrodyellow */\r
         { 0xf40157ad, 0xff90ee90 }, /* lightgreen */\r
         { 0x28e744f5, 0xffd3d3d3 }, /* lightgrey */\r
+        { 0x28e74479, 0xffd3d3d3 }, /* lightgray */\r
         { 0x28eb3b8c, 0xffffb6c1 }, /* lightpink */\r
         { 0x9fb78304, 0xffffa07a }, /* lightsalmon */\r
         { 0x50632b2a, 0xff20b2aa }, /* lightseagreen */\r
         { 0x68fb7b25, 0xff87cefa }, /* lightskyblue */\r
         { 0xa8a35ba2, 0xff778899 }, /* lightslategrey */\r
+        { 0xa8a35b26, 0xff778899 }, /* lightslategray */\r
         { 0xa20d484f, 0xffb0c4de }, /* lightsteelblue */\r
         { 0xaa2cf10a, 0xffffffe0 }, /* lightyellow */\r
         { 0x0032afd5, 0xff00ff00 }, /* lime */\r
@@ -163,6 +169,7 @@ Colour Colours::findColourForName (const String& colourName,
         { 0x80da74fb, 0xff87ceeb }, /* skyblue */\r
         { 0x44a8dd73, 0xff6a5acd }, /* slateblue */\r
         { 0x44ab37f8, 0xff708090 }, /* slategrey */\r
+        { 0x44ab377c, 0xff708090 }, /* slategray */\r
         { 0x0035f183, 0xfffffafa }, /* snow */\r
         { 0xd5440d16, 0xff00ff7f }, /* springgreen */\r
         { 0x3e1524a5, 0xff4682b4 }, /* steelblue */\r
index e133b0ae4a04226755d70afea09a25541f4ad959..d10c3ceed9cd2bb3322f78bf786ebe288300bc60 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_graphics\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE graphics classes\r
   description:        Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
   website:            http://www.juce.com/juce\r
index e190577b6fc774b8b3f463d54f93804e3d7f8425..7e78c80442a2ae09d8e775a19ee4ff8f1fd6a811 100644 (file)
@@ -41,12 +41,10 @@ public:
 \r
         auto numComponents = (size_t) lineStride * (size_t) jmax (1, height);\r
 \r
-       # if JUCE_MAC && defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14\r
-        // This version of the SDK intermittently requires a bit of extra space\r
+        // SDK version 10.14+ intermittently requires a bit of extra space\r
         // at the end of the image data. This feels like something has gone\r
         // wrong in Apple's code.\r
         numComponents += (size_t) lineStride;\r
-       #endif\r
 \r
         imageData->data.allocate (numComponents, clearImage);\r
 \r
index 049c39722e7e2bb0d56d0cc51c1fb73f4f66b522..8c74afef91350e28969bd92a65118a7dfb9c40b4 100644 (file)
@@ -39,23 +39,14 @@ public:
     /** Destructor. */\r
     virtual ~AccessibilityCellInterface() = default;\r
 \r
-    /** Returns the column index of the cell in the table. */\r
-    virtual int getColumnIndex() const = 0;\r
-\r
-    /** Returns the number of columns occupied by the cell in the table. */\r
-    virtual int getColumnSpan() const = 0;\r
-\r
-    /** Returns the row index of the cell in the table. */\r
-    virtual int getRowIndex() const = 0;\r
-\r
-    /** Returns the number of rows occupied by the cell in the table. */\r
-    virtual int getRowSpan() const = 0;\r
-\r
     /** Returns the indentation level for the cell. */\r
     virtual int getDisclosureLevel() const = 0;\r
 \r
     /** Returns the AccessibilityHandler of the table which contains the cell. */\r
     virtual const AccessibilityHandler* getTableHandler() const = 0;\r
+\r
+    /** Returns a list of the accessibility elements that are disclosed by this element, if any. */\r
+    virtual std::vector<const AccessibilityHandler*> getDisclosedRows() const { return {}; }\r
 };\r
 \r
 } // namespace juce\r
index 4f7f7944979c0c549cbe9aa9939741a4ed29d54b..a50227ed2868c657f0a2826631204076f6d96d53 100644 (file)
@@ -49,6 +49,48 @@ public:
         nullptr if there is no cell at the specified position.\r
     */\r
     virtual const AccessibilityHandler* getCellHandler (int row, int column) const = 0;\r
+\r
+    /** Returns the AccessibilityHandler for a row in the table, or nullptr if there is\r
+        no row at this index.\r
+\r
+        The row component should have a child component for each column in the table.\r
+    */\r
+    virtual const AccessibilityHandler* getRowHandler (int row) const = 0;\r
+\r
+    /** Returns the AccessibilityHandler for the header, or nullptr if there is\r
+        no header.\r
+\r
+        If you supply a header, it must have exactly the same number of children\r
+        as there are columns in the table.\r
+    */\r
+    virtual const AccessibilityHandler* getHeaderHandler() const = 0;\r
+\r
+    struct Span { int begin, num; };\r
+\r
+    /** Given the handler of one of the cells in the table, returns the rows covered\r
+        by that cell, or null if the cell does not exist in the table.\r
+\r
+        This function replaces the getRowIndex and getRowSpan\r
+        functions from AccessibilityCellInterface. Most of the time, it's easier for the\r
+        table itself to keep track of cell locations, than to delegate to the individual\r
+        cells.\r
+    */\r
+    virtual Optional<Span> getRowSpan (const AccessibilityHandler&) const = 0;\r
+\r
+    /** Given the handler of one of the cells in the table, returns the columns covered\r
+        by that cell, or null if the cell does not exist in the table.\r
+\r
+        This function replaces the getColumnIndex and getColumnSpan\r
+        functions from AccessibilityCellInterface. Most of the time, it's easier for the\r
+        table itself to keep track of cell locations, than to delegate to the individual\r
+        cells.\r
+    */\r
+    virtual Optional<Span> getColumnSpan (const AccessibilityHandler&) const = 0;\r
+\r
+    /** Attempts to scroll the table (if necessary) so that the cell with the given handler\r
+        is visible.\r
+    */\r
+    virtual void showCell (const AccessibilityHandler&) const = 0;\r
 };\r
 \r
 } // namespace juce\r
index 1fdd25a23fd984c699763532a6b71c953a568b21..a5f5440f47dde087b6dcc9e9caf25097397398b8 100644 (file)
@@ -121,4 +121,9 @@ void HyperlinkButton::paintButton (Graphics& g,
                 true);\r
 }\r
 \r
+std::unique_ptr<AccessibilityHandler> HyperlinkButton::createAccessibilityHandler()\r
+{\r
+    return std::make_unique<ButtonAccessibilityHandler> (*this, AccessibilityRole::hyperlink);\r
+}\r
+\r
 } // namespace juce\r
index e4b676946a314eb77b5e5d022ecbcdb12ba92462..553464fa7a4fcfd5d722f8fa53e3e2f999b25501 100644 (file)
@@ -111,6 +111,8 @@ protected:
     void paintButton (Graphics&, bool, bool) override;\r
 \r
 private:\r
+    std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;\r
+\r
     //==============================================================================\r
     using Button::clicked;\r
     Font getFontToUse() const;\r
index 8054f49cf2f77ca926b342ddd7e2814f9677a69f..6382c52bb7e3dcdaaebbd69cc996f9fb838e2e65 100644 (file)
@@ -223,7 +223,7 @@ void Desktop::handleAsyncUpdate()
 void Desktop::addDarkModeSettingListener    (DarkModeSettingListener* l)  { darkModeSettingListeners.add (l); }\r
 void Desktop::removeDarkModeSettingListener (DarkModeSettingListener* l)  { darkModeSettingListeners.remove (l); }\r
 \r
-void Desktop::darkModeChanged()  { darkModeSettingListeners.call ([] (DarkModeSettingListener& l) { l.darkModeSettingChanged(); }); }\r
+void Desktop::darkModeChanged()  { darkModeSettingListeners.call ([] (auto& l) { l.darkModeSettingChanged(); }); }\r
 \r
 //==============================================================================\r
 void Desktop::resetTimer()\r
index cff16433c7c28b75e7bd80623ae2d22b6c2cdcf5..a20114344905c95ab4495b91e832a5aab29c9b20 100644 (file)
 namespace juce\r
 {\r
 \r
+template <typename This>\r
+auto* getPrimaryDisplayImpl (This& t)\r
+{\r
+    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+    const auto iter = std::find_if (t.displays.begin(), t.displays.end(), [] (auto& d) { return d.isMain; });\r
+    return iter != t.displays.end() ? std::addressof (*iter) : nullptr;\r
+}\r
+\r
 Displays::Displays (Desktop& desktop)\r
 {\r
     init (desktop);\r
@@ -162,13 +171,7 @@ Point<ValueType> Displays::logicalToPhysical (Point<ValueType> point, const Disp
 \r
 const Displays::Display* Displays::getPrimaryDisplay() const noexcept\r
 {\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
-    for (auto& d : displays)\r
-        if (d.isMain)\r
-            return &d;\r
-\r
-    return nullptr;\r
+    return getPrimaryDisplayImpl (*this);\r
 }\r
 \r
 RectangleList<int> Displays::getRectangleList (bool userAreasOnly) const\r
@@ -202,19 +205,22 @@ void Displays::refresh()
     }\r
 }\r
 \r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
+static auto tie (const Displays::Display& d)\r
 {\r
-    return d1.isMain          == d2.isMain\r
-        && d1.totalArea       == d2.totalArea\r
-        && d1.userArea        == d2.userArea\r
-        && d1.topLeftPhysical == d2.topLeftPhysical\r
-        && d1.scale           == d2.scale\r
-        && d1.dpi             == d2.dpi;\r
+    return std::tie (d.dpi,\r
+                     d.isMain,\r
+                     d.keyboardInsets,\r
+                     d.safeAreaInsets,\r
+                     d.scale,\r
+                     d.topLeftPhysical,\r
+                     d.totalArea,\r
+                     d.userArea);\r
 }\r
 \r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept    { return ! (d1 == d2); }\r
+static bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
+{\r
+    return tie (d1) == tie (d2);\r
+}\r
 \r
 //==============================================================================\r
 // These methods are used for converting the totalArea and userArea Rectangles in Display from physical to logical\r
index aecf834ee67830f1de2aec78274dda92f7b0db62..9108d5a98341c013e48589fa0d74159a692871e8 100644 (file)
@@ -63,6 +63,17 @@ public:
         */\r
         BorderSize<int> safeAreaInsets;\r
 \r
+        /** Represents the area of this display in logical pixels that is obscured by an\r
+            onscreen keyboard.\r
+\r
+            This is currently only supported on iOS, and on Android 11+.\r
+\r
+            This will only return the bounds of the keyboard when it is in 'docked' mode.\r
+            If the keyboard is floating (e.g. on an iPad using the split keyboard mode),\r
+            no insets will be reported.\r
+        */\r
+        BorderSize<int> keyboardInsets;\r
+\r
         /** The top-left of this display in physical coordinates. */\r
         Point<int> topLeftPhysical;\r
 \r
index 2f21435058c883e8e78c30df90be06ccb6a6e47f..0c5a3cc4d7c414802906b0e8215c29245e0590c2 100644 (file)
@@ -140,6 +140,7 @@ void Drawable::setBoundsToEnclose (Rectangle<float> area)
     auto newBounds = area.getSmallestIntegerContainer() + parentOrigin;\r
     originRelativeToComponent = parentOrigin - newBounds.getPosition();\r
     setBounds (newBounds);\r
+    updateTransform();\r
 }\r
 \r
 //==============================================================================\r
@@ -154,6 +155,23 @@ bool Drawable::replaceColour (Colour original, Colour replacement)
     return changed;\r
 }\r
 \r
+void Drawable::setDrawableTransform (const AffineTransform& transform)\r
+{\r
+    drawableTransform = transform;\r
+    updateTransform();\r
+}\r
+\r
+void Drawable::updateTransform()\r
+{\r
+    if (drawableTransform.isIdentity())\r
+        return;\r
+\r
+    const auto transformationOrigin = originRelativeToComponent + getPosition();\r
+    setTransform (AffineTransform::translation (transformationOrigin * (-1))\r
+                      .followedBy (drawableTransform)\r
+                      .followedBy (AffineTransform::translation (transformationOrigin)));\r
+}\r
+\r
 //==============================================================================\r
 void Drawable::setOriginWithOriginalSize (Point<float> originWithinParent)\r
 {\r
index 9215a96319bdfac84716c09a54e61702894ce85c..6d3ca08184a5ed22add75d48d83790136f0b0499 100644 (file)
@@ -186,6 +186,21 @@ public:
     */\r
     virtual bool replaceColour (Colour originalColour, Colour replacementColour);\r
 \r
+    /** Sets a transformation that applies to the same coordinate system in which the rest of the\r
+        draw calls are made. You almost certainly want to call this function when working with\r
+        Drawables as opposed to Component::setTransform().\r
+\r
+        The reason for this is that the origin of a Drawable is not the same as the point returned\r
+        by Component::getPosition() but has an additional offset internal to the Drawable class.\r
+\r
+        Using setDrawableTransform() will take this internal offset into account when applying the\r
+        transform to the Component base.\r
+\r
+        You can only use Drawable::setDrawableTransform() or Component::setTransform() for a given\r
+        object. Using both will lead to unpredictable behaviour.\r
+    */\r
+    void setDrawableTransform (const AffineTransform& transform);\r
+\r
 protected:\r
     //==============================================================================\r
     friend class DrawableComposite;\r
@@ -202,8 +217,10 @@ protected:
 \r
     Point<int> originRelativeToComponent;\r
     std::unique_ptr<Drawable> drawableClipPath;\r
+    AffineTransform drawableTransform;\r
 \r
     void nonConstDraw (Graphics&, float opacity, const AffineTransform&);\r
+    void updateTransform();\r
 \r
     Drawable (const Drawable&);\r
     Drawable& operator= (const Drawable&);\r
index 7b4d83cc2cad4e3878fd31d9635bb6a9811a9624..c96a86227a1542bfc7f252775c9285bbe4962d01 100644 (file)
@@ -1093,9 +1093,9 @@ private:
                 dt->setFont (font, true);\r
 \r
                 if (additonalTransform != nullptr)\r
-                    dt->setTransform (transform.followedBy (*additonalTransform));\r
+                    dt->setDrawableTransform (transform.followedBy (*additonalTransform));\r
                 else\r
-                    dt->setTransform (transform);\r
+                    dt->setDrawableTransform (transform);\r
 \r
                 dt->setColour (parseColour (xml, "fill", Colours::black)\r
                                  .withMultipliedAlpha (parseSafeFloat (getStyleAttribute (xml, "fill-opacity", "1"))));\r
index 4bae64c9139559513748a10db53e072d93cf9c89..b9242e9c06e4ab9c3138c587350024685d77fbe8 100644 (file)
@@ -46,7 +46,7 @@ namespace juce
             File mooseFile (chooser.getResult());\r
 \r
             loadMoose (mooseFile);\r
-        }\r
+        });\r
     }\r
     @endcode\r
 \r
index 6755bba6404599652dd5b9f8be3eeb662d02f579..50553e409eb1e9e6e04ad156476bbb165d040c21 100644 (file)
@@ -54,7 +54,7 @@
  #import <MetalKit/MetalKit.h>\r
 \r
 #elif JUCE_IOS\r
- #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+ #if JUCE_PUSH_NOTIFICATIONS\r
   #import <UserNotifications/UserNotifications.h>\r
  #endif\r
 \r
@@ -127,6 +127,18 @@ namespace juce
         ScaledImage image;\r
         Point<int> hotspot;\r
     };\r
+\r
+    template <typename MemberFn>\r
+    static const AccessibilityHandler* getEnclosingHandlerWithInterface (const AccessibilityHandler* handler, MemberFn fn)\r
+    {\r
+        if (handler == nullptr)\r
+            return nullptr;\r
+\r
+        if ((handler->*fn)() != nullptr)\r
+            return handler;\r
+\r
+        return getEnclosingHandlerWithInterface (handler->getParent(), fn);\r
+    }\r
 } // namespace juce\r
 \r
 #include "mouse/juce_PointerState.h"\r
@@ -259,7 +271,7 @@ namespace juce
  #include "native/juce_MultiTouchMapper.h"\r
 #endif\r
 \r
-#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_UNIT_TESTS\r
+#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_IOS || JUCE_UNIT_TESTS\r
  #include "native/accessibility/juce_AccessibilityTextHelpers.h"\r
 #endif\r
 \r
@@ -267,8 +279,8 @@ namespace juce
  #include "native/accessibility/juce_mac_AccessibilitySharedCode.mm"\r
 \r
  #if JUCE_IOS\r
-  #include "native/accessibility/juce_ios_Accessibility.mm"\r
   #include "native/juce_ios_UIViewComponentPeer.mm"\r
+  #include "native/accessibility/juce_ios_Accessibility.mm"\r
   #include "native/juce_ios_Windowing.mm"\r
   #include "native/juce_ios_FileChooser.mm"\r
 \r
index 40b367eb380c75880090bcf25dce868ca92a9d2c..ff32e26ff18e145dc3f79f4e6828cbb9d6dbbf22 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_basics\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE GUI core classes\r
   description:        Basic user-interface components and related classes.\r
   website:            http://www.juce.com/juce\r
index c89f0390a276549506f72b9140cb5f077e00f946..b255a2a0f0381871c73fb01174974d153339bfb9 100644 (file)
@@ -71,8 +71,32 @@ public:
     /** Inserts some text, overwriting the selected text region, if there is one. */\r
     virtual void insertTextAtCaret (const String& textToInsert) = 0;\r
 \r
+    /** Returns the current index of the caret. */\r
+    virtual int getCaretPosition() const = 0;\r
+\r
     /** Returns the position of the caret, relative to the component's origin. */\r
-    virtual Rectangle<int> getCaretRectangle() = 0;\r
+    Rectangle<int> getCaretRectangle() const        { return getCaretRectangleForCharIndex (getCaretPosition()); }\r
+\r
+    /** Returns the bounding box of the character at the given index. */\r
+    virtual Rectangle<int> getCaretRectangleForCharIndex (int characterIndex) const = 0;\r
+\r
+    /** Returns the total number of codepoints in the string. */\r
+    virtual int getTotalNumChars() const = 0;\r
+\r
+    /** Returns the index closest to the given point.\r
+\r
+        This is the location where the cursor might be placed after clicking at the given\r
+        point in a text field.\r
+    */\r
+    virtual int getCharIndexForPoint (Point<int> point) const = 0;\r
+\r
+    /** Returns the bounding box for a range of text in the editor. As the range may span\r
+        multiple lines, this method returns a RectangleList.\r
+\r
+        The bounds are relative to the component's top-left and may extend beyond the bounds\r
+        of the component if the text is long and word wrapping is disabled.\r
+    */\r
+    virtual RectangleList<int> getTextBounds (Range<int> textRange) const = 0;\r
 \r
     /** A set of possible on-screen keyboard types, for use in the\r
         getKeyboardType() method.\r
index 255d3306cd20ef4e21aab49cb4683daa10fe66b5..b711858cd4e54ef2212e9a464fcc39e44d80234f 100644 (file)
@@ -56,19 +56,19 @@ void MultiDocumentPanelWindow::closeButtonPressed()
 void MultiDocumentPanelWindow::activeWindowStatusChanged()\r
 {\r
     DocumentWindow::activeWindowStatusChanged();\r
-    updateOrder();\r
+    updateActiveDocument();\r
 }\r
 \r
 void MultiDocumentPanelWindow::broughtToFront()\r
 {\r
     DocumentWindow::broughtToFront();\r
-    updateOrder();\r
+    updateActiveDocument();\r
 }\r
 \r
-void MultiDocumentPanelWindow::updateOrder()\r
+void MultiDocumentPanelWindow::updateActiveDocument()\r
 {\r
     if (auto* owner = getOwner())\r
-        owner->updateOrder();\r
+        owner->updateActiveDocumentFromUIState();\r
 }\r
 \r
 MultiDocumentPanel* MultiDocumentPanelWindow::getOwner() const noexcept\r
@@ -84,7 +84,7 @@ struct MultiDocumentPanel::TabbedComponentInternal   : public TabbedComponent
     void currentTabChanged (int, const String&) override\r
     {\r
         if (auto* owner = findParentComponentOfClass<MultiDocumentPanel>())\r
-            owner->updateOrder();\r
+            owner->updateActiveDocumentFromUIState();\r
     }\r
 };\r
 \r
@@ -262,22 +262,85 @@ bool MultiDocumentPanel::addDocument (Component* const component,
     }\r
 \r
     resized();\r
-    activeDocumentChanged();\r
+    updateActiveDocument (component);\r
     return true;\r
 }\r
 \r
-void MultiDocumentPanel::closeDocumentInternal (Component* component)\r
+void MultiDocumentPanel::recreateLayout()\r
+{\r
+    tabComponent.reset();\r
+\r
+    for (int i = getNumChildComponents(); --i >= 0;)\r
+    {\r
+        std::unique_ptr<MultiDocumentPanelWindow> dw (dynamic_cast<MultiDocumentPanelWindow*> (getChildComponent (i)));\r
+\r
+        if (dw != nullptr)\r
+        {\r
+            dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString());\r
+            dw->clearContentComponent();\r
+        }\r
+    }\r
+\r
+    resized();\r
+\r
+    auto tempComps = components;\r
+    components.clear();\r
+\r
+    {\r
+        // We want to preserve the activeComponent, so we are blocking the changes originating\r
+        // from addDocument()\r
+        const ScopedValueSetter<bool> scope { isLayoutBeingChanged, true };\r
+\r
+        for (auto* c : tempComps)\r
+            addDocument (c,\r
+                         Colour ((uint32) static_cast<int> (c->getProperties().getWithDefault ("mdiDocumentBkg_",\r
+                                                                                               (int) Colours::white.getARGB()))),\r
+                         MultiDocHelpers::shouldDeleteComp (c));\r
+    }\r
+\r
+    if (activeComponent != nullptr)\r
+        setActiveDocument (activeComponent);\r
+\r
+    updateActiveDocumentFromUIState();\r
+}\r
+\r
+void MultiDocumentPanel::closeDocumentInternal (Component* componentToClose)\r
 {\r
     // Intellisense warns about component being uninitialised.\r
     // I'm not sure how a function argument could be uninitialised.\r
     JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6001)\r
 \r
+    const OptionalScopedPointer<Component> component { componentToClose,\r
+                                                       MultiDocHelpers::shouldDeleteComp (componentToClose) };\r
+\r
     component->removeComponentListener (this);\r
 \r
-    const bool shouldDelete = MultiDocHelpers::shouldDeleteComp (component);\r
     component->getProperties().remove ("mdiDocumentDelete_");\r
     component->getProperties().remove ("mdiDocumentBkg_");\r
 \r
+    const auto removedIndex = components.indexOf (component);\r
+\r
+    if (removedIndex < 0)\r
+    {\r
+        jassertfalse;\r
+        return;\r
+    }\r
+\r
+    components.remove (removedIndex);\r
+\r
+    // See if the active document needs to change because of closing a document. It should only\r
+    // change if we closed the active document. If so, the next active document should be the\r
+    // subsequent one.\r
+    if (component == activeComponent)\r
+    {\r
+        auto* newActiveComponent = components[jmin (removedIndex, components.size() - 1)];\r
+        updateActiveDocument (newActiveComponent);\r
+    }\r
+\r
+    // We update the UI to reflect the new state, but we want to prevent the UI state callback\r
+    // to change the active document.\r
+    const ScopedValueSetter<bool> scope { isLayoutBeingChanged, true };\r
+\r
     if (mode == FloatingWindows)\r
     {\r
         for (auto* child : getChildren())\r
@@ -292,11 +355,6 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component)
             }\r
         }\r
 \r
-        if (shouldDelete)\r
-            delete component;\r
-\r
-        components.removeFirstMatchingValue (component);\r
-\r
         if (isFullscreenWhenOneDocument() && components.size() == 1)\r
         {\r
             for (int i = getNumChildComponents(); --i >= 0;)\r
@@ -307,13 +365,11 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component)
                     dw->clearContentComponent();\r
             }\r
 \r
-            addAndMakeVisible (components.getFirst());\r
+            addAndMakeVisible (getActiveDocument());\r
         }\r
     }\r
     else\r
     {\r
-        jassert (components.indexOf (component) >= 0);\r
-\r
         if (tabComponent != nullptr)\r
         {\r
             for (int i = tabComponent->getNumTabs(); --i >= 0;)\r
@@ -325,25 +381,18 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component)
             removeChildComponent (component);\r
         }\r
 \r
-        if (shouldDelete)\r
-            delete component;\r
-\r
-        if (tabComponent != nullptr && tabComponent->getNumTabs() <= numDocsBeforeTabsUsed)\r
+        if (components.size() <= numDocsBeforeTabsUsed && getActiveDocument() != nullptr)\r
+        {\r
             tabComponent.reset();\r
-\r
-        components.removeFirstMatchingValue (component);\r
-\r
-        if (components.size() > 0 && tabComponent == nullptr)\r
-            addAndMakeVisible (components.getFirst());\r
+            addAndMakeVisible (getActiveDocument());\r
+        }\r
     }\r
 \r
     resized();\r
 \r
     // This ensures that the active tab is painted properly when a tab is closed!\r
-    if (auto* activeComponent = getActiveDocument())\r
-        setActiveDocument (activeComponent);\r
-\r
-    activeDocumentChanged();\r
+    if (auto* activeDocument = getActiveDocument())\r
+        setActiveDocument (activeDocument);\r
 \r
     JUCE_END_IGNORE_WARNINGS_MSVC\r
 }\r
@@ -438,15 +487,7 @@ Component* MultiDocumentPanel::getDocument (const int index) const noexcept
 \r
 Component* MultiDocumentPanel::getActiveDocument() const noexcept\r
 {\r
-    if (mode == FloatingWindows)\r
-    {\r
-        for (auto* child : getChildren())\r
-            if (auto* dw = dynamic_cast<MultiDocumentPanelWindow*> (child))\r
-                if (dw->isActiveWindow())\r
-                    return dw->getContentComponent();\r
-    }\r
-\r
-    return components.getLast();\r
+    return activeComponent;\r
 }\r
 \r
 void MultiDocumentPanel::setActiveDocument (Component* component)\r
@@ -490,7 +531,10 @@ void MultiDocumentPanel::setMaximumNumDocuments (const int newNumber)
 \r
 void MultiDocumentPanel::useFullscreenWhenOneDocument (const bool shouldUseTabs)\r
 {\r
-    numDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0;\r
+    const auto newNumDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0;\r
+\r
+    if (std::exchange (numDocsBeforeTabsUsed, newNumDocsBeforeTabsUsed) != newNumDocsBeforeTabsUsed)\r
+        recreateLayout();\r
 }\r
 \r
 bool MultiDocumentPanel::isFullscreenWhenOneDocument() const noexcept\r
@@ -501,38 +545,8 @@ bool MultiDocumentPanel::isFullscreenWhenOneDocument() const noexcept
 //==============================================================================\r
 void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode)\r
 {\r
-    if (mode != newLayoutMode)\r
-    {\r
-        mode = newLayoutMode;\r
-\r
-        if (mode == FloatingWindows)\r
-        {\r
-            tabComponent.reset();\r
-        }\r
-        else\r
-        {\r
-            for (int i = getNumChildComponents(); --i >= 0;)\r
-            {\r
-                std::unique_ptr<MultiDocumentPanelWindow> dw (dynamic_cast<MultiDocumentPanelWindow*> (getChildComponent (i)));\r
-\r
-                if (dw != nullptr)\r
-                {\r
-                    dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString());\r
-                    dw->clearContentComponent();\r
-                }\r
-            }\r
-        }\r
-\r
-        resized();\r
-\r
-        auto tempComps = components;\r
-        components.clear();\r
-\r
-        for (auto* c : tempComps)\r
-            addDocument (c,\r
-                         Colour ((uint32) static_cast<int> (c->getProperties().getWithDefault ("mdiDocumentBkg_", (int) Colours::white.getARGB()))),\r
-                         MultiDocHelpers::shouldDeleteComp (c));\r
-    }\r
+    if (std::exchange (mode, newLayoutMode) != newLayoutMode)\r
+        recreateLayout();\r
 }\r
 \r
 void MultiDocumentPanel::setBackgroundColour (Colour newBackgroundColour)\r
@@ -590,31 +604,36 @@ void MultiDocumentPanel::componentNameChanged (Component&)
     }\r
 }\r
 \r
-void MultiDocumentPanel::updateOrder()\r
+void MultiDocumentPanel::updateActiveDocumentFromUIState()\r
 {\r
-    auto oldList = components;\r
-\r
-    if (mode == FloatingWindows)\r
-    {\r
-        components.clear();\r
-\r
-        for (auto* child : getChildren())\r
-            if (auto* dw = dynamic_cast<MultiDocumentPanelWindow*> (child))\r
-                components.add (dw->getContentComponent());\r
-    }\r
-    else\r
+    auto* newActiveComponent = [&]() -> Component*\r
     {\r
-        if (tabComponent != nullptr)\r
+        if (mode == FloatingWindows)\r
         {\r
-            if (auto* current = tabComponent->getCurrentContentComponent())\r
+            for (auto* c : components)\r
             {\r
-                components.removeFirstMatchingValue (current);\r
-                components.add (current);\r
+                if (auto* window = static_cast<MultiDocumentPanelWindow*> (c->getParentComponent()))\r
+                    if (window->isActiveWindow())\r
+                        return c;\r
             }\r
         }\r
-    }\r
 \r
-    if (components != oldList)\r
+        if (tabComponent != nullptr)\r
+            if (auto* current = tabComponent->getCurrentContentComponent())\r
+                return current;\r
+\r
+        return activeComponent;\r
+    }();\r
+\r
+    updateActiveDocument (newActiveComponent);\r
+}\r
+\r
+void MultiDocumentPanel::updateActiveDocument (Component* component)\r
+{\r
+    if (isLayoutBeingChanged)\r
+        return;\r
+\r
+    if (std::exchange (activeComponent, component) != component)\r
         activeDocumentChanged();\r
 }\r
 \r
index 52ed931186544cbeb9a48636408ae8020cce436e..2a4148978511a56696368a8f49286d2d141475f7 100644 (file)
@@ -64,7 +64,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    void updateOrder();\r
+    void updateActiveDocument();\r
     MultiDocumentPanel* getOwner() const noexcept;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiDocumentPanelWindow)\r
@@ -362,11 +362,15 @@ private:
     friend class MultiDocumentPanelWindow;\r
 \r
     Component* getContainerComp (Component*) const;\r
-    void updateOrder();\r
+    void updateActiveDocumentFromUIState();\r
+    void updateActiveDocument (Component*);\r
     void addWindow (Component*);\r
+    void recreateLayout();\r
 \r
     LayoutMode mode = MaximisedWindowsWithTabs;\r
     Array<Component*> components;\r
+    Component* activeComponent = nullptr;\r
+    bool isLayoutBeingChanged = false;\r
     std::unique_ptr<TabbedComponent> tabComponent;\r
     Colour backgroundColour { Colours::lightblue };\r
     int maximumNumDocuments = 0, numDocsBeforeTabsUsed = 0;\r
index 99bec2c987c092bc33f5a3cda155699a3d95c612..328b46f7c54b0b3ce601a0d699e76c7c766c38b8 100644 (file)
@@ -223,41 +223,47 @@ void MenuBarComponent::updateItemUnderMouse (Point<int> p)
 \r
 void MenuBarComponent::showMenu (int index)\r
 {\r
-    if (index != currentPopupIndex)\r
-    {\r
-        PopupMenu::dismissAllActiveMenus();\r
-        menuBarItemsChanged (nullptr);\r
+    if (index == currentPopupIndex)\r
+        return;\r
 \r
-        setOpenItem (index);\r
-        setItemUnderMouse (index);\r
+    const auto needToOpenNewSubMenu = isPositiveAndBelow (index, (int) itemComponents.size());\r
 \r
-        if (isPositiveAndBelow (index, (int) itemComponents.size()))\r
-        {\r
-            const auto& itemComponent = itemComponents[(size_t) index];\r
-            auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName());\r
+    if (needToOpenNewSubMenu)\r
+        ++numActiveMenus;\r
 \r
-            if (m.lookAndFeel == nullptr)\r
-                m.setLookAndFeel (&getLookAndFeel());\r
+    PopupMenu::dismissAllActiveMenus();\r
+    menuBarItemsChanged (nullptr);\r
 \r
-            auto itemBounds = itemComponent->getBounds();\r
+    setOpenItem (index);\r
+    setItemUnderMouse (index);\r
 \r
-            const auto callback = [ref = SafePointer<MenuBarComponent> (this), index] (int result)\r
-            {\r
-                if (ref != nullptr)\r
-                    ref->menuDismissed (index, result);\r
-            };\r
-\r
-            m.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
-                                                 .withTargetScreenArea (localAreaToGlobal (itemBounds))\r
-                                                 .withMinimumWidth (itemBounds.getWidth()),\r
-                             callback);\r
-        }\r
+    if (needToOpenNewSubMenu)\r
+    {\r
+        const auto& itemComponent = itemComponents[(size_t) index];\r
+        auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName());\r
+\r
+        if (m.lookAndFeel == nullptr)\r
+            m.setLookAndFeel (&getLookAndFeel());\r
+\r
+        auto itemBounds = itemComponent->getBounds();\r
+\r
+        const auto callback = [ref = SafePointer<MenuBarComponent> (this), index] (int result)\r
+        {\r
+            if (ref != nullptr)\r
+                ref->menuDismissed (index, result);\r
+        };\r
+\r
+        m.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
+                                             .withTargetScreenArea (localAreaToGlobal (itemBounds))\r
+                                             .withMinimumWidth (itemBounds.getWidth()),\r
+                         callback);\r
     }\r
 }\r
 \r
 void MenuBarComponent::menuDismissed (int topLevelIndex, int itemId)\r
 {\r
-    topLevelIndexClicked = topLevelIndex;\r
+    topLevelIndexDismissed = topLevelIndex;\r
+    --numActiveMenus;\r
     postCommandMessage (itemId);\r
 }\r
 \r
@@ -265,11 +271,11 @@ void MenuBarComponent::handleCommandMessage (int commandId)
 {\r
     updateItemUnderMouse (getMouseXYRelative());\r
 \r
-    if (currentPopupIndex == topLevelIndexClicked)\r
+    if (numActiveMenus == 0)\r
         setOpenItem (-1);\r
 \r
     if (commandId != 0 && model != nullptr)\r
-        model->menuItemSelected (commandId, topLevelIndexClicked);\r
+        model->menuItemSelected (commandId, topLevelIndexDismissed);\r
 }\r
 \r
 //==============================================================================\r
index 602e7bf0a6793c239eb4b5fafb537fe27768ea48..d17613168c8e44f5151446e67cfb5d8816453824 100644 (file)
@@ -119,7 +119,8 @@ private:
     std::vector<std::unique_ptr<AccessibleItemComponent>> itemComponents;\r
 \r
     Point<int> lastMousePos;\r
-    int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexClicked = 0;\r
+    int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexDismissed = 0;\r
+    int numActiveMenus = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MenuBarComponent)\r
 };\r
index 44604f2cfb039cfd25609d000e71220e0ec8a4f4..384331d12d6998e40312a0d04a8055072802f3af 100644 (file)
@@ -86,20 +86,87 @@ private:
     JUCE_DECLARE_NON_COPYABLE (ShadowWindow)\r
 };\r
 \r
-class DropShadower::ParentVisibilityChangedListener  : public ComponentListener,\r
-                                                       private Timer\r
+class DropShadower::VirtualDesktopWatcher final  : public ComponentListener,\r
+                                                   private Timer\r
+{\r
+public:\r
+    //==============================================================================\r
+    VirtualDesktopWatcher (Component& c) : component (&c)\r
+    {\r
+        component->addComponentListener (this);\r
+        update();\r
+    }\r
+\r
+    ~VirtualDesktopWatcher() override\r
+    {\r
+        stopTimer();\r
+\r
+        if (auto* c = component.get())\r
+            c->removeComponentListener (this);\r
+    }\r
+\r
+    bool shouldHideDropShadow() const\r
+    {\r
+        return hasReasonToHide;\r
+    }\r
+\r
+    void addListener (void* listener, std::function<void()> cb)\r
+    {\r
+        listeners[listener] = std::move (cb);\r
+    }\r
+\r
+    void removeListener (void* listener)\r
+    {\r
+        listeners.erase (listener);\r
+    }\r
+\r
+    //==============================================================================\r
+    void componentParentHierarchyChanged (Component& c) override\r
+    {\r
+        if (component.get() == &c)\r
+            update();\r
+    }\r
+\r
+private:\r
+    //==============================================================================\r
+    void update()\r
+    {\r
+        const auto newHasReasonToHide = [this]()\r
+        {\r
+            if (! component.wasObjectDeleted() && isWindows && component->isOnDesktop())\r
+            {\r
+                startTimerHz (5);\r
+                return ! isWindowOnCurrentVirtualDesktop (component->getWindowHandle());\r
+            }\r
+\r
+            stopTimer();\r
+            return false;\r
+        }();\r
+\r
+        if (std::exchange (hasReasonToHide, newHasReasonToHide) != newHasReasonToHide)\r
+            for (auto& l : listeners)\r
+                l.second();\r
+    }\r
+\r
+    void timerCallback() override\r
+    {\r
+        update();\r
+    }\r
+\r
+    //==============================================================================\r
+    WeakReference<Component> component;\r
+    const bool isWindows = (SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0;\r
+    bool hasReasonToHide = false;\r
+    std::map<void*, std::function<void()>> listeners;\r
+};\r
+\r
+class DropShadower::ParentVisibilityChangedListener  : public ComponentListener\r
 {\r
 public:\r
     ParentVisibilityChangedListener (Component& r, ComponentListener& l)\r
         : root (&r), listener (&l)\r
     {\r
         updateParentHierarchy();\r
-\r
-        if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0)\r
-        {\r
-            isOnVirtualDesktop = isWindowOnCurrentVirtualDesktop (root->getWindowHandle());\r
-            startTimerHz (5);\r
-        }\r
     }\r
 \r
     ~ParentVisibilityChangedListener() override\r
@@ -121,8 +188,6 @@ public:
             updateParentHierarchy();\r
     }\r
 \r
-    bool isWindowOnVirtualDesktop() const noexcept  { return isOnVirtualDesktop; }\r
-\r
 private:\r
     class ComponentWithWeakReference\r
     {\r
@@ -165,26 +230,9 @@ private:
         withDifference (observedComponents, lastSeenComponents, [this] (auto& comp) { comp.addComponentListener (this); });\r
     }\r
 \r
-    void timerCallback() override\r
-    {\r
-        WeakReference<DropShadower> deletionChecker { static_cast<DropShadower*> (listener) };\r
-\r
-        const auto wasOnVirtualDesktop = std::exchange (isOnVirtualDesktop,\r
-                                                        isWindowOnCurrentVirtualDesktop (root->getWindowHandle()));\r
-\r
-        // on Windows, isWindowOnCurrentVirtualDesktop() may cause synchronous messages to be dispatched\r
-        // to the HWND so we need to check if the shadower is still valid after calling\r
-        if (deletionChecker == nullptr)\r
-            return;\r
-\r
-        if (isOnVirtualDesktop != wasOnVirtualDesktop)\r
-            listener->componentVisibilityChanged (*root);\r
-    }\r
-\r
     Component* root = nullptr;\r
     ComponentListener* listener = nullptr;\r
     std::set<ComponentWithWeakReference> observedComponents;\r
-    bool isOnVirtualDesktop = true;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (ParentVisibilityChangedListener)\r
     JUCE_DECLARE_NON_MOVEABLE (ParentVisibilityChangedListener)\r
@@ -195,6 +243,9 @@ DropShadower::DropShadower (const DropShadow& ds)  : shadow (ds)  {}
 \r
 DropShadower::~DropShadower()\r
 {\r
+    if (virtualDesktopWatcher != nullptr)\r
+        virtualDesktopWatcher->removeListener (this);\r
+\r
     if (owner != nullptr)\r
     {\r
         owner->removeComponentListener (this);\r
@@ -228,6 +279,9 @@ void DropShadower::setOwner (Component* componentToFollow)
         visibilityChangedListener = std::make_unique<ParentVisibilityChangedListener> (*owner,\r
                                                                                        static_cast<ComponentListener&> (*this));\r
 \r
+        virtualDesktopWatcher = std::make_unique<VirtualDesktopWatcher> (*owner);\r
+        virtualDesktopWatcher->addListener (this, [this]() { updateShadows(); });\r
+\r
         updateShadows();\r
     }\r
 }\r
@@ -286,7 +340,7 @@ void DropShadower::updateShadows()
         && owner->isShowing()\r
         && owner->getWidth() > 0 && owner->getHeight() > 0\r
         && (Desktop::canUseSemiTransparentWindows() || owner->getParentComponent() != nullptr)\r
-        && (visibilityChangedListener != nullptr && visibilityChangedListener->isWindowOnVirtualDesktop()))\r
+        && (virtualDesktopWatcher == nullptr || ! virtualDesktopWatcher->shouldHideDropShadow()))\r
     {\r
         while (shadowWindows.size() < 4)\r
             shadowWindows.add (new ShadowWindow (owner, shadow));\r
index 816b785275b78869f85653f516be46dd213c6720..08ad6b15ccb9288c85a3c817bcb26f48334755ca 100644 (file)
@@ -77,6 +77,9 @@ private:
     class ParentVisibilityChangedListener;\r
     std::unique_ptr<ParentVisibilityChangedListener> visibilityChangedListener;\r
 \r
+    class VirtualDesktopWatcher;\r
+    std::unique_ptr<VirtualDesktopWatcher> virtualDesktopWatcher;\r
+\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DropShadower)\r
     JUCE_DECLARE_WEAK_REFERENCEABLE (DropShadower)\r
 };\r
index e534e1909e92086e8116b0dcdfb72d4d630c5fe3..d2b5bb268f31eb6f713fe8246e984f33ba9e4ff0 100644 (file)
@@ -138,6 +138,8 @@ public:
 \r
         setVisible (newTarget == nullptr || newTarget->shouldDrawDragImageWhenOver());\r
 \r
+        maintainKeyboardFocusWhenPossible();\r
+\r
         if (newTargetComp != currentlyOverComp)\r
         {\r
             if (auto* lastTarget = getCurrentlyOver())\r
@@ -233,6 +235,16 @@ private:
     Time lastTimeOverTarget;\r
     int originalInputSourceIndex;\r
     MouseInputSource::InputSourceType originalInputSourceType;\r
+    bool canHaveKeyboardFocus = false;\r
+\r
+    void maintainKeyboardFocusWhenPossible()\r
+    {\r
+        const auto newCanHaveKeyboardFocus = isVisible();\r
+\r
+        if (std::exchange (canHaveKeyboardFocus, newCanHaveKeyboardFocus) != newCanHaveKeyboardFocus)\r
+            if (canHaveKeyboardFocus)\r
+                grabKeyboardFocus();\r
+    }\r
 \r
     void updateSize()\r
     {\r
@@ -489,7 +501,6 @@ void DragAndDropContainer::startDragging (const var& sourceDescription,
 \r
     dragImageComponent->sourceDetails.localPosition = sourceComponent->getLocalPoint (nullptr, lastMouseDown);\r
     dragImageComponent->updateLocation (false, lastMouseDown);\r
-    dragImageComponent->grabKeyboardFocus();\r
 \r
    #if JUCE_WINDOWS\r
     // Under heavy load, the layered window's paint callback can often be lost by the OS,\r
index 6eeae8d64441c8118e7cf27b2227c9a76c5b22da..1ac5ed6705b2eb5d0a19207eb821fdda7fced30d 100644 (file)
@@ -29,7 +29,6 @@ namespace juce
 #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD (constructor,              "<init>",                   "()V") \\r
  METHOD (setSource,                "setSource",                "(Landroid/view/View;I)V") \\r
  METHOD (addChild,                 "addChild",                 "(Landroid/view/View;I)V") \\r
  METHOD (setParent,                "setParent",                "(Landroid/view/View;)V") \\r
@@ -56,6 +55,25 @@ namespace juce
  DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo, "android/view/accessibility/AccessibilityNodeInfo")\r
 #undef JNI_CLASS_MEMBERS\r
 \r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (setCollectionInfo, "setCollectionInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V") \\r
+ METHOD (setCollectionItemInfo, "setCollectionItemInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V")\r
+\r
+ DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo19, "android/view/accessibility/AccessibilityNodeInfo")\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (obtain, "obtain", "(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionInfo", 19)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (obtain, "obtain", "(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionItemInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo", 19)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
  STATICMETHOD (obtain, "obtain", "(I)Landroid/view/accessibility/AccessibilityEvent;") \\r
  METHOD (setPackageName, "setPackageName", "(Ljava/lang/CharSequence;)V") \\r
@@ -124,6 +142,18 @@ static jmethodID nodeInfoSetTextSelection                = nullptr;
 static jmethodID nodeInfoSetLiveRegion                   = nullptr;\r
 static jmethodID accessibilityEventSetContentChangeTypes = nullptr;\r
 \r
+template <typename MemberFn>\r
+static AccessibilityHandler* getEnclosingHandlerWithInterface (AccessibilityHandler* handler, MemberFn fn)\r
+{\r
+    if (handler == nullptr)\r
+        return nullptr;\r
+\r
+    if ((handler->*fn)() != nullptr)\r
+        return handler;\r
+\r
+    return getEnclosingHandlerWithInterface (handler->getParent(), fn);\r
+}\r
+\r
 static void loadSDKDependentMethods()\r
 {\r
     static bool hasChecked = false;\r
@@ -160,8 +190,6 @@ static constexpr auto getClassName (AccessibilityRole role)
         case AccessibilityRole::popupMenu:     return "android.widget.PopupMenu";\r
         case AccessibilityRole::comboBox:      return "android.widget.Spinner";\r
         case AccessibilityRole::tree:          return "android.widget.ExpandableListView";\r
-        case AccessibilityRole::list:          return "android.widget.ListView";\r
-        case AccessibilityRole::table:         return "android.widget.TableLayout";\r
         case AccessibilityRole::progressBar:   return "android.widget.ProgressBar";\r
 \r
         case AccessibilityRole::scrollBar:\r
@@ -177,6 +205,11 @@ static constexpr auto getClassName (AccessibilityRole role)
         case AccessibilityRole::splashScreen:\r
         case AccessibilityRole::dialogWindow:  return "android.widget.PopupWindow";\r
 \r
+        // If we don't supply a custom class type, then TalkBack will use the node's CollectionInfo\r
+        // to make a sensible decision about how to describe the container\r
+        case AccessibilityRole::list:\r
+        case AccessibilityRole::table:\r
+\r
         case AccessibilityRole::column:\r
         case AccessibilityRole::row:\r
         case AccessibilityRole::cell:\r
@@ -437,6 +470,63 @@ public:
                 }\r
             }\r
         }\r
+\r
+        if (getAndroidSDKVersion() >= 19)\r
+        {\r
+            if (auto* tableInterface = accessibilityHandler.getTableInterface())\r
+            {\r
+                const auto rows    = tableInterface->getNumRows();\r
+                const auto columns = tableInterface->getNumColumns();\r
+                const LocalRef<jobject> collectionInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionInfo,\r
+                                                                                      AndroidAccessibilityNodeInfoCollectionInfo.obtain,\r
+                                                                                      (jint) rows,\r
+                                                                                      (jint) columns,\r
+                                                                                      (jboolean) false) };\r
+                env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionInfo, collectionInfo.get());\r
+            }\r
+\r
+            if (auto* enclosingTableHandler = getEnclosingHandlerWithInterface (&accessibilityHandler, &AccessibilityHandler::getTableInterface))\r
+            {\r
+                auto* interface = enclosingTableHandler->getTableInterface();\r
+                jassert (interface != nullptr);\r
+                const auto rowSpan    = interface->getRowSpan    (accessibilityHandler);\r
+                const auto columnSpan = interface->getColumnSpan (accessibilityHandler);\r
+\r
+                enum class IsHeader { no, yes };\r
+\r
+                const auto addCellInfo = [env, &info] (AccessibilityTableInterface::Span rows, AccessibilityTableInterface::Span columns, IsHeader header)\r
+                {\r
+                    const LocalRef<jobject> collectionItemInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionItemInfo,\r
+                                                                                              AndroidAccessibilityNodeInfoCollectionItemInfo.obtain,\r
+                                                                                              (jint) rows.begin,\r
+                                                                                              (jint) rows.num,\r
+                                                                                              (jint) columns.begin,\r
+                                                                                              (jint) columns.num,\r
+                                                                                              (jboolean) (header == IsHeader::yes)) };\r
+                    env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionItemInfo, collectionItemInfo.get());\r
+                };\r
+\r
+                if (rowSpan.hasValue() && columnSpan.hasValue())\r
+                {\r
+                    addCellInfo (*rowSpan, *columnSpan, IsHeader::no);\r
+                }\r
+                else\r
+                {\r
+                    if (auto* tableHeader = interface->getHeaderHandler())\r
+                    {\r
+                        if (accessibilityHandler.getParent() == tableHeader)\r
+                        {\r
+                            const auto children = tableHeader->getChildren();\r
+                            const auto column = std::distance (children.cbegin(), std::find (children.cbegin(), children.cend(), &accessibilityHandler));\r
+\r
+                            // Talkback will only treat a row as a column header if its row index is zero\r
+                            // https://github.com/google/talkback/blob/acd0bc7631a3dfbcf183789c7557596a45319e1f/utils/src/main/java/CollectionState.java#L853\r
+                            addCellInfo ({ 0, 1 }, { (int) column, 1 }, IsHeader::yes);\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
     }\r
 \r
     bool performAction (int action, jobject arguments)\r
index e1a5d1d1710479b451ed56552ea4c4bd8a05ff0a..5874ad3e0bcc6d3a5d277f7cf462f196b5445821 100644 (file)
@@ -37,39 +37,47 @@ static void juceFreeAccessibilityPlatformSpecificData (UIAccessibilityElement* e
 namespace juce\r
 {\r
 \r
-#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
- #define JUCE_IOS_CONTAINER_API_AVAILABLE 1\r
-#endif\r
-\r
 #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
 \r
-//==============================================================================\r
-static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler)\r
-{\r
-    const auto children = handler.getChildren();\r
-\r
-    NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
-\r
-    [accessibleChildren addObject: (id) handler.getNativeImplementation()];\r
-\r
-    for (auto* childHandler : children)\r
-    {\r
-        id accessibleElement = [&childHandler]\r
-        {\r
-            id native = (id) childHandler->getNativeImplementation();\r
-\r
-            if (childHandler->getChildren().size() > 0)\r
-                return [native accessibilityContainer];\r
-\r
-            return native;\r
-        }();\r
-\r
-        if (accessibleElement != nil)\r
-            [accessibleChildren addObject: accessibleElement];\r
-    }\r
-\r
-    return accessibleChildren;\r
-}\r
+template <typename> struct Signature;\r
+\r
+template <typename Result, typename... Args>\r
+struct Signature<Result (Args...)> {};\r
+\r
+// @selector isn't constexpr, so the 'sel' members are functions rather than static constexpr data members\r
+struct SignatureHasText                         : Signature<BOOL()>                                                              { static auto sel() { return @selector (hasText); } };\r
+struct SignatureSetSelectedTextRange            : Signature<void (UITextRange*)>                                                 { static auto sel() { return @selector (setSelectedTextRange:); } };\r
+struct SignatureSelectedTextRange               : Signature<UITextRange*()>                                                      { static auto sel() { return @selector (selectedTextRange); } };\r
+struct SignatureMarkedTextRange                 : Signature<UITextRange*()>                                                      { static auto sel() { return @selector (markedTextRange); } };\r
+struct SignatureSetMarkedTextSelectedRange      : Signature<void (NSString*, NSRange)>                                           { static auto sel() { return @selector (setMarkedText:selectedRange:); } };\r
+struct SignatureUnmarkText                      : Signature<void()>                                                              { static auto sel() { return @selector (unmarkText); } };\r
+struct SignatureMarkedTextStyle                 : Signature<NSDictionary<NSAttributedStringKey, id>*()>                          { static auto sel() { return @selector (markedTextStyle); } };\r
+struct SignatureSetMarkedTextStyle              : Signature<void (NSDictionary<NSAttributedStringKey, id>*)>                     { static auto sel() { return @selector (setMarkedTextStyle:); } };\r
+struct SignatureBeginningOfDocument             : Signature<UITextPosition*()>                                                   { static auto sel() { return @selector (beginningOfDocument); } };\r
+struct SignatureEndOfDocument                   : Signature<UITextPosition*()>                                                   { static auto sel() { return @selector (endOfDocument); } };\r
+struct SignatureTokenizer                       : Signature<id<UITextInputTokenizer>()>                                          { static auto sel() { return @selector (tokenizer); } };\r
+struct SignatureBaseWritingDirection            : Signature<NSWritingDirection (UITextPosition*, UITextStorageDirection)>        { static auto sel() { return @selector (baseWritingDirectionForPosition:inDirection:); } };\r
+struct SignatureCaretRectForPosition            : Signature<CGRect (UITextPosition*)>                                            { static auto sel() { return @selector (caretRectForPosition:); } };\r
+struct SignatureCharacterRangeByExtending       : Signature<UITextRange* (UITextPosition*, UITextLayoutDirection)>               { static auto sel() { return @selector (characterRangeByExtendingPosition:inDirection:); } };\r
+struct SignatureCharacterRangeAtPoint           : Signature<UITextRange* (CGPoint)>                                              { static auto sel() { return @selector (characterRangeAtPoint:); } };\r
+struct SignatureClosestPositionToPoint          : Signature<UITextPosition* (CGPoint)>                                           { static auto sel() { return @selector (closestPositionToPoint:); } };\r
+struct SignatureClosestPositionToPointInRange   : Signature<UITextPosition* (CGPoint, UITextRange*)>                             { static auto sel() { return @selector (closestPositionToPoint:withinRange:); } };\r
+struct SignatureComparePositionToPosition       : Signature<NSComparisonResult (UITextPosition*, UITextPosition*)>               { static auto sel() { return @selector (comparePosition:toPosition:); } };\r
+struct SignatureOffsetFromPositionToPosition    : Signature<NSInteger (UITextPosition*, UITextPosition*)>                        { static auto sel() { return @selector (offsetFromPosition:toPosition:); } };\r
+struct SignaturePositionFromPositionInDirection : Signature<UITextPosition* (UITextPosition*, UITextLayoutDirection, NSInteger)> { static auto sel() { return @selector (positionFromPosition:inDirection:offset:); } };\r
+struct SignaturePositionFromPositionOffset      : Signature<UITextPosition* (UITextPosition*, NSInteger)>                        { static auto sel() { return @selector (positionFromPosition:offset:); } };\r
+struct SignatureFirstRectForRange               : Signature<CGRect (UITextRange*)>                                               { static auto sel() { return @selector (firstRectForRange:); } };\r
+struct SignatureSelectionRectsForRange          : Signature<NSArray<UITextSelectionRect*>* (UITextRange*)>                       { static auto sel() { return @selector (selectionRectsForRange:); } };\r
+struct SignaturePositionWithinRange             : Signature<UITextPosition* (UITextRange*, UITextLayoutDirection)>               { static auto sel() { return @selector (positionWithinRange:farthestInDirection:); } };\r
+struct SignatureReplaceRangeWithText            : Signature<void (UITextRange*, NSString*)>                                      { static auto sel() { return @selector (replaceRange:withText:); } };\r
+struct SignatureSetBaseWritingDirection         : Signature<void (NSWritingDirection, UITextRange*)>                             { static auto sel() { return @selector (setBaseWritingDirection:forRange:); } };\r
+struct SignatureTextInRange                     : Signature<NSString* (UITextRange*)>                                            { static auto sel() { return @selector (textInRange:); } };\r
+struct SignatureTextRangeFromPosition           : Signature<UITextRange* (UITextPosition*, UITextPosition*)>                     { static auto sel() { return @selector (textRangeFromPosition:toPosition:); } };\r
+struct SignatureSetInputDelegate                : Signature<void (id)>                                                           { static auto sel() { return @selector (setInputDelegate:); } };\r
+struct SignatureInputDelegate                   : Signature<id()>                                                                { static auto sel() { return @selector (inputDelegate); } };\r
+struct SignatureKeyboardType                    : Signature<UIKeyboardType()>                                                    { static auto sel() { return @selector (keyboardType); } };\r
+struct SignatureAutocapitalizationType          : Signature<UITextAutocapitalizationType()>                                      { static auto sel() { return @selector (autocapitalizationType); } };\r
+struct SignatureAutocorrectionType              : Signature<UITextAutocorrectionType()>                                          { static auto sel() { return @selector (autocorrectionType); } };\r
 \r
 //==============================================================================\r
 class AccessibilityHandler::AccessibilityNativeImpl\r
@@ -87,88 +95,131 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    class AccessibilityContainer  : public ObjCClass<UIAccessibilityElement>\r
+    class AccessibilityContainer  : public AccessibleObjCClass<NSObject>\r
     {\r
     public:\r
         AccessibilityContainer()\r
-            : ObjCClass ("JUCEUIAccessibilityElementContainer_")\r
+            : AccessibleObjCClass ("JUCEUIAccessibilityContainer_")\r
         {\r
-            addMethod (@selector (isAccessibilityElement),     getIsAccessibilityElement);\r
-            addMethod (@selector (accessibilityFrame),         getAccessibilityFrame);\r
-            addMethod (@selector (accessibilityElements),      getAccessibilityElements);\r
+            addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return false; });\r
 \r
-           #if JUCE_IOS_CONTAINER_API_AVAILABLE\r
-            if (@available (iOS 11.0, *))\r
-                addMethod (@selector (accessibilityContainerType), getAccessibilityContainerType);\r
-           #endif\r
+            addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return convertToCGRect (handler->getComponent().getScreenBounds());\r
 \r
-            addIvar<AccessibilityHandler*> ("handler");\r
+                return CGRectZero;\r
+            });\r
 \r
-            registerClass();\r
-        }\r
+            addMethod (@selector (accessibilityElements), [] (id self, SEL) -> NSArray*\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return getContainerAccessibilityElements (*handler);\r
 \r
-    private:\r
-        static AccessibilityHandler* getHandler (id self)\r
-        {\r
-            return getIvar<AccessibilityHandler*> (self, "handler");\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static BOOL getIsAccessibilityElement (id, SEL)\r
-        {\r
-            return NO;\r
-        }\r
+            if (@available (iOS 11.0, *))\r
+            {\r
+                addMethod (@selector (accessibilityDataTableCellElementForRow:column:), [] (id self, SEL, NSUInteger row, NSUInteger column) -> id\r
+                {\r
+                    if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+                        if (auto* tableInterface = tableHandler->getTableInterface())\r
+                            if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column))\r
+                                if (auto* parent = getAccessibleParent (cellHandler))\r
+                                    return static_cast<id> (parent->getNativeImplementation());\r
 \r
-        static CGRect getAccessibilityFrame (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return convertToCGRect (handler->getComponent().getScreenBounds());\r
+                    return nil;\r
+                });\r
 \r
-            return CGRectZero;\r
-        }\r
+                addMethod (@selector (accessibilityRowCount),                           getAccessibilityRowCount);\r
+                addMethod (@selector (accessibilityColumnCount),                        getAccessibilityColumnCount);\r
 \r
-        static NSArray* getAccessibilityElements (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return getContainerAccessibilityElements (*handler);\r
+                addMethod (@selector (accessibilityHeaderElementsForColumn:), [] (id self, SEL, NSUInteger column) -> NSArray*\r
+                {\r
+                    if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+                    {\r
+                        if (auto* tableInterface = tableHandler->getTableInterface())\r
+                        {\r
+                            if (auto* header = tableInterface->getHeaderHandler())\r
+                            {\r
+                                if (isPositiveAndBelow (column, header->getChildren().size()))\r
+                                {\r
+                                    auto* result = [NSMutableArray new];\r
+                                    [result addObject: static_cast<id> (header->getChildren()[(size_t) column]->getNativeImplementation())];\r
+                                    return result;\r
+                                }\r
+                            }\r
+                        }\r
+                    }\r
 \r
-            return nil;\r
-        }\r
+                    return nullptr;\r
+                });\r
 \r
-        static NSInteger getAccessibilityContainerType (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-            {\r
-                if (handler->getTableInterface() != nullptr)\r
+                addProtocol (@protocol (UIAccessibilityContainerDataTable));\r
+\r
+                addMethod (@selector (accessibilityContainerType), [] (id self, SEL) -> NSInteger\r
                 {\r
-                    if (@available (iOS 11.0, *))\r
-                        return UIAccessibilityContainerTypeDataTable;\r
+                    if (auto* handler = getHandler (self))\r
+                    {\r
+                        if (handler->getTableInterface() != nullptr)\r
+                        {\r
+                            if (@available (iOS 11.0, *))\r
+                                return UIAccessibilityContainerTypeDataTable;\r
 \r
-                    return 1; // UIAccessibilityContainerTypeDataTable\r
-                }\r
+                            return 1; // UIAccessibilityContainerTypeDataTable\r
+                        }\r
 \r
-                const auto role = handler->getRole();\r
+                        const auto handlerRole = handler->getRole();\r
+\r
+                        if (handlerRole == AccessibilityRole::popupMenu\r
+                            || handlerRole == AccessibilityRole::list\r
+                            || handlerRole == AccessibilityRole::tree)\r
+                        {\r
+                            if (@available (iOS 11.0, *))\r
+                                return UIAccessibilityContainerTypeList;\r
+\r
+                            return 2; // UIAccessibilityContainerTypeList\r
+                        }\r
+                    }\r
 \r
-                if (role == AccessibilityRole::popupMenu\r
-                    || role == AccessibilityRole::list\r
-                    || role == AccessibilityRole::tree)\r
-                {\r
                     if (@available (iOS 11.0, *))\r
-                        return UIAccessibilityContainerTypeList;\r
+                        return UIAccessibilityContainerTypeNone;\r
 \r
-                    return 2; // UIAccessibilityContainerTypeList\r
-                }\r
+                    return 0; // UIAccessibilityContainerTypeNone\r
+                });\r
             }\r
 \r
-            if (@available (iOS 11.0, *))\r
-                return UIAccessibilityContainerTypeNone;\r
+            registerClass();\r
+        }\r
 \r
-            return 0; // UIAccessibilityContainerTypeNone\r
+    private:\r
+        static const AccessibilityHandler* getAccessibleParent (const AccessibilityHandler* h)\r
+        {\r
+            if (h == nullptr)\r
+                return nullptr;\r
+\r
+            if ([static_cast<id> (h->getNativeImplementation()) isAccessibilityElement])\r
+                return h;\r
+\r
+            return getAccessibleParent (h->getParent());\r
+        }\r
+\r
+        static AccessibilityHandler* getHandler (id self)\r
+        {\r
+            return getIvar<AccessibilityHandler*> (self, "handler");\r
         }\r
     };\r
 \r
     //==============================================================================\r
     class AccessibilityElement  : public AccessibleObjCClass<UIAccessibilityElement>\r
     {\r
+        template <typename Func, typename... Items>\r
+        static constexpr void forEach (Func&& func, Items&&... items)\r
+        {\r
+            (void) std::initializer_list<int> { ((void) func (std::forward<Items> (items)), 0)... };\r
+        }\r
+\r
     public:\r
         enum class Type  { defaultElement, textElement };\r
 \r
@@ -179,310 +230,349 @@ private:
 \r
             id instance = (hasEditableText (handler) ? textCls : cls).createInstance();\r
 \r
-            Holder element ([instance initWithAccessibilityContainer: (id) handler.getComponent().getWindowHandle()]);\r
+            Holder element ([instance initWithAccessibilityContainer: static_cast<id> (handler.getComponent().getWindowHandle())]);\r
             object_setInstanceVariable (element.get(), "handler", &handler);\r
             return element;\r
         }\r
 \r
         AccessibilityElement (Type elementType)\r
         {\r
-            addMethod (@selector (isAccessibilityElement),     getIsAccessibilityElement);\r
-            addMethod (@selector (accessibilityContainer),     getAccessibilityContainer);\r
-            addMethod (@selector (accessibilityFrame),         getAccessibilityFrame);\r
-            addMethod (@selector (accessibilityTraits),        getAccessibilityTraits);\r
-            addMethod (@selector (accessibilityLabel),         getAccessibilityTitle);\r
-            addMethod (@selector (accessibilityHint),          getAccessibilityHelp);\r
-            addMethod (@selector (accessibilityValue),         getAccessibilityValue);\r
-            addMethod (@selector (setAccessibilityValue:),     setAccessibilityValue);\r
-\r
-            addMethod (@selector (accessibilityElementDidBecomeFocused), onFocusGain);\r
-            addMethod (@selector (accessibilityElementDidLoseFocus),     onFocusLoss);\r
-            addMethod (@selector (accessibilityElementIsFocused),        isFocused);\r
-            addMethod (@selector (accessibilityViewIsModal),             getIsAccessibilityModal);\r
-\r
-            addMethod (@selector (accessibilityActivate),      accessibilityPerformActivate);\r
-            addMethod (@selector (accessibilityIncrement),     accessibilityPerformIncrement);\r
-            addMethod (@selector (accessibilityDecrement),     accessibilityPerformDecrement);\r
-            addMethod (@selector (accessibilityPerformEscape), accessibilityPerformEscape);\r
-\r
-           #if JUCE_IOS_CONTAINER_API_AVAILABLE\r
-            if (@available (iOS 11.0, *))\r
-            {\r
-                addMethod (@selector (accessibilityDataTableCellElementForRow:column:), getAccessibilityDataTableCellElementForRowColumn);\r
-                addMethod (@selector (accessibilityRowCount),                           getAccessibilityRowCount);\r
-                addMethod (@selector (accessibilityColumnCount),                        getAccessibilityColumnCount);\r
-                addProtocol (@protocol (UIAccessibilityContainerDataTable));\r
-\r
-                addMethod (@selector (accessibilityRowRange),                           getAccessibilityRowIndexRange);\r
-                addMethod (@selector (accessibilityColumnRange),                        getAccessibilityColumnIndexRange);\r
-                addProtocol (@protocol (UIAccessibilityContainerDataTableCell));\r
-            }\r
-           #endif\r
-\r
-            if (elementType == Type::textElement)\r
+            addMethod (@selector (isAccessibilityElement), [] (id self, SEL)\r
             {\r
-                addMethod (@selector (accessibilityLineNumberForPoint:),   getAccessibilityLineNumberForPoint);\r
-                addMethod (@selector (accessibilityContentForLineNumber:), getAccessibilityContentForLineNumber);\r
-                addMethod (@selector (accessibilityFrameForLineNumber:),   getAccessibilityFrameForLineNumber);\r
-                addMethod (@selector (accessibilityPageContent),           getAccessibilityPageContent);\r
+                auto* handler = getHandler (self);\r
 \r
-                addProtocol (@protocol (UIAccessibilityReadingContent));\r
-            }\r
+                const auto hasAccessiblePropertiesOrIsTableCell = [] (auto& handlerRef)\r
+                {\r
+                    const auto isTableCell = [&]\r
+                    {\r
+                        if (auto* tableHandler = getEnclosingHandlerWithInterface (&handlerRef, &AccessibilityHandler::getTableInterface))\r
+                        {\r
+                            if (auto* tableInterface = tableHandler->getTableInterface())\r
+                            {\r
+                                return tableInterface->getRowSpan    (handlerRef).hasValue()\r
+                                    && tableInterface->getColumnSpan (handlerRef).hasValue();\r
+                            }\r
+                        }\r
 \r
-            addIvar<UIAccessibilityElement*> ("container");\r
+                        return false;\r
+                    };\r
 \r
-            registerClass();\r
-        }\r
+                    return handlerRef.getTitle().isNotEmpty()\r
+                        || handlerRef.getHelp().isNotEmpty()\r
+                        || handlerRef.getTextInterface()  != nullptr\r
+                        || handlerRef.getValueInterface() != nullptr\r
+                        || isTableCell();\r
+                };\r
 \r
-    private:\r
-        //==============================================================================\r
-        static UIAccessibilityElement* getContainer (id self)\r
-        {\r
-            return getIvar<UIAccessibilityElement*> (self, "container");\r
-        }\r
+                return handler != nullptr\r
+                    && ! handler->isIgnored()\r
+                    && handler->getRole() != AccessibilityRole::window\r
+                    && hasAccessiblePropertiesOrIsTableCell (*handler);\r
+            });\r
 \r
-        //==============================================================================\r
-        static id getAccessibilityContainer (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityContainer), [] (id self, SEL) -> id\r
             {\r
-                if (handler->getComponent().isOnDesktop())\r
-                    return (id) handler->getComponent().getWindowHandle();\r
-\r
-                if (handler->getChildren().size() > 0)\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    if (UIAccessibilityElement* container = getContainer (self))\r
-                        return container;\r
+                    if (handler->getComponent().isOnDesktop())\r
+                        return static_cast<id> (handler->getComponent().getWindowHandle());\r
 \r
-                    static AccessibilityContainer cls;\r
-\r
-                    id windowHandle = (id) handler->getComponent().getWindowHandle();\r
-                    UIAccessibilityElement* container = [cls.createInstance() initWithAccessibilityContainer: windowHandle];\r
+                    if (! handler->getChildren().empty())\r
+                    {\r
+                        if (UIAccessibilityElement* container = getContainer (self))\r
+                            return container;\r
 \r
-                    [container retain];\r
+                        static AccessibilityContainer cls;\r
 \r
-                    object_setInstanceVariable (container, "handler", handler);\r
-                    object_setInstanceVariable (self, "container", container);\r
+                        id container = cls.createInstance();\r
 \r
-                    return container;\r
-                }\r
+                        object_setInstanceVariable (container, "handler", handler);\r
+                        object_setInstanceVariable (self, "container", container);\r
 \r
-                if (auto* parent = handler->getParent())\r
-                    return [(id) parent->getNativeImplementation() accessibilityContainer];\r
-            }\r
+                        return container;\r
+                    }\r
 \r
-            return nil;\r
-        }\r
+                    if (auto* parent = handler->getParent())\r
+                        return [static_cast<id> (parent->getNativeImplementation()) accessibilityContainer];\r
+                }\r
 \r
-        static CGRect getAccessibilityFrame (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return convertToCGRect (handler->getComponent().getScreenBounds());\r
+                return nil;\r
+            });\r
 \r
-            return CGRectZero;\r
-        }\r
+            addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return convertToCGRect (handler->getComponent().getScreenBounds());\r
 \r
-        static UIAccessibilityTraits getAccessibilityTraits (id self, SEL)\r
-        {\r
-            auto traits = UIAccessibilityTraits{};\r
+                return CGRectZero;\r
+            });\r
 \r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityTraits), [] (id self, SEL)\r
             {\r
-                traits |= [&handler]\r
+                auto traits = UIAccessibilityTraits{};\r
+\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    switch (handler->getRole())\r
+                    traits |= [&handler]\r
                     {\r
-                        case AccessibilityRole::button:\r
-                        case AccessibilityRole::toggleButton:\r
-                        case AccessibilityRole::radioButton:\r
-                        case AccessibilityRole::comboBox:      return UIAccessibilityTraitButton;\r
-\r
-                        case AccessibilityRole::label:\r
-                        case AccessibilityRole::staticText:    return UIAccessibilityTraitStaticText;\r
-\r
-                        case AccessibilityRole::image:         return UIAccessibilityTraitImage;\r
-                        case AccessibilityRole::tableHeader:   return UIAccessibilityTraitHeader;\r
-                        case AccessibilityRole::hyperlink:     return UIAccessibilityTraitLink;\r
-                        case AccessibilityRole::editableText:  return UIAccessibilityTraitKeyboardKey;\r
-                        case AccessibilityRole::ignored:       return UIAccessibilityTraitNotEnabled;\r
-\r
-                        case AccessibilityRole::slider:\r
-                        case AccessibilityRole::menuItem:\r
-                        case AccessibilityRole::menuBar:\r
-                        case AccessibilityRole::popupMenu:\r
-                        case AccessibilityRole::table:\r
-                        case AccessibilityRole::column:\r
-                        case AccessibilityRole::row:\r
-                        case AccessibilityRole::cell:\r
-                        case AccessibilityRole::list:\r
-                        case AccessibilityRole::listItem:\r
-                        case AccessibilityRole::tree:\r
-                        case AccessibilityRole::treeItem:\r
-                        case AccessibilityRole::progressBar:\r
-                        case AccessibilityRole::group:\r
-                        case AccessibilityRole::dialogWindow:\r
-                        case AccessibilityRole::window:\r
-                        case AccessibilityRole::scrollBar:\r
-                        case AccessibilityRole::tooltip:\r
-                        case AccessibilityRole::splashScreen:\r
-                        case AccessibilityRole::unspecified:   break;\r
-                    }\r
+                        switch (handler->getRole())\r
+                        {\r
+                            case AccessibilityRole::button:\r
+                            case AccessibilityRole::toggleButton:\r
+                            case AccessibilityRole::radioButton:\r
+                            case AccessibilityRole::comboBox:      return UIAccessibilityTraitButton;\r
+\r
+                            case AccessibilityRole::label:\r
+                            case AccessibilityRole::staticText:    return UIAccessibilityTraitStaticText;\r
+\r
+                            case AccessibilityRole::image:         return UIAccessibilityTraitImage;\r
+                            case AccessibilityRole::tableHeader:   return UIAccessibilityTraitHeader;\r
+                            case AccessibilityRole::hyperlink:     return UIAccessibilityTraitLink;\r
+                            case AccessibilityRole::ignored:       return UIAccessibilityTraitNotEnabled;\r
+\r
+                            case AccessibilityRole::editableText:  return UIAccessibilityTraitKeyboardKey;\r
+\r
+                            case AccessibilityRole::slider:\r
+                            case AccessibilityRole::menuItem:\r
+                            case AccessibilityRole::menuBar:\r
+                            case AccessibilityRole::popupMenu:\r
+                            case AccessibilityRole::table:\r
+                            case AccessibilityRole::column:\r
+                            case AccessibilityRole::row:\r
+                            case AccessibilityRole::cell:\r
+                            case AccessibilityRole::list:\r
+                            case AccessibilityRole::listItem:\r
+                            case AccessibilityRole::tree:\r
+                            case AccessibilityRole::treeItem:\r
+                            case AccessibilityRole::progressBar:\r
+                            case AccessibilityRole::group:\r
+                            case AccessibilityRole::dialogWindow:\r
+                            case AccessibilityRole::window:\r
+                            case AccessibilityRole::scrollBar:\r
+                            case AccessibilityRole::tooltip:\r
+                            case AccessibilityRole::splashScreen:\r
+                            case AccessibilityRole::unspecified:   break;\r
+                        }\r
 \r
-                    return UIAccessibilityTraitNone;\r
-                }();\r
+                        return UIAccessibilityTraitNone;\r
+                    }();\r
 \r
-                const auto state = handler->getCurrentState();\r
+                    const auto state = handler->getCurrentState();\r
 \r
-                if (state.isSelected() || state.isChecked())\r
-                    traits |= UIAccessibilityTraitSelected;\r
+                    if (state.isSelected() || state.isChecked())\r
+                        traits |= UIAccessibilityTraitSelected;\r
 \r
-                if (auto* valueInterface = getValueInterface (self))\r
-                    if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid())\r
-                        traits |= UIAccessibilityTraitAdjustable;\r
-            }\r
+                    if (auto* valueInterface = getValueInterface (self))\r
+                        if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid())\r
+                            traits |= UIAccessibilityTraitAdjustable;\r
+                }\r
 \r
-            return traits | sendSuperclassMessage<UIAccessibilityTraits> (self, @selector (accessibilityTraits));\r
-        }\r
+                return traits | sendSuperclassMessage<UIAccessibilityTraits> (self, @selector (accessibilityTraits));\r
+            });\r
 \r
-        static NSString* getAccessibilityValue (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityLabel), getAccessibilityTitle);\r
+            addMethod (@selector (accessibilityHint),  getAccessibilityHelp);\r
+\r
+            addMethod (@selector (accessibilityValue), [] (id self, SEL) -> NSString*\r
             {\r
-                if (handler->getCurrentState().isCheckable())\r
-                    return handler->getCurrentState().isChecked() ? @"1" : @"0";\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (handler->getCurrentState().isCheckable())\r
+                        return handler->getCurrentState().isChecked() ? @"1" : @"0";\r
 \r
-                return (NSString*) getAccessibilityValueFromInterfaces (*handler);\r
-            }\r
+                    return (NSString*) getAccessibilityValueFromInterfaces (*handler);\r
+                }\r
 \r
-            return nil;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static void onFocusGain (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (setAccessibilityValue:), setAccessibilityValue);\r
+\r
+            addMethod (@selector (accessibilityElementDidBecomeFocused), [] (id self, SEL)\r
             {\r
-                const WeakReference<Component> safeComponent (&handler->getComponent());\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    const WeakReference<Component> safeComponent (&handler->getComponent());\r
 \r
-                performActionIfSupported (self, AccessibilityActionType::focus);\r
+                    performActionIfSupported (self, AccessibilityActionType::focus);\r
 \r
-                if (safeComponent != nullptr)\r
-                    handler->grabFocus();\r
-            }\r
-        }\r
+                    if (safeComponent != nullptr)\r
+                        handler->grabFocus();\r
+                }\r
+            });\r
 \r
-        static void onFocusLoss (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                handler->giveAwayFocus();\r
-        }\r
+            addMethod (@selector (accessibilityElementDidLoseFocus), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    handler->giveAwayFocus();\r
+            });\r
 \r
-        static BOOL isFocused (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return handler->hasFocus (false);\r
+            addMethod (@selector (accessibilityElementIsFocused), [] (id self, SEL) -> BOOL\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return handler->hasFocus (false);\r
 \r
-            return NO;\r
-        }\r
+                return NO;\r
+            });\r
 \r
-        static BOOL accessibilityPerformActivate (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityViewIsModal), getIsAccessibilityModal);\r
+\r
+            addMethod (@selector (accessibilityActivate), [] (id self, SEL)\r
             {\r
-                // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
-                // which element it thinks has focus and forward the event on to that element if it differs\r
-                id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
+                    // which element it thinks has focus and forward the event on to that element if it differs\r
+                    id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
 \r
-                if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
-                    return [focusedElement accessibilityActivate];\r
+                    if (focusedElement != nullptr && ! [static_cast<id> (handler->getNativeImplementation()) isEqual: focusedElement])\r
+                        return [focusedElement accessibilityActivate];\r
 \r
-                if (handler->hasFocus (false))\r
-                    return accessibilityPerformPress (self, {});\r
-            }\r
+                    if (handler->hasFocus (false))\r
+                        return accessibilityPerformPress (self, {});\r
+                }\r
 \r
-            return NO;\r
-        }\r
+                return NO;\r
+            });\r
 \r
-        static BOOL accessibilityPerformEscape (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityIncrement), accessibilityPerformIncrement);\r
+            addMethod (@selector (accessibilityDecrement), accessibilityPerformDecrement);\r
+\r
+            addMethod (@selector (accessibilityPerformEscape), [] (id self, SEL)\r
             {\r
-                if (auto* modal = Component::getCurrentlyModalComponent())\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    if (auto* modalHandler = modal->getAccessibilityHandler())\r
+                    if (auto* modal = Component::getCurrentlyModalComponent())\r
                     {\r
-                        if (modalHandler == handler || modalHandler->isParentOf (handler))\r
+                        if (auto* modalHandler = modal->getAccessibilityHandler())\r
                         {\r
-                            modal->exitModalState (0);\r
-                            return YES;\r
+                            if (modalHandler == handler || modalHandler->isParentOf (handler))\r
+                            {\r
+                                modal->exitModalState (0);\r
+                                return YES;\r
+                            }\r
                         }\r
                     }\r
                 }\r
+\r
+                return NO;\r
+            });\r
+\r
+            if (elementType == Type::textElement)\r
+            {\r
+                addMethod (@selector (deleteBackward), [] (id, SEL) {});\r
+                addMethod (@selector (insertText:), [] (id, SEL, NSString*) {});\r
+\r
+                forEach ([this] (auto signature) { addPassthroughMethodWithSignature (signature); },\r
+                         SignatureHasText{},\r
+                         SignatureSetSelectedTextRange{},\r
+                         SignatureSelectedTextRange{},\r
+                         SignatureMarkedTextRange{},\r
+                         SignatureSetMarkedTextSelectedRange{},\r
+                         SignatureUnmarkText{},\r
+                         SignatureMarkedTextStyle{},\r
+                         SignatureSetMarkedTextStyle{},\r
+                         SignatureBeginningOfDocument{},\r
+                         SignatureEndOfDocument{},\r
+                         SignatureTokenizer{},\r
+                         SignatureBaseWritingDirection{},\r
+                         SignatureCaretRectForPosition{},\r
+                         SignatureCharacterRangeByExtending{},\r
+                         SignatureCharacterRangeAtPoint{},\r
+                         SignatureClosestPositionToPoint{},\r
+                         SignatureClosestPositionToPointInRange{},\r
+                         SignatureComparePositionToPosition{},\r
+                         SignatureOffsetFromPositionToPosition{},\r
+                         SignaturePositionFromPositionInDirection{},\r
+                         SignaturePositionFromPositionOffset{},\r
+                         SignatureFirstRectForRange{},\r
+                         SignatureSelectionRectsForRange{},\r
+                         SignaturePositionWithinRange{},\r
+                         SignatureReplaceRangeWithText{},\r
+                         SignatureSetBaseWritingDirection{},\r
+                         SignatureTextInRange{},\r
+                         SignatureTextRangeFromPosition{},\r
+                         SignatureSetInputDelegate{},\r
+                         SignatureInputDelegate{},\r
+                         SignatureKeyboardType{},\r
+                         SignatureAutocapitalizationType{},\r
+                         SignatureAutocorrectionType{});\r
+\r
+                addProtocol (@protocol (UITextInput));\r
+            }\r
+\r
+            if (@available (iOS 11.0, *))\r
+            {\r
+                addMethod (@selector (accessibilityRowRange),                           getAccessibilityRowIndexRange);\r
+                addMethod (@selector (accessibilityColumnRange),                        getAccessibilityColumnIndexRange);\r
+                addProtocol (@protocol (UIAccessibilityContainerDataTableCell));\r
             }\r
 \r
-            return NO;\r
+            addIvar<UIAccessibilityElement*> ("container");\r
+\r
+            registerClass();\r
         }\r
 \r
-        static id getAccessibilityDataTableCellElementForRowColumn (id self, SEL, NSUInteger row, NSUInteger column)\r
+    private:\r
+        template <typename Result>\r
+        static auto getResult (NSInvocation* invocation, detail::Tag<Result>)\r
         {\r
-            if (auto* tableInterface = getEnclosingInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
-                if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column))\r
-                    return (id) cellHandler->getNativeImplementation();\r
-\r
-            return nil;\r
+            Result result{};\r
+            [invocation getReturnValue: &result];\r
+            return result;\r
         }\r
 \r
-        static NSInteger getAccessibilityLineNumberForPoint (id self, SEL, CGPoint point)\r
+        static void getResult (NSInvocation*, detail::Tag<void>) {}\r
+\r
+        template <typename HasSelector, typename Result, typename... Args>\r
+        auto makePassthroughCallback (HasSelector, Signature<Result (Args...)>)\r
         {\r
-            if (auto* handler = getHandler (self))\r
+            return [] (id self, SEL, Args... args) -> Result\r
             {\r
-                if (auto* textInterface = handler->getTextInterface())\r
+                if (auto* input = getPeerTextInput (self))\r
                 {\r
-                    auto pointInt = roundToIntPoint (point);\r
+                    const auto s = detail::makeCompileTimeStr (@encode (Result), @encode (id), @encode (SEL), @encode (Args)...);\r
+                    const auto signature = [NSMethodSignature signatureWithObjCTypes: s.data()];\r
+                    const auto invocation = [NSInvocation invocationWithMethodSignature: signature];\r
+                    invocation.selector = HasSelector::sel();\r
 \r
-                    if (handler->getComponent().getScreenBounds().contains (pointInt))\r
-                    {\r
-                        auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() });\r
+                    // Indices 0 and 1 are 'id self' and 'SEL _cmd' respectively\r
+                    auto counter = 2;\r
+                    forEach ([&] (auto& arg) { [invocation setArgument: &arg atIndex: counter++]; }, args...);\r
 \r
-                        for (int i = 0; i < textBounds.getNumRectangles(); ++i)\r
-                            if (textBounds.getRectangle (i).contains (pointInt))\r
-                                return (NSInteger) i;\r
-                    }\r
+                    [invocation invokeWithTarget: input];\r
+\r
+                    return getResult (invocation, detail::Tag<Result>{});\r
                 }\r
-            }\r
 \r
-            return NSNotFound;\r
+                jassertfalse;\r
+                return {};\r
+            };\r
         }\r
 \r
-        static NSString* getAccessibilityContentForLineNumber (id self, SEL, NSInteger lineNumber)\r
+        template <typename Signature>\r
+        void addPassthroughMethodWithSignature (Signature signature)\r
         {\r
-            if (auto* textInterface = getTextInterface (self))\r
-            {\r
-                auto lines = StringArray::fromLines (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }));\r
-\r
-                if ((int) lineNumber < lines.size())\r
-                    return juceStringToNS (lines[(int) lineNumber]);\r
-            }\r
-\r
-            return nil;\r
+            addMethod (Signature::sel(), makePassthroughCallback (signature, signature));\r
         }\r
 \r
-        static CGRect getAccessibilityFrameForLineNumber (id self, SEL, NSInteger lineNumber)\r
+        static UIAccessibilityElement* getContainer (id self)\r
         {\r
-            if (auto* textInterface = getTextInterface (self))\r
-            {\r
-                auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() });\r
+            return getIvar<UIAccessibilityElement*> (self, "container");\r
+        }\r
 \r
-                if (lineNumber < textBounds.getNumRectangles())\r
-                    return convertToCGRect (textBounds.getRectangle ((int) lineNumber));\r
-            }\r
+        static UIViewComponentPeer* getPeer (id self)\r
+        {\r
+            if (auto* handler = getHandler (self))\r
+                return static_cast<UIViewComponentPeer*> (handler->getComponent().getPeer());\r
 \r
-            return CGRectZero;\r
+            return nil;\r
         }\r
 \r
-        static NSString* getAccessibilityPageContent (id self, SEL)\r
+        static JuceTextView* getPeerTextInput (id self)\r
         {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return juceStringToNS (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }));\r
+            if (auto* peer = getPeer (self))\r
+                return peer->hiddenTextInput.get();\r
 \r
             return nil;\r
         }\r
@@ -542,9 +632,8 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte
         const bool moveToHandler = (eventType == InternalAccessibilityEvent::focusChanged && handler.hasFocus (false));\r
 \r
         sendAccessibilityEvent (notification,\r
-                                moveToHandler ? (id) handler.getNativeImplementation() : nil);\r
+                                moveToHandler ? static_cast<id> (handler.getNativeImplementation()) : nil);\r
     }\r
-\r
 }\r
 \r
 void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventType) const\r
@@ -566,7 +655,7 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp
     }();\r
 \r
     if (notification != UIAccessibilityNotifications{})\r
-        sendAccessibilityEvent (notification, (id) getNativeImplementation());\r
+        sendAccessibilityEvent (notification, static_cast<id> (getNativeImplementation()));\r
 }\r
 \r
 void AccessibilityHandler::postAnnouncement (const String& announcementString, AnnouncementPriority)\r
index bf3c38c95be78f0ca74a2a55c58bc1c3b047376f..d7d62d9431a830195cf663a6204432066ee2ce2a 100644 (file)
@@ -29,11 +29,6 @@ static void juceFreeAccessibilityPlatformSpecificData (NSAccessibilityElement<NS
 namespace juce\r
 {\r
 \r
-#if ! defined (MAC_OS_X_VERSION_10_13) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_13\r
- using NSAccessibilityRole = NSString*;\r
- using NSAccessibilityNotificationName = NSString*;\r
-#endif\r
-\r
 #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
 \r
 //==============================================================================\r
@@ -73,758 +68,726 @@ private:
     private:\r
         AccessibilityElement()\r
         {\r
-            addMethod (@selector (accessibilityNotifiesWhenDestroyed),     getAccessibilityNotifiesWhenDestroyed);\r
-            addMethod (@selector (isAccessibilityElement),                 getIsAccessibilityElement);\r
-            addMethod (@selector (isAccessibilityEnabled),                 getIsAccessibilityEnabled);\r
+            addMethod (@selector (accessibilityNotifiesWhenDestroyed), [] (id, SEL)  { return YES; });\r
+            addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
+\r
+            addMethod (@selector (isAccessibilityEnabled), [] (id self, SEL) -> BOOL\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return handler->getComponent().isEnabled();\r
+\r
+                return NO;\r
+            });\r
+\r
             addMethod (@selector (accessibilityWindow),                    getAccessibilityWindow);\r
             addMethod (@selector (accessibilityTopLevelUIElement),         getAccessibilityWindow);\r
-            addMethod (@selector (accessibilityFocusedUIElement),          getAccessibilityFocusedUIElement);\r
-            addMethod (@selector (accessibilityHitTest:),                  accessibilityHitTest);\r
-            addMethod (@selector (accessibilityParent),                    getAccessibilityParent);\r
             addMethod (@selector (accessibilityChildren),                  getAccessibilityChildren);\r
-            addMethod (@selector (isAccessibilityFocused),                 getIsAccessibilityFocused);\r
-            addMethod (@selector (setAccessibilityFocused:),               setAccessibilityFocused);\r
             addMethod (@selector (isAccessibilityModal),                   getIsAccessibilityModal);\r
-            addMethod (@selector (accessibilityFrame),                     getAccessibilityFrame);\r
-            addMethod (@selector (accessibilityRole),                      getAccessibilityRole);\r
-            addMethod (@selector (accessibilitySubrole),                   getAccessibilitySubrole);\r
-            addMethod (@selector (accessibilityTitle),                     getAccessibilityTitle);\r
-            addMethod (@selector (accessibilityLabel),                     getAccessibilityLabel);\r
-            addMethod (@selector (accessibilityHelp),                      getAccessibilityHelp);\r
-            addMethod (@selector (accessibilityValue),                     getAccessibilityValue);\r
-            addMethod (@selector (setAccessibilityValue:),                 setAccessibilityValue);\r
-            addMethod (@selector (accessibilitySelectedChildren),          getAccessibilitySelectedChildren);\r
-            addMethod (@selector (setAccessibilitySelectedChildren:),      setAccessibilitySelectedChildren);\r
-            addMethod (@selector (accessibilityOrientation),               getAccessibilityOrientation);\r
-\r
-            addMethod (@selector (accessibilityInsertionPointLineNumber),  getAccessibilityInsertionPointLineNumber);\r
-            addMethod (@selector (accessibilityVisibleCharacterRange),     getAccessibilityVisibleCharacterRange);\r
-            addMethod (@selector (accessibilityNumberOfCharacters),        getAccessibilityNumberOfCharacters);\r
-            addMethod (@selector (accessibilitySelectedText),              getAccessibilitySelectedText);\r
-            addMethod (@selector (accessibilitySelectedTextRange),         getAccessibilitySelectedTextRange);\r
-            addMethod (@selector (accessibilityAttributedStringForRange:), getAccessibilityAttributedStringForRange);\r
-            addMethod (@selector (accessibilityRangeForLine:),             getAccessibilityRangeForLine);\r
-            addMethod (@selector (accessibilityStringForRange:),           getAccessibilityStringForRange);\r
-            addMethod (@selector (accessibilityRangeForPosition:),         getAccessibilityRangeForPosition);\r
-            addMethod (@selector (accessibilityRangeForIndex:),            getAccessibilityRangeForIndex);\r
-            addMethod (@selector (accessibilityFrameForRange:),            getAccessibilityFrameForRange);\r
-            addMethod (@selector (accessibilityLineForIndex:),             getAccessibilityLineForIndex);\r
-            addMethod (@selector (setAccessibilitySelectedTextRange:),     setAccessibilitySelectedTextRange);\r
-\r
-            addMethod (@selector (accessibilityRowCount),            getAccessibilityRowCount);\r
-            addMethod (@selector (accessibilityRows),                getAccessibilityRows);\r
-            addMethod (@selector (accessibilitySelectedRows),        getAccessibilitySelectedRows);\r
-            addMethod (@selector (setAccessibilitySelectedRows:),    setAccessibilitySelectedRows);\r
-            addMethod (@selector (accessibilityColumnCount),         getAccessibilityColumnCount);\r
-            addMethod (@selector (accessibilityColumns),             getAccessibilityColumns);\r
-            addMethod (@selector (accessibilitySelectedColumns),     getAccessibilitySelectedColumns);\r
-            addMethod (@selector (setAccessibilitySelectedColumns:), setAccessibilitySelectedColumns);\r
 \r
-            addMethod (@selector (accessibilityRowIndexRange),    getAccessibilityRowIndexRange);\r
-            addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange);\r
-            addMethod (@selector (accessibilityIndex),            getAccessibilityIndex);\r
-            addMethod (@selector (accessibilityDisclosureLevel),  getAccessibilityDisclosureLevel);\r
-            addMethod (@selector (isAccessibilityExpanded),       getIsAccessibilityExpanded);\r
+            addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL) -> id\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (auto* modal = Component::getCurrentlyModalComponent())\r
+                    {\r
+                        const auto& handlerComponent = handler->getComponent();\r
 \r
-            addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement);\r
-            addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement);\r
-            addMethod (@selector (accessibilityPerformDelete),    accessibilityPerformDelete);\r
-            addMethod (@selector (accessibilityPerformPress),     accessibilityPerformPress);\r
-            addMethod (@selector (accessibilityPerformShowMenu),  accessibilityPerformShowMenu);\r
-            addMethod (@selector (accessibilityPerformRaise),     accessibilityPerformRaise);\r
+                        if (! handlerComponent.isParentOf (modal)\r
+                             && handlerComponent.isCurrentlyBlockedByAnotherModalComponent())\r
+                        {\r
+                            if (auto* modalHandler = modal->getAccessibilityHandler())\r
+                            {\r
+                                if (auto* focusChild = modalHandler->getChildFocus())\r
+                                    return static_cast<id> (focusChild->getNativeImplementation());\r
 \r
-            addMethod (@selector (isAccessibilitySelectorAllowed:), getIsAccessibilitySelectorAllowed);\r
+                                return static_cast<id> (modalHandler->getNativeImplementation());\r
+                            }\r
+                        }\r
+                    }\r
 \r
-           #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
-            addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren);\r
-           #endif\r
+                    if (auto* focusChild = handler->getChildFocus())\r
+                        return static_cast<id> (focusChild->getNativeImplementation());\r
+                }\r
 \r
-            registerClass();\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        //==============================================================================\r
-        static bool isSelectable (AccessibleState state) noexcept\r
-        {\r
-            return state.isSelectable() || state.isMultiSelectable();\r
-        }\r
+            addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point) -> id\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point))))\r
+                        return static_cast<id> (child->getNativeImplementation());\r
 \r
-        static NSArray* getSelectedChildren (NSArray* children)\r
-        {\r
-            NSMutableArray* selected = [[NSMutableArray new] autorelease];\r
+                    return self;\r
+                }\r
 \r
-            for (id child in children)\r
+                return nil;\r
+            });\r
+\r
+            addMethod (@selector (accessibilityParent), [] (id self, SEL) -> id\r
             {\r
-                if (auto* handler = getHandler (child))\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    const auto currentState = handler->getCurrentState();\r
+                    if (auto* parentHandler = handler->getParent())\r
+                        return NSAccessibilityUnignoredAncestor (static_cast<id> (parentHandler->getNativeImplementation()));\r
 \r
-                    if (isSelectable (currentState) && currentState.isSelected())\r
-                        [selected addObject: child];\r
+                    return NSAccessibilityUnignoredAncestor (static_cast<id> (handler->getComponent().getWindowHandle()));\r
                 }\r
-            }\r
 \r
-            return selected;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static void setSelectedChildren (NSArray* children, NSArray* selected)\r
-        {\r
-            for (id child in children)\r
+            addMethod (@selector (isAccessibilityFocused), [] (id self, SEL)\r
             {\r
-                if (auto* handler = getHandler (child))\r
-                {\r
-                    const auto currentState = handler->getCurrentState();\r
-                    const BOOL isSelected = [selected containsObject: child];\r
+                return [[self accessibilityWindow] accessibilityFocusedUIElement] == self;\r
+            });\r
 \r
-                    if (isSelectable (currentState))\r
+            addMethod (@selector (setAccessibilityFocused:), [] (id self, SEL, BOOL focused)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (focused)\r
                     {\r
-                        if (currentState.isSelected() != isSelected)\r
-                            handler->getActions().invoke (AccessibilityActionType::toggle);\r
+                        const WeakReference<Component> safeComponent (&handler->getComponent());\r
+\r
+                        performActionIfSupported (self, AccessibilityActionType::focus);\r
+\r
+                        if (safeComponent != nullptr)\r
+                            handler->grabFocus();\r
                     }\r
-                    else if (currentState.isFocusable())\r
+                    else\r
                     {\r
-                        [child setAccessibilityFocused: isSelected];\r
+                        handler->giveAwayFocus();\r
                     }\r
                 }\r
-            }\r
-        }\r
+            });\r
 \r
-        //==============================================================================\r
-        static BOOL getAccessibilityNotifiesWhenDestroyed (id, SEL)  { return YES; }\r
+            addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds()));\r
 \r
-        static BOOL getIsAccessibilityEnabled (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return handler->getComponent().isEnabled();\r
+                return NSZeroRect;\r
+            });\r
 \r
-            return NO;\r
-        }\r
+            addMethod (@selector (accessibilityRole), [] (id self, SEL) -> NSAccessibilityRole\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    switch (handler->getRole())\r
+                    {\r
+                        case AccessibilityRole::popupMenu:\r
+                        case AccessibilityRole::tooltip:\r
+                        case AccessibilityRole::splashScreen:\r
+                        case AccessibilityRole::dialogWindow:\r
+                        case AccessibilityRole::window:        return NSAccessibilityWindowRole;\r
+\r
+                        case AccessibilityRole::tableHeader:\r
+                        case AccessibilityRole::unspecified:\r
+                        case AccessibilityRole::group:         return NSAccessibilityGroupRole;\r
+\r
+                        case AccessibilityRole::label:\r
+                        case AccessibilityRole::staticText:    return NSAccessibilityStaticTextRole;\r
+\r
+                        case AccessibilityRole::tree:\r
+                        case AccessibilityRole::list:          return NSAccessibilityOutlineRole;\r
+\r
+                        case AccessibilityRole::listItem:\r
+                        case AccessibilityRole::treeItem:      return NSAccessibilityRowRole;\r
+\r
+                        case AccessibilityRole::button:        return NSAccessibilityButtonRole;\r
+                        case AccessibilityRole::toggleButton:  return NSAccessibilityCheckBoxRole;\r
+                        case AccessibilityRole::radioButton:   return NSAccessibilityRadioButtonRole;\r
+                        case AccessibilityRole::comboBox:      return NSAccessibilityPopUpButtonRole;\r
+                        case AccessibilityRole::image:         return NSAccessibilityImageRole;\r
+                        case AccessibilityRole::slider:        return NSAccessibilitySliderRole;\r
+                        case AccessibilityRole::editableText:  return NSAccessibilityTextAreaRole;\r
+                        case AccessibilityRole::menuItem:      return NSAccessibilityMenuItemRole;\r
+                        case AccessibilityRole::menuBar:       return NSAccessibilityMenuRole;\r
+                        case AccessibilityRole::table:         return NSAccessibilityOutlineRole;\r
+                        case AccessibilityRole::column:        return NSAccessibilityColumnRole;\r
+                        case AccessibilityRole::row:           return NSAccessibilityRowRole;\r
+                        case AccessibilityRole::cell:          return NSAccessibilityCellRole;\r
+                        case AccessibilityRole::hyperlink:     return NSAccessibilityLinkRole;\r
+                        case AccessibilityRole::progressBar:   return NSAccessibilityProgressIndicatorRole;\r
+                        case AccessibilityRole::scrollBar:     return NSAccessibilityScrollBarRole;\r
+\r
+                        case AccessibilityRole::ignored:       break;\r
+                    }\r
 \r
-        static id getAccessibilityWindow (id self, SEL)\r
-        {\r
-            return [[self accessibilityParent] accessibilityWindow];\r
-        }\r
+                    return NSAccessibilityUnknownRole;\r
+                }\r
 \r
-        static id getAccessibilityFocusedUIElement (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+                return nil;\r
+            });\r
+\r
+            addMethod (@selector (accessibilitySubrole), [] (id self, SEL)\r
             {\r
-                if (auto* modal = Component::getCurrentlyModalComponent())\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    const auto& component = handler->getComponent();\r
+                    if (auto* textInterface = getTextInterface (self))\r
+                        if (textInterface->isDisplayingProtectedText())\r
+                            return NSAccessibilitySecureTextFieldSubrole;\r
+\r
+                    const auto handlerRole = handler->getRole();\r
+\r
+                    if (handlerRole == AccessibilityRole::window)                                     return NSAccessibilityStandardWindowSubrole;\r
+                    if (handlerRole == AccessibilityRole::dialogWindow)                               return NSAccessibilityDialogSubrole;\r
+                    if (handlerRole == AccessibilityRole::tooltip\r
+                        || handlerRole == AccessibilityRole::splashScreen)                            return NSAccessibilityFloatingWindowSubrole;\r
+                    if (handlerRole == AccessibilityRole::toggleButton)                               return NSAccessibilityToggleSubrole;\r
+                    if (handlerRole == AccessibilityRole::treeItem\r
+                        || handlerRole == AccessibilityRole::listItem)                                return NSAccessibilityOutlineRowSubrole;\r
+                    if (handlerRole == AccessibilityRole::row && getCellInterface (self) != nullptr)  return NSAccessibilityTableRowSubrole;\r
 \r
-                    if (! component.isParentOf (modal)\r
-                         && component.isCurrentlyBlockedByAnotherModalComponent())\r
+                    const auto& handlerComponent = handler->getComponent();\r
+\r
+                    if (auto* documentWindow = handlerComponent.findParentComponentOfClass<DocumentWindow>())\r
                     {\r
-                        if (auto* modalHandler = modal->getAccessibilityHandler())\r
+                        if (handlerRole == AccessibilityRole::button)\r
                         {\r
-                            if (auto* focusChild = modalHandler->getChildFocus())\r
-                                return (id) focusChild->getNativeImplementation();\r
-\r
-                            return (id) modalHandler->getNativeImplementation();\r
+                            if (&handlerComponent == documentWindow->getCloseButton())     return NSAccessibilityCloseButtonSubrole;\r
+                            if (&handlerComponent == documentWindow->getMinimiseButton())  return NSAccessibilityMinimizeButtonSubrole;\r
+                            if (&handlerComponent == documentWindow->getMaximiseButton())  return NSAccessibilityFullScreenButtonSubrole;\r
                         }\r
                     }\r
                 }\r
 \r
-                if (auto* focusChild = handler->getChildFocus())\r
-                    return (id) focusChild->getNativeImplementation();\r
-            }\r
-\r
-            return nil;\r
-        }\r
+                return NSAccessibilityUnknownRole;\r
+            });\r
 \r
-        static id accessibilityHitTest (id self, SEL, NSPoint point)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityLabel), [] (id self, SEL) -> NSString*\r
             {\r
-                if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point))))\r
-                    return (id) child->getNativeImplementation();\r
+                if (auto* handler = getHandler (self))\r
+                    return juceStringToNS (handler->getDescription());\r
 \r
-                return self;\r
-            }\r
-\r
-            return nil;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static id getAccessibilityParent (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityValue), [] (id self, SEL) -> id\r
             {\r
-                if (auto* parentHandler = handler->getParent())\r
-                    return NSAccessibilityUnignoredAncestor ((id) parentHandler->getNativeImplementation());\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (handler->getCurrentState().isCheckable())\r
+                        return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off"));\r
 \r
-                return NSAccessibilityUnignoredAncestor ((id) handler->getComponent().getWindowHandle());\r
-            }\r
+                    return getAccessibilityValueFromInterfaces (*handler);\r
+                }\r
 \r
-            return nil;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static NSArray* getAccessibilityChildren (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-            {\r
-                auto children = handler->getChildren();\r
+            addMethod (@selector (accessibilityTitle),                     getAccessibilityTitle);\r
+            addMethod (@selector (accessibilityHelp),                      getAccessibilityHelp);\r
+            addMethod (@selector (setAccessibilityValue:),                 setAccessibilityValue);\r
 \r
-                auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+            addMethod (@selector (accessibilitySelectedChildren), [] (id self, SEL)\r
+            {\r
+                return getSelectedChildren ([self accessibilityChildren]);\r
+            });\r
 \r
-                for (auto* childHandler : children)\r
-                    [accessibleChildren addObject: (id) childHandler->getNativeImplementation()];\r
+            addMethod (@selector (setAccessibilitySelectedChildren:), [] (id self, SEL, NSArray* selected)\r
+            {\r
+                setSelectedChildren ([self accessibilityChildren], selected);\r
+            });\r
 \r
-                return accessibleChildren;\r
-            }\r
+            addMethod (@selector (accessibilityOrientation), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f\r
+                           ? NSAccessibilityOrientationHorizontal\r
+                           : NSAccessibilityOrientationVertical;\r
 \r
-            return nil;\r
-        }\r
+                return NSAccessibilityOrientationUnknown;\r
+            });\r
 \r
-        static id getAccessibilityValue (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityInsertionPointLineNumber), [] (id self, SEL) -> NSInteger\r
             {\r
-                if (handler->getCurrentState().isCheckable())\r
-                    return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off"));\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()];\r
 \r
-                return getAccessibilityValueFromInterfaces (*handler);\r
-            }\r
+                return 0;\r
+            });\r
 \r
-            return nil;\r
-        }\r
+            addMethod (@selector (accessibilityVisibleCharacterRange), [] (id self, SEL)\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() });\r
 \r
-        static NSArray* getAccessibilitySelectedChildren (id self, SEL)\r
-        {\r
-            return getSelectedChildren ([self accessibilityChildren]);\r
-        }\r
+                return NSMakeRange (0, 0);\r
+            });\r
 \r
-        static void setAccessibilitySelectedChildren (id self, SEL, NSArray* selected)\r
-        {\r
-            setSelectedChildren ([self accessibilityChildren], selected);\r
-        }\r
+            addMethod (@selector (accessibilityNumberOfCharacters), [] (id self, SEL)\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return textInterface->getTotalNumCharacters();\r
 \r
-        static NSAccessibilityOrientation getAccessibilityOrientation (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f\r
-                           ? NSAccessibilityOrientationHorizontal\r
-                           : NSAccessibilityOrientationVertical;\r
+                return 0;\r
+            });\r
 \r
-            return NSAccessibilityOrientationUnknown;\r
-        }\r
+            addMethod (@selector (accessibilitySelectedText), [] (id self, SEL) -> NSString*\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return juceStringToNS (textInterface->getText (textInterface->getSelection()));\r
 \r
-        static BOOL getIsAccessibilityFocused (id self, SEL)\r
-        {\r
-            return [[self accessibilityWindow] accessibilityFocusedUIElement] == self;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static void setAccessibilityFocused (id self, SEL, BOOL focused)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilitySelectedTextRange), [] (id self, SEL)\r
             {\r
-                if (focused)\r
+                if (auto* textInterface = getTextInterface (self))\r
                 {\r
-                    const WeakReference<Component> safeComponent (&handler->getComponent());\r
+                    const auto currentSelection = textInterface->getSelection();\r
 \r
-                    performActionIfSupported (self, AccessibilityActionType::focus);\r
+                    if (currentSelection.isEmpty())\r
+                        return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0);\r
 \r
-                    if (safeComponent != nullptr)\r
-                        handler->grabFocus();\r
+                    return juceRangeToNS (currentSelection);\r
                 }\r
-                else\r
-                {\r
-                    handler->giveAwayFocus();\r
-                }\r
-            }\r
-        }\r
-\r
-        static NSRect getAccessibilityFrame (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds()));\r
 \r
-            return NSZeroRect;\r
-        }\r
+                return NSMakeRange (0, 0);\r
+            });\r
 \r
-        static NSAccessibilityRole getAccessibilityRole (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityAttributedStringForRange:), [] (id self, SEL, NSRange range) -> NSAttributedString*\r
             {\r
-                switch (handler->getRole())\r
-                {\r
-                    case AccessibilityRole::popupMenu:\r
-                    case AccessibilityRole::tooltip:\r
-                    case AccessibilityRole::splashScreen:\r
-                    case AccessibilityRole::dialogWindow:\r
-                    case AccessibilityRole::window:        return NSAccessibilityWindowRole;\r
-\r
-                    case AccessibilityRole::tableHeader:\r
-                    case AccessibilityRole::unspecified:\r
-                    case AccessibilityRole::group:         return NSAccessibilityGroupRole;\r
-\r
-                    case AccessibilityRole::label:\r
-                    case AccessibilityRole::staticText:    return NSAccessibilityStaticTextRole;\r
-\r
-                    case AccessibilityRole::tree:\r
-                    case AccessibilityRole::list:          return NSAccessibilityOutlineRole;\r
-\r
-                    case AccessibilityRole::listItem:\r
-                    case AccessibilityRole::treeItem:      return NSAccessibilityRowRole;\r
-\r
-                    case AccessibilityRole::button:        return NSAccessibilityButtonRole;\r
-                    case AccessibilityRole::toggleButton:  return NSAccessibilityCheckBoxRole;\r
-                    case AccessibilityRole::radioButton:   return NSAccessibilityRadioButtonRole;\r
-                    case AccessibilityRole::comboBox:      return NSAccessibilityPopUpButtonRole;\r
-                    case AccessibilityRole::image:         return NSAccessibilityImageRole;\r
-                    case AccessibilityRole::slider:        return NSAccessibilitySliderRole;\r
-                    case AccessibilityRole::editableText:  return NSAccessibilityTextAreaRole;\r
-                    case AccessibilityRole::menuItem:      return NSAccessibilityMenuItemRole;\r
-                    case AccessibilityRole::menuBar:       return NSAccessibilityMenuRole;\r
-                    case AccessibilityRole::table:         return NSAccessibilityListRole;\r
-                    case AccessibilityRole::column:        return NSAccessibilityColumnRole;\r
-                    case AccessibilityRole::row:           return NSAccessibilityRowRole;\r
-                    case AccessibilityRole::cell:          return NSAccessibilityCellRole;\r
-                    case AccessibilityRole::hyperlink:     return NSAccessibilityLinkRole;\r
-                    case AccessibilityRole::progressBar:   return NSAccessibilityProgressIndicatorRole;\r
-                    case AccessibilityRole::scrollBar:     return NSAccessibilityScrollBarRole;\r
-\r
-                    case AccessibilityRole::ignored:       break;\r
-                }\r
+                NSString* string = [self accessibilityStringForRange: range];\r
 \r
-                return NSAccessibilityUnknownRole;\r
-            }\r
+                if (string != nil)\r
+                    return [[[NSAttributedString alloc] initWithString: string] autorelease];\r
 \r
-            return nil;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        static NSAccessibilityRole getAccessibilitySubrole (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityRangeForLine:), [] (id self, SEL, NSInteger line)\r
             {\r
                 if (auto* textInterface = getTextInterface (self))\r
-                    if (textInterface->isDisplayingProtectedText())\r
-                        return NSAccessibilitySecureTextFieldSubrole;\r
-\r
-                const auto role = handler->getRole();\r
-\r
-                if (role == AccessibilityRole::window)                                     return NSAccessibilityStandardWindowSubrole;\r
-                if (role == AccessibilityRole::dialogWindow)                               return NSAccessibilityDialogSubrole;\r
-                if (role == AccessibilityRole::tooltip\r
-                    || role == AccessibilityRole::splashScreen)                            return NSAccessibilityFloatingWindowSubrole;\r
-                if (role == AccessibilityRole::toggleButton)                               return NSAccessibilityToggleSubrole;\r
-                if (role == AccessibilityRole::treeItem\r
-                    || role == AccessibilityRole::listItem)                                return NSAccessibilityOutlineRowSubrole;\r
-                if (role == AccessibilityRole::row && getCellInterface (self) != nullptr)  return NSAccessibilityTableRowSubrole;\r
-\r
-                const auto& component = handler->getComponent();\r
-\r
-                if (auto* documentWindow = component.findParentComponentOfClass<DocumentWindow>())\r
                 {\r
-                    if (role == AccessibilityRole::button)\r
+                    auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() });\r
+                    auto lines = StringArray::fromLines (text);\r
+\r
+                    if (line < lines.size())\r
                     {\r
-                        if (&component == documentWindow->getCloseButton())     return NSAccessibilityCloseButtonSubrole;\r
-                        if (&component == documentWindow->getMinimiseButton())  return NSAccessibilityMinimizeButtonSubrole;\r
-                        if (&component == documentWindow->getMaximiseButton())  return NSAccessibilityFullScreenButtonSubrole;\r
+                        auto lineText = lines[(int) line];\r
+                        auto start = text.indexOf (lineText);\r
+\r
+                        if (start >= 0)\r
+                            return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length());\r
                     }\r
                 }\r
-            }\r
 \r
-            return NSAccessibilityUnknownRole;\r
-        }\r
+                return NSMakeRange (0, 0);\r
+            });\r
 \r
-        static NSString* getAccessibilityLabel (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return juceStringToNS (handler->getDescription());\r
+            addMethod (@selector (accessibilityStringForRange:), [] (id self, SEL, NSRange range) -> NSString*\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return juceStringToNS (textInterface->getText (nsRangeToJuce (range)));\r
 \r
-            return nil;\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        //==============================================================================\r
-        static NSInteger getAccessibilityInsertionPointLineNumber (id self, SEL)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()];\r
+            addMethod (@selector (accessibilityRangeForPosition:), [] (id self, SEL, NSPoint position)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (auto* textInterface = handler->getTextInterface())\r
+                    {\r
+                        auto screenPoint = roundToIntPoint (flippedScreenPoint (position));\r
 \r
-            return 0;\r
-        }\r
+                        if (handler->getComponent().getScreenBounds().contains (screenPoint))\r
+                        {\r
+                            auto offset = textInterface->getOffsetAtPoint (screenPoint);\r
 \r
-        static NSRange getAccessibilityVisibleCharacterRange (id self, SEL)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() });\r
+                            if (offset >= 0)\r
+                                return NSMakeRange ((NSUInteger) offset, 1);\r
+                        }\r
+                    }\r
+                }\r
 \r
-            return NSMakeRange (0, 0);\r
-        }\r
+                return NSMakeRange (0, 0);\r
+            });\r
 \r
-        static NSInteger getAccessibilityNumberOfCharacters (id self, SEL)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return textInterface->getTotalNumCharacters();\r
+            addMethod (@selector (accessibilityRangeForIndex:), [] (id self, SEL, NSInteger index)\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters()))\r
+                        return NSMakeRange ((NSUInteger) index, 1);\r
 \r
-            return 0;\r
-        }\r
+                return NSMakeRange (0, 0);\r
+            });\r
 \r
-        static NSString* getAccessibilitySelectedText (id self, SEL)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return juceStringToNS (textInterface->getText (textInterface->getSelection()));\r
+            addMethod (@selector (accessibilityFrameForRange:), [] (id self, SEL, NSRange range)\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds()));\r
 \r
-            return nil;\r
-        }\r
+                return NSZeroRect;\r
+            });\r
 \r
-        static NSRange getAccessibilitySelectedTextRange (id self, SEL)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
+            addMethod (@selector (accessibilityLineForIndex:), [] (id self, SEL, NSInteger index)\r
             {\r
-                const auto currentSelection = textInterface->getSelection();\r
+                if (auto* textInterface = getTextInterface (self))\r
+                {\r
+                    auto text = textInterface->getText ({ 0, (int) index });\r
 \r
-                if (currentSelection.isEmpty())\r
-                    return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0);\r
+                    if (! text.isEmpty())\r
+                        return StringArray::fromLines (text).size() - 1;\r
+                }\r
 \r
-                return juceRangeToNS (currentSelection);\r
-            }\r
+                return 0;\r
+            });\r
 \r
-            return NSMakeRange (0, 0);\r
-        }\r
+            addMethod (@selector (setAccessibilitySelectedTextRange:), [] (id self, SEL, NSRange selectedRange)\r
+            {\r
+                if (auto* textInterface = getTextInterface (self))\r
+                    textInterface->setSelection (nsRangeToJuce (selectedRange));\r
+            });\r
 \r
-        static NSAttributedString* getAccessibilityAttributedStringForRange (id self, SEL, NSRange range)\r
-        {\r
-            NSString* string = [self accessibilityStringForRange: range];\r
+            addMethod (@selector (accessibilityRows), [] (id self, SEL) -> NSArray*\r
+            {\r
+                if (auto* tableInterface = getTableInterface (self))\r
+                {\r
+                    auto* rows = [[NSMutableArray new] autorelease];\r
 \r
-            if (string != nil)\r
-                return [[[NSAttributedString alloc] initWithString: string] autorelease];\r
+                    for (int row = 0, numRows = tableInterface->getNumRows(); row < numRows; ++row)\r
+                    {\r
+                        if (auto* rowHandler = tableInterface->getRowHandler (row))\r
+                        {\r
+                            [rows addObject: static_cast<id> (rowHandler->getNativeImplementation())];\r
+                        }\r
+                        else\r
+                        {\r
+                            [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
+                                                                                            frame: NSZeroRect\r
+                                                                                            label: @"Offscreen Row"\r
+                                                                                           parent: self]];\r
+                        }\r
+                    }\r
 \r
-            return nil;\r
-        }\r
+                    return rows;\r
+                }\r
 \r
-        static NSRange getAccessibilityRangeForLine (id self, SEL, NSInteger line)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-            {\r
-                auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() });\r
-                auto lines = StringArray::fromLines (text);\r
+                return nil;\r
+            });\r
 \r
-                if (line < lines.size())\r
-                {\r
-                    auto lineText = lines[(int) line];\r
-                    auto start = text.indexOf (lineText);\r
+            addMethod (@selector (accessibilitySelectedRows), [] (id self, SEL)\r
+            {\r
+                return getSelectedChildren ([self accessibilityRows]);\r
+            });\r
 \r
-                    if (start >= 0)\r
-                        return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length());\r
-                }\r
-            }\r
+            addMethod (@selector (setAccessibilitySelectedRows:), [] (id self, SEL, NSArray* selected)\r
+            {\r
+                setSelectedChildren ([self accessibilityRows], selected);\r
+            });\r
 \r
-            return NSMakeRange (0, 0);\r
-        }\r
+            addMethod (@selector (accessibilityHeader), [] (id self, SEL) -> id\r
+            {\r
+                if (auto* tableInterface = getTableInterface (self))\r
+                    if (auto* handler = tableInterface->getHeaderHandler())\r
+                        return static_cast<id> (handler->getNativeImplementation());\r
 \r
-        static NSString* getAccessibilityStringForRange (id self, SEL, NSRange range)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return juceStringToNS (textInterface->getText (nsRangeToJuce (range)));\r
+                return nil;\r
+            });\r
 \r
-            return nil;\r
-        }\r
+            addMethod (@selector (accessibilityRowCount),         getAccessibilityRowCount);\r
+            addMethod (@selector (accessibilityColumnCount),      getAccessibilityColumnCount);\r
+            addMethod (@selector (accessibilityRowIndexRange),    getAccessibilityRowIndexRange);\r
+            addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange);\r
 \r
-        static NSRange getAccessibilityRangeForPosition (id self, SEL, NSPoint position)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
+            addMethod (@selector (accessibilityIndex), [] (id self, SEL) -> NSInteger\r
             {\r
-                if (auto* textInterface = handler->getTextInterface())\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    auto screenPoint = roundToIntPoint (flippedScreenPoint (position));\r
-\r
-                    if (handler->getComponent().getScreenBounds().contains (screenPoint))\r
+                    if (auto* tableHandler = getEnclosingHandlerWithInterface (handler, &AccessibilityHandler::getTableInterface))\r
                     {\r
-                        auto offset = textInterface->getOffsetAtPoint (screenPoint);\r
+                        if (auto* tableInterface = tableHandler->getTableInterface())\r
+                        {\r
+                            NSAccessibilityRole handlerRole = [self accessibilityRole];\r
+\r
+                            if ([handlerRole isEqual: NSAccessibilityRowRole])\r
+                                if (const auto span = tableInterface->getRowSpan (*handler))\r
+                                    return span->begin;\r
 \r
-                        if (offset >= 0)\r
-                            return NSMakeRange ((NSUInteger) offset, 1);\r
+                            if ([handlerRole isEqual: NSAccessibilityColumnRole])\r
+                                if (const auto span = tableInterface->getColumnSpan (*handler))\r
+                                    return span->begin;\r
+                        }\r
                     }\r
                 }\r
-            }\r
 \r
-            return NSMakeRange (0, 0);\r
-        }\r
+                return 0;\r
+            });\r
 \r
-        static NSRange getAccessibilityRangeForIndex (id self, SEL, NSInteger index)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters()))\r
-                    return NSMakeRange ((NSUInteger) index, 1);\r
-\r
-            return NSMakeRange (0, 0);\r
-        }\r
-\r
-        static NSRect getAccessibilityFrameForRange (id self, SEL, NSRange range)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds()));\r
+            addMethod (@selector (accessibilityDisclosureLevel), [] (id self, SEL)\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    if (auto* cellInterface = handler->getCellInterface())\r
+                        return cellInterface->getDisclosureLevel();\r
 \r
-            return NSZeroRect;\r
-        }\r
+                return 0;\r
+            });\r
 \r
-        static NSInteger getAccessibilityLineForIndex (id self, SEL, NSInteger index)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
+            addMethod (@selector (accessibilityDisclosedRows), [] (id self, SEL) -> id\r
             {\r
-                auto text = textInterface->getText ({ 0, (int) index });\r
+                if (auto* handler = getHandler (self))\r
+                {\r
+                    if (auto* cellInterface = handler->getCellInterface())\r
+                    {\r
+                        const auto rows = cellInterface->getDisclosedRows();\r
+                        auto* result = [NSMutableArray arrayWithCapacity: rows.size()];\r
 \r
-                if (! text.isEmpty())\r
-                    return StringArray::fromLines (text).size() - 1;\r
-            }\r
+                        for (const auto& row : rows)\r
+                        {\r
+                            if (row != nullptr)\r
+                                [result addObject: static_cast<id> (row->getNativeImplementation())];\r
+                            else\r
+                                [result addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
+                                                                                                  frame: NSZeroRect\r
+                                                                                                  label: @"Offscreen Row"\r
+                                                                                                 parent: self]];\r
+                        }\r
 \r
-            return 0;\r
-        }\r
+                        return result;\r
+                    }\r
+                }\r
 \r
-        static void setAccessibilitySelectedTextRange (id self, SEL, NSRange selectedRange)\r
-        {\r
-            if (auto* textInterface = getTextInterface (self))\r
-                textInterface->setSelection (nsRangeToJuce (selectedRange));\r
-        }\r
+                return nil;\r
+            });\r
 \r
-        //==============================================================================\r
-        static NSArray* getAccessibilityRows (id self, SEL)\r
-        {\r
-            NSMutableArray* rows = [[NSMutableArray new] autorelease];\r
+            addMethod (@selector (isAccessibilityExpanded), [] (id self, SEL) -> BOOL\r
+            {\r
+                if (auto* handler = getHandler (self))\r
+                    return handler->getCurrentState().isExpanded();\r
+\r
+                return NO;\r
+            });\r
 \r
-            if (auto* tableInterface = getTableInterface (self))\r
+            addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement);\r
+            addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement);\r
+            addMethod (@selector (accessibilityPerformDelete), [] (id self, SEL)\r
             {\r
-                for (int row = 0; row < tableInterface->getNumRows(); ++row)\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    if (auto* handler = tableInterface->getCellHandler (row, 0))\r
+                    if (hasEditableText (*handler))\r
                     {\r
-                        [rows addObject: (id) handler->getNativeImplementation()];\r
+                        handler->getTextInterface()->setText ({});\r
+                        return YES;\r
                     }\r
-                    else\r
+\r
+                    if (auto* valueInterface = handler->getValueInterface())\r
                     {\r
-                        [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
-                                                                                         frame: NSZeroRect\r
-                                                                                         label: @"Offscreen Row"\r
-                                                                                        parent: self]];\r
+                        if (! valueInterface->isReadOnly())\r
+                        {\r
+                            valueInterface->setValue ({});\r
+                            return YES;\r
+                        }\r
                     }\r
                 }\r
-            }\r
 \r
-            return rows;\r
-        }\r
+                return NO;\r
+            });\r
 \r
-        static NSArray* getAccessibilitySelectedRows (id self, SEL)\r
-        {\r
-            return getSelectedChildren ([self accessibilityRows]);\r
-        }\r
+            addMethod (@selector (accessibilityPerformPress),     accessibilityPerformPress);\r
 \r
-        static void setAccessibilitySelectedRows (id self, SEL, NSArray* selected)\r
-        {\r
-            setSelectedChildren ([self accessibilityRows], selected);\r
-        }\r
+            addMethod (@selector (accessibilityPerformShowMenu), [] (id self, SEL)\r
+            {\r
+                return performActionIfSupported (self, AccessibilityActionType::showMenu);\r
+            });\r
 \r
-        static NSArray* getAccessibilityColumns (id self, SEL)\r
-        {\r
-            NSMutableArray* columns = [[NSMutableArray new] autorelease];\r
+            addMethod (@selector (accessibilityPerformRaise), [] (id self, SEL)\r
+            {\r
+                [self setAccessibilityFocused: YES]; return YES;\r
+            });\r
 \r
-            if (auto* tableInterface = getTableInterface (self))\r
+            addMethod (@selector (isAccessibilitySelectorAllowed:), [] (id self, SEL, SEL selector) -> BOOL\r
             {\r
-                for (int column = 0; column < tableInterface->getNumColumns(); ++column)\r
+                if (auto* handler = getHandler (self))\r
                 {\r
-                    if (auto* handler = tableInterface->getCellHandler (0, column))\r
+                    const auto handlerRole = handler->getRole();\r
+                    const auto currentState = handler->getCurrentState();\r
+\r
+                    for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber),\r
+                                               @selector (accessibilityVisibleCharacterRange),\r
+                                               @selector (accessibilityNumberOfCharacters),\r
+                                               @selector (accessibilitySelectedText),\r
+                                               @selector (accessibilitySelectedTextRange),\r
+                                               @selector (accessibilityAttributedStringForRange:),\r
+                                               @selector (accessibilityRangeForLine:),\r
+                                               @selector (accessibilityStringForRange:),\r
+                                               @selector (accessibilityRangeForPosition:),\r
+                                               @selector (accessibilityRangeForIndex:),\r
+                                               @selector (accessibilityFrameForRange:),\r
+                                               @selector (accessibilityLineForIndex:),\r
+                                               @selector (setAccessibilitySelectedTextRange:) })\r
                     {\r
-                        [columns addObject: (id) handler->getNativeImplementation()];\r
+                        if (selector == textSelector)\r
+                            return handler->getTextInterface() != nullptr;\r
                     }\r
-                    else\r
+\r
+                    for (auto tableSelector : { @selector (accessibilityRowCount),\r
+                                                @selector (accessibilityRows),\r
+                                                @selector (accessibilitySelectedRows),\r
+                                                @selector (accessibilityColumnCount),\r
+                                                @selector (accessibilityHeader) })\r
                     {\r
-                        [columns addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityColumnRole\r
-                                                                                            frame: NSZeroRect\r
-                                                                                            label: @"Offscreen Column"\r
-                                                                                           parent: self]];\r
+                        if (selector == tableSelector)\r
+                            return handler->getTableInterface() != nullptr;\r
                     }\r
-                }\r
-            }\r
 \r
-            return columns;\r
-        }\r
+                    for (auto cellSelector : { @selector (accessibilityRowIndexRange),\r
+                                               @selector (accessibilityColumnIndexRange),\r
+                                               @selector (accessibilityIndex),\r
+                                               @selector (accessibilityDisclosureLevel) })\r
+                    {\r
+                        if (selector == cellSelector)\r
+                            return handler->getCellInterface() != nullptr;\r
+                    }\r
 \r
-        static NSArray* getAccessibilitySelectedColumns (id self, SEL)\r
-        {\r
-            return getSelectedChildren ([self accessibilityColumns]);\r
-        }\r
+                    for (auto valueSelector : { @selector (accessibilityValue),\r
+                                                @selector (setAccessibilityValue:),\r
+                                                @selector (accessibilityPerformDelete),\r
+                                                @selector (accessibilityPerformIncrement),\r
+                                                @selector (accessibilityPerformDecrement) })\r
+                    {\r
+                        if (selector != valueSelector)\r
+                            continue;\r
 \r
-        static void setAccessibilitySelectedColumns (id self, SEL, NSArray* selected)\r
-        {\r
-            setSelectedChildren ([self accessibilityColumns], selected);\r
-        }\r
+                        auto* valueInterface = handler->getValueInterface();\r
 \r
-        //==============================================================================\r
-        static NSInteger getAccessibilityIndex (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-            {\r
-                if (auto* cellInterface = handler->getCellInterface())\r
-                {\r
-                    NSAccessibilityRole role = [self accessibilityRole];\r
+                        if (selector == @selector (accessibilityValue))\r
+                            return valueInterface != nullptr\r
+                                   || hasEditableText (*handler)\r
+                                   || currentState.isCheckable();\r
 \r
-                    if ([role isEqual: NSAccessibilityRowRole])\r
-                        return cellInterface->getRowIndex();\r
+                        auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); };\r
 \r
-                    if ([role isEqual: NSAccessibilityColumnRole])\r
-                        return cellInterface->getColumnIndex();\r
-                }\r
-            }\r
+                        if (selector == @selector (setAccessibilityValue:)\r
+                            || selector == @selector (accessibilityPerformDelete))\r
+                            return hasEditableValue() || hasEditableText (*handler);\r
 \r
-            return 0;\r
-        }\r
+                        auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); };\r
 \r
-        static NSInteger getAccessibilityDisclosureLevel (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                if (auto* cellInterface = handler->getCellInterface())\r
-                    return cellInterface->getDisclosureLevel();\r
+                        if (selector == @selector (accessibilityPerformIncrement)\r
+                            || selector == @selector (accessibilityPerformDecrement))\r
+                            return hasEditableValue() && isRanged();\r
 \r
-            return 0;\r
-        }\r
+                        return NO;\r
+                    }\r
 \r
-        static BOOL getIsAccessibilityExpanded (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-                return handler->getCurrentState().isExpanded();\r
+                    for (auto actionSelector : { @selector (accessibilityPerformPress),\r
+                                                 @selector (accessibilityPerformShowMenu),\r
+                                                 @selector (accessibilityPerformRaise),\r
+                                                 @selector (setAccessibilityFocused:) })\r
+                    {\r
+                        if (selector != actionSelector)\r
+                            continue;\r
 \r
-            return NO;\r
-        }\r
+                        if (selector == @selector (accessibilityPerformPress))\r
+                            return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
+                                   || handler->getActions().contains (AccessibilityActionType::press);\r
 \r
-        //==============================================================================\r
-        static BOOL accessibilityPerformShowMenu (id self, SEL)  { return performActionIfSupported (self, AccessibilityActionType::showMenu); }\r
-        static BOOL accessibilityPerformRaise (id self, SEL)     { [self setAccessibilityFocused: YES]; return YES; }\r
+                        if (selector == @selector (accessibilityPerformShowMenu))\r
+                            return handler->getActions().contains (AccessibilityActionType::showMenu);\r
 \r
-        static BOOL accessibilityPerformDelete (id self, SEL)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-            {\r
-                if (hasEditableText (*handler))\r
-                {\r
-                    handler->getTextInterface()->setText ({});\r
-                    return YES;\r
-                }\r
+                        if (selector == @selector (accessibilityPerformRaise))\r
+                            return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole];\r
 \r
-                if (auto* valueInterface = handler->getValueInterface())\r
-                {\r
-                    if (! valueInterface->isReadOnly())\r
-                    {\r
-                        valueInterface->setValue ({});\r
-                        return YES;\r
+                        if (selector == @selector (setAccessibilityFocused:))\r
+                            return currentState.isFocusable();\r
                     }\r
-                }\r
-            }\r
 \r
-            return NO;\r
-        }\r
+                    if (selector == @selector (accessibilitySelectedChildren))\r
+                        return handlerRole == AccessibilityRole::popupMenu;\r
 \r
-        //==============================================================================\r
-        static BOOL getIsAccessibilitySelectorAllowed (id self, SEL, SEL selector)\r
-        {\r
-            if (auto* handler = getHandler (self))\r
-            {\r
-                const auto role = handler->getRole();\r
-                const auto currentState = handler->getCurrentState();\r
-\r
-                for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber),\r
-                                           @selector (accessibilityVisibleCharacterRange),\r
-                                           @selector (accessibilityNumberOfCharacters),\r
-                                           @selector (accessibilitySelectedText),\r
-                                           @selector (accessibilitySelectedTextRange),\r
-                                           @selector (accessibilityAttributedStringForRange:),\r
-                                           @selector (accessibilityRangeForLine:),\r
-                                           @selector (accessibilityStringForRange:),\r
-                                           @selector (accessibilityRangeForPosition:),\r
-                                           @selector (accessibilityRangeForIndex:),\r
-                                           @selector (accessibilityFrameForRange:),\r
-                                           @selector (accessibilityLineForIndex:),\r
-                                           @selector (setAccessibilitySelectedTextRange:) })\r
-                {\r
-                    if (selector == textSelector)\r
-                        return handler->getTextInterface() != nullptr;\r
-                }\r
+                    if (selector == @selector (accessibilityOrientation))\r
+                        return handlerRole == AccessibilityRole::scrollBar;\r
 \r
-                for (auto tableSelector : { @selector (accessibilityRowCount),\r
-                                            @selector (accessibilityRows),\r
-                                            @selector (accessibilitySelectedRows),\r
-                                            @selector (accessibilityColumnCount),\r
-                                            @selector (accessibilityColumns),\r
-                                            @selector (accessibilitySelectedColumns) })\r
-                {\r
-                    if (selector == tableSelector)\r
-                        return handler->getTableInterface() != nullptr;\r
-                }\r
+                    if (selector == @selector (isAccessibilityExpanded))\r
+                        return currentState.isExpandable();\r
 \r
-                for (auto cellSelector : { @selector (accessibilityRowIndexRange),\r
-                                           @selector (accessibilityColumnIndexRange),\r
-                                           @selector (accessibilityIndex),\r
-                                           @selector (accessibilityDisclosureLevel) })\r
-                {\r
-                    if (selector == cellSelector)\r
-                        return handler->getCellInterface() != nullptr;\r
+                    return sendSuperclassMessage<BOOL> (self, @selector (isAccessibilitySelectorAllowed:), selector);\r
                 }\r
 \r
-                for (auto valueSelector : { @selector (accessibilityValue),\r
-                                            @selector (setAccessibilityValue:),\r
-                                            @selector (accessibilityPerformDelete),\r
-                                            @selector (accessibilityPerformIncrement),\r
-                                            @selector (accessibilityPerformDecrement) })\r
-                {\r
-                    if (selector != valueSelector)\r
-                        continue;\r
-\r
-                    auto* valueInterface = handler->getValueInterface();\r
+                return NO;\r
+            });\r
 \r
-                    if (selector == @selector (accessibilityValue))\r
-                        return valueInterface != nullptr\r
-                            || hasEditableText (*handler)\r
-                            || currentState.isCheckable();\r
+            addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren);\r
 \r
-                    auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); };\r
+            registerClass();\r
+        }\r
 \r
-                    if (selector == @selector (setAccessibilityValue:)\r
-                     || selector == @selector (accessibilityPerformDelete))\r
-                        return hasEditableValue() || hasEditableText (*handler);\r
+        //==============================================================================\r
+        static bool isSelectable (AccessibleState state) noexcept\r
+        {\r
+            return state.isSelectable() || state.isMultiSelectable();\r
+        }\r
 \r
-                    auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); };\r
+        static NSArray* getSelectedChildren (NSArray* children)\r
+        {\r
+            NSMutableArray* selected = [[NSMutableArray new] autorelease];\r
 \r
-                    if (selector == @selector (accessibilityPerformIncrement)\r
-                     || selector == @selector (accessibilityPerformDecrement))\r
-                        return hasEditableValue() && isRanged();\r
+            for (id child in children)\r
+            {\r
+                if (auto* handler = getHandler (child))\r
+                {\r
+                    const auto currentState = handler->getCurrentState();\r
 \r
-                    return NO;\r
+                    if (isSelectable (currentState) && currentState.isSelected())\r
+                        [selected addObject: child];\r
                 }\r
+            }\r
 \r
-                for (auto actionSelector : { @selector (accessibilityPerformPress),\r
-                                             @selector (accessibilityPerformShowMenu),\r
-                                             @selector (accessibilityPerformRaise),\r
-                                             @selector (setAccessibilityFocused:) })\r
-                {\r
-                    if (selector != actionSelector)\r
-                        continue;\r
+            return selected;\r
+        }\r
 \r
-                    if (selector == @selector (accessibilityPerformPress))\r
-                        return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
-                                || handler->getActions().contains (AccessibilityActionType::press);\r
+        static void setSelected (id item, bool selected)\r
+        {\r
+            auto* handler = getHandler (item);\r
 \r
-                    if (selector == @selector (accessibilityPerformShowMenu))\r
-                        return handler->getActions().contains (AccessibilityActionType::showMenu);\r
+            if (handler == nullptr)\r
+                return;\r
 \r
-                    if (selector == @selector (accessibilityPerformRaise))\r
-                        return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole];\r
+            const auto currentState = handler->getCurrentState();\r
 \r
-                    if (selector == @selector (setAccessibilityFocused:))\r
-                        return currentState.isFocusable();\r
-                }\r
+            if (isSelectable (currentState))\r
+            {\r
+                if (currentState.isSelected() != selected)\r
+                    handler->getActions().invoke (AccessibilityActionType::toggle);\r
+            }\r
+            else if (currentState.isFocusable())\r
+            {\r
+                [item setAccessibilityFocused: selected];\r
+            }\r
+        }\r
 \r
-                if (selector == @selector (accessibilitySelectedChildren))\r
-                    return role == AccessibilityRole::popupMenu;\r
+        static void setSelectedChildren (NSArray* children, NSArray* selected)\r
+        {\r
+            for (id child in children)\r
+                setSelected (child, [selected containsObject: child]);\r
+        }\r
 \r
-                if (selector == @selector (accessibilityOrientation))\r
-                    return role == AccessibilityRole::scrollBar;\r
+        //==============================================================================\r
+        static id getAccessibilityWindow (id self, SEL)\r
+        {\r
+            return [[self accessibilityParent] accessibilityWindow];\r
+        }\r
 \r
-                if (selector == @selector (isAccessibilityExpanded))\r
-                    return currentState.isExpandable();\r
+        static NSArray* getAccessibilityChildren (id self, SEL)\r
+        {\r
+            if (auto* handler = getHandler (self))\r
+            {\r
+                auto children = handler->getChildren();\r
 \r
-                return sendSuperclassMessage<BOOL> (self, @selector (isAccessibilitySelectorAllowed:), selector);\r
+                auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+\r
+                for (auto* childHandler : children)\r
+                    [accessibleChildren addObject: static_cast<id> (childHandler->getNativeImplementation())];\r
+\r
+                return accessibleChildren;\r
             }\r
 \r
-            return NO;\r
+            return nil;\r
         }\r
 \r
         //==============================================================================\r
@@ -881,7 +844,7 @@ static void sendHandlerNotification (const AccessibilityHandler& handler,
 \r
     if (@available (macOS 10.9, *))\r
     {\r
-        if (id accessibilityElement = (id) handler.getNativeImplementation())\r
+        if (id accessibilityElement = static_cast<id> (handler.getNativeImplementation()))\r
         {\r
             sendAccessibilityEvent (accessibilityElement, notification,\r
                                     (notification == NSAccessibilityLayoutChangedNotification\r
@@ -966,7 +929,7 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A
             JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
         }();\r
 \r
-        sendAccessibilityEvent ((id) [NSApp mainWindow],\r
+        sendAccessibilityEvent (static_cast<id> ([NSApp mainWindow]),\r
                                 NSAccessibilityAnnouncementRequestedNotification,\r
                                 @{ NSAccessibilityAnnouncementKey: juceStringToNS (announcementString),\r
                                    NSAccessibilityPriorityKey:     @(nsPriority) });\r
index 6eb5b6929ae3acbc8208bb41090d0e06bdf5c708..f487d894c72bf0d60acf4ef44fc8a3a3f965dfe0 100644 (file)
@@ -46,7 +46,9 @@ public:
     using Holder = std::unique_ptr<Base, AccessibleObjCClassDeleter>;\r
 \r
 protected:\r
-    AccessibleObjCClass()  : ObjCClass<Base> ("JUCEAccessibilityElement_")\r
+    AccessibleObjCClass() : AccessibleObjCClass ("JUCEAccessibilityElement_") {}\r
+\r
+    explicit AccessibleObjCClass (const char* name)  : ObjCClass<Base> (name)\r
     {\r
         ObjCClass<Base>::template addIvar<AccessibilityHandler*> ("handler");\r
     }\r
@@ -71,18 +73,6 @@ protected:
     static AccessibilityTableInterface* getTableInterface (id self) noexcept  { return getInterface (self, &AccessibilityHandler::getTableInterface); }\r
     static AccessibilityCellInterface*  getCellInterface  (id self) noexcept  { return getInterface (self, &AccessibilityHandler::getCellInterface); }\r
 \r
-    template <typename MemberFn>\r
-    static auto getEnclosingInterface (AccessibilityHandler* handler, MemberFn fn) noexcept -> decltype ((std::declval<AccessibilityHandler>().*fn)())\r
-    {\r
-        if (handler == nullptr)\r
-            return nullptr;\r
-\r
-        if (auto* interface = (handler->*fn)())\r
-            return interface;\r
-\r
-        return getEnclosingInterface (handler->getParent(), fn);\r
-    }\r
-\r
     static bool hasEditableText (AccessibilityHandler& handler) noexcept\r
     {\r
         return handler.getRole() == AccessibilityRole::editableText\r
@@ -105,8 +95,7 @@ protected:
     static BOOL getIsAccessibilityElement (id self, SEL)\r
     {\r
         if (auto* handler = getHandler (self))\r
-            return ! handler->isIgnored()\r
-                  && handler->getRole() != AccessibilityRole::window;\r
+            return ! handler->isIgnored() && handler->getRole() != AccessibilityRole::window;\r
 \r
         return NO;\r
     }\r
@@ -198,10 +187,8 @@ protected:
 \r
             NSString* nsString = juceStringToNS (title);\r
 \r
-           #if ! JUCE_IOS\r
             if (nsString != nil && [[self accessibilityValue] isEqual: nsString])\r
                 return @"";\r
-           #endif\r
 \r
             return nsString;\r
         }\r
@@ -227,36 +214,58 @@ protected:
 \r
     static NSInteger getAccessibilityRowCount (id self, SEL)\r
     {\r
-        if (auto* tableInterface = getTableInterface (self))\r
-            return tableInterface->getNumRows();\r
+        if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+            if (auto* tableInterface = tableHandler->getTableInterface())\r
+                return tableInterface->getNumRows();\r
 \r
         return 0;\r
     }\r
 \r
     static NSInteger getAccessibilityColumnCount (id self, SEL)\r
     {\r
-        if (auto* tableInterface = getTableInterface (self))\r
-            return tableInterface->getNumColumns();\r
+        if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+            if (auto* tableInterface = tableHandler->getTableInterface())\r
+                return tableInterface->getNumColumns();\r
 \r
         return 0;\r
     }\r
 \r
-    static NSRange getAccessibilityRowIndexRange (id self, SEL)\r
+    template <typename Getter>\r
+    static NSRange getCellDimensions (id self, Getter getter)\r
     {\r
-        if (auto* cellInterface = getCellInterface (self))\r
-            return NSMakeRange ((NSUInteger) cellInterface->getRowIndex(),\r
-                                (NSUInteger) cellInterface->getRowSpan());\r
+        const auto notFound = NSMakeRange (NSNotFound, 0);\r
+\r
+        auto* handler = getHandler (self);\r
+\r
+        if (handler == nullptr)\r
+            return notFound;\r
 \r
-        return NSMakeRange (0, 0);\r
+        auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface);\r
+\r
+        if (tableHandler == nullptr)\r
+            return notFound;\r
+\r
+        auto* tableInterface = tableHandler->getTableInterface();\r
+\r
+        if (tableInterface == nullptr)\r
+            return notFound;\r
+\r
+        const auto result = (tableInterface->*getter) (*handler);\r
+\r
+        if (! result.hasValue())\r
+            return notFound;\r
+\r
+        return NSMakeRange ((NSUInteger) result->begin, (NSUInteger) result->num);\r
     }\r
 \r
-    static NSRange getAccessibilityColumnIndexRange (id self, SEL)\r
+    static NSRange getAccessibilityRowIndexRange (id self, SEL)\r
     {\r
-        if (auto* cellInterface = getCellInterface (self))\r
-            return NSMakeRange ((NSUInteger) cellInterface->getColumnIndex(),\r
-                                (NSUInteger) cellInterface->getColumnSpan());\r
+        return getCellDimensions (self, &AccessibilityTableInterface::getRowSpan);\r
+    }\r
 \r
-        return NSMakeRange (0, 0);\r
+    static NSRange getAccessibilityColumnIndexRange (id self, SEL)\r
+    {\r
+        return getCellDimensions (self, &AccessibilityTableInterface::getColumnSpan);\r
     }\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AccessibleObjCClass)\r
index de17aae67d3b94f836dd2e07f70a3c399653b454..d7712203dc636ec0bf192a1b62c56786d2bd8491 100644 (file)
@@ -30,6 +30,50 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")
 \r
 int AccessibilityNativeHandle::idCounter = 0;\r
 \r
+//==============================================================================\r
+class UIAScrollProvider  : public UIAProviderBase,\r
+                           public ComBaseClassHelper<ComTypes::IScrollProvider>\r
+{\r
+public:\r
+    using UIAProviderBase::UIAProviderBase;\r
+\r
+    JUCE_COMCALL Scroll (ComTypes::ScrollAmount, ComTypes::ScrollAmount) override { return E_FAIL; }\r
+    JUCE_COMCALL SetScrollPercent (double, double) override { return E_FAIL; }\r
+    JUCE_COMCALL get_HorizontalScrollPercent (double*) override { return E_FAIL; }\r
+    JUCE_COMCALL get_VerticalScrollPercent (double*) override { return E_FAIL; }\r
+    JUCE_COMCALL get_HorizontalViewSize (double*) override { return E_FAIL; }\r
+    JUCE_COMCALL get_VerticalViewSize (double*) override { return E_FAIL; }\r
+    JUCE_COMCALL get_HorizontallyScrollable (BOOL*) override { return E_FAIL; }\r
+    JUCE_COMCALL get_VerticallyScrollable (BOOL*) override { return E_FAIL; }\r
+\r
+private:\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollProvider)\r
+};\r
+\r
+class UIAScrollItemProvider  : public UIAProviderBase,\r
+                               public ComBaseClassHelper<ComTypes::IScrollItemProvider>\r
+{\r
+public:\r
+    using UIAProviderBase::UIAProviderBase;\r
+\r
+    JUCE_COMCALL ScrollIntoView() override\r
+    {\r
+        if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+        {\r
+            if (auto* tableInterface = handler->getTableInterface())\r
+            {\r
+                tableInterface->showCell (getHandler());\r
+                return S_OK;\r
+            }\r
+        }\r
+\r
+        return (HRESULT) UIA_E_NOTSUPPORTED;\r
+    }\r
+\r
+private:\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollItemProvider)\r
+};\r
+\r
 //==============================================================================\r
 static String getAutomationId (const AccessibilityHandler& handler)\r
 {\r
@@ -63,7 +107,7 @@ static auto roleToControlTypeId (AccessibilityRole roleType)
         case AccessibilityRole::staticText:    return ComTypes::UIA_TextControlTypeId;\r
 \r
         case AccessibilityRole::column:\r
-        case AccessibilityRole::row:           return ComTypes::UIA_HeaderItemControlTypeId;\r
+        case AccessibilityRole::row:           return ComTypes::UIA_ListItemControlTypeId;\r
 \r
         case AccessibilityRole::button:        return ComTypes::UIA_ButtonControlTypeId;\r
         case AccessibilityRole::toggleButton:  return ComTypes::UIA_CheckBoxControlTypeId;\r
@@ -146,6 +190,22 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
             const auto role = accessibilityHandler.getRole();\r
             const auto fragmentRoot = isFragmentRoot();\r
 \r
+            const auto isListOrTableCell = [] (auto& handler)\r
+            {\r
+                if (auto* tableHandler = getEnclosingHandlerWithInterface (&handler, &AccessibilityHandler::getTableInterface))\r
+                {\r
+                    if (auto* tableInterface = tableHandler->getTableInterface())\r
+                    {\r
+                        const auto row    = tableInterface->getRowSpan    (handler);\r
+                        const auto column = tableInterface->getColumnSpan (handler);\r
+\r
+                        return row.hasValue() && column.hasValue();\r
+                    }\r
+                }\r
+\r
+                return false;\r
+            };\r
+\r
             switch (pId)\r
             {\r
                 case ComTypes::UIA_WindowPatternId:\r
@@ -213,25 +273,27 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
                 {\r
                     auto state = accessibilityHandler.getCurrentState();\r
 \r
-                    if (state.isSelectable() || state.isMultiSelectable()\r
-                        || role == AccessibilityRole::radioButton)\r
+                    if (state.isSelectable() || state.isMultiSelectable() || role == AccessibilityRole::radioButton)\r
                     {\r
                         return new UIASelectionItemProvider (this);\r
                     }\r
 \r
                     break;\r
                 }\r
+                case ComTypes::UIA_TablePatternId:\r
                 case ComTypes::UIA_GridPatternId:\r
                 {\r
-                    if (accessibilityHandler.getTableInterface() != nullptr)\r
-                        return new UIAGridProvider (this);\r
+                    if (accessibilityHandler.getTableInterface() != nullptr\r
+                        && (pId == ComTypes::UIA_GridPatternId || accessibilityHandler.getRole() == AccessibilityRole::table))\r
+                        return static_cast<ComTypes::IGridProvider*> (new UIAGridProvider (this));\r
 \r
                     break;\r
                 }\r
+                case ComTypes::UIA_TableItemPatternId:\r
                 case ComTypes::UIA_GridItemPatternId:\r
                 {\r
-                    if (accessibilityHandler.getCellInterface() != nullptr)\r
-                        return new UIAGridItemProvider (this);\r
+                    if (isListOrTableCell (accessibilityHandler))\r
+                        return static_cast<ComTypes::IGridItemProvider*> (new UIAGridItemProvider (this));\r
 \r
                     break;\r
                 }\r
@@ -250,6 +312,20 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
 \r
                     break;\r
                 }\r
+                case ComTypes::UIA_ScrollPatternId:\r
+                {\r
+                    if (accessibilityHandler.getTableInterface() != nullptr)\r
+                        return new UIAScrollProvider (this);\r
+\r
+                    break;\r
+                }\r
+                case ComTypes::UIA_ScrollItemPatternId:\r
+                {\r
+                    if (isListOrTableCell (accessibilityHandler))\r
+                        return new UIAScrollItemProvider (this);\r
+\r
+                    break;\r
+                }\r
             }\r
 \r
             return nullptr;\r
index b03fe8cd8f84d4df5818206b4e7880957964fcb6..cb07817ba75fa15b67800033f95152b84cc91437 100644 (file)
@@ -120,18 +120,38 @@ enum WindowInteractionState
     WindowInteractionState_NotResponding = 4\r
 };\r
 \r
+enum RowOrColumnMajor\r
+{\r
+    RowOrColumnMajor_RowMajor = 0,\r
+    RowOrColumnMajor_ColumnMajor = 1,\r
+    RowOrColumnMajor_Indeterminate = 2\r
+};\r
+\r
+enum ScrollAmount\r
+{\r
+    ScrollAmount_LargeDecrement = 0,\r
+    ScrollAmount_SmallDecrement = 1,\r
+    ScrollAmount_NoAmount = 2,\r
+    ScrollAmount_LargeIncrement = 3,\r
+    ScrollAmount_SmallIncrement = 4\r
+};\r
+\r
 const long UIA_InvokePatternId = 10000;\r
 const long UIA_SelectionPatternId = 10001;\r
 const long UIA_ValuePatternId = 10002;\r
 const long UIA_RangeValuePatternId = 10003;\r
+const long UIA_ScrollPatternId = 10004;\r
 const long UIA_ExpandCollapsePatternId = 10005;\r
 const long UIA_GridPatternId = 10006;\r
 const long UIA_GridItemPatternId = 10007;\r
 const long UIA_WindowPatternId = 10009;\r
 const long UIA_SelectionItemPatternId = 10010;\r
+const long UIA_TablePatternId = 10012;\r
+const long UIA_TableItemPatternId = 10013;\r
 const long UIA_TextPatternId = 10014;\r
 const long UIA_TogglePatternId = 10015;\r
 const long UIA_TransformPatternId = 10016;\r
+const long UIA_ScrollItemPatternId = 10017;\r
 const long UIA_TextPattern2Id = 10024;\r
 const long UIA_StructureChangedEventId = 20002;\r
 const long UIA_MenuOpenedEventId = 20003;\r
@@ -220,6 +240,21 @@ public:
     JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0;\r
 };\r
 \r
+JUCE_COMCLASS (ITableItemProvider, "b9734fa6-771f-4d78-9c90-2517999349cd") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetRowHeaderItems (SAFEARRAY** pRetVal) = 0;\r
+    JUCE_COMCALL GetColumnHeaderItems (SAFEARRAY** pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITableProvider, "9c860395-97b3-490a-b52a-858cc22af166") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetRowHeaders (SAFEARRAY** pRetVal) = 0;\r
+    JUCE_COMCALL GetColumnHeaders (SAFEARRAY** pRetVal) = 0;\r
+    JUCE_COMCALL get_RowOrColumnMajor (RowOrColumnMajor* pRetVal) = 0;\r
+};\r
+\r
 JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown\r
 {\r
 public:\r
@@ -345,6 +380,25 @@ public:
     JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0;\r
 };\r
 \r
+JUCE_COMCLASS (IScrollProvider, "b38b8077-1fc3-42a5-8cae-d40c2215055a") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Scroll (ScrollAmount horizontalAmount, ScrollAmount verticalAmount) = 0;\r
+    JUCE_COMCALL SetScrollPercent (double horizontalPercent,double verticalPercent) = 0;\r
+    JUCE_COMCALL get_HorizontalScrollPercent (double* pRetVal) = 0;\r
+    JUCE_COMCALL get_VerticalScrollPercent (double* pRetVal) = 0;\r
+    JUCE_COMCALL get_HorizontalViewSize (double* pRetVal) = 0;\r
+    JUCE_COMCALL get_VerticalViewSize (double* pRetVal) = 0;\r
+    JUCE_COMCALL get_HorizontallyScrollable (BOOL* pRetVal) = 0;\r
+    JUCE_COMCALL get_VerticallyScrollable (BOOL* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IScrollItemProvider, "2360c714-4bf1-4b26-ba65-9b21316127eb")  : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL ScrollIntoView() = 0;\r
+};\r
+\r
 constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } };\r
 \r
 } // namespace ComTypes\r
@@ -368,4 +422,8 @@ __CRT_UUID_DECL (juce::ComTypes::IToggleProvider,                 0x56d00bd0, 0x
 __CRT_UUID_DECL (juce::ComTypes::ITransformProvider,              0x6829ddc4, 0x4f91, 0x4ffa, 0xb8, 0x6f, 0xbd, 0x3e, 0x29, 0x87, 0xcb, 0x4c)\r
 __CRT_UUID_DECL (juce::ComTypes::IValueProvider,                  0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a)\r
 __CRT_UUID_DECL (juce::ComTypes::IWindowProvider,                 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9)\r
+__CRT_UUID_DECL (juce::ComTypes::ITableItemProvider,              0xb9734fa6, 0x771f, 0x4d78, 0x9c, 0x90, 0x25, 0x17, 0x99, 0x93, 0x49, 0xcd)\r
+__CRT_UUID_DECL (juce::ComTypes::ITableProvider,                  0x9c860395, 0x97b3, 0x490a, 0xb5, 0x2a, 0x85, 0x8c, 0xc2, 0x2a, 0xf1, 0x66)\r
+__CRT_UUID_DECL (juce::ComTypes::IScrollProvider,                 0xb38b8077, 0x1fc3, 0x42a5, 0x8c, 0xae, 0xd4, 0x0c, 0x22, 0x15, 0x05, 0x5a)\r
+__CRT_UUID_DECL (juce::ComTypes::IScrollItemProvider,             0x2360c714, 0x4bf1, 0x4b26, 0xba, 0x65, 0x9b, 0x21, 0x31, 0x61, 0x27, 0xeb)\r
 #endif\r
index 251a3c5a80905529c1723b51b4969fd9781c4a92..494dfeb26cdda5625b93d8d1d88609ae57495527 100644 (file)
@@ -28,7 +28,7 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAGridItemProvider  : public UIAProviderBase,\r
-                             public ComBaseClassHelper<ComTypes::IGridItemProvider>\r
+                             public ComBaseClassHelper<ComTypes::IGridItemProvider, ComTypes::ITableItemProvider>\r
 {\r
 public:\r
     using UIAProviderBase::UIAProviderBase;\r
@@ -36,62 +36,113 @@ public:
     //==============================================================================\r
     JUCE_COMRESULT get_Row (int* pRetVal) override\r
     {\r
-        return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
-        {\r
-            *pRetVal = cellInterface.getRowIndex();\r
-        });\r
+        return withTableSpan (pRetVal,\r
+                              &AccessibilityTableInterface::getRowSpan,\r
+                              &AccessibilityTableInterface::Span::begin);\r
     }\r
 \r
     JUCE_COMRESULT get_Column (int* pRetVal) override\r
     {\r
-        return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
-        {\r
-            *pRetVal = cellInterface.getColumnIndex();\r
-        });\r
+        return withTableSpan (pRetVal,\r
+                              &AccessibilityTableInterface::getColumnSpan,\r
+                              &AccessibilityTableInterface::Span::begin);\r
     }\r
 \r
     JUCE_COMRESULT get_RowSpan (int* pRetVal) override\r
     {\r
-        return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
-        {\r
-            *pRetVal = cellInterface.getRowSpan();\r
-        });\r
+        return withTableSpan (pRetVal,\r
+                              &AccessibilityTableInterface::getRowSpan,\r
+                              &AccessibilityTableInterface::Span::num);\r
     }\r
 \r
     JUCE_COMRESULT get_ColumnSpan (int* pRetVal) override\r
     {\r
-        return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
-        {\r
-            *pRetVal = cellInterface.getColumnSpan();\r
-        });\r
+        return withTableSpan (pRetVal,\r
+                              &AccessibilityTableInterface::getColumnSpan,\r
+                              &AccessibilityTableInterface::Span::num);\r
     }\r
 \r
     JUCE_COMRESULT get_ContainingGrid (IRawElementProviderSimple** pRetVal) override\r
     {\r
-        return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
+        return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler)\r
         {\r
             JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
-\r
-            if (auto* handler = cellInterface.getTableHandler())\r
-                handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
-\r
+            tableHandler.getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
             JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+            return true;\r
         });\r
     }\r
 \r
+    JUCE_COMRESULT GetRowHeaderItems (SAFEARRAY**) override\r
+    {\r
+        return (HRESULT) UIA_E_NOTSUPPORTED;\r
+    }\r
+\r
+    JUCE_COMRESULT GetColumnHeaderItems (SAFEARRAY** pRetVal) override\r
+    {\r
+        return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler)\r
+        {\r
+            if (auto* tableInterface = tableHandler.getTableInterface())\r
+            {\r
+                if (const auto column = tableInterface->getColumnSpan (getHandler()))\r
+                {\r
+                    if (auto* header = tableInterface->getHeaderHandler())\r
+                    {\r
+                        const auto children = header->getChildren();\r
+\r
+                        if (isPositiveAndBelow (column->begin, children.size()))\r
+                        {\r
+                            IRawElementProviderSimple* provider = nullptr;\r
+\r
+                            if (auto* child = children[(size_t) column->begin])\r
+                            {\r
+                                JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+                                if (child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider)) == S_OK && provider != nullptr)\r
+                                {\r
+                                    *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, 1);\r
+                                    LONG index = 0;\r
+                                    const auto hr = SafeArrayPutElement (*pRetVal, &index, provider);\r
+\r
+                                    return ! FAILED (hr);\r
+                                }\r
+                                JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+\r
+            return false;\r
+        });\r
+    }\r
 private:\r
     template <typename Value, typename Callback>\r
-    JUCE_COMRESULT withCellInterface (Value* pRetVal, Callback&& callback) const\r
+    JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
         {\r
-            if (auto* cellInterface = getHandler().getCellInterface())\r
+            if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+                if (handler->getTableInterface() != nullptr && callback (*handler))\r
+                    return S_OK;\r
+\r
+            return (HRESULT) UIA_E_NOTSUPPORTED;\r
+        });\r
+    }\r
+\r
+    JUCE_COMRESULT withTableSpan (int* pRetVal,\r
+                                  Optional<AccessibilityTableInterface::Span> (AccessibilityTableInterface::* getSpan) (const AccessibilityHandler&) const,\r
+                                  int AccessibilityTableInterface::Span::* spanMember) const\r
+    {\r
+        return withTableInterface (pRetVal, [&] (const AccessibilityHandler& handler)\r
+        {\r
+            if (const auto span = ((handler.getTableInterface())->*getSpan) (getHandler()))\r
             {\r
-                callback (*cellInterface);\r
-                return S_OK;\r
+                *pRetVal = (*span).*spanMember;\r
+                return true;\r
             }\r
 \r
-            return (HRESULT) UIA_E_NOTSUPPORTED;\r
+            return false;\r
         });\r
     }\r
 \r
index 6359f74bccf918855ae4af5ac4e965a5e0fc3a08..ef17dd5ecf5cc94767f94c42ae190d2f2e56d6c0 100644 (file)
@@ -28,7 +28,7 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAGridProvider  : public UIAProviderBase,\r
-                         public ComBaseClassHelper<ComTypes::IGridProvider>\r
+                         public ComBaseClassHelper<ComTypes::IGridProvider, ComTypes::ITableProvider>\r
 {\r
 public:\r
     using UIAProviderBase::UIAProviderBase;\r
@@ -44,12 +44,21 @@ public:
 \r
             JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
 \r
-            if (auto* handler = tableInterface.getCellHandler (row, column))\r
-                handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+            if (auto* cellHandler = tableInterface.getCellHandler (row, column))\r
+            {\r
+                cellHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+                return S_OK;\r
+            }\r
+\r
+            if (auto* rowHandler = tableInterface.getRowHandler (row))\r
+            {\r
+                rowHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+                return S_OK;\r
+            }\r
 \r
             JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-            return S_OK;\r
+            return E_FAIL;\r
         });\r
     }\r
 \r
@@ -71,14 +80,65 @@ public:
         });\r
     }\r
 \r
+    JUCE_COMRESULT GetRowHeaders (SAFEARRAY**) override\r
+    {\r
+        return (HRESULT) UIA_E_NOTSUPPORTED;\r
+    }\r
+\r
+    JUCE_COMRESULT GetColumnHeaders (SAFEARRAY** pRetVal) override\r
+    {\r
+        return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)\r
+        {\r
+            if (auto* header = tableInterface.getHeaderHandler())\r
+            {\r
+                const auto children = header->getChildren();\r
+\r
+                *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, (ULONG) children.size());\r
+\r
+                LONG index = 0;\r
+\r
+                for (const auto& child : children)\r
+                {\r
+                    IRawElementProviderSimple* provider = nullptr;\r
+\r
+                    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+                    if (child != nullptr)\r
+                        child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider));\r
+                    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+                    if (provider == nullptr)\r
+                        return E_FAIL;\r
+\r
+                    const auto hr = SafeArrayPutElement (*pRetVal, &index, provider);\r
+\r
+                    if (FAILED (hr))\r
+                        return E_FAIL;\r
+\r
+                    ++index;\r
+                }\r
+\r
+                return S_OK;\r
+            }\r
+\r
+            return (HRESULT) UIA_E_NOTSUPPORTED;\r
+        });\r
+    }\r
+\r
+    JUCE_COMRESULT get_RowOrColumnMajor (ComTypes::RowOrColumnMajor* pRetVal) override\r
+    {\r
+        *pRetVal = ComTypes::RowOrColumnMajor_RowMajor;\r
+        return S_OK;\r
+    }\r
+\r
 private:\r
     template <typename Value, typename Callback>\r
     JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
         {\r
-            if (auto* tableInterface = getHandler().getTableInterface())\r
-                return callback (*tableInterface);\r
+            if (auto* tableHandler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+                if (auto* tableInterface = tableHandler->getTableInterface())\r
+                    return callback (*tableInterface);\r
 \r
             return (HRESULT) UIA_E_NOTSUPPORTED;\r
         });\r
index 718effc4759783e29a71083dd082d845b74ba1dd..a6b8a974f195f88d3ddacaf4cb3945bcd9bb4e14 100644 (file)
@@ -164,9 +164,23 @@ DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (getDisplayCutout,     "getDisplayCutout", "()Landroid/view/DisplayCutout;")\r
FIELD  (layoutInDisplayCutoutMode, "layoutInDisplayCutoutMode", "I")\r
 \r
- DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets, "android/view/WindowInsets", 28)\r
+DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowManagerLayoutParams28, "android/view/WindowManager$LayoutParams", 28)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;") \\r
+ METHOD (consumeDisplayCutout, "consumeDisplayCutout", "()Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets28, "android/view/WindowInsets", 28)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getInsets, "getInsets", "(I)Landroid/graphics/Insets;") \\r
+ STATICFIELD (CONSUMED, "CONSUMED", "Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets30, "android/view/WindowInsets", 30)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
@@ -178,6 +192,22 @@ DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager
  DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidDisplayCutout, "android/view/DisplayCutout", 28)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ FIELD (bottom, "bottom", "I") \\r
+ FIELD (left, "left", "I") \\r
+ FIELD (right, "right", "I") \\r
+ FIELD (top, "top", "I")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidGraphicsInsets, "android/graphics/Insets", 29)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (ime, "ime", "()I") \\r
+ STATICMETHOD (displayCutout, "displayCutout", "()I")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsetsType, "android/view/WindowInsets$Type", 30)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
 //==============================================================================\r
 namespace\r
 {\r
@@ -205,14 +235,14 @@ static bool supportsDisplayCutout()
 \r
 static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displayCutout, double displayScale)\r
 {\r
-    if (displayCutout.get() == nullptr)\r
+    if (displayCutout == nullptr)\r
         return {};\r
 \r
     auto* env = getEnv();\r
 \r
-    auto getInset = [&] (jmethodID methodID)\r
+    const auto getInset = [&] (jmethodID methodID)\r
     {\r
-        return roundToInt (env->CallIntMethod (displayCutout.get(), methodID) / displayScale);\r
+        return roundToInt (env->CallIntMethod (displayCutout, methodID) / displayScale);\r
     };\r
 \r
     return { getInset (AndroidDisplayCutout.getSafeInsetTop),\r
@@ -221,6 +251,67 @@ static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displ
              getInset (AndroidDisplayCutout.getSafeInsetRight) };\r
 }\r
 \r
+static BorderSize<int> androidInsetsToBorderSize (LocalRef<jobject> insets, double displayScale)\r
+{\r
+    if (insets == nullptr)\r
+        return {};\r
+\r
+    auto* env = getEnv();\r
+\r
+    const auto getInset = [&] (jfieldID fieldID)\r
+    {\r
+        return roundToInt (env->GetIntField (insets, fieldID) / displayScale);\r
+    };\r
+\r
+    return { getInset (AndroidGraphicsInsets.top),\r
+             getInset (AndroidGraphicsInsets.left),\r
+             getInset (AndroidGraphicsInsets.bottom),\r
+             getInset (AndroidGraphicsInsets.right) };\r
+}\r
+\r
+class JuceInsets\r
+{\r
+    template <typename Display>\r
+    static auto tieDisplay (Display& d) { return std::tie (d.safeAreaInsets, d.keyboardInsets); }\r
+\r
+public:\r
+    BorderSize<int> displayCutout, keyboard;\r
+\r
+    static auto tie (      Displays::Display& d) { return tieDisplay (d); }\r
+    static auto tie (const Displays::Display& d) { return tieDisplay (d); }\r
+\r
+    auto tie() const { return std::tie (displayCutout, keyboard); }\r
+};\r
+\r
+static JuceInsets getInsetsFromAndroidWindowInsets (LocalRef<jobject> windowInsets, double scale)\r
+{\r
+    auto* env = getEnv();\r
+\r
+    if (windowInsets == nullptr)\r
+        return {};\r
+\r
+    const auto displayCutout = [&]() -> BorderSize<int>\r
+    {\r
+        if (AndroidWindowInsets28.getDisplayCutout == nullptr)\r
+            return {};\r
+\r
+        const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets28.getDisplayCutout) };\r
+        return androidDisplayCutoutToBorderSize (insets, scale);\r
+    }();\r
+\r
+    const auto keyboard = [&]() -> BorderSize<int>\r
+    {\r
+        if (AndroidWindowInsetsType.ime == nullptr || AndroidWindowInsets30.getInsets == nullptr)\r
+            return {};\r
+\r
+        const auto mask = env->CallStaticIntMethod (AndroidWindowInsetsType, AndroidWindowInsetsType.ime);\r
+        const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets30.getInsets, mask) };\r
+        return androidInsetsToBorderSize (insets, scale);\r
+    }();\r
+\r
+    return { displayCutout, keyboard };\r
+}\r
+\r
 /* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values\r
    represent ASCII keycodes. However in the native Android keycodes the values for special keys\r
    e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.\r
@@ -417,14 +508,8 @@ public:
 \r
             if (supportsDisplayCutout())\r
             {\r
-                jfieldID layoutInDisplayCutoutModeFieldId = env->GetFieldID (AndroidWindowManagerLayoutParams,\r
-                                                                             "layoutInDisplayCutoutMode",\r
-                                                                             "I");\r
-\r
-                if (layoutInDisplayCutoutModeFieldId != nullptr)\r
-                    env->SetIntField (windowLayoutParams.get(),\r
-                                      layoutInDisplayCutoutModeFieldId,\r
-                                      LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);\r
+                if (const auto fieldID = AndroidWindowManagerLayoutParams28.layoutInDisplayCutoutMode)\r
+                    env->SetIntField (windowLayoutParams, fieldID, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);\r
             }\r
 \r
             if (Desktop::getInstance().getKioskModeComponent() != nullptr)\r
@@ -441,14 +526,13 @@ public:
 \r
         if (supportsDisplayCutout())\r
         {\r
-            jmethodID setOnApplyWindowInsetsListenerMethodId = env->GetMethodID (AndroidView,\r
-                                                                                 "setOnApplyWindowInsetsListener",\r
-                                                                                 "(Landroid/view/View$OnApplyWindowInsetsListener;)V");\r
-\r
-            if (setOnApplyWindowInsetsListenerMethodId != nullptr)\r
-                env->CallVoidMethod (view.get(), setOnApplyWindowInsetsListenerMethodId,\r
+            if (const auto methodID = AndroidView23.setOnApplyWindowInsetsListener)\r
+            {\r
+                env->CallVoidMethod (view,\r
+                                     methodID,\r
                                      CreateJavaInterface (new ViewWindowInsetsListener,\r
                                                           "android/view/View$OnApplyWindowInsetsListener").get());\r
+            }\r
         }\r
 \r
         if (isFocused())\r
@@ -795,9 +879,7 @@ public:
 \r
             if (activity != nullptr)\r
             {\r
-                jmethodID finishMethod = env->GetMethodID (AndroidActivity, "finish", "()V");\r
-\r
-                if (finishMethod != nullptr)\r
+                if (const auto finishMethod = AndroidActivity.finish)\r
                     env->CallVoidMethod (activity.get(), finishMethod);\r
             }\r
         }\r
@@ -1130,35 +1212,23 @@ private:
     }\r
 \r
     //==============================================================================\r
-    struct ViewWindowInsetsListener  : public juce::AndroidInterfaceImplementer\r
+    class ViewWindowInsetsListener  : public juce::AndroidInterfaceImplementer\r
     {\r
-        jobject onApplyWindowInsets (LocalRef<jobject> v, LocalRef<jobject> insets)\r
+    public:\r
+        jobject onApplyWindowInsets (LocalRef<jobject>, LocalRef<jobject> insets)\r
         {\r
             auto* env = getEnv();\r
 \r
-            LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));\r
-\r
-            if (displayCutout != nullptr)\r
-            {\r
-                const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();\r
-                auto newSafeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, mainDisplay.scale);\r
-\r
-                if (newSafeAreaInsets != mainDisplay.safeAreaInsets)\r
-                    forceDisplayUpdate();\r
-\r
-                auto* fieldId = env->GetStaticFieldID (AndroidWindowInsets, "CONSUMED", "Landroid/view/WindowInsets");\r
-                jassert (fieldId != nullptr);\r
-\r
-                return env->GetStaticObjectField (AndroidWindowInsets, fieldId);\r
-            }\r
+            const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();\r
+            const auto newInsets = getInsetsFromAndroidWindowInsets (insets, mainDisplay.scale);\r
 \r
-            jmethodID onApplyWindowInsetsMethodId = env->GetMethodID (AndroidView,\r
-                                                                      "onApplyWindowInsets",\r
-                                                                      "(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;");\r
+            if (newInsets.tie() != JuceInsets::tie (mainDisplay))\r
+                forceDisplayUpdate();\r
 \r
-            jassert (onApplyWindowInsetsMethodId != nullptr);\r
+            if (const auto fieldId = AndroidWindowInsets30.CONSUMED)\r
+                return env->GetStaticObjectField (AndroidWindowInsets30, fieldId);\r
 \r
-            return env->CallObjectMethod (v.get(), onApplyWindowInsetsMethodId, insets.get());\r
+            return env->CallObjectMethod (insets, AndroidWindowInsets28.consumeDisplayCutout);\r
         }\r
 \r
     private:\r
@@ -1852,16 +1922,14 @@ void Displays::findDisplays (float masterScale)
     LocalRef<jstring> windowServiceString (javaString ("window"));\r
     LocalRef<jobject> displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create));\r
     LocalRef<jobject> windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));\r
-    LocalRef <jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));\r
-\r
-    jmethodID getRealMetricsMethod = env->GetMethodID (AndroidDisplay, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V");\r
+    LocalRef<jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));\r
 \r
-    if (getRealMetricsMethod != nullptr)\r
-        env->CallVoidMethod (display.get(), getRealMetricsMethod, displayMetrics.get());\r
+    if (const auto getRealMetricsMethod = AndroidDisplay17.getRealMetrics)\r
+        env->CallVoidMethod (display, getRealMetricsMethod, displayMetrics.get());\r
     else\r
-        env->CallVoidMethod (display.get(), AndroidDisplay.getMetrics, displayMetrics.get());\r
+        env->CallVoidMethod (display, AndroidDisplay.getMetrics, displayMetrics.get());\r
 \r
-    env->CallVoidMethod (display.get(), AndroidDisplay.getSize, usableSize.get());\r
+    env->CallVoidMethod (display, AndroidDisplay.getSize, usableSize.get());\r
 \r
     Display d;\r
 \r
@@ -1897,24 +1965,10 @@ void Displays::findDisplays (float masterScale)
             if (! activityArea.isEmpty())\r
                 d.userArea = activityArea / d.scale;\r
 \r
-            if (supportsDisplayCutout())\r
+            if (const auto getRootWindowInsetsMethodId = AndroidView23.getRootWindowInsets)\r
             {\r
-                jmethodID getRootWindowInsetsMethodId = env->GetMethodID (AndroidView,\r
-                                                                          "getRootWindowInsets",\r
-                                                                          "()Landroid/view/WindowInsets;");\r
-\r
-                if (getRootWindowInsetsMethodId != nullptr)\r
-                {\r
-                    LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));\r
-\r
-                    if (insets != nullptr)\r
-                    {\r
-                        LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));\r
-\r
-                        if (displayCutout.get() != nullptr)\r
-                            d.safeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, d.scale);\r
-                    }\r
-                }\r
+                LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));\r
+                JuceInsets::tie (d) = getInsetsFromAndroidWindowInsets (insets, d.scale).tie();\r
             }\r
 \r
             static bool hasAddedMainActivityListener = false;\r
index f15365b642ca35d1fa832a5aafae237bbb735d1f..8aea94480450efa6beb68d9f8b222f58ed694fdd 100644 (file)
 namespace juce\r
 {\r
 \r
-#if ! defined (__IPHONE_10_0) || __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0\r
- using UIActivityType = NSString*;\r
-#endif\r
-\r
 class ContentSharer::ContentSharerNativeImpl    : public ContentSharer::Pimpl,\r
                                                   private Component\r
 {\r
index 3121bb84a7c0c05442f40532c74e942fe093acf0..5336269156116a385d92acf6d997b8ff962b37b6 100644 (file)
 namespace juce\r
 {\r
 \r
+//==============================================================================\r
+static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler)\r
+{\r
+    const auto children = handler.getChildren();\r
+\r
+    NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+\r
+    for (auto* childHandler : children)\r
+    {\r
+        id accessibleElement = [&childHandler]\r
+        {\r
+            id native = static_cast<id> (childHandler->getNativeImplementation());\r
+\r
+            if (! childHandler->getChildren().empty())\r
+                return [native accessibilityContainer];\r
+\r
+            return native;\r
+        }();\r
+\r
+        if (accessibleElement != nil)\r
+            [accessibleChildren addObject: accessibleElement];\r
+    }\r
+\r
+    [accessibleChildren addObject: static_cast<id> (handler.getNativeImplementation())];\r
+\r
+    return accessibleChildren;\r
+}\r
+\r
 class UIViewComponentPeer;\r
 \r
 static UIInterfaceOrientation getWindowOrientation()\r
@@ -119,6 +147,107 @@ enum class MouseEventFlags
 \r
 using namespace juce;\r
 \r
+@interface JuceUITextPosition : UITextPosition\r
+{\r
+@public\r
+    int index;\r
+}\r
+@end\r
+\r
+@implementation JuceUITextPosition\r
+\r
++ (instancetype) withIndex: (int) indexIn\r
+{\r
+    auto* result = [[JuceUITextPosition alloc] init];\r
+    result->index = indexIn;\r
+    return [result autorelease];\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@interface JuceUITextRange : UITextRange\r
+{\r
+@public\r
+    int from, to;\r
+}\r
+@end\r
+\r
+@implementation JuceUITextRange\r
+\r
++ (instancetype) withRange: (juce::Range<int>) range\r
+{\r
+    return [JuceUITextRange from: range.getStart() to: range.getEnd()];\r
+}\r
+\r
++ (instancetype) from: (int) from to: (int) to\r
+{\r
+    auto* result = [[JuceUITextRange alloc] init];\r
+    result->from = from;\r
+    result->to = to;\r
+    return [result autorelease];\r
+}\r
+\r
+- (UITextPosition*) start\r
+{\r
+    return [JuceUITextPosition withIndex: from];\r
+}\r
+\r
+- (UITextPosition*) end\r
+{\r
+    return [JuceUITextPosition withIndex: to];\r
+}\r
+\r
+- (Range<int>) range\r
+{\r
+    return Range<int>::between (from, to);\r
+}\r
+\r
+- (BOOL) isEmpty\r
+{\r
+    return from == to;\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+// UITextInputStringTokenizer doesn't handle 'line' granularities correctly by default, hence\r
+// this subclass.\r
+@interface JuceTextInputTokenizer : UITextInputStringTokenizer\r
+{\r
+    UIViewComponentPeer* peer;\r
+}\r
+\r
+- (instancetype) initWithPeer: (UIViewComponentPeer*) peer;\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@interface JuceUITextSelectionRect : UITextSelectionRect\r
+{\r
+    CGRect _rect;\r
+}\r
+\r
+@end\r
+\r
+@implementation JuceUITextSelectionRect\r
+\r
++ (instancetype) withRect: (CGRect) rect\r
+{\r
+    auto* result = [[JuceUITextSelectionRect alloc] init];\r
+    result->_rect = rect;\r
+    return [result autorelease];\r
+}\r
+\r
+- (CGRect) rect { return _rect; }\r
+- (NSWritingDirection) writingDirection { return NSWritingDirectionNatural; }\r
+- (BOOL) containsStart { return NO; }\r
+- (BOOL) containsEnd   { return NO; }\r
+- (BOOL) isVertical    { return NO; }\r
+\r
+@end\r
+\r
+//==============================================================================\r
 struct CADisplayLinkDeleter\r
 {\r
     void operator() (CADisplayLink* displayLink) const noexcept\r
@@ -128,11 +257,21 @@ struct CADisplayLinkDeleter
     }\r
 };\r
 \r
-@interface JuceUIView : UIView <UITextViewDelegate>\r
+@interface JuceTextView : UIView <UITextInput>\r
+{\r
+@public\r
+    UIViewComponentPeer* owner;\r
+    id<UITextInputDelegate> delegate;\r
+}\r
+\r
+- (instancetype) initWithOwner: (UIViewComponentPeer*) owner;\r
+\r
+@end\r
+\r
+@interface JuceUIView : UIView\r
 {\r
 @public\r
     UIViewComponentPeer* owner;\r
-    UITextView* hiddenTextView;\r
     std::unique_ptr<CADisplayLink, CADisplayLinkDeleter> displayLink;\r
 }\r
 \r
@@ -159,8 +298,6 @@ struct CADisplayLinkDeleter
 - (BOOL) resignFirstResponder;\r
 - (BOOL) canBecomeFirstResponder;\r
 \r
-- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text;\r
-\r
 - (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection;\r
 \r
 - (BOOL) isAccessibilityElement;\r
@@ -212,6 +349,7 @@ struct UIViewPeerControllerReceiver
     virtual void setViewController (UIViewController*) = 0;\r
 };\r
 \r
+//==============================================================================\r
 class UIViewComponentPeer  : public ComponentPeer,\r
                              private UIViewPeerControllerReceiver\r
 {\r
@@ -264,9 +402,9 @@ public:
     void grabFocus() override;\r
     void textInputRequired (Point<int>, TextInputTarget&) override;\r
     void dismissPendingTextInput() override;\r
+    void closeInputMethodContext() override;\r
 \r
     BOOL textViewReplaceCharacters (Range<int>, const String&);\r
-    void updateHiddenTextContent (TextInputTarget&);\r
 \r
     void updateScreenBounds();\r
 \r
@@ -286,7 +424,10 @@ public:
     JuceUIView* view = nil;\r
     UIViewController* controller = nil;\r
     const bool isSharedWindow, isAppex;\r
+    String stringBeingComposed;\r
     bool fullScreen = false, insideDrawRect = false;\r
+    NSUniquePtr<JuceTextView> hiddenTextInput { [[JuceTextView alloc] initWithOwner: this] };\r
+    NSUniquePtr<JuceTextInputTokenizer> tokenizer { [[JuceTextInputTokenizer alloc] initWithPeer: this] };\r
 \r
     static int64 getMouseTime (NSTimeInterval timestamp) noexcept\r
     {\r
@@ -306,6 +447,22 @@ public:
 \r
     static MultiTouchMapper<UITouch*> currentTouches;\r
 \r
+    static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept\r
+    {\r
+        switch (type)\r
+        {\r
+            case TextInputTarget::textKeyboard:          return UIKeyboardTypeDefault;\r
+            case TextInputTarget::numericKeyboard:       return UIKeyboardTypeNumbersAndPunctuation;\r
+            case TextInputTarget::decimalKeyboard:       return UIKeyboardTypeNumbersAndPunctuation;\r
+            case TextInputTarget::urlKeyboard:           return UIKeyboardTypeURL;\r
+            case TextInputTarget::emailAddressKeyboard:  return UIKeyboardTypeEmailAddress;\r
+            case TextInputTarget::phoneNumberKeyboard:   return UIKeyboardTypePhonePad;\r
+            default:                                     jassertfalse; break;\r
+        }\r
+\r
+        return UIKeyboardTypeDefault;\r
+    }\r
+\r
 private:\r
     void appStyleChanged() override\r
     {\r
@@ -418,12 +575,10 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
     return [[[NSBundle mainBundle] objectForInfoDictionaryKey: @"UIStatusBarHidden"] boolValue];\r
 }\r
 \r
-#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
  - (BOOL) prefersHomeIndicatorAutoHidden\r
  {\r
      return isKioskModeView (self);\r
  }\r
-#endif\r
 \r
 - (UIStatusBarStyle) preferredStatusBarStyle\r
 {\r
@@ -491,14 +646,7 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
     [displayLink.get() addToRunLoop: [NSRunLoop mainRunLoop]\r
                             forMode: NSDefaultRunLoopMode];\r
 \r
-    hiddenTextView = [[UITextView alloc] initWithFrame: CGRectZero];\r
-    [self addSubview: hiddenTextView];\r
-    hiddenTextView.delegate = self;\r
-\r
-    hiddenTextView.autocapitalizationType = UITextAutocapitalizationTypeNone;\r
-    hiddenTextView.autocorrectionType = UITextAutocorrectionTypeNo;\r
-    hiddenTextView.inputAssistantItem.leadingBarButtonGroups = @[];\r
-    hiddenTextView.inputAssistantItem.trailingBarButtonGroups = @[];\r
+    [self addSubview: owner->hiddenTextInput.get()];\r
 \r
    #if JUCE_HAS_IOS_POINTER_SUPPORT\r
     if (@available (iOS 13.4, *))\r
@@ -522,9 +670,7 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 \r
 - (void) dealloc\r
 {\r
-    [hiddenTextView removeFromSuperview];\r
-    [hiddenTextView release];\r
-\r
+    [owner->hiddenTextInput.get() removeFromSuperview];\r
     displayLink = nullptr;\r
 \r
     [super dealloc];\r
@@ -623,18 +769,10 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
     return owner != nullptr && owner->canBecomeKeyWindow();\r
 }\r
 \r
-- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text\r
-{\r
-    ignoreUnused (textView);\r
-    return owner->textViewReplaceCharacters (Range<int> ((int) range.location, (int) (range.location + range.length)),\r
-                                             nsStringToJuce (text));\r
-}\r
-\r
 - (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection\r
 {\r
     [super traitCollectionDidChange: previousTraitCollection];\r
 \r
-   #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
     if (@available (iOS 12.0, *))\r
     {\r
         const auto wasDarkModeActive = ([previousTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark);\r
@@ -643,7 +781,6 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
             [[NSNotificationCenter defaultCenter] postNotificationName: UIViewComponentPeer::getDarkModeNotificationName()\r
                                                                 object: nil];\r
     }\r
-   #endif\r
 }\r
 \r
 - (BOOL) isAccessibilityElement\r
@@ -689,6 +826,542 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 \r
 @end\r
 \r
+/** see https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/LowerLevelText-HandlingTechnologies/LowerLevelText-HandlingTechnologies.html */\r
+@implementation JuceTextView\r
+\r
+- (TextInputTarget*) getTextInputTarget\r
+{\r
+    if (owner != nullptr)\r
+        return owner->findCurrentTextInputTarget();\r
+\r
+    return nullptr;\r
+}\r
+\r
+- (instancetype) initWithOwner: (UIViewComponentPeer*) ownerIn\r
+{\r
+    [super init];\r
+    owner = ownerIn;\r
+    delegate = nil;\r
+\r
+    // The frame must have a finite size, otherwise some accessibility events will be ignored\r
+    self.frame = CGRectMake (0.0, 0.0, 1.0, 1.0);\r
+    return self;\r
+}\r
+\r
+- (BOOL) canPerformAction: (SEL) action withSender: (id) sender\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (action == @selector (paste:))\r
+        {\r
+            if (@available (iOS 10, *))\r
+                return [[UIPasteboard generalPasteboard] hasStrings];\r
+\r
+            return [[UIPasteboard generalPasteboard] string] != nil;\r
+        }\r
+    }\r
+\r
+    return [super canPerformAction: action withSender: sender];\r
+}\r
+\r
+- (void) cut: (id) sender\r
+{\r
+    [self copy: sender];\r
+\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (delegate != nil)\r
+            [delegate textWillChange: self];\r
+\r
+        target->insertTextAtCaret ("");\r
+\r
+        if (delegate != nil)\r
+            [delegate textDidChange: self];\r
+    }\r
+}\r
+\r
+- (void) copy: (id) sender\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        [[UIPasteboard generalPasteboard] setString: juceStringToNS (target->getTextInRange (target->getHighlightedRegion()))];\r
+}\r
+\r
+- (void) paste: (id) sender\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (auto* string = [[UIPasteboard generalPasteboard] string])\r
+        {\r
+            if (delegate != nil)\r
+                [delegate textWillChange: self];\r
+\r
+            target->insertTextAtCaret (nsStringToJuce (string));\r
+\r
+            if (delegate != nil)\r
+                [delegate textDidChange: self];\r
+        }\r
+    }\r
+}\r
+\r
+- (void) selectAll: (id) sender\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        target->setHighlightedRegion ({ 0, target->getTotalNumChars() });\r
+}\r
+\r
+- (void) deleteBackward\r
+{\r
+    auto* target = [self getTextInputTarget];\r
+\r
+    if (target == nullptr)\r
+        return;\r
+\r
+    const auto range = target->getHighlightedRegion();\r
+    const auto rangeToDelete = range.isEmpty() ? range.withStartAndLength (jmax (range.getStart() - 1, 0),\r
+                                                                           range.getStart() != 0 ? 1 : 0)\r
+                                               : range;\r
+\r
+    target->setHighlightedRegion (rangeToDelete);\r
+    target->insertTextAtCaret ("");\r
+}\r
+\r
+- (void) insertText: (NSString*) text\r
+{\r
+    if (owner == nullptr)\r
+        return;\r
+\r
+    owner->stringBeingComposed.clear();\r
+\r
+    if (auto* target = owner->findCurrentTextInputTarget())\r
+        target->insertTextAtCaret (nsStringToJuce (text));\r
+}\r
+\r
+- (BOOL) hasText\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        return target->getTextInRange ({ 0, 1 }).isNotEmpty();\r
+\r
+    return NO;\r
+}\r
+\r
+- (BOOL) accessibilityElementsHidden\r
+{\r
+    return NO;\r
+}\r
+\r
+- (UITextRange*) selectedTextRangeForTarget: (TextInputTarget*) target\r
+{\r
+    if (target != nullptr)\r
+        return [JuceUITextRange withRange: target->getHighlightedRegion()];\r
+\r
+    return nil;\r
+}\r
+\r
+- (UITextRange*) selectedTextRange\r
+{\r
+    return [self selectedTextRangeForTarget: [self getTextInputTarget]];\r
+}\r
+\r
+- (void) setSelectedTextRange: (JuceUITextRange*) range\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        target->setHighlightedRegion (range != nil ? [range range] : Range<int>());\r
+}\r
+\r
+- (UITextRange*) markedTextRange\r
+{\r
+    if (owner != nullptr && owner->stringBeingComposed.isNotEmpty())\r
+        if (auto* target = owner->findCurrentTextInputTarget())\r
+            return [JuceUITextRange withRange: target->getHighlightedRegion()];\r
+\r
+    return nil;\r
+}\r
+\r
+- (void) setMarkedText: (NSString*) markedText\r
+         selectedRange: (NSRange) selectedRange\r
+{\r
+    ignoreUnused (selectedRange);\r
+\r
+    if (owner == nullptr)\r
+        return;\r
+\r
+    owner->stringBeingComposed = nsStringToJuce (markedText);\r
+\r
+    auto* target = owner->findCurrentTextInputTarget();\r
+\r
+    if (target == nullptr)\r
+        return;\r
+\r
+    const auto currentHighlight = target->getHighlightedRegion();\r
+    target->insertTextAtCaret (owner->stringBeingComposed);\r
+    target->setHighlightedRegion (currentHighlight.withLength (0));\r
+    target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
+}\r
+\r
+- (void) unmarkText\r
+{\r
+    if (owner == nullptr)\r
+        return;\r
+\r
+    auto* target = owner->findCurrentTextInputTarget();\r
+\r
+    if (target == nullptr)\r
+        return;\r
+\r
+    target->insertTextAtCaret (owner->stringBeingComposed);\r
+    owner->stringBeingComposed.clear();\r
+}\r
+\r
+- (NSDictionary<NSAttributedStringKey, id>*) markedTextStyle\r
+{\r
+    return nil;\r
+}\r
+\r
+- (void) setMarkedTextStyle: (NSDictionary<NSAttributedStringKey, id>*) dict\r
+{\r
+}\r
+\r
+- (UITextPosition*) beginningOfDocument\r
+{\r
+    return [JuceUITextPosition withIndex: 0];\r
+}\r
+\r
+- (UITextPosition*) endOfDocument\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        return [JuceUITextPosition withIndex: target->getTotalNumChars()];\r
+\r
+    return [JuceUITextPosition withIndex: 0];\r
+}\r
+\r
+- (id<UITextInputTokenizer>) tokenizer\r
+{\r
+    return owner->tokenizer.get();\r
+}\r
+\r
+- (NSWritingDirection) baseWritingDirectionForPosition: (UITextPosition*) position\r
+                                           inDirection: (UITextStorageDirection) direction\r
+{\r
+    return NSWritingDirectionNatural;\r
+}\r
+\r
+- (CGRect) caretRectForPosition: (JuceUITextPosition*) position\r
+{\r
+    if (position == nil)\r
+        return CGRectZero;\r
+\r
+    // Currently we ignore the requested position and just return the text editor's caret position\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (auto* comp = dynamic_cast<Component*> (target))\r
+        {\r
+            const auto areaOnDesktop = comp->localAreaToGlobal (target->getCaretRectangle());\r
+            return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+        }\r
+    }\r
+\r
+    return CGRectZero;\r
+}\r
+\r
+- (UITextRange*) characterRangeByExtendingPosition: (JuceUITextPosition*) position\r
+                                       inDirection: (UITextLayoutDirection) direction\r
+{\r
+    const auto newPosition = [self indexFromPosition: position inDirection: direction offset: 1];\r
+    return [JuceUITextRange from: position->index to: newPosition];\r
+}\r
+\r
+- (int) closestIndexToPoint: (CGPoint) point\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (auto* comp = dynamic_cast<Component*> (target))\r
+        {\r
+            const auto pointOnDesktop = ScalingHelpers::unscaledScreenPosToScaled (convertToPointFloat (point));\r
+            return target->getCharIndexForPoint (comp->getLocalPoint (nullptr, pointOnDesktop).roundToInt());\r
+        }\r
+    }\r
+\r
+    return -1;\r
+}\r
+\r
+- (UITextRange*) characterRangeAtPoint: (CGPoint) point\r
+{\r
+    const auto index = [self closestIndexToPoint: point];\r
+    const auto result = index != -1 ? [JuceUITextRange from: index to: index] : nil;\r
+    jassert (result != nullptr);\r
+    return result;\r
+}\r
+\r
+- (UITextPosition*) closestPositionToPoint: (CGPoint) point\r
+{\r
+    const auto index = [self closestIndexToPoint: point];\r
+    const auto result = index != -1 ? [JuceUITextPosition withIndex: index] : nil;\r
+    jassert (result != nullptr);\r
+    return result;\r
+}\r
+\r
+- (UITextPosition*) closestPositionToPoint: (CGPoint) point\r
+                               withinRange: (JuceUITextRange*) range\r
+{\r
+    const auto index = [self closestIndexToPoint: point];\r
+    const auto result = index != -1 ? [JuceUITextPosition withIndex: [range range].clipValue (index)] : nil;\r
+    jassert (result != nullptr);\r
+    return result;\r
+}\r
+\r
+- (NSComparisonResult) comparePosition: (JuceUITextPosition*) position\r
+                            toPosition: (JuceUITextPosition*) other\r
+{\r
+    const auto a = position != nil ? makeOptional (position->index) : nullopt;\r
+    const auto b = other    != nil ? makeOptional (other   ->index) : nullopt;\r
+\r
+    if (a < b)\r
+        return NSOrderedAscending;\r
+\r
+    if (b < a)\r
+        return NSOrderedDescending;\r
+\r
+    return NSOrderedSame;\r
+}\r
+\r
+- (NSInteger) offsetFromPosition: (JuceUITextPosition*) from\r
+                      toPosition: (JuceUITextPosition*) toPosition\r
+{\r
+    if (from != nil && toPosition != nil)\r
+        return toPosition->index - from->index;\r
+\r
+    return 0;\r
+}\r
+\r
+- (int) indexFromPosition: (JuceUITextPosition*) position\r
+              inDirection: (UITextLayoutDirection) direction\r
+                   offset: (NSInteger) offset\r
+{\r
+    switch (direction)\r
+    {\r
+        case UITextLayoutDirectionLeft:\r
+        case UITextLayoutDirectionRight:\r
+            return position->index + (int) (offset * (direction == UITextLayoutDirectionLeft ? -1 : 1));\r
+\r
+        case UITextLayoutDirectionUp:\r
+        case UITextLayoutDirectionDown:\r
+        {\r
+            if (auto* target = [self getTextInputTarget])\r
+            {\r
+                const auto originalRectangle = target->getCaretRectangleForCharIndex (position->index);\r
+\r
+                auto testIndex = position->index;\r
+\r
+                for (auto lineOffset = 0; lineOffset < offset; ++lineOffset)\r
+                {\r
+                    const auto caretRect = target->getCaretRectangleForCharIndex (testIndex);\r
+                    const auto newY = direction == UITextLayoutDirectionUp ? caretRect.getY() - 1\r
+                                                                           : caretRect.getBottom() + 1;\r
+                    testIndex = target->getCharIndexForPoint ({ originalRectangle.getX(), newY });\r
+                }\r
+\r
+                return testIndex;\r
+            }\r
+        }\r
+    }\r
+\r
+    return position->index;\r
+}\r
+\r
+- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position\r
+                             inDirection: (UITextLayoutDirection) direction\r
+                                  offset: (NSInteger) offset\r
+{\r
+    return [JuceUITextPosition withIndex: [self indexFromPosition: position inDirection: direction offset: offset]];\r
+}\r
+\r
+- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position\r
+                                  offset: (NSInteger) offset\r
+{\r
+    if (position != nil)\r
+    {\r
+        if (auto* target = [self getTextInputTarget])\r
+        {\r
+            const auto newIndex = position->index + (int) offset;\r
+\r
+            if (isPositiveAndBelow (newIndex, target->getTotalNumChars() + 1))\r
+                return [JuceUITextPosition withIndex: newIndex];\r
+        }\r
+    }\r
+\r
+   return nil;\r
+}\r
+\r
+- (CGRect) firstRectForRange: (JuceUITextRange*) range\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (auto* comp = dynamic_cast<Component*> (target))\r
+        {\r
+            const auto list = target->getTextBounds ([range range]);\r
+\r
+            if (! list.isEmpty())\r
+            {\r
+                const auto areaOnDesktop = comp->localAreaToGlobal (list.getRectangle (0));\r
+                return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+            }\r
+        }\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
+- (NSArray<UITextSelectionRect*>*) selectionRectsForRange: (JuceUITextRange*) range\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+    {\r
+        if (auto* comp = dynamic_cast<Component*> (target))\r
+        {\r
+            const auto list = target->getTextBounds ([range range]);\r
+\r
+            auto* result = [NSMutableArray arrayWithCapacity: (NSUInteger) list.getNumRectangles()];\r
+\r
+            for (const auto& rect : list)\r
+            {\r
+                const auto areaOnDesktop = comp->localAreaToGlobal (rect);\r
+                const auto nativeArea = convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+\r
+                [result addObject: [JuceUITextSelectionRect withRect: nativeArea]];\r
+            }\r
+\r
+            return result;\r
+        }\r
+    }\r
+\r
+    return nil;\r
+}\r
+\r
+- (UITextPosition*) positionWithinRange: (JuceUITextRange*) range\r
+                    farthestInDirection: (UITextLayoutDirection) direction\r
+{\r
+    return direction == UITextLayoutDirectionUp || direction == UITextLayoutDirectionLeft\r
+         ? [range start]\r
+         : [range end];\r
+}\r
+\r
+- (void) replaceRange: (JuceUITextRange*) range\r
+             withText: (NSString*) text\r
+{\r
+    if (owner == nullptr)\r
+        return;\r
+\r
+    owner->stringBeingComposed.clear();\r
+\r
+    if (auto* target = owner->findCurrentTextInputTarget())\r
+    {\r
+        target->setHighlightedRegion ([range range]);\r
+        target->insertTextAtCaret (nsStringToJuce (text));\r
+    }\r
+}\r
+\r
+- (void) setBaseWritingDirection: (NSWritingDirection) writingDirection\r
+                        forRange: (UITextRange*) range\r
+{\r
+}\r
+\r
+- (NSString*) textInRange: (JuceUITextRange*) range\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        return juceStringToNS (target->getTextInRange ([range range]));\r
+\r
+    return nil;\r
+}\r
+\r
+- (UITextRange*) textRangeFromPosition: (JuceUITextPosition*) fromPosition\r
+                            toPosition: (JuceUITextPosition*) toPosition\r
+{\r
+    const auto from = fromPosition != nil ? fromPosition->index : 0;\r
+    const auto to   = toPosition   != nil ? toPosition  ->index : 0;\r
+\r
+    return [JuceUITextRange withRange: Range<int>::between (from, to)];\r
+}\r
+\r
+- (void) setInputDelegate: (id<UITextInputDelegate>) delegateIn\r
+{\r
+    delegate = delegateIn;\r
+}\r
+\r
+- (id<UITextInputDelegate>) inputDelegate\r
+{\r
+    return delegate;\r
+}\r
+\r
+- (UIKeyboardType) keyboardType\r
+{\r
+    if (auto* target = [self getTextInputTarget])\r
+        return UIViewComponentPeer::getUIKeyboardType (target->getKeyboardType());\r
+\r
+    return UIKeyboardTypeDefault;\r
+}\r
+\r
+- (UITextAutocapitalizationType) autocapitalizationType\r
+{\r
+    return UITextAutocapitalizationTypeNone;\r
+}\r
+\r
+- (UITextAutocorrectionType) autocorrectionType\r
+{\r
+    return UITextAutocorrectionTypeNo;\r
+}\r
+\r
+- (BOOL) canBecomeFirstResponder\r
+{\r
+    return YES;\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@implementation JuceTextInputTokenizer\r
+\r
+- (instancetype) initWithPeer: (UIViewComponentPeer*) peerIn\r
+{\r
+    [super initWithTextInput: peerIn->hiddenTextInput.get()];\r
+    peer = peerIn;\r
+    return self;\r
+}\r
+\r
+- (UITextRange*) rangeEnclosingPosition: (JuceUITextPosition*) position\r
+                        withGranularity: (UITextGranularity) granularity\r
+                            inDirection: (UITextDirection) direction\r
+{\r
+    if (granularity != UITextGranularityLine)\r
+        return [super rangeEnclosingPosition: position withGranularity: granularity inDirection: direction];\r
+\r
+    auto* target = peer->findCurrentTextInputTarget();\r
+\r
+    if (target == nullptr)\r
+        return nullptr;\r
+\r
+    const auto numChars = target->getTotalNumChars();\r
+\r
+    if (! isPositiveAndBelow (position->index, numChars))\r
+        return nullptr;\r
+\r
+    const auto allText = target->getTextInRange ({ 0, numChars });\r
+\r
+    const auto begin = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.begin());\r
+    const auto end   = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.end());\r
+    const auto positionIter = begin + position->index;\r
+\r
+    const auto nextNewlineIter = std::find (positionIter, end, '\n');\r
+    const auto lastNewlineIter = std::find (std::make_reverse_iterator (positionIter),\r
+                                            std::make_reverse_iterator (begin),\r
+                                            '\n').base();\r
+\r
+    const auto from = std::distance (begin, lastNewlineIter);\r
+    const auto to   = std::distance (begin, nextNewlineIter);\r
+\r
+    return [JuceUITextRange from: from to: to];\r
+}\r
+\r
+@end\r
+\r
 //==============================================================================\r
 //==============================================================================\r
 namespace juce\r
@@ -718,7 +1391,7 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags,
 \r
    #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
     if (@available (iOS 13, *))\r
-        metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<UIView>> (view, comp);\r
+        metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<UIView>> (view, comp.isOpaque());\r
    #endif\r
 \r
     if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
@@ -975,6 +1648,9 @@ static float getTouchForce (UITouch* touch) noexcept
 \r
 void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEventFlags)\r
 {\r
+    if (event == nullptr)\r
+        return;\r
+\r
     NSArray* touches = [[event touchesForView: view] allObjects];\r
 \r
     for (unsigned int i = 0; i < [touches count]; ++i)\r
@@ -1126,41 +1802,27 @@ void UIViewComponentPeer::grabFocus()
     }\r
 }\r
 \r
-void UIViewComponentPeer::textInputRequired (Point<int> pos, TextInputTarget& target)\r
-{\r
-    view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0);\r
-\r
-    updateHiddenTextContent (target);\r
-    [view->hiddenTextView becomeFirstResponder];\r
-}\r
-\r
-void UIViewComponentPeer::dismissPendingTextInput()\r
+void UIViewComponentPeer::textInputRequired (Point<int>, TextInputTarget&)\r
 {\r
-    closeInputMethodContext();\r
-    [view->hiddenTextView resignFirstResponder];\r
+    [hiddenTextInput.get() becomeFirstResponder];\r
 }\r
 \r
-static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept\r
+void UIViewComponentPeer::closeInputMethodContext()\r
 {\r
-    switch (type)\r
+    if (auto* input = hiddenTextInput.get())\r
     {\r
-        case TextInputTarget::textKeyboard:          return UIKeyboardTypeAlphabet;\r
-        case TextInputTarget::numericKeyboard:       return UIKeyboardTypeNumbersAndPunctuation;\r
-        case TextInputTarget::decimalKeyboard:       return UIKeyboardTypeNumbersAndPunctuation;\r
-        case TextInputTarget::urlKeyboard:           return UIKeyboardTypeURL;\r
-        case TextInputTarget::emailAddressKeyboard:  return UIKeyboardTypeEmailAddress;\r
-        case TextInputTarget::phoneNumberKeyboard:   return UIKeyboardTypePhonePad;\r
-        default:                                     jassertfalse; break;\r
+        if (auto* delegate = [input inputDelegate])\r
+        {\r
+            [delegate selectionWillChange: input];\r
+            [delegate selectionDidChange:  input];\r
+        }\r
     }\r
-\r
-    return UIKeyboardTypeDefault;\r
 }\r
 \r
-void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget& target)\r
+void UIViewComponentPeer::dismissPendingTextInput()\r
 {\r
-    view->hiddenTextView.keyboardType = getUIKeyboardType (target.getKeyboardType());\r
-    view->hiddenTextView.text = juceStringToNS (target.getTextInRange (Range<int> (0, target.getHighlightedRegion().getStart())));\r
-    view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target.getHighlightedRegion().getStart(), 0);\r
+    closeInputMethodContext();\r
+    [hiddenTextInput.get() resignFirstResponder];\r
 }\r
 \r
 BOOL UIViewComponentPeer::textViewReplaceCharacters (Range<int> range, const String& text)\r
@@ -1179,9 +1841,6 @@ BOOL UIViewComponentPeer::textViewReplaceCharacters (Range<int> range, const Str
             handleKeyPress (KeyPress::returnKey, text[0]);\r
         else\r
             target->insertTextAtCaret (text);\r
-\r
-        if (deletionChecker != nullptr)\r
-            updateHiddenTextContent (*target);\r
     }\r
 \r
     return NO;\r
@@ -1198,8 +1857,6 @@ void UIViewComponentPeer::displayLinkCallback()
         if (metalRenderer != nullptr)\r
             return metalRenderer->drawRectangleList (view,\r
                                                      (float) view.contentScaleFactor,\r
-                                                     view.frame,\r
-                                                     component,\r
                                                      [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); },\r
                                                      deferredRepaints);\r
 \r
index 434b39e6f94818a5559a6550b850855ebd0d5246..4b254a466b21a73c1f53031749f69131a8103df0 100644 (file)
@@ -37,7 +37,7 @@ namespace juce
     Array<AppInactivityCallback*> appBecomingInactiveCallbacks;\r
 }\r
 \r
-#if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+#if JUCE_PUSH_NOTIFICATIONS\r
 @interface JuceAppStartupDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>\r
 #else\r
 @interface JuceAppStartupDelegate : NSObject <UIApplicationDelegate>\r
@@ -59,27 +59,47 @@ namespace juce
    completionHandler: (void (^)(void)) completionHandler;\r
 - (void) applicationDidReceiveMemoryWarning: (UIApplication *) application;\r
 #if JUCE_PUSH_NOTIFICATIONS\r
-- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings;\r
-- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken;\r
-- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error;\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo;\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
-  fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo\r
-   completionHandler: (void(^)()) completionHandler;\r
-- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo\r
-   completionHandler: (void(^)()) completionHandler;\r
-#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification\r
+\r
+- (void)                                 application: (UIApplication*) application\r
+    didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken;\r
+- (void)                                 application: (UIApplication*) application\r
+    didFailToRegisterForRemoteNotificationsWithError: (NSError*) error;\r
+- (void)                                 application: (UIApplication*) application\r
+                        didReceiveRemoteNotification: (NSDictionary*) userInfo;\r
+- (void)                                 application: (UIApplication*) application\r
+                        didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+                              fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler;\r
+- (void)                                 application: (UIApplication*) application\r
+                          handleActionWithIdentifier: (NSString*) identifier\r
+                               forRemoteNotification: (NSDictionary*) userInfo\r
+                                    withResponseInfo: (NSDictionary*) responseInfo\r
+                                   completionHandler: (void(^)()) completionHandler;\r
+\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+- (void)                    application: (UIApplication*) application\r
+    didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings;\r
+- (void)                    application: (UIApplication*) application\r
+            didReceiveLocalNotification: (UILocalNotification*) notification;\r
+- (void)                    application: (UIApplication*) application\r
+             handleActionWithIdentifier: (NSString*) identifier\r
+                   forLocalNotification: (UILocalNotification*) notification\r
+                      completionHandler: (void(^)()) completionHandler;\r
+- (void)                    application: (UIApplication*) application\r
+             handleActionWithIdentifier: (NSString*) identifier\r
+                   forLocalNotification: (UILocalNotification*) notification\r
+                       withResponseInfo: (NSDictionary*) responseInfo\r
+                      completionHandler: (void(^)()) completionHandler;\r
+\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+        willPresentNotification: (UNNotification*) notification\r
           withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler;\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ didReceiveNotificationResponse: (UNNotificationResponse*) response\r
           withCompletionHandler: (void(^)())completionHandler;\r
-#endif\r
+\r
 #endif\r
 \r
 @end\r
@@ -93,7 +113,7 @@ namespace juce
     self = [super init];\r
     appSuspendTask = UIBackgroundTaskInvalid;\r
 \r
-   #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+   #if JUCE_PUSH_NOTIFICATIONS\r
     [UNUserNotificationCenter currentNotificationCenter].delegate = self;\r
    #endif\r
 \r
@@ -194,25 +214,9 @@ namespace juce
 }\r
 \r
 #if JUCE_PUSH_NOTIFICATIONS\r
-- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings\r
-{\r
-    ignoreUnused (application);\r
 \r
-    SEL selector = @selector (application:didRegisterUserNotificationSettings:);\r
-\r
-    if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
-    {\r
-        NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
-        [invocation setSelector: selector];\r
-        [invocation setTarget: _pushNotificationsDelegate];\r
-        [invocation setArgument: &application          atIndex:2];\r
-        [invocation setArgument: &notificationSettings atIndex:3];\r
-\r
-        [invocation invoke];\r
-    }\r
-}\r
-\r
-- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken\r
+- (void)                                 application: (UIApplication*) application\r
+    didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -230,7 +234,8 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error\r
+- (void)                                 application: (UIApplication*) application\r
+    didFailToRegisterForRemoteNotificationsWithError: (NSError*) error\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -248,7 +253,8 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+- (void)             application: (UIApplication*) application\r
+    didReceiveRemoteNotification: (NSDictionary*) userInfo\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -266,8 +272,9 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
-  fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler\r
+- (void)             application: (UIApplication*) application\r
+    didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+          fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -286,9 +293,11 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo\r
-  completionHandler: (void(^)()) completionHandler\r
+- (void)           application: (UIApplication*) application\r
+    handleActionWithIdentifier: (NSString*) identifier\r
+         forRemoteNotification: (NSDictionary*) userInfo\r
+              withResponseInfo: (NSDictionary*) responseInfo\r
+             completionHandler: (void(^)()) completionHandler\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -309,7 +318,29 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+- (void)                    application: (UIApplication*) application\r
+    didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings\r
+{\r
+    ignoreUnused (application);\r
+\r
+    SEL selector = @selector (application:didRegisterUserNotificationSettings:);\r
+\r
+    if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector:selector])\r
+    {\r
+        NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
+        [invocation setSelector: selector];\r
+        [invocation setTarget: _pushNotificationsDelegate];\r
+        [invocation setArgument: &application atIndex: 2];\r
+        [invocation setArgument: &notificationSettings atIndex: 3];\r
+\r
+        [invocation invoke];\r
+    }\r
+}\r
+\r
+- (void)            application: (UIApplication*) application\r
+    didReceiveLocalNotification: (UILocalNotification*) notification\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -320,15 +351,17 @@ namespace juce
         NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
         [invocation setSelector: selector];\r
         [invocation setTarget: _pushNotificationsDelegate];\r
-        [invocation setArgument: &application  atIndex:2];\r
-        [invocation setArgument: &notification atIndex:3];\r
+        [invocation setArgument: &application  atIndex: 2];\r
+        [invocation setArgument: &notification atIndex: 3];\r
 \r
         [invocation invoke];\r
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler\r
+- (void)           application: (UIApplication*) application\r
+    handleActionWithIdentifier: (NSString*) identifier\r
+          forLocalNotification: (UILocalNotification*) notification\r
+             completionHandler: (void(^)()) completionHandler\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -348,9 +381,11 @@ namespace juce
     }\r
 }\r
 \r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
-  forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo\r
-  completionHandler: (void(^)()) completionHandler\r
+- (void)           application: (UIApplication*) application\r
+    handleActionWithIdentifier: (NSString*) identifier\r
+          forLocalNotification: (UILocalNotification*) notification\r
+              withResponseInfo: (NSDictionary*) responseInfo\r
+             completionHandler: (void(^)()) completionHandler\r
 {\r
     ignoreUnused (application);\r
 \r
@@ -371,9 +406,11 @@ namespace juce
     }\r
 }\r
 \r
-#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification\r
-         withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+        willPresentNotification: (UNNotification*) notification\r
+          withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler\r
 {\r
     ignoreUnused (center);\r
 \r
@@ -392,8 +429,9 @@ namespace juce
     }\r
 }\r
 \r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response\r
-         withCompletionHandler: (void(^)()) completionHandler\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ didReceiveNotificationResponse: (UNNotificationResponse*) response\r
+          withCompletionHandler: (void(^)()) completionHandler\r
 {\r
     ignoreUnused (center);\r
 \r
@@ -412,7 +450,6 @@ namespace juce
     }\r
 }\r
 #endif\r
-#endif\r
 \r
 @end\r
 \r
@@ -695,42 +732,24 @@ bool Desktop::canUseSemiTransparentWindows() noexcept
 \r
 bool Desktop::isDarkModeActive() const\r
 {\r
-   #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
     if (@available (iOS 12.0, *))\r
         return [[[UIScreen mainScreen] traitCollection] userInterfaceStyle] == UIUserInterfaceStyleDark;\r
-   #endif\r
 \r
     return false;\r
 }\r
 \r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+static const auto darkModeSelector = @selector (darkModeChanged:);\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
 class Desktop::NativeDarkModeChangeDetectorImpl\r
 {\r
 public:\r
     NativeDarkModeChangeDetectorImpl()\r
     {\r
         static DelegateClass delegateClass;\r
-\r
-        delegate = [delegateClass.createInstance() init];\r
-        object_setInstanceVariable (delegate, "owner", this);\r
-\r
-        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-        [[NSNotificationCenter defaultCenter] addObserver: delegate\r
-                                                 selector: @selector (darkModeChanged:)\r
-                                                     name: UIViewComponentPeer::getDarkModeNotificationName()\r
-                                                   object: nil];\r
-        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-    }\r
-\r
-    ~NativeDarkModeChangeDetectorImpl()\r
-    {\r
-        object_setInstanceVariable (delegate, "owner", nullptr);\r
-        [[NSNotificationCenter defaultCenter] removeObserver: delegate];\r
-        [delegate release];\r
-    }\r
-\r
-    void darkModeChanged()\r
-    {\r
-        Desktop::getInstance().darkModeChanged();\r
+        delegate.reset ([delegateClass.createInstance() init]);\r
+        observer.emplace (delegate.get(), darkModeSelector, UIViewComponentPeer::getDarkModeNotificationName(), nil);\r
     }\r
 \r
 private:\r
@@ -738,23 +757,13 @@ private:
     {\r
         DelegateClass()  : ObjCClass<NSObject> ("JUCEDelegate_")\r
         {\r
-            addIvar<NativeDarkModeChangeDetectorImpl*> ("owner");\r
-\r
-            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-            addMethod (@selector (darkModeChanged:), darkModeChanged);\r
-            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
+            addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); });\r
             registerClass();\r
         }\r
-\r
-        static void darkModeChanged (id self, SEL, NSNotification*)\r
-        {\r
-            if (auto* owner = getIvar<NativeDarkModeChangeDetectorImpl*> (self, "owner"))\r
-                owner->darkModeChanged();\r
-        }\r
     };\r
 \r
-    id delegate = nil;\r
+    NSUniquePtr<NSObject> delegate;\r
+    Optional<ScopedNotificationCenterObserver> observer;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)\r
 };\r
@@ -764,6 +773,7 @@ std::unique_ptr<Desktop::NativeDarkModeChangeDetectorImpl> Desktop::createNative
     return std::make_unique<NativeDarkModeChangeDetectorImpl>();\r
 }\r
 \r
+//==============================================================================\r
 Point<float> MouseInputSource::getCurrentRawMousePosition()\r
 {\r
     return juce_lastMousePos;\r
@@ -786,6 +796,24 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
     return Orientations::convertToJuce (orientation);\r
 }\r
 \r
+template <typename Value>\r
+static BorderSize<Value> operator/ (BorderSize<Value> border, Value scale)\r
+{\r
+    return { border.getTop()    / scale,\r
+             border.getLeft()   / scale,\r
+             border.getBottom() / scale,\r
+             border.getRight()  / scale };\r
+}\r
+\r
+template <typename Value>\r
+static BorderSize<int> roundToInt (BorderSize<Value> border)\r
+{\r
+    return { roundToInt (border.getTop()),\r
+             roundToInt (border.getLeft()),\r
+             roundToInt (border.getBottom()),\r
+             roundToInt (border.getRight()) };\r
+}\r
+\r
 // The most straightforward way of retrieving the screen area available to an iOS app\r
 // seems to be to create a new window (which will take up all available space) and to\r
 // query its frame.\r
@@ -802,17 +830,14 @@ static Rectangle<int> getRecommendedWindowBounds()
 \r
 static BorderSize<int> getSafeAreaInsets (float masterScale)\r
 {\r
-   #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
     if (@available (iOS 11.0, *))\r
     {\r
         UIEdgeInsets safeInsets = TemporaryWindow().window.safeAreaInsets;\r
-\r
-        auto getInset = [&] (CGFloat original) { return roundToInt (original / masterScale); };\r
-\r
-        return { getInset (safeInsets.top),    getInset (safeInsets.left),\r
-                 getInset (safeInsets.bottom), getInset (safeInsets.right) };\r
+        return roundToInt (BorderSize<double> { safeInsets.top,\r
+                                                safeInsets.left,\r
+                                                safeInsets.bottom,\r
+                                                safeInsets.right } / (double) masterScale);\r
     }\r
-   #endif\r
 \r
     JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
     auto statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;\r
@@ -823,16 +848,102 @@ static BorderSize<int> getSafeAreaInsets (float masterScale)
     return { roundToInt (statusBarHeight / masterScale), 0, 0, 0 };\r
 }\r
 \r
+//==============================================================================\r
 void Displays::findDisplays (float masterScale)\r
 {\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+    static const auto keyboardShownSelector = @selector (keyboardShown:);\r
+    static const auto keyboardHiddenSelector = @selector (keyboardHidden:);\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+    class OnScreenKeyboardChangeDetectorImpl\r
+    {\r
+    public:\r
+        OnScreenKeyboardChangeDetectorImpl()\r
+        {\r
+            static DelegateClass delegateClass;\r
+            delegate.reset ([delegateClass.createInstance() init]);\r
+            object_setInstanceVariable (delegate.get(), "owner", this);\r
+            observers.emplace_back (delegate.get(), keyboardShownSelector,  UIKeyboardDidShowNotification, nil);\r
+            observers.emplace_back (delegate.get(), keyboardHiddenSelector, UIKeyboardDidHideNotification, nil);\r
+        }\r
+\r
+        auto getInsets() const { return insets; }\r
+\r
+    private:\r
+        struct DelegateClass : public ObjCClass<NSObject>\r
+        {\r
+            DelegateClass() : ObjCClass<NSObject> ("JUCEOnScreenKeyboardObserver_")\r
+            {\r
+                addIvar<OnScreenKeyboardChangeDetectorImpl*> ("owner");\r
+\r
+                addMethod (keyboardShownSelector, [] (id self, SEL, NSNotification* notification)\r
+                {\r
+                    setKeyboardScreenBounds (self, [&]() -> BorderSize<double>\r
+                    {\r
+                        auto* info = [notification userInfo];\r
+\r
+                        if (info == nullptr)\r
+                            return {};\r
+\r
+                        auto* value = static_cast<NSValue*> ([info objectForKey: UIKeyboardFrameEndUserInfoKey]);\r
+\r
+                        if (value == nullptr)\r
+                            return {};\r
+\r
+                        auto* display = getPrimaryDisplayImpl (Desktop::getInstance().getDisplays());\r
+\r
+                        if (display == nullptr)\r
+                            return {};\r
+\r
+                        const auto rect = convertToRectInt ([value CGRectValue]);\r
+\r
+                        BorderSize<double> result;\r
+\r
+                        if (rect.getY() == display->totalArea.getY())\r
+                            result.setTop (rect.getHeight());\r
+\r
+                        if (rect.getBottom() == display->totalArea.getBottom())\r
+                            result.setBottom (rect.getHeight());\r
+\r
+                        return result;\r
+                    }());\r
+                });\r
+\r
+                addMethod (keyboardHiddenSelector, [] (id self, SEL, NSNotification*)\r
+                {\r
+                    setKeyboardScreenBounds (self, {});\r
+                });\r
+\r
+                registerClass();\r
+            }\r
+\r
+        private:\r
+            static void setKeyboardScreenBounds (id self, BorderSize<double> insets)\r
+            {\r
+                if (std::exchange (getIvar<OnScreenKeyboardChangeDetectorImpl*> (self, "owner")->insets, insets) != insets)\r
+                    Desktop::getInstance().displays->refresh();\r
+            }\r
+        };\r
+\r
+        BorderSize<double> insets;\r
+        NSUniquePtr<NSObject> delegate;\r
+        std::vector<ScopedNotificationCenterObserver> observers;\r
+\r
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OnScreenKeyboardChangeDetectorImpl)\r
+    };\r
+\r
     JUCE_AUTORELEASEPOOL\r
     {\r
+        static OnScreenKeyboardChangeDetectorImpl keyboardChangeDetector;\r
+\r
         UIScreen* s = [UIScreen mainScreen];\r
 \r
         Display d;\r
         d.totalArea = convertToRectInt ([s bounds]) / masterScale;\r
         d.userArea = getRecommendedWindowBounds() / masterScale;\r
         d.safeAreaInsets = getSafeAreaInsets (masterScale);\r
+        d.keyboardInsets = roundToInt (keyboardChangeDetector.getInsets() / (double) masterScale);\r
         d.isMain = true;\r
         d.scale = masterScale * s.scale;\r
         d.dpi = 160 * d.scale;\r
index f09f29311721399977042160f60d1eb049abc06c..791379c771c2009be7733070924875fa13219429 100644 (file)
@@ -35,12 +35,12 @@ class CoreGraphicsMetalLayerRenderer
 {\r
 public:\r
     //==============================================================================\r
-    CoreGraphicsMetalLayerRenderer (ViewType* view, const Component& comp)\r
+    CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque)\r
     {\r
         device.reset (MTLCreateSystemDefaultDevice());\r
         commandQueue.reset ([device.get() newCommandQueue]);\r
 \r
-        attach (view, comp);\r
+        attach (view, isOpaque);\r
     }\r
 \r
     ~CoreGraphicsMetalLayerRenderer()\r
@@ -52,7 +52,7 @@ public:
         }\r
     }\r
 \r
-    void attach (ViewType* view, const Component& comp)\r
+    void attach (ViewType* view, bool isOpaque)\r
     {\r
        #if JUCE_MAC\r
         view.wantsLayer = YES;\r
@@ -65,7 +65,7 @@ public:
         layer.device = device.get();\r
         layer.framebufferOnly = NO;\r
         layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB;\r
-        layer.opaque = comp.isOpaque();\r
+        layer.opaque = isOpaque;\r
         layer.allowsNextDrawableTimeout = NO;\r
 \r
         attachedView = view;\r
@@ -90,8 +90,6 @@ public:
     template <typename Callback>\r
     bool drawRectangleList (ViewType* view,\r
                             float scaleFactor,\r
-                            CGRect viewFrame,\r
-                            const Component& comp,\r
                             Callback&& drawRectWithContext,\r
                             const RectangleList<float>& dirtyRegions)\r
     {\r
@@ -117,14 +115,12 @@ public:
         layer.contentsScale = scaleFactor;\r
         const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale,\r
                                                                       layer.contentsScale);\r
-        const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform);\r
-\r
-        const auto componentHeight = comp.getHeight();\r
+        const auto transformedFrameSize = CGSizeApplyAffineTransform (view.frame.size, drawableSizeTansform);\r
 \r
         if (resources == nullptr || ! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize))\r
         {\r
             layer.drawableSize = transformedFrameSize;\r
-            resources = std::make_unique<Resources> (device.get(), layer, componentHeight);\r
+            resources = std::make_unique<Resources> (device.get(), layer);\r
         }\r
 \r
         auto gpuTexture = resources->getGpuTexture();\r
@@ -261,7 +257,7 @@ private:
     class Resources\r
     {\r
     public:\r
-        Resources (id<MTLDevice> metalDevice, CAMetalLayer* layer, int componentHeight)\r
+        Resources (id<MTLDevice> metalDevice, CAMetalLayer* layer)\r
         {\r
             const auto bytesPerRow = alignTo ((size_t) layer.drawableSize.width * 4, 256);\r
 \r
@@ -301,8 +297,8 @@ private:
                                                     CGColorSpaceCreateWithName (kCGColorSpaceSRGB),\r
                                                     (uint32_t) kCGImageAlphaPremultipliedFirst | (uint32_t) kCGBitmapByteOrder32Host));\r
 \r
-            CGContextScaleCTM (cgContext.get(), layer.contentsScale, layer.contentsScale);\r
-            CGContextConcatCTM (cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight));\r
+            CGContextTranslateCTM (cgContext.get(), 0, layer.drawableSize.height);\r
+            CGContextScaleCTM (cgContext.get(), layer.contentsScale, -layer.contentsScale);\r
 \r
             textureDesc.storageMode = MTLStorageModePrivate;\r
             gpuTexturePool = std::make_unique<GpuTexturePool> (metalDevice, textureDesc);\r
index 38f89b7825157470be3c83046bc847d5f7ae9e56..c77a92a9be47747b0cc1c28a3c21b0ea587198fc 100644 (file)
@@ -293,11 +293,7 @@ public:
 \r
             [item setTag: topLevelIndex];\r
             [item setEnabled: i.isEnabled];\r
-           #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
             [item setState: i.isTicked ? NSControlStateValueOn : NSControlStateValueOff];\r
-           #else\r
-            [item setState: i.isTicked ? NSOnState : NSOffState];\r
-           #endif\r
             [item setTarget: (id) callback];\r
 \r
             auto* juceItem = new PopupMenu::Item (i);\r
@@ -459,10 +455,7 @@ private:
             {\r
                 addMethod (menuItemInvokedSelector,       menuItemInvoked);\r
                 addMethod (@selector (validateMenuItem:), validateMenuItem);\r
-\r
-               #if defined (MAC_OS_X_VERSION_10_14)\r
                 addProtocol (@protocol (NSMenuItemValidation));\r
-               #endif\r
 \r
                 registerClass();\r
             }\r
@@ -556,10 +549,7 @@ private:
             addMethod (@selector (validateMenuItem:), validateMenuItem);\r
 \r
             addProtocol (@protocol (NSMenuDelegate));\r
-\r
-           #if defined (MAC_OS_X_VERSION_10_14)\r
             addProtocol (@protocol (NSMenuItemValidation));\r
-           #endif\r
 \r
             registerClass();\r
         }\r
index 5d15acf60030c6b61f62ab15c2c08349fe269848..2047f6f91b37e18e02cac12a7edb5f611f52eb50 100644 (file)
@@ -144,19 +144,14 @@ public:
 \r
         resetTrackingArea (view);\r
 \r
-        notificationCenter = [NSNotificationCenter defaultCenter];\r
-\r
-        [notificationCenter  addObserver: view\r
-                                selector: frameChangedSelector\r
-                                    name: NSViewFrameDidChangeNotification\r
-                                  object: view];\r
+        scopedObservers.emplace_back (view, frameChangedSelector, NSViewFrameDidChangeNotification, view);\r
 \r
         [view setPostsFrameChangedNotifications: YES];\r
 \r
       #if USE_COREGRAPHICS_RENDERING\r
        #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
         if (@available (macOS 10.14, *))\r
-            metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<NSView>> (view, getComponent());\r
+            metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<NSView>> (view, getComponent().isOpaque());\r
        #endif\r
         if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
         {\r
@@ -220,30 +215,13 @@ public:
 \r
             [window setRestorable: NO];\r
 \r
-           #if defined (MAC_OS_X_VERSION_10_12) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12)\r
             if (@available (macOS 10.12, *))\r
                 [window setTabbingMode: NSWindowTabbingModeDisallowed];\r
-           #endif\r
 \r
-            [notificationCenter  addObserver: view\r
-                                    selector: frameChangedSelector\r
-                                        name: NSWindowDidMoveNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: frameChangedSelector\r
-                                        name: NSWindowDidMiniaturizeNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (windowWillMiniaturize:)\r
-                                        name: NSWindowWillMiniaturizeNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (windowDidDeminiaturize:)\r
-                                        name: NSWindowDidDeminiaturizeNotification\r
-                                      object: window];\r
+            scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMoveNotification, window);\r
+            scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMiniaturizeNotification, window);\r
+            scopedObservers.emplace_back (view, @selector (windowWillMiniaturize:), NSWindowWillMiniaturizeNotification, window);\r
+            scopedObservers.emplace_back (view, @selector (windowDidMiniaturize:), NSWindowDidMiniaturizeNotification, window);\r
         }\r
 \r
         auto alpha = component.getAlpha();\r
@@ -267,7 +245,8 @@ public:
         CVDisplayLinkStop (displayLink);\r
         dispatch_source_cancel (displaySource);\r
 \r
-        [notificationCenter removeObserver: view];\r
+        scopedObservers.clear();\r
+\r
         setOwner (view, nullptr);\r
 \r
         if ([view superview] != nil)\r
@@ -797,24 +776,7 @@ public:
 \r
     void redirectWillMoveToWindow (NSWindow* newWindow)\r
     {\r
-        if (auto* currentWindow = [view window])\r
-        {\r
-            [notificationCenter removeObserver: view\r
-                                          name: NSWindowDidMoveNotification\r
-                                        object: currentWindow];\r
-\r
-            [notificationCenter removeObserver: view\r
-                                          name: NSWindowWillMiniaturizeNotification\r
-                                        object: currentWindow];\r
-\r
-            [notificationCenter removeObserver: view\r
-                                          name: NSWindowDidBecomeKeyNotification\r
-                                        object: currentWindow];\r
-\r
-            [notificationCenter removeObserver: view\r
-                                          name: NSWindowDidChangeScreenNotification\r
-                                        object: currentWindow];\r
-        }\r
+        windowObservers.clear();\r
 \r
         if (isSharedWindow && [view window] == window && newWindow == nullptr)\r
         {\r
@@ -1085,7 +1047,11 @@ public:
 \r
         if (metalRenderer != nullptr)\r
         {\r
-            const auto compBounds = getComponent().getLocalBounds().toFloat();\r
+            auto setDeferredRepaintsToWholeFrame = [this]\r
+            {\r
+                const auto frameSize = view.frame.size;\r
+                deferredRepaints = Rectangle<float> { (float) frameSize.width, (float) frameSize.height };\r
+            };\r
 \r
             // If we are resizing we need to fall back to synchronous drawing to avoid artefacts\r
             if ([window inLiveResize] || numFramesToSkipMetalRenderer > 0)\r
@@ -1093,7 +1059,7 @@ public:
                 if (metalRenderer->isAttachedToView (view))\r
                 {\r
                     metalRenderer->detach();\r
-                    deferredRepaints = compBounds;\r
+                    setDeferredRepaintsToWholeFrame();\r
                 }\r
 \r
                 if (numFramesToSkipMetalRenderer > 0)\r
@@ -1103,8 +1069,8 @@ public:
             {\r
                 if (! metalRenderer->isAttachedToView (view))\r
                 {\r
-                    metalRenderer->attach (view, getComponent());\r
-                    deferredRepaints = compBounds;\r
+                    metalRenderer->attach (view, getComponent().isOpaque());\r
+                    setDeferredRepaintsToWholeFrame();\r
                 }\r
             }\r
         }\r
@@ -1114,8 +1080,6 @@ public:
            if (metalRenderer != nullptr && metalRenderer->isAttachedToView (view))\r
                return metalRenderer->drawRectangleList (view,\r
                                                         (float) [[view window] backingScaleFactor],\r
-                                                        view.frame,\r
-                                                        getComponent(),\r
                                                         [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); },\r
                                                         deferredRepaints);\r
 \r
@@ -1256,30 +1220,11 @@ public:
 \r
         if (auto* currentWindow = [view window])\r
         {\r
-            [notificationCenter addObserver: view\r
-                                   selector: dismissModalsSelector\r
-                                       name: NSWindowWillMoveNotification\r
-                                     object: currentWindow];\r
-\r
-            [notificationCenter addObserver: view\r
-                                   selector: dismissModalsSelector\r
-                                       name: NSWindowWillMiniaturizeNotification\r
-                                     object: currentWindow];\r
-\r
-            [notificationCenter addObserver: view\r
-                                   selector: becomeKeySelector\r
-                                       name: NSWindowDidBecomeKeyNotification\r
-                                     object: currentWindow];\r
-\r
-            [notificationCenter addObserver: view\r
-                                   selector: resignKeySelector\r
-                                       name: NSWindowDidResignKeyNotification\r
-                                     object: currentWindow];\r
-\r
-            [notificationCenter addObserver: view\r
-                                   selector: @selector (windowDidChangeScreen:)\r
-                                       name: NSWindowDidChangeScreenNotification\r
-                                     object: currentWindow];\r
+            windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMoveNotification, currentWindow);\r
+            windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMiniaturizeNotification, currentWindow);\r
+            windowObservers.emplace_back (view, becomeKeySelector, NSWindowDidBecomeKeyNotification, currentWindow);\r
+            windowObservers.emplace_back (view, resignKeySelector, NSWindowDidResignKeyNotification, currentWindow);\r
+            windowObservers.emplace_back (view, @selector (windowDidChangeScreen:), NSWindowDidChangeScreenNotification, currentWindow);\r
 \r
             updateCVDisplayLinkScreen();\r
         }\r
@@ -1493,10 +1438,8 @@ public:
     {\r
         const auto type = []\r
         {\r
-           #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
             if (@available (macOS 10.13, *))\r
                 return NSPasteboardTypeFileURL;\r
-           #endif\r
 \r
             JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
             return (NSString*) kUTTypeFileURL;\r
@@ -1628,11 +1571,10 @@ public:
 \r
     void resetWindowPresentation()\r
     {\r
+        [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))];\r
+\r
         if (hasNativeTitleBar())\r
-        {\r
-            [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))];\r
             setTitle (getComponent().getName()); // required to force the OS to update the title\r
-        }\r
 \r
         [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
         setCollectionBehaviour (isFullScreen());\r
@@ -1659,7 +1601,6 @@ public:
     bool windowRepresentsFile = false;\r
     bool isAlwaysOnTop = false, wasAlwaysOnTop = false;\r
     String stringBeingComposed;\r
-    NSNotificationCenter* notificationCenter = nil;\r
 \r
     Rectangle<float> lastSizeBeforeZoom;\r
     RectangleList<float> deferredRepaints;\r
@@ -1788,15 +1729,11 @@ private:
            #if JUCE_64BIT\r
             case NSEventTypeSmartMagnify:\r
             case NSEventTypePressure:\r
-           #endif\r
-          #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
-           #if JUCE_64BIT\r
             case NSEventTypeDirectTouch:\r
            #endif\r
            #if defined (MAC_OS_X_VERSION_10_15) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_15\r
             case NSEventTypeChangeMode:\r
            #endif\r
-          #endif\r
             default:\r
                 return false;\r
         }\r
@@ -1892,6 +1829,9 @@ private:
     int numFramesToSkipMetalRenderer = 0;\r
     std::unique_ptr<CoreGraphicsMetalLayerRenderer<NSView>> metalRenderer;\r
 \r
+    std::vector<ScopedNotificationCenterObserver> scopedObservers;\r
+    std::vector<ScopedNotificationCenterObserver> windowObservers;\r
+\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NSViewComponentPeer)\r
 };\r
 \r
@@ -1935,454 +1875,341 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
 {\r
     JuceNSViewClass()  : NSViewComponentPeerWrapper ("JUCEView_")\r
     {\r
-        addMethod (@selector (isOpaque),                      isOpaque);\r
-        addMethod (@selector (drawRect:),                     drawRect);\r
-        addMethod (@selector (updateTrackingAreas),           updateTrackingAreas);\r
-        addMethod (@selector (mouseDown:),                    mouseDown);\r
-        addMethod (@selector (mouseUp:),                      mouseUp);\r
-        addMethod (@selector (mouseDragged:),                 mouseDragged);\r
-        addMethod (@selector (mouseMoved:),                   mouseMoved);\r
-        addMethod (@selector (mouseEntered:),                 mouseEntered);\r
-        addMethod (@selector (mouseExited:),                  mouseExited);\r
-        addMethod (@selector (rightMouseDown:),               mouseDown);\r
-        addMethod (@selector (rightMouseDragged:),            mouseDragged);\r
-        addMethod (@selector (rightMouseUp:),                 mouseUp);\r
-        addMethod (@selector (otherMouseDown:),               mouseDown);\r
-        addMethod (@selector (otherMouseDragged:),            mouseDragged);\r
-        addMethod (@selector (otherMouseUp:),                 mouseUp);\r
-        addMethod (@selector (scrollWheel:),                  scrollWheel);\r
-        addMethod (@selector (magnifyWithEvent:),             magnify);\r
-        addMethod (@selector (acceptsFirstMouse:),            acceptsFirstMouse);\r
-        addMethod (@selector (windowWillMiniaturize:),        windowWillMiniaturize);\r
-        addMethod (@selector (windowDidDeminiaturize:),       windowDidDeminiaturize);\r
-        addMethod (@selector (windowDidChangeScreen:),        windowDidChangeScreen);\r
-        addMethod (@selector (wantsDefaultClipping),          wantsDefaultClipping);\r
-        addMethod (@selector (worksWhenModal),                worksWhenModal);\r
-        addMethod (@selector (viewDidMoveToWindow),           viewDidMoveToWindow);\r
-        addMethod (@selector (viewWillDraw),                  viewWillDraw);\r
-        addMethod (@selector (keyDown:),                      keyDown);\r
-        addMethod (@selector (keyUp:),                        keyUp);\r
-        addMethod (@selector (insertText:),                   insertText);\r
-        addMethod (@selector (doCommandBySelector:),          doCommandBySelector);\r
-        addMethod (@selector (setMarkedText:selectedRange:),  setMarkedText);\r
-        addMethod (@selector (unmarkText),                    unmarkText);\r
-        addMethod (@selector (hasMarkedText),                 hasMarkedText);\r
-        addMethod (@selector (conversationIdentifier),        conversationIdentifier);\r
-        addMethod (@selector (attributedSubstringFromRange:), attributedSubstringFromRange);\r
-        addMethod (@selector (markedRange),                   markedRange);\r
-        addMethod (@selector (selectedRange),                 selectedRange);\r
-        addMethod (@selector (firstRectForCharacterRange:),   firstRectForCharacterRange);\r
-        addMethod (@selector (characterIndexForPoint:),       characterIndexForPoint);\r
-        addMethod (@selector (validAttributesForMarkedText),  validAttributesForMarkedText);\r
-        addMethod (@selector (flagsChanged:),                 flagsChanged);\r
-\r
-        addMethod (@selector (becomeFirstResponder),          becomeFirstResponder);\r
-        addMethod (@selector (resignFirstResponder),          resignFirstResponder);\r
-        addMethod (@selector (acceptsFirstResponder),         acceptsFirstResponder);\r
-\r
-        addMethod (@selector (draggingEntered:),              draggingEntered);\r
-        addMethod (@selector (draggingUpdated:),              draggingUpdated);\r
-        addMethod (@selector (draggingEnded:),                draggingEnded);\r
-        addMethod (@selector (draggingExited:),               draggingExited);\r
-        addMethod (@selector (prepareForDragOperation:),      prepareForDragOperation);\r
-        addMethod (@selector (performDragOperation:),         performDragOperation);\r
-        addMethod (@selector (concludeDragOperation:),        concludeDragOperation);\r
-\r
-        addMethod (@selector (paste:),                        paste);\r
-        addMethod (@selector (copy:),                         copy);\r
-        addMethod (@selector (cut:),                          cut);\r
-        addMethod (@selector (selectAll:),                    selectAll);\r
-\r
-        addMethod (@selector (viewWillMoveToWindow:),         willMoveToWindow);\r
-\r
-        addMethod (@selector (isAccessibilityElement),        getIsAccessibilityElement);\r
-        addMethod (@selector (accessibilityChildren),         getAccessibilityChildren);\r
-        addMethod (@selector (accessibilityHitTest:),         accessibilityHitTest);\r
-        addMethod (@selector (accessibilityFocusedUIElement), getAccessibilityFocusedUIElement);\r
+        addMethod (@selector (isOpaque), [] (id self, SEL)\r
+        {\r
+            auto* owner = getOwner (self);\r
+            return owner == nullptr || owner->getComponent().isOpaque();\r
+        });\r
 \r
-        // deprecated methods required for backwards compatibility\r
-        addMethod (@selector (accessibilityIsIgnored),        getAccessibilityIsIgnored);\r
-        addMethod (@selector (accessibilityAttributeValue:),  getAccessibilityAttributeValue);\r
+        addMethod (@selector (updateTrackingAreas), [] (id self, SEL)\r
+        {\r
+            sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
 \r
-        addMethod (@selector (isFlipped),                     isFlipped);\r
+            resetTrackingArea (static_cast<NSView*> (self));\r
+        });\r
 \r
-        addMethod (NSViewComponentPeer::dismissModalsSelector,  dismissModals);\r
-        addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown);\r
-        addMethod (NSViewComponentPeer::asyncMouseUpSelector,   asyncMouseUp);\r
-        addMethod (NSViewComponentPeer::frameChangedSelector,   frameChanged);\r
-        addMethod (NSViewComponentPeer::becomeKeySelector,      becomeKey);\r
-        addMethod (NSViewComponentPeer::resignKeySelector,      resignKey);\r
+        addMethod (@selector (becomeFirstResponder), [] (id self, SEL)\r
+        {\r
+            callOnOwner (self, &NSViewComponentPeer::viewFocusGain);\r
+            return YES;\r
+        });\r
 \r
-        addMethod (@selector (performKeyEquivalent:),           performKeyEquivalent);\r
+        addMethod (@selector (resignFirstResponder), [] (id self, SEL)\r
+        {\r
+            callOnOwner (self, &NSViewComponentPeer::viewFocusLoss);\r
+            return YES;\r
+        });\r
 \r
-        addProtocol (@protocol (NSTextInput));\r
+        addMethod (NSViewComponentPeer::dismissModalsSelector,  [] (id self, SEL)                    { callOnOwner (self, &NSViewComponentPeer::dismissModals); });\r
+        addMethod (NSViewComponentPeer::frameChangedSelector,   [] (id self, SEL, NSNotification*)   { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); });\r
+        addMethod (NSViewComponentPeer::becomeKeySelector,      [] (id self, SEL)                    { callOnOwner (self, &NSViewComponentPeer::becomeKey); });\r
+        addMethod (NSViewComponentPeer::resignKeySelector,      [] (id self, SEL)                    { callOnOwner (self, &NSViewComponentPeer::resignKey); });\r
 \r
-        registerClass();\r
-    }\r
+        addMethod (@selector (paste:),                          [] (id self, SEL, NSObject* s)       { callOnOwner (self, &NSViewComponentPeer::redirectPaste,            s);  });\r
+        addMethod (@selector (copy:),                           [] (id self, SEL, NSObject* s)       { callOnOwner (self, &NSViewComponentPeer::redirectCopy,             s);  });\r
+        addMethod (@selector (cut:),                            [] (id self, SEL, NSObject* s)       { callOnOwner (self, &NSViewComponentPeer::redirectCut,              s);  });\r
+        addMethod (@selector (selectAll:),                      [] (id self, SEL, NSObject* s)       { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll,        s);  });\r
 \r
-private:\r
-    static void updateTrackingAreas (id self, SEL)\r
-    {\r
-        sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
+        addMethod (@selector (viewWillMoveToWindow:),           [] (id self, SEL, NSWindow* w)       { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w); });\r
 \r
-        resetTrackingArea (static_cast<NSView*> (self));\r
-    }\r
+        addMethod (@selector (drawRect:),                       [] (id self, SEL, NSRect r)          { callOnOwner (self, &NSViewComponentPeer::drawRect, r); });\r
+        addMethod (@selector (viewDidMoveToWindow),             [] (id self, SEL)                    { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); });\r
+        addMethod (@selector (flagsChanged:),                   [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev); });\r
+        addMethod (@selector (mouseMoved:),                     [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove,    ev); });\r
+        addMethod (@selector (mouseEntered:),                   [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter,   ev); });\r
+        addMethod (@selector (mouseExited:),                    [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit,    ev); });\r
+        addMethod (@selector (scrollWheel:),                    [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel,   ev); });\r
+        addMethod (@selector (magnifyWithEvent:),               [] (id self, SEL, NSEvent* ev)       { callOnOwner (self, &NSViewComponentPeer::redirectMagnify,      ev); });\r
 \r
-    static void mouseDown (id self, SEL s, NSEvent* ev)\r
-    {\r
-        if (JUCEApplicationBase::isStandaloneApp())\r
-        {\r
-            asyncMouseDown (self, s, ev);\r
-        }\r
-        else\r
-        {\r
-            // In some host situations, the host will stop modal loops from working\r
-            // correctly if they're called from a mouse event, so we'll trigger\r
-            // the event asynchronously..\r
-            [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector\r
-                                   withObject: ev\r
-                                waitUntilDone: NO];\r
-        }\r
-    }\r
+        addMethod (@selector (mouseDragged:),                   mouseDragged);\r
+        addMethod (@selector (rightMouseDragged:),              mouseDragged);\r
+        addMethod (@selector (otherMouseDragged:),              mouseDragged);\r
 \r
-    static void mouseUp (id self, SEL s, NSEvent* ev)\r
-    {\r
-        if (JUCEApplicationBase::isStandaloneApp())\r
-        {\r
-            asyncMouseUp (self, s, ev);\r
-        }\r
-        else\r
-        {\r
-            // In some host situations, the host will stop modal loops from working\r
-            // correctly if they're called from a mouse event, so we'll trigger\r
-            // the event asynchronously..\r
-            [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector\r
-                                   withObject: ev\r
-                                waitUntilDone: NO];\r
-        }\r
-    }\r
+        addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown);\r
+        addMethod (NSViewComponentPeer::asyncMouseUpSelector,   asyncMouseUp);\r
 \r
-    static void asyncMouseDown   (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown,        ev); }\r
-    static void asyncMouseUp     (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp,          ev); }\r
-    static void mouseDragged     (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag,        ev); }\r
-    static void mouseMoved       (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove,        ev); }\r
-    static void mouseEntered     (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter,       ev); }\r
-    static void mouseExited      (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit,        ev); }\r
-    static void scrollWheel      (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel,       ev); }\r
-    static void magnify          (id self, SEL, NSEvent* ev)   { callOnOwner (self, &NSViewComponentPeer::redirectMagnify,          ev); }\r
-    static void copy             (id self, SEL, NSObject* s)   { callOnOwner (self, &NSViewComponentPeer::redirectCopy,             s);  }\r
-    static void paste            (id self, SEL, NSObject* s)   { callOnOwner (self, &NSViewComponentPeer::redirectPaste,            s);  }\r
-    static void cut              (id self, SEL, NSObject* s)   { callOnOwner (self, &NSViewComponentPeer::redirectCut,              s);  }\r
-    static void selectAll        (id self, SEL, NSObject* s)   { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll,        s);  }\r
-    static void willMoveToWindow (id self, SEL, NSWindow* w)   { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w);  }\r
-\r
-    static BOOL acceptsFirstMouse (id, SEL, NSEvent*)          { return YES; }\r
-    static BOOL wantsDefaultClipping (id, SEL)                 { return YES; } // (this is the default, but may want to customise it in future)\r
-    static BOOL worksWhenModal (id self, SEL)                  { if (auto* p = getOwner (self)) return p->worksWhenModal(); return NO; }\r
-\r
-    static void drawRect (id self, SEL, NSRect r)              { callOnOwner (self, &NSViewComponentPeer::drawRect, r); }\r
-    static void frameChanged (id self, SEL, NSNotification*)   { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); }\r
-    static void viewDidMoveToWindow (id self, SEL)             { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); }\r
-    static void dismissModals (id self, SEL)                   { callOnOwner (self, &NSViewComponentPeer::dismissModals); }\r
-    static void becomeKey (id self, SEL)                       { callOnOwner (self, &NSViewComponentPeer::becomeKey); }\r
-    static void resignKey (id self, SEL)                       { callOnOwner (self, &NSViewComponentPeer::resignKey); }\r
-\r
-    static BOOL isFlipped (id, SEL)                            { return true; }\r
-\r
-    static void viewWillDraw (id self, SEL)\r
-    {\r
-        // Without setting contentsFormat macOS Big Sur will always set the invalid area\r
-        // to be the entire frame.\r
-       #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
-        if (@available (macOS 10.12, *))\r
-        {\r
-            CALayer* layer = ((NSView*) self).layer;\r
-            layer.contentsFormat = kCAContentsFormatRGBA8Uint;\r
-        }\r
-       #endif\r
+        addMethod (@selector (mouseDown:),                      mouseDown);\r
+        addMethod (@selector (rightMouseDown:),                 mouseDown);\r
+        addMethod (@selector (otherMouseDown:),                 mouseDown);\r
 \r
-        sendSuperclassMessage<void> (self, @selector (viewWillDraw));\r
-    }\r
+        addMethod (@selector (mouseUp:),                        mouseUp);\r
+        addMethod (@selector (rightMouseUp:),                   mouseUp);\r
+        addMethod (@selector (otherMouseUp:),                   mouseUp);\r
 \r
-    static void windowWillMiniaturize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* p = getOwner (self))\r
+        addMethod (@selector (draggingEntered:),                draggingUpdated);\r
+        addMethod (@selector (draggingUpdated:),                draggingUpdated);\r
+\r
+        addMethod (@selector (draggingEnded:),                  draggingExited);\r
+        addMethod (@selector (draggingExited:),                 draggingExited);\r
+\r
+        addMethod (@selector (acceptsFirstMouse:), [] (id, SEL, NSEvent*) { return YES; });\r
+\r
+        addMethod (@selector (windowWillMiniaturize:), [] (id self, SEL, NSNotification*)\r
         {\r
-            if (p->isAlwaysOnTop)\r
+            if (auto* p = getOwner (self))\r
             {\r
-                // there is a bug when restoring minimised always on top windows so we need\r
-                // to remove this behaviour before minimising and restore it afterwards\r
-                p->setAlwaysOnTop (false);\r
-                p->wasAlwaysOnTop = true;\r
+                if (p->isAlwaysOnTop)\r
+                {\r
+                    // there is a bug when restoring minimised always on top windows so we need\r
+                    // to remove this behaviour before minimising and restore it afterwards\r
+                    p->setAlwaysOnTop (false);\r
+                    p->wasAlwaysOnTop = true;\r
+                }\r
             }\r
-        }\r
-    }\r
+        });\r
 \r
-    static void windowDidDeminiaturize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* p = getOwner (self))\r
+        addMethod (@selector (windowDidDeminiaturize:), [] (id self, SEL, NSNotification*)\r
         {\r
-            if (p->wasAlwaysOnTop)\r
-                p->setAlwaysOnTop (true);\r
+            if (auto* p = getOwner (self))\r
+            {\r
+                if (p->wasAlwaysOnTop)\r
+                    p->setAlwaysOnTop (true);\r
 \r
-            p->redirectMovedOrResized();\r
-        }\r
-    }\r
+                p->redirectMovedOrResized();\r
+            }\r
+        });\r
 \r
-    static void windowDidChangeScreen (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* p = getOwner (self))\r
-            p->windowDidChangeScreen();\r
-    }\r
+        addMethod (@selector (windowDidChangeScreen:), [] (id self, SEL, NSNotification*)\r
+        {\r
+            if (auto* p = getOwner (self))\r
+                p->windowDidChangeScreen();\r
+        });\r
 \r
-    static BOOL isOpaque (id self, SEL)\r
-    {\r
-        auto* owner = getOwner (self);\r
-        return owner == nullptr || owner->getComponent().isOpaque();\r
-    }\r
+        addMethod (@selector (wantsDefaultClipping), [] (id, SEL) { return YES; }); // (this is the default, but may want to customise it in future)\r
 \r
-    //==============================================================================\r
-    static void keyDown (id self, SEL, NSEvent* ev)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (worksWhenModal), [] (id self, SEL)\r
         {\r
-            auto* target = owner->findCurrentTextInputTarget();\r
-            owner->textWasInserted = false;\r
-\r
-            if (target != nullptr)\r
-                [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]];\r
-            else\r
-                owner->stringBeingComposed.clear();\r
+            if (auto* p = getOwner (self))\r
+                return p->worksWhenModal();\r
 \r
-            if (! (owner->textWasInserted || owner->redirectKeyDown (ev)))\r
-                sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
-        }\r
-    }\r
+            return false;\r
+        });\r
 \r
-    static void keyUp (id self, SEL, NSEvent* ev)\r
-    {\r
-        auto* owner = getOwner (self);\r
+        addMethod (@selector (viewWillDraw), [] (id self, SEL)\r
+        {\r
+            // Without setting contentsFormat macOS Big Sur will always set the invalid area\r
+            // to be the entire frame.\r
+            if (@available (macOS 10.12, *))\r
+            {\r
+                CALayer* layer = ((NSView*) self).layer;\r
+                layer.contentsFormat = kCAContentsFormatRGBA8Uint;\r
+            }\r
 \r
-        if (! owner->redirectKeyUp (ev))\r
-            sendSuperclassMessage<void> (self, @selector (keyUp:), ev);\r
-    }\r
+            sendSuperclassMessage<void> (self, @selector (viewWillDraw));\r
+        });\r
 \r
-    //==============================================================================\r
-    static void insertText (id self, SEL, id aString)\r
-    {\r
-        // This commits multi-byte text when return is pressed, or after every keypress for western keyboards\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (keyDown:), [] (id self, SEL, NSEvent* ev)\r
         {\r
-            NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString;\r
-\r
-            if ([newText length] > 0)\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                if (auto* target = owner->findCurrentTextInputTarget())\r
-                {\r
-                    target->insertTextAtCaret (nsStringToJuce (newText));\r
-                    owner->textWasInserted = true;\r
-                }\r
-            }\r
+                auto* target = owner->findCurrentTextInputTarget();\r
+                owner->textWasInserted = false;\r
 \r
-            owner->stringBeingComposed.clear();\r
-        }\r
-    }\r
+                if (target != nullptr)\r
+                    [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]];\r
+                else\r
+                    owner->stringBeingComposed.clear();\r
 \r
-    static void doCommandBySelector (id, SEL, SEL) {}\r
+                if (! (owner->textWasInserted || owner->redirectKeyDown (ev)))\r
+                    sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
+            }\r
+        });\r
 \r
-    static void setMarkedText (id self, SEL, id aString, NSRange)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (keyUp:), [] (id self, SEL, NSEvent* ev)\r
         {\r
-            owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]]\r
-                                                           ? [aString string] : aString);\r
+            auto* owner = getOwner (self);\r
+\r
+            if (! owner->redirectKeyUp (ev))\r
+                sendSuperclassMessage<void> (self, @selector (keyUp:), ev);\r
+        });\r
 \r
-            if (auto* target = owner->findCurrentTextInputTarget())\r
+        addMethod (@selector (insertText:), [] (id self, SEL, id aString)\r
+        {\r
+            // This commits multi-byte text when return is pressed, or after every keypress for western keyboards\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                auto currentHighlight = target->getHighlightedRegion();\r
-                target->insertTextAtCaret (owner->stringBeingComposed);\r
-                target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
-                owner->textWasInserted = true;\r
+                NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString;\r
+\r
+                if ([newText length] > 0)\r
+                {\r
+                    if (auto* target = owner->findCurrentTextInputTarget())\r
+                    {\r
+                        target->insertTextAtCaret (nsStringToJuce (newText));\r
+                        owner->textWasInserted = true;\r
+                    }\r
+                }\r
+\r
+                owner->stringBeingComposed.clear();\r
             }\r
-        }\r
-    }\r
+        });\r
 \r
-    static void unmarkText (id self, SEL)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (doCommandBySelector:), [] (id, SEL, SEL) {});\r
+\r
+        addMethod (@selector (setMarkedText:selectedRange:), [] (id self, SEL, id aString, NSRange)\r
         {\r
-            if (owner->stringBeingComposed.isNotEmpty())\r
+            if (auto* owner = getOwner (self))\r
             {\r
+                owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]]\r
+                                                             ? [aString string] : aString);\r
+\r
                 if (auto* target = owner->findCurrentTextInputTarget())\r
                 {\r
+                    auto currentHighlight = target->getHighlightedRegion();\r
                     target->insertTextAtCaret (owner->stringBeingComposed);\r
+                    target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
                     owner->textWasInserted = true;\r
                 }\r
+            }\r
+        });\r
 \r
-                owner->stringBeingComposed.clear();\r
+        addMethod (@selector (unmarkText), [] (id self, SEL)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+            {\r
+                if (owner->stringBeingComposed.isNotEmpty())\r
+                {\r
+                    if (auto* target = owner->findCurrentTextInputTarget())\r
+                    {\r
+                        target->insertTextAtCaret (owner->stringBeingComposed);\r
+                        owner->textWasInserted = true;\r
+                    }\r
+\r
+                    owner->stringBeingComposed.clear();\r
+                }\r
             }\r
-        }\r
-    }\r
+        });\r
 \r
-    static BOOL hasMarkedText (id self, SEL)\r
-    {\r
-        auto* owner = getOwner (self);\r
-        return owner != nullptr && owner->stringBeingComposed.isNotEmpty();\r
-    }\r
+        addMethod (@selector (hasMarkedText), [] (id self, SEL)\r
+        {\r
+            auto* owner = getOwner (self);\r
+            return owner != nullptr && owner->stringBeingComposed.isNotEmpty();\r
+        });\r
 \r
-    static long conversationIdentifier (id self, SEL)\r
-    {\r
-        return (long) (pointer_sized_int) self;\r
-    }\r
+        addMethod (@selector (conversationIdentifier), [] (id self, SEL)\r
+        {\r
+            return (long) (pointer_sized_int) self;\r
+        });\r
 \r
-    static NSAttributedString* attributedSubstringFromRange (id self, SEL, NSRange theRange)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (attributedSubstringFromRange:), [] (id self, SEL, NSRange theRange) -> NSAttributedString*\r
         {\r
-            if (auto* target = owner->findCurrentTextInputTarget())\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                Range<int> r ((int) theRange.location,\r
-                              (int) (theRange.location + theRange.length));\r
+                if (auto* target = owner->findCurrentTextInputTarget())\r
+                {\r
+                    Range<int> r ((int) theRange.location,\r
+                                  (int) (theRange.location + theRange.length));\r
 \r
-                return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease];\r
+                    return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease];\r
+                }\r
             }\r
-        }\r
 \r
-        return nil;\r
-    }\r
+            return nil;\r
+        });\r
 \r
-    static NSRange markedRange (id self, SEL)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            if (owner->stringBeingComposed.isNotEmpty())\r
-                return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length());\r
+        addMethod (@selector (markedRange), [] (id self, SEL)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                if (owner->stringBeingComposed.isNotEmpty())\r
+                    return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length());\r
 \r
-        return NSMakeRange (NSNotFound, 0);\r
-    }\r
+            return NSMakeRange (NSNotFound, 0);\r
+        });\r
 \r
-    static NSRange selectedRange (id self, SEL)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (selectedRange), [] (id self, SEL)\r
         {\r
-            if (auto* target = owner->findCurrentTextInputTarget())\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                auto highlight = target->getHighlightedRegion();\r
+                if (auto* target = owner->findCurrentTextInputTarget())\r
+                {\r
+                    auto highlight = target->getHighlightedRegion();\r
 \r
-                if (! highlight.isEmpty())\r
-                    return NSMakeRange ((NSUInteger) highlight.getStart(),\r
-                                        (NSUInteger) highlight.getLength());\r
+                    if (! highlight.isEmpty())\r
+                        return NSMakeRange ((NSUInteger) highlight.getStart(),\r
+                                            (NSUInteger) highlight.getLength());\r
+                }\r
             }\r
-        }\r
 \r
-        return NSMakeRange (NSNotFound, 0);\r
-    }\r
+            return NSMakeRange (NSNotFound, 0);\r
+        });\r
 \r
-    static NSRect firstRectForCharacterRange (id self, SEL, NSRange)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            if (auto* comp = dynamic_cast<Component*> (owner->findCurrentTextInputTarget()))\r
-                return flippedScreenRect (makeNSRect (comp->getScreenBounds()));\r
+        addMethod (@selector (firstRectForCharacterRange:), [] (id self, SEL, NSRange)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                if (auto* comp = dynamic_cast<Component*> (owner->findCurrentTextInputTarget()))\r
+                    return flippedScreenRect (makeNSRect (comp->getScreenBounds()));\r
 \r
-        return NSZeroRect;\r
-    }\r
+            return NSZeroRect;\r
+        });\r
 \r
-    static NSUInteger characterIndexForPoint (id, SEL, NSPoint)     { return NSNotFound; }\r
-    static NSArray* validAttributesForMarkedText (id, SEL)          { return [NSArray array]; }\r
+        addMethod (@selector (characterIndexForPoint:), [] (id, SEL, NSPoint) { return NSNotFound; });\r
 \r
-    //==============================================================================\r
-    static void flagsChanged (id self, SEL, NSEvent* ev)\r
-    {\r
-        callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev);\r
-    }\r
+        addMethod (@selector (validAttributesForMarkedText), [] (id, SEL) { return [NSArray array]; });\r
 \r
-    static BOOL becomeFirstResponder (id self, SEL)\r
-    {\r
-        callOnOwner (self, &NSViewComponentPeer::viewFocusGain);\r
-        return YES;\r
-    }\r
+        addMethod (@selector (acceptsFirstResponder), [] (id self, SEL)\r
+        {\r
+            auto* owner = getOwner (self);\r
+            return owner != nullptr && owner->canBecomeKeyWindow();\r
+        });\r
 \r
-    static BOOL resignFirstResponder (id self, SEL)\r
-    {\r
-        callOnOwner (self, &NSViewComponentPeer::viewFocusLoss);\r
-        return YES;\r
-    }\r
+        addMethod (@selector (prepareForDragOperation:), [] (id, SEL, id<NSDraggingInfo>) { return YES; });\r
 \r
-    static BOOL acceptsFirstResponder (id self, SEL)\r
-    {\r
-        auto* owner = getOwner (self);\r
-        return owner != nullptr && owner->canBecomeKeyWindow();\r
-    }\r
+        addMethod (@selector (performDragOperation:), [] (id self, SEL, id<NSDraggingInfo> sender)\r
+        {\r
+            auto* owner = getOwner (self);\r
+            return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);\r
+        });\r
 \r
-    //==============================================================================\r
-    static NSDragOperation draggingEntered (id self, SEL s, id<NSDraggingInfo> sender)\r
-    {\r
-        return draggingUpdated (self, s, sender);\r
-    }\r
+        addMethod (@selector (concludeDragOperation:), [] (id, SEL, id<NSDraggingInfo>) {});\r
 \r
-    static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))\r
-                return NSDragOperationGeneric;\r
+        addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return NO; });\r
 \r
-        return NSDragOperationNone;\r
-    }\r
+        addMethod (@selector (accessibilityChildren), getAccessibilityChildren);\r
 \r
-    static void draggingEnded (id self, SEL s, id<NSDraggingInfo> sender)\r
-    {\r
-        draggingExited (self, s, sender);\r
-    }\r
+        addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point)\r
+        {\r
+            return [getAccessibleChild (self) accessibilityHitTest: point];\r
+        });\r
 \r
-    static void draggingExited (id self, SEL, id<NSDraggingInfo> sender)\r
-    {\r
-        callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender);\r
-    }\r
+        addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL)\r
+        {\r
+            return [getAccessibleChild (self) accessibilityFocusedUIElement];\r
+        });\r
 \r
-    static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>)\r
-    {\r
-        return YES;\r
-    }\r
+        // deprecated methods required for backwards compatibility\r
+        addMethod (@selector (accessibilityIsIgnored), [] (id, SEL) { return YES; });\r
 \r
-    static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender)\r
-    {\r
-        auto* owner = getOwner (self);\r
-        return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);\r
-    }\r
+        addMethod (@selector (accessibilityAttributeValue:), [] (id self, SEL, NSString* attribute) -> id\r
+        {\r
+            if ([attribute isEqualToString: NSAccessibilityChildrenAttribute])\r
+                return getAccessibilityChildren (self, {});\r
 \r
-    static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {}\r
+            return sendSuperclassMessage<id> (self, @selector (accessibilityAttributeValue:), attribute);\r
+        });\r
 \r
-    //==============================================================================\r
-    static BOOL getIsAccessibilityElement (id, SEL)\r
-    {\r
-        return NO;\r
-    }\r
+        addMethod (@selector (isFlipped), [] (id, SEL) { return true; });\r
 \r
-    static NSArray* getAccessibilityChildren (id self, SEL)\r
-    {\r
-        return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self));\r
-    }\r
+        addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* event)\r
+        {\r
+            // We try passing shortcut keys to the currently focused component first.\r
+            // If the component doesn't want the event, we'll fall back to the superclass\r
+            // implementation, which will pass the event to the main menu.\r
+            if (tryPassingKeyEventToPeer (event))\r
+                return YES;\r
 \r
-    static id accessibilityHitTest (id self, SEL, NSPoint point)\r
-    {\r
-        return [getAccessibleChild (self) accessibilityHitTest: point];\r
-    }\r
+            return sendSuperclassMessage<BOOL> (self, s, event);\r
+        });\r
 \r
-    static id getAccessibilityFocusedUIElement (id self, SEL)\r
-    {\r
-        return [getAccessibleChild (self) accessibilityFocusedUIElement];\r
-    }\r
+        addProtocol (@protocol (NSTextInput));\r
 \r
-    static BOOL getAccessibilityIsIgnored (id, SEL)\r
-    {\r
-        return YES;\r
+        registerClass();\r
     }\r
 \r
-    static id getAccessibilityAttributeValue (id self, SEL, NSString* attribute)\r
+private:\r
+    static void updateTrackingAreas (id self, SEL)\r
     {\r
-        if ([attribute isEqualToString: NSAccessibilityChildrenAttribute])\r
-            return getAccessibilityChildren (self, {});\r
+        sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
 \r
-        return sendSuperclassMessage<id> (self, @selector (accessibilityAttributeValue:), attribute);\r
+        resetTrackingArea (static_cast<NSView*> (self));\r
     }\r
 \r
     static bool tryPassingKeyEventToPeer (NSEvent* e)\r
@@ -2402,308 +2229,311 @@ private:
         return false;\r
     }\r
 \r
-    static BOOL performKeyEquivalent (id self, SEL s, NSEvent* event)\r
-    {\r
-        // We try passing shortcut keys to the currently focused component first.\r
-        // If the component doesn't want the event, we'll fall back to the superclass\r
-        // implementation, which will pass the event to the main menu.\r
-        if (tryPassingKeyEventToPeer (event))\r
-            return YES;\r
-\r
-        return sendSuperclassMessage<BOOL> (self, s, event);\r
-    }\r
-\r
     template <typename Func, typename... Args>\r
     static void callOnOwner (id self, Func&& func, Args&&... args)\r
     {\r
         if (auto* owner = getOwner (self))\r
             (owner->*func) (std::forward<Args> (args)...);\r
     }\r
-};\r
 \r
-//==============================================================================\r
-struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindow>>\r
-{\r
-    JuceNSWindowClass()  : NSViewComponentPeerWrapper ("JUCEWindow_")\r
-    {\r
-        addMethod (@selector (canBecomeKeyWindow),                  canBecomeKeyWindow);\r
-        addMethod (@selector (canBecomeMainWindow),                 canBecomeMainWindow);\r
-        addMethod (@selector (becomeKeyWindow),                     becomeKeyWindow);\r
-        addMethod (@selector (resignKeyWindow),                     resignKeyWindow);\r
-        addMethod (@selector (windowShouldClose:),                  windowShouldClose);\r
-        addMethod (@selector (constrainFrameRect:toScreen:),        constrainFrameRect);\r
-        addMethod (@selector (windowWillResize:toSize:),            windowWillResize);\r
-        addMethod (@selector (windowDidExitFullScreen:),            windowDidExitFullScreen);\r
-        addMethod (@selector (windowWillEnterFullScreen:),          windowWillEnterFullScreen);\r
-        addMethod (@selector (windowWillExitFullScreen:),           windowWillExitFullScreen);\r
-        addMethod (@selector (windowWillStartLiveResize:),          windowWillStartLiveResize);\r
-        addMethod (@selector (windowDidEndLiveResize:),             windowDidEndLiveResize);\r
-        addMethod (@selector (window:shouldPopUpDocumentPathMenu:), shouldPopUpPathMenu);\r
-        addMethod (@selector (isFlipped),                           isFlipped);\r
-        addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), windowWillUseStandardFrame);\r
-        addMethod (@selector (windowShouldZoom:toFrame:),                windowShouldZoomToFrame);\r
-\r
-        addMethod (@selector (accessibilityTitle),                  getAccessibilityTitle);\r
-        addMethod (@selector (accessibilityLabel),                  getAccessibilityLabel);\r
-        addMethod (@selector (accessibilityTopLevelUIElement),      getAccessibilityWindow);\r
-        addMethod (@selector (accessibilityWindow),                 getAccessibilityWindow);\r
-        addMethod (@selector (accessibilityRole),                   getAccessibilityRole);\r
-        addMethod (@selector (accessibilitySubrole),                getAccessibilitySubrole);\r
-\r
-        addMethod (@selector (keyDown:),                            keyDown);\r
-\r
-        addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
-\r
-        addMethod (@selector (toggleFullScreen:),                                         toggleFullScreen);\r
-\r
-        addProtocol (@protocol (NSWindowDelegate));\r
+    static void mouseDragged   (id self, SEL, NSEvent* ev)               { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag, ev); }\r
+    static void asyncMouseDown (id self, SEL, NSEvent* ev)               { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown, ev); }\r
+    static void asyncMouseUp   (id self, SEL, NSEvent* ev)               { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp,   ev); }\r
+    static void draggingExited (id self, SEL, id<NSDraggingInfo> sender) { callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); }\r
 \r
-        registerClass();\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    static BOOL isFlipped (id, SEL) { return true; }\r
-\r
-    // Key events will be processed by the peer's component.\r
-    // If the component is unable to use the event, it will be re-sent\r
-    // to performKeyEquivalent.\r
-    // performKeyEquivalent will send the event to the view's superclass,\r
-    // which will try passing the event to the main menu.\r
-    // If the event still hasn't been processed, it will be passed to the\r
-    // next responder in the chain, which will be the NSWindow for a peer\r
-    // that is on the desktop.\r
-    // If the NSWindow still doesn't handle the event, the Apple docs imply\r
-    // that the event should be sent to the NSApp for processing, but this\r
-    // doesn't seem to happen for keyDown events.\r
-    // Instead, the NSWindow attempts to process the event, fails, and\r
-    // triggers an annoying NSBeep.\r
-    // Overriding keyDown to "handle" the event seems to suppress the beep.\r
-    static void keyDown (id, SEL, NSEvent* ev)\r
-    {\r
-        ignoreUnused (ev);\r
-\r
-       #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
-        DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
-       #endif\r
+    static void mouseDown (id self, SEL s, NSEvent* ev)\r
+    {\r
+        if (JUCEApplicationBase::isStandaloneApp())\r
+        {\r
+            asyncMouseDown (self, s, ev);\r
+        }\r
+        else\r
+        {\r
+            // In some host situations, the host will stop modal loops from working\r
+            // correctly if they're called from a mouse event, so we'll trigger\r
+            // the event asynchronously..\r
+            [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector\r
+                                   withObject: ev\r
+                                waitUntilDone: NO];\r
+        }\r
     }\r
 \r
-    static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow* window, NSRect r)\r
+    static void mouseUp (id self, SEL s, NSEvent* ev)\r
     {\r
-        if (auto* owner = getOwner (self))\r
+        if (JUCEApplicationBase::isStandaloneApp())\r
         {\r
-            if (auto* constrainer = owner->getConstrainer())\r
-            {\r
-                if (auto* screen = [window screen])\r
-                {\r
-                    const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame]));\r
-                    const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
-                    const auto expanded = originalBounds.withWidth  ((float) constrainer->getMaximumWidth())\r
-                                                        .withHeight ((float) constrainer->getMaximumHeight());\r
-                    const auto constrained = expanded.constrainedWithin (safeScreenBounds);\r
-\r
-                    return flippedScreenRect (makeNSRect ([&]\r
-                    {\r
-                        if (constrained == owner->getBounds().toFloat())\r
-                            return owner->lastSizeBeforeZoom.toFloat();\r
-\r
-                        owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
-                        return constrained;\r
-                    }()));\r
-                }\r
-            }\r
+            asyncMouseUp (self, s, ev);\r
+        }\r
+        else\r
+        {\r
+            // In some host situations, the host will stop modal loops from working\r
+            // correctly if they're called from a mouse event, so we'll trigger\r
+            // the event asynchronously..\r
+            [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector\r
+                                   withObject: ev\r
+                                waitUntilDone: NO];\r
         }\r
-\r
-        return r;\r
     }\r
 \r
-    static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow*, NSRect)\r
+    static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)\r
     {\r
         if (auto* owner = getOwner (self))\r
-            if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
-                return NO;\r
+            if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))\r
+                return NSDragOperationGeneric;\r
 \r
-        return YES;\r
+        return NSDragOperationNone;\r
     }\r
 \r
-    static BOOL canBecomeKeyWindow (id self, SEL)\r
+    static NSArray* getAccessibilityChildren (id self, SEL)\r
     {\r
-        auto* owner = getOwner (self);\r
-\r
-        return owner != nullptr\r
-                && owner->canBecomeKeyWindow()\r
-                && ! owner->isBlockedByModalComponent();\r
+        return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self));\r
     }\r
+};\r
 \r
-    static BOOL canBecomeMainWindow (id self, SEL)\r
+//==============================================================================\r
+struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindow>>\r
+{\r
+    JuceNSWindowClass()  : NSViewComponentPeerWrapper ("JUCEWindow_")\r
     {\r
-        auto* owner = getOwner (self);\r
+        addMethod (@selector (canBecomeKeyWindow), [] (id self, SEL)\r
+        {\r
+            auto* owner = getOwner (self);\r
 \r
-        return owner != nullptr\r
-                && owner->canBecomeMainWindow()\r
-                && ! owner->isBlockedByModalComponent();\r
-    }\r
+            return owner != nullptr\r
+                   && owner->canBecomeKeyWindow()\r
+                   && ! owner->isBlockedByModalComponent();\r
+        });\r
 \r
-    static void becomeKeyWindow (id self, SEL)\r
-    {\r
-        sendSuperclassMessage<void> (self, @selector (becomeKeyWindow));\r
+        addMethod (@selector (canBecomeMainWindow), [] (id self, SEL)\r
+        {\r
+            auto* owner = getOwner (self);\r
 \r
-        if (auto* owner = getOwner (self))\r
+            return owner != nullptr\r
+                   && owner->canBecomeMainWindow()\r
+                   && ! owner->isBlockedByModalComponent();\r
+        });\r
+\r
+        addMethod (@selector (becomeKeyWindow), [] (id self, SEL)\r
         {\r
-            if (owner->canBecomeKeyWindow())\r
+            sendSuperclassMessage<void> (self, @selector (becomeKeyWindow));\r
+\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                owner->becomeKeyWindow();\r
-                return;\r
+                if (owner->canBecomeKeyWindow())\r
+                {\r
+                    owner->becomeKeyWindow();\r
+                    return;\r
+                }\r
+\r
+                // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus\r
+                if (! owner->getComponent().isVisible())\r
+                    [(NSWindow*) self orderOut: nil];\r
             }\r
+        });\r
 \r
-            // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus\r
-            if (! owner->getComponent().isVisible())\r
-                [(NSWindow*) self orderOut: nil];\r
-        }\r
-    }\r
+        addMethod (@selector (resignKeyWindow), [] (id self, SEL)\r
+        {\r
+            sendSuperclassMessage<void> (self, @selector (resignKeyWindow));\r
 \r
-    static void resignKeyWindow (id self, SEL)\r
-    {\r
-        sendSuperclassMessage<void> (self, @selector (resignKeyWindow));\r
+            if (auto* owner = getOwner (self))\r
+                owner->resignKeyWindow();\r
+        });\r
 \r
-        if (auto* owner = getOwner (self))\r
-            owner->resignKeyWindow();\r
-    }\r
+        addMethod (@selector (windowShouldClose:), [] (id self, SEL, id /*window*/)\r
+        {\r
+            auto* owner = getOwner (self);\r
+            return owner == nullptr || owner->windowShouldClose();\r
+        });\r
 \r
-    static BOOL windowShouldClose (id self, SEL, id /*window*/)\r
-    {\r
-        auto* owner = getOwner (self);\r
-        return owner == nullptr || owner->windowShouldClose();\r
-    }\r
+        addMethod (@selector (constrainFrameRect:toScreen:), [] (id self, SEL, NSRect frameRect, NSScreen* screen)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+            {\r
+                frameRect = sendSuperclassMessage<NSRect, NSRect, NSScreen*> (self, @selector (constrainFrameRect:toScreen:),\r
+                                                                              frameRect, screen);\r
 \r
-    static NSRect constrainFrameRect (id self, SEL, NSRect frameRect, NSScreen* screen)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+                frameRect = owner->constrainRect (frameRect);\r
+            }\r
+\r
+            return frameRect;\r
+        });\r
+\r
+        addMethod (@selector (windowWillResize:toSize:), [] (id self, SEL, NSWindow*, NSSize proposedFrameSize)\r
         {\r
-            frameRect = sendSuperclassMessage<NSRect, NSRect, NSScreen*> (self, @selector (constrainFrameRect:toScreen:),\r
-                                                                          frameRect, screen);\r
+            auto* owner = getOwner (self);\r
 \r
-            frameRect = owner->constrainRect (frameRect);\r
-        }\r
+            if (owner == nullptr || owner->isZooming)\r
+                return proposedFrameSize;\r
 \r
-        return frameRect;\r
-    }\r
+            NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]);\r
+            frameRect.size = proposedFrameSize;\r
 \r
-    static NSSize windowWillResize (id self, SEL, NSWindow*, NSSize proposedFrameSize)\r
-    {\r
-        auto* owner = getOwner (self);\r
+            frameRect = owner->constrainRect (flippedScreenRect (frameRect));\r
 \r
-        if (owner == nullptr || owner->isZooming)\r
-            return proposedFrameSize;\r
+            owner->dismissModals();\r
 \r
-        NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]);\r
-        frameRect.size = proposedFrameSize;\r
+            return frameRect.size;\r
+        });\r
 \r
-        frameRect = owner->constrainRect (flippedScreenRect (frameRect));\r
+        addMethod (@selector (windowDidExitFullScreen:), [] (id self, SEL, NSNotification*)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                owner->resetWindowPresentation();\r
+        });\r
 \r
-        owner->dismissModals();\r
+        addMethod (@selector (windowWillEnterFullScreen:), [] (id self, SEL, NSNotification*)\r
+        {\r
+            if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9)\r
+                return;\r
 \r
-        return frameRect.size;\r
-    }\r
+            if (auto* owner = getOwner (self))\r
+                if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+                    [owner->window setStyleMask: NSWindowStyleMaskBorderless];\r
+        });\r
 \r
-    static void toggleFullScreen (id self, SEL name, id sender)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
+        addMethod (@selector (windowWillExitFullScreen:), [] (id self, SEL, NSNotification*)\r
+        {\r
+            // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable...\r
+            if (auto* owner = getOwner (self))\r
+                if (auto* window = owner->window)\r
+                    [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable];\r
+        });\r
+\r
+        addMethod (@selector (windowWillStartLiveResize:), [] (id self, SEL, NSNotification*)\r
         {\r
-            const auto isFullScreen = owner->isFullScreen();\r
+            if (auto* owner = getOwner (self))\r
+                owner->liveResizingStart();\r
+        });\r
 \r
-            if (! isFullScreen)\r
-                owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
+        addMethod (@selector (windowDidEndLiveResize:), [] (id self, SEL, NSNotification*)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                owner->liveResizingEnd();\r
+        });\r
 \r
-            sendSuperclassMessage<void> (self, name, sender);\r
+        addMethod (@selector (window:shouldPopUpDocumentPathMenu:), [] (id self, SEL, id /*window*/, NSMenu*)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                return owner->windowRepresentsFile;\r
 \r
-            if (isFullScreen)\r
+            return false;\r
+        });\r
+\r
+        addMethod (@selector (isFlipped), [] (id, SEL) { return true; });\r
+\r
+        addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), [] (id self, SEL, NSWindow* window, NSRect r)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
             {\r
-                [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
-                owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false);\r
+                if (auto* constrainer = owner->getConstrainer())\r
+                {\r
+                    if (auto* screen = [window screen])\r
+                    {\r
+                        const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame]));\r
+                        const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
+                        const auto expanded = originalBounds.withWidth  ((float) constrainer->getMaximumWidth())\r
+                                                            .withHeight ((float) constrainer->getMaximumHeight());\r
+                        const auto constrained = expanded.constrainedWithin (safeScreenBounds);\r
+\r
+                        return flippedScreenRect (makeNSRect ([&]\r
+                                                              {\r
+                                                                  if (constrained == owner->getBounds().toFloat())\r
+                                                                      return owner->lastSizeBeforeZoom.toFloat();\r
+\r
+                                                                  owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
+                                                                  return constrained;\r
+                                                              }()));\r
+                    }\r
+                }\r
             }\r
-        }\r
-    }\r
 \r
-    static void windowDidExitFullScreen (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            owner->resetWindowPresentation();\r
-    }\r
+            return r;\r
+        });\r
 \r
-    static void windowWillExitFullScreen (id self, SEL, NSNotification*)\r
-    {\r
-        // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable...\r
-        if (auto* owner = getOwner (self))\r
-            if (auto* window = owner->window)\r
-                [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable];\r
-    }\r
+        addMethod (@selector (windowShouldZoom:toFrame:), [] (id self, SEL, NSWindow*, NSRect)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+                    return NO;\r
 \r
-    static void windowWillEnterFullScreen (id self, SEL, NSNotification*)\r
-    {\r
-        if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9)\r
-            return;\r
+            return YES;\r
+        });\r
 \r
-        if (auto* owner = getOwner (self))\r
-            if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
-                [owner->window setStyleMask: NSWindowStyleMaskBorderless];\r
-    }\r
+        addMethod (@selector (accessibilityTitle), [] (id self, SEL) { return [self title]; });\r
 \r
-    static void windowWillStartLiveResize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            owner->liveResizingStart();\r
-    }\r
+        addMethod (@selector (accessibilityLabel), [] (id self, SEL) { return [getAccessibleChild (self) accessibilityLabel]; });\r
 \r
-    static void windowDidEndLiveResize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            owner->liveResizingEnd();\r
-    }\r
+        addMethod (@selector (accessibilityRole), [] (id, SEL) { return NSAccessibilityWindowRole; });\r
 \r
-    static bool shouldPopUpPathMenu (id self, SEL, id /*window*/, NSMenu*)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            return owner->windowRepresentsFile;\r
+        addMethod (@selector (accessibilitySubrole), [] (id self, SEL) -> NSAccessibilitySubrole\r
+        {\r
+            if (@available (macOS 10.10, *))\r
+                return [getAccessibleChild (self) accessibilitySubrole];\r
+\r
+            return nil;\r
+        });\r
+\r
+        // Key events will be processed by the peer's component.\r
+        // If the component is unable to use the event, it will be re-sent\r
+        // to performKeyEquivalent.\r
+        // performKeyEquivalent will send the event to the view's superclass,\r
+        // which will try passing the event to the main menu.\r
+        // If the event still hasn't been processed, it will be passed to the\r
+        // next responder in the chain, which will be the NSWindow for a peer\r
+        // that is on the desktop.\r
+        // If the NSWindow still doesn't handle the event, the Apple docs imply\r
+        // that the event should be sent to the NSApp for processing, but this\r
+        // doesn't seem to happen for keyDown events.\r
+        // Instead, the NSWindow attempts to process the event, fails, and\r
+        // triggers an annoying NSBeep.\r
+        // Overriding keyDown to "handle" the event seems to suppress the beep.\r
+        addMethod (@selector (keyDown:), [] (id, SEL, NSEvent* ev)\r
+        {\r
+            ignoreUnused (ev);\r
+\r
+           #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
+            DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
+           #endif\r
+        });\r
 \r
-        return false;\r
-    }\r
+        addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), [] (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+                return owner->windowRepresentsFile;\r
 \r
-    static bool shouldAllowIconDrag (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*)\r
-    {\r
-        if (auto* owner = getOwner (self))\r
-            return owner->windowRepresentsFile;\r
+            return false;\r
+        });\r
 \r
-        return false;\r
-    }\r
+        addMethod (@selector (toggleFullScreen:), [] (id self, SEL name, id sender)\r
+        {\r
+            if (auto* owner = getOwner (self))\r
+            {\r
+                const auto isFullScreen = owner->isFullScreen();\r
 \r
-    static NSString* getAccessibilityTitle (id self, SEL)\r
-    {\r
-        return [self title];\r
-    }\r
+                if (! isFullScreen)\r
+                    owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
 \r
-    static NSString* getAccessibilityLabel (id self, SEL)\r
-    {\r
-        return [getAccessibleChild (self) accessibilityLabel];\r
-    }\r
+                sendSuperclassMessage<void> (self, name, sender);\r
 \r
-    static id getAccessibilityWindow (id self, SEL)\r
-    {\r
-        return self;\r
-    }\r
+                if (isFullScreen)\r
+                {\r
+                    [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
+                    owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false);\r
+                }\r
+            }\r
+        });\r
 \r
-    static NSAccessibilityRole getAccessibilityRole (id, SEL)\r
-    {\r
-        return NSAccessibilityWindowRole;\r
-    }\r
+        addMethod (@selector (accessibilityTopLevelUIElement),      getAccessibilityWindow);\r
+        addMethod (@selector (accessibilityWindow),                 getAccessibilityWindow);\r
 \r
-    static NSAccessibilityRole getAccessibilitySubrole (id self, SEL)\r
-    {\r
-        if (@available (macOS 10.10, *))\r
-            return [getAccessibleChild (self) accessibilitySubrole];\r
+        addProtocol (@protocol (NSWindowDelegate));\r
 \r
-        return nil;\r
+        registerClass();\r
     }\r
+\r
+private:\r
+    //==============================================================================\r
+    static id getAccessibilityWindow (id self, SEL) { return self; }\r
 };\r
 \r
 NSView* NSViewComponentPeer::createViewInstance()\r
index f8bcabbc00c41845c6cf3c2e79050c88bae6410f..eb736ded0f6ef025a81aba1676bc6b16254fcf95 100644 (file)
@@ -471,34 +471,19 @@ bool Desktop::isDarkModeActive() const
                 isEqualToString: nsStringLiteral ("Dark")];\r
 }\r
 \r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+static const auto darkModeSelector = @selector (darkModeChanged:);\r
+static const auto keyboardVisibilitySelector = @selector (keyboardVisiblityChanged:);\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
 class Desktop::NativeDarkModeChangeDetectorImpl\r
 {\r
 public:\r
     NativeDarkModeChangeDetectorImpl()\r
     {\r
         static DelegateClass delegateClass;\r
-\r
-        delegate = [delegateClass.createInstance() init];\r
-        object_setInstanceVariable (delegate, "owner", this);\r
-\r
-        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-        [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate\r
-                                                            selector: @selector (darkModeChanged:)\r
-                                                                name: @"AppleInterfaceThemeChangedNotification"\r
-                                                              object: nil];\r
-        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-    }\r
-\r
-    ~NativeDarkModeChangeDetectorImpl()\r
-    {\r
-        object_setInstanceVariable (delegate, "owner", nullptr);\r
-        [[NSDistributedNotificationCenter defaultCenter] removeObserver: delegate];\r
-        [delegate release];\r
-    }\r
-\r
-    void darkModeChanged()\r
-    {\r
-        Desktop::getInstance().darkModeChanged();\r
+        delegate.reset ([delegateClass.createInstance() init]);\r
+        observer.emplace (delegate.get(), darkModeSelector, @"AppleInterfaceThemeChangedNotification", nil);\r
     }\r
 \r
 private:\r
@@ -506,23 +491,13 @@ private:
     {\r
         DelegateClass()  : ObjCClass<NSObject> ("JUCEDelegate_")\r
         {\r
-            addIvar<NativeDarkModeChangeDetectorImpl*> ("owner");\r
-\r
-            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-            addMethod (@selector (darkModeChanged:), darkModeChanged);\r
-            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
+            addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); });\r
             registerClass();\r
         }\r
-\r
-        static void darkModeChanged (id self, SEL, NSNotification*)\r
-        {\r
-            if (auto* owner = getIvar<NativeDarkModeChangeDetectorImpl*> (self, "owner"))\r
-                owner->darkModeChanged();\r
-        }\r
     };\r
 \r
-    id delegate = nil;\r
+    NSUniquePtr<NSObject> delegate;\r
+    Optional<ScopedNotificationCenterObserver> observer;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)\r
 };\r
index b2c8f8c1e288ec4791525b778475ddace9116789..f58f2f81ae0e67eb159a5c848e1cf9334fe48cd4 100644 (file)
@@ -241,21 +241,6 @@ public:
         public:\r
             explicit RowCellInterface (RowAccessibilityHandler& h)  : handler (h)  {}\r
 \r
-            int getColumnIndex() const override      { return 0; }\r
-            int getColumnSpan() const override       { return 1; }\r
-\r
-            int getRowIndex() const override\r
-            {\r
-                const auto index = handler.rowComponent.row;\r
-\r
-                if (handler.rowComponent.owner.hasAccessibleHeaderComponent())\r
-                    return index + 1;\r
-\r
-                return index;\r
-            }\r
-\r
-            int getRowSpan() const override          { return 1; }\r
-\r
             int getDisclosureLevel() const override  { return 0; }\r
 \r
             const AccessibilityHandler* getTableHandler() const override\r
@@ -294,41 +279,43 @@ public:
     {\r
         setWantsKeyboardFocus (false);\r
 \r
-        auto content = std::make_unique<Component>();\r
+        struct IgnoredComponent : Component\r
+        {\r
+            std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
+            {\r
+                return createIgnoredAccessibilityHandler (*this);\r
+            }\r
+        };\r
+\r
+        auto content = std::make_unique<IgnoredComponent>();\r
         content->setWantsKeyboardFocus (false);\r
 \r
         setViewedComponent (content.release());\r
     }\r
 \r
-    RowComponent* getComponentForRow (int row) const noexcept\r
-    {\r
-        if (isPositiveAndBelow (row, rows.size()))\r
-            return rows[row];\r
-\r
-        return nullptr;\r
-    }\r
-\r
-    RowComponent* getComponentForRowWrapped (int row) const noexcept\r
-    {\r
-        return rows[row % jmax (1, rows.size())];\r
-    }\r
+    int getIndexOfFirstVisibleRow() const { return jmax (0, firstIndex - 1); }\r
 \r
     RowComponent* getComponentForRowIfOnscreen (int row) const noexcept\r
     {\r
-        return (row >= firstIndex && row < firstIndex + rows.size())\r
-                 ? getComponentForRowWrapped (row) : nullptr;\r
+        const auto startIndex = getIndexOfFirstVisibleRow();\r
+\r
+        return (startIndex <= row && row < startIndex + (int) rows.size())\r
+                 ? rows[(size_t) (row % jmax (1, (int) rows.size()))].get()\r
+                 : nullptr;\r
     }\r
 \r
-    int getRowNumberOfComponent (Component* const rowComponent) const noexcept\r
+    int getRowNumberOfComponent (const Component* const rowComponent) const noexcept\r
     {\r
-        const int index = getViewedComponent()->getIndexOfChildComponent (rowComponent);\r
-        const int num = rows.size();\r
+        const auto iter = std::find_if (rows.begin(), rows.end(), [=] (auto& ptr) { return ptr.get() == rowComponent; });\r
 \r
-        for (int i = num; --i >= 0;)\r
-            if (((firstIndex + i) % jmax (1, num)) == index)\r
-                return firstIndex + i;\r
+        if (iter == rows.end())\r
+            return -1;\r
 \r
-        return -1;\r
+        const auto index = (int) std::distance (rows.begin(), iter);\r
+        const auto mod = jmax (1, (int) rows.size());\r
+        const auto startIndex = getIndexOfFirstVisibleRow();\r
+\r
+        return index + mod * ((startIndex / mod) + (index < (startIndex % mod) ? 1 : 0));\r
     }\r
 \r
     void visibleAreaChanged (const Rectangle<int>&) override\r
@@ -371,30 +358,33 @@ public:
             auto y = getViewPositionY();\r
             auto w = content.getWidth();\r
 \r
-            const int numNeeded = 4 + getMaximumVisibleHeight() / rowH;\r
-            rows.removeRange (numNeeded, rows.size());\r
+            const auto numNeeded = (size_t) (4 + getMaximumVisibleHeight() / rowH);\r
+            rows.resize (jmin (numNeeded, rows.size()));\r
 \r
             while (numNeeded > rows.size())\r
             {\r
-                auto* newRow = rows.add (new RowComponent (owner));\r
-                content.addAndMakeVisible (newRow);\r
+                rows.emplace_back (new RowComponent (owner));\r
+                content.addAndMakeVisible (*rows.back());\r
             }\r
 \r
             firstIndex = y / rowH;\r
             firstWholeIndex = (y + rowH - 1) / rowH;\r
             lastWholeIndex = (y + getMaximumVisibleHeight() - 1) / rowH;\r
 \r
-            auto startIndex = jmax (0, firstIndex - 1);\r
+            const auto startIndex = getIndexOfFirstVisibleRow();\r
+            const auto lastIndex = startIndex + (int) rows.size();\r
 \r
-            for (int i = 0; i < numNeeded; ++i)\r
+            for (auto row = startIndex; row < lastIndex; ++row)\r
             {\r
-                const int row = i + startIndex;\r
-\r
-                if (auto* rowComp = getComponentForRowWrapped (row))\r
+                if (auto* rowComp = getComponentForRowIfOnscreen (row))\r
                 {\r
                     rowComp->setBounds (0, row * rowH, w, rowH);\r
                     rowComp->update (row, owner.isRowSelected (row));\r
                 }\r
+                else\r
+                {\r
+                    jassertfalse;\r
+                }\r
             }\r
         }\r
 \r
@@ -488,7 +478,7 @@ private:
     }\r
 \r
     ListBox& owner;\r
-    OwnedArray<RowComponent> rows;\r
+    std::vector<std::unique_ptr<RowComponent>> rows;\r
     int firstIndex = 0, firstWholeIndex = 0, lastWholeIndex = 0;\r
     bool hasUpdated = false;\r
 \r
@@ -850,7 +840,7 @@ Component* ListBox::getComponentForRowNumber (const int row) const noexcept
     return nullptr;\r
 }\r
 \r
-int ListBox::getRowNumberOfComponent (Component* const rowComponent) const noexcept\r
+int ListBox::getRowNumberOfComponent (const Component* const rowComponent) const noexcept\r
 {\r
     return viewport->getRowNumberOfComponent (rowComponent);\r
 }\r
@@ -1155,15 +1145,8 @@ std::unique_ptr<AccessibilityHandler> ListBox::createAccessibilityHandler()
         {\r
             listBox.checkModelPtrIsValid();\r
 \r
-            if (listBox.model == nullptr)\r
-                return 0;\r
-\r
-            const auto numRows = listBox.model->getNumRows();\r
-\r
-            if (listBox.hasAccessibleHeaderComponent())\r
-                return numRows + 1;\r
-\r
-            return numRows;\r
+            return listBox.model != nullptr ? listBox.model->getNumRows()\r
+                                            : 0;\r
         }\r
 \r
         int getNumColumns() const override\r
@@ -1171,31 +1154,47 @@ std::unique_ptr<AccessibilityHandler> ListBox::createAccessibilityHandler()
             return 1;\r
         }\r
 \r
-        const AccessibilityHandler* getCellHandler (int row, int) const override\r
+        const AccessibilityHandler* getHeaderHandler() const override\r
         {\r
-            if (auto* headerHandler = getHeaderHandler())\r
-            {\r
-                if (row == 0)\r
-                    return headerHandler;\r
+            if (listBox.hasAccessibleHeaderComponent())\r
+                return listBox.headerComponent->getAccessibilityHandler();\r
 \r
-                --row;\r
-            }\r
+            return nullptr;\r
+        }\r
 \r
-            if (auto* rowComponent = listBox.viewport->getComponentForRow (row))\r
+        const AccessibilityHandler* getRowHandler (int row) const override\r
+        {\r
+            if (auto* rowComponent = listBox.viewport->getComponentForRowIfOnscreen (row))\r
                 return rowComponent->getAccessibilityHandler();\r
 \r
             return nullptr;\r
         }\r
 \r
-    private:\r
-        const AccessibilityHandler* getHeaderHandler() const\r
+        const AccessibilityHandler* getCellHandler (int, int) const override\r
         {\r
-            if (listBox.hasAccessibleHeaderComponent())\r
-                return listBox.headerComponent->getAccessibilityHandler();\r
-\r
             return nullptr;\r
         }\r
 \r
+        Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+        {\r
+            const auto rowNumber = listBox.getRowNumberOfComponent (&handler.getComponent());\r
+\r
+            return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 })\r
+                                   : nullopt;\r
+        }\r
+\r
+        Optional<Span> getColumnSpan (const AccessibilityHandler&) const override\r
+        {\r
+            return Span { 0, 1 };\r
+        }\r
+\r
+        void showCell (const AccessibilityHandler& h) const override\r
+        {\r
+            if (const auto row = getRowSpan (h))\r
+                listBox.scrollToEnsureRowIsOnscreen (row->begin);\r
+        }\r
+\r
+    private:\r
         ListBox& listBox;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface)\r
index cb2907e13b4e8d003eb8bce41c1b5693a5f1b49e..c3a4273c9b3a02a5d0b55c1cc9ba255d56587bba 100644 (file)
@@ -455,7 +455,7 @@ public:
     /** Returns the row number that the given component represents.\r
         If the component isn't one of the list's rows, this will return -1.\r
     */\r
-    int getRowNumberOfComponent (Component* rowComponent) const noexcept;\r
+    int getRowNumberOfComponent (const Component* rowComponent) const noexcept;\r
 \r
     /** Returns the width of a row (which may be less than the width of this component\r
         if there's a scrollbar).\r
index 1e9b6ad70d5bae9484d055778898e9071059be3f..d1182ec9231d5c45708a5cf88749530a60a62314 100644 (file)
@@ -122,20 +122,34 @@ public:
         return 0.0f;\r
     }\r
 \r
-    void updateRange()\r
+    void setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay)\r
+    {\r
+        fixedNumDecimalPlaces = jmax (0, decimalPlacesToDisplay);\r
+        numDecimalPlaces = fixedNumDecimalPlaces;\r
+    }\r
+\r
+    int getNumDecimalPlacesToDisplay() const\r
     {\r
-        // figure out the number of DPs needed to display all values at this\r
-        // interval setting.\r
-        numDecimalPlaces = 7;\r
+        return fixedNumDecimalPlaces == -1 ? numDecimalPlaces : fixedNumDecimalPlaces;\r
+    }\r
 \r
-        if (normRange.interval != 0.0)\r
+    void updateRange()\r
+    {\r
+        if (fixedNumDecimalPlaces == -1)\r
         {\r
-            int v = std::abs (roundToInt (normRange.interval * 10000000));\r
+            // figure out the number of DPs needed to display all values at this\r
+            // interval setting.\r
+            numDecimalPlaces = 7;\r
 \r
-            while ((v % 10) == 0 && numDecimalPlaces > 0)\r
+            if (normRange.interval != 0.0)\r
             {\r
-                --numDecimalPlaces;\r
-                v /= 10;\r
+                int v = std::abs (roundToInt (normRange.interval * 10000000));\r
+\r
+                while ((v % 10) == 0 && numDecimalPlaces > 0)\r
+                {\r
+                    --numDecimalPlaces;\r
+                    v /= 10;\r
+                }\r
             }\r
         }\r
 \r
@@ -1299,6 +1313,7 @@ public:
     TextEntryBoxPosition textBoxPos;\r
     String textSuffix;\r
     int numDecimalPlaces = 7;\r
+    int fixedNumDecimalPlaces = -1;\r
     int textBoxWidth = 80, textBoxHeight = 20;\r
     IncDecButtonMode incDecButtonMode = incDecButtonsNotDraggable;\r
     ModifierKeys::Flags modifierToSwapModes = ModifierKeys::ctrlAltCommandModifiers;\r
@@ -1658,11 +1673,14 @@ double Slider::snapValue (double attemptedValue, DragMode)
     return attemptedValue;\r
 }\r
 \r
-int Slider::getNumDecimalPlacesToDisplay() const noexcept   { return pimpl->numDecimalPlaces; }\r
+int Slider::getNumDecimalPlacesToDisplay() const noexcept\r
+{\r
+    return pimpl->getNumDecimalPlacesToDisplay();\r
+}\r
 \r
 void Slider::setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay)\r
 {\r
-    pimpl->numDecimalPlaces = decimalPlacesToDisplay;\r
+    pimpl->setNumDecimalPlacesToDisplay (decimalPlacesToDisplay);\r
     updateText();\r
 }\r
 \r
index 6a787d953fb4086d7da2c354034aec3a8c081c85..4dc53dc32c4be453e9b1a5a76384a3fc2641a9ba 100644 (file)
@@ -50,6 +50,7 @@ public:
 //==============================================================================\r
 TableHeaderComponent::TableHeaderComponent()\r
 {\r
+    setFocusContainerType (FocusContainerType::focusContainer);\r
 }\r
 \r
 TableHeaderComponent::~TableHeaderComponent()\r
@@ -86,7 +87,7 @@ int TableHeaderComponent::getNumColumns (const bool onlyCountVisibleColumns) con
 String TableHeaderComponent::getColumnName (const int columnId) const\r
 {\r
     if (auto* ci = getInfoForId (columnId))\r
-        return ci->name;\r
+        return ci->getTitle();\r
 \r
     return {};\r
 }\r
@@ -95,9 +96,9 @@ void TableHeaderComponent::setColumnName (const int columnId, const String& newN
 {\r
     if (auto* ci = getInfoForId (columnId))\r
     {\r
-        if (ci->name != newName)\r
+        if (ci->getTitle() != newName)\r
         {\r
-            ci->name = newName;\r
+            ci->setTitle (newName);\r
             sendColumnsChanged();\r
         }\r
     }\r
@@ -116,7 +117,7 @@ void TableHeaderComponent::addColumn (const String& columnName,
     jassert (width > 0);\r
 \r
     auto ci = new ColumnInfo();\r
-    ci->name = columnName;\r
+    ci->setTitle (columnName);\r
     ci->id = columnId;\r
     ci->width = width;\r
     ci->lastDeliberateWidth = width;\r
@@ -125,7 +126,11 @@ void TableHeaderComponent::addColumn (const String& columnName,
     jassert (ci->maximumWidth >= ci->minimumWidth);\r
     ci->propertyFlags = propertyFlags;\r
 \r
-    columns.insert (insertIndex, ci);\r
+    auto* added = columns.insert (insertIndex, ci);\r
+    addChildComponent (added);\r
+    added->setVisible ((propertyFlags & visible) != 0);\r
+\r
+    resized();\r
     sendColumnsChanged();\r
 }\r
 \r
@@ -197,6 +202,7 @@ void TableHeaderComponent::setColumnWidth (const int columnId, const int newWidt
                 }\r
             }\r
 \r
+            resized();\r
             repaint();\r
             columnsResized = true;\r
             triggerAsyncUpdate();\r
@@ -340,6 +346,7 @@ void TableHeaderComponent::resizeColumnsToFit (int firstColumnIndex, int targetT
             if (newWidth != ci->width)\r
             {\r
                 ci->width = newWidth;\r
+                resized();\r
                 repaint();\r
                 columnsResized = true;\r
                 triggerAsyncUpdate();\r
@@ -354,11 +361,7 @@ void TableHeaderComponent::setColumnVisible (const int columnId, const bool shou
     {\r
         if (shouldBeVisible != ci->isVisible())\r
         {\r
-            if (shouldBeVisible)\r
-                ci->propertyFlags |= visible;\r
-            else\r
-                ci->propertyFlags &= ~visible;\r
-\r
+            ci->setVisible (shouldBeVisible);\r
             sendColumnsChanged();\r
             resized();\r
         }\r
@@ -409,6 +412,7 @@ bool TableHeaderComponent::isSortedForwards() const
 void TableHeaderComponent::reSortTable()\r
 {\r
     sortChanged = true;\r
+    resized();\r
     repaint();\r
     triggerAsyncUpdate();\r
 }\r
@@ -485,7 +489,7 @@ void TableHeaderComponent::addMenuItems (PopupMenu& menu, const int /*columnIdCl
 {\r
     for (auto* ci : columns)\r
         if ((ci->propertyFlags & appearsOnColumnMenu) != 0)\r
-            menu.addItem (ci->id, ci->name,\r
+            menu.addItem (ci->id, ci->getTitle(),\r
                           (ci->propertyFlags & (sortedForwards | sortedBackwards)) == 0,\r
                           isColumnVisible (ci->id));\r
 }\r
@@ -502,28 +506,42 @@ void TableHeaderComponent::paint (Graphics& g)
 \r
     lf.drawTableHeaderBackground (g, *this);\r
 \r
-    auto clip = g.getClipBounds();\r
+    for (auto* ci : columns)\r
+    {\r
+        if (ci->isVisible() && ci->getWidth() > 0)\r
+        {\r
+            Graphics::ScopedSaveState ss (g);\r
+\r
+            g.setOrigin (ci->getX(), ci->getY());\r
+            g.reduceClipRegion (0, 0, ci->getWidth(), ci->getHeight());\r
+\r
+            lf.drawTableHeaderColumn (g, *this, ci->getTitle(), ci->id, ci->width, getHeight(),\r
+                                      ci->id == columnIdUnderMouse,\r
+                                      ci->id == columnIdUnderMouse && isMouseButtonDown(),\r
+                                      ci->propertyFlags);\r
+        }\r
+    }\r
+}\r
+\r
+void TableHeaderComponent::resized()\r
+{\r
+    auto clip = getBounds();\r
 \r
     int x = 0;\r
 \r
+    for (auto* ci : columns)\r
+        ci->setBounds (0, 0, 0, 0);\r
+\r
     for (auto* ci : columns)\r
     {\r
         if (ci->isVisible())\r
         {\r
             if (x + ci->width > clip.getX()\r
-                 && (ci->id != columnIdBeingDragged\r
-                      || dragOverlayComp == nullptr\r
-                      || ! dragOverlayComp->isVisible()))\r
+                && (ci->id != columnIdBeingDragged\r
+                    || dragOverlayComp == nullptr\r
+                    || ! dragOverlayComp->isVisible()))\r
             {\r
-                Graphics::ScopedSaveState ss (g);\r
-\r
-                g.setOrigin (x, 0);\r
-                g.reduceClipRegion (0, 0, ci->width, getHeight());\r
-\r
-                lf.drawTableHeaderColumn (g, *this, ci->name, ci->id, ci->width, getHeight(),\r
-                                          ci->id == columnIdUnderMouse,\r
-                                          ci->id == columnIdUnderMouse && isMouseButtonDown(),\r
-                                          ci->propertyFlags);\r
+                ci->setBounds (x, 0, ci->width, getHeight());\r
             }\r
 \r
             x += ci->width;\r
@@ -540,6 +558,7 @@ void TableHeaderComponent::mouseExit  (const MouseEvent&)    { setColumnUnderMou
 \r
 void TableHeaderComponent::mouseDown (const MouseEvent& e)\r
 {\r
+    resized();\r
     repaint();\r
     columnIdBeingResized = 0;\r
     columnIdBeingDragged = 0;\r
@@ -716,6 +735,7 @@ void TableHeaderComponent::endDrag (const int finalIndex)
         moveColumn (columnIdBeingDragged, finalIndex);\r
 \r
         columnIdBeingDragged = 0;\r
+        resized();\r
         repaint();\r
 \r
         for (int i = listeners.size(); --i >= 0;)\r
@@ -735,6 +755,7 @@ void TableHeaderComponent::mouseUp (const MouseEvent& e)
             c->lastDeliberateWidth = c->width;\r
 \r
     columnIdBeingResized = 0;\r
+    resized();\r
     repaint();\r
 \r
     endDrag (getIndexOfColumnId (columnIdBeingDragged, true));\r
@@ -756,10 +777,6 @@ MouseCursor TableHeaderComponent::getMouseCursor()
 }\r
 \r
 //==============================================================================\r
-bool TableHeaderComponent::ColumnInfo::isVisible() const\r
-{\r
-    return (propertyFlags & TableHeaderComponent::visible) != 0;\r
-}\r
 \r
 TableHeaderComponent::ColumnInfo* TableHeaderComponent::getInfoForId (int id) const\r
 {\r
@@ -793,6 +810,7 @@ void TableHeaderComponent::sendColumnsChanged()
     if (stretchToFit && lastDeliberateWidth > 0)\r
         resizeAllColumnsToFit (lastDeliberateWidth);\r
 \r
+    resized();\r
     repaint();\r
     columnsChanged = true;\r
     triggerAsyncUpdate();\r
@@ -903,4 +921,9 @@ std::unique_ptr<AccessibilityHandler> TableHeaderComponent::createAccessibilityH
     return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::tableHeader);\r
 }\r
 \r
+std::unique_ptr<AccessibilityHandler> TableHeaderComponent::ColumnInfo::createAccessibilityHandler()\r
+{\r
+    return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::tableHeader);\r
+}\r
+\r
 } // namespace juce\r
index 8a6034de5bb94ac4b403170d9bf198049690bf6a..3d1b017350206cc4abcdfb804cf7ec513a69d842 100644 (file)
@@ -403,6 +403,8 @@ public:
     /** @internal */\r
     void paint (Graphics&) override;\r
     /** @internal */\r
+    void resized() override;\r
+    /** @internal */\r
     void mouseMove (const MouseEvent&) override;\r
     /** @internal */\r
     void mouseEnter (const MouseEvent&) override;\r
@@ -421,13 +423,13 @@ public:
     virtual void showColumnChooserMenu (int columnIdClicked);\r
 \r
 private:\r
-    struct ColumnInfo\r
+    struct ColumnInfo : public Component\r
     {\r
-        String name;\r
+        ColumnInfo() { setInterceptsMouseClicks (false, false); }\r
+        std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;\r
+\r
         int id, propertyFlags, width, minimumWidth, maximumWidth;\r
         double lastDeliberateWidth;\r
-\r
-        bool isVisible() const;\r
     };\r
 \r
     OwnedArray<ColumnInfo> columns;\r
index f513b3c577d1accc47bcc779afd50bcff0f4ddde..b332e5dc06098943559d7b2b4af2ee5c67016dc9 100644 (file)
@@ -26,6 +26,9 @@
 namespace juce\r
 {\r
 \r
+static const Identifier tableColumnProperty { "_tableColumnId" };\r
+static const Identifier tableAccessiblePlaceholderProperty { "_accessiblePlaceholder" };\r
+\r
 class TableListBox::RowComp   : public Component,\r
                                 public TooltipClient\r
 {\r
@@ -43,12 +46,12 @@ public:
             tableModel->paintRowBackground (g, row, getWidth(), getHeight(), isSelected);\r
 \r
             auto& headerComp = owner.getHeader();\r
-            auto numColumns = headerComp.getNumColumns (true);\r
-            auto clipBounds = g.getClipBounds();\r
+            const auto numColumns = jmin ((int) columnComponents.size(), headerComp.getNumColumns (true));\r
+            const auto clipBounds = g.getClipBounds();\r
 \r
             for (int i = 0; i < numColumns; ++i)\r
             {\r
-                if (columnComponents[i] == nullptr)\r
+                if (columnComponents[(size_t) i]->getProperties().contains (tableAccessiblePlaceholderProperty))\r
                 {\r
                     auto columnRect = headerComp.getColumnPosition (i).withHeight (getHeight());\r
 \r
@@ -86,33 +89,62 @@ public:
 \r
         if (tableModel != nullptr && row < owner.getNumRows())\r
         {\r
-            const Identifier columnProperty ("_tableColumnId");\r
-            auto numColumns = owner.getHeader().getNumColumns (true);\r
+            const ComponentDeleter deleter { columnForComponent };\r
+            const auto numColumns = owner.getHeader().getNumColumns (true);\r
+\r
+            while (numColumns < (int) columnComponents.size())\r
+                columnComponents.pop_back();\r
+\r
+            while ((int) columnComponents.size() < numColumns)\r
+                columnComponents.emplace_back (nullptr, deleter);\r
 \r
             for (int i = 0; i < numColumns; ++i)\r
             {\r
                 auto columnId = owner.getHeader().getColumnIdOfIndex (i, true);\r
-                auto* comp = columnComponents[i];\r
-\r
-                if (comp != nullptr && columnId != static_cast<int> (comp->getProperties() [columnProperty]))\r
+                auto originalComp = std::move (columnComponents[(size_t) i]);\r
+                auto oldCustomComp = originalComp != nullptr && ! originalComp->getProperties().contains (tableAccessiblePlaceholderProperty)\r
+                                   ? std::move (originalComp)\r
+                                   : std::unique_ptr<Component, ComponentDeleter> { nullptr, deleter };\r
+                auto compToRefresh = oldCustomComp != nullptr && columnId == static_cast<int> (oldCustomComp->getProperties()[tableColumnProperty])\r
+                                   ? std::move (oldCustomComp)\r
+                                   : std::unique_ptr<Component, ComponentDeleter> { nullptr, deleter };\r
+\r
+                columnForComponent.erase (compToRefresh.get());\r
+                std::unique_ptr<Component, ComponentDeleter> newCustomComp { tableModel->refreshComponentForCell (row,\r
+                                                                                                                  columnId,\r
+                                                                                                                  isSelected,\r
+                                                                                                                  compToRefresh.release()),\r
+                                                                             deleter };\r
+\r
+                auto columnComp = [&]\r
                 {\r
-                    columnComponents.set (i, nullptr);\r
-                    comp = nullptr;\r
-                }\r
-\r
-                comp = tableModel->refreshComponentForCell (row, columnId, isSelected, comp);\r
-                columnComponents.set (i, comp, false);\r
-\r
-                if (comp != nullptr)\r
-                {\r
-                    comp->getProperties().set (columnProperty, columnId);\r
-\r
-                    addAndMakeVisible (comp);\r
-                    resizeCustomComp (i);\r
-                }\r
+                    // We got a result from refreshComponentForCell, so use that\r
+                    if (newCustomComp != nullptr)\r
+                        return std::move (newCustomComp);\r
+\r
+                    // There was already a placeholder component for this column\r
+                    if (originalComp != nullptr)\r
+                        return std::move (originalComp);\r
+\r
+                    // Create a new placeholder component to use\r
+                    std::unique_ptr<Component, ComponentDeleter> comp { new Component, deleter };\r
+                    comp->setInterceptsMouseClicks (false, false);\r
+                    comp->getProperties().set (tableAccessiblePlaceholderProperty, true);\r
+                    return comp;\r
+                }();\r
+\r
+                columnForComponent.emplace (columnComp.get(), i);\r
+\r
+                // In order for navigation to work correctly on macOS, the number of child\r
+                // accessibility elements on each row must match the number of header accessibility\r
+                // elements.\r
+                columnComp->setFocusContainerType (FocusContainerType::focusContainer);\r
+                columnComp->getProperties().set (tableColumnProperty, columnId);\r
+                addAndMakeVisible (*columnComp);\r
+\r
+                columnComponents[(size_t) i] = std::move (columnComp);\r
+                resizeCustomComp (i);\r
             }\r
-\r
-            columnComponents.removeRange (numColumns, columnComponents.size());\r
         }\r
         else\r
         {\r
@@ -122,15 +154,19 @@ public:
 \r
     void resized() override\r
     {\r
-        for (int i = columnComponents.size(); --i >= 0;)\r
+        for (auto i = (int) columnComponents.size(); --i >= 0;)\r
             resizeCustomComp (i);\r
     }\r
 \r
     void resizeCustomComp (int index)\r
     {\r
-        if (auto* c = columnComponents.getUnchecked (index))\r
-            c->setBounds (owner.getHeader().getColumnPosition (index)\r
-                            .withY (0).withHeight (getHeight()));\r
+        if (auto& c = columnComponents[(size_t) index])\r
+        {\r
+            c->setBounds (owner.getHeader()\r
+                               .getColumnPosition (index)\r
+                               .withY (0)\r
+                               .withHeight (getHeight()));\r
+        }\r
     }\r
 \r
     void mouseDown (const MouseEvent& e) override\r
@@ -220,7 +256,18 @@ public:
 \r
     Component* findChildComponentForColumn (int columnId) const\r
     {\r
-        return columnComponents [owner.getHeader().getIndexOfColumnId (columnId, true)];\r
+        const auto index = (size_t) owner.getHeader().getIndexOfColumnId (columnId, true);\r
+\r
+        if (isPositiveAndBelow (index, columnComponents.size()))\r
+            return columnComponents[index].get();\r
+\r
+        return nullptr;\r
+    }\r
+\r
+    int getColumnNumberOfComponent (const Component* comp) const\r
+    {\r
+        const auto iter = columnForComponent.find (comp);\r
+        return iter != columnForComponent.cend() ? iter->second : -1;\r
     }\r
 \r
     std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
@@ -270,6 +317,7 @@ public:
             return state;\r
         }\r
 \r
+    private:\r
         class RowComponentCellInterface  : public AccessibilityCellInterface\r
         {\r
         public:\r
@@ -278,12 +326,6 @@ public:
             {\r
             }\r
 \r
-            int getColumnIndex() const override      { return 0; }\r
-            int getColumnSpan() const override       { return 1; }\r
-\r
-            int getRowIndex() const override         { return owner.rowComponent.row; }\r
-            int getRowSpan() const override          { return 1; }\r
-\r
             int getDisclosureLevel() const override  { return 0; }\r
 \r
             const AccessibilityHandler* getTableHandler() const override  { return owner.rowComponent.owner.getAccessibilityHandler(); }\r
@@ -297,8 +339,27 @@ public:
     };\r
 \r
     //==============================================================================\r
+    class ComponentDeleter\r
+    {\r
+    public:\r
+        explicit ComponentDeleter (std::map<const Component*, int>& locations)\r
+            : columnForComponent (&locations) {}\r
+\r
+        void operator() (Component* comp) const\r
+        {\r
+            columnForComponent->erase (comp);\r
+\r
+            if (comp != nullptr)\r
+                delete comp;\r
+        }\r
+\r
+    private:\r
+        std::map<const Component*, int>* columnForComponent;\r
+    };\r
+\r
     TableListBox& owner;\r
-    OwnedArray<Component> columnComponents;\r
+    std::map<const Component*, int> columnForComponent;\r
+    std::vector<std::unique_ptr<Component, ComponentDeleter>> columnComponents;\r
     int row = -1;\r
     bool isSelected = false, isDragging = false, selectRowOnMouseUp = false;\r
 \r
@@ -544,6 +605,22 @@ void TableListBox::updateColumnComponents() const
             rowComp->resized();\r
 }\r
 \r
+template <typename FindIndex>\r
+Optional<AccessibilityTableInterface::Span> findRecursively (const AccessibilityHandler& handler,\r
+                                                             Component* outermost,\r
+                                                             FindIndex&& findIndexOfComponent)\r
+{\r
+    for (auto* comp = &handler.getComponent(); comp != outermost; comp = comp->getParentComponent())\r
+    {\r
+        const auto result = findIndexOfComponent (comp);\r
+\r
+        if (result != -1)\r
+            return AccessibilityTableInterface::Span { result, 1 };\r
+    }\r
+\r
+    return nullopt;\r
+}\r
+\r
 std::unique_ptr<AccessibilityHandler> TableListBox::createAccessibilityHandler()\r
 {\r
     class TableInterface  : public AccessibilityTableInterface\r
@@ -564,24 +641,64 @@ std::unique_ptr<AccessibilityHandler> TableListBox::createAccessibilityHandler()
 \r
         int getNumColumns() const override\r
         {\r
-            return tableListBox.getHeader().getNumColumns (false);\r
+            return tableListBox.getHeader().getNumColumns (true);\r
         }\r
 \r
-        const AccessibilityHandler* getCellHandler (int row, int column) const override\r
+        const AccessibilityHandler* getRowHandler (int row) const override\r
         {\r
             if (isPositiveAndBelow (row, getNumRows()))\r
-            {\r
-                if (isPositiveAndBelow (column, getNumColumns()))\r
-                    if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, false), row))\r
-                        return cellComponent->getAccessibilityHandler();\r
-\r
                 if (auto* rowComp = tableListBox.getComponentForRowNumber (row))\r
                     return rowComp->getAccessibilityHandler();\r
-            }\r
 \r
             return nullptr;\r
         }\r
 \r
+        const AccessibilityHandler* getCellHandler (int row, int column) const override\r
+        {\r
+            if (isPositiveAndBelow (row, getNumRows()) && isPositiveAndBelow (column, getNumColumns()))\r
+                if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, true), row))\r
+                    return cellComponent->getAccessibilityHandler();\r
+\r
+            return nullptr;\r
+        }\r
+\r
+        const AccessibilityHandler* getHeaderHandler() const override\r
+        {\r
+            if (tableListBox.hasAccessibleHeaderComponent())\r
+                return tableListBox.headerComponent->getAccessibilityHandler();\r
+\r
+            return nullptr;\r
+        }\r
+\r
+        Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+        {\r
+            if (tableListBox.isParentOf (&handler.getComponent()))\r
+                return findRecursively (handler, &tableListBox, [&] (auto* c) { return tableListBox.getRowNumberOfComponent (c); });\r
+\r
+            return nullopt;\r
+        }\r
+\r
+        Optional<Span> getColumnSpan (const AccessibilityHandler& handler) const override\r
+        {\r
+            if (const auto rowSpan = getRowSpan (handler))\r
+                if (auto* rowComponent = dynamic_cast<RowComp*> (tableListBox.getComponentForRowNumber (rowSpan->begin)))\r
+                    return findRecursively (handler, &tableListBox, [&] (auto* c) { return rowComponent->getColumnNumberOfComponent (c); });\r
+\r
+            return nullopt;\r
+        }\r
+\r
+        void showCell (const AccessibilityHandler& handler) const override\r
+        {\r
+            const auto row = getRowSpan (handler);\r
+            const auto col = getColumnSpan (handler);\r
+\r
+            if (row.hasValue() && col.hasValue())\r
+            {\r
+                tableListBox.scrollToEnsureRowIsOnscreen (row->begin);\r
+                tableListBox.scrollToEnsureColumnIsOnscreen (col->begin);\r
+            }\r
+        }\r
+\r
     private:\r
         TableListBox& tableListBox;\r
 \r
@@ -589,7 +706,7 @@ std::unique_ptr<AccessibilityHandler> TableListBox::createAccessibilityHandler()
     };\r
 \r
     return std::make_unique<AccessibilityHandler> (*this,\r
-                                                   AccessibilityRole::list,\r
+                                                   AccessibilityRole::table,\r
                                                    AccessibilityActions{},\r
                                                    AccessibilityHandler::Interfaces { std::make_unique<TableInterface> (*this) });\r
 }\r
index 5c2055be2b6a523618946b2678974b39e32f1f85..10a09d3a64e1d3e91ff8e5728bccb889704bdf94 100644 (file)
@@ -1168,7 +1168,7 @@ void TextEditor::updateCaretPosition()
     {\r
         Iterator i (*this);\r
         caret->setCaretPosition (getCaretRectangle().translated (leftIndent,\r
-                                                                 topIndent + roundToInt (i.getYOffset())));\r
+                                                                 topIndent + roundToInt (i.getYOffset())) - getTextOffset());\r
 \r
         if (auto* handler = getAccessibilityHandler())\r
             handler->notifyAccessibilityEvent (AccessibilityEvent::textSelectionChanged);\r
@@ -1229,6 +1229,7 @@ void TextEditor::clear()
     clearInternal (nullptr);\r
     checkLayout();\r
     undoManager.clearUndoHistory();\r
+    repaint();\r
 }\r
 \r
 void TextEditor::setText (const String& newText, bool sendTextChangeMessage)\r
@@ -1450,18 +1451,13 @@ void TextEditor::scrollEditorToPositionCaret (const int desiredCaretX,
     viewport->setViewPosition (vx, vy);\r
 }\r
 \r
-Rectangle<int> TextEditor::getCaretRectangle()\r
-{\r
-    return getCaretRectangleFloat().getSmallestIntegerContainer();\r
-}\r
-\r
-Rectangle<float> TextEditor::getCaretRectangleFloat() const\r
+Rectangle<int> TextEditor::getCaretRectangleForCharIndex (int index) const\r
 {\r
     Point<float> anchor;\r
     auto cursorHeight = currentFont.getHeight(); // (in case the text is empty and the call below doesn't set this value)\r
-    getCharPosition (caretPosition, anchor, cursorHeight);\r
+    getCharPosition (index, anchor, cursorHeight);\r
 \r
-    return { anchor.x, anchor.y, 2.0f, cursorHeight };\r
+    return Rectangle<float> { anchor.x, anchor.y, 2.0f, cursorHeight }.getSmallestIntegerContainer() + getTextOffset();\r
 }\r
 \r
 Point<int> TextEditor::getTextOffset() const noexcept\r
@@ -1473,7 +1469,7 @@ Point<int> TextEditor::getTextOffset() const noexcept
              roundToInt ((float) getTopIndent() + (float) borderSize.getTop() + yOffset) - viewport->getViewPositionY() };\r
 }\r
 \r
-RectangleList<int> TextEditor::getTextBounds (Range<int> textRange)\r
+RectangleList<int> TextEditor::getTextBounds (Range<int> textRange) const\r
 {\r
     RectangleList<int> boundingBox;\r
     Iterator i (*this);\r
@@ -1563,7 +1559,7 @@ void TextEditor::scrollToMakeSureCursorIsVisible()
     if (keepCaretOnScreen)\r
     {\r
         auto viewPos = viewport->getViewPosition();\r
-        auto caretRect = getCaretRectangle().translated (leftIndent, topIndent);\r
+        auto caretRect = getCaretRectangle().translated (leftIndent, topIndent) - getTextOffset();\r
         auto relativeCursor = caretRect.getPosition() - viewPos;\r
 \r
         if (relativeCursor.x < jmax (1, proportionOfWidth (0.05f)))\r
@@ -1646,6 +1642,16 @@ int TextEditor::getTextIndexAt (const int x, const int y) const
                             (float) (y - offset.y));\r
 }\r
 \r
+int TextEditor::getTextIndexAt (const Point<int> pt) const\r
+{\r
+    return getTextIndexAt (pt.x, pt.y);\r
+}\r
+\r
+int TextEditor::getCharIndexForPoint (const Point<int> point) const\r
+{\r
+    return getTextIndexAt (isMultiLine() ? point : getTextBounds ({ 0, getTotalNumChars() }).getBounds().getConstrainedPoint (point));\r
+}\r
+\r
 void TextEditor::insertTextAtCaret (const String& t)\r
 {\r
     String newText (inputFilter != nullptr ? inputFilter->filterNewText (*this, t) : t);\r
@@ -1669,8 +1675,13 @@ void TextEditor::insertTextAtCaret (const String& t)
 \r
 void TextEditor::setHighlightedRegion (const Range<int>& newSelection)\r
 {\r
-    moveCaretTo (newSelection.getStart(), false);\r
-    moveCaretTo (newSelection.getEnd(), true);\r
+    if (newSelection == getHighlightedRegion())\r
+        return;\r
+\r
+    const auto cursorAtStart = newSelection.getEnd() == getHighlightedRegion().getStart()\r
+                            || newSelection.getEnd() == getHighlightedRegion().getEnd();\r
+    moveCaretTo (cursorAtStart ? newSelection.getEnd() : newSelection.getStart(), false);\r
+    moveCaretTo (cursorAtStart ? newSelection.getStart() : newSelection.getEnd(), true);\r
 }\r
 \r
 //==============================================================================\r
@@ -1852,8 +1863,7 @@ void TextEditor::mouseDown (const MouseEvent& e)
     {\r
         if (! (popupMenuEnabled && e.mods.isPopupMenu()))\r
         {\r
-            moveCaretTo (getTextIndexAt (e.x, e.y),\r
-                         e.mods.isShiftDown());\r
+            moveCaretTo (getTextIndexAt (e.getPosition()), e.mods.isShiftDown());\r
 \r
             if (auto* peer = getPeer())\r
                 peer->closeInputMethodContext();\r
@@ -1888,7 +1898,7 @@ void TextEditor::mouseDrag (const MouseEvent& e)
 \r
     if (wasFocused || ! selectAllTextWhenFocused)\r
         if (! (popupMenuEnabled && e.mods.isPopupMenu()))\r
-            moveCaretTo (getTextIndexAt (e.x, e.y), true);\r
+            moveCaretTo (getTextIndexAt (e.getPosition()), true);\r
 }\r
 \r
 void TextEditor::mouseUp (const MouseEvent& e)\r
@@ -1901,7 +1911,7 @@ void TextEditor::mouseUp (const MouseEvent& e)
 \r
     if (wasFocused || ! selectAllTextWhenFocused)\r
         if (e.mouseWasClicked() && ! (popupMenuEnabled && e.mods.isPopupMenu()))\r
-            moveCaret (getTextIndexAt (e.x, e.y));\r
+            moveCaret (getTextIndexAt (e.getPosition()));\r
 \r
     wasFocused = true;\r
 }\r
@@ -1911,7 +1921,7 @@ void TextEditor::mouseDoubleClick (const MouseEvent& e)
     if (! mouseDownInEditor)\r
         return;\r
 \r
-    int tokenEnd = getTextIndexAt (e.x, e.y);\r
+    int tokenEnd = getTextIndexAt (e.getPosition());\r
     int tokenStart = 0;\r
 \r
     if (e.getNumberOfClicks() > 3)\r
@@ -2025,7 +2035,7 @@ bool TextEditor::moveCaretUp (bool selecting)
     if (! isMultiLine())\r
         return moveCaretToStartOfLine (selecting);\r
 \r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - 1.0f), selecting);\r
 }\r
 \r
@@ -2034,7 +2044,7 @@ bool TextEditor::moveCaretDown (bool selecting)
     if (! isMultiLine())\r
         return moveCaretToEndOfLine (selecting);\r
 \r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + 1.0f), selecting);\r
 }\r
 \r
@@ -2043,7 +2053,7 @@ bool TextEditor::pageUp (bool selecting)
     if (! isMultiLine())\r
         return moveCaretToStartOfLine (selecting);\r
 \r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - (float) viewport->getViewHeight()), selecting);\r
 }\r
 \r
@@ -2052,7 +2062,7 @@ bool TextEditor::pageDown (bool selecting)
     if (! isMultiLine())\r
         return moveCaretToEndOfLine (selecting);\r
 \r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + (float) viewport->getViewHeight()), selecting);\r
 }\r
 \r
@@ -2080,7 +2090,7 @@ bool TextEditor::moveCaretToTop (bool selecting)
 \r
 bool TextEditor::moveCaretToStartOfLine (bool selecting)\r
 {\r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition (0.0f, caretPos.getY()), selecting);\r
 }\r
 \r
@@ -2091,7 +2101,7 @@ bool TextEditor::moveCaretToEnd (bool selecting)
 \r
 bool TextEditor::moveCaretToEndOfLine (bool selecting)\r
 {\r
-    auto caretPos = getCaretRectangleFloat();\r
+    const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
     return moveCaretWithTransaction (indexAtPosition ((float) textHolder->getWidth(), caretPos.getY()), selecting);\r
 }\r
 \r
@@ -2726,20 +2736,7 @@ private:
 \r
         void setSelection (Range<int> r) override\r
         {\r
-            if (r == textEditor.getHighlightedRegion())\r
-                return;\r
-\r
-            if (r.isEmpty())\r
-            {\r
-                textEditor.setCaretPosition (r.getStart());\r
-            }\r
-            else\r
-            {\r
-                const auto cursorAtStart = r.getEnd() == textEditor.getHighlightedRegion().getStart()\r
-                                        || r.getEnd() == textEditor.getHighlightedRegion().getEnd();\r
-                textEditor.moveCaretTo (cursorAtStart ? r.getEnd() : r.getStart(), false);\r
-                textEditor.moveCaretTo (cursorAtStart ? r.getStart() : r.getEnd(), true);\r
-            }\r
+            textEditor.setHighlightedRegion (r);\r
         }\r
 \r
         String getText (Range<int> r) const override\r
@@ -2771,8 +2768,7 @@ private:
 \r
         int getOffsetAtPoint (Point<int> point) const override\r
         {\r
-            auto localPoint = textEditor.getLocalPoint (nullptr, point);\r
-            return textEditor.getTextIndexAt (localPoint.x, localPoint.y);\r
+            return textEditor.getTextIndexAt (textEditor.getLocalPoint (nullptr, point));\r
         }\r
 \r
     private:\r
index d817e5ec024a31ff9e516b3d0ee8e0445091fbb1..d93e6af1c7de32b5cc6460910667c942c3fb2956 100644 (file)
@@ -423,7 +423,7 @@ public:
     /** Returns the current index of the caret.\r
         @see setCaretPosition\r
     */\r
-    int getCaretPosition() const;\r
+    int getCaretPosition() const override;\r
 \r
     /** Moves the caret to be in front of a given character.\r
         @see getCaretPosition, moveCaretToEnd\r
@@ -443,12 +443,11 @@ public:
     */\r
     void scrollEditorToPositionCaret (int desiredCaretX, int desiredCaretY);\r
 \r
-    /** Get the graphical position of the caret.\r
+    /** Get the graphical position of the caret for a particular index in the text.\r
 \r
         The rectangle returned is relative to the component's top-left corner.\r
-        @see scrollEditorToPositionCaret\r
     */\r
-    Rectangle<int> getCaretRectangle() override;\r
+    Rectangle<int> getCaretRectangleForCharIndex (int index) const override;\r
 \r
     /** Selects a section of the text. */\r
     void setHighlightedRegion (const Range<int>& newSelection) override;\r
@@ -467,12 +466,22 @@ public:
     */\r
     int getTextIndexAt (int x, int y) const;\r
 \r
+    /** Finds the index of the character at a given position.\r
+        The coordinates are relative to the component's top-left.\r
+    */\r
+    int getTextIndexAt (Point<int>) const;\r
+\r
+    /** Like getTextIndexAt, but doesn't snap to the beginning/end of the range for\r
+        points vertically outside the text.\r
+    */\r
+    int getCharIndexForPoint (Point<int> point) const override;\r
+\r
     /** Counts the number of characters in the text.\r
 \r
         This is quicker than getting the text as a string if you just need to know\r
         the length.\r
     */\r
-    int getTotalNumChars() const;\r
+    int getTotalNumChars() const override;\r
 \r
     /** Returns the total width of the text, as it is currently laid-out.\r
 \r
@@ -541,7 +550,7 @@ public:
         The bounds are relative to the component's top-left and may extend beyond the bounds\r
         of the component if the text is long and word wrapping is disabled.\r
     */\r
-    RectangleList<int> getTextBounds (Range<int> textRange);\r
+    RectangleList<int> getTextBounds (Range<int> textRange) const override;\r
 \r
     //==============================================================================\r
     void moveCaretToEnd();\r
@@ -826,7 +835,6 @@ private:
     void reinsert (int insertIndex, const OwnedArray<UniformTextSection>&);\r
     void remove (Range<int>, UndoManager*, int caretPositionToMoveTo);\r
     void getCharPosition (int index, Point<float>&, float& lineHeight) const;\r
-    Rectangle<float> getCaretRectangleFloat() const;\r
     void updateCaretPosition();\r
     void updateValueFromText();\r
     void textWasChangedByValue();\r
index c040a67de372000f4da380df6e02971308d5ce54..38c2277740238bb169d78d1d3df75672d7262827 100644 (file)
@@ -143,22 +143,37 @@ private:
         public:\r
             explicit ItemCellInterface (ItemComponent& c)  : itemComponent (c)  {}\r
 \r
-            int getColumnIndex() const override  { return 0; }\r
-            int getColumnSpan() const override   { return 1; }\r
-\r
-            int getRowIndex() const override\r
+            int getDisclosureLevel() const override\r
             {\r
-                return itemComponent.getRepresentedItem().getRowNumberInTree();\r
+                return getItemDepth (&itemComponent.getRepresentedItem());\r
             }\r
 \r
-            int getRowSpan() const override\r
+            std::vector<const AccessibilityHandler*> getDisclosedRows() const override\r
             {\r
-                return 1;\r
-            }\r
+                const auto& representedItem = itemComponent.getRepresentedItem();\r
+                const auto* tree = representedItem.getOwnerView();\r
 \r
-            int getDisclosureLevel() const override\r
-            {\r
-                return getItemDepth (&itemComponent.getRepresentedItem());\r
+                if (tree == nullptr)\r
+                    return {};\r
+\r
+                const auto numSubItems = representedItem.isOpen() ? representedItem.getNumSubItems() : 0;\r
+\r
+                std::vector<const AccessibilityHandler*> result;\r
+                result.reserve ((size_t) numSubItems);\r
+\r
+                for (auto i = 0; i < numSubItems; ++i)\r
+                {\r
+                    result.push_back ([&]() -> const AccessibilityHandler*\r
+                    {\r
+                        if (auto* subItem = representedItem.getSubItem (i))\r
+                            if (auto* component = tree->getItemComponent (subItem))\r
+                                return component->getAccessibilityHandler();\r
+\r
+                        return nullptr;\r
+                    }());\r
+                }\r
+\r
+                return result;\r
             }\r
 \r
             const AccessibilityHandler* getTableHandler() const override\r
@@ -284,7 +299,7 @@ public:
     ItemComponent* getItemComponentAt (Point<int> p)\r
     {\r
         auto iter = std::find_if (itemComponents.cbegin(), itemComponents.cend(),\r
-                                  [p] (const std::unique_ptr<ItemComponent>& c)\r
+                                  [p] (const auto& c)\r
                                   {\r
                                       return c->getBounds().contains (p);\r
                                   });\r
@@ -298,7 +313,7 @@ public:
     ItemComponent* getComponentForItem (const TreeViewItem* item) const\r
     {\r
         const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(),\r
-                                        [item] (const std::unique_ptr<ItemComponent>& c)\r
+                                        [item] (const auto& c)\r
                                         {\r
                                             return &c->getRepresentedItem() == item;\r
                                         });\r
@@ -312,7 +327,7 @@ public:
     void itemBeingDeleted (const TreeViewItem* item)\r
     {\r
         const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(),\r
-                                        [item] (const std::unique_ptr<ItemComponent>& c)\r
+                                        [item] (const auto& c)\r
                                         {\r
                                             return &c->getRepresentedItem() == item;\r
                                         });\r
@@ -329,6 +344,12 @@ public:
         }\r
     }\r
 \r
+    const TreeViewItem* getItemForItemComponent (const Component* comp) const\r
+    {\r
+        const auto iter = itemForItemComponent.find (comp);\r
+        return iter != itemForItemComponent.cend() ? iter->second : nullptr;\r
+    }\r
+\r
     void updateComponents()\r
     {\r
         std::set<ItemComponent*> componentsToKeep;\r
@@ -341,7 +362,8 @@ public:
             }\r
             else\r
             {\r
-                auto newComp = std::make_unique<ItemComponent> (*treeItem);\r
+                std::unique_ptr<ItemComponent, Deleter> newComp { new ItemComponent (*treeItem), Deleter { itemForItemComponent } };\r
+                itemForItemComponent.emplace (newComp.get(), treeItem);\r
 \r
                 addAndMakeVisible (*newComp);\r
                 newComp->addMouseListener (this, treeItem->customComponentUsesTreeViewMouseHandler());\r
@@ -402,7 +424,7 @@ private:
         updateItemUnderMouse (e);\r
 \r
         isDragging = false;\r
-        scopedScrollDisabler = nullptr;\r
+        scopedScrollDisabler = nullopt;\r
         needSelectionOnMouseUp = false;\r
 \r
         if (! isEnabled())\r
@@ -495,7 +517,7 @@ private:
                             auto imageOffset = pos.getPosition() - e.getPosition();\r
                             dragContainer->startDragging (dragDescription, &owner, { dragImage, additionalScale }, true, &imageOffset, &e.source);\r
 \r
-                            scopedScrollDisabler = std::make_unique<ScopedDisableViewportScroll> (*itemComponent);\r
+                            scopedScrollDisabler.emplace (*itemComponent);\r
                         }\r
                         else\r
                         {\r
@@ -660,12 +682,32 @@ private:
         return visibleItems;\r
     }\r
 \r
+    //==============================================================================\r
+    class Deleter\r
+    {\r
+    public:\r
+        explicit Deleter (std::map<const Component*, const TreeViewItem*>& map)\r
+            : itemForItemComponent (&map) {}\r
+\r
+        void operator() (ItemComponent* ptr) const\r
+        {\r
+            itemForItemComponent->erase (ptr);\r
+\r
+            if (ptr != nullptr)\r
+                delete ptr;\r
+        }\r
+\r
+    private:\r
+        std::map<const Component*, const TreeViewItem*>* itemForItemComponent = nullptr;\r
+    };\r
+\r
     //==============================================================================\r
     TreeView& owner;\r
 \r
-    std::vector<std::unique_ptr<ItemComponent>> itemComponents;\r
+    std::map<const Component*, const TreeViewItem*> itemForItemComponent;\r
+    std::vector<std::unique_ptr<ItemComponent, Deleter>> itemComponents;\r
     ItemComponent* itemUnderMouse = nullptr;\r
-    std::unique_ptr<ScopedDisableViewportScroll> scopedScrollDisabler;\r
+    Optional<ScopedDisableViewportScroll> scopedScrollDisabler;\r
     bool isDragging = false, needSelectionOnMouseUp = false;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentComponent)\r
@@ -1053,7 +1095,7 @@ void TreeView::moveSelectedRow (int delta)
     }\r
 }\r
 \r
-void TreeView::scrollToKeepItemVisible (TreeViewItem* item)\r
+void TreeView::scrollToKeepItemVisible (const TreeViewItem* item)\r
 {\r
     if (item != nullptr && item->ownerView == this)\r
     {\r
@@ -1448,7 +1490,12 @@ std::unique_ptr<AccessibilityHandler> TreeView::createAccessibilityHandler()
         int getNumRows() const override     { return treeView.getNumRowsInTree(); }\r
         int getNumColumns() const override  { return 1; }\r
 \r
-        const AccessibilityHandler* getCellHandler (int row, int) const override\r
+        const AccessibilityHandler* getHeaderHandler() const override\r
+        {\r
+            return nullptr;\r
+        }\r
+\r
+        const AccessibilityHandler* getRowHandler (int row) const override\r
         {\r
             if (auto* itemComp = treeView.getItemComponent (treeView.getItemOnRow (row)))\r
                 return itemComp->getAccessibilityHandler();\r
@@ -1456,7 +1503,44 @@ std::unique_ptr<AccessibilityHandler> TreeView::createAccessibilityHandler()
             return nullptr;\r
         }\r
 \r
+        const AccessibilityHandler* getCellHandler (int, int) const override\r
+        {\r
+            return nullptr;\r
+        }\r
+\r
+        Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+        {\r
+            auto* item = getItemForHandler (handler);\r
+\r
+            if (item == nullptr)\r
+                return nullopt;\r
+\r
+            const auto rowNumber = item->getRowNumberInTree();\r
+\r
+            return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 })\r
+                                   : nullopt;\r
+        }\r
+\r
+        Optional<Span> getColumnSpan (const AccessibilityHandler&) const override\r
+        {\r
+            return Span { 0, 1 };\r
+        }\r
+\r
+        void showCell (const AccessibilityHandler& cellHandler) const override\r
+        {\r
+            treeView.scrollToKeepItemVisible (getItemForHandler (cellHandler));\r
+        }\r
+\r
     private:\r
+        const TreeViewItem* getItemForHandler (const AccessibilityHandler& handler) const\r
+        {\r
+            for (auto* comp = &handler.getComponent(); comp != &treeView; comp = comp->getParentComponent())\r
+                if (auto* result = treeView.viewport->getContentComp()->getItemForItemComponent (comp))\r
+                    return result;\r
+\r
+            return nullptr;\r
+        }\r
+\r
         TreeView& treeView;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface)\r
@@ -1811,7 +1895,7 @@ void TreeViewItem::updatePositions (int newY)
     }\r
 }\r
 \r
-TreeViewItem* TreeViewItem::getDeepestOpenParentItem() noexcept\r
+const TreeViewItem* TreeViewItem::getDeepestOpenParentItem() const noexcept\r
 {\r
     auto* result = this;\r
     auto* item = this;\r
index 51b3f64ecede71fcd59325ec481141c351f0ad5f..0a40a90ff189f554a3998aec9a4188020cbd93b3 100644 (file)
@@ -613,7 +613,7 @@ private:
     int getIndentX() const noexcept;\r
     void setOwnerView (TreeView*) noexcept;\r
     TreeViewItem* getTopLevelItem() noexcept;\r
-    TreeViewItem* getDeepestOpenParentItem() noexcept;\r
+    const TreeViewItem* getDeepestOpenParentItem() const noexcept;\r
     int getNumRows() const noexcept;\r
     TreeViewItem* getItemOnRow (int) noexcept;\r
     void deselectAllRecursively (TreeViewItem*);\r
@@ -798,7 +798,7 @@ public:
     TreeViewItem* getItemAt (int yPosition) const noexcept;\r
 \r
     /** Tries to scroll the tree so that this item is on-screen somewhere. */\r
-    void scrollToKeepItemVisible (TreeViewItem* item);\r
+    void scrollToKeepItemVisible (const TreeViewItem* item);\r
 \r
     /** Returns the TreeView's Viewport object. */\r
     Viewport* getViewport() const noexcept;\r
index b024f9ddeb060131e0f9097b4032614dbf2a5d2a..c2da248cf6f2d61697077ec2c758e6a6ab11ea10 100644 (file)
@@ -83,9 +83,6 @@ public:
                             ? Component::getApproximateScaleFactorForComponent (options.componentToCentreAround)\r
                             : 1.0f)\r
     {\r
-        setUsingNativeTitleBar (options.useNativeTitleBar);\r
-        setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
-\r
         if (options.content.willDeleteObject())\r
             setContentOwned (options.content.release(), true);\r
         else\r
@@ -93,6 +90,9 @@ public:
 \r
         centreAroundComponent (options.componentToCentreAround, getWidth(), getHeight());\r
         setResizable (options.resizable, options.useBottomRightCornerResizer);\r
+\r
+        setUsingNativeTitleBar (options.useNativeTitleBar);\r
+        setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
     }\r
 \r
     void closeButtonPressed() override\r
index 95db8b9c71e419d8fd6cde80300b028ad79dac65..da5b4a9a3ecd3d27671794b2845cbcb40c57b498 100644 (file)
@@ -71,21 +71,7 @@ private:
 \r
         void setSelection (Range<int> r) override\r
         {\r
-            if (r == codeEditorComponent.getHighlightedRegion())\r
-                return;\r
-\r
-            if (r.isEmpty())\r
-            {\r
-                codeEditorComponent.caretPos.setPosition (r.getStart());\r
-                return;\r
-            }\r
-\r
-            auto& doc = codeEditorComponent.document;\r
-\r
-            const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart()\r
-                                    || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd();\r
-            codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()),\r
-                                              CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd()));\r
+            codeEditorComponent.setHighlightedRegion (r);\r
         }\r
 \r
         String getText (Range<int> r) const override\r
@@ -108,32 +94,7 @@ private:
 \r
         RectangleList<int> getTextBounds (Range<int> textRange) const override\r
         {\r
-            auto& doc = codeEditorComponent.document;\r
-\r
-            RectangleList<int> localRects;\r
-\r
-            CodeDocument::Position startPosition (doc, textRange.getStart());\r
-            CodeDocument::Position endPosition   (doc, textRange.getEnd());\r
-\r
-            for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line)\r
-            {\r
-                CodeDocument::Position lineStart (doc, line, 0);\r
-                CodeDocument::Position lineEnd   (doc, line, doc.getLine (line).length());\r
-\r
-                if (line == startPosition.getLineNumber())\r
-                    lineStart = lineStart.movedBy (startPosition.getIndexInLine());\r
-\r
-                if (line == endPosition.getLineNumber())\r
-                    lineEnd = { doc, line, endPosition.getIndexInLine() };\r
-\r
-                auto startPos = codeEditorComponent.getCharacterBounds (lineStart).getTopLeft();\r
-                auto endPos = codeEditorComponent.getCharacterBounds (lineEnd).getTopLeft();\r
-\r
-                localRects.add (startPos.x,\r
-                                startPos.y,\r
-                                jmax (1, endPos.x - startPos.x),\r
-                                codeEditorComponent.getLineHeight());\r
-            }\r
+            const auto localRects = codeEditorComponent.getTextBounds (textRange);\r
 \r
             RectangleList<int> globalRects;\r
 \r
@@ -213,11 +174,23 @@ public:
         return true;\r
     }\r
 \r
-    void getHighlightArea (RectangleList<float>& area, float x, int y, int lineH, float characterWidth) const\r
+    Optional<Rectangle<float>> getHighlightArea (float x, int y, int lineH, float characterWidth) const\r
     {\r
-        if (highlightColumnStart < highlightColumnEnd)\r
-            area.add (Rectangle<float> (x + (float) highlightColumnStart * characterWidth - 1.0f, (float) y - 0.5f,\r
-                                        (float) (highlightColumnEnd - highlightColumnStart) * characterWidth + 1.5f, (float) lineH + 1.0f));\r
+        return getHighlightArea (x, y, lineH, characterWidth, { highlightColumnStart, highlightColumnEnd });\r
+    }\r
+\r
+    Optional<Rectangle<float>> getHighlightArea (float x,\r
+                                                 int y,\r
+                                                 int lineH,\r
+                                                 float characterWidth,\r
+                                                 Range<int> highlightColumns) const\r
+    {\r
+        if (highlightColumns.isEmpty())\r
+            return {};\r
+\r
+        return Rectangle<float> (x + (float) highlightColumns.getStart() * characterWidth - 1.0f, (float) y - 0.5f,\r
+                                 (float) (highlightColumns.getEnd() - highlightColumns.getStart()) * characterWidth + 1.5f, (float) lineH + 1.0f);\r
+\r
     }\r
 \r
     void draw (CodeEditorComponent& owner, Graphics& g, const Font& fontToUse,\r
@@ -533,14 +506,6 @@ void CodeEditorComponent::setTemporaryUnderlining (const Array<Range<int>>&)
     jassertfalse; // TODO Windows IME not yet supported for this comp..\r
 }\r
 \r
-Rectangle<int> CodeEditorComponent::getCaretRectangle()\r
-{\r
-    if (caret != nullptr)\r
-        return getLocalArea (caret.get(), caret->getLocalBounds());\r
-\r
-    return {};\r
-}\r
-\r
 void CodeEditorComponent::setLineNumbersShown (const bool shouldBeShown)\r
 {\r
     if (showLineNumbers != shouldBeShown)\r
@@ -598,25 +563,26 @@ void CodeEditorComponent::paint (Graphics& g)
 {\r
     g.fillAll (findColour (CodeEditorComponent::backgroundColourId));\r
 \r
-    auto gutterSize = getGutterSize();\r
-    auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight();\r
-    auto right  = verticalScrollBar.isVisible()   ? verticalScrollBar.getX()   : getWidth();\r
+    const auto gutterSize = getGutterSize();\r
+    const auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight();\r
+    const auto right  = verticalScrollBar.isVisible()   ? verticalScrollBar.getX()   : getWidth();\r
 \r
     g.reduceClipRegion (gutterSize, 0, right - gutterSize, bottom);\r
 \r
     g.setFont (font);\r
 \r
-    auto clip = g.getClipBounds();\r
-    auto firstLineToDraw = jmax (0, clip.getY() / lineHeight);\r
-    auto lastLineToDraw  = jmin (lines.size(), clip.getBottom() / lineHeight + 1);\r
-    auto x = (float) (gutterSize - xOffset * charWidth);\r
-    auto rightClip = (float) clip.getRight();\r
+    const auto clip = g.getClipBounds();\r
+    const auto firstLineToDraw = jmax (0, clip.getY() / lineHeight);\r
+    const auto lastLineToDraw  = jmin (lines.size(), clip.getBottom() / lineHeight + 1);\r
+    const auto x = (float) (gutterSize - xOffset * charWidth);\r
+    const auto rightClip = (float) clip.getRight();\r
 \r
     {\r
         RectangleList<float> highlightArea;\r
 \r
         for (int i = firstLineToDraw; i < lastLineToDraw; ++i)\r
-            lines.getUnchecked(i)->getHighlightArea (highlightArea, x, lineHeight * i, lineHeight, charWidth);\r
+            if (const auto area = lines.getUnchecked(i)->getHighlightArea (x, lineHeight * i, lineHeight, charWidth))\r
+                highlightArea.add (*area);\r
 \r
         g.setColour (findColour (CodeEditorComponent::highlightColourId));\r
         g.fillRectList (highlightArea);\r
@@ -893,6 +859,37 @@ CodeDocument::Position CodeEditorComponent::getPositionAt (int x, int y) const
     return CodeDocument::Position (document, line, index);\r
 }\r
 \r
+int CodeEditorComponent::getCharIndexForPoint (Point<int> point) const\r
+{\r
+    return getPositionAt (point.x, point.y).getPosition();\r
+}\r
+\r
+RectangleList<int> CodeEditorComponent::getTextBounds (Range<int> textRange) const\r
+{\r
+    RectangleList<int> localRects;\r
+\r
+    const CodeDocument::Position startPosition (document, textRange.getStart());\r
+    const CodeDocument::Position endPosition   (document, textRange.getEnd());\r
+\r
+    for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line)\r
+    {\r
+        const CodeDocument::Position lineStartColumn0 { document, line, 0 };\r
+\r
+        const auto lineStart = line == startPosition.getLineNumber() ? lineStartColumn0.movedBy (startPosition.getIndexInLine())\r
+                                                                     : lineStartColumn0;\r
+\r
+        const CodeDocument::Position lineEnd { document, line, line == endPosition.getLineNumber() ? endPosition.getIndexInLine()\r
+                                                                                                   : document.getLine (line).length() };\r
+\r
+        const auto startPos = getCharacterBounds (lineStart).getTopLeft();\r
+        const auto endPos   = getCharacterBounds (lineEnd)  .getTopLeft();\r
+\r
+        localRects.add (startPos.x, startPos.y, jmax (1, endPos.x - startPos.x), getLineHeight());\r
+    }\r
+\r
+    return localRects;\r
+}\r
+\r
 //==============================================================================\r
 void CodeEditorComponent::insertTextAtCaret (const String& newText)\r
 {\r
@@ -1336,8 +1333,13 @@ bool CodeEditorComponent::isHighlightActive() const noexcept
 \r
 void CodeEditorComponent::setHighlightedRegion (const Range<int>& newRange)\r
 {\r
-    selectRegion (CodeDocument::Position (document, newRange.getStart()),\r
-                  CodeDocument::Position (document, newRange.getEnd()));\r
+    if (newRange == getHighlightedRegion())\r
+        return;\r
+\r
+    const auto cursorAtStart = newRange.getEnd() == getHighlightedRegion().getStart()\r
+                            || newRange.getEnd() == getHighlightedRegion().getEnd();\r
+    selectRegion (CodeDocument::Position (document, cursorAtStart ? newRange.getEnd() : newRange.getStart()),\r
+                  CodeDocument::Position (document, cursorAtStart ? newRange.getStart() : newRange.getEnd()));\r
 }\r
 \r
 String CodeEditorComponent::getTextInRange (const Range<int>& range) const\r
index 19f36dafb10e42ba4c25c86892be7e83d3ca04ac..e3a67e694205c48613a6236404e06122729d7ea8 100644 (file)
@@ -92,8 +92,8 @@ public:
     /** Returns the current caret position. */\r
     CodeDocument::Position getCaretPos() const                  { return caretPos; }\r
 \r
-    /** Returns the position of the caret, relative to the editor's origin. */\r
-    Rectangle<int> getCaretRectangle() override;\r
+    /** Returns the total number of codepoints in the string. */\r
+    int getTotalNumChars() const override                       { return document.getNumCharacters(); }\r
 \r
     /** Moves the caret.\r
         If selecting is true, the section of the document between the current\r
@@ -121,6 +121,26 @@ public:
     /** Enables or disables the line-number display in the gutter. */\r
     void setLineNumbersShown (bool shouldBeShown);\r
 \r
+    /** Returns the number of characters from the beginning of the document to the caret. */\r
+    int getCaretPosition() const override       { return getCaretPos().getPosition(); }\r
+\r
+    /** @see getPositionAt */\r
+    int getCharIndexForPoint (Point<int> point) const override;\r
+\r
+    /** Returns the bounds of the caret at a particular location in the text. */\r
+    Rectangle<int> getCaretRectangleForCharIndex (int index) const override\r
+    {\r
+        return getCharacterBounds ({ document, index });\r
+    }\r
+\r
+    /** Returns the bounding box for a range of text in the editor. As the range may span\r
+        multiple lines, this method returns a RectangleList.\r
+\r
+        The bounds are relative to the component's top-left and may extend beyond the bounds\r
+        of the component if the text is long and word wrapping is disabled.\r
+    */\r
+    RectangleList<int> getTextBounds (Range<int> textRange) const override;\r
+\r
     //==============================================================================\r
     bool moveCaretLeft (bool moveInWholeWordSteps, bool selecting);\r
     bool moveCaretRight (bool moveInWholeWordSteps, bool selecting);\r
index dbb4d75a556f463299370ba8e58d1f4c86ced7b8..4f60cb8fc9aeb9bb63529784404c90f299acf3e6 100644 (file)
  #import <WebKit/WebKit.h>\r
 \r
  #if JUCE_PUSH_NOTIFICATIONS\r
-  #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-   #import <UserNotifications/UserNotifications.h>\r
-  #endif\r
-\r
+  #import <UserNotifications/UserNotifications.h>\r
   #include "native/juce_ios_PushNotifications.cpp"\r
  #endif\r
 \r
index 506b2a02d987e504a6be5187f0065afe7e985d7b..7dd7c685a04e3b2656a0974d918139cb435605af 100644 (file)
 \r
  BEGIN_JUCE_MODULE_DECLARATION\r
 \r
-  ID:                 juce_gui_extra\r
-  vendor:             juce\r
-  version:            7.0.1\r
-  name:               JUCE extended GUI classes\r
-  description:        Miscellaneous GUI classes for specialised tasks.\r
-  website:            http://www.juce.com/juce\r
-  license:            GPL/Commercial\r
-  minimumCppStandard: 14\r
-\r
-  dependencies:       juce_gui_basics\r
-  OSXFrameworks:      WebKit\r
-  iOSFrameworks:      WebKit\r
+  ID:                     juce_gui_extra\r
+  vendor:                 juce\r
+  version:                7.0.2\r
+  name:                   JUCE extended GUI classes\r
+  description:            Miscellaneous GUI classes for specialised tasks.\r
+  website:                http://www.juce.com/juce\r
+  license:                GPL/Commercial\r
+  minimumCppStandard:     14\r
+\r
+  dependencies:           juce_gui_basics\r
+  OSXFrameworks:          WebKit\r
+  iOSFrameworks:          WebKit\r
+  WeakiOSFrameworks:      UserNotifications\r
+  WeakMacOSFrameworks:    UserNotifications\r
 \r
  END_JUCE_MODULE_DECLARATION\r
 \r
index 05c25dc7563ef83ebd88fd30316ac5956f61617e..ade2379dbe043d1ac290db6870182ee8f1ce5cc0 100644 (file)
 namespace juce\r
 {\r
 \r
-namespace PushNotificationsDelegateDetails\r
+struct PushNotificationsDelegateDetails\r
 {\r
     //==============================================================================\r
     using Action   = PushNotifications::Settings::Action;\r
     using Category = PushNotifications::Settings::Category;\r
 \r
-    void* actionToNSAction (const Action& a, bool iOSEarlierThan10)\r
+    static void* actionToNSAction (const Action& a)\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            auto action = [[UIMutableUserNotificationAction alloc] init];\r
-\r
-            action.identifier     = juceStringToNS (a.identifier);\r
-            action.title          = juceStringToNS (a.title);\r
-            action.behavior       = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput\r
-                                                            : UIUserNotificationActionBehaviorDefault;\r
-            action.parameters     = varObjectToNSDictionary (a.parameters);\r
-            action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground\r
-                                                          : UIUserNotificationActivationModeForeground;\r
-            action.destructive    = (bool) a.destructive;\r
-\r
-            [action autorelease];\r
-\r
-            return action;\r
-        }\r
-        else\r
-        {\r
-           #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
             if (a.style == Action::text)\r
             {\r
                 return [UNTextInputNotificationAction actionWithIdentifier: juceStringToNS (a.identifier)\r
@@ -66,42 +48,35 @@ namespace PushNotificationsDelegateDetails
             return [UNNotificationAction actionWithIdentifier: juceStringToNS (a.identifier)\r
                                                         title: juceStringToNS (a.title)\r
                                                       options: NSUInteger (a.destructive << 1 | (! a.triggerInBackground) << 2)];\r
-           #else\r
-            return nullptr;\r
-           #endif\r
         }\r
-    }\r
 \r
-    void* categoryToNSCategory (const Category& c, bool iOSEarlierThan10)\r
-    {\r
-        if (iOSEarlierThan10)\r
-        {\r
-            auto category = [[UIMutableUserNotificationCategory alloc] init];\r
-            category.identifier = juceStringToNS (c.identifier);\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+        auto action = [[UIMutableUserNotificationAction alloc] init];\r
 \r
-            auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+        action.identifier     = juceStringToNS (a.identifier);\r
+        action.title          = juceStringToNS (a.title);\r
+        action.behavior       = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput\r
+                                                        : UIUserNotificationActionBehaviorDefault;\r
+        action.parameters     = varObjectToNSDictionary (a.parameters);\r
+        action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground\r
+                                                      : UIUserNotificationActivationModeForeground;\r
+        action.destructive    = (bool) a.destructive;\r
 \r
-            for (const auto& a : c.actions)\r
-            {\r
-                auto* action = (UIUserNotificationAction*) actionToNSAction (a, iOSEarlierThan10);\r
-                [actions addObject: action];\r
-            }\r
-\r
-            [category setActions: actions forContext: UIUserNotificationActionContextDefault];\r
-            [category setActions: actions forContext: UIUserNotificationActionContextMinimal];\r
+        [action autorelease];\r
 \r
-            [category autorelease];\r
+        return action;\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+    }\r
 \r
-            return category;\r
-        }\r
-        else\r
+    static void* categoryToNSCategory (const Category& c)\r
+    {\r
+        if (@available (iOS 10, *))\r
         {\r
-           #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
             auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
 \r
             for (const auto& a : c.actions)\r
             {\r
-                auto* action = (UNNotificationAction*) actionToNSAction (a, iOSEarlierThan10);\r
+                auto* action = (UNNotificationAction*) actionToNSAction (a);\r
                 [actions addObject: action];\r
             }\r
 \r
@@ -109,14 +84,32 @@ namespace PushNotificationsDelegateDetails
                                                           actions: actions\r
                                                 intentIdentifiers: @[]\r
                                                           options: c.sendDismissAction ? UNNotificationCategoryOptionCustomDismissAction : 0];\r
-           #else\r
-            return nullptr;\r
-           #endif\r
         }\r
+\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+        auto category = [[UIMutableUserNotificationCategory alloc] init];\r
+        category.identifier = juceStringToNS (c.identifier);\r
+\r
+        auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+\r
+        for (const auto& a : c.actions)\r
+        {\r
+            auto* action = (UIUserNotificationAction*) actionToNSAction (a);\r
+            [actions addObject: action];\r
+        }\r
+\r
+        [category setActions: actions forContext: UIUserNotificationActionContextDefault];\r
+        [category setActions: actions forContext: UIUserNotificationActionContextMinimal];\r
+\r
+        [category autorelease];\r
+\r
+        return category;\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     //==============================================================================\r
-    UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+    static UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
     {\r
         auto notification = [[UILocalNotification alloc] init];\r
 \r
@@ -138,9 +131,9 @@ namespace PushNotificationsDelegateDetails
 \r
         return notification;\r
     }\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
+    static UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
     {\r
         // content\r
         auto content = [[UNMutableNotificationContent alloc] init];\r
@@ -183,9 +176,8 @@ namespace PushNotificationsDelegateDetails
 \r
         return request;\r
     }\r
-   #endif\r
 \r
-    String getUserResponseFromNSDictionary (NSDictionary* dictionary)\r
+    static String getUserResponseFromNSDictionary (NSDictionary* dictionary)\r
     {\r
         if (dictionary == nil || dictionary.count == 0)\r
             return {};\r
@@ -207,7 +199,7 @@ namespace PushNotificationsDelegateDetails
     }\r
 \r
     //==============================================================================\r
-    var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar)\r
+    static var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar)\r
     {\r
         DynamicObject* dictionaryVarObject = dictionaryVar.getDynamicObject();\r
 \r
@@ -232,8 +224,7 @@ namespace PushNotificationsDelegateDetails
     }\r
 \r
     //==============================================================================\r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t)\r
+    static double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t)\r
     {\r
         if (t != nil)\r
         {\r
@@ -254,7 +245,7 @@ namespace PushNotificationsDelegateDetails
         return 0.;\r
     }\r
 \r
-    PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r)\r
+    static PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r)\r
     {\r
         PushNotifications::Notification n;\r
 \r
@@ -283,13 +274,13 @@ namespace PushNotificationsDelegateDetails
         return n;\r
     }\r
 \r
-    PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n)\r
+    static PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n)\r
     {\r
         return unNotificationRequestToJuceNotification (n.request);\r
     }\r
-   #endif\r
 \r
-    PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n)\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+    static PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n)\r
     {\r
         PushNotifications::Notification notif;\r
 \r
@@ -312,7 +303,7 @@ namespace PushNotificationsDelegateDetails
         return notif;\r
     }\r
 \r
-    Action uiUserNotificationActionToAction (UIUserNotificationAction* a)\r
+    static Action uiUserNotificationActionToAction (UIUserNotificationAction* a)\r
     {\r
         Action action;\r
 \r
@@ -329,7 +320,7 @@ namespace PushNotificationsDelegateDetails
         return action;\r
     }\r
 \r
-    Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c)\r
+    static Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c)\r
     {\r
         Category category;\r
         category.identifier = nsStringToJuce (c.identifier);\r
@@ -339,9 +330,9 @@ namespace PushNotificationsDelegateDetails
 \r
         return category;\r
     }\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    Action unNotificationActionToAction (UNNotificationAction* a)\r
+    static Action unNotificationActionToAction (UNNotificationAction* a)\r
     {\r
         Action action;\r
 \r
@@ -366,7 +357,7 @@ namespace PushNotificationsDelegateDetails
         return action;\r
     }\r
 \r
-    Category unNotificationCategoryToCategory (UNNotificationCategory* c)\r
+    static Category unNotificationCategoryToCategory (UNNotificationCategory* c)\r
     {\r
         Category category;\r
 \r
@@ -378,9 +369,8 @@ namespace PushNotificationsDelegateDetails
 \r
         return category;\r
     }\r
-   #endif\r
 \r
-    PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary)\r
+    static PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary)\r
     {\r
         const var dictionaryVar = nsDictionaryToVar (dictionary);\r
 \r
@@ -411,175 +401,34 @@ namespace PushNotificationsDelegateDetails
 \r
         return notification;\r
     }\r
-}\r
-\r
-//==============================================================================\r
-struct PushNotificationsDelegate\r
-{\r
-    PushNotificationsDelegate() : delegate ([getClass().createInstance() init])\r
-    {\r
-        Class::setThis (delegate.get(), this);\r
-\r
-        id<UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];\r
-\r
-        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-        if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)])\r
-            [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()];\r
-        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-    }\r
-\r
-    virtual ~PushNotificationsDelegate() {}\r
-\r
-    virtual void didRegisterUserNotificationSettings (UIUserNotificationSettings* notificationSettings) = 0;\r
-\r
-    virtual void registeredForRemoteNotifications (NSData* deviceToken) = 0;\r
-\r
-    virtual void failedToRegisterForRemoteNotifications (NSError* error) = 0;\r
-\r
-    virtual void didReceiveRemoteNotification (NSDictionary* userInfo) = 0;\r
-\r
-    virtual void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo,\r
-                                                                     void (^completionHandler)(UIBackgroundFetchResult result)) = 0;\r
-\r
-    virtual void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier,\r
-                                                                     NSDictionary* userInfo,\r
-                                                                     NSDictionary* responseInfo,\r
-                                                                     void (^completionHandler)()) = 0;\r
-\r
-    virtual void didReceiveLocalNotification (UILocalNotification* notification) = 0;\r
-\r
-    virtual void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier,\r
-                                                                    UILocalNotification* notification,\r
-                                                                    void (^completionHandler)()) = 0;\r
-\r
-    virtual void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier,\r
-                                                                                UILocalNotification* notification,\r
-                                                                                NSDictionary* responseInfo,\r
-                                                                                void (^completionHandler)()) = 0;\r
-\r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    virtual void willPresentNotificationWithCompletionHandler (UNNotification* notification,\r
-                                                               void (^completionHandler)(UNNotificationPresentationOptions options)) = 0;\r
-\r
-    virtual void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response,\r
-                                                                      void (^completionHandler)()) = 0;\r
-   #endif\r
-\r
-protected:\r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    NSUniquePtr<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> delegate;\r
-   #else\r
-    NSUniquePtr<NSObject<UIApplicationDelegate>> delegate;\r
-   #endif\r
 \r
 private:\r
-    //==============================================================================\r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-    struct Class    : public ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>>\r
-    {\r
-        Class() : ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> ("JucePushNotificationsDelegate_")\r
-   #else\r
-    struct Class    : public ObjCClass<NSObject<UIApplicationDelegate>>\r
-    {\r
-        Class() : ObjCClass<NSObject<UIApplicationDelegate>> ("JucePushNotificationsDelegate_")\r
-   #endif\r
-        {\r
-            addIvar<PushNotificationsDelegate*> ("self");\r
-\r
-            addMethod (@selector (application:didRegisterUserNotificationSettings:),                                                 didRegisterUserNotificationSettings);\r
-            addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:),                                    registeredForRemoteNotifications);\r
-            addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:),                                    failedToRegisterForRemoteNotifications);\r
-            addMethod (@selector (application:didReceiveRemoteNotification:),                                                        didReceiveRemoteNotification);\r
-            addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:),                                 didReceiveRemoteNotificationFetchCompletionHandler);\r
-            addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), handleActionForRemoteNotificationCompletionHandler);\r
-            addMethod (@selector (application:didReceiveLocalNotification:),                                                         didReceiveLocalNotification);\r
-            addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:),                   handleActionForLocalNotificationCompletionHandler);\r
-            addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:),  handleActionForLocalNotificationWithResponseCompletionHandler);\r
-\r
-           #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-            addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:),                            willPresentNotificationWithCompletionHandler);\r
-            addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:),                     didReceiveNotificationResponseWithCompletionHandler);\r
-           #endif\r
-\r
-            registerClass();\r
-        }\r
-\r
-        //==============================================================================\r
-        static PushNotificationsDelegate& getThis (id self)         { return *getIvar<PushNotificationsDelegate*> (self, "self"); }\r
-        static void setThis (id self, PushNotificationsDelegate* d) { object_setInstanceVariable (self, "self", d); }\r
-\r
-        //==============================================================================\r
-        static void didRegisterUserNotificationSettings                           (id self, SEL, UIApplication*,\r
-                                                                                   UIUserNotificationSettings* settings)                        { getThis (self).didRegisterUserNotificationSettings (settings); }\r
-        static void registeredForRemoteNotifications                              (id self, SEL, UIApplication*,\r
-                                                                                   NSData* deviceToken)                                         { getThis (self).registeredForRemoteNotifications (deviceToken); }\r
-\r
-        static void failedToRegisterForRemoteNotifications                        (id self, SEL, UIApplication*,\r
-                                                                                   NSError* error)                                              { getThis (self).failedToRegisterForRemoteNotifications (error); }\r
-\r
-        static void didReceiveRemoteNotification                                  (id self, SEL, UIApplication*,\r
-                                                                                   NSDictionary* userInfo)                                      { getThis (self).didReceiveRemoteNotification (userInfo); }\r
-\r
-        static void didReceiveRemoteNotificationFetchCompletionHandler            (id self, SEL, UIApplication*,\r
-                                                                                   NSDictionary* userInfo,\r
-                                                                                   void (^completionHandler)(UIBackgroundFetchResult result))   { getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler); }\r
-\r
-        static void handleActionForRemoteNotificationCompletionHandler            (id self, SEL, UIApplication*,\r
-                                                                                   NSString* actionIdentifier,\r
-                                                                                   NSDictionary* userInfo,\r
-                                                                                   NSDictionary* responseInfo,\r
-                                                                                   void (^completionHandler)())                                 { getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler); }\r
-\r
-        static void didReceiveLocalNotification                                   (id self, SEL, UIApplication*,\r
-                                                                                   UILocalNotification* notification)                           { getThis (self).didReceiveLocalNotification (notification); }\r
-\r
-        static void handleActionForLocalNotificationCompletionHandler             (id self, SEL, UIApplication*,\r
-                                                                                   NSString* actionIdentifier,\r
-                                                                                   UILocalNotification* notification,\r
-                                                                                   void (^completionHandler)())                                 { getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler); }\r
-\r
-        static void handleActionForLocalNotificationWithResponseCompletionHandler (id self, SEL, UIApplication*,\r
-                                                                                   NSString* actionIdentifier,\r
-                                                                                   UILocalNotification* notification,\r
-                                                                                   NSDictionary* responseInfo,\r
-                                                                                   void (^completionHandler)())                                 { getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler); }\r
-\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        static void willPresentNotificationWithCompletionHandler        (id self, SEL, UNUserNotificationCenter*,\r
-                                                                         UNNotification* notification,\r
-                                                                         void (^completionHandler)(UNNotificationPresentationOptions options))  { getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler); }\r
-\r
-        static void didReceiveNotificationResponseWithCompletionHandler (id self, SEL, UNUserNotificationCenter*,\r
-                                                                         UNNotificationResponse* response,\r
-                                                                         void (^completionHandler)())                                           { getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler); }\r
-       #endif\r
-    };\r
-\r
-    //==============================================================================\r
-    static Class& getClass()\r
-    {\r
-        static Class c;\r
-        return c;\r
-    }\r
+    ~PushNotificationsDelegateDetails() = delete;\r
 };\r
 \r
 //==============================================================================\r
 bool PushNotifications::Notification::isValid() const noexcept\r
 {\r
-    const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max;\r
+    if (@available (iOS 10, *))\r
+        return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty();\r
 \r
-    if (iOSEarlierThan10)\r
-        return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty();\r
-\r
-    return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty();\r
+    return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty();\r
 }\r
 \r
 //==============================================================================\r
-struct PushNotifications::Pimpl : private PushNotificationsDelegate\r
+struct PushNotifications::Pimpl\r
 {\r
     Pimpl (PushNotifications& p)\r
         : owner (p)\r
     {\r
+        Class::setThis (delegate.get(), this);\r
+\r
+        auto appDelegate = [[UIApplication sharedApplication] delegate];\r
+\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+        if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)])\r
+            [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     void requestPermissionsWithSettings (const PushNotifications::Settings& settingsToUse)\r
@@ -588,27 +437,11 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
 \r
         auto categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
 \r
-        if (iOSEarlierThan10)\r
-        {\r
-            for (const auto& c : settings.categories)\r
-            {\r
-                auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10);\r
-                [categories addObject: category];\r
-            }\r
-\r
-            UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0\r
-                                                    | (bool)settings.allowSound << 1\r
-                                                    | (bool)settings.allowAlert << 2);\r
-\r
-            UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories];\r
-            [[UIApplication sharedApplication] registerUserNotificationSettings: s];\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
+        if (@available (iOS 10, *))\r
         {\r
             for (const auto& c : settings.categories)\r
             {\r
-                auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10);\r
+                auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c);\r
                 [categories addObject: category];\r
             }\r
 \r
@@ -623,30 +456,33 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
                                                                                                        requestSettingsUsed();\r
                                                                                                    }];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            for (const auto& c : settings.categories)\r
+            {\r
+                auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c);\r
+                [categories addObject: category];\r
+            }\r
+\r
+            UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0\r
+                                                    | (bool)settings.allowSound << 1\r
+                                                    | (bool)settings.allowAlert << 2);\r
+\r
+            UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories];\r
+            [[UIApplication sharedApplication] registerUserNotificationSettings: s];\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
 \r
         [[UIApplication sharedApplication] registerForRemoteNotifications];\r
     }\r
 \r
     void requestSettingsUsed()\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings;\r
-\r
-            settings.allowBadge = s.types & UIUserNotificationTypeBadge;\r
-            settings.allowSound = s.types & UIUserNotificationTypeSound;\r
-            settings.allowAlert = s.types & UIUserNotificationTypeAlert;\r
-\r
-            for (UIUserNotificationCategory *c in s.categories)\r
-                settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c));\r
-\r
-            owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); });\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
-        {\r
-\r
             [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:\r
              ^(UNNotificationSettings* s)\r
              {\r
@@ -666,24 +502,31 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
 \r
              }];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings;\r
+\r
+            settings.allowBadge = s.types & UIUserNotificationTypeBadge;\r
+            settings.allowSound = s.types & UIUserNotificationTypeSound;\r
+            settings.allowAlert = s.types & UIUserNotificationTypeAlert;\r
+\r
+            for (UIUserNotificationCategory *c in s.categories)\r
+                settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c));\r
+\r
+            owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); });\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
     }\r
 \r
     bool areNotificationsEnabled() const { return true; }\r
 \r
     void sendLocalNotification (const Notification& n)\r
     {\r
-        if (iOSEarlierThan10)\r
-        {\r
-            auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n);\r
-\r
-            [[UIApplication sharedApplication] scheduleLocalNotification: notification];\r
-            [notification release];\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
+        if (@available (iOS 10, *))\r
         {\r
-\r
             UNNotificationRequest* request = PushNotificationsDelegateDetails::juceNotificationToUNNotificationRequest (n);\r
 \r
             [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest: request\r
@@ -695,19 +538,22 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
                                                                                                   NSLog (nsStringLiteral ("addNotificationRequest error: %@"), error);\r
                                                                                           }];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n);\r
+\r
+            [[UIApplication sharedApplication] scheduleLocalNotification: notification];\r
+            [notification release];\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
     }\r
 \r
     void getDeliveredNotifications() const\r
     {\r
-        if (iOSEarlierThan10)\r
-        {\r
-            // Not supported on this platform\r
-            jassertfalse;\r
-            owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); });\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
+        if (@available (iOS 10, *))\r
         {\r
             [[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:\r
              ^(NSArray<UNNotification*>* notifications)\r
@@ -720,42 +566,42 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
                 owner.listeners.call ([&] (Listener& l) { l.deliveredNotificationsListReceived (notifs); });\r
              }];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            // Not supported on this platform\r
+            jassertfalse;\r
+            owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); });\r
+        }\r
     }\r
 \r
     void removeAllDeliveredNotifications()\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            // Not supported on this platform\r
-            jassertfalse;\r
+            [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];\r
         }\r
         else\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
         {\r
-\r
-            [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];\r
+            // Not supported on this platform\r
+            jassertfalse;\r
         }\r
-       #endif\r
     }\r
 \r
     void removeDeliveredNotification (const String& identifier)\r
     {\r
-        if (iOSEarlierThan10)\r
-        {\r
-            ignoreUnused (identifier);\r
-            // Not supported on this platform\r
-            jassertfalse;\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
+        if (@available (iOS 10, *))\r
         {\r
 \r
             NSArray<NSString*>* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)];\r
 \r
             [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers: identifiers];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            ignoreUnused (identifier);\r
+            // Not supported on this platform\r
+            jassertfalse;\r
+        }\r
     }\r
 \r
     void setupChannels (const Array<ChannelGroup>& groups, const Array<Channel>& channels)\r
@@ -765,19 +611,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
 \r
     void getPendingLocalNotifications() const\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            Array<PushNotifications::Notification> notifs;\r
-\r
-            for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications)\r
-                notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n));\r
-\r
-            owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); });\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
-        {\r
-\r
             [[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:\r
              ^(NSArray<UNNotificationRequest*>* requests)\r
              {\r
@@ -790,39 +625,50 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
              }\r
             ];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            Array<PushNotifications::Notification> notifs;\r
+\r
+            for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications)\r
+                notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n));\r
+\r
+            owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); });\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
     }\r
 \r
     void removePendingLocalNotification (const String& identifier)\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            // Not supported on this platform\r
-            jassertfalse;\r
-        }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-        else\r
-        {\r
-\r
             NSArray<NSString*>* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)];\r
 \r
             [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers: identifiers];\r
         }\r
-       #endif\r
+        else\r
+        {\r
+            // Not supported on this platform\r
+            jassertfalse;\r
+        }\r
     }\r
 \r
     void removeAllPendingLocalNotifications()\r
     {\r
-        if (iOSEarlierThan10)\r
+        if (@available (iOS 10, *))\r
         {\r
-            [[UIApplication sharedApplication] cancelAllLocalNotifications];\r
+            [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];\r
         }\r
-       #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
         else\r
         {\r
-            [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            [[UIApplication sharedApplication] cancelAllLocalNotifications];\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
         }\r
-       #endif\r
     }\r
 \r
     String getDeviceToken()\r
@@ -833,14 +679,23 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         return deviceToken;\r
     }\r
 \r
-    //==============================================================================\r
-    //PushNotificationsDelegate\r
-    void didRegisterUserNotificationSettings (UIUserNotificationSettings*) override\r
+    void subscribeToTopic (const String& topic)     { ignoreUnused (topic); }\r
+    void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+\r
+    void sendUpstreamMessage (const String& serverSenderId,\r
+                              const String& collapseKey,\r
+                              const String& messageId,\r
+                              const String& messageType,\r
+                              int timeToLive,\r
+                              const StringPairArray& additionalData)\r
     {\r
-        requestSettingsUsed();\r
+        ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
+        ignoreUnused (timeToLive, additionalData);\r
     }\r
 \r
-    void registeredForRemoteNotifications (NSData* deviceTokenToUse) override\r
+private:\r
+    //==============================================================================\r
+    void registeredForRemoteNotifications (NSData* deviceTokenToUse)\r
     {\r
         deviceToken = [deviceTokenToUse]() -> String\r
         {\r
@@ -864,14 +719,14 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); });\r
     }\r
 \r
-    void failedToRegisterForRemoteNotifications (NSError* error) override\r
+    void failedToRegisterForRemoteNotifications (NSError* error)\r
     {\r
         ignoreUnused (error);\r
 \r
         deviceToken.clear();\r
     }\r
 \r
-    void didReceiveRemoteNotification (NSDictionary* userInfo) override\r
+    void didReceiveRemoteNotification (NSDictionary* userInfo)\r
     {\r
         auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo);\r
 \r
@@ -879,7 +734,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     }\r
 \r
     void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo,\r
-                                                             void (^completionHandler)(UIBackgroundFetchResult result)) override\r
+                                                             void (^completionHandler)(UIBackgroundFetchResult result))\r
     {\r
         didReceiveRemoteNotification (userInfo);\r
         completionHandler (UIBackgroundFetchResultNewData);\r
@@ -888,7 +743,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier,\r
                                                              NSDictionary* userInfo,\r
                                                              NSDictionary* responseInfo,\r
-                                                             void (^completionHandler)()) override\r
+                                                             void (^completionHandler)())\r
     {\r
         auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo);\r
         auto actionString = nsStringToJuce (actionIdentifier);\r
@@ -899,7 +754,14 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         completionHandler();\r
     }\r
 \r
-    void didReceiveLocalNotification (UILocalNotification* notification) override\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+    void didRegisterUserNotificationSettings (UIUserNotificationSettings*)\r
+    {\r
+        requestSettingsUsed();\r
+    }\r
+\r
+    void didReceiveLocalNotification (UILocalNotification* notification)\r
     {\r
         auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification);\r
 \r
@@ -908,7 +770,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
 \r
     void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier,\r
                                                             UILocalNotification* notification,\r
-                                                            void (^completionHandler)()) override\r
+                                                            void (^completionHandler)())\r
     {\r
         handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier,\r
                                                                        notification,\r
@@ -919,7 +781,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier,\r
                                                                         UILocalNotification* notification,\r
                                                                         NSDictionary* responseInfo,\r
-                                                                        void (^completionHandler)()) override\r
+                                                                        void (^completionHandler)())\r
     {\r
         auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification);\r
         auto actionString = nsStringToJuce (actionIdentifier);\r
@@ -930,9 +792,10 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         completionHandler();\r
     }\r
 \r
-   #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
     void willPresentNotificationWithCompletionHandler (UNNotification* notification,\r
-                                                       void (^completionHandler)(UNNotificationPresentationOptions options)) override\r
+                                                       void (^completionHandler)(UNNotificationPresentationOptions options))\r
     {\r
         NSUInteger options = NSUInteger ((int)settings.allowBadge << 0\r
                                        | (int)settings.allowSound << 1\r
@@ -944,7 +807,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     }\r
 \r
     void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response,\r
-                                                              void (^completionHandler)()) override\r
+                                                              void (^completionHandler)())\r
     {\r
         const bool remote = [response.notification.request.trigger isKindOfClass: [UNPushNotificationTrigger class]];\r
 \r
@@ -968,26 +831,92 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         owner.listeners.call ([&] (Listener& l) { l.handleNotificationAction (! remote, n, actionString, responseString); });\r
         completionHandler();\r
     }\r
-   #endif\r
 \r
-    void subscribeToTopic (const String& topic)     { ignoreUnused (topic); }\r
-    void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+    //==============================================================================\r
+    struct Class    : public ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>>\r
+    {\r
+        Class()\r
+            : ObjCClass ("JucePushNotificationsDelegate_")\r
+        {\r
+            addIvar<Pimpl*> ("self");\r
 \r
-    void sendUpstreamMessage (const String& serverSenderId,\r
-                              const String& collapseKey,\r
-                              const String& messageId,\r
-                              const String& messageType,\r
-                              int timeToLive,\r
-                              const StringPairArray& additionalData)\r
+            addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), [] (id self, SEL, UIApplication*, NSData* data)\r
+            {\r
+                getThis (self).registeredForRemoteNotifications (data);\r
+            });\r
+\r
+            addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), [] (id self, SEL, UIApplication*, NSError* error)\r
+            {\r
+                getThis (self).failedToRegisterForRemoteNotifications (error);\r
+            });\r
+\r
+            addMethod (@selector (application:didReceiveRemoteNotification:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo)\r
+            {\r
+                getThis (self).didReceiveRemoteNotification (userInfo);\r
+            });\r
+\r
+            addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo, void (^completionHandler)(UIBackgroundFetchResult result))\r
+            {\r
+                getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler);\r
+            });\r
+\r
+            addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, NSDictionary* userInfo, NSDictionary* responseInfo, void (^completionHandler)())\r
+            {\r
+                getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler);\r
+            });\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+            addMethod (@selector (application:didRegisterUserNotificationSettings:), [] (id self, SEL, UIApplication*, UIUserNotificationSettings* settingsToUse)\r
+            {\r
+                getThis (self).didRegisterUserNotificationSettings (settingsToUse);\r
+            });\r
+\r
+            addMethod (@selector (application:didReceiveLocalNotification:), [] (id self, SEL, UIApplication*, UILocalNotification* notification)\r
+            {\r
+                getThis (self).didReceiveLocalNotification (notification);\r
+            });\r
+\r
+            addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, void (^completionHandler)())\r
+            {\r
+                getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler);\r
+            });\r
+\r
+            addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, NSDictionary* responseInfo, void (^completionHandler)())\r
+            {\r
+                getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler);\r
+            });\r
+\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+            addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotification* notification, void (^completionHandler)(UNNotificationPresentationOptions options))\r
+            {\r
+                getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler);\r
+            });\r
+\r
+            addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotificationResponse* response, void (^completionHandler)())\r
+            {\r
+                getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler);\r
+            });\r
+\r
+            registerClass();\r
+        }\r
+\r
+        //==============================================================================\r
+        static Pimpl& getThis (id self)         { return *getIvar<Pimpl*> (self, "self"); }\r
+        static void setThis (id self, Pimpl* d) { object_setInstanceVariable (self, "self", d); }\r
+    };\r
+\r
+    //==============================================================================\r
+    static Class& getClass()\r
     {\r
-        ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
-        ignoreUnused (timeToLive, additionalData);\r
+        static Class c;\r
+        return c;\r
     }\r
 \r
-private:\r
-    PushNotifications& owner;\r
+    NSUniquePtr<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> delegate { [getClass().createInstance() init] };\r
 \r
-    const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max;\r
+    PushNotifications& owner;\r
 \r
     bool initialised = false;\r
     String deviceToken;\r
index 57e7dec826db62c9549f9e50e1f826d1310bb4dc..308694571d3733ac2b599812f59b14bb0eb886fe 100644 (file)
@@ -781,11 +781,11 @@ private:
 \r
             argv[4] = nullptr;\r
 \r
-           #if JUCE_STANDALONE_APPLICATION\r
-            execv (arguments[0].toRawUTF8(), (char**) argv.getData());\r
-           #else\r
-            juce_gtkWebkitMain (4, (const char**) argv.getData());\r
-           #endif\r
+            if (JUCEApplicationBase::isStandaloneApp())\r
+                execv (arguments[0].toRawUTF8(), (char**) argv.getData());\r
+            else\r
+                juce_gtkWebkitMain (4, (const char**) argv.getData());\r
+\r
             exit (0);\r
         }\r
 \r
index fb90508f28006a8c5da150e6f2a992b82fe394b6..a59b3329028e34bbec64fec218e2cfd42988b68d 100644 (file)
@@ -105,11 +105,7 @@ struct API_AVAILABLE (macos (10.10)) ButtonBasedStatusItem : public StatusItemCo
         button.image = statusIcon.get();\r
         button.target = eventForwarder.get();\r
         button.action = @selector (handleEvent:);\r
-       #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
         [button sendActionOn: NSEventMaskLeftMouseDown | NSEventMaskRightMouseDown | NSEventMaskScrollWheel];\r
-       #else\r
-        [button sendActionOn: NSLeftMouseDownMask | NSRightMouseDownMask | NSScrollWheelMask];\r
-       #endif\r
     }\r
 \r
     ~ButtonBasedStatusItem() override\r
index 6f4c5b20b2b72b9db30710e8c0f1c4dfebb6f407..8f3c3701bd4f71b9c5beb2f937e50e71bbc4ab80 100644 (file)
 namespace juce\r
 {\r
 \r
-#if JUCE_MAC && defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- #define WKWEBVIEW_OPENPANEL_SUPPORTED 1\r
-#endif\r
-\r
 static NSURL* appendParametersToFileURL (const URL& url, NSURL* fileUrl)\r
 {\r
     if (@available (macOS 10.10, *))\r
@@ -117,60 +113,119 @@ struct WebViewKeyEquivalentResponder : public ObjCClass<WebViewClass>
     WebViewKeyEquivalentResponder()\r
         : ObjCClass<WebViewClass> ("WebViewKeyEquivalentResponder_")\r
     {\r
-        ObjCClass<WebViewClass>::addMethod (@selector (performKeyEquivalent:), performKeyEquivalent);\r
-        ObjCClass<WebViewClass>::registerClass();\r
-    }\r
-\r
-private:\r
-    static BOOL performKeyEquivalent (id self, SEL selector, NSEvent* event)\r
-    {\r
-        const auto isCommandDown = [event]\r
-        {\r
-            const auto modifierFlags = [event modifierFlags];\r
-\r
-           #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
-            if (@available (macOS 10.12, *))\r
-                return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand;\r
-           #endif\r
-\r
-            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
-            return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask;\r
-            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-        }();\r
-\r
-        if (isCommandDown)\r
-        {\r
-            auto sendAction = [&] (SEL actionSelector) -> BOOL\r
-            {\r
-                return [NSApp sendAction: actionSelector\r
-                                      to: [[self window] firstResponder]\r
-                                    from: self];\r
-            };\r
-\r
-            if ([[event charactersIgnoringModifiers] isEqualToString: @"x"])  return sendAction (@selector (cut:));\r
-            if ([[event charactersIgnoringModifiers] isEqualToString: @"c"])  return sendAction (@selector (copy:));\r
-            if ([[event charactersIgnoringModifiers] isEqualToString: @"v"])  return sendAction (@selector (paste:));\r
-            if ([[event charactersIgnoringModifiers] isEqualToString: @"a"])  return sendAction (@selector (selectAll:));\r
-        }\r
-\r
-        return ObjCClass<WebViewClass>::template sendSuperclassMessage<BOOL> (self, selector, event);\r
+        this->addMethod (@selector (performKeyEquivalent:),\r
+                         [] (id self, SEL selector, NSEvent* event)\r
+                         {\r
+                             const auto isCommandDown = [event]\r
+                             {\r
+                                 const auto modifierFlags = [event modifierFlags];\r
+\r
+                                 if (@available (macOS 10.12, *))\r
+                                     return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand;\r
+\r
+                                 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+                                 return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask;\r
+                                 JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+                             }();\r
+\r
+                             if (isCommandDown)\r
+                             {\r
+                                 auto sendAction = [&] (SEL actionSelector) -> BOOL\r
+                                 {\r
+                                     return [NSApp sendAction:actionSelector\r
+                                                           to:[[self window] firstResponder]\r
+                                                         from:self];\r
+                                 };\r
+\r
+                                 if ([[event charactersIgnoringModifiers] isEqualToString:@"x"])\r
+                                     return sendAction (@selector (cut:));\r
+                                 if ([[event charactersIgnoringModifiers] isEqualToString:@"c"])\r
+                                     return sendAction (@selector (copy:));\r
+                                 if ([[event charactersIgnoringModifiers] isEqualToString:@"v"])\r
+                                     return sendAction (@selector (paste:));\r
+                                 if ([[event charactersIgnoringModifiers] isEqualToString:@"a"])\r
+                                     return sendAction (@selector (selectAll:));\r
+                             }\r
+\r
+                             return ObjCClass<WebViewClass>::template sendSuperclassMessage<BOOL> (self, selector, event);\r
+                         });\r
+        this->registerClass();\r
     }\r
 };\r
 \r
 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
 struct DownloadClickDetectorClass  : public ObjCClass<NSObject>\r
 {\r
-    DownloadClickDetectorClass()  : ObjCClass<NSObject> ("JUCEWebClickDetector_")\r
+    DownloadClickDetectorClass()  : ObjCClass ("JUCEWebClickDetector_")\r
     {\r
         addIvar<WebBrowserComponent*> ("owner");\r
 \r
-        addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:), decidePolicyForNavigationAction);\r
-        addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), decidePolicyForNewWindowAction);\r
-        addMethod (@selector (webView:didFinishLoadForFrame:), didFinishLoadForFrame);\r
-        addMethod (@selector (webView:didFailLoadWithError:forFrame:),  didFailLoadWithError);\r
-        addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:),  didFailLoadWithError);\r
-        addMethod (@selector (webView:willCloseFrame:), willCloseFrame);\r
-        addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:), runOpenPanel);\r
+        addMethod (@selector (webView:didFailLoadWithError:forFrame:),            didFailLoadWithError);\r
+        addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:), didFailLoadWithError);\r
+\r
+        addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:),\r
+                   [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, WebFrame*, id<WebPolicyDecisionListener> listener)\r
+                   {\r
+                       if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation)))\r
+                           [listener use];\r
+                       else\r
+                           [listener ignore];\r
+                   });\r
+\r
+        addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:),\r
+                   [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, NSString*, id<WebPolicyDecisionListener> listener)\r
+                   {\r
+                       getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation));\r
+                       [listener ignore];\r
+                   });\r
+\r
+        addMethod (@selector (webView:didFinishLoadForFrame:),\r
+                   [] (id self, SEL, WebView* sender, WebFrame* frame)\r
+                   {\r
+                       if ([frame isEqual:[sender mainFrame]])\r
+                       {\r
+                           NSURL* url = [[[frame dataSource] request] URL];\r
+                           getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString]));\r
+                       }\r
+                   });\r
+\r
+        addMethod (@selector (webView:willCloseFrame:),\r
+                   [] (id self, SEL, WebView*, WebFrame*)\r
+                   {\r
+                       getOwner (self)->windowCloseRequest();\r
+                   });\r
+\r
+        addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:),\r
+                   [] (id, SEL, WebView*, id<WebOpenPanelResultListener> resultListener, BOOL allowMultipleFiles)\r
+                   {\r
+                       struct DeletedFileChooserWrapper : private DeletedAtShutdown\r
+                       {\r
+                           DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, id<WebOpenPanelResultListener> rl)\r
+                               : chooser (std::move (fc)), listener (rl)\r
+                           {\r
+                               [listener.get() retain];\r
+                           }\r
+\r
+                           std::unique_ptr<FileChooser> chooser;\r
+                           ObjCObjectHandle<id<WebOpenPanelResultListener>> listener;\r
+                       };\r
+\r
+                       auto chooser = std::make_unique<FileChooser> (TRANS ("Select the file you want to upload..."),\r
+                                                                     File::getSpecialLocation (File::userHomeDirectory),\r
+                                                                     "*");\r
+                       auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener);\r
+\r
+                       auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
+                                    | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0);\r
+\r
+                       wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
+                       {\r
+                           for (auto& f : wrapper->chooser->getResults())\r
+                               [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())];\r
+\r
+                           delete wrapper;\r
+                       });\r
+                   });\r
 \r
         registerClass();\r
     }\r
@@ -187,31 +242,6 @@ private:
         return {};\r
     }\r
 \r
-    static void decidePolicyForNavigationAction (id self, SEL, WebView*, NSDictionary* actionInformation,\r
-                                                 NSURLRequest*, WebFrame*, id<WebPolicyDecisionListener> listener)\r
-    {\r
-        if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation)))\r
-            [listener use];\r
-        else\r
-            [listener ignore];\r
-    }\r
-\r
-    static void decidePolicyForNewWindowAction (id self, SEL, WebView*, NSDictionary* actionInformation,\r
-                                                NSURLRequest*, NSString*, id<WebPolicyDecisionListener> listener)\r
-    {\r
-        getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation));\r
-        [listener ignore];\r
-    }\r
-\r
-    static void didFinishLoadForFrame (id self, SEL, WebView* sender, WebFrame* frame)\r
-    {\r
-        if ([frame isEqual: [sender mainFrame]])\r
-        {\r
-            NSURL* url = [[[frame dataSource] request] URL];\r
-            getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString]));\r
-        }\r
-    }\r
-\r
     static void didFailLoadWithError (id self, SEL, WebView* sender, NSError* error, WebFrame* frame)\r
     {\r
         if ([frame isEqual: [sender mainFrame]] && error != nullptr && [error code] != NSURLErrorCancelled)\r
@@ -224,63 +254,123 @@ private:
                 getOwner (self)->goToURL ("data:text/plain;charset=UTF-8," + errorString);\r
         }\r
     }\r
-\r
-    static void willCloseFrame (id self, SEL, WebView*, WebFrame*)\r
-    {\r
-        getOwner (self)->windowCloseRequest();\r
-    }\r
-\r
-    static void runOpenPanel (id, SEL, WebView*, id<WebOpenPanelResultListener> resultListener, BOOL allowMultipleFiles)\r
-    {\r
-        struct DeletedFileChooserWrapper   : private DeletedAtShutdown\r
-        {\r
-            DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, id<WebOpenPanelResultListener> rl)\r
-                : chooser (std::move (fc)), listener (rl)\r
-            {\r
-                [listener.get() retain];\r
-            }\r
-\r
-            std::unique_ptr<FileChooser> chooser;\r
-            ObjCObjectHandle<id<WebOpenPanelResultListener>> listener;\r
-        };\r
-\r
-        auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
-                                                      File::getSpecialLocation (File::userHomeDirectory), "*");\r
-        auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener);\r
-\r
-        auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
-                    | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0);\r
-\r
-        wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
-        {\r
-            for (auto& f : wrapper->chooser->getResults())\r
-                [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())];\r
-\r
-            delete wrapper;\r
-        });\r
-    }\r
 };\r
 JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 #endif\r
 \r
 struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass  : public ObjCClass<NSObject>\r
 {\r
-    WebViewDelegateClass()  : ObjCClass<NSObject> ("JUCEWebViewDelegate_")\r
+    WebViewDelegateClass()  : ObjCClass ("JUCEWebViewDelegate_")\r
     {\r
         addIvar<WebBrowserComponent*> ("owner");\r
 \r
-        addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:),  decidePolicyForNavigationAction);\r
-        addMethod (@selector (webView:didFinishNavigation:),                              didFinishNavigation);\r
-        addMethod (@selector (webView:didFailNavigation:withError:),                      didFailNavigation);\r
-        addMethod (@selector (webView:didFailProvisionalNavigation:withError:),           didFailProvisionalNavigation);\r
-        addMethod (@selector (webViewDidClose:),                                          webViewDidClose);\r
-        addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:\r
-                              windowFeatures:),                                           createWebView);\r
+        addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:),\r
+                   [] (id self, SEL, WKWebView*, WKNavigationAction* navigationAction, void (^decisionHandler) (WKNavigationActionPolicy))\r
+                   {\r
+                       if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])))\r
+                           decisionHandler (WKNavigationActionPolicyAllow);\r
+                       else\r
+                           decisionHandler (WKNavigationActionPolicyCancel);\r
+                   });\r
+\r
+        addMethod (@selector (webView:didFinishNavigation:),\r
+                   [] (id self, SEL, WKWebView* webview, WKNavigation*)\r
+                   {\r
+                       getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString]));\r
+                   });\r
+\r
+        addMethod (@selector (webView:didFailNavigation:withError:),\r
+                   [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
+                   {\r
+                       displayError (getOwner (self), error);\r
+                   });\r
+\r
+        addMethod (@selector (webView:didFailProvisionalNavigation:withError:),\r
+                   [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
+                   {\r
+                       displayError (getOwner (self), error);\r
+                   });\r
+\r
+        addMethod (@selector (webViewDidClose:),\r
+                   [] (id self, SEL, WKWebView*)\r
+                   {\r
+                       getOwner (self)->windowCloseRequest();\r
+                   });\r
+\r
+        addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:),\r
+                   [] (id self, SEL, WKWebView*, WKWebViewConfiguration*, WKNavigationAction* navigationAction, WKWindowFeatures*)\r
+                   {\r
+                       getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]));\r
+                       return nil;\r
+                   });\r
 \r
-       #if WKWEBVIEW_OPENPANEL_SUPPORTED\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         if (@available (macOS 10.12, *))\r
-            addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:), runOpenPanel);\r
-       #endif\r
+        {\r
+            addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:),\r
+                       [] (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, void (^completionHandler)(NSArray<NSURL*>*))\r
+                       {\r
+                           using CompletionHandlerType = decltype (completionHandler);\r
+\r
+                           class DeletedFileChooserWrapper   : private DeletedAtShutdown\r
+                           {\r
+                           public:\r
+                               DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, CompletionHandlerType h)\r
+                                   : chooser (std::move (fc)), handler (h)\r
+                               {\r
+                                   [handler.get() retain];\r
+                               }\r
+\r
+                               ~DeletedFileChooserWrapper()\r
+                               {\r
+                                   callHandler (nullptr);\r
+                               }\r
+\r
+                               void callHandler (NSArray<NSURL*>* urls)\r
+                               {\r
+                                   if (handlerCalled)\r
+                                       return;\r
+\r
+                                   handler.get() (urls);\r
+                                   handlerCalled = true;\r
+                               }\r
+\r
+                               std::unique_ptr<FileChooser> chooser;\r
+\r
+                           private:\r
+                               ObjCObjectHandle<CompletionHandlerType> handler;\r
+                               bool handlerCalled = false;\r
+                           };\r
+\r
+                           auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
+                                                                         File::getSpecialLocation (File::userHomeDirectory), "*");\r
+                           auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler);\r
+\r
+                           auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
+                                        | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0);\r
+\r
+                          #if JUCE_MAC\r
+                           if (@available (macOS 10.14, *))\r
+                           {\r
+                               if ([parameters allowsDirectories])\r
+                                   flags |= FileBrowserComponent::canSelectDirectories;\r
+                           }\r
+                          #endif\r
+\r
+                           wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
+                           {\r
+                               auto results = wrapper->chooser->getResults();\r
+                               auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()];\r
+\r
+                               for (auto& f : results)\r
+                                   [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]];\r
+\r
+                               wrapper->callHandler (urls);\r
+                               delete wrapper;\r
+                           });\r
+                       });\r
+        }\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
         registerClass();\r
     }\r
@@ -289,20 +379,6 @@ struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass  : public ObjCClass<NS
     static WebBrowserComponent* getOwner (id self)               { return getIvar<WebBrowserComponent*> (self, "owner"); }\r
 \r
 private:\r
-    static void decidePolicyForNavigationAction (id self, SEL, WKWebView*, WKNavigationAction* navigationAction,\r
-                                                 void (^decisionHandler)(WKNavigationActionPolicy))\r
-    {\r
-        if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])))\r
-            decisionHandler (WKNavigationActionPolicyAllow);\r
-        else\r
-            decisionHandler (WKNavigationActionPolicyCancel);\r
-    }\r
-\r
-    static void didFinishNavigation (id self, SEL, WKWebView* webview, WKNavigation*)\r
-    {\r
-        getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString]));\r
-    }\r
-\r
     static void displayError (WebBrowserComponent* owner, NSError* error)\r
     {\r
         if ([error code] != NSURLErrorCancelled)\r
@@ -315,94 +391,6 @@ private:
                 owner->goToURL ("data:text/plain;charset=UTF-8," + errorString);\r
         }\r
     }\r
-\r
-    static void didFailNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
-    {\r
-        displayError (getOwner (self), error);\r
-    }\r
-\r
-    static void didFailProvisionalNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
-    {\r
-        displayError (getOwner (self), error);\r
-    }\r
-\r
-    static void webViewDidClose (id self, SEL, WKWebView*)\r
-    {\r
-        getOwner (self)->windowCloseRequest();\r
-    }\r
-\r
-    static WKWebView* createWebView (id self, SEL, WKWebView*, WKWebViewConfiguration*,\r
-                                     WKNavigationAction* navigationAction, WKWindowFeatures*)\r
-    {\r
-        getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]));\r
-        return nil;\r
-    }\r
-\r
-   #if WKWEBVIEW_OPENPANEL_SUPPORTED\r
-    API_AVAILABLE (macos (10.12))\r
-    static void runOpenPanel (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*,\r
-                              void (^completionHandler)(NSArray<NSURL*>*))\r
-    {\r
-        using CompletionHandlerType = decltype (completionHandler);\r
-\r
-        class DeletedFileChooserWrapper   : private DeletedAtShutdown\r
-        {\r
-        public:\r
-            DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, CompletionHandlerType h)\r
-                : chooser (std::move (fc)), handler (h)\r
-            {\r
-                [handler.get() retain];\r
-            }\r
-\r
-            ~DeletedFileChooserWrapper()\r
-            {\r
-                callHandler (nullptr);\r
-            }\r
-\r
-            void callHandler (NSArray<NSURL*>* urls)\r
-            {\r
-                if (handlerCalled)\r
-                    return;\r
-\r
-                handler.get() (urls);\r
-                handlerCalled = true;\r
-            }\r
-\r
-            std::unique_ptr<FileChooser> chooser;\r
-\r
-        private:\r
-            ObjCObjectHandle<CompletionHandlerType> handler;\r
-            bool handlerCalled = false;\r
-        };\r
-\r
-        auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
-                                                      File::getSpecialLocation (File::userHomeDirectory), "*");\r
-        auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler);\r
-\r
-        auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
-                    | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0);\r
-\r
-       #if (defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14)\r
-        if (@available (macOS 10.14, *))\r
-        {\r
-            if ([parameters allowsDirectories])\r
-                flags |= FileBrowserComponent::canSelectDirectories;\r
-        }\r
-       #endif\r
-\r
-        wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
-        {\r
-            auto results = wrapper->chooser->getResults();\r
-            auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()];\r
-\r
-            for (auto& f : results)\r
-                [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]];\r
-\r
-            wrapper->callHandler (urls);\r
-            delete wrapper;\r
-        });\r
-    }\r
-   #endif\r
 };\r
 \r
 //==============================================================================\r
index eb652136091a29e40deebbbf2cc8877c122624f8..0bd2862eaf2cfbd523747cffa1447aebf368464b 100644 (file)
@@ -88,12 +88,12 @@ public:
     }\r
 \r
     /** Creates a matrix from a 3D vector translation. */\r
-    Matrix3D (Vector3D<Type> vector) noexcept\r
+    static Matrix3D fromTranslation (Vector3D<Type> vector) noexcept\r
     {\r
-        mat[0]  = Type (1); mat[1]  = 0;        mat[2]  = 0;         mat[3]  = 0;\r
-        mat[4]  = 0;        mat[5]  = Type (1); mat[6]  = 0;         mat[7]  = 0;\r
-        mat[8]  = 0;        mat[9]  = 0;        mat[10] = Type (1);  mat[11] = 0;\r
-        mat[12] = vector.x; mat[13] = vector.y; mat[14] = vector.z;  mat[15] = Type (1);\r
+        return { Type (1), 0,        0,        0,\r
+                 0,        Type (1), 0,        0,\r
+                 0,        0,        Type (1), 0,\r
+                 vector.x, vector.y, vector.z, Type (1) };\r
     }\r
 \r
     /** Returns a new matrix from the given frustum values. */\r
@@ -129,22 +129,22 @@ public:
     {\r
         auto&& m2 = other.mat;\r
 \r
-        return { mat[0]  * m2[0] + mat[1]  * m2[4] + mat[2]  * m2[8]  + mat[3]  * m2[12],\r
-                 mat[0]  * m2[1] + mat[1]  * m2[5] + mat[2]  * m2[9]  + mat[3]  * m2[13],\r
-                 mat[0]  * m2[2] + mat[1]  * m2[6] + mat[2]  * m2[10] + mat[3]  * m2[14],\r
-                 mat[0]  * m2[3] + mat[1]  * m2[7] + mat[2]  * m2[11] + mat[3]  * m2[15],\r
-                 mat[4]  * m2[0] + mat[5]  * m2[4] + mat[6]  * m2[8]  + mat[7]  * m2[12],\r
-                 mat[4]  * m2[1] + mat[5]  * m2[5] + mat[6]  * m2[9]  + mat[7]  * m2[13],\r
-                 mat[4]  * m2[2] + mat[5]  * m2[6] + mat[6]  * m2[10] + mat[7]  * m2[14],\r
-                 mat[4]  * m2[3] + mat[5]  * m2[7] + mat[6]  * m2[11] + mat[7]  * m2[15],\r
-                 mat[8]  * m2[0] + mat[9]  * m2[4] + mat[10] * m2[8]  + mat[11] * m2[12],\r
-                 mat[8]  * m2[1] + mat[9]  * m2[5] + mat[10] * m2[9]  + mat[11] * m2[13],\r
-                 mat[8]  * m2[2] + mat[9]  * m2[6] + mat[10] * m2[10] + mat[11] * m2[14],\r
-                 mat[8]  * m2[3] + mat[9]  * m2[7] + mat[10] * m2[11] + mat[11] * m2[15],\r
-                 mat[12] * m2[0] + mat[13] * m2[4] + mat[14] * m2[8]  + mat[15] * m2[12],\r
-                 mat[12] * m2[1] + mat[13] * m2[5] + mat[14] * m2[9]  + mat[15] * m2[13],\r
-                 mat[12] * m2[2] + mat[13] * m2[6] + mat[14] * m2[10] + mat[15] * m2[14],\r
-                 mat[12] * m2[3] + mat[13] * m2[7] + mat[14] * m2[11] + mat[15] * m2[15] };\r
+        return { mat[0] * m2[0]  + mat[4] * m2[1]  + mat[8]  * m2[2]  + mat[12] * m2[3],\r
+                 mat[1] * m2[0]  + mat[5] * m2[1]  + mat[9]  * m2[2]  + mat[13] * m2[3],\r
+                 mat[2] * m2[0]  + mat[6] * m2[1]  + mat[10] * m2[2]  + mat[14] * m2[3],\r
+                 mat[3] * m2[0]  + mat[7] * m2[1]  + mat[11] * m2[2]  + mat[15] * m2[3],\r
+                 mat[0] * m2[4]  + mat[4] * m2[5]  + mat[8]  * m2[6]  + mat[12] * m2[7],\r
+                 mat[1] * m2[4]  + mat[5] * m2[5]  + mat[9]  * m2[6]  + mat[13] * m2[7],\r
+                 mat[2] * m2[4]  + mat[6] * m2[5]  + mat[10] * m2[6]  + mat[14] * m2[7],\r
+                 mat[3] * m2[4]  + mat[7] * m2[5]  + mat[11] * m2[6]  + mat[15] * m2[7],\r
+                 mat[0] * m2[8]  + mat[4] * m2[9]  + mat[8]  * m2[10] + mat[12] * m2[11],\r
+                 mat[1] * m2[8]  + mat[5] * m2[9]  + mat[9]  * m2[10] + mat[13] * m2[11],\r
+                 mat[2] * m2[8]  + mat[6] * m2[9]  + mat[10] * m2[10] + mat[14] * m2[11],\r
+                 mat[3] * m2[8]  + mat[7] * m2[9]  + mat[11] * m2[10] + mat[15] * m2[11],\r
+                 mat[0] * m2[12] + mat[4] * m2[13] + mat[8]  * m2[14] + mat[12] * m2[15],\r
+                 mat[1] * m2[12] + mat[5] * m2[13] + mat[9]  * m2[14] + mat[13] * m2[15],\r
+                 mat[2] * m2[12] + mat[6] * m2[13] + mat[10] * m2[14] + mat[14] * m2[15],\r
+                 mat[3] * m2[12] + mat[7] * m2[13] + mat[11] * m2[14] + mat[15] * m2[15] };\r
     }\r
 \r
     /** The 4x4 matrix values. These are stored in the standard OpenGL order. */\r
index a08d1ff1c90c8e8e06782603526383a88d460bb7..8cf05c2728bebd227af702e778b115cdee70c448 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_opengl\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE OpenGL classes\r
   description:        Classes for rendering OpenGL in a JUCE window.\r
   website:            http://www.juce.com/juce\r
index aceff12f4156b40f753a8594a65c3f3e6d4c34be..f3c21b929ead17a331db5ec4cfd582291ba6860e 100644 (file)
@@ -246,10 +246,8 @@ public:
 \r
     static NSOpenGLContextParameter getSwapIntervalParameter()\r
     {\r
-        #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
-         if (@available (macOS 10.12, *))\r
-             return NSOpenGLContextParameterSwapInterval;\r
-        #endif\r
+        if (@available (macOS 10.12, *))\r
+            return NSOpenGLContextParameterSwapInterval;\r
 \r
         return NSOpenGLCPSwapInterval;\r
     }\r
index cd60f720e919c78d5b0bdb0ffbaad78633f6bd74..a1e8444ad082dac4466c7a361eed429101876b80 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_osc\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE OSC classes\r
   description:        Open Sound Control implementation.\r
   website:            http://www.juce.com/juce\r
index 1b07d19f054c3de906edae8c57bc2cf75186525b..d5726bf1dd3d36ec3911a493bbb7f2eaccc7a94e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_product_unlocking\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE Online marketplace support\r
   description:        Classes for online product authentication\r
   website:            http://www.juce.com/juce\r
diff --git a/modules/juce_product_unlocking/native/java/app/com/rmsl/juce/JuceBillingClient.java b/modules/juce_product_unlocking/native/java/app/com/rmsl/juce/JuceBillingClient.java
new file mode 100644 (file)
index 0000000..f398bde
--- /dev/null
@@ -0,0 +1,226 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+package com.rmsl.juce;\r
+\r
+import com.android.billingclient.api.*;\r
+\r
+public class JuceBillingClient implements PurchasesUpdatedListener,\r
+                                          BillingClientStateListener {\r
+    private native void productDetailsQueryCallback(long host, java.util.List<ProductDetails> productDetails);\r
+    private native void purchasesListQueryCallback(long host, java.util.List<Purchase> purchases);\r
+    private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode);\r
+    private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode);\r
+\r
+    public JuceBillingClient(android.content.Context context, long hostToUse) {\r
+        host = hostToUse;\r
+\r
+        billingClient = BillingClient.newBuilder(context)\r
+                .enablePendingPurchases()\r
+                .setListener(this)\r
+                .build();\r
+\r
+        billingClient.startConnection(this);\r
+    }\r
+\r
+    public void endConnection() {\r
+        billingClient.endConnection();\r
+    }\r
+\r
+    public boolean isReady() {\r
+        return billingClient.isReady();\r
+    }\r
+\r
+    public boolean isBillingSupported() {\r
+        return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode()\r
+                == BillingClient.BillingResponseCode.OK;\r
+    }\r
+\r
+    public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) {\r
+        java.util.ArrayList<QueryProductDetailsParams.Product> productList = new java.util.ArrayList<>();\r
+\r
+        for (String product : productsToQuery)\r
+            productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build());\r
+\r
+        return QueryProductDetailsParams.newBuilder().setProductList(productList).build();\r
+    }\r
+\r
+    public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List<String> productTypes, java.util.List<ProductDetails> details) {\r
+        if (productTypes == null || productTypes.isEmpty()) {\r
+            productDetailsQueryCallback(host, details);\r
+        } else {\r
+            billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() {\r
+                @Override\r
+                public void onProductDetailsResponse(BillingResult billingResult, java.util.List<ProductDetails> newDetails) {\r
+                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+                        details.addAll(newDetails);\r
+                        queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details);\r
+                    } else {\r
+                        queryProductDetailsImpl(productsToQuery, null, details);\r
+                    }\r
+                }\r
+            });\r
+        }\r
+    }\r
+\r
+    public void queryProductDetails(final String[] productsToQuery) {\r
+        executeOnBillingClientConnection(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
+                queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList<ProductDetails>());\r
+            }\r
+        });\r
+    }\r
+\r
+    public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) {\r
+        executeOnBillingClientConnection(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                BillingResult r = billingClient.launchBillingFlow(activity, params);\r
+            }\r
+        });\r
+    }\r
+\r
+    private void queryPurchasesImpl(java.util.List<String> toCheck, java.util.ArrayList<Purchase> purchases) {\r
+        if (toCheck == null || toCheck.isEmpty()) {\r
+            purchasesListQueryCallback(host, purchases);\r
+        } else {\r
+            billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() {\r
+                @Override\r
+                public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List<Purchase> list) {\r
+                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+                        purchases.addAll(list);\r
+                        queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases);\r
+                    } else {\r
+                        queryPurchasesImpl(null, purchases);\r
+                    }\r
+                }\r
+            });\r
+        }\r
+    }\r
+\r
+    public void queryPurchases() {\r
+        executeOnBillingClientConnection(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
+                queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList<Purchase>());\r
+            }\r
+        });\r
+    }\r
+\r
+    public void consumePurchase(final String productIdentifier, final String purchaseToken) {\r
+        executeOnBillingClientConnection(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                ConsumeParams consumeParams = ConsumeParams.newBuilder()\r
+                        .setPurchaseToken(purchaseToken)\r
+                        .build();\r
+\r
+                billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {\r
+                    @Override\r
+                    public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {\r
+                        purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode());\r
+                    }\r
+                });\r
+            }\r
+        });\r
+    }\r
+\r
+    @Override\r
+    public void onPurchasesUpdated(BillingResult result, java.util.List<Purchase> purchases) {\r
+        int responseCode = result.getResponseCode();\r
+\r
+        if (purchases != null) {\r
+            for (Purchase purchase : purchases) {\r
+                handlePurchase(purchase, responseCode);\r
+            }\r
+        } else {\r
+            purchaseCompletedCallback(host, null, responseCode);\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void onBillingServiceDisconnected()\r
+    {\r
+\r
+    }\r
+\r
+    @Override\r
+    public void onBillingSetupFinished(BillingResult billingResult)\r
+    {\r
+\r
+    }\r
+\r
+    private void executeOnBillingClientConnection(Runnable runnable) {\r
+        if (billingClient.isReady()) {\r
+            runnable.run();\r
+        } else {\r
+            connectAndExecute(runnable);\r
+        }\r
+    }\r
+\r
+    private void connectAndExecute(final Runnable executeOnSuccess) {\r
+        billingClient.startConnection(new BillingClientStateListener() {\r
+            @Override\r
+            public void onBillingSetupFinished(BillingResult billingResponse) {\r
+                if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+                    if (executeOnSuccess != null) {\r
+                        executeOnSuccess.run();\r
+                    }\r
+                }\r
+            }\r
+\r
+            @Override\r
+            public void onBillingServiceDisconnected() {\r
+            }\r
+        });\r
+    }\r
+\r
+    private void handlePurchase(final Purchase purchase, final int responseCode) {\r
+        purchaseCompletedCallback(host, purchase, responseCode);\r
+\r
+        if (responseCode == BillingClient.BillingResponseCode.OK\r
+                && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED\r
+                && !purchase.isAcknowledged()) {\r
+            executeOnBillingClientConnection(new Runnable() {\r
+                @Override\r
+                public void run() {\r
+                    AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();\r
+                    billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {\r
+                        @Override\r
+                        public void onAcknowledgePurchaseResponse(BillingResult billingResult) {\r
+\r
+                        }\r
+                    });\r
+                }\r
+            });\r
+        }\r
+    }\r
+\r
+    private long host = 0;\r
+    private final BillingClient billingClient;\r
+}\r
diff --git a/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java b/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java
deleted file mode 100644 (file)
index f398bde..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2022 - Raw Material Software Limited\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
-   Agreement and JUCE Privacy Policy.\r
-\r
-   End User License Agreement: www.juce.com/juce-7-licence\r
-   Privacy Policy: www.juce.com/juce-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-package com.rmsl.juce;\r
-\r
-import com.android.billingclient.api.*;\r
-\r
-public class JuceBillingClient implements PurchasesUpdatedListener,\r
-                                          BillingClientStateListener {\r
-    private native void productDetailsQueryCallback(long host, java.util.List<ProductDetails> productDetails);\r
-    private native void purchasesListQueryCallback(long host, java.util.List<Purchase> purchases);\r
-    private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode);\r
-    private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode);\r
-\r
-    public JuceBillingClient(android.content.Context context, long hostToUse) {\r
-        host = hostToUse;\r
-\r
-        billingClient = BillingClient.newBuilder(context)\r
-                .enablePendingPurchases()\r
-                .setListener(this)\r
-                .build();\r
-\r
-        billingClient.startConnection(this);\r
-    }\r
-\r
-    public void endConnection() {\r
-        billingClient.endConnection();\r
-    }\r
-\r
-    public boolean isReady() {\r
-        return billingClient.isReady();\r
-    }\r
-\r
-    public boolean isBillingSupported() {\r
-        return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode()\r
-                == BillingClient.BillingResponseCode.OK;\r
-    }\r
-\r
-    public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) {\r
-        java.util.ArrayList<QueryProductDetailsParams.Product> productList = new java.util.ArrayList<>();\r
-\r
-        for (String product : productsToQuery)\r
-            productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build());\r
-\r
-        return QueryProductDetailsParams.newBuilder().setProductList(productList).build();\r
-    }\r
-\r
-    public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List<String> productTypes, java.util.List<ProductDetails> details) {\r
-        if (productTypes == null || productTypes.isEmpty()) {\r
-            productDetailsQueryCallback(host, details);\r
-        } else {\r
-            billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() {\r
-                @Override\r
-                public void onProductDetailsResponse(BillingResult billingResult, java.util.List<ProductDetails> newDetails) {\r
-                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
-                        details.addAll(newDetails);\r
-                        queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details);\r
-                    } else {\r
-                        queryProductDetailsImpl(productsToQuery, null, details);\r
-                    }\r
-                }\r
-            });\r
-        }\r
-    }\r
-\r
-    public void queryProductDetails(final String[] productsToQuery) {\r
-        executeOnBillingClientConnection(new Runnable() {\r
-            @Override\r
-            public void run() {\r
-                String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
-                queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList<ProductDetails>());\r
-            }\r
-        });\r
-    }\r
-\r
-    public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) {\r
-        executeOnBillingClientConnection(new Runnable() {\r
-            @Override\r
-            public void run() {\r
-                BillingResult r = billingClient.launchBillingFlow(activity, params);\r
-            }\r
-        });\r
-    }\r
-\r
-    private void queryPurchasesImpl(java.util.List<String> toCheck, java.util.ArrayList<Purchase> purchases) {\r
-        if (toCheck == null || toCheck.isEmpty()) {\r
-            purchasesListQueryCallback(host, purchases);\r
-        } else {\r
-            billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() {\r
-                @Override\r
-                public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List<Purchase> list) {\r
-                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
-                        purchases.addAll(list);\r
-                        queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases);\r
-                    } else {\r
-                        queryPurchasesImpl(null, purchases);\r
-                    }\r
-                }\r
-            });\r
-        }\r
-    }\r
-\r
-    public void queryPurchases() {\r
-        executeOnBillingClientConnection(new Runnable() {\r
-            @Override\r
-            public void run() {\r
-                String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
-                queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList<Purchase>());\r
-            }\r
-        });\r
-    }\r
-\r
-    public void consumePurchase(final String productIdentifier, final String purchaseToken) {\r
-        executeOnBillingClientConnection(new Runnable() {\r
-            @Override\r
-            public void run() {\r
-                ConsumeParams consumeParams = ConsumeParams.newBuilder()\r
-                        .setPurchaseToken(purchaseToken)\r
-                        .build();\r
-\r
-                billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {\r
-                    @Override\r
-                    public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {\r
-                        purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode());\r
-                    }\r
-                });\r
-            }\r
-        });\r
-    }\r
-\r
-    @Override\r
-    public void onPurchasesUpdated(BillingResult result, java.util.List<Purchase> purchases) {\r
-        int responseCode = result.getResponseCode();\r
-\r
-        if (purchases != null) {\r
-            for (Purchase purchase : purchases) {\r
-                handlePurchase(purchase, responseCode);\r
-            }\r
-        } else {\r
-            purchaseCompletedCallback(host, null, responseCode);\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void onBillingServiceDisconnected()\r
-    {\r
-\r
-    }\r
-\r
-    @Override\r
-    public void onBillingSetupFinished(BillingResult billingResult)\r
-    {\r
-\r
-    }\r
-\r
-    private void executeOnBillingClientConnection(Runnable runnable) {\r
-        if (billingClient.isReady()) {\r
-            runnable.run();\r
-        } else {\r
-            connectAndExecute(runnable);\r
-        }\r
-    }\r
-\r
-    private void connectAndExecute(final Runnable executeOnSuccess) {\r
-        billingClient.startConnection(new BillingClientStateListener() {\r
-            @Override\r
-            public void onBillingSetupFinished(BillingResult billingResponse) {\r
-                if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
-                    if (executeOnSuccess != null) {\r
-                        executeOnSuccess.run();\r
-                    }\r
-                }\r
-            }\r
-\r
-            @Override\r
-            public void onBillingServiceDisconnected() {\r
-            }\r
-        });\r
-    }\r
-\r
-    private void handlePurchase(final Purchase purchase, final int responseCode) {\r
-        purchaseCompletedCallback(host, purchase, responseCode);\r
-\r
-        if (responseCode == BillingClient.BillingResponseCode.OK\r
-                && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED\r
-                && !purchase.isAcknowledged()) {\r
-            executeOnBillingClientConnection(new Runnable() {\r
-                @Override\r
-                public void run() {\r
-                    AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();\r
-                    billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {\r
-                        @Override\r
-                        public void onAcknowledgePurchaseResponse(BillingResult billingResult) {\r
-\r
-                        }\r
-                    });\r
-                }\r
-            });\r
-        }\r
-    }\r
-\r
-    private long host = 0;\r
-    private final BillingClient billingClient;\r
-}\r
index 922234fd77ac77408ac36c41b836e1d2d7bc9256..b382e5a1b41304e2948de22d7c94afbfdcc4f053 100644 (file)
@@ -142,6 +142,407 @@ inline StringArray javaListOfStringToJuceStringArray (const LocalRef<jobject>& j
     return result;\r
 }\r
 \r
+//==============================================================================\r
+constexpr unsigned char juceBillingClientCompiled[]\r
+{\r
+    0x1f, 0x8b, 0x08, 0x08, 0xa4, 0x53, 0xd0, 0x62, 0x04, 0x03, 0x63, 0x6c,\r
+    0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x5a,\r
+    0x0b, 0x70, 0x54, 0xe7, 0x75, 0x3e, 0xff, 0xdd, 0xab, 0xf7, 0x4a, 0x5a,\r
+    0xad, 0x1e, 0x2b, 0xf4, 0x5c, 0xed, 0x0a, 0x10, 0x42, 0xef, 0x87, 0x11,\r
+    0xac, 0x82, 0x25, 0xc4, 0xc3, 0x02, 0x81, 0x01, 0x2d, 0xd8, 0x20, 0xa7,\r
+    0xf6, 0xb2, 0x7b, 0x41, 0x0b, 0xab, 0xbb, 0xab, 0xdd, 0x15, 0x2f, 0xc7,\r
+    0x94, 0x60, 0xec, 0x90, 0xc6, 0x8e, 0x69, 0x70, 0x1a, 0xc7, 0x66, 0xa6,\r
+    0xee, 0x14, 0x4f, 0xdd, 0x09, 0xd3, 0x26, 0xa9, 0x99, 0x71, 0x62, 0xa6,\r
+    0xf5, 0xc4, 0x6e, 0xea, 0x66, 0x68, 0x1b, 0x27, 0xa4, 0xd3, 0xcc, 0xb8,\r
+    0x0d, 0xd3, 0x24, 0xa5, 0x9d, 0xe0, 0x3e, 0x5c, 0x77, 0xc6, 0x6d, 0x3d,\r
+    0x6d, 0xbf, 0xf3, 0xdf, 0xff, 0xae, 0xae, 0x84, 0x5d, 0xc9, 0xbe, 0xf0,\r
+    0xed, 0x39, 0xff, 0x39, 0xe7, 0x3f, 0xff, 0xf9, 0xcf, 0xff, 0xdc, 0xab,\r
+    0x8d, 0x19, 0x27, 0x8b, 0x7b, 0xfa, 0x07, 0xe9, 0x77, 0x66, 0x07, 0x1f,\r
+    0x79, 0xed, 0x89, 0xde, 0x5f, 0xfe, 0xe1, 0xa5, 0x7d, 0xcf, 0x5e, 0xf9,\r
+    0x97, 0xa1, 0xef, 0xad, 0x2e, 0xdb, 0xfd, 0x83, 0xd1, 0x3f, 0xb8, 0x9d,\r
+    0x7c, 0xb3, 0x8d, 0x28, 0x45, 0x44, 0x27, 0xf7, 0x0f, 0x78, 0x41, 0xac,\r
+    0x07, 0xb2, 0xcb, 0xe0, 0x58, 0xde, 0x0f, 0xdc, 0xd2, 0x88, 0x36, 0x81,\r
+    0x5e, 0x75, 0x11, 0xd5, 0x82, 0xbe, 0x99, 0x4f, 0xf4, 0x59, 0xd0, 0xf3,\r
+    0x05, 0x44, 0x25, 0xa0, 0x89, 0x62, 0xa2, 0x0f, 0x1a, 0x88, 0x6e, 0xa0,\r
+    0x70, 0xb8, 0x86, 0x28, 0x0e, 0xcc, 0x00, 0xb3, 0xc0, 0x29, 0xe0, 0x31,\r
+    0xe0, 0x71, 0xe0, 0x49, 0xe0, 0x8b, 0xc0, 0xd3, 0xc0, 0x4b, 0xc0, 0xcb,\r
+    0xc0, 0x55, 0xe0, 0x5b, 0xc0, 0x35, 0xe0, 0xbb, 0xc0, 0x8f, 0x80, 0x77,\r
+    0x81, 0x1e, 0x1f, 0xd1, 0x31, 0xe0, 0x9b, 0xc0, 0x6d, 0xa0, 0x06, 0x0d,\r
+    0xef, 0x05, 0x9e, 0x00, 0x5e, 0x01, 0x7e, 0x05, 0xd4, 0xad, 0x20, 0x9a,\r
+    0x04, 0x1e, 0x07, 0xde, 0x00, 0xde, 0x05, 0xda, 0xea, 0x88, 0x0e, 0x01,\r
+    0x2f, 0x01, 0xff, 0x0a, 0xf4, 0xd7, 0x13, 0x99, 0xc0, 0x55, 0xe0, 0xef,\r
+    0x81, 0x02, 0xc4, 0xd9, 0x01, 0xec, 0x01, 0x8e, 0x03, 0x2f, 0x00, 0xdf,\r
+    0x03, 0x6e, 0x03, 0xee, 0x46, 0xd8, 0x03, 0x0f, 0x02, 0x8f, 0x02, 0x2f,\r
+    0x02, 0xaf, 0x03, 0x3f, 0x03, 0xfe, 0x1d, 0x28, 0x6a, 0x22, 0x6a, 0x04,\r
+    0x06, 0x80, 0x1d, 0xc0, 0xc3, 0xc0, 0x09, 0xe0, 0x69, 0xe0, 0xb7, 0x81,\r
+    0x6f, 0x01, 0xaf, 0x00, 0xdf, 0x01, 0xfe, 0x04, 0x78, 0x03, 0x78, 0x0b,\r
+    0xf8, 0x0b, 0xe0, 0x26, 0xf0, 0x53, 0xe0, 0x67, 0xc0, 0x3f, 0x00, 0xff,\r
+    0x04, 0xbc, 0x0b, 0x68, 0xcd, 0x44, 0x3e, 0x20, 0x08, 0x74, 0x03, 0x21,\r
+    0x60, 0x1b, 0x10, 0x06, 0xe2, 0x80, 0x09, 0x1c, 0x07, 0xce, 0x00, 0x4f,\r
+    0x03, 0xcf, 0x02, 0xbf, 0x07, 0x5c, 0x03, 0xbe, 0x0f, 0xfc, 0x1d, 0xf0,\r
+    0x2e, 0x50, 0xee, 0x27, 0xaa, 0x02, 0xda, 0x81, 0x61, 0x60, 0x17, 0xf0,\r
+    0x30, 0x90, 0x04, 0x4e, 0x02, 0x67, 0x80, 0x27, 0x80, 0xaf, 0x02, 0xbf,\r
+    0x0f, 0x7c, 0x1b, 0xf8, 0x3e, 0xf0, 0x57, 0xc0, 0x4f, 0x81, 0x3b, 0xc0,\r
+    0x7b, 0xc0, 0xff, 0x00, 0x7a, 0x0b, 0xe2, 0x01, 0x46, 0x81, 0x03, 0x40,\r
+    0x02, 0x78, 0x12, 0x78, 0x1e, 0x78, 0x05, 0x78, 0x1b, 0xb8, 0x03, 0xe4,\r
+    0x07, 0x88, 0x02, 0xc0, 0x3a, 0x60, 0x0f, 0x70, 0x14, 0x38, 0x0d, 0x3c,\r
+    0x03, 0xfc, 0x2e, 0xf0, 0x32, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x31, 0xf0,\r
+    0x73, 0xe0, 0x3f, 0x80, 0xff, 0x06, 0xdc, 0x41, 0xa2, 0x6a, 0xa0, 0x1e,\r
+    0x68, 0x07, 0xfa, 0x80, 0x0d, 0xc0, 0x7d, 0xc0, 0x3e, 0xe0, 0x18, 0x70,\r
+    0x02, 0xf8, 0x32, 0xf0, 0x22, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x6b, 0xe0,\r
+    0x97, 0xc0, 0x7b, 0xc0, 0x7f, 0x02, 0x98, 0x8a, 0x84, 0x69, 0x48, 0xe5,\r
+    0x80, 0x07, 0xa8, 0x00, 0x78, 0x22, 0x57, 0x02, 0x55, 0x40, 0x35, 0x80,\r
+    0xe9, 0x44, 0x98, 0x42, 0x72, 0xee, 0x62, 0x8a, 0x10, 0xa6, 0x05, 0x61,\r
+    0x2a, 0x10, 0x86, 0x94, 0x30, 0x04, 0x84, 0xf4, 0x91, 0x1f, 0x40, 0x97,\r
+    0x08, 0xa1, 0x11, 0xdc, 0x52, 0x2b, 0xb0, 0x12, 0x58, 0x05, 0xac, 0x06,\r
+    0xb0, 0x24, 0x68, 0x0d, 0xd0, 0x0e, 0xac, 0x05, 0x3a, 0x80, 0x4e, 0xa0,\r
+    0x0b, 0xe8, 0x06, 0x7a, 0x80, 0x5e, 0xa0, 0x0f, 0xe0, 0x35, 0x33, 0x00,\r
+    0x0c, 0x02, 0xf7, 0x00, 0xeb, 0x80, 0x21, 0x60, 0x03, 0x10, 0x02, 0x86,\r
+    0x81, 0xcf, 0x00, 0xf7, 0x02, 0xe3, 0xc0, 0x0e, 0x60, 0x02, 0xe0, 0xbe,\r
+    0xd8, 0x4f, 0x21, 0x18, 0x01, 0xb8, 0xd1, 0x01, 0x2c, 0x2f, 0xd2, 0x95,\r
+    0xa2, 0x54, 0xf1, 0x55, 0x4a, 0x9e, 0xa7, 0xe4, 0x6c, 0xc3, 0x79, 0xe0,\r
+    0x87, 0x6d, 0x98, 0x6f, 0x80, 0x8d, 0xcd, 0xb7, 0x2a, 0x7b, 0xf6, 0xcb,\r
+    0x0f, 0xcb, 0x99, 0x67, 0xff, 0x65, 0xa0, 0x58, 0xba, 0xd4, 0xa1, 0xec,\r
+    0x99, 0xb7, 0xfd, 0xbb, 0xc1, 0xf3, 0xc3, 0xf6, 0xcc, 0xdb, 0x72, 0x2e,\r
+    0xf3, 0xc3, 0xed, 0x72, 0xae, 0xf9, 0x61, 0x19, 0xf3, 0x03, 0xaa, 0x2d,\r
+    0xce, 0x3f, 0x3f, 0x2c, 0x67, 0xde, 0xae, 0x0b, 0xb5, 0x7c, 0xb8, 0x2e,\r
+    0x8f, 0x0d, 0x3f, 0x1c, 0x03, 0xf3, 0xc3, 0xaa, 0x2e, 0x8f, 0x17, 0x3f,\r
+    0x5c, 0x97, 0x79, 0xbb, 0x2e, 0x96, 0xbd, 0x7c, 0xb8, 0x2e, 0x8f, 0x0b,\r
+    0x3f, 0x1c, 0x2f, 0xf3, 0x9b, 0x55, 0x5d, 0x1e, 0x27, 0x7e, 0xd8, 0xa6,\r
+    0x53, 0x72, 0x56, 0xec, 0x3c, 0x56, 0x13, 0xb0, 0x61, 0x9f, 0xcc, 0x87,\r
+    0xc1, 0xf3, 0x18, 0xf0, 0xf8, 0xf1, 0x33, 0x0a, 0x30, 0xff, 0x10, 0xe4,\r
+    0x36, 0x3f, 0x0d, 0x7e, 0x44, 0xc9, 0xb3, 0xe0, 0xb7, 0x2a, 0x9e, 0x73,\r
+    0xb5, 0x59, 0xf1, 0x9f, 0x73, 0xc8, 0xcf, 0x83, 0xdf, 0xa4, 0xe4, 0xef,\r
+    0xa3, 0xd3, 0x36, 0xff, 0x94, 0xc3, 0xe6, 0x59, 0x07, 0x7f, 0xd9, 0xc1,\r
+    0x5f, 0x01, 0x3f, 0xa6, 0xea, 0x5e, 0x75, 0xc8, 0x5f, 0x71, 0xf0, 0xd7,\r
+    0xc1, 0xdb, 0x3e, 0xdf, 0x74, 0xf0, 0x37, 0x1c, 0xbc, 0x1b, 0xfc, 0x16,\r
+    0xe5, 0xe7, 0x26, 0xf8, 0x6d, 0x8a, 0xbf, 0x05, 0xde, 0x8e, 0xff, 0x8e,\r
+    0x83, 0x7f, 0xdf, 0x61, 0xf3, 0xa1, 0x83, 0x2f, 0xc4, 0x80, 0xd8, 0x75,\r
+    0xab, 0xc0, 0xdf, 0xa7, 0xfc, 0xf8, 0xc1, 0xdb, 0x7e, 0x3a, 0xc0, 0xdb,\r
+    0xf1, 0xbc, 0x83, 0xfe, 0xda, 0xf2, 0x01, 0x87, 0xcd, 0xb0, 0xc3, 0x66,\r
+    0x33, 0x78, 0xdb, 0xe7, 0x04, 0x78, 0x9e, 0xff, 0xbc, 0x76, 0xf8, 0xd9,\r
+    0x0e, 0x30, 0xff, 0x20, 0xe4, 0x36, 0xff, 0x08, 0xf8, 0x15, 0x58, 0x91,\r
+    0x4f, 0x43, 0xbe, 0x02, 0xa3, 0x76, 0x51, 0xd1, 0x67, 0x25, 0xed, 0xa3,\r
+    0xaf, 0x82, 0xd6, 0x29, 0x7d, 0x1d, 0x56, 0x1f, 0x97, 0xeb, 0x55, 0xb9,\r
+    0x9e, 0x34, 0x7a, 0x46, 0x96, 0x8b, 0xe9, 0x2b, 0xa0, 0x0d, 0x4a, 0xde,\r
+    0x80, 0x55, 0xfc, 0x9c, 0x2c, 0x77, 0xd1, 0xd7, 0x41, 0x1b, 0x95, 0xbc,\r
+    0x09, 0x3b, 0xc1, 0x97, 0x51, 0x6e, 0x56, 0xe5, 0x66, 0xac, 0xf8, 0x4b,\r
+    0xb2, 0xbc, 0x86, 0xbe, 0x06, 0xea, 0x57, 0x72, 0x3f, 0x76, 0x83, 0xdf,\r
+    0x44, 0xb9, 0x05, 0xbb, 0x05, 0xdb, 0x07, 0x94, 0x3c, 0x80, 0x1d, 0xe8,\r
+    0xb7, 0x50, 0x0e, 0x62, 0x65, 0xed, 0x97, 0x54, 0x90, 0x01, 0xaa, 0xe3,\r
+    0xdf, 0x03, 0x92, 0xba, 0xe8, 0x0b, 0xa0, 0x79, 0x88, 0x2b, 0x09, 0x5a,\r
+    0x00, 0x3b, 0x96, 0x17, 0x40, 0x32, 0x25, 0x69, 0x01, 0x3d, 0x0e, 0x5a,\r
+    0x88, 0x9d, 0x67, 0xaf, 0xa4, 0xed, 0x74, 0x40, 0xd2, 0x66, 0x7a, 0x48,\r
+    0xd2, 0x12, 0x3a, 0x2a, 0xe9, 0xbd, 0x74, 0x4c, 0xd2, 0x62, 0x9a, 0x91,\r
+    0x34, 0x5f, 0xfa, 0x2b, 0xc4, 0xae, 0xf4, 0x98, 0x2c, 0x77, 0xd2, 0x59,\r
+    0x49, 0x57, 0xd1, 0x17, 0x41, 0x79, 0x7d, 0x1c, 0x02, 0xdc, 0x58, 0x65,\r
+    0xdc, 0x9e, 0x1b, 0x2b, 0x80, 0xe3, 0x28, 0x05, 0xc7, 0x71, 0x78, 0x80,\r
+    0x47, 0x24, 0xad, 0xa7, 0x88, 0xa4, 0xf7, 0xd2, 0x11, 0xd0, 0x4a, 0xac,\r
+    0x5a, 0xb6, 0xaf, 0x84, 0xc5, 0x13, 0xa0, 0x55, 0xe0, 0xb8, 0x5c, 0x85,\r
+    0x1d, 0xf6, 0xbc, 0xa2, 0x4f, 0x82, 0x56, 0x63, 0xd7, 0x65, 0x3f, 0x35,\r
+    0xd8, 0x85, 0x99, 0xfa, 0xb0, 0xd3, 0xb2, 0x9d, 0x0f, 0xff, 0x58, 0x5f,\r
+    0x0b, 0x0d, 0xcb, 0x57, 0x60, 0x17, 0x74, 0x49, 0xba, 0x86, 0xe6, 0x40,\r
+    0xeb, 0x68, 0xbd, 0x2c, 0xd7, 0x21, 0xe3, 0xe7, 0x50, 0xae, 0xc7, 0xf8,\r
+    0xb1, 0xbe, 0x5e, 0x95, 0x1b, 0xb0, 0x7b, 0x72, 0xb9, 0x01, 0xe3, 0x70,\r
+    0x02, 0xb4, 0x11, 0xb3, 0x83, 0xcb, 0x8d, 0x4a, 0xdf, 0x84, 0xf9, 0xc0,\r
+    0xe5, 0x26, 0x8c, 0x47, 0x16, 0xb4, 0x19, 0x3b, 0x2e, 0x97, 0x9b, 0x95,\r
+    0xde, 0x8f, 0x5d, 0x98, 0xcb, 0x7e, 0x94, 0xd3, 0x92, 0xae, 0xa6, 0x0c,\r
+    0x68, 0x0b, 0x56, 0x39, 0xcb, 0x5b, 0xb0, 0x6b, 0xcc, 0x82, 0x06, 0xb0,\r
+    0x63, 0x73, 0x39, 0xa0, 0xea, 0x05, 0xb1, 0xfb, 0x73, 0x39, 0x48, 0x45,\r
+    0xb4, 0x53, 0xd2, 0x75, 0xb4, 0x4b, 0x52, 0x41, 0xf7, 0x4b, 0xda, 0x4b,\r
+    0xbb, 0x25, 0xdd, 0x40, 0x0f, 0x4a, 0x1a, 0xa2, 0x83, 0x92, 0x5a, 0xe3,\r
+    0x14, 0xc4, 0x4e, 0xff, 0x59, 0x59, 0xae, 0xa6, 0x87, 0x25, 0x5d, 0x4b,\r
+    0x51, 0x49, 0xef, 0xa5, 0x69, 0x45, 0x79, 0xfc, 0x82, 0xf8, 0xc7, 0xe3,\r
+    0x17, 0x54, 0xf1, 0x05, 0x11, 0x0f, 0xc7, 0x17, 0x44, 0x7f, 0x8f, 0x4b,\r
+    0x1a, 0xa0, 0x93, 0x92, 0xfa, 0xe9, 0x94, 0xa4, 0x2d, 0x74, 0x5a, 0xc9,\r
+    0x1f, 0x95, 0xf4, 0x33, 0xf4, 0x39, 0x49, 0x37, 0xd2, 0x19, 0x49, 0x9b,\r
+    0xe9, 0xd7, 0x25, 0x1d, 0xa6, 0xcf, 0x83, 0xae, 0x86, 0x5f, 0xee, 0x47,\r
+    0x9b, 0xea, 0x57, 0xbb, 0x2a, 0xb7, 0xd3, 0x08, 0x4d, 0x42, 0xde, 0x8e,\r
+    0x5d, 0x2e, 0x0c, 0xba, 0x16, 0x19, 0xdc, 0x07, 0xda, 0x89, 0xdd, 0x30,\r
+    0x26, 0xe9, 0x0a, 0x79, 0xf7, 0xeb, 0x52, 0xfa, 0x2e, 0x8c, 0xd4, 0xaf,\r
+    0x41, 0xde, 0x05, 0x7d, 0x5c, 0xd2, 0x06, 0x4a, 0x48, 0x4a, 0x74, 0x41,\r
+    0xd2, 0x46, 0xfa, 0x0d, 0x50, 0x3e, 0x5b, 0xf9, 0x59, 0x0d, 0xdc, 0xc4,\r
+    0x5e, 0x50, 0x04, 0x5a, 0x8b, 0xc2, 0xaa, 0x95, 0x2c, 0xb5, 0xce, 0x5d,\r
+    0xa6, 0xac, 0xe7, 0xbd, 0x82, 0xf5, 0x3d, 0x28, 0x8c, 0x28, 0x3d, 0x9f,\r
+    0xc9, 0xfc, 0x38, 0xf5, 0x23, 0x28, 0x84, 0x95, 0x1e, 0x57, 0x34, 0xf9,\r
+    0xb0, 0xfe, 0x17, 0xaa, 0xfe, 0x6e, 0x14, 0x8e, 0x29, 0x3d, 0x9f, 0xe7,\r
+    0xfc, 0x38, 0xeb, 0x4f, 0xa3, 0x70, 0x4e, 0xe9, 0xf9, 0xac, 0xe7, 0x87,\r
+    0xf5, 0x77, 0x54, 0xfd, 0x93, 0x28, 0x5c, 0x52, 0xfa, 0x66, 0xa9, 0x5d,\r
+    0x58, 0xff, 0x02, 0xf4, 0x57, 0x94, 0xde, 0xef, 0xd0, 0xf3, 0xde, 0xce,\r
+    0xf1, 0x3f, 0x07, 0xfd, 0x6b, 0x4a, 0xdf, 0xe2, 0xd0, 0x7f, 0xa8, 0xf4,\r
+    0x2f, 0x43, 0xff, 0x63, 0xa5, 0x0f, 0x38, 0xf4, 0x76, 0xff, 0x5f, 0x85,\r
+    0xfe, 0x17, 0x4a, 0x1f, 0x84, 0x5e, 0x00, 0x10, 0x91, 0x5e, 0x6d, 0xf9,\r
+    0x7f, 0x0b, 0x85, 0x0f, 0x94, 0x3e, 0x0f, 0xfb, 0x04, 0xeb, 0x7f, 0x50,\r
+    0x69, 0x9d, 0x67, 0x53, 0x28, 0x4c, 0x69, 0x82, 0xa6, 0x5c, 0x2e, 0x9a,\r
+    0xd2, 0x35, 0x4a, 0x79, 0x78, 0x76, 0x96, 0xe1, 0x1e, 0xe1, 0x92, 0xf7,\r
+    0x85, 0x1f, 0xc1, 0x6e, 0x2d, 0x24, 0xa6, 0xc7, 0x83, 0x72, 0xb1, 0xbe,\r
+    0x5e, 0x6f, 0xa0, 0xf0, 0x80, 0xa0, 0xb4, 0xff, 0x01, 0x8c, 0x7b, 0x78,\r
+    0x00, 0x99, 0x1d, 0x74, 0x51, 0xb8, 0x47, 0x23, 0x6f, 0x45, 0xda, 0xc3,\r
+    0x3b, 0x50, 0xb1, 0x96, 0xee, 0x79, 0x88, 0x3c, 0x9a, 0x9b, 0xc2, 0xbd,\r
+    0x82, 0xcc, 0x91, 0x09, 0x0a, 0x7b, 0xda, 0x4a, 0x6c, 0x4b, 0xaf, 0x43,\r
+    0x5a, 0x06, 0x6b, 0x17, 0xfe, 0x71, 0x3c, 0x7f, 0x8b, 0x76, 0xf8, 0x2e,\r
+    0x31, 0x25, 0x74, 0xc4, 0x93, 0x97, 0x8b, 0x83, 0xa3, 0xd5, 0x21, 0xff,\r
+    0x39, 0xf4, 0x9c, 0x7b, 0xaf, 0x3f, 0x88, 0x15, 0xee, 0x15, 0x75, 0xda,\r
+    0x61, 0xda, 0xa9, 0x91, 0xf0, 0x56, 0xd4, 0x69, 0x5f, 0x92, 0x5c, 0x78,\r
+    0x54, 0xa7, 0xf0, 0xa6, 0x3c, 0x9a, 0xf5, 0x84, 0x61, 0xe7, 0xa6, 0x80,\r
+    0xab, 0x1d, 0x5e, 0xf6, 0xc0, 0x3f, 0xc7, 0xd0, 0xd2, 0x53, 0x06, 0x3f,\r
+    0xba, 0x6c, 0xeb, 0x36, 0x7c, 0x15, 0xcb, 0xb6, 0xf2, 0xd1, 0x56, 0x01,\r
+    0xfa, 0x5e, 0x98, 0x6b, 0x8f, 0x2d, 0x78, 0xbe, 0xff, 0x33, 0x6c, 0x38,\r
+    0xbe, 0x70, 0x4f, 0x3e, 0x3c, 0xae, 0x93, 0x1e, 0xc3, 0xbd, 0x05, 0x14,\r
+    0xee, 0x2b, 0x24, 0xb3, 0xa7, 0x04, 0xfd, 0x9b, 0xf7, 0xf7, 0x5e, 0xce,\r
+    0x5f, 0x11, 0xfc, 0x15, 0xc3, 0x5f, 0x49, 0xce, 0x5f, 0x9e, 0xec, 0x21,\r
+    0xee, 0x99, 0xb0, 0xe1, 0x31, 0xe1, 0x3c, 0xba, 0xa8, 0xd8, 0xb5, 0xde,\r
+    0x55, 0x47, 0xe1, 0x60, 0x31, 0x99, 0xfe, 0x49, 0x9c, 0xd7, 0xe1, 0x60,\r
+    0x11, 0x85, 0x5b, 0x4b, 0xc8, 0xeb, 0xe1, 0x1c, 0x22, 0xcf, 0x82, 0x73,\r
+    0xa8, 0x0b, 0xb7, 0x1e, 0xf6, 0x17, 0xd3, 0x6c, 0xcf, 0x10, 0x6c, 0xda,\r
+    0x8a, 0xd8, 0xca, 0xeb, 0x90, 0x70, 0x7c, 0x1a, 0xfe, 0x71, 0xfe, 0x74,\r
+    0xcc, 0x95, 0x7c, 0xd0, 0x29, 0xe1, 0xce, 0xb5, 0x6d, 0xf7, 0xa5, 0x08,\r
+    0x3a, 0x9e, 0xf7, 0xff, 0x4f, 0xee, 0x7a, 0xdd, 0xf3, 0x79, 0xd3, 0xac,\r
+    0xbc, 0x69, 0xb2, 0x5d, 0x81, 0x7e, 0xda, 0x6d, 0x94, 0xe5, 0xda, 0x28,\r
+    0xcd, 0xb5, 0xc1, 0xf3, 0x24, 0x0f, 0xbe, 0xab, 0xa0, 0xe3, 0x7b, 0x55,\r
+    0x78, 0xb0, 0x94, 0xc2, 0xfb, 0xca, 0x90, 0x37, 0x50, 0x64, 0x70, 0xd6,\r
+    0xb3, 0x1e, 0xd2, 0x12, 0xe4, 0x0d, 0xe5, 0x40, 0x79, 0x6e, 0x1e, 0xcd,\r
+    0x86, 0x37, 0x50, 0x5e, 0xcb, 0x7c, 0x0e, 0xeb, 0x51, 0xdf, 0x1a, 0x93,\r
+    0x32, 0xe4, 0xd0, 0x83, 0x1c, 0x96, 0xe7, 0xda, 0xb0, 0xfb, 0x11, 0x84,\r
+    0x0d, 0xaf, 0xcf, 0x59, 0x9c, 0x21, 0x3c, 0xc2, 0xe1, 0x5e, 0x0f, 0xf2,\r
+    0xe7, 0xc5, 0xc9, 0xe2, 0x86, 0x5f, 0xbe, 0xb5, 0xb3, 0x8c, 0xdb, 0x5c,\r
+    0x87, 0x9c, 0xb8, 0x45, 0x40, 0x6b, 0xa2, 0x94, 0x7f, 0x2d, 0xe6, 0x8b,\r
+    0xd9, 0x53, 0x40, 0xdc, 0x93, 0xf9, 0xf9, 0xb6, 0x16, 0xbe, 0xac, 0xf9,\r
+    0x56, 0x81, 0xf6, 0xbc, 0xb9, 0xb6, 0x84, 0xcc, 0x26, 0x0c, 0xf1, 0x70,\r
+    0x5e, 0x9d, 0x39, 0xee, 0x43, 0x1d, 0x2e, 0xf3, 0x18, 0x0a, 0x8c, 0xd1,\r
+    0x7a, 0x81, 0x51, 0x13, 0x5e, 0x1a, 0x12, 0x79, 0x94, 0xf6, 0xec, 0x86,\r
+    0x6c, 0x3e, 0x57, 0x1b, 0x60, 0x6b, 0x8d, 0x47, 0x65, 0xce, 0x37, 0xe7,\r
+    0xd1, 0x7e, 0x6c, 0xdf, 0xf6, 0xfc, 0x1f, 0xc9, 0xc5, 0x53, 0x85, 0x78,\r
+    0xaa, 0x73, 0x75, 0xec, 0xbe, 0x6f, 0x83, 0xbe, 0x05, 0x95, 0x67, 0xa5,\r
+    0x0f, 0xee, 0x67, 0x35, 0xe2, 0xa8, 0x46, 0x9b, 0x6e, 0x61, 0xfa, 0x85,\r
+    0xca, 0x01, 0x7b, 0x67, 0x5d, 0x95, 0x23, 0x07, 0x2d, 0xc8, 0x41, 0x9f,\r
+    0xcc, 0x41, 0x7e, 0x2e, 0x07, 0x42, 0x7a, 0xb9, 0x1f, 0x3e, 0xbd, 0xa8,\r
+    0x11, 0xc6, 0x65, 0xac, 0x4e, 0x3c, 0x85, 0x5c, 0x16, 0x29, 0x3f, 0x7c,\r
+    0x9a, 0x17, 0xe3, 0x64, 0xd5, 0x31, 0x23, 0xdb, 0x90, 0x9d, 0x72, 0xd8,\r
+    0x5b, 0x99, 0x99, 0x44, 0x9d, 0x02, 0xae, 0xe3, 0xa9, 0x41, 0xfb, 0x3c,\r
+    0x62, 0xc5, 0xf2, 0x7b, 0x93, 0x9d, 0xb7, 0x07, 0xa0, 0xe7, 0xf5, 0x13,\r
+    0xc6, 0x79, 0xcd, 0x23, 0x52, 0x88, 0x12, 0xf7, 0xfa, 0x21, 0xc8, 0xbb,\r
+    0x40, 0x03, 0x38, 0x31, 0x78, 0x55, 0xa2, 0x37, 0x11, 0xaf, 0x36, 0xe8,\r
+    0xad, 0xa3, 0xad, 0xae, 0x7c, 0x6d, 0x56, 0xce, 0x4f, 0xb7, 0x6e, 0xfa,\r
+    0xeb, 0x70, 0xde, 0xba, 0x5d, 0xa6, 0xbf, 0x1e, 0xa7, 0x18, 0xa8, 0x67,\r
+    0x05, 0xea, 0x73, 0x79, 0x2f, 0xce, 0xed, 0xbf, 0xd1, 0x34, 0xd1, 0x76,\r
+    0x7b, 0x56, 0xce, 0x01, 0x77, 0xbe, 0xe9, 0xaf, 0x45, 0x86, 0x41, 0x3d,\r
+    0x3e, 0x49, 0x2b, 0xf2, 0xad, 0x9d, 0x84, 0xc8, 0x8e, 0x61, 0xd2, 0xef,\r
+    0x43, 0x7f, 0xac, 0xbb, 0x13, 0xc7, 0x70, 0x04, 0x31, 0xf0, 0xf9, 0x60,\r
+    0xed, 0x71, 0x07, 0x35, 0x1f, 0xb2, 0xe4, 0xb6, 0x32, 0xe8, 0xe1, 0x3c,\r
+    0x73, 0x26, 0x79, 0xbf, 0x01, 0xf5, 0xb0, 0x2f, 0xb7, 0x98, 0x12, 0xe8,\r
+    0xa5, 0xbf, 0x1c, 0xbc, 0x3d, 0x77, 0xb8, 0x6f, 0x19, 0xf8, 0xe1, 0x3d,\r
+    0x29, 0xd5, 0xb3, 0x4b, 0xee, 0x03, 0xbc, 0xa7, 0xf2, 0x1a, 0x38, 0x6d,\r
+    0xcb, 0xc3, 0xe3, 0xe4, 0xe9, 0xe3, 0xb9, 0xad, 0xc9, 0x5c, 0x9c, 0x83,\r
+    0x9c, 0xef, 0x4f, 0x9c, 0xe7, 0x80, 0xf0, 0xa3, 0x5e, 0x37, 0xb5, 0xa0,\r
+    0x4f, 0xe5, 0x88, 0x8e, 0xfd, 0xea, 0xb0, 0x62, 0x7f, 0x17, 0x60, 0xc7,\r
+    0xe7, 0x01, 0xdf, 0x21, 0x52, 0x23, 0x9d, 0xe4, 0x09, 0xa6, 0xfc, 0x1b,\r
+    0x55, 0xdb, 0x76, 0xfe, 0x9f, 0x81, 0x0d, 0xcf, 0x2b, 0x2b, 0xff, 0x3c,\r
+    0x83, 0xcb, 0x64, 0x86, 0xb9, 0x7f, 0x97, 0xa0, 0xe3, 0xfe, 0x3a, 0xc7,\r
+    0x66, 0x08, 0xd6, 0x3c, 0x37, 0x35, 0x6a, 0xd3, 0x53, 0xfe, 0x10, 0xe6,\r
+    0x50, 0x19, 0x62, 0xb5, 0xd6, 0xec, 0x0b, 0xb0, 0xe7, 0xf5, 0xc4, 0x79,\r
+    0x4a, 0x85, 0xef, 0x23, 0xad, 0x77, 0xbd, 0xee, 0xc3, 0xa8, 0x56, 0x41,\r
+    0x5f, 0xac, 0x7b, 0x3d, 0xfd, 0x3a, 0xd6, 0x17, 0xc6, 0x99, 0x4b, 0xeb,\r
+    0xf5, 0x62, 0x0a, 0xe8, 0x01, 0xc4, 0x3e, 0x40, 0xad, 0x2e, 0x8e, 0x6b,\r
+    0xd3, 0x82, 0xd8, 0x5f, 0xca, 0xc5, 0x5e, 0x8f, 0xd8, 0x57, 0xa2, 0xff,\r
+    0xf3, 0xb1, 0xdb, 0x73, 0x03, 0x4d, 0xa1, 0x37, 0xf3, 0x6b, 0x8a, 0xcb,\r
+    0xfc, 0xd8, 0x32, 0x3b, 0xae, 0x6f, 0xc0, 0x17, 0xcf, 0x75, 0x7b, 0xaf,\r
+    0x1c, 0xd2, 0x6b, 0xd0, 0x87, 0x83, 0xc8, 0x91, 0x5b, 0x4f, 0x7b, 0xf6,\r
+    0x81, 0x16, 0xe3, 0x16, 0xe8, 0x85, 0x6c, 0x3f, 0xcb, 0x90, 0x2d, 0x0f,\r
+    0xe2, 0x1a, 0x21, 0xcd, 0xd5, 0xf6, 0x6f, 0xdc, 0x17, 0xaf, 0x9e, 0x9a,\r
+    0x44, 0x6f, 0x46, 0xad, 0x31, 0xb3, 0xc6, 0xe0, 0x5a, 0x2e, 0xbe, 0x3a,\r
+    0xd8, 0x06, 0x31, 0x6e, 0xf3, 0xf1, 0x15, 0xc0, 0x0b, 0x8f, 0xdf, 0x77,\r
+    0x61, 0xc3, 0xc7, 0xe4, 0x50, 0x1e, 0xee, 0x7a, 0x9e, 0x03, 0x90, 0x71,\r
+    0x3b, 0x2e, 0x6a, 0xf3, 0x85, 0x7b, 0x6a, 0x70, 0xe6, 0xa4, 0xfd, 0x0f,\r
+    0xe2, 0x9e, 0xea, 0x16, 0xcd, 0x62, 0x0d, 0x76, 0x94, 0x7b, 0x69, 0x4c,\r
+    0xf0, 0x1e, 0x83, 0x7b, 0xce, 0xbe, 0x16, 0xea, 0xdb, 0x6a, 0x62, 0xc7,\r
+    0xf3, 0x68, 0x6d, 0xf9, 0x93, 0x03, 0xc8, 0xe6, 0xc8, 0x36, 0x1a, 0x33,\r
+    0xb8, 0x7d, 0x1e, 0x37, 0x1e, 0x9b, 0x3f, 0xcd, 0xb5, 0xdf, 0x88, 0xf5,\r
+    0xb8, 0x86, 0x23, 0xce, 0x8d, 0xad, 0x7d, 0xd6, 0xfe, 0x39, 0x6c, 0x3a,\r
+    0xb9, 0x7d, 0x7d, 0xb5, 0x6c, 0xdf, 0xea, 0x27, 0xda, 0x6f, 0xe6, 0xf6,\r
+    0x67, 0xc9, 0x0f, 0x9d, 0x5b, 0x78, 0x35, 0x8e, 0xa3, 0x95, 0xdc, 0x5a,\r
+    0xb3, 0x86, 0x38, 0xfc, 0xcd, 0xc8, 0x15, 0xcf, 0xd8, 0x26, 0xb4, 0xc4,\r
+    0xf1, 0x34, 0xa0, 0xf5, 0xd5, 0xd4, 0xb7, 0xc5, 0xc4, 0x89, 0x27, 0xe3,\r
+    0xc1, 0x6b, 0xb0, 0xd4, 0xc8, 0x76, 0x72, 0xed, 0x29, 0xa3, 0xed, 0x3c,\r
+    0xcd, 0x30, 0x6e, 0x38, 0x39, 0xa9, 0x2c, 0x7e, 0x50, 0x54, 0x7b, 0xe8,\r
+    0x00, 0xb3, 0xb8, 0x6a, 0xbe, 0x4d, 0x51, 0x9e, 0xdb, 0x65, 0x74, 0x18,\r
+    0x48, 0x5a, 0x6c, 0x5a, 0x99, 0x55, 0x7a, 0xe8, 0x0c, 0x2f, 0x81, 0x73,\r
+    0x02, 0x66, 0xcf, 0x08, 0x66, 0xbf, 0x22, 0x64, 0xbd, 0x0b, 0xc2, 0xb2,\r
+    0xfc, 0x12, 0x64, 0xf1, 0x1d, 0x13, 0xf4, 0x9a, 0x25, 0xfe, 0x63, 0xb6,\r
+    0x89, 0xef, 0xa0, 0x9f, 0x48, 0xdb, 0xb7, 0x2d, 0xe1, 0x4d, 0xc8, 0x84,\r
+    0xb7, 0x1c, 0xdb, 0x4a, 0x19, 0x2e, 0xd9, 0x65, 0xd4, 0xc4, 0x7e, 0x36,\r
+    0xb2, 0x9b, 0xa9, 0xb8, 0xa8, 0xf1, 0xd0, 0x4a, 0x66, 0x87, 0xbb, 0x76,\r
+    0xec, 0xd8, 0x71, 0x94, 0x9a, 0x2c, 0xb7, 0x4d, 0x2a, 0xde, 0xd7, 0xa4,\r
+    0x9f, 0x0b, 0x96, 0x9f, 0x5e, 0x54, 0xfb, 0x23, 0x16, 0x7c, 0x61, 0x82,\r
+    0x6e, 0x48, 0xd1, 0xe9, 0x93, 0x71, 0x8a, 0xca, 0x78, 0x5e, 0x90, 0xe5,\r
+    0x63, 0xff, 0xbb, 0x93, 0x0e, 0xb0, 0xf7, 0x6d, 0xec, 0xa6, 0xe3, 0xb4,\r
+    0xa8, 0x71, 0xe3, 0x72, 0x5b, 0x46, 0x09, 0xd8, 0xa0, 0xd4, 0x84, 0x97,\r
+    0x10, 0x3c, 0xe7, 0xca, 0x01, 0xa6, 0x6d, 0x8a, 0xf2, 0x7e, 0xc5, 0x65,\r
+    0x1e, 0x37, 0xa6, 0xbc, 0x16, 0x99, 0xf2, 0x7a, 0x43, 0x4d, 0xcc, 0xb8,\r
+    0x22, 0x59, 0x0e, 0x2a, 0xf9, 0x1a, 0x45, 0xb9, 0x11, 0xb6, 0xe3, 0xbd,\r
+    0x94, 0xed, 0x34, 0xcc, 0x1b, 0x2e, 0x77, 0xa9, 0x72, 0x1f, 0xee, 0xe2,\r
+    0x5c, 0xe6, 0x87, 0xf5, 0xfc, 0x70, 0xb9, 0x17, 0xb0, 0xea, 0xf2, 0xaa,\r
+    0xb5, 0x79, 0xf6, 0x6a, 0xd9, 0x09, 0x78, 0x60, 0x7b, 0xde, 0x8b, 0x98,\r
+    0xe6, 0x21, 0x12, 0xae, 0xc7, 0x7b, 0x09, 0x97, 0x4b, 0xe0, 0xd7, 0xa2,\r
+    0x96, 0x5d, 0x29, 0x22, 0xe7, 0x32, 0x7b, 0x63, 0xca, 0xdf, 0xa5, 0x98,\r
+    0xd6, 0x62, 0x27, 0xe6, 0x7a, 0x7c, 0x37, 0x65, 0x1a, 0x00, 0x38, 0xb1,\r
+    0x41, 0x94, 0xb8, 0x35, 0x8e, 0x21, 0x08, 0x4b, 0xde, 0xcd, 0xd9, 0x1e,\r
+    0xab, 0x43, 0xd1, 0x36, 0xa5, 0x5b, 0xe3, 0xb0, 0x6b, 0x97, 0xfd, 0xb2,\r
+    0xea, 0x74, 0xc9, 0x77, 0x59, 0x96, 0xaf, 0x2e, 0x9c, 0x31, 0x56, 0x1c,\r
+    0x7c, 0x43, 0x63, 0x3f, 0x5c, 0x8b, 0x29, 0x5b, 0x71, 0xbb, 0x7d, 0x00,\r
+    0xd7, 0x63, 0x3b, 0xce, 0x0d, 0xcb, 0xf8, 0x4e, 0xc4, 0xb4, 0x83, 0x44,\r
+    0x1b, 0x69, 0x6d, 0xdb, 0x81, 0x29, 0xca, 0x1f, 0x8e, 0x9b, 0xf1, 0xec,\r
+    0x46, 0xd2, 0x36, 0x86, 0x48, 0xdf, 0x18, 0x5a, 0xb3, 0x9f, 0xc4, 0x38,\r
+    0x09, 0xe8, 0xb6, 0x4f, 0x50, 0xcd, 0xf6, 0xb9, 0xa8, 0xb1, 0x29, 0x9e,\r
+    0x48, 0xc4, 0xcd, 0x23, 0x63, 0x89, 0xb8, 0x61, 0x66, 0xbb, 0x8e, 0x46,\r
+    0x8e, 0x47, 0x48, 0x4c, 0x90, 0x36, 0x31, 0x4e, 0xae, 0x89, 0xf1, 0x71,\r
+    0x30, 0x13, 0x60, 0xf0, 0x51, 0x33, 0x11, 0x31, 0x63, 0xe9, 0x64, 0x3c,\r
+    0xd6, 0x1d, 0x49, 0xa5, 0xba, 0x47, 0xa3, 0xd9, 0xf8, 0xf1, 0x78, 0xf6,\r
+    0x54, 0x88, 0x56, 0xe4, 0xe4, 0xd1, 0xa4, 0x99, 0x85, 0x8f, 0xee, 0x31,\r
+    0xa6, 0x27, 0xb3, 0x21, 0x1a, 0x9d, 0x88, 0x26, 0x67, 0xba, 0xed, 0x6a,\r
+    0x87, 0xac, 0x86, 0xa2, 0xb2, 0x21, 0x38, 0x89, 0xc3, 0xc9, 0x31, 0x33,\r
+    0x79, 0x22, 0x61, 0xc4, 0x8e, 0x18, 0xbb, 0xe7, 0xd2, 0xd1, 0xe9, 0x48,\r
+    0xc6, 0xd8, 0x1d, 0x49, 0x47, 0x66, 0x32, 0xad, 0x9b, 0xe6, 0xe2, 0x89,\r
+    0x98, 0x91, 0x0e, 0xd1, 0xfa, 0x4f, 0xeb, 0x22, 0x44, 0x63, 0x9f, 0xbc,\r
+    0xea, 0x5e, 0x23, 0x93, 0x4a, 0x9a, 0x19, 0x63, 0x22, 0x9e, 0x41, 0x4f,\r
+    0xb8, 0xfd, 0xc1, 0x25, 0x9c, 0x2c, 0xc8, 0xde, 0x7c, 0xd8, 0x9d, 0x9f,\r
+    0xa4, 0x5a, 0x88, 0x36, 0x7c, 0x12, 0xf3, 0xc9, 0x6c, 0x24, 0xeb, 0x88,\r
+    0xb0, 0x77, 0x79, 0x75, 0xb7, 0x26, 0x92, 0x27, 0xac, 0xe4, 0x86, 0x68,\r
+    0x99, 0xd1, 0x21, 0x1b, 0x73, 0x09, 0x0c, 0xe3, 0x52, 0x39, 0xc0, 0x78,\r
+    0x67, 0xe6, 0x66, 0xee, 0x1a, 0xba, 0xa5, 0x5a, 0x59, 0x50, 0x2d, 0x44,\r
+    0xeb, 0x96, 0xe8, 0x87, 0x32, 0xbf, 0x7b, 0x88, 0xba, 0x96, 0xa8, 0xb8,\r
+    0x3b, 0x9d, 0x8c, 0xcd, 0x45, 0xb3, 0x9b, 0x8d, 0x6c, 0x24, 0x9e, 0xc8,\r
+    0x84, 0x68, 0xe3, 0x27, 0xb2, 0xbf, 0xbb, 0xbd, 0xb6, 0xa5, 0xea, 0xab,\r
+    0xa9, 0xbc, 0xf4, 0xe4, 0xb5, 0x27, 0x7d, 0xe6, 0xee, 0x46, 0x86, 0x96,\r
+    0xd9, 0x48, 0x66, 0x5f, 0x2a, 0x86, 0xe9, 0x10, 0x9b, 0x9f, 0xb1, 0x4b,\r
+    0x2d, 0xba, 0x3d, 0x73, 0x46, 0xfa, 0xd4, 0xc2, 0x9c, 0x2c, 0x5e, 0x74,\r
+    0xe3, 0x4b, 0x34, 0xfe, 0xf1, 0x2e, 0x94, 0xdf, 0xf9, 0x85, 0xf0, 0xe9,\r
+    0xa3, 0x51, 0xae, 0x96, 0xce, 0xe2, 0xc7, 0x46, 0x13, 0xa2, 0xe1, 0x65,\r
+    0x75, 0x44, 0x8d, 0x57, 0x66, 0x71, 0x1a, 0x06, 0x3e, 0x45, 0xed, 0x10,\r
+    0x05, 0x65, 0xad, 0xf4, 0x4c, 0x26, 0xd1, 0x7d, 0x14, 0xdb, 0x6b, 0xf7,\r
+    0x5d, 0x7b, 0x6c, 0x6b, 0xef, 0x72, 0x8c, 0xfa, 0x96, 0x63, 0xd4, 0xbf,\r
+    0x1c, 0xa3, 0x81, 0xe5, 0x18, 0x0d, 0x86, 0x68, 0xe5, 0x92, 0x81, 0xdf,\r
+    0xb3, 0xbc, 0xd0, 0xef, 0x59, 0x4e, 0x83, 0xeb, 0x96, 0xd3, 0xe0, 0xd0,\r
+    0xf2, 0x1a, 0x1c, 0xc2, 0x5d, 0x7c, 0xa9, 0xe0, 0x39, 0xa6, 0x58, 0x24,\r
+    0x71, 0x3c, 0x7e, 0x0c, 0x07, 0x92, 0x99, 0xc4, 0x1e, 0x1a, 0x4f, 0x9a,\r
+    0xdd, 0x5b, 0xcc, 0x68, 0x22, 0x99, 0xc1, 0xf1, 0xb7, 0xd3, 0xc8, 0x4e,\r
+    0x27, 0x63, 0x21, 0x6a, 0xfa, 0x08, 0xa3, 0x71, 0x13, 0x47, 0xc1, 0x58,\r
+    0x22, 0x92, 0xc1, 0xe6, 0xd1, 0xf8, 0x11, 0xfa, 0xc9, 0xf8, 0x11, 0x33,\r
+    0x92, 0x9d, 0x4b, 0x1b, 0x21, 0xf2, 0x4e, 0xf0, 0x01, 0xda, 0x9d, 0x88,\r
+    0x98, 0x47, 0xba, 0xef, 0x3f, 0x74, 0xd4, 0x88, 0x62, 0xfb, 0xac, 0x72,\r
+    0xc8, 0xf6, 0xce, 0x99, 0x66, 0xe4, 0x50, 0x62, 0x91, 0xe5, 0x64, 0x36,\r
+    0x8d, 0x10, 0x42, 0x54, 0x6d, 0x59, 0xce, 0x65, 0xe3, 0x89, 0xee, 0xd1,\r
+    0x74, 0x3a, 0x72, 0x8a, 0x57, 0xf5, 0xc7, 0x88, 0x87, 0xed, 0xb6, 0xe6,\r
+    0xad, 0x11, 0x5e, 0x8d, 0xc3, 0xc3, 0x58, 0x32, 0x91, 0x40, 0x00, 0xe8,\r
+    0x66, 0x2e, 0x06, 0x69, 0x3b, 0x9e, 0x35, 0xd2, 0x91, 0x6c, 0x12, 0x87,\r
+    0x9b, 0xc7, 0x61, 0x6d, 0x35, 0xb5, 0x58, 0x32, 0x4c, 0x62, 0x3f, 0xb9,\r
+    0xf6, 0xe3, 0xae, 0xa0, 0xe3, 0x03, 0xb7, 0x81, 0xfd, 0xb8, 0x0d, 0xec,\r
+    0xe7, 0xbb, 0xc1, 0xfe, 0x89, 0xed, 0x94, 0x87, 0x0f, 0x8b, 0x67, 0x3d,\r
+    0x5f, 0x12, 0x20, 0x61, 0x22, 0x0e, 0x92, 0x76, 0x70, 0x82, 0x2a, 0xa7,\r
+    0x1c, 0x5d, 0xb7, 0xd3, 0xb1, 0x40, 0x68, 0xf7, 0xbc, 0x38, 0x12, 0x8d,\r
+    0x1a, 0x99, 0x4c, 0x6b, 0x4f, 0x4f, 0x0f, 0xd9, 0x7c, 0xaf, 0x83, 0xef,\r
+    0x73, 0xf0, 0xfd, 0xe0, 0x4b, 0x2c, 0xfb, 0xad, 0x89, 0xc8, 0x91, 0x0c,\r
+    0x55, 0x46, 0xee, 0xbe, 0x47, 0x90, 0x2b, 0x12, 0x8b, 0x51, 0x3e, 0x3e,\r
+    0x46, 0x13, 0x09, 0xd0, 0x0c, 0xf7, 0x8f, 0x4a, 0xd5, 0x1d, 0xc4, 0xba,\r
+    0xec, 0x50, 0xde, 0x21, 0xbe, 0x66, 0x50, 0x45, 0x34, 0x89, 0x11, 0x8e,\r
+    0x66, 0x47, 0xcd, 0xd8, 0x96, 0x93, 0x46, 0x74, 0x2e, 0x6b, 0x90, 0x1b,\r
+    0x22, 0x3e, 0xd3, 0x46, 0x33, 0xa7, 0xcc, 0x28, 0x95, 0xab, 0x92, 0xbd,\r
+    0x5f, 0x53, 0x8d, 0x21, 0x47, 0x71, 0xb7, 0x61, 0xc6, 0x30, 0x70, 0xb6,\r
+    0x38, 0x43, 0xa5, 0x10, 0xe0, 0x9c, 0x62, 0x67, 0x48, 0x3b, 0xf9, 0x0d,\r
+    0xcb, 0xdd, 0xfd, 0xe6, 0x82, 0x6b, 0x82, 0xc3, 0xc2, 0x75, 0xc4, 0xc8,\r
+    0x52, 0x15, 0x3e, 0xd4, 0x6e, 0xc7, 0x51, 0x5a, 0xdb, 0x10, 0x79, 0x58,\r
+    0xaa, 0xb6, 0x26, 0x79, 0xe4, 0x2f, 0x90, 0x84, 0x93, 0xc7, 0x0c, 0x93,\r
+    0xca, 0x61, 0x63, 0x9f, 0x1d, 0x63, 0xc9, 0x98, 0x41, 0x65, 0xd3, 0xb8,\r
+    0x6d, 0x25, 0x72, 0xb7, 0x29, 0x2a, 0xc0, 0x9d, 0x6a, 0x17, 0xee, 0x62,\r
+    0xa4, 0x4f, 0x27, 0xd1, 0xff, 0xbc, 0xb8, 0x89, 0xcb, 0x1b, 0xbe, 0x4e,\r
+    0x64, 0x1c, 0x57, 0xaf, 0x18, 0x79, 0xe3, 0x19, 0x15, 0xe0, 0xe4, 0x5c,\r
+    0x2a, 0x95, 0x4c, 0xe3, 0x3c, 0xa1, 0x82, 0x78, 0x66, 0xcb, 0x4c, 0x2a,\r
+    0x7b, 0x8a, 0x95, 0x5b, 0x0d, 0x39, 0xbd, 0x17, 0x28, 0xf7, 0x1a, 0x91,\r
+    0xd8, 0x29, 0x2a, 0x8c, 0xab, 0xc9, 0x44, 0x15, 0x89, 0xc8, 0x9c, 0x19,\r
+    0x9d, 0x56, 0x7e, 0xf8, 0xb6, 0x41, 0xba, 0x19, 0x99, 0x31, 0xa8, 0xd8,\r
+    0x34, 0x4e, 0xa8, 0xeb, 0x1c, 0x24, 0x1c, 0x4b, 0x63, 0xd2, 0x74, 0x34,\r
+    0x6f, 0xf7, 0xd1, 0xee, 0x07, 0x35, 0x24, 0xed, 0x74, 0x4d, 0x1a, 0xe9,\r
+    0xe3, 0xf1, 0xa8, 0xb1, 0x39, 0x9e, 0xc1, 0x00, 0x70, 0x52, 0x11, 0x57,\r
+    0x8d, 0x43, 0x9b, 0x9d, 0x4b, 0x6d, 0xc5, 0xed, 0x36, 0x33, 0x0d, 0x79,\r
+    0x45, 0xd2, 0x44, 0x5e, 0x79, 0xcc, 0x72, 0x8e, 0x6a, 0x93, 0xe6, 0xc2,\r
+    0x73, 0x2e, 0xa7, 0xf1, 0x42, 0x63, 0xef, 0xfa, 0xea, 0x00, 0x25, 0x58,\r
+    0x5b, 0x27, 0x89, 0xad, 0xc8, 0x59, 0xd7, 0xa7, 0x16, 0xdc, 0x20, 0xa4,\r
+    0xd5, 0x58, 0x24, 0x91, 0x38, 0x84, 0x79, 0x47, 0x2b, 0x52, 0xca, 0x7e,\r
+    0x2c, 0x39, 0x93, 0x4a, 0x18, 0x08, 0x31, 0xa7, 0xaa, 0x9d, 0x57, 0xc9,\r
+    0xc0, 0xe6, 0x35, 0x75, 0xb6, 0x46, 0x4e, 0xcb, 0x85, 0x0e, 0x2b, 0x67,\r
+    0xef, 0x3e, 0xa0, 0xa9, 0xf6, 0x23, 0x84, 0xd6, 0xdc, 0xf4, 0x7d, 0x84,\r
+    0x66, 0x1c, 0x91, 0x50, 0x99, 0xa5, 0xb0, 0x7b, 0x43, 0xca, 0xaf, 0x5d,\r
+    0xb6, 0x6a, 0x7b, 0x17, 0x1a, 0xc9, 0x8a, 0xae, 0xf4, 0x9c, 0x49, 0x25,\r
+    0x19, 0x23, 0xcb, 0x93, 0x91, 0x6f, 0xc1, 0xe4, 0x46, 0x41, 0x65, 0x72,\r
+    0x3c, 0x46, 0x65, 0xf3, 0x25, 0xb9, 0xa8, 0x1c, 0xe5, 0xf0, 0xa9, 0x94,\r
+    0x41, 0x1e, 0xd6, 0xab, 0x66, 0xac, 0x69, 0xaa, 0x67, 0xe2, 0xa7, 0x0d,\r
+    0x2a, 0xcf, 0x64, 0x23, 0xe9, 0xac, 0x63, 0xf2, 0x17, 0x64, 0xe6, 0x0e,\r
+    0x49, 0x0f, 0x3a, 0x18, 0x2c, 0x1e, 0xfe, 0x8c, 0xa6, 0xe3, 0x29, 0x5e,\r
+    0x3b, 0x19, 0xca, 0xcf, 0x4e, 0xc7, 0xb1, 0x21, 0x28, 0xda, 0x4b, 0xee,\r
+    0xe3, 0x91, 0x44, 0x6b, 0x44, 0x7d, 0xed, 0xa0, 0x12, 0x2e, 0xc5, 0xac,\r
+    0x2b, 0x1d, 0x55, 0x71, 0x21, 0xb7, 0xd6, 0x26, 0xe7, 0xe4, 0x5e, 0x42,\r
+    0xc5, 0x2c, 0x4d, 0xc9, 0xef, 0x13, 0x54, 0x2d, 0x79, 0x6b, 0x18, 0xc7,\r
+    0x63, 0xf8, 0x92, 0x12, 0x3f, 0x1c, 0x47, 0xc7, 0x3c, 0x0e, 0x31, 0xc7,\r
+    0x8e, 0xbd, 0xc4, 0x21, 0xc9, 0x84, 0x93, 0x7b, 0x78, 0x2c, 0xac, 0xa6,\r
+    0xed, 0x21, 0xa3, 0x0a, 0x69, 0xb2, 0xa0, 0x83, 0xa5, 0x4e, 0x51, 0xc6,\r
+    0x0a, 0x2e, 0x9b, 0x1c, 0x9b, 0x36, 0x30, 0x41, 0xf2, 0xa0, 0x9b, 0x33,\r
+    0x68, 0xf6, 0xcc, 0x99, 0xcd, 0x43, 0x8f, 0x06, 0x78, 0xce, 0x60, 0x93,\r
+    0x08, 0x6c, 0x08, 0xc4, 0x8c, 0x93, 0x81, 0x8e, 0x00, 0xbe, 0x20, 0xa5,\r
+    0xe2, 0x09, 0x79, 0x18, 0x75, 0xce, 0x60, 0x05, 0x43, 0x91, 0x36, 0x12,\r
+    0x06, 0xbe, 0x09, 0x41, 0x89, 0xc5, 0xdb, 0x19, 0x65, 0x27, 0x98, 0xd6,\r
+    0x99, 0xc0, 0x86, 0xc3, 0x91, 0x44, 0xc6, 0xe8, 0x08, 0xcc, 0xc4, 0xcd,\r
+    0x4e, 0x7c, 0x7b, 0x0a, 0x6c, 0xe8, 0xed, 0x08, 0x1c, 0x37, 0xd2, 0x19,\r
+    0x64, 0x0b, 0xb5, 0xfa, 0xbb, 0xfa, 0xbb, 0xfa, 0x7a, 0x3a, 0x63, 0xc6,\r
+    0xf1, 0xb5, 0x91, 0x64, 0x26, 0xd5, 0x1b, 0x78, 0x8c, 0xb4, 0x55, 0xe2,\r
+    0x79, 0xd1, 0x90, 0x87, 0x3f, 0xfb, 0xd5, 0xfa, 0x36, 0xfa, 0x1a, 0x7c,\r
+    0x79, 0x5a, 0x2b, 0x04, 0x75, 0x13, 0xda, 0x4a, 0x6d, 0x8f, 0x4e, 0x66,\r
+    0x93, 0x55, 0xdc, 0x61, 0x91, 0xb1, 0x85, 0xd6, 0x4d, 0xb6, 0xf5, 0x2e,\r
+    0x4b, 0xbd, 0xd3, 0x22, 0x5d, 0x16, 0x19, 0xb6, 0x48, 0xc8, 0x22, 0x83,\r
+    0x16, 0x19, 0xb1, 0x3c, 0xe8, 0x3e, 0xa1, 0x5a, 0x93, 0xcd, 0x5b, 0x45,\r
+    0x76, 0x27, 0x8b, 0x05, 0x88, 0x66, 0xa3, 0x6f, 0x9d, 0x4f, 0xf7, 0xad,\r
+    0xf7, 0xe5, 0x84, 0x85, 0x3e, 0x0d, 0x22, 0x4b, 0x2c, 0x03, 0xc5, 0xeb,\r
+    0x7a, 0x41, 0x17, 0xfd, 0xc2, 0xfe, 0xdf, 0x72, 0xf6, 0xac, 0x7e, 0xc3,\r
+    0x17, 0x10, 0xef, 0xfb, 0x48, 0x13, 0x42, 0x97, 0xe2, 0x20, 0x64, 0xef,\r
+    0xd4, 0xb6, 0x8a, 0x0f, 0x6b, 0xc9, 0x25, 0x44, 0xbe, 0x6d, 0xba, 0x12,\r
+    0xe2, 0xb7, 0x56, 0xac, 0x12, 0x77, 0xf0, 0xb6, 0x53, 0x88, 0x22, 0x5b,\r
+    0xbc, 0x1a, 0xe2, 0xe7, 0xea, 0xda, 0xc4, 0xf5, 0x3a, 0x12, 0x42, 0xb8,\r
+    0x2f, 0xfa, 0xd7, 0x40, 0x70, 0xb9, 0xbe, 0x5d, 0xbc, 0x5a, 0xcf, 0x82,\r
+    0xd2, 0x8b, 0xfe, 0xb5, 0x10, 0x9c, 0x6d, 0xe8, 0x10, 0x97, 0x1b, 0xb8,\r
+    0x62, 0x99, 0x5d, 0xb1, 0x13, 0xe2, 0x77, 0x1a, 0xba, 0xc4, 0xd9, 0x46,\r
+    0x34, 0xad, 0x55, 0x48, 0x71, 0x37, 0x64, 0x37, 0x1a, 0x7b, 0xc4, 0x9d,\r
+    0x46, 0x21, 0xce, 0xe2, 0x5d, 0x91, 0x10, 0x95, 0x17, 0xfd, 0x7d, 0x10,\r
+    0x5e, 0x6d, 0xea, 0x17, 0xf8, 0x85, 0x11, 0x62, 0xac, 0x92, 0x86, 0x03,\r
+    0x5c, 0xb9, 0x69, 0x50, 0x7c, 0x08, 0x59, 0xa9, 0xbb, 0xc6, 0x2b, 0xb4,\r
+    0x7b, 0x3e, 0x7f, 0x56, 0x7f, 0xbd, 0x45, 0x5c, 0xf0, 0x5f, 0xf1, 0xe3,\r
+    0xe3, 0x42, 0x00, 0x1f, 0x2f, 0x73, 0xf1, 0xc5, 0x80, 0xd0, 0x5e, 0x0d,\r
+    0xb8, 0xb4, 0x17, 0x83, 0x9a, 0xf6, 0xc3, 0x60, 0xc1, 0x39, 0xbc, 0xeb,\r
+    0x72, 0x40, 0xd7, 0x6e, 0xad, 0x1a, 0x16, 0xb7, 0x02, 0x42, 0x9c, 0x0f,\r
+    0x6a, 0xe2, 0xba, 0x5f, 0x13, 0x3f, 0x6c, 0x06, 0xef, 0x17, 0xe2, 0x72,\r
+    0xab, 0x10, 0xaf, 0x03, 0x37, 0x81, 0x7f, 0x6c, 0xcd, 0x13, 0xd7, 0x57,\r
+    0x0a, 0x71, 0x0b, 0xb8, 0xbe, 0x0a, 0x2f, 0x02, 0xf0, 0xf0, 0xfb, 0x80,\r
+    0x44, 0xab, 0xf5, 0x2e, 0xe2, 0x31, 0xd0, 0xf3, 0x8a, 0x7f, 0xca, 0xc1,\r
+    0x5f, 0x52, 0x3c, 0xdb, 0x3e, 0xaf, 0xf4, 0xdf, 0x70, 0xe8, 0xbf, 0xed,\r
+    0xe0, 0xbf, 0xe3, 0xe0, 0x5f, 0x77, 0xf0, 0x7f, 0xe6, 0xe0, 0xff, 0xd2,\r
+    0xc1, 0xff, 0x44, 0xf1, 0xec, 0xfb, 0x1d, 0xf0, 0x4c, 0x7f, 0xa5, 0xe8,\r
+    0x7f, 0x29, 0x5a, 0x8e, 0x17, 0x85, 0x27, 0x1d, 0xf1, 0xc2, 0x44, 0xbe,\r
+    0x57, 0x49, 0x41, 0x76, 0x5e, 0xc9, 0x59, 0xc6, 0xcf, 0xc5, 0x45, 0xe5,\r
+    0x2b, 0x8b, 0xea, 0xf1, 0xfb, 0xa7, 0xcb, 0x90, 0x7d, 0x73, 0x91, 0x9d,\r
+    0x9d, 0x0f, 0xe9, 0x04, 0x1f, 0x6f, 0x2d, 0xd2, 0xdf, 0x5c, 0x54, 0xbe,\r
+    0xb5, 0xa8, 0x7c, 0x67, 0x51, 0x39, 0xa1, 0xca, 0xfc, 0xae, 0x93, 0x9f,\r
+    0xad, 0x00, 0xb7, 0xbb, 0x0d, 0xf4, 0x03, 0xd0, 0xed, 0x2c, 0xc4, 0x0b,\r
+    0x99, 0x09, 0x10, 0x0f, 0xe8, 0x2e, 0xd0, 0x42, 0x50, 0xeb, 0xed, 0x94,\r
+    0x95, 0x07, 0x36, 0xe1, 0x7c, 0x5c, 0x06, 0x52, 0x00, 0xbf, 0xdf, 0xe9,\r
+    0x07, 0x6e, 0x81, 0xe1, 0x77, 0x3b, 0x9b, 0x00, 0xfe, 0x8d, 0x9f, 0x0e,\r
+    0xca, 0x7f, 0x0f, 0xe2, 0xdf, 0xf9, 0x71, 0x7b, 0xfc, 0xb7, 0x6c, 0xfe,\r
+    0xad, 0x1f, 0x8a, 0xf2, 0xfd, 0x15, 0xff, 0xde, 0x4f, 0xf8, 0xad, 0xdf,\r
+    0x42, 0xf1, 0x6f, 0xfe, 0x5c, 0xe0, 0xf9, 0xdd, 0x2b, 0xff, 0x5d, 0x52,\r
+    0xa0, 0x41, 0x7e, 0x3f, 0xc4, 0x7f, 0xff, 0xd5, 0x20, 0xe7, 0xb6, 0xf8,\r
+    0x37, 0x81, 0x3a, 0x78, 0x7e, 0x47, 0xc7, 0x73, 0x83, 0xc0, 0xf3, 0x7b,\r
+    0x30, 0xfe, 0xbb, 0xb0, 0x0b, 0xf6, 0x52, 0x8e, 0x3e, 0xe4, 0x2b, 0x39,\r
+    0xff, 0xcd, 0x98, 0x03, 0xe7, 0x58, 0xf9, 0x05, 0xdf, 0xff, 0x01, 0x8d,\r
+    0xe0, 0xfe, 0xb8, 0xc4, 0x28, 0x00, 0x00\r
+};\r
+\r
 //==============================================================================\r
 struct InAppPurchases::Pimpl\r
 {\r
@@ -328,7 +729,11 @@ private:
       CALLBACK (purchaseCompletedCallback,   "purchaseCompletedCallback",   "(JLcom/android/billingclient/api/Purchase;I)V")                              \\r
       CALLBACK (purchaseConsumedCallback,    "purchaseConsumedCallback",    "(JLjava/lang/String;I)V")\r
 \r
-    DECLARE_JNI_CLASS (JuceBillingClient, "com/rmsl/juce/JuceBillingClient")\r
+    DECLARE_JNI_CLASS_WITH_BYTECODE (JuceBillingClient,\r
+                                     "com/rmsl/juce/JuceBillingClient",\r
+                                     16,\r
+                                     juceBillingClientCompiled,\r
+                                     numElementsInArray (juceBillingClientCompiled))\r
     #undef JNI_CLASS_MEMBERS\r
 \r
     static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList)\r
@@ -545,10 +950,10 @@ private:
             return;\r
         }\r
 \r
-        getEnv()->CallObjectMethod (billingClient,\r
-                                    JuceBillingClient.consumePurchase,\r
-                                    LocalRef<jstring> { javaString (productIdentifier) }.get(),\r
-                                    LocalRef<jstring> { javaString (purchaseToken) }.get());\r
+        getEnv()->CallVoidMethod (billingClient,\r
+                                  JuceBillingClient.consumePurchase,\r
+                                  LocalRef<jstring> { javaString (productIdentifier) }.get(),\r
+                                  LocalRef<jstring> { javaString (purchaseToken) }.get());\r
     }\r
 \r
     //==============================================================================\r
index 246515174c85a59ea6c0b766b297f7af776f2fde..d08cc542f9b784770050201788f0e734d79a0ae1 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_video\r
   vendor:             juce\r
-  version:            7.0.1\r
+  version:            7.0.2\r
   name:               JUCE video playback and capture classes\r
   description:        Classes for playing video and capturing camera input.\r
   website:            http://www.juce.com/juce\r
index cc6782c3d7612fdc98b7eab3ee85fe97ad1ceeb9..97a48c5a2a46f1fc3cbcd2192128c66fec814030 100644 (file)
   ==============================================================================\r
 */\r
 \r
-#if (defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
- #define JUCE_USE_NEW_CAMERA_API 1\r
-#endif\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
 \r
 struct CameraDevice::Pimpl\r
 {\r
@@ -141,7 +138,6 @@ struct CameraDevice::Pimpl
 private:\r
     static NSArray<AVCaptureDevice*>* getDevices()\r
     {\r
-       #if JUCE_USE_NEW_CAMERA_API\r
         if (@available (iOS 10.0, *))\r
         {\r
             std::unique_ptr<NSMutableArray<AVCaptureDeviceType>, NSObjectDeleter> deviceTypes ([[NSMutableArray alloc] initWithCapacity: 2]);\r
@@ -161,7 +157,6 @@ private:
 \r
             return [discoverySession devices];\r
         }\r
-       #endif\r
 \r
         return [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo];\r
     }\r
@@ -207,22 +202,18 @@ private:
         JUCE_CAMERA_LOG ("Supports custom exposure: " + String ((int)[device isExposureModeSupported: AVCaptureExposureModeCustom]));\r
         JUCE_CAMERA_LOG ("Supports point of interest exposure: " + String ((int)device.exposurePointOfInterestSupported));\r
 \r
-       #if JUCE_USE_NEW_CAMERA_API\r
         if (@available (iOS 10.0, *))\r
         {\r
             JUCE_CAMERA_LOG ("Device type: " + nsStringToJuce (device.deviceType));\r
             JUCE_CAMERA_LOG ("Locking focus with custom lens position supported: " + String ((int)device.lockingFocusWithCustomLensPositionSupported));\r
         }\r
-       #endif\r
 \r
-       #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
         if (@available (iOS 11.0, *))\r
         {\r
             JUCE_CAMERA_LOG ("Min available video zoom factor: " + String (device.minAvailableVideoZoomFactor));\r
             JUCE_CAMERA_LOG ("Max available video zoom factor: " + String (device.maxAvailableVideoZoomFactor));\r
             JUCE_CAMERA_LOG ("Dual camera switch over video zoom factor: " + String (device.dualCameraSwitchOverVideoZoomFactor));\r
         }\r
-       #endif\r
 \r
         JUCE_CAMERA_LOG ("Capture formats start-------------------");\r
         for (AVCaptureDeviceFormat* format in device.formats)\r
@@ -238,7 +229,6 @@ private:
     {\r
         JUCE_CAMERA_LOG ("Media type: " + nsStringToJuce (format.mediaType));\r
 \r
-       #if JUCE_USE_NEW_CAMERA_API\r
         if (@available (iOS 10.0, *))\r
         {\r
             String colourSpaces;\r
@@ -255,7 +245,6 @@ private:
 \r
             JUCE_CAMERA_LOG ("Supported colour spaces: " + colourSpaces);\r
         }\r
-       #endif\r
 \r
         JUCE_CAMERA_LOG ("Video field of view: " + String (format.videoFieldOfView));\r
         JUCE_CAMERA_LOG ("Video max zoom factor: " + String (format.videoMaxZoomFactor));\r
@@ -289,13 +278,11 @@ private:
         JUCE_CAMERA_LOG ("Cinematic video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeCinematic]));\r
         JUCE_CAMERA_LOG ("Auto video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeAuto]));\r
 \r
-       #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
         if (@available (iOS 11.0, *))\r
         {\r
             JUCE_CAMERA_LOG ("Min zoom factor for depth data delivery: " + String (format.videoMinZoomFactorForDepthDataDelivery));\r
             JUCE_CAMERA_LOG ("Max zoom factor for depth data delivery: " + String (format.videoMaxZoomFactorForDepthDataDelivery));\r
         }\r
-       #endif\r
     }\r
 \r
     static String getHighResStillImgDimensionsString (CMVideoDimensions d)\r
@@ -592,14 +579,12 @@ private:
                   captureOutput (createCaptureOutput()),\r
                   photoOutputDelegate (nullptr)\r
             {\r
-               #if JUCE_USE_NEW_CAMERA_API\r
                 if (@available (iOS 10.0, *))\r
                 {\r
                     static PhotoOutputDelegateClass cls;\r
                     photoOutputDelegate.reset ([cls.createInstance() init]);\r
                     PhotoOutputDelegateClass::setOwner (photoOutputDelegate.get(), this);\r
                 }\r
-               #endif\r
 \r
                 captureSession.addOutputIfPossible (captureOutput);\r
             }\r
@@ -619,7 +604,6 @@ private:
 \r
                 if (auto* connection = findVideoConnection (captureOutput))\r
                 {\r
-                   #if JUCE_USE_NEW_CAMERA_API\r
                     if (@available (iOS 10.0, *))\r
                     {\r
                         if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
@@ -634,7 +618,6 @@ private:
                             return;\r
                         }\r
                     }\r
-                   #endif\r
 \r
                     auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
                     auto outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
@@ -671,17 +654,14 @@ private:
         private:\r
             static AVCaptureOutput* createCaptureOutput()\r
             {\r
-               #if JUCE_USE_NEW_CAMERA_API\r
                 if (@available (iOS 10.0, *))\r
                     return [AVCapturePhotoOutput new];\r
-               #endif\r
 \r
                 return [AVCaptureStillImageOutput new];\r
             }\r
 \r
             static void printImageOutputDebugInfo (AVCaptureOutput* captureOutput)\r
             {\r
-               #if JUCE_USE_NEW_CAMERA_API\r
                 if (@available (iOS 10.0, *))\r
                 {\r
                     if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
@@ -704,7 +684,6 @@ private:
                         JUCE_CAMERA_LOG ("Live photo capture supported: " + String ((int) photoOutput.livePhotoCaptureSupported));\r
 \r
 \r
-                       #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
                         if (@available (iOS 11.0, *))\r
                         {\r
                             typesString.clear();\r
@@ -732,12 +711,10 @@ private:
                             JUCE_CAMERA_LOG ("Camera calibration data delivery supported: " + String ((int) photoOutput.cameraCalibrationDataDeliverySupported));\r
                             JUCE_CAMERA_LOG ("Depth data delivery supported: " + String ((int) photoOutput.depthDataDeliverySupported));\r
                         }\r
-                       #endif\r
 \r
                         return;\r
                     }\r
                 }\r
-               #endif\r
 \r
                 auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
 \r
@@ -765,7 +742,6 @@ private:
             }\r
 \r
             //==============================================================================\r
-           #if JUCE_USE_NEW_CAMERA_API\r
             class API_AVAILABLE (ios (10.0)) PhotoOutputDelegateClass : public ObjCClass<NSObject>\r
             {\r
             public:\r
@@ -776,13 +752,11 @@ private:
                     addMethod (@selector (captureOutput:didCapturePhotoForResolvedSettings:),        didCaptureForSettings);\r
                     addMethod (@selector (captureOutput:didFinishCaptureForResolvedSettings:error:), didFinishCaptureForSettings);\r
 \r
-                   #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
                     if (@available (iOS 11.0, *))\r
                     {\r
                         addMethod (@selector (captureOutput:didFinishProcessingPhoto:error:), didFinishProcessingPhoto);\r
                     }\r
                     else\r
-                   #endif\r
                     {\r
                         addMethod (@selector (captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:), didFinishProcessingPhotoSampleBuffer);\r
                     }\r
@@ -972,7 +946,6 @@ private:
                     }\r
                 }\r
             };\r
-           #endif\r
 \r
             //==============================================================================\r
             void callListeners (const Image& image)\r
@@ -1023,10 +996,8 @@ private:
 \r
             void startRecording (const File& file, AVCaptureVideoOrientation orientationToUse)\r
             {\r
-               #if JUCE_USE_NEW_CAMERA_API\r
                 if (@available (iOS 10.0, *))\r
                     printVideoOutputDebugInfo (movieFileOutput);\r
-               #endif\r
 \r
                 auto url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
                                       isDirectory: NO];\r
@@ -1332,6 +1303,4 @@ String CameraDevice::getFileExtension()
     return ".mov";\r
 }\r
 \r
-#if JUCE_USE_NEW_CAMERA_API\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-#endif\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
index dbbcca6606fde1b2df2e6a20ef0f77cbdfbc77e2..28748f8de2eafe13456b485b6fbff90ad91f71e8 100644 (file)
@@ -341,10 +341,8 @@ private:
 \r
             const auto codecType = []\r
             {\r
-               #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
                 if (@available (macOS 10.13, *))\r
                    return AVVideoCodecTypeJPEG;\r
-               #endif\r
 \r
                 return AVVideoCodecJPEG;\r
             }();\r