From: IOhannes m zmölnig (Debian/GNU) Date: Wed, 17 Aug 2022 05:55:26 +0000 (+0200) Subject: New upstream version 7.0.2~ds0 X-Git-Tag: archive/raspbian/7.0.2_ds0-1+rpi1^2~21^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=171d2629ce485b53473e083d817adce326d27acf;p=juce.git New upstream version 7.0.2~ds0 --- diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index 90568f22..000e4d36 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -1,6 +1,38 @@ JUCE breaking changes ===================== +Version 7.0.2 +============= + +Change +------ +The Matrix3D (Vector3D vector) constructor has been replaced with an +explicit static Matrix3D fromTranslation (Vector3D 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 ============= diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c764030..438e2bbc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/ChangeList.txt b/ChangeList.txt index 9eaf8a5e..43cd12a5 100644 --- a/ChangeList.txt +++ b/ChangeList.txt @@ -3,6 +3,12 @@ This file just lists the more notable headline features. For more detailed info about changes and bugfixes please see the git log and BREAKING-CHANGES.txt. +Version 7.0.2 + - Fixed accessibility table navigation + - Fixed Android file access on older APIs + - Improved Linux VST3 threading + - Improved ARA integration + Version 7.0.1 - Fixed some Xcode and MSVC compiler warnings - Improved VST3 bus configuration and channel handling diff --git a/README.md b/README.md index 3faaced1..5024834c 100644 --- 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)) diff --git a/docs/CMake API.md b/docs/CMake API.md index f03752b6..059c73ab 100644 --- a/docs/CMake API.md +++ b/docs/CMake API.md @@ -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 diff --git a/examples/Audio/AudioPlaybackDemo.h b/examples/Audio/AudioPlaybackDemo.h index b3745609..dd457ce5 100644 --- a/examples/Audio/AudioPlaybackDemo.h +++ b/examples/Audio/AudioPlaybackDemo.h @@ -48,6 +48,21 @@ #include "../Assets/DemoUtilities.h" +inline std::unique_ptr makeInputSource (const URL& url) +{ + #if JUCE_ANDROID + if (auto doc = AndroidDocument::fromDocument (url)) + return std::make_unique (doc); + #endif + + #if ! JUCE_IOS + if (url.isLocalFile()) + return std::make_unique (url.getLocalFile()); + #endif + + return std::make_unique (url); +} + //============================================================================== class DemoThumbnailComp : public Component, public ChangeListener, @@ -83,23 +98,9 @@ public: void setURL (const URL& url) { - InputSource* inputSource = nullptr; - - #if ! JUCE_IOS - if (url.isLocalFile()) - { - inputSource = new FileInputSource (url.getLocalFile()); - } - else - #endif - { - if (inputSource == nullptr) - inputSource = new URLInputSource (url); - } - - if (inputSource != nullptr) + if (auto inputSource = makeInputSource (url)) { - thumbnail.setSource (inputSource); + thumbnail.setSource (inputSource.release()); Range newRange (0.0, thumbnail.getTotalLength()); scrollbar.setRangeLimits (newRange); @@ -210,7 +211,6 @@ public: } } - private: AudioTransportSource& transportSource; Slider& zoomSlider; @@ -313,7 +313,7 @@ public: zoomSlider.onValueChange = [this] { thumbnail->setZoomFactor (zoomSlider.getValue()); }; zoomSlider.setSkewFactor (2); - thumbnail.reset (new DemoThumbnailComp (formatManager, transportSource, zoomSlider)); + thumbnail = std::make_unique (formatManager, transportSource, zoomSlider); addAndMakeVisible (thumbnail.get()); thumbnail->addChangeListener (this); @@ -445,34 +445,30 @@ private: transportSource.setSource (nullptr); currentAudioFileSource.reset(); - AudioFormatReader* reader = nullptr; + const auto source = makeInputSource (audioURL); - #if ! JUCE_IOS - if (audioURL.isLocalFile()) - { - reader = formatManager.createReaderFor (audioURL.getLocalFile()); - } - else - #endif - { - if (reader == nullptr) - reader = formatManager.createReaderFor (audioURL.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress))); - } + if (source == nullptr) + return false; - if (reader != nullptr) - { - currentAudioFileSource.reset (new AudioFormatReaderSource (reader, true)); + auto stream = rawToUniquePtr (source->createInputStream()); - // ..and plug it into our transport source - transportSource.setSource (currentAudioFileSource.get(), - 32768, // tells it to buffer this many samples ahead - &thread, // this is the background thread to use for reading-ahead - reader->sampleRate); // allows for sample rate correction + if (stream == nullptr) + return false; - return true; - } + auto reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream))); + + if (reader == nullptr) + return false; - return false; + currentAudioFileSource = std::make_unique (reader.release(), true); + + // ..and plug it into our transport source + transportSource.setSource (currentAudioFileSource.get(), + 32768, // tells it to buffer this many samples ahead + &thread, // this is the background thread to use for reading-ahead + currentAudioFileSource->getAudioFormatReader()->sampleRate); // allows for sample rate correction + + return true; } void startOrStop() @@ -512,7 +508,7 @@ private: if (FileChooser::isPlatformDialogAvailable()) { - fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif")); + fileChooser = std::make_unique ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"); fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles, [this] (const FileChooser& fc) mutable diff --git a/examples/Audio/MidiDemo.h b/examples/Audio/MidiDemo.h index b5e732e9..35e9db0e 100644 --- a/examples/Audio/MidiDemo.h +++ b/examples/Audio/MidiDemo.h @@ -241,16 +241,17 @@ public: private: //============================================================================== - struct MidiDeviceListBox : public ListBox, - private ListBoxModel + struct MidiDeviceListBox : private ListBoxModel, + public ListBox { MidiDeviceListBox (const String& name, MidiDemo& contentComponent, bool isInputDeviceList) - : ListBox (name, this), + : ListBox (name), parent (contentComponent), isInput (isInputDeviceList) { + setModel (this); setOutlineThickness (1); setMultipleSelectionEnabled (true); setClickingTogglesRowSelection (true); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 51f433f0..3d59811a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -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 diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 34968489..585547ff 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -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" diff --git a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml index 29d7f2a5..c8b3a2a6 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml +++ b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ - diff --git a/examples/DemoRunner/Builds/LinuxMakefile/Makefile b/examples/DemoRunner/Builds/LinuxMakefile/Makefile index 7ab8f1ec..316d4b10 100644 --- a/examples/DemoRunner/Builds/LinuxMakefile/Makefile +++ b/examples/DemoRunner/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj index 52996c3f..c647f0b0 100644 --- a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj @@ -511,7 +511,7 @@ "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", @@ -542,8 +542,8 @@ "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", @@ -603,7 +603,7 @@ "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", @@ -634,8 +634,8 @@ "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", diff --git a/examples/DemoRunner/Builds/MacOSX/Info-App.plist b/examples/DemoRunner/Builds/MacOSX/Info-App.plist index f2298cc2..fecf91cc 100644 --- a/examples/DemoRunner/Builds/MacOSX/Info-App.plist +++ b/examples/DemoRunner/Builds/MacOSX/Info-App.plist @@ -24,9 +24,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.1 + 7.0.2 CFBundleVersion - 7.0.1 + 7.0.2 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj index bcd5def4..1d4e3d08 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -3083,6 +3083,7 @@ + @@ -3243,6 +3244,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters index ca043820..8ab0de03 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters @@ -4647,6 +4647,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -5127,6 +5130,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc index 61b80dc7..3adeec39 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index e86dc644..7bb91c62 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -3083,6 +3083,7 @@ + @@ -3243,6 +3244,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 69922596..453ecdeb 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -4647,6 +4647,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -5127,6 +5130,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc index 61b80dc7..3adeec39 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index dff6b733..7028be67 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\DemoRunner.exe @@ -3083,6 +3083,7 @@ + @@ -3243,6 +3244,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index 5cd4bfcd..5a417351 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -4647,6 +4647,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -5127,6 +5130,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc index 61b80dc7..3adeec39 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj index 7c084b25..8fe50429 100644 --- a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj @@ -519,7 +519,7 @@ "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", @@ -550,8 +550,8 @@ "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", @@ -583,7 +583,7 @@ 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; @@ -611,7 +611,7 @@ "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", @@ -642,8 +642,8 @@ "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", @@ -674,7 +674,7 @@ 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; diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json index e2161546..a3b52e1c 100644 --- a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json @@ -42,18 +42,6 @@ "filename": "Icon-Spotlight-40@3x.png", "scale": "3x" }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon.png", - "scale": "1x" - }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon@2x.png", - "scale": "2x" - }, { "idiom": "iphone", "size": "60x60", @@ -102,30 +90,6 @@ "filename": "Icon-Spotlight-40@2x-1.png", "scale": "2x" }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50@2x.png", - "scale": "2x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72@2x.png", - "scale": "2x" - }, { "idiom": "ipad", "size": "76x76", 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 index 20bcab85..00000000 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 index 5e73c386..00000000 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 index 8248231e..00000000 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 index 4a90fbc6..00000000 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 index d3ac3a6b..00000000 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 index 4dc865cf..00000000 Binary files a/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ diff --git a/examples/DemoRunner/Builds/iOS/Info-App.plist b/examples/DemoRunner/Builds/iOS/Info-App.plist index ca8c27b8..1e254069 100644 --- a/examples/DemoRunner/Builds/iOS/Info-App.plist +++ b/examples/DemoRunner/Builds/iOS/Info-App.plist @@ -30,9 +30,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.1 + 7.0.2 CFBundleVersion - 7.0.1 + 7.0.2 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/DemoRunner.jucer b/examples/DemoRunner/DemoRunner.jucer index 5328e5f2..7bb3ab6c 100644 --- a/examples/DemoRunner/DemoRunner.jucer +++ b/examples/DemoRunner/DemoRunner.jucer @@ -1,7 +1,7 @@ systemRequestedQuit(); } + #if JUCE_IOS || JUCE_ANDROID + void parentSizeChanged() override + { + getMainComponent().resized(); + } + #endif + //============================================================================== MainComponent& getMainComponent() { return *dynamic_cast (getContentComponent()); } diff --git a/examples/DemoRunner/Source/UI/MainComponent.cpp b/examples/DemoRunner/Source/UI/MainComponent.cpp index e6a59a8e..ceff6d5b 100644 --- a/examples/DemoRunner/Source/UI/MainComponent.cpp +++ b/examples/DemoRunner/Source/UI/MainComponent.cpp @@ -358,7 +358,7 @@ void MainComponent::resized() auto bounds = getLocalBounds(); if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (getScreenBounds())) - return display->safeAreaInsets.subtractedFrom (bounds); + return display->safeAreaInsets.subtractedFrom (display->keyboardInsets.subtractedFrom (bounds)); return bounds; }(); diff --git a/examples/GUI/MDIDemo.h b/examples/GUI/MDIDemo.h index e5564d3b..0c877583 100644 --- a/examples/GUI/MDIDemo.h +++ b/examples/GUI/MDIDemo.h @@ -151,6 +151,12 @@ public: } } + void activeDocumentChanged() override + { + if (auto* activeDoc = getActiveDocument()) + Logger::outputDebugString ("activeDocumentChanged() to " + activeDoc->getName()); + } + private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DemoMultiDocumentPanel) }; @@ -171,9 +177,26 @@ public: showInTabsButton.onClick = [this] { updateLayoutMode(); }; addAndMakeVisible (showInTabsButton); - addNoteButton.onClick = [this] { addNote ("Note " + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!"); }; + oneDocShouldBeFullscreenButton.onClick = [this] + { + multiDocumentPanel.useFullscreenWhenOneDocument (oneDocShouldBeFullscreenButton.getToggleState()); + }; + addAndMakeVisible (oneDocShouldBeFullscreenButton); + oneDocShouldBeFullscreenButton.setToggleState (false, juce::sendNotification); + + addNoteButton.onClick = [this] + { + addNote ("Note " + String (noteCounter), "Hello World! " + String (noteCounter)); + ++noteCounter; + }; addAndMakeVisible (addNoteButton); + closeActiveDocumentButton.onClick = [this] + { + multiDocumentPanel.closeDocumentAsync (multiDocumentPanel.getActiveDocument(), false, [] (auto) {}); + }; + addAndMakeVisible (closeActiveDocumentButton); + closeApplicationButton.onClick = [this] { multiDocumentPanel.closeAllDocumentsAsync (true, [] (bool allSaved) @@ -191,7 +214,7 @@ public: addNote ("Notes Demo", "You can drag-and-drop text files onto this page to open them as notes.."); addExistingNotes(); - setSize (500, 500); + setSize (650, 500); } void paint (Graphics& g) override @@ -203,10 +226,15 @@ public: { auto area = getLocalBounds(); - auto buttonArea = area.removeFromTop (28).reduced (2); - closeApplicationButton.setBounds (buttonArea.removeFromRight (150)); - addNoteButton .setBounds (buttonArea.removeFromRight (150)); - showInTabsButton .setBounds (buttonArea); + auto topButtonRow = area.removeFromTop (28).reduced (2); + + showInTabsButton .setBounds (topButtonRow.removeFromLeft (150)); + + closeApplicationButton .setBounds (topButtonRow.removeFromRight (150)); + addNoteButton .setBounds (topButtonRow.removeFromRight (150)); + closeActiveDocumentButton .setBounds (topButtonRow.removeFromRight (150)); + + oneDocShouldBeFullscreenButton.setBounds (area.removeFromTop (28).reduced (2).removeFromLeft (240)); multiDocumentPanel.setBounds (area); } @@ -261,11 +289,14 @@ private: createNotesForFiles (files); } - ToggleButton showInTabsButton { "Show with tabs" }; - TextButton addNoteButton { "Create a new note" }, - closeApplicationButton { "Close app" }; + ToggleButton showInTabsButton { "Show with tabs" }; + ToggleButton oneDocShouldBeFullscreenButton { "Fill screen when only one note is open" }; + TextButton addNoteButton { "Create a new note" }, + closeApplicationButton { "Close app" }, + closeActiveDocumentButton { "Close active document" }; DemoMultiDocumentPanel multiDocumentPanel; + int noteCounter = 1; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MDIDemo) }; diff --git a/examples/GUI/OpenGLAppDemo.h b/examples/GUI/OpenGLAppDemo.h index d1b923ac..ee5cbd65 100644 --- a/examples/GUI/OpenGLAppDemo.h +++ b/examples/GUI/OpenGLAppDemo.h @@ -93,10 +93,10 @@ public: Matrix3D getViewMatrix() const { - Matrix3D viewMatrix ({ 0.0f, 0.0f, -10.0f }); - Matrix3D rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f }); + auto viewMatrix = Matrix3D::fromTranslation ({ 0.0f, 0.0f, -10.0f }); + auto rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f }); - return rotationMatrix * viewMatrix; + return viewMatrix * rotationMatrix; } void render() override diff --git a/examples/GUI/OpenGLDemo.h b/examples/GUI/OpenGLDemo.h index c1bd9cba..8718acdf 100644 --- a/examples/GUI/OpenGLDemo.h +++ b/examples/GUI/OpenGLDemo.h @@ -893,10 +893,10 @@ public: { const ScopedLock lock (mutex); - auto viewMatrix = draggableOrientation.getRotationMatrix() * Vector3D (0.0f, 1.0f, -10.0f); + auto viewMatrix = Matrix3D::fromTranslation ({ 0.0f, 1.0f, -10.0f }) * draggableOrientation.getRotationMatrix(); auto rotationMatrix = Matrix3D::rotation ({ rotation, rotation, -0.3f }); - return rotationMatrix * viewMatrix; + return viewMatrix * rotationMatrix; } void setTexture (OpenGLUtils::DemoTexture* t) diff --git a/examples/Plugins/ARAPluginDemo.h b/examples/Plugins/ARAPluginDemo.h index abca9566..9d59439a 100644 --- a/examples/Plugins/ARAPluginDemo.h +++ b/examples/Plugins/ARAPluginDemo.h @@ -393,6 +393,8 @@ public: return success; } + using ARAPlaybackRenderer::processBlock; + private: //============================================================================== // We're subclassing here only to provide a proper default c'tor for our shared resource @@ -549,6 +551,8 @@ public: }); } + using ARAEditorRenderer::processBlock; + private: void configure() { @@ -615,6 +619,27 @@ protected: } }; +struct PlayHeadState +{ + void update (AudioPlayHead* aph) + { + const auto info = aph->getPosition(); + + if (info.hasValue() && info->getIsPlaying()) + { + isPlaying.store (true); + timeInSeconds.store (info->getTimeInSeconds().orFallback (0)); + } + else + { + isPlaying.store (false); + } + } + + std::atomic isPlaying { false }; + std::atomic timeInSeconds { 0.0 }; +}; + //============================================================================== class ARADemoPluginAudioProcessorImpl : public AudioProcessor, public AudioProcessorARAExtension @@ -630,11 +655,13 @@ public: //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override { - prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision()); + playHeadState.isPlaying.store (false); + prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision()); } void releaseResources() override { + playHeadState.isPlaying.store (false); releaseResourcesForARA(); } @@ -653,10 +680,15 @@ public: ScopedNoDenormals noDenormals; - if (! processBlockForARA (buffer, isRealtime(), getPlayHead())) + auto* audioPlayHead = getPlayHead(); + playHeadState.update (audioPlayHead); + + if (! processBlockForARA (buffer, isRealtime(), audioPlayHead)) processBlockBypassed (buffer, midiMessages); } + using AudioProcessor::processBlock; + //============================================================================== const String getName() const override { return "ARAPluginDemo"; } bool acceptsMidi() const override { return true; } @@ -674,6 +706,8 @@ public: void getStateInformation (MemoryBlock&) override {} void setStateInformation (const void*, int) override {} + PlayHeadState playHeadState; + private: //============================================================================== static BusesProperties getBusesProperties() @@ -1043,8 +1077,8 @@ public: void paint (Graphics& g) override { g.fillAll (juce::Colours::yellow.darker (0.2f)); } }; - OverlayComponent(std::function getAudioPlayheadIn) - : getAudioPlayhead (std::move (getAudioPlayheadIn)) + OverlayComponent (PlayHeadState& playHeadStateIn) + : playHeadState (&playHeadStateIn) { addChildComponent (playheadMarker); setInterceptsMouseClicks (false, false); @@ -1074,12 +1108,9 @@ public: private: void doResize() { - auto* aph = getAudioPlayhead(); - const auto info = aph->getPosition(); - - if (info.hasValue() && info->getIsPlaying()) + if (playHeadState->isPlaying.load()) { - const auto markerX = info->getTimeInSeconds().orFallback (0) * pixelPerSecond; + const auto markerX = playHeadState->timeInSeconds.load() * pixelPerSecond; const auto playheadLine = getLocalBounds().withTrimmedLeft ((int) (markerX - markerWidth / 2.0) - horizontalOffset) .removeFromLeft ((int) markerWidth); playheadMarker.setVisible (true); @@ -1098,7 +1129,7 @@ private: static constexpr double markerWidth = 2.0; - std::function getAudioPlayhead; + PlayHeadState* playHeadState; double pixelPerSecond = 1.0; int horizontalOffset = 0; PlayheadMarkerComponent playheadMarker; @@ -1110,9 +1141,9 @@ class DocumentView : public Component, private ARAEditorView::Listener { public: - explicit DocumentView (ARADocument& document, std::function getAudioPlayhead) + explicit DocumentView (ARADocument& document, PlayHeadState& playHeadState) : araDocument (document), - overlay (std::move (getAudioPlayhead)) + overlay (playHeadState) { addAndMakeVisible (tracksBackground); @@ -1371,8 +1402,7 @@ public: if (auto* editorView = getARAEditorView()) { auto* document = ARADocumentControllerSpecialisation::getSpecialisedDocumentController(editorView->getDocumentController())->getDocument(); - documentView = std::make_unique (*document, - [this]() { return getAudioProcessor()->getPlayHead(); }); + documentView = std::make_unique (*document, p.playHeadState ); } addAndMakeVisible (documentView.get()); diff --git a/examples/Utilities/PushNotificationsDemo.h b/examples/Utilities/PushNotificationsDemo.h index 1e3f9839..9788dd66 100644 --- a/examples/Utilities/PushNotificationsDemo.h +++ b/examples/Utilities/PushNotificationsDemo.h @@ -197,7 +197,8 @@ public: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Device token") - .withMessage (token), + .withMessage (token) + .withButton ("OK"), nullptr); }; @@ -315,7 +316,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Incorrect notifications setup") - .withMessage ("Please make sure that " + requiredFields + " are set."), + .withMessage ("Please make sure that " + requiredFields + " are set.") + .withButton ("OK"), nullptr); return; @@ -568,7 +570,8 @@ private: .withTitle ("Received notification") .withMessage ("ID: " + n.identifier + ", title: " + n.title - + ", body: " + n.body), + + ", body: " + n.body) + .withButton ("OK"), nullptr); } @@ -586,7 +589,8 @@ private: + ", title: " + n.title + ", body: " + n.body + ", action: " + actionIdentifier - + ", optionalResponse: " + optionalResponse), + + ", optionalResponse: " + optionalResponse) + .withButton ("OK"), nullptr); PushNotifications::getInstance()->removeDeliveredNotification (n.identifier); @@ -599,7 +603,8 @@ private: .withTitle ("Notification dismissed by a user") .withMessage ("ID: " + n.identifier + ", title: " + n.title - + ", body: " + n.body), + + ", body: " + n.body) + .withButton ("OK"), nullptr); } @@ -613,7 +618,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Received notification list") - .withMessage (text), + .withMessage (text) + .withButton ("OK"), nullptr); } @@ -627,7 +633,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Pending notification list") - .withMessage (text), + .withMessage (text) + .withButton ("OK"), nullptr); } @@ -636,7 +643,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Device token refreshed") - .withMessage (token), + .withMessage (token) + .withButton ("OK"), nullptr); } @@ -646,7 +654,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Remote notifications deleted") - .withMessage ("Some of the pending messages were removed!"), + .withMessage ("Some of the pending messages were removed!") + .withButton ("OK"), nullptr); } @@ -655,7 +664,8 @@ private: NativeMessageBox::showAsync (MessageBoxOptions() .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Upstream message sent") - .withMessage ("Message id: " + messageId), + .withMessage ("Message id: " + messageId) + .withButton ("OK"), nullptr); } @@ -665,7 +675,8 @@ private: .withIconType (MessageBoxIconType::InfoIcon) .withTitle ("Upstream message sending error") .withMessage ("Message id: " + messageId - + "\nerror: " + error), + + "\nerror: " + error) + .withButton ("OK"), nullptr); } @@ -1223,7 +1234,8 @@ private: .withMessage ("In order to be able to test remote notifications " "ensure that the app is signed and that you register " "the bundle ID for remote notifications in " - "Apple Developer Center."), + "Apple Developer Center.") + .withButton ("OK"), nullptr); #endif } diff --git a/extras/AudioPerformanceTest/AudioPerformanceTest.jucer b/extras/AudioPerformanceTest/AudioPerformanceTest.jucer index 7731ae5a..22ae4616 100644 --- a/extras/AudioPerformanceTest/AudioPerformanceTest.jucer +++ b/extras/AudioPerformanceTest/AudioPerformanceTest.jucer @@ -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" gradleToolchainVersion="3.6" androidMinimumSDK="23"> - - + diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index c5991e6a..b2721c9c 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -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" diff --git a/extras/AudioPerformanceTest/Builds/Android/app/build.gradle b/extras/AudioPerformanceTest/Builds/Android/app/build.gradle index ee50f921..74166841 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/build.gradle +++ b/extras/AudioPerformanceTest/Builds/Android/app/build.gradle @@ -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" diff --git a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile index 39e14471..85998ab5 100644 --- a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj index 66c23fcc..4b040710 100644 --- a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -329,7 +329,7 @@ "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", @@ -392,7 +392,7 @@ "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", diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj index bc3bd4d1..03a877a6 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\AudioPerformanceTest.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\AudioPerformanceTest.exe @@ -2684,6 +2684,7 @@ + @@ -2796,6 +2797,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index 2c6f134f..d8d4fa21 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -4068,6 +4068,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4404,6 +4407,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj index f117fded..dd6e81db 100644 --- a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -346,7 +346,7 @@ "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", @@ -382,7 +382,7 @@ 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; @@ -408,7 +408,7 @@ "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", @@ -445,7 +445,7 @@ 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; diff --git a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json index e2161546..a3b52e1c 100644 --- a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -42,18 +42,6 @@ "filename": "Icon-Spotlight-40@3x.png", "scale": "3x" }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon.png", - "scale": "1x" - }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon@2x.png", - "scale": "2x" - }, { "idiom": "iphone", "size": "60x60", @@ -102,30 +90,6 @@ "filename": "Icon-Spotlight-40@2x-1.png", "scale": "2x" }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50@2x.png", - "scale": "2x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72@2x.png", - "scale": "2x" - }, { "idiom": "ipad", "size": "76x76", diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index 09277e3d..5e1d2c72 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -153,9 +153,8 @@ microphonePermissionNeeded="1" androidBluetoothNeeded="1" smallIcon="c97aUr" bigIcon="c97aUr" androidExtraAssetsFolder="../../examples/Assets"> - + diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index e191d43f..ced17566 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -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" diff --git a/extras/AudioPluginHost/Builds/Android/app/build.gradle b/extras/AudioPluginHost/Builds/Android/app/build.gradle index 10f55263..99042080 100644 --- a/extras/AudioPluginHost/Builds/Android/app/build.gradle +++ b/extras/AudioPluginHost/Builds/Android/app/build.gradle @@ -47,7 +47,7 @@ android { productFlavors { debug_ { ndk { - abiFilters "armeabi-v7a", "x86" + abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } externalNativeBuild { cmake { diff --git a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile index b3af118b..fb0581a4 100644 --- a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj index 3804671b..7108cf0d 100644 --- a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj @@ -443,7 +443,7 @@ "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", @@ -583,7 +583,7 @@ "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", diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj index bf7d83b5..ff0d416b 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -2867,6 +2867,7 @@ + @@ -2979,6 +2980,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters index c1ba13c7..71f69c73 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters @@ -4347,6 +4347,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4683,6 +4686,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index a44827cc..563ae87d 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -2867,6 +2867,7 @@ + @@ -2979,6 +2980,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index 3b4beb21..5c056fd7 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -4347,6 +4347,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4683,6 +4686,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj index 763931e7..7022f9a1 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\AudioPluginHost.exe @@ -2867,6 +2867,7 @@ + @@ -2979,6 +2980,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index 431df436..46ac0640 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -4347,6 +4347,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4683,6 +4686,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj index d6823c82..a7248509 100644 --- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj @@ -456,7 +456,7 @@ "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", @@ -519,7 +519,7 @@ 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; @@ -597,7 +597,7 @@ "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", @@ -659,7 +659,7 @@ 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; diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json index e2161546..a3b52e1c 100644 --- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json @@ -42,18 +42,6 @@ "filename": "Icon-Spotlight-40@3x.png", "scale": "3x" }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon.png", - "scale": "1x" - }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon@2x.png", - "scale": "2x" - }, { "idiom": "iphone", "size": "60x60", @@ -102,30 +90,6 @@ "filename": "Icon-Spotlight-40@2x-1.png", "scale": "2x" }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50@2x.png", - "scale": "2x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72@2x.png", - "scale": "2x" - }, { "idiom": "ipad", "size": "76x76", 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 index f6958df7..00000000 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 index 1ce0b564..00000000 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 index 34d611ef..00000000 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 index fb85c660..00000000 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 index ca140a65..00000000 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 index 0e9ec6b9..00000000 Binary files a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ diff --git a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp index ef6cca45..4141210d 100644 --- a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp +++ b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp @@ -25,7 +25,7 @@ #include "ARAPlugin.h" -#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlRootTag { "ARATestHostContext" }; const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlAudioFileAttrib { "AudioFile" }; diff --git a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h index be6353b9..33cb6e76 100644 --- a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h +++ b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h @@ -27,7 +27,7 @@ #include -#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) #include @@ -179,7 +179,7 @@ class PlaybackRegion properties.transformationFlags = ARA::kARAPlaybackTransformationNoChanges; properties.startInModificationTime = 0.0; const auto& formatReader = audioSource.getFormatReader(); - properties.durationInModificationTime = formatReader.lengthInSamples / formatReader.sampleRate; + properties.durationInModificationTime = (double) formatReader.lengthInSamples / formatReader.sampleRate; properties.startInPlaybackTime = 0.0; properties.durationInPlaybackTime = properties.durationInModificationTime; properties.musicalContextRef = sequence.getMusicalContext().getPluginRef(); diff --git a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp index 9645492d..0701dd82 100644 --- a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp +++ b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp @@ -106,7 +106,7 @@ void PluginGraph::addPluginCallback (std::unique_ptr instan } else { - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) if (useARA == PluginDescriptionAndPreference::UseARA::yes && instance->getPluginDescription().hasARAExtension) { @@ -410,7 +410,7 @@ void PluginGraph::createNodeFromXml (const XmlElement& xml) graph.getBlockSize(), errorMessage); - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) if (instance && description.useARA == PluginDescriptionAndPreference::UseARA::yes && description.pluginDescription.hasARAExtension) diff --git a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp index e68e0c09..195f47ae 100644 --- a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp +++ b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp @@ -427,7 +427,7 @@ struct GraphEditorPanel::PluginComponent : public Component, menu->addItem ("Show all parameters", [this] { showWindow (PluginWindow::Type::generic); }); menu->addItem ("Show debug log", [this] { showWindow (PluginWindow::Type::debug); }); - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) if (auto* instance = dynamic_cast (getProcessor())) if (instance->getPluginDescription().hasARAExtension && isNodeUsingARA()) menu->addItem ("Show ARA host controls", [this] { showWindow (PluginWindow::Type::araHost); }); diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp index 2f5338f1..b911a6e8 100644 --- a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp +++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp @@ -662,7 +662,7 @@ static void addToMenu (const KnownPluginList::PluginTree& tree, addPlugin (PluginDescriptionAndPreference { plugin, PluginDescriptionAndPreference::UseARA::no }, name); - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) if (plugin.hasARAExtension) { name << " (ARA)"; diff --git a/extras/AudioPluginHost/Source/UI/PluginWindow.h b/extras/AudioPluginHost/Source/UI/PluginWindow.h index b53fb7be..c84518ac 100644 --- a/extras/AudioPluginHost/Source/UI/PluginWindow.h +++ b/extras/AudioPluginHost/Source/UI/PluginWindow.h @@ -245,7 +245,7 @@ private: if (type == PluginWindow::Type::araHost) { - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) if (auto* araPluginInstanceWrapper = dynamic_cast (&processor)) if (auto* ui = araPluginInstanceWrapper->createARAHostEditor()) return ui; diff --git a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile index b91df6b1..58dd5d45 100644 --- a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile +++ b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj index 6ee40c57..835c8731 100644 --- a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj +++ b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj @@ -201,7 +201,7 @@ "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", @@ -299,7 +299,7 @@ "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", diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj index 2135aa0e..71be7f93 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj +++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\BinaryBuilder.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\BinaryBuilder.exe @@ -547,6 +547,7 @@ + diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters index 213893c2..5284ca0c 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters +++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters @@ -660,6 +660,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/Build/CMake/JUCECheckAtomic.cmake b/extras/Build/CMake/JUCECheckAtomic.cmake index 4ffe75be..46bfd6a4 100644 --- a/extras/Build/CMake/JUCECheckAtomic.cmake +++ b/extras/Build/CMake/JUCECheckAtomic.cmake @@ -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 + + int main (int argc, char** argv) + { + std::atomic ll { static_cast (argc) }; + ll ^= static_cast (ll.is_lock_free()); + return static_cast (ll); + } + ]]) + + set(test_simple_atomic_file_contents [[ #include @@ -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) diff --git a/extras/Build/CMake/JUCEModuleSupport.cmake b/extras/Build/CMake/JUCEModuleSupport.cmake index 5fe0323a..555a72c4 100644 --- a/extras/Build/CMake/JUCEModuleSupport.cmake +++ b/extras/Build/CMake/JUCEModuleSupport.cmake @@ -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) diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index 9b2a9cda..7f7c13b8 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -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") diff --git a/extras/Build/juce_build_tools/juce_build_tools.h b/extras/Build/juce_build_tools/juce_build_tools.h index 2776b4cd..6a776947 100644 --- a/extras/Build/juce_build_tools/juce_build_tools.h +++ b/extras/Build/juce_build_tools/juce_build_tools.h @@ -34,7 +34,7 @@ ID: juce_build_tools vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE Build Tools description: Classes for generating intermediate files for JUCE projects. website: http://www.juce.com/juce diff --git a/extras/Build/juce_build_tools/utils/juce_Icons.cpp b/extras/Build/juce_build_tools/utils/juce_Icons.cpp index fe3d036f..ef500726 100644 --- a/extras/Build/juce_build_tools/utils/juce_Icons.cpp +++ b/extras/Build/juce_build_tools/utils/juce_Icons.cpp @@ -341,8 +341,6 @@ namespace build_tools { "iphone", "29x29", "Icon-29@3x.png", "3x", 87 }, { "iphone", "40x40", "Icon-Spotlight-40@2x.png", "2x", 80 }, { "iphone", "40x40", "Icon-Spotlight-40@3x.png", "3x", 120 }, - { "iphone", "57x57", "Icon.png", "1x", 57 }, - { "iphone", "57x57", "Icon@2x.png", "2x", 114 }, { "iphone", "60x60", "Icon-60@2x.png", "2x", 120 }, { "iphone", "60x60", "Icon-@3x.png", "3x", 180 }, { "ipad", "20x20", "Icon-Notifications-20.png", "1x", 20 }, @@ -351,10 +349,6 @@ namespace build_tools { "ipad", "29x29", "Icon-Small@2x-1.png", "2x", 58 }, { "ipad", "40x40", "Icon-Spotlight-40.png", "1x", 40 }, { "ipad", "40x40", "Icon-Spotlight-40@2x-1.png", "2x", 80 }, - { "ipad", "50x50", "Icon-Small-50.png", "1x", 50 }, - { "ipad", "50x50", "Icon-Small-50@2x.png", "2x", 100 }, - { "ipad", "72x72", "Icon-72.png", "1x", 72 }, - { "ipad", "72x72", "Icon-72@2x.png", "2x", 144 }, { "ipad", "76x76", "Icon-76.png", "1x", 76 }, { "ipad", "76x76", "Icon-76@2x.png", "2x", 152 }, { "ipad", "83.5x83.5", "Icon-83.5@2x.png", "2x", 167 }, diff --git a/extras/Build/juceaide/Main.cpp b/extras/Build/juceaide/Main.cpp index e128608c..0892dcad 100644 --- a/extras/Build/juceaide/Main.cpp +++ b/extras/Build/juceaide/Main.cpp @@ -270,6 +270,7 @@ juce::build_tools::PlistOptions parsePlistOptions (const juce::File& file, updateField ("PLUGIN_AU_MAIN_TYPE", result.auMainType); updateField ("IS_AU_SANDBOX_SAFE", result.isAuSandboxSafe); updateField ("IS_PLUGIN_SYNTH", result.isPluginSynth); + updateField ("IS_PLUGIN_ARA_EFFECT", result.isPluginARAEffect); updateField ("SUPPRESS_AU_PLIST_RESOURCE_USAGE", result.suppressResourceUsage); updateField ("BUNDLE_ID", result.bundleIdentifier); updateField ("ICON_FILE", result.iconFile); diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index e0db546b..e75d8c21 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -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" diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle b/extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle index 16896ee5..fd520d30 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle @@ -47,7 +47,7 @@ android { productFlavors { debug_ { ndk { - abiFilters "armeabi-v7a", "x86" + abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } externalNativeBuild { cmake { diff --git a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile index 158da4f8..44040973 100644 --- a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile +++ b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj index bea59e01..5d700e9f 100644 --- a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -369,7 +369,7 @@ "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", @@ -534,7 +534,7 @@ "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", diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj index 963df9e7..4296299f 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\JUCE Network Graphics Demo.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\JUCE Network Graphics Demo.exe @@ -2775,6 +2775,7 @@ + @@ -2887,6 +2888,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index 4e18658e..44a2998b 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -4209,6 +4209,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4545,6 +4548,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj index 1d29545b..4940ed4a 100644 --- a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -386,7 +386,7 @@ "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", @@ -426,7 +426,7 @@ 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; @@ -554,7 +554,7 @@ "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", @@ -593,7 +593,7 @@ 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; diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json index e2161546..a3b52e1c 100644 --- a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -42,18 +42,6 @@ "filename": "Icon-Spotlight-40@3x.png", "scale": "3x" }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon.png", - "scale": "1x" - }, - { - "idiom": "iphone", - "size": "57x57", - "filename": "Icon@2x.png", - "scale": "2x" - }, { "idiom": "iphone", "size": "60x60", @@ -102,30 +90,6 @@ "filename": "Icon-Spotlight-40@2x-1.png", "scale": "2x" }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "50x50", - "filename": "Icon-Small-50@2x.png", - "scale": "2x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72.png", - "scale": "1x" - }, - { - "idiom": "ipad", - "size": "72x72", - "filename": "Icon-72@2x.png", - "scale": "2x" - }, { "idiom": "ipad", "size": "76x76", 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 index 52ec77a6..00000000 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 index 54b2c964..00000000 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 index 3328c842..00000000 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 index 66506473..00000000 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 index 3ce58cfe..00000000 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 index 21c396fa..00000000 Binary files a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ diff --git a/extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer b/extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer index bc5acc0d..a6441828 100644 --- a/extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer +++ b/extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer @@ -111,8 +111,8 @@ androidCpp11="1" targetFolder="Builds/Android" bigIcon="Ww6bQw" gradleToolchainVersion="3.6"> - + diff --git a/extras/Projucer/Builds/LinuxMakefile/Makefile b/extras/Projucer/Builds/LinuxMakefile/Makefile index 6f21d6bc..a0f93a7f 100644 --- a/extras/Projucer/Builds/LinuxMakefile/Makefile +++ b/extras/Projucer/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/Projucer/Builds/MacOSX/Info-App.plist b/extras/Projucer/Builds/MacOSX/Info-App.plist index fbbdb09d..255ae69c 100644 --- a/extras/Projucer/Builds/MacOSX/Info-App.plist +++ b/extras/Projucer/Builds/MacOSX/Info-App.plist @@ -22,9 +22,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.1 + 7.0.2 CFBundleVersion - 7.0.1 + 7.0.2 NSHumanReadableCopyright Raw Material Software Limited NSHighResolutionCapable diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj index 102ec193..ff3b8511 100644 --- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj +++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj @@ -1133,7 +1133,7 @@ "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", @@ -1151,8 +1151,8 @@ "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", @@ -1203,7 +1203,7 @@ "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", @@ -1221,8 +1221,8 @@ "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", diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index f92cdb18..83c0c597 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -1780,6 +1780,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index ef1cbed5..748c79a5 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -2661,6 +2661,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/Projucer/Builds/VisualStudio2017/resources.rc b/extras/Projucer/Builds/VisualStudio2017/resources.rc index b4d97f23..842cf681 100644 --- a/extras/Projucer/Builds/VisualStudio2017/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj index e0ed5ea0..ba0a4ff2 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -1780,6 +1780,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters index 416c18b1..c3b4cd56 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters @@ -2661,6 +2661,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/Projucer/Builds/VisualStudio2019/resources.rc b/extras/Projucer/Builds/VisualStudio2019/resources.rc index b4d97f23..842cf681 100644 --- a/extras/Projucer/Builds/VisualStudio2019/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj index 35340f2a..6a8f866d 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\Projucer.exe @@ -1780,6 +1780,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters index 114af8d8..dcac9aae 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters @@ -2661,6 +2661,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/Projucer/Builds/VisualStudio2022/resources.rc b/extras/Projucer/Builds/VisualStudio2022/resources.rc index b4d97f23..842cf681 100644 --- a/extras/Projucer/Builds/VisualStudio2022/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,1,0 +FILEVERSION 7,0,2,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.1\0" + VALUE "FileVersion", "7.0.2\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.1\0" + VALUE "ProductVersion", "7.0.2\0" END END diff --git a/extras/Projucer/JuceLibraryCode/JuceHeader.h b/extras/Projucer/JuceLibraryCode/JuceHeader.h index 05270d7a..1653f927 100644 --- a/extras/Projucer/JuceLibraryCode/JuceHeader.h +++ b/extras/Projucer/JuceLibraryCode/JuceHeader.h @@ -44,7 +44,7 @@ namespace ProjectInfo { const char* const projectName = "Projucer"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "7.0.1"; - const int versionNumber = 0x70001; + const char* const versionString = "7.0.2"; + const int versionNumber = 0x70002; } #endif diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index 93041af3..d27c80ca 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -1,7 +1,7 @@ diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index 2efff415..563f18be 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -499,6 +499,9 @@ public: { vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr }, getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::linux), TargetOS::linux); + + araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr }, + getAppSettings().getStoredPath (Ids::araPath, TargetOS::linux), TargetOS::linux); } //============================================================================== diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 41840292..6344807c 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -167,8 +167,21 @@ public: String getCustomResourceFoldersString() const { return customXcodeResourceFoldersValue.get().toString().replaceCharacters ("\r\n", "::"); } String getCustomXcassetsFolderString() const { return customXcassetsFolderValue.get(); } + + Optional getCustomXcassetsFolder() const + { + const auto customXcassetsPath = getCustomXcassetsFolderString(); + + if (customXcassetsPath.isEmpty()) + return {}; + + return build_tools::RelativePath { customXcassetsPath, build_tools::RelativePath::projectFolder }; + } + String getCustomLaunchStoryboardString() const { return customLaunchStoryboardValue.get(); } - bool shouldAddStoryboardToProject() const { return getCustomLaunchStoryboardString().isNotEmpty() || getCustomXcassetsFolderString().isEmpty(); } + + bool shouldAddStoryboardToProject() const { return getCustomLaunchStoryboardString().isNotEmpty() + || (! customXcassetsFolderContainsLaunchImage()); } bool isHardenedRuntimeEnabled() const { return hardenedRuntimeValue.get(); } Array getHardenedRuntimeOptions() const { return *hardenedRuntimeOptionsValue.get().getArray(); } @@ -301,8 +314,8 @@ public: { props.add (new TextPropertyComponent (customXcassetsFolderValue, "Custom Xcassets Folder", 128, false), "If this field is not empty, your Xcode project will use the custom xcassets folder specified here " - "for the app icons and launchimages, and will ignore the Icon files specified above. This will also prevent " - "a launch storyboard from being used."); + "for the app icons, and will ignore the Icon files specified above. If the provided xcassets folder " + "contains a launchimage it will be used, unless a custom storyboard is specified."); props.add (new TextPropertyComponent (customLaunchStoryboardValue, "Custom Launch Storyboard", 256, false), "If this field is not empty then the specified launch storyboard file will be added to the project as an Xcode " @@ -2681,7 +2694,7 @@ private: folders.removeEmptyStrings(); for (auto& crf : folders) - addCustomResourceFolder (crf); + addCustomResourceFolder (build_tools::RelativePath { crf, build_tools::RelativePath::projectFolder }); } void addSubprojects() const @@ -2787,19 +2800,43 @@ private: void addXcassets() const { - auto customXcassetsPath = getCustomXcassetsFolderString(); - - if (customXcassetsPath.isEmpty()) - addDefaultXcassetsFolders(); + if (const auto customXcassetsPath = getCustomXcassetsFolder()) + addCustomResourceFolder (*customXcassetsPath, "folder.assetcatalog"); else - addCustomResourceFolder (customXcassetsPath, "folder.assetcatalog"); + addDefaultXcassetsFolders(); } - void addCustomResourceFolder (String folderPathRelativeToProjectFolder, const String fileType = "folder") const + File makeFile (const build_tools::RelativePath& path) const { - auto folderPath = build_tools::RelativePath (folderPathRelativeToProjectFolder, build_tools::RelativePath::projectFolder) - .rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder) - .toUnixStyle(); + switch (path.getRoot()) + { + case build_tools::RelativePath::projectFolder: + return getProject().getProjectFolder().getChildFile (path.toUnixStyle()); + + case build_tools::RelativePath::buildTargetFolder: + return getTargetFolder().getChildFile (path.toUnixStyle()); + + case build_tools::RelativePath::unknown: + jassertfalse; + } + + return {}; + } + + bool customXcassetsFolderContainsLaunchImage() const + { + if (const auto xcassetsFolder = getCustomXcassetsFolder()) + return makeFile (*xcassetsFolder).getChildFile ("LaunchImage.launchimage").exists(); + + return false; + } + + void addCustomResourceFolder (const build_tools::RelativePath& path, const String fileType = "folder") const + { + jassert (path.getRoot() == build_tools::RelativePath::projectFolder); + + auto folderPath = path.rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder) + .toUnixStyle(); auto fileRefID = createFileRefID (folderPath); diff --git a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile index 92120566..2c7ebd71 100644 --- a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile +++ b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile @@ -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 diff --git a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj index 67a02072..3d05bd8e 100644 --- a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj +++ b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj @@ -408,7 +408,7 @@ "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", @@ -541,7 +541,7 @@ "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", diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj index 9b03accb..8c216b9f 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -2933,6 +2933,7 @@ + @@ -3045,6 +3046,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters index e8f79131..aaaf298f 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4437,6 +4437,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4773,6 +4776,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index ff969891..9928fd8d 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -2933,6 +2933,7 @@ + @@ -3045,6 +3046,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 5f251458..a60b3465 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4437,6 +4437,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4773,6 +4776,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj index 91873108..20584fb4 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\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) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\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) - _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) + _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) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\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) - _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) + _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) $(OutDir)\UnitTestRunner.exe @@ -2933,6 +2933,7 @@ + @@ -3045,6 +3046,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index f34e2d5d..dfe10afe 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4437,6 +4437,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4773,6 +4776,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/extras/UnitTestRunner/Source/Main.cpp b/extras/UnitTestRunner/Source/Main.cpp index b78d5c1f..db4abf25 100644 --- a/extras/UnitTestRunner/Source/Main.cpp +++ b/extras/UnitTestRunner/Source/Main.cpp @@ -92,11 +92,29 @@ int main (int argc, char **argv) else runner.runAllTests (seed); - Logger::setCurrentLogger (nullptr); + std::vector failures; for (int i = 0; i < runner.getNumResults(); ++i) - if (runner.getResult(i)->failures > 0) - return 1; + { + auto* result = runner.getResult (i); + + if (result->failures > 0) + failures.push_back (result->unitTestName + " / " + result->subcategoryName + ": " + String (result->failures) + " test failure" + (result->failures > 1 ? "s" : "")); + } + + if (! failures.empty()) + { + logger.writeToLog (newLine + "Test failure summary:" + newLine); + + for (const auto& failure : failures) + logger.writeToLog (failure); + + Logger::setCurrentLogger (nullptr); + return 1; + } + + logger.writeToLog (newLine + "All tests completed successfully"); + Logger::setCurrentLogger (nullptr); return 0; } diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj index acfad0b3..42b8349d 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\juce_dll.lib @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _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) + _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) $(OutDir)\juce_dll.lib @@ -2751,6 +2751,7 @@ + @@ -2863,6 +2864,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters index b7d5cfa7..473d86c6 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters @@ -4176,6 +4176,9 @@ JUCE Modules\juce_audio_processors\utilities\ARA + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities\ARA @@ -4512,6 +4515,9 @@ JUCE Modules\juce_core\network + + JUCE Modules\juce_core\streams + JUCE Modules\juce_core\streams diff --git a/modules/juce_analytics/juce_analytics.h b/modules/juce_analytics/juce_analytics.h index 2c96fd16..42eae71c 100644 --- a/modules/juce_analytics/juce_analytics.h +++ b/modules/juce_analytics/juce_analytics.h @@ -35,7 +35,7 @@ ID: juce_analytics vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE analytics classes description: Classes to collect analytics and send to destinations website: http://www.juce.com/juce diff --git a/modules/juce_audio_basics/juce_audio_basics.h b/modules/juce_audio_basics/juce_audio_basics.h index 5a7ad2f5..46d5883a 100644 --- a/modules/juce_audio_basics/juce_audio_basics.h +++ b/modules/juce_audio_basics/juce_audio_basics.h @@ -32,7 +32,7 @@ ID: juce_audio_basics vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE audio and MIDI data classes description: Classes for audio buffer manipulation, midi message handling, synthesis, etc. website: http://www.juce.com/juce diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h index 1e80fb20..6695c0ac 100644 --- a/modules/juce_audio_devices/juce_audio_devices.h +++ b/modules/juce_audio_devices/juce_audio_devices.h @@ -32,7 +32,7 @@ ID: juce_audio_devices vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE audio and MIDI I/O device classes description: Classes to play and record from audio and MIDI I/O devices website: http://www.juce.com/juce diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp index a3821a6e..12c8b338 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -293,10 +293,8 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater options |= (AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionAllowBluetooth); - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (@available (iOS 10.0, *)) options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP; - #endif } JUCE_NSERROR_CHECK ([[AVAudioSession sharedInstance] setCategory: category @@ -705,13 +703,17 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") Image getIcon (int size) { - if (interAppAudioConnected) + if (@available (macCatalyst 14.0, *)) { - UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size); - if (hostUIImage != nullptr) - return juce_createImageFromUIImage (hostUIImage); + if (interAppAudioConnected) + { + UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size); + if (hostUIImage != nullptr) + return juce_createImageFromUIImage (hostUIImage); + } } - return Image(); + + return {}; } JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif @@ -731,7 +733,6 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater &dataSize); if (err == noErr) { - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (@available (iOS 10.0, *)) { [[UIApplication sharedApplication] openURL: (NSURL*) hostUrl @@ -740,7 +741,6 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater return; } - #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") [[UIApplication sharedApplication] openURL: (NSURL*) hostUrl]; diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index da653987..8e389f52 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -274,7 +274,8 @@ public: if (! remainingSamples.isEmpty()) for (int i = numDestChannels; --i >= 0;) if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int)); + zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile), + (size_t) remainingSamples.getLength() * sizeof (int)); return true; } diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp index d1e0efdb..b47c4a4d 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -216,7 +216,8 @@ public: if (! remainingSamples.isEmpty()) for (int i = numDestChannels; --i >= 0;) if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int)); + zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile), + (size_t) remainingSamples.getLength() * sizeof (int)); return true; } diff --git a/modules/juce_audio_formats/juce_audio_formats.h b/modules/juce_audio_formats/juce_audio_formats.h index 6586d5c9..8eb69c2c 100644 --- a/modules/juce_audio_formats/juce_audio_formats.h +++ b/modules/juce_audio_formats/juce_audio_formats.h @@ -35,7 +35,7 @@ ID: juce_audio_formats vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE audio file format codecs description: Classes for reading and writing various audio file formats. website: http://www.juce.com/juce diff --git a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp index f9aaafe5..d1b055e6 100644 --- a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp @@ -41,28 +41,4 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100) JUCE_END_IGNORE_WARNINGS_MSVC JUCE_END_IGNORE_WARNINGS_GCC_LIKE -namespace juce -{ - -#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS -JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept -{ - #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) - DBG (diagnosis); - #endif - - logAssertion (file, line); - - #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) - if (juce_isRunningUnderDebugger()) - JUCE_BREAK_IN_DEBUGGER; - JUCE_ANALYZER_NORETURN - #endif -} -#endif - -ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name); - -} // namespace juce - #endif 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 index 766c39c6..00000000 --- a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2022 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 7 End-User License - Agreement and JUCE Privacy Policy. - - End User License Agreement: www.juce.com/juce-7-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#if JucePlugin_Enable_ARA -// Configure ARA debug support prior to including ARA SDK headers -namespace juce -{ - -#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS - -#define ARA_ENABLE_INTERNAL_ASSERTS 1 - -extern JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept; - -#if !defined(ARA_HANDLE_ASSERT) -#define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis) -#endif - -#if JUCE_LOG_ASSERTIONS -#define ARA_ENABLE_DEBUG_OUTPUT 1 -#endif - -#else - -#define ARA_ENABLE_INTERNAL_ASSERTS 0 - -#endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS - -} // namespace juce - -#endif diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp index dc2e6cc8..6fba7a1e 100644 --- a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp @@ -23,7 +23,7 @@ ============================================================================== */ -#if JucePlugin_Build_LV2 +#if JucePlugin_Build_LV2 && (! (JUCE_ANDROID || JUCE_IOS)) #ifndef _SCL_SECURE_NO_WARNINGS #define _SCL_SECURE_NO_WARNINGS diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 1e77dee8..b80ae5a5 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -125,6 +125,34 @@ using namespace Steinberg; //============================================================================== #if JUCE_LINUX || JUCE_BSD +enum class HostMessageThreadAttached { no, yes }; + +class HostMessageThreadState +{ +public: + template + void setStateWithAction (HostMessageThreadAttached stateIn, Callback&& action) + { + const std::lock_guard lock { m }; + state = stateIn; + action(); + } + + void assertHostMessageThread() + { + const std::lock_guard lock { m }; + + if (state == HostMessageThreadAttached::no) + return; + + JUCE_ASSERT_MESSAGE_THREAD + } + +private: + HostMessageThreadAttached state = HostMessageThreadAttached::no; + std::mutex m; +}; + class EventHandler final : public Steinberg::Linux::IEventHandler, private LinuxEventLoopInternal::Listener { @@ -141,7 +169,8 @@ public: LinuxEventLoopInternal::deregisterLinuxEventLoopListener (*this); if (! messageThread->isRunning()) - messageThread->start(); + hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::no, + [this]() { messageThread->start(); }); } JUCE_DECLARE_VST3_COM_REF_METHODS @@ -173,6 +202,17 @@ public: refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.erase (runLoop); }); } + /* Asserts if it can be established that the calling thread is different from the host's message + thread. + + On Linux this can only be determined if the host has already registered its run loop. Until + then JUCE messages are serviced by a background thread internal to the plugin. + */ + static void assertHostMessageThread() + { + hostMessageThreadState.assertHostMessageThread(); + } + private: //============================================================================== /* Connects all known FDs to a single host event loop instance. */ @@ -240,7 +280,8 @@ private: if (messageThread->isRunning()) messageThread->stop(); - MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::yes, + [] { MessageManager::getInstance()->setCurrentThreadAsMessageThread(); }); } } @@ -283,13 +324,26 @@ private: std::multiset hostRunLoops; AttachedEventLoop attachedEventLoop; + static HostMessageThreadState hostMessageThreadState; + //============================================================================== JUCE_DECLARE_NON_MOVEABLE (EventHandler) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventHandler) }; +HostMessageThreadState EventHandler::hostMessageThreadState; + #endif +static void assertHostMessageThread() +{ + #if JUCE_LINUX || JUCE_BSD + EventHandler::assertHostMessageThread(); + #else + JUCE_ASSERT_MESSAGE_THREAD + #endif +} + //============================================================================== class InParameterChangedCallbackSetter { @@ -968,25 +1022,8 @@ public: //============================================================================== tresult PLUGIN_API setComponentState (IBStream* stream) override { - if (! MessageManager::existsAndIsCurrentThread()) - #if JUCE_LINUX || JUCE_BSD - { - tresult result = kResultOk; - WaitableEvent finishedEvent; - - MessageManager::callAsync ([&] - { - result = setComponentState (stream); - finishedEvent.signal(); - }); - - finishedEvent.wait(); - return result; - } - #else // As an IEditController member, the host should only call this from the message thread. - jassertfalse; - #endif + assertHostMessageThread(); if (auto* pluginInstance = getPluginInstance()) { @@ -1965,7 +2002,12 @@ private: owner->lastScaleFactorReceived = editorScaleFactor; if (component != nullptr) + { + #if JUCE_LINUX || JUCE_BSD + const MessageManagerLock mmLock; + #endif component->setEditorScaleFactor (editorScaleFactor); + } } return kResultTrue; @@ -2776,7 +2818,7 @@ public: { // The VST3 spec requires that this function is called from the UI thread. // If this assertion fires, your host is misbehaving! - JUCE_ASSERT_MESSAGE_THREAD + assertHostMessageThread(); if (state == nullptr) return kInvalidArgument; diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h index 3e4cdbb5..39fd87e8 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h @@ -35,7 +35,7 @@ ID: juce_audio_plugin_client vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE audio plugin wrapper classes description: Classes for building VST, VST3, AU, AUv3 and AAX plugins. website: http://www.juce.com/juce @@ -128,7 +128,3 @@ #endif #include "utility/juce_CreatePluginFilter.h" - -#if JucePlugin_Enable_ARA - #include "ARA/juce_ARA_Wrapper.h" -#endif diff --git a/modules/juce_audio_processors/format_types/juce_ARACommon.cpp b/modules/juce_audio_processors/format_types/juce_ARACommon.cpp index d118366f..2deb3f82 100644 --- a/modules/juce_audio_processors/format_types/juce_ARACommon.cpp +++ b/modules/juce_audio_processors/format_types/juce_ARACommon.cpp @@ -23,9 +23,7 @@ ============================================================================== */ -#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) - -#include +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) namespace juce { @@ -48,8 +46,21 @@ static ARA::ARAInterfaceConfiguration createInterfaceConfig (const ARA::ARAFacto &assertFunction); } +/* If the provided ARAFactory is not yet in use it constructs a new shared_ptr that will call the + provided onDelete function inside the custom deleter of this new shared_ptr instance. + + The onDelete function is responsible for releasing the resources that guarantee the validity of + the wrapped ARAFactory*. + + If however the ARAFactory is already in use the function will just return a copy of the already + existing shared_ptr and call the onDelete function immediately. This is to ensure that the + ARAFactory is only uninitialised when no plugin instance can be using it. + + On both platforms the onDelete function is used to release resources that ensure that the module + providing the ARAFactory* remains loaded. +*/ static std::shared_ptr getOrCreateARAFactory (const ARA::ARAFactory* ptr, - std::function onDelete) + std::function onDelete) { JUCE_ASSERT_MESSAGE_THREAD @@ -58,14 +69,17 @@ static std::shared_ptr getOrCreateARAFactory (const ARA:: auto& cachePtr = cache[ptr]; if (const auto obj = cachePtr.lock()) + { + onDelete(); return obj; + } const auto interfaceConfig = createInterfaceConfig (ptr); ptr->initializeARAWithConfiguration (&interfaceConfig); const auto obj = std::shared_ptr (ptr, [deleter = std::move (onDelete)] (const ARA::ARAFactory* factory) { factory->uninitializeARA(); - deleter (factory); + deleter(); }); cachePtr = obj; return obj; diff --git a/modules/juce_audio_processors/format_types/juce_ARACommon.h b/modules/juce_audio_processors/format_types/juce_ARACommon.h index 4811733b..bbf55c5a 100644 --- a/modules/juce_audio_processors/format_types/juce_ARACommon.h +++ b/modules/juce_audio_processors/format_types/juce_ARACommon.h @@ -75,6 +75,8 @@ struct ARAFactoryResult String errorMessage; }; +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-field-initializers") + template constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts) { @@ -82,4 +84,6 @@ constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts) std::forward (ts)... }; } +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp b/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp index d406ffd2..46204dea 100644 --- a/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp +++ b/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp @@ -23,10 +23,9 @@ ============================================================================== */ -#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) #include "juce_ARAHosting.h" -#include #include @@ -278,8 +277,18 @@ class ARAHostDocumentController::Impl public: Impl (ARAFactoryWrapper araFactoryIn, std::unique_ptr&& dcHostInstanceIn, - const ARA::ARADocumentControllerInstance* documentControllerInstance) + const ARA::ARADocumentControllerInstance* documentControllerInstance, + std::unique_ptr&& audioAccessControllerIn, + std::unique_ptr&& archivingControllerIn, + std::unique_ptr&& contentAccessControllerIn, + std::unique_ptr&& modelUpdateControllerIn, + std::unique_ptr&& playbackControllerIn) : araFactory (std::move (araFactoryIn)), + audioAccessController (std::move (audioAccessControllerIn)), + archivingController (std::move (archivingControllerIn)), + contentAccessController (std::move (contentAccessControllerIn)), + modelUpdateController (std::move (modelUpdateControllerIn)), + playbackController (std::move (playbackControllerIn)), dcHostInstance (std::move (dcHostInstanceIn)), documentController (documentControllerInstance) { @@ -300,16 +309,23 @@ public: std::unique_ptr&& playbackController) { std::unique_ptr dcHostInstance = - std::make_unique (audioAccessController.release(), - archivingController.release(), - contentAccessController.release(), - modelUpdateController.release(), - playbackController.release()); + std::make_unique (audioAccessController.get(), + archivingController.get(), + contentAccessController.get(), + modelUpdateController.get(), + playbackController.get()); const auto documentProperties = makeARASizedStruct (&ARA::ARADocumentProperties::name, documentName.toRawUTF8()); if (auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties)) - return std::make_unique (std::move (araFactory), std::move (dcHostInstance), dci); + return std::make_unique (std::move (araFactory), + std::move (dcHostInstance), + dci, + std::move (audioAccessController), + std::move (archivingController), + std::move (contentAccessController), + std::move (modelUpdateController), + std::move (playbackController)); return {}; } @@ -386,6 +402,13 @@ public: private: ARAFactoryWrapper araFactory; + + std::unique_ptr audioAccessController; + std::unique_ptr archivingController; + std::unique_ptr contentAccessController; + std::unique_ptr modelUpdateController; + std::unique_ptr playbackController; + std::unique_ptr dcHostInstance; ARA::Host::DocumentController documentController; }; diff --git a/modules/juce_audio_processors/format_types/juce_ARAHosting.h b/modules/juce_audio_processors/format_types/juce_ARAHosting.h index 632cb824..08862331 100644 --- a/modules/juce_audio_processors/format_types/juce_ARAHosting.h +++ b/modules/juce_audio_processors/format_types/juce_ARAHosting.h @@ -25,7 +25,7 @@ #pragma once -#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) || DOXYGEN // Include ARA SDK headers JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments") diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h index 53c50487..16248419 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h @@ -67,13 +67,4 @@ private: #endif -//============================================================================== -#if (! defined (MAC_OS_X_VERSION_10_12)) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12) -enum -{ - /** Custom AudioUnit property used to indicate MPE support */ - kAudioUnitProperty_SupportsMPE = 58 -}; -#endif - } diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index ec695c4f..e5d40290 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -488,7 +488,7 @@ static std::shared_ptr getARAFactory (AudioUnitSharedPtr { jassert (audioUnitFactory.outFactory != nullptr); return getOrCreateARAFactory (audioUnitFactory.outFactory, - [owningAuPtr = std::move (audioUnit)] (const ARA::ARAFactory*) {}); + [owningAuPtr = std::move (audioUnit)]() {}); } } #else diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp index 53419384..9ac149d7 100644 --- a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp @@ -23,7 +23,7 @@ ============================================================================== */ -#if JUCE_PLUGINHOST_LV2 +#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS)) #include "juce_LV2Common.h" #include "juce_LV2Resources.h" diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h index 0518de26..f2eefe3f 100644 --- a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h @@ -26,7 +26,7 @@ namespace juce { -#if JUCE_PLUGINHOST_LV2 || DOXYGEN +#if (JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))) || DOXYGEN /** Implements a plugin format for LV2 plugins. diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 31bf6ff4..cfa7b3cf 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -29,7 +29,7 @@ #include "juce_VST3Common.h" #include "juce_ARACommon.h" -#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) #include namespace ARA @@ -840,7 +840,7 @@ struct DescriptionFactory // The match is determined by the two classes having the same name. std::unordered_set araMainFactoryClassNames; - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) for (Steinberg::int32 i = 0; i < numClasses; ++i) { PClassInfo info; @@ -1390,7 +1390,7 @@ static int compareWithString (Type (&charArray)[N], const String& str) template static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb) { - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) const auto numClasses = pluginFactory->countClasses(); for (Steinberg::int32 i = 0; i < numClasses; ++i) { @@ -1413,7 +1413,7 @@ static std::shared_ptr getARAFactory (Steinberg::IPluginF { std::shared_ptr factory; - #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) forEachARAFactory (pluginFactory, [&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo) { @@ -1424,7 +1424,7 @@ static std::shared_ptr getARAFactory (Steinberg::IPluginF == Steinberg::kResultOk) { factory = getOrCreateARAFactory (source->getFactory(), - [source] (const ARA::ARAFactory*) { source->release(); }); + [source]() { source->release(); }); return false; } jassert (source == nullptr); diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 499c39cc..fbbc1a4f 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -3262,10 +3262,9 @@ private: if (! isWindowSizeCorrectForPlugin (w, h)) { updateSizeFromEditor (w, h); + embeddedComponent.updateHWNDBounds(); sizeCheckCount = 0; } - - embeddedComponent.updateHWNDBounds(); } void checkPluginWindowSize() @@ -3349,6 +3348,7 @@ private: #if JUCE_WINDOWS r->resizeToFit(); + r->embeddedComponent.updateHWNDBounds(); #endif r->componentMovedOrResized (true, true); } diff --git a/modules/juce_audio_processors/juce_audio_processors.cpp b/modules/juce_audio_processors/juce_audio_processors.cpp index df3a1e8a..b0ff4b67 100644 --- a/modules/juce_audio_processors/juce_audio_processors.cpp +++ b/modules/juce_audio_processors/juce_audio_processors.cpp @@ -229,7 +229,7 @@ private: #include "format_types/juce_VST3PluginFormat_test.cpp" #endif - #if JUCE_PLUGINHOST_LV2 + #if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS)) #include "format_types/juce_LV2PluginFormat_test.cpp" #endif #endif diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h index 1664b90a..bf9b568d 100644 --- a/modules/juce_audio_processors/juce_audio_processors.h +++ b/modules/juce_audio_processors/juce_audio_processors.h @@ -35,7 +35,7 @@ ID: juce_audio_processors vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE audio processor classes description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. website: http://www.juce.com/juce @@ -167,6 +167,7 @@ #include "utilities/juce_ParameterAttachments.h" #include "utilities/juce_AudioProcessorValueTreeState.h" #include "utilities/juce_PluginHostType.h" +#include "utilities/ARA/juce_ARADebug.h" #include "utilities/ARA/juce_ARA_utils.h" //============================================================================== diff --git a/modules/juce_audio_processors/juce_audio_processors_ara.cpp b/modules/juce_audio_processors/juce_audio_processors_ara.cpp index d8e35ca4..55ac39e4 100644 --- a/modules/juce_audio_processors/juce_audio_processors_ara.cpp +++ b/modules/juce_audio_processors/juce_audio_processors_ara.cpp @@ -26,12 +26,14 @@ #include #include +#include "utilities/ARA/juce_ARADebug.h" + /* Having WIN32_LEAN_AND_MEAN defined at the point of including ARADebug.c will produce warnings. To prevent such problems it's easiest to have it in its own translation unit. */ -#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS) +#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") #include diff --git a/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp b/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp index 22b2d118..6af13097 100644 --- a/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp +++ b/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp @@ -23,7 +23,7 @@ ============================================================================== */ -#if JUCE_PLUGINHOST_LV2 +#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS)) #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif 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 index 00000000..1f80a510 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h @@ -0,0 +1,67 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#include + +#ifndef JUCE_API + #define JUCE_API +#endif + +#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) + +namespace juce +{ + +//============================================================================== + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + #define ARA_ENABLE_INTERNAL_ASSERTS 1 + #else + #define ARA_ENABLE_INTERNAL_ASSERTS 0 + #endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + +//============================================================================== + #if ARA_ENABLE_INTERNAL_ASSERTS + +JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept; + + #if !defined(ARA_HANDLE_ASSERT) + #define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis) + #endif + + #if JUCE_LOG_ASSERTIONS + #define ARA_ENABLE_DEBUG_OUTPUT 1 + #endif + + #endif + +} // namespace juce + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") + #include +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#endif diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp index cbbe5df0..dc7414c5 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp @@ -799,7 +799,7 @@ bool ARAOutputStream::write (const void* dataToWrite, size_t numberOfBytes) if (! archiveWriter->writeBytesToArchive ((ARA::ARASize) position, numberOfBytes, (const ARA::ARAByte*) dataToWrite)) return false; - position += numberOfBytes; + position += (int64) numberOfBytes; return true; } diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h index 01762924..e23aeded 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h @@ -134,6 +134,8 @@ public: return false; } + using ARARenderer::processBlock; + // Shadowing templated getters to default to JUCE versions of the returned classes /** Returns the PlaybackRegions * @@ -195,6 +197,8 @@ public: return true; } + using ARARenderer::processBlock; + private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorRenderer) }; diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp index ed914026..9109d198 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp @@ -23,10 +23,34 @@ ============================================================================== */ +#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) +namespace juce +{ + #if ARA_ENABLE_INTERNAL_ASSERTS +JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept +{ + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + DBG (diagnosis); + #endif + + logAssertion (file, line); + + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + if (juce_isRunningUnderDebugger()) + JUCE_BREAK_IN_DEBUGGER; + JUCE_ANALYZER_NORETURN + #endif +} + #endif +} +#endif + #if JucePlugin_Enable_ARA #include "juce_ARADocumentControllerCommon.cpp" #include "juce_ARADocumentController.cpp" #include "juce_ARAModelObjects.cpp" #include "juce_ARAPlugInInstanceRoles.cpp" #include "juce_AudioProcessor_ARAExtensions.cpp" + +ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name); #endif diff --git a/modules/juce_audio_utils/juce_audio_utils.h b/modules/juce_audio_utils/juce_audio_utils.h index 847425ac..6d0c1a72 100644 --- a/modules/juce_audio_utils/juce_audio_utils.h +++ b/modules/juce_audio_utils/juce_audio_utils.h @@ -35,7 +35,7 @@ ID: juce_audio_utils vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE extra audio utility classes description: Classes for audio-related GUI and miscellaneous tasks. website: http://www.juce.com/juce diff --git a/modules/juce_box2d/juce_box2d.h b/modules/juce_box2d/juce_box2d.h index 87cbb4ae..cf952719 100644 --- a/modules/juce_box2d/juce_box2d.h +++ b/modules/juce_box2d/juce_box2d.h @@ -35,7 +35,7 @@ ID: juce_box2d vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE wrapper for the Box2D physics engine description: The Box2D physics engine and some utility classes. website: http://www.juce.com/juce diff --git a/modules/juce_core/files/juce_File.h b/modules/juce_core/files/juce_File.h index f81ec27f..e8ee95ac 100644 --- a/modules/juce_core/files/juce_File.h +++ b/modules/juce_core/files/juce_File.h @@ -516,9 +516,11 @@ public: /** Copies a file. - Tries to copy a file to a different location. - If the target file already exists, this will attempt to delete it first, and - will fail if this can't be done. + Tries to copy a file to a different location. If the target file already exists, + this will attempt to delete it first, and will fail if this can't be done. + + Note that the target file isn't the directory to put it in, it's the actual + filename that you want the new file to have. @returns true if the operation succeeds */ diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp index 067a189a..e79c1c91 100644 --- a/modules/juce_core/juce_core.cpp +++ b/modules/juce_core/juce_core.cpp @@ -119,12 +119,6 @@ #undef check -//============================================================================== -#ifndef JUCE_STANDALONE_APPLICATION - JUCE_COMPILER_WARNING ("Please re-save your project with the latest Projucer version to avoid this warning") - #define JUCE_STANDALONE_APPLICATION 0 -#endif - //============================================================================== #include "containers/juce_AbstractFifo.cpp" #include "containers/juce_ArrayBase.cpp" diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h index 4f6b2838..1aafb16f 100644 --- a/modules/juce_core/juce_core.h +++ b/modules/juce_core/juce_core.h @@ -32,7 +32,7 @@ ID: juce_core vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE core classes 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. website: http://www.juce.com/juce @@ -344,6 +344,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC #include "memory/juce_AllocationHooks.h" #include "memory/juce_Reservoir.h" #include "files/juce_AndroidDocument.h" +#include "streams/juce_AndroidDocumentInputSource.h" #if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS) #include "native/juce_mac_ObjCHelpers.h" diff --git a/modules/juce_core/misc/juce_RuntimePermissions.h b/modules/juce_core/misc/juce_RuntimePermissions.h index c09e2547..3f1cd113 100644 --- a/modules/juce_core/misc/juce_RuntimePermissions.h +++ b/modules/juce_core/misc/juce_RuntimePermissions.h @@ -46,7 +46,7 @@ namespace juce New code: RuntimePermissions::request ( - RuntimePermissions::audioRecording, + RuntimePermissions::recordAudio, [this] (bool wasGranted) { if (! wasGranted) diff --git a/modules/juce_core/native/juce_BasicNativeHeaders.h b/modules/juce_core/native/juce_BasicNativeHeaders.h index c45ac6e3..e0d78f4d 100644 --- a/modules/juce_core/native/juce_BasicNativeHeaders.h +++ b/modules/juce_core/native/juce_BasicNativeHeaders.h @@ -28,67 +28,24 @@ #if JUCE_MAC || JUCE_IOS #if JUCE_IOS - #if JUCE_MODULE_AVAILABLE_juce_opengl && defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0 + #if JUCE_MODULE_AVAILABLE_juce_opengl #define GLES_SILENCE_DEPRECATION 1 #endif + #define Component CarbonDummyCompName #import + #undef Component + #import #import #import #include #else - #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 + #if JUCE_MODULE_AVAILABLE_juce_opengl #define GL_SILENCE_DEPRECATION 1 #endif #import - #if (! defined MAC_OS_X_VERSION_10_12) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12 - #define NSEventModifierFlagCommand NSCommandKeyMask - #define NSEventModifierFlagControl NSControlKeyMask - #define NSEventModifierFlagHelp NSHelpKeyMask - #define NSEventModifierFlagNumericPad NSNumericPadKeyMask - #define NSEventModifierFlagOption NSAlternateKeyMask - #define NSEventModifierFlagShift NSShiftKeyMask - #define NSCompositingOperationSourceOver NSCompositeSourceOver - #define NSEventMaskApplicationDefined NSApplicationDefinedMask - #define NSEventTypeApplicationDefined NSApplicationDefined - #define NSEventTypeCursorUpdate NSCursorUpdate - #define NSEventTypeMouseMoved NSMouseMoved - #define NSEventTypeLeftMouseDown NSLeftMouseDown - #define NSEventTypeRightMouseDown NSRightMouseDown - #define NSEventTypeOtherMouseDown NSOtherMouseDown - #define NSEventTypeLeftMouseUp NSLeftMouseUp - #define NSEventTypeRightMouseUp NSRightMouseUp - #define NSEventTypeOtherMouseUp NSOtherMouseUp - #define NSEventTypeLeftMouseDragged NSLeftMouseDragged - #define NSEventTypeRightMouseDragged NSRightMouseDragged - #define NSEventTypeOtherMouseDragged NSOtherMouseDragged - #define NSEventTypeScrollWheel NSScrollWheel - #define NSEventTypeKeyDown NSKeyDown - #define NSEventTypeKeyUp NSKeyUp - #define NSEventTypeFlagsChanged NSFlagsChanged - #define NSEventMaskAny NSAnyEventMask - #define NSWindowStyleMaskBorderless NSBorderlessWindowMask - #define NSWindowStyleMaskClosable NSClosableWindowMask - #define NSWindowStyleMaskFullScreen NSFullScreenWindowMask - #define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask - #define NSWindowStyleMaskResizable NSResizableWindowMask - #define NSWindowStyleMaskTitled NSTitledWindowMask - #define NSAlertStyleCritical NSCriticalAlertStyle - #define NSControlSizeRegular NSRegularControlSize - #define NSEventTypeMouseEntered NSMouseEntered - #define NSEventTypeMouseExited NSMouseExited - #define NSAlertStyleInformational NSInformationalAlertStyle - #define NSEventTypeTabletPoint NSTabletPoint - #define NSEventTypeTabletProximity NSTabletProximity - #define NSEventTypeFlagsChanged NSFlagsChanged - #define NSEventTypeAppKitDefined NSAppKitDefined - #define NSEventTypeSystemDefined NSSystemDefined - #define NSEventTypeApplicationDefined NSApplicationDefined - #define NSEventTypePeriodic NSPeriodic - #define NSEventTypeSmartMagnify NSEventTypeSmartMagnify - #endif #import #include #endif diff --git a/modules/juce_core/native/juce_android_AndroidDocument.cpp b/modules/juce_core/native/juce_android_AndroidDocument.cpp index 5b09605f..e3dba249 100644 --- a/modules/juce_core/native/juce_android_AndroidDocument.cpp +++ b/modules/juce_core/native/juce_android_AndroidDocument.cpp @@ -417,14 +417,18 @@ struct AndroidDocument::Utils return false; } - std::unique_ptr createInputStream() const override + std::unique_ptr createInputStream() const override { - return makeStream (AndroidStreamHelpers::StreamKind::input); + auto result = std::make_unique (uri); + return result->openedSuccessfully() ? std::move (result) : nullptr; } std::unique_ptr createOutputStream() const override { - return makeStream (AndroidStreamHelpers::StreamKind::output); + auto stream = AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::output); + + return stream.get() != nullptr ? std::make_unique (std::move (stream)) + : nullptr; } AndroidDocumentInfo getInfo() const override @@ -507,15 +511,6 @@ struct AndroidDocument::Utils NativeInfo getNativeInfo() const override { return { uri }; } private: - template - std::unique_ptr makeStream (AndroidStreamHelpers::StreamKind kind) const - { - auto stream = AndroidStreamHelpers::createStream (uri, kind); - - return stream.get() != nullptr ? std::make_unique (std::move (stream)) - : nullptr; - } - GlobalRef uri; }; diff --git a/modules/juce_core/native/juce_android_Files.cpp b/modules/juce_core/native/juce_android_Files.cpp index 1c45ce97..efd43534 100644 --- a/modules/juce_core/native/juce_android_Files.cpp +++ b/modules/juce_core/native/juce_android_Files.cpp @@ -45,7 +45,7 @@ DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver") METHOD (releasePersistableUriPermission, "releasePersistableUriPermission", "(Landroid/net/Uri;I)V") \ METHOD (getPersistedUriPermissions, "getPersistedUriPermissions", "()Ljava/util/List;") -DECLARE_JNI_CLASS (ContentResolver19, "android/content/ContentResolver") +DECLARE_JNI_CLASS_WITH_MIN_SDK (ContentResolver19, "android/content/ContentResolver", 19) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -79,7 +79,8 @@ DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream") #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (close, "close", "()V") \ - METHOD (read, "read", "([B)I") + METHOD (read, "read", "([B)I") \ + METHOD (skip, "skip", "(J)J") DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream") #undef JNI_CLASS_MEMBERS @@ -550,15 +551,38 @@ private: jsize size = 0; }; +//============================================================================== +struct AndroidStreamHelpers +{ + enum class StreamKind { output, input }; + + static LocalRef createStream (const GlobalRef& uri, StreamKind kind) + { + auto* env = getEnv(); + auto contentResolver = AndroidContentUriResolver::getContentResolver(); + + if (contentResolver == nullptr) + return {}; + + return LocalRef (env->CallObjectMethod (contentResolver.get(), + kind == StreamKind::input ? ContentResolver.openInputStream + : ContentResolver.openOutputStream, + uri.get())); + } +}; + //============================================================================== struct AndroidContentUriInputStream : public InputStream { - explicit AndroidContentUriInputStream (LocalRef&& streamIn) - : stream (std::move (streamIn)) {} + explicit AndroidContentUriInputStream (const GlobalRef& uriIn) + : uri (uriIn), + stream (AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::input)) + {} ~AndroidContentUriInputStream() override { getEnv()->CallVoidMethod (stream.get(), AndroidInputStream.close); + jniCheckHasExceptionOccurredAndClear(); } int64 getTotalLength() override { return -1; } @@ -569,30 +593,36 @@ struct AndroidContentUriInputStream : public InputStream { auto* env = getEnv(); - if ((jsize) maxBytesToRead > byteArray.getSize()) + if ((jsize) maxBytesToRead != byteArray.getSize()) byteArray = CachedByteArray { (jsize) maxBytesToRead }; const auto result = env->CallIntMethod (stream.get(), AndroidInputStream.read, byteArray.getNativeArray()); - if (result != -1) - { - pos += result; - - auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr); - std::memcpy (destBuffer, rawBytes, static_cast (result)); - env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0); - } - else + if (jniCheckHasExceptionOccurredAndClear() || result == -1) { exhausted = true; + return -1; } + pos += result; + + auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr); + std::memcpy (destBuffer, rawBytes, static_cast (result)); + env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0); + return result; } bool setPosition (int64 newPos) override { - return (newPos == pos); + if (newPos == pos) + return true; + + if (pos < newPos) + return skipImpl (newPos - pos); + + AndroidContentUriInputStream (uri).swap (*this); + return skipImpl (newPos); } int64 getPosition() override @@ -600,6 +630,37 @@ struct AndroidContentUriInputStream : public InputStream return pos; } + bool openedSuccessfully() const { return stream != nullptr; } + + void skipNextBytes (int64 num) override + { + skipImpl (num); + } + +private: + bool skipImpl (int64 num) + { + if (stream == nullptr) + return false; + + const auto skipped = getEnv()->CallLongMethod (stream, AndroidInputStream.skip, (jlong) num); + + if (jniCheckHasExceptionOccurredAndClear()) + return false; + + pos += skipped; + return skipped == num; + } + + auto tie() { return std::tie (uri, byteArray, stream, pos, exhausted); } + + void swap (AndroidContentUriInputStream& other) noexcept + { + auto toSwap = other.tie(); + tie().swap (toSwap); + } + + GlobalRef uri; CachedByteArray byteArray; GlobalRef stream; int64 pos = 0; diff --git a/modules/juce_core/native/juce_android_JNIHelpers.cpp b/modules/juce_core/native/juce_android_JNIHelpers.cpp index 3d68d0f9..972c6e1d 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.cpp +++ b/modules/juce_core/native/juce_android_JNIHelpers.cpp @@ -66,7 +66,7 @@ static const uint8 invocationHandleByteCode[] = #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (findClass, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;") \ + METHOD (loadClass, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;") \ STATICMETHOD (getSystemClassLoader, "getSystemClassLoader", "()Ljava/lang/ClassLoader;") DECLARE_JNI_CLASS (JavaClassLoader, "java/lang/ClassLoader") @@ -149,7 +149,7 @@ static File getCodeCacheDirectory() return File("/data/data/" + bundleId + "/code_cache"); } -void JNIClassBase::initialise (JNIEnv* env) +void JNIClassBase::initialise (JNIEnv* env, jobject context) { auto sdkVersion = getAndroidSDKVersion(); @@ -158,9 +158,16 @@ void JNIClassBase::initialise (JNIEnv* env) LocalRef classNameAndPackage (javaString (String (classPath).replaceCharacter (L'/', L'.'))); static Array byteCodeLoaders; - if (! SystemJavaClassComparator::isSystemClass(this)) + if (! SystemJavaClassComparator::isSystemClass (this)) { - LocalRef defaultClassLoader (env->CallStaticObjectMethod (JavaClassLoader, JavaClassLoader.getSystemClassLoader)); + // We use the context's class loader, rather than the 'system' class loader, because we + // may need to load classes from our library dependencies (such as the BillingClient + // library), and the system class loader is not aware of those libraries. + const LocalRef defaultClassLoader { env->CallObjectMethod (context, + env->GetMethodID (env->FindClass ("android/content/Context"), + "getClassLoader", + "()Ljava/lang/ClassLoader;")) }; + tryLoadingClassWithClassLoader (env, defaultClassLoader.get()); if (classRef == nullptr) @@ -229,7 +236,7 @@ void JNIClassBase::initialise (JNIEnv* env) if (byteCodeClassLoader != nullptr) { tryLoadingClassWithClassLoader (env, byteCodeClassLoader.get()); - byteCodeLoaders.add (GlobalRef(byteCodeClassLoader)); + byteCodeLoaders.add (GlobalRef (byteCodeClassLoader)); } } } @@ -249,9 +256,9 @@ void JNIClassBase::tryLoadingClassWithClassLoader (JNIEnv* env, jobject classLoa // Android SDK <= 19 has a bug where the class loader might throw an exception but still return // a non-nullptr. So don't assign the result of this call to a jobject just yet... - auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.findClass, classNameAndPackage.get()); + auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.loadClass, classNameAndPackage.get(), (jboolean) true); - if (jthrowable exception = env->ExceptionOccurred ()) + if (jthrowable exception = env->ExceptionOccurred()) { env->ExceptionClear(); classObj = nullptr; @@ -268,11 +275,11 @@ void JNIClassBase::release (JNIEnv* env) env->DeleteGlobalRef (classRef); } -void JNIClassBase::initialiseAllClasses (JNIEnv* env) +void JNIClassBase::initialiseAllClasses (JNIEnv* env, jobject context) { const Array& classes = getClasses(); for (int i = classes.size(); --i >= 0;) - classes.getUnchecked(i)->initialise (env); + classes.getUnchecked(i)->initialise (env, context); } void JNIClassBase::releaseAllClasses (JNIEnv* env) diff --git a/modules/juce_core/native/juce_android_JNIHelpers.h b/modules/juce_core/native/juce_android_JNIHelpers.h index 441d9f79..bdfa4c38 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/modules/juce_core/native/juce_android_JNIHelpers.h @@ -177,7 +177,7 @@ public: operator jclass() const noexcept { return classRef; } - static void initialiseAllClasses (JNIEnv*); + static void initialiseAllClasses (JNIEnv*, jobject context); static void releaseAllClasses (JNIEnv*); const char* getClassPath() const noexcept { return classPath; } @@ -202,7 +202,7 @@ private: jclass classRef = nullptr; static Array& getClasses(); - void initialise (JNIEnv*); + void initialise (JNIEnv*, jobject context); void release (JNIEnv*); void tryLoadingClassWithClassLoader (JNIEnv* env, jobject classLoader); @@ -358,7 +358,7 @@ DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle") #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ STATICMETHOD (dumpReferenceTables, "dumpReferenceTables", "()V") - DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug") +DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug") #undef JNI_CLASS_MEMBERS #define JUCE_LOG_JNI_REFERENCES_TABLE getEnv()->CallStaticVoidMethod (AndroidDebug, AndroidDebug.dumpReferenceTables); @@ -371,6 +371,12 @@ DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle") DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getRealMetrics, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V") + +DECLARE_JNI_CLASS (AndroidDisplay17, "android/view/Display") +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "()V") \ METHOD (constructorWithLooper, "", "(Landroid/os/Looper;)V") \ @@ -557,11 +563,18 @@ DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri") METHOD (findViewById, "findViewById", "(I)Landroid/view/View;") \ METHOD (getRootView, "getRootView", "()Landroid/view/View;") \ METHOD (addOnLayoutChangeListener, "addOnLayoutChangeListener", "(Landroid/view/View$OnLayoutChangeListener;)V") \ - METHOD (announceForAccessibility, "announceForAccessibility", "(Ljava/lang/CharSequence;)V") \ + METHOD (announceForAccessibility, "announceForAccessibility", "(Ljava/lang/CharSequence;)V") \ DECLARE_JNI_CLASS (AndroidView, "android/view/View") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (setOnApplyWindowInsetsListener, "setOnApplyWindowInsetsListener", "(Landroid/view/View$OnApplyWindowInsetsListener;)V") \ + METHOD (getRootWindowInsets, "getRootWindowInsets", "()Landroid/view/WindowInsets;") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidView23, "android/view/View", 23) +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (addView, "addView", "(Landroid/view/View;)V") \ METHOD (removeView, "removeView", "(Landroid/view/View;)V") \ @@ -725,7 +738,6 @@ DECLARE_JNI_CLASS (JavaMap, "java/util/Map") DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method") #undef JNI_CLASS_MEMBERS - #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "()V") \ METHOD (getClass, "getClass", "()Ljava/lang/Class;") \ @@ -761,7 +773,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION") METHOD (registerActivityLifecycleCallbacks, "registerActivityLifecycleCallbacks", "(Landroid/app/Application$ActivityLifecycleCallbacks;)V") \ METHOD (unregisterActivityLifecycleCallbacks, "unregisterActivityLifecycleCallbacks", "(Landroid/app/Application$ActivityLifecycleCallbacks;)V") - DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application") +DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application") #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -769,7 +781,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION") METHOD (getHolder, "getHolder", "()Landroid/view/SurfaceHolder;") \ METHOD (getParent, "getParent", "()Landroid/view/ViewParent;") - DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView") +DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView") #undef JNI_CLASS_MEMBERS @@ -778,7 +790,7 @@ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION") METHOD (addCallback, "addCallback", "(Landroid/view/SurfaceHolder$Callback;)V") \ METHOD (removeCallback, "removeCallback", "(Landroid/view/SurfaceHolder$Callback;)V") - DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder") +DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder") #undef JNI_CLASS_MEMBERS //============================================================================== diff --git a/modules/juce_core/native/juce_android_Network.cpp b/modules/juce_core/native/juce_android_Network.cpp index e9e11022..f5a3afa8 100644 --- a/modules/juce_core/native/juce_android_Network.cpp +++ b/modules/juce_core/native/juce_android_Network.cpp @@ -312,25 +312,6 @@ String URL::getFileName() const return toString (false).fromLastOccurrenceOf ("/", false, true); } -struct AndroidStreamHelpers -{ - enum class StreamKind { output, input }; - - static LocalRef createStream (const GlobalRef& uri, StreamKind kind) - { - auto* env = getEnv(); - auto contentResolver = AndroidContentUriResolver::getContentResolver(); - - if (contentResolver == nullptr) - return {}; - - return LocalRef (env->CallObjectMethod (contentResolver.get(), - kind == StreamKind::input ? ContentResolver.openInputStream - : ContentResolver.openOutputStream, - uri.get())); - } -}; - //============================================================================== class WebInputStream::Pimpl { diff --git a/modules/juce_core/native/juce_android_Threads.cpp b/modules/juce_core/native/juce_android_Threads.cpp index 71d76de0..796328aa 100644 --- a/modules/juce_core/native/juce_android_Threads.cpp +++ b/modules/juce_core/native/juce_android_Threads.cpp @@ -58,6 +58,7 @@ JNIEnv* getEnv() noexcept static void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context) { + JNIClassBase::initialiseAllClasses (env, context); Thread::initialiseJUCE (env, context); } @@ -89,8 +90,6 @@ extern "C" jint JNIEXPORT JNI_OnLoad (JavaVM* vm, void*) env->ExceptionClear(); } - JNIClassBase::initialiseAllClasses (env); - return JNI_VERSION_1_2; } diff --git a/modules/juce_core/native/juce_linux_Files.cpp b/modules/juce_core/native/juce_linux_Files.cpp index f661e4ab..38429ba6 100644 --- a/modules/juce_core/native/juce_linux_Files.cpp +++ b/modules/juce_core/native/juce_linux_Files.cpp @@ -145,11 +145,10 @@ File File::getSpecialLocation (const SpecialLocationType type) case currentExecutableFile: case currentApplicationFile: - #if ! JUCE_STANDALONE_APPLICATION - return juce_getExecutableFile(); - #endif - // deliberate fall-through if this is not a shared-library - JUCE_FALLTHROUGH + { + const auto f = juce_getExecutableFile(); + return f.isSymbolicLink() ? f.getLinkedTarget() : f; + } case hostApplicationPath: { diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm index aefa7631..dcee53f1 100644 --- a/modules/juce_core/native/juce_mac_Files.mm +++ b/modules/juce_core/native/juce_mac_Files.mm @@ -285,7 +285,6 @@ bool File::moveToTrash() const JUCE_AUTORELEASEPOOL { - #if JUCE_MAC || (JUCE_IOS && (defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)) if (@available (macOS 10.8, iOS 11.0, *)) { NSError* error = nil; @@ -293,7 +292,6 @@ bool File::moveToTrash() const resultingItemURL: nil error: &error]; } - #endif #if JUCE_IOS return deleteFile(); @@ -410,7 +408,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& #if JUCE_IOS ignoreUnused (parameters); - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (@available (iOS 10.0, *)) { [[UIApplication sharedApplication] openURL: filenameAsURL @@ -419,7 +416,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& return true; } - #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") return [[UIApplication sharedApplication] openURL: filenameAsURL]; diff --git a/modules/juce_core/native/juce_mac_ObjCHelpers.h b/modules/juce_core/native/juce_mac_ObjCHelpers.h index 55cb01a2..8995472d 100644 --- a/modules/juce_core/native/juce_mac_ObjCHelpers.h +++ b/modules/juce_core/native/juce_mac_ObjCHelpers.h @@ -342,6 +342,15 @@ namespace detail { return joinCompileTimeStr (v, makeCompileTimeStr (others...)); } + + template + static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const) + { + return static_cast (functor); + } + + template + static constexpr auto toFnPtr (Functor functor) { return toFnPtr (functor, &Functor::operator()); } } // namespace detail //============================================================================== @@ -386,6 +395,9 @@ struct ObjCClass jassert (b); ignoreUnused (b); } + template + void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, detail::toFnPtr (callbackFn)); } + template void addMethod (SEL selector, Result (*callbackFn) (id, SEL, Args...)) { @@ -508,4 +520,57 @@ private: BlockType block; }; +//============================================================================== +class ScopedNotificationCenterObserver +{ +public: + ScopedNotificationCenterObserver() = default; + + ScopedNotificationCenterObserver (id observerIn, SEL selector, NSNotificationName nameIn, id objectIn) + : observer (observerIn), name (nameIn), object (objectIn) + { + [[NSNotificationCenter defaultCenter] addObserver: observer + selector: selector + name: name + object: object]; + } + + ~ScopedNotificationCenterObserver() + { + if (observer != nullptr && name != nullptr) + { + [[NSNotificationCenter defaultCenter] removeObserver: observer + name: name + object: object]; + } + } + + ScopedNotificationCenterObserver (ScopedNotificationCenterObserver&& other) noexcept + { + swap (other); + } + + ScopedNotificationCenterObserver& operator= (ScopedNotificationCenterObserver&& other) noexcept + { + auto moved = std::move (other); + swap (moved); + return *this; + } + + ScopedNotificationCenterObserver (const ScopedNotificationCenterObserver&) = delete; + ScopedNotificationCenterObserver& operator= (const ScopedNotificationCenterObserver&) = delete; + +private: + void swap (ScopedNotificationCenterObserver& other) noexcept + { + std::swap (other.observer, observer); + std::swap (other.name, name); + std::swap (other.object, object); + } + + id observer = nullptr; + NSNotificationName name = nullptr; + id object = nullptr; +}; + } // namespace juce diff --git a/modules/juce_core/native/juce_mac_SystemStats.mm b/modules/juce_core/native/juce_mac_SystemStats.mm index f3b25cad..077cce68 100644 --- a/modules/juce_core/native/juce_mac_SystemStats.mm +++ b/modules/juce_core/native/juce_mac_SystemStats.mm @@ -95,14 +95,12 @@ static String getOSXVersion() { const String systemVersionPlist ("/System/Library/CoreServices/SystemVersion.plist"); - #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 if (@available (macOS 10.13, *)) { NSError* error = nullptr; return [NSDictionary dictionaryWithContentsOfURL: createNSURLFromFile (systemVersionPlist) error: &error]; } - #endif return [NSDictionary dictionaryWithContentsOfFile: juceStringToNS (systemVersionPlist)]; }(); diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index 700e191e..66ff9669 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -167,7 +167,7 @@ int juce_siginterrupt (int sig, int flag) //============================================================================== namespace { - #if JUCE_LINUX || (JUCE_IOS && ! __DARWIN_ONLY_64_BIT_INO_T) // (this iOS stuff is to avoid a simulator bug) + #if JUCE_LINUX || (JUCE_IOS && (! TARGET_OS_MACCATALYST) && (! __DARWIN_ONLY_64_BIT_INO_T)) // (this iOS stuff is to avoid a simulator bug) using juce_statStruct = struct stat64; #define JUCE_STAT stat64 #else diff --git a/modules/juce_core/native/juce_win32_SystemStats.cpp b/modules/juce_core/native/juce_win32_SystemStats.cpp index 7cfc79d5..2fa3befb 100644 --- a/modules/juce_core/native/juce_win32_SystemStats.cpp +++ b/modules/juce_core/native/juce_win32_SystemStats.cpp @@ -191,7 +191,7 @@ static DebugFlagsInitialiser debugFlagsInitialiser; //============================================================================== #if JUCE_MINGW - static uint32 getWindowsVersion() + static uint64 getWindowsVersion() { auto filename = _T("kernel32.dll"); DWORD handle = 0; @@ -207,7 +207,7 @@ static DebugFlagsInitialiser debugFlagsInitialiser; if (VerQueryValue (data, (LPCTSTR) _T("\\"), (void**) &info, &verSize)) if (size > 0 && info != nullptr && info->dwSignature == 0xfeef04bd) - return (uint32) info->dwFileVersionMS; + return ((uint64) info->dwFileVersionMS << 32) | (uint64) info->dwFileVersionLS; } } @@ -240,24 +240,27 @@ static DebugFlagsInitialiser debugFlagsInitialiser; SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() { #if JUCE_MINGW - auto v = getWindowsVersion(); - auto major = (v >> 16) & 0xff; - auto minor = (v >> 0) & 0xff; + const auto v = getWindowsVersion(); + const auto major = (v >> 48) & 0xffff; + const auto minor = (v >> 32) & 0xffff; + const auto build = (v >> 16) & 0xffff; #else - auto versionInfo = getWindowsVersionInfo(); - auto major = versionInfo.dwMajorVersion; - auto minor = versionInfo.dwMinorVersion; + const auto versionInfo = getWindowsVersionInfo(); + const auto major = versionInfo.dwMajorVersion; + const auto minor = versionInfo.dwMinorVersion; + const auto build = versionInfo.dwBuildNumber; #endif jassert (major <= 10); // need to add support for new version! - if (major == 10) return Windows10; - if (major == 6 && minor == 3) return Windows8_1; - if (major == 6 && minor == 2) return Windows8_0; - if (major == 6 && minor == 1) return Windows7; - if (major == 6 && minor == 0) return WinVista; - if (major == 5 && minor == 1) return WinXP; - if (major == 5 && minor == 0) return Win2000; + if (major == 10 && build >= 22000) return Windows11; + if (major == 10) return Windows10; + if (major == 6 && minor == 3) return Windows8_1; + if (major == 6 && minor == 2) return Windows8_0; + if (major == 6 && minor == 1) return Windows7; + if (major == 6 && minor == 0) return WinVista; + if (major == 5 && minor == 1) return WinXP; + if (major == 5 && minor == 0) return Win2000; jassertfalse; return UnknownOS; @@ -269,6 +272,7 @@ String SystemStats::getOperatingSystemName() switch (getOperatingSystemType()) { + case Windows11: name = "Windows 11"; break; case Windows10: name = "Windows 10"; break; case Windows8_1: name = "Windows 8.1"; break; case Windows8_0: name = "Windows 8.0"; break; diff --git a/modules/juce_core/streams/juce_AndroidDocumentInputSource.h b/modules/juce_core/streams/juce_AndroidDocumentInputSource.h new file mode 100644 index 00000000..7b252452 --- /dev/null +++ b/modules/juce_core/streams/juce_AndroidDocumentInputSource.h @@ -0,0 +1,79 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +/** + An InputSource backed by an AndroidDocument. + + @see InputSource, AndroidDocument + + @tags{Core} +*/ +class JUCE_API AndroidDocumentInputSource : public InputSource +{ +public: + //============================================================================== + /** Creates a new AndroidDocumentInputSource, backed by the provided document. + */ + explicit AndroidDocumentInputSource (const AndroidDocument& doc) + : document (doc) {} + + //============================================================================== + /** Returns a new InputStream to read this item. + + @returns an inputstream that the caller will delete, or nullptr if + the document can't be opened. + */ + InputStream* createInputStream() override + { + return document.createInputStream().release(); + } + + /** @internal + + An AndroidDocument doesn't use conventional filesystem paths. + Use the member functions of AndroidDocument to locate relative items. + + @param relatedItemPath the relative pathname of the resource that is required + @returns an input stream if relatedItemPath was empty, otherwise + nullptr. + */ + InputStream* createInputStreamFor (const String& relatedItemPath) override + { + return relatedItemPath.isEmpty() ? document.createInputStream().release() : nullptr; + } + + /** Returns a hash code that uniquely represents this item. + */ + int64 hashCode() const override + { + return document.getUrl().toString (true).hashCode64(); + } + +private: + AndroidDocument document; +}; + +} // namespace juce diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h index a84c76a4..71611f10 100644 --- a/modules/juce_core/system/juce_StandardHeader.h +++ b/modules/juce_core/system/juce_StandardHeader.h @@ -29,7 +29,7 @@ */ #define JUCE_MAJOR_VERSION 7 #define JUCE_MINOR_VERSION 0 -#define JUCE_BUILDNUMBER 1 +#define JUCE_BUILDNUMBER 2 /** Current JUCE version number. diff --git a/modules/juce_core/system/juce_SystemStats.h b/modules/juce_core/system/juce_SystemStats.h index 36249dea..37924f08 100644 --- a/modules/juce_core/system/juce_SystemStats.h +++ b/modules/juce_core/system/juce_SystemStats.h @@ -71,7 +71,8 @@ public: Windows7 = Windows | 4, Windows8_0 = Windows | 5, Windows8_1 = Windows | 6, - Windows10 = Windows | 7 + Windows10 = Windows | 7, + Windows11 = Windows | 8 }; /** Returns the type of operating system we're running on. diff --git a/modules/juce_core/text/juce_LocalisedStrings.h b/modules/juce_core/text/juce_LocalisedStrings.h index e839dddc..32790de8 100644 --- a/modules/juce_core/text/juce_LocalisedStrings.h +++ b/modules/juce_core/text/juce_LocalisedStrings.h @@ -50,7 +50,7 @@ namespace juce "goodbye" = "au revoir" @endcode - If the strings need to contain a quote character, they can use '\"' instead, and + If the strings need to contain a quote character, they can use `\"` instead, and if the first non-whitespace character on a line isn't a quote, then it's ignored, (you can use this to add comments). diff --git a/modules/juce_core/unit_tests/juce_UnitTest.cpp b/modules/juce_core/unit_tests/juce_UnitTest.cpp index 1b218eed..564d55ea 100644 --- a/modules/juce_core/unit_tests/juce_UnitTest.cpp +++ b/modules/juce_core/unit_tests/juce_UnitTest.cpp @@ -194,6 +194,11 @@ bool UnitTestRunner::shouldAbortTests() return false; } +static String getTestNameString (const String& testName, const String& subCategory) +{ + return testName + " / " + subCategory; +} + void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCategory) { endTest(); @@ -203,7 +208,7 @@ void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCatego results.add (new TestResult (testName, subCategory)); logMessage ("-----------------------------------------------------------------"); - logMessage ("Starting test: " + testName + " / " + subCategory + "..."); + logMessage ("Starting tests in: " + getTestNameString (testName, subCategory) + "..."); resultsUpdated(); } @@ -226,7 +231,7 @@ void UnitTestRunner::endTest() } else { - logMessage ("All tests completed successfully"); + logMessage ("Completed tests in " + getTestNameString (r->unitTestName, r->subcategoryName)); } } } diff --git a/modules/juce_cryptography/juce_cryptography.h b/modules/juce_cryptography/juce_cryptography.h index 6ce3e0d3..77fa22af 100644 --- a/modules/juce_cryptography/juce_cryptography.h +++ b/modules/juce_cryptography/juce_cryptography.h @@ -35,7 +35,7 @@ ID: juce_cryptography vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE cryptography classes description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc. website: http://www.juce.com/juce diff --git a/modules/juce_data_structures/juce_data_structures.h b/modules/juce_data_structures/juce_data_structures.h index 176392e9..3ed772b8 100644 --- a/modules/juce_data_structures/juce_data_structures.h +++ b/modules/juce_data_structures/juce_data_structures.h @@ -35,7 +35,7 @@ ID: juce_data_structures vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE data model helper classes description: Classes for undo/redo management, and smart data structures. website: http://www.juce.com/juce diff --git a/modules/juce_data_structures/values/juce_ValueTree.cpp b/modules/juce_data_structures/values/juce_ValueTree.cpp index 241a558e..251d9f69 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -669,6 +669,9 @@ void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoMa { jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail! + if (source == *this) + return; + if (source.object == nullptr) removeAllProperties (undoManager); else if (object != nullptr) @@ -679,6 +682,9 @@ void ValueTree::copyPropertiesAndChildrenFrom (const ValueTree& source, UndoMana { jassert (object != nullptr || source.object == nullptr); // Trying to copy to a null ValueTree will fail! + if (source == *this) + return; + copyPropertiesFrom (source, undoManager); removeAllChildren (undoManager); diff --git a/modules/juce_dsp/frequency/juce_Windowing.cpp b/modules/juce_dsp/frequency/juce_Windowing.cpp index 3a12366a..e8f56119 100644 --- a/modules/juce_dsp/frequency/juce_Windowing.cpp +++ b/modules/juce_dsp/frequency/juce_Windowing.cpp @@ -166,7 +166,7 @@ void WindowingFunction::fillWindowingTables (FloatType* samples, size } template -void WindowingFunction::multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept +void WindowingFunction::multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept { FloatVectorOperations::multiply (samples, windowTable.getRawDataPointer(), jmin (static_cast (size), windowTable.size())); } diff --git a/modules/juce_dsp/frequency/juce_Windowing.h b/modules/juce_dsp/frequency/juce_Windowing.h index 1b18cf08..573e89bb 100644 --- a/modules/juce_dsp/frequency/juce_Windowing.h +++ b/modules/juce_dsp/frequency/juce_Windowing.h @@ -94,7 +94,7 @@ public: bool normalise = true, FloatType beta = 0) noexcept; /** Multiplies the content of a buffer with the given window. */ - void multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept; + void multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept; /** Returns the name of a given windowing method. */ static const char* getWindowingMethodName (WindowingMethod) noexcept; diff --git a/modules/juce_dsp/juce_dsp.h b/modules/juce_dsp/juce_dsp.h index d6e8e99c..17ca0c08 100644 --- a/modules/juce_dsp/juce_dsp.h +++ b/modules/juce_dsp/juce_dsp.h @@ -35,7 +35,7 @@ ID: juce_dsp vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE DSP classes description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc. website: http://www.juce.com/juce diff --git a/modules/juce_events/juce_events.h b/modules/juce_events/juce_events.h index 1a78e86f..6f7e5060 100644 --- a/modules/juce_events/juce_events.h +++ b/modules/juce_events/juce_events.h @@ -32,7 +32,7 @@ ID: juce_events vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE message and event handling classes description: Classes for running an application's main event loop and sending/receiving messages, timers, etc. website: http://www.juce.com/juce diff --git a/modules/juce_events/messages/juce_ApplicationBase.cpp b/modules/juce_events/messages/juce_ApplicationBase.cpp index 2ca5dfef..604a649e 100644 --- a/modules/juce_events/messages/juce_ApplicationBase.cpp +++ b/modules/juce_events/messages/juce_ApplicationBase.cpp @@ -279,8 +279,8 @@ bool JUCEApplicationBase::initialiseApp() } #endif - #if JUCE_WINDOWS && JUCE_STANDALONE_APPLICATION && (! defined (_CONSOLE)) && (! JUCE_MINGW) - if (AttachConsole (ATTACH_PARENT_PROCESS) != 0) + #if JUCE_WINDOWS && (! defined (_CONSOLE)) && (! JUCE_MINGW) + if (isStandaloneApp() && AttachConsole (ATTACH_PARENT_PROCESS) != 0) { // if we've launched a GUI app from cmd.exe or PowerShell, we need this to enable printf etc. // However, only reassign stdout, stderr, stdin if they have not been already opened by diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 153ac624..cca2d492 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -225,6 +225,8 @@ void MessageManager::deregisterBroadcastListener (ActionListener* const listener //============================================================================== bool MessageManager::isThisTheMessageThread() const noexcept { + const std::lock_guard lock { messageThreadIdMutex }; + return Thread::getCurrentThreadId() == messageThreadId; } @@ -232,10 +234,10 @@ void MessageManager::setCurrentThreadAsMessageThread() { auto thisThread = Thread::getCurrentThreadId(); - if (messageThreadId != thisThread) - { - messageThreadId = thisThread; + const std::lock_guard lock { messageThreadIdMutex }; + if (std::exchange (messageThreadId, thisThread) != thisThread) + { #if JUCE_WINDOWS // This is needed on windows to make sure the message window is created by this thread doPlatformSpecificShutdown(); diff --git a/modules/juce_events/messages/juce_MessageManager.h b/modules/juce_events/messages/juce_MessageManager.h index 9a5c26e6..8687a057 100644 --- a/modules/juce_events/messages/juce_MessageManager.h +++ b/modules/juce_events/messages/juce_MessageManager.h @@ -328,6 +328,7 @@ private: Atomic quitMessagePosted { 0 }, quitMessageReceived { 0 }; Thread::ThreadID messageThreadId; Atomic threadWithLock; + mutable std::mutex messageThreadIdMutex; static bool postMessageToSystemQueue (MessageBase*); static void* exitModalLoopCallback (void*); diff --git a/modules/juce_graphics/colour/juce_Colours.cpp b/modules/juce_graphics/colour/juce_Colours.cpp index 3dff4648..cd162852 100644 --- a/modules/juce_graphics/colour/juce_Colours.cpp +++ b/modules/juce_graphics/colour/juce_Colours.cpp @@ -38,6 +38,7 @@ Colour Colours::findColourForName (const String& colourName, { 0x06bdcc29, 0xffffffff }, /* white */ { 0x002e305a, 0xff0000ff }, /* blue */ { 0x00308adf, 0xff808080 }, /* grey */ + { 0x00308a63, 0xff808080 }, /* gray */ { 0x05e0cf03, 0xff008000 }, /* green */ { 0x0001b891, 0xffff0000 }, /* red */ { 0xd43c6474, 0xffffff00 }, /* yellow */ @@ -64,6 +65,7 @@ Colour Colours::findColourForName (const String& colourName, { 0x67cd1799, 0xff008b8b }, /* darkcyan */ { 0x31bbd168, 0xffb8860b }, /* darkgoldenrod */ { 0x67cecf55, 0xff555555 }, /* darkgrey */ + { 0x67ceced9, 0xff555555 }, /* darkgray */ { 0x920b194d, 0xff006400 }, /* darkgreen */ { 0x923edd4c, 0xffbdb76b }, /* darkkhaki */ { 0x5c293873, 0xff8b008b }, /* darkmagenta */ @@ -75,11 +77,13 @@ Colour Colours::findColourForName (const String& colourName, { 0x61be858a, 0xff8fbc8f }, /* darkseagreen */ { 0xc2b0f2bd, 0xff483d8b }, /* darkslateblue */ { 0xc2b34d42, 0xff2f4f4f }, /* darkslategrey */ + { 0xc2b34cc6, 0xff2f4f4f }, /* darkslategray */ { 0x7cf2b06b, 0xff00ced1 }, /* darkturquoise */ { 0xc8769375, 0xff9400d3 }, /* darkviolet */ { 0x25832862, 0xffff1493 }, /* deeppink */ { 0xfcad568f, 0xff00bfff }, /* deepskyblue */ { 0x634c8b67, 0xff696969 }, /* dimgrey */ + { 0x634c8aeb, 0xff696969 }, /* dimgray */ { 0x45c1ce55, 0xff1e90ff }, /* dodgerblue */ { 0xef19e3cb, 0xffb22222 }, /* firebrick */ { 0xb852b195, 0xfffffaf0 }, /* floralwhite */ @@ -106,11 +110,13 @@ Colour Colours::findColourForName (const String& colourName, { 0x21234e3c, 0xfffafad2 }, /* lightgoldenrodyellow */ { 0xf40157ad, 0xff90ee90 }, /* lightgreen */ { 0x28e744f5, 0xffd3d3d3 }, /* lightgrey */ + { 0x28e74479, 0xffd3d3d3 }, /* lightgray */ { 0x28eb3b8c, 0xffffb6c1 }, /* lightpink */ { 0x9fb78304, 0xffffa07a }, /* lightsalmon */ { 0x50632b2a, 0xff20b2aa }, /* lightseagreen */ { 0x68fb7b25, 0xff87cefa }, /* lightskyblue */ { 0xa8a35ba2, 0xff778899 }, /* lightslategrey */ + { 0xa8a35b26, 0xff778899 }, /* lightslategray */ { 0xa20d484f, 0xffb0c4de }, /* lightsteelblue */ { 0xaa2cf10a, 0xffffffe0 }, /* lightyellow */ { 0x0032afd5, 0xff00ff00 }, /* lime */ @@ -163,6 +169,7 @@ Colour Colours::findColourForName (const String& colourName, { 0x80da74fb, 0xff87ceeb }, /* skyblue */ { 0x44a8dd73, 0xff6a5acd }, /* slateblue */ { 0x44ab37f8, 0xff708090 }, /* slategrey */ + { 0x44ab377c, 0xff708090 }, /* slategray */ { 0x0035f183, 0xfffffafa }, /* snow */ { 0xd5440d16, 0xff00ff7f }, /* springgreen */ { 0x3e1524a5, 0xff4682b4 }, /* steelblue */ diff --git a/modules/juce_graphics/juce_graphics.h b/modules/juce_graphics/juce_graphics.h index e133b0ae..d10c3cee 100644 --- a/modules/juce_graphics/juce_graphics.h +++ b/modules/juce_graphics/juce_graphics.h @@ -35,7 +35,7 @@ ID: juce_graphics vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE graphics classes description: Classes for 2D vector graphics, image loading/saving, font handling, etc. website: http://www.juce.com/juce diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index e190577b..7e78c804 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -41,12 +41,10 @@ public: auto numComponents = (size_t) lineStride * (size_t) jmax (1, height); - # if JUCE_MAC && defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14 - // This version of the SDK intermittently requires a bit of extra space + // SDK version 10.14+ intermittently requires a bit of extra space // at the end of the image data. This feels like something has gone // wrong in Apple's code. numComponents += (size_t) lineStride; - #endif imageData->data.allocate (numComponents, clearImage); diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h index 049c3972..8c74afef 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h @@ -39,23 +39,14 @@ public: /** Destructor. */ virtual ~AccessibilityCellInterface() = default; - /** Returns the column index of the cell in the table. */ - virtual int getColumnIndex() const = 0; - - /** Returns the number of columns occupied by the cell in the table. */ - virtual int getColumnSpan() const = 0; - - /** Returns the row index of the cell in the table. */ - virtual int getRowIndex() const = 0; - - /** Returns the number of rows occupied by the cell in the table. */ - virtual int getRowSpan() const = 0; - /** Returns the indentation level for the cell. */ virtual int getDisclosureLevel() const = 0; /** Returns the AccessibilityHandler of the table which contains the cell. */ virtual const AccessibilityHandler* getTableHandler() const = 0; + + /** Returns a list of the accessibility elements that are disclosed by this element, if any. */ + virtual std::vector getDisclosedRows() const { return {}; } }; } // namespace juce diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h index 4f7f7944..a50227ed 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h @@ -49,6 +49,48 @@ public: nullptr if there is no cell at the specified position. */ virtual const AccessibilityHandler* getCellHandler (int row, int column) const = 0; + + /** Returns the AccessibilityHandler for a row in the table, or nullptr if there is + no row at this index. + + The row component should have a child component for each column in the table. + */ + virtual const AccessibilityHandler* getRowHandler (int row) const = 0; + + /** Returns the AccessibilityHandler for the header, or nullptr if there is + no header. + + If you supply a header, it must have exactly the same number of children + as there are columns in the table. + */ + virtual const AccessibilityHandler* getHeaderHandler() const = 0; + + struct Span { int begin, num; }; + + /** Given the handler of one of the cells in the table, returns the rows covered + by that cell, or null if the cell does not exist in the table. + + This function replaces the getRowIndex and getRowSpan + functions from AccessibilityCellInterface. Most of the time, it's easier for the + table itself to keep track of cell locations, than to delegate to the individual + cells. + */ + virtual Optional getRowSpan (const AccessibilityHandler&) const = 0; + + /** Given the handler of one of the cells in the table, returns the columns covered + by that cell, or null if the cell does not exist in the table. + + This function replaces the getColumnIndex and getColumnSpan + functions from AccessibilityCellInterface. Most of the time, it's easier for the + table itself to keep track of cell locations, than to delegate to the individual + cells. + */ + virtual Optional getColumnSpan (const AccessibilityHandler&) const = 0; + + /** Attempts to scroll the table (if necessary) so that the cell with the given handler + is visible. + */ + virtual void showCell (const AccessibilityHandler&) const = 0; }; } // namespace juce diff --git a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp index 1fdd25a2..a5f5440f 100644 --- a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp @@ -121,4 +121,9 @@ void HyperlinkButton::paintButton (Graphics& g, true); } +std::unique_ptr HyperlinkButton::createAccessibilityHandler() +{ + return std::make_unique (*this, AccessibilityRole::hyperlink); +} + } // namespace juce diff --git a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h index e4b67694..553464fa 100644 --- a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +++ b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h @@ -111,6 +111,8 @@ protected: void paintButton (Graphics&, bool, bool) override; private: + std::unique_ptr createAccessibilityHandler() override; + //============================================================================== using Button::clicked; Font getFontToUse() const; diff --git a/modules/juce_gui_basics/desktop/juce_Desktop.cpp b/modules/juce_gui_basics/desktop/juce_Desktop.cpp index 8054f49c..6382c52b 100644 --- a/modules/juce_gui_basics/desktop/juce_Desktop.cpp +++ b/modules/juce_gui_basics/desktop/juce_Desktop.cpp @@ -223,7 +223,7 @@ void Desktop::handleAsyncUpdate() void Desktop::addDarkModeSettingListener (DarkModeSettingListener* l) { darkModeSettingListeners.add (l); } void Desktop::removeDarkModeSettingListener (DarkModeSettingListener* l) { darkModeSettingListeners.remove (l); } -void Desktop::darkModeChanged() { darkModeSettingListeners.call ([] (DarkModeSettingListener& l) { l.darkModeSettingChanged(); }); } +void Desktop::darkModeChanged() { darkModeSettingListeners.call ([] (auto& l) { l.darkModeSettingChanged(); }); } //============================================================================== void Desktop::resetTimer() diff --git a/modules/juce_gui_basics/desktop/juce_Displays.cpp b/modules/juce_gui_basics/desktop/juce_Displays.cpp index cff16433..a2011434 100644 --- a/modules/juce_gui_basics/desktop/juce_Displays.cpp +++ b/modules/juce_gui_basics/desktop/juce_Displays.cpp @@ -26,6 +26,15 @@ namespace juce { +template +auto* getPrimaryDisplayImpl (This& t) +{ + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED + + const auto iter = std::find_if (t.displays.begin(), t.displays.end(), [] (auto& d) { return d.isMain; }); + return iter != t.displays.end() ? std::addressof (*iter) : nullptr; +} + Displays::Displays (Desktop& desktop) { init (desktop); @@ -162,13 +171,7 @@ Point Displays::logicalToPhysical (Point point, const Disp const Displays::Display* Displays::getPrimaryDisplay() const noexcept { - JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED - - for (auto& d : displays) - if (d.isMain) - return &d; - - return nullptr; + return getPrimaryDisplayImpl (*this); } RectangleList Displays::getRectangleList (bool userAreasOnly) const @@ -202,19 +205,22 @@ void Displays::refresh() } } -bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept; -bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept +static auto tie (const Displays::Display& d) { - return d1.isMain == d2.isMain - && d1.totalArea == d2.totalArea - && d1.userArea == d2.userArea - && d1.topLeftPhysical == d2.topLeftPhysical - && d1.scale == d2.scale - && d1.dpi == d2.dpi; + return std::tie (d.dpi, + d.isMain, + d.keyboardInsets, + d.safeAreaInsets, + d.scale, + d.topLeftPhysical, + d.totalArea, + d.userArea); } -bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept; -bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept { return ! (d1 == d2); } +static bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept +{ + return tie (d1) == tie (d2); +} //============================================================================== // These methods are used for converting the totalArea and userArea Rectangles in Display from physical to logical diff --git a/modules/juce_gui_basics/desktop/juce_Displays.h b/modules/juce_gui_basics/desktop/juce_Displays.h index aecf834e..9108d5a9 100644 --- a/modules/juce_gui_basics/desktop/juce_Displays.h +++ b/modules/juce_gui_basics/desktop/juce_Displays.h @@ -63,6 +63,17 @@ public: */ BorderSize safeAreaInsets; + /** Represents the area of this display in logical pixels that is obscured by an + onscreen keyboard. + + This is currently only supported on iOS, and on Android 11+. + + This will only return the bounds of the keyboard when it is in 'docked' mode. + If the keyboard is floating (e.g. on an iPad using the split keyboard mode), + no insets will be reported. + */ + BorderSize keyboardInsets; + /** The top-left of this display in physical coordinates. */ Point topLeftPhysical; diff --git a/modules/juce_gui_basics/drawables/juce_Drawable.cpp b/modules/juce_gui_basics/drawables/juce_Drawable.cpp index 2f214350..0c5a3cc4 100644 --- a/modules/juce_gui_basics/drawables/juce_Drawable.cpp +++ b/modules/juce_gui_basics/drawables/juce_Drawable.cpp @@ -140,6 +140,7 @@ void Drawable::setBoundsToEnclose (Rectangle area) auto newBounds = area.getSmallestIntegerContainer() + parentOrigin; originRelativeToComponent = parentOrigin - newBounds.getPosition(); setBounds (newBounds); + updateTransform(); } //============================================================================== @@ -154,6 +155,23 @@ bool Drawable::replaceColour (Colour original, Colour replacement) return changed; } +void Drawable::setDrawableTransform (const AffineTransform& transform) +{ + drawableTransform = transform; + updateTransform(); +} + +void Drawable::updateTransform() +{ + if (drawableTransform.isIdentity()) + return; + + const auto transformationOrigin = originRelativeToComponent + getPosition(); + setTransform (AffineTransform::translation (transformationOrigin * (-1)) + .followedBy (drawableTransform) + .followedBy (AffineTransform::translation (transformationOrigin))); +} + //============================================================================== void Drawable::setOriginWithOriginalSize (Point originWithinParent) { diff --git a/modules/juce_gui_basics/drawables/juce_Drawable.h b/modules/juce_gui_basics/drawables/juce_Drawable.h index 9215a963..6d3ca081 100644 --- a/modules/juce_gui_basics/drawables/juce_Drawable.h +++ b/modules/juce_gui_basics/drawables/juce_Drawable.h @@ -186,6 +186,21 @@ public: */ virtual bool replaceColour (Colour originalColour, Colour replacementColour); + /** Sets a transformation that applies to the same coordinate system in which the rest of the + draw calls are made. You almost certainly want to call this function when working with + Drawables as opposed to Component::setTransform(). + + The reason for this is that the origin of a Drawable is not the same as the point returned + by Component::getPosition() but has an additional offset internal to the Drawable class. + + Using setDrawableTransform() will take this internal offset into account when applying the + transform to the Component base. + + You can only use Drawable::setDrawableTransform() or Component::setTransform() for a given + object. Using both will lead to unpredictable behaviour. + */ + void setDrawableTransform (const AffineTransform& transform); + protected: //============================================================================== friend class DrawableComposite; @@ -202,8 +217,10 @@ protected: Point originRelativeToComponent; std::unique_ptr drawableClipPath; + AffineTransform drawableTransform; void nonConstDraw (Graphics&, float opacity, const AffineTransform&); + void updateTransform(); Drawable (const Drawable&); Drawable& operator= (const Drawable&); diff --git a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp index 7b4d83cc..c96a8622 100644 --- a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp +++ b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp @@ -1093,9 +1093,9 @@ private: dt->setFont (font, true); if (additonalTransform != nullptr) - dt->setTransform (transform.followedBy (*additonalTransform)); + dt->setDrawableTransform (transform.followedBy (*additonalTransform)); else - dt->setTransform (transform); + dt->setDrawableTransform (transform); dt->setColour (parseColour (xml, "fill", Colours::black) .withMultipliedAlpha (parseSafeFloat (getStyleAttribute (xml, "fill-opacity", "1")))); diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h index 4bae64c9..b9242e9c 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h @@ -46,7 +46,7 @@ namespace juce File mooseFile (chooser.getResult()); loadMoose (mooseFile); - } + }); } @endcode diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp index 6755bba6..50553e40 100644 --- a/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/modules/juce_gui_basics/juce_gui_basics.cpp @@ -54,7 +54,7 @@ #import #elif JUCE_IOS - #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + #if JUCE_PUSH_NOTIFICATIONS #import #endif @@ -127,6 +127,18 @@ namespace juce ScaledImage image; Point hotspot; }; + + template + static const AccessibilityHandler* getEnclosingHandlerWithInterface (const AccessibilityHandler* handler, MemberFn fn) + { + if (handler == nullptr) + return nullptr; + + if ((handler->*fn)() != nullptr) + return handler; + + return getEnclosingHandlerWithInterface (handler->getParent(), fn); + } } // namespace juce #include "mouse/juce_PointerState.h" @@ -259,7 +271,7 @@ namespace juce #include "native/juce_MultiTouchMapper.h" #endif -#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_UNIT_TESTS +#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_IOS || JUCE_UNIT_TESTS #include "native/accessibility/juce_AccessibilityTextHelpers.h" #endif @@ -267,8 +279,8 @@ namespace juce #include "native/accessibility/juce_mac_AccessibilitySharedCode.mm" #if JUCE_IOS - #include "native/accessibility/juce_ios_Accessibility.mm" #include "native/juce_ios_UIViewComponentPeer.mm" + #include "native/accessibility/juce_ios_Accessibility.mm" #include "native/juce_ios_Windowing.mm" #include "native/juce_ios_FileChooser.mm" diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h index 40b367eb..ff32e26f 100644 --- a/modules/juce_gui_basics/juce_gui_basics.h +++ b/modules/juce_gui_basics/juce_gui_basics.h @@ -35,7 +35,7 @@ ID: juce_gui_basics vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE GUI core classes description: Basic user-interface components and related classes. website: http://www.juce.com/juce diff --git a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h index c89f0390..b255a2a0 100644 --- a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h +++ b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h @@ -71,8 +71,32 @@ public: /** Inserts some text, overwriting the selected text region, if there is one. */ virtual void insertTextAtCaret (const String& textToInsert) = 0; + /** Returns the current index of the caret. */ + virtual int getCaretPosition() const = 0; + /** Returns the position of the caret, relative to the component's origin. */ - virtual Rectangle getCaretRectangle() = 0; + Rectangle getCaretRectangle() const { return getCaretRectangleForCharIndex (getCaretPosition()); } + + /** Returns the bounding box of the character at the given index. */ + virtual Rectangle getCaretRectangleForCharIndex (int characterIndex) const = 0; + + /** Returns the total number of codepoints in the string. */ + virtual int getTotalNumChars() const = 0; + + /** Returns the index closest to the given point. + + This is the location where the cursor might be placed after clicking at the given + point in a text field. + */ + virtual int getCharIndexForPoint (Point point) const = 0; + + /** Returns the bounding box for a range of text in the editor. As the range may span + multiple lines, this method returns a RectangleList. + + The bounds are relative to the component's top-left and may extend beyond the bounds + of the component if the text is long and word wrapping is disabled. + */ + virtual RectangleList getTextBounds (Range textRange) const = 0; /** A set of possible on-screen keyboard types, for use in the getKeyboardType() method. diff --git a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp index 255d3306..b711858c 100644 --- a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp +++ b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp @@ -56,19 +56,19 @@ void MultiDocumentPanelWindow::closeButtonPressed() void MultiDocumentPanelWindow::activeWindowStatusChanged() { DocumentWindow::activeWindowStatusChanged(); - updateOrder(); + updateActiveDocument(); } void MultiDocumentPanelWindow::broughtToFront() { DocumentWindow::broughtToFront(); - updateOrder(); + updateActiveDocument(); } -void MultiDocumentPanelWindow::updateOrder() +void MultiDocumentPanelWindow::updateActiveDocument() { if (auto* owner = getOwner()) - owner->updateOrder(); + owner->updateActiveDocumentFromUIState(); } MultiDocumentPanel* MultiDocumentPanelWindow::getOwner() const noexcept @@ -84,7 +84,7 @@ struct MultiDocumentPanel::TabbedComponentInternal : public TabbedComponent void currentTabChanged (int, const String&) override { if (auto* owner = findParentComponentOfClass()) - owner->updateOrder(); + owner->updateActiveDocumentFromUIState(); } }; @@ -262,22 +262,85 @@ bool MultiDocumentPanel::addDocument (Component* const component, } resized(); - activeDocumentChanged(); + updateActiveDocument (component); return true; } -void MultiDocumentPanel::closeDocumentInternal (Component* component) +void MultiDocumentPanel::recreateLayout() +{ + tabComponent.reset(); + + for (int i = getNumChildComponents(); --i >= 0;) + { + std::unique_ptr dw (dynamic_cast (getChildComponent (i))); + + if (dw != nullptr) + { + dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString()); + dw->clearContentComponent(); + } + } + + resized(); + + auto tempComps = components; + components.clear(); + + { + // We want to preserve the activeComponent, so we are blocking the changes originating + // from addDocument() + const ScopedValueSetter scope { isLayoutBeingChanged, true }; + + for (auto* c : tempComps) + addDocument (c, + Colour ((uint32) static_cast (c->getProperties().getWithDefault ("mdiDocumentBkg_", + (int) Colours::white.getARGB()))), + MultiDocHelpers::shouldDeleteComp (c)); + } + + if (activeComponent != nullptr) + setActiveDocument (activeComponent); + + updateActiveDocumentFromUIState(); +} + +void MultiDocumentPanel::closeDocumentInternal (Component* componentToClose) { // Intellisense warns about component being uninitialised. // I'm not sure how a function argument could be uninitialised. JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6001) + const OptionalScopedPointer component { componentToClose, + MultiDocHelpers::shouldDeleteComp (componentToClose) }; + component->removeComponentListener (this); - const bool shouldDelete = MultiDocHelpers::shouldDeleteComp (component); component->getProperties().remove ("mdiDocumentDelete_"); component->getProperties().remove ("mdiDocumentBkg_"); + const auto removedIndex = components.indexOf (component); + + if (removedIndex < 0) + { + jassertfalse; + return; + } + + components.remove (removedIndex); + + // See if the active document needs to change because of closing a document. It should only + // change if we closed the active document. If so, the next active document should be the + // subsequent one. + if (component == activeComponent) + { + auto* newActiveComponent = components[jmin (removedIndex, components.size() - 1)]; + updateActiveDocument (newActiveComponent); + } + + // We update the UI to reflect the new state, but we want to prevent the UI state callback + // to change the active document. + const ScopedValueSetter scope { isLayoutBeingChanged, true }; + if (mode == FloatingWindows) { for (auto* child : getChildren()) @@ -292,11 +355,6 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component) } } - if (shouldDelete) - delete component; - - components.removeFirstMatchingValue (component); - if (isFullscreenWhenOneDocument() && components.size() == 1) { for (int i = getNumChildComponents(); --i >= 0;) @@ -307,13 +365,11 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component) dw->clearContentComponent(); } - addAndMakeVisible (components.getFirst()); + addAndMakeVisible (getActiveDocument()); } } else { - jassert (components.indexOf (component) >= 0); - if (tabComponent != nullptr) { for (int i = tabComponent->getNumTabs(); --i >= 0;) @@ -325,25 +381,18 @@ void MultiDocumentPanel::closeDocumentInternal (Component* component) removeChildComponent (component); } - if (shouldDelete) - delete component; - - if (tabComponent != nullptr && tabComponent->getNumTabs() <= numDocsBeforeTabsUsed) + if (components.size() <= numDocsBeforeTabsUsed && getActiveDocument() != nullptr) + { tabComponent.reset(); - - components.removeFirstMatchingValue (component); - - if (components.size() > 0 && tabComponent == nullptr) - addAndMakeVisible (components.getFirst()); + addAndMakeVisible (getActiveDocument()); + } } resized(); // This ensures that the active tab is painted properly when a tab is closed! - if (auto* activeComponent = getActiveDocument()) - setActiveDocument (activeComponent); - - activeDocumentChanged(); + if (auto* activeDocument = getActiveDocument()) + setActiveDocument (activeDocument); JUCE_END_IGNORE_WARNINGS_MSVC } @@ -438,15 +487,7 @@ Component* MultiDocumentPanel::getDocument (const int index) const noexcept Component* MultiDocumentPanel::getActiveDocument() const noexcept { - if (mode == FloatingWindows) - { - for (auto* child : getChildren()) - if (auto* dw = dynamic_cast (child)) - if (dw->isActiveWindow()) - return dw->getContentComponent(); - } - - return components.getLast(); + return activeComponent; } void MultiDocumentPanel::setActiveDocument (Component* component) @@ -490,7 +531,10 @@ void MultiDocumentPanel::setMaximumNumDocuments (const int newNumber) void MultiDocumentPanel::useFullscreenWhenOneDocument (const bool shouldUseTabs) { - numDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0; + const auto newNumDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0; + + if (std::exchange (numDocsBeforeTabsUsed, newNumDocsBeforeTabsUsed) != newNumDocsBeforeTabsUsed) + recreateLayout(); } bool MultiDocumentPanel::isFullscreenWhenOneDocument() const noexcept @@ -501,38 +545,8 @@ bool MultiDocumentPanel::isFullscreenWhenOneDocument() const noexcept //============================================================================== void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode) { - if (mode != newLayoutMode) - { - mode = newLayoutMode; - - if (mode == FloatingWindows) - { - tabComponent.reset(); - } - else - { - for (int i = getNumChildComponents(); --i >= 0;) - { - std::unique_ptr dw (dynamic_cast (getChildComponent (i))); - - if (dw != nullptr) - { - dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString()); - dw->clearContentComponent(); - } - } - } - - resized(); - - auto tempComps = components; - components.clear(); - - for (auto* c : tempComps) - addDocument (c, - Colour ((uint32) static_cast (c->getProperties().getWithDefault ("mdiDocumentBkg_", (int) Colours::white.getARGB()))), - MultiDocHelpers::shouldDeleteComp (c)); - } + if (std::exchange (mode, newLayoutMode) != newLayoutMode) + recreateLayout(); } void MultiDocumentPanel::setBackgroundColour (Colour newBackgroundColour) @@ -590,31 +604,36 @@ void MultiDocumentPanel::componentNameChanged (Component&) } } -void MultiDocumentPanel::updateOrder() +void MultiDocumentPanel::updateActiveDocumentFromUIState() { - auto oldList = components; - - if (mode == FloatingWindows) - { - components.clear(); - - for (auto* child : getChildren()) - if (auto* dw = dynamic_cast (child)) - components.add (dw->getContentComponent()); - } - else + auto* newActiveComponent = [&]() -> Component* { - if (tabComponent != nullptr) + if (mode == FloatingWindows) { - if (auto* current = tabComponent->getCurrentContentComponent()) + for (auto* c : components) { - components.removeFirstMatchingValue (current); - components.add (current); + if (auto* window = static_cast (c->getParentComponent())) + if (window->isActiveWindow()) + return c; } } - } - if (components != oldList) + if (tabComponent != nullptr) + if (auto* current = tabComponent->getCurrentContentComponent()) + return current; + + return activeComponent; + }(); + + updateActiveDocument (newActiveComponent); +} + +void MultiDocumentPanel::updateActiveDocument (Component* component) +{ + if (isLayoutBeingChanged) + return; + + if (std::exchange (activeComponent, component) != component) activeDocumentChanged(); } diff --git a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h index 52ed9311..2a414897 100644 --- a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h +++ b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h @@ -64,7 +64,7 @@ public: private: //============================================================================== - void updateOrder(); + void updateActiveDocument(); MultiDocumentPanel* getOwner() const noexcept; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiDocumentPanelWindow) @@ -362,11 +362,15 @@ private: friend class MultiDocumentPanelWindow; Component* getContainerComp (Component*) const; - void updateOrder(); + void updateActiveDocumentFromUIState(); + void updateActiveDocument (Component*); void addWindow (Component*); + void recreateLayout(); LayoutMode mode = MaximisedWindowsWithTabs; Array components; + Component* activeComponent = nullptr; + bool isLayoutBeingChanged = false; std::unique_ptr tabComponent; Colour backgroundColour { Colours::lightblue }; int maximumNumDocuments = 0, numDocsBeforeTabsUsed = 0; diff --git a/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp b/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp index 99bec2c9..328b46f7 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp +++ b/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp @@ -223,41 +223,47 @@ void MenuBarComponent::updateItemUnderMouse (Point p) void MenuBarComponent::showMenu (int index) { - if (index != currentPopupIndex) - { - PopupMenu::dismissAllActiveMenus(); - menuBarItemsChanged (nullptr); + if (index == currentPopupIndex) + return; - setOpenItem (index); - setItemUnderMouse (index); + const auto needToOpenNewSubMenu = isPositiveAndBelow (index, (int) itemComponents.size()); - if (isPositiveAndBelow (index, (int) itemComponents.size())) - { - const auto& itemComponent = itemComponents[(size_t) index]; - auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName()); + if (needToOpenNewSubMenu) + ++numActiveMenus; - if (m.lookAndFeel == nullptr) - m.setLookAndFeel (&getLookAndFeel()); + PopupMenu::dismissAllActiveMenus(); + menuBarItemsChanged (nullptr); - auto itemBounds = itemComponent->getBounds(); + setOpenItem (index); + setItemUnderMouse (index); - const auto callback = [ref = SafePointer (this), index] (int result) - { - if (ref != nullptr) - ref->menuDismissed (index, result); - }; - - m.showMenuAsync (PopupMenu::Options().withTargetComponent (this) - .withTargetScreenArea (localAreaToGlobal (itemBounds)) - .withMinimumWidth (itemBounds.getWidth()), - callback); - } + if (needToOpenNewSubMenu) + { + const auto& itemComponent = itemComponents[(size_t) index]; + auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName()); + + if (m.lookAndFeel == nullptr) + m.setLookAndFeel (&getLookAndFeel()); + + auto itemBounds = itemComponent->getBounds(); + + const auto callback = [ref = SafePointer (this), index] (int result) + { + if (ref != nullptr) + ref->menuDismissed (index, result); + }; + + m.showMenuAsync (PopupMenu::Options().withTargetComponent (this) + .withTargetScreenArea (localAreaToGlobal (itemBounds)) + .withMinimumWidth (itemBounds.getWidth()), + callback); } } void MenuBarComponent::menuDismissed (int topLevelIndex, int itemId) { - topLevelIndexClicked = topLevelIndex; + topLevelIndexDismissed = topLevelIndex; + --numActiveMenus; postCommandMessage (itemId); } @@ -265,11 +271,11 @@ void MenuBarComponent::handleCommandMessage (int commandId) { updateItemUnderMouse (getMouseXYRelative()); - if (currentPopupIndex == topLevelIndexClicked) + if (numActiveMenus == 0) setOpenItem (-1); if (commandId != 0 && model != nullptr) - model->menuItemSelected (commandId, topLevelIndexClicked); + model->menuItemSelected (commandId, topLevelIndexDismissed); } //============================================================================== diff --git a/modules/juce_gui_basics/menus/juce_MenuBarComponent.h b/modules/juce_gui_basics/menus/juce_MenuBarComponent.h index 602e7bf0..d1761316 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarComponent.h +++ b/modules/juce_gui_basics/menus/juce_MenuBarComponent.h @@ -119,7 +119,8 @@ private: std::vector> itemComponents; Point lastMousePos; - int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexClicked = 0; + int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexDismissed = 0; + int numActiveMenus = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MenuBarComponent) }; diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.cpp b/modules/juce_gui_basics/misc/juce_DropShadower.cpp index 44604f2c..384331d1 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.cpp +++ b/modules/juce_gui_basics/misc/juce_DropShadower.cpp @@ -86,20 +86,87 @@ private: JUCE_DECLARE_NON_COPYABLE (ShadowWindow) }; -class DropShadower::ParentVisibilityChangedListener : public ComponentListener, - private Timer +class DropShadower::VirtualDesktopWatcher final : public ComponentListener, + private Timer +{ +public: + //============================================================================== + VirtualDesktopWatcher (Component& c) : component (&c) + { + component->addComponentListener (this); + update(); + } + + ~VirtualDesktopWatcher() override + { + stopTimer(); + + if (auto* c = component.get()) + c->removeComponentListener (this); + } + + bool shouldHideDropShadow() const + { + return hasReasonToHide; + } + + void addListener (void* listener, std::function cb) + { + listeners[listener] = std::move (cb); + } + + void removeListener (void* listener) + { + listeners.erase (listener); + } + + //============================================================================== + void componentParentHierarchyChanged (Component& c) override + { + if (component.get() == &c) + update(); + } + +private: + //============================================================================== + void update() + { + const auto newHasReasonToHide = [this]() + { + if (! component.wasObjectDeleted() && isWindows && component->isOnDesktop()) + { + startTimerHz (5); + return ! isWindowOnCurrentVirtualDesktop (component->getWindowHandle()); + } + + stopTimer(); + return false; + }(); + + if (std::exchange (hasReasonToHide, newHasReasonToHide) != newHasReasonToHide) + for (auto& l : listeners) + l.second(); + } + + void timerCallback() override + { + update(); + } + + //============================================================================== + WeakReference component; + const bool isWindows = (SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0; + bool hasReasonToHide = false; + std::map> listeners; +}; + +class DropShadower::ParentVisibilityChangedListener : public ComponentListener { public: ParentVisibilityChangedListener (Component& r, ComponentListener& l) : root (&r), listener (&l) { updateParentHierarchy(); - - if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0) - { - isOnVirtualDesktop = isWindowOnCurrentVirtualDesktop (root->getWindowHandle()); - startTimerHz (5); - } } ~ParentVisibilityChangedListener() override @@ -121,8 +188,6 @@ public: updateParentHierarchy(); } - bool isWindowOnVirtualDesktop() const noexcept { return isOnVirtualDesktop; } - private: class ComponentWithWeakReference { @@ -165,26 +230,9 @@ private: withDifference (observedComponents, lastSeenComponents, [this] (auto& comp) { comp.addComponentListener (this); }); } - void timerCallback() override - { - WeakReference deletionChecker { static_cast (listener) }; - - const auto wasOnVirtualDesktop = std::exchange (isOnVirtualDesktop, - isWindowOnCurrentVirtualDesktop (root->getWindowHandle())); - - // on Windows, isWindowOnCurrentVirtualDesktop() may cause synchronous messages to be dispatched - // to the HWND so we need to check if the shadower is still valid after calling - if (deletionChecker == nullptr) - return; - - if (isOnVirtualDesktop != wasOnVirtualDesktop) - listener->componentVisibilityChanged (*root); - } - Component* root = nullptr; ComponentListener* listener = nullptr; std::set observedComponents; - bool isOnVirtualDesktop = true; JUCE_DECLARE_NON_COPYABLE (ParentVisibilityChangedListener) JUCE_DECLARE_NON_MOVEABLE (ParentVisibilityChangedListener) @@ -195,6 +243,9 @@ DropShadower::DropShadower (const DropShadow& ds) : shadow (ds) {} DropShadower::~DropShadower() { + if (virtualDesktopWatcher != nullptr) + virtualDesktopWatcher->removeListener (this); + if (owner != nullptr) { owner->removeComponentListener (this); @@ -228,6 +279,9 @@ void DropShadower::setOwner (Component* componentToFollow) visibilityChangedListener = std::make_unique (*owner, static_cast (*this)); + virtualDesktopWatcher = std::make_unique (*owner); + virtualDesktopWatcher->addListener (this, [this]() { updateShadows(); }); + updateShadows(); } } @@ -286,7 +340,7 @@ void DropShadower::updateShadows() && owner->isShowing() && owner->getWidth() > 0 && owner->getHeight() > 0 && (Desktop::canUseSemiTransparentWindows() || owner->getParentComponent() != nullptr) - && (visibilityChangedListener != nullptr && visibilityChangedListener->isWindowOnVirtualDesktop())) + && (virtualDesktopWatcher == nullptr || ! virtualDesktopWatcher->shouldHideDropShadow())) { while (shadowWindows.size() < 4) shadowWindows.add (new ShadowWindow (owner, shadow)); diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.h b/modules/juce_gui_basics/misc/juce_DropShadower.h index 816b7852..08ad6b15 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.h +++ b/modules/juce_gui_basics/misc/juce_DropShadower.h @@ -77,6 +77,9 @@ private: class ParentVisibilityChangedListener; std::unique_ptr visibilityChangedListener; + class VirtualDesktopWatcher; + std::unique_ptr virtualDesktopWatcher; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DropShadower) JUCE_DECLARE_WEAK_REFERENCEABLE (DropShadower) }; diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp index e534e190..d2b5bb26 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp @@ -138,6 +138,8 @@ public: setVisible (newTarget == nullptr || newTarget->shouldDrawDragImageWhenOver()); + maintainKeyboardFocusWhenPossible(); + if (newTargetComp != currentlyOverComp) { if (auto* lastTarget = getCurrentlyOver()) @@ -233,6 +235,16 @@ private: Time lastTimeOverTarget; int originalInputSourceIndex; MouseInputSource::InputSourceType originalInputSourceType; + bool canHaveKeyboardFocus = false; + + void maintainKeyboardFocusWhenPossible() + { + const auto newCanHaveKeyboardFocus = isVisible(); + + if (std::exchange (canHaveKeyboardFocus, newCanHaveKeyboardFocus) != newCanHaveKeyboardFocus) + if (canHaveKeyboardFocus) + grabKeyboardFocus(); + } void updateSize() { @@ -489,7 +501,6 @@ void DragAndDropContainer::startDragging (const var& sourceDescription, dragImageComponent->sourceDetails.localPosition = sourceComponent->getLocalPoint (nullptr, lastMouseDown); dragImageComponent->updateLocation (false, lastMouseDown); - dragImageComponent->grabKeyboardFocus(); #if JUCE_WINDOWS // Under heavy load, the layered window's paint callback can often be lost by the OS, diff --git a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp index 6eeae8d6..1ac5ed67 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp @@ -29,7 +29,6 @@ namespace juce #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (constructor, "", "()V") \ METHOD (setSource, "setSource", "(Landroid/view/View;I)V") \ METHOD (addChild, "addChild", "(Landroid/view/View;I)V") \ METHOD (setParent, "setParent", "(Landroid/view/View;)V") \ @@ -56,6 +55,25 @@ namespace juce DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo, "android/view/accessibility/AccessibilityNodeInfo") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (setCollectionInfo, "setCollectionInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V") \ + METHOD (setCollectionItemInfo, "setCollectionItemInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V") + + DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo19, "android/view/accessibility/AccessibilityNodeInfo") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (obtain, "obtain", "(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionInfo", 19) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (obtain, "obtain", "(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionItemInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo", 19) +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ STATICMETHOD (obtain, "obtain", "(I)Landroid/view/accessibility/AccessibilityEvent;") \ METHOD (setPackageName, "setPackageName", "(Ljava/lang/CharSequence;)V") \ @@ -124,6 +142,18 @@ static jmethodID nodeInfoSetTextSelection = nullptr; static jmethodID nodeInfoSetLiveRegion = nullptr; static jmethodID accessibilityEventSetContentChangeTypes = nullptr; +template +static AccessibilityHandler* getEnclosingHandlerWithInterface (AccessibilityHandler* handler, MemberFn fn) +{ + if (handler == nullptr) + return nullptr; + + if ((handler->*fn)() != nullptr) + return handler; + + return getEnclosingHandlerWithInterface (handler->getParent(), fn); +} + static void loadSDKDependentMethods() { static bool hasChecked = false; @@ -160,8 +190,6 @@ static constexpr auto getClassName (AccessibilityRole role) case AccessibilityRole::popupMenu: return "android.widget.PopupMenu"; case AccessibilityRole::comboBox: return "android.widget.Spinner"; case AccessibilityRole::tree: return "android.widget.ExpandableListView"; - case AccessibilityRole::list: return "android.widget.ListView"; - case AccessibilityRole::table: return "android.widget.TableLayout"; case AccessibilityRole::progressBar: return "android.widget.ProgressBar"; case AccessibilityRole::scrollBar: @@ -177,6 +205,11 @@ static constexpr auto getClassName (AccessibilityRole role) case AccessibilityRole::splashScreen: case AccessibilityRole::dialogWindow: return "android.widget.PopupWindow"; + // If we don't supply a custom class type, then TalkBack will use the node's CollectionInfo + // to make a sensible decision about how to describe the container + case AccessibilityRole::list: + case AccessibilityRole::table: + case AccessibilityRole::column: case AccessibilityRole::row: case AccessibilityRole::cell: @@ -437,6 +470,63 @@ public: } } } + + if (getAndroidSDKVersion() >= 19) + { + if (auto* tableInterface = accessibilityHandler.getTableInterface()) + { + const auto rows = tableInterface->getNumRows(); + const auto columns = tableInterface->getNumColumns(); + const LocalRef collectionInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionInfo, + AndroidAccessibilityNodeInfoCollectionInfo.obtain, + (jint) rows, + (jint) columns, + (jboolean) false) }; + env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionInfo, collectionInfo.get()); + } + + if (auto* enclosingTableHandler = getEnclosingHandlerWithInterface (&accessibilityHandler, &AccessibilityHandler::getTableInterface)) + { + auto* interface = enclosingTableHandler->getTableInterface(); + jassert (interface != nullptr); + const auto rowSpan = interface->getRowSpan (accessibilityHandler); + const auto columnSpan = interface->getColumnSpan (accessibilityHandler); + + enum class IsHeader { no, yes }; + + const auto addCellInfo = [env, &info] (AccessibilityTableInterface::Span rows, AccessibilityTableInterface::Span columns, IsHeader header) + { + const LocalRef collectionItemInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionItemInfo, + AndroidAccessibilityNodeInfoCollectionItemInfo.obtain, + (jint) rows.begin, + (jint) rows.num, + (jint) columns.begin, + (jint) columns.num, + (jboolean) (header == IsHeader::yes)) }; + env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionItemInfo, collectionItemInfo.get()); + }; + + if (rowSpan.hasValue() && columnSpan.hasValue()) + { + addCellInfo (*rowSpan, *columnSpan, IsHeader::no); + } + else + { + if (auto* tableHeader = interface->getHeaderHandler()) + { + if (accessibilityHandler.getParent() == tableHeader) + { + const auto children = tableHeader->getChildren(); + const auto column = std::distance (children.cbegin(), std::find (children.cbegin(), children.cend(), &accessibilityHandler)); + + // Talkback will only treat a row as a column header if its row index is zero + // https://github.com/google/talkback/blob/acd0bc7631a3dfbcf183789c7557596a45319e1f/utils/src/main/java/CollectionState.java#L853 + addCellInfo ({ 0, 1 }, { (int) column, 1 }, IsHeader::yes); + } + } + } + } + } } bool performAction (int action, jobject arguments) diff --git a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm index e1a5d1d1..5874ad3e 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm @@ -37,39 +37,47 @@ static void juceFreeAccessibilityPlatformSpecificData (UIAccessibilityElement* e namespace juce { -#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 - #define JUCE_IOS_CONTAINER_API_AVAILABLE 1 -#endif - #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 -//============================================================================== -static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler) -{ - const auto children = handler.getChildren(); - - NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()]; - - [accessibleChildren addObject: (id) handler.getNativeImplementation()]; - - for (auto* childHandler : children) - { - id accessibleElement = [&childHandler] - { - id native = (id) childHandler->getNativeImplementation(); - - if (childHandler->getChildren().size() > 0) - return [native accessibilityContainer]; - - return native; - }(); - - if (accessibleElement != nil) - [accessibleChildren addObject: accessibleElement]; - } - - return accessibleChildren; -} +template struct Signature; + +template +struct Signature {}; + +// @selector isn't constexpr, so the 'sel' members are functions rather than static constexpr data members +struct SignatureHasText : Signature { static auto sel() { return @selector (hasText); } }; +struct SignatureSetSelectedTextRange : Signature { static auto sel() { return @selector (setSelectedTextRange:); } }; +struct SignatureSelectedTextRange : Signature { static auto sel() { return @selector (selectedTextRange); } }; +struct SignatureMarkedTextRange : Signature { static auto sel() { return @selector (markedTextRange); } }; +struct SignatureSetMarkedTextSelectedRange : Signature { static auto sel() { return @selector (setMarkedText:selectedRange:); } }; +struct SignatureUnmarkText : Signature { static auto sel() { return @selector (unmarkText); } }; +struct SignatureMarkedTextStyle : Signature*()> { static auto sel() { return @selector (markedTextStyle); } }; +struct SignatureSetMarkedTextStyle : Signature*)> { static auto sel() { return @selector (setMarkedTextStyle:); } }; +struct SignatureBeginningOfDocument : Signature { static auto sel() { return @selector (beginningOfDocument); } }; +struct SignatureEndOfDocument : Signature { static auto sel() { return @selector (endOfDocument); } }; +struct SignatureTokenizer : Signature()> { static auto sel() { return @selector (tokenizer); } }; +struct SignatureBaseWritingDirection : Signature { static auto sel() { return @selector (baseWritingDirectionForPosition:inDirection:); } }; +struct SignatureCaretRectForPosition : Signature { static auto sel() { return @selector (caretRectForPosition:); } }; +struct SignatureCharacterRangeByExtending : Signature { static auto sel() { return @selector (characterRangeByExtendingPosition:inDirection:); } }; +struct SignatureCharacterRangeAtPoint : Signature { static auto sel() { return @selector (characterRangeAtPoint:); } }; +struct SignatureClosestPositionToPoint : Signature { static auto sel() { return @selector (closestPositionToPoint:); } }; +struct SignatureClosestPositionToPointInRange : Signature { static auto sel() { return @selector (closestPositionToPoint:withinRange:); } }; +struct SignatureComparePositionToPosition : Signature { static auto sel() { return @selector (comparePosition:toPosition:); } }; +struct SignatureOffsetFromPositionToPosition : Signature { static auto sel() { return @selector (offsetFromPosition:toPosition:); } }; +struct SignaturePositionFromPositionInDirection : Signature { static auto sel() { return @selector (positionFromPosition:inDirection:offset:); } }; +struct SignaturePositionFromPositionOffset : Signature { static auto sel() { return @selector (positionFromPosition:offset:); } }; +struct SignatureFirstRectForRange : Signature { static auto sel() { return @selector (firstRectForRange:); } }; +struct SignatureSelectionRectsForRange : Signature* (UITextRange*)> { static auto sel() { return @selector (selectionRectsForRange:); } }; +struct SignaturePositionWithinRange : Signature { static auto sel() { return @selector (positionWithinRange:farthestInDirection:); } }; +struct SignatureReplaceRangeWithText : Signature { static auto sel() { return @selector (replaceRange:withText:); } }; +struct SignatureSetBaseWritingDirection : Signature { static auto sel() { return @selector (setBaseWritingDirection:forRange:); } }; +struct SignatureTextInRange : Signature { static auto sel() { return @selector (textInRange:); } }; +struct SignatureTextRangeFromPosition : Signature { static auto sel() { return @selector (textRangeFromPosition:toPosition:); } }; +struct SignatureSetInputDelegate : Signature { static auto sel() { return @selector (setInputDelegate:); } }; +struct SignatureInputDelegate : Signature { static auto sel() { return @selector (inputDelegate); } }; +struct SignatureKeyboardType : Signature { static auto sel() { return @selector (keyboardType); } }; +struct SignatureAutocapitalizationType : Signature { static auto sel() { return @selector (autocapitalizationType); } }; +struct SignatureAutocorrectionType : Signature { static auto sel() { return @selector (autocorrectionType); } }; //============================================================================== class AccessibilityHandler::AccessibilityNativeImpl @@ -87,88 +95,131 @@ public: private: //============================================================================== - class AccessibilityContainer : public ObjCClass + class AccessibilityContainer : public AccessibleObjCClass { public: AccessibilityContainer() - : ObjCClass ("JUCEUIAccessibilityElementContainer_") + : AccessibleObjCClass ("JUCEUIAccessibilityContainer_") { - addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement); - addMethod (@selector (accessibilityFrame), getAccessibilityFrame); - addMethod (@selector (accessibilityElements), getAccessibilityElements); + addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return false; }); - #if JUCE_IOS_CONTAINER_API_AVAILABLE - if (@available (iOS 11.0, *)) - addMethod (@selector (accessibilityContainerType), getAccessibilityContainerType); - #endif + addMethod (@selector (accessibilityFrame), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + return convertToCGRect (handler->getComponent().getScreenBounds()); - addIvar ("handler"); + return CGRectZero; + }); - registerClass(); - } + addMethod (@selector (accessibilityElements), [] (id self, SEL) -> NSArray* + { + if (auto* handler = getHandler (self)) + return getContainerAccessibilityElements (*handler); - private: - static AccessibilityHandler* getHandler (id self) - { - return getIvar (self, "handler"); - } + return nil; + }); - static BOOL getIsAccessibilityElement (id, SEL) - { - return NO; - } + if (@available (iOS 11.0, *)) + { + addMethod (@selector (accessibilityDataTableCellElementForRow:column:), [] (id self, SEL, NSUInteger row, NSUInteger column) -> id + { + if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) + if (auto* tableInterface = tableHandler->getTableInterface()) + if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column)) + if (auto* parent = getAccessibleParent (cellHandler)) + return static_cast (parent->getNativeImplementation()); - static CGRect getAccessibilityFrame (id self, SEL) - { - if (auto* handler = getHandler (self)) - return convertToCGRect (handler->getComponent().getScreenBounds()); + return nil; + }); - return CGRectZero; - } + addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount); + addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount); - static NSArray* getAccessibilityElements (id self, SEL) - { - if (auto* handler = getHandler (self)) - return getContainerAccessibilityElements (*handler); + addMethod (@selector (accessibilityHeaderElementsForColumn:), [] (id self, SEL, NSUInteger column) -> NSArray* + { + if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) + { + if (auto* tableInterface = tableHandler->getTableInterface()) + { + if (auto* header = tableInterface->getHeaderHandler()) + { + if (isPositiveAndBelow (column, header->getChildren().size())) + { + auto* result = [NSMutableArray new]; + [result addObject: static_cast (header->getChildren()[(size_t) column]->getNativeImplementation())]; + return result; + } + } + } + } - return nil; - } + return nullptr; + }); - static NSInteger getAccessibilityContainerType (id self, SEL) - { - if (auto* handler = getHandler (self)) - { - if (handler->getTableInterface() != nullptr) + addProtocol (@protocol (UIAccessibilityContainerDataTable)); + + addMethod (@selector (accessibilityContainerType), [] (id self, SEL) -> NSInteger { - if (@available (iOS 11.0, *)) - return UIAccessibilityContainerTypeDataTable; + if (auto* handler = getHandler (self)) + { + if (handler->getTableInterface() != nullptr) + { + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeDataTable; - return 1; // UIAccessibilityContainerTypeDataTable - } + return 1; // UIAccessibilityContainerTypeDataTable + } - const auto role = handler->getRole(); + const auto handlerRole = handler->getRole(); + + if (handlerRole == AccessibilityRole::popupMenu + || handlerRole == AccessibilityRole::list + || handlerRole == AccessibilityRole::tree) + { + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeList; + + return 2; // UIAccessibilityContainerTypeList + } + } - if (role == AccessibilityRole::popupMenu - || role == AccessibilityRole::list - || role == AccessibilityRole::tree) - { if (@available (iOS 11.0, *)) - return UIAccessibilityContainerTypeList; + return UIAccessibilityContainerTypeNone; - return 2; // UIAccessibilityContainerTypeList - } + return 0; // UIAccessibilityContainerTypeNone + }); } - if (@available (iOS 11.0, *)) - return UIAccessibilityContainerTypeNone; + registerClass(); + } - return 0; // UIAccessibilityContainerTypeNone + private: + static const AccessibilityHandler* getAccessibleParent (const AccessibilityHandler* h) + { + if (h == nullptr) + return nullptr; + + if ([static_cast (h->getNativeImplementation()) isAccessibilityElement]) + return h; + + return getAccessibleParent (h->getParent()); + } + + static AccessibilityHandler* getHandler (id self) + { + return getIvar (self, "handler"); } }; //============================================================================== class AccessibilityElement : public AccessibleObjCClass { + template + static constexpr void forEach (Func&& func, Items&&... items) + { + (void) std::initializer_list { ((void) func (std::forward (items)), 0)... }; + } + public: enum class Type { defaultElement, textElement }; @@ -179,310 +230,349 @@ private: id instance = (hasEditableText (handler) ? textCls : cls).createInstance(); - Holder element ([instance initWithAccessibilityContainer: (id) handler.getComponent().getWindowHandle()]); + Holder element ([instance initWithAccessibilityContainer: static_cast (handler.getComponent().getWindowHandle())]); object_setInstanceVariable (element.get(), "handler", &handler); return element; } AccessibilityElement (Type elementType) { - addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement); - addMethod (@selector (accessibilityContainer), getAccessibilityContainer); - addMethod (@selector (accessibilityFrame), getAccessibilityFrame); - addMethod (@selector (accessibilityTraits), getAccessibilityTraits); - addMethod (@selector (accessibilityLabel), getAccessibilityTitle); - addMethod (@selector (accessibilityHint), getAccessibilityHelp); - addMethod (@selector (accessibilityValue), getAccessibilityValue); - addMethod (@selector (setAccessibilityValue:), setAccessibilityValue); - - addMethod (@selector (accessibilityElementDidBecomeFocused), onFocusGain); - addMethod (@selector (accessibilityElementDidLoseFocus), onFocusLoss); - addMethod (@selector (accessibilityElementIsFocused), isFocused); - addMethod (@selector (accessibilityViewIsModal), getIsAccessibilityModal); - - addMethod (@selector (accessibilityActivate), accessibilityPerformActivate); - addMethod (@selector (accessibilityIncrement), accessibilityPerformIncrement); - addMethod (@selector (accessibilityDecrement), accessibilityPerformDecrement); - addMethod (@selector (accessibilityPerformEscape), accessibilityPerformEscape); - - #if JUCE_IOS_CONTAINER_API_AVAILABLE - if (@available (iOS 11.0, *)) - { - addMethod (@selector (accessibilityDataTableCellElementForRow:column:), getAccessibilityDataTableCellElementForRowColumn); - addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount); - addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount); - addProtocol (@protocol (UIAccessibilityContainerDataTable)); - - addMethod (@selector (accessibilityRowRange), getAccessibilityRowIndexRange); - addMethod (@selector (accessibilityColumnRange), getAccessibilityColumnIndexRange); - addProtocol (@protocol (UIAccessibilityContainerDataTableCell)); - } - #endif - - if (elementType == Type::textElement) + addMethod (@selector (isAccessibilityElement), [] (id self, SEL) { - addMethod (@selector (accessibilityLineNumberForPoint:), getAccessibilityLineNumberForPoint); - addMethod (@selector (accessibilityContentForLineNumber:), getAccessibilityContentForLineNumber); - addMethod (@selector (accessibilityFrameForLineNumber:), getAccessibilityFrameForLineNumber); - addMethod (@selector (accessibilityPageContent), getAccessibilityPageContent); + auto* handler = getHandler (self); - addProtocol (@protocol (UIAccessibilityReadingContent)); - } + const auto hasAccessiblePropertiesOrIsTableCell = [] (auto& handlerRef) + { + const auto isTableCell = [&] + { + if (auto* tableHandler = getEnclosingHandlerWithInterface (&handlerRef, &AccessibilityHandler::getTableInterface)) + { + if (auto* tableInterface = tableHandler->getTableInterface()) + { + return tableInterface->getRowSpan (handlerRef).hasValue() + && tableInterface->getColumnSpan (handlerRef).hasValue(); + } + } - addIvar ("container"); + return false; + }; - registerClass(); - } + return handlerRef.getTitle().isNotEmpty() + || handlerRef.getHelp().isNotEmpty() + || handlerRef.getTextInterface() != nullptr + || handlerRef.getValueInterface() != nullptr + || isTableCell(); + }; - private: - //============================================================================== - static UIAccessibilityElement* getContainer (id self) - { - return getIvar (self, "container"); - } + return handler != nullptr + && ! handler->isIgnored() + && handler->getRole() != AccessibilityRole::window + && hasAccessiblePropertiesOrIsTableCell (*handler); + }); - //============================================================================== - static id getAccessibilityContainer (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityContainer), [] (id self, SEL) -> id { - if (handler->getComponent().isOnDesktop()) - return (id) handler->getComponent().getWindowHandle(); - - if (handler->getChildren().size() > 0) + if (auto* handler = getHandler (self)) { - if (UIAccessibilityElement* container = getContainer (self)) - return container; + if (handler->getComponent().isOnDesktop()) + return static_cast (handler->getComponent().getWindowHandle()); - static AccessibilityContainer cls; - - id windowHandle = (id) handler->getComponent().getWindowHandle(); - UIAccessibilityElement* container = [cls.createInstance() initWithAccessibilityContainer: windowHandle]; + if (! handler->getChildren().empty()) + { + if (UIAccessibilityElement* container = getContainer (self)) + return container; - [container retain]; + static AccessibilityContainer cls; - object_setInstanceVariable (container, "handler", handler); - object_setInstanceVariable (self, "container", container); + id container = cls.createInstance(); - return container; - } + object_setInstanceVariable (container, "handler", handler); + object_setInstanceVariable (self, "container", container); - if (auto* parent = handler->getParent()) - return [(id) parent->getNativeImplementation() accessibilityContainer]; - } + return container; + } - return nil; - } + if (auto* parent = handler->getParent()) + return [static_cast (parent->getNativeImplementation()) accessibilityContainer]; + } - static CGRect getAccessibilityFrame (id self, SEL) - { - if (auto* handler = getHandler (self)) - return convertToCGRect (handler->getComponent().getScreenBounds()); + return nil; + }); - return CGRectZero; - } + addMethod (@selector (accessibilityFrame), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + return convertToCGRect (handler->getComponent().getScreenBounds()); - static UIAccessibilityTraits getAccessibilityTraits (id self, SEL) - { - auto traits = UIAccessibilityTraits{}; + return CGRectZero; + }); - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityTraits), [] (id self, SEL) { - traits |= [&handler] + auto traits = UIAccessibilityTraits{}; + + if (auto* handler = getHandler (self)) { - switch (handler->getRole()) + traits |= [&handler] { - case AccessibilityRole::button: - case AccessibilityRole::toggleButton: - case AccessibilityRole::radioButton: - case AccessibilityRole::comboBox: return UIAccessibilityTraitButton; - - case AccessibilityRole::label: - case AccessibilityRole::staticText: return UIAccessibilityTraitStaticText; - - case AccessibilityRole::image: return UIAccessibilityTraitImage; - case AccessibilityRole::tableHeader: return UIAccessibilityTraitHeader; - case AccessibilityRole::hyperlink: return UIAccessibilityTraitLink; - case AccessibilityRole::editableText: return UIAccessibilityTraitKeyboardKey; - case AccessibilityRole::ignored: return UIAccessibilityTraitNotEnabled; - - case AccessibilityRole::slider: - case AccessibilityRole::menuItem: - case AccessibilityRole::menuBar: - case AccessibilityRole::popupMenu: - case AccessibilityRole::table: - case AccessibilityRole::column: - case AccessibilityRole::row: - case AccessibilityRole::cell: - case AccessibilityRole::list: - case AccessibilityRole::listItem: - case AccessibilityRole::tree: - case AccessibilityRole::treeItem: - case AccessibilityRole::progressBar: - case AccessibilityRole::group: - case AccessibilityRole::dialogWindow: - case AccessibilityRole::window: - case AccessibilityRole::scrollBar: - case AccessibilityRole::tooltip: - case AccessibilityRole::splashScreen: - case AccessibilityRole::unspecified: break; - } + switch (handler->getRole()) + { + case AccessibilityRole::button: + case AccessibilityRole::toggleButton: + case AccessibilityRole::radioButton: + case AccessibilityRole::comboBox: return UIAccessibilityTraitButton; + + case AccessibilityRole::label: + case AccessibilityRole::staticText: return UIAccessibilityTraitStaticText; + + case AccessibilityRole::image: return UIAccessibilityTraitImage; + case AccessibilityRole::tableHeader: return UIAccessibilityTraitHeader; + case AccessibilityRole::hyperlink: return UIAccessibilityTraitLink; + case AccessibilityRole::ignored: return UIAccessibilityTraitNotEnabled; + + case AccessibilityRole::editableText: return UIAccessibilityTraitKeyboardKey; + + case AccessibilityRole::slider: + case AccessibilityRole::menuItem: + case AccessibilityRole::menuBar: + case AccessibilityRole::popupMenu: + case AccessibilityRole::table: + case AccessibilityRole::column: + case AccessibilityRole::row: + case AccessibilityRole::cell: + case AccessibilityRole::list: + case AccessibilityRole::listItem: + case AccessibilityRole::tree: + case AccessibilityRole::treeItem: + case AccessibilityRole::progressBar: + case AccessibilityRole::group: + case AccessibilityRole::dialogWindow: + case AccessibilityRole::window: + case AccessibilityRole::scrollBar: + case AccessibilityRole::tooltip: + case AccessibilityRole::splashScreen: + case AccessibilityRole::unspecified: break; + } - return UIAccessibilityTraitNone; - }(); + return UIAccessibilityTraitNone; + }(); - const auto state = handler->getCurrentState(); + const auto state = handler->getCurrentState(); - if (state.isSelected() || state.isChecked()) - traits |= UIAccessibilityTraitSelected; + if (state.isSelected() || state.isChecked()) + traits |= UIAccessibilityTraitSelected; - if (auto* valueInterface = getValueInterface (self)) - if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid()) - traits |= UIAccessibilityTraitAdjustable; - } + if (auto* valueInterface = getValueInterface (self)) + if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid()) + traits |= UIAccessibilityTraitAdjustable; + } - return traits | sendSuperclassMessage (self, @selector (accessibilityTraits)); - } + return traits | sendSuperclassMessage (self, @selector (accessibilityTraits)); + }); - static NSString* getAccessibilityValue (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityLabel), getAccessibilityTitle); + addMethod (@selector (accessibilityHint), getAccessibilityHelp); + + addMethod (@selector (accessibilityValue), [] (id self, SEL) -> NSString* { - if (handler->getCurrentState().isCheckable()) - return handler->getCurrentState().isChecked() ? @"1" : @"0"; + if (auto* handler = getHandler (self)) + { + if (handler->getCurrentState().isCheckable()) + return handler->getCurrentState().isChecked() ? @"1" : @"0"; - return (NSString*) getAccessibilityValueFromInterfaces (*handler); - } + return (NSString*) getAccessibilityValueFromInterfaces (*handler); + } - return nil; - } + return nil; + }); - static void onFocusGain (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (setAccessibilityValue:), setAccessibilityValue); + + addMethod (@selector (accessibilityElementDidBecomeFocused), [] (id self, SEL) { - const WeakReference safeComponent (&handler->getComponent()); + if (auto* handler = getHandler (self)) + { + const WeakReference safeComponent (&handler->getComponent()); - performActionIfSupported (self, AccessibilityActionType::focus); + performActionIfSupported (self, AccessibilityActionType::focus); - if (safeComponent != nullptr) - handler->grabFocus(); - } - } + if (safeComponent != nullptr) + handler->grabFocus(); + } + }); - static void onFocusLoss (id self, SEL) - { - if (auto* handler = getHandler (self)) - handler->giveAwayFocus(); - } + addMethod (@selector (accessibilityElementDidLoseFocus), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + handler->giveAwayFocus(); + }); - static BOOL isFocused (id self, SEL) - { - if (auto* handler = getHandler (self)) - return handler->hasFocus (false); + addMethod (@selector (accessibilityElementIsFocused), [] (id self, SEL) -> BOOL + { + if (auto* handler = getHandler (self)) + return handler->hasFocus (false); - return NO; - } + return NO; + }); - static BOOL accessibilityPerformActivate (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityViewIsModal), getIsAccessibilityModal); + + addMethod (@selector (accessibilityActivate), [] (id self, SEL) { - // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query - // which element it thinks has focus and forward the event on to that element if it differs - id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier); + if (auto* handler = getHandler (self)) + { + // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query + // which element it thinks has focus and forward the event on to that element if it differs + id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier); - if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement]) - return [focusedElement accessibilityActivate]; + if (focusedElement != nullptr && ! [static_cast (handler->getNativeImplementation()) isEqual: focusedElement]) + return [focusedElement accessibilityActivate]; - if (handler->hasFocus (false)) - return accessibilityPerformPress (self, {}); - } + if (handler->hasFocus (false)) + return accessibilityPerformPress (self, {}); + } - return NO; - } + return NO; + }); - static BOOL accessibilityPerformEscape (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityIncrement), accessibilityPerformIncrement); + addMethod (@selector (accessibilityDecrement), accessibilityPerformDecrement); + + addMethod (@selector (accessibilityPerformEscape), [] (id self, SEL) { - if (auto* modal = Component::getCurrentlyModalComponent()) + if (auto* handler = getHandler (self)) { - if (auto* modalHandler = modal->getAccessibilityHandler()) + if (auto* modal = Component::getCurrentlyModalComponent()) { - if (modalHandler == handler || modalHandler->isParentOf (handler)) + if (auto* modalHandler = modal->getAccessibilityHandler()) { - modal->exitModalState (0); - return YES; + if (modalHandler == handler || modalHandler->isParentOf (handler)) + { + modal->exitModalState (0); + return YES; + } } } } + + return NO; + }); + + if (elementType == Type::textElement) + { + addMethod (@selector (deleteBackward), [] (id, SEL) {}); + addMethod (@selector (insertText:), [] (id, SEL, NSString*) {}); + + forEach ([this] (auto signature) { addPassthroughMethodWithSignature (signature); }, + SignatureHasText{}, + SignatureSetSelectedTextRange{}, + SignatureSelectedTextRange{}, + SignatureMarkedTextRange{}, + SignatureSetMarkedTextSelectedRange{}, + SignatureUnmarkText{}, + SignatureMarkedTextStyle{}, + SignatureSetMarkedTextStyle{}, + SignatureBeginningOfDocument{}, + SignatureEndOfDocument{}, + SignatureTokenizer{}, + SignatureBaseWritingDirection{}, + SignatureCaretRectForPosition{}, + SignatureCharacterRangeByExtending{}, + SignatureCharacterRangeAtPoint{}, + SignatureClosestPositionToPoint{}, + SignatureClosestPositionToPointInRange{}, + SignatureComparePositionToPosition{}, + SignatureOffsetFromPositionToPosition{}, + SignaturePositionFromPositionInDirection{}, + SignaturePositionFromPositionOffset{}, + SignatureFirstRectForRange{}, + SignatureSelectionRectsForRange{}, + SignaturePositionWithinRange{}, + SignatureReplaceRangeWithText{}, + SignatureSetBaseWritingDirection{}, + SignatureTextInRange{}, + SignatureTextRangeFromPosition{}, + SignatureSetInputDelegate{}, + SignatureInputDelegate{}, + SignatureKeyboardType{}, + SignatureAutocapitalizationType{}, + SignatureAutocorrectionType{}); + + addProtocol (@protocol (UITextInput)); + } + + if (@available (iOS 11.0, *)) + { + addMethod (@selector (accessibilityRowRange), getAccessibilityRowIndexRange); + addMethod (@selector (accessibilityColumnRange), getAccessibilityColumnIndexRange); + addProtocol (@protocol (UIAccessibilityContainerDataTableCell)); } - return NO; + addIvar ("container"); + + registerClass(); } - static id getAccessibilityDataTableCellElementForRowColumn (id self, SEL, NSUInteger row, NSUInteger column) + private: + template + static auto getResult (NSInvocation* invocation, detail::Tag) { - if (auto* tableInterface = getEnclosingInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) - if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column)) - return (id) cellHandler->getNativeImplementation(); - - return nil; + Result result{}; + [invocation getReturnValue: &result]; + return result; } - static NSInteger getAccessibilityLineNumberForPoint (id self, SEL, CGPoint point) + static void getResult (NSInvocation*, detail::Tag) {} + + template + auto makePassthroughCallback (HasSelector, Signature) { - if (auto* handler = getHandler (self)) + return [] (id self, SEL, Args... args) -> Result { - if (auto* textInterface = handler->getTextInterface()) + if (auto* input = getPeerTextInput (self)) { - auto pointInt = roundToIntPoint (point); + const auto s = detail::makeCompileTimeStr (@encode (Result), @encode (id), @encode (SEL), @encode (Args)...); + const auto signature = [NSMethodSignature signatureWithObjCTypes: s.data()]; + const auto invocation = [NSInvocation invocationWithMethodSignature: signature]; + invocation.selector = HasSelector::sel(); - if (handler->getComponent().getScreenBounds().contains (pointInt)) - { - auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() }); + // Indices 0 and 1 are 'id self' and 'SEL _cmd' respectively + auto counter = 2; + forEach ([&] (auto& arg) { [invocation setArgument: &arg atIndex: counter++]; }, args...); - for (int i = 0; i < textBounds.getNumRectangles(); ++i) - if (textBounds.getRectangle (i).contains (pointInt)) - return (NSInteger) i; - } + [invocation invokeWithTarget: input]; + + return getResult (invocation, detail::Tag{}); } - } - return NSNotFound; + jassertfalse; + return {}; + }; } - static NSString* getAccessibilityContentForLineNumber (id self, SEL, NSInteger lineNumber) + template + void addPassthroughMethodWithSignature (Signature signature) { - if (auto* textInterface = getTextInterface (self)) - { - auto lines = StringArray::fromLines (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() })); - - if ((int) lineNumber < lines.size()) - return juceStringToNS (lines[(int) lineNumber]); - } - - return nil; + addMethod (Signature::sel(), makePassthroughCallback (signature, signature)); } - static CGRect getAccessibilityFrameForLineNumber (id self, SEL, NSInteger lineNumber) + static UIAccessibilityElement* getContainer (id self) { - if (auto* textInterface = getTextInterface (self)) - { - auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() }); + return getIvar (self, "container"); + } - if (lineNumber < textBounds.getNumRectangles()) - return convertToCGRect (textBounds.getRectangle ((int) lineNumber)); - } + static UIViewComponentPeer* getPeer (id self) + { + if (auto* handler = getHandler (self)) + return static_cast (handler->getComponent().getPeer()); - return CGRectZero; + return nil; } - static NSString* getAccessibilityPageContent (id self, SEL) + static JuceTextView* getPeerTextInput (id self) { - if (auto* textInterface = getTextInterface (self)) - return juceStringToNS (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() })); + if (auto* peer = getPeer (self)) + return peer->hiddenTextInput.get(); return nil; } @@ -542,9 +632,8 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte const bool moveToHandler = (eventType == InternalAccessibilityEvent::focusChanged && handler.hasFocus (false)); sendAccessibilityEvent (notification, - moveToHandler ? (id) handler.getNativeImplementation() : nil); + moveToHandler ? static_cast (handler.getNativeImplementation()) : nil); } - } void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventType) const @@ -566,7 +655,7 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp }(); if (notification != UIAccessibilityNotifications{}) - sendAccessibilityEvent (notification, (id) getNativeImplementation()); + sendAccessibilityEvent (notification, static_cast (getNativeImplementation())); } void AccessibilityHandler::postAnnouncement (const String& announcementString, AnnouncementPriority) diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm index bf3c38c9..d7d62d94 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm @@ -29,11 +29,6 @@ static void juceFreeAccessibilityPlatformSpecificData (NSAccessibilityElement BOOL + { + if (auto* handler = getHandler (self)) + return handler->getComponent().isEnabled(); + + return NO; + }); + addMethod (@selector (accessibilityWindow), getAccessibilityWindow); addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow); - addMethod (@selector (accessibilityFocusedUIElement), getAccessibilityFocusedUIElement); - addMethod (@selector (accessibilityHitTest:), accessibilityHitTest); - addMethod (@selector (accessibilityParent), getAccessibilityParent); addMethod (@selector (accessibilityChildren), getAccessibilityChildren); - addMethod (@selector (isAccessibilityFocused), getIsAccessibilityFocused); - addMethod (@selector (setAccessibilityFocused:), setAccessibilityFocused); addMethod (@selector (isAccessibilityModal), getIsAccessibilityModal); - addMethod (@selector (accessibilityFrame), getAccessibilityFrame); - addMethod (@selector (accessibilityRole), getAccessibilityRole); - addMethod (@selector (accessibilitySubrole), getAccessibilitySubrole); - addMethod (@selector (accessibilityTitle), getAccessibilityTitle); - addMethod (@selector (accessibilityLabel), getAccessibilityLabel); - addMethod (@selector (accessibilityHelp), getAccessibilityHelp); - addMethod (@selector (accessibilityValue), getAccessibilityValue); - addMethod (@selector (setAccessibilityValue:), setAccessibilityValue); - addMethod (@selector (accessibilitySelectedChildren), getAccessibilitySelectedChildren); - addMethod (@selector (setAccessibilitySelectedChildren:), setAccessibilitySelectedChildren); - addMethod (@selector (accessibilityOrientation), getAccessibilityOrientation); - - addMethod (@selector (accessibilityInsertionPointLineNumber), getAccessibilityInsertionPointLineNumber); - addMethod (@selector (accessibilityVisibleCharacterRange), getAccessibilityVisibleCharacterRange); - addMethod (@selector (accessibilityNumberOfCharacters), getAccessibilityNumberOfCharacters); - addMethod (@selector (accessibilitySelectedText), getAccessibilitySelectedText); - addMethod (@selector (accessibilitySelectedTextRange), getAccessibilitySelectedTextRange); - addMethod (@selector (accessibilityAttributedStringForRange:), getAccessibilityAttributedStringForRange); - addMethod (@selector (accessibilityRangeForLine:), getAccessibilityRangeForLine); - addMethod (@selector (accessibilityStringForRange:), getAccessibilityStringForRange); - addMethod (@selector (accessibilityRangeForPosition:), getAccessibilityRangeForPosition); - addMethod (@selector (accessibilityRangeForIndex:), getAccessibilityRangeForIndex); - addMethod (@selector (accessibilityFrameForRange:), getAccessibilityFrameForRange); - addMethod (@selector (accessibilityLineForIndex:), getAccessibilityLineForIndex); - addMethod (@selector (setAccessibilitySelectedTextRange:), setAccessibilitySelectedTextRange); - - addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount); - addMethod (@selector (accessibilityRows), getAccessibilityRows); - addMethod (@selector (accessibilitySelectedRows), getAccessibilitySelectedRows); - addMethod (@selector (setAccessibilitySelectedRows:), setAccessibilitySelectedRows); - addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount); - addMethod (@selector (accessibilityColumns), getAccessibilityColumns); - addMethod (@selector (accessibilitySelectedColumns), getAccessibilitySelectedColumns); - addMethod (@selector (setAccessibilitySelectedColumns:), setAccessibilitySelectedColumns); - addMethod (@selector (accessibilityRowIndexRange), getAccessibilityRowIndexRange); - addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange); - addMethod (@selector (accessibilityIndex), getAccessibilityIndex); - addMethod (@selector (accessibilityDisclosureLevel), getAccessibilityDisclosureLevel); - addMethod (@selector (isAccessibilityExpanded), getIsAccessibilityExpanded); + addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL) -> id + { + if (auto* handler = getHandler (self)) + { + if (auto* modal = Component::getCurrentlyModalComponent()) + { + const auto& handlerComponent = handler->getComponent(); - addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement); - addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement); - addMethod (@selector (accessibilityPerformDelete), accessibilityPerformDelete); - addMethod (@selector (accessibilityPerformPress), accessibilityPerformPress); - addMethod (@selector (accessibilityPerformShowMenu), accessibilityPerformShowMenu); - addMethod (@selector (accessibilityPerformRaise), accessibilityPerformRaise); + if (! handlerComponent.isParentOf (modal) + && handlerComponent.isCurrentlyBlockedByAnotherModalComponent()) + { + if (auto* modalHandler = modal->getAccessibilityHandler()) + { + if (auto* focusChild = modalHandler->getChildFocus()) + return static_cast (focusChild->getNativeImplementation()); - addMethod (@selector (isAccessibilitySelectorAllowed:), getIsAccessibilitySelectorAllowed); + return static_cast (modalHandler->getNativeImplementation()); + } + } + } - #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 - addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren); - #endif + if (auto* focusChild = handler->getChildFocus()) + return static_cast (focusChild->getNativeImplementation()); + } - registerClass(); - } + return nil; + }); - //============================================================================== - static bool isSelectable (AccessibleState state) noexcept - { - return state.isSelectable() || state.isMultiSelectable(); - } + addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point) -> id + { + if (auto* handler = getHandler (self)) + { + if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point)))) + return static_cast (child->getNativeImplementation()); - static NSArray* getSelectedChildren (NSArray* children) - { - NSMutableArray* selected = [[NSMutableArray new] autorelease]; + return self; + } - for (id child in children) + return nil; + }); + + addMethod (@selector (accessibilityParent), [] (id self, SEL) -> id { - if (auto* handler = getHandler (child)) + if (auto* handler = getHandler (self)) { - const auto currentState = handler->getCurrentState(); + if (auto* parentHandler = handler->getParent()) + return NSAccessibilityUnignoredAncestor (static_cast (parentHandler->getNativeImplementation())); - if (isSelectable (currentState) && currentState.isSelected()) - [selected addObject: child]; + return NSAccessibilityUnignoredAncestor (static_cast (handler->getComponent().getWindowHandle())); } - } - return selected; - } + return nil; + }); - static void setSelectedChildren (NSArray* children, NSArray* selected) - { - for (id child in children) + addMethod (@selector (isAccessibilityFocused), [] (id self, SEL) { - if (auto* handler = getHandler (child)) - { - const auto currentState = handler->getCurrentState(); - const BOOL isSelected = [selected containsObject: child]; + return [[self accessibilityWindow] accessibilityFocusedUIElement] == self; + }); - if (isSelectable (currentState)) + addMethod (@selector (setAccessibilityFocused:), [] (id self, SEL, BOOL focused) + { + if (auto* handler = getHandler (self)) + { + if (focused) { - if (currentState.isSelected() != isSelected) - handler->getActions().invoke (AccessibilityActionType::toggle); + const WeakReference safeComponent (&handler->getComponent()); + + performActionIfSupported (self, AccessibilityActionType::focus); + + if (safeComponent != nullptr) + handler->grabFocus(); } - else if (currentState.isFocusable()) + else { - [child setAccessibilityFocused: isSelected]; + handler->giveAwayFocus(); } } - } - } + }); - //============================================================================== - static BOOL getAccessibilityNotifiesWhenDestroyed (id, SEL) { return YES; } + addMethod (@selector (accessibilityFrame), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds())); - static BOOL getIsAccessibilityEnabled (id self, SEL) - { - if (auto* handler = getHandler (self)) - return handler->getComponent().isEnabled(); + return NSZeroRect; + }); - return NO; - } + addMethod (@selector (accessibilityRole), [] (id self, SEL) -> NSAccessibilityRole + { + if (auto* handler = getHandler (self)) + { + switch (handler->getRole()) + { + case AccessibilityRole::popupMenu: + case AccessibilityRole::tooltip: + case AccessibilityRole::splashScreen: + case AccessibilityRole::dialogWindow: + case AccessibilityRole::window: return NSAccessibilityWindowRole; + + case AccessibilityRole::tableHeader: + case AccessibilityRole::unspecified: + case AccessibilityRole::group: return NSAccessibilityGroupRole; + + case AccessibilityRole::label: + case AccessibilityRole::staticText: return NSAccessibilityStaticTextRole; + + case AccessibilityRole::tree: + case AccessibilityRole::list: return NSAccessibilityOutlineRole; + + case AccessibilityRole::listItem: + case AccessibilityRole::treeItem: return NSAccessibilityRowRole; + + case AccessibilityRole::button: return NSAccessibilityButtonRole; + case AccessibilityRole::toggleButton: return NSAccessibilityCheckBoxRole; + case AccessibilityRole::radioButton: return NSAccessibilityRadioButtonRole; + case AccessibilityRole::comboBox: return NSAccessibilityPopUpButtonRole; + case AccessibilityRole::image: return NSAccessibilityImageRole; + case AccessibilityRole::slider: return NSAccessibilitySliderRole; + case AccessibilityRole::editableText: return NSAccessibilityTextAreaRole; + case AccessibilityRole::menuItem: return NSAccessibilityMenuItemRole; + case AccessibilityRole::menuBar: return NSAccessibilityMenuRole; + case AccessibilityRole::table: return NSAccessibilityOutlineRole; + case AccessibilityRole::column: return NSAccessibilityColumnRole; + case AccessibilityRole::row: return NSAccessibilityRowRole; + case AccessibilityRole::cell: return NSAccessibilityCellRole; + case AccessibilityRole::hyperlink: return NSAccessibilityLinkRole; + case AccessibilityRole::progressBar: return NSAccessibilityProgressIndicatorRole; + case AccessibilityRole::scrollBar: return NSAccessibilityScrollBarRole; + + case AccessibilityRole::ignored: break; + } - static id getAccessibilityWindow (id self, SEL) - { - return [[self accessibilityParent] accessibilityWindow]; - } + return NSAccessibilityUnknownRole; + } - static id getAccessibilityFocusedUIElement (id self, SEL) - { - if (auto* handler = getHandler (self)) + return nil; + }); + + addMethod (@selector (accessibilitySubrole), [] (id self, SEL) { - if (auto* modal = Component::getCurrentlyModalComponent()) + if (auto* handler = getHandler (self)) { - const auto& component = handler->getComponent(); + if (auto* textInterface = getTextInterface (self)) + if (textInterface->isDisplayingProtectedText()) + return NSAccessibilitySecureTextFieldSubrole; + + const auto handlerRole = handler->getRole(); + + if (handlerRole == AccessibilityRole::window) return NSAccessibilityStandardWindowSubrole; + if (handlerRole == AccessibilityRole::dialogWindow) return NSAccessibilityDialogSubrole; + if (handlerRole == AccessibilityRole::tooltip + || handlerRole == AccessibilityRole::splashScreen) return NSAccessibilityFloatingWindowSubrole; + if (handlerRole == AccessibilityRole::toggleButton) return NSAccessibilityToggleSubrole; + if (handlerRole == AccessibilityRole::treeItem + || handlerRole == AccessibilityRole::listItem) return NSAccessibilityOutlineRowSubrole; + if (handlerRole == AccessibilityRole::row && getCellInterface (self) != nullptr) return NSAccessibilityTableRowSubrole; - if (! component.isParentOf (modal) - && component.isCurrentlyBlockedByAnotherModalComponent()) + const auto& handlerComponent = handler->getComponent(); + + if (auto* documentWindow = handlerComponent.findParentComponentOfClass()) { - if (auto* modalHandler = modal->getAccessibilityHandler()) + if (handlerRole == AccessibilityRole::button) { - if (auto* focusChild = modalHandler->getChildFocus()) - return (id) focusChild->getNativeImplementation(); - - return (id) modalHandler->getNativeImplementation(); + if (&handlerComponent == documentWindow->getCloseButton()) return NSAccessibilityCloseButtonSubrole; + if (&handlerComponent == documentWindow->getMinimiseButton()) return NSAccessibilityMinimizeButtonSubrole; + if (&handlerComponent == documentWindow->getMaximiseButton()) return NSAccessibilityFullScreenButtonSubrole; } } } - if (auto* focusChild = handler->getChildFocus()) - return (id) focusChild->getNativeImplementation(); - } - - return nil; - } + return NSAccessibilityUnknownRole; + }); - static id accessibilityHitTest (id self, SEL, NSPoint point) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityLabel), [] (id self, SEL) -> NSString* { - if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point)))) - return (id) child->getNativeImplementation(); + if (auto* handler = getHandler (self)) + return juceStringToNS (handler->getDescription()); - return self; - } - - return nil; - } + return nil; + }); - static id getAccessibilityParent (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityValue), [] (id self, SEL) -> id { - if (auto* parentHandler = handler->getParent()) - return NSAccessibilityUnignoredAncestor ((id) parentHandler->getNativeImplementation()); + if (auto* handler = getHandler (self)) + { + if (handler->getCurrentState().isCheckable()) + return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off")); - return NSAccessibilityUnignoredAncestor ((id) handler->getComponent().getWindowHandle()); - } + return getAccessibilityValueFromInterfaces (*handler); + } - return nil; - } + return nil; + }); - static NSArray* getAccessibilityChildren (id self, SEL) - { - if (auto* handler = getHandler (self)) - { - auto children = handler->getChildren(); + addMethod (@selector (accessibilityTitle), getAccessibilityTitle); + addMethod (@selector (accessibilityHelp), getAccessibilityHelp); + addMethod (@selector (setAccessibilityValue:), setAccessibilityValue); - auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()]; + addMethod (@selector (accessibilitySelectedChildren), [] (id self, SEL) + { + return getSelectedChildren ([self accessibilityChildren]); + }); - for (auto* childHandler : children) - [accessibleChildren addObject: (id) childHandler->getNativeImplementation()]; + addMethod (@selector (setAccessibilitySelectedChildren:), [] (id self, SEL, NSArray* selected) + { + setSelectedChildren ([self accessibilityChildren], selected); + }); - return accessibleChildren; - } + addMethod (@selector (accessibilityOrientation), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f + ? NSAccessibilityOrientationHorizontal + : NSAccessibilityOrientationVertical; - return nil; - } + return NSAccessibilityOrientationUnknown; + }); - static id getAccessibilityValue (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityInsertionPointLineNumber), [] (id self, SEL) -> NSInteger { - if (handler->getCurrentState().isCheckable()) - return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off")); + if (auto* textInterface = getTextInterface (self)) + return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()]; - return getAccessibilityValueFromInterfaces (*handler); - } + return 0; + }); - return nil; - } + addMethod (@selector (accessibilityVisibleCharacterRange), [] (id self, SEL) + { + if (auto* textInterface = getTextInterface (self)) + return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() }); - static NSArray* getAccessibilitySelectedChildren (id self, SEL) - { - return getSelectedChildren ([self accessibilityChildren]); - } + return NSMakeRange (0, 0); + }); - static void setAccessibilitySelectedChildren (id self, SEL, NSArray* selected) - { - setSelectedChildren ([self accessibilityChildren], selected); - } + addMethod (@selector (accessibilityNumberOfCharacters), [] (id self, SEL) + { + if (auto* textInterface = getTextInterface (self)) + return textInterface->getTotalNumCharacters(); - static NSAccessibilityOrientation getAccessibilityOrientation (id self, SEL) - { - if (auto* handler = getHandler (self)) - return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f - ? NSAccessibilityOrientationHorizontal - : NSAccessibilityOrientationVertical; + return 0; + }); - return NSAccessibilityOrientationUnknown; - } + addMethod (@selector (accessibilitySelectedText), [] (id self, SEL) -> NSString* + { + if (auto* textInterface = getTextInterface (self)) + return juceStringToNS (textInterface->getText (textInterface->getSelection())); - static BOOL getIsAccessibilityFocused (id self, SEL) - { - return [[self accessibilityWindow] accessibilityFocusedUIElement] == self; - } + return nil; + }); - static void setAccessibilityFocused (id self, SEL, BOOL focused) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilitySelectedTextRange), [] (id self, SEL) { - if (focused) + if (auto* textInterface = getTextInterface (self)) { - const WeakReference safeComponent (&handler->getComponent()); + const auto currentSelection = textInterface->getSelection(); - performActionIfSupported (self, AccessibilityActionType::focus); + if (currentSelection.isEmpty()) + return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0); - if (safeComponent != nullptr) - handler->grabFocus(); + return juceRangeToNS (currentSelection); } - else - { - handler->giveAwayFocus(); - } - } - } - - static NSRect getAccessibilityFrame (id self, SEL) - { - if (auto* handler = getHandler (self)) - return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds())); - return NSZeroRect; - } + return NSMakeRange (0, 0); + }); - static NSAccessibilityRole getAccessibilityRole (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityAttributedStringForRange:), [] (id self, SEL, NSRange range) -> NSAttributedString* { - switch (handler->getRole()) - { - case AccessibilityRole::popupMenu: - case AccessibilityRole::tooltip: - case AccessibilityRole::splashScreen: - case AccessibilityRole::dialogWindow: - case AccessibilityRole::window: return NSAccessibilityWindowRole; - - case AccessibilityRole::tableHeader: - case AccessibilityRole::unspecified: - case AccessibilityRole::group: return NSAccessibilityGroupRole; - - case AccessibilityRole::label: - case AccessibilityRole::staticText: return NSAccessibilityStaticTextRole; - - case AccessibilityRole::tree: - case AccessibilityRole::list: return NSAccessibilityOutlineRole; - - case AccessibilityRole::listItem: - case AccessibilityRole::treeItem: return NSAccessibilityRowRole; - - case AccessibilityRole::button: return NSAccessibilityButtonRole; - case AccessibilityRole::toggleButton: return NSAccessibilityCheckBoxRole; - case AccessibilityRole::radioButton: return NSAccessibilityRadioButtonRole; - case AccessibilityRole::comboBox: return NSAccessibilityPopUpButtonRole; - case AccessibilityRole::image: return NSAccessibilityImageRole; - case AccessibilityRole::slider: return NSAccessibilitySliderRole; - case AccessibilityRole::editableText: return NSAccessibilityTextAreaRole; - case AccessibilityRole::menuItem: return NSAccessibilityMenuItemRole; - case AccessibilityRole::menuBar: return NSAccessibilityMenuRole; - case AccessibilityRole::table: return NSAccessibilityListRole; - case AccessibilityRole::column: return NSAccessibilityColumnRole; - case AccessibilityRole::row: return NSAccessibilityRowRole; - case AccessibilityRole::cell: return NSAccessibilityCellRole; - case AccessibilityRole::hyperlink: return NSAccessibilityLinkRole; - case AccessibilityRole::progressBar: return NSAccessibilityProgressIndicatorRole; - case AccessibilityRole::scrollBar: return NSAccessibilityScrollBarRole; - - case AccessibilityRole::ignored: break; - } + NSString* string = [self accessibilityStringForRange: range]; - return NSAccessibilityUnknownRole; - } + if (string != nil) + return [[[NSAttributedString alloc] initWithString: string] autorelease]; - return nil; - } + return nil; + }); - static NSAccessibilityRole getAccessibilitySubrole (id self, SEL) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityRangeForLine:), [] (id self, SEL, NSInteger line) { if (auto* textInterface = getTextInterface (self)) - if (textInterface->isDisplayingProtectedText()) - return NSAccessibilitySecureTextFieldSubrole; - - const auto role = handler->getRole(); - - if (role == AccessibilityRole::window) return NSAccessibilityStandardWindowSubrole; - if (role == AccessibilityRole::dialogWindow) return NSAccessibilityDialogSubrole; - if (role == AccessibilityRole::tooltip - || role == AccessibilityRole::splashScreen) return NSAccessibilityFloatingWindowSubrole; - if (role == AccessibilityRole::toggleButton) return NSAccessibilityToggleSubrole; - if (role == AccessibilityRole::treeItem - || role == AccessibilityRole::listItem) return NSAccessibilityOutlineRowSubrole; - if (role == AccessibilityRole::row && getCellInterface (self) != nullptr) return NSAccessibilityTableRowSubrole; - - const auto& component = handler->getComponent(); - - if (auto* documentWindow = component.findParentComponentOfClass()) { - if (role == AccessibilityRole::button) + auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }); + auto lines = StringArray::fromLines (text); + + if (line < lines.size()) { - if (&component == documentWindow->getCloseButton()) return NSAccessibilityCloseButtonSubrole; - if (&component == documentWindow->getMinimiseButton()) return NSAccessibilityMinimizeButtonSubrole; - if (&component == documentWindow->getMaximiseButton()) return NSAccessibilityFullScreenButtonSubrole; + auto lineText = lines[(int) line]; + auto start = text.indexOf (lineText); + + if (start >= 0) + return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length()); } } - } - return NSAccessibilityUnknownRole; - } + return NSMakeRange (0, 0); + }); - static NSString* getAccessibilityLabel (id self, SEL) - { - if (auto* handler = getHandler (self)) - return juceStringToNS (handler->getDescription()); + addMethod (@selector (accessibilityStringForRange:), [] (id self, SEL, NSRange range) -> NSString* + { + if (auto* textInterface = getTextInterface (self)) + return juceStringToNS (textInterface->getText (nsRangeToJuce (range))); - return nil; - } + return nil; + }); - //============================================================================== - static NSInteger getAccessibilityInsertionPointLineNumber (id self, SEL) - { - if (auto* textInterface = getTextInterface (self)) - return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()]; + addMethod (@selector (accessibilityRangeForPosition:), [] (id self, SEL, NSPoint position) + { + if (auto* handler = getHandler (self)) + { + if (auto* textInterface = handler->getTextInterface()) + { + auto screenPoint = roundToIntPoint (flippedScreenPoint (position)); - return 0; - } + if (handler->getComponent().getScreenBounds().contains (screenPoint)) + { + auto offset = textInterface->getOffsetAtPoint (screenPoint); - static NSRange getAccessibilityVisibleCharacterRange (id self, SEL) - { - if (auto* textInterface = getTextInterface (self)) - return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() }); + if (offset >= 0) + return NSMakeRange ((NSUInteger) offset, 1); + } + } + } - return NSMakeRange (0, 0); - } + return NSMakeRange (0, 0); + }); - static NSInteger getAccessibilityNumberOfCharacters (id self, SEL) - { - if (auto* textInterface = getTextInterface (self)) - return textInterface->getTotalNumCharacters(); + addMethod (@selector (accessibilityRangeForIndex:), [] (id self, SEL, NSInteger index) + { + if (auto* textInterface = getTextInterface (self)) + if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters())) + return NSMakeRange ((NSUInteger) index, 1); - return 0; - } + return NSMakeRange (0, 0); + }); - static NSString* getAccessibilitySelectedText (id self, SEL) - { - if (auto* textInterface = getTextInterface (self)) - return juceStringToNS (textInterface->getText (textInterface->getSelection())); + addMethod (@selector (accessibilityFrameForRange:), [] (id self, SEL, NSRange range) + { + if (auto* textInterface = getTextInterface (self)) + return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds())); - return nil; - } + return NSZeroRect; + }); - static NSRange getAccessibilitySelectedTextRange (id self, SEL) - { - if (auto* textInterface = getTextInterface (self)) + addMethod (@selector (accessibilityLineForIndex:), [] (id self, SEL, NSInteger index) { - const auto currentSelection = textInterface->getSelection(); + if (auto* textInterface = getTextInterface (self)) + { + auto text = textInterface->getText ({ 0, (int) index }); - if (currentSelection.isEmpty()) - return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0); + if (! text.isEmpty()) + return StringArray::fromLines (text).size() - 1; + } - return juceRangeToNS (currentSelection); - } + return 0; + }); - return NSMakeRange (0, 0); - } + addMethod (@selector (setAccessibilitySelectedTextRange:), [] (id self, SEL, NSRange selectedRange) + { + if (auto* textInterface = getTextInterface (self)) + textInterface->setSelection (nsRangeToJuce (selectedRange)); + }); - static NSAttributedString* getAccessibilityAttributedStringForRange (id self, SEL, NSRange range) - { - NSString* string = [self accessibilityStringForRange: range]; + addMethod (@selector (accessibilityRows), [] (id self, SEL) -> NSArray* + { + if (auto* tableInterface = getTableInterface (self)) + { + auto* rows = [[NSMutableArray new] autorelease]; - if (string != nil) - return [[[NSAttributedString alloc] initWithString: string] autorelease]; + for (int row = 0, numRows = tableInterface->getNumRows(); row < numRows; ++row) + { + if (auto* rowHandler = tableInterface->getRowHandler (row)) + { + [rows addObject: static_cast (rowHandler->getNativeImplementation())]; + } + else + { + [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole + frame: NSZeroRect + label: @"Offscreen Row" + parent: self]]; + } + } - return nil; - } + return rows; + } - static NSRange getAccessibilityRangeForLine (id self, SEL, NSInteger line) - { - if (auto* textInterface = getTextInterface (self)) - { - auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }); - auto lines = StringArray::fromLines (text); + return nil; + }); - if (line < lines.size()) - { - auto lineText = lines[(int) line]; - auto start = text.indexOf (lineText); + addMethod (@selector (accessibilitySelectedRows), [] (id self, SEL) + { + return getSelectedChildren ([self accessibilityRows]); + }); - if (start >= 0) - return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length()); - } - } + addMethod (@selector (setAccessibilitySelectedRows:), [] (id self, SEL, NSArray* selected) + { + setSelectedChildren ([self accessibilityRows], selected); + }); - return NSMakeRange (0, 0); - } + addMethod (@selector (accessibilityHeader), [] (id self, SEL) -> id + { + if (auto* tableInterface = getTableInterface (self)) + if (auto* handler = tableInterface->getHeaderHandler()) + return static_cast (handler->getNativeImplementation()); - static NSString* getAccessibilityStringForRange (id self, SEL, NSRange range) - { - if (auto* textInterface = getTextInterface (self)) - return juceStringToNS (textInterface->getText (nsRangeToJuce (range))); + return nil; + }); - return nil; - } + addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount); + addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount); + addMethod (@selector (accessibilityRowIndexRange), getAccessibilityRowIndexRange); + addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange); - static NSRange getAccessibilityRangeForPosition (id self, SEL, NSPoint position) - { - if (auto* handler = getHandler (self)) + addMethod (@selector (accessibilityIndex), [] (id self, SEL) -> NSInteger { - if (auto* textInterface = handler->getTextInterface()) + if (auto* handler = getHandler (self)) { - auto screenPoint = roundToIntPoint (flippedScreenPoint (position)); - - if (handler->getComponent().getScreenBounds().contains (screenPoint)) + if (auto* tableHandler = getEnclosingHandlerWithInterface (handler, &AccessibilityHandler::getTableInterface)) { - auto offset = textInterface->getOffsetAtPoint (screenPoint); + if (auto* tableInterface = tableHandler->getTableInterface()) + { + NSAccessibilityRole handlerRole = [self accessibilityRole]; + + if ([handlerRole isEqual: NSAccessibilityRowRole]) + if (const auto span = tableInterface->getRowSpan (*handler)) + return span->begin; - if (offset >= 0) - return NSMakeRange ((NSUInteger) offset, 1); + if ([handlerRole isEqual: NSAccessibilityColumnRole]) + if (const auto span = tableInterface->getColumnSpan (*handler)) + return span->begin; + } } } - } - return NSMakeRange (0, 0); - } + return 0; + }); - static NSRange getAccessibilityRangeForIndex (id self, SEL, NSInteger index) - { - if (auto* textInterface = getTextInterface (self)) - if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters())) - return NSMakeRange ((NSUInteger) index, 1); - - return NSMakeRange (0, 0); - } - - static NSRect getAccessibilityFrameForRange (id self, SEL, NSRange range) - { - if (auto* textInterface = getTextInterface (self)) - return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds())); + addMethod (@selector (accessibilityDisclosureLevel), [] (id self, SEL) + { + if (auto* handler = getHandler (self)) + if (auto* cellInterface = handler->getCellInterface()) + return cellInterface->getDisclosureLevel(); - return NSZeroRect; - } + return 0; + }); - static NSInteger getAccessibilityLineForIndex (id self, SEL, NSInteger index) - { - if (auto* textInterface = getTextInterface (self)) + addMethod (@selector (accessibilityDisclosedRows), [] (id self, SEL) -> id { - auto text = textInterface->getText ({ 0, (int) index }); + if (auto* handler = getHandler (self)) + { + if (auto* cellInterface = handler->getCellInterface()) + { + const auto rows = cellInterface->getDisclosedRows(); + auto* result = [NSMutableArray arrayWithCapacity: rows.size()]; - if (! text.isEmpty()) - return StringArray::fromLines (text).size() - 1; - } + for (const auto& row : rows) + { + if (row != nullptr) + [result addObject: static_cast (row->getNativeImplementation())]; + else + [result addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole + frame: NSZeroRect + label: @"Offscreen Row" + parent: self]]; + } - return 0; - } + return result; + } + } - static void setAccessibilitySelectedTextRange (id self, SEL, NSRange selectedRange) - { - if (auto* textInterface = getTextInterface (self)) - textInterface->setSelection (nsRangeToJuce (selectedRange)); - } + return nil; + }); - //============================================================================== - static NSArray* getAccessibilityRows (id self, SEL) - { - NSMutableArray* rows = [[NSMutableArray new] autorelease]; + addMethod (@selector (isAccessibilityExpanded), [] (id self, SEL) -> BOOL + { + if (auto* handler = getHandler (self)) + return handler->getCurrentState().isExpanded(); + + return NO; + }); - if (auto* tableInterface = getTableInterface (self)) + addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement); + addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement); + addMethod (@selector (accessibilityPerformDelete), [] (id self, SEL) { - for (int row = 0; row < tableInterface->getNumRows(); ++row) + if (auto* handler = getHandler (self)) { - if (auto* handler = tableInterface->getCellHandler (row, 0)) + if (hasEditableText (*handler)) { - [rows addObject: (id) handler->getNativeImplementation()]; + handler->getTextInterface()->setText ({}); + return YES; } - else + + if (auto* valueInterface = handler->getValueInterface()) { - [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole - frame: NSZeroRect - label: @"Offscreen Row" - parent: self]]; + if (! valueInterface->isReadOnly()) + { + valueInterface->setValue ({}); + return YES; + } } } - } - return rows; - } + return NO; + }); - static NSArray* getAccessibilitySelectedRows (id self, SEL) - { - return getSelectedChildren ([self accessibilityRows]); - } + addMethod (@selector (accessibilityPerformPress), accessibilityPerformPress); - static void setAccessibilitySelectedRows (id self, SEL, NSArray* selected) - { - setSelectedChildren ([self accessibilityRows], selected); - } + addMethod (@selector (accessibilityPerformShowMenu), [] (id self, SEL) + { + return performActionIfSupported (self, AccessibilityActionType::showMenu); + }); - static NSArray* getAccessibilityColumns (id self, SEL) - { - NSMutableArray* columns = [[NSMutableArray new] autorelease]; + addMethod (@selector (accessibilityPerformRaise), [] (id self, SEL) + { + [self setAccessibilityFocused: YES]; return YES; + }); - if (auto* tableInterface = getTableInterface (self)) + addMethod (@selector (isAccessibilitySelectorAllowed:), [] (id self, SEL, SEL selector) -> BOOL { - for (int column = 0; column < tableInterface->getNumColumns(); ++column) + if (auto* handler = getHandler (self)) { - if (auto* handler = tableInterface->getCellHandler (0, column)) + const auto handlerRole = handler->getRole(); + const auto currentState = handler->getCurrentState(); + + for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber), + @selector (accessibilityVisibleCharacterRange), + @selector (accessibilityNumberOfCharacters), + @selector (accessibilitySelectedText), + @selector (accessibilitySelectedTextRange), + @selector (accessibilityAttributedStringForRange:), + @selector (accessibilityRangeForLine:), + @selector (accessibilityStringForRange:), + @selector (accessibilityRangeForPosition:), + @selector (accessibilityRangeForIndex:), + @selector (accessibilityFrameForRange:), + @selector (accessibilityLineForIndex:), + @selector (setAccessibilitySelectedTextRange:) }) { - [columns addObject: (id) handler->getNativeImplementation()]; + if (selector == textSelector) + return handler->getTextInterface() != nullptr; } - else + + for (auto tableSelector : { @selector (accessibilityRowCount), + @selector (accessibilityRows), + @selector (accessibilitySelectedRows), + @selector (accessibilityColumnCount), + @selector (accessibilityHeader) }) { - [columns addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityColumnRole - frame: NSZeroRect - label: @"Offscreen Column" - parent: self]]; + if (selector == tableSelector) + return handler->getTableInterface() != nullptr; } - } - } - return columns; - } + for (auto cellSelector : { @selector (accessibilityRowIndexRange), + @selector (accessibilityColumnIndexRange), + @selector (accessibilityIndex), + @selector (accessibilityDisclosureLevel) }) + { + if (selector == cellSelector) + return handler->getCellInterface() != nullptr; + } - static NSArray* getAccessibilitySelectedColumns (id self, SEL) - { - return getSelectedChildren ([self accessibilityColumns]); - } + for (auto valueSelector : { @selector (accessibilityValue), + @selector (setAccessibilityValue:), + @selector (accessibilityPerformDelete), + @selector (accessibilityPerformIncrement), + @selector (accessibilityPerformDecrement) }) + { + if (selector != valueSelector) + continue; - static void setAccessibilitySelectedColumns (id self, SEL, NSArray* selected) - { - setSelectedChildren ([self accessibilityColumns], selected); - } + auto* valueInterface = handler->getValueInterface(); - //============================================================================== - static NSInteger getAccessibilityIndex (id self, SEL) - { - if (auto* handler = getHandler (self)) - { - if (auto* cellInterface = handler->getCellInterface()) - { - NSAccessibilityRole role = [self accessibilityRole]; + if (selector == @selector (accessibilityValue)) + return valueInterface != nullptr + || hasEditableText (*handler) + || currentState.isCheckable(); - if ([role isEqual: NSAccessibilityRowRole]) - return cellInterface->getRowIndex(); + auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); }; - if ([role isEqual: NSAccessibilityColumnRole]) - return cellInterface->getColumnIndex(); - } - } + if (selector == @selector (setAccessibilityValue:) + || selector == @selector (accessibilityPerformDelete)) + return hasEditableValue() || hasEditableText (*handler); - return 0; - } + auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); }; - static NSInteger getAccessibilityDisclosureLevel (id self, SEL) - { - if (auto* handler = getHandler (self)) - if (auto* cellInterface = handler->getCellInterface()) - return cellInterface->getDisclosureLevel(); + if (selector == @selector (accessibilityPerformIncrement) + || selector == @selector (accessibilityPerformDecrement)) + return hasEditableValue() && isRanged(); - return 0; - } + return NO; + } - static BOOL getIsAccessibilityExpanded (id self, SEL) - { - if (auto* handler = getHandler (self)) - return handler->getCurrentState().isExpanded(); + for (auto actionSelector : { @selector (accessibilityPerformPress), + @selector (accessibilityPerformShowMenu), + @selector (accessibilityPerformRaise), + @selector (setAccessibilityFocused:) }) + { + if (selector != actionSelector) + continue; - return NO; - } + if (selector == @selector (accessibilityPerformPress)) + return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle)) + || handler->getActions().contains (AccessibilityActionType::press); - //============================================================================== - static BOOL accessibilityPerformShowMenu (id self, SEL) { return performActionIfSupported (self, AccessibilityActionType::showMenu); } - static BOOL accessibilityPerformRaise (id self, SEL) { [self setAccessibilityFocused: YES]; return YES; } + if (selector == @selector (accessibilityPerformShowMenu)) + return handler->getActions().contains (AccessibilityActionType::showMenu); - static BOOL accessibilityPerformDelete (id self, SEL) - { - if (auto* handler = getHandler (self)) - { - if (hasEditableText (*handler)) - { - handler->getTextInterface()->setText ({}); - return YES; - } + if (selector == @selector (accessibilityPerformRaise)) + return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole]; - if (auto* valueInterface = handler->getValueInterface()) - { - if (! valueInterface->isReadOnly()) - { - valueInterface->setValue ({}); - return YES; + if (selector == @selector (setAccessibilityFocused:)) + return currentState.isFocusable(); } - } - } - return NO; - } + if (selector == @selector (accessibilitySelectedChildren)) + return handlerRole == AccessibilityRole::popupMenu; - //============================================================================== - static BOOL getIsAccessibilitySelectorAllowed (id self, SEL, SEL selector) - { - if (auto* handler = getHandler (self)) - { - const auto role = handler->getRole(); - const auto currentState = handler->getCurrentState(); - - for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber), - @selector (accessibilityVisibleCharacterRange), - @selector (accessibilityNumberOfCharacters), - @selector (accessibilitySelectedText), - @selector (accessibilitySelectedTextRange), - @selector (accessibilityAttributedStringForRange:), - @selector (accessibilityRangeForLine:), - @selector (accessibilityStringForRange:), - @selector (accessibilityRangeForPosition:), - @selector (accessibilityRangeForIndex:), - @selector (accessibilityFrameForRange:), - @selector (accessibilityLineForIndex:), - @selector (setAccessibilitySelectedTextRange:) }) - { - if (selector == textSelector) - return handler->getTextInterface() != nullptr; - } + if (selector == @selector (accessibilityOrientation)) + return handlerRole == AccessibilityRole::scrollBar; - for (auto tableSelector : { @selector (accessibilityRowCount), - @selector (accessibilityRows), - @selector (accessibilitySelectedRows), - @selector (accessibilityColumnCount), - @selector (accessibilityColumns), - @selector (accessibilitySelectedColumns) }) - { - if (selector == tableSelector) - return handler->getTableInterface() != nullptr; - } + if (selector == @selector (isAccessibilityExpanded)) + return currentState.isExpandable(); - for (auto cellSelector : { @selector (accessibilityRowIndexRange), - @selector (accessibilityColumnIndexRange), - @selector (accessibilityIndex), - @selector (accessibilityDisclosureLevel) }) - { - if (selector == cellSelector) - return handler->getCellInterface() != nullptr; + return sendSuperclassMessage (self, @selector (isAccessibilitySelectorAllowed:), selector); } - for (auto valueSelector : { @selector (accessibilityValue), - @selector (setAccessibilityValue:), - @selector (accessibilityPerformDelete), - @selector (accessibilityPerformIncrement), - @selector (accessibilityPerformDecrement) }) - { - if (selector != valueSelector) - continue; - - auto* valueInterface = handler->getValueInterface(); + return NO; + }); - if (selector == @selector (accessibilityValue)) - return valueInterface != nullptr - || hasEditableText (*handler) - || currentState.isCheckable(); + addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren); - auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); }; + registerClass(); + } - if (selector == @selector (setAccessibilityValue:) - || selector == @selector (accessibilityPerformDelete)) - return hasEditableValue() || hasEditableText (*handler); + //============================================================================== + static bool isSelectable (AccessibleState state) noexcept + { + return state.isSelectable() || state.isMultiSelectable(); + } - auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); }; + static NSArray* getSelectedChildren (NSArray* children) + { + NSMutableArray* selected = [[NSMutableArray new] autorelease]; - if (selector == @selector (accessibilityPerformIncrement) - || selector == @selector (accessibilityPerformDecrement)) - return hasEditableValue() && isRanged(); + for (id child in children) + { + if (auto* handler = getHandler (child)) + { + const auto currentState = handler->getCurrentState(); - return NO; + if (isSelectable (currentState) && currentState.isSelected()) + [selected addObject: child]; } + } - for (auto actionSelector : { @selector (accessibilityPerformPress), - @selector (accessibilityPerformShowMenu), - @selector (accessibilityPerformRaise), - @selector (setAccessibilityFocused:) }) - { - if (selector != actionSelector) - continue; + return selected; + } - if (selector == @selector (accessibilityPerformPress)) - return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle)) - || handler->getActions().contains (AccessibilityActionType::press); + static void setSelected (id item, bool selected) + { + auto* handler = getHandler (item); - if (selector == @selector (accessibilityPerformShowMenu)) - return handler->getActions().contains (AccessibilityActionType::showMenu); + if (handler == nullptr) + return; - if (selector == @selector (accessibilityPerformRaise)) - return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole]; + const auto currentState = handler->getCurrentState(); - if (selector == @selector (setAccessibilityFocused:)) - return currentState.isFocusable(); - } + if (isSelectable (currentState)) + { + if (currentState.isSelected() != selected) + handler->getActions().invoke (AccessibilityActionType::toggle); + } + else if (currentState.isFocusable()) + { + [item setAccessibilityFocused: selected]; + } + } - if (selector == @selector (accessibilitySelectedChildren)) - return role == AccessibilityRole::popupMenu; + static void setSelectedChildren (NSArray* children, NSArray* selected) + { + for (id child in children) + setSelected (child, [selected containsObject: child]); + } - if (selector == @selector (accessibilityOrientation)) - return role == AccessibilityRole::scrollBar; + //============================================================================== + static id getAccessibilityWindow (id self, SEL) + { + return [[self accessibilityParent] accessibilityWindow]; + } - if (selector == @selector (isAccessibilityExpanded)) - return currentState.isExpandable(); + static NSArray* getAccessibilityChildren (id self, SEL) + { + if (auto* handler = getHandler (self)) + { + auto children = handler->getChildren(); - return sendSuperclassMessage (self, @selector (isAccessibilitySelectorAllowed:), selector); + auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()]; + + for (auto* childHandler : children) + [accessibleChildren addObject: static_cast (childHandler->getNativeImplementation())]; + + return accessibleChildren; } - return NO; + return nil; } //============================================================================== @@ -881,7 +844,7 @@ static void sendHandlerNotification (const AccessibilityHandler& handler, if (@available (macOS 10.9, *)) { - if (id accessibilityElement = (id) handler.getNativeImplementation()) + if (id accessibilityElement = static_cast (handler.getNativeImplementation())) { sendAccessibilityEvent (accessibilityElement, notification, (notification == NSAccessibilityLayoutChangedNotification @@ -966,7 +929,7 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A JUCE_END_IGNORE_WARNINGS_GCC_LIKE }(); - sendAccessibilityEvent ((id) [NSApp mainWindow], + sendAccessibilityEvent (static_cast ([NSApp mainWindow]), NSAccessibilityAnnouncementRequestedNotification, @{ NSAccessibilityAnnouncementKey: juceStringToNS (announcementString), NSAccessibilityPriorityKey: @(nsPriority) }); diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm index 6eb5b692..f487d894 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm @@ -46,7 +46,9 @@ public: using Holder = std::unique_ptr; protected: - AccessibleObjCClass() : ObjCClass ("JUCEAccessibilityElement_") + AccessibleObjCClass() : AccessibleObjCClass ("JUCEAccessibilityElement_") {} + + explicit AccessibleObjCClass (const char* name) : ObjCClass (name) { ObjCClass::template addIvar ("handler"); } @@ -71,18 +73,6 @@ protected: static AccessibilityTableInterface* getTableInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getTableInterface); } static AccessibilityCellInterface* getCellInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getCellInterface); } - template - static auto getEnclosingInterface (AccessibilityHandler* handler, MemberFn fn) noexcept -> decltype ((std::declval().*fn)()) - { - if (handler == nullptr) - return nullptr; - - if (auto* interface = (handler->*fn)()) - return interface; - - return getEnclosingInterface (handler->getParent(), fn); - } - static bool hasEditableText (AccessibilityHandler& handler) noexcept { return handler.getRole() == AccessibilityRole::editableText @@ -105,8 +95,7 @@ protected: static BOOL getIsAccessibilityElement (id self, SEL) { if (auto* handler = getHandler (self)) - return ! handler->isIgnored() - && handler->getRole() != AccessibilityRole::window; + return ! handler->isIgnored() && handler->getRole() != AccessibilityRole::window; return NO; } @@ -198,10 +187,8 @@ protected: NSString* nsString = juceStringToNS (title); - #if ! JUCE_IOS if (nsString != nil && [[self accessibilityValue] isEqual: nsString]) return @""; - #endif return nsString; } @@ -227,36 +214,58 @@ protected: static NSInteger getAccessibilityRowCount (id self, SEL) { - if (auto* tableInterface = getTableInterface (self)) - return tableInterface->getNumRows(); + if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) + if (auto* tableInterface = tableHandler->getTableInterface()) + return tableInterface->getNumRows(); return 0; } static NSInteger getAccessibilityColumnCount (id self, SEL) { - if (auto* tableInterface = getTableInterface (self)) - return tableInterface->getNumColumns(); + if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) + if (auto* tableInterface = tableHandler->getTableInterface()) + return tableInterface->getNumColumns(); return 0; } - static NSRange getAccessibilityRowIndexRange (id self, SEL) + template + static NSRange getCellDimensions (id self, Getter getter) { - if (auto* cellInterface = getCellInterface (self)) - return NSMakeRange ((NSUInteger) cellInterface->getRowIndex(), - (NSUInteger) cellInterface->getRowSpan()); + const auto notFound = NSMakeRange (NSNotFound, 0); + + auto* handler = getHandler (self); + + if (handler == nullptr) + return notFound; - return NSMakeRange (0, 0); + auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface); + + if (tableHandler == nullptr) + return notFound; + + auto* tableInterface = tableHandler->getTableInterface(); + + if (tableInterface == nullptr) + return notFound; + + const auto result = (tableInterface->*getter) (*handler); + + if (! result.hasValue()) + return notFound; + + return NSMakeRange ((NSUInteger) result->begin, (NSUInteger) result->num); } - static NSRange getAccessibilityColumnIndexRange (id self, SEL) + static NSRange getAccessibilityRowIndexRange (id self, SEL) { - if (auto* cellInterface = getCellInterface (self)) - return NSMakeRange ((NSUInteger) cellInterface->getColumnIndex(), - (NSUInteger) cellInterface->getColumnSpan()); + return getCellDimensions (self, &AccessibilityTableInterface::getRowSpan); + } - return NSMakeRange (0, 0); + static NSRange getAccessibilityColumnIndexRange (id self, SEL) + { + return getCellDimensions (self, &AccessibilityTableInterface::getColumnSpan); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AccessibleObjCClass) diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp index de17aae6..d7712203 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp @@ -30,6 +30,50 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") int AccessibilityNativeHandle::idCounter = 0; +//============================================================================== +class UIAScrollProvider : public UIAProviderBase, + public ComBaseClassHelper +{ +public: + using UIAProviderBase::UIAProviderBase; + + JUCE_COMCALL Scroll (ComTypes::ScrollAmount, ComTypes::ScrollAmount) override { return E_FAIL; } + JUCE_COMCALL SetScrollPercent (double, double) override { return E_FAIL; } + JUCE_COMCALL get_HorizontalScrollPercent (double*) override { return E_FAIL; } + JUCE_COMCALL get_VerticalScrollPercent (double*) override { return E_FAIL; } + JUCE_COMCALL get_HorizontalViewSize (double*) override { return E_FAIL; } + JUCE_COMCALL get_VerticalViewSize (double*) override { return E_FAIL; } + JUCE_COMCALL get_HorizontallyScrollable (BOOL*) override { return E_FAIL; } + JUCE_COMCALL get_VerticallyScrollable (BOOL*) override { return E_FAIL; } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollProvider) +}; + +class UIAScrollItemProvider : public UIAProviderBase, + public ComBaseClassHelper +{ +public: + using UIAProviderBase::UIAProviderBase; + + JUCE_COMCALL ScrollIntoView() override + { + if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface)) + { + if (auto* tableInterface = handler->getTableInterface()) + { + tableInterface->showCell (getHandler()); + return S_OK; + } + } + + return (HRESULT) UIA_E_NOTSUPPORTED; + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollItemProvider) +}; + //============================================================================== static String getAutomationId (const AccessibilityHandler& handler) { @@ -63,7 +107,7 @@ static auto roleToControlTypeId (AccessibilityRole roleType) case AccessibilityRole::staticText: return ComTypes::UIA_TextControlTypeId; case AccessibilityRole::column: - case AccessibilityRole::row: return ComTypes::UIA_HeaderItemControlTypeId; + case AccessibilityRole::row: return ComTypes::UIA_ListItemControlTypeId; case AccessibilityRole::button: return ComTypes::UIA_ButtonControlTypeId; case AccessibilityRole::toggleButton: return ComTypes::UIA_CheckBoxControlTypeId; @@ -146,6 +190,22 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn const auto role = accessibilityHandler.getRole(); const auto fragmentRoot = isFragmentRoot(); + const auto isListOrTableCell = [] (auto& handler) + { + if (auto* tableHandler = getEnclosingHandlerWithInterface (&handler, &AccessibilityHandler::getTableInterface)) + { + if (auto* tableInterface = tableHandler->getTableInterface()) + { + const auto row = tableInterface->getRowSpan (handler); + const auto column = tableInterface->getColumnSpan (handler); + + return row.hasValue() && column.hasValue(); + } + } + + return false; + }; + switch (pId) { case ComTypes::UIA_WindowPatternId: @@ -213,25 +273,27 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn { auto state = accessibilityHandler.getCurrentState(); - if (state.isSelectable() || state.isMultiSelectable() - || role == AccessibilityRole::radioButton) + if (state.isSelectable() || state.isMultiSelectable() || role == AccessibilityRole::radioButton) { return new UIASelectionItemProvider (this); } break; } + case ComTypes::UIA_TablePatternId: case ComTypes::UIA_GridPatternId: { - if (accessibilityHandler.getTableInterface() != nullptr) - return new UIAGridProvider (this); + if (accessibilityHandler.getTableInterface() != nullptr + && (pId == ComTypes::UIA_GridPatternId || accessibilityHandler.getRole() == AccessibilityRole::table)) + return static_cast (new UIAGridProvider (this)); break; } + case ComTypes::UIA_TableItemPatternId: case ComTypes::UIA_GridItemPatternId: { - if (accessibilityHandler.getCellInterface() != nullptr) - return new UIAGridItemProvider (this); + if (isListOrTableCell (accessibilityHandler)) + return static_cast (new UIAGridItemProvider (this)); break; } @@ -250,6 +312,20 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn break; } + case ComTypes::UIA_ScrollPatternId: + { + if (accessibilityHandler.getTableInterface() != nullptr) + return new UIAScrollProvider (this); + + break; + } + case ComTypes::UIA_ScrollItemPatternId: + { + if (isListOrTableCell (accessibilityHandler)) + return new UIAScrollItemProvider (this); + + break; + } } return nullptr; diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h index b03fe8cd..cb07817b 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h @@ -120,18 +120,38 @@ enum WindowInteractionState WindowInteractionState_NotResponding = 4 }; +enum RowOrColumnMajor +{ + RowOrColumnMajor_RowMajor = 0, + RowOrColumnMajor_ColumnMajor = 1, + RowOrColumnMajor_Indeterminate = 2 +}; + +enum ScrollAmount +{ + ScrollAmount_LargeDecrement = 0, + ScrollAmount_SmallDecrement = 1, + ScrollAmount_NoAmount = 2, + ScrollAmount_LargeIncrement = 3, + ScrollAmount_SmallIncrement = 4 +}; + const long UIA_InvokePatternId = 10000; const long UIA_SelectionPatternId = 10001; const long UIA_ValuePatternId = 10002; const long UIA_RangeValuePatternId = 10003; +const long UIA_ScrollPatternId = 10004; const long UIA_ExpandCollapsePatternId = 10005; const long UIA_GridPatternId = 10006; const long UIA_GridItemPatternId = 10007; const long UIA_WindowPatternId = 10009; const long UIA_SelectionItemPatternId = 10010; +const long UIA_TablePatternId = 10012; +const long UIA_TableItemPatternId = 10013; const long UIA_TextPatternId = 10014; const long UIA_TogglePatternId = 10015; const long UIA_TransformPatternId = 10016; +const long UIA_ScrollItemPatternId = 10017; const long UIA_TextPattern2Id = 10024; const long UIA_StructureChangedEventId = 20002; const long UIA_MenuOpenedEventId = 20003; @@ -220,6 +240,21 @@ public: JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0; }; +JUCE_COMCLASS (ITableItemProvider, "b9734fa6-771f-4d78-9c90-2517999349cd") : public IUnknown +{ +public: + JUCE_COMCALL GetRowHeaderItems (SAFEARRAY** pRetVal) = 0; + JUCE_COMCALL GetColumnHeaderItems (SAFEARRAY** pRetVal) = 0; +}; + +JUCE_COMCLASS (ITableProvider, "9c860395-97b3-490a-b52a-858cc22af166") : public IUnknown +{ +public: + JUCE_COMCALL GetRowHeaders (SAFEARRAY** pRetVal) = 0; + JUCE_COMCALL GetColumnHeaders (SAFEARRAY** pRetVal) = 0; + JUCE_COMCALL get_RowOrColumnMajor (RowOrColumnMajor* pRetVal) = 0; +}; + JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown { public: @@ -345,6 +380,25 @@ public: JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0; }; +JUCE_COMCLASS (IScrollProvider, "b38b8077-1fc3-42a5-8cae-d40c2215055a") : public IUnknown +{ +public: + JUCE_COMCALL Scroll (ScrollAmount horizontalAmount, ScrollAmount verticalAmount) = 0; + JUCE_COMCALL SetScrollPercent (double horizontalPercent,double verticalPercent) = 0; + JUCE_COMCALL get_HorizontalScrollPercent (double* pRetVal) = 0; + JUCE_COMCALL get_VerticalScrollPercent (double* pRetVal) = 0; + JUCE_COMCALL get_HorizontalViewSize (double* pRetVal) = 0; + JUCE_COMCALL get_VerticalViewSize (double* pRetVal) = 0; + JUCE_COMCALL get_HorizontallyScrollable (BOOL* pRetVal) = 0; + JUCE_COMCALL get_VerticallyScrollable (BOOL* pRetVal) = 0; +}; + +JUCE_COMCLASS (IScrollItemProvider, "2360c714-4bf1-4b26-ba65-9b21316127eb") : public IUnknown +{ +public: + JUCE_COMCALL ScrollIntoView() = 0; +}; + constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } }; } // namespace ComTypes @@ -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) __CRT_UUID_DECL (juce::ComTypes::IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a) __CRT_UUID_DECL (juce::ComTypes::IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9) +__CRT_UUID_DECL (juce::ComTypes::ITableItemProvider, 0xb9734fa6, 0x771f, 0x4d78, 0x9c, 0x90, 0x25, 0x17, 0x99, 0x93, 0x49, 0xcd) +__CRT_UUID_DECL (juce::ComTypes::ITableProvider, 0x9c860395, 0x97b3, 0x490a, 0xb5, 0x2a, 0x85, 0x8c, 0xc2, 0x2a, 0xf1, 0x66) +__CRT_UUID_DECL (juce::ComTypes::IScrollProvider, 0xb38b8077, 0x1fc3, 0x42a5, 0x8c, 0xae, 0xd4, 0x0c, 0x22, 0x15, 0x05, 0x5a) +__CRT_UUID_DECL (juce::ComTypes::IScrollItemProvider, 0x2360c714, 0x4bf1, 0x4b26, 0xba, 0x65, 0x9b, 0x21, 0x31, 0x61, 0x27, 0xeb) #endif diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h index 251a3c5a..494dfeb2 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h @@ -28,7 +28,7 @@ namespace juce //============================================================================== class UIAGridItemProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: using UIAProviderBase::UIAProviderBase; @@ -36,62 +36,113 @@ public: //============================================================================== JUCE_COMRESULT get_Row (int* pRetVal) override { - return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface) - { - *pRetVal = cellInterface.getRowIndex(); - }); + return withTableSpan (pRetVal, + &AccessibilityTableInterface::getRowSpan, + &AccessibilityTableInterface::Span::begin); } JUCE_COMRESULT get_Column (int* pRetVal) override { - return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface) - { - *pRetVal = cellInterface.getColumnIndex(); - }); + return withTableSpan (pRetVal, + &AccessibilityTableInterface::getColumnSpan, + &AccessibilityTableInterface::Span::begin); } JUCE_COMRESULT get_RowSpan (int* pRetVal) override { - return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface) - { - *pRetVal = cellInterface.getRowSpan(); - }); + return withTableSpan (pRetVal, + &AccessibilityTableInterface::getRowSpan, + &AccessibilityTableInterface::Span::num); } JUCE_COMRESULT get_ColumnSpan (int* pRetVal) override { - return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface) - { - *pRetVal = cellInterface.getColumnSpan(); - }); + return withTableSpan (pRetVal, + &AccessibilityTableInterface::getColumnSpan, + &AccessibilityTableInterface::Span::num); } JUCE_COMRESULT get_ContainingGrid (IRawElementProviderSimple** pRetVal) override { - return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface) + return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler) { JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - - if (auto* handler = cellInterface.getTableHandler()) - handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal)); - + tableHandler.getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal)); JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + return true; }); } + JUCE_COMRESULT GetRowHeaderItems (SAFEARRAY**) override + { + return (HRESULT) UIA_E_NOTSUPPORTED; + } + + JUCE_COMRESULT GetColumnHeaderItems (SAFEARRAY** pRetVal) override + { + return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler) + { + if (auto* tableInterface = tableHandler.getTableInterface()) + { + if (const auto column = tableInterface->getColumnSpan (getHandler())) + { + if (auto* header = tableInterface->getHeaderHandler()) + { + const auto children = header->getChildren(); + + if (isPositiveAndBelow (column->begin, children.size())) + { + IRawElementProviderSimple* provider = nullptr; + + if (auto* child = children[(size_t) column->begin]) + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + if (child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider)) == S_OK && provider != nullptr) + { + *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, 1); + LONG index = 0; + const auto hr = SafeArrayPutElement (*pRetVal, &index, provider); + + return ! FAILED (hr); + } + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } + } + } + } + } + + return false; + }); + } private: template - JUCE_COMRESULT withCellInterface (Value* pRetVal, Callback&& callback) const + JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const { return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT { - if (auto* cellInterface = getHandler().getCellInterface()) + if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface)) + if (handler->getTableInterface() != nullptr && callback (*handler)) + return S_OK; + + return (HRESULT) UIA_E_NOTSUPPORTED; + }); + } + + JUCE_COMRESULT withTableSpan (int* pRetVal, + Optional (AccessibilityTableInterface::* getSpan) (const AccessibilityHandler&) const, + int AccessibilityTableInterface::Span::* spanMember) const + { + return withTableInterface (pRetVal, [&] (const AccessibilityHandler& handler) + { + if (const auto span = ((handler.getTableInterface())->*getSpan) (getHandler())) { - callback (*cellInterface); - return S_OK; + *pRetVal = (*span).*spanMember; + return true; } - return (HRESULT) UIA_E_NOTSUPPORTED; + return false; }); } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h index 6359f74b..ef17dd5e 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h @@ -28,7 +28,7 @@ namespace juce //============================================================================== class UIAGridProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: using UIAProviderBase::UIAProviderBase; @@ -44,12 +44,21 @@ public: JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - if (auto* handler = tableInterface.getCellHandler (row, column)) - handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal)); + if (auto* cellHandler = tableInterface.getCellHandler (row, column)) + { + cellHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal)); + return S_OK; + } + + if (auto* rowHandler = tableInterface.getRowHandler (row)) + { + rowHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal)); + return S_OK; + } JUCE_END_IGNORE_WARNINGS_GCC_LIKE - return S_OK; + return E_FAIL; }); } @@ -71,14 +80,65 @@ public: }); } + JUCE_COMRESULT GetRowHeaders (SAFEARRAY**) override + { + return (HRESULT) UIA_E_NOTSUPPORTED; + } + + JUCE_COMRESULT GetColumnHeaders (SAFEARRAY** pRetVal) override + { + return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface) + { + if (auto* header = tableInterface.getHeaderHandler()) + { + const auto children = header->getChildren(); + + *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, (ULONG) children.size()); + + LONG index = 0; + + for (const auto& child : children) + { + IRawElementProviderSimple* provider = nullptr; + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + if (child != nullptr) + child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider)); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + if (provider == nullptr) + return E_FAIL; + + const auto hr = SafeArrayPutElement (*pRetVal, &index, provider); + + if (FAILED (hr)) + return E_FAIL; + + ++index; + } + + return S_OK; + } + + return (HRESULT) UIA_E_NOTSUPPORTED; + }); + } + + JUCE_COMRESULT get_RowOrColumnMajor (ComTypes::RowOrColumnMajor* pRetVal) override + { + *pRetVal = ComTypes::RowOrColumnMajor_RowMajor; + return S_OK; + } + private: template JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const { return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT { - if (auto* tableInterface = getHandler().getTableInterface()) - return callback (*tableInterface); + if (auto* tableHandler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface)) + if (auto* tableInterface = tableHandler->getTableInterface()) + return callback (*tableInterface); return (HRESULT) UIA_E_NOTSUPPORTED; }); diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 718effc4..a6b8a974 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -164,9 +164,23 @@ DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;") + FIELD (layoutInDisplayCutoutMode, "layoutInDisplayCutoutMode", "I") - DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets, "android/view/WindowInsets", 28) +DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowManagerLayoutParams28, "android/view/WindowManager$LayoutParams", 28) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;") \ + METHOD (consumeDisplayCutout, "consumeDisplayCutout", "()Landroid/view/WindowInsets;") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets28, "android/view/WindowInsets", 28) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getInsets, "getInsets", "(I)Landroid/graphics/Insets;") \ + STATICFIELD (CONSUMED, "CONSUMED", "Landroid/view/WindowInsets;") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets30, "android/view/WindowInsets", 30) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -178,6 +192,22 @@ DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidDisplayCutout, "android/view/DisplayCutout", 28) #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + FIELD (bottom, "bottom", "I") \ + FIELD (left, "left", "I") \ + FIELD (right, "right", "I") \ + FIELD (top, "top", "I") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidGraphicsInsets, "android/graphics/Insets", 29) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (ime, "ime", "()I") \ + STATICMETHOD (displayCutout, "displayCutout", "()I") + + DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsetsType, "android/view/WindowInsets$Type", 30) +#undef JNI_CLASS_MEMBERS + //============================================================================== namespace { @@ -205,14 +235,14 @@ static bool supportsDisplayCutout() static BorderSize androidDisplayCutoutToBorderSize (LocalRef displayCutout, double displayScale) { - if (displayCutout.get() == nullptr) + if (displayCutout == nullptr) return {}; auto* env = getEnv(); - auto getInset = [&] (jmethodID methodID) + const auto getInset = [&] (jmethodID methodID) { - return roundToInt (env->CallIntMethod (displayCutout.get(), methodID) / displayScale); + return roundToInt (env->CallIntMethod (displayCutout, methodID) / displayScale); }; return { getInset (AndroidDisplayCutout.getSafeInsetTop), @@ -221,6 +251,67 @@ static BorderSize androidDisplayCutoutToBorderSize (LocalRef displ getInset (AndroidDisplayCutout.getSafeInsetRight) }; } +static BorderSize androidInsetsToBorderSize (LocalRef insets, double displayScale) +{ + if (insets == nullptr) + return {}; + + auto* env = getEnv(); + + const auto getInset = [&] (jfieldID fieldID) + { + return roundToInt (env->GetIntField (insets, fieldID) / displayScale); + }; + + return { getInset (AndroidGraphicsInsets.top), + getInset (AndroidGraphicsInsets.left), + getInset (AndroidGraphicsInsets.bottom), + getInset (AndroidGraphicsInsets.right) }; +} + +class JuceInsets +{ + template + static auto tieDisplay (Display& d) { return std::tie (d.safeAreaInsets, d.keyboardInsets); } + +public: + BorderSize displayCutout, keyboard; + + static auto tie ( Displays::Display& d) { return tieDisplay (d); } + static auto tie (const Displays::Display& d) { return tieDisplay (d); } + + auto tie() const { return std::tie (displayCutout, keyboard); } +}; + +static JuceInsets getInsetsFromAndroidWindowInsets (LocalRef windowInsets, double scale) +{ + auto* env = getEnv(); + + if (windowInsets == nullptr) + return {}; + + const auto displayCutout = [&]() -> BorderSize + { + if (AndroidWindowInsets28.getDisplayCutout == nullptr) + return {}; + + const LocalRef insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets28.getDisplayCutout) }; + return androidDisplayCutoutToBorderSize (insets, scale); + }(); + + const auto keyboard = [&]() -> BorderSize + { + if (AndroidWindowInsetsType.ime == nullptr || AndroidWindowInsets30.getInsets == nullptr) + return {}; + + const auto mask = env->CallStaticIntMethod (AndroidWindowInsetsType, AndroidWindowInsetsType.ime); + const LocalRef insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets30.getInsets, mask) }; + return androidInsetsToBorderSize (insets, scale); + }(); + + return { displayCutout, keyboard }; +} + /* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values represent ASCII keycodes. However in the native Android keycodes the values for special keys e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them. @@ -417,14 +508,8 @@ public: if (supportsDisplayCutout()) { - jfieldID layoutInDisplayCutoutModeFieldId = env->GetFieldID (AndroidWindowManagerLayoutParams, - "layoutInDisplayCutoutMode", - "I"); - - if (layoutInDisplayCutoutModeFieldId != nullptr) - env->SetIntField (windowLayoutParams.get(), - layoutInDisplayCutoutModeFieldId, - LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS); + if (const auto fieldID = AndroidWindowManagerLayoutParams28.layoutInDisplayCutoutMode) + env->SetIntField (windowLayoutParams, fieldID, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS); } if (Desktop::getInstance().getKioskModeComponent() != nullptr) @@ -441,14 +526,13 @@ public: if (supportsDisplayCutout()) { - jmethodID setOnApplyWindowInsetsListenerMethodId = env->GetMethodID (AndroidView, - "setOnApplyWindowInsetsListener", - "(Landroid/view/View$OnApplyWindowInsetsListener;)V"); - - if (setOnApplyWindowInsetsListenerMethodId != nullptr) - env->CallVoidMethod (view.get(), setOnApplyWindowInsetsListenerMethodId, + if (const auto methodID = AndroidView23.setOnApplyWindowInsetsListener) + { + env->CallVoidMethod (view, + methodID, CreateJavaInterface (new ViewWindowInsetsListener, "android/view/View$OnApplyWindowInsetsListener").get()); + } } if (isFocused()) @@ -795,9 +879,7 @@ public: if (activity != nullptr) { - jmethodID finishMethod = env->GetMethodID (AndroidActivity, "finish", "()V"); - - if (finishMethod != nullptr) + if (const auto finishMethod = AndroidActivity.finish) env->CallVoidMethod (activity.get(), finishMethod); } } @@ -1130,35 +1212,23 @@ private: } //============================================================================== - struct ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer + class ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer { - jobject onApplyWindowInsets (LocalRef v, LocalRef insets) + public: + jobject onApplyWindowInsets (LocalRef, LocalRef insets) { auto* env = getEnv(); - LocalRef displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout)); - - if (displayCutout != nullptr) - { - const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay(); - auto newSafeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, mainDisplay.scale); - - if (newSafeAreaInsets != mainDisplay.safeAreaInsets) - forceDisplayUpdate(); - - auto* fieldId = env->GetStaticFieldID (AndroidWindowInsets, "CONSUMED", "Landroid/view/WindowInsets"); - jassert (fieldId != nullptr); - - return env->GetStaticObjectField (AndroidWindowInsets, fieldId); - } + const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay(); + const auto newInsets = getInsetsFromAndroidWindowInsets (insets, mainDisplay.scale); - jmethodID onApplyWindowInsetsMethodId = env->GetMethodID (AndroidView, - "onApplyWindowInsets", - "(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;"); + if (newInsets.tie() != JuceInsets::tie (mainDisplay)) + forceDisplayUpdate(); - jassert (onApplyWindowInsetsMethodId != nullptr); + if (const auto fieldId = AndroidWindowInsets30.CONSUMED) + return env->GetStaticObjectField (AndroidWindowInsets30, fieldId); - return env->CallObjectMethod (v.get(), onApplyWindowInsetsMethodId, insets.get()); + return env->CallObjectMethod (insets, AndroidWindowInsets28.consumeDisplayCutout); } private: @@ -1852,16 +1922,14 @@ void Displays::findDisplays (float masterScale) LocalRef windowServiceString (javaString ("window")); LocalRef displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create)); LocalRef windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get())); - LocalRef display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay)); - - jmethodID getRealMetricsMethod = env->GetMethodID (AndroidDisplay, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V"); + LocalRef display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay)); - if (getRealMetricsMethod != nullptr) - env->CallVoidMethod (display.get(), getRealMetricsMethod, displayMetrics.get()); + if (const auto getRealMetricsMethod = AndroidDisplay17.getRealMetrics) + env->CallVoidMethod (display, getRealMetricsMethod, displayMetrics.get()); else - env->CallVoidMethod (display.get(), AndroidDisplay.getMetrics, displayMetrics.get()); + env->CallVoidMethod (display, AndroidDisplay.getMetrics, displayMetrics.get()); - env->CallVoidMethod (display.get(), AndroidDisplay.getSize, usableSize.get()); + env->CallVoidMethod (display, AndroidDisplay.getSize, usableSize.get()); Display d; @@ -1897,24 +1965,10 @@ void Displays::findDisplays (float masterScale) if (! activityArea.isEmpty()) d.userArea = activityArea / d.scale; - if (supportsDisplayCutout()) + if (const auto getRootWindowInsetsMethodId = AndroidView23.getRootWindowInsets) { - jmethodID getRootWindowInsetsMethodId = env->GetMethodID (AndroidView, - "getRootWindowInsets", - "()Landroid/view/WindowInsets;"); - - if (getRootWindowInsetsMethodId != nullptr) - { - LocalRef insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId)); - - if (insets != nullptr) - { - LocalRef displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout)); - - if (displayCutout.get() != nullptr) - d.safeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, d.scale); - } - } + LocalRef insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId)); + JuceInsets::tie (d) = getInsetsFromAndroidWindowInsets (insets, d.scale).tie(); } static bool hasAddedMainActivityListener = false; diff --git a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp index f15365b6..8aea9448 100644 --- a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp +++ b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp @@ -26,10 +26,6 @@ namespace juce { -#if ! defined (__IPHONE_10_0) || __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0 - using UIActivityType = NSString*; -#endif - class ContentSharer::ContentSharerNativeImpl : public ContentSharer::Pimpl, private Component { diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index 3121bb84..53362691 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -39,6 +39,34 @@ namespace juce { +//============================================================================== +static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler) +{ + const auto children = handler.getChildren(); + + NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()]; + + for (auto* childHandler : children) + { + id accessibleElement = [&childHandler] + { + id native = static_cast (childHandler->getNativeImplementation()); + + if (! childHandler->getChildren().empty()) + return [native accessibilityContainer]; + + return native; + }(); + + if (accessibleElement != nil) + [accessibleChildren addObject: accessibleElement]; + } + + [accessibleChildren addObject: static_cast (handler.getNativeImplementation())]; + + return accessibleChildren; +} + class UIViewComponentPeer; static UIInterfaceOrientation getWindowOrientation() @@ -119,6 +147,107 @@ enum class MouseEventFlags using namespace juce; +@interface JuceUITextPosition : UITextPosition +{ +@public + int index; +} +@end + +@implementation JuceUITextPosition + ++ (instancetype) withIndex: (int) indexIn +{ + auto* result = [[JuceUITextPosition alloc] init]; + result->index = indexIn; + return [result autorelease]; +} + +@end + +//============================================================================== +@interface JuceUITextRange : UITextRange +{ +@public + int from, to; +} +@end + +@implementation JuceUITextRange + ++ (instancetype) withRange: (juce::Range) range +{ + return [JuceUITextRange from: range.getStart() to: range.getEnd()]; +} + ++ (instancetype) from: (int) from to: (int) to +{ + auto* result = [[JuceUITextRange alloc] init]; + result->from = from; + result->to = to; + return [result autorelease]; +} + +- (UITextPosition*) start +{ + return [JuceUITextPosition withIndex: from]; +} + +- (UITextPosition*) end +{ + return [JuceUITextPosition withIndex: to]; +} + +- (Range) range +{ + return Range::between (from, to); +} + +- (BOOL) isEmpty +{ + return from == to; +} + +@end + +//============================================================================== +// UITextInputStringTokenizer doesn't handle 'line' granularities correctly by default, hence +// this subclass. +@interface JuceTextInputTokenizer : UITextInputStringTokenizer +{ + UIViewComponentPeer* peer; +} + +- (instancetype) initWithPeer: (UIViewComponentPeer*) peer; + +@end + +//============================================================================== +@interface JuceUITextSelectionRect : UITextSelectionRect +{ + CGRect _rect; +} + +@end + +@implementation JuceUITextSelectionRect + ++ (instancetype) withRect: (CGRect) rect +{ + auto* result = [[JuceUITextSelectionRect alloc] init]; + result->_rect = rect; + return [result autorelease]; +} + +- (CGRect) rect { return _rect; } +- (NSWritingDirection) writingDirection { return NSWritingDirectionNatural; } +- (BOOL) containsStart { return NO; } +- (BOOL) containsEnd { return NO; } +- (BOOL) isVertical { return NO; } + +@end + +//============================================================================== struct CADisplayLinkDeleter { void operator() (CADisplayLink* displayLink) const noexcept @@ -128,11 +257,21 @@ struct CADisplayLinkDeleter } }; -@interface JuceUIView : UIView +@interface JuceTextView : UIView +{ +@public + UIViewComponentPeer* owner; + id delegate; +} + +- (instancetype) initWithOwner: (UIViewComponentPeer*) owner; + +@end + +@interface JuceUIView : UIView { @public UIViewComponentPeer* owner; - UITextView* hiddenTextView; std::unique_ptr displayLink; } @@ -159,8 +298,6 @@ struct CADisplayLinkDeleter - (BOOL) resignFirstResponder; - (BOOL) canBecomeFirstResponder; -- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text; - - (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection; - (BOOL) isAccessibilityElement; @@ -212,6 +349,7 @@ struct UIViewPeerControllerReceiver virtual void setViewController (UIViewController*) = 0; }; +//============================================================================== class UIViewComponentPeer : public ComponentPeer, private UIViewPeerControllerReceiver { @@ -264,9 +402,9 @@ public: void grabFocus() override; void textInputRequired (Point, TextInputTarget&) override; void dismissPendingTextInput() override; + void closeInputMethodContext() override; BOOL textViewReplaceCharacters (Range, const String&); - void updateHiddenTextContent (TextInputTarget&); void updateScreenBounds(); @@ -286,7 +424,10 @@ public: JuceUIView* view = nil; UIViewController* controller = nil; const bool isSharedWindow, isAppex; + String stringBeingComposed; bool fullScreen = false, insideDrawRect = false; + NSUniquePtr hiddenTextInput { [[JuceTextView alloc] initWithOwner: this] }; + NSUniquePtr tokenizer { [[JuceTextInputTokenizer alloc] initWithPeer: this] }; static int64 getMouseTime (NSTimeInterval timestamp) noexcept { @@ -306,6 +447,22 @@ public: static MultiTouchMapper currentTouches; + static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept + { + switch (type) + { + case TextInputTarget::textKeyboard: return UIKeyboardTypeDefault; + case TextInputTarget::numericKeyboard: return UIKeyboardTypeNumbersAndPunctuation; + case TextInputTarget::decimalKeyboard: return UIKeyboardTypeNumbersAndPunctuation; + case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL; + case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress; + case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad; + default: jassertfalse; break; + } + + return UIKeyboardTypeDefault; + } + private: void appStyleChanged() override { @@ -418,12 +575,10 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; return [[[NSBundle mainBundle] objectForInfoDictionaryKey: @"UIStatusBarHidden"] boolValue]; } -#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 - (BOOL) prefersHomeIndicatorAutoHidden { return isKioskModeView (self); } -#endif - (UIStatusBarStyle) preferredStatusBarStyle { @@ -491,14 +646,7 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; [displayLink.get() addToRunLoop: [NSRunLoop mainRunLoop] forMode: NSDefaultRunLoopMode]; - hiddenTextView = [[UITextView alloc] initWithFrame: CGRectZero]; - [self addSubview: hiddenTextView]; - hiddenTextView.delegate = self; - - hiddenTextView.autocapitalizationType = UITextAutocapitalizationTypeNone; - hiddenTextView.autocorrectionType = UITextAutocorrectionTypeNo; - hiddenTextView.inputAssistantItem.leadingBarButtonGroups = @[]; - hiddenTextView.inputAssistantItem.trailingBarButtonGroups = @[]; + [self addSubview: owner->hiddenTextInput.get()]; #if JUCE_HAS_IOS_POINTER_SUPPORT if (@available (iOS 13.4, *)) @@ -522,9 +670,7 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; - (void) dealloc { - [hiddenTextView removeFromSuperview]; - [hiddenTextView release]; - + [owner->hiddenTextInput.get() removeFromSuperview]; displayLink = nullptr; [super dealloc]; @@ -623,18 +769,10 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; return owner != nullptr && owner->canBecomeKeyWindow(); } -- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text -{ - ignoreUnused (textView); - return owner->textViewReplaceCharacters (Range ((int) range.location, (int) (range.location + range.length)), - nsStringToJuce (text)); -} - - (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection { [super traitCollectionDidChange: previousTraitCollection]; - #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0 if (@available (iOS 12.0, *)) { const auto wasDarkModeActive = ([previousTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark); @@ -643,7 +781,6 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; [[NSNotificationCenter defaultCenter] postNotificationName: UIViewComponentPeer::getDarkModeNotificationName() object: nil]; } - #endif } - (BOOL) isAccessibilityElement @@ -689,6 +826,542 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; @end +/** see https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/LowerLevelText-HandlingTechnologies/LowerLevelText-HandlingTechnologies.html */ +@implementation JuceTextView + +- (TextInputTarget*) getTextInputTarget +{ + if (owner != nullptr) + return owner->findCurrentTextInputTarget(); + + return nullptr; +} + +- (instancetype) initWithOwner: (UIViewComponentPeer*) ownerIn +{ + [super init]; + owner = ownerIn; + delegate = nil; + + // The frame must have a finite size, otherwise some accessibility events will be ignored + self.frame = CGRectMake (0.0, 0.0, 1.0, 1.0); + return self; +} + +- (BOOL) canPerformAction: (SEL) action withSender: (id) sender +{ + if (auto* target = [self getTextInputTarget]) + { + if (action == @selector (paste:)) + { + if (@available (iOS 10, *)) + return [[UIPasteboard generalPasteboard] hasStrings]; + + return [[UIPasteboard generalPasteboard] string] != nil; + } + } + + return [super canPerformAction: action withSender: sender]; +} + +- (void) cut: (id) sender +{ + [self copy: sender]; + + if (auto* target = [self getTextInputTarget]) + { + if (delegate != nil) + [delegate textWillChange: self]; + + target->insertTextAtCaret (""); + + if (delegate != nil) + [delegate textDidChange: self]; + } +} + +- (void) copy: (id) sender +{ + if (auto* target = [self getTextInputTarget]) + [[UIPasteboard generalPasteboard] setString: juceStringToNS (target->getTextInRange (target->getHighlightedRegion()))]; +} + +- (void) paste: (id) sender +{ + if (auto* target = [self getTextInputTarget]) + { + if (auto* string = [[UIPasteboard generalPasteboard] string]) + { + if (delegate != nil) + [delegate textWillChange: self]; + + target->insertTextAtCaret (nsStringToJuce (string)); + + if (delegate != nil) + [delegate textDidChange: self]; + } + } +} + +- (void) selectAll: (id) sender +{ + if (auto* target = [self getTextInputTarget]) + target->setHighlightedRegion ({ 0, target->getTotalNumChars() }); +} + +- (void) deleteBackward +{ + auto* target = [self getTextInputTarget]; + + if (target == nullptr) + return; + + const auto range = target->getHighlightedRegion(); + const auto rangeToDelete = range.isEmpty() ? range.withStartAndLength (jmax (range.getStart() - 1, 0), + range.getStart() != 0 ? 1 : 0) + : range; + + target->setHighlightedRegion (rangeToDelete); + target->insertTextAtCaret (""); +} + +- (void) insertText: (NSString*) text +{ + if (owner == nullptr) + return; + + owner->stringBeingComposed.clear(); + + if (auto* target = owner->findCurrentTextInputTarget()) + target->insertTextAtCaret (nsStringToJuce (text)); +} + +- (BOOL) hasText +{ + if (auto* target = [self getTextInputTarget]) + return target->getTextInRange ({ 0, 1 }).isNotEmpty(); + + return NO; +} + +- (BOOL) accessibilityElementsHidden +{ + return NO; +} + +- (UITextRange*) selectedTextRangeForTarget: (TextInputTarget*) target +{ + if (target != nullptr) + return [JuceUITextRange withRange: target->getHighlightedRegion()]; + + return nil; +} + +- (UITextRange*) selectedTextRange +{ + return [self selectedTextRangeForTarget: [self getTextInputTarget]]; +} + +- (void) setSelectedTextRange: (JuceUITextRange*) range +{ + if (auto* target = [self getTextInputTarget]) + target->setHighlightedRegion (range != nil ? [range range] : Range()); +} + +- (UITextRange*) markedTextRange +{ + if (owner != nullptr && owner->stringBeingComposed.isNotEmpty()) + if (auto* target = owner->findCurrentTextInputTarget()) + return [JuceUITextRange withRange: target->getHighlightedRegion()]; + + return nil; +} + +- (void) setMarkedText: (NSString*) markedText + selectedRange: (NSRange) selectedRange +{ + ignoreUnused (selectedRange); + + if (owner == nullptr) + return; + + owner->stringBeingComposed = nsStringToJuce (markedText); + + auto* target = owner->findCurrentTextInputTarget(); + + if (target == nullptr) + return; + + const auto currentHighlight = target->getHighlightedRegion(); + target->insertTextAtCaret (owner->stringBeingComposed); + target->setHighlightedRegion (currentHighlight.withLength (0)); + target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length())); +} + +- (void) unmarkText +{ + if (owner == nullptr) + return; + + auto* target = owner->findCurrentTextInputTarget(); + + if (target == nullptr) + return; + + target->insertTextAtCaret (owner->stringBeingComposed); + owner->stringBeingComposed.clear(); +} + +- (NSDictionary*) markedTextStyle +{ + return nil; +} + +- (void) setMarkedTextStyle: (NSDictionary*) dict +{ +} + +- (UITextPosition*) beginningOfDocument +{ + return [JuceUITextPosition withIndex: 0]; +} + +- (UITextPosition*) endOfDocument +{ + if (auto* target = [self getTextInputTarget]) + return [JuceUITextPosition withIndex: target->getTotalNumChars()]; + + return [JuceUITextPosition withIndex: 0]; +} + +- (id) tokenizer +{ + return owner->tokenizer.get(); +} + +- (NSWritingDirection) baseWritingDirectionForPosition: (UITextPosition*) position + inDirection: (UITextStorageDirection) direction +{ + return NSWritingDirectionNatural; +} + +- (CGRect) caretRectForPosition: (JuceUITextPosition*) position +{ + if (position == nil) + return CGRectZero; + + // Currently we ignore the requested position and just return the text editor's caret position + if (auto* target = [self getTextInputTarget]) + { + if (auto* comp = dynamic_cast (target)) + { + const auto areaOnDesktop = comp->localAreaToGlobal (target->getCaretRectangle()); + return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop)); + } + } + + return CGRectZero; +} + +- (UITextRange*) characterRangeByExtendingPosition: (JuceUITextPosition*) position + inDirection: (UITextLayoutDirection) direction +{ + const auto newPosition = [self indexFromPosition: position inDirection: direction offset: 1]; + return [JuceUITextRange from: position->index to: newPosition]; +} + +- (int) closestIndexToPoint: (CGPoint) point +{ + if (auto* target = [self getTextInputTarget]) + { + if (auto* comp = dynamic_cast (target)) + { + const auto pointOnDesktop = ScalingHelpers::unscaledScreenPosToScaled (convertToPointFloat (point)); + return target->getCharIndexForPoint (comp->getLocalPoint (nullptr, pointOnDesktop).roundToInt()); + } + } + + return -1; +} + +- (UITextRange*) characterRangeAtPoint: (CGPoint) point +{ + const auto index = [self closestIndexToPoint: point]; + const auto result = index != -1 ? [JuceUITextRange from: index to: index] : nil; + jassert (result != nullptr); + return result; +} + +- (UITextPosition*) closestPositionToPoint: (CGPoint) point +{ + const auto index = [self closestIndexToPoint: point]; + const auto result = index != -1 ? [JuceUITextPosition withIndex: index] : nil; + jassert (result != nullptr); + return result; +} + +- (UITextPosition*) closestPositionToPoint: (CGPoint) point + withinRange: (JuceUITextRange*) range +{ + const auto index = [self closestIndexToPoint: point]; + const auto result = index != -1 ? [JuceUITextPosition withIndex: [range range].clipValue (index)] : nil; + jassert (result != nullptr); + return result; +} + +- (NSComparisonResult) comparePosition: (JuceUITextPosition*) position + toPosition: (JuceUITextPosition*) other +{ + const auto a = position != nil ? makeOptional (position->index) : nullopt; + const auto b = other != nil ? makeOptional (other ->index) : nullopt; + + if (a < b) + return NSOrderedAscending; + + if (b < a) + return NSOrderedDescending; + + return NSOrderedSame; +} + +- (NSInteger) offsetFromPosition: (JuceUITextPosition*) from + toPosition: (JuceUITextPosition*) toPosition +{ + if (from != nil && toPosition != nil) + return toPosition->index - from->index; + + return 0; +} + +- (int) indexFromPosition: (JuceUITextPosition*) position + inDirection: (UITextLayoutDirection) direction + offset: (NSInteger) offset +{ + switch (direction) + { + case UITextLayoutDirectionLeft: + case UITextLayoutDirectionRight: + return position->index + (int) (offset * (direction == UITextLayoutDirectionLeft ? -1 : 1)); + + case UITextLayoutDirectionUp: + case UITextLayoutDirectionDown: + { + if (auto* target = [self getTextInputTarget]) + { + const auto originalRectangle = target->getCaretRectangleForCharIndex (position->index); + + auto testIndex = position->index; + + for (auto lineOffset = 0; lineOffset < offset; ++lineOffset) + { + const auto caretRect = target->getCaretRectangleForCharIndex (testIndex); + const auto newY = direction == UITextLayoutDirectionUp ? caretRect.getY() - 1 + : caretRect.getBottom() + 1; + testIndex = target->getCharIndexForPoint ({ originalRectangle.getX(), newY }); + } + + return testIndex; + } + } + } + + return position->index; +} + +- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position + inDirection: (UITextLayoutDirection) direction + offset: (NSInteger) offset +{ + return [JuceUITextPosition withIndex: [self indexFromPosition: position inDirection: direction offset: offset]]; +} + +- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position + offset: (NSInteger) offset +{ + if (position != nil) + { + if (auto* target = [self getTextInputTarget]) + { + const auto newIndex = position->index + (int) offset; + + if (isPositiveAndBelow (newIndex, target->getTotalNumChars() + 1)) + return [JuceUITextPosition withIndex: newIndex]; + } + } + + return nil; +} + +- (CGRect) firstRectForRange: (JuceUITextRange*) range +{ + if (auto* target = [self getTextInputTarget]) + { + if (auto* comp = dynamic_cast (target)) + { + const auto list = target->getTextBounds ([range range]); + + if (! list.isEmpty()) + { + const auto areaOnDesktop = comp->localAreaToGlobal (list.getRectangle (0)); + return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop)); + } + } + } + + return {}; +} + +- (NSArray*) selectionRectsForRange: (JuceUITextRange*) range +{ + if (auto* target = [self getTextInputTarget]) + { + if (auto* comp = dynamic_cast (target)) + { + const auto list = target->getTextBounds ([range range]); + + auto* result = [NSMutableArray arrayWithCapacity: (NSUInteger) list.getNumRectangles()]; + + for (const auto& rect : list) + { + const auto areaOnDesktop = comp->localAreaToGlobal (rect); + const auto nativeArea = convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop)); + + [result addObject: [JuceUITextSelectionRect withRect: nativeArea]]; + } + + return result; + } + } + + return nil; +} + +- (UITextPosition*) positionWithinRange: (JuceUITextRange*) range + farthestInDirection: (UITextLayoutDirection) direction +{ + return direction == UITextLayoutDirectionUp || direction == UITextLayoutDirectionLeft + ? [range start] + : [range end]; +} + +- (void) replaceRange: (JuceUITextRange*) range + withText: (NSString*) text +{ + if (owner == nullptr) + return; + + owner->stringBeingComposed.clear(); + + if (auto* target = owner->findCurrentTextInputTarget()) + { + target->setHighlightedRegion ([range range]); + target->insertTextAtCaret (nsStringToJuce (text)); + } +} + +- (void) setBaseWritingDirection: (NSWritingDirection) writingDirection + forRange: (UITextRange*) range +{ +} + +- (NSString*) textInRange: (JuceUITextRange*) range +{ + if (auto* target = [self getTextInputTarget]) + return juceStringToNS (target->getTextInRange ([range range])); + + return nil; +} + +- (UITextRange*) textRangeFromPosition: (JuceUITextPosition*) fromPosition + toPosition: (JuceUITextPosition*) toPosition +{ + const auto from = fromPosition != nil ? fromPosition->index : 0; + const auto to = toPosition != nil ? toPosition ->index : 0; + + return [JuceUITextRange withRange: Range::between (from, to)]; +} + +- (void) setInputDelegate: (id) delegateIn +{ + delegate = delegateIn; +} + +- (id) inputDelegate +{ + return delegate; +} + +- (UIKeyboardType) keyboardType +{ + if (auto* target = [self getTextInputTarget]) + return UIViewComponentPeer::getUIKeyboardType (target->getKeyboardType()); + + return UIKeyboardTypeDefault; +} + +- (UITextAutocapitalizationType) autocapitalizationType +{ + return UITextAutocapitalizationTypeNone; +} + +- (UITextAutocorrectionType) autocorrectionType +{ + return UITextAutocorrectionTypeNo; +} + +- (BOOL) canBecomeFirstResponder +{ + return YES; +} + +@end + +//============================================================================== +@implementation JuceTextInputTokenizer + +- (instancetype) initWithPeer: (UIViewComponentPeer*) peerIn +{ + [super initWithTextInput: peerIn->hiddenTextInput.get()]; + peer = peerIn; + return self; +} + +- (UITextRange*) rangeEnclosingPosition: (JuceUITextPosition*) position + withGranularity: (UITextGranularity) granularity + inDirection: (UITextDirection) direction +{ + if (granularity != UITextGranularityLine) + return [super rangeEnclosingPosition: position withGranularity: granularity inDirection: direction]; + + auto* target = peer->findCurrentTextInputTarget(); + + if (target == nullptr) + return nullptr; + + const auto numChars = target->getTotalNumChars(); + + if (! isPositiveAndBelow (position->index, numChars)) + return nullptr; + + const auto allText = target->getTextInRange ({ 0, numChars }); + + const auto begin = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.begin()); + const auto end = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.end()); + const auto positionIter = begin + position->index; + + const auto nextNewlineIter = std::find (positionIter, end, '\n'); + const auto lastNewlineIter = std::find (std::make_reverse_iterator (positionIter), + std::make_reverse_iterator (begin), + '\n').base(); + + const auto from = std::distance (begin, lastNewlineIter); + const auto to = std::distance (begin, nextNewlineIter); + + return [JuceUITextRange from: from to: to]; +} + +@end + //============================================================================== //============================================================================== namespace juce @@ -718,7 +1391,7 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags, #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (iOS 13, *)) - metalRenderer = std::make_unique> (view, comp); + metalRenderer = std::make_unique> (view, comp.isOpaque()); #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) @@ -975,6 +1648,9 @@ static float getTouchForce (UITouch* touch) noexcept void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEventFlags) { + if (event == nullptr) + return; + NSArray* touches = [[event touchesForView: view] allObjects]; for (unsigned int i = 0; i < [touches count]; ++i) @@ -1126,41 +1802,27 @@ void UIViewComponentPeer::grabFocus() } } -void UIViewComponentPeer::textInputRequired (Point pos, TextInputTarget& target) -{ - view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0); - - updateHiddenTextContent (target); - [view->hiddenTextView becomeFirstResponder]; -} - -void UIViewComponentPeer::dismissPendingTextInput() +void UIViewComponentPeer::textInputRequired (Point, TextInputTarget&) { - closeInputMethodContext(); - [view->hiddenTextView resignFirstResponder]; + [hiddenTextInput.get() becomeFirstResponder]; } -static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept +void UIViewComponentPeer::closeInputMethodContext() { - switch (type) + if (auto* input = hiddenTextInput.get()) { - case TextInputTarget::textKeyboard: return UIKeyboardTypeAlphabet; - case TextInputTarget::numericKeyboard: return UIKeyboardTypeNumbersAndPunctuation; - case TextInputTarget::decimalKeyboard: return UIKeyboardTypeNumbersAndPunctuation; - case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL; - case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress; - case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad; - default: jassertfalse; break; + if (auto* delegate = [input inputDelegate]) + { + [delegate selectionWillChange: input]; + [delegate selectionDidChange: input]; + } } - - return UIKeyboardTypeDefault; } -void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget& target) +void UIViewComponentPeer::dismissPendingTextInput() { - view->hiddenTextView.keyboardType = getUIKeyboardType (target.getKeyboardType()); - view->hiddenTextView.text = juceStringToNS (target.getTextInRange (Range (0, target.getHighlightedRegion().getStart()))); - view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target.getHighlightedRegion().getStart(), 0); + closeInputMethodContext(); + [hiddenTextInput.get() resignFirstResponder]; } BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const String& text) @@ -1179,9 +1841,6 @@ BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const Str handleKeyPress (KeyPress::returnKey, text[0]); else target->insertTextAtCaret (text); - - if (deletionChecker != nullptr) - updateHiddenTextContent (*target); } return NO; @@ -1198,8 +1857,6 @@ void UIViewComponentPeer::displayLinkCallback() if (metalRenderer != nullptr) return metalRenderer->drawRectangleList (view, (float) view.contentScaleFactor, - view.frame, - component, [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, deferredRepaints); diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm index 434b39e6..4b254a46 100644 --- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -37,7 +37,7 @@ namespace juce Array appBecomingInactiveCallbacks; } -#if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +#if JUCE_PUSH_NOTIFICATIONS @interface JuceAppStartupDelegate : NSObject #else @interface JuceAppStartupDelegate : NSObject @@ -59,27 +59,47 @@ namespace juce completionHandler: (void (^)(void)) completionHandler; - (void) applicationDidReceiveMemoryWarning: (UIApplication *) application; #if JUCE_PUSH_NOTIFICATIONS -- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings; -- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken; -- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error; -- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo; -- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo - fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler; -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo - completionHandler: (void(^)()) completionHandler; -- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification; -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler; -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo - completionHandler: (void(^)()) completionHandler; -#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification + +- (void) application: (UIApplication*) application + didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken; +- (void) application: (UIApplication*) application + didFailToRegisterForRemoteNotificationsWithError: (NSError*) error; +- (void) application: (UIApplication*) application + didReceiveRemoteNotification: (NSDictionary*) userInfo; +- (void) application: (UIApplication*) application + didReceiveRemoteNotification: (NSDictionary*) userInfo + fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler; +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forRemoteNotification: (NSDictionary*) userInfo + withResponseInfo: (NSDictionary*) responseInfo + completionHandler: (void(^)()) completionHandler; + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + +- (void) application: (UIApplication*) application + didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings; +- (void) application: (UIApplication*) application + didReceiveLocalNotification: (UILocalNotification*) notification; +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forLocalNotification: (UILocalNotification*) notification + completionHandler: (void(^)()) completionHandler; +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forLocalNotification: (UILocalNotification*) notification + withResponseInfo: (NSDictionary*) responseInfo + completionHandler: (void(^)()) completionHandler; + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +- (void) userNotificationCenter: (UNUserNotificationCenter*) center + willPresentNotification: (UNNotification*) notification withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler; -- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response +- (void) userNotificationCenter: (UNUserNotificationCenter*) center + didReceiveNotificationResponse: (UNNotificationResponse*) response withCompletionHandler: (void(^)())completionHandler; -#endif + #endif @end @@ -93,7 +113,7 @@ namespace juce self = [super init]; appSuspendTask = UIBackgroundTaskInvalid; - #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + #if JUCE_PUSH_NOTIFICATIONS [UNUserNotificationCenter currentNotificationCenter].delegate = self; #endif @@ -194,25 +214,9 @@ namespace juce } #if JUCE_PUSH_NOTIFICATIONS -- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings -{ - ignoreUnused (application); - SEL selector = @selector (application:didRegisterUserNotificationSettings:); - - if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector]) - { - NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]]; - [invocation setSelector: selector]; - [invocation setTarget: _pushNotificationsDelegate]; - [invocation setArgument: &application atIndex:2]; - [invocation setArgument: ¬ificationSettings atIndex:3]; - - [invocation invoke]; - } -} - -- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken +- (void) application: (UIApplication*) application + didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken { ignoreUnused (application); @@ -230,7 +234,8 @@ namespace juce } } -- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error +- (void) application: (UIApplication*) application + didFailToRegisterForRemoteNotificationsWithError: (NSError*) error { ignoreUnused (application); @@ -248,7 +253,8 @@ namespace juce } } -- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo +- (void) application: (UIApplication*) application + didReceiveRemoteNotification: (NSDictionary*) userInfo { ignoreUnused (application); @@ -266,8 +272,9 @@ namespace juce } } -- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo - fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler +- (void) application: (UIApplication*) application + didReceiveRemoteNotification: (NSDictionary*) userInfo + fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler { ignoreUnused (application); @@ -286,9 +293,11 @@ namespace juce } } -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo - completionHandler: (void(^)()) completionHandler +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forRemoteNotification: (NSDictionary*) userInfo + withResponseInfo: (NSDictionary*) responseInfo + completionHandler: (void(^)()) completionHandler { ignoreUnused (application); @@ -309,7 +318,29 @@ namespace juce } } -- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + +- (void) application: (UIApplication*) application + didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings +{ + ignoreUnused (application); + + SEL selector = @selector (application:didRegisterUserNotificationSettings:); + + if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector:selector]) + { + NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]]; + [invocation setSelector: selector]; + [invocation setTarget: _pushNotificationsDelegate]; + [invocation setArgument: &application atIndex: 2]; + [invocation setArgument: ¬ificationSettings atIndex: 3]; + + [invocation invoke]; + } +} + +- (void) application: (UIApplication*) application + didReceiveLocalNotification: (UILocalNotification*) notification { ignoreUnused (application); @@ -320,15 +351,17 @@ namespace juce NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]]; [invocation setSelector: selector]; [invocation setTarget: _pushNotificationsDelegate]; - [invocation setArgument: &application atIndex:2]; - [invocation setArgument: ¬ification atIndex:3]; + [invocation setArgument: &application atIndex: 2]; + [invocation setArgument: ¬ification atIndex: 3]; [invocation invoke]; } } -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forLocalNotification: (UILocalNotification*) notification + completionHandler: (void(^)()) completionHandler { ignoreUnused (application); @@ -348,9 +381,11 @@ namespace juce } } -- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier - forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo - completionHandler: (void(^)()) completionHandler +- (void) application: (UIApplication*) application + handleActionWithIdentifier: (NSString*) identifier + forLocalNotification: (UILocalNotification*) notification + withResponseInfo: (NSDictionary*) responseInfo + completionHandler: (void(^)()) completionHandler { ignoreUnused (application); @@ -371,9 +406,11 @@ namespace juce } } -#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification - withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +- (void) userNotificationCenter: (UNUserNotificationCenter*) center + willPresentNotification: (UNNotification*) notification + withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler { ignoreUnused (center); @@ -392,8 +429,9 @@ namespace juce } } -- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response - withCompletionHandler: (void(^)()) completionHandler +- (void) userNotificationCenter: (UNUserNotificationCenter*) center + didReceiveNotificationResponse: (UNNotificationResponse*) response + withCompletionHandler: (void(^)()) completionHandler { ignoreUnused (center); @@ -412,7 +450,6 @@ namespace juce } } #endif -#endif @end @@ -695,42 +732,24 @@ bool Desktop::canUseSemiTransparentWindows() noexcept bool Desktop::isDarkModeActive() const { - #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0 if (@available (iOS 12.0, *)) return [[[UIScreen mainScreen] traitCollection] userInterfaceStyle] == UIUserInterfaceStyleDark; - #endif return false; } +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") +static const auto darkModeSelector = @selector (darkModeChanged:); +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + class Desktop::NativeDarkModeChangeDetectorImpl { public: NativeDarkModeChangeDetectorImpl() { static DelegateClass delegateClass; - - delegate = [delegateClass.createInstance() init]; - object_setInstanceVariable (delegate, "owner", this); - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") - [[NSNotificationCenter defaultCenter] addObserver: delegate - selector: @selector (darkModeChanged:) - name: UIViewComponentPeer::getDarkModeNotificationName() - object: nil]; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - } - - ~NativeDarkModeChangeDetectorImpl() - { - object_setInstanceVariable (delegate, "owner", nullptr); - [[NSNotificationCenter defaultCenter] removeObserver: delegate]; - [delegate release]; - } - - void darkModeChanged() - { - Desktop::getInstance().darkModeChanged(); + delegate.reset ([delegateClass.createInstance() init]); + observer.emplace (delegate.get(), darkModeSelector, UIViewComponentPeer::getDarkModeNotificationName(), nil); } private: @@ -738,23 +757,13 @@ private: { DelegateClass() : ObjCClass ("JUCEDelegate_") { - addIvar ("owner"); - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") - addMethod (@selector (darkModeChanged:), darkModeChanged); - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - + addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); }); registerClass(); } - - static void darkModeChanged (id self, SEL, NSNotification*) - { - if (auto* owner = getIvar (self, "owner")) - owner->darkModeChanged(); - } }; - id delegate = nil; + NSUniquePtr delegate; + Optional observer; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl) }; @@ -764,6 +773,7 @@ std::unique_ptr Desktop::createNative return std::make_unique(); } +//============================================================================== Point MouseInputSource::getCurrentRawMousePosition() { return juce_lastMousePos; @@ -786,6 +796,24 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const return Orientations::convertToJuce (orientation); } +template +static BorderSize operator/ (BorderSize border, Value scale) +{ + return { border.getTop() / scale, + border.getLeft() / scale, + border.getBottom() / scale, + border.getRight() / scale }; +} + +template +static BorderSize roundToInt (BorderSize border) +{ + return { roundToInt (border.getTop()), + roundToInt (border.getLeft()), + roundToInt (border.getBottom()), + roundToInt (border.getRight()) }; +} + // The most straightforward way of retrieving the screen area available to an iOS app // seems to be to create a new window (which will take up all available space) and to // query its frame. @@ -802,17 +830,14 @@ static Rectangle getRecommendedWindowBounds() static BorderSize getSafeAreaInsets (float masterScale) { - #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 if (@available (iOS 11.0, *)) { UIEdgeInsets safeInsets = TemporaryWindow().window.safeAreaInsets; - - auto getInset = [&] (CGFloat original) { return roundToInt (original / masterScale); }; - - return { getInset (safeInsets.top), getInset (safeInsets.left), - getInset (safeInsets.bottom), getInset (safeInsets.right) }; + return roundToInt (BorderSize { safeInsets.top, + safeInsets.left, + safeInsets.bottom, + safeInsets.right } / (double) masterScale); } - #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") auto statusBarSize = [UIApplication sharedApplication].statusBarFrame.size; @@ -823,16 +848,102 @@ static BorderSize getSafeAreaInsets (float masterScale) return { roundToInt (statusBarHeight / masterScale), 0, 0, 0 }; } +//============================================================================== void Displays::findDisplays (float masterScale) { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") + static const auto keyboardShownSelector = @selector (keyboardShown:); + static const auto keyboardHiddenSelector = @selector (keyboardHidden:); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + class OnScreenKeyboardChangeDetectorImpl + { + public: + OnScreenKeyboardChangeDetectorImpl() + { + static DelegateClass delegateClass; + delegate.reset ([delegateClass.createInstance() init]); + object_setInstanceVariable (delegate.get(), "owner", this); + observers.emplace_back (delegate.get(), keyboardShownSelector, UIKeyboardDidShowNotification, nil); + observers.emplace_back (delegate.get(), keyboardHiddenSelector, UIKeyboardDidHideNotification, nil); + } + + auto getInsets() const { return insets; } + + private: + struct DelegateClass : public ObjCClass + { + DelegateClass() : ObjCClass ("JUCEOnScreenKeyboardObserver_") + { + addIvar ("owner"); + + addMethod (keyboardShownSelector, [] (id self, SEL, NSNotification* notification) + { + setKeyboardScreenBounds (self, [&]() -> BorderSize + { + auto* info = [notification userInfo]; + + if (info == nullptr) + return {}; + + auto* value = static_cast ([info objectForKey: UIKeyboardFrameEndUserInfoKey]); + + if (value == nullptr) + return {}; + + auto* display = getPrimaryDisplayImpl (Desktop::getInstance().getDisplays()); + + if (display == nullptr) + return {}; + + const auto rect = convertToRectInt ([value CGRectValue]); + + BorderSize result; + + if (rect.getY() == display->totalArea.getY()) + result.setTop (rect.getHeight()); + + if (rect.getBottom() == display->totalArea.getBottom()) + result.setBottom (rect.getHeight()); + + return result; + }()); + }); + + addMethod (keyboardHiddenSelector, [] (id self, SEL, NSNotification*) + { + setKeyboardScreenBounds (self, {}); + }); + + registerClass(); + } + + private: + static void setKeyboardScreenBounds (id self, BorderSize insets) + { + if (std::exchange (getIvar (self, "owner")->insets, insets) != insets) + Desktop::getInstance().displays->refresh(); + } + }; + + BorderSize insets; + NSUniquePtr delegate; + std::vector observers; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OnScreenKeyboardChangeDetectorImpl) + }; + JUCE_AUTORELEASEPOOL { + static OnScreenKeyboardChangeDetectorImpl keyboardChangeDetector; + UIScreen* s = [UIScreen mainScreen]; Display d; d.totalArea = convertToRectInt ([s bounds]) / masterScale; d.userArea = getRecommendedWindowBounds() / masterScale; d.safeAreaInsets = getSafeAreaInsets (masterScale); + d.keyboardInsets = roundToInt (keyboardChangeDetector.getInsets() / (double) masterScale); d.isMain = true; d.scale = masterScale * s.scale; d.dpi = 160 * d.scale; diff --git a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h index f09f2931..791379c7 100644 --- a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h +++ b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h @@ -35,12 +35,12 @@ class CoreGraphicsMetalLayerRenderer { public: //============================================================================== - CoreGraphicsMetalLayerRenderer (ViewType* view, const Component& comp) + CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque) { device.reset (MTLCreateSystemDefaultDevice()); commandQueue.reset ([device.get() newCommandQueue]); - attach (view, comp); + attach (view, isOpaque); } ~CoreGraphicsMetalLayerRenderer() @@ -52,7 +52,7 @@ public: } } - void attach (ViewType* view, const Component& comp) + void attach (ViewType* view, bool isOpaque) { #if JUCE_MAC view.wantsLayer = YES; @@ -65,7 +65,7 @@ public: layer.device = device.get(); layer.framebufferOnly = NO; layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - layer.opaque = comp.isOpaque(); + layer.opaque = isOpaque; layer.allowsNextDrawableTimeout = NO; attachedView = view; @@ -90,8 +90,6 @@ public: template bool drawRectangleList (ViewType* view, float scaleFactor, - CGRect viewFrame, - const Component& comp, Callback&& drawRectWithContext, const RectangleList& dirtyRegions) { @@ -117,14 +115,12 @@ public: layer.contentsScale = scaleFactor; const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale, layer.contentsScale); - const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform); - - const auto componentHeight = comp.getHeight(); + const auto transformedFrameSize = CGSizeApplyAffineTransform (view.frame.size, drawableSizeTansform); if (resources == nullptr || ! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize)) { layer.drawableSize = transformedFrameSize; - resources = std::make_unique (device.get(), layer, componentHeight); + resources = std::make_unique (device.get(), layer); } auto gpuTexture = resources->getGpuTexture(); @@ -261,7 +257,7 @@ private: class Resources { public: - Resources (id metalDevice, CAMetalLayer* layer, int componentHeight) + Resources (id metalDevice, CAMetalLayer* layer) { const auto bytesPerRow = alignTo ((size_t) layer.drawableSize.width * 4, 256); @@ -301,8 +297,8 @@ private: CGColorSpaceCreateWithName (kCGColorSpaceSRGB), (uint32_t) kCGImageAlphaPremultipliedFirst | (uint32_t) kCGBitmapByteOrder32Host)); - CGContextScaleCTM (cgContext.get(), layer.contentsScale, layer.contentsScale); - CGContextConcatCTM (cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight)); + CGContextTranslateCTM (cgContext.get(), 0, layer.drawableSize.height); + CGContextScaleCTM (cgContext.get(), layer.contentsScale, -layer.contentsScale); textureDesc.storageMode = MTLStorageModePrivate; gpuTexturePool = std::make_unique (metalDevice, textureDesc); diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index 38f89b78..c77a92a9 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -293,11 +293,7 @@ public: [item setTag: topLevelIndex]; [item setEnabled: i.isEnabled]; - #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 [item setState: i.isTicked ? NSControlStateValueOn : NSControlStateValueOff]; - #else - [item setState: i.isTicked ? NSOnState : NSOffState]; - #endif [item setTarget: (id) callback]; auto* juceItem = new PopupMenu::Item (i); @@ -459,10 +455,7 @@ private: { addMethod (menuItemInvokedSelector, menuItemInvoked); addMethod (@selector (validateMenuItem:), validateMenuItem); - - #if defined (MAC_OS_X_VERSION_10_14) addProtocol (@protocol (NSMenuItemValidation)); - #endif registerClass(); } @@ -556,10 +549,7 @@ private: addMethod (@selector (validateMenuItem:), validateMenuItem); addProtocol (@protocol (NSMenuDelegate)); - - #if defined (MAC_OS_X_VERSION_10_14) addProtocol (@protocol (NSMenuItemValidation)); - #endif registerClass(); } diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 5d15acf6..2047f6f9 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -144,19 +144,14 @@ public: resetTrackingArea (view); - notificationCenter = [NSNotificationCenter defaultCenter]; - - [notificationCenter addObserver: view - selector: frameChangedSelector - name: NSViewFrameDidChangeNotification - object: view]; + scopedObservers.emplace_back (view, frameChangedSelector, NSViewFrameDidChangeNotification, view); [view setPostsFrameChangedNotifications: YES]; #if USE_COREGRAPHICS_RENDERING #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (macOS 10.14, *)) - metalRenderer = std::make_unique> (view, getComponent()); + metalRenderer = std::make_unique> (view, getComponent().isOpaque()); #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) { @@ -220,30 +215,13 @@ public: [window setRestorable: NO]; - #if defined (MAC_OS_X_VERSION_10_12) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12) if (@available (macOS 10.12, *)) [window setTabbingMode: NSWindowTabbingModeDisallowed]; - #endif - [notificationCenter addObserver: view - selector: frameChangedSelector - name: NSWindowDidMoveNotification - object: window]; - - [notificationCenter addObserver: view - selector: frameChangedSelector - name: NSWindowDidMiniaturizeNotification - object: window]; - - [notificationCenter addObserver: view - selector: @selector (windowWillMiniaturize:) - name: NSWindowWillMiniaturizeNotification - object: window]; - - [notificationCenter addObserver: view - selector: @selector (windowDidDeminiaturize:) - name: NSWindowDidDeminiaturizeNotification - object: window]; + scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMoveNotification, window); + scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMiniaturizeNotification, window); + scopedObservers.emplace_back (view, @selector (windowWillMiniaturize:), NSWindowWillMiniaturizeNotification, window); + scopedObservers.emplace_back (view, @selector (windowDidMiniaturize:), NSWindowDidMiniaturizeNotification, window); } auto alpha = component.getAlpha(); @@ -267,7 +245,8 @@ public: CVDisplayLinkStop (displayLink); dispatch_source_cancel (displaySource); - [notificationCenter removeObserver: view]; + scopedObservers.clear(); + setOwner (view, nullptr); if ([view superview] != nil) @@ -797,24 +776,7 @@ public: void redirectWillMoveToWindow (NSWindow* newWindow) { - if (auto* currentWindow = [view window]) - { - [notificationCenter removeObserver: view - name: NSWindowDidMoveNotification - object: currentWindow]; - - [notificationCenter removeObserver: view - name: NSWindowWillMiniaturizeNotification - object: currentWindow]; - - [notificationCenter removeObserver: view - name: NSWindowDidBecomeKeyNotification - object: currentWindow]; - - [notificationCenter removeObserver: view - name: NSWindowDidChangeScreenNotification - object: currentWindow]; - } + windowObservers.clear(); if (isSharedWindow && [view window] == window && newWindow == nullptr) { @@ -1085,7 +1047,11 @@ public: if (metalRenderer != nullptr) { - const auto compBounds = getComponent().getLocalBounds().toFloat(); + auto setDeferredRepaintsToWholeFrame = [this] + { + const auto frameSize = view.frame.size; + deferredRepaints = Rectangle { (float) frameSize.width, (float) frameSize.height }; + }; // If we are resizing we need to fall back to synchronous drawing to avoid artefacts if ([window inLiveResize] || numFramesToSkipMetalRenderer > 0) @@ -1093,7 +1059,7 @@ public: if (metalRenderer->isAttachedToView (view)) { metalRenderer->detach(); - deferredRepaints = compBounds; + setDeferredRepaintsToWholeFrame(); } if (numFramesToSkipMetalRenderer > 0) @@ -1103,8 +1069,8 @@ public: { if (! metalRenderer->isAttachedToView (view)) { - metalRenderer->attach (view, getComponent()); - deferredRepaints = compBounds; + metalRenderer->attach (view, getComponent().isOpaque()); + setDeferredRepaintsToWholeFrame(); } } } @@ -1114,8 +1080,6 @@ public: if (metalRenderer != nullptr && metalRenderer->isAttachedToView (view)) return metalRenderer->drawRectangleList (view, (float) [[view window] backingScaleFactor], - view.frame, - getComponent(), [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, deferredRepaints); @@ -1256,30 +1220,11 @@ public: if (auto* currentWindow = [view window]) { - [notificationCenter addObserver: view - selector: dismissModalsSelector - name: NSWindowWillMoveNotification - object: currentWindow]; - - [notificationCenter addObserver: view - selector: dismissModalsSelector - name: NSWindowWillMiniaturizeNotification - object: currentWindow]; - - [notificationCenter addObserver: view - selector: becomeKeySelector - name: NSWindowDidBecomeKeyNotification - object: currentWindow]; - - [notificationCenter addObserver: view - selector: resignKeySelector - name: NSWindowDidResignKeyNotification - object: currentWindow]; - - [notificationCenter addObserver: view - selector: @selector (windowDidChangeScreen:) - name: NSWindowDidChangeScreenNotification - object: currentWindow]; + windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMoveNotification, currentWindow); + windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMiniaturizeNotification, currentWindow); + windowObservers.emplace_back (view, becomeKeySelector, NSWindowDidBecomeKeyNotification, currentWindow); + windowObservers.emplace_back (view, resignKeySelector, NSWindowDidResignKeyNotification, currentWindow); + windowObservers.emplace_back (view, @selector (windowDidChangeScreen:), NSWindowDidChangeScreenNotification, currentWindow); updateCVDisplayLinkScreen(); } @@ -1493,10 +1438,8 @@ public: { const auto type = [] { - #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 if (@available (macOS 10.13, *)) return NSPasteboardTypeFileURL; - #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") return (NSString*) kUTTypeFileURL; @@ -1628,11 +1571,10 @@ public: void resetWindowPresentation() { + [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))]; + if (hasNativeTitleBar()) - { - [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))]; setTitle (getComponent().getName()); // required to force the OS to update the title - } [NSApp setPresentationOptions: NSApplicationPresentationDefault]; setCollectionBehaviour (isFullScreen()); @@ -1659,7 +1601,6 @@ public: bool windowRepresentsFile = false; bool isAlwaysOnTop = false, wasAlwaysOnTop = false; String stringBeingComposed; - NSNotificationCenter* notificationCenter = nil; Rectangle lastSizeBeforeZoom; RectangleList deferredRepaints; @@ -1788,15 +1729,11 @@ private: #if JUCE_64BIT case NSEventTypeSmartMagnify: case NSEventTypePressure: - #endif - #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 - #if JUCE_64BIT case NSEventTypeDirectTouch: #endif #if defined (MAC_OS_X_VERSION_10_15) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_15 case NSEventTypeChangeMode: #endif - #endif default: return false; } @@ -1892,6 +1829,9 @@ private: int numFramesToSkipMetalRenderer = 0; std::unique_ptr> metalRenderer; + std::vector scopedObservers; + std::vector windowObservers; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NSViewComponentPeer) }; @@ -1935,454 +1875,341 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> { JuceNSViewClass() : NSViewComponentPeerWrapper ("JUCEView_") { - addMethod (@selector (isOpaque), isOpaque); - addMethod (@selector (drawRect:), drawRect); - addMethod (@selector (updateTrackingAreas), updateTrackingAreas); - addMethod (@selector (mouseDown:), mouseDown); - addMethod (@selector (mouseUp:), mouseUp); - addMethod (@selector (mouseDragged:), mouseDragged); - addMethod (@selector (mouseMoved:), mouseMoved); - addMethod (@selector (mouseEntered:), mouseEntered); - addMethod (@selector (mouseExited:), mouseExited); - addMethod (@selector (rightMouseDown:), mouseDown); - addMethod (@selector (rightMouseDragged:), mouseDragged); - addMethod (@selector (rightMouseUp:), mouseUp); - addMethod (@selector (otherMouseDown:), mouseDown); - addMethod (@selector (otherMouseDragged:), mouseDragged); - addMethod (@selector (otherMouseUp:), mouseUp); - addMethod (@selector (scrollWheel:), scrollWheel); - addMethod (@selector (magnifyWithEvent:), magnify); - addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse); - addMethod (@selector (windowWillMiniaturize:), windowWillMiniaturize); - addMethod (@selector (windowDidDeminiaturize:), windowDidDeminiaturize); - addMethod (@selector (windowDidChangeScreen:), windowDidChangeScreen); - addMethod (@selector (wantsDefaultClipping), wantsDefaultClipping); - addMethod (@selector (worksWhenModal), worksWhenModal); - addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow); - addMethod (@selector (viewWillDraw), viewWillDraw); - addMethod (@selector (keyDown:), keyDown); - addMethod (@selector (keyUp:), keyUp); - addMethod (@selector (insertText:), insertText); - addMethod (@selector (doCommandBySelector:), doCommandBySelector); - addMethod (@selector (setMarkedText:selectedRange:), setMarkedText); - addMethod (@selector (unmarkText), unmarkText); - addMethod (@selector (hasMarkedText), hasMarkedText); - addMethod (@selector (conversationIdentifier), conversationIdentifier); - addMethod (@selector (attributedSubstringFromRange:), attributedSubstringFromRange); - addMethod (@selector (markedRange), markedRange); - addMethod (@selector (selectedRange), selectedRange); - addMethod (@selector (firstRectForCharacterRange:), firstRectForCharacterRange); - addMethod (@selector (characterIndexForPoint:), characterIndexForPoint); - addMethod (@selector (validAttributesForMarkedText), validAttributesForMarkedText); - addMethod (@selector (flagsChanged:), flagsChanged); - - addMethod (@selector (becomeFirstResponder), becomeFirstResponder); - addMethod (@selector (resignFirstResponder), resignFirstResponder); - addMethod (@selector (acceptsFirstResponder), acceptsFirstResponder); - - addMethod (@selector (draggingEntered:), draggingEntered); - addMethod (@selector (draggingUpdated:), draggingUpdated); - addMethod (@selector (draggingEnded:), draggingEnded); - addMethod (@selector (draggingExited:), draggingExited); - addMethod (@selector (prepareForDragOperation:), prepareForDragOperation); - addMethod (@selector (performDragOperation:), performDragOperation); - addMethod (@selector (concludeDragOperation:), concludeDragOperation); - - addMethod (@selector (paste:), paste); - addMethod (@selector (copy:), copy); - addMethod (@selector (cut:), cut); - addMethod (@selector (selectAll:), selectAll); - - addMethod (@selector (viewWillMoveToWindow:), willMoveToWindow); - - addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement); - addMethod (@selector (accessibilityChildren), getAccessibilityChildren); - addMethod (@selector (accessibilityHitTest:), accessibilityHitTest); - addMethod (@selector (accessibilityFocusedUIElement), getAccessibilityFocusedUIElement); + addMethod (@selector (isOpaque), [] (id self, SEL) + { + auto* owner = getOwner (self); + return owner == nullptr || owner->getComponent().isOpaque(); + }); - // deprecated methods required for backwards compatibility - addMethod (@selector (accessibilityIsIgnored), getAccessibilityIsIgnored); - addMethod (@selector (accessibilityAttributeValue:), getAccessibilityAttributeValue); + addMethod (@selector (updateTrackingAreas), [] (id self, SEL) + { + sendSuperclassMessage (self, @selector (updateTrackingAreas)); - addMethod (@selector (isFlipped), isFlipped); + resetTrackingArea (static_cast (self)); + }); - addMethod (NSViewComponentPeer::dismissModalsSelector, dismissModals); - addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown); - addMethod (NSViewComponentPeer::asyncMouseUpSelector, asyncMouseUp); - addMethod (NSViewComponentPeer::frameChangedSelector, frameChanged); - addMethod (NSViewComponentPeer::becomeKeySelector, becomeKey); - addMethod (NSViewComponentPeer::resignKeySelector, resignKey); + addMethod (@selector (becomeFirstResponder), [] (id self, SEL) + { + callOnOwner (self, &NSViewComponentPeer::viewFocusGain); + return YES; + }); - addMethod (@selector (performKeyEquivalent:), performKeyEquivalent); + addMethod (@selector (resignFirstResponder), [] (id self, SEL) + { + callOnOwner (self, &NSViewComponentPeer::viewFocusLoss); + return YES; + }); - addProtocol (@protocol (NSTextInput)); + addMethod (NSViewComponentPeer::dismissModalsSelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::dismissModals); }); + addMethod (NSViewComponentPeer::frameChangedSelector, [] (id self, SEL, NSNotification*) { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); }); + addMethod (NSViewComponentPeer::becomeKeySelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::becomeKey); }); + addMethod (NSViewComponentPeer::resignKeySelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::resignKey); }); - registerClass(); - } + addMethod (@selector (paste:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectPaste, s); }); + addMethod (@selector (copy:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCopy, s); }); + addMethod (@selector (cut:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCut, s); }); + addMethod (@selector (selectAll:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll, s); }); -private: - static void updateTrackingAreas (id self, SEL) - { - sendSuperclassMessage (self, @selector (updateTrackingAreas)); + addMethod (@selector (viewWillMoveToWindow:), [] (id self, SEL, NSWindow* w) { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w); }); - resetTrackingArea (static_cast (self)); - } + addMethod (@selector (drawRect:), [] (id self, SEL, NSRect r) { callOnOwner (self, &NSViewComponentPeer::drawRect, r); }); + addMethod (@selector (viewDidMoveToWindow), [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); }); + addMethod (@selector (flagsChanged:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev); }); + addMethod (@selector (mouseMoved:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove, ev); }); + addMethod (@selector (mouseEntered:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter, ev); }); + addMethod (@selector (mouseExited:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit, ev); }); + addMethod (@selector (scrollWheel:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel, ev); }); + addMethod (@selector (magnifyWithEvent:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMagnify, ev); }); - static void mouseDown (id self, SEL s, NSEvent* ev) - { - if (JUCEApplicationBase::isStandaloneApp()) - { - asyncMouseDown (self, s, ev); - } - else - { - // In some host situations, the host will stop modal loops from working - // correctly if they're called from a mouse event, so we'll trigger - // the event asynchronously.. - [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector - withObject: ev - waitUntilDone: NO]; - } - } + addMethod (@selector (mouseDragged:), mouseDragged); + addMethod (@selector (rightMouseDragged:), mouseDragged); + addMethod (@selector (otherMouseDragged:), mouseDragged); - static void mouseUp (id self, SEL s, NSEvent* ev) - { - if (JUCEApplicationBase::isStandaloneApp()) - { - asyncMouseUp (self, s, ev); - } - else - { - // In some host situations, the host will stop modal loops from working - // correctly if they're called from a mouse event, so we'll trigger - // the event asynchronously.. - [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector - withObject: ev - waitUntilDone: NO]; - } - } + addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown); + addMethod (NSViewComponentPeer::asyncMouseUpSelector, asyncMouseUp); - static void asyncMouseDown (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown, ev); } - static void asyncMouseUp (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp, ev); } - static void mouseDragged (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag, ev); } - static void mouseMoved (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove, ev); } - static void mouseEntered (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter, ev); } - static void mouseExited (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit, ev); } - static void scrollWheel (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel, ev); } - static void magnify (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMagnify, ev); } - static void copy (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCopy, s); } - static void paste (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectPaste, s); } - static void cut (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCut, s); } - static void selectAll (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll, s); } - static void willMoveToWindow (id self, SEL, NSWindow* w) { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w); } - - static BOOL acceptsFirstMouse (id, SEL, NSEvent*) { return YES; } - static BOOL wantsDefaultClipping (id, SEL) { return YES; } // (this is the default, but may want to customise it in future) - static BOOL worksWhenModal (id self, SEL) { if (auto* p = getOwner (self)) return p->worksWhenModal(); return NO; } - - static void drawRect (id self, SEL, NSRect r) { callOnOwner (self, &NSViewComponentPeer::drawRect, r); } - static void frameChanged (id self, SEL, NSNotification*) { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); } - static void viewDidMoveToWindow (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); } - static void dismissModals (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::dismissModals); } - static void becomeKey (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::becomeKey); } - static void resignKey (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::resignKey); } - - static BOOL isFlipped (id, SEL) { return true; } - - static void viewWillDraw (id self, SEL) - { - // Without setting contentsFormat macOS Big Sur will always set the invalid area - // to be the entire frame. - #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 - if (@available (macOS 10.12, *)) - { - CALayer* layer = ((NSView*) self).layer; - layer.contentsFormat = kCAContentsFormatRGBA8Uint; - } - #endif + addMethod (@selector (mouseDown:), mouseDown); + addMethod (@selector (rightMouseDown:), mouseDown); + addMethod (@selector (otherMouseDown:), mouseDown); - sendSuperclassMessage (self, @selector (viewWillDraw)); - } + addMethod (@selector (mouseUp:), mouseUp); + addMethod (@selector (rightMouseUp:), mouseUp); + addMethod (@selector (otherMouseUp:), mouseUp); - static void windowWillMiniaturize (id self, SEL, NSNotification*) - { - if (auto* p = getOwner (self)) + addMethod (@selector (draggingEntered:), draggingUpdated); + addMethod (@selector (draggingUpdated:), draggingUpdated); + + addMethod (@selector (draggingEnded:), draggingExited); + addMethod (@selector (draggingExited:), draggingExited); + + addMethod (@selector (acceptsFirstMouse:), [] (id, SEL, NSEvent*) { return YES; }); + + addMethod (@selector (windowWillMiniaturize:), [] (id self, SEL, NSNotification*) { - if (p->isAlwaysOnTop) + if (auto* p = getOwner (self)) { - // there is a bug when restoring minimised always on top windows so we need - // to remove this behaviour before minimising and restore it afterwards - p->setAlwaysOnTop (false); - p->wasAlwaysOnTop = true; + if (p->isAlwaysOnTop) + { + // there is a bug when restoring minimised always on top windows so we need + // to remove this behaviour before minimising and restore it afterwards + p->setAlwaysOnTop (false); + p->wasAlwaysOnTop = true; + } } - } - } + }); - static void windowDidDeminiaturize (id self, SEL, NSNotification*) - { - if (auto* p = getOwner (self)) + addMethod (@selector (windowDidDeminiaturize:), [] (id self, SEL, NSNotification*) { - if (p->wasAlwaysOnTop) - p->setAlwaysOnTop (true); + if (auto* p = getOwner (self)) + { + if (p->wasAlwaysOnTop) + p->setAlwaysOnTop (true); - p->redirectMovedOrResized(); - } - } + p->redirectMovedOrResized(); + } + }); - static void windowDidChangeScreen (id self, SEL, NSNotification*) - { - if (auto* p = getOwner (self)) - p->windowDidChangeScreen(); - } + addMethod (@selector (windowDidChangeScreen:), [] (id self, SEL, NSNotification*) + { + if (auto* p = getOwner (self)) + p->windowDidChangeScreen(); + }); - static BOOL isOpaque (id self, SEL) - { - auto* owner = getOwner (self); - return owner == nullptr || owner->getComponent().isOpaque(); - } + addMethod (@selector (wantsDefaultClipping), [] (id, SEL) { return YES; }); // (this is the default, but may want to customise it in future) - //============================================================================== - static void keyDown (id self, SEL, NSEvent* ev) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (worksWhenModal), [] (id self, SEL) { - auto* target = owner->findCurrentTextInputTarget(); - owner->textWasInserted = false; - - if (target != nullptr) - [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]]; - else - owner->stringBeingComposed.clear(); + if (auto* p = getOwner (self)) + return p->worksWhenModal(); - if (! (owner->textWasInserted || owner->redirectKeyDown (ev))) - sendSuperclassMessage (self, @selector (keyDown:), ev); - } - } + return false; + }); - static void keyUp (id self, SEL, NSEvent* ev) - { - auto* owner = getOwner (self); + addMethod (@selector (viewWillDraw), [] (id self, SEL) + { + // Without setting contentsFormat macOS Big Sur will always set the invalid area + // to be the entire frame. + if (@available (macOS 10.12, *)) + { + CALayer* layer = ((NSView*) self).layer; + layer.contentsFormat = kCAContentsFormatRGBA8Uint; + } - if (! owner->redirectKeyUp (ev)) - sendSuperclassMessage (self, @selector (keyUp:), ev); - } + sendSuperclassMessage (self, @selector (viewWillDraw)); + }); - //============================================================================== - static void insertText (id self, SEL, id aString) - { - // This commits multi-byte text when return is pressed, or after every keypress for western keyboards - if (auto* owner = getOwner (self)) + addMethod (@selector (keyDown:), [] (id self, SEL, NSEvent* ev) { - NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString; - - if ([newText length] > 0) + if (auto* owner = getOwner (self)) { - if (auto* target = owner->findCurrentTextInputTarget()) - { - target->insertTextAtCaret (nsStringToJuce (newText)); - owner->textWasInserted = true; - } - } + auto* target = owner->findCurrentTextInputTarget(); + owner->textWasInserted = false; - owner->stringBeingComposed.clear(); - } - } + if (target != nullptr) + [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]]; + else + owner->stringBeingComposed.clear(); - static void doCommandBySelector (id, SEL, SEL) {} + if (! (owner->textWasInserted || owner->redirectKeyDown (ev))) + sendSuperclassMessage (self, @selector (keyDown:), ev); + } + }); - static void setMarkedText (id self, SEL, id aString, NSRange) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (keyUp:), [] (id self, SEL, NSEvent* ev) { - owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] - ? [aString string] : aString); + auto* owner = getOwner (self); + + if (! owner->redirectKeyUp (ev)) + sendSuperclassMessage (self, @selector (keyUp:), ev); + }); - if (auto* target = owner->findCurrentTextInputTarget()) + addMethod (@selector (insertText:), [] (id self, SEL, id aString) + { + // This commits multi-byte text when return is pressed, or after every keypress for western keyboards + if (auto* owner = getOwner (self)) { - auto currentHighlight = target->getHighlightedRegion(); - target->insertTextAtCaret (owner->stringBeingComposed); - target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length())); - owner->textWasInserted = true; + NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString; + + if ([newText length] > 0) + { + if (auto* target = owner->findCurrentTextInputTarget()) + { + target->insertTextAtCaret (nsStringToJuce (newText)); + owner->textWasInserted = true; + } + } + + owner->stringBeingComposed.clear(); } - } - } + }); - static void unmarkText (id self, SEL) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (doCommandBySelector:), [] (id, SEL, SEL) {}); + + addMethod (@selector (setMarkedText:selectedRange:), [] (id self, SEL, id aString, NSRange) { - if (owner->stringBeingComposed.isNotEmpty()) + if (auto* owner = getOwner (self)) { + owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] + ? [aString string] : aString); + if (auto* target = owner->findCurrentTextInputTarget()) { + auto currentHighlight = target->getHighlightedRegion(); target->insertTextAtCaret (owner->stringBeingComposed); + target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length())); owner->textWasInserted = true; } + } + }); - owner->stringBeingComposed.clear(); + addMethod (@selector (unmarkText), [] (id self, SEL) + { + if (auto* owner = getOwner (self)) + { + if (owner->stringBeingComposed.isNotEmpty()) + { + if (auto* target = owner->findCurrentTextInputTarget()) + { + target->insertTextAtCaret (owner->stringBeingComposed); + owner->textWasInserted = true; + } + + owner->stringBeingComposed.clear(); + } } - } - } + }); - static BOOL hasMarkedText (id self, SEL) - { - auto* owner = getOwner (self); - return owner != nullptr && owner->stringBeingComposed.isNotEmpty(); - } + addMethod (@selector (hasMarkedText), [] (id self, SEL) + { + auto* owner = getOwner (self); + return owner != nullptr && owner->stringBeingComposed.isNotEmpty(); + }); - static long conversationIdentifier (id self, SEL) - { - return (long) (pointer_sized_int) self; - } + addMethod (@selector (conversationIdentifier), [] (id self, SEL) + { + return (long) (pointer_sized_int) self; + }); - static NSAttributedString* attributedSubstringFromRange (id self, SEL, NSRange theRange) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (attributedSubstringFromRange:), [] (id self, SEL, NSRange theRange) -> NSAttributedString* { - if (auto* target = owner->findCurrentTextInputTarget()) + if (auto* owner = getOwner (self)) { - Range r ((int) theRange.location, - (int) (theRange.location + theRange.length)); + if (auto* target = owner->findCurrentTextInputTarget()) + { + Range r ((int) theRange.location, + (int) (theRange.location + theRange.length)); - return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease]; + return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease]; + } } - } - return nil; - } + return nil; + }); - static NSRange markedRange (id self, SEL) - { - if (auto* owner = getOwner (self)) - if (owner->stringBeingComposed.isNotEmpty()) - return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length()); + addMethod (@selector (markedRange), [] (id self, SEL) + { + if (auto* owner = getOwner (self)) + if (owner->stringBeingComposed.isNotEmpty()) + return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length()); - return NSMakeRange (NSNotFound, 0); - } + return NSMakeRange (NSNotFound, 0); + }); - static NSRange selectedRange (id self, SEL) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (selectedRange), [] (id self, SEL) { - if (auto* target = owner->findCurrentTextInputTarget()) + if (auto* owner = getOwner (self)) { - auto highlight = target->getHighlightedRegion(); + if (auto* target = owner->findCurrentTextInputTarget()) + { + auto highlight = target->getHighlightedRegion(); - if (! highlight.isEmpty()) - return NSMakeRange ((NSUInteger) highlight.getStart(), - (NSUInteger) highlight.getLength()); + if (! highlight.isEmpty()) + return NSMakeRange ((NSUInteger) highlight.getStart(), + (NSUInteger) highlight.getLength()); + } } - } - return NSMakeRange (NSNotFound, 0); - } + return NSMakeRange (NSNotFound, 0); + }); - static NSRect firstRectForCharacterRange (id self, SEL, NSRange) - { - if (auto* owner = getOwner (self)) - if (auto* comp = dynamic_cast (owner->findCurrentTextInputTarget())) - return flippedScreenRect (makeNSRect (comp->getScreenBounds())); + addMethod (@selector (firstRectForCharacterRange:), [] (id self, SEL, NSRange) + { + if (auto* owner = getOwner (self)) + if (auto* comp = dynamic_cast (owner->findCurrentTextInputTarget())) + return flippedScreenRect (makeNSRect (comp->getScreenBounds())); - return NSZeroRect; - } + return NSZeroRect; + }); - static NSUInteger characterIndexForPoint (id, SEL, NSPoint) { return NSNotFound; } - static NSArray* validAttributesForMarkedText (id, SEL) { return [NSArray array]; } + addMethod (@selector (characterIndexForPoint:), [] (id, SEL, NSPoint) { return NSNotFound; }); - //============================================================================== - static void flagsChanged (id self, SEL, NSEvent* ev) - { - callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev); - } + addMethod (@selector (validAttributesForMarkedText), [] (id, SEL) { return [NSArray array]; }); - static BOOL becomeFirstResponder (id self, SEL) - { - callOnOwner (self, &NSViewComponentPeer::viewFocusGain); - return YES; - } + addMethod (@selector (acceptsFirstResponder), [] (id self, SEL) + { + auto* owner = getOwner (self); + return owner != nullptr && owner->canBecomeKeyWindow(); + }); - static BOOL resignFirstResponder (id self, SEL) - { - callOnOwner (self, &NSViewComponentPeer::viewFocusLoss); - return YES; - } + addMethod (@selector (prepareForDragOperation:), [] (id, SEL, id) { return YES; }); - static BOOL acceptsFirstResponder (id self, SEL) - { - auto* owner = getOwner (self); - return owner != nullptr && owner->canBecomeKeyWindow(); - } + addMethod (@selector (performDragOperation:), [] (id self, SEL, id sender) + { + auto* owner = getOwner (self); + return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender); + }); - //============================================================================== - static NSDragOperation draggingEntered (id self, SEL s, id sender) - { - return draggingUpdated (self, s, sender); - } + addMethod (@selector (concludeDragOperation:), [] (id, SEL, id) {}); - static NSDragOperation draggingUpdated (id self, SEL, id sender) - { - if (auto* owner = getOwner (self)) - if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender)) - return NSDragOperationGeneric; + addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return NO; }); - return NSDragOperationNone; - } + addMethod (@selector (accessibilityChildren), getAccessibilityChildren); - static void draggingEnded (id self, SEL s, id sender) - { - draggingExited (self, s, sender); - } + addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point) + { + return [getAccessibleChild (self) accessibilityHitTest: point]; + }); - static void draggingExited (id self, SEL, id sender) - { - callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); - } + addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL) + { + return [getAccessibleChild (self) accessibilityFocusedUIElement]; + }); - static BOOL prepareForDragOperation (id, SEL, id) - { - return YES; - } + // deprecated methods required for backwards compatibility + addMethod (@selector (accessibilityIsIgnored), [] (id, SEL) { return YES; }); - static BOOL performDragOperation (id self, SEL, id sender) - { - auto* owner = getOwner (self); - return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender); - } + addMethod (@selector (accessibilityAttributeValue:), [] (id self, SEL, NSString* attribute) -> id + { + if ([attribute isEqualToString: NSAccessibilityChildrenAttribute]) + return getAccessibilityChildren (self, {}); - static void concludeDragOperation (id, SEL, id) {} + return sendSuperclassMessage (self, @selector (accessibilityAttributeValue:), attribute); + }); - //============================================================================== - static BOOL getIsAccessibilityElement (id, SEL) - { - return NO; - } + addMethod (@selector (isFlipped), [] (id, SEL) { return true; }); - static NSArray* getAccessibilityChildren (id self, SEL) - { - return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self)); - } + addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* event) + { + // We try passing shortcut keys to the currently focused component first. + // If the component doesn't want the event, we'll fall back to the superclass + // implementation, which will pass the event to the main menu. + if (tryPassingKeyEventToPeer (event)) + return YES; - static id accessibilityHitTest (id self, SEL, NSPoint point) - { - return [getAccessibleChild (self) accessibilityHitTest: point]; - } + return sendSuperclassMessage (self, s, event); + }); - static id getAccessibilityFocusedUIElement (id self, SEL) - { - return [getAccessibleChild (self) accessibilityFocusedUIElement]; - } + addProtocol (@protocol (NSTextInput)); - static BOOL getAccessibilityIsIgnored (id, SEL) - { - return YES; + registerClass(); } - static id getAccessibilityAttributeValue (id self, SEL, NSString* attribute) +private: + static void updateTrackingAreas (id self, SEL) { - if ([attribute isEqualToString: NSAccessibilityChildrenAttribute]) - return getAccessibilityChildren (self, {}); + sendSuperclassMessage (self, @selector (updateTrackingAreas)); - return sendSuperclassMessage (self, @selector (accessibilityAttributeValue:), attribute); + resetTrackingArea (static_cast (self)); } static bool tryPassingKeyEventToPeer (NSEvent* e) @@ -2402,308 +2229,311 @@ private: return false; } - static BOOL performKeyEquivalent (id self, SEL s, NSEvent* event) - { - // We try passing shortcut keys to the currently focused component first. - // If the component doesn't want the event, we'll fall back to the superclass - // implementation, which will pass the event to the main menu. - if (tryPassingKeyEventToPeer (event)) - return YES; - - return sendSuperclassMessage (self, s, event); - } - template static void callOnOwner (id self, Func&& func, Args&&... args) { if (auto* owner = getOwner (self)) (owner->*func) (std::forward (args)...); } -}; -//============================================================================== -struct JuceNSWindowClass : public NSViewComponentPeerWrapper> -{ - JuceNSWindowClass() : NSViewComponentPeerWrapper ("JUCEWindow_") - { - addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow); - addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow); - addMethod (@selector (becomeKeyWindow), becomeKeyWindow); - addMethod (@selector (resignKeyWindow), resignKeyWindow); - addMethod (@selector (windowShouldClose:), windowShouldClose); - addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect); - addMethod (@selector (windowWillResize:toSize:), windowWillResize); - addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen); - addMethod (@selector (windowWillEnterFullScreen:), windowWillEnterFullScreen); - addMethod (@selector (windowWillExitFullScreen:), windowWillExitFullScreen); - addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize); - addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize); - addMethod (@selector (window:shouldPopUpDocumentPathMenu:), shouldPopUpPathMenu); - addMethod (@selector (isFlipped), isFlipped); - addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), windowWillUseStandardFrame); - addMethod (@selector (windowShouldZoom:toFrame:), windowShouldZoomToFrame); - - addMethod (@selector (accessibilityTitle), getAccessibilityTitle); - addMethod (@selector (accessibilityLabel), getAccessibilityLabel); - addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow); - addMethod (@selector (accessibilityWindow), getAccessibilityWindow); - addMethod (@selector (accessibilityRole), getAccessibilityRole); - addMethod (@selector (accessibilitySubrole), getAccessibilitySubrole); - - addMethod (@selector (keyDown:), keyDown); - - addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag); - - addMethod (@selector (toggleFullScreen:), toggleFullScreen); - - addProtocol (@protocol (NSWindowDelegate)); + static void mouseDragged (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag, ev); } + static void asyncMouseDown (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown, ev); } + static void asyncMouseUp (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp, ev); } + static void draggingExited (id self, SEL, id sender) { callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); } - registerClass(); - } - -private: - //============================================================================== - static BOOL isFlipped (id, SEL) { return true; } - - // Key events will be processed by the peer's component. - // If the component is unable to use the event, it will be re-sent - // to performKeyEquivalent. - // performKeyEquivalent will send the event to the view's superclass, - // which will try passing the event to the main menu. - // If the event still hasn't been processed, it will be passed to the - // next responder in the chain, which will be the NSWindow for a peer - // that is on the desktop. - // If the NSWindow still doesn't handle the event, the Apple docs imply - // that the event should be sent to the NSApp for processing, but this - // doesn't seem to happen for keyDown events. - // Instead, the NSWindow attempts to process the event, fails, and - // triggers an annoying NSBeep. - // Overriding keyDown to "handle" the event seems to suppress the beep. - static void keyDown (id, SEL, NSEvent* ev) - { - ignoreUnused (ev); - - #if JUCE_DEBUG_UNHANDLED_KEYPRESSES - DBG ("unhandled key down event with keycode: " << [ev keyCode]); - #endif + static void mouseDown (id self, SEL s, NSEvent* ev) + { + if (JUCEApplicationBase::isStandaloneApp()) + { + asyncMouseDown (self, s, ev); + } + else + { + // In some host situations, the host will stop modal loops from working + // correctly if they're called from a mouse event, so we'll trigger + // the event asynchronously.. + [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector + withObject: ev + waitUntilDone: NO]; + } } - static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow* window, NSRect r) + static void mouseUp (id self, SEL s, NSEvent* ev) { - if (auto* owner = getOwner (self)) + if (JUCEApplicationBase::isStandaloneApp()) { - if (auto* constrainer = owner->getConstrainer()) - { - if (auto* screen = [window screen]) - { - const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame])); - const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat(); - const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth()) - .withHeight ((float) constrainer->getMaximumHeight()); - const auto constrained = expanded.constrainedWithin (safeScreenBounds); - - return flippedScreenRect (makeNSRect ([&] - { - if (constrained == owner->getBounds().toFloat()) - return owner->lastSizeBeforeZoom.toFloat(); - - owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); - return constrained; - }())); - } - } + asyncMouseUp (self, s, ev); + } + else + { + // In some host situations, the host will stop modal loops from working + // correctly if they're called from a mouse event, so we'll trigger + // the event asynchronously.. + [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector + withObject: ev + waitUntilDone: NO]; } - - return r; } - static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow*, NSRect) + static NSDragOperation draggingUpdated (id self, SEL, id sender) { if (auto* owner = getOwner (self)) - if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0) - return NO; + if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender)) + return NSDragOperationGeneric; - return YES; + return NSDragOperationNone; } - static BOOL canBecomeKeyWindow (id self, SEL) + static NSArray* getAccessibilityChildren (id self, SEL) { - auto* owner = getOwner (self); - - return owner != nullptr - && owner->canBecomeKeyWindow() - && ! owner->isBlockedByModalComponent(); + return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self)); } +}; - static BOOL canBecomeMainWindow (id self, SEL) +//============================================================================== +struct JuceNSWindowClass : public NSViewComponentPeerWrapper> +{ + JuceNSWindowClass() : NSViewComponentPeerWrapper ("JUCEWindow_") { - auto* owner = getOwner (self); + addMethod (@selector (canBecomeKeyWindow), [] (id self, SEL) + { + auto* owner = getOwner (self); - return owner != nullptr - && owner->canBecomeMainWindow() - && ! owner->isBlockedByModalComponent(); - } + return owner != nullptr + && owner->canBecomeKeyWindow() + && ! owner->isBlockedByModalComponent(); + }); - static void becomeKeyWindow (id self, SEL) - { - sendSuperclassMessage (self, @selector (becomeKeyWindow)); + addMethod (@selector (canBecomeMainWindow), [] (id self, SEL) + { + auto* owner = getOwner (self); - if (auto* owner = getOwner (self)) + return owner != nullptr + && owner->canBecomeMainWindow() + && ! owner->isBlockedByModalComponent(); + }); + + addMethod (@selector (becomeKeyWindow), [] (id self, SEL) { - if (owner->canBecomeKeyWindow()) + sendSuperclassMessage (self, @selector (becomeKeyWindow)); + + if (auto* owner = getOwner (self)) { - owner->becomeKeyWindow(); - return; + if (owner->canBecomeKeyWindow()) + { + owner->becomeKeyWindow(); + return; + } + + // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus + if (! owner->getComponent().isVisible()) + [(NSWindow*) self orderOut: nil]; } + }); - // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus - if (! owner->getComponent().isVisible()) - [(NSWindow*) self orderOut: nil]; - } - } + addMethod (@selector (resignKeyWindow), [] (id self, SEL) + { + sendSuperclassMessage (self, @selector (resignKeyWindow)); - static void resignKeyWindow (id self, SEL) - { - sendSuperclassMessage (self, @selector (resignKeyWindow)); + if (auto* owner = getOwner (self)) + owner->resignKeyWindow(); + }); - if (auto* owner = getOwner (self)) - owner->resignKeyWindow(); - } + addMethod (@selector (windowShouldClose:), [] (id self, SEL, id /*window*/) + { + auto* owner = getOwner (self); + return owner == nullptr || owner->windowShouldClose(); + }); - static BOOL windowShouldClose (id self, SEL, id /*window*/) - { - auto* owner = getOwner (self); - return owner == nullptr || owner->windowShouldClose(); - } + addMethod (@selector (constrainFrameRect:toScreen:), [] (id self, SEL, NSRect frameRect, NSScreen* screen) + { + if (auto* owner = getOwner (self)) + { + frameRect = sendSuperclassMessage (self, @selector (constrainFrameRect:toScreen:), + frameRect, screen); - static NSRect constrainFrameRect (id self, SEL, NSRect frameRect, NSScreen* screen) - { - if (auto* owner = getOwner (self)) + frameRect = owner->constrainRect (frameRect); + } + + return frameRect; + }); + + addMethod (@selector (windowWillResize:toSize:), [] (id self, SEL, NSWindow*, NSSize proposedFrameSize) { - frameRect = sendSuperclassMessage (self, @selector (constrainFrameRect:toScreen:), - frameRect, screen); + auto* owner = getOwner (self); - frameRect = owner->constrainRect (frameRect); - } + if (owner == nullptr || owner->isZooming) + return proposedFrameSize; - return frameRect; - } + NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]); + frameRect.size = proposedFrameSize; - static NSSize windowWillResize (id self, SEL, NSWindow*, NSSize proposedFrameSize) - { - auto* owner = getOwner (self); + frameRect = owner->constrainRect (flippedScreenRect (frameRect)); - if (owner == nullptr || owner->isZooming) - return proposedFrameSize; + owner->dismissModals(); - NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]); - frameRect.size = proposedFrameSize; + return frameRect.size; + }); - frameRect = owner->constrainRect (flippedScreenRect (frameRect)); + addMethod (@selector (windowDidExitFullScreen:), [] (id self, SEL, NSNotification*) + { + if (auto* owner = getOwner (self)) + owner->resetWindowPresentation(); + }); - owner->dismissModals(); + addMethod (@selector (windowWillEnterFullScreen:), [] (id self, SEL, NSNotification*) + { + if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9) + return; - return frameRect.size; - } + if (auto* owner = getOwner (self)) + if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0) + [owner->window setStyleMask: NSWindowStyleMaskBorderless]; + }); - static void toggleFullScreen (id self, SEL name, id sender) - { - if (auto* owner = getOwner (self)) + addMethod (@selector (windowWillExitFullScreen:), [] (id self, SEL, NSNotification*) + { + // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable... + if (auto* owner = getOwner (self)) + if (auto* window = owner->window) + [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable]; + }); + + addMethod (@selector (windowWillStartLiveResize:), [] (id self, SEL, NSNotification*) { - const auto isFullScreen = owner->isFullScreen(); + if (auto* owner = getOwner (self)) + owner->liveResizingStart(); + }); - if (! isFullScreen) - owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); + addMethod (@selector (windowDidEndLiveResize:), [] (id self, SEL, NSNotification*) + { + if (auto* owner = getOwner (self)) + owner->liveResizingEnd(); + }); - sendSuperclassMessage (self, name, sender); + addMethod (@selector (window:shouldPopUpDocumentPathMenu:), [] (id self, SEL, id /*window*/, NSMenu*) + { + if (auto* owner = getOwner (self)) + return owner->windowRepresentsFile; - if (isFullScreen) + return false; + }); + + addMethod (@selector (isFlipped), [] (id, SEL) { return true; }); + + addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), [] (id self, SEL, NSWindow* window, NSRect r) + { + if (auto* owner = getOwner (self)) { - [NSApp setPresentationOptions: NSApplicationPresentationDefault]; - owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false); + if (auto* constrainer = owner->getConstrainer()) + { + if (auto* screen = [window screen]) + { + const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame])); + const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat(); + const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth()) + .withHeight ((float) constrainer->getMaximumHeight()); + const auto constrained = expanded.constrainedWithin (safeScreenBounds); + + return flippedScreenRect (makeNSRect ([&] + { + if (constrained == owner->getBounds().toFloat()) + return owner->lastSizeBeforeZoom.toFloat(); + + owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); + return constrained; + }())); + } + } } - } - } - static void windowDidExitFullScreen (id self, SEL, NSNotification*) - { - if (auto* owner = getOwner (self)) - owner->resetWindowPresentation(); - } + return r; + }); - static void windowWillExitFullScreen (id self, SEL, NSNotification*) - { - // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable... - if (auto* owner = getOwner (self)) - if (auto* window = owner->window) - [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable]; - } + addMethod (@selector (windowShouldZoom:toFrame:), [] (id self, SEL, NSWindow*, NSRect) + { + if (auto* owner = getOwner (self)) + if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0) + return NO; - static void windowWillEnterFullScreen (id self, SEL, NSNotification*) - { - if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9) - return; + return YES; + }); - if (auto* owner = getOwner (self)) - if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0) - [owner->window setStyleMask: NSWindowStyleMaskBorderless]; - } + addMethod (@selector (accessibilityTitle), [] (id self, SEL) { return [self title]; }); - static void windowWillStartLiveResize (id self, SEL, NSNotification*) - { - if (auto* owner = getOwner (self)) - owner->liveResizingStart(); - } + addMethod (@selector (accessibilityLabel), [] (id self, SEL) { return [getAccessibleChild (self) accessibilityLabel]; }); - static void windowDidEndLiveResize (id self, SEL, NSNotification*) - { - if (auto* owner = getOwner (self)) - owner->liveResizingEnd(); - } + addMethod (@selector (accessibilityRole), [] (id, SEL) { return NSAccessibilityWindowRole; }); - static bool shouldPopUpPathMenu (id self, SEL, id /*window*/, NSMenu*) - { - if (auto* owner = getOwner (self)) - return owner->windowRepresentsFile; + addMethod (@selector (accessibilitySubrole), [] (id self, SEL) -> NSAccessibilitySubrole + { + if (@available (macOS 10.10, *)) + return [getAccessibleChild (self) accessibilitySubrole]; + + return nil; + }); + + // Key events will be processed by the peer's component. + // If the component is unable to use the event, it will be re-sent + // to performKeyEquivalent. + // performKeyEquivalent will send the event to the view's superclass, + // which will try passing the event to the main menu. + // If the event still hasn't been processed, it will be passed to the + // next responder in the chain, which will be the NSWindow for a peer + // that is on the desktop. + // If the NSWindow still doesn't handle the event, the Apple docs imply + // that the event should be sent to the NSApp for processing, but this + // doesn't seem to happen for keyDown events. + // Instead, the NSWindow attempts to process the event, fails, and + // triggers an annoying NSBeep. + // Overriding keyDown to "handle" the event seems to suppress the beep. + addMethod (@selector (keyDown:), [] (id, SEL, NSEvent* ev) + { + ignoreUnused (ev); + + #if JUCE_DEBUG_UNHANDLED_KEYPRESSES + DBG ("unhandled key down event with keycode: " << [ev keyCode]); + #endif + }); - return false; - } + addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), [] (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*) + { + if (auto* owner = getOwner (self)) + return owner->windowRepresentsFile; - static bool shouldAllowIconDrag (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*) - { - if (auto* owner = getOwner (self)) - return owner->windowRepresentsFile; + return false; + }); - return false; - } + addMethod (@selector (toggleFullScreen:), [] (id self, SEL name, id sender) + { + if (auto* owner = getOwner (self)) + { + const auto isFullScreen = owner->isFullScreen(); - static NSString* getAccessibilityTitle (id self, SEL) - { - return [self title]; - } + if (! isFullScreen) + owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); - static NSString* getAccessibilityLabel (id self, SEL) - { - return [getAccessibleChild (self) accessibilityLabel]; - } + sendSuperclassMessage (self, name, sender); - static id getAccessibilityWindow (id self, SEL) - { - return self; - } + if (isFullScreen) + { + [NSApp setPresentationOptions: NSApplicationPresentationDefault]; + owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false); + } + } + }); - static NSAccessibilityRole getAccessibilityRole (id, SEL) - { - return NSAccessibilityWindowRole; - } + addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow); + addMethod (@selector (accessibilityWindow), getAccessibilityWindow); - static NSAccessibilityRole getAccessibilitySubrole (id self, SEL) - { - if (@available (macOS 10.10, *)) - return [getAccessibleChild (self) accessibilitySubrole]; + addProtocol (@protocol (NSWindowDelegate)); - return nil; + registerClass(); } + +private: + //============================================================================== + static id getAccessibilityWindow (id self, SEL) { return self; } }; NSView* NSViewComponentPeer::createViewInstance() diff --git a/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/modules/juce_gui_basics/native/juce_mac_Windowing.mm index f8bcabbc..eb736ded 100644 --- a/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -471,34 +471,19 @@ bool Desktop::isDarkModeActive() const isEqualToString: nsStringLiteral ("Dark")]; } +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") +static const auto darkModeSelector = @selector (darkModeChanged:); +static const auto keyboardVisibilitySelector = @selector (keyboardVisiblityChanged:); +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + class Desktop::NativeDarkModeChangeDetectorImpl { public: NativeDarkModeChangeDetectorImpl() { static DelegateClass delegateClass; - - delegate = [delegateClass.createInstance() init]; - object_setInstanceVariable (delegate, "owner", this); - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") - [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate - selector: @selector (darkModeChanged:) - name: @"AppleInterfaceThemeChangedNotification" - object: nil]; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - } - - ~NativeDarkModeChangeDetectorImpl() - { - object_setInstanceVariable (delegate, "owner", nullptr); - [[NSDistributedNotificationCenter defaultCenter] removeObserver: delegate]; - [delegate release]; - } - - void darkModeChanged() - { - Desktop::getInstance().darkModeChanged(); + delegate.reset ([delegateClass.createInstance() init]); + observer.emplace (delegate.get(), darkModeSelector, @"AppleInterfaceThemeChangedNotification", nil); } private: @@ -506,23 +491,13 @@ private: { DelegateClass() : ObjCClass ("JUCEDelegate_") { - addIvar ("owner"); - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") - addMethod (@selector (darkModeChanged:), darkModeChanged); - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - + addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); }); registerClass(); } - - static void darkModeChanged (id self, SEL, NSNotification*) - { - if (auto* owner = getIvar (self, "owner")) - owner->darkModeChanged(); - } }; - id delegate = nil; + NSUniquePtr delegate; + Optional observer; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl) }; diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.cpp b/modules/juce_gui_basics/widgets/juce_ListBox.cpp index b2c8f8c1..f58f2f81 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ListBox.cpp @@ -241,21 +241,6 @@ public: public: explicit RowCellInterface (RowAccessibilityHandler& h) : handler (h) {} - int getColumnIndex() const override { return 0; } - int getColumnSpan() const override { return 1; } - - int getRowIndex() const override - { - const auto index = handler.rowComponent.row; - - if (handler.rowComponent.owner.hasAccessibleHeaderComponent()) - return index + 1; - - return index; - } - - int getRowSpan() const override { return 1; } - int getDisclosureLevel() const override { return 0; } const AccessibilityHandler* getTableHandler() const override @@ -294,41 +279,43 @@ public: { setWantsKeyboardFocus (false); - auto content = std::make_unique(); + struct IgnoredComponent : Component + { + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + }; + + auto content = std::make_unique(); content->setWantsKeyboardFocus (false); setViewedComponent (content.release()); } - RowComponent* getComponentForRow (int row) const noexcept - { - if (isPositiveAndBelow (row, rows.size())) - return rows[row]; - - return nullptr; - } - - RowComponent* getComponentForRowWrapped (int row) const noexcept - { - return rows[row % jmax (1, rows.size())]; - } + int getIndexOfFirstVisibleRow() const { return jmax (0, firstIndex - 1); } RowComponent* getComponentForRowIfOnscreen (int row) const noexcept { - return (row >= firstIndex && row < firstIndex + rows.size()) - ? getComponentForRowWrapped (row) : nullptr; + const auto startIndex = getIndexOfFirstVisibleRow(); + + return (startIndex <= row && row < startIndex + (int) rows.size()) + ? rows[(size_t) (row % jmax (1, (int) rows.size()))].get() + : nullptr; } - int getRowNumberOfComponent (Component* const rowComponent) const noexcept + int getRowNumberOfComponent (const Component* const rowComponent) const noexcept { - const int index = getViewedComponent()->getIndexOfChildComponent (rowComponent); - const int num = rows.size(); + const auto iter = std::find_if (rows.begin(), rows.end(), [=] (auto& ptr) { return ptr.get() == rowComponent; }); - for (int i = num; --i >= 0;) - if (((firstIndex + i) % jmax (1, num)) == index) - return firstIndex + i; + if (iter == rows.end()) + return -1; - return -1; + const auto index = (int) std::distance (rows.begin(), iter); + const auto mod = jmax (1, (int) rows.size()); + const auto startIndex = getIndexOfFirstVisibleRow(); + + return index + mod * ((startIndex / mod) + (index < (startIndex % mod) ? 1 : 0)); } void visibleAreaChanged (const Rectangle&) override @@ -371,30 +358,33 @@ public: auto y = getViewPositionY(); auto w = content.getWidth(); - const int numNeeded = 4 + getMaximumVisibleHeight() / rowH; - rows.removeRange (numNeeded, rows.size()); + const auto numNeeded = (size_t) (4 + getMaximumVisibleHeight() / rowH); + rows.resize (jmin (numNeeded, rows.size())); while (numNeeded > rows.size()) { - auto* newRow = rows.add (new RowComponent (owner)); - content.addAndMakeVisible (newRow); + rows.emplace_back (new RowComponent (owner)); + content.addAndMakeVisible (*rows.back()); } firstIndex = y / rowH; firstWholeIndex = (y + rowH - 1) / rowH; lastWholeIndex = (y + getMaximumVisibleHeight() - 1) / rowH; - auto startIndex = jmax (0, firstIndex - 1); + const auto startIndex = getIndexOfFirstVisibleRow(); + const auto lastIndex = startIndex + (int) rows.size(); - for (int i = 0; i < numNeeded; ++i) + for (auto row = startIndex; row < lastIndex; ++row) { - const int row = i + startIndex; - - if (auto* rowComp = getComponentForRowWrapped (row)) + if (auto* rowComp = getComponentForRowIfOnscreen (row)) { rowComp->setBounds (0, row * rowH, w, rowH); rowComp->update (row, owner.isRowSelected (row)); } + else + { + jassertfalse; + } } } @@ -488,7 +478,7 @@ private: } ListBox& owner; - OwnedArray rows; + std::vector> rows; int firstIndex = 0, firstWholeIndex = 0, lastWholeIndex = 0; bool hasUpdated = false; @@ -850,7 +840,7 @@ Component* ListBox::getComponentForRowNumber (const int row) const noexcept return nullptr; } -int ListBox::getRowNumberOfComponent (Component* const rowComponent) const noexcept +int ListBox::getRowNumberOfComponent (const Component* const rowComponent) const noexcept { return viewport->getRowNumberOfComponent (rowComponent); } @@ -1155,15 +1145,8 @@ std::unique_ptr ListBox::createAccessibilityHandler() { listBox.checkModelPtrIsValid(); - if (listBox.model == nullptr) - return 0; - - const auto numRows = listBox.model->getNumRows(); - - if (listBox.hasAccessibleHeaderComponent()) - return numRows + 1; - - return numRows; + return listBox.model != nullptr ? listBox.model->getNumRows() + : 0; } int getNumColumns() const override @@ -1171,31 +1154,47 @@ std::unique_ptr ListBox::createAccessibilityHandler() return 1; } - const AccessibilityHandler* getCellHandler (int row, int) const override + const AccessibilityHandler* getHeaderHandler() const override { - if (auto* headerHandler = getHeaderHandler()) - { - if (row == 0) - return headerHandler; + if (listBox.hasAccessibleHeaderComponent()) + return listBox.headerComponent->getAccessibilityHandler(); - --row; - } + return nullptr; + } - if (auto* rowComponent = listBox.viewport->getComponentForRow (row)) + const AccessibilityHandler* getRowHandler (int row) const override + { + if (auto* rowComponent = listBox.viewport->getComponentForRowIfOnscreen (row)) return rowComponent->getAccessibilityHandler(); return nullptr; } - private: - const AccessibilityHandler* getHeaderHandler() const + const AccessibilityHandler* getCellHandler (int, int) const override { - if (listBox.hasAccessibleHeaderComponent()) - return listBox.headerComponent->getAccessibilityHandler(); - return nullptr; } + Optional getRowSpan (const AccessibilityHandler& handler) const override + { + const auto rowNumber = listBox.getRowNumberOfComponent (&handler.getComponent()); + + return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 }) + : nullopt; + } + + Optional getColumnSpan (const AccessibilityHandler&) const override + { + return Span { 0, 1 }; + } + + void showCell (const AccessibilityHandler& h) const override + { + if (const auto row = getRowSpan (h)) + listBox.scrollToEnsureRowIsOnscreen (row->begin); + } + + private: ListBox& listBox; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface) diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.h b/modules/juce_gui_basics/widgets/juce_ListBox.h index cb2907e1..c3a4273c 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.h +++ b/modules/juce_gui_basics/widgets/juce_ListBox.h @@ -455,7 +455,7 @@ public: /** Returns the row number that the given component represents. If the component isn't one of the list's rows, this will return -1. */ - int getRowNumberOfComponent (Component* rowComponent) const noexcept; + int getRowNumberOfComponent (const Component* rowComponent) const noexcept; /** Returns the width of a row (which may be less than the width of this component if there's a scrollbar). diff --git a/modules/juce_gui_basics/widgets/juce_Slider.cpp b/modules/juce_gui_basics/widgets/juce_Slider.cpp index 1e9b6ad7..d1182ec9 100644 --- a/modules/juce_gui_basics/widgets/juce_Slider.cpp +++ b/modules/juce_gui_basics/widgets/juce_Slider.cpp @@ -122,20 +122,34 @@ public: return 0.0f; } - void updateRange() + void setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay) + { + fixedNumDecimalPlaces = jmax (0, decimalPlacesToDisplay); + numDecimalPlaces = fixedNumDecimalPlaces; + } + + int getNumDecimalPlacesToDisplay() const { - // figure out the number of DPs needed to display all values at this - // interval setting. - numDecimalPlaces = 7; + return fixedNumDecimalPlaces == -1 ? numDecimalPlaces : fixedNumDecimalPlaces; + } - if (normRange.interval != 0.0) + void updateRange() + { + if (fixedNumDecimalPlaces == -1) { - int v = std::abs (roundToInt (normRange.interval * 10000000)); + // figure out the number of DPs needed to display all values at this + // interval setting. + numDecimalPlaces = 7; - while ((v % 10) == 0 && numDecimalPlaces > 0) + if (normRange.interval != 0.0) { - --numDecimalPlaces; - v /= 10; + int v = std::abs (roundToInt (normRange.interval * 10000000)); + + while ((v % 10) == 0 && numDecimalPlaces > 0) + { + --numDecimalPlaces; + v /= 10; + } } } @@ -1299,6 +1313,7 @@ public: TextEntryBoxPosition textBoxPos; String textSuffix; int numDecimalPlaces = 7; + int fixedNumDecimalPlaces = -1; int textBoxWidth = 80, textBoxHeight = 20; IncDecButtonMode incDecButtonMode = incDecButtonsNotDraggable; ModifierKeys::Flags modifierToSwapModes = ModifierKeys::ctrlAltCommandModifiers; @@ -1658,11 +1673,14 @@ double Slider::snapValue (double attemptedValue, DragMode) return attemptedValue; } -int Slider::getNumDecimalPlacesToDisplay() const noexcept { return pimpl->numDecimalPlaces; } +int Slider::getNumDecimalPlacesToDisplay() const noexcept +{ + return pimpl->getNumDecimalPlacesToDisplay(); +} void Slider::setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay) { - pimpl->numDecimalPlaces = decimalPlacesToDisplay; + pimpl->setNumDecimalPlacesToDisplay (decimalPlacesToDisplay); updateText(); } diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp index 6a787d95..4dc53dc3 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp @@ -50,6 +50,7 @@ public: //============================================================================== TableHeaderComponent::TableHeaderComponent() { + setFocusContainerType (FocusContainerType::focusContainer); } TableHeaderComponent::~TableHeaderComponent() @@ -86,7 +87,7 @@ int TableHeaderComponent::getNumColumns (const bool onlyCountVisibleColumns) con String TableHeaderComponent::getColumnName (const int columnId) const { if (auto* ci = getInfoForId (columnId)) - return ci->name; + return ci->getTitle(); return {}; } @@ -95,9 +96,9 @@ void TableHeaderComponent::setColumnName (const int columnId, const String& newN { if (auto* ci = getInfoForId (columnId)) { - if (ci->name != newName) + if (ci->getTitle() != newName) { - ci->name = newName; + ci->setTitle (newName); sendColumnsChanged(); } } @@ -116,7 +117,7 @@ void TableHeaderComponent::addColumn (const String& columnName, jassert (width > 0); auto ci = new ColumnInfo(); - ci->name = columnName; + ci->setTitle (columnName); ci->id = columnId; ci->width = width; ci->lastDeliberateWidth = width; @@ -125,7 +126,11 @@ void TableHeaderComponent::addColumn (const String& columnName, jassert (ci->maximumWidth >= ci->minimumWidth); ci->propertyFlags = propertyFlags; - columns.insert (insertIndex, ci); + auto* added = columns.insert (insertIndex, ci); + addChildComponent (added); + added->setVisible ((propertyFlags & visible) != 0); + + resized(); sendColumnsChanged(); } @@ -197,6 +202,7 @@ void TableHeaderComponent::setColumnWidth (const int columnId, const int newWidt } } + resized(); repaint(); columnsResized = true; triggerAsyncUpdate(); @@ -340,6 +346,7 @@ void TableHeaderComponent::resizeColumnsToFit (int firstColumnIndex, int targetT if (newWidth != ci->width) { ci->width = newWidth; + resized(); repaint(); columnsResized = true; triggerAsyncUpdate(); @@ -354,11 +361,7 @@ void TableHeaderComponent::setColumnVisible (const int columnId, const bool shou { if (shouldBeVisible != ci->isVisible()) { - if (shouldBeVisible) - ci->propertyFlags |= visible; - else - ci->propertyFlags &= ~visible; - + ci->setVisible (shouldBeVisible); sendColumnsChanged(); resized(); } @@ -409,6 +412,7 @@ bool TableHeaderComponent::isSortedForwards() const void TableHeaderComponent::reSortTable() { sortChanged = true; + resized(); repaint(); triggerAsyncUpdate(); } @@ -485,7 +489,7 @@ void TableHeaderComponent::addMenuItems (PopupMenu& menu, const int /*columnIdCl { for (auto* ci : columns) if ((ci->propertyFlags & appearsOnColumnMenu) != 0) - menu.addItem (ci->id, ci->name, + menu.addItem (ci->id, ci->getTitle(), (ci->propertyFlags & (sortedForwards | sortedBackwards)) == 0, isColumnVisible (ci->id)); } @@ -502,28 +506,42 @@ void TableHeaderComponent::paint (Graphics& g) lf.drawTableHeaderBackground (g, *this); - auto clip = g.getClipBounds(); + for (auto* ci : columns) + { + if (ci->isVisible() && ci->getWidth() > 0) + { + Graphics::ScopedSaveState ss (g); + + g.setOrigin (ci->getX(), ci->getY()); + g.reduceClipRegion (0, 0, ci->getWidth(), ci->getHeight()); + + lf.drawTableHeaderColumn (g, *this, ci->getTitle(), ci->id, ci->width, getHeight(), + ci->id == columnIdUnderMouse, + ci->id == columnIdUnderMouse && isMouseButtonDown(), + ci->propertyFlags); + } + } +} + +void TableHeaderComponent::resized() +{ + auto clip = getBounds(); int x = 0; + for (auto* ci : columns) + ci->setBounds (0, 0, 0, 0); + for (auto* ci : columns) { if (ci->isVisible()) { if (x + ci->width > clip.getX() - && (ci->id != columnIdBeingDragged - || dragOverlayComp == nullptr - || ! dragOverlayComp->isVisible())) + && (ci->id != columnIdBeingDragged + || dragOverlayComp == nullptr + || ! dragOverlayComp->isVisible())) { - Graphics::ScopedSaveState ss (g); - - g.setOrigin (x, 0); - g.reduceClipRegion (0, 0, ci->width, getHeight()); - - lf.drawTableHeaderColumn (g, *this, ci->name, ci->id, ci->width, getHeight(), - ci->id == columnIdUnderMouse, - ci->id == columnIdUnderMouse && isMouseButtonDown(), - ci->propertyFlags); + ci->setBounds (x, 0, ci->width, getHeight()); } x += ci->width; @@ -540,6 +558,7 @@ void TableHeaderComponent::mouseExit (const MouseEvent&) { setColumnUnderMou void TableHeaderComponent::mouseDown (const MouseEvent& e) { + resized(); repaint(); columnIdBeingResized = 0; columnIdBeingDragged = 0; @@ -716,6 +735,7 @@ void TableHeaderComponent::endDrag (const int finalIndex) moveColumn (columnIdBeingDragged, finalIndex); columnIdBeingDragged = 0; + resized(); repaint(); for (int i = listeners.size(); --i >= 0;) @@ -735,6 +755,7 @@ void TableHeaderComponent::mouseUp (const MouseEvent& e) c->lastDeliberateWidth = c->width; columnIdBeingResized = 0; + resized(); repaint(); endDrag (getIndexOfColumnId (columnIdBeingDragged, true)); @@ -756,10 +777,6 @@ MouseCursor TableHeaderComponent::getMouseCursor() } //============================================================================== -bool TableHeaderComponent::ColumnInfo::isVisible() const -{ - return (propertyFlags & TableHeaderComponent::visible) != 0; -} TableHeaderComponent::ColumnInfo* TableHeaderComponent::getInfoForId (int id) const { @@ -793,6 +810,7 @@ void TableHeaderComponent::sendColumnsChanged() if (stretchToFit && lastDeliberateWidth > 0) resizeAllColumnsToFit (lastDeliberateWidth); + resized(); repaint(); columnsChanged = true; triggerAsyncUpdate(); @@ -903,4 +921,9 @@ std::unique_ptr TableHeaderComponent::createAccessibilityH return std::make_unique (*this, AccessibilityRole::tableHeader); } +std::unique_ptr TableHeaderComponent::ColumnInfo::createAccessibilityHandler() +{ + return std::make_unique (*this, AccessibilityRole::tableHeader); +} + } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h index 8a6034de..3d1b0173 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h @@ -403,6 +403,8 @@ public: /** @internal */ void paint (Graphics&) override; /** @internal */ + void resized() override; + /** @internal */ void mouseMove (const MouseEvent&) override; /** @internal */ void mouseEnter (const MouseEvent&) override; @@ -421,13 +423,13 @@ public: virtual void showColumnChooserMenu (int columnIdClicked); private: - struct ColumnInfo + struct ColumnInfo : public Component { - String name; + ColumnInfo() { setInterceptsMouseClicks (false, false); } + std::unique_ptr createAccessibilityHandler() override; + int id, propertyFlags, width, minimumWidth, maximumWidth; double lastDeliberateWidth; - - bool isVisible() const; }; OwnedArray columns; diff --git a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp index f513b3c5..b332e5dc 100644 --- a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp @@ -26,6 +26,9 @@ namespace juce { +static const Identifier tableColumnProperty { "_tableColumnId" }; +static const Identifier tableAccessiblePlaceholderProperty { "_accessiblePlaceholder" }; + class TableListBox::RowComp : public Component, public TooltipClient { @@ -43,12 +46,12 @@ public: tableModel->paintRowBackground (g, row, getWidth(), getHeight(), isSelected); auto& headerComp = owner.getHeader(); - auto numColumns = headerComp.getNumColumns (true); - auto clipBounds = g.getClipBounds(); + const auto numColumns = jmin ((int) columnComponents.size(), headerComp.getNumColumns (true)); + const auto clipBounds = g.getClipBounds(); for (int i = 0; i < numColumns; ++i) { - if (columnComponents[i] == nullptr) + if (columnComponents[(size_t) i]->getProperties().contains (tableAccessiblePlaceholderProperty)) { auto columnRect = headerComp.getColumnPosition (i).withHeight (getHeight()); @@ -86,33 +89,62 @@ public: if (tableModel != nullptr && row < owner.getNumRows()) { - const Identifier columnProperty ("_tableColumnId"); - auto numColumns = owner.getHeader().getNumColumns (true); + const ComponentDeleter deleter { columnForComponent }; + const auto numColumns = owner.getHeader().getNumColumns (true); + + while (numColumns < (int) columnComponents.size()) + columnComponents.pop_back(); + + while ((int) columnComponents.size() < numColumns) + columnComponents.emplace_back (nullptr, deleter); for (int i = 0; i < numColumns; ++i) { auto columnId = owner.getHeader().getColumnIdOfIndex (i, true); - auto* comp = columnComponents[i]; - - if (comp != nullptr && columnId != static_cast (comp->getProperties() [columnProperty])) + auto originalComp = std::move (columnComponents[(size_t) i]); + auto oldCustomComp = originalComp != nullptr && ! originalComp->getProperties().contains (tableAccessiblePlaceholderProperty) + ? std::move (originalComp) + : std::unique_ptr { nullptr, deleter }; + auto compToRefresh = oldCustomComp != nullptr && columnId == static_cast (oldCustomComp->getProperties()[tableColumnProperty]) + ? std::move (oldCustomComp) + : std::unique_ptr { nullptr, deleter }; + + columnForComponent.erase (compToRefresh.get()); + std::unique_ptr newCustomComp { tableModel->refreshComponentForCell (row, + columnId, + isSelected, + compToRefresh.release()), + deleter }; + + auto columnComp = [&] { - columnComponents.set (i, nullptr); - comp = nullptr; - } - - comp = tableModel->refreshComponentForCell (row, columnId, isSelected, comp); - columnComponents.set (i, comp, false); - - if (comp != nullptr) - { - comp->getProperties().set (columnProperty, columnId); - - addAndMakeVisible (comp); - resizeCustomComp (i); - } + // We got a result from refreshComponentForCell, so use that + if (newCustomComp != nullptr) + return std::move (newCustomComp); + + // There was already a placeholder component for this column + if (originalComp != nullptr) + return std::move (originalComp); + + // Create a new placeholder component to use + std::unique_ptr comp { new Component, deleter }; + comp->setInterceptsMouseClicks (false, false); + comp->getProperties().set (tableAccessiblePlaceholderProperty, true); + return comp; + }(); + + columnForComponent.emplace (columnComp.get(), i); + + // In order for navigation to work correctly on macOS, the number of child + // accessibility elements on each row must match the number of header accessibility + // elements. + columnComp->setFocusContainerType (FocusContainerType::focusContainer); + columnComp->getProperties().set (tableColumnProperty, columnId); + addAndMakeVisible (*columnComp); + + columnComponents[(size_t) i] = std::move (columnComp); + resizeCustomComp (i); } - - columnComponents.removeRange (numColumns, columnComponents.size()); } else { @@ -122,15 +154,19 @@ public: void resized() override { - for (int i = columnComponents.size(); --i >= 0;) + for (auto i = (int) columnComponents.size(); --i >= 0;) resizeCustomComp (i); } void resizeCustomComp (int index) { - if (auto* c = columnComponents.getUnchecked (index)) - c->setBounds (owner.getHeader().getColumnPosition (index) - .withY (0).withHeight (getHeight())); + if (auto& c = columnComponents[(size_t) index]) + { + c->setBounds (owner.getHeader() + .getColumnPosition (index) + .withY (0) + .withHeight (getHeight())); + } } void mouseDown (const MouseEvent& e) override @@ -220,7 +256,18 @@ public: Component* findChildComponentForColumn (int columnId) const { - return columnComponents [owner.getHeader().getIndexOfColumnId (columnId, true)]; + const auto index = (size_t) owner.getHeader().getIndexOfColumnId (columnId, true); + + if (isPositiveAndBelow (index, columnComponents.size())) + return columnComponents[index].get(); + + return nullptr; + } + + int getColumnNumberOfComponent (const Component* comp) const + { + const auto iter = columnForComponent.find (comp); + return iter != columnForComponent.cend() ? iter->second : -1; } std::unique_ptr createAccessibilityHandler() override @@ -270,6 +317,7 @@ public: return state; } + private: class RowComponentCellInterface : public AccessibilityCellInterface { public: @@ -278,12 +326,6 @@ public: { } - int getColumnIndex() const override { return 0; } - int getColumnSpan() const override { return 1; } - - int getRowIndex() const override { return owner.rowComponent.row; } - int getRowSpan() const override { return 1; } - int getDisclosureLevel() const override { return 0; } const AccessibilityHandler* getTableHandler() const override { return owner.rowComponent.owner.getAccessibilityHandler(); } @@ -297,8 +339,27 @@ public: }; //============================================================================== + class ComponentDeleter + { + public: + explicit ComponentDeleter (std::map& locations) + : columnForComponent (&locations) {} + + void operator() (Component* comp) const + { + columnForComponent->erase (comp); + + if (comp != nullptr) + delete comp; + } + + private: + std::map* columnForComponent; + }; + TableListBox& owner; - OwnedArray columnComponents; + std::map columnForComponent; + std::vector> columnComponents; int row = -1; bool isSelected = false, isDragging = false, selectRowOnMouseUp = false; @@ -544,6 +605,22 @@ void TableListBox::updateColumnComponents() const rowComp->resized(); } +template +Optional findRecursively (const AccessibilityHandler& handler, + Component* outermost, + FindIndex&& findIndexOfComponent) +{ + for (auto* comp = &handler.getComponent(); comp != outermost; comp = comp->getParentComponent()) + { + const auto result = findIndexOfComponent (comp); + + if (result != -1) + return AccessibilityTableInterface::Span { result, 1 }; + } + + return nullopt; +} + std::unique_ptr TableListBox::createAccessibilityHandler() { class TableInterface : public AccessibilityTableInterface @@ -564,24 +641,64 @@ std::unique_ptr TableListBox::createAccessibilityHandler() int getNumColumns() const override { - return tableListBox.getHeader().getNumColumns (false); + return tableListBox.getHeader().getNumColumns (true); } - const AccessibilityHandler* getCellHandler (int row, int column) const override + const AccessibilityHandler* getRowHandler (int row) const override { if (isPositiveAndBelow (row, getNumRows())) - { - if (isPositiveAndBelow (column, getNumColumns())) - if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, false), row)) - return cellComponent->getAccessibilityHandler(); - if (auto* rowComp = tableListBox.getComponentForRowNumber (row)) return rowComp->getAccessibilityHandler(); - } return nullptr; } + const AccessibilityHandler* getCellHandler (int row, int column) const override + { + if (isPositiveAndBelow (row, getNumRows()) && isPositiveAndBelow (column, getNumColumns())) + if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, true), row)) + return cellComponent->getAccessibilityHandler(); + + return nullptr; + } + + const AccessibilityHandler* getHeaderHandler() const override + { + if (tableListBox.hasAccessibleHeaderComponent()) + return tableListBox.headerComponent->getAccessibilityHandler(); + + return nullptr; + } + + Optional getRowSpan (const AccessibilityHandler& handler) const override + { + if (tableListBox.isParentOf (&handler.getComponent())) + return findRecursively (handler, &tableListBox, [&] (auto* c) { return tableListBox.getRowNumberOfComponent (c); }); + + return nullopt; + } + + Optional getColumnSpan (const AccessibilityHandler& handler) const override + { + if (const auto rowSpan = getRowSpan (handler)) + if (auto* rowComponent = dynamic_cast (tableListBox.getComponentForRowNumber (rowSpan->begin))) + return findRecursively (handler, &tableListBox, [&] (auto* c) { return rowComponent->getColumnNumberOfComponent (c); }); + + return nullopt; + } + + void showCell (const AccessibilityHandler& handler) const override + { + const auto row = getRowSpan (handler); + const auto col = getColumnSpan (handler); + + if (row.hasValue() && col.hasValue()) + { + tableListBox.scrollToEnsureRowIsOnscreen (row->begin); + tableListBox.scrollToEnsureColumnIsOnscreen (col->begin); + } + } + private: TableListBox& tableListBox; @@ -589,7 +706,7 @@ std::unique_ptr TableListBox::createAccessibilityHandler() }; return std::make_unique (*this, - AccessibilityRole::list, + AccessibilityRole::table, AccessibilityActions{}, AccessibilityHandler::Interfaces { std::make_unique (*this) }); } diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp index 5c2055be..10a09d3a 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp @@ -1168,7 +1168,7 @@ void TextEditor::updateCaretPosition() { Iterator i (*this); caret->setCaretPosition (getCaretRectangle().translated (leftIndent, - topIndent + roundToInt (i.getYOffset()))); + topIndent + roundToInt (i.getYOffset())) - getTextOffset()); if (auto* handler = getAccessibilityHandler()) handler->notifyAccessibilityEvent (AccessibilityEvent::textSelectionChanged); @@ -1229,6 +1229,7 @@ void TextEditor::clear() clearInternal (nullptr); checkLayout(); undoManager.clearUndoHistory(); + repaint(); } void TextEditor::setText (const String& newText, bool sendTextChangeMessage) @@ -1450,18 +1451,13 @@ void TextEditor::scrollEditorToPositionCaret (const int desiredCaretX, viewport->setViewPosition (vx, vy); } -Rectangle TextEditor::getCaretRectangle() -{ - return getCaretRectangleFloat().getSmallestIntegerContainer(); -} - -Rectangle TextEditor::getCaretRectangleFloat() const +Rectangle TextEditor::getCaretRectangleForCharIndex (int index) const { Point anchor; auto cursorHeight = currentFont.getHeight(); // (in case the text is empty and the call below doesn't set this value) - getCharPosition (caretPosition, anchor, cursorHeight); + getCharPosition (index, anchor, cursorHeight); - return { anchor.x, anchor.y, 2.0f, cursorHeight }; + return Rectangle { anchor.x, anchor.y, 2.0f, cursorHeight }.getSmallestIntegerContainer() + getTextOffset(); } Point TextEditor::getTextOffset() const noexcept @@ -1473,7 +1469,7 @@ Point TextEditor::getTextOffset() const noexcept roundToInt ((float) getTopIndent() + (float) borderSize.getTop() + yOffset) - viewport->getViewPositionY() }; } -RectangleList TextEditor::getTextBounds (Range textRange) +RectangleList TextEditor::getTextBounds (Range textRange) const { RectangleList boundingBox; Iterator i (*this); @@ -1563,7 +1559,7 @@ void TextEditor::scrollToMakeSureCursorIsVisible() if (keepCaretOnScreen) { auto viewPos = viewport->getViewPosition(); - auto caretRect = getCaretRectangle().translated (leftIndent, topIndent); + auto caretRect = getCaretRectangle().translated (leftIndent, topIndent) - getTextOffset(); auto relativeCursor = caretRect.getPosition() - viewPos; if (relativeCursor.x < jmax (1, proportionOfWidth (0.05f))) @@ -1646,6 +1642,16 @@ int TextEditor::getTextIndexAt (const int x, const int y) const (float) (y - offset.y)); } +int TextEditor::getTextIndexAt (const Point pt) const +{ + return getTextIndexAt (pt.x, pt.y); +} + +int TextEditor::getCharIndexForPoint (const Point point) const +{ + return getTextIndexAt (isMultiLine() ? point : getTextBounds ({ 0, getTotalNumChars() }).getBounds().getConstrainedPoint (point)); +} + void TextEditor::insertTextAtCaret (const String& t) { String newText (inputFilter != nullptr ? inputFilter->filterNewText (*this, t) : t); @@ -1669,8 +1675,13 @@ void TextEditor::insertTextAtCaret (const String& t) void TextEditor::setHighlightedRegion (const Range& newSelection) { - moveCaretTo (newSelection.getStart(), false); - moveCaretTo (newSelection.getEnd(), true); + if (newSelection == getHighlightedRegion()) + return; + + const auto cursorAtStart = newSelection.getEnd() == getHighlightedRegion().getStart() + || newSelection.getEnd() == getHighlightedRegion().getEnd(); + moveCaretTo (cursorAtStart ? newSelection.getEnd() : newSelection.getStart(), false); + moveCaretTo (cursorAtStart ? newSelection.getStart() : newSelection.getEnd(), true); } //============================================================================== @@ -1852,8 +1863,7 @@ void TextEditor::mouseDown (const MouseEvent& e) { if (! (popupMenuEnabled && e.mods.isPopupMenu())) { - moveCaretTo (getTextIndexAt (e.x, e.y), - e.mods.isShiftDown()); + moveCaretTo (getTextIndexAt (e.getPosition()), e.mods.isShiftDown()); if (auto* peer = getPeer()) peer->closeInputMethodContext(); @@ -1888,7 +1898,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) if (wasFocused || ! selectAllTextWhenFocused) if (! (popupMenuEnabled && e.mods.isPopupMenu())) - moveCaretTo (getTextIndexAt (e.x, e.y), true); + moveCaretTo (getTextIndexAt (e.getPosition()), true); } void TextEditor::mouseUp (const MouseEvent& e) @@ -1901,7 +1911,7 @@ void TextEditor::mouseUp (const MouseEvent& e) if (wasFocused || ! selectAllTextWhenFocused) if (e.mouseWasClicked() && ! (popupMenuEnabled && e.mods.isPopupMenu())) - moveCaret (getTextIndexAt (e.x, e.y)); + moveCaret (getTextIndexAt (e.getPosition())); wasFocused = true; } @@ -1911,7 +1921,7 @@ void TextEditor::mouseDoubleClick (const MouseEvent& e) if (! mouseDownInEditor) return; - int tokenEnd = getTextIndexAt (e.x, e.y); + int tokenEnd = getTextIndexAt (e.getPosition()); int tokenStart = 0; if (e.getNumberOfClicks() > 3) @@ -2025,7 +2035,7 @@ bool TextEditor::moveCaretUp (bool selecting) if (! isMultiLine()) return moveCaretToStartOfLine (selecting); - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - 1.0f), selecting); } @@ -2034,7 +2044,7 @@ bool TextEditor::moveCaretDown (bool selecting) if (! isMultiLine()) return moveCaretToEndOfLine (selecting); - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + 1.0f), selecting); } @@ -2043,7 +2053,7 @@ bool TextEditor::pageUp (bool selecting) if (! isMultiLine()) return moveCaretToStartOfLine (selecting); - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - (float) viewport->getViewHeight()), selecting); } @@ -2052,7 +2062,7 @@ bool TextEditor::pageDown (bool selecting) if (! isMultiLine()) return moveCaretToEndOfLine (selecting); - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + (float) viewport->getViewHeight()), selecting); } @@ -2080,7 +2090,7 @@ bool TextEditor::moveCaretToTop (bool selecting) bool TextEditor::moveCaretToStartOfLine (bool selecting) { - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition (0.0f, caretPos.getY()), selecting); } @@ -2091,7 +2101,7 @@ bool TextEditor::moveCaretToEnd (bool selecting) bool TextEditor::moveCaretToEndOfLine (bool selecting) { - auto caretPos = getCaretRectangleFloat(); + const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat(); return moveCaretWithTransaction (indexAtPosition ((float) textHolder->getWidth(), caretPos.getY()), selecting); } @@ -2726,20 +2736,7 @@ private: void setSelection (Range r) override { - if (r == textEditor.getHighlightedRegion()) - return; - - if (r.isEmpty()) - { - textEditor.setCaretPosition (r.getStart()); - } - else - { - const auto cursorAtStart = r.getEnd() == textEditor.getHighlightedRegion().getStart() - || r.getEnd() == textEditor.getHighlightedRegion().getEnd(); - textEditor.moveCaretTo (cursorAtStart ? r.getEnd() : r.getStart(), false); - textEditor.moveCaretTo (cursorAtStart ? r.getStart() : r.getEnd(), true); - } + textEditor.setHighlightedRegion (r); } String getText (Range r) const override @@ -2771,8 +2768,7 @@ private: int getOffsetAtPoint (Point point) const override { - auto localPoint = textEditor.getLocalPoint (nullptr, point); - return textEditor.getTextIndexAt (localPoint.x, localPoint.y); + return textEditor.getTextIndexAt (textEditor.getLocalPoint (nullptr, point)); } private: diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.h b/modules/juce_gui_basics/widgets/juce_TextEditor.h index d817e5ec..d93e6af1 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.h +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.h @@ -423,7 +423,7 @@ public: /** Returns the current index of the caret. @see setCaretPosition */ - int getCaretPosition() const; + int getCaretPosition() const override; /** Moves the caret to be in front of a given character. @see getCaretPosition, moveCaretToEnd @@ -443,12 +443,11 @@ public: */ void scrollEditorToPositionCaret (int desiredCaretX, int desiredCaretY); - /** Get the graphical position of the caret. + /** Get the graphical position of the caret for a particular index in the text. The rectangle returned is relative to the component's top-left corner. - @see scrollEditorToPositionCaret */ - Rectangle getCaretRectangle() override; + Rectangle getCaretRectangleForCharIndex (int index) const override; /** Selects a section of the text. */ void setHighlightedRegion (const Range& newSelection) override; @@ -467,12 +466,22 @@ public: */ int getTextIndexAt (int x, int y) const; + /** Finds the index of the character at a given position. + The coordinates are relative to the component's top-left. + */ + int getTextIndexAt (Point) const; + + /** Like getTextIndexAt, but doesn't snap to the beginning/end of the range for + points vertically outside the text. + */ + int getCharIndexForPoint (Point point) const override; + /** Counts the number of characters in the text. This is quicker than getting the text as a string if you just need to know the length. */ - int getTotalNumChars() const; + int getTotalNumChars() const override; /** Returns the total width of the text, as it is currently laid-out. @@ -541,7 +550,7 @@ public: The bounds are relative to the component's top-left and may extend beyond the bounds of the component if the text is long and word wrapping is disabled. */ - RectangleList getTextBounds (Range textRange); + RectangleList getTextBounds (Range textRange) const override; //============================================================================== void moveCaretToEnd(); @@ -826,7 +835,6 @@ private: void reinsert (int insertIndex, const OwnedArray&); void remove (Range, UndoManager*, int caretPositionToMoveTo); void getCharPosition (int index, Point&, float& lineHeight) const; - Rectangle getCaretRectangleFloat() const; void updateCaretPosition(); void updateValueFromText(); void textWasChangedByValue(); diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.cpp b/modules/juce_gui_basics/widgets/juce_TreeView.cpp index c040a67d..38c22777 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.cpp +++ b/modules/juce_gui_basics/widgets/juce_TreeView.cpp @@ -143,22 +143,37 @@ private: public: explicit ItemCellInterface (ItemComponent& c) : itemComponent (c) {} - int getColumnIndex() const override { return 0; } - int getColumnSpan() const override { return 1; } - - int getRowIndex() const override + int getDisclosureLevel() const override { - return itemComponent.getRepresentedItem().getRowNumberInTree(); + return getItemDepth (&itemComponent.getRepresentedItem()); } - int getRowSpan() const override + std::vector getDisclosedRows() const override { - return 1; - } + const auto& representedItem = itemComponent.getRepresentedItem(); + const auto* tree = representedItem.getOwnerView(); - int getDisclosureLevel() const override - { - return getItemDepth (&itemComponent.getRepresentedItem()); + if (tree == nullptr) + return {}; + + const auto numSubItems = representedItem.isOpen() ? representedItem.getNumSubItems() : 0; + + std::vector result; + result.reserve ((size_t) numSubItems); + + for (auto i = 0; i < numSubItems; ++i) + { + result.push_back ([&]() -> const AccessibilityHandler* + { + if (auto* subItem = representedItem.getSubItem (i)) + if (auto* component = tree->getItemComponent (subItem)) + return component->getAccessibilityHandler(); + + return nullptr; + }()); + } + + return result; } const AccessibilityHandler* getTableHandler() const override @@ -284,7 +299,7 @@ public: ItemComponent* getItemComponentAt (Point p) { auto iter = std::find_if (itemComponents.cbegin(), itemComponents.cend(), - [p] (const std::unique_ptr& c) + [p] (const auto& c) { return c->getBounds().contains (p); }); @@ -298,7 +313,7 @@ public: ItemComponent* getComponentForItem (const TreeViewItem* item) const { const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(), - [item] (const std::unique_ptr& c) + [item] (const auto& c) { return &c->getRepresentedItem() == item; }); @@ -312,7 +327,7 @@ public: void itemBeingDeleted (const TreeViewItem* item) { const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(), - [item] (const std::unique_ptr& c) + [item] (const auto& c) { return &c->getRepresentedItem() == item; }); @@ -329,6 +344,12 @@ public: } } + const TreeViewItem* getItemForItemComponent (const Component* comp) const + { + const auto iter = itemForItemComponent.find (comp); + return iter != itemForItemComponent.cend() ? iter->second : nullptr; + } + void updateComponents() { std::set componentsToKeep; @@ -341,7 +362,8 @@ public: } else { - auto newComp = std::make_unique (*treeItem); + std::unique_ptr newComp { new ItemComponent (*treeItem), Deleter { itemForItemComponent } }; + itemForItemComponent.emplace (newComp.get(), treeItem); addAndMakeVisible (*newComp); newComp->addMouseListener (this, treeItem->customComponentUsesTreeViewMouseHandler()); @@ -402,7 +424,7 @@ private: updateItemUnderMouse (e); isDragging = false; - scopedScrollDisabler = nullptr; + scopedScrollDisabler = nullopt; needSelectionOnMouseUp = false; if (! isEnabled()) @@ -495,7 +517,7 @@ private: auto imageOffset = pos.getPosition() - e.getPosition(); dragContainer->startDragging (dragDescription, &owner, { dragImage, additionalScale }, true, &imageOffset, &e.source); - scopedScrollDisabler = std::make_unique (*itemComponent); + scopedScrollDisabler.emplace (*itemComponent); } else { @@ -660,12 +682,32 @@ private: return visibleItems; } + //============================================================================== + class Deleter + { + public: + explicit Deleter (std::map& map) + : itemForItemComponent (&map) {} + + void operator() (ItemComponent* ptr) const + { + itemForItemComponent->erase (ptr); + + if (ptr != nullptr) + delete ptr; + } + + private: + std::map* itemForItemComponent = nullptr; + }; + //============================================================================== TreeView& owner; - std::vector> itemComponents; + std::map itemForItemComponent; + std::vector> itemComponents; ItemComponent* itemUnderMouse = nullptr; - std::unique_ptr scopedScrollDisabler; + Optional scopedScrollDisabler; bool isDragging = false, needSelectionOnMouseUp = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentComponent) @@ -1053,7 +1095,7 @@ void TreeView::moveSelectedRow (int delta) } } -void TreeView::scrollToKeepItemVisible (TreeViewItem* item) +void TreeView::scrollToKeepItemVisible (const TreeViewItem* item) { if (item != nullptr && item->ownerView == this) { @@ -1448,7 +1490,12 @@ std::unique_ptr TreeView::createAccessibilityHandler() int getNumRows() const override { return treeView.getNumRowsInTree(); } int getNumColumns() const override { return 1; } - const AccessibilityHandler* getCellHandler (int row, int) const override + const AccessibilityHandler* getHeaderHandler() const override + { + return nullptr; + } + + const AccessibilityHandler* getRowHandler (int row) const override { if (auto* itemComp = treeView.getItemComponent (treeView.getItemOnRow (row))) return itemComp->getAccessibilityHandler(); @@ -1456,7 +1503,44 @@ std::unique_ptr TreeView::createAccessibilityHandler() return nullptr; } + const AccessibilityHandler* getCellHandler (int, int) const override + { + return nullptr; + } + + Optional getRowSpan (const AccessibilityHandler& handler) const override + { + auto* item = getItemForHandler (handler); + + if (item == nullptr) + return nullopt; + + const auto rowNumber = item->getRowNumberInTree(); + + return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 }) + : nullopt; + } + + Optional getColumnSpan (const AccessibilityHandler&) const override + { + return Span { 0, 1 }; + } + + void showCell (const AccessibilityHandler& cellHandler) const override + { + treeView.scrollToKeepItemVisible (getItemForHandler (cellHandler)); + } + private: + const TreeViewItem* getItemForHandler (const AccessibilityHandler& handler) const + { + for (auto* comp = &handler.getComponent(); comp != &treeView; comp = comp->getParentComponent()) + if (auto* result = treeView.viewport->getContentComp()->getItemForItemComponent (comp)) + return result; + + return nullptr; + } + TreeView& treeView; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface) @@ -1811,7 +1895,7 @@ void TreeViewItem::updatePositions (int newY) } } -TreeViewItem* TreeViewItem::getDeepestOpenParentItem() noexcept +const TreeViewItem* TreeViewItem::getDeepestOpenParentItem() const noexcept { auto* result = this; auto* item = this; diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.h b/modules/juce_gui_basics/widgets/juce_TreeView.h index 51b3f64e..0a40a90f 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.h +++ b/modules/juce_gui_basics/widgets/juce_TreeView.h @@ -613,7 +613,7 @@ private: int getIndentX() const noexcept; void setOwnerView (TreeView*) noexcept; TreeViewItem* getTopLevelItem() noexcept; - TreeViewItem* getDeepestOpenParentItem() noexcept; + const TreeViewItem* getDeepestOpenParentItem() const noexcept; int getNumRows() const noexcept; TreeViewItem* getItemOnRow (int) noexcept; void deselectAllRecursively (TreeViewItem*); @@ -798,7 +798,7 @@ public: TreeViewItem* getItemAt (int yPosition) const noexcept; /** Tries to scroll the tree so that this item is on-screen somewhere. */ - void scrollToKeepItemVisible (TreeViewItem* item); + void scrollToKeepItemVisible (const TreeViewItem* item); /** Returns the TreeView's Viewport object. */ Viewport* getViewport() const noexcept; diff --git a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp index b024f9dd..c2da248c 100644 --- a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp @@ -83,9 +83,6 @@ public: ? Component::getApproximateScaleFactorForComponent (options.componentToCentreAround) : 1.0f) { - setUsingNativeTitleBar (options.useNativeTitleBar); - setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows()); - if (options.content.willDeleteObject()) setContentOwned (options.content.release(), true); else @@ -93,6 +90,9 @@ public: centreAroundComponent (options.componentToCentreAround, getWidth(), getHeight()); setResizable (options.resizable, options.useBottomRightCornerResizer); + + setUsingNativeTitleBar (options.useNativeTitleBar); + setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows()); } void closeButtonPressed() override diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp index 95db8b9c..da5b4a9a 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp @@ -71,21 +71,7 @@ private: void setSelection (Range r) override { - if (r == codeEditorComponent.getHighlightedRegion()) - return; - - if (r.isEmpty()) - { - codeEditorComponent.caretPos.setPosition (r.getStart()); - return; - } - - auto& doc = codeEditorComponent.document; - - const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart() - || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd(); - codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()), - CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd())); + codeEditorComponent.setHighlightedRegion (r); } String getText (Range r) const override @@ -108,32 +94,7 @@ private: RectangleList getTextBounds (Range textRange) const override { - auto& doc = codeEditorComponent.document; - - RectangleList localRects; - - CodeDocument::Position startPosition (doc, textRange.getStart()); - CodeDocument::Position endPosition (doc, textRange.getEnd()); - - for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line) - { - CodeDocument::Position lineStart (doc, line, 0); - CodeDocument::Position lineEnd (doc, line, doc.getLine (line).length()); - - if (line == startPosition.getLineNumber()) - lineStart = lineStart.movedBy (startPosition.getIndexInLine()); - - if (line == endPosition.getLineNumber()) - lineEnd = { doc, line, endPosition.getIndexInLine() }; - - auto startPos = codeEditorComponent.getCharacterBounds (lineStart).getTopLeft(); - auto endPos = codeEditorComponent.getCharacterBounds (lineEnd).getTopLeft(); - - localRects.add (startPos.x, - startPos.y, - jmax (1, endPos.x - startPos.x), - codeEditorComponent.getLineHeight()); - } + const auto localRects = codeEditorComponent.getTextBounds (textRange); RectangleList globalRects; @@ -213,11 +174,23 @@ public: return true; } - void getHighlightArea (RectangleList& area, float x, int y, int lineH, float characterWidth) const + Optional> getHighlightArea (float x, int y, int lineH, float characterWidth) const { - if (highlightColumnStart < highlightColumnEnd) - area.add (Rectangle (x + (float) highlightColumnStart * characterWidth - 1.0f, (float) y - 0.5f, - (float) (highlightColumnEnd - highlightColumnStart) * characterWidth + 1.5f, (float) lineH + 1.0f)); + return getHighlightArea (x, y, lineH, characterWidth, { highlightColumnStart, highlightColumnEnd }); + } + + Optional> getHighlightArea (float x, + int y, + int lineH, + float characterWidth, + Range highlightColumns) const + { + if (highlightColumns.isEmpty()) + return {}; + + return Rectangle (x + (float) highlightColumns.getStart() * characterWidth - 1.0f, (float) y - 0.5f, + (float) (highlightColumns.getEnd() - highlightColumns.getStart()) * characterWidth + 1.5f, (float) lineH + 1.0f); + } void draw (CodeEditorComponent& owner, Graphics& g, const Font& fontToUse, @@ -533,14 +506,6 @@ void CodeEditorComponent::setTemporaryUnderlining (const Array>&) jassertfalse; // TODO Windows IME not yet supported for this comp.. } -Rectangle CodeEditorComponent::getCaretRectangle() -{ - if (caret != nullptr) - return getLocalArea (caret.get(), caret->getLocalBounds()); - - return {}; -} - void CodeEditorComponent::setLineNumbersShown (const bool shouldBeShown) { if (showLineNumbers != shouldBeShown) @@ -598,25 +563,26 @@ void CodeEditorComponent::paint (Graphics& g) { g.fillAll (findColour (CodeEditorComponent::backgroundColourId)); - auto gutterSize = getGutterSize(); - auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight(); - auto right = verticalScrollBar.isVisible() ? verticalScrollBar.getX() : getWidth(); + const auto gutterSize = getGutterSize(); + const auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight(); + const auto right = verticalScrollBar.isVisible() ? verticalScrollBar.getX() : getWidth(); g.reduceClipRegion (gutterSize, 0, right - gutterSize, bottom); g.setFont (font); - auto clip = g.getClipBounds(); - auto firstLineToDraw = jmax (0, clip.getY() / lineHeight); - auto lastLineToDraw = jmin (lines.size(), clip.getBottom() / lineHeight + 1); - auto x = (float) (gutterSize - xOffset * charWidth); - auto rightClip = (float) clip.getRight(); + const auto clip = g.getClipBounds(); + const auto firstLineToDraw = jmax (0, clip.getY() / lineHeight); + const auto lastLineToDraw = jmin (lines.size(), clip.getBottom() / lineHeight + 1); + const auto x = (float) (gutterSize - xOffset * charWidth); + const auto rightClip = (float) clip.getRight(); { RectangleList highlightArea; for (int i = firstLineToDraw; i < lastLineToDraw; ++i) - lines.getUnchecked(i)->getHighlightArea (highlightArea, x, lineHeight * i, lineHeight, charWidth); + if (const auto area = lines.getUnchecked(i)->getHighlightArea (x, lineHeight * i, lineHeight, charWidth)) + highlightArea.add (*area); g.setColour (findColour (CodeEditorComponent::highlightColourId)); g.fillRectList (highlightArea); @@ -893,6 +859,37 @@ CodeDocument::Position CodeEditorComponent::getPositionAt (int x, int y) const return CodeDocument::Position (document, line, index); } +int CodeEditorComponent::getCharIndexForPoint (Point point) const +{ + return getPositionAt (point.x, point.y).getPosition(); +} + +RectangleList CodeEditorComponent::getTextBounds (Range textRange) const +{ + RectangleList localRects; + + const CodeDocument::Position startPosition (document, textRange.getStart()); + const CodeDocument::Position endPosition (document, textRange.getEnd()); + + for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line) + { + const CodeDocument::Position lineStartColumn0 { document, line, 0 }; + + const auto lineStart = line == startPosition.getLineNumber() ? lineStartColumn0.movedBy (startPosition.getIndexInLine()) + : lineStartColumn0; + + const CodeDocument::Position lineEnd { document, line, line == endPosition.getLineNumber() ? endPosition.getIndexInLine() + : document.getLine (line).length() }; + + const auto startPos = getCharacterBounds (lineStart).getTopLeft(); + const auto endPos = getCharacterBounds (lineEnd) .getTopLeft(); + + localRects.add (startPos.x, startPos.y, jmax (1, endPos.x - startPos.x), getLineHeight()); + } + + return localRects; +} + //============================================================================== void CodeEditorComponent::insertTextAtCaret (const String& newText) { @@ -1336,8 +1333,13 @@ bool CodeEditorComponent::isHighlightActive() const noexcept void CodeEditorComponent::setHighlightedRegion (const Range& newRange) { - selectRegion (CodeDocument::Position (document, newRange.getStart()), - CodeDocument::Position (document, newRange.getEnd())); + if (newRange == getHighlightedRegion()) + return; + + const auto cursorAtStart = newRange.getEnd() == getHighlightedRegion().getStart() + || newRange.getEnd() == getHighlightedRegion().getEnd(); + selectRegion (CodeDocument::Position (document, cursorAtStart ? newRange.getEnd() : newRange.getStart()), + CodeDocument::Position (document, cursorAtStart ? newRange.getStart() : newRange.getEnd())); } String CodeEditorComponent::getTextInRange (const Range& range) const diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h index 19f36daf..e3a67e69 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h @@ -92,8 +92,8 @@ public: /** Returns the current caret position. */ CodeDocument::Position getCaretPos() const { return caretPos; } - /** Returns the position of the caret, relative to the editor's origin. */ - Rectangle getCaretRectangle() override; + /** Returns the total number of codepoints in the string. */ + int getTotalNumChars() const override { return document.getNumCharacters(); } /** Moves the caret. If selecting is true, the section of the document between the current @@ -121,6 +121,26 @@ public: /** Enables or disables the line-number display in the gutter. */ void setLineNumbersShown (bool shouldBeShown); + /** Returns the number of characters from the beginning of the document to the caret. */ + int getCaretPosition() const override { return getCaretPos().getPosition(); } + + /** @see getPositionAt */ + int getCharIndexForPoint (Point point) const override; + + /** Returns the bounds of the caret at a particular location in the text. */ + Rectangle getCaretRectangleForCharIndex (int index) const override + { + return getCharacterBounds ({ document, index }); + } + + /** Returns the bounding box for a range of text in the editor. As the range may span + multiple lines, this method returns a RectangleList. + + The bounds are relative to the component's top-left and may extend beyond the bounds + of the component if the text is long and word wrapping is disabled. + */ + RectangleList getTextBounds (Range textRange) const override; + //============================================================================== bool moveCaretLeft (bool moveInWholeWordSteps, bool selecting); bool moveCaretRight (bool moveInWholeWordSteps, bool selecting); diff --git a/modules/juce_gui_extra/juce_gui_extra.cpp b/modules/juce_gui_extra/juce_gui_extra.cpp index dbb4d75a..4f60cb8f 100644 --- a/modules/juce_gui_extra/juce_gui_extra.cpp +++ b/modules/juce_gui_extra/juce_gui_extra.cpp @@ -67,10 +67,7 @@ #import #if JUCE_PUSH_NOTIFICATIONS - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - #import - #endif - + #import #include "native/juce_ios_PushNotifications.cpp" #endif diff --git a/modules/juce_gui_extra/juce_gui_extra.h b/modules/juce_gui_extra/juce_gui_extra.h index 506b2a02..7dd7c685 100644 --- a/modules/juce_gui_extra/juce_gui_extra.h +++ b/modules/juce_gui_extra/juce_gui_extra.h @@ -33,18 +33,20 @@ BEGIN_JUCE_MODULE_DECLARATION - ID: juce_gui_extra - vendor: juce - version: 7.0.1 - name: JUCE extended GUI classes - description: Miscellaneous GUI classes for specialised tasks. - website: http://www.juce.com/juce - license: GPL/Commercial - minimumCppStandard: 14 - - dependencies: juce_gui_basics - OSXFrameworks: WebKit - iOSFrameworks: WebKit + ID: juce_gui_extra + vendor: juce + version: 7.0.2 + name: JUCE extended GUI classes + description: Miscellaneous GUI classes for specialised tasks. + website: http://www.juce.com/juce + license: GPL/Commercial + minimumCppStandard: 14 + + dependencies: juce_gui_basics + OSXFrameworks: WebKit + iOSFrameworks: WebKit + WeakiOSFrameworks: UserNotifications + WeakMacOSFrameworks: UserNotifications END_JUCE_MODULE_DECLARATION diff --git a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp index 05c25dc7..ade2379d 100644 --- a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp @@ -26,34 +26,16 @@ namespace juce { -namespace PushNotificationsDelegateDetails +struct PushNotificationsDelegateDetails { //============================================================================== using Action = PushNotifications::Settings::Action; using Category = PushNotifications::Settings::Category; - void* actionToNSAction (const Action& a, bool iOSEarlierThan10) + static void* actionToNSAction (const Action& a) { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - auto action = [[UIMutableUserNotificationAction alloc] init]; - - action.identifier = juceStringToNS (a.identifier); - action.title = juceStringToNS (a.title); - action.behavior = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput - : UIUserNotificationActionBehaviorDefault; - action.parameters = varObjectToNSDictionary (a.parameters); - action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground - : UIUserNotificationActivationModeForeground; - action.destructive = (bool) a.destructive; - - [action autorelease]; - - return action; - } - else - { - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (a.style == Action::text) { return [UNTextInputNotificationAction actionWithIdentifier: juceStringToNS (a.identifier) @@ -66,42 +48,35 @@ namespace PushNotificationsDelegateDetails return [UNNotificationAction actionWithIdentifier: juceStringToNS (a.identifier) title: juceStringToNS (a.title) options: NSUInteger (a.destructive << 1 | (! a.triggerInBackground) << 2)]; - #else - return nullptr; - #endif } - } - void* categoryToNSCategory (const Category& c, bool iOSEarlierThan10) - { - if (iOSEarlierThan10) - { - auto category = [[UIMutableUserNotificationCategory alloc] init]; - category.identifier = juceStringToNS (c.identifier); + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + auto action = [[UIMutableUserNotificationAction alloc] init]; - auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()]; + action.identifier = juceStringToNS (a.identifier); + action.title = juceStringToNS (a.title); + action.behavior = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput + : UIUserNotificationActionBehaviorDefault; + action.parameters = varObjectToNSDictionary (a.parameters); + action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground + : UIUserNotificationActivationModeForeground; + action.destructive = (bool) a.destructive; - for (const auto& a : c.actions) - { - auto* action = (UIUserNotificationAction*) actionToNSAction (a, iOSEarlierThan10); - [actions addObject: action]; - } - - [category setActions: actions forContext: UIUserNotificationActionContextDefault]; - [category setActions: actions forContext: UIUserNotificationActionContextMinimal]; + [action autorelease]; - [category autorelease]; + return action; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } - return category; - } - else + static void* categoryToNSCategory (const Category& c) + { + if (@available (iOS 10, *)) { - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()]; for (const auto& a : c.actions) { - auto* action = (UNNotificationAction*) actionToNSAction (a, iOSEarlierThan10); + auto* action = (UNNotificationAction*) actionToNSAction (a); [actions addObject: action]; } @@ -109,14 +84,32 @@ namespace PushNotificationsDelegateDetails actions: actions intentIdentifiers: @[] options: c.sendDismissAction ? UNNotificationCategoryOptionCustomDismissAction : 0]; - #else - return nullptr; - #endif } + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + auto category = [[UIMutableUserNotificationCategory alloc] init]; + category.identifier = juceStringToNS (c.identifier); + + auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()]; + + for (const auto& a : c.actions) + { + auto* action = (UIUserNotificationAction*) actionToNSAction (a); + [actions addObject: action]; + } + + [category setActions: actions forContext: UIUserNotificationActionContextDefault]; + [category setActions: actions forContext: UIUserNotificationActionContextMinimal]; + + [category autorelease]; + + return category; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } //============================================================================== - UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n) + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + static UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n) { auto notification = [[UILocalNotification alloc] init]; @@ -138,9 +131,9 @@ namespace PushNotificationsDelegateDetails return notification; } + JUCE_END_IGNORE_WARNINGS_GCC_LIKE - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n) + static UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n) { // content auto content = [[UNMutableNotificationContent alloc] init]; @@ -183,9 +176,8 @@ namespace PushNotificationsDelegateDetails return request; } - #endif - String getUserResponseFromNSDictionary (NSDictionary* dictionary) + static String getUserResponseFromNSDictionary (NSDictionary* dictionary) { if (dictionary == nil || dictionary.count == 0) return {}; @@ -207,7 +199,7 @@ namespace PushNotificationsDelegateDetails } //============================================================================== - var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar) + static var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar) { DynamicObject* dictionaryVarObject = dictionaryVar.getDynamicObject(); @@ -232,8 +224,7 @@ namespace PushNotificationsDelegateDetails } //============================================================================== - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t) + static double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t) { if (t != nil) { @@ -254,7 +245,7 @@ namespace PushNotificationsDelegateDetails return 0.; } - PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r) + static PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r) { PushNotifications::Notification n; @@ -283,13 +274,13 @@ namespace PushNotificationsDelegateDetails return n; } - PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n) + static PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n) { return unNotificationRequestToJuceNotification (n.request); } - #endif - PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n) + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + static PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n) { PushNotifications::Notification notif; @@ -312,7 +303,7 @@ namespace PushNotificationsDelegateDetails return notif; } - Action uiUserNotificationActionToAction (UIUserNotificationAction* a) + static Action uiUserNotificationActionToAction (UIUserNotificationAction* a) { Action action; @@ -329,7 +320,7 @@ namespace PushNotificationsDelegateDetails return action; } - Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c) + static Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c) { Category category; category.identifier = nsStringToJuce (c.identifier); @@ -339,9 +330,9 @@ namespace PushNotificationsDelegateDetails return category; } + JUCE_END_IGNORE_WARNINGS_GCC_LIKE - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - Action unNotificationActionToAction (UNNotificationAction* a) + static Action unNotificationActionToAction (UNNotificationAction* a) { Action action; @@ -366,7 +357,7 @@ namespace PushNotificationsDelegateDetails return action; } - Category unNotificationCategoryToCategory (UNNotificationCategory* c) + static Category unNotificationCategoryToCategory (UNNotificationCategory* c) { Category category; @@ -378,9 +369,8 @@ namespace PushNotificationsDelegateDetails return category; } - #endif - PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary) + static PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary) { const var dictionaryVar = nsDictionaryToVar (dictionary); @@ -411,175 +401,34 @@ namespace PushNotificationsDelegateDetails return notification; } -} - -//============================================================================== -struct PushNotificationsDelegate -{ - PushNotificationsDelegate() : delegate ([getClass().createInstance() init]) - { - Class::setThis (delegate.get(), this); - - id appDelegate = [[UIApplication sharedApplication] delegate]; - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") - if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)]) - [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()]; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - } - - virtual ~PushNotificationsDelegate() {} - - virtual void didRegisterUserNotificationSettings (UIUserNotificationSettings* notificationSettings) = 0; - - virtual void registeredForRemoteNotifications (NSData* deviceToken) = 0; - - virtual void failedToRegisterForRemoteNotifications (NSError* error) = 0; - - virtual void didReceiveRemoteNotification (NSDictionary* userInfo) = 0; - - virtual void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo, - void (^completionHandler)(UIBackgroundFetchResult result)) = 0; - - virtual void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier, - NSDictionary* userInfo, - NSDictionary* responseInfo, - void (^completionHandler)()) = 0; - - virtual void didReceiveLocalNotification (UILocalNotification* notification) = 0; - - virtual void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier, - UILocalNotification* notification, - void (^completionHandler)()) = 0; - - virtual void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier, - UILocalNotification* notification, - NSDictionary* responseInfo, - void (^completionHandler)()) = 0; - - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - virtual void willPresentNotificationWithCompletionHandler (UNNotification* notification, - void (^completionHandler)(UNNotificationPresentationOptions options)) = 0; - - virtual void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response, - void (^completionHandler)()) = 0; - #endif - -protected: - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - NSUniquePtr> delegate; - #else - NSUniquePtr> delegate; - #endif private: - //============================================================================== - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - struct Class : public ObjCClass> - { - Class() : ObjCClass> ("JucePushNotificationsDelegate_") - #else - struct Class : public ObjCClass> - { - Class() : ObjCClass> ("JucePushNotificationsDelegate_") - #endif - { - addIvar ("self"); - - addMethod (@selector (application:didRegisterUserNotificationSettings:), didRegisterUserNotificationSettings); - addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), registeredForRemoteNotifications); - addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), failedToRegisterForRemoteNotifications); - addMethod (@selector (application:didReceiveRemoteNotification:), didReceiveRemoteNotification); - addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:), didReceiveRemoteNotificationFetchCompletionHandler); - addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), handleActionForRemoteNotificationCompletionHandler); - addMethod (@selector (application:didReceiveLocalNotification:), didReceiveLocalNotification); - addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:), handleActionForLocalNotificationCompletionHandler); - addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:), handleActionForLocalNotificationWithResponseCompletionHandler); - - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:), willPresentNotificationWithCompletionHandler); - addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:), didReceiveNotificationResponseWithCompletionHandler); - #endif - - registerClass(); - } - - //============================================================================== - static PushNotificationsDelegate& getThis (id self) { return *getIvar (self, "self"); } - static void setThis (id self, PushNotificationsDelegate* d) { object_setInstanceVariable (self, "self", d); } - - //============================================================================== - static void didRegisterUserNotificationSettings (id self, SEL, UIApplication*, - UIUserNotificationSettings* settings) { getThis (self).didRegisterUserNotificationSettings (settings); } - static void registeredForRemoteNotifications (id self, SEL, UIApplication*, - NSData* deviceToken) { getThis (self).registeredForRemoteNotifications (deviceToken); } - - static void failedToRegisterForRemoteNotifications (id self, SEL, UIApplication*, - NSError* error) { getThis (self).failedToRegisterForRemoteNotifications (error); } - - static void didReceiveRemoteNotification (id self, SEL, UIApplication*, - NSDictionary* userInfo) { getThis (self).didReceiveRemoteNotification (userInfo); } - - static void didReceiveRemoteNotificationFetchCompletionHandler (id self, SEL, UIApplication*, - NSDictionary* userInfo, - void (^completionHandler)(UIBackgroundFetchResult result)) { getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler); } - - static void handleActionForRemoteNotificationCompletionHandler (id self, SEL, UIApplication*, - NSString* actionIdentifier, - NSDictionary* userInfo, - NSDictionary* responseInfo, - void (^completionHandler)()) { getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler); } - - static void didReceiveLocalNotification (id self, SEL, UIApplication*, - UILocalNotification* notification) { getThis (self).didReceiveLocalNotification (notification); } - - static void handleActionForLocalNotificationCompletionHandler (id self, SEL, UIApplication*, - NSString* actionIdentifier, - UILocalNotification* notification, - void (^completionHandler)()) { getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler); } - - static void handleActionForLocalNotificationWithResponseCompletionHandler (id self, SEL, UIApplication*, - NSString* actionIdentifier, - UILocalNotification* notification, - NSDictionary* responseInfo, - void (^completionHandler)()) { getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler); } - - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - static void willPresentNotificationWithCompletionHandler (id self, SEL, UNUserNotificationCenter*, - UNNotification* notification, - void (^completionHandler)(UNNotificationPresentationOptions options)) { getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler); } - - static void didReceiveNotificationResponseWithCompletionHandler (id self, SEL, UNUserNotificationCenter*, - UNNotificationResponse* response, - void (^completionHandler)()) { getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler); } - #endif - }; - - //============================================================================== - static Class& getClass() - { - static Class c; - return c; - } + ~PushNotificationsDelegateDetails() = delete; }; //============================================================================== bool PushNotifications::Notification::isValid() const noexcept { - const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max; + if (@available (iOS 10, *)) + return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty(); - if (iOSEarlierThan10) - return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty(); - - return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty(); + return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty(); } //============================================================================== -struct PushNotifications::Pimpl : private PushNotificationsDelegate +struct PushNotifications::Pimpl { Pimpl (PushNotifications& p) : owner (p) { + Class::setThis (delegate.get(), this); + + auto appDelegate = [[UIApplication sharedApplication] delegate]; + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") + if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)]) + [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } void requestPermissionsWithSettings (const PushNotifications::Settings& settingsToUse) @@ -588,27 +437,11 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate auto categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()]; - if (iOSEarlierThan10) - { - for (const auto& c : settings.categories) - { - auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10); - [categories addObject: category]; - } - - UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0 - | (bool)settings.allowSound << 1 - | (bool)settings.allowAlert << 2); - - UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories]; - [[UIApplication sharedApplication] registerUserNotificationSettings: s]; - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else + if (@available (iOS 10, *)) { for (const auto& c : settings.categories) { - auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10); + auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c); [categories addObject: category]; } @@ -623,30 +456,33 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate requestSettingsUsed(); }]; } - #endif + else + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + for (const auto& c : settings.categories) + { + auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c); + [categories addObject: category]; + } + + UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0 + | (bool)settings.allowSound << 1 + | (bool)settings.allowAlert << 2); + + UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories]; + [[UIApplication sharedApplication] registerUserNotificationSettings: s]; + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } [[UIApplication sharedApplication] registerForRemoteNotifications]; } void requestSettingsUsed() { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings; - - settings.allowBadge = s.types & UIUserNotificationTypeBadge; - settings.allowSound = s.types & UIUserNotificationTypeSound; - settings.allowAlert = s.types & UIUserNotificationTypeAlert; - - for (UIUserNotificationCategory *c in s.categories) - settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c)); - - owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); }); - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else - { - [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler: ^(UNNotificationSettings* s) { @@ -666,24 +502,31 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate }]; } - #endif + else + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings; + + settings.allowBadge = s.types & UIUserNotificationTypeBadge; + settings.allowSound = s.types & UIUserNotificationTypeSound; + settings.allowAlert = s.types & UIUserNotificationTypeAlert; + + for (UIUserNotificationCategory *c in s.categories) + settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c)); + + owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); }); + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } } bool areNotificationsEnabled() const { return true; } void sendLocalNotification (const Notification& n) { - if (iOSEarlierThan10) - { - auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n); - - [[UIApplication sharedApplication] scheduleLocalNotification: notification]; - [notification release]; - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else + if (@available (iOS 10, *)) { - UNNotificationRequest* request = PushNotificationsDelegateDetails::juceNotificationToUNNotificationRequest (n); [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest: request @@ -695,19 +538,22 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate NSLog (nsStringLiteral ("addNotificationRequest error: %@"), error); }]; } - #endif + else + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n); + + [[UIApplication sharedApplication] scheduleLocalNotification: notification]; + [notification release]; + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } } void getDeliveredNotifications() const { - if (iOSEarlierThan10) - { - // Not supported on this platform - jassertfalse; - owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); }); - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else + if (@available (iOS 10, *)) { [[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler: ^(NSArray* notifications) @@ -720,42 +566,42 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate owner.listeners.call ([&] (Listener& l) { l.deliveredNotificationsListReceived (notifs); }); }]; } - #endif + else + { + // Not supported on this platform + jassertfalse; + owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); }); + } } void removeAllDeliveredNotifications() { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - // Not supported on this platform - jassertfalse; + [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications]; } else - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 { - - [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications]; + // Not supported on this platform + jassertfalse; } - #endif } void removeDeliveredNotification (const String& identifier) { - if (iOSEarlierThan10) - { - ignoreUnused (identifier); - // Not supported on this platform - jassertfalse; - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else + if (@available (iOS 10, *)) { NSArray* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)]; [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers: identifiers]; } - #endif + else + { + ignoreUnused (identifier); + // Not supported on this platform + jassertfalse; + } } void setupChannels (const Array& groups, const Array& channels) @@ -765,19 +611,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate void getPendingLocalNotifications() const { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - Array notifs; - - for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications) - notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n)); - - owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); }); - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else - { - [[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler: ^(NSArray* requests) { @@ -790,39 +625,50 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate } ]; } - #endif + else + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + Array notifs; + + for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications) + notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n)); + + owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); }); + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } } void removePendingLocalNotification (const String& identifier) { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - // Not supported on this platform - jassertfalse; - } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - else - { - NSArray* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)]; [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers: identifiers]; } - #endif + else + { + // Not supported on this platform + jassertfalse; + } } void removeAllPendingLocalNotifications() { - if (iOSEarlierThan10) + if (@available (iOS 10, *)) { - [[UIApplication sharedApplication] cancelAllLocalNotifications]; + [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests]; } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 else { - [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests]; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + [[UIApplication sharedApplication] cancelAllLocalNotifications]; + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } - #endif } String getDeviceToken() @@ -833,14 +679,23 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate return deviceToken; } - //============================================================================== - //PushNotificationsDelegate - void didRegisterUserNotificationSettings (UIUserNotificationSettings*) override + void subscribeToTopic (const String& topic) { ignoreUnused (topic); } + void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); } + + void sendUpstreamMessage (const String& serverSenderId, + const String& collapseKey, + const String& messageId, + const String& messageType, + int timeToLive, + const StringPairArray& additionalData) { - requestSettingsUsed(); + ignoreUnused (serverSenderId, collapseKey, messageId, messageType); + ignoreUnused (timeToLive, additionalData); } - void registeredForRemoteNotifications (NSData* deviceTokenToUse) override +private: + //============================================================================== + void registeredForRemoteNotifications (NSData* deviceTokenToUse) { deviceToken = [deviceTokenToUse]() -> String { @@ -864,14 +719,14 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); }); } - void failedToRegisterForRemoteNotifications (NSError* error) override + void failedToRegisterForRemoteNotifications (NSError* error) { ignoreUnused (error); deviceToken.clear(); } - void didReceiveRemoteNotification (NSDictionary* userInfo) override + void didReceiveRemoteNotification (NSDictionary* userInfo) { auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo); @@ -879,7 +734,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate } void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo, - void (^completionHandler)(UIBackgroundFetchResult result)) override + void (^completionHandler)(UIBackgroundFetchResult result)) { didReceiveRemoteNotification (userInfo); completionHandler (UIBackgroundFetchResultNewData); @@ -888,7 +743,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier, NSDictionary* userInfo, NSDictionary* responseInfo, - void (^completionHandler)()) override + void (^completionHandler)()) { auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo); auto actionString = nsStringToJuce (actionIdentifier); @@ -899,7 +754,14 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate completionHandler(); } - void didReceiveLocalNotification (UILocalNotification* notification) override + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + void didRegisterUserNotificationSettings (UIUserNotificationSettings*) + { + requestSettingsUsed(); + } + + void didReceiveLocalNotification (UILocalNotification* notification) { auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification); @@ -908,7 +770,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier, UILocalNotification* notification, - void (^completionHandler)()) override + void (^completionHandler)()) { handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, @@ -919,7 +781,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier, UILocalNotification* notification, NSDictionary* responseInfo, - void (^completionHandler)()) override + void (^completionHandler)()) { auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification); auto actionString = nsStringToJuce (actionIdentifier); @@ -930,9 +792,10 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate completionHandler(); } - #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + void willPresentNotificationWithCompletionHandler (UNNotification* notification, - void (^completionHandler)(UNNotificationPresentationOptions options)) override + void (^completionHandler)(UNNotificationPresentationOptions options)) { NSUInteger options = NSUInteger ((int)settings.allowBadge << 0 | (int)settings.allowSound << 1 @@ -944,7 +807,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate } void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response, - void (^completionHandler)()) override + void (^completionHandler)()) { const bool remote = [response.notification.request.trigger isKindOfClass: [UNPushNotificationTrigger class]]; @@ -968,26 +831,92 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate owner.listeners.call ([&] (Listener& l) { l.handleNotificationAction (! remote, n, actionString, responseString); }); completionHandler(); } - #endif - void subscribeToTopic (const String& topic) { ignoreUnused (topic); } - void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); } + //============================================================================== + struct Class : public ObjCClass> + { + Class() + : ObjCClass ("JucePushNotificationsDelegate_") + { + addIvar ("self"); - void sendUpstreamMessage (const String& serverSenderId, - const String& collapseKey, - const String& messageId, - const String& messageType, - int timeToLive, - const StringPairArray& additionalData) + addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), [] (id self, SEL, UIApplication*, NSData* data) + { + getThis (self).registeredForRemoteNotifications (data); + }); + + addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), [] (id self, SEL, UIApplication*, NSError* error) + { + getThis (self).failedToRegisterForRemoteNotifications (error); + }); + + addMethod (@selector (application:didReceiveRemoteNotification:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo) + { + getThis (self).didReceiveRemoteNotification (userInfo); + }); + + addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo, void (^completionHandler)(UIBackgroundFetchResult result)) + { + getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler); + }); + + addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, NSDictionary* userInfo, NSDictionary* responseInfo, void (^completionHandler)()) + { + getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler); + }); + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + + addMethod (@selector (application:didRegisterUserNotificationSettings:), [] (id self, SEL, UIApplication*, UIUserNotificationSettings* settingsToUse) + { + getThis (self).didRegisterUserNotificationSettings (settingsToUse); + }); + + addMethod (@selector (application:didReceiveLocalNotification:), [] (id self, SEL, UIApplication*, UILocalNotification* notification) + { + getThis (self).didReceiveLocalNotification (notification); + }); + + addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, void (^completionHandler)()) + { + getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler); + }); + + addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, NSDictionary* responseInfo, void (^completionHandler)()) + { + getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler); + }); + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotification* notification, void (^completionHandler)(UNNotificationPresentationOptions options)) + { + getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler); + }); + + addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotificationResponse* response, void (^completionHandler)()) + { + getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler); + }); + + registerClass(); + } + + //============================================================================== + static Pimpl& getThis (id self) { return *getIvar (self, "self"); } + static void setThis (id self, Pimpl* d) { object_setInstanceVariable (self, "self", d); } + }; + + //============================================================================== + static Class& getClass() { - ignoreUnused (serverSenderId, collapseKey, messageId, messageType); - ignoreUnused (timeToLive, additionalData); + static Class c; + return c; } -private: - PushNotifications& owner; + NSUniquePtr> delegate { [getClass().createInstance() init] }; - const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max; + PushNotifications& owner; bool initialised = false; String deviceToken; diff --git a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp index 57e7dec8..30869457 100644 --- a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp @@ -781,11 +781,11 @@ private: argv[4] = nullptr; - #if JUCE_STANDALONE_APPLICATION - execv (arguments[0].toRawUTF8(), (char**) argv.getData()); - #else - juce_gtkWebkitMain (4, (const char**) argv.getData()); - #endif + if (JUCEApplicationBase::isStandaloneApp()) + execv (arguments[0].toRawUTF8(), (char**) argv.getData()); + else + juce_gtkWebkitMain (4, (const char**) argv.getData()); + exit (0); } diff --git a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp index fb90508f..a59b3329 100644 --- a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp @@ -105,11 +105,7 @@ struct API_AVAILABLE (macos (10.10)) ButtonBasedStatusItem : public StatusItemCo button.image = statusIcon.get(); button.target = eventForwarder.get(); button.action = @selector (handleEvent:); - #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 [button sendActionOn: NSEventMaskLeftMouseDown | NSEventMaskRightMouseDown | NSEventMaskScrollWheel]; - #else - [button sendActionOn: NSLeftMouseDownMask | NSRightMouseDownMask | NSScrollWheelMask]; - #endif } ~ButtonBasedStatusItem() override diff --git a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm index 6f4c5b20..8f3c3701 100644 --- a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm @@ -26,10 +26,6 @@ namespace juce { -#if JUCE_MAC && defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 - #define WKWEBVIEW_OPENPANEL_SUPPORTED 1 -#endif - static NSURL* appendParametersToFileURL (const URL& url, NSURL* fileUrl) { if (@available (macOS 10.10, *)) @@ -117,60 +113,119 @@ struct WebViewKeyEquivalentResponder : public ObjCClass WebViewKeyEquivalentResponder() : ObjCClass ("WebViewKeyEquivalentResponder_") { - ObjCClass::addMethod (@selector (performKeyEquivalent:), performKeyEquivalent); - ObjCClass::registerClass(); - } - -private: - static BOOL performKeyEquivalent (id self, SEL selector, NSEvent* event) - { - const auto isCommandDown = [event] - { - const auto modifierFlags = [event modifierFlags]; - - #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 - if (@available (macOS 10.12, *)) - return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand; - #endif - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") - return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - }(); - - if (isCommandDown) - { - auto sendAction = [&] (SEL actionSelector) -> BOOL - { - return [NSApp sendAction: actionSelector - to: [[self window] firstResponder] - from: self]; - }; - - if ([[event charactersIgnoringModifiers] isEqualToString: @"x"]) return sendAction (@selector (cut:)); - if ([[event charactersIgnoringModifiers] isEqualToString: @"c"]) return sendAction (@selector (copy:)); - if ([[event charactersIgnoringModifiers] isEqualToString: @"v"]) return sendAction (@selector (paste:)); - if ([[event charactersIgnoringModifiers] isEqualToString: @"a"]) return sendAction (@selector (selectAll:)); - } - - return ObjCClass::template sendSuperclassMessage (self, selector, event); + this->addMethod (@selector (performKeyEquivalent:), + [] (id self, SEL selector, NSEvent* event) + { + const auto isCommandDown = [event] + { + const auto modifierFlags = [event modifierFlags]; + + if (@available (macOS 10.12, *)) + return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand; + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + }(); + + if (isCommandDown) + { + auto sendAction = [&] (SEL actionSelector) -> BOOL + { + return [NSApp sendAction:actionSelector + to:[[self window] firstResponder] + from:self]; + }; + + if ([[event charactersIgnoringModifiers] isEqualToString:@"x"]) + return sendAction (@selector (cut:)); + if ([[event charactersIgnoringModifiers] isEqualToString:@"c"]) + return sendAction (@selector (copy:)); + if ([[event charactersIgnoringModifiers] isEqualToString:@"v"]) + return sendAction (@selector (paste:)); + if ([[event charactersIgnoringModifiers] isEqualToString:@"a"]) + return sendAction (@selector (selectAll:)); + } + + return ObjCClass::template sendSuperclassMessage (self, selector, event); + }); + this->registerClass(); } }; JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") struct DownloadClickDetectorClass : public ObjCClass { - DownloadClickDetectorClass() : ObjCClass ("JUCEWebClickDetector_") + DownloadClickDetectorClass() : ObjCClass ("JUCEWebClickDetector_") { addIvar ("owner"); - addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:), decidePolicyForNavigationAction); - addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), decidePolicyForNewWindowAction); - addMethod (@selector (webView:didFinishLoadForFrame:), didFinishLoadForFrame); - addMethod (@selector (webView:didFailLoadWithError:forFrame:), didFailLoadWithError); - addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:), didFailLoadWithError); - addMethod (@selector (webView:willCloseFrame:), willCloseFrame); - addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:), runOpenPanel); + addMethod (@selector (webView:didFailLoadWithError:forFrame:), didFailLoadWithError); + addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:), didFailLoadWithError); + + addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:), + [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, WebFrame*, id listener) + { + if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation))) + [listener use]; + else + [listener ignore]; + }); + + addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), + [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, NSString*, id listener) + { + getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation)); + [listener ignore]; + }); + + addMethod (@selector (webView:didFinishLoadForFrame:), + [] (id self, SEL, WebView* sender, WebFrame* frame) + { + if ([frame isEqual:[sender mainFrame]]) + { + NSURL* url = [[[frame dataSource] request] URL]; + getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString])); + } + }); + + addMethod (@selector (webView:willCloseFrame:), + [] (id self, SEL, WebView*, WebFrame*) + { + getOwner (self)->windowCloseRequest(); + }); + + addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:), + [] (id, SEL, WebView*, id resultListener, BOOL allowMultipleFiles) + { + struct DeletedFileChooserWrapper : private DeletedAtShutdown + { + DeletedFileChooserWrapper (std::unique_ptr fc, id rl) + : chooser (std::move (fc)), listener (rl) + { + [listener.get() retain]; + } + + std::unique_ptr chooser; + ObjCObjectHandle> listener; + }; + + auto chooser = std::make_unique (TRANS ("Select the file you want to upload..."), + File::getSpecialLocation (File::userHomeDirectory), + "*"); + auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener); + + auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles + | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0); + + wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&) + { + for (auto& f : wrapper->chooser->getResults()) + [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())]; + + delete wrapper; + }); + }); registerClass(); } @@ -187,31 +242,6 @@ private: return {}; } - static void decidePolicyForNavigationAction (id self, SEL, WebView*, NSDictionary* actionInformation, - NSURLRequest*, WebFrame*, id listener) - { - if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation))) - [listener use]; - else - [listener ignore]; - } - - static void decidePolicyForNewWindowAction (id self, SEL, WebView*, NSDictionary* actionInformation, - NSURLRequest*, NSString*, id listener) - { - getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation)); - [listener ignore]; - } - - static void didFinishLoadForFrame (id self, SEL, WebView* sender, WebFrame* frame) - { - if ([frame isEqual: [sender mainFrame]]) - { - NSURL* url = [[[frame dataSource] request] URL]; - getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString])); - } - } - static void didFailLoadWithError (id self, SEL, WebView* sender, NSError* error, WebFrame* frame) { if ([frame isEqual: [sender mainFrame]] && error != nullptr && [error code] != NSURLErrorCancelled) @@ -224,63 +254,123 @@ private: getOwner (self)->goToURL ("data:text/plain;charset=UTF-8," + errorString); } } - - static void willCloseFrame (id self, SEL, WebView*, WebFrame*) - { - getOwner (self)->windowCloseRequest(); - } - - static void runOpenPanel (id, SEL, WebView*, id resultListener, BOOL allowMultipleFiles) - { - struct DeletedFileChooserWrapper : private DeletedAtShutdown - { - DeletedFileChooserWrapper (std::unique_ptr fc, id rl) - : chooser (std::move (fc)), listener (rl) - { - [listener.get() retain]; - } - - std::unique_ptr chooser; - ObjCObjectHandle> listener; - }; - - auto chooser = std::make_unique (TRANS("Select the file you want to upload..."), - File::getSpecialLocation (File::userHomeDirectory), "*"); - auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener); - - auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles - | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0); - - wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&) - { - for (auto& f : wrapper->chooser->getResults()) - [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())]; - - delete wrapper; - }); - } }; JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass : public ObjCClass { - WebViewDelegateClass() : ObjCClass ("JUCEWebViewDelegate_") + WebViewDelegateClass() : ObjCClass ("JUCEWebViewDelegate_") { addIvar ("owner"); - addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:), decidePolicyForNavigationAction); - addMethod (@selector (webView:didFinishNavigation:), didFinishNavigation); - addMethod (@selector (webView:didFailNavigation:withError:), didFailNavigation); - addMethod (@selector (webView:didFailProvisionalNavigation:withError:), didFailProvisionalNavigation); - addMethod (@selector (webViewDidClose:), webViewDidClose); - addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction: - windowFeatures:), createWebView); + addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:), + [] (id self, SEL, WKWebView*, WKNavigationAction* navigationAction, void (^decisionHandler) (WKNavigationActionPolicy)) + { + if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]))) + decisionHandler (WKNavigationActionPolicyAllow); + else + decisionHandler (WKNavigationActionPolicyCancel); + }); + + addMethod (@selector (webView:didFinishNavigation:), + [] (id self, SEL, WKWebView* webview, WKNavigation*) + { + getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString])); + }); + + addMethod (@selector (webView:didFailNavigation:withError:), + [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error) + { + displayError (getOwner (self), error); + }); + + addMethod (@selector (webView:didFailProvisionalNavigation:withError:), + [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error) + { + displayError (getOwner (self), error); + }); + + addMethod (@selector (webViewDidClose:), + [] (id self, SEL, WKWebView*) + { + getOwner (self)->windowCloseRequest(); + }); + + addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:), + [] (id self, SEL, WKWebView*, WKWebViewConfiguration*, WKNavigationAction* navigationAction, WKWindowFeatures*) + { + getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])); + return nil; + }); - #if WKWEBVIEW_OPENPANEL_SUPPORTED + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") if (@available (macOS 10.12, *)) - addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:), runOpenPanel); - #endif + { + addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:), + [] (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, void (^completionHandler)(NSArray*)) + { + using CompletionHandlerType = decltype (completionHandler); + + class DeletedFileChooserWrapper : private DeletedAtShutdown + { + public: + DeletedFileChooserWrapper (std::unique_ptr fc, CompletionHandlerType h) + : chooser (std::move (fc)), handler (h) + { + [handler.get() retain]; + } + + ~DeletedFileChooserWrapper() + { + callHandler (nullptr); + } + + void callHandler (NSArray* urls) + { + if (handlerCalled) + return; + + handler.get() (urls); + handlerCalled = true; + } + + std::unique_ptr chooser; + + private: + ObjCObjectHandle handler; + bool handlerCalled = false; + }; + + auto chooser = std::make_unique (TRANS("Select the file you want to upload..."), + File::getSpecialLocation (File::userHomeDirectory), "*"); + auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler); + + auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles + | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0); + + #if JUCE_MAC + if (@available (macOS 10.14, *)) + { + if ([parameters allowsDirectories]) + flags |= FileBrowserComponent::canSelectDirectories; + } + #endif + + wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&) + { + auto results = wrapper->chooser->getResults(); + auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()]; + + for (auto& f : results) + [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]]; + + wrapper->callHandler (urls); + delete wrapper; + }); + }); + } + JUCE_END_IGNORE_WARNINGS_GCC_LIKE registerClass(); } @@ -289,20 +379,6 @@ struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass : public ObjCClass (self, "owner"); } private: - static void decidePolicyForNavigationAction (id self, SEL, WKWebView*, WKNavigationAction* navigationAction, - void (^decisionHandler)(WKNavigationActionPolicy)) - { - if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]))) - decisionHandler (WKNavigationActionPolicyAllow); - else - decisionHandler (WKNavigationActionPolicyCancel); - } - - static void didFinishNavigation (id self, SEL, WKWebView* webview, WKNavigation*) - { - getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString])); - } - static void displayError (WebBrowserComponent* owner, NSError* error) { if ([error code] != NSURLErrorCancelled) @@ -315,94 +391,6 @@ private: owner->goToURL ("data:text/plain;charset=UTF-8," + errorString); } } - - static void didFailNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error) - { - displayError (getOwner (self), error); - } - - static void didFailProvisionalNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error) - { - displayError (getOwner (self), error); - } - - static void webViewDidClose (id self, SEL, WKWebView*) - { - getOwner (self)->windowCloseRequest(); - } - - static WKWebView* createWebView (id self, SEL, WKWebView*, WKWebViewConfiguration*, - WKNavigationAction* navigationAction, WKWindowFeatures*) - { - getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])); - return nil; - } - - #if WKWEBVIEW_OPENPANEL_SUPPORTED - API_AVAILABLE (macos (10.12)) - static void runOpenPanel (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, - void (^completionHandler)(NSArray*)) - { - using CompletionHandlerType = decltype (completionHandler); - - class DeletedFileChooserWrapper : private DeletedAtShutdown - { - public: - DeletedFileChooserWrapper (std::unique_ptr fc, CompletionHandlerType h) - : chooser (std::move (fc)), handler (h) - { - [handler.get() retain]; - } - - ~DeletedFileChooserWrapper() - { - callHandler (nullptr); - } - - void callHandler (NSArray* urls) - { - if (handlerCalled) - return; - - handler.get() (urls); - handlerCalled = true; - } - - std::unique_ptr chooser; - - private: - ObjCObjectHandle handler; - bool handlerCalled = false; - }; - - auto chooser = std::make_unique (TRANS("Select the file you want to upload..."), - File::getSpecialLocation (File::userHomeDirectory), "*"); - auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler); - - auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles - | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0); - - #if (defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) - if (@available (macOS 10.14, *)) - { - if ([parameters allowsDirectories]) - flags |= FileBrowserComponent::canSelectDirectories; - } - #endif - - wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&) - { - auto results = wrapper->chooser->getResults(); - auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()]; - - for (auto& f : results) - [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]]; - - wrapper->callHandler (urls); - delete wrapper; - }); - } - #endif }; //============================================================================== diff --git a/modules/juce_opengl/geometry/juce_Matrix3D.h b/modules/juce_opengl/geometry/juce_Matrix3D.h index eb652136..0bd2862e 100644 --- a/modules/juce_opengl/geometry/juce_Matrix3D.h +++ b/modules/juce_opengl/geometry/juce_Matrix3D.h @@ -88,12 +88,12 @@ public: } /** Creates a matrix from a 3D vector translation. */ - Matrix3D (Vector3D vector) noexcept + static Matrix3D fromTranslation (Vector3D vector) noexcept { - mat[0] = Type (1); mat[1] = 0; mat[2] = 0; mat[3] = 0; - mat[4] = 0; mat[5] = Type (1); mat[6] = 0; mat[7] = 0; - mat[8] = 0; mat[9] = 0; mat[10] = Type (1); mat[11] = 0; - mat[12] = vector.x; mat[13] = vector.y; mat[14] = vector.z; mat[15] = Type (1); + return { Type (1), 0, 0, 0, + 0, Type (1), 0, 0, + 0, 0, Type (1), 0, + vector.x, vector.y, vector.z, Type (1) }; } /** Returns a new matrix from the given frustum values. */ @@ -129,22 +129,22 @@ public: { auto&& m2 = other.mat; - return { mat[0] * m2[0] + mat[1] * m2[4] + mat[2] * m2[8] + mat[3] * m2[12], - mat[0] * m2[1] + mat[1] * m2[5] + mat[2] * m2[9] + mat[3] * m2[13], - mat[0] * m2[2] + mat[1] * m2[6] + mat[2] * m2[10] + mat[3] * m2[14], - mat[0] * m2[3] + mat[1] * m2[7] + mat[2] * m2[11] + mat[3] * m2[15], - mat[4] * m2[0] + mat[5] * m2[4] + mat[6] * m2[8] + mat[7] * m2[12], - mat[4] * m2[1] + mat[5] * m2[5] + mat[6] * m2[9] + mat[7] * m2[13], - mat[4] * m2[2] + mat[5] * m2[6] + mat[6] * m2[10] + mat[7] * m2[14], - mat[4] * m2[3] + mat[5] * m2[7] + mat[6] * m2[11] + mat[7] * m2[15], - mat[8] * m2[0] + mat[9] * m2[4] + mat[10] * m2[8] + mat[11] * m2[12], - mat[8] * m2[1] + mat[9] * m2[5] + mat[10] * m2[9] + mat[11] * m2[13], - mat[8] * m2[2] + mat[9] * m2[6] + mat[10] * m2[10] + mat[11] * m2[14], - mat[8] * m2[3] + mat[9] * m2[7] + mat[10] * m2[11] + mat[11] * m2[15], - mat[12] * m2[0] + mat[13] * m2[4] + mat[14] * m2[8] + mat[15] * m2[12], - mat[12] * m2[1] + mat[13] * m2[5] + mat[14] * m2[9] + mat[15] * m2[13], - mat[12] * m2[2] + mat[13] * m2[6] + mat[14] * m2[10] + mat[15] * m2[14], - mat[12] * m2[3] + mat[13] * m2[7] + mat[14] * m2[11] + mat[15] * m2[15] }; + return { mat[0] * m2[0] + mat[4] * m2[1] + mat[8] * m2[2] + mat[12] * m2[3], + mat[1] * m2[0] + mat[5] * m2[1] + mat[9] * m2[2] + mat[13] * m2[3], + mat[2] * m2[0] + mat[6] * m2[1] + mat[10] * m2[2] + mat[14] * m2[3], + mat[3] * m2[0] + mat[7] * m2[1] + mat[11] * m2[2] + mat[15] * m2[3], + mat[0] * m2[4] + mat[4] * m2[5] + mat[8] * m2[6] + mat[12] * m2[7], + mat[1] * m2[4] + mat[5] * m2[5] + mat[9] * m2[6] + mat[13] * m2[7], + mat[2] * m2[4] + mat[6] * m2[5] + mat[10] * m2[6] + mat[14] * m2[7], + mat[3] * m2[4] + mat[7] * m2[5] + mat[11] * m2[6] + mat[15] * m2[7], + mat[0] * m2[8] + mat[4] * m2[9] + mat[8] * m2[10] + mat[12] * m2[11], + mat[1] * m2[8] + mat[5] * m2[9] + mat[9] * m2[10] + mat[13] * m2[11], + mat[2] * m2[8] + mat[6] * m2[9] + mat[10] * m2[10] + mat[14] * m2[11], + mat[3] * m2[8] + mat[7] * m2[9] + mat[11] * m2[10] + mat[15] * m2[11], + mat[0] * m2[12] + mat[4] * m2[13] + mat[8] * m2[14] + mat[12] * m2[15], + mat[1] * m2[12] + mat[5] * m2[13] + mat[9] * m2[14] + mat[13] * m2[15], + mat[2] * m2[12] + mat[6] * m2[13] + mat[10] * m2[14] + mat[14] * m2[15], + mat[3] * m2[12] + mat[7] * m2[13] + mat[11] * m2[14] + mat[15] * m2[15] }; } /** The 4x4 matrix values. These are stored in the standard OpenGL order. */ diff --git a/modules/juce_opengl/juce_opengl.h b/modules/juce_opengl/juce_opengl.h index a08d1ff1..8cf05c27 100644 --- a/modules/juce_opengl/juce_opengl.h +++ b/modules/juce_opengl/juce_opengl.h @@ -35,7 +35,7 @@ ID: juce_opengl vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE OpenGL classes description: Classes for rendering OpenGL in a JUCE window. website: http://www.juce.com/juce diff --git a/modules/juce_opengl/native/juce_OpenGL_osx.h b/modules/juce_opengl/native/juce_OpenGL_osx.h index aceff12f..f3c21b92 100644 --- a/modules/juce_opengl/native/juce_OpenGL_osx.h +++ b/modules/juce_opengl/native/juce_OpenGL_osx.h @@ -246,10 +246,8 @@ public: static NSOpenGLContextParameter getSwapIntervalParameter() { - #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 - if (@available (macOS 10.12, *)) - return NSOpenGLContextParameterSwapInterval; - #endif + if (@available (macOS 10.12, *)) + return NSOpenGLContextParameterSwapInterval; return NSOpenGLCPSwapInterval; } diff --git a/modules/juce_osc/juce_osc.h b/modules/juce_osc/juce_osc.h index cd60f720..a1e8444a 100644 --- a/modules/juce_osc/juce_osc.h +++ b/modules/juce_osc/juce_osc.h @@ -35,7 +35,7 @@ ID: juce_osc vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE OSC classes description: Open Sound Control implementation. website: http://www.juce.com/juce diff --git a/modules/juce_product_unlocking/juce_product_unlocking.h b/modules/juce_product_unlocking/juce_product_unlocking.h index 1b07d19f..d5726bf1 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.h +++ b/modules/juce_product_unlocking/juce_product_unlocking.h @@ -35,7 +35,7 @@ ID: juce_product_unlocking vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE Online marketplace support description: Classes for online product authentication website: http://www.juce.com/juce 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 index 00000000..f398bded --- /dev/null +++ b/modules/juce_product_unlocking/native/java/app/com/rmsl/juce/JuceBillingClient.java @@ -0,0 +1,226 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +package com.rmsl.juce; + +import com.android.billingclient.api.*; + +public class JuceBillingClient implements PurchasesUpdatedListener, + BillingClientStateListener { + private native void productDetailsQueryCallback(long host, java.util.List productDetails); + private native void purchasesListQueryCallback(long host, java.util.List purchases); + private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode); + private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode); + + public JuceBillingClient(android.content.Context context, long hostToUse) { + host = hostToUse; + + billingClient = BillingClient.newBuilder(context) + .enablePendingPurchases() + .setListener(this) + .build(); + + billingClient.startConnection(this); + } + + public void endConnection() { + billingClient.endConnection(); + } + + public boolean isReady() { + return billingClient.isReady(); + } + + public boolean isBillingSupported() { + return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode() + == BillingClient.BillingResponseCode.OK; + } + + public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) { + java.util.ArrayList productList = new java.util.ArrayList<>(); + + for (String product : productsToQuery) + productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build()); + + return QueryProductDetailsParams.newBuilder().setProductList(productList).build(); + } + + public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List productTypes, java.util.List details) { + if (productTypes == null || productTypes.isEmpty()) { + productDetailsQueryCallback(host, details); + } else { + billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() { + @Override + public void onProductDetailsResponse(BillingResult billingResult, java.util.List newDetails) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + details.addAll(newDetails); + queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details); + } else { + queryProductDetailsImpl(productsToQuery, null, details); + } + } + }); + } + } + + public void queryProductDetails(final String[] productsToQuery) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList()); + } + }); + } + + public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + BillingResult r = billingClient.launchBillingFlow(activity, params); + } + }); + } + + private void queryPurchasesImpl(java.util.List toCheck, java.util.ArrayList purchases) { + if (toCheck == null || toCheck.isEmpty()) { + purchasesListQueryCallback(host, purchases); + } else { + billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() { + @Override + public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List list) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + purchases.addAll(list); + queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases); + } else { + queryPurchasesImpl(null, purchases); + } + } + }); + } + } + + public void queryPurchases() { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList()); + } + }); + } + + public void consumePurchase(final String productIdentifier, final String purchaseToken) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + ConsumeParams consumeParams = ConsumeParams.newBuilder() + .setPurchaseToken(purchaseToken) + .build(); + + billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() { + @Override + public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { + purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode()); + } + }); + } + }); + } + + @Override + public void onPurchasesUpdated(BillingResult result, java.util.List purchases) { + int responseCode = result.getResponseCode(); + + if (purchases != null) { + for (Purchase purchase : purchases) { + handlePurchase(purchase, responseCode); + } + } else { + purchaseCompletedCallback(host, null, responseCode); + } + } + + @Override + public void onBillingServiceDisconnected() + { + + } + + @Override + public void onBillingSetupFinished(BillingResult billingResult) + { + + } + + private void executeOnBillingClientConnection(Runnable runnable) { + if (billingClient.isReady()) { + runnable.run(); + } else { + connectAndExecute(runnable); + } + } + + private void connectAndExecute(final Runnable executeOnSuccess) { + billingClient.startConnection(new BillingClientStateListener() { + @Override + public void onBillingSetupFinished(BillingResult billingResponse) { + if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) { + if (executeOnSuccess != null) { + executeOnSuccess.run(); + } + } + } + + @Override + public void onBillingServiceDisconnected() { + } + }); + } + + private void handlePurchase(final Purchase purchase, final int responseCode) { + purchaseCompletedCallback(host, purchase, responseCode); + + if (responseCode == BillingClient.BillingResponseCode.OK + && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED + && !purchase.isAcknowledged()) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); + billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() { + @Override + public void onAcknowledgePurchaseResponse(BillingResult billingResult) { + + } + }); + } + }); + } + } + + private long host = 0; + private final BillingClient billingClient; +} 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 index f398bded..00000000 --- a/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2022 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 7 End-User License - Agreement and JUCE Privacy Policy. - - End User License Agreement: www.juce.com/juce-7-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.rmsl.juce; - -import com.android.billingclient.api.*; - -public class JuceBillingClient implements PurchasesUpdatedListener, - BillingClientStateListener { - private native void productDetailsQueryCallback(long host, java.util.List productDetails); - private native void purchasesListQueryCallback(long host, java.util.List purchases); - private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode); - private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode); - - public JuceBillingClient(android.content.Context context, long hostToUse) { - host = hostToUse; - - billingClient = BillingClient.newBuilder(context) - .enablePendingPurchases() - .setListener(this) - .build(); - - billingClient.startConnection(this); - } - - public void endConnection() { - billingClient.endConnection(); - } - - public boolean isReady() { - return billingClient.isReady(); - } - - public boolean isBillingSupported() { - return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode() - == BillingClient.BillingResponseCode.OK; - } - - public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) { - java.util.ArrayList productList = new java.util.ArrayList<>(); - - for (String product : productsToQuery) - productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build()); - - return QueryProductDetailsParams.newBuilder().setProductList(productList).build(); - } - - public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List productTypes, java.util.List details) { - if (productTypes == null || productTypes.isEmpty()) { - productDetailsQueryCallback(host, details); - } else { - billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() { - @Override - public void onProductDetailsResponse(BillingResult billingResult, java.util.List newDetails) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - details.addAll(newDetails); - queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details); - } else { - queryProductDetailsImpl(productsToQuery, null, details); - } - } - }); - } - } - - public void queryProductDetails(final String[] productsToQuery) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; - queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList()); - } - }); - } - - public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - BillingResult r = billingClient.launchBillingFlow(activity, params); - } - }); - } - - private void queryPurchasesImpl(java.util.List toCheck, java.util.ArrayList purchases) { - if (toCheck == null || toCheck.isEmpty()) { - purchasesListQueryCallback(host, purchases); - } else { - billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() { - @Override - public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List list) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - purchases.addAll(list); - queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases); - } else { - queryPurchasesImpl(null, purchases); - } - } - }); - } - } - - public void queryPurchases() { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; - queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList()); - } - }); - } - - public void consumePurchase(final String productIdentifier, final String purchaseToken) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - ConsumeParams consumeParams = ConsumeParams.newBuilder() - .setPurchaseToken(purchaseToken) - .build(); - - billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() { - @Override - public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { - purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode()); - } - }); - } - }); - } - - @Override - public void onPurchasesUpdated(BillingResult result, java.util.List purchases) { - int responseCode = result.getResponseCode(); - - if (purchases != null) { - for (Purchase purchase : purchases) { - handlePurchase(purchase, responseCode); - } - } else { - purchaseCompletedCallback(host, null, responseCode); - } - } - - @Override - public void onBillingServiceDisconnected() - { - - } - - @Override - public void onBillingSetupFinished(BillingResult billingResult) - { - - } - - private void executeOnBillingClientConnection(Runnable runnable) { - if (billingClient.isReady()) { - runnable.run(); - } else { - connectAndExecute(runnable); - } - } - - private void connectAndExecute(final Runnable executeOnSuccess) { - billingClient.startConnection(new BillingClientStateListener() { - @Override - public void onBillingSetupFinished(BillingResult billingResponse) { - if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) { - if (executeOnSuccess != null) { - executeOnSuccess.run(); - } - } - } - - @Override - public void onBillingServiceDisconnected() { - } - }); - } - - private void handlePurchase(final Purchase purchase, final int responseCode) { - purchaseCompletedCallback(host, purchase, responseCode); - - if (responseCode == BillingClient.BillingResponseCode.OK - && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED - && !purchase.isAcknowledged()) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); - billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() { - @Override - public void onAcknowledgePurchaseResponse(BillingResult billingResult) { - - } - }); - } - }); - } - } - - private long host = 0; - private final BillingClient billingClient; -} diff --git a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp index 922234fd..b382e5a1 100644 --- a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp @@ -142,6 +142,407 @@ inline StringArray javaListOfStringToJuceStringArray (const LocalRef& j return result; } +//============================================================================== +constexpr unsigned char juceBillingClientCompiled[] +{ + 0x1f, 0x8b, 0x08, 0x08, 0xa4, 0x53, 0xd0, 0x62, 0x04, 0x03, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x5a, + 0x0b, 0x70, 0x54, 0xe7, 0x75, 0x3e, 0xff, 0xdd, 0xab, 0xf7, 0x4a, 0x5a, + 0xad, 0x1e, 0x2b, 0xf4, 0x5c, 0xed, 0x0a, 0x10, 0x42, 0xef, 0x87, 0x11, + 0xac, 0x82, 0x25, 0xc4, 0xc3, 0x02, 0x81, 0x01, 0x2d, 0xd8, 0x20, 0xa7, + 0xf6, 0xb2, 0x7b, 0x41, 0x0b, 0xab, 0xbb, 0xab, 0xdd, 0x15, 0x2f, 0xc7, + 0x94, 0x60, 0xec, 0x90, 0xc6, 0x8e, 0x69, 0x70, 0x1a, 0xc7, 0x66, 0xa6, + 0xee, 0x14, 0x4f, 0xdd, 0x09, 0xd3, 0x26, 0xa9, 0x99, 0x71, 0x62, 0xa6, + 0xf5, 0xc4, 0x6e, 0xea, 0x66, 0x68, 0x1b, 0x27, 0xa4, 0xd3, 0xcc, 0xb8, + 0x0d, 0xd3, 0x24, 0xa5, 0x9d, 0xe0, 0x3e, 0x5c, 0x77, 0xc6, 0x6d, 0x3d, + 0x6d, 0xbf, 0xf3, 0xdf, 0xff, 0xae, 0xae, 0x84, 0x5d, 0xc9, 0xbe, 0xf0, + 0xed, 0x39, 0xff, 0x39, 0xe7, 0x3f, 0xff, 0xf9, 0xcf, 0xff, 0xdc, 0xab, + 0x8d, 0x19, 0x27, 0x8b, 0x7b, 0xfa, 0x07, 0xe9, 0x77, 0x66, 0x07, 0x1f, + 0x79, 0xed, 0x89, 0xde, 0x5f, 0xfe, 0xe1, 0xa5, 0x7d, 0xcf, 0x5e, 0xf9, + 0x97, 0xa1, 0xef, 0xad, 0x2e, 0xdb, 0xfd, 0x83, 0xd1, 0x3f, 0xb8, 0x9d, + 0x7c, 0xb3, 0x8d, 0x28, 0x45, 0x44, 0x27, 0xf7, 0x0f, 0x78, 0x41, 0xac, + 0x07, 0xb2, 0xcb, 0xe0, 0x58, 0xde, 0x0f, 0xdc, 0xd2, 0x88, 0x36, 0x81, + 0x5e, 0x75, 0x11, 0xd5, 0x82, 0xbe, 0x99, 0x4f, 0xf4, 0x59, 0xd0, 0xf3, + 0x05, 0x44, 0x25, 0xa0, 0x89, 0x62, 0xa2, 0x0f, 0x1a, 0x88, 0x6e, 0xa0, + 0x70, 0xb8, 0x86, 0x28, 0x0e, 0xcc, 0x00, 0xb3, 0xc0, 0x29, 0xe0, 0x31, + 0xe0, 0x71, 0xe0, 0x49, 0xe0, 0x8b, 0xc0, 0xd3, 0xc0, 0x4b, 0xc0, 0xcb, + 0xc0, 0x55, 0xe0, 0x5b, 0xc0, 0x35, 0xe0, 0xbb, 0xc0, 0x8f, 0x80, 0x77, + 0x81, 0x1e, 0x1f, 0xd1, 0x31, 0xe0, 0x9b, 0xc0, 0x6d, 0xa0, 0x06, 0x0d, + 0xef, 0x05, 0x9e, 0x00, 0x5e, 0x01, 0x7e, 0x05, 0xd4, 0xad, 0x20, 0x9a, + 0x04, 0x1e, 0x07, 0xde, 0x00, 0xde, 0x05, 0xda, 0xea, 0x88, 0x0e, 0x01, + 0x2f, 0x01, 0xff, 0x0a, 0xf4, 0xd7, 0x13, 0x99, 0xc0, 0x55, 0xe0, 0xef, + 0x81, 0x02, 0xc4, 0xd9, 0x01, 0xec, 0x01, 0x8e, 0x03, 0x2f, 0x00, 0xdf, + 0x03, 0x6e, 0x03, 0xee, 0x46, 0xd8, 0x03, 0x0f, 0x02, 0x8f, 0x02, 0x2f, + 0x02, 0xaf, 0x03, 0x3f, 0x03, 0xfe, 0x1d, 0x28, 0x6a, 0x22, 0x6a, 0x04, + 0x06, 0x80, 0x1d, 0xc0, 0xc3, 0xc0, 0x09, 0xe0, 0x69, 0xe0, 0xb7, 0x81, + 0x6f, 0x01, 0xaf, 0x00, 0xdf, 0x01, 0xfe, 0x04, 0x78, 0x03, 0x78, 0x0b, + 0xf8, 0x0b, 0xe0, 0x26, 0xf0, 0x53, 0xe0, 0x67, 0xc0, 0x3f, 0x00, 0xff, + 0x04, 0xbc, 0x0b, 0x68, 0xcd, 0x44, 0x3e, 0x20, 0x08, 0x74, 0x03, 0x21, + 0x60, 0x1b, 0x10, 0x06, 0xe2, 0x80, 0x09, 0x1c, 0x07, 0xce, 0x00, 0x4f, + 0x03, 0xcf, 0x02, 0xbf, 0x07, 0x5c, 0x03, 0xbe, 0x0f, 0xfc, 0x1d, 0xf0, + 0x2e, 0x50, 0xee, 0x27, 0xaa, 0x02, 0xda, 0x81, 0x61, 0x60, 0x17, 0xf0, + 0x30, 0x90, 0x04, 0x4e, 0x02, 0x67, 0x80, 0x27, 0x80, 0xaf, 0x02, 0xbf, + 0x0f, 0x7c, 0x1b, 0xf8, 0x3e, 0xf0, 0x57, 0xc0, 0x4f, 0x81, 0x3b, 0xc0, + 0x7b, 0xc0, 0xff, 0x00, 0x7a, 0x0b, 0xe2, 0x01, 0x46, 0x81, 0x03, 0x40, + 0x02, 0x78, 0x12, 0x78, 0x1e, 0x78, 0x05, 0x78, 0x1b, 0xb8, 0x03, 0xe4, + 0x07, 0x88, 0x02, 0xc0, 0x3a, 0x60, 0x0f, 0x70, 0x14, 0x38, 0x0d, 0x3c, + 0x03, 0xfc, 0x2e, 0xf0, 0x32, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x31, 0xf0, + 0x73, 0xe0, 0x3f, 0x80, 0xff, 0x06, 0xdc, 0x41, 0xa2, 0x6a, 0xa0, 0x1e, + 0x68, 0x07, 0xfa, 0x80, 0x0d, 0xc0, 0x7d, 0xc0, 0x3e, 0xe0, 0x18, 0x70, + 0x02, 0xf8, 0x32, 0xf0, 0x22, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x6b, 0xe0, + 0x97, 0xc0, 0x7b, 0xc0, 0x7f, 0x02, 0x98, 0x8a, 0x84, 0x69, 0x48, 0xe5, + 0x80, 0x07, 0xa8, 0x00, 0x78, 0x22, 0x57, 0x02, 0x55, 0x40, 0x35, 0x80, + 0xe9, 0x44, 0x98, 0x42, 0x72, 0xee, 0x62, 0x8a, 0x10, 0xa6, 0x05, 0x61, + 0x2a, 0x10, 0x86, 0x94, 0x30, 0x04, 0x84, 0xf4, 0x91, 0x1f, 0x40, 0x97, + 0x08, 0xa1, 0x11, 0xdc, 0x52, 0x2b, 0xb0, 0x12, 0x58, 0x05, 0xac, 0x06, + 0xb0, 0x24, 0x68, 0x0d, 0xd0, 0x0e, 0xac, 0x05, 0x3a, 0x80, 0x4e, 0xa0, + 0x0b, 0xe8, 0x06, 0x7a, 0x80, 0x5e, 0xa0, 0x0f, 0xe0, 0x35, 0x33, 0x00, + 0x0c, 0x02, 0xf7, 0x00, 0xeb, 0x80, 0x21, 0x60, 0x03, 0x10, 0x02, 0x86, + 0x81, 0xcf, 0x00, 0xf7, 0x02, 0xe3, 0xc0, 0x0e, 0x60, 0x02, 0xe0, 0xbe, + 0xd8, 0x4f, 0x21, 0x18, 0x01, 0xb8, 0xd1, 0x01, 0x2c, 0x2f, 0xd2, 0x95, + 0xa2, 0x54, 0xf1, 0x55, 0x4a, 0x9e, 0xa7, 0xe4, 0x6c, 0xc3, 0x79, 0xe0, + 0x87, 0x6d, 0x98, 0x6f, 0x80, 0x8d, 0xcd, 0xb7, 0x2a, 0x7b, 0xf6, 0xcb, + 0x0f, 0xcb, 0x99, 0x67, 0xff, 0x65, 0xa0, 0x58, 0xba, 0xd4, 0xa1, 0xec, + 0x99, 0xb7, 0xfd, 0xbb, 0xc1, 0xf3, 0xc3, 0xf6, 0xcc, 0xdb, 0x72, 0x2e, + 0xf3, 0xc3, 0xed, 0x72, 0xae, 0xf9, 0x61, 0x19, 0xf3, 0x03, 0xaa, 0x2d, + 0xce, 0x3f, 0x3f, 0x2c, 0x67, 0xde, 0xae, 0x0b, 0xb5, 0x7c, 0xb8, 0x2e, + 0x8f, 0x0d, 0x3f, 0x1c, 0x03, 0xf3, 0xc3, 0xaa, 0x2e, 0x8f, 0x17, 0x3f, + 0x5c, 0x97, 0x79, 0xbb, 0x2e, 0x96, 0xbd, 0x7c, 0xb8, 0x2e, 0x8f, 0x0b, + 0x3f, 0x1c, 0x2f, 0xf3, 0x9b, 0x55, 0x5d, 0x1e, 0x27, 0x7e, 0xd8, 0xa6, + 0x53, 0x72, 0x56, 0xec, 0x3c, 0x56, 0x13, 0xb0, 0x61, 0x9f, 0xcc, 0x87, + 0xc1, 0xf3, 0x18, 0xf0, 0xf8, 0xf1, 0x33, 0x0a, 0x30, 0xff, 0x10, 0xe4, + 0x36, 0x3f, 0x0d, 0x7e, 0x44, 0xc9, 0xb3, 0xe0, 0xb7, 0x2a, 0x9e, 0x73, + 0xb5, 0x59, 0xf1, 0x9f, 0x73, 0xc8, 0xcf, 0x83, 0xdf, 0xa4, 0xe4, 0xef, + 0xa3, 0xd3, 0x36, 0xff, 0x94, 0xc3, 0xe6, 0x59, 0x07, 0x7f, 0xd9, 0xc1, + 0x5f, 0x01, 0x3f, 0xa6, 0xea, 0x5e, 0x75, 0xc8, 0x5f, 0x71, 0xf0, 0xd7, + 0xc1, 0xdb, 0x3e, 0xdf, 0x74, 0xf0, 0x37, 0x1c, 0xbc, 0x1b, 0xfc, 0x16, + 0xe5, 0xe7, 0x26, 0xf8, 0x6d, 0x8a, 0xbf, 0x05, 0xde, 0x8e, 0xff, 0x8e, + 0x83, 0x7f, 0xdf, 0x61, 0xf3, 0xa1, 0x83, 0x2f, 0xc4, 0x80, 0xd8, 0x75, + 0xab, 0xc0, 0xdf, 0xa7, 0xfc, 0xf8, 0xc1, 0xdb, 0x7e, 0x3a, 0xc0, 0xdb, + 0xf1, 0xbc, 0x83, 0xfe, 0xda, 0xf2, 0x01, 0x87, 0xcd, 0xb0, 0xc3, 0x66, + 0x33, 0x78, 0xdb, 0xe7, 0x04, 0x78, 0x9e, 0xff, 0xbc, 0x76, 0xf8, 0xd9, + 0x0e, 0x30, 0xff, 0x20, 0xe4, 0x36, 0xff, 0x08, 0xf8, 0x15, 0x58, 0x91, + 0x4f, 0x43, 0xbe, 0x02, 0xa3, 0x76, 0x51, 0xd1, 0x67, 0x25, 0xed, 0xa3, + 0xaf, 0x82, 0xd6, 0x29, 0x7d, 0x1d, 0x56, 0x1f, 0x97, 0xeb, 0x55, 0xb9, + 0x9e, 0x34, 0x7a, 0x46, 0x96, 0x8b, 0xe9, 0x2b, 0xa0, 0x0d, 0x4a, 0xde, + 0x80, 0x55, 0xfc, 0x9c, 0x2c, 0x77, 0xd1, 0xd7, 0x41, 0x1b, 0x95, 0xbc, + 0x09, 0x3b, 0xc1, 0x97, 0x51, 0x6e, 0x56, 0xe5, 0x66, 0xac, 0xf8, 0x4b, + 0xb2, 0xbc, 0x86, 0xbe, 0x06, 0xea, 0x57, 0x72, 0x3f, 0x76, 0x83, 0xdf, + 0x44, 0xb9, 0x05, 0xbb, 0x05, 0xdb, 0x07, 0x94, 0x3c, 0x80, 0x1d, 0xe8, + 0xb7, 0x50, 0x0e, 0x62, 0x65, 0xed, 0x97, 0x54, 0x90, 0x01, 0xaa, 0xe3, + 0xdf, 0x03, 0x92, 0xba, 0xe8, 0x0b, 0xa0, 0x79, 0x88, 0x2b, 0x09, 0x5a, + 0x00, 0x3b, 0x96, 0x17, 0x40, 0x32, 0x25, 0x69, 0x01, 0x3d, 0x0e, 0x5a, + 0x88, 0x9d, 0x67, 0xaf, 0xa4, 0xed, 0x74, 0x40, 0xd2, 0x66, 0x7a, 0x48, + 0xd2, 0x12, 0x3a, 0x2a, 0xe9, 0xbd, 0x74, 0x4c, 0xd2, 0x62, 0x9a, 0x91, + 0x34, 0x5f, 0xfa, 0x2b, 0xc4, 0xae, 0xf4, 0x98, 0x2c, 0x77, 0xd2, 0x59, + 0x49, 0x57, 0xd1, 0x17, 0x41, 0x79, 0x7d, 0x1c, 0x02, 0xdc, 0x58, 0x65, + 0xdc, 0x9e, 0x1b, 0x2b, 0x80, 0xe3, 0x28, 0x05, 0xc7, 0x71, 0x78, 0x80, + 0x47, 0x24, 0xad, 0xa7, 0x88, 0xa4, 0xf7, 0xd2, 0x11, 0xd0, 0x4a, 0xac, + 0x5a, 0xb6, 0xaf, 0x84, 0xc5, 0x13, 0xa0, 0x55, 0xe0, 0xb8, 0x5c, 0x85, + 0x1d, 0xf6, 0xbc, 0xa2, 0x4f, 0x82, 0x56, 0x63, 0xd7, 0x65, 0x3f, 0x35, + 0xd8, 0x85, 0x99, 0xfa, 0xb0, 0xd3, 0xb2, 0x9d, 0x0f, 0xff, 0x58, 0x5f, + 0x0b, 0x0d, 0xcb, 0x57, 0x60, 0x17, 0x74, 0x49, 0xba, 0x86, 0xe6, 0x40, + 0xeb, 0x68, 0xbd, 0x2c, 0xd7, 0x21, 0xe3, 0xe7, 0x50, 0xae, 0xc7, 0xf8, + 0xb1, 0xbe, 0x5e, 0x95, 0x1b, 0xb0, 0x7b, 0x72, 0xb9, 0x01, 0xe3, 0x70, + 0x02, 0xb4, 0x11, 0xb3, 0x83, 0xcb, 0x8d, 0x4a, 0xdf, 0x84, 0xf9, 0xc0, + 0xe5, 0x26, 0x8c, 0x47, 0x16, 0xb4, 0x19, 0x3b, 0x2e, 0x97, 0x9b, 0x95, + 0xde, 0x8f, 0x5d, 0x98, 0xcb, 0x7e, 0x94, 0xd3, 0x92, 0xae, 0xa6, 0x0c, + 0x68, 0x0b, 0x56, 0x39, 0xcb, 0x5b, 0xb0, 0x6b, 0xcc, 0x82, 0x06, 0xb0, + 0x63, 0x73, 0x39, 0xa0, 0xea, 0x05, 0xb1, 0xfb, 0x73, 0x39, 0x48, 0x45, + 0xb4, 0x53, 0xd2, 0x75, 0xb4, 0x4b, 0x52, 0x41, 0xf7, 0x4b, 0xda, 0x4b, + 0xbb, 0x25, 0xdd, 0x40, 0x0f, 0x4a, 0x1a, 0xa2, 0x83, 0x92, 0x5a, 0xe3, + 0x14, 0xc4, 0x4e, 0xff, 0x59, 0x59, 0xae, 0xa6, 0x87, 0x25, 0x5d, 0x4b, + 0x51, 0x49, 0xef, 0xa5, 0x69, 0x45, 0x79, 0xfc, 0x82, 0xf8, 0xc7, 0xe3, + 0x17, 0x54, 0xf1, 0x05, 0x11, 0x0f, 0xc7, 0x17, 0x44, 0x7f, 0x8f, 0x4b, + 0x1a, 0xa0, 0x93, 0x92, 0xfa, 0xe9, 0x94, 0xa4, 0x2d, 0x74, 0x5a, 0xc9, + 0x1f, 0x95, 0xf4, 0x33, 0xf4, 0x39, 0x49, 0x37, 0xd2, 0x19, 0x49, 0x9b, + 0xe9, 0xd7, 0x25, 0x1d, 0xa6, 0xcf, 0x83, 0xae, 0x86, 0x5f, 0xee, 0x47, + 0x9b, 0xea, 0x57, 0xbb, 0x2a, 0xb7, 0xd3, 0x08, 0x4d, 0x42, 0xde, 0x8e, + 0x5d, 0x2e, 0x0c, 0xba, 0x16, 0x19, 0xdc, 0x07, 0xda, 0x89, 0xdd, 0x30, + 0x26, 0xe9, 0x0a, 0x79, 0xf7, 0xeb, 0x52, 0xfa, 0x2e, 0x8c, 0xd4, 0xaf, + 0x41, 0xde, 0x05, 0x7d, 0x5c, 0xd2, 0x06, 0x4a, 0x48, 0x4a, 0x74, 0x41, + 0xd2, 0x46, 0xfa, 0x0d, 0x50, 0x3e, 0x5b, 0xf9, 0x59, 0x0d, 0xdc, 0xc4, + 0x5e, 0x50, 0x04, 0x5a, 0x8b, 0xc2, 0xaa, 0x95, 0x2c, 0xb5, 0xce, 0x5d, + 0xa6, 0xac, 0xe7, 0xbd, 0x82, 0xf5, 0x3d, 0x28, 0x8c, 0x28, 0x3d, 0x9f, + 0xc9, 0xfc, 0x38, 0xf5, 0x23, 0x28, 0x84, 0x95, 0x1e, 0x57, 0x34, 0xf9, + 0xb0, 0xfe, 0x17, 0xaa, 0xfe, 0x6e, 0x14, 0x8e, 0x29, 0x3d, 0x9f, 0xe7, + 0xfc, 0x38, 0xeb, 0x4f, 0xa3, 0x70, 0x4e, 0xe9, 0xf9, 0xac, 0xe7, 0x87, + 0xf5, 0x77, 0x54, 0xfd, 0x93, 0x28, 0x5c, 0x52, 0xfa, 0x66, 0xa9, 0x5d, + 0x58, 0xff, 0x02, 0xf4, 0x57, 0x94, 0xde, 0xef, 0xd0, 0xf3, 0xde, 0xce, + 0xf1, 0x3f, 0x07, 0xfd, 0x6b, 0x4a, 0xdf, 0xe2, 0xd0, 0x7f, 0xa8, 0xf4, + 0x2f, 0x43, 0xff, 0x63, 0xa5, 0x0f, 0x38, 0xf4, 0x76, 0xff, 0x5f, 0x85, + 0xfe, 0x17, 0x4a, 0x1f, 0x84, 0x5e, 0x00, 0x10, 0x91, 0x5e, 0x6d, 0xf9, + 0x7f, 0x0b, 0x85, 0x0f, 0x94, 0x3e, 0x0f, 0xfb, 0x04, 0xeb, 0x7f, 0x50, + 0x69, 0x9d, 0x67, 0x53, 0x28, 0x4c, 0x69, 0x82, 0xa6, 0x5c, 0x2e, 0x9a, + 0xd2, 0x35, 0x4a, 0x79, 0x78, 0x76, 0x96, 0xe1, 0x1e, 0xe1, 0x92, 0xf7, + 0x85, 0x1f, 0xc1, 0x6e, 0x2d, 0x24, 0xa6, 0xc7, 0x83, 0x72, 0xb1, 0xbe, + 0x5e, 0x6f, 0xa0, 0xf0, 0x80, 0xa0, 0xb4, 0xff, 0x01, 0x8c, 0x7b, 0x78, + 0x00, 0x99, 0x1d, 0x74, 0x51, 0xb8, 0x47, 0x23, 0x6f, 0x45, 0xda, 0xc3, + 0x3b, 0x50, 0xb1, 0x96, 0xee, 0x79, 0x88, 0x3c, 0x9a, 0x9b, 0xc2, 0xbd, + 0x82, 0xcc, 0x91, 0x09, 0x0a, 0x7b, 0xda, 0x4a, 0x6c, 0x4b, 0xaf, 0x43, + 0x5a, 0x06, 0x6b, 0x17, 0xfe, 0x71, 0x3c, 0x7f, 0x8b, 0x76, 0xf8, 0x2e, + 0x31, 0x25, 0x74, 0xc4, 0x93, 0x97, 0x8b, 0x83, 0xa3, 0xd5, 0x21, 0xff, + 0x39, 0xf4, 0x9c, 0x7b, 0xaf, 0x3f, 0x88, 0x15, 0xee, 0x15, 0x75, 0xda, + 0x61, 0xda, 0xa9, 0x91, 0xf0, 0x56, 0xd4, 0x69, 0x5f, 0x92, 0x5c, 0x78, + 0x54, 0xa7, 0xf0, 0xa6, 0x3c, 0x9a, 0xf5, 0x84, 0x61, 0xe7, 0xa6, 0x80, + 0xab, 0x1d, 0x5e, 0xf6, 0xc0, 0x3f, 0xc7, 0xd0, 0xd2, 0x53, 0x06, 0x3f, + 0xba, 0x6c, 0xeb, 0x36, 0x7c, 0x15, 0xcb, 0xb6, 0xf2, 0xd1, 0x56, 0x01, + 0xfa, 0x5e, 0x98, 0x6b, 0x8f, 0x2d, 0x78, 0xbe, 0xff, 0x33, 0x6c, 0x38, + 0xbe, 0x70, 0x4f, 0x3e, 0x3c, 0xae, 0x93, 0x1e, 0xc3, 0xbd, 0x05, 0x14, + 0xee, 0x2b, 0x24, 0xb3, 0xa7, 0x04, 0xfd, 0x9b, 0xf7, 0xf7, 0x5e, 0xce, + 0x5f, 0x11, 0xfc, 0x15, 0xc3, 0x5f, 0x49, 0xce, 0x5f, 0x9e, 0xec, 0x21, + 0xee, 0x99, 0xb0, 0xe1, 0x31, 0xe1, 0x3c, 0xba, 0xa8, 0xd8, 0xb5, 0xde, + 0x55, 0x47, 0xe1, 0x60, 0x31, 0x99, 0xfe, 0x49, 0x9c, 0xd7, 0xe1, 0x60, + 0x11, 0x85, 0x5b, 0x4b, 0xc8, 0xeb, 0xe1, 0x1c, 0x22, 0xcf, 0x82, 0x73, + 0xa8, 0x0b, 0xb7, 0x1e, 0xf6, 0x17, 0xd3, 0x6c, 0xcf, 0x10, 0x6c, 0xda, + 0x8a, 0xd8, 0xca, 0xeb, 0x90, 0x70, 0x7c, 0x1a, 0xfe, 0x71, 0xfe, 0x74, + 0xcc, 0x95, 0x7c, 0xd0, 0x29, 0xe1, 0xce, 0xb5, 0x6d, 0xf7, 0xa5, 0x08, + 0x3a, 0x9e, 0xf7, 0xff, 0x4f, 0xee, 0x7a, 0xdd, 0xf3, 0x79, 0xd3, 0xac, + 0xbc, 0x69, 0xb2, 0x5d, 0x81, 0x7e, 0xda, 0x6d, 0x94, 0xe5, 0xda, 0x28, + 0xcd, 0xb5, 0xc1, 0xf3, 0x24, 0x0f, 0xbe, 0xab, 0xa0, 0xe3, 0x7b, 0x55, + 0x78, 0xb0, 0x94, 0xc2, 0xfb, 0xca, 0x90, 0x37, 0x50, 0x64, 0x70, 0xd6, + 0xb3, 0x1e, 0xd2, 0x12, 0xe4, 0x0d, 0xe5, 0x40, 0x79, 0x6e, 0x1e, 0xcd, + 0x86, 0x37, 0x50, 0x5e, 0xcb, 0x7c, 0x0e, 0xeb, 0x51, 0xdf, 0x1a, 0x93, + 0x32, 0xe4, 0xd0, 0x83, 0x1c, 0x96, 0xe7, 0xda, 0xb0, 0xfb, 0x11, 0x84, + 0x0d, 0xaf, 0xcf, 0x59, 0x9c, 0x21, 0x3c, 0xc2, 0xe1, 0x5e, 0x0f, 0xf2, + 0xe7, 0xc5, 0xc9, 0xe2, 0x86, 0x5f, 0xbe, 0xb5, 0xb3, 0x8c, 0xdb, 0x5c, + 0x87, 0x9c, 0xb8, 0x45, 0x40, 0x6b, 0xa2, 0x94, 0x7f, 0x2d, 0xe6, 0x8b, + 0xd9, 0x53, 0x40, 0xdc, 0x93, 0xf9, 0xf9, 0xb6, 0x16, 0xbe, 0xac, 0xf9, + 0x56, 0x81, 0xf6, 0xbc, 0xb9, 0xb6, 0x84, 0xcc, 0x26, 0x0c, 0xf1, 0x70, + 0x5e, 0x9d, 0x39, 0xee, 0x43, 0x1d, 0x2e, 0xf3, 0x18, 0x0a, 0x8c, 0xd1, + 0x7a, 0x81, 0x51, 0x13, 0x5e, 0x1a, 0x12, 0x79, 0x94, 0xf6, 0xec, 0x86, + 0x6c, 0x3e, 0x57, 0x1b, 0x60, 0x6b, 0x8d, 0x47, 0x65, 0xce, 0x37, 0xe7, + 0xd1, 0x7e, 0x6c, 0xdf, 0xf6, 0xfc, 0x1f, 0xc9, 0xc5, 0x53, 0x85, 0x78, + 0xaa, 0x73, 0x75, 0xec, 0xbe, 0x6f, 0x83, 0xbe, 0x05, 0x95, 0x67, 0xa5, + 0x0f, 0xee, 0x67, 0x35, 0xe2, 0xa8, 0x46, 0x9b, 0x6e, 0x61, 0xfa, 0x85, + 0xca, 0x01, 0x7b, 0x67, 0x5d, 0x95, 0x23, 0x07, 0x2d, 0xc8, 0x41, 0x9f, + 0xcc, 0x41, 0x7e, 0x2e, 0x07, 0x42, 0x7a, 0xb9, 0x1f, 0x3e, 0xbd, 0xa8, + 0x11, 0xc6, 0x65, 0xac, 0x4e, 0x3c, 0x85, 0x5c, 0x16, 0x29, 0x3f, 0x7c, + 0x9a, 0x17, 0xe3, 0x64, 0xd5, 0x31, 0x23, 0xdb, 0x90, 0x9d, 0x72, 0xd8, + 0x5b, 0x99, 0x99, 0x44, 0x9d, 0x02, 0xae, 0xe3, 0xa9, 0x41, 0xfb, 0x3c, + 0x62, 0xc5, 0xf2, 0x7b, 0x93, 0x9d, 0xb7, 0x07, 0xa0, 0xe7, 0xf5, 0x13, + 0xc6, 0x79, 0xcd, 0x23, 0x52, 0x88, 0x12, 0xf7, 0xfa, 0x21, 0xc8, 0xbb, + 0x40, 0x03, 0x38, 0x31, 0x78, 0x55, 0xa2, 0x37, 0x11, 0xaf, 0x36, 0xe8, + 0xad, 0xa3, 0xad, 0xae, 0x7c, 0x6d, 0x56, 0xce, 0x4f, 0xb7, 0x6e, 0xfa, + 0xeb, 0x70, 0xde, 0xba, 0x5d, 0xa6, 0xbf, 0x1e, 0xa7, 0x18, 0xa8, 0x67, + 0x05, 0xea, 0x73, 0x79, 0x2f, 0xce, 0xed, 0xbf, 0xd1, 0x34, 0xd1, 0x76, + 0x7b, 0x56, 0xce, 0x01, 0x77, 0xbe, 0xe9, 0xaf, 0x45, 0x86, 0x41, 0x3d, + 0x3e, 0x49, 0x2b, 0xf2, 0xad, 0x9d, 0x84, 0xc8, 0x8e, 0x61, 0xd2, 0xef, + 0x43, 0x7f, 0xac, 0xbb, 0x13, 0xc7, 0x70, 0x04, 0x31, 0xf0, 0xf9, 0x60, + 0xed, 0x71, 0x07, 0x35, 0x1f, 0xb2, 0xe4, 0xb6, 0x32, 0xe8, 0xe1, 0x3c, + 0x73, 0x26, 0x79, 0xbf, 0x01, 0xf5, 0xb0, 0x2f, 0xb7, 0x98, 0x12, 0xe8, + 0xa5, 0xbf, 0x1c, 0xbc, 0x3d, 0x77, 0xb8, 0x6f, 0x19, 0xf8, 0xe1, 0x3d, + 0x29, 0xd5, 0xb3, 0x4b, 0xee, 0x03, 0xbc, 0xa7, 0xf2, 0x1a, 0x38, 0x6d, + 0xcb, 0xc3, 0xe3, 0xe4, 0xe9, 0xe3, 0xb9, 0xad, 0xc9, 0x5c, 0x9c, 0x83, + 0x9c, 0xef, 0x4f, 0x9c, 0xe7, 0x80, 0xf0, 0xa3, 0x5e, 0x37, 0xb5, 0xa0, + 0x4f, 0xe5, 0x88, 0x8e, 0xfd, 0xea, 0xb0, 0x62, 0x7f, 0x17, 0x60, 0xc7, + 0xe7, 0x01, 0xdf, 0x21, 0x52, 0x23, 0x9d, 0xe4, 0x09, 0xa6, 0xfc, 0x1b, + 0x55, 0xdb, 0x76, 0xfe, 0x9f, 0x81, 0x0d, 0xcf, 0x2b, 0x2b, 0xff, 0x3c, + 0x83, 0xcb, 0x64, 0x86, 0xb9, 0x7f, 0x97, 0xa0, 0xe3, 0xfe, 0x3a, 0xc7, + 0x66, 0x08, 0xd6, 0x3c, 0x37, 0x35, 0x6a, 0xd3, 0x53, 0xfe, 0x10, 0xe6, + 0x50, 0x19, 0x62, 0xb5, 0xd6, 0xec, 0x0b, 0xb0, 0xe7, 0xf5, 0xc4, 0x79, + 0x4a, 0x85, 0xef, 0x23, 0xad, 0x77, 0xbd, 0xee, 0xc3, 0xa8, 0x56, 0x41, + 0x5f, 0xac, 0x7b, 0x3d, 0xfd, 0x3a, 0xd6, 0x17, 0xc6, 0x99, 0x4b, 0xeb, + 0xf5, 0x62, 0x0a, 0xe8, 0x01, 0xc4, 0x3e, 0x40, 0xad, 0x2e, 0x8e, 0x6b, + 0xd3, 0x82, 0xd8, 0x5f, 0xca, 0xc5, 0x5e, 0x8f, 0xd8, 0x57, 0xa2, 0xff, + 0xf3, 0xb1, 0xdb, 0x73, 0x03, 0x4d, 0xa1, 0x37, 0xf3, 0x6b, 0x8a, 0xcb, + 0xfc, 0xd8, 0x32, 0x3b, 0xae, 0x6f, 0xc0, 0x17, 0xcf, 0x75, 0x7b, 0xaf, + 0x1c, 0xd2, 0x6b, 0xd0, 0x87, 0x83, 0xc8, 0x91, 0x5b, 0x4f, 0x7b, 0xf6, + 0x81, 0x16, 0xe3, 0x16, 0xe8, 0x85, 0x6c, 0x3f, 0xcb, 0x90, 0x2d, 0x0f, + 0xe2, 0x1a, 0x21, 0xcd, 0xd5, 0xf6, 0x6f, 0xdc, 0x17, 0xaf, 0x9e, 0x9a, + 0x44, 0x6f, 0x46, 0xad, 0x31, 0xb3, 0xc6, 0xe0, 0x5a, 0x2e, 0xbe, 0x3a, + 0xd8, 0x06, 0x31, 0x6e, 0xf3, 0xf1, 0x15, 0xc0, 0x0b, 0x8f, 0xdf, 0x77, + 0x61, 0xc3, 0xc7, 0xe4, 0x50, 0x1e, 0xee, 0x7a, 0x9e, 0x03, 0x90, 0x71, + 0x3b, 0x2e, 0x6a, 0xf3, 0x85, 0x7b, 0x6a, 0x70, 0xe6, 0xa4, 0xfd, 0x0f, + 0xe2, 0x9e, 0xea, 0x16, 0xcd, 0x62, 0x0d, 0x76, 0x94, 0x7b, 0x69, 0x4c, + 0xf0, 0x1e, 0x83, 0x7b, 0xce, 0xbe, 0x16, 0xea, 0xdb, 0x6a, 0x62, 0xc7, + 0xf3, 0x68, 0x6d, 0xf9, 0x93, 0x03, 0xc8, 0xe6, 0xc8, 0x36, 0x1a, 0x33, + 0xb8, 0x7d, 0x1e, 0x37, 0x1e, 0x9b, 0x3f, 0xcd, 0xb5, 0xdf, 0x88, 0xf5, + 0xb8, 0x86, 0x23, 0xce, 0x8d, 0xad, 0x7d, 0xd6, 0xfe, 0x39, 0x6c, 0x3a, + 0xb9, 0x7d, 0x7d, 0xb5, 0x6c, 0xdf, 0xea, 0x27, 0xda, 0x6f, 0xe6, 0xf6, + 0x67, 0xc9, 0x0f, 0x9d, 0x5b, 0x78, 0x35, 0x8e, 0xa3, 0x95, 0xdc, 0x5a, + 0xb3, 0x86, 0x38, 0xfc, 0xcd, 0xc8, 0x15, 0xcf, 0xd8, 0x26, 0xb4, 0xc4, + 0xf1, 0x34, 0xa0, 0xf5, 0xd5, 0xd4, 0xb7, 0xc5, 0xc4, 0x89, 0x27, 0xe3, + 0xc1, 0x6b, 0xb0, 0xd4, 0xc8, 0x76, 0x72, 0xed, 0x29, 0xa3, 0xed, 0x3c, + 0xcd, 0x30, 0x6e, 0x38, 0x39, 0xa9, 0x2c, 0x7e, 0x50, 0x54, 0x7b, 0xe8, + 0x00, 0xb3, 0xb8, 0x6a, 0xbe, 0x4d, 0x51, 0x9e, 0xdb, 0x65, 0x74, 0x18, + 0x48, 0x5a, 0x6c, 0x5a, 0x99, 0x55, 0x7a, 0xe8, 0x0c, 0x2f, 0x81, 0x73, + 0x02, 0x66, 0xcf, 0x08, 0x66, 0xbf, 0x22, 0x64, 0xbd, 0x0b, 0xc2, 0xb2, + 0xfc, 0x12, 0x64, 0xf1, 0x1d, 0x13, 0xf4, 0x9a, 0x25, 0xfe, 0x63, 0xb6, + 0x89, 0xef, 0xa0, 0x9f, 0x48, 0xdb, 0xb7, 0x2d, 0xe1, 0x4d, 0xc8, 0x84, + 0xb7, 0x1c, 0xdb, 0x4a, 0x19, 0x2e, 0xd9, 0x65, 0xd4, 0xc4, 0x7e, 0x36, + 0xb2, 0x9b, 0xa9, 0xb8, 0xa8, 0xf1, 0xd0, 0x4a, 0x66, 0x87, 0xbb, 0x76, + 0xec, 0xd8, 0x71, 0x94, 0x9a, 0x2c, 0xb7, 0x4d, 0x2a, 0xde, 0xd7, 0xa4, + 0x9f, 0x0b, 0x96, 0x9f, 0x5e, 0x54, 0xfb, 0x23, 0x16, 0x7c, 0x61, 0x82, + 0x6e, 0x48, 0xd1, 0xe9, 0x93, 0x71, 0x8a, 0xca, 0x78, 0x5e, 0x90, 0xe5, + 0x63, 0xff, 0xbb, 0x93, 0x0e, 0xb0, 0xf7, 0x6d, 0xec, 0xa6, 0xe3, 0xb4, + 0xa8, 0x71, 0xe3, 0x72, 0x5b, 0x46, 0x09, 0xd8, 0xa0, 0xd4, 0x84, 0x97, + 0x10, 0x3c, 0xe7, 0xca, 0x01, 0xa6, 0x6d, 0x8a, 0xf2, 0x7e, 0xc5, 0x65, + 0x1e, 0x37, 0xa6, 0xbc, 0x16, 0x99, 0xf2, 0x7a, 0x43, 0x4d, 0xcc, 0xb8, + 0x22, 0x59, 0x0e, 0x2a, 0xf9, 0x1a, 0x45, 0xb9, 0x11, 0xb6, 0xe3, 0xbd, + 0x94, 0xed, 0x34, 0xcc, 0x1b, 0x2e, 0x77, 0xa9, 0x72, 0x1f, 0xee, 0xe2, + 0x5c, 0xe6, 0x87, 0xf5, 0xfc, 0x70, 0xb9, 0x17, 0xb0, 0xea, 0xf2, 0xaa, + 0xb5, 0x79, 0xf6, 0x6a, 0xd9, 0x09, 0x78, 0x60, 0x7b, 0xde, 0x8b, 0x98, + 0xe6, 0x21, 0x12, 0xae, 0xc7, 0x7b, 0x09, 0x97, 0x4b, 0xe0, 0xd7, 0xa2, + 0x96, 0x5d, 0x29, 0x22, 0xe7, 0x32, 0x7b, 0x63, 0xca, 0xdf, 0xa5, 0x98, + 0xd6, 0x62, 0x27, 0xe6, 0x7a, 0x7c, 0x37, 0x65, 0x1a, 0x00, 0x38, 0xb1, + 0x41, 0x94, 0xb8, 0x35, 0x8e, 0x21, 0x08, 0x4b, 0xde, 0xcd, 0xd9, 0x1e, + 0xab, 0x43, 0xd1, 0x36, 0xa5, 0x5b, 0xe3, 0xb0, 0x6b, 0x97, 0xfd, 0xb2, + 0xea, 0x74, 0xc9, 0x77, 0x59, 0x96, 0xaf, 0x2e, 0x9c, 0x31, 0x56, 0x1c, + 0x7c, 0x43, 0x63, 0x3f, 0x5c, 0x8b, 0x29, 0x5b, 0x71, 0xbb, 0x7d, 0x00, + 0xd7, 0x63, 0x3b, 0xce, 0x0d, 0xcb, 0xf8, 0x4e, 0xc4, 0xb4, 0x83, 0x44, + 0x1b, 0x69, 0x6d, 0xdb, 0x81, 0x29, 0xca, 0x1f, 0x8e, 0x9b, 0xf1, 0xec, + 0x46, 0xd2, 0x36, 0x86, 0x48, 0xdf, 0x18, 0x5a, 0xb3, 0x9f, 0xc4, 0x38, + 0x09, 0xe8, 0xb6, 0x4f, 0x50, 0xcd, 0xf6, 0xb9, 0xa8, 0xb1, 0x29, 0x9e, + 0x48, 0xc4, 0xcd, 0x23, 0x63, 0x89, 0xb8, 0x61, 0x66, 0xbb, 0x8e, 0x46, + 0x8e, 0x47, 0x48, 0x4c, 0x90, 0x36, 0x31, 0x4e, 0xae, 0x89, 0xf1, 0x71, + 0x30, 0x13, 0x60, 0xf0, 0x51, 0x33, 0x11, 0x31, 0x63, 0xe9, 0x64, 0x3c, + 0xd6, 0x1d, 0x49, 0xa5, 0xba, 0x47, 0xa3, 0xd9, 0xf8, 0xf1, 0x78, 0xf6, + 0x54, 0x88, 0x56, 0xe4, 0xe4, 0xd1, 0xa4, 0x99, 0x85, 0x8f, 0xee, 0x31, + 0xa6, 0x27, 0xb3, 0x21, 0x1a, 0x9d, 0x88, 0x26, 0x67, 0xba, 0xed, 0x6a, + 0x87, 0xac, 0x86, 0xa2, 0xb2, 0x21, 0x38, 0x89, 0xc3, 0xc9, 0x31, 0x33, + 0x79, 0x22, 0x61, 0xc4, 0x8e, 0x18, 0xbb, 0xe7, 0xd2, 0xd1, 0xe9, 0x48, + 0xc6, 0xd8, 0x1d, 0x49, 0x47, 0x66, 0x32, 0xad, 0x9b, 0xe6, 0xe2, 0x89, + 0x98, 0x91, 0x0e, 0xd1, 0xfa, 0x4f, 0xeb, 0x22, 0x44, 0x63, 0x9f, 0xbc, + 0xea, 0x5e, 0x23, 0x93, 0x4a, 0x9a, 0x19, 0x63, 0x22, 0x9e, 0x41, 0x4f, + 0xb8, 0xfd, 0xc1, 0x25, 0x9c, 0x2c, 0xc8, 0xde, 0x7c, 0xd8, 0x9d, 0x9f, + 0xa4, 0x5a, 0x88, 0x36, 0x7c, 0x12, 0xf3, 0xc9, 0x6c, 0x24, 0xeb, 0x88, + 0xb0, 0x77, 0x79, 0x75, 0xb7, 0x26, 0x92, 0x27, 0xac, 0xe4, 0x86, 0x68, + 0x99, 0xd1, 0x21, 0x1b, 0x73, 0x09, 0x0c, 0xe3, 0x52, 0x39, 0xc0, 0x78, + 0x67, 0xe6, 0x66, 0xee, 0x1a, 0xba, 0xa5, 0x5a, 0x59, 0x50, 0x2d, 0x44, + 0xeb, 0x96, 0xe8, 0x87, 0x32, 0xbf, 0x7b, 0x88, 0xba, 0x96, 0xa8, 0xb8, + 0x3b, 0x9d, 0x8c, 0xcd, 0x45, 0xb3, 0x9b, 0x8d, 0x6c, 0x24, 0x9e, 0xc8, + 0x84, 0x68, 0xe3, 0x27, 0xb2, 0xbf, 0xbb, 0xbd, 0xb6, 0xa5, 0xea, 0xab, + 0xa9, 0xbc, 0xf4, 0xe4, 0xb5, 0x27, 0x7d, 0xe6, 0xee, 0x46, 0x86, 0x96, + 0xd9, 0x48, 0x66, 0x5f, 0x2a, 0x86, 0xe9, 0x10, 0x9b, 0x9f, 0xb1, 0x4b, + 0x2d, 0xba, 0x3d, 0x73, 0x46, 0xfa, 0xd4, 0xc2, 0x9c, 0x2c, 0x5e, 0x74, + 0xe3, 0x4b, 0x34, 0xfe, 0xf1, 0x2e, 0x94, 0xdf, 0xf9, 0x85, 0xf0, 0xe9, + 0xa3, 0x51, 0xae, 0x96, 0xce, 0xe2, 0xc7, 0x46, 0x13, 0xa2, 0xe1, 0x65, + 0x75, 0x44, 0x8d, 0x57, 0x66, 0x71, 0x1a, 0x06, 0x3e, 0x45, 0xed, 0x10, + 0x05, 0x65, 0xad, 0xf4, 0x4c, 0x26, 0xd1, 0x7d, 0x14, 0xdb, 0x6b, 0xf7, + 0x5d, 0x7b, 0x6c, 0x6b, 0xef, 0x72, 0x8c, 0xfa, 0x96, 0x63, 0xd4, 0xbf, + 0x1c, 0xa3, 0x81, 0xe5, 0x18, 0x0d, 0x86, 0x68, 0xe5, 0x92, 0x81, 0xdf, + 0xb3, 0xbc, 0xd0, 0xef, 0x59, 0x4e, 0x83, 0xeb, 0x96, 0xd3, 0xe0, 0xd0, + 0xf2, 0x1a, 0x1c, 0xc2, 0x5d, 0x7c, 0xa9, 0xe0, 0x39, 0xa6, 0x58, 0x24, + 0x71, 0x3c, 0x7e, 0x0c, 0x07, 0x92, 0x99, 0xc4, 0x1e, 0x1a, 0x4f, 0x9a, + 0xdd, 0x5b, 0xcc, 0x68, 0x22, 0x99, 0xc1, 0xf1, 0xb7, 0xd3, 0xc8, 0x4e, + 0x27, 0x63, 0x21, 0x6a, 0xfa, 0x08, 0xa3, 0x71, 0x13, 0x47, 0xc1, 0x58, + 0x22, 0x92, 0xc1, 0xe6, 0xd1, 0xf8, 0x11, 0xfa, 0xc9, 0xf8, 0x11, 0x33, + 0x92, 0x9d, 0x4b, 0x1b, 0x21, 0xf2, 0x4e, 0xf0, 0x01, 0xda, 0x9d, 0x88, + 0x98, 0x47, 0xba, 0xef, 0x3f, 0x74, 0xd4, 0x88, 0x62, 0xfb, 0xac, 0x72, + 0xc8, 0xf6, 0xce, 0x99, 0x66, 0xe4, 0x50, 0x62, 0x91, 0xe5, 0x64, 0x36, + 0x8d, 0x10, 0x42, 0x54, 0x6d, 0x59, 0xce, 0x65, 0xe3, 0x89, 0xee, 0xd1, + 0x74, 0x3a, 0x72, 0x8a, 0x57, 0xf5, 0xc7, 0x88, 0x87, 0xed, 0xb6, 0xe6, + 0xad, 0x11, 0x5e, 0x8d, 0xc3, 0xc3, 0x58, 0x32, 0x91, 0x40, 0x00, 0xe8, + 0x66, 0x2e, 0x06, 0x69, 0x3b, 0x9e, 0x35, 0xd2, 0x91, 0x6c, 0x12, 0x87, + 0x9b, 0xc7, 0x61, 0x6d, 0x35, 0xb5, 0x58, 0x32, 0x4c, 0x62, 0x3f, 0xb9, + 0xf6, 0xe3, 0xae, 0xa0, 0xe3, 0x03, 0xb7, 0x81, 0xfd, 0xb8, 0x0d, 0xec, + 0xe7, 0xbb, 0xc1, 0xfe, 0x89, 0xed, 0x94, 0x87, 0x0f, 0x8b, 0x67, 0x3d, + 0x5f, 0x12, 0x20, 0x61, 0x22, 0x0e, 0x92, 0x76, 0x70, 0x82, 0x2a, 0xa7, + 0x1c, 0x5d, 0xb7, 0xd3, 0xb1, 0x40, 0x68, 0xf7, 0xbc, 0x38, 0x12, 0x8d, + 0x1a, 0x99, 0x4c, 0x6b, 0x4f, 0x4f, 0x0f, 0xd9, 0x7c, 0xaf, 0x83, 0xef, + 0x73, 0xf0, 0xfd, 0xe0, 0x4b, 0x2c, 0xfb, 0xad, 0x89, 0xc8, 0x91, 0x0c, + 0x55, 0x46, 0xee, 0xbe, 0x47, 0x90, 0x2b, 0x12, 0x8b, 0x51, 0x3e, 0x3e, + 0x46, 0x13, 0x09, 0xd0, 0x0c, 0xf7, 0x8f, 0x4a, 0xd5, 0x1d, 0xc4, 0xba, + 0xec, 0x50, 0xde, 0x21, 0xbe, 0x66, 0x50, 0x45, 0x34, 0x89, 0x11, 0x8e, + 0x66, 0x47, 0xcd, 0xd8, 0x96, 0x93, 0x46, 0x74, 0x2e, 0x6b, 0x90, 0x1b, + 0x22, 0x3e, 0xd3, 0x46, 0x33, 0xa7, 0xcc, 0x28, 0x95, 0xab, 0x92, 0xbd, + 0x5f, 0x53, 0x8d, 0x21, 0x47, 0x71, 0xb7, 0x61, 0xc6, 0x30, 0x70, 0xb6, + 0x38, 0x43, 0xa5, 0x10, 0xe0, 0x9c, 0x62, 0x67, 0x48, 0x3b, 0xf9, 0x0d, + 0xcb, 0xdd, 0xfd, 0xe6, 0x82, 0x6b, 0x82, 0xc3, 0xc2, 0x75, 0xc4, 0xc8, + 0x52, 0x15, 0x3e, 0xd4, 0x6e, 0xc7, 0x51, 0x5a, 0xdb, 0x10, 0x79, 0x58, + 0xaa, 0xb6, 0x26, 0x79, 0xe4, 0x2f, 0x90, 0x84, 0x93, 0xc7, 0x0c, 0x93, + 0xca, 0x61, 0x63, 0x9f, 0x1d, 0x63, 0xc9, 0x98, 0x41, 0x65, 0xd3, 0xb8, + 0x6d, 0x25, 0x72, 0xb7, 0x29, 0x2a, 0xc0, 0x9d, 0x6a, 0x17, 0xee, 0x62, + 0xa4, 0x4f, 0x27, 0xd1, 0xff, 0xbc, 0xb8, 0x89, 0xcb, 0x1b, 0xbe, 0x4e, + 0x64, 0x1c, 0x57, 0xaf, 0x18, 0x79, 0xe3, 0x19, 0x15, 0xe0, 0xe4, 0x5c, + 0x2a, 0x95, 0x4c, 0xe3, 0x3c, 0xa1, 0x82, 0x78, 0x66, 0xcb, 0x4c, 0x2a, + 0x7b, 0x8a, 0x95, 0x5b, 0x0d, 0x39, 0xbd, 0x17, 0x28, 0xf7, 0x1a, 0x91, + 0xd8, 0x29, 0x2a, 0x8c, 0xab, 0xc9, 0x44, 0x15, 0x89, 0xc8, 0x9c, 0x19, + 0x9d, 0x56, 0x7e, 0xf8, 0xb6, 0x41, 0xba, 0x19, 0x99, 0x31, 0xa8, 0xd8, + 0x34, 0x4e, 0xa8, 0xeb, 0x1c, 0x24, 0x1c, 0x4b, 0x63, 0xd2, 0x74, 0x34, + 0x6f, 0xf7, 0xd1, 0xee, 0x07, 0x35, 0x24, 0xed, 0x74, 0x4d, 0x1a, 0xe9, + 0xe3, 0xf1, 0xa8, 0xb1, 0x39, 0x9e, 0xc1, 0x00, 0x70, 0x52, 0x11, 0x57, + 0x8d, 0x43, 0x9b, 0x9d, 0x4b, 0x6d, 0xc5, 0xed, 0x36, 0x33, 0x0d, 0x79, + 0x45, 0xd2, 0x44, 0x5e, 0x79, 0xcc, 0x72, 0x8e, 0x6a, 0x93, 0xe6, 0xc2, + 0x73, 0x2e, 0xa7, 0xf1, 0x42, 0x63, 0xef, 0xfa, 0xea, 0x00, 0x25, 0x58, + 0x5b, 0x27, 0x89, 0xad, 0xc8, 0x59, 0xd7, 0xa7, 0x16, 0xdc, 0x20, 0xa4, + 0xd5, 0x58, 0x24, 0x91, 0x38, 0x84, 0x79, 0x47, 0x2b, 0x52, 0xca, 0x7e, + 0x2c, 0x39, 0x93, 0x4a, 0x18, 0x08, 0x31, 0xa7, 0xaa, 0x9d, 0x57, 0xc9, + 0xc0, 0xe6, 0x35, 0x75, 0xb6, 0x46, 0x4e, 0xcb, 0x85, 0x0e, 0x2b, 0x67, + 0xef, 0x3e, 0xa0, 0xa9, 0xf6, 0x23, 0x84, 0xd6, 0xdc, 0xf4, 0x7d, 0x84, + 0x66, 0x1c, 0x91, 0x50, 0x99, 0xa5, 0xb0, 0x7b, 0x43, 0xca, 0xaf, 0x5d, + 0xb6, 0x6a, 0x7b, 0x17, 0x1a, 0xc9, 0x8a, 0xae, 0xf4, 0x9c, 0x49, 0x25, + 0x19, 0x23, 0xcb, 0x93, 0x91, 0x6f, 0xc1, 0xe4, 0x46, 0x41, 0x65, 0x72, + 0x3c, 0x46, 0x65, 0xf3, 0x25, 0xb9, 0xa8, 0x1c, 0xe5, 0xf0, 0xa9, 0x94, + 0x41, 0x1e, 0xd6, 0xab, 0x66, 0xac, 0x69, 0xaa, 0x67, 0xe2, 0xa7, 0x0d, + 0x2a, 0xcf, 0x64, 0x23, 0xe9, 0xac, 0x63, 0xf2, 0x17, 0x64, 0xe6, 0x0e, + 0x49, 0x0f, 0x3a, 0x18, 0x2c, 0x1e, 0xfe, 0x8c, 0xa6, 0xe3, 0x29, 0x5e, + 0x3b, 0x19, 0xca, 0xcf, 0x4e, 0xc7, 0xb1, 0x21, 0x28, 0xda, 0x4b, 0xee, + 0xe3, 0x91, 0x44, 0x6b, 0x44, 0x7d, 0xed, 0xa0, 0x12, 0x2e, 0xc5, 0xac, + 0x2b, 0x1d, 0x55, 0x71, 0x21, 0xb7, 0xd6, 0x26, 0xe7, 0xe4, 0x5e, 0x42, + 0xc5, 0x2c, 0x4d, 0xc9, 0xef, 0x13, 0x54, 0x2d, 0x79, 0x6b, 0x18, 0xc7, + 0x63, 0xf8, 0x92, 0x12, 0x3f, 0x1c, 0x47, 0xc7, 0x3c, 0x0e, 0x31, 0xc7, + 0x8e, 0xbd, 0xc4, 0x21, 0xc9, 0x84, 0x93, 0x7b, 0x78, 0x2c, 0xac, 0xa6, + 0xed, 0x21, 0xa3, 0x0a, 0x69, 0xb2, 0xa0, 0x83, 0xa5, 0x4e, 0x51, 0xc6, + 0x0a, 0x2e, 0x9b, 0x1c, 0x9b, 0x36, 0x30, 0x41, 0xf2, 0xa0, 0x9b, 0x33, + 0x68, 0xf6, 0xcc, 0x99, 0xcd, 0x43, 0x8f, 0x06, 0x78, 0xce, 0x60, 0x93, + 0x08, 0x6c, 0x08, 0xc4, 0x8c, 0x93, 0x81, 0x8e, 0x00, 0xbe, 0x20, 0xa5, + 0xe2, 0x09, 0x79, 0x18, 0x75, 0xce, 0x60, 0x05, 0x43, 0x91, 0x36, 0x12, + 0x06, 0xbe, 0x09, 0x41, 0x89, 0xc5, 0xdb, 0x19, 0x65, 0x27, 0x98, 0xd6, + 0x99, 0xc0, 0x86, 0xc3, 0x91, 0x44, 0xc6, 0xe8, 0x08, 0xcc, 0xc4, 0xcd, + 0x4e, 0x7c, 0x7b, 0x0a, 0x6c, 0xe8, 0xed, 0x08, 0x1c, 0x37, 0xd2, 0x19, + 0x64, 0x0b, 0xb5, 0xfa, 0xbb, 0xfa, 0xbb, 0xfa, 0x7a, 0x3a, 0x63, 0xc6, + 0xf1, 0xb5, 0x91, 0x64, 0x26, 0xd5, 0x1b, 0x78, 0x8c, 0xb4, 0x55, 0xe2, + 0x79, 0xd1, 0x90, 0x87, 0x3f, 0xfb, 0xd5, 0xfa, 0x36, 0xfa, 0x1a, 0x7c, + 0x79, 0x5a, 0x2b, 0x04, 0x75, 0x13, 0xda, 0x4a, 0x6d, 0x8f, 0x4e, 0x66, + 0x93, 0x55, 0xdc, 0x61, 0x91, 0xb1, 0x85, 0xd6, 0x4d, 0xb6, 0xf5, 0x2e, + 0x4b, 0xbd, 0xd3, 0x22, 0x5d, 0x16, 0x19, 0xb6, 0x48, 0xc8, 0x22, 0x83, + 0x16, 0x19, 0xb1, 0x3c, 0xe8, 0x3e, 0xa1, 0x5a, 0x93, 0xcd, 0x5b, 0x45, + 0x76, 0x27, 0x8b, 0x05, 0x88, 0x66, 0xa3, 0x6f, 0x9d, 0x4f, 0xf7, 0xad, + 0xf7, 0xe5, 0x84, 0x85, 0x3e, 0x0d, 0x22, 0x4b, 0x2c, 0x03, 0xc5, 0xeb, + 0x7a, 0x41, 0x17, 0xfd, 0xc2, 0xfe, 0xdf, 0x72, 0xf6, 0xac, 0x7e, 0xc3, + 0x17, 0x10, 0xef, 0xfb, 0x48, 0x13, 0x42, 0x97, 0xe2, 0x20, 0x64, 0xef, + 0xd4, 0xb6, 0x8a, 0x0f, 0x6b, 0xc9, 0x25, 0x44, 0xbe, 0x6d, 0xba, 0x12, + 0xe2, 0xb7, 0x56, 0xac, 0x12, 0x77, 0xf0, 0xb6, 0x53, 0x88, 0x22, 0x5b, + 0xbc, 0x1a, 0xe2, 0xe7, 0xea, 0xda, 0xc4, 0xf5, 0x3a, 0x12, 0x42, 0xb8, + 0x2f, 0xfa, 0xd7, 0x40, 0x70, 0xb9, 0xbe, 0x5d, 0xbc, 0x5a, 0xcf, 0x82, + 0xd2, 0x8b, 0xfe, 0xb5, 0x10, 0x9c, 0x6d, 0xe8, 0x10, 0x97, 0x1b, 0xb8, + 0x62, 0x99, 0x5d, 0xb1, 0x13, 0xe2, 0x77, 0x1a, 0xba, 0xc4, 0xd9, 0x46, + 0x34, 0xad, 0x55, 0x48, 0x71, 0x37, 0x64, 0x37, 0x1a, 0x7b, 0xc4, 0x9d, + 0x46, 0x21, 0xce, 0xe2, 0x5d, 0x91, 0x10, 0x95, 0x17, 0xfd, 0x7d, 0x10, + 0x5e, 0x6d, 0xea, 0x17, 0xf8, 0x85, 0x11, 0x62, 0xac, 0x92, 0x86, 0x03, + 0x5c, 0xb9, 0x69, 0x50, 0x7c, 0x08, 0x59, 0xa9, 0xbb, 0xc6, 0x2b, 0xb4, + 0x7b, 0x3e, 0x7f, 0x56, 0x7f, 0xbd, 0x45, 0x5c, 0xf0, 0x5f, 0xf1, 0xe3, + 0xe3, 0x42, 0x00, 0x1f, 0x2f, 0x73, 0xf1, 0xc5, 0x80, 0xd0, 0x5e, 0x0d, + 0xb8, 0xb4, 0x17, 0x83, 0x9a, 0xf6, 0xc3, 0x60, 0xc1, 0x39, 0xbc, 0xeb, + 0x72, 0x40, 0xd7, 0x6e, 0xad, 0x1a, 0x16, 0xb7, 0x02, 0x42, 0x9c, 0x0f, + 0x6a, 0xe2, 0xba, 0x5f, 0x13, 0x3f, 0x6c, 0x06, 0xef, 0x17, 0xe2, 0x72, + 0xab, 0x10, 0xaf, 0x03, 0x37, 0x81, 0x7f, 0x6c, 0xcd, 0x13, 0xd7, 0x57, + 0x0a, 0x71, 0x0b, 0xb8, 0xbe, 0x0a, 0x2f, 0x02, 0xf0, 0xf0, 0xfb, 0x80, + 0x44, 0xab, 0xf5, 0x2e, 0xe2, 0x31, 0xd0, 0xf3, 0x8a, 0x7f, 0xca, 0xc1, + 0x5f, 0x52, 0x3c, 0xdb, 0x3e, 0xaf, 0xf4, 0xdf, 0x70, 0xe8, 0xbf, 0xed, + 0xe0, 0xbf, 0xe3, 0xe0, 0x5f, 0x77, 0xf0, 0x7f, 0xe6, 0xe0, 0xff, 0xd2, + 0xc1, 0xff, 0x44, 0xf1, 0xec, 0xfb, 0x1d, 0xf0, 0x4c, 0x7f, 0xa5, 0xe8, + 0x7f, 0x29, 0x5a, 0x8e, 0x17, 0x85, 0x27, 0x1d, 0xf1, 0xc2, 0x44, 0xbe, + 0x57, 0x49, 0x41, 0x76, 0x5e, 0xc9, 0x59, 0xc6, 0xcf, 0xc5, 0x45, 0xe5, + 0x2b, 0x8b, 0xea, 0xf1, 0xfb, 0xa7, 0xcb, 0x90, 0x7d, 0x73, 0x91, 0x9d, + 0x9d, 0x0f, 0xe9, 0x04, 0x1f, 0x6f, 0x2d, 0xd2, 0xdf, 0x5c, 0x54, 0xbe, + 0xb5, 0xa8, 0x7c, 0x67, 0x51, 0x39, 0xa1, 0xca, 0xfc, 0xae, 0x93, 0x9f, + 0xad, 0x00, 0xb7, 0xbb, 0x0d, 0xf4, 0x03, 0xd0, 0xed, 0x2c, 0xc4, 0x0b, + 0x99, 0x09, 0x10, 0x0f, 0xe8, 0x2e, 0xd0, 0x42, 0x50, 0xeb, 0xed, 0x94, + 0x95, 0x07, 0x36, 0xe1, 0x7c, 0x5c, 0x06, 0x52, 0x00, 0xbf, 0xdf, 0xe9, + 0x07, 0x6e, 0x81, 0xe1, 0x77, 0x3b, 0x9b, 0x00, 0xfe, 0x8d, 0x9f, 0x0e, + 0xca, 0x7f, 0x0f, 0xe2, 0xdf, 0xf9, 0x71, 0x7b, 0xfc, 0xb7, 0x6c, 0xfe, + 0xad, 0x1f, 0x8a, 0xf2, 0xfd, 0x15, 0xff, 0xde, 0x4f, 0xf8, 0xad, 0xdf, + 0x42, 0xf1, 0x6f, 0xfe, 0x5c, 0xe0, 0xf9, 0xdd, 0x2b, 0xff, 0x5d, 0x52, + 0xa0, 0x41, 0x7e, 0x3f, 0xc4, 0x7f, 0xff, 0xd5, 0x20, 0xe7, 0xb6, 0xf8, + 0x37, 0x81, 0x3a, 0x78, 0x7e, 0x47, 0xc7, 0x73, 0x83, 0xc0, 0xf3, 0x7b, + 0x30, 0xfe, 0xbb, 0xb0, 0x0b, 0xf6, 0x52, 0x8e, 0x3e, 0xe4, 0x2b, 0x39, + 0xff, 0xcd, 0x98, 0x03, 0xe7, 0x58, 0xf9, 0x05, 0xdf, 0xff, 0x01, 0x8d, + 0xe0, 0xfe, 0xb8, 0xc4, 0x28, 0x00, 0x00 +}; + //============================================================================== struct InAppPurchases::Pimpl { @@ -328,7 +729,11 @@ private: CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") - DECLARE_JNI_CLASS (JuceBillingClient, "com/rmsl/juce/JuceBillingClient") + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceBillingClient, + "com/rmsl/juce/JuceBillingClient", + 16, + juceBillingClientCompiled, + numElementsInArray (juceBillingClientCompiled)) #undef JNI_CLASS_MEMBERS static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList) @@ -545,10 +950,10 @@ private: return; } - getEnv()->CallObjectMethod (billingClient, - JuceBillingClient.consumePurchase, - LocalRef { javaString (productIdentifier) }.get(), - LocalRef { javaString (purchaseToken) }.get()); + getEnv()->CallVoidMethod (billingClient, + JuceBillingClient.consumePurchase, + LocalRef { javaString (productIdentifier) }.get(), + LocalRef { javaString (purchaseToken) }.get()); } //============================================================================== diff --git a/modules/juce_video/juce_video.h b/modules/juce_video/juce_video.h index 24651517..d08cc542 100644 --- a/modules/juce_video/juce_video.h +++ b/modules/juce_video/juce_video.h @@ -35,7 +35,7 @@ ID: juce_video vendor: juce - version: 7.0.1 + version: 7.0.2 name: JUCE video playback and capture classes description: Classes for playing video and capturing camera input. website: http://www.juce.com/juce diff --git a/modules/juce_video/native/juce_ios_CameraDevice.h b/modules/juce_video/native/juce_ios_CameraDevice.h index cc6782c3..97a48c5a 100644 --- a/modules/juce_video/native/juce_ios_CameraDevice.h +++ b/modules/juce_video/native/juce_ios_CameraDevice.h @@ -23,10 +23,7 @@ ============================================================================== */ -#if (defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0) - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") - #define JUCE_USE_NEW_CAMERA_API 1 -#endif +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") struct CameraDevice::Pimpl { @@ -141,7 +138,6 @@ struct CameraDevice::Pimpl private: static NSArray* getDevices() { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { std::unique_ptr, NSObjectDeleter> deviceTypes ([[NSMutableArray alloc] initWithCapacity: 2]); @@ -161,7 +157,6 @@ private: return [discoverySession devices]; } - #endif return [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]; } @@ -207,22 +202,18 @@ private: JUCE_CAMERA_LOG ("Supports custom exposure: " + String ((int)[device isExposureModeSupported: AVCaptureExposureModeCustom])); JUCE_CAMERA_LOG ("Supports point of interest exposure: " + String ((int)device.exposurePointOfInterestSupported)); - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { JUCE_CAMERA_LOG ("Device type: " + nsStringToJuce (device.deviceType)); JUCE_CAMERA_LOG ("Locking focus with custom lens position supported: " + String ((int)device.lockingFocusWithCustomLensPositionSupported)); } - #endif - #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 if (@available (iOS 11.0, *)) { JUCE_CAMERA_LOG ("Min available video zoom factor: " + String (device.minAvailableVideoZoomFactor)); JUCE_CAMERA_LOG ("Max available video zoom factor: " + String (device.maxAvailableVideoZoomFactor)); JUCE_CAMERA_LOG ("Dual camera switch over video zoom factor: " + String (device.dualCameraSwitchOverVideoZoomFactor)); } - #endif JUCE_CAMERA_LOG ("Capture formats start-------------------"); for (AVCaptureDeviceFormat* format in device.formats) @@ -238,7 +229,6 @@ private: { JUCE_CAMERA_LOG ("Media type: " + nsStringToJuce (format.mediaType)); - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { String colourSpaces; @@ -255,7 +245,6 @@ private: JUCE_CAMERA_LOG ("Supported colour spaces: " + colourSpaces); } - #endif JUCE_CAMERA_LOG ("Video field of view: " + String (format.videoFieldOfView)); JUCE_CAMERA_LOG ("Video max zoom factor: " + String (format.videoMaxZoomFactor)); @@ -289,13 +278,11 @@ private: JUCE_CAMERA_LOG ("Cinematic video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeCinematic])); JUCE_CAMERA_LOG ("Auto video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeAuto])); - #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 if (@available (iOS 11.0, *)) { JUCE_CAMERA_LOG ("Min zoom factor for depth data delivery: " + String (format.videoMinZoomFactorForDepthDataDelivery)); JUCE_CAMERA_LOG ("Max zoom factor for depth data delivery: " + String (format.videoMaxZoomFactorForDepthDataDelivery)); } - #endif } static String getHighResStillImgDimensionsString (CMVideoDimensions d) @@ -592,14 +579,12 @@ private: captureOutput (createCaptureOutput()), photoOutputDelegate (nullptr) { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { static PhotoOutputDelegateClass cls; photoOutputDelegate.reset ([cls.createInstance() init]); PhotoOutputDelegateClass::setOwner (photoOutputDelegate.get(), this); } - #endif captureSession.addOutputIfPossible (captureOutput); } @@ -619,7 +604,6 @@ private: if (auto* connection = findVideoConnection (captureOutput)) { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]]) @@ -634,7 +618,6 @@ private: return; } } - #endif auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput; auto outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo]; @@ -671,17 +654,14 @@ private: private: static AVCaptureOutput* createCaptureOutput() { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) return [AVCapturePhotoOutput new]; - #endif return [AVCaptureStillImageOutput new]; } static void printImageOutputDebugInfo (AVCaptureOutput* captureOutput) { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) { if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]]) @@ -704,7 +684,6 @@ private: JUCE_CAMERA_LOG ("Live photo capture supported: " + String ((int) photoOutput.livePhotoCaptureSupported)); - #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 if (@available (iOS 11.0, *)) { typesString.clear(); @@ -732,12 +711,10 @@ private: JUCE_CAMERA_LOG ("Camera calibration data delivery supported: " + String ((int) photoOutput.cameraCalibrationDataDeliverySupported)); JUCE_CAMERA_LOG ("Depth data delivery supported: " + String ((int) photoOutput.depthDataDeliverySupported)); } - #endif return; } } - #endif auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput; @@ -765,7 +742,6 @@ private: } //============================================================================== - #if JUCE_USE_NEW_CAMERA_API class API_AVAILABLE (ios (10.0)) PhotoOutputDelegateClass : public ObjCClass { public: @@ -776,13 +752,11 @@ private: addMethod (@selector (captureOutput:didCapturePhotoForResolvedSettings:), didCaptureForSettings); addMethod (@selector (captureOutput:didFinishCaptureForResolvedSettings:error:), didFinishCaptureForSettings); - #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0 if (@available (iOS 11.0, *)) { addMethod (@selector (captureOutput:didFinishProcessingPhoto:error:), didFinishProcessingPhoto); } else - #endif { addMethod (@selector (captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:), didFinishProcessingPhotoSampleBuffer); } @@ -972,7 +946,6 @@ private: } } }; - #endif //============================================================================== void callListeners (const Image& image) @@ -1023,10 +996,8 @@ private: void startRecording (const File& file, AVCaptureVideoOrientation orientationToUse) { - #if JUCE_USE_NEW_CAMERA_API if (@available (iOS 10.0, *)) printVideoOutputDebugInfo (movieFileOutput); - #endif auto url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName()) isDirectory: NO]; @@ -1332,6 +1303,4 @@ String CameraDevice::getFileExtension() return ".mov"; } -#if JUCE_USE_NEW_CAMERA_API - JUCE_END_IGNORE_WARNINGS_GCC_LIKE -#endif +JUCE_END_IGNORE_WARNINGS_GCC_LIKE diff --git a/modules/juce_video/native/juce_mac_CameraDevice.h b/modules/juce_video/native/juce_mac_CameraDevice.h index dbbcca66..28748f8d 100644 --- a/modules/juce_video/native/juce_mac_CameraDevice.h +++ b/modules/juce_video/native/juce_mac_CameraDevice.h @@ -341,10 +341,8 @@ private: const auto codecType = [] { - #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 if (@available (macOS 10.13, *)) return AVVideoCodecTypeJPEG; - #endif return AVVideoCodecJPEG; }();