JUCE breaking changes
=====================
+Version 7.0.2
+=============
+
+Change
+------
+The Matrix3D (Vector3D<Type> vector) constructor has been replaced with an
+explicit static Matrix3D fromTranslation (Vector3D<Type> vector) function, and a
+bug in the behaviour of the multipication operator that reversed the order of
+operations has been addressed.
+
+Possible Issues
+---------------
+Code using the old constructor will not compile. Code that relied upon the order
+of multiplication operations will return different results.
+
+Workaround
+----------
+Code that was using the old constructor must use the new static function. Code
+that relied on the order of multiplication operations will need to have the
+order of the arguments reversed. With the old code A * B was returning BA rather
+than AB.
+
+Rationale
+---------
+Previously a matrix multipled by a vector would return a matrix, rather than a
+vector, as the multiplied-by vector would be automatically converted into a
+matrix during the operation. Removing the converting constructor makes
+everything much more explicit and there is no confusion about dimensionality.
+The current multiplication routine also included a bug where A * B resulted in
+BA rather than AB, which needed to be addressed.
+
+
Version 7.0.0
=============
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)
This file just lists the more notable headline features. For more detailed info\r
about changes and bugfixes please see the git log and BREAKING-CHANGES.txt.\r
\r
+Version 7.0.2\r
+ - Fixed accessibility table navigation\r
+ - Fixed Android file access on older APIs\r
+ - Improved Linux VST3 threading\r
+ - Improved ARA integration\r
+\r
Version 7.0.1\r
- Fixed some Xcode and MSVC compiler warnings\r
- Improved VST3 bus configuration and channel handling\r
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))
`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
`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
\r
#include "../Assets/DemoUtilities.h"\r
\r
+inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
+{\r
+ #if JUCE_ANDROID\r
+ if (auto doc = AndroidDocument::fromDocument (url))\r
+ return std::make_unique<AndroidDocumentInputSource> (doc);\r
+ #endif\r
+\r
+ #if ! JUCE_IOS\r
+ if (url.isLocalFile())\r
+ return std::make_unique<FileInputSource> (url.getLocalFile());\r
+ #endif\r
+\r
+ return std::make_unique<URLInputSource> (url);\r
+}\r
+\r
//==============================================================================\r
class DemoThumbnailComp : public Component,\r
public ChangeListener,\r
\r
void setURL (const URL& url)\r
{\r
- InputSource* inputSource = nullptr;\r
-\r
- #if ! JUCE_IOS\r
- if (url.isLocalFile())\r
- {\r
- inputSource = new FileInputSource (url.getLocalFile());\r
- }\r
- else\r
- #endif\r
- {\r
- if (inputSource == nullptr)\r
- inputSource = new URLInputSource (url);\r
- }\r
-\r
- if (inputSource != nullptr)\r
+ if (auto inputSource = makeInputSource (url))\r
{\r
- thumbnail.setSource (inputSource);\r
+ thumbnail.setSource (inputSource.release());\r
\r
Range<double> newRange (0.0, thumbnail.getTotalLength());\r
scrollbar.setRangeLimits (newRange);\r
}\r
}\r
\r
-\r
private:\r
AudioTransportSource& transportSource;\r
Slider& zoomSlider;\r
zoomSlider.onValueChange = [this] { thumbnail->setZoomFactor (zoomSlider.getValue()); };\r
zoomSlider.setSkewFactor (2);\r
\r
- thumbnail.reset (new DemoThumbnailComp (formatManager, transportSource, zoomSlider));\r
+ thumbnail = std::make_unique<DemoThumbnailComp> (formatManager, transportSource, zoomSlider);\r
addAndMakeVisible (thumbnail.get());\r
thumbnail->addChangeListener (this);\r
\r
transportSource.setSource (nullptr);\r
currentAudioFileSource.reset();\r
\r
- AudioFormatReader* reader = nullptr;\r
+ const auto source = makeInputSource (audioURL);\r
\r
- #if ! JUCE_IOS\r
- if (audioURL.isLocalFile())\r
- {\r
- reader = formatManager.createReaderFor (audioURL.getLocalFile());\r
- }\r
- else\r
- #endif\r
- {\r
- if (reader == nullptr)\r
- reader = formatManager.createReaderFor (audioURL.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)));\r
- }\r
+ if (source == nullptr)\r
+ return false;\r
\r
- if (reader != nullptr)\r
- {\r
- currentAudioFileSource.reset (new AudioFormatReaderSource (reader, true));\r
+ auto stream = rawToUniquePtr (source->createInputStream());\r
\r
- // ..and plug it into our transport source\r
- transportSource.setSource (currentAudioFileSource.get(),\r
- 32768, // tells it to buffer this many samples ahead\r
- &thread, // this is the background thread to use for reading-ahead\r
- reader->sampleRate); // allows for sample rate correction\r
+ if (stream == nullptr)\r
+ return false;\r
\r
- return true;\r
- }\r
+ auto reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream)));\r
+\r
+ if (reader == nullptr)\r
+ return false;\r
\r
- return false;\r
+ currentAudioFileSource = std::make_unique<AudioFormatReaderSource> (reader.release(), true);\r
+\r
+ // ..and plug it into our transport source\r
+ transportSource.setSource (currentAudioFileSource.get(),\r
+ 32768, // tells it to buffer this many samples ahead\r
+ &thread, // this is the background thread to use for reading-ahead\r
+ currentAudioFileSource->getAudioFormatReader()->sampleRate); // allows for sample rate correction\r
+\r
+ return true;\r
}\r
\r
void startOrStop()\r
\r
if (FileChooser::isPlatformDialogAvailable())\r
{\r
- fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
+ fileChooser = std::make_unique<FileChooser> ("Select an audio file...", File(), "*.wav;*.mp3;*.aif");\r
\r
fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
[this] (const FileChooser& fc) mutable\r
\r
private:\r
//==============================================================================\r
- struct MidiDeviceListBox : public ListBox,\r
- private ListBoxModel\r
+ struct MidiDeviceListBox : private ListBoxModel,\r
+ public ListBox\r
{\r
MidiDeviceListBox (const String& name,\r
MidiDemo& contentComponent,\r
bool isInputDeviceList)\r
- : ListBox (name, this),\r
+ : ListBox (name),\r
parent (contentComponent),\r
isInput (isInputDeviceList)\r
{\r
+ setModel (this);\r
setOutlineThickness (1);\r
setMultipleSelectionEnabled (true);\r
setClickingTogglesRowSelection (true);\r
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
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"
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.1"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.2"
package="com.rmsl.jucedemorunner">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
android:xlargeScreens="true"/>
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
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
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>CFBundleVersion</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
"filename": "Icon-Spotlight-40@3x.png",\r
"scale": "3x"\r
},\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "iphone",\r
"size": "60x60",\r
"filename": "Icon-Spotlight-40@2x-1.png",\r
"scale": "2x"\r
},\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50@2x.png",\r
- "scale": "2x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "ipad",\r
"size": "76x76",\r
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>CFBundleVersion</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1"\r
- bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.1" companyName="Raw Material Software Limited"\r
+ bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.2" companyName="Raw Material Software Limited"\r
companyCopyright="Copyright (c) 2020 - Raw Material Software Limited"\r
companyWebsite="https://www.juce.com/" companyEmail="info@juce.com"\r
id="yj7xMM" reportAppUsage="0" useAppConfig="0" addUsingNamespaceToJuceHeader="1"\r
{\r
const char* const projectName = "DemoRunner";\r
const char* const companyName = "Raw Material Software Limited";\r
- const char* const versionString = "7.0.1";\r
- const int versionNumber = 0x70001;\r
+ const char* const versionString = "7.0.2";\r
+ const int versionNumber = 0x70002;\r
}\r
#endif\r
\r
void closeButtonPressed() override { JUCEApplication::getInstance()->systemRequestedQuit(); }\r
\r
+ #if JUCE_IOS || JUCE_ANDROID\r
+ void parentSizeChanged() override\r
+ {\r
+ getMainComponent().resized();\r
+ }\r
+ #endif\r
+\r
//==============================================================================\r
MainComponent& getMainComponent() { return *dynamic_cast<MainComponent*> (getContentComponent()); }\r
\r
auto bounds = getLocalBounds();\r
\r
if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (getScreenBounds()))\r
- return display->safeAreaInsets.subtractedFrom (bounds);\r
+ return display->safeAreaInsets.subtractedFrom (display->keyboardInsets.subtractedFrom (bounds));\r
\r
return bounds;\r
}();\r
}\r
}\r
\r
+ void activeDocumentChanged() override\r
+ {\r
+ if (auto* activeDoc = getActiveDocument())\r
+ Logger::outputDebugString ("activeDocumentChanged() to " + activeDoc->getName());\r
+ }\r
+\r
private:\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DemoMultiDocumentPanel)\r
};\r
showInTabsButton.onClick = [this] { updateLayoutMode(); };\r
addAndMakeVisible (showInTabsButton);\r
\r
- addNoteButton.onClick = [this] { addNote ("Note " + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!"); };\r
+ oneDocShouldBeFullscreenButton.onClick = [this]\r
+ {\r
+ multiDocumentPanel.useFullscreenWhenOneDocument (oneDocShouldBeFullscreenButton.getToggleState());\r
+ };\r
+ addAndMakeVisible (oneDocShouldBeFullscreenButton);\r
+ oneDocShouldBeFullscreenButton.setToggleState (false, juce::sendNotification);\r
+\r
+ addNoteButton.onClick = [this]\r
+ {\r
+ addNote ("Note " + String (noteCounter), "Hello World! " + String (noteCounter));\r
+ ++noteCounter;\r
+ };\r
addAndMakeVisible (addNoteButton);\r
\r
+ closeActiveDocumentButton.onClick = [this]\r
+ {\r
+ multiDocumentPanel.closeDocumentAsync (multiDocumentPanel.getActiveDocument(), false, [] (auto) {});\r
+ };\r
+ addAndMakeVisible (closeActiveDocumentButton);\r
+\r
closeApplicationButton.onClick = [this]\r
{\r
multiDocumentPanel.closeAllDocumentsAsync (true, [] (bool allSaved)\r
addNote ("Notes Demo", "You can drag-and-drop text files onto this page to open them as notes..");\r
addExistingNotes();\r
\r
- setSize (500, 500);\r
+ setSize (650, 500);\r
}\r
\r
void paint (Graphics& g) override\r
{\r
auto area = getLocalBounds();\r
\r
- auto buttonArea = area.removeFromTop (28).reduced (2);\r
- closeApplicationButton.setBounds (buttonArea.removeFromRight (150));\r
- addNoteButton .setBounds (buttonArea.removeFromRight (150));\r
- showInTabsButton .setBounds (buttonArea);\r
+ auto topButtonRow = area.removeFromTop (28).reduced (2);\r
+\r
+ showInTabsButton .setBounds (topButtonRow.removeFromLeft (150));\r
+\r
+ closeApplicationButton .setBounds (topButtonRow.removeFromRight (150));\r
+ addNoteButton .setBounds (topButtonRow.removeFromRight (150));\r
+ closeActiveDocumentButton .setBounds (topButtonRow.removeFromRight (150));\r
+\r
+ oneDocShouldBeFullscreenButton.setBounds (area.removeFromTop (28).reduced (2).removeFromLeft (240));\r
\r
multiDocumentPanel.setBounds (area);\r
}\r
createNotesForFiles (files);\r
}\r
\r
- ToggleButton showInTabsButton { "Show with tabs" };\r
- TextButton addNoteButton { "Create a new note" },\r
- closeApplicationButton { "Close app" };\r
+ ToggleButton showInTabsButton { "Show with tabs" };\r
+ ToggleButton oneDocShouldBeFullscreenButton { "Fill screen when only one note is open" };\r
+ TextButton addNoteButton { "Create a new note" },\r
+ closeApplicationButton { "Close app" },\r
+ closeActiveDocumentButton { "Close active document" };\r
\r
DemoMultiDocumentPanel multiDocumentPanel;\r
+ int noteCounter = 1;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MDIDemo)\r
};\r
\r
Matrix3D<float> getViewMatrix() const\r
{\r
- Matrix3D<float> viewMatrix ({ 0.0f, 0.0f, -10.0f });\r
- Matrix3D<float> rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f });\r
+ auto viewMatrix = Matrix3D<float>::fromTranslation ({ 0.0f, 0.0f, -10.0f });\r
+ auto rotationMatrix = viewMatrix.rotation ({ -0.3f, 5.0f * std::sin ((float) getFrameCounter() * 0.01f), 0.0f });\r
\r
- return rotationMatrix * viewMatrix;\r
+ return viewMatrix * rotationMatrix;\r
}\r
\r
void render() override\r
{\r
const ScopedLock lock (mutex);\r
\r
- auto viewMatrix = draggableOrientation.getRotationMatrix() * Vector3D<float> (0.0f, 1.0f, -10.0f);\r
+ auto viewMatrix = Matrix3D<float>::fromTranslation ({ 0.0f, 1.0f, -10.0f }) * draggableOrientation.getRotationMatrix();\r
auto rotationMatrix = Matrix3D<float>::rotation ({ rotation, rotation, -0.3f });\r
\r
- return rotationMatrix * viewMatrix;\r
+ return viewMatrix * rotationMatrix;\r
}\r
\r
void setTexture (OpenGLUtils::DemoTexture* t)\r
return success;\r
}\r
\r
+ using ARAPlaybackRenderer::processBlock;\r
+\r
private:\r
//==============================================================================\r
// We're subclassing here only to provide a proper default c'tor for our shared resource\r
});\r
}\r
\r
+ using ARAEditorRenderer::processBlock;\r
+\r
private:\r
void configure()\r
{\r
}\r
};\r
\r
+struct PlayHeadState\r
+{\r
+ void update (AudioPlayHead* aph)\r
+ {\r
+ const auto info = aph->getPosition();\r
+\r
+ if (info.hasValue() && info->getIsPlaying())\r
+ {\r
+ isPlaying.store (true);\r
+ timeInSeconds.store (info->getTimeInSeconds().orFallback (0));\r
+ }\r
+ else\r
+ {\r
+ isPlaying.store (false);\r
+ }\r
+ }\r
+\r
+ std::atomic<bool> isPlaying { false };\r
+ std::atomic<double> timeInSeconds { 0.0 };\r
+};\r
+\r
//==============================================================================\r
class ARADemoPluginAudioProcessorImpl : public AudioProcessor,\r
public AudioProcessorARAExtension\r
//==============================================================================\r
void prepareToPlay (double sampleRate, int samplesPerBlock) override\r
{\r
- prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision());\r
+ playHeadState.isPlaying.store (false);\r
+ prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision());\r
}\r
\r
void releaseResources() override\r
{\r
+ playHeadState.isPlaying.store (false);\r
releaseResourcesForARA();\r
}\r
\r
\r
ScopedNoDenormals noDenormals;\r
\r
- if (! processBlockForARA (buffer, isRealtime(), getPlayHead()))\r
+ auto* audioPlayHead = getPlayHead();\r
+ playHeadState.update (audioPlayHead);\r
+\r
+ if (! processBlockForARA (buffer, isRealtime(), audioPlayHead))\r
processBlockBypassed (buffer, midiMessages);\r
}\r
\r
+ using AudioProcessor::processBlock;\r
+\r
//==============================================================================\r
const String getName() const override { return "ARAPluginDemo"; }\r
bool acceptsMidi() const override { return true; }\r
void getStateInformation (MemoryBlock&) override {}\r
void setStateInformation (const void*, int) override {}\r
\r
+ PlayHeadState playHeadState;\r
+\r
private:\r
//==============================================================================\r
static BusesProperties getBusesProperties()\r
void paint (Graphics& g) override { g.fillAll (juce::Colours::yellow.darker (0.2f)); }\r
};\r
\r
- OverlayComponent(std::function<AudioPlayHead*()> getAudioPlayheadIn)\r
- : getAudioPlayhead (std::move (getAudioPlayheadIn))\r
+ OverlayComponent (PlayHeadState& playHeadStateIn)\r
+ : playHeadState (&playHeadStateIn)\r
{\r
addChildComponent (playheadMarker);\r
setInterceptsMouseClicks (false, false);\r
private:\r
void doResize()\r
{\r
- auto* aph = getAudioPlayhead();\r
- const auto info = aph->getPosition();\r
-\r
- if (info.hasValue() && info->getIsPlaying())\r
+ if (playHeadState->isPlaying.load())\r
{\r
- const auto markerX = info->getTimeInSeconds().orFallback (0) * pixelPerSecond;\r
+ const auto markerX = playHeadState->timeInSeconds.load() * pixelPerSecond;\r
const auto playheadLine = getLocalBounds().withTrimmedLeft ((int) (markerX - markerWidth / 2.0) - horizontalOffset)\r
.removeFromLeft ((int) markerWidth);\r
playheadMarker.setVisible (true);\r
\r
static constexpr double markerWidth = 2.0;\r
\r
- std::function<AudioPlayHead*()> getAudioPlayhead;\r
+ PlayHeadState* playHeadState;\r
double pixelPerSecond = 1.0;\r
int horizontalOffset = 0;\r
PlayheadMarkerComponent playheadMarker;\r
private ARAEditorView::Listener\r
{\r
public:\r
- explicit DocumentView (ARADocument& document, std::function<AudioPlayHead*()> getAudioPlayhead)\r
+ explicit DocumentView (ARADocument& document, PlayHeadState& playHeadState)\r
: araDocument (document),\r
- overlay (std::move (getAudioPlayhead))\r
+ overlay (playHeadState)\r
{\r
addAndMakeVisible (tracksBackground);\r
\r
if (auto* editorView = getARAEditorView())\r
{\r
auto* document = ARADocumentControllerSpecialisation::getSpecialisedDocumentController(editorView->getDocumentController())->getDocument();\r
- documentView = std::make_unique<DocumentView> (*document,\r
- [this]() { return getAudioProcessor()->getPlayHead(); });\r
+ documentView = std::make_unique<DocumentView> (*document, p.playHeadState );\r
}\r
\r
addAndMakeVisible (documentView.get());\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Device token")\r
- .withMessage (token),\r
+ .withMessage (token)\r
+ .withButton ("OK"),\r
nullptr);\r
};\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Incorrect notifications setup")\r
- .withMessage ("Please make sure that " + requiredFields + " are set."),\r
+ .withMessage ("Please make sure that " + requiredFields + " are set.")\r
+ .withButton ("OK"),\r
nullptr);\r
\r
return;\r
.withTitle ("Received notification")\r
.withMessage ("ID: " + n.identifier\r
+ ", title: " + n.title\r
- + ", body: " + n.body),\r
+ + ", body: " + n.body)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
+ ", title: " + n.title\r
+ ", body: " + n.body\r
+ ", action: " + actionIdentifier\r
- + ", optionalResponse: " + optionalResponse),\r
+ + ", optionalResponse: " + optionalResponse)\r
+ .withButton ("OK"),\r
nullptr);\r
\r
PushNotifications::getInstance()->removeDeliveredNotification (n.identifier);\r
.withTitle ("Notification dismissed by a user")\r
.withMessage ("ID: " + n.identifier\r
+ ", title: " + n.title\r
- + ", body: " + n.body),\r
+ + ", body: " + n.body)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Received notification list")\r
- .withMessage (text),\r
+ .withMessage (text)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Pending notification list")\r
- .withMessage (text),\r
+ .withMessage (text)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Device token refreshed")\r
- .withMessage (token),\r
+ .withMessage (token)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Remote notifications deleted")\r
- .withMessage ("Some of the pending messages were removed!"),\r
+ .withMessage ("Some of the pending messages were removed!")\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
NativeMessageBox::showAsync (MessageBoxOptions()\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Upstream message sent")\r
- .withMessage ("Message id: " + messageId),\r
+ .withMessage ("Message id: " + messageId)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
.withIconType (MessageBoxIconType::InfoIcon)\r
.withTitle ("Upstream message sending error")\r
.withMessage ("Message id: " + messageId\r
- + "\nerror: " + error),\r
+ + "\nerror: " + error)\r
+ .withButton ("OK"),\r
nullptr);\r
}\r
\r
.withMessage ("In order to be able to test remote notifications "\r
"ensure that the app is signed and that you register "\r
"the bundle ID for remote notifications in "\r
- "Apple Developer Center."),\r
+ "Apple Developer Center.")\r
+ .withButton ("OK"),\r
nullptr);\r
#endif\r
}\r
androidCpp11="1" targetFolder="Builds/Android" extraCompilerFlags="-mfpu=neon -mfloat-abi=hard -ffast-math -funroll-loops --param max-unroll-times=8 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -DJUCE_DISABLE_ASSERTIONS=1"\r
gradleToolchainVersion="3.6" androidMinimumSDK="23">\r
<CONFIGURATIONS>\r
- <CONFIGURATION name="Debug" androidArchitectures="arm64-v8a" isDebug="1" targetName="AudioPerformanceTest"/>\r
- <CONFIGURATION name="Release" androidArchitectures="arm64-v8a" isDebug="0" optimisation="6"\r
+ <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPerformanceTest"/>\r
+ <CONFIGURATION name="Release" isDebug="0" optimisation="6"\r
targetName="AudioPerformanceTest"/>\r
</CONFIGURATIONS>\r
<MODULEPATHS>\r
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
productFlavors {
debug_ {
ndk {
- abiFilters "arm64-v8a"
+ abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
externalNativeBuild {
cmake {
dimension "default"
}
release_ {
- ndk {
- abiFilters "arm64-v8a"
- }
externalNativeBuild {
cmake {
arguments "-DJUCE_BUILD_CONFIGURATION=RELEASE", "-DCMAKE_CXX_FLAGS_RELEASE=-Ofast", "-DCMAKE_C_FLAGS_RELEASE=-Ofast"
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
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
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
PRODUCT_NAME = "AudioPerformanceTest";
USE_HEADERMAP = NO;
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
PRODUCT_NAME = "AudioPerformanceTest";
USE_HEADERMAP = NO;
"filename": "Icon-Spotlight-40@3x.png",\r
"scale": "3x"\r
},\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "iphone",\r
"size": "60x60",\r
"filename": "Icon-Spotlight-40@2x-1.png",\r
"scale": "2x"\r
},\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50@2x.png",\r
- "scale": "2x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "ipad",\r
"size": "76x76",\r
microphonePermissionNeeded="1" androidBluetoothNeeded="1" smallIcon="c97aUr"\r
bigIcon="c97aUr" androidExtraAssetsFolder="../../examples/Assets">\r
<CONFIGURATIONS>\r
- <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
- optimisation="1" linkTimeOptimisation="0" targetName="Plugin Host"\r
- recommendedWarnings="LLVM"/>\r
+ <CONFIGURATION name="Debug" isDebug="1" optimisation="1" linkTimeOptimisation="0"\r
+ targetName="Plugin Host" recommendedWarnings="LLVM"/>\r
<CONFIGURATION name="Release" isDebug="0" optimisation="3" linkTimeOptimisation="1"\r
targetName="Plugin Host" recommendedWarnings="LLVM"/>\r
</CONFIGURATIONS>\r
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")
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
productFlavors {
debug_ {
ndk {
- abiFilters "armeabi-v7a", "x86"
+ abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
externalNativeBuild {
cmake {
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
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
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
PRODUCT_NAME = "Plugin Host";
USE_HEADERMAP = NO;
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
PRODUCT_NAME = "Plugin Host";
USE_HEADERMAP = NO;
"filename": "Icon-Spotlight-40@3x.png",\r
"scale": "3x"\r
},\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "iphone",\r
"size": "60x60",\r
"filename": "Icon-Spotlight-40@2x-1.png",\r
"scale": "2x"\r
},\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50@2x.png",\r
- "scale": "2x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "ipad",\r
"size": "76x76",\r
\r
#include "ARAPlugin.h"\r
\r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
\r
const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlRootTag { "ARATestHostContext" };\r
const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlAudioFileAttrib { "AudioFile" };\r
\r
#include <juce_core/system/juce_TargetPlatform.h>\r
\r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
\r
#include <JuceHeader.h>\r
\r
properties.transformationFlags = ARA::kARAPlaybackTransformationNoChanges;\r
properties.startInModificationTime = 0.0;\r
const auto& formatReader = audioSource.getFormatReader();\r
- properties.durationInModificationTime = formatReader.lengthInSamples / formatReader.sampleRate;\r
+ properties.durationInModificationTime = (double) formatReader.lengthInSamples / formatReader.sampleRate;\r
properties.startInPlaybackTime = 0.0;\r
properties.durationInPlaybackTime = properties.durationInModificationTime;\r
properties.musicalContextRef = sequence.getMusicalContext().getPluginRef();\r
}\r
else\r
{\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
if (useARA == PluginDescriptionAndPreference::UseARA::yes\r
&& instance->getPluginDescription().hasARAExtension)\r
{\r
graph.getBlockSize(),\r
errorMessage);\r
\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
if (instance\r
&& description.useARA == PluginDescriptionAndPreference::UseARA::yes\r
&& description.pluginDescription.hasARAExtension)\r
menu->addItem ("Show all parameters", [this] { showWindow (PluginWindow::Type::generic); });\r
menu->addItem ("Show debug log", [this] { showWindow (PluginWindow::Type::debug); });\r
\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
if (auto* instance = dynamic_cast<AudioPluginInstance*> (getProcessor()))\r
if (instance->getPluginDescription().hasARAExtension && isNodeUsingARA())\r
menu->addItem ("Show ARA host controls", [this] { showWindow (PluginWindow::Type::araHost); });\r
\r
addPlugin (PluginDescriptionAndPreference { plugin, PluginDescriptionAndPreference::UseARA::no }, name);\r
\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
if (plugin.hasARAExtension)\r
{\r
name << " (ARA)";\r
\r
if (type == PluginWindow::Type::araHost)\r
{\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
if (auto* araPluginInstanceWrapper = dynamic_cast<ARAPluginInstanceWrapper*> (&processor))\r
if (auto* ui = araPluginInstanceWrapper->createARAHostEditor())\r
return ui;\r
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
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
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_STANDALONE_APPLICATION=1",
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_STANDALONE_APPLICATION=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
return()
endif()
- set(test_file_contents
+ set(test_atomic_with_is_lock_free_file_contents
+ [[
+ #include <atomic>
+
+ int main (int argc, char** argv)
+ {
+ std::atomic<long long> ll { static_cast<long long> (argc) };
+ ll ^= static_cast<long long> (ll.is_lock_free());
+ return static_cast<int> (ll);
+ }
+ ]])
+
+ set(test_simple_atomic_file_contents
[[
#include <atomic>
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
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)
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)
_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)
_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()
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")
\r
ID: juce_build_tools\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE Build Tools\r
description: Classes for generating intermediate files for JUCE projects.\r
website: http://www.juce.com/juce\r
{ "iphone", "29x29", "Icon-29@3x.png", "3x", 87 },\r
{ "iphone", "40x40", "Icon-Spotlight-40@2x.png", "2x", 80 },\r
{ "iphone", "40x40", "Icon-Spotlight-40@3x.png", "3x", 120 },\r
- { "iphone", "57x57", "Icon.png", "1x", 57 },\r
- { "iphone", "57x57", "Icon@2x.png", "2x", 114 },\r
{ "iphone", "60x60", "Icon-60@2x.png", "2x", 120 },\r
{ "iphone", "60x60", "Icon-@3x.png", "3x", 180 },\r
{ "ipad", "20x20", "Icon-Notifications-20.png", "1x", 20 },\r
{ "ipad", "29x29", "Icon-Small@2x-1.png", "2x", 58 },\r
{ "ipad", "40x40", "Icon-Spotlight-40.png", "1x", 40 },\r
{ "ipad", "40x40", "Icon-Spotlight-40@2x-1.png", "2x", 80 },\r
- { "ipad", "50x50", "Icon-Small-50.png", "1x", 50 },\r
- { "ipad", "50x50", "Icon-Small-50@2x.png", "2x", 100 },\r
- { "ipad", "72x72", "Icon-72.png", "1x", 72 },\r
- { "ipad", "72x72", "Icon-72@2x.png", "2x", 144 },\r
{ "ipad", "76x76", "Icon-76.png", "1x", 76 },\r
{ "ipad", "76x76", "Icon-76@2x.png", "2x", 152 },\r
{ "ipad", "83.5x83.5", "Icon-83.5@2x.png", "2x", 167 },\r
updateField ("PLUGIN_AU_MAIN_TYPE", result.auMainType);\r
updateField ("IS_AU_SANDBOX_SAFE", result.isAuSandboxSafe);\r
updateField ("IS_PLUGIN_SYNTH", result.isPluginSynth);\r
+ updateField ("IS_PLUGIN_ARA_EFFECT", result.isPluginARAEffect);\r
updateField ("SUPPRESS_AU_PLIST_RESOURCE_USAGE", result.suppressResourceUsage);\r
updateField ("BUNDLE_ID", result.bundleIdentifier);\r
updateField ("ICON_FILE", result.iconFile);\r
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
productFlavors {
debug_ {
ndk {
- abiFilters "armeabi-v7a", "x86"
+ abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
externalNativeBuild {
cmake {
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
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
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
PRODUCT_NAME = "JUCE Network Graphics Demo";
USE_HEADERMAP = NO;
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
- OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
+ OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
PRODUCT_NAME = "JUCE Network Graphics Demo";
USE_HEADERMAP = NO;
"filename": "Icon-Spotlight-40@3x.png",\r
"scale": "3x"\r
},\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "iphone",\r
- "size": "57x57",\r
- "filename": "Icon@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "iphone",\r
"size": "60x60",\r
"filename": "Icon-Spotlight-40@2x-1.png",\r
"scale": "2x"\r
},\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "50x50",\r
- "filename": "Icon-Small-50@2x.png",\r
- "scale": "2x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72.png",\r
- "scale": "1x"\r
- },\r
- {\r
- "idiom": "ipad",\r
- "size": "72x72",\r
- "filename": "Icon-72@2x.png",\r
- "scale": "2x"\r
- },\r
{\r
"idiom": "ipad",\r
"size": "76x76",\r
androidCpp11="1" targetFolder="Builds/Android" bigIcon="Ww6bQw"\r
gradleToolchainVersion="3.6">\r
<CONFIGURATIONS>\r
- <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
- optimisation="6" targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
+ <CONFIGURATION name="Debug" isDebug="1" optimisation="6"\r
+ targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
<CONFIGURATION name="Release" isDebug="0" targetName="JUCE Network Graphics Demo"/>\r
</CONFIGURATIONS>\r
<MODULEPATHS>\r
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
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
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>CFBundleVersion</key>\r
- <string>7.0.1</string>\r
+ <string>7.0.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_build_tools=1",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_MODULE_AVAILABLE_juce_cryptography=1",
"JUCE_WEB_BROWSER=0",
"JUCE_STANDALONE_APPLICATION=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_build_tools=1",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_MODULE_AVAILABLE_juce_cryptography=1",
"JUCE_WEB_BROWSER=0",
"JUCE_STANDALONE_APPLICATION=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=7.0.1",
- "JUCE_APP_VERSION_HEX=0x70001",
+ "JUCE_APP_VERSION=7.0.2",
+ "JUCE_APP_VERSION_HEX=0x70002",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.1;JUCE_APP_VERSION_HEX=0x70001;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.2;JUCE_APP_VERSION_HEX=0x70002;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 7,0,1,0\r
+FILEVERSION 7,0,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "7.0.1\0"\r
+ VALUE "FileVersion", "7.0.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "7.0.1\0"\r
+ VALUE "ProductVersion", "7.0.2\0"\r
END\r
END\r
\r
{\r
const char* const projectName = "Projucer";\r
const char* const companyName = "Raw Material Software Limited";\r
- const char* const versionString = "7.0.1";\r
- const int versionNumber = 0x70001;\r
+ const char* const versionString = "7.0.2";\r
+ const int versionNumber = 0x70002;\r
}\r
#endif\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
- version="7.0.1" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+ version="7.0.2" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
displaySplashScreen="0" reportAppUsage="0" companyName="Raw Material Software Limited"\r
companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
{\r
vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::linux), TargetOS::linux);\r
+\r
+ araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr },\r
+ getAppSettings().getStoredPath (Ids::araPath, TargetOS::linux), TargetOS::linux);\r
}\r
\r
//==============================================================================\r
\r
String getCustomResourceFoldersString() const { return customXcodeResourceFoldersValue.get().toString().replaceCharacters ("\r\n", "::"); }\r
String getCustomXcassetsFolderString() const { return customXcassetsFolderValue.get(); }\r
+\r
+ Optional<build_tools::RelativePath> getCustomXcassetsFolder() const\r
+ {\r
+ const auto customXcassetsPath = getCustomXcassetsFolderString();\r
+\r
+ if (customXcassetsPath.isEmpty())\r
+ return {};\r
+\r
+ return build_tools::RelativePath { customXcassetsPath, build_tools::RelativePath::projectFolder };\r
+ }\r
+\r
String getCustomLaunchStoryboardString() const { return customLaunchStoryboardValue.get(); }\r
- bool shouldAddStoryboardToProject() const { return getCustomLaunchStoryboardString().isNotEmpty() || getCustomXcassetsFolderString().isEmpty(); }\r
+\r
+ bool shouldAddStoryboardToProject() const { return getCustomLaunchStoryboardString().isNotEmpty()\r
+ || (! customXcassetsFolderContainsLaunchImage()); }\r
\r
bool isHardenedRuntimeEnabled() const { return hardenedRuntimeValue.get(); }\r
Array<var> getHardenedRuntimeOptions() const { return *hardenedRuntimeOptionsValue.get().getArray(); }\r
{\r
props.add (new TextPropertyComponent (customXcassetsFolderValue, "Custom Xcassets Folder", 128, false),\r
"If this field is not empty, your Xcode project will use the custom xcassets folder specified here "\r
- "for the app icons and launchimages, and will ignore the Icon files specified above. This will also prevent "\r
- "a launch storyboard from being used.");\r
+ "for the app icons, and will ignore the Icon files specified above. If the provided xcassets folder "\r
+ "contains a launchimage it will be used, unless a custom storyboard is specified.");\r
\r
props.add (new TextPropertyComponent (customLaunchStoryboardValue, "Custom Launch Storyboard", 256, false),\r
"If this field is not empty then the specified launch storyboard file will be added to the project as an Xcode "\r
folders.removeEmptyStrings();\r
\r
for (auto& crf : folders)\r
- addCustomResourceFolder (crf);\r
+ addCustomResourceFolder (build_tools::RelativePath { crf, build_tools::RelativePath::projectFolder });\r
}\r
\r
void addSubprojects() const\r
\r
void addXcassets() const\r
{\r
- auto customXcassetsPath = getCustomXcassetsFolderString();\r
-\r
- if (customXcassetsPath.isEmpty())\r
- addDefaultXcassetsFolders();\r
+ if (const auto customXcassetsPath = getCustomXcassetsFolder())\r
+ addCustomResourceFolder (*customXcassetsPath, "folder.assetcatalog");\r
else\r
- addCustomResourceFolder (customXcassetsPath, "folder.assetcatalog");\r
+ addDefaultXcassetsFolders();\r
}\r
\r
- void addCustomResourceFolder (String folderPathRelativeToProjectFolder, const String fileType = "folder") const\r
+ File makeFile (const build_tools::RelativePath& path) const\r
{\r
- auto folderPath = build_tools::RelativePath (folderPathRelativeToProjectFolder, build_tools::RelativePath::projectFolder)\r
- .rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder)\r
- .toUnixStyle();\r
+ switch (path.getRoot())\r
+ {\r
+ case build_tools::RelativePath::projectFolder:\r
+ return getProject().getProjectFolder().getChildFile (path.toUnixStyle());\r
+\r
+ case build_tools::RelativePath::buildTargetFolder:\r
+ return getTargetFolder().getChildFile (path.toUnixStyle());\r
+\r
+ case build_tools::RelativePath::unknown:\r
+ jassertfalse;\r
+ }\r
+\r
+ return {};\r
+ }\r
+\r
+ bool customXcassetsFolderContainsLaunchImage() const\r
+ {\r
+ if (const auto xcassetsFolder = getCustomXcassetsFolder())\r
+ return makeFile (*xcassetsFolder).getChildFile ("LaunchImage.launchimage").exists();\r
+\r
+ return false;\r
+ }\r
+\r
+ void addCustomResourceFolder (const build_tools::RelativePath& path, const String fileType = "folder") const\r
+ {\r
+ jassert (path.getRoot() == build_tools::RelativePath::projectFolder);\r
+\r
+ auto folderPath = path.rebased (projectFolder, getTargetFolder(), build_tools::RelativePath::buildTargetFolder)\r
+ .toUnixStyle();\r
\r
auto fileRefID = createFileRefID (folderPath);\r
\r
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
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
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x70001",
+ "JUCE_PROJUCER_VERSION=0x70002",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
else\r
runner.runAllTests (seed);\r
\r
- Logger::setCurrentLogger (nullptr);\r
+ std::vector<String> failures;\r
\r
for (int i = 0; i < runner.getNumResults(); ++i)\r
- if (runner.getResult(i)->failures > 0)\r
- return 1;\r
+ {\r
+ auto* result = runner.getResult (i);\r
+\r
+ if (result->failures > 0)\r
+ failures.push_back (result->unitTestName + " / " + result->subcategoryName + ": " + String (result->failures) + " test failure" + (result->failures > 1 ? "s" : ""));\r
+ }\r
+\r
+ if (! failures.empty())\r
+ {\r
+ logger.writeToLog (newLine + "Test failure summary:" + newLine);\r
+\r
+ for (const auto& failure : failures)\r
+ logger.writeToLog (failure);\r
+\r
+ Logger::setCurrentLogger (nullptr);\r
+ return 1;\r
+ }\r
+\r
+ logger.writeToLog (newLine + "All tests completed successfully");\r
+ Logger::setCurrentLogger (nullptr);\r
\r
return 0;\r
}\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
</ClCompile>\r
<ResourceCompile>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70001;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70002;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
</ResourceCompile>\r
<Link>\r
<OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAModelObjects.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARAPlugInInstanceRoles.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_Socket.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_URL.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_FileInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_InputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARA_utils.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADebug.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\ARA\juce_ARADocumentController.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities\ARA</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_WebInputStream.h">\r
<Filter>JUCE Modules\juce_core\network</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_AndroidDocumentInputSource.h">\r
+ <Filter>JUCE Modules\juce_core\streams</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\streams\juce_BufferedInputStream.h">\r
<Filter>JUCE Modules\juce_core\streams</Filter>\r
</ClInclude>\r
\r
ID: juce_analytics\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE analytics classes\r
description: Classes to collect analytics and send to destinations\r
website: http://www.juce.com/juce\r
\r
ID: juce_audio_basics\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE audio and MIDI data classes\r
description: Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
website: http://www.juce.com/juce\r
\r
ID: juce_audio_devices\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE audio and MIDI I/O device classes\r
description: Classes to play and record from audio and MIDI I/O devices\r
website: http://www.juce.com/juce\r
options |= (AVAudioSessionCategoryOptionDefaultToSpeaker\r
| AVAudioSessionCategoryOptionAllowBluetooth);\r
\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
if (@available (iOS 10.0, *))\r
options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;\r
- #endif\r
}\r
\r
JUCE_NSERROR_CHECK ([[AVAudioSession sharedInstance] setCategory: category\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
Image getIcon (int size)\r
{\r
- if (interAppAudioConnected)\r
+ if (@available (macCatalyst 14.0, *))\r
{\r
- UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size);\r
- if (hostUIImage != nullptr)\r
- return juce_createImageFromUIImage (hostUIImage);\r
+ if (interAppAudioConnected)\r
+ {\r
+ UIImage* hostUIImage = AudioOutputUnitGetHostIcon (audioUnit, size);\r
+ if (hostUIImage != nullptr)\r
+ return juce_createImageFromUIImage (hostUIImage);\r
+ }\r
}\r
- return Image();\r
+\r
+ return {};\r
}\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
#endif\r
&dataSize);\r
if (err == noErr)\r
{\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
if (@available (iOS 10.0, *))\r
{\r
[[UIApplication sharedApplication] openURL: (NSURL*) hostUrl\r
\r
return;\r
}\r
- #endif\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
[[UIApplication sharedApplication] openURL: (NSURL*) hostUrl];\r
if (! remainingSamples.isEmpty())\r
for (int i = numDestChannels; --i >= 0;)\r
if (destSamples[i] != nullptr)\r
- zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int));\r
+ zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile),\r
+ (size_t) remainingSamples.getLength() * sizeof (int));\r
\r
return true;\r
}\r
if (! remainingSamples.isEmpty())\r
for (int i = numDestChannels; --i >= 0;)\r
if (destSamples[i] != nullptr)\r
- zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) remainingSamples.getLength() * sizeof (int));\r
+ zeromem (destSamples[i] + startOffsetInDestBuffer + (remainingSamples.getStart() - startSampleInFile),\r
+ (size_t) remainingSamples.getLength() * sizeof (int));\r
\r
return true;\r
}\r
\r
ID: juce_audio_formats\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE audio file format codecs\r
description: Classes for reading and writing various audio file formats.\r
website: http://www.juce.com/juce\r
JUCE_END_IGNORE_WARNINGS_MSVC\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
-namespace juce\r
-{\r
-\r
-#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept\r
-{\r
- #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
- DBG (diagnosis);\r
- #endif\r
-\r
- logAssertion (file, line);\r
-\r
- #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
- if (juce_isRunningUnderDebugger())\r
- JUCE_BREAK_IN_DEBUGGER;\r
- JUCE_ANALYZER_NORETURN\r
- #endif\r
-}\r
-#endif\r
-\r
-ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name);\r
-\r
-} // namespace juce\r
-\r
#endif\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2022 - Raw Material Software Limited\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
- Agreement and JUCE Privacy Policy.\r
-\r
- End User License Agreement: www.juce.com/juce-7-licence\r
- Privacy Policy: www.juce.com/juce-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-#if JucePlugin_Enable_ARA\r
-// Configure ARA debug support prior to including ARA SDK headers\r
-namespace juce\r
-{\r
-\r
-#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-\r
-#define ARA_ENABLE_INTERNAL_ASSERTS 1\r
-\r
-extern JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept;\r
-\r
-#if !defined(ARA_HANDLE_ASSERT)\r
-#define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis)\r
-#endif\r
-\r
-#if JUCE_LOG_ASSERTIONS\r
-#define ARA_ENABLE_DEBUG_OUTPUT 1\r
-#endif\r
-\r
-#else\r
-\r
-#define ARA_ENABLE_INTERNAL_ASSERTS 0\r
-\r
-#endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
-\r
-} // namespace juce\r
-\r
-#endif\r
==============================================================================\r
*/\r
\r
-#if JucePlugin_Build_LV2\r
+#if JucePlugin_Build_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
\r
#ifndef _SCL_SECURE_NO_WARNINGS\r
#define _SCL_SECURE_NO_WARNINGS\r
//==============================================================================\r
#if JUCE_LINUX || JUCE_BSD\r
\r
+enum class HostMessageThreadAttached { no, yes };\r
+\r
+class HostMessageThreadState\r
+{\r
+public:\r
+ template <typename Callback>\r
+ void setStateWithAction (HostMessageThreadAttached stateIn, Callback&& action)\r
+ {\r
+ const std::lock_guard<std::mutex> lock { m };\r
+ state = stateIn;\r
+ action();\r
+ }\r
+\r
+ void assertHostMessageThread()\r
+ {\r
+ const std::lock_guard<std::mutex> lock { m };\r
+\r
+ if (state == HostMessageThreadAttached::no)\r
+ return;\r
+\r
+ JUCE_ASSERT_MESSAGE_THREAD\r
+ }\r
+\r
+private:\r
+ HostMessageThreadAttached state = HostMessageThreadAttached::no;\r
+ std::mutex m;\r
+};\r
+\r
class EventHandler final : public Steinberg::Linux::IEventHandler,\r
private LinuxEventLoopInternal::Listener\r
{\r
LinuxEventLoopInternal::deregisterLinuxEventLoopListener (*this);\r
\r
if (! messageThread->isRunning())\r
- messageThread->start();\r
+ hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::no,\r
+ [this]() { messageThread->start(); });\r
}\r
\r
JUCE_DECLARE_VST3_COM_REF_METHODS\r
refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.erase (runLoop); });\r
}\r
\r
+ /* Asserts if it can be established that the calling thread is different from the host's message\r
+ thread.\r
+\r
+ On Linux this can only be determined if the host has already registered its run loop. Until\r
+ then JUCE messages are serviced by a background thread internal to the plugin.\r
+ */\r
+ static void assertHostMessageThread()\r
+ {\r
+ hostMessageThreadState.assertHostMessageThread();\r
+ }\r
+\r
private:\r
//==============================================================================\r
/* Connects all known FDs to a single host event loop instance. */\r
if (messageThread->isRunning())\r
messageThread->stop();\r
\r
- MessageManager::getInstance()->setCurrentThreadAsMessageThread();\r
+ hostMessageThreadState.setStateWithAction (HostMessageThreadAttached::yes,\r
+ [] { MessageManager::getInstance()->setCurrentThreadAsMessageThread(); });\r
}\r
}\r
\r
std::multiset<Steinberg::Linux::IRunLoop*> hostRunLoops;\r
AttachedEventLoop attachedEventLoop;\r
\r
+ static HostMessageThreadState hostMessageThreadState;\r
+\r
//==============================================================================\r
JUCE_DECLARE_NON_MOVEABLE (EventHandler)\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventHandler)\r
};\r
\r
+HostMessageThreadState EventHandler::hostMessageThreadState;\r
+\r
#endif\r
\r
+static void assertHostMessageThread()\r
+{\r
+ #if JUCE_LINUX || JUCE_BSD\r
+ EventHandler::assertHostMessageThread();\r
+ #else\r
+ JUCE_ASSERT_MESSAGE_THREAD\r
+ #endif\r
+}\r
+\r
//==============================================================================\r
class InParameterChangedCallbackSetter\r
{\r
//==============================================================================\r
tresult PLUGIN_API setComponentState (IBStream* stream) override\r
{\r
- if (! MessageManager::existsAndIsCurrentThread())\r
- #if JUCE_LINUX || JUCE_BSD\r
- {\r
- tresult result = kResultOk;\r
- WaitableEvent finishedEvent;\r
-\r
- MessageManager::callAsync ([&]\r
- {\r
- result = setComponentState (stream);\r
- finishedEvent.signal();\r
- });\r
-\r
- finishedEvent.wait();\r
- return result;\r
- }\r
- #else\r
// As an IEditController member, the host should only call this from the message thread.\r
- jassertfalse;\r
- #endif\r
+ assertHostMessageThread();\r
\r
if (auto* pluginInstance = getPluginInstance())\r
{\r
owner->lastScaleFactorReceived = editorScaleFactor;\r
\r
if (component != nullptr)\r
+ {\r
+ #if JUCE_LINUX || JUCE_BSD\r
+ const MessageManagerLock mmLock;\r
+ #endif\r
component->setEditorScaleFactor (editorScaleFactor);\r
+ }\r
}\r
\r
return kResultTrue;\r
{\r
// The VST3 spec requires that this function is called from the UI thread.\r
// If this assertion fires, your host is misbehaving!\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ assertHostMessageThread();\r
\r
if (state == nullptr)\r
return kInvalidArgument;\r
\r
ID: juce_audio_plugin_client\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE audio plugin wrapper classes\r
description: Classes for building VST, VST3, AU, AUv3 and AAX plugins.\r
website: http://www.juce.com/juce\r
#endif\r
\r
#include "utility/juce_CreatePluginFilter.h"\r
-\r
-#if JucePlugin_Enable_ARA\r
- #include "ARA/juce_ARA_Wrapper.h"\r
-#endif\r
==============================================================================\r
*/\r
\r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS))\r
-\r
-#include <ARA_Library/Debug/ARADebug.h>\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX))\r
\r
namespace juce\r
{\r
&assertFunction);\r
}\r
\r
+/* If the provided ARAFactory is not yet in use it constructs a new shared_ptr that will call the\r
+ provided onDelete function inside the custom deleter of this new shared_ptr instance.\r
+\r
+ The onDelete function is responsible for releasing the resources that guarantee the validity of\r
+ the wrapped ARAFactory*.\r
+\r
+ If however the ARAFactory is already in use the function will just return a copy of the already\r
+ existing shared_ptr and call the onDelete function immediately. This is to ensure that the\r
+ ARAFactory is only uninitialised when no plugin instance can be using it.\r
+\r
+ On both platforms the onDelete function is used to release resources that ensure that the module\r
+ providing the ARAFactory* remains loaded.\r
+*/\r
static std::shared_ptr<const ARA::ARAFactory> getOrCreateARAFactory (const ARA::ARAFactory* ptr,\r
- std::function<void (const ARA::ARAFactory*)> onDelete)\r
+ std::function<void()> onDelete)\r
{\r
JUCE_ASSERT_MESSAGE_THREAD\r
\r
auto& cachePtr = cache[ptr];\r
\r
if (const auto obj = cachePtr.lock())\r
+ {\r
+ onDelete();\r
return obj;\r
+ }\r
\r
const auto interfaceConfig = createInterfaceConfig (ptr);\r
ptr->initializeARAWithConfiguration (&interfaceConfig);\r
const auto obj = std::shared_ptr<const ARA::ARAFactory> (ptr, [deleter = std::move (onDelete)] (const ARA::ARAFactory* factory)\r
{\r
factory->uninitializeARA();\r
- deleter (factory);\r
+ deleter();\r
});\r
cachePtr = obj;\r
return obj;\r
String errorMessage;\r
};\r
\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-field-initializers")\r
+\r
template <typename Obj, typename Member, typename... Ts>\r
constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts)\r
{\r
std::forward<Ts> (ts)... };\r
}\r
\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
} // namespace juce\r
==============================================================================\r
*/\r
\r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS))\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX))\r
\r
#include "juce_ARAHosting.h"\r
-#include <ARA_Library/Debug/ARADebug.h>\r
\r
#include <ARA_Library/Dispatch/ARAHostDispatch.cpp>\r
\r
public:\r
Impl (ARAFactoryWrapper araFactoryIn,\r
std::unique_ptr<ARA::Host::DocumentControllerHostInstance>&& dcHostInstanceIn,\r
- const ARA::ARADocumentControllerInstance* documentControllerInstance)\r
+ const ARA::ARADocumentControllerInstance* documentControllerInstance,\r
+ std::unique_ptr<ARA::Host::AudioAccessControllerInterface>&& audioAccessControllerIn,\r
+ std::unique_ptr<ARA::Host::ArchivingControllerInterface>&& archivingControllerIn,\r
+ std::unique_ptr<ARA::Host::ContentAccessControllerInterface>&& contentAccessControllerIn,\r
+ std::unique_ptr<ARA::Host::ModelUpdateControllerInterface>&& modelUpdateControllerIn,\r
+ std::unique_ptr<ARA::Host::PlaybackControllerInterface>&& playbackControllerIn)\r
: araFactory (std::move (araFactoryIn)),\r
+ audioAccessController (std::move (audioAccessControllerIn)),\r
+ archivingController (std::move (archivingControllerIn)),\r
+ contentAccessController (std::move (contentAccessControllerIn)),\r
+ modelUpdateController (std::move (modelUpdateControllerIn)),\r
+ playbackController (std::move (playbackControllerIn)),\r
dcHostInstance (std::move (dcHostInstanceIn)),\r
documentController (documentControllerInstance)\r
{\r
std::unique_ptr<ARA::Host::PlaybackControllerInterface>&& playbackController)\r
{\r
std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance =\r
- std::make_unique<ARA::Host::DocumentControllerHostInstance> (audioAccessController.release(),\r
- archivingController.release(),\r
- contentAccessController.release(),\r
- modelUpdateController.release(),\r
- playbackController.release());\r
+ std::make_unique<ARA::Host::DocumentControllerHostInstance> (audioAccessController.get(),\r
+ archivingController.get(),\r
+ contentAccessController.get(),\r
+ modelUpdateController.get(),\r
+ playbackController.get());\r
\r
const auto documentProperties = makeARASizedStruct (&ARA::ARADocumentProperties::name, documentName.toRawUTF8());\r
\r
if (auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties))\r
- return std::make_unique<Impl> (std::move (araFactory), std::move (dcHostInstance), dci);\r
+ return std::make_unique<Impl> (std::move (araFactory),\r
+ std::move (dcHostInstance),\r
+ dci,\r
+ std::move (audioAccessController),\r
+ std::move (archivingController),\r
+ std::move (contentAccessController),\r
+ std::move (modelUpdateController),\r
+ std::move (playbackController));\r
\r
return {};\r
}\r
\r
private:\r
ARAFactoryWrapper araFactory;\r
+\r
+ std::unique_ptr<ARA::Host::AudioAccessControllerInterface> audioAccessController;\r
+ std::unique_ptr<ARA::Host::ArchivingControllerInterface> archivingController;\r
+ std::unique_ptr<ARA::Host::ContentAccessControllerInterface> contentAccessController;\r
+ std::unique_ptr<ARA::Host::ModelUpdateControllerInterface> modelUpdateController;\r
+ std::unique_ptr<ARA::Host::PlaybackControllerInterface> playbackController;\r
+\r
std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance;\r
ARA::Host::DocumentController documentController;\r
};\r
\r
#pragma once\r
\r
-#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN\r
+#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) || DOXYGEN\r
\r
// Include ARA SDK headers\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments")\r
\r
#endif\r
\r
-//==============================================================================\r
-#if (! defined (MAC_OS_X_VERSION_10_12)) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12)\r
-enum\r
-{\r
- /** Custom AudioUnit property used to indicate MPE support */\r
- kAudioUnitProperty_SupportsMPE = 58\r
-};\r
-#endif\r
-\r
}\r
{\r
jassert (audioUnitFactory.outFactory != nullptr);\r
return getOrCreateARAFactory (audioUnitFactory.outFactory,\r
- [owningAuPtr = std::move (audioUnit)] (const ARA::ARAFactory*) {});\r
+ [owningAuPtr = std::move (audioUnit)]() {});\r
}\r
}\r
#else\r
==============================================================================\r
*/\r
\r
-#if JUCE_PLUGINHOST_LV2\r
+#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
\r
#include "juce_LV2Common.h"\r
#include "juce_LV2Resources.h"\r
namespace juce\r
{\r
\r
-#if JUCE_PLUGINHOST_LV2 || DOXYGEN\r
+#if (JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))) || DOXYGEN\r
\r
/**\r
Implements a plugin format for LV2 plugins.\r
#include "juce_VST3Common.h"\r
#include "juce_ARACommon.h"\r
\r
-#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
#include <ARA_API/ARAVST3.h>\r
\r
namespace ARA\r
// The match is determined by the two classes having the same name.\r
std::unordered_set<String> araMainFactoryClassNames;\r
\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
for (Steinberg::int32 i = 0; i < numClasses; ++i)\r
{\r
PClassInfo info;\r
template <typename Callback>\r
static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb)\r
{\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
const auto numClasses = pluginFactory->countClasses();\r
for (Steinberg::int32 i = 0; i < numClasses; ++i)\r
{\r
{\r
std::shared_ptr<const ARA::ARAFactory> factory;\r
\r
- #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS)\r
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
forEachARAFactory (pluginFactory,\r
[&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo)\r
{\r
== Steinberg::kResultOk)\r
{\r
factory = getOrCreateARAFactory (source->getFactory(),\r
- [source] (const ARA::ARAFactory*) { source->release(); });\r
+ [source]() { source->release(); });\r
return false;\r
}\r
jassert (source == nullptr);\r
if (! isWindowSizeCorrectForPlugin (w, h))\r
{\r
updateSizeFromEditor (w, h);\r
+ embeddedComponent.updateHWNDBounds();\r
sizeCheckCount = 0;\r
}\r
-\r
- embeddedComponent.updateHWNDBounds();\r
}\r
\r
void checkPluginWindowSize()\r
\r
#if JUCE_WINDOWS\r
r->resizeToFit();\r
+ r->embeddedComponent.updateHWNDBounds();\r
#endif\r
r->componentMovedOrResized (true, true);\r
}\r
#include "format_types/juce_VST3PluginFormat_test.cpp"\r
#endif\r
\r
- #if JUCE_PLUGINHOST_LV2\r
+ #if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
#include "format_types/juce_LV2PluginFormat_test.cpp"\r
#endif\r
#endif\r
\r
ID: juce_audio_processors\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE audio processor classes\r
description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
website: http://www.juce.com/juce\r
#include "utilities/juce_ParameterAttachments.h"\r
#include "utilities/juce_AudioProcessorValueTreeState.h"\r
#include "utilities/juce_PluginHostType.h"\r
+#include "utilities/ARA/juce_ARADebug.h"\r
#include "utilities/ARA/juce_ARA_utils.h"\r
\r
//==============================================================================\r
#include <juce_core/system/juce_CompilerWarnings.h>\r
#include <juce_core/system/juce_TargetPlatform.h>\r
\r
+#include "utilities/ARA/juce_ARADebug.h"\r
+\r
/* Having WIN32_LEAN_AND_MEAN defined at the point of including ARADebug.c will produce warnings.\r
\r
To prevent such problems it's easiest to have it in its own translation unit.\r
*/\r
\r
-#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS)\r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes")\r
#include <ARA_Library/Debug/ARADebug.c>\r
==============================================================================\r
*/\r
\r
-#if JUCE_PLUGINHOST_LV2\r
+#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))\r
#ifndef _CRT_SECURE_NO_WARNINGS\r
#define _CRT_SECURE_NO_WARNINGS\r
#endif\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+ Agreement and JUCE Privacy Policy.\r
+\r
+ End User License Agreement: www.juce.com/juce-7-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+#pragma once\r
+\r
+#include <juce_core/system/juce_PlatformDefs.h>\r
+\r
+#ifndef JUCE_API\r
+ #define JUCE_API\r
+#endif\r
+\r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+ #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
+ #define ARA_ENABLE_INTERNAL_ASSERTS 1\r
+ #else\r
+ #define ARA_ENABLE_INTERNAL_ASSERTS 0\r
+ #endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS\r
+\r
+//==============================================================================\r
+ #if ARA_ENABLE_INTERNAL_ASSERTS\r
+\r
+JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept;\r
+\r
+ #if !defined(ARA_HANDLE_ASSERT)\r
+ #define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis)\r
+ #endif\r
+\r
+ #if JUCE_LOG_ASSERTIONS\r
+ #define ARA_ENABLE_DEBUG_OUTPUT 1\r
+ #endif\r
+\r
+ #endif\r
+\r
+} // namespace juce\r
+\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes")\r
+ #include <ARA_Library/Debug/ARADebug.h>\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+#endif\r
if (! archiveWriter->writeBytesToArchive ((ARA::ARASize) position, numberOfBytes, (const ARA::ARAByte*) dataToWrite))\r
return false;\r
\r
- position += numberOfBytes;\r
+ position += (int64) numberOfBytes;\r
return true;\r
}\r
\r
return false;\r
}\r
\r
+ using ARARenderer::processBlock;\r
+\r
// Shadowing templated getters to default to JUCE versions of the returned classes\r
/** Returns the PlaybackRegions\r
*\r
return true;\r
}\r
\r
+ using ARARenderer::processBlock;\r
+\r
private:\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorRenderer)\r
};\r
==============================================================================\r
*/\r
\r
+#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
+namespace juce\r
+{\r
+ #if ARA_ENABLE_INTERNAL_ASSERTS\r
+JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept\r
+{\r
+ #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
+ DBG (diagnosis);\r
+ #endif\r
+\r
+ logAssertion (file, line);\r
+\r
+ #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS)\r
+ if (juce_isRunningUnderDebugger())\r
+ JUCE_BREAK_IN_DEBUGGER;\r
+ JUCE_ANALYZER_NORETURN\r
+ #endif\r
+}\r
+ #endif\r
+}\r
+#endif\r
+\r
#if JucePlugin_Enable_ARA\r
#include "juce_ARADocumentControllerCommon.cpp"\r
#include "juce_ARADocumentController.cpp"\r
#include "juce_ARAModelObjects.cpp"\r
#include "juce_ARAPlugInInstanceRoles.cpp"\r
#include "juce_AudioProcessor_ARAExtensions.cpp"\r
+\r
+ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name);\r
#endif\r
\r
ID: juce_audio_utils\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE extra audio utility classes\r
description: Classes for audio-related GUI and miscellaneous tasks.\r
website: http://www.juce.com/juce\r
\r
ID: juce_box2d\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE wrapper for the Box2D physics engine\r
description: The Box2D physics engine and some utility classes.\r
website: http://www.juce.com/juce\r
\r
/** Copies a file.\r
\r
- Tries to copy a file to a different location.\r
- If the target file already exists, this will attempt to delete it first, and\r
- will fail if this can't be done.\r
+ Tries to copy a file to a different location. If the target file already exists,\r
+ this will attempt to delete it first, and will fail if this can't be done.\r
+\r
+ Note that the target file isn't the directory to put it in, it's the actual\r
+ filename that you want the new file to have.\r
\r
@returns true if the operation succeeds\r
*/\r
\r
#undef check\r
\r
-//==============================================================================\r
-#ifndef JUCE_STANDALONE_APPLICATION\r
- JUCE_COMPILER_WARNING ("Please re-save your project with the latest Projucer version to avoid this warning")\r
- #define JUCE_STANDALONE_APPLICATION 0\r
-#endif\r
-\r
//==============================================================================\r
#include "containers/juce_AbstractFifo.cpp"\r
#include "containers/juce_ArrayBase.cpp"\r
\r
ID: juce_core\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE core classes\r
description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.\r
website: http://www.juce.com/juce\r
#include "memory/juce_AllocationHooks.h"\r
#include "memory/juce_Reservoir.h"\r
#include "files/juce_AndroidDocument.h"\r
+#include "streams/juce_AndroidDocumentInputSource.h"\r
\r
#if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS)\r
#include "native/juce_mac_ObjCHelpers.h"\r
New code:\r
\r
RuntimePermissions::request (\r
- RuntimePermissions::audioRecording,\r
+ RuntimePermissions::recordAudio,\r
[this] (bool wasGranted)\r
{\r
if (! wasGranted)\r
#if JUCE_MAC || JUCE_IOS\r
\r
#if JUCE_IOS\r
- #if JUCE_MODULE_AVAILABLE_juce_opengl && defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
+ #if JUCE_MODULE_AVAILABLE_juce_opengl\r
#define GLES_SILENCE_DEPRECATION 1\r
#endif\r
\r
+ #define Component CarbonDummyCompName\r
#import <Foundation/Foundation.h>\r
+ #undef Component\r
+\r
#import <UIKit/UIKit.h>\r
#import <CoreData/CoreData.h>\r
#import <MobileCoreServices/MobileCoreServices.h>\r
#include <sys/fcntl.h>\r
#else\r
- #if JUCE_MODULE_AVAILABLE_juce_opengl && defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14\r
+ #if JUCE_MODULE_AVAILABLE_juce_opengl\r
#define GL_SILENCE_DEPRECATION 1\r
#endif\r
\r
#import <Cocoa/Cocoa.h>\r
- #if (! defined MAC_OS_X_VERSION_10_12) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12\r
- #define NSEventModifierFlagCommand NSCommandKeyMask\r
- #define NSEventModifierFlagControl NSControlKeyMask\r
- #define NSEventModifierFlagHelp NSHelpKeyMask\r
- #define NSEventModifierFlagNumericPad NSNumericPadKeyMask\r
- #define NSEventModifierFlagOption NSAlternateKeyMask\r
- #define NSEventModifierFlagShift NSShiftKeyMask\r
- #define NSCompositingOperationSourceOver NSCompositeSourceOver\r
- #define NSEventMaskApplicationDefined NSApplicationDefinedMask\r
- #define NSEventTypeApplicationDefined NSApplicationDefined\r
- #define NSEventTypeCursorUpdate NSCursorUpdate\r
- #define NSEventTypeMouseMoved NSMouseMoved\r
- #define NSEventTypeLeftMouseDown NSLeftMouseDown\r
- #define NSEventTypeRightMouseDown NSRightMouseDown\r
- #define NSEventTypeOtherMouseDown NSOtherMouseDown\r
- #define NSEventTypeLeftMouseUp NSLeftMouseUp\r
- #define NSEventTypeRightMouseUp NSRightMouseUp\r
- #define NSEventTypeOtherMouseUp NSOtherMouseUp\r
- #define NSEventTypeLeftMouseDragged NSLeftMouseDragged\r
- #define NSEventTypeRightMouseDragged NSRightMouseDragged\r
- #define NSEventTypeOtherMouseDragged NSOtherMouseDragged\r
- #define NSEventTypeScrollWheel NSScrollWheel\r
- #define NSEventTypeKeyDown NSKeyDown\r
- #define NSEventTypeKeyUp NSKeyUp\r
- #define NSEventTypeFlagsChanged NSFlagsChanged\r
- #define NSEventMaskAny NSAnyEventMask\r
- #define NSWindowStyleMaskBorderless NSBorderlessWindowMask\r
- #define NSWindowStyleMaskClosable NSClosableWindowMask\r
- #define NSWindowStyleMaskFullScreen NSFullScreenWindowMask\r
- #define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask\r
- #define NSWindowStyleMaskResizable NSResizableWindowMask\r
- #define NSWindowStyleMaskTitled NSTitledWindowMask\r
- #define NSAlertStyleCritical NSCriticalAlertStyle\r
- #define NSControlSizeRegular NSRegularControlSize\r
- #define NSEventTypeMouseEntered NSMouseEntered\r
- #define NSEventTypeMouseExited NSMouseExited\r
- #define NSAlertStyleInformational NSInformationalAlertStyle\r
- #define NSEventTypeTabletPoint NSTabletPoint\r
- #define NSEventTypeTabletProximity NSTabletProximity\r
- #define NSEventTypeFlagsChanged NSFlagsChanged\r
- #define NSEventTypeAppKitDefined NSAppKitDefined\r
- #define NSEventTypeSystemDefined NSSystemDefined\r
- #define NSEventTypeApplicationDefined NSApplicationDefined\r
- #define NSEventTypePeriodic NSPeriodic\r
- #define NSEventTypeSmartMagnify NSEventTypeSmartMagnify\r
- #endif\r
#import <CoreAudio/HostTime.h>\r
#include <sys/dir.h>\r
#endif\r
return false;\r
}\r
\r
- std::unique_ptr<InputStream> createInputStream() const override\r
+ std::unique_ptr<InputStream> createInputStream() const override\r
{\r
- return makeStream<AndroidContentUriInputStream> (AndroidStreamHelpers::StreamKind::input);\r
+ auto result = std::make_unique<AndroidContentUriInputStream> (uri);\r
+ return result->openedSuccessfully() ? std::move (result) : nullptr;\r
}\r
\r
std::unique_ptr<OutputStream> createOutputStream() const override\r
{\r
- return makeStream<AndroidContentUriOutputStream> (AndroidStreamHelpers::StreamKind::output);\r
+ auto stream = AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::output);\r
+\r
+ return stream.get() != nullptr ? std::make_unique<AndroidContentUriOutputStream> (std::move (stream))\r
+ : nullptr;\r
}\r
\r
AndroidDocumentInfo getInfo() const override\r
NativeInfo getNativeInfo() const override { return { uri }; }\r
\r
private:\r
- template <typename Stream>\r
- std::unique_ptr<Stream> makeStream (AndroidStreamHelpers::StreamKind kind) const\r
- {\r
- auto stream = AndroidStreamHelpers::createStream (uri, kind);\r
-\r
- return stream.get() != nullptr ? std::make_unique<Stream> (std::move (stream))\r
- : nullptr;\r
- }\r
-\r
GlobalRef uri;\r
};\r
\r
METHOD (releasePersistableUriPermission, "releasePersistableUriPermission", "(Landroid/net/Uri;I)V") \\r
METHOD (getPersistedUriPermissions, "getPersistedUriPermissions", "()Ljava/util/List;")\r
\r
-DECLARE_JNI_CLASS (ContentResolver19, "android/content/ContentResolver")\r
+DECLARE_JNI_CLASS_WITH_MIN_SDK (ContentResolver19, "android/content/ContentResolver", 19)\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (close, "close", "()V") \\r
- METHOD (read, "read", "([B)I")\r
+ METHOD (read, "read", "([B)I") \\r
+ METHOD (skip, "skip", "(J)J")\r
\r
DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream")\r
#undef JNI_CLASS_MEMBERS\r
jsize size = 0;\r
};\r
\r
+//==============================================================================\r
+struct AndroidStreamHelpers\r
+{\r
+ enum class StreamKind { output, input };\r
+\r
+ static LocalRef<jobject> createStream (const GlobalRef& uri, StreamKind kind)\r
+ {\r
+ auto* env = getEnv();\r
+ auto contentResolver = AndroidContentUriResolver::getContentResolver();\r
+\r
+ if (contentResolver == nullptr)\r
+ return {};\r
+\r
+ return LocalRef<jobject> (env->CallObjectMethod (contentResolver.get(),\r
+ kind == StreamKind::input ? ContentResolver.openInputStream\r
+ : ContentResolver.openOutputStream,\r
+ uri.get()));\r
+ }\r
+};\r
+\r
//==============================================================================\r
struct AndroidContentUriInputStream : public InputStream\r
{\r
- explicit AndroidContentUriInputStream (LocalRef<jobject>&& streamIn)\r
- : stream (std::move (streamIn)) {}\r
+ explicit AndroidContentUriInputStream (const GlobalRef& uriIn)\r
+ : uri (uriIn),\r
+ stream (AndroidStreamHelpers::createStream (uri, AndroidStreamHelpers::StreamKind::input))\r
+ {}\r
\r
~AndroidContentUriInputStream() override\r
{\r
getEnv()->CallVoidMethod (stream.get(), AndroidInputStream.close);\r
+ jniCheckHasExceptionOccurredAndClear();\r
}\r
\r
int64 getTotalLength() override { return -1; }\r
{\r
auto* env = getEnv();\r
\r
- if ((jsize) maxBytesToRead > byteArray.getSize())\r
+ if ((jsize) maxBytesToRead != byteArray.getSize())\r
byteArray = CachedByteArray { (jsize) maxBytesToRead };\r
\r
const auto result = env->CallIntMethod (stream.get(), AndroidInputStream.read, byteArray.getNativeArray());\r
\r
- if (result != -1)\r
- {\r
- pos += result;\r
-\r
- auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr);\r
- std::memcpy (destBuffer, rawBytes, static_cast<size_t> (result));\r
- env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0);\r
- }\r
- else\r
+ if (jniCheckHasExceptionOccurredAndClear() || result == -1)\r
{\r
exhausted = true;\r
+ return -1;\r
}\r
\r
+ pos += result;\r
+\r
+ auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr);\r
+ std::memcpy (destBuffer, rawBytes, static_cast<size_t> (result));\r
+ env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0);\r
+\r
return result;\r
}\r
\r
bool setPosition (int64 newPos) override\r
{\r
- return (newPos == pos);\r
+ if (newPos == pos)\r
+ return true;\r
+\r
+ if (pos < newPos)\r
+ return skipImpl (newPos - pos);\r
+\r
+ AndroidContentUriInputStream (uri).swap (*this);\r
+ return skipImpl (newPos);\r
}\r
\r
int64 getPosition() override\r
return pos;\r
}\r
\r
+ bool openedSuccessfully() const { return stream != nullptr; }\r
+\r
+ void skipNextBytes (int64 num) override\r
+ {\r
+ skipImpl (num);\r
+ }\r
+\r
+private:\r
+ bool skipImpl (int64 num)\r
+ {\r
+ if (stream == nullptr)\r
+ return false;\r
+\r
+ const auto skipped = getEnv()->CallLongMethod (stream, AndroidInputStream.skip, (jlong) num);\r
+\r
+ if (jniCheckHasExceptionOccurredAndClear())\r
+ return false;\r
+\r
+ pos += skipped;\r
+ return skipped == num;\r
+ }\r
+\r
+ auto tie() { return std::tie (uri, byteArray, stream, pos, exhausted); }\r
+\r
+ void swap (AndroidContentUriInputStream& other) noexcept\r
+ {\r
+ auto toSwap = other.tie();\r
+ tie().swap (toSwap);\r
+ }\r
+\r
+ GlobalRef uri;\r
CachedByteArray byteArray;\r
GlobalRef stream;\r
int64 pos = 0;\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD (findClass, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;") \\r
+ METHOD (loadClass, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;") \\r
STATICMETHOD (getSystemClassLoader, "getSystemClassLoader", "()Ljava/lang/ClassLoader;")\r
\r
DECLARE_JNI_CLASS (JavaClassLoader, "java/lang/ClassLoader")\r
return File("/data/data/" + bundleId + "/code_cache");\r
}\r
\r
-void JNIClassBase::initialise (JNIEnv* env)\r
+void JNIClassBase::initialise (JNIEnv* env, jobject context)\r
{\r
auto sdkVersion = getAndroidSDKVersion();\r
\r
LocalRef<jstring> classNameAndPackage (javaString (String (classPath).replaceCharacter (L'/', L'.')));\r
static Array<GlobalRef> byteCodeLoaders;\r
\r
- if (! SystemJavaClassComparator::isSystemClass(this))\r
+ if (! SystemJavaClassComparator::isSystemClass (this))\r
{\r
- LocalRef<jobject> defaultClassLoader (env->CallStaticObjectMethod (JavaClassLoader, JavaClassLoader.getSystemClassLoader));\r
+ // We use the context's class loader, rather than the 'system' class loader, because we\r
+ // may need to load classes from our library dependencies (such as the BillingClient\r
+ // library), and the system class loader is not aware of those libraries.\r
+ const LocalRef<jobject> defaultClassLoader { env->CallObjectMethod (context,\r
+ env->GetMethodID (env->FindClass ("android/content/Context"),\r
+ "getClassLoader",\r
+ "()Ljava/lang/ClassLoader;")) };\r
+\r
tryLoadingClassWithClassLoader (env, defaultClassLoader.get());\r
\r
if (classRef == nullptr)\r
if (byteCodeClassLoader != nullptr)\r
{\r
tryLoadingClassWithClassLoader (env, byteCodeClassLoader.get());\r
- byteCodeLoaders.add (GlobalRef(byteCodeClassLoader));\r
+ byteCodeLoaders.add (GlobalRef (byteCodeClassLoader));\r
}\r
}\r
}\r
\r
// Android SDK <= 19 has a bug where the class loader might throw an exception but still return\r
// a non-nullptr. So don't assign the result of this call to a jobject just yet...\r
- auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.findClass, classNameAndPackage.get());\r
+ auto classObj = env->CallObjectMethod (classLoader, JavaClassLoader.loadClass, classNameAndPackage.get(), (jboolean) true);\r
\r
- if (jthrowable exception = env->ExceptionOccurred ())\r
+ if (jthrowable exception = env->ExceptionOccurred())\r
{\r
env->ExceptionClear();\r
classObj = nullptr;\r
env->DeleteGlobalRef (classRef);\r
}\r
\r
-void JNIClassBase::initialiseAllClasses (JNIEnv* env)\r
+void JNIClassBase::initialiseAllClasses (JNIEnv* env, jobject context)\r
{\r
const Array<JNIClassBase*>& classes = getClasses();\r
for (int i = classes.size(); --i >= 0;)\r
- classes.getUnchecked(i)->initialise (env);\r
+ classes.getUnchecked(i)->initialise (env, context);\r
}\r
\r
void JNIClassBase::releaseAllClasses (JNIEnv* env)\r
\r
operator jclass() const noexcept { return classRef; }\r
\r
- static void initialiseAllClasses (JNIEnv*);\r
+ static void initialiseAllClasses (JNIEnv*, jobject context);\r
static void releaseAllClasses (JNIEnv*);\r
\r
const char* getClassPath() const noexcept { return classPath; }\r
jclass classRef = nullptr;\r
\r
static Array<JNIClassBase*>& getClasses();\r
- void initialise (JNIEnv*);\r
+ void initialise (JNIEnv*, jobject context);\r
void release (JNIEnv*);\r
void tryLoadingClassWithClassLoader (JNIEnv* env, jobject classLoader);\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
STATICMETHOD (dumpReferenceTables, "dumpReferenceTables", "()V")\r
\r
- DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
+DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JUCE_LOG_JNI_REFERENCES_TABLE getEnv()->CallStaticVoidMethod (AndroidDebug, AndroidDebug.dumpReferenceTables);\r
DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display")\r
#undef JNI_CLASS_MEMBERS\r
\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getRealMetrics, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V")\r
+\r
+DECLARE_JNI_CLASS (AndroidDisplay17, "android/view/Display")\r
+#undef JNI_CLASS_MEMBERS\r
+\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (constructor, "<init>", "()V") \\r
METHOD (constructorWithLooper, "<init>", "(Landroid/os/Looper;)V") \\r
METHOD (findViewById, "findViewById", "(I)Landroid/view/View;") \\r
METHOD (getRootView, "getRootView", "()Landroid/view/View;") \\r
METHOD (addOnLayoutChangeListener, "addOnLayoutChangeListener", "(Landroid/view/View$OnLayoutChangeListener;)V") \\r
- METHOD (announceForAccessibility, "announceForAccessibility", "(Ljava/lang/CharSequence;)V") \\r
+ METHOD (announceForAccessibility, "announceForAccessibility", "(Ljava/lang/CharSequence;)V") \\r
\r
DECLARE_JNI_CLASS (AndroidView, "android/view/View")\r
#undef JNI_CLASS_MEMBERS\r
\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (setOnApplyWindowInsetsListener, "setOnApplyWindowInsetsListener", "(Landroid/view/View$OnApplyWindowInsetsListener;)V") \\r
+ METHOD (getRootWindowInsets, "getRootWindowInsets", "()Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidView23, "android/view/View", 23)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (addView, "addView", "(Landroid/view/View;)V") \\r
METHOD (removeView, "removeView", "(Landroid/view/View;)V") \\r
DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method")\r
#undef JNI_CLASS_MEMBERS\r
\r
-\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (constructor, "<init>", "()V") \\r
METHOD (getClass, "getClass", "()Ljava/lang/Class;") \\r
METHOD (registerActivityLifecycleCallbacks, "registerActivityLifecycleCallbacks", "(Landroid/app/Application$ActivityLifecycleCallbacks;)V") \\r
METHOD (unregisterActivityLifecycleCallbacks, "unregisterActivityLifecycleCallbacks", "(Landroid/app/Application$ActivityLifecycleCallbacks;)V")\r
\r
- DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application")\r
+DECLARE_JNI_CLASS (AndroidApplication, "android/app/Application")\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
METHOD (getHolder, "getHolder", "()Landroid/view/SurfaceHolder;") \\r
METHOD (getParent, "getParent", "()Landroid/view/ViewParent;")\r
\r
- DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView")\r
+DECLARE_JNI_CLASS (AndroidSurfaceView, "android/view/SurfaceView")\r
#undef JNI_CLASS_MEMBERS\r
\r
\r
METHOD (addCallback, "addCallback", "(Landroid/view/SurfaceHolder$Callback;)V") \\r
METHOD (removeCallback, "removeCallback", "(Landroid/view/SurfaceHolder$Callback;)V")\r
\r
- DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder")\r
+DECLARE_JNI_CLASS (AndroidSurfaceHolder, "android/view/SurfaceHolder")\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
return toString (false).fromLastOccurrenceOf ("/", false, true);\r
}\r
\r
-struct AndroidStreamHelpers\r
-{\r
- enum class StreamKind { output, input };\r
-\r
- static LocalRef<jobject> createStream (const GlobalRef& uri, StreamKind kind)\r
- {\r
- auto* env = getEnv();\r
- auto contentResolver = AndroidContentUriResolver::getContentResolver();\r
-\r
- if (contentResolver == nullptr)\r
- return {};\r
-\r
- return LocalRef<jobject> (env->CallObjectMethod (contentResolver.get(),\r
- kind == StreamKind::input ? ContentResolver.openInputStream\r
- : ContentResolver.openOutputStream,\r
- uri.get()));\r
- }\r
-};\r
-\r
//==============================================================================\r
class WebInputStream::Pimpl\r
{\r
\r
static void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context)\r
{\r
+ JNIClassBase::initialiseAllClasses (env, context);\r
Thread::initialiseJUCE (env, context);\r
}\r
\r
env->ExceptionClear();\r
}\r
\r
- JNIClassBase::initialiseAllClasses (env);\r
-\r
return JNI_VERSION_1_2;\r
}\r
\r
\r
case currentExecutableFile:\r
case currentApplicationFile:\r
- #if ! JUCE_STANDALONE_APPLICATION\r
- return juce_getExecutableFile();\r
- #endif\r
- // deliberate fall-through if this is not a shared-library\r
- JUCE_FALLTHROUGH\r
+ {\r
+ const auto f = juce_getExecutableFile();\r
+ return f.isSymbolicLink() ? f.getLinkedTarget() : f;\r
+ }\r
\r
case hostApplicationPath:\r
{\r
\r
JUCE_AUTORELEASEPOOL\r
{\r
- #if JUCE_MAC || (JUCE_IOS && (defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0))\r
if (@available (macOS 10.8, iOS 11.0, *))\r
{\r
NSError* error = nil;\r
resultingItemURL: nil\r
error: &error];\r
}\r
- #endif\r
\r
#if JUCE_IOS\r
return deleteFile();\r
#if JUCE_IOS\r
ignoreUnused (parameters);\r
\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
if (@available (iOS 10.0, *))\r
{\r
[[UIApplication sharedApplication] openURL: filenameAsURL\r
\r
return true;\r
}\r
- #endif\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
return [[UIApplication sharedApplication] openURL: filenameAsURL];\r
{\r
return joinCompileTimeStr (v, makeCompileTimeStr (others...));\r
}\r
+\r
+ template <typename Functor, typename Return, typename... Args>\r
+ static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const)\r
+ {\r
+ return static_cast<Return (*) (Args...)> (functor);\r
+ }\r
+\r
+ template <typename Functor>\r
+ static constexpr auto toFnPtr (Functor functor) { return toFnPtr (functor, &Functor::operator()); }\r
} // namespace detail\r
\r
//==============================================================================\r
jassert (b); ignoreUnused (b);\r
}\r
\r
+ template <typename Fn>\r
+ void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, detail::toFnPtr (callbackFn)); }\r
+\r
template <typename Result, typename... Args>\r
void addMethod (SEL selector, Result (*callbackFn) (id, SEL, Args...))\r
{\r
BlockType block;\r
};\r
\r
+//==============================================================================\r
+class ScopedNotificationCenterObserver\r
+{\r
+public:\r
+ ScopedNotificationCenterObserver() = default;\r
+\r
+ ScopedNotificationCenterObserver (id observerIn, SEL selector, NSNotificationName nameIn, id objectIn)\r
+ : observer (observerIn), name (nameIn), object (objectIn)\r
+ {\r
+ [[NSNotificationCenter defaultCenter] addObserver: observer\r
+ selector: selector\r
+ name: name\r
+ object: object];\r
+ }\r
+\r
+ ~ScopedNotificationCenterObserver()\r
+ {\r
+ if (observer != nullptr && name != nullptr)\r
+ {\r
+ [[NSNotificationCenter defaultCenter] removeObserver: observer\r
+ name: name\r
+ object: object];\r
+ }\r
+ }\r
+\r
+ ScopedNotificationCenterObserver (ScopedNotificationCenterObserver&& other) noexcept\r
+ {\r
+ swap (other);\r
+ }\r
+\r
+ ScopedNotificationCenterObserver& operator= (ScopedNotificationCenterObserver&& other) noexcept\r
+ {\r
+ auto moved = std::move (other);\r
+ swap (moved);\r
+ return *this;\r
+ }\r
+\r
+ ScopedNotificationCenterObserver (const ScopedNotificationCenterObserver&) = delete;\r
+ ScopedNotificationCenterObserver& operator= (const ScopedNotificationCenterObserver&) = delete;\r
+\r
+private:\r
+ void swap (ScopedNotificationCenterObserver& other) noexcept\r
+ {\r
+ std::swap (other.observer, observer);\r
+ std::swap (other.name, name);\r
+ std::swap (other.object, object);\r
+ }\r
+\r
+ id observer = nullptr;\r
+ NSNotificationName name = nullptr;\r
+ id object = nullptr;\r
+};\r
+\r
} // namespace juce\r
{\r
const String systemVersionPlist ("/System/Library/CoreServices/SystemVersion.plist");\r
\r
- #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
if (@available (macOS 10.13, *))\r
{\r
NSError* error = nullptr;\r
return [NSDictionary dictionaryWithContentsOfURL: createNSURLFromFile (systemVersionPlist)\r
error: &error];\r
}\r
- #endif\r
\r
return [NSDictionary dictionaryWithContentsOfFile: juceStringToNS (systemVersionPlist)];\r
}();\r
//==============================================================================\r
namespace\r
{\r
- #if JUCE_LINUX || (JUCE_IOS && ! __DARWIN_ONLY_64_BIT_INO_T) // (this iOS stuff is to avoid a simulator bug)\r
+ #if JUCE_LINUX || (JUCE_IOS && (! TARGET_OS_MACCATALYST) && (! __DARWIN_ONLY_64_BIT_INO_T)) // (this iOS stuff is to avoid a simulator bug)\r
using juce_statStruct = struct stat64;\r
#define JUCE_STAT stat64\r
#else\r
\r
//==============================================================================\r
#if JUCE_MINGW\r
- static uint32 getWindowsVersion()\r
+ static uint64 getWindowsVersion()\r
{\r
auto filename = _T("kernel32.dll");\r
DWORD handle = 0;\r
\r
if (VerQueryValue (data, (LPCTSTR) _T("\\"), (void**) &info, &verSize))\r
if (size > 0 && info != nullptr && info->dwSignature == 0xfeef04bd)\r
- return (uint32) info->dwFileVersionMS;\r
+ return ((uint64) info->dwFileVersionMS << 32) | (uint64) info->dwFileVersionLS;\r
}\r
}\r
\r
SystemStats::OperatingSystemType SystemStats::getOperatingSystemType()\r
{\r
#if JUCE_MINGW\r
- auto v = getWindowsVersion();\r
- auto major = (v >> 16) & 0xff;\r
- auto minor = (v >> 0) & 0xff;\r
+ const auto v = getWindowsVersion();\r
+ const auto major = (v >> 48) & 0xffff;\r
+ const auto minor = (v >> 32) & 0xffff;\r
+ const auto build = (v >> 16) & 0xffff;\r
#else\r
- auto versionInfo = getWindowsVersionInfo();\r
- auto major = versionInfo.dwMajorVersion;\r
- auto minor = versionInfo.dwMinorVersion;\r
+ const auto versionInfo = getWindowsVersionInfo();\r
+ const auto major = versionInfo.dwMajorVersion;\r
+ const auto minor = versionInfo.dwMinorVersion;\r
+ const auto build = versionInfo.dwBuildNumber;\r
#endif\r
\r
jassert (major <= 10); // need to add support for new version!\r
\r
- if (major == 10) return Windows10;\r
- if (major == 6 && minor == 3) return Windows8_1;\r
- if (major == 6 && minor == 2) return Windows8_0;\r
- if (major == 6 && minor == 1) return Windows7;\r
- if (major == 6 && minor == 0) return WinVista;\r
- if (major == 5 && minor == 1) return WinXP;\r
- if (major == 5 && minor == 0) return Win2000;\r
+ if (major == 10 && build >= 22000) return Windows11;\r
+ if (major == 10) return Windows10;\r
+ if (major == 6 && minor == 3) return Windows8_1;\r
+ if (major == 6 && minor == 2) return Windows8_0;\r
+ if (major == 6 && minor == 1) return Windows7;\r
+ if (major == 6 && minor == 0) return WinVista;\r
+ if (major == 5 && minor == 1) return WinXP;\r
+ if (major == 5 && minor == 0) return Win2000;\r
\r
jassertfalse;\r
return UnknownOS;\r
\r
switch (getOperatingSystemType())\r
{\r
+ case Windows11: name = "Windows 11"; break;\r
case Windows10: name = "Windows 10"; break;\r
case Windows8_1: name = "Windows 8.1"; break;\r
case Windows8_0: name = "Windows 8.0"; break;\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ The code included in this file is provided under the terms of the ISC license\r
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+ To use, copy, modify, and/or distribute this software for any purpose with or\r
+ without fee is hereby granted provided that the above copyright notice and\r
+ this permission notice appear in all copies.\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+ An InputSource backed by an AndroidDocument.\r
+\r
+ @see InputSource, AndroidDocument\r
+\r
+ @tags{Core}\r
+*/\r
+class JUCE_API AndroidDocumentInputSource : public InputSource\r
+{\r
+public:\r
+ //==============================================================================\r
+ /** Creates a new AndroidDocumentInputSource, backed by the provided document.\r
+ */\r
+ explicit AndroidDocumentInputSource (const AndroidDocument& doc)\r
+ : document (doc) {}\r
+\r
+ //==============================================================================\r
+ /** Returns a new InputStream to read this item.\r
+\r
+ @returns an inputstream that the caller will delete, or nullptr if\r
+ the document can't be opened.\r
+ */\r
+ InputStream* createInputStream() override\r
+ {\r
+ return document.createInputStream().release();\r
+ }\r
+\r
+ /** @internal\r
+\r
+ An AndroidDocument doesn't use conventional filesystem paths.\r
+ Use the member functions of AndroidDocument to locate relative items.\r
+\r
+ @param relatedItemPath the relative pathname of the resource that is required\r
+ @returns an input stream if relatedItemPath was empty, otherwise\r
+ nullptr.\r
+ */\r
+ InputStream* createInputStreamFor (const String& relatedItemPath) override\r
+ {\r
+ return relatedItemPath.isEmpty() ? document.createInputStream().release() : nullptr;\r
+ }\r
+\r
+ /** Returns a hash code that uniquely represents this item.\r
+ */\r
+ int64 hashCode() const override\r
+ {\r
+ return document.getUrl().toString (true).hashCode64();\r
+ }\r
+\r
+private:\r
+ AndroidDocument document;\r
+};\r
+\r
+} // namespace juce\r
*/\r
#define JUCE_MAJOR_VERSION 7\r
#define JUCE_MINOR_VERSION 0\r
-#define JUCE_BUILDNUMBER 1\r
+#define JUCE_BUILDNUMBER 2\r
\r
/** Current JUCE version number.\r
\r
Windows7 = Windows | 4,\r
Windows8_0 = Windows | 5,\r
Windows8_1 = Windows | 6,\r
- Windows10 = Windows | 7\r
+ Windows10 = Windows | 7,\r
+ Windows11 = Windows | 8\r
};\r
\r
/** Returns the type of operating system we're running on.\r
"goodbye" = "au revoir"\r
@endcode\r
\r
- If the strings need to contain a quote character, they can use '\"' instead, and\r
+ If the strings need to contain a quote character, they can use `\"` instead, and\r
if the first non-whitespace character on a line isn't a quote, then it's ignored,\r
(you can use this to add comments).\r
\r
return false;\r
}\r
\r
+static String getTestNameString (const String& testName, const String& subCategory)\r
+{\r
+ return testName + " / " + subCategory;\r
+}\r
+\r
void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCategory)\r
{\r
endTest();\r
results.add (new TestResult (testName, subCategory));\r
\r
logMessage ("-----------------------------------------------------------------");\r
- logMessage ("Starting test: " + testName + " / " + subCategory + "...");\r
+ logMessage ("Starting tests in: " + getTestNameString (testName, subCategory) + "...");\r
\r
resultsUpdated();\r
}\r
}\r
else\r
{\r
- logMessage ("All tests completed successfully");\r
+ logMessage ("Completed tests in " + getTestNameString (r->unitTestName, r->subcategoryName));\r
}\r
}\r
}\r
\r
ID: juce_cryptography\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE cryptography classes\r
description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
website: http://www.juce.com/juce\r
\r
ID: juce_data_structures\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE data model helper classes\r
description: Classes for undo/redo management, and smart data structures.\r
website: http://www.juce.com/juce\r
{\r
jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
\r
+ if (source == *this)\r
+ return;\r
+\r
if (source.object == nullptr)\r
removeAllProperties (undoManager);\r
else if (object != nullptr)\r
{\r
jassert (object != nullptr || source.object == nullptr); // Trying to copy to a null ValueTree will fail!\r
\r
+ if (source == *this)\r
+ return;\r
+\r
copyPropertiesFrom (source, undoManager);\r
removeAllChildren (undoManager);\r
\r
}\r
\r
template <typename FloatType>\r
-void WindowingFunction<FloatType>::multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept\r
+void WindowingFunction<FloatType>::multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept\r
{\r
FloatVectorOperations::multiply (samples, windowTable.getRawDataPointer(), jmin (static_cast<int> (size), windowTable.size()));\r
}\r
bool normalise = true, FloatType beta = 0) noexcept;\r
\r
/** Multiplies the content of a buffer with the given window. */\r
- void multiplyWithWindowingTable (FloatType* samples, size_t size) noexcept;\r
+ void multiplyWithWindowingTable (FloatType* samples, size_t size) const noexcept;\r
\r
/** Returns the name of a given windowing method. */\r
static const char* getWindowingMethodName (WindowingMethod) noexcept;\r
\r
ID: juce_dsp\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE DSP classes\r
description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
website: http://www.juce.com/juce\r
\r
ID: juce_events\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE message and event handling classes\r
description: Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
website: http://www.juce.com/juce\r
}\r
#endif\r
\r
- #if JUCE_WINDOWS && JUCE_STANDALONE_APPLICATION && (! defined (_CONSOLE)) && (! JUCE_MINGW)\r
- if (AttachConsole (ATTACH_PARENT_PROCESS) != 0)\r
+ #if JUCE_WINDOWS && (! defined (_CONSOLE)) && (! JUCE_MINGW)\r
+ if (isStandaloneApp() && AttachConsole (ATTACH_PARENT_PROCESS) != 0)\r
{\r
// if we've launched a GUI app from cmd.exe or PowerShell, we need this to enable printf etc.\r
// However, only reassign stdout, stderr, stdin if they have not been already opened by\r
//==============================================================================\r
bool MessageManager::isThisTheMessageThread() const noexcept\r
{\r
+ const std::lock_guard<std::mutex> lock { messageThreadIdMutex };\r
+\r
return Thread::getCurrentThreadId() == messageThreadId;\r
}\r
\r
{\r
auto thisThread = Thread::getCurrentThreadId();\r
\r
- if (messageThreadId != thisThread)\r
- {\r
- messageThreadId = thisThread;\r
+ const std::lock_guard<std::mutex> lock { messageThreadIdMutex };\r
\r
+ if (std::exchange (messageThreadId, thisThread) != thisThread)\r
+ {\r
#if JUCE_WINDOWS\r
// This is needed on windows to make sure the message window is created by this thread\r
doPlatformSpecificShutdown();\r
Atomic<int> quitMessagePosted { 0 }, quitMessageReceived { 0 };\r
Thread::ThreadID messageThreadId;\r
Atomic<Thread::ThreadID> threadWithLock;\r
+ mutable std::mutex messageThreadIdMutex;\r
\r
static bool postMessageToSystemQueue (MessageBase*);\r
static void* exitModalLoopCallback (void*);\r
{ 0x06bdcc29, 0xffffffff }, /* white */\r
{ 0x002e305a, 0xff0000ff }, /* blue */\r
{ 0x00308adf, 0xff808080 }, /* grey */\r
+ { 0x00308a63, 0xff808080 }, /* gray */\r
{ 0x05e0cf03, 0xff008000 }, /* green */\r
{ 0x0001b891, 0xffff0000 }, /* red */\r
{ 0xd43c6474, 0xffffff00 }, /* yellow */\r
{ 0x67cd1799, 0xff008b8b }, /* darkcyan */\r
{ 0x31bbd168, 0xffb8860b }, /* darkgoldenrod */\r
{ 0x67cecf55, 0xff555555 }, /* darkgrey */\r
+ { 0x67ceced9, 0xff555555 }, /* darkgray */\r
{ 0x920b194d, 0xff006400 }, /* darkgreen */\r
{ 0x923edd4c, 0xffbdb76b }, /* darkkhaki */\r
{ 0x5c293873, 0xff8b008b }, /* darkmagenta */\r
{ 0x61be858a, 0xff8fbc8f }, /* darkseagreen */\r
{ 0xc2b0f2bd, 0xff483d8b }, /* darkslateblue */\r
{ 0xc2b34d42, 0xff2f4f4f }, /* darkslategrey */\r
+ { 0xc2b34cc6, 0xff2f4f4f }, /* darkslategray */\r
{ 0x7cf2b06b, 0xff00ced1 }, /* darkturquoise */\r
{ 0xc8769375, 0xff9400d3 }, /* darkviolet */\r
{ 0x25832862, 0xffff1493 }, /* deeppink */\r
{ 0xfcad568f, 0xff00bfff }, /* deepskyblue */\r
{ 0x634c8b67, 0xff696969 }, /* dimgrey */\r
+ { 0x634c8aeb, 0xff696969 }, /* dimgray */\r
{ 0x45c1ce55, 0xff1e90ff }, /* dodgerblue */\r
{ 0xef19e3cb, 0xffb22222 }, /* firebrick */\r
{ 0xb852b195, 0xfffffaf0 }, /* floralwhite */\r
{ 0x21234e3c, 0xfffafad2 }, /* lightgoldenrodyellow */\r
{ 0xf40157ad, 0xff90ee90 }, /* lightgreen */\r
{ 0x28e744f5, 0xffd3d3d3 }, /* lightgrey */\r
+ { 0x28e74479, 0xffd3d3d3 }, /* lightgray */\r
{ 0x28eb3b8c, 0xffffb6c1 }, /* lightpink */\r
{ 0x9fb78304, 0xffffa07a }, /* lightsalmon */\r
{ 0x50632b2a, 0xff20b2aa }, /* lightseagreen */\r
{ 0x68fb7b25, 0xff87cefa }, /* lightskyblue */\r
{ 0xa8a35ba2, 0xff778899 }, /* lightslategrey */\r
+ { 0xa8a35b26, 0xff778899 }, /* lightslategray */\r
{ 0xa20d484f, 0xffb0c4de }, /* lightsteelblue */\r
{ 0xaa2cf10a, 0xffffffe0 }, /* lightyellow */\r
{ 0x0032afd5, 0xff00ff00 }, /* lime */\r
{ 0x80da74fb, 0xff87ceeb }, /* skyblue */\r
{ 0x44a8dd73, 0xff6a5acd }, /* slateblue */\r
{ 0x44ab37f8, 0xff708090 }, /* slategrey */\r
+ { 0x44ab377c, 0xff708090 }, /* slategray */\r
{ 0x0035f183, 0xfffffafa }, /* snow */\r
{ 0xd5440d16, 0xff00ff7f }, /* springgreen */\r
{ 0x3e1524a5, 0xff4682b4 }, /* steelblue */\r
\r
ID: juce_graphics\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE graphics classes\r
description: Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
website: http://www.juce.com/juce\r
\r
auto numComponents = (size_t) lineStride * (size_t) jmax (1, height);\r
\r
- # if JUCE_MAC && defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14\r
- // This version of the SDK intermittently requires a bit of extra space\r
+ // SDK version 10.14+ intermittently requires a bit of extra space\r
// at the end of the image data. This feels like something has gone\r
// wrong in Apple's code.\r
numComponents += (size_t) lineStride;\r
- #endif\r
\r
imageData->data.allocate (numComponents, clearImage);\r
\r
/** Destructor. */\r
virtual ~AccessibilityCellInterface() = default;\r
\r
- /** Returns the column index of the cell in the table. */\r
- virtual int getColumnIndex() const = 0;\r
-\r
- /** Returns the number of columns occupied by the cell in the table. */\r
- virtual int getColumnSpan() const = 0;\r
-\r
- /** Returns the row index of the cell in the table. */\r
- virtual int getRowIndex() const = 0;\r
-\r
- /** Returns the number of rows occupied by the cell in the table. */\r
- virtual int getRowSpan() const = 0;\r
-\r
/** Returns the indentation level for the cell. */\r
virtual int getDisclosureLevel() const = 0;\r
\r
/** Returns the AccessibilityHandler of the table which contains the cell. */\r
virtual const AccessibilityHandler* getTableHandler() const = 0;\r
+\r
+ /** Returns a list of the accessibility elements that are disclosed by this element, if any. */\r
+ virtual std::vector<const AccessibilityHandler*> getDisclosedRows() const { return {}; }\r
};\r
\r
} // namespace juce\r
nullptr if there is no cell at the specified position.\r
*/\r
virtual const AccessibilityHandler* getCellHandler (int row, int column) const = 0;\r
+\r
+ /** Returns the AccessibilityHandler for a row in the table, or nullptr if there is\r
+ no row at this index.\r
+\r
+ The row component should have a child component for each column in the table.\r
+ */\r
+ virtual const AccessibilityHandler* getRowHandler (int row) const = 0;\r
+\r
+ /** Returns the AccessibilityHandler for the header, or nullptr if there is\r
+ no header.\r
+\r
+ If you supply a header, it must have exactly the same number of children\r
+ as there are columns in the table.\r
+ */\r
+ virtual const AccessibilityHandler* getHeaderHandler() const = 0;\r
+\r
+ struct Span { int begin, num; };\r
+\r
+ /** Given the handler of one of the cells in the table, returns the rows covered\r
+ by that cell, or null if the cell does not exist in the table.\r
+\r
+ This function replaces the getRowIndex and getRowSpan\r
+ functions from AccessibilityCellInterface. Most of the time, it's easier for the\r
+ table itself to keep track of cell locations, than to delegate to the individual\r
+ cells.\r
+ */\r
+ virtual Optional<Span> getRowSpan (const AccessibilityHandler&) const = 0;\r
+\r
+ /** Given the handler of one of the cells in the table, returns the columns covered\r
+ by that cell, or null if the cell does not exist in the table.\r
+\r
+ This function replaces the getColumnIndex and getColumnSpan\r
+ functions from AccessibilityCellInterface. Most of the time, it's easier for the\r
+ table itself to keep track of cell locations, than to delegate to the individual\r
+ cells.\r
+ */\r
+ virtual Optional<Span> getColumnSpan (const AccessibilityHandler&) const = 0;\r
+\r
+ /** Attempts to scroll the table (if necessary) so that the cell with the given handler\r
+ is visible.\r
+ */\r
+ virtual void showCell (const AccessibilityHandler&) const = 0;\r
};\r
\r
} // namespace juce\r
true);\r
}\r
\r
+std::unique_ptr<AccessibilityHandler> HyperlinkButton::createAccessibilityHandler()\r
+{\r
+ return std::make_unique<ButtonAccessibilityHandler> (*this, AccessibilityRole::hyperlink);\r
+}\r
+\r
} // namespace juce\r
void paintButton (Graphics&, bool, bool) override;\r
\r
private:\r
+ std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;\r
+\r
//==============================================================================\r
using Button::clicked;\r
Font getFontToUse() const;\r
void Desktop::addDarkModeSettingListener (DarkModeSettingListener* l) { darkModeSettingListeners.add (l); }\r
void Desktop::removeDarkModeSettingListener (DarkModeSettingListener* l) { darkModeSettingListeners.remove (l); }\r
\r
-void Desktop::darkModeChanged() { darkModeSettingListeners.call ([] (DarkModeSettingListener& l) { l.darkModeSettingChanged(); }); }\r
+void Desktop::darkModeChanged() { darkModeSettingListeners.call ([] (auto& l) { l.darkModeSettingChanged(); }); }\r
\r
//==============================================================================\r
void Desktop::resetTimer()\r
namespace juce\r
{\r
\r
+template <typename This>\r
+auto* getPrimaryDisplayImpl (This& t)\r
+{\r
+ JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+ const auto iter = std::find_if (t.displays.begin(), t.displays.end(), [] (auto& d) { return d.isMain; });\r
+ return iter != t.displays.end() ? std::addressof (*iter) : nullptr;\r
+}\r
+\r
Displays::Displays (Desktop& desktop)\r
{\r
init (desktop);\r
\r
const Displays::Display* Displays::getPrimaryDisplay() const noexcept\r
{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
- for (auto& d : displays)\r
- if (d.isMain)\r
- return &d;\r
-\r
- return nullptr;\r
+ return getPrimaryDisplayImpl (*this);\r
}\r
\r
RectangleList<int> Displays::getRectangleList (bool userAreasOnly) const\r
}\r
}\r
\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
+static auto tie (const Displays::Display& d)\r
{\r
- return d1.isMain == d2.isMain\r
- && d1.totalArea == d2.totalArea\r
- && d1.userArea == d2.userArea\r
- && d1.topLeftPhysical == d2.topLeftPhysical\r
- && d1.scale == d2.scale\r
- && d1.dpi == d2.dpi;\r
+ return std::tie (d.dpi,\r
+ d.isMain,\r
+ d.keyboardInsets,\r
+ d.safeAreaInsets,\r
+ d.scale,\r
+ d.topLeftPhysical,\r
+ d.totalArea,\r
+ d.userArea);\r
}\r
\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept { return ! (d1 == d2); }\r
+static bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
+{\r
+ return tie (d1) == tie (d2);\r
+}\r
\r
//==============================================================================\r
// These methods are used for converting the totalArea and userArea Rectangles in Display from physical to logical\r
*/\r
BorderSize<int> safeAreaInsets;\r
\r
+ /** Represents the area of this display in logical pixels that is obscured by an\r
+ onscreen keyboard.\r
+\r
+ This is currently only supported on iOS, and on Android 11+.\r
+\r
+ This will only return the bounds of the keyboard when it is in 'docked' mode.\r
+ If the keyboard is floating (e.g. on an iPad using the split keyboard mode),\r
+ no insets will be reported.\r
+ */\r
+ BorderSize<int> keyboardInsets;\r
+\r
/** The top-left of this display in physical coordinates. */\r
Point<int> topLeftPhysical;\r
\r
auto newBounds = area.getSmallestIntegerContainer() + parentOrigin;\r
originRelativeToComponent = parentOrigin - newBounds.getPosition();\r
setBounds (newBounds);\r
+ updateTransform();\r
}\r
\r
//==============================================================================\r
return changed;\r
}\r
\r
+void Drawable::setDrawableTransform (const AffineTransform& transform)\r
+{\r
+ drawableTransform = transform;\r
+ updateTransform();\r
+}\r
+\r
+void Drawable::updateTransform()\r
+{\r
+ if (drawableTransform.isIdentity())\r
+ return;\r
+\r
+ const auto transformationOrigin = originRelativeToComponent + getPosition();\r
+ setTransform (AffineTransform::translation (transformationOrigin * (-1))\r
+ .followedBy (drawableTransform)\r
+ .followedBy (AffineTransform::translation (transformationOrigin)));\r
+}\r
+\r
//==============================================================================\r
void Drawable::setOriginWithOriginalSize (Point<float> originWithinParent)\r
{\r
*/\r
virtual bool replaceColour (Colour originalColour, Colour replacementColour);\r
\r
+ /** Sets a transformation that applies to the same coordinate system in which the rest of the\r
+ draw calls are made. You almost certainly want to call this function when working with\r
+ Drawables as opposed to Component::setTransform().\r
+\r
+ The reason for this is that the origin of a Drawable is not the same as the point returned\r
+ by Component::getPosition() but has an additional offset internal to the Drawable class.\r
+\r
+ Using setDrawableTransform() will take this internal offset into account when applying the\r
+ transform to the Component base.\r
+\r
+ You can only use Drawable::setDrawableTransform() or Component::setTransform() for a given\r
+ object. Using both will lead to unpredictable behaviour.\r
+ */\r
+ void setDrawableTransform (const AffineTransform& transform);\r
+\r
protected:\r
//==============================================================================\r
friend class DrawableComposite;\r
\r
Point<int> originRelativeToComponent;\r
std::unique_ptr<Drawable> drawableClipPath;\r
+ AffineTransform drawableTransform;\r
\r
void nonConstDraw (Graphics&, float opacity, const AffineTransform&);\r
+ void updateTransform();\r
\r
Drawable (const Drawable&);\r
Drawable& operator= (const Drawable&);\r
dt->setFont (font, true);\r
\r
if (additonalTransform != nullptr)\r
- dt->setTransform (transform.followedBy (*additonalTransform));\r
+ dt->setDrawableTransform (transform.followedBy (*additonalTransform));\r
else\r
- dt->setTransform (transform);\r
+ dt->setDrawableTransform (transform);\r
\r
dt->setColour (parseColour (xml, "fill", Colours::black)\r
.withMultipliedAlpha (parseSafeFloat (getStyleAttribute (xml, "fill-opacity", "1"))));\r
File mooseFile (chooser.getResult());\r
\r
loadMoose (mooseFile);\r
- }\r
+ });\r
}\r
@endcode\r
\r
#import <MetalKit/MetalKit.h>\r
\r
#elif JUCE_IOS\r
- #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+ #if JUCE_PUSH_NOTIFICATIONS\r
#import <UserNotifications/UserNotifications.h>\r
#endif\r
\r
ScaledImage image;\r
Point<int> hotspot;\r
};\r
+\r
+ template <typename MemberFn>\r
+ static const AccessibilityHandler* getEnclosingHandlerWithInterface (const AccessibilityHandler* handler, MemberFn fn)\r
+ {\r
+ if (handler == nullptr)\r
+ return nullptr;\r
+\r
+ if ((handler->*fn)() != nullptr)\r
+ return handler;\r
+\r
+ return getEnclosingHandlerWithInterface (handler->getParent(), fn);\r
+ }\r
} // namespace juce\r
\r
#include "mouse/juce_PointerState.h"\r
#include "native/juce_MultiTouchMapper.h"\r
#endif\r
\r
-#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_UNIT_TESTS\r
+#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_IOS || JUCE_UNIT_TESTS\r
#include "native/accessibility/juce_AccessibilityTextHelpers.h"\r
#endif\r
\r
#include "native/accessibility/juce_mac_AccessibilitySharedCode.mm"\r
\r
#if JUCE_IOS\r
- #include "native/accessibility/juce_ios_Accessibility.mm"\r
#include "native/juce_ios_UIViewComponentPeer.mm"\r
+ #include "native/accessibility/juce_ios_Accessibility.mm"\r
#include "native/juce_ios_Windowing.mm"\r
#include "native/juce_ios_FileChooser.mm"\r
\r
\r
ID: juce_gui_basics\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE GUI core classes\r
description: Basic user-interface components and related classes.\r
website: http://www.juce.com/juce\r
/** Inserts some text, overwriting the selected text region, if there is one. */\r
virtual void insertTextAtCaret (const String& textToInsert) = 0;\r
\r
+ /** Returns the current index of the caret. */\r
+ virtual int getCaretPosition() const = 0;\r
+\r
/** Returns the position of the caret, relative to the component's origin. */\r
- virtual Rectangle<int> getCaretRectangle() = 0;\r
+ Rectangle<int> getCaretRectangle() const { return getCaretRectangleForCharIndex (getCaretPosition()); }\r
+\r
+ /** Returns the bounding box of the character at the given index. */\r
+ virtual Rectangle<int> getCaretRectangleForCharIndex (int characterIndex) const = 0;\r
+\r
+ /** Returns the total number of codepoints in the string. */\r
+ virtual int getTotalNumChars() const = 0;\r
+\r
+ /** Returns the index closest to the given point.\r
+\r
+ This is the location where the cursor might be placed after clicking at the given\r
+ point in a text field.\r
+ */\r
+ virtual int getCharIndexForPoint (Point<int> point) const = 0;\r
+\r
+ /** Returns the bounding box for a range of text in the editor. As the range may span\r
+ multiple lines, this method returns a RectangleList.\r
+\r
+ The bounds are relative to the component's top-left and may extend beyond the bounds\r
+ of the component if the text is long and word wrapping is disabled.\r
+ */\r
+ virtual RectangleList<int> getTextBounds (Range<int> textRange) const = 0;\r
\r
/** A set of possible on-screen keyboard types, for use in the\r
getKeyboardType() method.\r
void MultiDocumentPanelWindow::activeWindowStatusChanged()\r
{\r
DocumentWindow::activeWindowStatusChanged();\r
- updateOrder();\r
+ updateActiveDocument();\r
}\r
\r
void MultiDocumentPanelWindow::broughtToFront()\r
{\r
DocumentWindow::broughtToFront();\r
- updateOrder();\r
+ updateActiveDocument();\r
}\r
\r
-void MultiDocumentPanelWindow::updateOrder()\r
+void MultiDocumentPanelWindow::updateActiveDocument()\r
{\r
if (auto* owner = getOwner())\r
- owner->updateOrder();\r
+ owner->updateActiveDocumentFromUIState();\r
}\r
\r
MultiDocumentPanel* MultiDocumentPanelWindow::getOwner() const noexcept\r
void currentTabChanged (int, const String&) override\r
{\r
if (auto* owner = findParentComponentOfClass<MultiDocumentPanel>())\r
- owner->updateOrder();\r
+ owner->updateActiveDocumentFromUIState();\r
}\r
};\r
\r
}\r
\r
resized();\r
- activeDocumentChanged();\r
+ updateActiveDocument (component);\r
return true;\r
}\r
\r
-void MultiDocumentPanel::closeDocumentInternal (Component* component)\r
+void MultiDocumentPanel::recreateLayout()\r
+{\r
+ tabComponent.reset();\r
+\r
+ for (int i = getNumChildComponents(); --i >= 0;)\r
+ {\r
+ std::unique_ptr<MultiDocumentPanelWindow> dw (dynamic_cast<MultiDocumentPanelWindow*> (getChildComponent (i)));\r
+\r
+ if (dw != nullptr)\r
+ {\r
+ dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString());\r
+ dw->clearContentComponent();\r
+ }\r
+ }\r
+\r
+ resized();\r
+\r
+ auto tempComps = components;\r
+ components.clear();\r
+\r
+ {\r
+ // We want to preserve the activeComponent, so we are blocking the changes originating\r
+ // from addDocument()\r
+ const ScopedValueSetter<bool> scope { isLayoutBeingChanged, true };\r
+\r
+ for (auto* c : tempComps)\r
+ addDocument (c,\r
+ Colour ((uint32) static_cast<int> (c->getProperties().getWithDefault ("mdiDocumentBkg_",\r
+ (int) Colours::white.getARGB()))),\r
+ MultiDocHelpers::shouldDeleteComp (c));\r
+ }\r
+\r
+ if (activeComponent != nullptr)\r
+ setActiveDocument (activeComponent);\r
+\r
+ updateActiveDocumentFromUIState();\r
+}\r
+\r
+void MultiDocumentPanel::closeDocumentInternal (Component* componentToClose)\r
{\r
// Intellisense warns about component being uninitialised.\r
// I'm not sure how a function argument could be uninitialised.\r
JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6001)\r
\r
+ const OptionalScopedPointer<Component> component { componentToClose,\r
+ MultiDocHelpers::shouldDeleteComp (componentToClose) };\r
+\r
component->removeComponentListener (this);\r
\r
- const bool shouldDelete = MultiDocHelpers::shouldDeleteComp (component);\r
component->getProperties().remove ("mdiDocumentDelete_");\r
component->getProperties().remove ("mdiDocumentBkg_");\r
\r
+ const auto removedIndex = components.indexOf (component);\r
+\r
+ if (removedIndex < 0)\r
+ {\r
+ jassertfalse;\r
+ return;\r
+ }\r
+\r
+ components.remove (removedIndex);\r
+\r
+ // See if the active document needs to change because of closing a document. It should only\r
+ // change if we closed the active document. If so, the next active document should be the\r
+ // subsequent one.\r
+ if (component == activeComponent)\r
+ {\r
+ auto* newActiveComponent = components[jmin (removedIndex, components.size() - 1)];\r
+ updateActiveDocument (newActiveComponent);\r
+ }\r
+\r
+ // We update the UI to reflect the new state, but we want to prevent the UI state callback\r
+ // to change the active document.\r
+ const ScopedValueSetter<bool> scope { isLayoutBeingChanged, true };\r
+\r
if (mode == FloatingWindows)\r
{\r
for (auto* child : getChildren())\r
}\r
}\r
\r
- if (shouldDelete)\r
- delete component;\r
-\r
- components.removeFirstMatchingValue (component);\r
-\r
if (isFullscreenWhenOneDocument() && components.size() == 1)\r
{\r
for (int i = getNumChildComponents(); --i >= 0;)\r
dw->clearContentComponent();\r
}\r
\r
- addAndMakeVisible (components.getFirst());\r
+ addAndMakeVisible (getActiveDocument());\r
}\r
}\r
else\r
{\r
- jassert (components.indexOf (component) >= 0);\r
-\r
if (tabComponent != nullptr)\r
{\r
for (int i = tabComponent->getNumTabs(); --i >= 0;)\r
removeChildComponent (component);\r
}\r
\r
- if (shouldDelete)\r
- delete component;\r
-\r
- if (tabComponent != nullptr && tabComponent->getNumTabs() <= numDocsBeforeTabsUsed)\r
+ if (components.size() <= numDocsBeforeTabsUsed && getActiveDocument() != nullptr)\r
+ {\r
tabComponent.reset();\r
-\r
- components.removeFirstMatchingValue (component);\r
-\r
- if (components.size() > 0 && tabComponent == nullptr)\r
- addAndMakeVisible (components.getFirst());\r
+ addAndMakeVisible (getActiveDocument());\r
+ }\r
}\r
\r
resized();\r
\r
// This ensures that the active tab is painted properly when a tab is closed!\r
- if (auto* activeComponent = getActiveDocument())\r
- setActiveDocument (activeComponent);\r
-\r
- activeDocumentChanged();\r
+ if (auto* activeDocument = getActiveDocument())\r
+ setActiveDocument (activeDocument);\r
\r
JUCE_END_IGNORE_WARNINGS_MSVC\r
}\r
\r
Component* MultiDocumentPanel::getActiveDocument() const noexcept\r
{\r
- if (mode == FloatingWindows)\r
- {\r
- for (auto* child : getChildren())\r
- if (auto* dw = dynamic_cast<MultiDocumentPanelWindow*> (child))\r
- if (dw->isActiveWindow())\r
- return dw->getContentComponent();\r
- }\r
-\r
- return components.getLast();\r
+ return activeComponent;\r
}\r
\r
void MultiDocumentPanel::setActiveDocument (Component* component)\r
\r
void MultiDocumentPanel::useFullscreenWhenOneDocument (const bool shouldUseTabs)\r
{\r
- numDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0;\r
+ const auto newNumDocsBeforeTabsUsed = shouldUseTabs ? 1 : 0;\r
+\r
+ if (std::exchange (numDocsBeforeTabsUsed, newNumDocsBeforeTabsUsed) != newNumDocsBeforeTabsUsed)\r
+ recreateLayout();\r
}\r
\r
bool MultiDocumentPanel::isFullscreenWhenOneDocument() const noexcept\r
//==============================================================================\r
void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode)\r
{\r
- if (mode != newLayoutMode)\r
- {\r
- mode = newLayoutMode;\r
-\r
- if (mode == FloatingWindows)\r
- {\r
- tabComponent.reset();\r
- }\r
- else\r
- {\r
- for (int i = getNumChildComponents(); --i >= 0;)\r
- {\r
- std::unique_ptr<MultiDocumentPanelWindow> dw (dynamic_cast<MultiDocumentPanelWindow*> (getChildComponent (i)));\r
-\r
- if (dw != nullptr)\r
- {\r
- dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString());\r
- dw->clearContentComponent();\r
- }\r
- }\r
- }\r
-\r
- resized();\r
-\r
- auto tempComps = components;\r
- components.clear();\r
-\r
- for (auto* c : tempComps)\r
- addDocument (c,\r
- Colour ((uint32) static_cast<int> (c->getProperties().getWithDefault ("mdiDocumentBkg_", (int) Colours::white.getARGB()))),\r
- MultiDocHelpers::shouldDeleteComp (c));\r
- }\r
+ if (std::exchange (mode, newLayoutMode) != newLayoutMode)\r
+ recreateLayout();\r
}\r
\r
void MultiDocumentPanel::setBackgroundColour (Colour newBackgroundColour)\r
}\r
}\r
\r
-void MultiDocumentPanel::updateOrder()\r
+void MultiDocumentPanel::updateActiveDocumentFromUIState()\r
{\r
- auto oldList = components;\r
-\r
- if (mode == FloatingWindows)\r
- {\r
- components.clear();\r
-\r
- for (auto* child : getChildren())\r
- if (auto* dw = dynamic_cast<MultiDocumentPanelWindow*> (child))\r
- components.add (dw->getContentComponent());\r
- }\r
- else\r
+ auto* newActiveComponent = [&]() -> Component*\r
{\r
- if (tabComponent != nullptr)\r
+ if (mode == FloatingWindows)\r
{\r
- if (auto* current = tabComponent->getCurrentContentComponent())\r
+ for (auto* c : components)\r
{\r
- components.removeFirstMatchingValue (current);\r
- components.add (current);\r
+ if (auto* window = static_cast<MultiDocumentPanelWindow*> (c->getParentComponent()))\r
+ if (window->isActiveWindow())\r
+ return c;\r
}\r
}\r
- }\r
\r
- if (components != oldList)\r
+ if (tabComponent != nullptr)\r
+ if (auto* current = tabComponent->getCurrentContentComponent())\r
+ return current;\r
+\r
+ return activeComponent;\r
+ }();\r
+\r
+ updateActiveDocument (newActiveComponent);\r
+}\r
+\r
+void MultiDocumentPanel::updateActiveDocument (Component* component)\r
+{\r
+ if (isLayoutBeingChanged)\r
+ return;\r
+\r
+ if (std::exchange (activeComponent, component) != component)\r
activeDocumentChanged();\r
}\r
\r
\r
private:\r
//==============================================================================\r
- void updateOrder();\r
+ void updateActiveDocument();\r
MultiDocumentPanel* getOwner() const noexcept;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiDocumentPanelWindow)\r
friend class MultiDocumentPanelWindow;\r
\r
Component* getContainerComp (Component*) const;\r
- void updateOrder();\r
+ void updateActiveDocumentFromUIState();\r
+ void updateActiveDocument (Component*);\r
void addWindow (Component*);\r
+ void recreateLayout();\r
\r
LayoutMode mode = MaximisedWindowsWithTabs;\r
Array<Component*> components;\r
+ Component* activeComponent = nullptr;\r
+ bool isLayoutBeingChanged = false;\r
std::unique_ptr<TabbedComponent> tabComponent;\r
Colour backgroundColour { Colours::lightblue };\r
int maximumNumDocuments = 0, numDocsBeforeTabsUsed = 0;\r
\r
void MenuBarComponent::showMenu (int index)\r
{\r
- if (index != currentPopupIndex)\r
- {\r
- PopupMenu::dismissAllActiveMenus();\r
- menuBarItemsChanged (nullptr);\r
+ if (index == currentPopupIndex)\r
+ return;\r
\r
- setOpenItem (index);\r
- setItemUnderMouse (index);\r
+ const auto needToOpenNewSubMenu = isPositiveAndBelow (index, (int) itemComponents.size());\r
\r
- if (isPositiveAndBelow (index, (int) itemComponents.size()))\r
- {\r
- const auto& itemComponent = itemComponents[(size_t) index];\r
- auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName());\r
+ if (needToOpenNewSubMenu)\r
+ ++numActiveMenus;\r
\r
- if (m.lookAndFeel == nullptr)\r
- m.setLookAndFeel (&getLookAndFeel());\r
+ PopupMenu::dismissAllActiveMenus();\r
+ menuBarItemsChanged (nullptr);\r
\r
- auto itemBounds = itemComponent->getBounds();\r
+ setOpenItem (index);\r
+ setItemUnderMouse (index);\r
\r
- const auto callback = [ref = SafePointer<MenuBarComponent> (this), index] (int result)\r
- {\r
- if (ref != nullptr)\r
- ref->menuDismissed (index, result);\r
- };\r
-\r
- m.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
- .withTargetScreenArea (localAreaToGlobal (itemBounds))\r
- .withMinimumWidth (itemBounds.getWidth()),\r
- callback);\r
- }\r
+ if (needToOpenNewSubMenu)\r
+ {\r
+ const auto& itemComponent = itemComponents[(size_t) index];\r
+ auto m = model->getMenuForIndex (itemUnderMouse, itemComponent->getName());\r
+\r
+ if (m.lookAndFeel == nullptr)\r
+ m.setLookAndFeel (&getLookAndFeel());\r
+\r
+ auto itemBounds = itemComponent->getBounds();\r
+\r
+ const auto callback = [ref = SafePointer<MenuBarComponent> (this), index] (int result)\r
+ {\r
+ if (ref != nullptr)\r
+ ref->menuDismissed (index, result);\r
+ };\r
+\r
+ m.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
+ .withTargetScreenArea (localAreaToGlobal (itemBounds))\r
+ .withMinimumWidth (itemBounds.getWidth()),\r
+ callback);\r
}\r
}\r
\r
void MenuBarComponent::menuDismissed (int topLevelIndex, int itemId)\r
{\r
- topLevelIndexClicked = topLevelIndex;\r
+ topLevelIndexDismissed = topLevelIndex;\r
+ --numActiveMenus;\r
postCommandMessage (itemId);\r
}\r
\r
{\r
updateItemUnderMouse (getMouseXYRelative());\r
\r
- if (currentPopupIndex == topLevelIndexClicked)\r
+ if (numActiveMenus == 0)\r
setOpenItem (-1);\r
\r
if (commandId != 0 && model != nullptr)\r
- model->menuItemSelected (commandId, topLevelIndexClicked);\r
+ model->menuItemSelected (commandId, topLevelIndexDismissed);\r
}\r
\r
//==============================================================================\r
std::vector<std::unique_ptr<AccessibleItemComponent>> itemComponents;\r
\r
Point<int> lastMousePos;\r
- int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexClicked = 0;\r
+ int itemUnderMouse = -1, currentPopupIndex = -1, topLevelIndexDismissed = 0;\r
+ int numActiveMenus = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MenuBarComponent)\r
};\r
JUCE_DECLARE_NON_COPYABLE (ShadowWindow)\r
};\r
\r
-class DropShadower::ParentVisibilityChangedListener : public ComponentListener,\r
- private Timer\r
+class DropShadower::VirtualDesktopWatcher final : public ComponentListener,\r
+ private Timer\r
+{\r
+public:\r
+ //==============================================================================\r
+ VirtualDesktopWatcher (Component& c) : component (&c)\r
+ {\r
+ component->addComponentListener (this);\r
+ update();\r
+ }\r
+\r
+ ~VirtualDesktopWatcher() override\r
+ {\r
+ stopTimer();\r
+\r
+ if (auto* c = component.get())\r
+ c->removeComponentListener (this);\r
+ }\r
+\r
+ bool shouldHideDropShadow() const\r
+ {\r
+ return hasReasonToHide;\r
+ }\r
+\r
+ void addListener (void* listener, std::function<void()> cb)\r
+ {\r
+ listeners[listener] = std::move (cb);\r
+ }\r
+\r
+ void removeListener (void* listener)\r
+ {\r
+ listeners.erase (listener);\r
+ }\r
+\r
+ //==============================================================================\r
+ void componentParentHierarchyChanged (Component& c) override\r
+ {\r
+ if (component.get() == &c)\r
+ update();\r
+ }\r
+\r
+private:\r
+ //==============================================================================\r
+ void update()\r
+ {\r
+ const auto newHasReasonToHide = [this]()\r
+ {\r
+ if (! component.wasObjectDeleted() && isWindows && component->isOnDesktop())\r
+ {\r
+ startTimerHz (5);\r
+ return ! isWindowOnCurrentVirtualDesktop (component->getWindowHandle());\r
+ }\r
+\r
+ stopTimer();\r
+ return false;\r
+ }();\r
+\r
+ if (std::exchange (hasReasonToHide, newHasReasonToHide) != newHasReasonToHide)\r
+ for (auto& l : listeners)\r
+ l.second();\r
+ }\r
+\r
+ void timerCallback() override\r
+ {\r
+ update();\r
+ }\r
+\r
+ //==============================================================================\r
+ WeakReference<Component> component;\r
+ const bool isWindows = (SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0;\r
+ bool hasReasonToHide = false;\r
+ std::map<void*, std::function<void()>> listeners;\r
+};\r
+\r
+class DropShadower::ParentVisibilityChangedListener : public ComponentListener\r
{\r
public:\r
ParentVisibilityChangedListener (Component& r, ComponentListener& l)\r
: root (&r), listener (&l)\r
{\r
updateParentHierarchy();\r
-\r
- if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0)\r
- {\r
- isOnVirtualDesktop = isWindowOnCurrentVirtualDesktop (root->getWindowHandle());\r
- startTimerHz (5);\r
- }\r
}\r
\r
~ParentVisibilityChangedListener() override\r
updateParentHierarchy();\r
}\r
\r
- bool isWindowOnVirtualDesktop() const noexcept { return isOnVirtualDesktop; }\r
-\r
private:\r
class ComponentWithWeakReference\r
{\r
withDifference (observedComponents, lastSeenComponents, [this] (auto& comp) { comp.addComponentListener (this); });\r
}\r
\r
- void timerCallback() override\r
- {\r
- WeakReference<DropShadower> deletionChecker { static_cast<DropShadower*> (listener) };\r
-\r
- const auto wasOnVirtualDesktop = std::exchange (isOnVirtualDesktop,\r
- isWindowOnCurrentVirtualDesktop (root->getWindowHandle()));\r
-\r
- // on Windows, isWindowOnCurrentVirtualDesktop() may cause synchronous messages to be dispatched\r
- // to the HWND so we need to check if the shadower is still valid after calling\r
- if (deletionChecker == nullptr)\r
- return;\r
-\r
- if (isOnVirtualDesktop != wasOnVirtualDesktop)\r
- listener->componentVisibilityChanged (*root);\r
- }\r
-\r
Component* root = nullptr;\r
ComponentListener* listener = nullptr;\r
std::set<ComponentWithWeakReference> observedComponents;\r
- bool isOnVirtualDesktop = true;\r
\r
JUCE_DECLARE_NON_COPYABLE (ParentVisibilityChangedListener)\r
JUCE_DECLARE_NON_MOVEABLE (ParentVisibilityChangedListener)\r
\r
DropShadower::~DropShadower()\r
{\r
+ if (virtualDesktopWatcher != nullptr)\r
+ virtualDesktopWatcher->removeListener (this);\r
+\r
if (owner != nullptr)\r
{\r
owner->removeComponentListener (this);\r
visibilityChangedListener = std::make_unique<ParentVisibilityChangedListener> (*owner,\r
static_cast<ComponentListener&> (*this));\r
\r
+ virtualDesktopWatcher = std::make_unique<VirtualDesktopWatcher> (*owner);\r
+ virtualDesktopWatcher->addListener (this, [this]() { updateShadows(); });\r
+\r
updateShadows();\r
}\r
}\r
&& owner->isShowing()\r
&& owner->getWidth() > 0 && owner->getHeight() > 0\r
&& (Desktop::canUseSemiTransparentWindows() || owner->getParentComponent() != nullptr)\r
- && (visibilityChangedListener != nullptr && visibilityChangedListener->isWindowOnVirtualDesktop()))\r
+ && (virtualDesktopWatcher == nullptr || ! virtualDesktopWatcher->shouldHideDropShadow()))\r
{\r
while (shadowWindows.size() < 4)\r
shadowWindows.add (new ShadowWindow (owner, shadow));\r
class ParentVisibilityChangedListener;\r
std::unique_ptr<ParentVisibilityChangedListener> visibilityChangedListener;\r
\r
+ class VirtualDesktopWatcher;\r
+ std::unique_ptr<VirtualDesktopWatcher> virtualDesktopWatcher;\r
+\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DropShadower)\r
JUCE_DECLARE_WEAK_REFERENCEABLE (DropShadower)\r
};\r
\r
setVisible (newTarget == nullptr || newTarget->shouldDrawDragImageWhenOver());\r
\r
+ maintainKeyboardFocusWhenPossible();\r
+\r
if (newTargetComp != currentlyOverComp)\r
{\r
if (auto* lastTarget = getCurrentlyOver())\r
Time lastTimeOverTarget;\r
int originalInputSourceIndex;\r
MouseInputSource::InputSourceType originalInputSourceType;\r
+ bool canHaveKeyboardFocus = false;\r
+\r
+ void maintainKeyboardFocusWhenPossible()\r
+ {\r
+ const auto newCanHaveKeyboardFocus = isVisible();\r
+\r
+ if (std::exchange (canHaveKeyboardFocus, newCanHaveKeyboardFocus) != newCanHaveKeyboardFocus)\r
+ if (canHaveKeyboardFocus)\r
+ grabKeyboardFocus();\r
+ }\r
\r
void updateSize()\r
{\r
\r
dragImageComponent->sourceDetails.localPosition = sourceComponent->getLocalPoint (nullptr, lastMouseDown);\r
dragImageComponent->updateLocation (false, lastMouseDown);\r
- dragImageComponent->grabKeyboardFocus();\r
\r
#if JUCE_WINDOWS\r
// Under heavy load, the layered window's paint callback can often be lost by the OS,\r
#define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD (constructor, "<init>", "()V") \\r
METHOD (setSource, "setSource", "(Landroid/view/View;I)V") \\r
METHOD (addChild, "addChild", "(Landroid/view/View;I)V") \\r
METHOD (setParent, "setParent", "(Landroid/view/View;)V") \\r
DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo, "android/view/accessibility/AccessibilityNodeInfo")\r
#undef JNI_CLASS_MEMBERS\r
\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (setCollectionInfo, "setCollectionInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V") \\r
+ METHOD (setCollectionItemInfo, "setCollectionItemInfo", "(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V")\r
+\r
+ DECLARE_JNI_CLASS (AndroidAccessibilityNodeInfo19, "android/view/accessibility/AccessibilityNodeInfo")\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (obtain, "obtain", "(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionInfo", 19)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (obtain, "obtain", "(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidAccessibilityNodeInfoCollectionItemInfo, "android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo", 19)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
STATICMETHOD (obtain, "obtain", "(I)Landroid/view/accessibility/AccessibilityEvent;") \\r
METHOD (setPackageName, "setPackageName", "(Ljava/lang/CharSequence;)V") \\r
static jmethodID nodeInfoSetLiveRegion = nullptr;\r
static jmethodID accessibilityEventSetContentChangeTypes = nullptr;\r
\r
+template <typename MemberFn>\r
+static AccessibilityHandler* getEnclosingHandlerWithInterface (AccessibilityHandler* handler, MemberFn fn)\r
+{\r
+ if (handler == nullptr)\r
+ return nullptr;\r
+\r
+ if ((handler->*fn)() != nullptr)\r
+ return handler;\r
+\r
+ return getEnclosingHandlerWithInterface (handler->getParent(), fn);\r
+}\r
+\r
static void loadSDKDependentMethods()\r
{\r
static bool hasChecked = false;\r
case AccessibilityRole::popupMenu: return "android.widget.PopupMenu";\r
case AccessibilityRole::comboBox: return "android.widget.Spinner";\r
case AccessibilityRole::tree: return "android.widget.ExpandableListView";\r
- case AccessibilityRole::list: return "android.widget.ListView";\r
- case AccessibilityRole::table: return "android.widget.TableLayout";\r
case AccessibilityRole::progressBar: return "android.widget.ProgressBar";\r
\r
case AccessibilityRole::scrollBar:\r
case AccessibilityRole::splashScreen:\r
case AccessibilityRole::dialogWindow: return "android.widget.PopupWindow";\r
\r
+ // If we don't supply a custom class type, then TalkBack will use the node's CollectionInfo\r
+ // to make a sensible decision about how to describe the container\r
+ case AccessibilityRole::list:\r
+ case AccessibilityRole::table:\r
+\r
case AccessibilityRole::column:\r
case AccessibilityRole::row:\r
case AccessibilityRole::cell:\r
}\r
}\r
}\r
+\r
+ if (getAndroidSDKVersion() >= 19)\r
+ {\r
+ if (auto* tableInterface = accessibilityHandler.getTableInterface())\r
+ {\r
+ const auto rows = tableInterface->getNumRows();\r
+ const auto columns = tableInterface->getNumColumns();\r
+ const LocalRef<jobject> collectionInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionInfo,\r
+ AndroidAccessibilityNodeInfoCollectionInfo.obtain,\r
+ (jint) rows,\r
+ (jint) columns,\r
+ (jboolean) false) };\r
+ env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionInfo, collectionInfo.get());\r
+ }\r
+\r
+ if (auto* enclosingTableHandler = getEnclosingHandlerWithInterface (&accessibilityHandler, &AccessibilityHandler::getTableInterface))\r
+ {\r
+ auto* interface = enclosingTableHandler->getTableInterface();\r
+ jassert (interface != nullptr);\r
+ const auto rowSpan = interface->getRowSpan (accessibilityHandler);\r
+ const auto columnSpan = interface->getColumnSpan (accessibilityHandler);\r
+\r
+ enum class IsHeader { no, yes };\r
+\r
+ const auto addCellInfo = [env, &info] (AccessibilityTableInterface::Span rows, AccessibilityTableInterface::Span columns, IsHeader header)\r
+ {\r
+ const LocalRef<jobject> collectionItemInfo { env->CallStaticObjectMethod (AndroidAccessibilityNodeInfoCollectionItemInfo,\r
+ AndroidAccessibilityNodeInfoCollectionItemInfo.obtain,\r
+ (jint) rows.begin,\r
+ (jint) rows.num,\r
+ (jint) columns.begin,\r
+ (jint) columns.num,\r
+ (jboolean) (header == IsHeader::yes)) };\r
+ env->CallVoidMethod (info, AndroidAccessibilityNodeInfo19.setCollectionItemInfo, collectionItemInfo.get());\r
+ };\r
+\r
+ if (rowSpan.hasValue() && columnSpan.hasValue())\r
+ {\r
+ addCellInfo (*rowSpan, *columnSpan, IsHeader::no);\r
+ }\r
+ else\r
+ {\r
+ if (auto* tableHeader = interface->getHeaderHandler())\r
+ {\r
+ if (accessibilityHandler.getParent() == tableHeader)\r
+ {\r
+ const auto children = tableHeader->getChildren();\r
+ const auto column = std::distance (children.cbegin(), std::find (children.cbegin(), children.cend(), &accessibilityHandler));\r
+\r
+ // Talkback will only treat a row as a column header if its row index is zero\r
+ // https://github.com/google/talkback/blob/acd0bc7631a3dfbcf183789c7557596a45319e1f/utils/src/main/java/CollectionState.java#L853\r
+ addCellInfo ({ 0, 1 }, { (int) column, 1 }, IsHeader::yes);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
}\r
\r
bool performAction (int action, jobject arguments)\r
namespace juce\r
{\r
\r
-#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
- #define JUCE_IOS_CONTAINER_API_AVAILABLE 1\r
-#endif\r
-\r
#define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
\r
-//==============================================================================\r
-static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler)\r
-{\r
- const auto children = handler.getChildren();\r
-\r
- NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
-\r
- [accessibleChildren addObject: (id) handler.getNativeImplementation()];\r
-\r
- for (auto* childHandler : children)\r
- {\r
- id accessibleElement = [&childHandler]\r
- {\r
- id native = (id) childHandler->getNativeImplementation();\r
-\r
- if (childHandler->getChildren().size() > 0)\r
- return [native accessibilityContainer];\r
-\r
- return native;\r
- }();\r
-\r
- if (accessibleElement != nil)\r
- [accessibleChildren addObject: accessibleElement];\r
- }\r
-\r
- return accessibleChildren;\r
-}\r
+template <typename> struct Signature;\r
+\r
+template <typename Result, typename... Args>\r
+struct Signature<Result (Args...)> {};\r
+\r
+// @selector isn't constexpr, so the 'sel' members are functions rather than static constexpr data members\r
+struct SignatureHasText : Signature<BOOL()> { static auto sel() { return @selector (hasText); } };\r
+struct SignatureSetSelectedTextRange : Signature<void (UITextRange*)> { static auto sel() { return @selector (setSelectedTextRange:); } };\r
+struct SignatureSelectedTextRange : Signature<UITextRange*()> { static auto sel() { return @selector (selectedTextRange); } };\r
+struct SignatureMarkedTextRange : Signature<UITextRange*()> { static auto sel() { return @selector (markedTextRange); } };\r
+struct SignatureSetMarkedTextSelectedRange : Signature<void (NSString*, NSRange)> { static auto sel() { return @selector (setMarkedText:selectedRange:); } };\r
+struct SignatureUnmarkText : Signature<void()> { static auto sel() { return @selector (unmarkText); } };\r
+struct SignatureMarkedTextStyle : Signature<NSDictionary<NSAttributedStringKey, id>*()> { static auto sel() { return @selector (markedTextStyle); } };\r
+struct SignatureSetMarkedTextStyle : Signature<void (NSDictionary<NSAttributedStringKey, id>*)> { static auto sel() { return @selector (setMarkedTextStyle:); } };\r
+struct SignatureBeginningOfDocument : Signature<UITextPosition*()> { static auto sel() { return @selector (beginningOfDocument); } };\r
+struct SignatureEndOfDocument : Signature<UITextPosition*()> { static auto sel() { return @selector (endOfDocument); } };\r
+struct SignatureTokenizer : Signature<id<UITextInputTokenizer>()> { static auto sel() { return @selector (tokenizer); } };\r
+struct SignatureBaseWritingDirection : Signature<NSWritingDirection (UITextPosition*, UITextStorageDirection)> { static auto sel() { return @selector (baseWritingDirectionForPosition:inDirection:); } };\r
+struct SignatureCaretRectForPosition : Signature<CGRect (UITextPosition*)> { static auto sel() { return @selector (caretRectForPosition:); } };\r
+struct SignatureCharacterRangeByExtending : Signature<UITextRange* (UITextPosition*, UITextLayoutDirection)> { static auto sel() { return @selector (characterRangeByExtendingPosition:inDirection:); } };\r
+struct SignatureCharacterRangeAtPoint : Signature<UITextRange* (CGPoint)> { static auto sel() { return @selector (characterRangeAtPoint:); } };\r
+struct SignatureClosestPositionToPoint : Signature<UITextPosition* (CGPoint)> { static auto sel() { return @selector (closestPositionToPoint:); } };\r
+struct SignatureClosestPositionToPointInRange : Signature<UITextPosition* (CGPoint, UITextRange*)> { static auto sel() { return @selector (closestPositionToPoint:withinRange:); } };\r
+struct SignatureComparePositionToPosition : Signature<NSComparisonResult (UITextPosition*, UITextPosition*)> { static auto sel() { return @selector (comparePosition:toPosition:); } };\r
+struct SignatureOffsetFromPositionToPosition : Signature<NSInteger (UITextPosition*, UITextPosition*)> { static auto sel() { return @selector (offsetFromPosition:toPosition:); } };\r
+struct SignaturePositionFromPositionInDirection : Signature<UITextPosition* (UITextPosition*, UITextLayoutDirection, NSInteger)> { static auto sel() { return @selector (positionFromPosition:inDirection:offset:); } };\r
+struct SignaturePositionFromPositionOffset : Signature<UITextPosition* (UITextPosition*, NSInteger)> { static auto sel() { return @selector (positionFromPosition:offset:); } };\r
+struct SignatureFirstRectForRange : Signature<CGRect (UITextRange*)> { static auto sel() { return @selector (firstRectForRange:); } };\r
+struct SignatureSelectionRectsForRange : Signature<NSArray<UITextSelectionRect*>* (UITextRange*)> { static auto sel() { return @selector (selectionRectsForRange:); } };\r
+struct SignaturePositionWithinRange : Signature<UITextPosition* (UITextRange*, UITextLayoutDirection)> { static auto sel() { return @selector (positionWithinRange:farthestInDirection:); } };\r
+struct SignatureReplaceRangeWithText : Signature<void (UITextRange*, NSString*)> { static auto sel() { return @selector (replaceRange:withText:); } };\r
+struct SignatureSetBaseWritingDirection : Signature<void (NSWritingDirection, UITextRange*)> { static auto sel() { return @selector (setBaseWritingDirection:forRange:); } };\r
+struct SignatureTextInRange : Signature<NSString* (UITextRange*)> { static auto sel() { return @selector (textInRange:); } };\r
+struct SignatureTextRangeFromPosition : Signature<UITextRange* (UITextPosition*, UITextPosition*)> { static auto sel() { return @selector (textRangeFromPosition:toPosition:); } };\r
+struct SignatureSetInputDelegate : Signature<void (id)> { static auto sel() { return @selector (setInputDelegate:); } };\r
+struct SignatureInputDelegate : Signature<id()> { static auto sel() { return @selector (inputDelegate); } };\r
+struct SignatureKeyboardType : Signature<UIKeyboardType()> { static auto sel() { return @selector (keyboardType); } };\r
+struct SignatureAutocapitalizationType : Signature<UITextAutocapitalizationType()> { static auto sel() { return @selector (autocapitalizationType); } };\r
+struct SignatureAutocorrectionType : Signature<UITextAutocorrectionType()> { static auto sel() { return @selector (autocorrectionType); } };\r
\r
//==============================================================================\r
class AccessibilityHandler::AccessibilityNativeImpl\r
\r
private:\r
//==============================================================================\r
- class AccessibilityContainer : public ObjCClass<UIAccessibilityElement>\r
+ class AccessibilityContainer : public AccessibleObjCClass<NSObject>\r
{\r
public:\r
AccessibilityContainer()\r
- : ObjCClass ("JUCEUIAccessibilityElementContainer_")\r
+ : AccessibleObjCClass ("JUCEUIAccessibilityContainer_")\r
{\r
- addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
- addMethod (@selector (accessibilityFrame), getAccessibilityFrame);\r
- addMethod (@selector (accessibilityElements), getAccessibilityElements);\r
+ addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return false; });\r
\r
- #if JUCE_IOS_CONTAINER_API_AVAILABLE\r
- if (@available (iOS 11.0, *))\r
- addMethod (@selector (accessibilityContainerType), getAccessibilityContainerType);\r
- #endif\r
+ addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return convertToCGRect (handler->getComponent().getScreenBounds());\r
\r
- addIvar<AccessibilityHandler*> ("handler");\r
+ return CGRectZero;\r
+ });\r
\r
- registerClass();\r
- }\r
+ addMethod (@selector (accessibilityElements), [] (id self, SEL) -> NSArray*\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return getContainerAccessibilityElements (*handler);\r
\r
- private:\r
- static AccessibilityHandler* getHandler (id self)\r
- {\r
- return getIvar<AccessibilityHandler*> (self, "handler");\r
- }\r
+ return nil;\r
+ });\r
\r
- static BOOL getIsAccessibilityElement (id, SEL)\r
- {\r
- return NO;\r
- }\r
+ if (@available (iOS 11.0, *))\r
+ {\r
+ addMethod (@selector (accessibilityDataTableCellElementForRow:column:), [] (id self, SEL, NSUInteger row, NSUInteger column) -> id\r
+ {\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column))\r
+ if (auto* parent = getAccessibleParent (cellHandler))\r
+ return static_cast<id> (parent->getNativeImplementation());\r
\r
- static CGRect getAccessibilityFrame (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return convertToCGRect (handler->getComponent().getScreenBounds());\r
+ return nil;\r
+ });\r
\r
- return CGRectZero;\r
- }\r
+ addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount);\r
+ addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount);\r
\r
- static NSArray* getAccessibilityElements (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return getContainerAccessibilityElements (*handler);\r
+ addMethod (@selector (accessibilityHeaderElementsForColumn:), [] (id self, SEL, NSUInteger column) -> NSArray*\r
+ {\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+ {\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ {\r
+ if (auto* header = tableInterface->getHeaderHandler())\r
+ {\r
+ if (isPositiveAndBelow (column, header->getChildren().size()))\r
+ {\r
+ auto* result = [NSMutableArray new];\r
+ [result addObject: static_cast<id> (header->getChildren()[(size_t) column]->getNativeImplementation())];\r
+ return result;\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
- return nil;\r
- }\r
+ return nullptr;\r
+ });\r
\r
- static NSInteger getAccessibilityContainerType (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- {\r
- if (handler->getTableInterface() != nullptr)\r
+ addProtocol (@protocol (UIAccessibilityContainerDataTable));\r
+\r
+ addMethod (@selector (accessibilityContainerType), [] (id self, SEL) -> NSInteger\r
{\r
- if (@available (iOS 11.0, *))\r
- return UIAccessibilityContainerTypeDataTable;\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (handler->getTableInterface() != nullptr)\r
+ {\r
+ if (@available (iOS 11.0, *))\r
+ return UIAccessibilityContainerTypeDataTable;\r
\r
- return 1; // UIAccessibilityContainerTypeDataTable\r
- }\r
+ return 1; // UIAccessibilityContainerTypeDataTable\r
+ }\r
\r
- const auto role = handler->getRole();\r
+ const auto handlerRole = handler->getRole();\r
+\r
+ if (handlerRole == AccessibilityRole::popupMenu\r
+ || handlerRole == AccessibilityRole::list\r
+ || handlerRole == AccessibilityRole::tree)\r
+ {\r
+ if (@available (iOS 11.0, *))\r
+ return UIAccessibilityContainerTypeList;\r
+\r
+ return 2; // UIAccessibilityContainerTypeList\r
+ }\r
+ }\r
\r
- if (role == AccessibilityRole::popupMenu\r
- || role == AccessibilityRole::list\r
- || role == AccessibilityRole::tree)\r
- {\r
if (@available (iOS 11.0, *))\r
- return UIAccessibilityContainerTypeList;\r
+ return UIAccessibilityContainerTypeNone;\r
\r
- return 2; // UIAccessibilityContainerTypeList\r
- }\r
+ return 0; // UIAccessibilityContainerTypeNone\r
+ });\r
}\r
\r
- if (@available (iOS 11.0, *))\r
- return UIAccessibilityContainerTypeNone;\r
+ registerClass();\r
+ }\r
\r
- return 0; // UIAccessibilityContainerTypeNone\r
+ private:\r
+ static const AccessibilityHandler* getAccessibleParent (const AccessibilityHandler* h)\r
+ {\r
+ if (h == nullptr)\r
+ return nullptr;\r
+\r
+ if ([static_cast<id> (h->getNativeImplementation()) isAccessibilityElement])\r
+ return h;\r
+\r
+ return getAccessibleParent (h->getParent());\r
+ }\r
+\r
+ static AccessibilityHandler* getHandler (id self)\r
+ {\r
+ return getIvar<AccessibilityHandler*> (self, "handler");\r
}\r
};\r
\r
//==============================================================================\r
class AccessibilityElement : public AccessibleObjCClass<UIAccessibilityElement>\r
{\r
+ template <typename Func, typename... Items>\r
+ static constexpr void forEach (Func&& func, Items&&... items)\r
+ {\r
+ (void) std::initializer_list<int> { ((void) func (std::forward<Items> (items)), 0)... };\r
+ }\r
+\r
public:\r
enum class Type { defaultElement, textElement };\r
\r
\r
id instance = (hasEditableText (handler) ? textCls : cls).createInstance();\r
\r
- Holder element ([instance initWithAccessibilityContainer: (id) handler.getComponent().getWindowHandle()]);\r
+ Holder element ([instance initWithAccessibilityContainer: static_cast<id> (handler.getComponent().getWindowHandle())]);\r
object_setInstanceVariable (element.get(), "handler", &handler);\r
return element;\r
}\r
\r
AccessibilityElement (Type elementType)\r
{\r
- addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
- addMethod (@selector (accessibilityContainer), getAccessibilityContainer);\r
- addMethod (@selector (accessibilityFrame), getAccessibilityFrame);\r
- addMethod (@selector (accessibilityTraits), getAccessibilityTraits);\r
- addMethod (@selector (accessibilityLabel), getAccessibilityTitle);\r
- addMethod (@selector (accessibilityHint), getAccessibilityHelp);\r
- addMethod (@selector (accessibilityValue), getAccessibilityValue);\r
- addMethod (@selector (setAccessibilityValue:), setAccessibilityValue);\r
-\r
- addMethod (@selector (accessibilityElementDidBecomeFocused), onFocusGain);\r
- addMethod (@selector (accessibilityElementDidLoseFocus), onFocusLoss);\r
- addMethod (@selector (accessibilityElementIsFocused), isFocused);\r
- addMethod (@selector (accessibilityViewIsModal), getIsAccessibilityModal);\r
-\r
- addMethod (@selector (accessibilityActivate), accessibilityPerformActivate);\r
- addMethod (@selector (accessibilityIncrement), accessibilityPerformIncrement);\r
- addMethod (@selector (accessibilityDecrement), accessibilityPerformDecrement);\r
- addMethod (@selector (accessibilityPerformEscape), accessibilityPerformEscape);\r
-\r
- #if JUCE_IOS_CONTAINER_API_AVAILABLE\r
- if (@available (iOS 11.0, *))\r
- {\r
- addMethod (@selector (accessibilityDataTableCellElementForRow:column:), getAccessibilityDataTableCellElementForRowColumn);\r
- addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount);\r
- addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount);\r
- addProtocol (@protocol (UIAccessibilityContainerDataTable));\r
-\r
- addMethod (@selector (accessibilityRowRange), getAccessibilityRowIndexRange);\r
- addMethod (@selector (accessibilityColumnRange), getAccessibilityColumnIndexRange);\r
- addProtocol (@protocol (UIAccessibilityContainerDataTableCell));\r
- }\r
- #endif\r
-\r
- if (elementType == Type::textElement)\r
+ addMethod (@selector (isAccessibilityElement), [] (id self, SEL)\r
{\r
- addMethod (@selector (accessibilityLineNumberForPoint:), getAccessibilityLineNumberForPoint);\r
- addMethod (@selector (accessibilityContentForLineNumber:), getAccessibilityContentForLineNumber);\r
- addMethod (@selector (accessibilityFrameForLineNumber:), getAccessibilityFrameForLineNumber);\r
- addMethod (@selector (accessibilityPageContent), getAccessibilityPageContent);\r
+ auto* handler = getHandler (self);\r
\r
- addProtocol (@protocol (UIAccessibilityReadingContent));\r
- }\r
+ const auto hasAccessiblePropertiesOrIsTableCell = [] (auto& handlerRef)\r
+ {\r
+ const auto isTableCell = [&]\r
+ {\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (&handlerRef, &AccessibilityHandler::getTableInterface))\r
+ {\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ {\r
+ return tableInterface->getRowSpan (handlerRef).hasValue()\r
+ && tableInterface->getColumnSpan (handlerRef).hasValue();\r
+ }\r
+ }\r
\r
- addIvar<UIAccessibilityElement*> ("container");\r
+ return false;\r
+ };\r
\r
- registerClass();\r
- }\r
+ return handlerRef.getTitle().isNotEmpty()\r
+ || handlerRef.getHelp().isNotEmpty()\r
+ || handlerRef.getTextInterface() != nullptr\r
+ || handlerRef.getValueInterface() != nullptr\r
+ || isTableCell();\r
+ };\r
\r
- private:\r
- //==============================================================================\r
- static UIAccessibilityElement* getContainer (id self)\r
- {\r
- return getIvar<UIAccessibilityElement*> (self, "container");\r
- }\r
+ return handler != nullptr\r
+ && ! handler->isIgnored()\r
+ && handler->getRole() != AccessibilityRole::window\r
+ && hasAccessiblePropertiesOrIsTableCell (*handler);\r
+ });\r
\r
- //==============================================================================\r
- static id getAccessibilityContainer (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityContainer), [] (id self, SEL) -> id\r
{\r
- if (handler->getComponent().isOnDesktop())\r
- return (id) handler->getComponent().getWindowHandle();\r
-\r
- if (handler->getChildren().size() > 0)\r
+ if (auto* handler = getHandler (self))\r
{\r
- if (UIAccessibilityElement* container = getContainer (self))\r
- return container;\r
+ if (handler->getComponent().isOnDesktop())\r
+ return static_cast<id> (handler->getComponent().getWindowHandle());\r
\r
- static AccessibilityContainer cls;\r
-\r
- id windowHandle = (id) handler->getComponent().getWindowHandle();\r
- UIAccessibilityElement* container = [cls.createInstance() initWithAccessibilityContainer: windowHandle];\r
+ if (! handler->getChildren().empty())\r
+ {\r
+ if (UIAccessibilityElement* container = getContainer (self))\r
+ return container;\r
\r
- [container retain];\r
+ static AccessibilityContainer cls;\r
\r
- object_setInstanceVariable (container, "handler", handler);\r
- object_setInstanceVariable (self, "container", container);\r
+ id container = cls.createInstance();\r
\r
- return container;\r
- }\r
+ object_setInstanceVariable (container, "handler", handler);\r
+ object_setInstanceVariable (self, "container", container);\r
\r
- if (auto* parent = handler->getParent())\r
- return [(id) parent->getNativeImplementation() accessibilityContainer];\r
- }\r
+ return container;\r
+ }\r
\r
- return nil;\r
- }\r
+ if (auto* parent = handler->getParent())\r
+ return [static_cast<id> (parent->getNativeImplementation()) accessibilityContainer];\r
+ }\r
\r
- static CGRect getAccessibilityFrame (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return convertToCGRect (handler->getComponent().getScreenBounds());\r
+ return nil;\r
+ });\r
\r
- return CGRectZero;\r
- }\r
+ addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return convertToCGRect (handler->getComponent().getScreenBounds());\r
\r
- static UIAccessibilityTraits getAccessibilityTraits (id self, SEL)\r
- {\r
- auto traits = UIAccessibilityTraits{};\r
+ return CGRectZero;\r
+ });\r
\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityTraits), [] (id self, SEL)\r
{\r
- traits |= [&handler]\r
+ auto traits = UIAccessibilityTraits{};\r
+\r
+ if (auto* handler = getHandler (self))\r
{\r
- switch (handler->getRole())\r
+ traits |= [&handler]\r
{\r
- case AccessibilityRole::button:\r
- case AccessibilityRole::toggleButton:\r
- case AccessibilityRole::radioButton:\r
- case AccessibilityRole::comboBox: return UIAccessibilityTraitButton;\r
-\r
- case AccessibilityRole::label:\r
- case AccessibilityRole::staticText: return UIAccessibilityTraitStaticText;\r
-\r
- case AccessibilityRole::image: return UIAccessibilityTraitImage;\r
- case AccessibilityRole::tableHeader: return UIAccessibilityTraitHeader;\r
- case AccessibilityRole::hyperlink: return UIAccessibilityTraitLink;\r
- case AccessibilityRole::editableText: return UIAccessibilityTraitKeyboardKey;\r
- case AccessibilityRole::ignored: return UIAccessibilityTraitNotEnabled;\r
-\r
- case AccessibilityRole::slider:\r
- case AccessibilityRole::menuItem:\r
- case AccessibilityRole::menuBar:\r
- case AccessibilityRole::popupMenu:\r
- case AccessibilityRole::table:\r
- case AccessibilityRole::column:\r
- case AccessibilityRole::row:\r
- case AccessibilityRole::cell:\r
- case AccessibilityRole::list:\r
- case AccessibilityRole::listItem:\r
- case AccessibilityRole::tree:\r
- case AccessibilityRole::treeItem:\r
- case AccessibilityRole::progressBar:\r
- case AccessibilityRole::group:\r
- case AccessibilityRole::dialogWindow:\r
- case AccessibilityRole::window:\r
- case AccessibilityRole::scrollBar:\r
- case AccessibilityRole::tooltip:\r
- case AccessibilityRole::splashScreen:\r
- case AccessibilityRole::unspecified: break;\r
- }\r
+ switch (handler->getRole())\r
+ {\r
+ case AccessibilityRole::button:\r
+ case AccessibilityRole::toggleButton:\r
+ case AccessibilityRole::radioButton:\r
+ case AccessibilityRole::comboBox: return UIAccessibilityTraitButton;\r
+\r
+ case AccessibilityRole::label:\r
+ case AccessibilityRole::staticText: return UIAccessibilityTraitStaticText;\r
+\r
+ case AccessibilityRole::image: return UIAccessibilityTraitImage;\r
+ case AccessibilityRole::tableHeader: return UIAccessibilityTraitHeader;\r
+ case AccessibilityRole::hyperlink: return UIAccessibilityTraitLink;\r
+ case AccessibilityRole::ignored: return UIAccessibilityTraitNotEnabled;\r
+\r
+ case AccessibilityRole::editableText: return UIAccessibilityTraitKeyboardKey;\r
+\r
+ case AccessibilityRole::slider:\r
+ case AccessibilityRole::menuItem:\r
+ case AccessibilityRole::menuBar:\r
+ case AccessibilityRole::popupMenu:\r
+ case AccessibilityRole::table:\r
+ case AccessibilityRole::column:\r
+ case AccessibilityRole::row:\r
+ case AccessibilityRole::cell:\r
+ case AccessibilityRole::list:\r
+ case AccessibilityRole::listItem:\r
+ case AccessibilityRole::tree:\r
+ case AccessibilityRole::treeItem:\r
+ case AccessibilityRole::progressBar:\r
+ case AccessibilityRole::group:\r
+ case AccessibilityRole::dialogWindow:\r
+ case AccessibilityRole::window:\r
+ case AccessibilityRole::scrollBar:\r
+ case AccessibilityRole::tooltip:\r
+ case AccessibilityRole::splashScreen:\r
+ case AccessibilityRole::unspecified: break;\r
+ }\r
\r
- return UIAccessibilityTraitNone;\r
- }();\r
+ return UIAccessibilityTraitNone;\r
+ }();\r
\r
- const auto state = handler->getCurrentState();\r
+ const auto state = handler->getCurrentState();\r
\r
- if (state.isSelected() || state.isChecked())\r
- traits |= UIAccessibilityTraitSelected;\r
+ if (state.isSelected() || state.isChecked())\r
+ traits |= UIAccessibilityTraitSelected;\r
\r
- if (auto* valueInterface = getValueInterface (self))\r
- if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid())\r
- traits |= UIAccessibilityTraitAdjustable;\r
- }\r
+ if (auto* valueInterface = getValueInterface (self))\r
+ if (! valueInterface->isReadOnly() && valueInterface->getRange().isValid())\r
+ traits |= UIAccessibilityTraitAdjustable;\r
+ }\r
\r
- return traits | sendSuperclassMessage<UIAccessibilityTraits> (self, @selector (accessibilityTraits));\r
- }\r
+ return traits | sendSuperclassMessage<UIAccessibilityTraits> (self, @selector (accessibilityTraits));\r
+ });\r
\r
- static NSString* getAccessibilityValue (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityLabel), getAccessibilityTitle);\r
+ addMethod (@selector (accessibilityHint), getAccessibilityHelp);\r
+\r
+ addMethod (@selector (accessibilityValue), [] (id self, SEL) -> NSString*\r
{\r
- if (handler->getCurrentState().isCheckable())\r
- return handler->getCurrentState().isChecked() ? @"1" : @"0";\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (handler->getCurrentState().isCheckable())\r
+ return handler->getCurrentState().isChecked() ? @"1" : @"0";\r
\r
- return (NSString*) getAccessibilityValueFromInterfaces (*handler);\r
- }\r
+ return (NSString*) getAccessibilityValueFromInterfaces (*handler);\r
+ }\r
\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- static void onFocusGain (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (setAccessibilityValue:), setAccessibilityValue);\r
+\r
+ addMethod (@selector (accessibilityElementDidBecomeFocused), [] (id self, SEL)\r
{\r
- const WeakReference<Component> safeComponent (&handler->getComponent());\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ const WeakReference<Component> safeComponent (&handler->getComponent());\r
\r
- performActionIfSupported (self, AccessibilityActionType::focus);\r
+ performActionIfSupported (self, AccessibilityActionType::focus);\r
\r
- if (safeComponent != nullptr)\r
- handler->grabFocus();\r
- }\r
- }\r
+ if (safeComponent != nullptr)\r
+ handler->grabFocus();\r
+ }\r
+ });\r
\r
- static void onFocusLoss (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- handler->giveAwayFocus();\r
- }\r
+ addMethod (@selector (accessibilityElementDidLoseFocus), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ handler->giveAwayFocus();\r
+ });\r
\r
- static BOOL isFocused (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return handler->hasFocus (false);\r
+ addMethod (@selector (accessibilityElementIsFocused), [] (id self, SEL) -> BOOL\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return handler->hasFocus (false);\r
\r
- return NO;\r
- }\r
+ return NO;\r
+ });\r
\r
- static BOOL accessibilityPerformActivate (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityViewIsModal), getIsAccessibilityModal);\r
+\r
+ addMethod (@selector (accessibilityActivate), [] (id self, SEL)\r
{\r
- // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
- // which element it thinks has focus and forward the event on to that element if it differs\r
- id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
+ // which element it thinks has focus and forward the event on to that element if it differs\r
+ id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
\r
- if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
- return [focusedElement accessibilityActivate];\r
+ if (focusedElement != nullptr && ! [static_cast<id> (handler->getNativeImplementation()) isEqual: focusedElement])\r
+ return [focusedElement accessibilityActivate];\r
\r
- if (handler->hasFocus (false))\r
- return accessibilityPerformPress (self, {});\r
- }\r
+ if (handler->hasFocus (false))\r
+ return accessibilityPerformPress (self, {});\r
+ }\r
\r
- return NO;\r
- }\r
+ return NO;\r
+ });\r
\r
- static BOOL accessibilityPerformEscape (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityIncrement), accessibilityPerformIncrement);\r
+ addMethod (@selector (accessibilityDecrement), accessibilityPerformDecrement);\r
+\r
+ addMethod (@selector (accessibilityPerformEscape), [] (id self, SEL)\r
{\r
- if (auto* modal = Component::getCurrentlyModalComponent())\r
+ if (auto* handler = getHandler (self))\r
{\r
- if (auto* modalHandler = modal->getAccessibilityHandler())\r
+ if (auto* modal = Component::getCurrentlyModalComponent())\r
{\r
- if (modalHandler == handler || modalHandler->isParentOf (handler))\r
+ if (auto* modalHandler = modal->getAccessibilityHandler())\r
{\r
- modal->exitModalState (0);\r
- return YES;\r
+ if (modalHandler == handler || modalHandler->isParentOf (handler))\r
+ {\r
+ modal->exitModalState (0);\r
+ return YES;\r
+ }\r
}\r
}\r
}\r
+\r
+ return NO;\r
+ });\r
+\r
+ if (elementType == Type::textElement)\r
+ {\r
+ addMethod (@selector (deleteBackward), [] (id, SEL) {});\r
+ addMethod (@selector (insertText:), [] (id, SEL, NSString*) {});\r
+\r
+ forEach ([this] (auto signature) { addPassthroughMethodWithSignature (signature); },\r
+ SignatureHasText{},\r
+ SignatureSetSelectedTextRange{},\r
+ SignatureSelectedTextRange{},\r
+ SignatureMarkedTextRange{},\r
+ SignatureSetMarkedTextSelectedRange{},\r
+ SignatureUnmarkText{},\r
+ SignatureMarkedTextStyle{},\r
+ SignatureSetMarkedTextStyle{},\r
+ SignatureBeginningOfDocument{},\r
+ SignatureEndOfDocument{},\r
+ SignatureTokenizer{},\r
+ SignatureBaseWritingDirection{},\r
+ SignatureCaretRectForPosition{},\r
+ SignatureCharacterRangeByExtending{},\r
+ SignatureCharacterRangeAtPoint{},\r
+ SignatureClosestPositionToPoint{},\r
+ SignatureClosestPositionToPointInRange{},\r
+ SignatureComparePositionToPosition{},\r
+ SignatureOffsetFromPositionToPosition{},\r
+ SignaturePositionFromPositionInDirection{},\r
+ SignaturePositionFromPositionOffset{},\r
+ SignatureFirstRectForRange{},\r
+ SignatureSelectionRectsForRange{},\r
+ SignaturePositionWithinRange{},\r
+ SignatureReplaceRangeWithText{},\r
+ SignatureSetBaseWritingDirection{},\r
+ SignatureTextInRange{},\r
+ SignatureTextRangeFromPosition{},\r
+ SignatureSetInputDelegate{},\r
+ SignatureInputDelegate{},\r
+ SignatureKeyboardType{},\r
+ SignatureAutocapitalizationType{},\r
+ SignatureAutocorrectionType{});\r
+\r
+ addProtocol (@protocol (UITextInput));\r
+ }\r
+\r
+ if (@available (iOS 11.0, *))\r
+ {\r
+ addMethod (@selector (accessibilityRowRange), getAccessibilityRowIndexRange);\r
+ addMethod (@selector (accessibilityColumnRange), getAccessibilityColumnIndexRange);\r
+ addProtocol (@protocol (UIAccessibilityContainerDataTableCell));\r
}\r
\r
- return NO;\r
+ addIvar<UIAccessibilityElement*> ("container");\r
+\r
+ registerClass();\r
}\r
\r
- static id getAccessibilityDataTableCellElementForRowColumn (id self, SEL, NSUInteger row, NSUInteger column)\r
+ private:\r
+ template <typename Result>\r
+ static auto getResult (NSInvocation* invocation, detail::Tag<Result>)\r
{\r
- if (auto* tableInterface = getEnclosingInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
- if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column))\r
- return (id) cellHandler->getNativeImplementation();\r
-\r
- return nil;\r
+ Result result{};\r
+ [invocation getReturnValue: &result];\r
+ return result;\r
}\r
\r
- static NSInteger getAccessibilityLineNumberForPoint (id self, SEL, CGPoint point)\r
+ static void getResult (NSInvocation*, detail::Tag<void>) {}\r
+\r
+ template <typename HasSelector, typename Result, typename... Args>\r
+ auto makePassthroughCallback (HasSelector, Signature<Result (Args...)>)\r
{\r
- if (auto* handler = getHandler (self))\r
+ return [] (id self, SEL, Args... args) -> Result\r
{\r
- if (auto* textInterface = handler->getTextInterface())\r
+ if (auto* input = getPeerTextInput (self))\r
{\r
- auto pointInt = roundToIntPoint (point);\r
+ const auto s = detail::makeCompileTimeStr (@encode (Result), @encode (id), @encode (SEL), @encode (Args)...);\r
+ const auto signature = [NSMethodSignature signatureWithObjCTypes: s.data()];\r
+ const auto invocation = [NSInvocation invocationWithMethodSignature: signature];\r
+ invocation.selector = HasSelector::sel();\r
\r
- if (handler->getComponent().getScreenBounds().contains (pointInt))\r
- {\r
- auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() });\r
+ // Indices 0 and 1 are 'id self' and 'SEL _cmd' respectively\r
+ auto counter = 2;\r
+ forEach ([&] (auto& arg) { [invocation setArgument: &arg atIndex: counter++]; }, args...);\r
\r
- for (int i = 0; i < textBounds.getNumRectangles(); ++i)\r
- if (textBounds.getRectangle (i).contains (pointInt))\r
- return (NSInteger) i;\r
- }\r
+ [invocation invokeWithTarget: input];\r
+\r
+ return getResult (invocation, detail::Tag<Result>{});\r
}\r
- }\r
\r
- return NSNotFound;\r
+ jassertfalse;\r
+ return {};\r
+ };\r
}\r
\r
- static NSString* getAccessibilityContentForLineNumber (id self, SEL, NSInteger lineNumber)\r
+ template <typename Signature>\r
+ void addPassthroughMethodWithSignature (Signature signature)\r
{\r
- if (auto* textInterface = getTextInterface (self))\r
- {\r
- auto lines = StringArray::fromLines (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }));\r
-\r
- if ((int) lineNumber < lines.size())\r
- return juceStringToNS (lines[(int) lineNumber]);\r
- }\r
-\r
- return nil;\r
+ addMethod (Signature::sel(), makePassthroughCallback (signature, signature));\r
}\r
\r
- static CGRect getAccessibilityFrameForLineNumber (id self, SEL, NSInteger lineNumber)\r
+ static UIAccessibilityElement* getContainer (id self)\r
{\r
- if (auto* textInterface = getTextInterface (self))\r
- {\r
- auto textBounds = textInterface->getTextBounds ({ 0, textInterface->getTotalNumCharacters() });\r
+ return getIvar<UIAccessibilityElement*> (self, "container");\r
+ }\r
\r
- if (lineNumber < textBounds.getNumRectangles())\r
- return convertToCGRect (textBounds.getRectangle ((int) lineNumber));\r
- }\r
+ static UIViewComponentPeer* getPeer (id self)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return static_cast<UIViewComponentPeer*> (handler->getComponent().getPeer());\r
\r
- return CGRectZero;\r
+ return nil;\r
}\r
\r
- static NSString* getAccessibilityPageContent (id self, SEL)\r
+ static JuceTextView* getPeerTextInput (id self)\r
{\r
- if (auto* textInterface = getTextInterface (self))\r
- return juceStringToNS (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }));\r
+ if (auto* peer = getPeer (self))\r
+ return peer->hiddenTextInput.get();\r
\r
return nil;\r
}\r
const bool moveToHandler = (eventType == InternalAccessibilityEvent::focusChanged && handler.hasFocus (false));\r
\r
sendAccessibilityEvent (notification,\r
- moveToHandler ? (id) handler.getNativeImplementation() : nil);\r
+ moveToHandler ? static_cast<id> (handler.getNativeImplementation()) : nil);\r
}\r
-\r
}\r
\r
void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventType) const\r
}();\r
\r
if (notification != UIAccessibilityNotifications{})\r
- sendAccessibilityEvent (notification, (id) getNativeImplementation());\r
+ sendAccessibilityEvent (notification, static_cast<id> (getNativeImplementation()));\r
}\r
\r
void AccessibilityHandler::postAnnouncement (const String& announcementString, AnnouncementPriority)\r
namespace juce\r
{\r
\r
-#if ! defined (MAC_OS_X_VERSION_10_13) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_13\r
- using NSAccessibilityRole = NSString*;\r
- using NSAccessibilityNotificationName = NSString*;\r
-#endif\r
-\r
#define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1\r
\r
//==============================================================================\r
private:\r
AccessibilityElement()\r
{\r
- addMethod (@selector (accessibilityNotifiesWhenDestroyed), getAccessibilityNotifiesWhenDestroyed);\r
- addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
- addMethod (@selector (isAccessibilityEnabled), getIsAccessibilityEnabled);\r
+ addMethod (@selector (accessibilityNotifiesWhenDestroyed), [] (id, SEL) { return YES; });\r
+ addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
+\r
+ addMethod (@selector (isAccessibilityEnabled), [] (id self, SEL) -> BOOL\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return handler->getComponent().isEnabled();\r
+\r
+ return NO;\r
+ });\r
+\r
addMethod (@selector (accessibilityWindow), getAccessibilityWindow);\r
addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow);\r
- addMethod (@selector (accessibilityFocusedUIElement), getAccessibilityFocusedUIElement);\r
- addMethod (@selector (accessibilityHitTest:), accessibilityHitTest);\r
- addMethod (@selector (accessibilityParent), getAccessibilityParent);\r
addMethod (@selector (accessibilityChildren), getAccessibilityChildren);\r
- addMethod (@selector (isAccessibilityFocused), getIsAccessibilityFocused);\r
- addMethod (@selector (setAccessibilityFocused:), setAccessibilityFocused);\r
addMethod (@selector (isAccessibilityModal), getIsAccessibilityModal);\r
- addMethod (@selector (accessibilityFrame), getAccessibilityFrame);\r
- addMethod (@selector (accessibilityRole), getAccessibilityRole);\r
- addMethod (@selector (accessibilitySubrole), getAccessibilitySubrole);\r
- addMethod (@selector (accessibilityTitle), getAccessibilityTitle);\r
- addMethod (@selector (accessibilityLabel), getAccessibilityLabel);\r
- addMethod (@selector (accessibilityHelp), getAccessibilityHelp);\r
- addMethod (@selector (accessibilityValue), getAccessibilityValue);\r
- addMethod (@selector (setAccessibilityValue:), setAccessibilityValue);\r
- addMethod (@selector (accessibilitySelectedChildren), getAccessibilitySelectedChildren);\r
- addMethod (@selector (setAccessibilitySelectedChildren:), setAccessibilitySelectedChildren);\r
- addMethod (@selector (accessibilityOrientation), getAccessibilityOrientation);\r
-\r
- addMethod (@selector (accessibilityInsertionPointLineNumber), getAccessibilityInsertionPointLineNumber);\r
- addMethod (@selector (accessibilityVisibleCharacterRange), getAccessibilityVisibleCharacterRange);\r
- addMethod (@selector (accessibilityNumberOfCharacters), getAccessibilityNumberOfCharacters);\r
- addMethod (@selector (accessibilitySelectedText), getAccessibilitySelectedText);\r
- addMethod (@selector (accessibilitySelectedTextRange), getAccessibilitySelectedTextRange);\r
- addMethod (@selector (accessibilityAttributedStringForRange:), getAccessibilityAttributedStringForRange);\r
- addMethod (@selector (accessibilityRangeForLine:), getAccessibilityRangeForLine);\r
- addMethod (@selector (accessibilityStringForRange:), getAccessibilityStringForRange);\r
- addMethod (@selector (accessibilityRangeForPosition:), getAccessibilityRangeForPosition);\r
- addMethod (@selector (accessibilityRangeForIndex:), getAccessibilityRangeForIndex);\r
- addMethod (@selector (accessibilityFrameForRange:), getAccessibilityFrameForRange);\r
- addMethod (@selector (accessibilityLineForIndex:), getAccessibilityLineForIndex);\r
- addMethod (@selector (setAccessibilitySelectedTextRange:), setAccessibilitySelectedTextRange);\r
-\r
- addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount);\r
- addMethod (@selector (accessibilityRows), getAccessibilityRows);\r
- addMethod (@selector (accessibilitySelectedRows), getAccessibilitySelectedRows);\r
- addMethod (@selector (setAccessibilitySelectedRows:), setAccessibilitySelectedRows);\r
- addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount);\r
- addMethod (@selector (accessibilityColumns), getAccessibilityColumns);\r
- addMethod (@selector (accessibilitySelectedColumns), getAccessibilitySelectedColumns);\r
- addMethod (@selector (setAccessibilitySelectedColumns:), setAccessibilitySelectedColumns);\r
\r
- addMethod (@selector (accessibilityRowIndexRange), getAccessibilityRowIndexRange);\r
- addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange);\r
- addMethod (@selector (accessibilityIndex), getAccessibilityIndex);\r
- addMethod (@selector (accessibilityDisclosureLevel), getAccessibilityDisclosureLevel);\r
- addMethod (@selector (isAccessibilityExpanded), getIsAccessibilityExpanded);\r
+ addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL) -> id\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (auto* modal = Component::getCurrentlyModalComponent())\r
+ {\r
+ const auto& handlerComponent = handler->getComponent();\r
\r
- addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement);\r
- addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement);\r
- addMethod (@selector (accessibilityPerformDelete), accessibilityPerformDelete);\r
- addMethod (@selector (accessibilityPerformPress), accessibilityPerformPress);\r
- addMethod (@selector (accessibilityPerformShowMenu), accessibilityPerformShowMenu);\r
- addMethod (@selector (accessibilityPerformRaise), accessibilityPerformRaise);\r
+ if (! handlerComponent.isParentOf (modal)\r
+ && handlerComponent.isCurrentlyBlockedByAnotherModalComponent())\r
+ {\r
+ if (auto* modalHandler = modal->getAccessibilityHandler())\r
+ {\r
+ if (auto* focusChild = modalHandler->getChildFocus())\r
+ return static_cast<id> (focusChild->getNativeImplementation());\r
\r
- addMethod (@selector (isAccessibilitySelectorAllowed:), getIsAccessibilitySelectorAllowed);\r
+ return static_cast<id> (modalHandler->getNativeImplementation());\r
+ }\r
+ }\r
+ }\r
\r
- #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
- addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren);\r
- #endif\r
+ if (auto* focusChild = handler->getChildFocus())\r
+ return static_cast<id> (focusChild->getNativeImplementation());\r
+ }\r
\r
- registerClass();\r
- }\r
+ return nil;\r
+ });\r
\r
- //==============================================================================\r
- static bool isSelectable (AccessibleState state) noexcept\r
- {\r
- return state.isSelectable() || state.isMultiSelectable();\r
- }\r
+ addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point) -> id\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point))))\r
+ return static_cast<id> (child->getNativeImplementation());\r
\r
- static NSArray* getSelectedChildren (NSArray* children)\r
- {\r
- NSMutableArray* selected = [[NSMutableArray new] autorelease];\r
+ return self;\r
+ }\r
\r
- for (id child in children)\r
+ return nil;\r
+ });\r
+\r
+ addMethod (@selector (accessibilityParent), [] (id self, SEL) -> id\r
{\r
- if (auto* handler = getHandler (child))\r
+ if (auto* handler = getHandler (self))\r
{\r
- const auto currentState = handler->getCurrentState();\r
+ if (auto* parentHandler = handler->getParent())\r
+ return NSAccessibilityUnignoredAncestor (static_cast<id> (parentHandler->getNativeImplementation()));\r
\r
- if (isSelectable (currentState) && currentState.isSelected())\r
- [selected addObject: child];\r
+ return NSAccessibilityUnignoredAncestor (static_cast<id> (handler->getComponent().getWindowHandle()));\r
}\r
- }\r
\r
- return selected;\r
- }\r
+ return nil;\r
+ });\r
\r
- static void setSelectedChildren (NSArray* children, NSArray* selected)\r
- {\r
- for (id child in children)\r
+ addMethod (@selector (isAccessibilityFocused), [] (id self, SEL)\r
{\r
- if (auto* handler = getHandler (child))\r
- {\r
- const auto currentState = handler->getCurrentState();\r
- const BOOL isSelected = [selected containsObject: child];\r
+ return [[self accessibilityWindow] accessibilityFocusedUIElement] == self;\r
+ });\r
\r
- if (isSelectable (currentState))\r
+ addMethod (@selector (setAccessibilityFocused:), [] (id self, SEL, BOOL focused)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (focused)\r
{\r
- if (currentState.isSelected() != isSelected)\r
- handler->getActions().invoke (AccessibilityActionType::toggle);\r
+ const WeakReference<Component> safeComponent (&handler->getComponent());\r
+\r
+ performActionIfSupported (self, AccessibilityActionType::focus);\r
+\r
+ if (safeComponent != nullptr)\r
+ handler->grabFocus();\r
}\r
- else if (currentState.isFocusable())\r
+ else\r
{\r
- [child setAccessibilityFocused: isSelected];\r
+ handler->giveAwayFocus();\r
}\r
}\r
- }\r
- }\r
+ });\r
\r
- //==============================================================================\r
- static BOOL getAccessibilityNotifiesWhenDestroyed (id, SEL) { return YES; }\r
+ addMethod (@selector (accessibilityFrame), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds()));\r
\r
- static BOOL getIsAccessibilityEnabled (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return handler->getComponent().isEnabled();\r
+ return NSZeroRect;\r
+ });\r
\r
- return NO;\r
- }\r
+ addMethod (@selector (accessibilityRole), [] (id self, SEL) -> NSAccessibilityRole\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ switch (handler->getRole())\r
+ {\r
+ case AccessibilityRole::popupMenu:\r
+ case AccessibilityRole::tooltip:\r
+ case AccessibilityRole::splashScreen:\r
+ case AccessibilityRole::dialogWindow:\r
+ case AccessibilityRole::window: return NSAccessibilityWindowRole;\r
+\r
+ case AccessibilityRole::tableHeader:\r
+ case AccessibilityRole::unspecified:\r
+ case AccessibilityRole::group: return NSAccessibilityGroupRole;\r
+\r
+ case AccessibilityRole::label:\r
+ case AccessibilityRole::staticText: return NSAccessibilityStaticTextRole;\r
+\r
+ case AccessibilityRole::tree:\r
+ case AccessibilityRole::list: return NSAccessibilityOutlineRole;\r
+\r
+ case AccessibilityRole::listItem:\r
+ case AccessibilityRole::treeItem: return NSAccessibilityRowRole;\r
+\r
+ case AccessibilityRole::button: return NSAccessibilityButtonRole;\r
+ case AccessibilityRole::toggleButton: return NSAccessibilityCheckBoxRole;\r
+ case AccessibilityRole::radioButton: return NSAccessibilityRadioButtonRole;\r
+ case AccessibilityRole::comboBox: return NSAccessibilityPopUpButtonRole;\r
+ case AccessibilityRole::image: return NSAccessibilityImageRole;\r
+ case AccessibilityRole::slider: return NSAccessibilitySliderRole;\r
+ case AccessibilityRole::editableText: return NSAccessibilityTextAreaRole;\r
+ case AccessibilityRole::menuItem: return NSAccessibilityMenuItemRole;\r
+ case AccessibilityRole::menuBar: return NSAccessibilityMenuRole;\r
+ case AccessibilityRole::table: return NSAccessibilityOutlineRole;\r
+ case AccessibilityRole::column: return NSAccessibilityColumnRole;\r
+ case AccessibilityRole::row: return NSAccessibilityRowRole;\r
+ case AccessibilityRole::cell: return NSAccessibilityCellRole;\r
+ case AccessibilityRole::hyperlink: return NSAccessibilityLinkRole;\r
+ case AccessibilityRole::progressBar: return NSAccessibilityProgressIndicatorRole;\r
+ case AccessibilityRole::scrollBar: return NSAccessibilityScrollBarRole;\r
+\r
+ case AccessibilityRole::ignored: break;\r
+ }\r
\r
- static id getAccessibilityWindow (id self, SEL)\r
- {\r
- return [[self accessibilityParent] accessibilityWindow];\r
- }\r
+ return NSAccessibilityUnknownRole;\r
+ }\r
\r
- static id getAccessibilityFocusedUIElement (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ return nil;\r
+ });\r
+\r
+ addMethod (@selector (accessibilitySubrole), [] (id self, SEL)\r
{\r
- if (auto* modal = Component::getCurrentlyModalComponent())\r
+ if (auto* handler = getHandler (self))\r
{\r
- const auto& component = handler->getComponent();\r
+ if (auto* textInterface = getTextInterface (self))\r
+ if (textInterface->isDisplayingProtectedText())\r
+ return NSAccessibilitySecureTextFieldSubrole;\r
+\r
+ const auto handlerRole = handler->getRole();\r
+\r
+ if (handlerRole == AccessibilityRole::window) return NSAccessibilityStandardWindowSubrole;\r
+ if (handlerRole == AccessibilityRole::dialogWindow) return NSAccessibilityDialogSubrole;\r
+ if (handlerRole == AccessibilityRole::tooltip\r
+ || handlerRole == AccessibilityRole::splashScreen) return NSAccessibilityFloatingWindowSubrole;\r
+ if (handlerRole == AccessibilityRole::toggleButton) return NSAccessibilityToggleSubrole;\r
+ if (handlerRole == AccessibilityRole::treeItem\r
+ || handlerRole == AccessibilityRole::listItem) return NSAccessibilityOutlineRowSubrole;\r
+ if (handlerRole == AccessibilityRole::row && getCellInterface (self) != nullptr) return NSAccessibilityTableRowSubrole;\r
\r
- if (! component.isParentOf (modal)\r
- && component.isCurrentlyBlockedByAnotherModalComponent())\r
+ const auto& handlerComponent = handler->getComponent();\r
+\r
+ if (auto* documentWindow = handlerComponent.findParentComponentOfClass<DocumentWindow>())\r
{\r
- if (auto* modalHandler = modal->getAccessibilityHandler())\r
+ if (handlerRole == AccessibilityRole::button)\r
{\r
- if (auto* focusChild = modalHandler->getChildFocus())\r
- return (id) focusChild->getNativeImplementation();\r
-\r
- return (id) modalHandler->getNativeImplementation();\r
+ if (&handlerComponent == documentWindow->getCloseButton()) return NSAccessibilityCloseButtonSubrole;\r
+ if (&handlerComponent == documentWindow->getMinimiseButton()) return NSAccessibilityMinimizeButtonSubrole;\r
+ if (&handlerComponent == documentWindow->getMaximiseButton()) return NSAccessibilityFullScreenButtonSubrole;\r
}\r
}\r
}\r
\r
- if (auto* focusChild = handler->getChildFocus())\r
- return (id) focusChild->getNativeImplementation();\r
- }\r
-\r
- return nil;\r
- }\r
+ return NSAccessibilityUnknownRole;\r
+ });\r
\r
- static id accessibilityHitTest (id self, SEL, NSPoint point)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityLabel), [] (id self, SEL) -> NSString*\r
{\r
- if (auto* child = handler->getChildAt (roundToIntPoint (flippedScreenPoint (point))))\r
- return (id) child->getNativeImplementation();\r
+ if (auto* handler = getHandler (self))\r
+ return juceStringToNS (handler->getDescription());\r
\r
- return self;\r
- }\r
-\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- static id getAccessibilityParent (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityValue), [] (id self, SEL) -> id\r
{\r
- if (auto* parentHandler = handler->getParent())\r
- return NSAccessibilityUnignoredAncestor ((id) parentHandler->getNativeImplementation());\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (handler->getCurrentState().isCheckable())\r
+ return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off"));\r
\r
- return NSAccessibilityUnignoredAncestor ((id) handler->getComponent().getWindowHandle());\r
- }\r
+ return getAccessibilityValueFromInterfaces (*handler);\r
+ }\r
\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- static NSArray* getAccessibilityChildren (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- {\r
- auto children = handler->getChildren();\r
+ addMethod (@selector (accessibilityTitle), getAccessibilityTitle);\r
+ addMethod (@selector (accessibilityHelp), getAccessibilityHelp);\r
+ addMethod (@selector (setAccessibilityValue:), setAccessibilityValue);\r
\r
- auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+ addMethod (@selector (accessibilitySelectedChildren), [] (id self, SEL)\r
+ {\r
+ return getSelectedChildren ([self accessibilityChildren]);\r
+ });\r
\r
- for (auto* childHandler : children)\r
- [accessibleChildren addObject: (id) childHandler->getNativeImplementation()];\r
+ addMethod (@selector (setAccessibilitySelectedChildren:), [] (id self, SEL, NSArray* selected)\r
+ {\r
+ setSelectedChildren ([self accessibilityChildren], selected);\r
+ });\r
\r
- return accessibleChildren;\r
- }\r
+ addMethod (@selector (accessibilityOrientation), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f\r
+ ? NSAccessibilityOrientationHorizontal\r
+ : NSAccessibilityOrientationVertical;\r
\r
- return nil;\r
- }\r
+ return NSAccessibilityOrientationUnknown;\r
+ });\r
\r
- static id getAccessibilityValue (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityInsertionPointLineNumber), [] (id self, SEL) -> NSInteger\r
{\r
- if (handler->getCurrentState().isCheckable())\r
- return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off"));\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()];\r
\r
- return getAccessibilityValueFromInterfaces (*handler);\r
- }\r
+ return 0;\r
+ });\r
\r
- return nil;\r
- }\r
+ addMethod (@selector (accessibilityVisibleCharacterRange), [] (id self, SEL)\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() });\r
\r
- static NSArray* getAccessibilitySelectedChildren (id self, SEL)\r
- {\r
- return getSelectedChildren ([self accessibilityChildren]);\r
- }\r
+ return NSMakeRange (0, 0);\r
+ });\r
\r
- static void setAccessibilitySelectedChildren (id self, SEL, NSArray* selected)\r
- {\r
- setSelectedChildren ([self accessibilityChildren], selected);\r
- }\r
+ addMethod (@selector (accessibilityNumberOfCharacters), [] (id self, SEL)\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return textInterface->getTotalNumCharacters();\r
\r
- static NSAccessibilityOrientation getAccessibilityOrientation (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return handler->getComponent().getBounds().toFloat().getAspectRatio() > 1.0f\r
- ? NSAccessibilityOrientationHorizontal\r
- : NSAccessibilityOrientationVertical;\r
+ return 0;\r
+ });\r
\r
- return NSAccessibilityOrientationUnknown;\r
- }\r
+ addMethod (@selector (accessibilitySelectedText), [] (id self, SEL) -> NSString*\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return juceStringToNS (textInterface->getText (textInterface->getSelection()));\r
\r
- static BOOL getIsAccessibilityFocused (id self, SEL)\r
- {\r
- return [[self accessibilityWindow] accessibilityFocusedUIElement] == self;\r
- }\r
+ return nil;\r
+ });\r
\r
- static void setAccessibilityFocused (id self, SEL, BOOL focused)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilitySelectedTextRange), [] (id self, SEL)\r
{\r
- if (focused)\r
+ if (auto* textInterface = getTextInterface (self))\r
{\r
- const WeakReference<Component> safeComponent (&handler->getComponent());\r
+ const auto currentSelection = textInterface->getSelection();\r
\r
- performActionIfSupported (self, AccessibilityActionType::focus);\r
+ if (currentSelection.isEmpty())\r
+ return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0);\r
\r
- if (safeComponent != nullptr)\r
- handler->grabFocus();\r
+ return juceRangeToNS (currentSelection);\r
}\r
- else\r
- {\r
- handler->giveAwayFocus();\r
- }\r
- }\r
- }\r
-\r
- static NSRect getAccessibilityFrame (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return flippedScreenRect (makeNSRect (handler->getComponent().getScreenBounds()));\r
\r
- return NSZeroRect;\r
- }\r
+ return NSMakeRange (0, 0);\r
+ });\r
\r
- static NSAccessibilityRole getAccessibilityRole (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityAttributedStringForRange:), [] (id self, SEL, NSRange range) -> NSAttributedString*\r
{\r
- switch (handler->getRole())\r
- {\r
- case AccessibilityRole::popupMenu:\r
- case AccessibilityRole::tooltip:\r
- case AccessibilityRole::splashScreen:\r
- case AccessibilityRole::dialogWindow:\r
- case AccessibilityRole::window: return NSAccessibilityWindowRole;\r
-\r
- case AccessibilityRole::tableHeader:\r
- case AccessibilityRole::unspecified:\r
- case AccessibilityRole::group: return NSAccessibilityGroupRole;\r
-\r
- case AccessibilityRole::label:\r
- case AccessibilityRole::staticText: return NSAccessibilityStaticTextRole;\r
-\r
- case AccessibilityRole::tree:\r
- case AccessibilityRole::list: return NSAccessibilityOutlineRole;\r
-\r
- case AccessibilityRole::listItem:\r
- case AccessibilityRole::treeItem: return NSAccessibilityRowRole;\r
-\r
- case AccessibilityRole::button: return NSAccessibilityButtonRole;\r
- case AccessibilityRole::toggleButton: return NSAccessibilityCheckBoxRole;\r
- case AccessibilityRole::radioButton: return NSAccessibilityRadioButtonRole;\r
- case AccessibilityRole::comboBox: return NSAccessibilityPopUpButtonRole;\r
- case AccessibilityRole::image: return NSAccessibilityImageRole;\r
- case AccessibilityRole::slider: return NSAccessibilitySliderRole;\r
- case AccessibilityRole::editableText: return NSAccessibilityTextAreaRole;\r
- case AccessibilityRole::menuItem: return NSAccessibilityMenuItemRole;\r
- case AccessibilityRole::menuBar: return NSAccessibilityMenuRole;\r
- case AccessibilityRole::table: return NSAccessibilityListRole;\r
- case AccessibilityRole::column: return NSAccessibilityColumnRole;\r
- case AccessibilityRole::row: return NSAccessibilityRowRole;\r
- case AccessibilityRole::cell: return NSAccessibilityCellRole;\r
- case AccessibilityRole::hyperlink: return NSAccessibilityLinkRole;\r
- case AccessibilityRole::progressBar: return NSAccessibilityProgressIndicatorRole;\r
- case AccessibilityRole::scrollBar: return NSAccessibilityScrollBarRole;\r
-\r
- case AccessibilityRole::ignored: break;\r
- }\r
+ NSString* string = [self accessibilityStringForRange: range];\r
\r
- return NSAccessibilityUnknownRole;\r
- }\r
+ if (string != nil)\r
+ return [[[NSAttributedString alloc] initWithString: string] autorelease];\r
\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- static NSAccessibilityRole getAccessibilitySubrole (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityRangeForLine:), [] (id self, SEL, NSInteger line)\r
{\r
if (auto* textInterface = getTextInterface (self))\r
- if (textInterface->isDisplayingProtectedText())\r
- return NSAccessibilitySecureTextFieldSubrole;\r
-\r
- const auto role = handler->getRole();\r
-\r
- if (role == AccessibilityRole::window) return NSAccessibilityStandardWindowSubrole;\r
- if (role == AccessibilityRole::dialogWindow) return NSAccessibilityDialogSubrole;\r
- if (role == AccessibilityRole::tooltip\r
- || role == AccessibilityRole::splashScreen) return NSAccessibilityFloatingWindowSubrole;\r
- if (role == AccessibilityRole::toggleButton) return NSAccessibilityToggleSubrole;\r
- if (role == AccessibilityRole::treeItem\r
- || role == AccessibilityRole::listItem) return NSAccessibilityOutlineRowSubrole;\r
- if (role == AccessibilityRole::row && getCellInterface (self) != nullptr) return NSAccessibilityTableRowSubrole;\r
-\r
- const auto& component = handler->getComponent();\r
-\r
- if (auto* documentWindow = component.findParentComponentOfClass<DocumentWindow>())\r
{\r
- if (role == AccessibilityRole::button)\r
+ auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() });\r
+ auto lines = StringArray::fromLines (text);\r
+\r
+ if (line < lines.size())\r
{\r
- if (&component == documentWindow->getCloseButton()) return NSAccessibilityCloseButtonSubrole;\r
- if (&component == documentWindow->getMinimiseButton()) return NSAccessibilityMinimizeButtonSubrole;\r
- if (&component == documentWindow->getMaximiseButton()) return NSAccessibilityFullScreenButtonSubrole;\r
+ auto lineText = lines[(int) line];\r
+ auto start = text.indexOf (lineText);\r
+\r
+ if (start >= 0)\r
+ return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length());\r
}\r
}\r
- }\r
\r
- return NSAccessibilityUnknownRole;\r
- }\r
+ return NSMakeRange (0, 0);\r
+ });\r
\r
- static NSString* getAccessibilityLabel (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return juceStringToNS (handler->getDescription());\r
+ addMethod (@selector (accessibilityStringForRange:), [] (id self, SEL, NSRange range) -> NSString*\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return juceStringToNS (textInterface->getText (nsRangeToJuce (range)));\r
\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- //==============================================================================\r
- static NSInteger getAccessibilityInsertionPointLineNumber (id self, SEL)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return [self accessibilityLineForIndex: textInterface->getTextInsertionOffset()];\r
+ addMethod (@selector (accessibilityRangeForPosition:), [] (id self, SEL, NSPoint position)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (auto* textInterface = handler->getTextInterface())\r
+ {\r
+ auto screenPoint = roundToIntPoint (flippedScreenPoint (position));\r
\r
- return 0;\r
- }\r
+ if (handler->getComponent().getScreenBounds().contains (screenPoint))\r
+ {\r
+ auto offset = textInterface->getOffsetAtPoint (screenPoint);\r
\r
- static NSRange getAccessibilityVisibleCharacterRange (id self, SEL)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return juceRangeToNS ({ 0, textInterface->getTotalNumCharacters() });\r
+ if (offset >= 0)\r
+ return NSMakeRange ((NSUInteger) offset, 1);\r
+ }\r
+ }\r
+ }\r
\r
- return NSMakeRange (0, 0);\r
- }\r
+ return NSMakeRange (0, 0);\r
+ });\r
\r
- static NSInteger getAccessibilityNumberOfCharacters (id self, SEL)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return textInterface->getTotalNumCharacters();\r
+ addMethod (@selector (accessibilityRangeForIndex:), [] (id self, SEL, NSInteger index)\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters()))\r
+ return NSMakeRange ((NSUInteger) index, 1);\r
\r
- return 0;\r
- }\r
+ return NSMakeRange (0, 0);\r
+ });\r
\r
- static NSString* getAccessibilitySelectedText (id self, SEL)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return juceStringToNS (textInterface->getText (textInterface->getSelection()));\r
+ addMethod (@selector (accessibilityFrameForRange:), [] (id self, SEL, NSRange range)\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds()));\r
\r
- return nil;\r
- }\r
+ return NSZeroRect;\r
+ });\r
\r
- static NSRange getAccessibilitySelectedTextRange (id self, SEL)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
+ addMethod (@selector (accessibilityLineForIndex:), [] (id self, SEL, NSInteger index)\r
{\r
- const auto currentSelection = textInterface->getSelection();\r
+ if (auto* textInterface = getTextInterface (self))\r
+ {\r
+ auto text = textInterface->getText ({ 0, (int) index });\r
\r
- if (currentSelection.isEmpty())\r
- return NSMakeRange ((NSUInteger) textInterface->getTextInsertionOffset(), 0);\r
+ if (! text.isEmpty())\r
+ return StringArray::fromLines (text).size() - 1;\r
+ }\r
\r
- return juceRangeToNS (currentSelection);\r
- }\r
+ return 0;\r
+ });\r
\r
- return NSMakeRange (0, 0);\r
- }\r
+ addMethod (@selector (setAccessibilitySelectedTextRange:), [] (id self, SEL, NSRange selectedRange)\r
+ {\r
+ if (auto* textInterface = getTextInterface (self))\r
+ textInterface->setSelection (nsRangeToJuce (selectedRange));\r
+ });\r
\r
- static NSAttributedString* getAccessibilityAttributedStringForRange (id self, SEL, NSRange range)\r
- {\r
- NSString* string = [self accessibilityStringForRange: range];\r
+ addMethod (@selector (accessibilityRows), [] (id self, SEL) -> NSArray*\r
+ {\r
+ if (auto* tableInterface = getTableInterface (self))\r
+ {\r
+ auto* rows = [[NSMutableArray new] autorelease];\r
\r
- if (string != nil)\r
- return [[[NSAttributedString alloc] initWithString: string] autorelease];\r
+ for (int row = 0, numRows = tableInterface->getNumRows(); row < numRows; ++row)\r
+ {\r
+ if (auto* rowHandler = tableInterface->getRowHandler (row))\r
+ {\r
+ [rows addObject: static_cast<id> (rowHandler->getNativeImplementation())];\r
+ }\r
+ else\r
+ {\r
+ [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
+ frame: NSZeroRect\r
+ label: @"Offscreen Row"\r
+ parent: self]];\r
+ }\r
+ }\r
\r
- return nil;\r
- }\r
+ return rows;\r
+ }\r
\r
- static NSRange getAccessibilityRangeForLine (id self, SEL, NSInteger line)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- {\r
- auto text = textInterface->getText ({ 0, textInterface->getTotalNumCharacters() });\r
- auto lines = StringArray::fromLines (text);\r
+ return nil;\r
+ });\r
\r
- if (line < lines.size())\r
- {\r
- auto lineText = lines[(int) line];\r
- auto start = text.indexOf (lineText);\r
+ addMethod (@selector (accessibilitySelectedRows), [] (id self, SEL)\r
+ {\r
+ return getSelectedChildren ([self accessibilityRows]);\r
+ });\r
\r
- if (start >= 0)\r
- return NSMakeRange ((NSUInteger) start, (NSUInteger) lineText.length());\r
- }\r
- }\r
+ addMethod (@selector (setAccessibilitySelectedRows:), [] (id self, SEL, NSArray* selected)\r
+ {\r
+ setSelectedChildren ([self accessibilityRows], selected);\r
+ });\r
\r
- return NSMakeRange (0, 0);\r
- }\r
+ addMethod (@selector (accessibilityHeader), [] (id self, SEL) -> id\r
+ {\r
+ if (auto* tableInterface = getTableInterface (self))\r
+ if (auto* handler = tableInterface->getHeaderHandler())\r
+ return static_cast<id> (handler->getNativeImplementation());\r
\r
- static NSString* getAccessibilityStringForRange (id self, SEL, NSRange range)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return juceStringToNS (textInterface->getText (nsRangeToJuce (range)));\r
+ return nil;\r
+ });\r
\r
- return nil;\r
- }\r
+ addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount);\r
+ addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount);\r
+ addMethod (@selector (accessibilityRowIndexRange), getAccessibilityRowIndexRange);\r
+ addMethod (@selector (accessibilityColumnIndexRange), getAccessibilityColumnIndexRange);\r
\r
- static NSRange getAccessibilityRangeForPosition (id self, SEL, NSPoint position)\r
- {\r
- if (auto* handler = getHandler (self))\r
+ addMethod (@selector (accessibilityIndex), [] (id self, SEL) -> NSInteger\r
{\r
- if (auto* textInterface = handler->getTextInterface())\r
+ if (auto* handler = getHandler (self))\r
{\r
- auto screenPoint = roundToIntPoint (flippedScreenPoint (position));\r
-\r
- if (handler->getComponent().getScreenBounds().contains (screenPoint))\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (handler, &AccessibilityHandler::getTableInterface))\r
{\r
- auto offset = textInterface->getOffsetAtPoint (screenPoint);\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ {\r
+ NSAccessibilityRole handlerRole = [self accessibilityRole];\r
+\r
+ if ([handlerRole isEqual: NSAccessibilityRowRole])\r
+ if (const auto span = tableInterface->getRowSpan (*handler))\r
+ return span->begin;\r
\r
- if (offset >= 0)\r
- return NSMakeRange ((NSUInteger) offset, 1);\r
+ if ([handlerRole isEqual: NSAccessibilityColumnRole])\r
+ if (const auto span = tableInterface->getColumnSpan (*handler))\r
+ return span->begin;\r
+ }\r
}\r
}\r
- }\r
\r
- return NSMakeRange (0, 0);\r
- }\r
+ return 0;\r
+ });\r
\r
- static NSRange getAccessibilityRangeForIndex (id self, SEL, NSInteger index)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- if (isPositiveAndBelow (index, textInterface->getTotalNumCharacters()))\r
- return NSMakeRange ((NSUInteger) index, 1);\r
-\r
- return NSMakeRange (0, 0);\r
- }\r
-\r
- static NSRect getAccessibilityFrameForRange (id self, SEL, NSRange range)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- return flippedScreenRect (makeNSRect (textInterface->getTextBounds (nsRangeToJuce (range)).getBounds()));\r
+ addMethod (@selector (accessibilityDisclosureLevel), [] (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ if (auto* cellInterface = handler->getCellInterface())\r
+ return cellInterface->getDisclosureLevel();\r
\r
- return NSZeroRect;\r
- }\r
+ return 0;\r
+ });\r
\r
- static NSInteger getAccessibilityLineForIndex (id self, SEL, NSInteger index)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
+ addMethod (@selector (accessibilityDisclosedRows), [] (id self, SEL) -> id\r
{\r
- auto text = textInterface->getText ({ 0, (int) index });\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ if (auto* cellInterface = handler->getCellInterface())\r
+ {\r
+ const auto rows = cellInterface->getDisclosedRows();\r
+ auto* result = [NSMutableArray arrayWithCapacity: rows.size()];\r
\r
- if (! text.isEmpty())\r
- return StringArray::fromLines (text).size() - 1;\r
- }\r
+ for (const auto& row : rows)\r
+ {\r
+ if (row != nullptr)\r
+ [result addObject: static_cast<id> (row->getNativeImplementation())];\r
+ else\r
+ [result addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
+ frame: NSZeroRect\r
+ label: @"Offscreen Row"\r
+ parent: self]];\r
+ }\r
\r
- return 0;\r
- }\r
+ return result;\r
+ }\r
+ }\r
\r
- static void setAccessibilitySelectedTextRange (id self, SEL, NSRange selectedRange)\r
- {\r
- if (auto* textInterface = getTextInterface (self))\r
- textInterface->setSelection (nsRangeToJuce (selectedRange));\r
- }\r
+ return nil;\r
+ });\r
\r
- //==============================================================================\r
- static NSArray* getAccessibilityRows (id self, SEL)\r
- {\r
- NSMutableArray* rows = [[NSMutableArray new] autorelease];\r
+ addMethod (@selector (isAccessibilityExpanded), [] (id self, SEL) -> BOOL\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ return handler->getCurrentState().isExpanded();\r
+\r
+ return NO;\r
+ });\r
\r
- if (auto* tableInterface = getTableInterface (self))\r
+ addMethod (@selector (accessibilityPerformIncrement), accessibilityPerformIncrement);\r
+ addMethod (@selector (accessibilityPerformDecrement), accessibilityPerformDecrement);\r
+ addMethod (@selector (accessibilityPerformDelete), [] (id self, SEL)\r
{\r
- for (int row = 0; row < tableInterface->getNumRows(); ++row)\r
+ if (auto* handler = getHandler (self))\r
{\r
- if (auto* handler = tableInterface->getCellHandler (row, 0))\r
+ if (hasEditableText (*handler))\r
{\r
- [rows addObject: (id) handler->getNativeImplementation()];\r
+ handler->getTextInterface()->setText ({});\r
+ return YES;\r
}\r
- else\r
+\r
+ if (auto* valueInterface = handler->getValueInterface())\r
{\r
- [rows addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityRowRole\r
- frame: NSZeroRect\r
- label: @"Offscreen Row"\r
- parent: self]];\r
+ if (! valueInterface->isReadOnly())\r
+ {\r
+ valueInterface->setValue ({});\r
+ return YES;\r
+ }\r
}\r
}\r
- }\r
\r
- return rows;\r
- }\r
+ return NO;\r
+ });\r
\r
- static NSArray* getAccessibilitySelectedRows (id self, SEL)\r
- {\r
- return getSelectedChildren ([self accessibilityRows]);\r
- }\r
+ addMethod (@selector (accessibilityPerformPress), accessibilityPerformPress);\r
\r
- static void setAccessibilitySelectedRows (id self, SEL, NSArray* selected)\r
- {\r
- setSelectedChildren ([self accessibilityRows], selected);\r
- }\r
+ addMethod (@selector (accessibilityPerformShowMenu), [] (id self, SEL)\r
+ {\r
+ return performActionIfSupported (self, AccessibilityActionType::showMenu);\r
+ });\r
\r
- static NSArray* getAccessibilityColumns (id self, SEL)\r
- {\r
- NSMutableArray* columns = [[NSMutableArray new] autorelease];\r
+ addMethod (@selector (accessibilityPerformRaise), [] (id self, SEL)\r
+ {\r
+ [self setAccessibilityFocused: YES]; return YES;\r
+ });\r
\r
- if (auto* tableInterface = getTableInterface (self))\r
+ addMethod (@selector (isAccessibilitySelectorAllowed:), [] (id self, SEL, SEL selector) -> BOOL\r
{\r
- for (int column = 0; column < tableInterface->getNumColumns(); ++column)\r
+ if (auto* handler = getHandler (self))\r
{\r
- if (auto* handler = tableInterface->getCellHandler (0, column))\r
+ const auto handlerRole = handler->getRole();\r
+ const auto currentState = handler->getCurrentState();\r
+\r
+ for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber),\r
+ @selector (accessibilityVisibleCharacterRange),\r
+ @selector (accessibilityNumberOfCharacters),\r
+ @selector (accessibilitySelectedText),\r
+ @selector (accessibilitySelectedTextRange),\r
+ @selector (accessibilityAttributedStringForRange:),\r
+ @selector (accessibilityRangeForLine:),\r
+ @selector (accessibilityStringForRange:),\r
+ @selector (accessibilityRangeForPosition:),\r
+ @selector (accessibilityRangeForIndex:),\r
+ @selector (accessibilityFrameForRange:),\r
+ @selector (accessibilityLineForIndex:),\r
+ @selector (setAccessibilitySelectedTextRange:) })\r
{\r
- [columns addObject: (id) handler->getNativeImplementation()];\r
+ if (selector == textSelector)\r
+ return handler->getTextInterface() != nullptr;\r
}\r
- else\r
+\r
+ for (auto tableSelector : { @selector (accessibilityRowCount),\r
+ @selector (accessibilityRows),\r
+ @selector (accessibilitySelectedRows),\r
+ @selector (accessibilityColumnCount),\r
+ @selector (accessibilityHeader) })\r
{\r
- [columns addObject: [NSAccessibilityElement accessibilityElementWithRole: NSAccessibilityColumnRole\r
- frame: NSZeroRect\r
- label: @"Offscreen Column"\r
- parent: self]];\r
+ if (selector == tableSelector)\r
+ return handler->getTableInterface() != nullptr;\r
}\r
- }\r
- }\r
\r
- return columns;\r
- }\r
+ for (auto cellSelector : { @selector (accessibilityRowIndexRange),\r
+ @selector (accessibilityColumnIndexRange),\r
+ @selector (accessibilityIndex),\r
+ @selector (accessibilityDisclosureLevel) })\r
+ {\r
+ if (selector == cellSelector)\r
+ return handler->getCellInterface() != nullptr;\r
+ }\r
\r
- static NSArray* getAccessibilitySelectedColumns (id self, SEL)\r
- {\r
- return getSelectedChildren ([self accessibilityColumns]);\r
- }\r
+ for (auto valueSelector : { @selector (accessibilityValue),\r
+ @selector (setAccessibilityValue:),\r
+ @selector (accessibilityPerformDelete),\r
+ @selector (accessibilityPerformIncrement),\r
+ @selector (accessibilityPerformDecrement) })\r
+ {\r
+ if (selector != valueSelector)\r
+ continue;\r
\r
- static void setAccessibilitySelectedColumns (id self, SEL, NSArray* selected)\r
- {\r
- setSelectedChildren ([self accessibilityColumns], selected);\r
- }\r
+ auto* valueInterface = handler->getValueInterface();\r
\r
- //==============================================================================\r
- static NSInteger getAccessibilityIndex (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- {\r
- if (auto* cellInterface = handler->getCellInterface())\r
- {\r
- NSAccessibilityRole role = [self accessibilityRole];\r
+ if (selector == @selector (accessibilityValue))\r
+ return valueInterface != nullptr\r
+ || hasEditableText (*handler)\r
+ || currentState.isCheckable();\r
\r
- if ([role isEqual: NSAccessibilityRowRole])\r
- return cellInterface->getRowIndex();\r
+ auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); };\r
\r
- if ([role isEqual: NSAccessibilityColumnRole])\r
- return cellInterface->getColumnIndex();\r
- }\r
- }\r
+ if (selector == @selector (setAccessibilityValue:)\r
+ || selector == @selector (accessibilityPerformDelete))\r
+ return hasEditableValue() || hasEditableText (*handler);\r
\r
- return 0;\r
- }\r
+ auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); };\r
\r
- static NSInteger getAccessibilityDisclosureLevel (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- if (auto* cellInterface = handler->getCellInterface())\r
- return cellInterface->getDisclosureLevel();\r
+ if (selector == @selector (accessibilityPerformIncrement)\r
+ || selector == @selector (accessibilityPerformDecrement))\r
+ return hasEditableValue() && isRanged();\r
\r
- return 0;\r
- }\r
+ return NO;\r
+ }\r
\r
- static BOOL getIsAccessibilityExpanded (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- return handler->getCurrentState().isExpanded();\r
+ for (auto actionSelector : { @selector (accessibilityPerformPress),\r
+ @selector (accessibilityPerformShowMenu),\r
+ @selector (accessibilityPerformRaise),\r
+ @selector (setAccessibilityFocused:) })\r
+ {\r
+ if (selector != actionSelector)\r
+ continue;\r
\r
- return NO;\r
- }\r
+ if (selector == @selector (accessibilityPerformPress))\r
+ return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
+ || handler->getActions().contains (AccessibilityActionType::press);\r
\r
- //==============================================================================\r
- static BOOL accessibilityPerformShowMenu (id self, SEL) { return performActionIfSupported (self, AccessibilityActionType::showMenu); }\r
- static BOOL accessibilityPerformRaise (id self, SEL) { [self setAccessibilityFocused: YES]; return YES; }\r
+ if (selector == @selector (accessibilityPerformShowMenu))\r
+ return handler->getActions().contains (AccessibilityActionType::showMenu);\r
\r
- static BOOL accessibilityPerformDelete (id self, SEL)\r
- {\r
- if (auto* handler = getHandler (self))\r
- {\r
- if (hasEditableText (*handler))\r
- {\r
- handler->getTextInterface()->setText ({});\r
- return YES;\r
- }\r
+ if (selector == @selector (accessibilityPerformRaise))\r
+ return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole];\r
\r
- if (auto* valueInterface = handler->getValueInterface())\r
- {\r
- if (! valueInterface->isReadOnly())\r
- {\r
- valueInterface->setValue ({});\r
- return YES;\r
+ if (selector == @selector (setAccessibilityFocused:))\r
+ return currentState.isFocusable();\r
}\r
- }\r
- }\r
\r
- return NO;\r
- }\r
+ if (selector == @selector (accessibilitySelectedChildren))\r
+ return handlerRole == AccessibilityRole::popupMenu;\r
\r
- //==============================================================================\r
- static BOOL getIsAccessibilitySelectorAllowed (id self, SEL, SEL selector)\r
- {\r
- if (auto* handler = getHandler (self))\r
- {\r
- const auto role = handler->getRole();\r
- const auto currentState = handler->getCurrentState();\r
-\r
- for (auto textSelector : { @selector (accessibilityInsertionPointLineNumber),\r
- @selector (accessibilityVisibleCharacterRange),\r
- @selector (accessibilityNumberOfCharacters),\r
- @selector (accessibilitySelectedText),\r
- @selector (accessibilitySelectedTextRange),\r
- @selector (accessibilityAttributedStringForRange:),\r
- @selector (accessibilityRangeForLine:),\r
- @selector (accessibilityStringForRange:),\r
- @selector (accessibilityRangeForPosition:),\r
- @selector (accessibilityRangeForIndex:),\r
- @selector (accessibilityFrameForRange:),\r
- @selector (accessibilityLineForIndex:),\r
- @selector (setAccessibilitySelectedTextRange:) })\r
- {\r
- if (selector == textSelector)\r
- return handler->getTextInterface() != nullptr;\r
- }\r
+ if (selector == @selector (accessibilityOrientation))\r
+ return handlerRole == AccessibilityRole::scrollBar;\r
\r
- for (auto tableSelector : { @selector (accessibilityRowCount),\r
- @selector (accessibilityRows),\r
- @selector (accessibilitySelectedRows),\r
- @selector (accessibilityColumnCount),\r
- @selector (accessibilityColumns),\r
- @selector (accessibilitySelectedColumns) })\r
- {\r
- if (selector == tableSelector)\r
- return handler->getTableInterface() != nullptr;\r
- }\r
+ if (selector == @selector (isAccessibilityExpanded))\r
+ return currentState.isExpandable();\r
\r
- for (auto cellSelector : { @selector (accessibilityRowIndexRange),\r
- @selector (accessibilityColumnIndexRange),\r
- @selector (accessibilityIndex),\r
- @selector (accessibilityDisclosureLevel) })\r
- {\r
- if (selector == cellSelector)\r
- return handler->getCellInterface() != nullptr;\r
+ return sendSuperclassMessage<BOOL> (self, @selector (isAccessibilitySelectorAllowed:), selector);\r
}\r
\r
- for (auto valueSelector : { @selector (accessibilityValue),\r
- @selector (setAccessibilityValue:),\r
- @selector (accessibilityPerformDelete),\r
- @selector (accessibilityPerformIncrement),\r
- @selector (accessibilityPerformDecrement) })\r
- {\r
- if (selector != valueSelector)\r
- continue;\r
-\r
- auto* valueInterface = handler->getValueInterface();\r
+ return NO;\r
+ });\r
\r
- if (selector == @selector (accessibilityValue))\r
- return valueInterface != nullptr\r
- || hasEditableText (*handler)\r
- || currentState.isCheckable();\r
+ addMethod (@selector (accessibilityChildrenInNavigationOrder), getAccessibilityChildren);\r
\r
- auto hasEditableValue = [valueInterface] { return valueInterface != nullptr && ! valueInterface->isReadOnly(); };\r
+ registerClass();\r
+ }\r
\r
- if (selector == @selector (setAccessibilityValue:)\r
- || selector == @selector (accessibilityPerformDelete))\r
- return hasEditableValue() || hasEditableText (*handler);\r
+ //==============================================================================\r
+ static bool isSelectable (AccessibleState state) noexcept\r
+ {\r
+ return state.isSelectable() || state.isMultiSelectable();\r
+ }\r
\r
- auto isRanged = [valueInterface] { return valueInterface != nullptr && valueInterface->getRange().isValid(); };\r
+ static NSArray* getSelectedChildren (NSArray* children)\r
+ {\r
+ NSMutableArray* selected = [[NSMutableArray new] autorelease];\r
\r
- if (selector == @selector (accessibilityPerformIncrement)\r
- || selector == @selector (accessibilityPerformDecrement))\r
- return hasEditableValue() && isRanged();\r
+ for (id child in children)\r
+ {\r
+ if (auto* handler = getHandler (child))\r
+ {\r
+ const auto currentState = handler->getCurrentState();\r
\r
- return NO;\r
+ if (isSelectable (currentState) && currentState.isSelected())\r
+ [selected addObject: child];\r
}\r
+ }\r
\r
- for (auto actionSelector : { @selector (accessibilityPerformPress),\r
- @selector (accessibilityPerformShowMenu),\r
- @selector (accessibilityPerformRaise),\r
- @selector (setAccessibilityFocused:) })\r
- {\r
- if (selector != actionSelector)\r
- continue;\r
+ return selected;\r
+ }\r
\r
- if (selector == @selector (accessibilityPerformPress))\r
- return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
- || handler->getActions().contains (AccessibilityActionType::press);\r
+ static void setSelected (id item, bool selected)\r
+ {\r
+ auto* handler = getHandler (item);\r
\r
- if (selector == @selector (accessibilityPerformShowMenu))\r
- return handler->getActions().contains (AccessibilityActionType::showMenu);\r
+ if (handler == nullptr)\r
+ return;\r
\r
- if (selector == @selector (accessibilityPerformRaise))\r
- return [[self accessibilityRole] isEqual: NSAccessibilityWindowRole];\r
+ const auto currentState = handler->getCurrentState();\r
\r
- if (selector == @selector (setAccessibilityFocused:))\r
- return currentState.isFocusable();\r
- }\r
+ if (isSelectable (currentState))\r
+ {\r
+ if (currentState.isSelected() != selected)\r
+ handler->getActions().invoke (AccessibilityActionType::toggle);\r
+ }\r
+ else if (currentState.isFocusable())\r
+ {\r
+ [item setAccessibilityFocused: selected];\r
+ }\r
+ }\r
\r
- if (selector == @selector (accessibilitySelectedChildren))\r
- return role == AccessibilityRole::popupMenu;\r
+ static void setSelectedChildren (NSArray* children, NSArray* selected)\r
+ {\r
+ for (id child in children)\r
+ setSelected (child, [selected containsObject: child]);\r
+ }\r
\r
- if (selector == @selector (accessibilityOrientation))\r
- return role == AccessibilityRole::scrollBar;\r
+ //==============================================================================\r
+ static id getAccessibilityWindow (id self, SEL)\r
+ {\r
+ return [[self accessibilityParent] accessibilityWindow];\r
+ }\r
\r
- if (selector == @selector (isAccessibilityExpanded))\r
- return currentState.isExpandable();\r
+ static NSArray* getAccessibilityChildren (id self, SEL)\r
+ {\r
+ if (auto* handler = getHandler (self))\r
+ {\r
+ auto children = handler->getChildren();\r
\r
- return sendSuperclassMessage<BOOL> (self, @selector (isAccessibilitySelectorAllowed:), selector);\r
+ auto* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+\r
+ for (auto* childHandler : children)\r
+ [accessibleChildren addObject: static_cast<id> (childHandler->getNativeImplementation())];\r
+\r
+ return accessibleChildren;\r
}\r
\r
- return NO;\r
+ return nil;\r
}\r
\r
//==============================================================================\r
\r
if (@available (macOS 10.9, *))\r
{\r
- if (id accessibilityElement = (id) handler.getNativeImplementation())\r
+ if (id accessibilityElement = static_cast<id> (handler.getNativeImplementation()))\r
{\r
sendAccessibilityEvent (accessibilityElement, notification,\r
(notification == NSAccessibilityLayoutChangedNotification\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
}();\r
\r
- sendAccessibilityEvent ((id) [NSApp mainWindow],\r
+ sendAccessibilityEvent (static_cast<id> ([NSApp mainWindow]),\r
NSAccessibilityAnnouncementRequestedNotification,\r
@{ NSAccessibilityAnnouncementKey: juceStringToNS (announcementString),\r
NSAccessibilityPriorityKey: @(nsPriority) });\r
using Holder = std::unique_ptr<Base, AccessibleObjCClassDeleter>;\r
\r
protected:\r
- AccessibleObjCClass() : ObjCClass<Base> ("JUCEAccessibilityElement_")\r
+ AccessibleObjCClass() : AccessibleObjCClass ("JUCEAccessibilityElement_") {}\r
+\r
+ explicit AccessibleObjCClass (const char* name) : ObjCClass<Base> (name)\r
{\r
ObjCClass<Base>::template addIvar<AccessibilityHandler*> ("handler");\r
}\r
static AccessibilityTableInterface* getTableInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getTableInterface); }\r
static AccessibilityCellInterface* getCellInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getCellInterface); }\r
\r
- template <typename MemberFn>\r
- static auto getEnclosingInterface (AccessibilityHandler* handler, MemberFn fn) noexcept -> decltype ((std::declval<AccessibilityHandler>().*fn)())\r
- {\r
- if (handler == nullptr)\r
- return nullptr;\r
-\r
- if (auto* interface = (handler->*fn)())\r
- return interface;\r
-\r
- return getEnclosingInterface (handler->getParent(), fn);\r
- }\r
-\r
static bool hasEditableText (AccessibilityHandler& handler) noexcept\r
{\r
return handler.getRole() == AccessibilityRole::editableText\r
static BOOL getIsAccessibilityElement (id self, SEL)\r
{\r
if (auto* handler = getHandler (self))\r
- return ! handler->isIgnored()\r
- && handler->getRole() != AccessibilityRole::window;\r
+ return ! handler->isIgnored() && handler->getRole() != AccessibilityRole::window;\r
\r
return NO;\r
}\r
\r
NSString* nsString = juceStringToNS (title);\r
\r
- #if ! JUCE_IOS\r
if (nsString != nil && [[self accessibilityValue] isEqual: nsString])\r
return @"";\r
- #endif\r
\r
return nsString;\r
}\r
\r
static NSInteger getAccessibilityRowCount (id self, SEL)\r
{\r
- if (auto* tableInterface = getTableInterface (self))\r
- return tableInterface->getNumRows();\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ return tableInterface->getNumRows();\r
\r
return 0;\r
}\r
\r
static NSInteger getAccessibilityColumnCount (id self, SEL)\r
{\r
- if (auto* tableInterface = getTableInterface (self))\r
- return tableInterface->getNumColumns();\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface))\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ return tableInterface->getNumColumns();\r
\r
return 0;\r
}\r
\r
- static NSRange getAccessibilityRowIndexRange (id self, SEL)\r
+ template <typename Getter>\r
+ static NSRange getCellDimensions (id self, Getter getter)\r
{\r
- if (auto* cellInterface = getCellInterface (self))\r
- return NSMakeRange ((NSUInteger) cellInterface->getRowIndex(),\r
- (NSUInteger) cellInterface->getRowSpan());\r
+ const auto notFound = NSMakeRange (NSNotFound, 0);\r
+\r
+ auto* handler = getHandler (self);\r
+\r
+ if (handler == nullptr)\r
+ return notFound;\r
\r
- return NSMakeRange (0, 0);\r
+ auto* tableHandler = getEnclosingHandlerWithInterface (getHandler (self), &AccessibilityHandler::getTableInterface);\r
+\r
+ if (tableHandler == nullptr)\r
+ return notFound;\r
+\r
+ auto* tableInterface = tableHandler->getTableInterface();\r
+\r
+ if (tableInterface == nullptr)\r
+ return notFound;\r
+\r
+ const auto result = (tableInterface->*getter) (*handler);\r
+\r
+ if (! result.hasValue())\r
+ return notFound;\r
+\r
+ return NSMakeRange ((NSUInteger) result->begin, (NSUInteger) result->num);\r
}\r
\r
- static NSRange getAccessibilityColumnIndexRange (id self, SEL)\r
+ static NSRange getAccessibilityRowIndexRange (id self, SEL)\r
{\r
- if (auto* cellInterface = getCellInterface (self))\r
- return NSMakeRange ((NSUInteger) cellInterface->getColumnIndex(),\r
- (NSUInteger) cellInterface->getColumnSpan());\r
+ return getCellDimensions (self, &AccessibilityTableInterface::getRowSpan);\r
+ }\r
\r
- return NSMakeRange (0, 0);\r
+ static NSRange getAccessibilityColumnIndexRange (id self, SEL)\r
+ {\r
+ return getCellDimensions (self, &AccessibilityTableInterface::getColumnSpan);\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AccessibleObjCClass)\r
\r
int AccessibilityNativeHandle::idCounter = 0;\r
\r
+//==============================================================================\r
+class UIAScrollProvider : public UIAProviderBase,\r
+ public ComBaseClassHelper<ComTypes::IScrollProvider>\r
+{\r
+public:\r
+ using UIAProviderBase::UIAProviderBase;\r
+\r
+ JUCE_COMCALL Scroll (ComTypes::ScrollAmount, ComTypes::ScrollAmount) override { return E_FAIL; }\r
+ JUCE_COMCALL SetScrollPercent (double, double) override { return E_FAIL; }\r
+ JUCE_COMCALL get_HorizontalScrollPercent (double*) override { return E_FAIL; }\r
+ JUCE_COMCALL get_VerticalScrollPercent (double*) override { return E_FAIL; }\r
+ JUCE_COMCALL get_HorizontalViewSize (double*) override { return E_FAIL; }\r
+ JUCE_COMCALL get_VerticalViewSize (double*) override { return E_FAIL; }\r
+ JUCE_COMCALL get_HorizontallyScrollable (BOOL*) override { return E_FAIL; }\r
+ JUCE_COMCALL get_VerticallyScrollable (BOOL*) override { return E_FAIL; }\r
+\r
+private:\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollProvider)\r
+};\r
+\r
+class UIAScrollItemProvider : public UIAProviderBase,\r
+ public ComBaseClassHelper<ComTypes::IScrollItemProvider>\r
+{\r
+public:\r
+ using UIAProviderBase::UIAProviderBase;\r
+\r
+ JUCE_COMCALL ScrollIntoView() override\r
+ {\r
+ if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+ {\r
+ if (auto* tableInterface = handler->getTableInterface())\r
+ {\r
+ tableInterface->showCell (getHandler());\r
+ return S_OK;\r
+ }\r
+ }\r
+\r
+ return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ }\r
+\r
+private:\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAScrollItemProvider)\r
+};\r
+\r
//==============================================================================\r
static String getAutomationId (const AccessibilityHandler& handler)\r
{\r
case AccessibilityRole::staticText: return ComTypes::UIA_TextControlTypeId;\r
\r
case AccessibilityRole::column:\r
- case AccessibilityRole::row: return ComTypes::UIA_HeaderItemControlTypeId;\r
+ case AccessibilityRole::row: return ComTypes::UIA_ListItemControlTypeId;\r
\r
case AccessibilityRole::button: return ComTypes::UIA_ButtonControlTypeId;\r
case AccessibilityRole::toggleButton: return ComTypes::UIA_CheckBoxControlTypeId;\r
const auto role = accessibilityHandler.getRole();\r
const auto fragmentRoot = isFragmentRoot();\r
\r
+ const auto isListOrTableCell = [] (auto& handler)\r
+ {\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (&handler, &AccessibilityHandler::getTableInterface))\r
+ {\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ {\r
+ const auto row = tableInterface->getRowSpan (handler);\r
+ const auto column = tableInterface->getColumnSpan (handler);\r
+\r
+ return row.hasValue() && column.hasValue();\r
+ }\r
+ }\r
+\r
+ return false;\r
+ };\r
+\r
switch (pId)\r
{\r
case ComTypes::UIA_WindowPatternId:\r
{\r
auto state = accessibilityHandler.getCurrentState();\r
\r
- if (state.isSelectable() || state.isMultiSelectable()\r
- || role == AccessibilityRole::radioButton)\r
+ if (state.isSelectable() || state.isMultiSelectable() || role == AccessibilityRole::radioButton)\r
{\r
return new UIASelectionItemProvider (this);\r
}\r
\r
break;\r
}\r
+ case ComTypes::UIA_TablePatternId:\r
case ComTypes::UIA_GridPatternId:\r
{\r
- if (accessibilityHandler.getTableInterface() != nullptr)\r
- return new UIAGridProvider (this);\r
+ if (accessibilityHandler.getTableInterface() != nullptr\r
+ && (pId == ComTypes::UIA_GridPatternId || accessibilityHandler.getRole() == AccessibilityRole::table))\r
+ return static_cast<ComTypes::IGridProvider*> (new UIAGridProvider (this));\r
\r
break;\r
}\r
+ case ComTypes::UIA_TableItemPatternId:\r
case ComTypes::UIA_GridItemPatternId:\r
{\r
- if (accessibilityHandler.getCellInterface() != nullptr)\r
- return new UIAGridItemProvider (this);\r
+ if (isListOrTableCell (accessibilityHandler))\r
+ return static_cast<ComTypes::IGridItemProvider*> (new UIAGridItemProvider (this));\r
\r
break;\r
}\r
\r
break;\r
}\r
+ case ComTypes::UIA_ScrollPatternId:\r
+ {\r
+ if (accessibilityHandler.getTableInterface() != nullptr)\r
+ return new UIAScrollProvider (this);\r
+\r
+ break;\r
+ }\r
+ case ComTypes::UIA_ScrollItemPatternId:\r
+ {\r
+ if (isListOrTableCell (accessibilityHandler))\r
+ return new UIAScrollItemProvider (this);\r
+\r
+ break;\r
+ }\r
}\r
\r
return nullptr;\r
WindowInteractionState_NotResponding = 4\r
};\r
\r
+enum RowOrColumnMajor\r
+{\r
+ RowOrColumnMajor_RowMajor = 0,\r
+ RowOrColumnMajor_ColumnMajor = 1,\r
+ RowOrColumnMajor_Indeterminate = 2\r
+};\r
+\r
+enum ScrollAmount\r
+{\r
+ ScrollAmount_LargeDecrement = 0,\r
+ ScrollAmount_SmallDecrement = 1,\r
+ ScrollAmount_NoAmount = 2,\r
+ ScrollAmount_LargeIncrement = 3,\r
+ ScrollAmount_SmallIncrement = 4\r
+};\r
+\r
const long UIA_InvokePatternId = 10000;\r
const long UIA_SelectionPatternId = 10001;\r
const long UIA_ValuePatternId = 10002;\r
const long UIA_RangeValuePatternId = 10003;\r
+const long UIA_ScrollPatternId = 10004;\r
const long UIA_ExpandCollapsePatternId = 10005;\r
const long UIA_GridPatternId = 10006;\r
const long UIA_GridItemPatternId = 10007;\r
const long UIA_WindowPatternId = 10009;\r
const long UIA_SelectionItemPatternId = 10010;\r
+const long UIA_TablePatternId = 10012;\r
+const long UIA_TableItemPatternId = 10013;\r
const long UIA_TextPatternId = 10014;\r
const long UIA_TogglePatternId = 10015;\r
const long UIA_TransformPatternId = 10016;\r
+const long UIA_ScrollItemPatternId = 10017;\r
const long UIA_TextPattern2Id = 10024;\r
const long UIA_StructureChangedEventId = 20002;\r
const long UIA_MenuOpenedEventId = 20003;\r
JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0;\r
};\r
\r
+JUCE_COMCLASS (ITableItemProvider, "b9734fa6-771f-4d78-9c90-2517999349cd") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetRowHeaderItems (SAFEARRAY** pRetVal) = 0;\r
+ JUCE_COMCALL GetColumnHeaderItems (SAFEARRAY** pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITableProvider, "9c860395-97b3-490a-b52a-858cc22af166") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetRowHeaders (SAFEARRAY** pRetVal) = 0;\r
+ JUCE_COMCALL GetColumnHeaders (SAFEARRAY** pRetVal) = 0;\r
+ JUCE_COMCALL get_RowOrColumnMajor (RowOrColumnMajor* pRetVal) = 0;\r
+};\r
+\r
JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown\r
{\r
public:\r
JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0;\r
};\r
\r
+JUCE_COMCLASS (IScrollProvider, "b38b8077-1fc3-42a5-8cae-d40c2215055a") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Scroll (ScrollAmount horizontalAmount, ScrollAmount verticalAmount) = 0;\r
+ JUCE_COMCALL SetScrollPercent (double horizontalPercent,double verticalPercent) = 0;\r
+ JUCE_COMCALL get_HorizontalScrollPercent (double* pRetVal) = 0;\r
+ JUCE_COMCALL get_VerticalScrollPercent (double* pRetVal) = 0;\r
+ JUCE_COMCALL get_HorizontalViewSize (double* pRetVal) = 0;\r
+ JUCE_COMCALL get_VerticalViewSize (double* pRetVal) = 0;\r
+ JUCE_COMCALL get_HorizontallyScrollable (BOOL* pRetVal) = 0;\r
+ JUCE_COMCALL get_VerticallyScrollable (BOOL* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IScrollItemProvider, "2360c714-4bf1-4b26-ba65-9b21316127eb") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL ScrollIntoView() = 0;\r
+};\r
+\r
constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } };\r
\r
} // namespace ComTypes\r
__CRT_UUID_DECL (juce::ComTypes::ITransformProvider, 0x6829ddc4, 0x4f91, 0x4ffa, 0xb8, 0x6f, 0xbd, 0x3e, 0x29, 0x87, 0xcb, 0x4c)\r
__CRT_UUID_DECL (juce::ComTypes::IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a)\r
__CRT_UUID_DECL (juce::ComTypes::IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9)\r
+__CRT_UUID_DECL (juce::ComTypes::ITableItemProvider, 0xb9734fa6, 0x771f, 0x4d78, 0x9c, 0x90, 0x25, 0x17, 0x99, 0x93, 0x49, 0xcd)\r
+__CRT_UUID_DECL (juce::ComTypes::ITableProvider, 0x9c860395, 0x97b3, 0x490a, 0xb5, 0x2a, 0x85, 0x8c, 0xc2, 0x2a, 0xf1, 0x66)\r
+__CRT_UUID_DECL (juce::ComTypes::IScrollProvider, 0xb38b8077, 0x1fc3, 0x42a5, 0x8c, 0xae, 0xd4, 0x0c, 0x22, 0x15, 0x05, 0x5a)\r
+__CRT_UUID_DECL (juce::ComTypes::IScrollItemProvider, 0x2360c714, 0x4bf1, 0x4b26, 0xba, 0x65, 0x9b, 0x21, 0x31, 0x61, 0x27, 0xeb)\r
#endif\r
\r
//==============================================================================\r
class UIAGridItemProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ComTypes::IGridItemProvider>\r
+ public ComBaseClassHelper<ComTypes::IGridItemProvider, ComTypes::ITableItemProvider>\r
{\r
public:\r
using UIAProviderBase::UIAProviderBase;\r
//==============================================================================\r
JUCE_COMRESULT get_Row (int* pRetVal) override\r
{\r
- return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
- {\r
- *pRetVal = cellInterface.getRowIndex();\r
- });\r
+ return withTableSpan (pRetVal,\r
+ &AccessibilityTableInterface::getRowSpan,\r
+ &AccessibilityTableInterface::Span::begin);\r
}\r
\r
JUCE_COMRESULT get_Column (int* pRetVal) override\r
{\r
- return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
- {\r
- *pRetVal = cellInterface.getColumnIndex();\r
- });\r
+ return withTableSpan (pRetVal,\r
+ &AccessibilityTableInterface::getColumnSpan,\r
+ &AccessibilityTableInterface::Span::begin);\r
}\r
\r
JUCE_COMRESULT get_RowSpan (int* pRetVal) override\r
{\r
- return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
- {\r
- *pRetVal = cellInterface.getRowSpan();\r
- });\r
+ return withTableSpan (pRetVal,\r
+ &AccessibilityTableInterface::getRowSpan,\r
+ &AccessibilityTableInterface::Span::num);\r
}\r
\r
JUCE_COMRESULT get_ColumnSpan (int* pRetVal) override\r
{\r
- return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
- {\r
- *pRetVal = cellInterface.getColumnSpan();\r
- });\r
+ return withTableSpan (pRetVal,\r
+ &AccessibilityTableInterface::getColumnSpan,\r
+ &AccessibilityTableInterface::Span::num);\r
}\r
\r
JUCE_COMRESULT get_ContainingGrid (IRawElementProviderSimple** pRetVal) override\r
{\r
- return withCellInterface (pRetVal, [&] (const AccessibilityCellInterface& cellInterface)\r
+ return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler)\r
{\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
-\r
- if (auto* handler = cellInterface.getTableHandler())\r
- handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
-\r
+ tableHandler.getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+ return true;\r
});\r
}\r
\r
+ JUCE_COMRESULT GetRowHeaderItems (SAFEARRAY**) override\r
+ {\r
+ return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ }\r
+\r
+ JUCE_COMRESULT GetColumnHeaderItems (SAFEARRAY** pRetVal) override\r
+ {\r
+ return withTableInterface (pRetVal, [&] (const AccessibilityHandler& tableHandler)\r
+ {\r
+ if (auto* tableInterface = tableHandler.getTableInterface())\r
+ {\r
+ if (const auto column = tableInterface->getColumnSpan (getHandler()))\r
+ {\r
+ if (auto* header = tableInterface->getHeaderHandler())\r
+ {\r
+ const auto children = header->getChildren();\r
+\r
+ if (isPositiveAndBelow (column->begin, children.size()))\r
+ {\r
+ IRawElementProviderSimple* provider = nullptr;\r
+\r
+ if (auto* child = children[(size_t) column->begin])\r
+ {\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ if (child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider)) == S_OK && provider != nullptr)\r
+ {\r
+ *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, 1);\r
+ LONG index = 0;\r
+ const auto hr = SafeArrayPutElement (*pRetVal, &index, provider);\r
+\r
+ return ! FAILED (hr);\r
+ }\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return false;\r
+ });\r
+ }\r
private:\r
template <typename Value, typename Callback>\r
- JUCE_COMRESULT withCellInterface (Value* pRetVal, Callback&& callback) const\r
+ JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
{\r
- if (auto* cellInterface = getHandler().getCellInterface())\r
+ if (auto* handler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+ if (handler->getTableInterface() != nullptr && callback (*handler))\r
+ return S_OK;\r
+\r
+ return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ });\r
+ }\r
+\r
+ JUCE_COMRESULT withTableSpan (int* pRetVal,\r
+ Optional<AccessibilityTableInterface::Span> (AccessibilityTableInterface::* getSpan) (const AccessibilityHandler&) const,\r
+ int AccessibilityTableInterface::Span::* spanMember) const\r
+ {\r
+ return withTableInterface (pRetVal, [&] (const AccessibilityHandler& handler)\r
+ {\r
+ if (const auto span = ((handler.getTableInterface())->*getSpan) (getHandler()))\r
{\r
- callback (*cellInterface);\r
- return S_OK;\r
+ *pRetVal = (*span).*spanMember;\r
+ return true;\r
}\r
\r
- return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ return false;\r
});\r
}\r
\r
\r
//==============================================================================\r
class UIAGridProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ComTypes::IGridProvider>\r
+ public ComBaseClassHelper<ComTypes::IGridProvider, ComTypes::ITableProvider>\r
{\r
public:\r
using UIAProviderBase::UIAProviderBase;\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
\r
- if (auto* handler = tableInterface.getCellHandler (row, column))\r
- handler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+ if (auto* cellHandler = tableInterface.getCellHandler (row, column))\r
+ {\r
+ cellHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+ return S_OK;\r
+ }\r
+\r
+ if (auto* rowHandler = tableInterface.getRowHandler (row))\r
+ {\r
+ rowHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));\r
+ return S_OK;\r
+ }\r
\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
- return S_OK;\r
+ return E_FAIL;\r
});\r
}\r
\r
});\r
}\r
\r
+ JUCE_COMRESULT GetRowHeaders (SAFEARRAY**) override\r
+ {\r
+ return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ }\r
+\r
+ JUCE_COMRESULT GetColumnHeaders (SAFEARRAY** pRetVal) override\r
+ {\r
+ return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)\r
+ {\r
+ if (auto* header = tableInterface.getHeaderHandler())\r
+ {\r
+ const auto children = header->getChildren();\r
+\r
+ *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, (ULONG) children.size());\r
+\r
+ LONG index = 0;\r
+\r
+ for (const auto& child : children)\r
+ {\r
+ IRawElementProviderSimple* provider = nullptr;\r
+\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ if (child != nullptr)\r
+ child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider));\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+ if (provider == nullptr)\r
+ return E_FAIL;\r
+\r
+ const auto hr = SafeArrayPutElement (*pRetVal, &index, provider);\r
+\r
+ if (FAILED (hr))\r
+ return E_FAIL;\r
+\r
+ ++index;\r
+ }\r
+\r
+ return S_OK;\r
+ }\r
+\r
+ return (HRESULT) UIA_E_NOTSUPPORTED;\r
+ });\r
+ }\r
+\r
+ JUCE_COMRESULT get_RowOrColumnMajor (ComTypes::RowOrColumnMajor* pRetVal) override\r
+ {\r
+ *pRetVal = ComTypes::RowOrColumnMajor_RowMajor;\r
+ return S_OK;\r
+ }\r
+\r
private:\r
template <typename Value, typename Callback>\r
JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
{\r
- if (auto* tableInterface = getHandler().getTableInterface())\r
- return callback (*tableInterface);\r
+ if (auto* tableHandler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))\r
+ if (auto* tableInterface = tableHandler->getTableInterface())\r
+ return callback (*tableInterface);\r
\r
return (HRESULT) UIA_E_NOTSUPPORTED;\r
});\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;")\r
+ FIELD (layoutInDisplayCutoutMode, "layoutInDisplayCutoutMode", "I")\r
\r
- DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets, "android/view/WindowInsets", 28)\r
+DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowManagerLayoutParams28, "android/view/WindowManager$LayoutParams", 28)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;") \\r
+ METHOD (consumeDisplayCutout, "consumeDisplayCutout", "()Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets28, "android/view/WindowInsets", 28)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ METHOD (getInsets, "getInsets", "(I)Landroid/graphics/Insets;") \\r
+ STATICFIELD (CONSUMED, "CONSUMED", "Landroid/view/WindowInsets;")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets30, "android/view/WindowInsets", 30)\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidDisplayCutout, "android/view/DisplayCutout", 28)\r
#undef JNI_CLASS_MEMBERS\r
\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ FIELD (bottom, "bottom", "I") \\r
+ FIELD (left, "left", "I") \\r
+ FIELD (right, "right", "I") \\r
+ FIELD (top, "top", "I")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidGraphicsInsets, "android/graphics/Insets", 29)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ STATICMETHOD (ime, "ime", "()I") \\r
+ STATICMETHOD (displayCutout, "displayCutout", "()I")\r
+\r
+ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsetsType, "android/view/WindowInsets$Type", 30)\r
+#undef JNI_CLASS_MEMBERS\r
+\r
//==============================================================================\r
namespace\r
{\r
\r
static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displayCutout, double displayScale)\r
{\r
- if (displayCutout.get() == nullptr)\r
+ if (displayCutout == nullptr)\r
return {};\r
\r
auto* env = getEnv();\r
\r
- auto getInset = [&] (jmethodID methodID)\r
+ const auto getInset = [&] (jmethodID methodID)\r
{\r
- return roundToInt (env->CallIntMethod (displayCutout.get(), methodID) / displayScale);\r
+ return roundToInt (env->CallIntMethod (displayCutout, methodID) / displayScale);\r
};\r
\r
return { getInset (AndroidDisplayCutout.getSafeInsetTop),\r
getInset (AndroidDisplayCutout.getSafeInsetRight) };\r
}\r
\r
+static BorderSize<int> androidInsetsToBorderSize (LocalRef<jobject> insets, double displayScale)\r
+{\r
+ if (insets == nullptr)\r
+ return {};\r
+\r
+ auto* env = getEnv();\r
+\r
+ const auto getInset = [&] (jfieldID fieldID)\r
+ {\r
+ return roundToInt (env->GetIntField (insets, fieldID) / displayScale);\r
+ };\r
+\r
+ return { getInset (AndroidGraphicsInsets.top),\r
+ getInset (AndroidGraphicsInsets.left),\r
+ getInset (AndroidGraphicsInsets.bottom),\r
+ getInset (AndroidGraphicsInsets.right) };\r
+}\r
+\r
+class JuceInsets\r
+{\r
+ template <typename Display>\r
+ static auto tieDisplay (Display& d) { return std::tie (d.safeAreaInsets, d.keyboardInsets); }\r
+\r
+public:\r
+ BorderSize<int> displayCutout, keyboard;\r
+\r
+ static auto tie ( Displays::Display& d) { return tieDisplay (d); }\r
+ static auto tie (const Displays::Display& d) { return tieDisplay (d); }\r
+\r
+ auto tie() const { return std::tie (displayCutout, keyboard); }\r
+};\r
+\r
+static JuceInsets getInsetsFromAndroidWindowInsets (LocalRef<jobject> windowInsets, double scale)\r
+{\r
+ auto* env = getEnv();\r
+\r
+ if (windowInsets == nullptr)\r
+ return {};\r
+\r
+ const auto displayCutout = [&]() -> BorderSize<int>\r
+ {\r
+ if (AndroidWindowInsets28.getDisplayCutout == nullptr)\r
+ return {};\r
+\r
+ const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets28.getDisplayCutout) };\r
+ return androidDisplayCutoutToBorderSize (insets, scale);\r
+ }();\r
+\r
+ const auto keyboard = [&]() -> BorderSize<int>\r
+ {\r
+ if (AndroidWindowInsetsType.ime == nullptr || AndroidWindowInsets30.getInsets == nullptr)\r
+ return {};\r
+\r
+ const auto mask = env->CallStaticIntMethod (AndroidWindowInsetsType, AndroidWindowInsetsType.ime);\r
+ const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets30.getInsets, mask) };\r
+ return androidInsetsToBorderSize (insets, scale);\r
+ }();\r
+\r
+ return { displayCutout, keyboard };\r
+}\r
+\r
/* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values\r
represent ASCII keycodes. However in the native Android keycodes the values for special keys\r
e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.\r
\r
if (supportsDisplayCutout())\r
{\r
- jfieldID layoutInDisplayCutoutModeFieldId = env->GetFieldID (AndroidWindowManagerLayoutParams,\r
- "layoutInDisplayCutoutMode",\r
- "I");\r
-\r
- if (layoutInDisplayCutoutModeFieldId != nullptr)\r
- env->SetIntField (windowLayoutParams.get(),\r
- layoutInDisplayCutoutModeFieldId,\r
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);\r
+ if (const auto fieldID = AndroidWindowManagerLayoutParams28.layoutInDisplayCutoutMode)\r
+ env->SetIntField (windowLayoutParams, fieldID, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);\r
}\r
\r
if (Desktop::getInstance().getKioskModeComponent() != nullptr)\r
\r
if (supportsDisplayCutout())\r
{\r
- jmethodID setOnApplyWindowInsetsListenerMethodId = env->GetMethodID (AndroidView,\r
- "setOnApplyWindowInsetsListener",\r
- "(Landroid/view/View$OnApplyWindowInsetsListener;)V");\r
-\r
- if (setOnApplyWindowInsetsListenerMethodId != nullptr)\r
- env->CallVoidMethod (view.get(), setOnApplyWindowInsetsListenerMethodId,\r
+ if (const auto methodID = AndroidView23.setOnApplyWindowInsetsListener)\r
+ {\r
+ env->CallVoidMethod (view,\r
+ methodID,\r
CreateJavaInterface (new ViewWindowInsetsListener,\r
"android/view/View$OnApplyWindowInsetsListener").get());\r
+ }\r
}\r
\r
if (isFocused())\r
\r
if (activity != nullptr)\r
{\r
- jmethodID finishMethod = env->GetMethodID (AndroidActivity, "finish", "()V");\r
-\r
- if (finishMethod != nullptr)\r
+ if (const auto finishMethod = AndroidActivity.finish)\r
env->CallVoidMethod (activity.get(), finishMethod);\r
}\r
}\r
}\r
\r
//==============================================================================\r
- struct ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer\r
+ class ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer\r
{\r
- jobject onApplyWindowInsets (LocalRef<jobject> v, LocalRef<jobject> insets)\r
+ public:\r
+ jobject onApplyWindowInsets (LocalRef<jobject>, LocalRef<jobject> insets)\r
{\r
auto* env = getEnv();\r
\r
- LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));\r
-\r
- if (displayCutout != nullptr)\r
- {\r
- const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();\r
- auto newSafeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, mainDisplay.scale);\r
-\r
- if (newSafeAreaInsets != mainDisplay.safeAreaInsets)\r
- forceDisplayUpdate();\r
-\r
- auto* fieldId = env->GetStaticFieldID (AndroidWindowInsets, "CONSUMED", "Landroid/view/WindowInsets");\r
- jassert (fieldId != nullptr);\r
-\r
- return env->GetStaticObjectField (AndroidWindowInsets, fieldId);\r
- }\r
+ const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();\r
+ const auto newInsets = getInsetsFromAndroidWindowInsets (insets, mainDisplay.scale);\r
\r
- jmethodID onApplyWindowInsetsMethodId = env->GetMethodID (AndroidView,\r
- "onApplyWindowInsets",\r
- "(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;");\r
+ if (newInsets.tie() != JuceInsets::tie (mainDisplay))\r
+ forceDisplayUpdate();\r
\r
- jassert (onApplyWindowInsetsMethodId != nullptr);\r
+ if (const auto fieldId = AndroidWindowInsets30.CONSUMED)\r
+ return env->GetStaticObjectField (AndroidWindowInsets30, fieldId);\r
\r
- return env->CallObjectMethod (v.get(), onApplyWindowInsetsMethodId, insets.get());\r
+ return env->CallObjectMethod (insets, AndroidWindowInsets28.consumeDisplayCutout);\r
}\r
\r
private:\r
LocalRef<jstring> windowServiceString (javaString ("window"));\r
LocalRef<jobject> displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create));\r
LocalRef<jobject> windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));\r
- LocalRef <jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));\r
-\r
- jmethodID getRealMetricsMethod = env->GetMethodID (AndroidDisplay, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V");\r
+ LocalRef<jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));\r
\r
- if (getRealMetricsMethod != nullptr)\r
- env->CallVoidMethod (display.get(), getRealMetricsMethod, displayMetrics.get());\r
+ if (const auto getRealMetricsMethod = AndroidDisplay17.getRealMetrics)\r
+ env->CallVoidMethod (display, getRealMetricsMethod, displayMetrics.get());\r
else\r
- env->CallVoidMethod (display.get(), AndroidDisplay.getMetrics, displayMetrics.get());\r
+ env->CallVoidMethod (display, AndroidDisplay.getMetrics, displayMetrics.get());\r
\r
- env->CallVoidMethod (display.get(), AndroidDisplay.getSize, usableSize.get());\r
+ env->CallVoidMethod (display, AndroidDisplay.getSize, usableSize.get());\r
\r
Display d;\r
\r
if (! activityArea.isEmpty())\r
d.userArea = activityArea / d.scale;\r
\r
- if (supportsDisplayCutout())\r
+ if (const auto getRootWindowInsetsMethodId = AndroidView23.getRootWindowInsets)\r
{\r
- jmethodID getRootWindowInsetsMethodId = env->GetMethodID (AndroidView,\r
- "getRootWindowInsets",\r
- "()Landroid/view/WindowInsets;");\r
-\r
- if (getRootWindowInsetsMethodId != nullptr)\r
- {\r
- LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));\r
-\r
- if (insets != nullptr)\r
- {\r
- LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));\r
-\r
- if (displayCutout.get() != nullptr)\r
- d.safeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, d.scale);\r
- }\r
- }\r
+ LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));\r
+ JuceInsets::tie (d) = getInsetsFromAndroidWindowInsets (insets, d.scale).tie();\r
}\r
\r
static bool hasAddedMainActivityListener = false;\r
namespace juce\r
{\r
\r
-#if ! defined (__IPHONE_10_0) || __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0\r
- using UIActivityType = NSString*;\r
-#endif\r
-\r
class ContentSharer::ContentSharerNativeImpl : public ContentSharer::Pimpl,\r
private Component\r
{\r
namespace juce\r
{\r
\r
+//==============================================================================\r
+static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler)\r
+{\r
+ const auto children = handler.getChildren();\r
+\r
+ NSMutableArray* accessibleChildren = [NSMutableArray arrayWithCapacity: (NSUInteger) children.size()];\r
+\r
+ for (auto* childHandler : children)\r
+ {\r
+ id accessibleElement = [&childHandler]\r
+ {\r
+ id native = static_cast<id> (childHandler->getNativeImplementation());\r
+\r
+ if (! childHandler->getChildren().empty())\r
+ return [native accessibilityContainer];\r
+\r
+ return native;\r
+ }();\r
+\r
+ if (accessibleElement != nil)\r
+ [accessibleChildren addObject: accessibleElement];\r
+ }\r
+\r
+ [accessibleChildren addObject: static_cast<id> (handler.getNativeImplementation())];\r
+\r
+ return accessibleChildren;\r
+}\r
+\r
class UIViewComponentPeer;\r
\r
static UIInterfaceOrientation getWindowOrientation()\r
\r
using namespace juce;\r
\r
+@interface JuceUITextPosition : UITextPosition\r
+{\r
+@public\r
+ int index;\r
+}\r
+@end\r
+\r
+@implementation JuceUITextPosition\r
+\r
++ (instancetype) withIndex: (int) indexIn\r
+{\r
+ auto* result = [[JuceUITextPosition alloc] init];\r
+ result->index = indexIn;\r
+ return [result autorelease];\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@interface JuceUITextRange : UITextRange\r
+{\r
+@public\r
+ int from, to;\r
+}\r
+@end\r
+\r
+@implementation JuceUITextRange\r
+\r
++ (instancetype) withRange: (juce::Range<int>) range\r
+{\r
+ return [JuceUITextRange from: range.getStart() to: range.getEnd()];\r
+}\r
+\r
++ (instancetype) from: (int) from to: (int) to\r
+{\r
+ auto* result = [[JuceUITextRange alloc] init];\r
+ result->from = from;\r
+ result->to = to;\r
+ return [result autorelease];\r
+}\r
+\r
+- (UITextPosition*) start\r
+{\r
+ return [JuceUITextPosition withIndex: from];\r
+}\r
+\r
+- (UITextPosition*) end\r
+{\r
+ return [JuceUITextPosition withIndex: to];\r
+}\r
+\r
+- (Range<int>) range\r
+{\r
+ return Range<int>::between (from, to);\r
+}\r
+\r
+- (BOOL) isEmpty\r
+{\r
+ return from == to;\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+// UITextInputStringTokenizer doesn't handle 'line' granularities correctly by default, hence\r
+// this subclass.\r
+@interface JuceTextInputTokenizer : UITextInputStringTokenizer\r
+{\r
+ UIViewComponentPeer* peer;\r
+}\r
+\r
+- (instancetype) initWithPeer: (UIViewComponentPeer*) peer;\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@interface JuceUITextSelectionRect : UITextSelectionRect\r
+{\r
+ CGRect _rect;\r
+}\r
+\r
+@end\r
+\r
+@implementation JuceUITextSelectionRect\r
+\r
++ (instancetype) withRect: (CGRect) rect\r
+{\r
+ auto* result = [[JuceUITextSelectionRect alloc] init];\r
+ result->_rect = rect;\r
+ return [result autorelease];\r
+}\r
+\r
+- (CGRect) rect { return _rect; }\r
+- (NSWritingDirection) writingDirection { return NSWritingDirectionNatural; }\r
+- (BOOL) containsStart { return NO; }\r
+- (BOOL) containsEnd { return NO; }\r
+- (BOOL) isVertical { return NO; }\r
+\r
+@end\r
+\r
+//==============================================================================\r
struct CADisplayLinkDeleter\r
{\r
void operator() (CADisplayLink* displayLink) const noexcept\r
}\r
};\r
\r
-@interface JuceUIView : UIView <UITextViewDelegate>\r
+@interface JuceTextView : UIView <UITextInput>\r
+{\r
+@public\r
+ UIViewComponentPeer* owner;\r
+ id<UITextInputDelegate> delegate;\r
+}\r
+\r
+- (instancetype) initWithOwner: (UIViewComponentPeer*) owner;\r
+\r
+@end\r
+\r
+@interface JuceUIView : UIView\r
{\r
@public\r
UIViewComponentPeer* owner;\r
- UITextView* hiddenTextView;\r
std::unique_ptr<CADisplayLink, CADisplayLinkDeleter> displayLink;\r
}\r
\r
- (BOOL) resignFirstResponder;\r
- (BOOL) canBecomeFirstResponder;\r
\r
-- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text;\r
-\r
- (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection;\r
\r
- (BOOL) isAccessibilityElement;\r
virtual void setViewController (UIViewController*) = 0;\r
};\r
\r
+//==============================================================================\r
class UIViewComponentPeer : public ComponentPeer,\r
private UIViewPeerControllerReceiver\r
{\r
void grabFocus() override;\r
void textInputRequired (Point<int>, TextInputTarget&) override;\r
void dismissPendingTextInput() override;\r
+ void closeInputMethodContext() override;\r
\r
BOOL textViewReplaceCharacters (Range<int>, const String&);\r
- void updateHiddenTextContent (TextInputTarget&);\r
\r
void updateScreenBounds();\r
\r
JuceUIView* view = nil;\r
UIViewController* controller = nil;\r
const bool isSharedWindow, isAppex;\r
+ String stringBeingComposed;\r
bool fullScreen = false, insideDrawRect = false;\r
+ NSUniquePtr<JuceTextView> hiddenTextInput { [[JuceTextView alloc] initWithOwner: this] };\r
+ NSUniquePtr<JuceTextInputTokenizer> tokenizer { [[JuceTextInputTokenizer alloc] initWithPeer: this] };\r
\r
static int64 getMouseTime (NSTimeInterval timestamp) noexcept\r
{\r
\r
static MultiTouchMapper<UITouch*> currentTouches;\r
\r
+ static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept\r
+ {\r
+ switch (type)\r
+ {\r
+ case TextInputTarget::textKeyboard: return UIKeyboardTypeDefault;\r
+ case TextInputTarget::numericKeyboard: return UIKeyboardTypeNumbersAndPunctuation;\r
+ case TextInputTarget::decimalKeyboard: return UIKeyboardTypeNumbersAndPunctuation;\r
+ case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL;\r
+ case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress;\r
+ case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad;\r
+ default: jassertfalse; break;\r
+ }\r
+\r
+ return UIKeyboardTypeDefault;\r
+ }\r
+\r
private:\r
void appStyleChanged() override\r
{\r
return [[[NSBundle mainBundle] objectForInfoDictionaryKey: @"UIStatusBarHidden"] boolValue];\r
}\r
\r
-#if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
- (BOOL) prefersHomeIndicatorAutoHidden\r
{\r
return isKioskModeView (self);\r
}\r
-#endif\r
\r
- (UIStatusBarStyle) preferredStatusBarStyle\r
{\r
[displayLink.get() addToRunLoop: [NSRunLoop mainRunLoop]\r
forMode: NSDefaultRunLoopMode];\r
\r
- hiddenTextView = [[UITextView alloc] initWithFrame: CGRectZero];\r
- [self addSubview: hiddenTextView];\r
- hiddenTextView.delegate = self;\r
-\r
- hiddenTextView.autocapitalizationType = UITextAutocapitalizationTypeNone;\r
- hiddenTextView.autocorrectionType = UITextAutocorrectionTypeNo;\r
- hiddenTextView.inputAssistantItem.leadingBarButtonGroups = @[];\r
- hiddenTextView.inputAssistantItem.trailingBarButtonGroups = @[];\r
+ [self addSubview: owner->hiddenTextInput.get()];\r
\r
#if JUCE_HAS_IOS_POINTER_SUPPORT\r
if (@available (iOS 13.4, *))\r
\r
- (void) dealloc\r
{\r
- [hiddenTextView removeFromSuperview];\r
- [hiddenTextView release];\r
-\r
+ [owner->hiddenTextInput.get() removeFromSuperview];\r
displayLink = nullptr;\r
\r
[super dealloc];\r
return owner != nullptr && owner->canBecomeKeyWindow();\r
}\r
\r
-- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text\r
-{\r
- ignoreUnused (textView);\r
- return owner->textViewReplaceCharacters (Range<int> ((int) range.location, (int) (range.location + range.length)),\r
- nsStringToJuce (text));\r
-}\r
-\r
- (void) traitCollectionDidChange: (UITraitCollection*) previousTraitCollection\r
{\r
[super traitCollectionDidChange: previousTraitCollection];\r
\r
- #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
if (@available (iOS 12.0, *))\r
{\r
const auto wasDarkModeActive = ([previousTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark);\r
[[NSNotificationCenter defaultCenter] postNotificationName: UIViewComponentPeer::getDarkModeNotificationName()\r
object: nil];\r
}\r
- #endif\r
}\r
\r
- (BOOL) isAccessibilityElement\r
\r
@end\r
\r
+/** see https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/LowerLevelText-HandlingTechnologies/LowerLevelText-HandlingTechnologies.html */\r
+@implementation JuceTextView\r
+\r
+- (TextInputTarget*) getTextInputTarget\r
+{\r
+ if (owner != nullptr)\r
+ return owner->findCurrentTextInputTarget();\r
+\r
+ return nullptr;\r
+}\r
+\r
+- (instancetype) initWithOwner: (UIViewComponentPeer*) ownerIn\r
+{\r
+ [super init];\r
+ owner = ownerIn;\r
+ delegate = nil;\r
+\r
+ // The frame must have a finite size, otherwise some accessibility events will be ignored\r
+ self.frame = CGRectMake (0.0, 0.0, 1.0, 1.0);\r
+ return self;\r
+}\r
+\r
+- (BOOL) canPerformAction: (SEL) action withSender: (id) sender\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (action == @selector (paste:))\r
+ {\r
+ if (@available (iOS 10, *))\r
+ return [[UIPasteboard generalPasteboard] hasStrings];\r
+\r
+ return [[UIPasteboard generalPasteboard] string] != nil;\r
+ }\r
+ }\r
+\r
+ return [super canPerformAction: action withSender: sender];\r
+}\r
+\r
+- (void) cut: (id) sender\r
+{\r
+ [self copy: sender];\r
+\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (delegate != nil)\r
+ [delegate textWillChange: self];\r
+\r
+ target->insertTextAtCaret ("");\r
+\r
+ if (delegate != nil)\r
+ [delegate textDidChange: self];\r
+ }\r
+}\r
+\r
+- (void) copy: (id) sender\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ [[UIPasteboard generalPasteboard] setString: juceStringToNS (target->getTextInRange (target->getHighlightedRegion()))];\r
+}\r
+\r
+- (void) paste: (id) sender\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (auto* string = [[UIPasteboard generalPasteboard] string])\r
+ {\r
+ if (delegate != nil)\r
+ [delegate textWillChange: self];\r
+\r
+ target->insertTextAtCaret (nsStringToJuce (string));\r
+\r
+ if (delegate != nil)\r
+ [delegate textDidChange: self];\r
+ }\r
+ }\r
+}\r
+\r
+- (void) selectAll: (id) sender\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ target->setHighlightedRegion ({ 0, target->getTotalNumChars() });\r
+}\r
+\r
+- (void) deleteBackward\r
+{\r
+ auto* target = [self getTextInputTarget];\r
+\r
+ if (target == nullptr)\r
+ return;\r
+\r
+ const auto range = target->getHighlightedRegion();\r
+ const auto rangeToDelete = range.isEmpty() ? range.withStartAndLength (jmax (range.getStart() - 1, 0),\r
+ range.getStart() != 0 ? 1 : 0)\r
+ : range;\r
+\r
+ target->setHighlightedRegion (rangeToDelete);\r
+ target->insertTextAtCaret ("");\r
+}\r
+\r
+- (void) insertText: (NSString*) text\r
+{\r
+ if (owner == nullptr)\r
+ return;\r
+\r
+ owner->stringBeingComposed.clear();\r
+\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ target->insertTextAtCaret (nsStringToJuce (text));\r
+}\r
+\r
+- (BOOL) hasText\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ return target->getTextInRange ({ 0, 1 }).isNotEmpty();\r
+\r
+ return NO;\r
+}\r
+\r
+- (BOOL) accessibilityElementsHidden\r
+{\r
+ return NO;\r
+}\r
+\r
+- (UITextRange*) selectedTextRangeForTarget: (TextInputTarget*) target\r
+{\r
+ if (target != nullptr)\r
+ return [JuceUITextRange withRange: target->getHighlightedRegion()];\r
+\r
+ return nil;\r
+}\r
+\r
+- (UITextRange*) selectedTextRange\r
+{\r
+ return [self selectedTextRangeForTarget: [self getTextInputTarget]];\r
+}\r
+\r
+- (void) setSelectedTextRange: (JuceUITextRange*) range\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ target->setHighlightedRegion (range != nil ? [range range] : Range<int>());\r
+}\r
+\r
+- (UITextRange*) markedTextRange\r
+{\r
+ if (owner != nullptr && owner->stringBeingComposed.isNotEmpty())\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ return [JuceUITextRange withRange: target->getHighlightedRegion()];\r
+\r
+ return nil;\r
+}\r
+\r
+- (void) setMarkedText: (NSString*) markedText\r
+ selectedRange: (NSRange) selectedRange\r
+{\r
+ ignoreUnused (selectedRange);\r
+\r
+ if (owner == nullptr)\r
+ return;\r
+\r
+ owner->stringBeingComposed = nsStringToJuce (markedText);\r
+\r
+ auto* target = owner->findCurrentTextInputTarget();\r
+\r
+ if (target == nullptr)\r
+ return;\r
+\r
+ const auto currentHighlight = target->getHighlightedRegion();\r
+ target->insertTextAtCaret (owner->stringBeingComposed);\r
+ target->setHighlightedRegion (currentHighlight.withLength (0));\r
+ target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
+}\r
+\r
+- (void) unmarkText\r
+{\r
+ if (owner == nullptr)\r
+ return;\r
+\r
+ auto* target = owner->findCurrentTextInputTarget();\r
+\r
+ if (target == nullptr)\r
+ return;\r
+\r
+ target->insertTextAtCaret (owner->stringBeingComposed);\r
+ owner->stringBeingComposed.clear();\r
+}\r
+\r
+- (NSDictionary<NSAttributedStringKey, id>*) markedTextStyle\r
+{\r
+ return nil;\r
+}\r
+\r
+- (void) setMarkedTextStyle: (NSDictionary<NSAttributedStringKey, id>*) dict\r
+{\r
+}\r
+\r
+- (UITextPosition*) beginningOfDocument\r
+{\r
+ return [JuceUITextPosition withIndex: 0];\r
+}\r
+\r
+- (UITextPosition*) endOfDocument\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ return [JuceUITextPosition withIndex: target->getTotalNumChars()];\r
+\r
+ return [JuceUITextPosition withIndex: 0];\r
+}\r
+\r
+- (id<UITextInputTokenizer>) tokenizer\r
+{\r
+ return owner->tokenizer.get();\r
+}\r
+\r
+- (NSWritingDirection) baseWritingDirectionForPosition: (UITextPosition*) position\r
+ inDirection: (UITextStorageDirection) direction\r
+{\r
+ return NSWritingDirectionNatural;\r
+}\r
+\r
+- (CGRect) caretRectForPosition: (JuceUITextPosition*) position\r
+{\r
+ if (position == nil)\r
+ return CGRectZero;\r
+\r
+ // Currently we ignore the requested position and just return the text editor's caret position\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (auto* comp = dynamic_cast<Component*> (target))\r
+ {\r
+ const auto areaOnDesktop = comp->localAreaToGlobal (target->getCaretRectangle());\r
+ return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+ }\r
+ }\r
+\r
+ return CGRectZero;\r
+}\r
+\r
+- (UITextRange*) characterRangeByExtendingPosition: (JuceUITextPosition*) position\r
+ inDirection: (UITextLayoutDirection) direction\r
+{\r
+ const auto newPosition = [self indexFromPosition: position inDirection: direction offset: 1];\r
+ return [JuceUITextRange from: position->index to: newPosition];\r
+}\r
+\r
+- (int) closestIndexToPoint: (CGPoint) point\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (auto* comp = dynamic_cast<Component*> (target))\r
+ {\r
+ const auto pointOnDesktop = ScalingHelpers::unscaledScreenPosToScaled (convertToPointFloat (point));\r
+ return target->getCharIndexForPoint (comp->getLocalPoint (nullptr, pointOnDesktop).roundToInt());\r
+ }\r
+ }\r
+\r
+ return -1;\r
+}\r
+\r
+- (UITextRange*) characterRangeAtPoint: (CGPoint) point\r
+{\r
+ const auto index = [self closestIndexToPoint: point];\r
+ const auto result = index != -1 ? [JuceUITextRange from: index to: index] : nil;\r
+ jassert (result != nullptr);\r
+ return result;\r
+}\r
+\r
+- (UITextPosition*) closestPositionToPoint: (CGPoint) point\r
+{\r
+ const auto index = [self closestIndexToPoint: point];\r
+ const auto result = index != -1 ? [JuceUITextPosition withIndex: index] : nil;\r
+ jassert (result != nullptr);\r
+ return result;\r
+}\r
+\r
+- (UITextPosition*) closestPositionToPoint: (CGPoint) point\r
+ withinRange: (JuceUITextRange*) range\r
+{\r
+ const auto index = [self closestIndexToPoint: point];\r
+ const auto result = index != -1 ? [JuceUITextPosition withIndex: [range range].clipValue (index)] : nil;\r
+ jassert (result != nullptr);\r
+ return result;\r
+}\r
+\r
+- (NSComparisonResult) comparePosition: (JuceUITextPosition*) position\r
+ toPosition: (JuceUITextPosition*) other\r
+{\r
+ const auto a = position != nil ? makeOptional (position->index) : nullopt;\r
+ const auto b = other != nil ? makeOptional (other ->index) : nullopt;\r
+\r
+ if (a < b)\r
+ return NSOrderedAscending;\r
+\r
+ if (b < a)\r
+ return NSOrderedDescending;\r
+\r
+ return NSOrderedSame;\r
+}\r
+\r
+- (NSInteger) offsetFromPosition: (JuceUITextPosition*) from\r
+ toPosition: (JuceUITextPosition*) toPosition\r
+{\r
+ if (from != nil && toPosition != nil)\r
+ return toPosition->index - from->index;\r
+\r
+ return 0;\r
+}\r
+\r
+- (int) indexFromPosition: (JuceUITextPosition*) position\r
+ inDirection: (UITextLayoutDirection) direction\r
+ offset: (NSInteger) offset\r
+{\r
+ switch (direction)\r
+ {\r
+ case UITextLayoutDirectionLeft:\r
+ case UITextLayoutDirectionRight:\r
+ return position->index + (int) (offset * (direction == UITextLayoutDirectionLeft ? -1 : 1));\r
+\r
+ case UITextLayoutDirectionUp:\r
+ case UITextLayoutDirectionDown:\r
+ {\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ const auto originalRectangle = target->getCaretRectangleForCharIndex (position->index);\r
+\r
+ auto testIndex = position->index;\r
+\r
+ for (auto lineOffset = 0; lineOffset < offset; ++lineOffset)\r
+ {\r
+ const auto caretRect = target->getCaretRectangleForCharIndex (testIndex);\r
+ const auto newY = direction == UITextLayoutDirectionUp ? caretRect.getY() - 1\r
+ : caretRect.getBottom() + 1;\r
+ testIndex = target->getCharIndexForPoint ({ originalRectangle.getX(), newY });\r
+ }\r
+\r
+ return testIndex;\r
+ }\r
+ }\r
+ }\r
+\r
+ return position->index;\r
+}\r
+\r
+- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position\r
+ inDirection: (UITextLayoutDirection) direction\r
+ offset: (NSInteger) offset\r
+{\r
+ return [JuceUITextPosition withIndex: [self indexFromPosition: position inDirection: direction offset: offset]];\r
+}\r
+\r
+- (UITextPosition*) positionFromPosition: (JuceUITextPosition*) position\r
+ offset: (NSInteger) offset\r
+{\r
+ if (position != nil)\r
+ {\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ const auto newIndex = position->index + (int) offset;\r
+\r
+ if (isPositiveAndBelow (newIndex, target->getTotalNumChars() + 1))\r
+ return [JuceUITextPosition withIndex: newIndex];\r
+ }\r
+ }\r
+\r
+ return nil;\r
+}\r
+\r
+- (CGRect) firstRectForRange: (JuceUITextRange*) range\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (auto* comp = dynamic_cast<Component*> (target))\r
+ {\r
+ const auto list = target->getTextBounds ([range range]);\r
+\r
+ if (! list.isEmpty())\r
+ {\r
+ const auto areaOnDesktop = comp->localAreaToGlobal (list.getRectangle (0));\r
+ return convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+ }\r
+ }\r
+ }\r
+\r
+ return {};\r
+}\r
+\r
+- (NSArray<UITextSelectionRect*>*) selectionRectsForRange: (JuceUITextRange*) range\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ {\r
+ if (auto* comp = dynamic_cast<Component*> (target))\r
+ {\r
+ const auto list = target->getTextBounds ([range range]);\r
+\r
+ auto* result = [NSMutableArray arrayWithCapacity: (NSUInteger) list.getNumRectangles()];\r
+\r
+ for (const auto& rect : list)\r
+ {\r
+ const auto areaOnDesktop = comp->localAreaToGlobal (rect);\r
+ const auto nativeArea = convertToCGRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop));\r
+\r
+ [result addObject: [JuceUITextSelectionRect withRect: nativeArea]];\r
+ }\r
+\r
+ return result;\r
+ }\r
+ }\r
+\r
+ return nil;\r
+}\r
+\r
+- (UITextPosition*) positionWithinRange: (JuceUITextRange*) range\r
+ farthestInDirection: (UITextLayoutDirection) direction\r
+{\r
+ return direction == UITextLayoutDirectionUp || direction == UITextLayoutDirectionLeft\r
+ ? [range start]\r
+ : [range end];\r
+}\r
+\r
+- (void) replaceRange: (JuceUITextRange*) range\r
+ withText: (NSString*) text\r
+{\r
+ if (owner == nullptr)\r
+ return;\r
+\r
+ owner->stringBeingComposed.clear();\r
+\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ {\r
+ target->setHighlightedRegion ([range range]);\r
+ target->insertTextAtCaret (nsStringToJuce (text));\r
+ }\r
+}\r
+\r
+- (void) setBaseWritingDirection: (NSWritingDirection) writingDirection\r
+ forRange: (UITextRange*) range\r
+{\r
+}\r
+\r
+- (NSString*) textInRange: (JuceUITextRange*) range\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ return juceStringToNS (target->getTextInRange ([range range]));\r
+\r
+ return nil;\r
+}\r
+\r
+- (UITextRange*) textRangeFromPosition: (JuceUITextPosition*) fromPosition\r
+ toPosition: (JuceUITextPosition*) toPosition\r
+{\r
+ const auto from = fromPosition != nil ? fromPosition->index : 0;\r
+ const auto to = toPosition != nil ? toPosition ->index : 0;\r
+\r
+ return [JuceUITextRange withRange: Range<int>::between (from, to)];\r
+}\r
+\r
+- (void) setInputDelegate: (id<UITextInputDelegate>) delegateIn\r
+{\r
+ delegate = delegateIn;\r
+}\r
+\r
+- (id<UITextInputDelegate>) inputDelegate\r
+{\r
+ return delegate;\r
+}\r
+\r
+- (UIKeyboardType) keyboardType\r
+{\r
+ if (auto* target = [self getTextInputTarget])\r
+ return UIViewComponentPeer::getUIKeyboardType (target->getKeyboardType());\r
+\r
+ return UIKeyboardTypeDefault;\r
+}\r
+\r
+- (UITextAutocapitalizationType) autocapitalizationType\r
+{\r
+ return UITextAutocapitalizationTypeNone;\r
+}\r
+\r
+- (UITextAutocorrectionType) autocorrectionType\r
+{\r
+ return UITextAutocorrectionTypeNo;\r
+}\r
+\r
+- (BOOL) canBecomeFirstResponder\r
+{\r
+ return YES;\r
+}\r
+\r
+@end\r
+\r
+//==============================================================================\r
+@implementation JuceTextInputTokenizer\r
+\r
+- (instancetype) initWithPeer: (UIViewComponentPeer*) peerIn\r
+{\r
+ [super initWithTextInput: peerIn->hiddenTextInput.get()];\r
+ peer = peerIn;\r
+ return self;\r
+}\r
+\r
+- (UITextRange*) rangeEnclosingPosition: (JuceUITextPosition*) position\r
+ withGranularity: (UITextGranularity) granularity\r
+ inDirection: (UITextDirection) direction\r
+{\r
+ if (granularity != UITextGranularityLine)\r
+ return [super rangeEnclosingPosition: position withGranularity: granularity inDirection: direction];\r
+\r
+ auto* target = peer->findCurrentTextInputTarget();\r
+\r
+ if (target == nullptr)\r
+ return nullptr;\r
+\r
+ const auto numChars = target->getTotalNumChars();\r
+\r
+ if (! isPositiveAndBelow (position->index, numChars))\r
+ return nullptr;\r
+\r
+ const auto allText = target->getTextInRange ({ 0, numChars });\r
+\r
+ const auto begin = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.begin());\r
+ const auto end = AccessibilityTextHelpers::makeCharPtrIteratorAdapter (allText.end());\r
+ const auto positionIter = begin + position->index;\r
+\r
+ const auto nextNewlineIter = std::find (positionIter, end, '\n');\r
+ const auto lastNewlineIter = std::find (std::make_reverse_iterator (positionIter),\r
+ std::make_reverse_iterator (begin),\r
+ '\n').base();\r
+\r
+ const auto from = std::distance (begin, lastNewlineIter);\r
+ const auto to = std::distance (begin, nextNewlineIter);\r
+\r
+ return [JuceUITextRange from: from to: to];\r
+}\r
+\r
+@end\r
+\r
//==============================================================================\r
//==============================================================================\r
namespace juce\r
\r
#if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
if (@available (iOS 13, *))\r
- metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<UIView>> (view, comp);\r
+ metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<UIView>> (view, comp.isOpaque());\r
#endif\r
\r
if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
\r
void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEventFlags)\r
{\r
+ if (event == nullptr)\r
+ return;\r
+\r
NSArray* touches = [[event touchesForView: view] allObjects];\r
\r
for (unsigned int i = 0; i < [touches count]; ++i)\r
}\r
}\r
\r
-void UIViewComponentPeer::textInputRequired (Point<int> pos, TextInputTarget& target)\r
-{\r
- view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0);\r
-\r
- updateHiddenTextContent (target);\r
- [view->hiddenTextView becomeFirstResponder];\r
-}\r
-\r
-void UIViewComponentPeer::dismissPendingTextInput()\r
+void UIViewComponentPeer::textInputRequired (Point<int>, TextInputTarget&)\r
{\r
- closeInputMethodContext();\r
- [view->hiddenTextView resignFirstResponder];\r
+ [hiddenTextInput.get() becomeFirstResponder];\r
}\r
\r
-static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept\r
+void UIViewComponentPeer::closeInputMethodContext()\r
{\r
- switch (type)\r
+ if (auto* input = hiddenTextInput.get())\r
{\r
- case TextInputTarget::textKeyboard: return UIKeyboardTypeAlphabet;\r
- case TextInputTarget::numericKeyboard: return UIKeyboardTypeNumbersAndPunctuation;\r
- case TextInputTarget::decimalKeyboard: return UIKeyboardTypeNumbersAndPunctuation;\r
- case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL;\r
- case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress;\r
- case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad;\r
- default: jassertfalse; break;\r
+ if (auto* delegate = [input inputDelegate])\r
+ {\r
+ [delegate selectionWillChange: input];\r
+ [delegate selectionDidChange: input];\r
+ }\r
}\r
-\r
- return UIKeyboardTypeDefault;\r
}\r
\r
-void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget& target)\r
+void UIViewComponentPeer::dismissPendingTextInput()\r
{\r
- view->hiddenTextView.keyboardType = getUIKeyboardType (target.getKeyboardType());\r
- view->hiddenTextView.text = juceStringToNS (target.getTextInRange (Range<int> (0, target.getHighlightedRegion().getStart())));\r
- view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target.getHighlightedRegion().getStart(), 0);\r
+ closeInputMethodContext();\r
+ [hiddenTextInput.get() resignFirstResponder];\r
}\r
\r
BOOL UIViewComponentPeer::textViewReplaceCharacters (Range<int> range, const String& text)\r
handleKeyPress (KeyPress::returnKey, text[0]);\r
else\r
target->insertTextAtCaret (text);\r
-\r
- if (deletionChecker != nullptr)\r
- updateHiddenTextContent (*target);\r
}\r
\r
return NO;\r
if (metalRenderer != nullptr)\r
return metalRenderer->drawRectangleList (view,\r
(float) view.contentScaleFactor,\r
- view.frame,\r
- component,\r
[this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); },\r
deferredRepaints);\r
\r
Array<AppInactivityCallback*> appBecomingInactiveCallbacks;\r
}\r
\r
-#if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+#if JUCE_PUSH_NOTIFICATIONS\r
@interface JuceAppStartupDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>\r
#else\r
@interface JuceAppStartupDelegate : NSObject <UIApplicationDelegate>\r
completionHandler: (void (^)(void)) completionHandler;\r
- (void) applicationDidReceiveMemoryWarning: (UIApplication *) application;\r
#if JUCE_PUSH_NOTIFICATIONS\r
-- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings;\r
-- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken;\r
-- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error;\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo;\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
- fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo\r
- completionHandler: (void(^)()) completionHandler;\r
-- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler;\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo\r
- completionHandler: (void(^)()) completionHandler;\r
-#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification\r
+\r
+- (void) application: (UIApplication*) application\r
+ didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken;\r
+- (void) application: (UIApplication*) application\r
+ didFailToRegisterForRemoteNotificationsWithError: (NSError*) error;\r
+- (void) application: (UIApplication*) application\r
+ didReceiveRemoteNotification: (NSDictionary*) userInfo;\r
+- (void) application: (UIApplication*) application\r
+ didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+ fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler;\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forRemoteNotification: (NSDictionary*) userInfo\r
+ withResponseInfo: (NSDictionary*) responseInfo\r
+ completionHandler: (void(^)()) completionHandler;\r
+\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+- (void) application: (UIApplication*) application\r
+ didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings;\r
+- (void) application: (UIApplication*) application\r
+ didReceiveLocalNotification: (UILocalNotification*) notification;\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forLocalNotification: (UILocalNotification*) notification\r
+ completionHandler: (void(^)()) completionHandler;\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forLocalNotification: (UILocalNotification*) notification\r
+ withResponseInfo: (NSDictionary*) responseInfo\r
+ completionHandler: (void(^)()) completionHandler;\r
+\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ willPresentNotification: (UNNotification*) notification\r
withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler;\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ didReceiveNotificationResponse: (UNNotificationResponse*) response\r
withCompletionHandler: (void(^)())completionHandler;\r
-#endif\r
+\r
#endif\r
\r
@end\r
self = [super init];\r
appSuspendTask = UIBackgroundTaskInvalid;\r
\r
- #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+ #if JUCE_PUSH_NOTIFICATIONS\r
[UNUserNotificationCenter currentNotificationCenter].delegate = self;\r
#endif\r
\r
}\r
\r
#if JUCE_PUSH_NOTIFICATIONS\r
-- (void) application: (UIApplication*) application didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings\r
-{\r
- ignoreUnused (application);\r
\r
- SEL selector = @selector (application:didRegisterUserNotificationSettings:);\r
-\r
- if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
- {\r
- NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
- [invocation setSelector: selector];\r
- [invocation setTarget: _pushNotificationsDelegate];\r
- [invocation setArgument: &application atIndex:2];\r
- [invocation setArgument: ¬ificationSettings atIndex:3];\r
-\r
- [invocation invoke];\r
- }\r
-}\r
-\r
-- (void) application: (UIApplication*) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken\r
+- (void) application: (UIApplication*) application\r
+ didRegisterForRemoteNotificationsWithDeviceToken: (NSData*) deviceToken\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application didFailToRegisterForRemoteNotificationsWithError: (NSError*) error\r
+- (void) application: (UIApplication*) application\r
+ didFailToRegisterForRemoteNotificationsWithError: (NSError*) error\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+- (void) application: (UIApplication*) application\r
+ didReceiveRemoteNotification: (NSDictionary*) userInfo\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application didReceiveRemoteNotification: (NSDictionary*) userInfo\r
- fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler\r
+- (void) application: (UIApplication*) application\r
+ didReceiveRemoteNotification: (NSDictionary*) userInfo\r
+ fetchCompletionHandler: (void (^)(UIBackgroundFetchResult result)) completionHandler\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forRemoteNotification: (NSDictionary*) userInfo withResponseInfo: (NSDictionary*) responseInfo\r
- completionHandler: (void(^)()) completionHandler\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forRemoteNotification: (NSDictionary*) userInfo\r
+ withResponseInfo: (NSDictionary*) responseInfo\r
+ completionHandler: (void(^)()) completionHandler\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application didReceiveLocalNotification: (UILocalNotification*) notification\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+- (void) application: (UIApplication*) application\r
+ didRegisterUserNotificationSettings: (UIUserNotificationSettings*) notificationSettings\r
+{\r
+ ignoreUnused (application);\r
+\r
+ SEL selector = @selector (application:didRegisterUserNotificationSettings:);\r
+\r
+ if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector:selector])\r
+ {\r
+ NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
+ [invocation setSelector: selector];\r
+ [invocation setTarget: _pushNotificationsDelegate];\r
+ [invocation setArgument: &application atIndex: 2];\r
+ [invocation setArgument: ¬ificationSettings atIndex: 3];\r
+\r
+ [invocation invoke];\r
+ }\r
+}\r
+\r
+- (void) application: (UIApplication*) application\r
+ didReceiveLocalNotification: (UILocalNotification*) notification\r
{\r
ignoreUnused (application);\r
\r
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: [_pushNotificationsDelegate methodSignatureForSelector: selector]];\r
[invocation setSelector: selector];\r
[invocation setTarget: _pushNotificationsDelegate];\r
- [invocation setArgument: &application atIndex:2];\r
- [invocation setArgument: ¬ification atIndex:3];\r
+ [invocation setArgument: &application atIndex: 2];\r
+ [invocation setArgument: ¬ification atIndex: 3];\r
\r
[invocation invoke];\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forLocalNotification: (UILocalNotification*) notification completionHandler: (void(^)()) completionHandler\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forLocalNotification: (UILocalNotification*) notification\r
+ completionHandler: (void(^)()) completionHandler\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-- (void) application: (UIApplication*) application handleActionWithIdentifier: (NSString*) identifier\r
- forLocalNotification: (UILocalNotification*) notification withResponseInfo: (NSDictionary*) responseInfo\r
- completionHandler: (void(^)()) completionHandler\r
+- (void) application: (UIApplication*) application\r
+ handleActionWithIdentifier: (NSString*) identifier\r
+ forLocalNotification: (UILocalNotification*) notification\r
+ withResponseInfo: (NSDictionary*) responseInfo\r
+ completionHandler: (void(^)()) completionHandler\r
{\r
ignoreUnused (application);\r
\r
}\r
}\r
\r
-#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center willPresentNotification: (UNNotification*) notification\r
- withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ willPresentNotification: (UNNotification*) notification\r
+ withCompletionHandler: (void (^)(UNNotificationPresentationOptions options)) completionHandler\r
{\r
ignoreUnused (center);\r
\r
}\r
}\r
\r
-- (void) userNotificationCenter: (UNUserNotificationCenter*) center didReceiveNotificationResponse: (UNNotificationResponse*) response\r
- withCompletionHandler: (void(^)()) completionHandler\r
+- (void) userNotificationCenter: (UNUserNotificationCenter*) center\r
+ didReceiveNotificationResponse: (UNNotificationResponse*) response\r
+ withCompletionHandler: (void(^)()) completionHandler\r
{\r
ignoreUnused (center);\r
\r
}\r
}\r
#endif\r
-#endif\r
\r
@end\r
\r
\r
bool Desktop::isDarkModeActive() const\r
{\r
- #if defined (__IPHONE_12_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0\r
if (@available (iOS 12.0, *))\r
return [[[UIScreen mainScreen] traitCollection] userInterfaceStyle] == UIUserInterfaceStyleDark;\r
- #endif\r
\r
return false;\r
}\r
\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+static const auto darkModeSelector = @selector (darkModeChanged:);\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
class Desktop::NativeDarkModeChangeDetectorImpl\r
{\r
public:\r
NativeDarkModeChangeDetectorImpl()\r
{\r
static DelegateClass delegateClass;\r
-\r
- delegate = [delegateClass.createInstance() init];\r
- object_setInstanceVariable (delegate, "owner", this);\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
- [[NSNotificationCenter defaultCenter] addObserver: delegate\r
- selector: @selector (darkModeChanged:)\r
- name: UIViewComponentPeer::getDarkModeNotificationName()\r
- object: nil];\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
- }\r
-\r
- ~NativeDarkModeChangeDetectorImpl()\r
- {\r
- object_setInstanceVariable (delegate, "owner", nullptr);\r
- [[NSNotificationCenter defaultCenter] removeObserver: delegate];\r
- [delegate release];\r
- }\r
-\r
- void darkModeChanged()\r
- {\r
- Desktop::getInstance().darkModeChanged();\r
+ delegate.reset ([delegateClass.createInstance() init]);\r
+ observer.emplace (delegate.get(), darkModeSelector, UIViewComponentPeer::getDarkModeNotificationName(), nil);\r
}\r
\r
private:\r
{\r
DelegateClass() : ObjCClass<NSObject> ("JUCEDelegate_")\r
{\r
- addIvar<NativeDarkModeChangeDetectorImpl*> ("owner");\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
- addMethod (@selector (darkModeChanged:), darkModeChanged);\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
+ addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); });\r
registerClass();\r
}\r
-\r
- static void darkModeChanged (id self, SEL, NSNotification*)\r
- {\r
- if (auto* owner = getIvar<NativeDarkModeChangeDetectorImpl*> (self, "owner"))\r
- owner->darkModeChanged();\r
- }\r
};\r
\r
- id delegate = nil;\r
+ NSUniquePtr<NSObject> delegate;\r
+ Optional<ScopedNotificationCenterObserver> observer;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)\r
};\r
return std::make_unique<NativeDarkModeChangeDetectorImpl>();\r
}\r
\r
+//==============================================================================\r
Point<float> MouseInputSource::getCurrentRawMousePosition()\r
{\r
return juce_lastMousePos;\r
return Orientations::convertToJuce (orientation);\r
}\r
\r
+template <typename Value>\r
+static BorderSize<Value> operator/ (BorderSize<Value> border, Value scale)\r
+{\r
+ return { border.getTop() / scale,\r
+ border.getLeft() / scale,\r
+ border.getBottom() / scale,\r
+ border.getRight() / scale };\r
+}\r
+\r
+template <typename Value>\r
+static BorderSize<int> roundToInt (BorderSize<Value> border)\r
+{\r
+ return { roundToInt (border.getTop()),\r
+ roundToInt (border.getLeft()),\r
+ roundToInt (border.getBottom()),\r
+ roundToInt (border.getRight()) };\r
+}\r
+\r
// The most straightforward way of retrieving the screen area available to an iOS app\r
// seems to be to create a new window (which will take up all available space) and to\r
// query its frame.\r
\r
static BorderSize<int> getSafeAreaInsets (float masterScale)\r
{\r
- #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
if (@available (iOS 11.0, *))\r
{\r
UIEdgeInsets safeInsets = TemporaryWindow().window.safeAreaInsets;\r
-\r
- auto getInset = [&] (CGFloat original) { return roundToInt (original / masterScale); };\r
-\r
- return { getInset (safeInsets.top), getInset (safeInsets.left),\r
- getInset (safeInsets.bottom), getInset (safeInsets.right) };\r
+ return roundToInt (BorderSize<double> { safeInsets.top,\r
+ safeInsets.left,\r
+ safeInsets.bottom,\r
+ safeInsets.right } / (double) masterScale);\r
}\r
- #endif\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
auto statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;\r
return { roundToInt (statusBarHeight / masterScale), 0, 0, 0 };\r
}\r
\r
+//==============================================================================\r
void Displays::findDisplays (float masterScale)\r
{\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+ static const auto keyboardShownSelector = @selector (keyboardShown:);\r
+ static const auto keyboardHiddenSelector = @selector (keyboardHidden:);\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+ class OnScreenKeyboardChangeDetectorImpl\r
+ {\r
+ public:\r
+ OnScreenKeyboardChangeDetectorImpl()\r
+ {\r
+ static DelegateClass delegateClass;\r
+ delegate.reset ([delegateClass.createInstance() init]);\r
+ object_setInstanceVariable (delegate.get(), "owner", this);\r
+ observers.emplace_back (delegate.get(), keyboardShownSelector, UIKeyboardDidShowNotification, nil);\r
+ observers.emplace_back (delegate.get(), keyboardHiddenSelector, UIKeyboardDidHideNotification, nil);\r
+ }\r
+\r
+ auto getInsets() const { return insets; }\r
+\r
+ private:\r
+ struct DelegateClass : public ObjCClass<NSObject>\r
+ {\r
+ DelegateClass() : ObjCClass<NSObject> ("JUCEOnScreenKeyboardObserver_")\r
+ {\r
+ addIvar<OnScreenKeyboardChangeDetectorImpl*> ("owner");\r
+\r
+ addMethod (keyboardShownSelector, [] (id self, SEL, NSNotification* notification)\r
+ {\r
+ setKeyboardScreenBounds (self, [&]() -> BorderSize<double>\r
+ {\r
+ auto* info = [notification userInfo];\r
+\r
+ if (info == nullptr)\r
+ return {};\r
+\r
+ auto* value = static_cast<NSValue*> ([info objectForKey: UIKeyboardFrameEndUserInfoKey]);\r
+\r
+ if (value == nullptr)\r
+ return {};\r
+\r
+ auto* display = getPrimaryDisplayImpl (Desktop::getInstance().getDisplays());\r
+\r
+ if (display == nullptr)\r
+ return {};\r
+\r
+ const auto rect = convertToRectInt ([value CGRectValue]);\r
+\r
+ BorderSize<double> result;\r
+\r
+ if (rect.getY() == display->totalArea.getY())\r
+ result.setTop (rect.getHeight());\r
+\r
+ if (rect.getBottom() == display->totalArea.getBottom())\r
+ result.setBottom (rect.getHeight());\r
+\r
+ return result;\r
+ }());\r
+ });\r
+\r
+ addMethod (keyboardHiddenSelector, [] (id self, SEL, NSNotification*)\r
+ {\r
+ setKeyboardScreenBounds (self, {});\r
+ });\r
+\r
+ registerClass();\r
+ }\r
+\r
+ private:\r
+ static void setKeyboardScreenBounds (id self, BorderSize<double> insets)\r
+ {\r
+ if (std::exchange (getIvar<OnScreenKeyboardChangeDetectorImpl*> (self, "owner")->insets, insets) != insets)\r
+ Desktop::getInstance().displays->refresh();\r
+ }\r
+ };\r
+\r
+ BorderSize<double> insets;\r
+ NSUniquePtr<NSObject> delegate;\r
+ std::vector<ScopedNotificationCenterObserver> observers;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OnScreenKeyboardChangeDetectorImpl)\r
+ };\r
+\r
JUCE_AUTORELEASEPOOL\r
{\r
+ static OnScreenKeyboardChangeDetectorImpl keyboardChangeDetector;\r
+\r
UIScreen* s = [UIScreen mainScreen];\r
\r
Display d;\r
d.totalArea = convertToRectInt ([s bounds]) / masterScale;\r
d.userArea = getRecommendedWindowBounds() / masterScale;\r
d.safeAreaInsets = getSafeAreaInsets (masterScale);\r
+ d.keyboardInsets = roundToInt (keyboardChangeDetector.getInsets() / (double) masterScale);\r
d.isMain = true;\r
d.scale = masterScale * s.scale;\r
d.dpi = 160 * d.scale;\r
{\r
public:\r
//==============================================================================\r
- CoreGraphicsMetalLayerRenderer (ViewType* view, const Component& comp)\r
+ CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque)\r
{\r
device.reset (MTLCreateSystemDefaultDevice());\r
commandQueue.reset ([device.get() newCommandQueue]);\r
\r
- attach (view, comp);\r
+ attach (view, isOpaque);\r
}\r
\r
~CoreGraphicsMetalLayerRenderer()\r
}\r
}\r
\r
- void attach (ViewType* view, const Component& comp)\r
+ void attach (ViewType* view, bool isOpaque)\r
{\r
#if JUCE_MAC\r
view.wantsLayer = YES;\r
layer.device = device.get();\r
layer.framebufferOnly = NO;\r
layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB;\r
- layer.opaque = comp.isOpaque();\r
+ layer.opaque = isOpaque;\r
layer.allowsNextDrawableTimeout = NO;\r
\r
attachedView = view;\r
template <typename Callback>\r
bool drawRectangleList (ViewType* view,\r
float scaleFactor,\r
- CGRect viewFrame,\r
- const Component& comp,\r
Callback&& drawRectWithContext,\r
const RectangleList<float>& dirtyRegions)\r
{\r
layer.contentsScale = scaleFactor;\r
const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale,\r
layer.contentsScale);\r
- const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform);\r
-\r
- const auto componentHeight = comp.getHeight();\r
+ const auto transformedFrameSize = CGSizeApplyAffineTransform (view.frame.size, drawableSizeTansform);\r
\r
if (resources == nullptr || ! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize))\r
{\r
layer.drawableSize = transformedFrameSize;\r
- resources = std::make_unique<Resources> (device.get(), layer, componentHeight);\r
+ resources = std::make_unique<Resources> (device.get(), layer);\r
}\r
\r
auto gpuTexture = resources->getGpuTexture();\r
class Resources\r
{\r
public:\r
- Resources (id<MTLDevice> metalDevice, CAMetalLayer* layer, int componentHeight)\r
+ Resources (id<MTLDevice> metalDevice, CAMetalLayer* layer)\r
{\r
const auto bytesPerRow = alignTo ((size_t) layer.drawableSize.width * 4, 256);\r
\r
CGColorSpaceCreateWithName (kCGColorSpaceSRGB),\r
(uint32_t) kCGImageAlphaPremultipliedFirst | (uint32_t) kCGBitmapByteOrder32Host));\r
\r
- CGContextScaleCTM (cgContext.get(), layer.contentsScale, layer.contentsScale);\r
- CGContextConcatCTM (cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight));\r
+ CGContextTranslateCTM (cgContext.get(), 0, layer.drawableSize.height);\r
+ CGContextScaleCTM (cgContext.get(), layer.contentsScale, -layer.contentsScale);\r
\r
textureDesc.storageMode = MTLStorageModePrivate;\r
gpuTexturePool = std::make_unique<GpuTexturePool> (metalDevice, textureDesc);\r
\r
[item setTag: topLevelIndex];\r
[item setEnabled: i.isEnabled];\r
- #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
[item setState: i.isTicked ? NSControlStateValueOn : NSControlStateValueOff];\r
- #else\r
- [item setState: i.isTicked ? NSOnState : NSOffState];\r
- #endif\r
[item setTarget: (id) callback];\r
\r
auto* juceItem = new PopupMenu::Item (i);\r
{\r
addMethod (menuItemInvokedSelector, menuItemInvoked);\r
addMethod (@selector (validateMenuItem:), validateMenuItem);\r
-\r
- #if defined (MAC_OS_X_VERSION_10_14)\r
addProtocol (@protocol (NSMenuItemValidation));\r
- #endif\r
\r
registerClass();\r
}\r
addMethod (@selector (validateMenuItem:), validateMenuItem);\r
\r
addProtocol (@protocol (NSMenuDelegate));\r
-\r
- #if defined (MAC_OS_X_VERSION_10_14)\r
addProtocol (@protocol (NSMenuItemValidation));\r
- #endif\r
\r
registerClass();\r
}\r
\r
resetTrackingArea (view);\r
\r
- notificationCenter = [NSNotificationCenter defaultCenter];\r
-\r
- [notificationCenter addObserver: view\r
- selector: frameChangedSelector\r
- name: NSViewFrameDidChangeNotification\r
- object: view];\r
+ scopedObservers.emplace_back (view, frameChangedSelector, NSViewFrameDidChangeNotification, view);\r
\r
[view setPostsFrameChangedNotifications: YES];\r
\r
#if USE_COREGRAPHICS_RENDERING\r
#if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
if (@available (macOS 10.14, *))\r
- metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<NSView>> (view, getComponent());\r
+ metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<NSView>> (view, getComponent().isOpaque());\r
#endif\r
if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
{\r
\r
[window setRestorable: NO];\r
\r
- #if defined (MAC_OS_X_VERSION_10_12) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12)\r
if (@available (macOS 10.12, *))\r
[window setTabbingMode: NSWindowTabbingModeDisallowed];\r
- #endif\r
\r
- [notificationCenter addObserver: view\r
- selector: frameChangedSelector\r
- name: NSWindowDidMoveNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: frameChangedSelector\r
- name: NSWindowDidMiniaturizeNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (windowWillMiniaturize:)\r
- name: NSWindowWillMiniaturizeNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (windowDidDeminiaturize:)\r
- name: NSWindowDidDeminiaturizeNotification\r
- object: window];\r
+ scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMoveNotification, window);\r
+ scopedObservers.emplace_back (view, frameChangedSelector, NSWindowDidMiniaturizeNotification, window);\r
+ scopedObservers.emplace_back (view, @selector (windowWillMiniaturize:), NSWindowWillMiniaturizeNotification, window);\r
+ scopedObservers.emplace_back (view, @selector (windowDidMiniaturize:), NSWindowDidMiniaturizeNotification, window);\r
}\r
\r
auto alpha = component.getAlpha();\r
CVDisplayLinkStop (displayLink);\r
dispatch_source_cancel (displaySource);\r
\r
- [notificationCenter removeObserver: view];\r
+ scopedObservers.clear();\r
+\r
setOwner (view, nullptr);\r
\r
if ([view superview] != nil)\r
\r
void redirectWillMoveToWindow (NSWindow* newWindow)\r
{\r
- if (auto* currentWindow = [view window])\r
- {\r
- [notificationCenter removeObserver: view\r
- name: NSWindowDidMoveNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter removeObserver: view\r
- name: NSWindowWillMiniaturizeNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter removeObserver: view\r
- name: NSWindowDidBecomeKeyNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter removeObserver: view\r
- name: NSWindowDidChangeScreenNotification\r
- object: currentWindow];\r
- }\r
+ windowObservers.clear();\r
\r
if (isSharedWindow && [view window] == window && newWindow == nullptr)\r
{\r
\r
if (metalRenderer != nullptr)\r
{\r
- const auto compBounds = getComponent().getLocalBounds().toFloat();\r
+ auto setDeferredRepaintsToWholeFrame = [this]\r
+ {\r
+ const auto frameSize = view.frame.size;\r
+ deferredRepaints = Rectangle<float> { (float) frameSize.width, (float) frameSize.height };\r
+ };\r
\r
// If we are resizing we need to fall back to synchronous drawing to avoid artefacts\r
if ([window inLiveResize] || numFramesToSkipMetalRenderer > 0)\r
if (metalRenderer->isAttachedToView (view))\r
{\r
metalRenderer->detach();\r
- deferredRepaints = compBounds;\r
+ setDeferredRepaintsToWholeFrame();\r
}\r
\r
if (numFramesToSkipMetalRenderer > 0)\r
{\r
if (! metalRenderer->isAttachedToView (view))\r
{\r
- metalRenderer->attach (view, getComponent());\r
- deferredRepaints = compBounds;\r
+ metalRenderer->attach (view, getComponent().isOpaque());\r
+ setDeferredRepaintsToWholeFrame();\r
}\r
}\r
}\r
if (metalRenderer != nullptr && metalRenderer->isAttachedToView (view))\r
return metalRenderer->drawRectangleList (view,\r
(float) [[view window] backingScaleFactor],\r
- view.frame,\r
- getComponent(),\r
[this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); },\r
deferredRepaints);\r
\r
\r
if (auto* currentWindow = [view window])\r
{\r
- [notificationCenter addObserver: view\r
- selector: dismissModalsSelector\r
- name: NSWindowWillMoveNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter addObserver: view\r
- selector: dismissModalsSelector\r
- name: NSWindowWillMiniaturizeNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter addObserver: view\r
- selector: becomeKeySelector\r
- name: NSWindowDidBecomeKeyNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter addObserver: view\r
- selector: resignKeySelector\r
- name: NSWindowDidResignKeyNotification\r
- object: currentWindow];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (windowDidChangeScreen:)\r
- name: NSWindowDidChangeScreenNotification\r
- object: currentWindow];\r
+ windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMoveNotification, currentWindow);\r
+ windowObservers.emplace_back (view, dismissModalsSelector, NSWindowWillMiniaturizeNotification, currentWindow);\r
+ windowObservers.emplace_back (view, becomeKeySelector, NSWindowDidBecomeKeyNotification, currentWindow);\r
+ windowObservers.emplace_back (view, resignKeySelector, NSWindowDidResignKeyNotification, currentWindow);\r
+ windowObservers.emplace_back (view, @selector (windowDidChangeScreen:), NSWindowDidChangeScreenNotification, currentWindow);\r
\r
updateCVDisplayLinkScreen();\r
}\r
{\r
const auto type = []\r
{\r
- #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
if (@available (macOS 10.13, *))\r
return NSPasteboardTypeFileURL;\r
- #endif\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
return (NSString*) kUTTypeFileURL;\r
\r
void resetWindowPresentation()\r
{\r
+ [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))];\r
+\r
if (hasNativeTitleBar())\r
- {\r
- [window setStyleMask: (NSViewComponentPeer::getNSWindowStyleMask (getStyleFlags()))];\r
setTitle (getComponent().getName()); // required to force the OS to update the title\r
- }\r
\r
[NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
setCollectionBehaviour (isFullScreen());\r
bool windowRepresentsFile = false;\r
bool isAlwaysOnTop = false, wasAlwaysOnTop = false;\r
String stringBeingComposed;\r
- NSNotificationCenter* notificationCenter = nil;\r
\r
Rectangle<float> lastSizeBeforeZoom;\r
RectangleList<float> deferredRepaints;\r
#if JUCE_64BIT\r
case NSEventTypeSmartMagnify:\r
case NSEventTypePressure:\r
- #endif\r
- #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- #if JUCE_64BIT\r
case NSEventTypeDirectTouch:\r
#endif\r
#if defined (MAC_OS_X_VERSION_10_15) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_15\r
case NSEventTypeChangeMode:\r
#endif\r
- #endif\r
default:\r
return false;\r
}\r
int numFramesToSkipMetalRenderer = 0;\r
std::unique_ptr<CoreGraphicsMetalLayerRenderer<NSView>> metalRenderer;\r
\r
+ std::vector<ScopedNotificationCenterObserver> scopedObservers;\r
+ std::vector<ScopedNotificationCenterObserver> windowObservers;\r
+\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NSViewComponentPeer)\r
};\r
\r
{\r
JuceNSViewClass() : NSViewComponentPeerWrapper ("JUCEView_")\r
{\r
- addMethod (@selector (isOpaque), isOpaque);\r
- addMethod (@selector (drawRect:), drawRect);\r
- addMethod (@selector (updateTrackingAreas), updateTrackingAreas);\r
- addMethod (@selector (mouseDown:), mouseDown);\r
- addMethod (@selector (mouseUp:), mouseUp);\r
- addMethod (@selector (mouseDragged:), mouseDragged);\r
- addMethod (@selector (mouseMoved:), mouseMoved);\r
- addMethod (@selector (mouseEntered:), mouseEntered);\r
- addMethod (@selector (mouseExited:), mouseExited);\r
- addMethod (@selector (rightMouseDown:), mouseDown);\r
- addMethod (@selector (rightMouseDragged:), mouseDragged);\r
- addMethod (@selector (rightMouseUp:), mouseUp);\r
- addMethod (@selector (otherMouseDown:), mouseDown);\r
- addMethod (@selector (otherMouseDragged:), mouseDragged);\r
- addMethod (@selector (otherMouseUp:), mouseUp);\r
- addMethod (@selector (scrollWheel:), scrollWheel);\r
- addMethod (@selector (magnifyWithEvent:), magnify);\r
- addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse);\r
- addMethod (@selector (windowWillMiniaturize:), windowWillMiniaturize);\r
- addMethod (@selector (windowDidDeminiaturize:), windowDidDeminiaturize);\r
- addMethod (@selector (windowDidChangeScreen:), windowDidChangeScreen);\r
- addMethod (@selector (wantsDefaultClipping), wantsDefaultClipping);\r
- addMethod (@selector (worksWhenModal), worksWhenModal);\r
- addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow);\r
- addMethod (@selector (viewWillDraw), viewWillDraw);\r
- addMethod (@selector (keyDown:), keyDown);\r
- addMethod (@selector (keyUp:), keyUp);\r
- addMethod (@selector (insertText:), insertText);\r
- addMethod (@selector (doCommandBySelector:), doCommandBySelector);\r
- addMethod (@selector (setMarkedText:selectedRange:), setMarkedText);\r
- addMethod (@selector (unmarkText), unmarkText);\r
- addMethod (@selector (hasMarkedText), hasMarkedText);\r
- addMethod (@selector (conversationIdentifier), conversationIdentifier);\r
- addMethod (@selector (attributedSubstringFromRange:), attributedSubstringFromRange);\r
- addMethod (@selector (markedRange), markedRange);\r
- addMethod (@selector (selectedRange), selectedRange);\r
- addMethod (@selector (firstRectForCharacterRange:), firstRectForCharacterRange);\r
- addMethod (@selector (characterIndexForPoint:), characterIndexForPoint);\r
- addMethod (@selector (validAttributesForMarkedText), validAttributesForMarkedText);\r
- addMethod (@selector (flagsChanged:), flagsChanged);\r
-\r
- addMethod (@selector (becomeFirstResponder), becomeFirstResponder);\r
- addMethod (@selector (resignFirstResponder), resignFirstResponder);\r
- addMethod (@selector (acceptsFirstResponder), acceptsFirstResponder);\r
-\r
- addMethod (@selector (draggingEntered:), draggingEntered);\r
- addMethod (@selector (draggingUpdated:), draggingUpdated);\r
- addMethod (@selector (draggingEnded:), draggingEnded);\r
- addMethod (@selector (draggingExited:), draggingExited);\r
- addMethod (@selector (prepareForDragOperation:), prepareForDragOperation);\r
- addMethod (@selector (performDragOperation:), performDragOperation);\r
- addMethod (@selector (concludeDragOperation:), concludeDragOperation);\r
-\r
- addMethod (@selector (paste:), paste);\r
- addMethod (@selector (copy:), copy);\r
- addMethod (@selector (cut:), cut);\r
- addMethod (@selector (selectAll:), selectAll);\r
-\r
- addMethod (@selector (viewWillMoveToWindow:), willMoveToWindow);\r
-\r
- addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement);\r
- addMethod (@selector (accessibilityChildren), getAccessibilityChildren);\r
- addMethod (@selector (accessibilityHitTest:), accessibilityHitTest);\r
- addMethod (@selector (accessibilityFocusedUIElement), getAccessibilityFocusedUIElement);\r
+ addMethod (@selector (isOpaque), [] (id self, SEL)\r
+ {\r
+ auto* owner = getOwner (self);\r
+ return owner == nullptr || owner->getComponent().isOpaque();\r
+ });\r
\r
- // deprecated methods required for backwards compatibility\r
- addMethod (@selector (accessibilityIsIgnored), getAccessibilityIsIgnored);\r
- addMethod (@selector (accessibilityAttributeValue:), getAccessibilityAttributeValue);\r
+ addMethod (@selector (updateTrackingAreas), [] (id self, SEL)\r
+ {\r
+ sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
\r
- addMethod (@selector (isFlipped), isFlipped);\r
+ resetTrackingArea (static_cast<NSView*> (self));\r
+ });\r
\r
- addMethod (NSViewComponentPeer::dismissModalsSelector, dismissModals);\r
- addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown);\r
- addMethod (NSViewComponentPeer::asyncMouseUpSelector, asyncMouseUp);\r
- addMethod (NSViewComponentPeer::frameChangedSelector, frameChanged);\r
- addMethod (NSViewComponentPeer::becomeKeySelector, becomeKey);\r
- addMethod (NSViewComponentPeer::resignKeySelector, resignKey);\r
+ addMethod (@selector (becomeFirstResponder), [] (id self, SEL)\r
+ {\r
+ callOnOwner (self, &NSViewComponentPeer::viewFocusGain);\r
+ return YES;\r
+ });\r
\r
- addMethod (@selector (performKeyEquivalent:), performKeyEquivalent);\r
+ addMethod (@selector (resignFirstResponder), [] (id self, SEL)\r
+ {\r
+ callOnOwner (self, &NSViewComponentPeer::viewFocusLoss);\r
+ return YES;\r
+ });\r
\r
- addProtocol (@protocol (NSTextInput));\r
+ addMethod (NSViewComponentPeer::dismissModalsSelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::dismissModals); });\r
+ addMethod (NSViewComponentPeer::frameChangedSelector, [] (id self, SEL, NSNotification*) { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); });\r
+ addMethod (NSViewComponentPeer::becomeKeySelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::becomeKey); });\r
+ addMethod (NSViewComponentPeer::resignKeySelector, [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::resignKey); });\r
\r
- registerClass();\r
- }\r
+ addMethod (@selector (paste:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectPaste, s); });\r
+ addMethod (@selector (copy:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCopy, s); });\r
+ addMethod (@selector (cut:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCut, s); });\r
+ addMethod (@selector (selectAll:), [] (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll, s); });\r
\r
-private:\r
- static void updateTrackingAreas (id self, SEL)\r
- {\r
- sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
+ addMethod (@selector (viewWillMoveToWindow:), [] (id self, SEL, NSWindow* w) { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w); });\r
\r
- resetTrackingArea (static_cast<NSView*> (self));\r
- }\r
+ addMethod (@selector (drawRect:), [] (id self, SEL, NSRect r) { callOnOwner (self, &NSViewComponentPeer::drawRect, r); });\r
+ addMethod (@selector (viewDidMoveToWindow), [] (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); });\r
+ addMethod (@selector (flagsChanged:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev); });\r
+ addMethod (@selector (mouseMoved:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove, ev); });\r
+ addMethod (@selector (mouseEntered:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter, ev); });\r
+ addMethod (@selector (mouseExited:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit, ev); });\r
+ addMethod (@selector (scrollWheel:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel, ev); });\r
+ addMethod (@selector (magnifyWithEvent:), [] (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMagnify, ev); });\r
\r
- static void mouseDown (id self, SEL s, NSEvent* ev)\r
- {\r
- if (JUCEApplicationBase::isStandaloneApp())\r
- {\r
- asyncMouseDown (self, s, ev);\r
- }\r
- else\r
- {\r
- // In some host situations, the host will stop modal loops from working\r
- // correctly if they're called from a mouse event, so we'll trigger\r
- // the event asynchronously..\r
- [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector\r
- withObject: ev\r
- waitUntilDone: NO];\r
- }\r
- }\r
+ addMethod (@selector (mouseDragged:), mouseDragged);\r
+ addMethod (@selector (rightMouseDragged:), mouseDragged);\r
+ addMethod (@selector (otherMouseDragged:), mouseDragged);\r
\r
- static void mouseUp (id self, SEL s, NSEvent* ev)\r
- {\r
- if (JUCEApplicationBase::isStandaloneApp())\r
- {\r
- asyncMouseUp (self, s, ev);\r
- }\r
- else\r
- {\r
- // In some host situations, the host will stop modal loops from working\r
- // correctly if they're called from a mouse event, so we'll trigger\r
- // the event asynchronously..\r
- [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector\r
- withObject: ev\r
- waitUntilDone: NO];\r
- }\r
- }\r
+ addMethod (NSViewComponentPeer::asyncMouseDownSelector, asyncMouseDown);\r
+ addMethod (NSViewComponentPeer::asyncMouseUpSelector, asyncMouseUp);\r
\r
- static void asyncMouseDown (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown, ev); }\r
- static void asyncMouseUp (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp, ev); }\r
- static void mouseDragged (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag, ev); }\r
- static void mouseMoved (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseMove, ev); }\r
- static void mouseEntered (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseEnter, ev); }\r
- static void mouseExited (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseExit, ev); }\r
- static void scrollWheel (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseWheel, ev); }\r
- static void magnify (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMagnify, ev); }\r
- static void copy (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCopy, s); }\r
- static void paste (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectPaste, s); }\r
- static void cut (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectCut, s); }\r
- static void selectAll (id self, SEL, NSObject* s) { callOnOwner (self, &NSViewComponentPeer::redirectSelectAll, s); }\r
- static void willMoveToWindow (id self, SEL, NSWindow* w) { callOnOwner (self, &NSViewComponentPeer::redirectWillMoveToWindow, w); }\r
-\r
- static BOOL acceptsFirstMouse (id, SEL, NSEvent*) { return YES; }\r
- static BOOL wantsDefaultClipping (id, SEL) { return YES; } // (this is the default, but may want to customise it in future)\r
- static BOOL worksWhenModal (id self, SEL) { if (auto* p = getOwner (self)) return p->worksWhenModal(); return NO; }\r
-\r
- static void drawRect (id self, SEL, NSRect r) { callOnOwner (self, &NSViewComponentPeer::drawRect, r); }\r
- static void frameChanged (id self, SEL, NSNotification*) { callOnOwner (self, &NSViewComponentPeer::redirectMovedOrResized); }\r
- static void viewDidMoveToWindow (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::viewMovedToWindow); }\r
- static void dismissModals (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::dismissModals); }\r
- static void becomeKey (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::becomeKey); }\r
- static void resignKey (id self, SEL) { callOnOwner (self, &NSViewComponentPeer::resignKey); }\r
-\r
- static BOOL isFlipped (id, SEL) { return true; }\r
-\r
- static void viewWillDraw (id self, SEL)\r
- {\r
- // Without setting contentsFormat macOS Big Sur will always set the invalid area\r
- // to be the entire frame.\r
- #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- if (@available (macOS 10.12, *))\r
- {\r
- CALayer* layer = ((NSView*) self).layer;\r
- layer.contentsFormat = kCAContentsFormatRGBA8Uint;\r
- }\r
- #endif\r
+ addMethod (@selector (mouseDown:), mouseDown);\r
+ addMethod (@selector (rightMouseDown:), mouseDown);\r
+ addMethod (@selector (otherMouseDown:), mouseDown);\r
\r
- sendSuperclassMessage<void> (self, @selector (viewWillDraw));\r
- }\r
+ addMethod (@selector (mouseUp:), mouseUp);\r
+ addMethod (@selector (rightMouseUp:), mouseUp);\r
+ addMethod (@selector (otherMouseUp:), mouseUp);\r
\r
- static void windowWillMiniaturize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* p = getOwner (self))\r
+ addMethod (@selector (draggingEntered:), draggingUpdated);\r
+ addMethod (@selector (draggingUpdated:), draggingUpdated);\r
+\r
+ addMethod (@selector (draggingEnded:), draggingExited);\r
+ addMethod (@selector (draggingExited:), draggingExited);\r
+\r
+ addMethod (@selector (acceptsFirstMouse:), [] (id, SEL, NSEvent*) { return YES; });\r
+\r
+ addMethod (@selector (windowWillMiniaturize:), [] (id self, SEL, NSNotification*)\r
{\r
- if (p->isAlwaysOnTop)\r
+ if (auto* p = getOwner (self))\r
{\r
- // there is a bug when restoring minimised always on top windows so we need\r
- // to remove this behaviour before minimising and restore it afterwards\r
- p->setAlwaysOnTop (false);\r
- p->wasAlwaysOnTop = true;\r
+ if (p->isAlwaysOnTop)\r
+ {\r
+ // there is a bug when restoring minimised always on top windows so we need\r
+ // to remove this behaviour before minimising and restore it afterwards\r
+ p->setAlwaysOnTop (false);\r
+ p->wasAlwaysOnTop = true;\r
+ }\r
}\r
- }\r
- }\r
+ });\r
\r
- static void windowDidDeminiaturize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* p = getOwner (self))\r
+ addMethod (@selector (windowDidDeminiaturize:), [] (id self, SEL, NSNotification*)\r
{\r
- if (p->wasAlwaysOnTop)\r
- p->setAlwaysOnTop (true);\r
+ if (auto* p = getOwner (self))\r
+ {\r
+ if (p->wasAlwaysOnTop)\r
+ p->setAlwaysOnTop (true);\r
\r
- p->redirectMovedOrResized();\r
- }\r
- }\r
+ p->redirectMovedOrResized();\r
+ }\r
+ });\r
\r
- static void windowDidChangeScreen (id self, SEL, NSNotification*)\r
- {\r
- if (auto* p = getOwner (self))\r
- p->windowDidChangeScreen();\r
- }\r
+ addMethod (@selector (windowDidChangeScreen:), [] (id self, SEL, NSNotification*)\r
+ {\r
+ if (auto* p = getOwner (self))\r
+ p->windowDidChangeScreen();\r
+ });\r
\r
- static BOOL isOpaque (id self, SEL)\r
- {\r
- auto* owner = getOwner (self);\r
- return owner == nullptr || owner->getComponent().isOpaque();\r
- }\r
+ addMethod (@selector (wantsDefaultClipping), [] (id, SEL) { return YES; }); // (this is the default, but may want to customise it in future)\r
\r
- //==============================================================================\r
- static void keyDown (id self, SEL, NSEvent* ev)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (worksWhenModal), [] (id self, SEL)\r
{\r
- auto* target = owner->findCurrentTextInputTarget();\r
- owner->textWasInserted = false;\r
-\r
- if (target != nullptr)\r
- [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]];\r
- else\r
- owner->stringBeingComposed.clear();\r
+ if (auto* p = getOwner (self))\r
+ return p->worksWhenModal();\r
\r
- if (! (owner->textWasInserted || owner->redirectKeyDown (ev)))\r
- sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
- }\r
- }\r
+ return false;\r
+ });\r
\r
- static void keyUp (id self, SEL, NSEvent* ev)\r
- {\r
- auto* owner = getOwner (self);\r
+ addMethod (@selector (viewWillDraw), [] (id self, SEL)\r
+ {\r
+ // Without setting contentsFormat macOS Big Sur will always set the invalid area\r
+ // to be the entire frame.\r
+ if (@available (macOS 10.12, *))\r
+ {\r
+ CALayer* layer = ((NSView*) self).layer;\r
+ layer.contentsFormat = kCAContentsFormatRGBA8Uint;\r
+ }\r
\r
- if (! owner->redirectKeyUp (ev))\r
- sendSuperclassMessage<void> (self, @selector (keyUp:), ev);\r
- }\r
+ sendSuperclassMessage<void> (self, @selector (viewWillDraw));\r
+ });\r
\r
- //==============================================================================\r
- static void insertText (id self, SEL, id aString)\r
- {\r
- // This commits multi-byte text when return is pressed, or after every keypress for western keyboards\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (keyDown:), [] (id self, SEL, NSEvent* ev)\r
{\r
- NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString;\r
-\r
- if ([newText length] > 0)\r
+ if (auto* owner = getOwner (self))\r
{\r
- if (auto* target = owner->findCurrentTextInputTarget())\r
- {\r
- target->insertTextAtCaret (nsStringToJuce (newText));\r
- owner->textWasInserted = true;\r
- }\r
- }\r
+ auto* target = owner->findCurrentTextInputTarget();\r
+ owner->textWasInserted = false;\r
\r
- owner->stringBeingComposed.clear();\r
- }\r
- }\r
+ if (target != nullptr)\r
+ [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]];\r
+ else\r
+ owner->stringBeingComposed.clear();\r
\r
- static void doCommandBySelector (id, SEL, SEL) {}\r
+ if (! (owner->textWasInserted || owner->redirectKeyDown (ev)))\r
+ sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
+ }\r
+ });\r
\r
- static void setMarkedText (id self, SEL, id aString, NSRange)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (keyUp:), [] (id self, SEL, NSEvent* ev)\r
{\r
- owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]]\r
- ? [aString string] : aString);\r
+ auto* owner = getOwner (self);\r
+\r
+ if (! owner->redirectKeyUp (ev))\r
+ sendSuperclassMessage<void> (self, @selector (keyUp:), ev);\r
+ });\r
\r
- if (auto* target = owner->findCurrentTextInputTarget())\r
+ addMethod (@selector (insertText:), [] (id self, SEL, id aString)\r
+ {\r
+ // This commits multi-byte text when return is pressed, or after every keypress for western keyboards\r
+ if (auto* owner = getOwner (self))\r
{\r
- auto currentHighlight = target->getHighlightedRegion();\r
- target->insertTextAtCaret (owner->stringBeingComposed);\r
- target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
- owner->textWasInserted = true;\r
+ NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString;\r
+\r
+ if ([newText length] > 0)\r
+ {\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ {\r
+ target->insertTextAtCaret (nsStringToJuce (newText));\r
+ owner->textWasInserted = true;\r
+ }\r
+ }\r
+\r
+ owner->stringBeingComposed.clear();\r
}\r
- }\r
- }\r
+ });\r
\r
- static void unmarkText (id self, SEL)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (doCommandBySelector:), [] (id, SEL, SEL) {});\r
+\r
+ addMethod (@selector (setMarkedText:selectedRange:), [] (id self, SEL, id aString, NSRange)\r
{\r
- if (owner->stringBeingComposed.isNotEmpty())\r
+ if (auto* owner = getOwner (self))\r
{\r
+ owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]]\r
+ ? [aString string] : aString);\r
+\r
if (auto* target = owner->findCurrentTextInputTarget())\r
{\r
+ auto currentHighlight = target->getHighlightedRegion();\r
target->insertTextAtCaret (owner->stringBeingComposed);\r
+ target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
owner->textWasInserted = true;\r
}\r
+ }\r
+ });\r
\r
- owner->stringBeingComposed.clear();\r
+ addMethod (@selector (unmarkText), [] (id self, SEL)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ {\r
+ if (owner->stringBeingComposed.isNotEmpty())\r
+ {\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ {\r
+ target->insertTextAtCaret (owner->stringBeingComposed);\r
+ owner->textWasInserted = true;\r
+ }\r
+\r
+ owner->stringBeingComposed.clear();\r
+ }\r
}\r
- }\r
- }\r
+ });\r
\r
- static BOOL hasMarkedText (id self, SEL)\r
- {\r
- auto* owner = getOwner (self);\r
- return owner != nullptr && owner->stringBeingComposed.isNotEmpty();\r
- }\r
+ addMethod (@selector (hasMarkedText), [] (id self, SEL)\r
+ {\r
+ auto* owner = getOwner (self);\r
+ return owner != nullptr && owner->stringBeingComposed.isNotEmpty();\r
+ });\r
\r
- static long conversationIdentifier (id self, SEL)\r
- {\r
- return (long) (pointer_sized_int) self;\r
- }\r
+ addMethod (@selector (conversationIdentifier), [] (id self, SEL)\r
+ {\r
+ return (long) (pointer_sized_int) self;\r
+ });\r
\r
- static NSAttributedString* attributedSubstringFromRange (id self, SEL, NSRange theRange)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (attributedSubstringFromRange:), [] (id self, SEL, NSRange theRange) -> NSAttributedString*\r
{\r
- if (auto* target = owner->findCurrentTextInputTarget())\r
+ if (auto* owner = getOwner (self))\r
{\r
- Range<int> r ((int) theRange.location,\r
- (int) (theRange.location + theRange.length));\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ {\r
+ Range<int> r ((int) theRange.location,\r
+ (int) (theRange.location + theRange.length));\r
\r
- return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease];\r
+ return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease];\r
+ }\r
}\r
- }\r
\r
- return nil;\r
- }\r
+ return nil;\r
+ });\r
\r
- static NSRange markedRange (id self, SEL)\r
- {\r
- if (auto* owner = getOwner (self))\r
- if (owner->stringBeingComposed.isNotEmpty())\r
- return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length());\r
+ addMethod (@selector (markedRange), [] (id self, SEL)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ if (owner->stringBeingComposed.isNotEmpty())\r
+ return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length());\r
\r
- return NSMakeRange (NSNotFound, 0);\r
- }\r
+ return NSMakeRange (NSNotFound, 0);\r
+ });\r
\r
- static NSRange selectedRange (id self, SEL)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (selectedRange), [] (id self, SEL)\r
{\r
- if (auto* target = owner->findCurrentTextInputTarget())\r
+ if (auto* owner = getOwner (self))\r
{\r
- auto highlight = target->getHighlightedRegion();\r
+ if (auto* target = owner->findCurrentTextInputTarget())\r
+ {\r
+ auto highlight = target->getHighlightedRegion();\r
\r
- if (! highlight.isEmpty())\r
- return NSMakeRange ((NSUInteger) highlight.getStart(),\r
- (NSUInteger) highlight.getLength());\r
+ if (! highlight.isEmpty())\r
+ return NSMakeRange ((NSUInteger) highlight.getStart(),\r
+ (NSUInteger) highlight.getLength());\r
+ }\r
}\r
- }\r
\r
- return NSMakeRange (NSNotFound, 0);\r
- }\r
+ return NSMakeRange (NSNotFound, 0);\r
+ });\r
\r
- static NSRect firstRectForCharacterRange (id self, SEL, NSRange)\r
- {\r
- if (auto* owner = getOwner (self))\r
- if (auto* comp = dynamic_cast<Component*> (owner->findCurrentTextInputTarget()))\r
- return flippedScreenRect (makeNSRect (comp->getScreenBounds()));\r
+ addMethod (@selector (firstRectForCharacterRange:), [] (id self, SEL, NSRange)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ if (auto* comp = dynamic_cast<Component*> (owner->findCurrentTextInputTarget()))\r
+ return flippedScreenRect (makeNSRect (comp->getScreenBounds()));\r
\r
- return NSZeroRect;\r
- }\r
+ return NSZeroRect;\r
+ });\r
\r
- static NSUInteger characterIndexForPoint (id, SEL, NSPoint) { return NSNotFound; }\r
- static NSArray* validAttributesForMarkedText (id, SEL) { return [NSArray array]; }\r
+ addMethod (@selector (characterIndexForPoint:), [] (id, SEL, NSPoint) { return NSNotFound; });\r
\r
- //==============================================================================\r
- static void flagsChanged (id self, SEL, NSEvent* ev)\r
- {\r
- callOnOwner (self, &NSViewComponentPeer::redirectModKeyChange, ev);\r
- }\r
+ addMethod (@selector (validAttributesForMarkedText), [] (id, SEL) { return [NSArray array]; });\r
\r
- static BOOL becomeFirstResponder (id self, SEL)\r
- {\r
- callOnOwner (self, &NSViewComponentPeer::viewFocusGain);\r
- return YES;\r
- }\r
+ addMethod (@selector (acceptsFirstResponder), [] (id self, SEL)\r
+ {\r
+ auto* owner = getOwner (self);\r
+ return owner != nullptr && owner->canBecomeKeyWindow();\r
+ });\r
\r
- static BOOL resignFirstResponder (id self, SEL)\r
- {\r
- callOnOwner (self, &NSViewComponentPeer::viewFocusLoss);\r
- return YES;\r
- }\r
+ addMethod (@selector (prepareForDragOperation:), [] (id, SEL, id<NSDraggingInfo>) { return YES; });\r
\r
- static BOOL acceptsFirstResponder (id self, SEL)\r
- {\r
- auto* owner = getOwner (self);\r
- return owner != nullptr && owner->canBecomeKeyWindow();\r
- }\r
+ addMethod (@selector (performDragOperation:), [] (id self, SEL, id<NSDraggingInfo> sender)\r
+ {\r
+ auto* owner = getOwner (self);\r
+ return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);\r
+ });\r
\r
- //==============================================================================\r
- static NSDragOperation draggingEntered (id self, SEL s, id<NSDraggingInfo> sender)\r
- {\r
- return draggingUpdated (self, s, sender);\r
- }\r
+ addMethod (@selector (concludeDragOperation:), [] (id, SEL, id<NSDraggingInfo>) {});\r
\r
- static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)\r
- {\r
- if (auto* owner = getOwner (self))\r
- if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))\r
- return NSDragOperationGeneric;\r
+ addMethod (@selector (isAccessibilityElement), [] (id, SEL) { return NO; });\r
\r
- return NSDragOperationNone;\r
- }\r
+ addMethod (@selector (accessibilityChildren), getAccessibilityChildren);\r
\r
- static void draggingEnded (id self, SEL s, id<NSDraggingInfo> sender)\r
- {\r
- draggingExited (self, s, sender);\r
- }\r
+ addMethod (@selector (accessibilityHitTest:), [] (id self, SEL, NSPoint point)\r
+ {\r
+ return [getAccessibleChild (self) accessibilityHitTest: point];\r
+ });\r
\r
- static void draggingExited (id self, SEL, id<NSDraggingInfo> sender)\r
- {\r
- callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender);\r
- }\r
+ addMethod (@selector (accessibilityFocusedUIElement), [] (id self, SEL)\r
+ {\r
+ return [getAccessibleChild (self) accessibilityFocusedUIElement];\r
+ });\r
\r
- static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>)\r
- {\r
- return YES;\r
- }\r
+ // deprecated methods required for backwards compatibility\r
+ addMethod (@selector (accessibilityIsIgnored), [] (id, SEL) { return YES; });\r
\r
- static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender)\r
- {\r
- auto* owner = getOwner (self);\r
- return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);\r
- }\r
+ addMethod (@selector (accessibilityAttributeValue:), [] (id self, SEL, NSString* attribute) -> id\r
+ {\r
+ if ([attribute isEqualToString: NSAccessibilityChildrenAttribute])\r
+ return getAccessibilityChildren (self, {});\r
\r
- static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {}\r
+ return sendSuperclassMessage<id> (self, @selector (accessibilityAttributeValue:), attribute);\r
+ });\r
\r
- //==============================================================================\r
- static BOOL getIsAccessibilityElement (id, SEL)\r
- {\r
- return NO;\r
- }\r
+ addMethod (@selector (isFlipped), [] (id, SEL) { return true; });\r
\r
- static NSArray* getAccessibilityChildren (id self, SEL)\r
- {\r
- return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self));\r
- }\r
+ addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* event)\r
+ {\r
+ // We try passing shortcut keys to the currently focused component first.\r
+ // If the component doesn't want the event, we'll fall back to the superclass\r
+ // implementation, which will pass the event to the main menu.\r
+ if (tryPassingKeyEventToPeer (event))\r
+ return YES;\r
\r
- static id accessibilityHitTest (id self, SEL, NSPoint point)\r
- {\r
- return [getAccessibleChild (self) accessibilityHitTest: point];\r
- }\r
+ return sendSuperclassMessage<BOOL> (self, s, event);\r
+ });\r
\r
- static id getAccessibilityFocusedUIElement (id self, SEL)\r
- {\r
- return [getAccessibleChild (self) accessibilityFocusedUIElement];\r
- }\r
+ addProtocol (@protocol (NSTextInput));\r
\r
- static BOOL getAccessibilityIsIgnored (id, SEL)\r
- {\r
- return YES;\r
+ registerClass();\r
}\r
\r
- static id getAccessibilityAttributeValue (id self, SEL, NSString* attribute)\r
+private:\r
+ static void updateTrackingAreas (id self, SEL)\r
{\r
- if ([attribute isEqualToString: NSAccessibilityChildrenAttribute])\r
- return getAccessibilityChildren (self, {});\r
+ sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
\r
- return sendSuperclassMessage<id> (self, @selector (accessibilityAttributeValue:), attribute);\r
+ resetTrackingArea (static_cast<NSView*> (self));\r
}\r
\r
static bool tryPassingKeyEventToPeer (NSEvent* e)\r
return false;\r
}\r
\r
- static BOOL performKeyEquivalent (id self, SEL s, NSEvent* event)\r
- {\r
- // We try passing shortcut keys to the currently focused component first.\r
- // If the component doesn't want the event, we'll fall back to the superclass\r
- // implementation, which will pass the event to the main menu.\r
- if (tryPassingKeyEventToPeer (event))\r
- return YES;\r
-\r
- return sendSuperclassMessage<BOOL> (self, s, event);\r
- }\r
-\r
template <typename Func, typename... Args>\r
static void callOnOwner (id self, Func&& func, Args&&... args)\r
{\r
if (auto* owner = getOwner (self))\r
(owner->*func) (std::forward<Args> (args)...);\r
}\r
-};\r
\r
-//==============================================================================\r
-struct JuceNSWindowClass : public NSViewComponentPeerWrapper<ObjCClass<NSWindow>>\r
-{\r
- JuceNSWindowClass() : NSViewComponentPeerWrapper ("JUCEWindow_")\r
- {\r
- addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow);\r
- addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow);\r
- addMethod (@selector (becomeKeyWindow), becomeKeyWindow);\r
- addMethod (@selector (resignKeyWindow), resignKeyWindow);\r
- addMethod (@selector (windowShouldClose:), windowShouldClose);\r
- addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect);\r
- addMethod (@selector (windowWillResize:toSize:), windowWillResize);\r
- addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen);\r
- addMethod (@selector (windowWillEnterFullScreen:), windowWillEnterFullScreen);\r
- addMethod (@selector (windowWillExitFullScreen:), windowWillExitFullScreen);\r
- addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize);\r
- addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize);\r
- addMethod (@selector (window:shouldPopUpDocumentPathMenu:), shouldPopUpPathMenu);\r
- addMethod (@selector (isFlipped), isFlipped);\r
- addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), windowWillUseStandardFrame);\r
- addMethod (@selector (windowShouldZoom:toFrame:), windowShouldZoomToFrame);\r
-\r
- addMethod (@selector (accessibilityTitle), getAccessibilityTitle);\r
- addMethod (@selector (accessibilityLabel), getAccessibilityLabel);\r
- addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow);\r
- addMethod (@selector (accessibilityWindow), getAccessibilityWindow);\r
- addMethod (@selector (accessibilityRole), getAccessibilityRole);\r
- addMethod (@selector (accessibilitySubrole), getAccessibilitySubrole);\r
-\r
- addMethod (@selector (keyDown:), keyDown);\r
-\r
- addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
-\r
- addMethod (@selector (toggleFullScreen:), toggleFullScreen);\r
-\r
- addProtocol (@protocol (NSWindowDelegate));\r
+ static void mouseDragged (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDrag, ev); }\r
+ static void asyncMouseDown (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseDown, ev); }\r
+ static void asyncMouseUp (id self, SEL, NSEvent* ev) { callOnOwner (self, &NSViewComponentPeer::redirectMouseUp, ev); }\r
+ static void draggingExited (id self, SEL, id<NSDraggingInfo> sender) { callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); }\r
\r
- registerClass();\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- static BOOL isFlipped (id, SEL) { return true; }\r
-\r
- // Key events will be processed by the peer's component.\r
- // If the component is unable to use the event, it will be re-sent\r
- // to performKeyEquivalent.\r
- // performKeyEquivalent will send the event to the view's superclass,\r
- // which will try passing the event to the main menu.\r
- // If the event still hasn't been processed, it will be passed to the\r
- // next responder in the chain, which will be the NSWindow for a peer\r
- // that is on the desktop.\r
- // If the NSWindow still doesn't handle the event, the Apple docs imply\r
- // that the event should be sent to the NSApp for processing, but this\r
- // doesn't seem to happen for keyDown events.\r
- // Instead, the NSWindow attempts to process the event, fails, and\r
- // triggers an annoying NSBeep.\r
- // Overriding keyDown to "handle" the event seems to suppress the beep.\r
- static void keyDown (id, SEL, NSEvent* ev)\r
- {\r
- ignoreUnused (ev);\r
-\r
- #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
- DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
- #endif\r
+ static void mouseDown (id self, SEL s, NSEvent* ev)\r
+ {\r
+ if (JUCEApplicationBase::isStandaloneApp())\r
+ {\r
+ asyncMouseDown (self, s, ev);\r
+ }\r
+ else\r
+ {\r
+ // In some host situations, the host will stop modal loops from working\r
+ // correctly if they're called from a mouse event, so we'll trigger\r
+ // the event asynchronously..\r
+ [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseDownSelector\r
+ withObject: ev\r
+ waitUntilDone: NO];\r
+ }\r
}\r
\r
- static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow* window, NSRect r)\r
+ static void mouseUp (id self, SEL s, NSEvent* ev)\r
{\r
- if (auto* owner = getOwner (self))\r
+ if (JUCEApplicationBase::isStandaloneApp())\r
{\r
- if (auto* constrainer = owner->getConstrainer())\r
- {\r
- if (auto* screen = [window screen])\r
- {\r
- const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame]));\r
- const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
- const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth())\r
- .withHeight ((float) constrainer->getMaximumHeight());\r
- const auto constrained = expanded.constrainedWithin (safeScreenBounds);\r
-\r
- return flippedScreenRect (makeNSRect ([&]\r
- {\r
- if (constrained == owner->getBounds().toFloat())\r
- return owner->lastSizeBeforeZoom.toFloat();\r
-\r
- owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
- return constrained;\r
- }()));\r
- }\r
- }\r
+ asyncMouseUp (self, s, ev);\r
+ }\r
+ else\r
+ {\r
+ // In some host situations, the host will stop modal loops from working\r
+ // correctly if they're called from a mouse event, so we'll trigger\r
+ // the event asynchronously..\r
+ [self performSelectorOnMainThread: NSViewComponentPeer::asyncMouseUpSelector\r
+ withObject: ev\r
+ waitUntilDone: NO];\r
}\r
-\r
- return r;\r
}\r
\r
- static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow*, NSRect)\r
+ static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)\r
{\r
if (auto* owner = getOwner (self))\r
- if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
- return NO;\r
+ if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))\r
+ return NSDragOperationGeneric;\r
\r
- return YES;\r
+ return NSDragOperationNone;\r
}\r
\r
- static BOOL canBecomeKeyWindow (id self, SEL)\r
+ static NSArray* getAccessibilityChildren (id self, SEL)\r
{\r
- auto* owner = getOwner (self);\r
-\r
- return owner != nullptr\r
- && owner->canBecomeKeyWindow()\r
- && ! owner->isBlockedByModalComponent();\r
+ return NSAccessibilityUnignoredChildrenForOnlyChild (getAccessibleChild (self));\r
}\r
+};\r
\r
- static BOOL canBecomeMainWindow (id self, SEL)\r
+//==============================================================================\r
+struct JuceNSWindowClass : public NSViewComponentPeerWrapper<ObjCClass<NSWindow>>\r
+{\r
+ JuceNSWindowClass() : NSViewComponentPeerWrapper ("JUCEWindow_")\r
{\r
- auto* owner = getOwner (self);\r
+ addMethod (@selector (canBecomeKeyWindow), [] (id self, SEL)\r
+ {\r
+ auto* owner = getOwner (self);\r
\r
- return owner != nullptr\r
- && owner->canBecomeMainWindow()\r
- && ! owner->isBlockedByModalComponent();\r
- }\r
+ return owner != nullptr\r
+ && owner->canBecomeKeyWindow()\r
+ && ! owner->isBlockedByModalComponent();\r
+ });\r
\r
- static void becomeKeyWindow (id self, SEL)\r
- {\r
- sendSuperclassMessage<void> (self, @selector (becomeKeyWindow));\r
+ addMethod (@selector (canBecomeMainWindow), [] (id self, SEL)\r
+ {\r
+ auto* owner = getOwner (self);\r
\r
- if (auto* owner = getOwner (self))\r
+ return owner != nullptr\r
+ && owner->canBecomeMainWindow()\r
+ && ! owner->isBlockedByModalComponent();\r
+ });\r
+\r
+ addMethod (@selector (becomeKeyWindow), [] (id self, SEL)\r
{\r
- if (owner->canBecomeKeyWindow())\r
+ sendSuperclassMessage<void> (self, @selector (becomeKeyWindow));\r
+\r
+ if (auto* owner = getOwner (self))\r
{\r
- owner->becomeKeyWindow();\r
- return;\r
+ if (owner->canBecomeKeyWindow())\r
+ {\r
+ owner->becomeKeyWindow();\r
+ return;\r
+ }\r
+\r
+ // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus\r
+ if (! owner->getComponent().isVisible())\r
+ [(NSWindow*) self orderOut: nil];\r
}\r
+ });\r
\r
- // this fixes a bug causing hidden windows to sometimes become visible when the app regains focus\r
- if (! owner->getComponent().isVisible())\r
- [(NSWindow*) self orderOut: nil];\r
- }\r
- }\r
+ addMethod (@selector (resignKeyWindow), [] (id self, SEL)\r
+ {\r
+ sendSuperclassMessage<void> (self, @selector (resignKeyWindow));\r
\r
- static void resignKeyWindow (id self, SEL)\r
- {\r
- sendSuperclassMessage<void> (self, @selector (resignKeyWindow));\r
+ if (auto* owner = getOwner (self))\r
+ owner->resignKeyWindow();\r
+ });\r
\r
- if (auto* owner = getOwner (self))\r
- owner->resignKeyWindow();\r
- }\r
+ addMethod (@selector (windowShouldClose:), [] (id self, SEL, id /*window*/)\r
+ {\r
+ auto* owner = getOwner (self);\r
+ return owner == nullptr || owner->windowShouldClose();\r
+ });\r
\r
- static BOOL windowShouldClose (id self, SEL, id /*window*/)\r
- {\r
- auto* owner = getOwner (self);\r
- return owner == nullptr || owner->windowShouldClose();\r
- }\r
+ addMethod (@selector (constrainFrameRect:toScreen:), [] (id self, SEL, NSRect frameRect, NSScreen* screen)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ {\r
+ frameRect = sendSuperclassMessage<NSRect, NSRect, NSScreen*> (self, @selector (constrainFrameRect:toScreen:),\r
+ frameRect, screen);\r
\r
- static NSRect constrainFrameRect (id self, SEL, NSRect frameRect, NSScreen* screen)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ frameRect = owner->constrainRect (frameRect);\r
+ }\r
+\r
+ return frameRect;\r
+ });\r
+\r
+ addMethod (@selector (windowWillResize:toSize:), [] (id self, SEL, NSWindow*, NSSize proposedFrameSize)\r
{\r
- frameRect = sendSuperclassMessage<NSRect, NSRect, NSScreen*> (self, @selector (constrainFrameRect:toScreen:),\r
- frameRect, screen);\r
+ auto* owner = getOwner (self);\r
\r
- frameRect = owner->constrainRect (frameRect);\r
- }\r
+ if (owner == nullptr || owner->isZooming)\r
+ return proposedFrameSize;\r
\r
- return frameRect;\r
- }\r
+ NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]);\r
+ frameRect.size = proposedFrameSize;\r
\r
- static NSSize windowWillResize (id self, SEL, NSWindow*, NSSize proposedFrameSize)\r
- {\r
- auto* owner = getOwner (self);\r
+ frameRect = owner->constrainRect (flippedScreenRect (frameRect));\r
\r
- if (owner == nullptr || owner->isZooming)\r
- return proposedFrameSize;\r
+ owner->dismissModals();\r
\r
- NSRect frameRect = flippedScreenRect ([(NSWindow*) self frame]);\r
- frameRect.size = proposedFrameSize;\r
+ return frameRect.size;\r
+ });\r
\r
- frameRect = owner->constrainRect (flippedScreenRect (frameRect));\r
+ addMethod (@selector (windowDidExitFullScreen:), [] (id self, SEL, NSNotification*)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ owner->resetWindowPresentation();\r
+ });\r
\r
- owner->dismissModals();\r
+ addMethod (@selector (windowWillEnterFullScreen:), [] (id self, SEL, NSNotification*)\r
+ {\r
+ if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9)\r
+ return;\r
\r
- return frameRect.size;\r
- }\r
+ if (auto* owner = getOwner (self))\r
+ if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+ [owner->window setStyleMask: NSWindowStyleMaskBorderless];\r
+ });\r
\r
- static void toggleFullScreen (id self, SEL name, id sender)\r
- {\r
- if (auto* owner = getOwner (self))\r
+ addMethod (@selector (windowWillExitFullScreen:), [] (id self, SEL, NSNotification*)\r
+ {\r
+ // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable...\r
+ if (auto* owner = getOwner (self))\r
+ if (auto* window = owner->window)\r
+ [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable];\r
+ });\r
+\r
+ addMethod (@selector (windowWillStartLiveResize:), [] (id self, SEL, NSNotification*)\r
{\r
- const auto isFullScreen = owner->isFullScreen();\r
+ if (auto* owner = getOwner (self))\r
+ owner->liveResizingStart();\r
+ });\r
\r
- if (! isFullScreen)\r
- owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
+ addMethod (@selector (windowDidEndLiveResize:), [] (id self, SEL, NSNotification*)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ owner->liveResizingEnd();\r
+ });\r
\r
- sendSuperclassMessage<void> (self, name, sender);\r
+ addMethod (@selector (window:shouldPopUpDocumentPathMenu:), [] (id self, SEL, id /*window*/, NSMenu*)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ return owner->windowRepresentsFile;\r
\r
- if (isFullScreen)\r
+ return false;\r
+ });\r
+\r
+ addMethod (@selector (isFlipped), [] (id, SEL) { return true; });\r
+\r
+ addMethod (@selector (windowWillUseStandardFrame:defaultFrame:), [] (id self, SEL, NSWindow* window, NSRect r)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
{\r
- [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
- owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false);\r
+ if (auto* constrainer = owner->getConstrainer())\r
+ {\r
+ if (auto* screen = [window screen])\r
+ {\r
+ const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame]));\r
+ const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
+ const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth())\r
+ .withHeight ((float) constrainer->getMaximumHeight());\r
+ const auto constrained = expanded.constrainedWithin (safeScreenBounds);\r
+\r
+ return flippedScreenRect (makeNSRect ([&]\r
+ {\r
+ if (constrained == owner->getBounds().toFloat())\r
+ return owner->lastSizeBeforeZoom.toFloat();\r
+\r
+ owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
+ return constrained;\r
+ }()));\r
+ }\r
+ }\r
}\r
- }\r
- }\r
\r
- static void windowDidExitFullScreen (id self, SEL, NSNotification*)\r
- {\r
- if (auto* owner = getOwner (self))\r
- owner->resetWindowPresentation();\r
- }\r
+ return r;\r
+ });\r
\r
- static void windowWillExitFullScreen (id self, SEL, NSNotification*)\r
- {\r
- // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable...\r
- if (auto* owner = getOwner (self))\r
- if (auto* window = owner->window)\r
- [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable];\r
- }\r
+ addMethod (@selector (windowShouldZoom:toFrame:), [] (id self, SEL, NSWindow*, NSRect)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+ return NO;\r
\r
- static void windowWillEnterFullScreen (id self, SEL, NSNotification*)\r
- {\r
- if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9)\r
- return;\r
+ return YES;\r
+ });\r
\r
- if (auto* owner = getOwner (self))\r
- if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
- [owner->window setStyleMask: NSWindowStyleMaskBorderless];\r
- }\r
+ addMethod (@selector (accessibilityTitle), [] (id self, SEL) { return [self title]; });\r
\r
- static void windowWillStartLiveResize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* owner = getOwner (self))\r
- owner->liveResizingStart();\r
- }\r
+ addMethod (@selector (accessibilityLabel), [] (id self, SEL) { return [getAccessibleChild (self) accessibilityLabel]; });\r
\r
- static void windowDidEndLiveResize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* owner = getOwner (self))\r
- owner->liveResizingEnd();\r
- }\r
+ addMethod (@selector (accessibilityRole), [] (id, SEL) { return NSAccessibilityWindowRole; });\r
\r
- static bool shouldPopUpPathMenu (id self, SEL, id /*window*/, NSMenu*)\r
- {\r
- if (auto* owner = getOwner (self))\r
- return owner->windowRepresentsFile;\r
+ addMethod (@selector (accessibilitySubrole), [] (id self, SEL) -> NSAccessibilitySubrole\r
+ {\r
+ if (@available (macOS 10.10, *))\r
+ return [getAccessibleChild (self) accessibilitySubrole];\r
+\r
+ return nil;\r
+ });\r
+\r
+ // Key events will be processed by the peer's component.\r
+ // If the component is unable to use the event, it will be re-sent\r
+ // to performKeyEquivalent.\r
+ // performKeyEquivalent will send the event to the view's superclass,\r
+ // which will try passing the event to the main menu.\r
+ // If the event still hasn't been processed, it will be passed to the\r
+ // next responder in the chain, which will be the NSWindow for a peer\r
+ // that is on the desktop.\r
+ // If the NSWindow still doesn't handle the event, the Apple docs imply\r
+ // that the event should be sent to the NSApp for processing, but this\r
+ // doesn't seem to happen for keyDown events.\r
+ // Instead, the NSWindow attempts to process the event, fails, and\r
+ // triggers an annoying NSBeep.\r
+ // Overriding keyDown to "handle" the event seems to suppress the beep.\r
+ addMethod (@selector (keyDown:), [] (id, SEL, NSEvent* ev)\r
+ {\r
+ ignoreUnused (ev);\r
+\r
+ #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
+ DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
+ #endif\r
+ });\r
\r
- return false;\r
- }\r
+ addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), [] (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ return owner->windowRepresentsFile;\r
\r
- static bool shouldAllowIconDrag (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*)\r
- {\r
- if (auto* owner = getOwner (self))\r
- return owner->windowRepresentsFile;\r
+ return false;\r
+ });\r
\r
- return false;\r
- }\r
+ addMethod (@selector (toggleFullScreen:), [] (id self, SEL name, id sender)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ {\r
+ const auto isFullScreen = owner->isFullScreen();\r
\r
- static NSString* getAccessibilityTitle (id self, SEL)\r
- {\r
- return [self title];\r
- }\r
+ if (! isFullScreen)\r
+ owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
\r
- static NSString* getAccessibilityLabel (id self, SEL)\r
- {\r
- return [getAccessibleChild (self) accessibilityLabel];\r
- }\r
+ sendSuperclassMessage<void> (self, name, sender);\r
\r
- static id getAccessibilityWindow (id self, SEL)\r
- {\r
- return self;\r
- }\r
+ if (isFullScreen)\r
+ {\r
+ [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
+ owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false);\r
+ }\r
+ }\r
+ });\r
\r
- static NSAccessibilityRole getAccessibilityRole (id, SEL)\r
- {\r
- return NSAccessibilityWindowRole;\r
- }\r
+ addMethod (@selector (accessibilityTopLevelUIElement), getAccessibilityWindow);\r
+ addMethod (@selector (accessibilityWindow), getAccessibilityWindow);\r
\r
- static NSAccessibilityRole getAccessibilitySubrole (id self, SEL)\r
- {\r
- if (@available (macOS 10.10, *))\r
- return [getAccessibleChild (self) accessibilitySubrole];\r
+ addProtocol (@protocol (NSWindowDelegate));\r
\r
- return nil;\r
+ registerClass();\r
}\r
+\r
+private:\r
+ //==============================================================================\r
+ static id getAccessibilityWindow (id self, SEL) { return self; }\r
};\r
\r
NSView* NSViewComponentPeer::createViewInstance()\r
isEqualToString: nsStringLiteral ("Dark")];\r
}\r
\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+static const auto darkModeSelector = @selector (darkModeChanged:);\r
+static const auto keyboardVisibilitySelector = @selector (keyboardVisiblityChanged:);\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
class Desktop::NativeDarkModeChangeDetectorImpl\r
{\r
public:\r
NativeDarkModeChangeDetectorImpl()\r
{\r
static DelegateClass delegateClass;\r
-\r
- delegate = [delegateClass.createInstance() init];\r
- object_setInstanceVariable (delegate, "owner", this);\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
- [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate\r
- selector: @selector (darkModeChanged:)\r
- name: @"AppleInterfaceThemeChangedNotification"\r
- object: nil];\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
- }\r
-\r
- ~NativeDarkModeChangeDetectorImpl()\r
- {\r
- object_setInstanceVariable (delegate, "owner", nullptr);\r
- [[NSDistributedNotificationCenter defaultCenter] removeObserver: delegate];\r
- [delegate release];\r
- }\r
-\r
- void darkModeChanged()\r
- {\r
- Desktop::getInstance().darkModeChanged();\r
+ delegate.reset ([delegateClass.createInstance() init]);\r
+ observer.emplace (delegate.get(), darkModeSelector, @"AppleInterfaceThemeChangedNotification", nil);\r
}\r
\r
private:\r
{\r
DelegateClass() : ObjCClass<NSObject> ("JUCEDelegate_")\r
{\r
- addIvar<NativeDarkModeChangeDetectorImpl*> ("owner");\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
- addMethod (@selector (darkModeChanged:), darkModeChanged);\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
+ addMethod (darkModeSelector, [] (id, SEL, NSNotification*) { Desktop::getInstance().darkModeChanged(); });\r
registerClass();\r
}\r
-\r
- static void darkModeChanged (id self, SEL, NSNotification*)\r
- {\r
- if (auto* owner = getIvar<NativeDarkModeChangeDetectorImpl*> (self, "owner"))\r
- owner->darkModeChanged();\r
- }\r
};\r
\r
- id delegate = nil;\r
+ NSUniquePtr<NSObject> delegate;\r
+ Optional<ScopedNotificationCenterObserver> observer;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)\r
};\r
public:\r
explicit RowCellInterface (RowAccessibilityHandler& h) : handler (h) {}\r
\r
- int getColumnIndex() const override { return 0; }\r
- int getColumnSpan() const override { return 1; }\r
-\r
- int getRowIndex() const override\r
- {\r
- const auto index = handler.rowComponent.row;\r
-\r
- if (handler.rowComponent.owner.hasAccessibleHeaderComponent())\r
- return index + 1;\r
-\r
- return index;\r
- }\r
-\r
- int getRowSpan() const override { return 1; }\r
-\r
int getDisclosureLevel() const override { return 0; }\r
\r
const AccessibilityHandler* getTableHandler() const override\r
{\r
setWantsKeyboardFocus (false);\r
\r
- auto content = std::make_unique<Component>();\r
+ struct IgnoredComponent : Component\r
+ {\r
+ std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
+ {\r
+ return createIgnoredAccessibilityHandler (*this);\r
+ }\r
+ };\r
+\r
+ auto content = std::make_unique<IgnoredComponent>();\r
content->setWantsKeyboardFocus (false);\r
\r
setViewedComponent (content.release());\r
}\r
\r
- RowComponent* getComponentForRow (int row) const noexcept\r
- {\r
- if (isPositiveAndBelow (row, rows.size()))\r
- return rows[row];\r
-\r
- return nullptr;\r
- }\r
-\r
- RowComponent* getComponentForRowWrapped (int row) const noexcept\r
- {\r
- return rows[row % jmax (1, rows.size())];\r
- }\r
+ int getIndexOfFirstVisibleRow() const { return jmax (0, firstIndex - 1); }\r
\r
RowComponent* getComponentForRowIfOnscreen (int row) const noexcept\r
{\r
- return (row >= firstIndex && row < firstIndex + rows.size())\r
- ? getComponentForRowWrapped (row) : nullptr;\r
+ const auto startIndex = getIndexOfFirstVisibleRow();\r
+\r
+ return (startIndex <= row && row < startIndex + (int) rows.size())\r
+ ? rows[(size_t) (row % jmax (1, (int) rows.size()))].get()\r
+ : nullptr;\r
}\r
\r
- int getRowNumberOfComponent (Component* const rowComponent) const noexcept\r
+ int getRowNumberOfComponent (const Component* const rowComponent) const noexcept\r
{\r
- const int index = getViewedComponent()->getIndexOfChildComponent (rowComponent);\r
- const int num = rows.size();\r
+ const auto iter = std::find_if (rows.begin(), rows.end(), [=] (auto& ptr) { return ptr.get() == rowComponent; });\r
\r
- for (int i = num; --i >= 0;)\r
- if (((firstIndex + i) % jmax (1, num)) == index)\r
- return firstIndex + i;\r
+ if (iter == rows.end())\r
+ return -1;\r
\r
- return -1;\r
+ const auto index = (int) std::distance (rows.begin(), iter);\r
+ const auto mod = jmax (1, (int) rows.size());\r
+ const auto startIndex = getIndexOfFirstVisibleRow();\r
+\r
+ return index + mod * ((startIndex / mod) + (index < (startIndex % mod) ? 1 : 0));\r
}\r
\r
void visibleAreaChanged (const Rectangle<int>&) override\r
auto y = getViewPositionY();\r
auto w = content.getWidth();\r
\r
- const int numNeeded = 4 + getMaximumVisibleHeight() / rowH;\r
- rows.removeRange (numNeeded, rows.size());\r
+ const auto numNeeded = (size_t) (4 + getMaximumVisibleHeight() / rowH);\r
+ rows.resize (jmin (numNeeded, rows.size()));\r
\r
while (numNeeded > rows.size())\r
{\r
- auto* newRow = rows.add (new RowComponent (owner));\r
- content.addAndMakeVisible (newRow);\r
+ rows.emplace_back (new RowComponent (owner));\r
+ content.addAndMakeVisible (*rows.back());\r
}\r
\r
firstIndex = y / rowH;\r
firstWholeIndex = (y + rowH - 1) / rowH;\r
lastWholeIndex = (y + getMaximumVisibleHeight() - 1) / rowH;\r
\r
- auto startIndex = jmax (0, firstIndex - 1);\r
+ const auto startIndex = getIndexOfFirstVisibleRow();\r
+ const auto lastIndex = startIndex + (int) rows.size();\r
\r
- for (int i = 0; i < numNeeded; ++i)\r
+ for (auto row = startIndex; row < lastIndex; ++row)\r
{\r
- const int row = i + startIndex;\r
-\r
- if (auto* rowComp = getComponentForRowWrapped (row))\r
+ if (auto* rowComp = getComponentForRowIfOnscreen (row))\r
{\r
rowComp->setBounds (0, row * rowH, w, rowH);\r
rowComp->update (row, owner.isRowSelected (row));\r
}\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
}\r
}\r
\r
}\r
\r
ListBox& owner;\r
- OwnedArray<RowComponent> rows;\r
+ std::vector<std::unique_ptr<RowComponent>> rows;\r
int firstIndex = 0, firstWholeIndex = 0, lastWholeIndex = 0;\r
bool hasUpdated = false;\r
\r
return nullptr;\r
}\r
\r
-int ListBox::getRowNumberOfComponent (Component* const rowComponent) const noexcept\r
+int ListBox::getRowNumberOfComponent (const Component* const rowComponent) const noexcept\r
{\r
return viewport->getRowNumberOfComponent (rowComponent);\r
}\r
{\r
listBox.checkModelPtrIsValid();\r
\r
- if (listBox.model == nullptr)\r
- return 0;\r
-\r
- const auto numRows = listBox.model->getNumRows();\r
-\r
- if (listBox.hasAccessibleHeaderComponent())\r
- return numRows + 1;\r
-\r
- return numRows;\r
+ return listBox.model != nullptr ? listBox.model->getNumRows()\r
+ : 0;\r
}\r
\r
int getNumColumns() const override\r
return 1;\r
}\r
\r
- const AccessibilityHandler* getCellHandler (int row, int) const override\r
+ const AccessibilityHandler* getHeaderHandler() const override\r
{\r
- if (auto* headerHandler = getHeaderHandler())\r
- {\r
- if (row == 0)\r
- return headerHandler;\r
+ if (listBox.hasAccessibleHeaderComponent())\r
+ return listBox.headerComponent->getAccessibilityHandler();\r
\r
- --row;\r
- }\r
+ return nullptr;\r
+ }\r
\r
- if (auto* rowComponent = listBox.viewport->getComponentForRow (row))\r
+ const AccessibilityHandler* getRowHandler (int row) const override\r
+ {\r
+ if (auto* rowComponent = listBox.viewport->getComponentForRowIfOnscreen (row))\r
return rowComponent->getAccessibilityHandler();\r
\r
return nullptr;\r
}\r
\r
- private:\r
- const AccessibilityHandler* getHeaderHandler() const\r
+ const AccessibilityHandler* getCellHandler (int, int) const override\r
{\r
- if (listBox.hasAccessibleHeaderComponent())\r
- return listBox.headerComponent->getAccessibilityHandler();\r
-\r
return nullptr;\r
}\r
\r
+ Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+ {\r
+ const auto rowNumber = listBox.getRowNumberOfComponent (&handler.getComponent());\r
+\r
+ return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 })\r
+ : nullopt;\r
+ }\r
+\r
+ Optional<Span> getColumnSpan (const AccessibilityHandler&) const override\r
+ {\r
+ return Span { 0, 1 };\r
+ }\r
+\r
+ void showCell (const AccessibilityHandler& h) const override\r
+ {\r
+ if (const auto row = getRowSpan (h))\r
+ listBox.scrollToEnsureRowIsOnscreen (row->begin);\r
+ }\r
+\r
+ private:\r
ListBox& listBox;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface)\r
/** Returns the row number that the given component represents.\r
If the component isn't one of the list's rows, this will return -1.\r
*/\r
- int getRowNumberOfComponent (Component* rowComponent) const noexcept;\r
+ int getRowNumberOfComponent (const Component* rowComponent) const noexcept;\r
\r
/** Returns the width of a row (which may be less than the width of this component\r
if there's a scrollbar).\r
return 0.0f;\r
}\r
\r
- void updateRange()\r
+ void setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay)\r
+ {\r
+ fixedNumDecimalPlaces = jmax (0, decimalPlacesToDisplay);\r
+ numDecimalPlaces = fixedNumDecimalPlaces;\r
+ }\r
+\r
+ int getNumDecimalPlacesToDisplay() const\r
{\r
- // figure out the number of DPs needed to display all values at this\r
- // interval setting.\r
- numDecimalPlaces = 7;\r
+ return fixedNumDecimalPlaces == -1 ? numDecimalPlaces : fixedNumDecimalPlaces;\r
+ }\r
\r
- if (normRange.interval != 0.0)\r
+ void updateRange()\r
+ {\r
+ if (fixedNumDecimalPlaces == -1)\r
{\r
- int v = std::abs (roundToInt (normRange.interval * 10000000));\r
+ // figure out the number of DPs needed to display all values at this\r
+ // interval setting.\r
+ numDecimalPlaces = 7;\r
\r
- while ((v % 10) == 0 && numDecimalPlaces > 0)\r
+ if (normRange.interval != 0.0)\r
{\r
- --numDecimalPlaces;\r
- v /= 10;\r
+ int v = std::abs (roundToInt (normRange.interval * 10000000));\r
+\r
+ while ((v % 10) == 0 && numDecimalPlaces > 0)\r
+ {\r
+ --numDecimalPlaces;\r
+ v /= 10;\r
+ }\r
}\r
}\r
\r
TextEntryBoxPosition textBoxPos;\r
String textSuffix;\r
int numDecimalPlaces = 7;\r
+ int fixedNumDecimalPlaces = -1;\r
int textBoxWidth = 80, textBoxHeight = 20;\r
IncDecButtonMode incDecButtonMode = incDecButtonsNotDraggable;\r
ModifierKeys::Flags modifierToSwapModes = ModifierKeys::ctrlAltCommandModifiers;\r
return attemptedValue;\r
}\r
\r
-int Slider::getNumDecimalPlacesToDisplay() const noexcept { return pimpl->numDecimalPlaces; }\r
+int Slider::getNumDecimalPlacesToDisplay() const noexcept\r
+{\r
+ return pimpl->getNumDecimalPlacesToDisplay();\r
+}\r
\r
void Slider::setNumDecimalPlacesToDisplay (int decimalPlacesToDisplay)\r
{\r
- pimpl->numDecimalPlaces = decimalPlacesToDisplay;\r
+ pimpl->setNumDecimalPlacesToDisplay (decimalPlacesToDisplay);\r
updateText();\r
}\r
\r
//==============================================================================\r
TableHeaderComponent::TableHeaderComponent()\r
{\r
+ setFocusContainerType (FocusContainerType::focusContainer);\r
}\r
\r
TableHeaderComponent::~TableHeaderComponent()\r
String TableHeaderComponent::getColumnName (const int columnId) const\r
{\r
if (auto* ci = getInfoForId (columnId))\r
- return ci->name;\r
+ return ci->getTitle();\r
\r
return {};\r
}\r
{\r
if (auto* ci = getInfoForId (columnId))\r
{\r
- if (ci->name != newName)\r
+ if (ci->getTitle() != newName)\r
{\r
- ci->name = newName;\r
+ ci->setTitle (newName);\r
sendColumnsChanged();\r
}\r
}\r
jassert (width > 0);\r
\r
auto ci = new ColumnInfo();\r
- ci->name = columnName;\r
+ ci->setTitle (columnName);\r
ci->id = columnId;\r
ci->width = width;\r
ci->lastDeliberateWidth = width;\r
jassert (ci->maximumWidth >= ci->minimumWidth);\r
ci->propertyFlags = propertyFlags;\r
\r
- columns.insert (insertIndex, ci);\r
+ auto* added = columns.insert (insertIndex, ci);\r
+ addChildComponent (added);\r
+ added->setVisible ((propertyFlags & visible) != 0);\r
+\r
+ resized();\r
sendColumnsChanged();\r
}\r
\r
}\r
}\r
\r
+ resized();\r
repaint();\r
columnsResized = true;\r
triggerAsyncUpdate();\r
if (newWidth != ci->width)\r
{\r
ci->width = newWidth;\r
+ resized();\r
repaint();\r
columnsResized = true;\r
triggerAsyncUpdate();\r
{\r
if (shouldBeVisible != ci->isVisible())\r
{\r
- if (shouldBeVisible)\r
- ci->propertyFlags |= visible;\r
- else\r
- ci->propertyFlags &= ~visible;\r
-\r
+ ci->setVisible (shouldBeVisible);\r
sendColumnsChanged();\r
resized();\r
}\r
void TableHeaderComponent::reSortTable()\r
{\r
sortChanged = true;\r
+ resized();\r
repaint();\r
triggerAsyncUpdate();\r
}\r
{\r
for (auto* ci : columns)\r
if ((ci->propertyFlags & appearsOnColumnMenu) != 0)\r
- menu.addItem (ci->id, ci->name,\r
+ menu.addItem (ci->id, ci->getTitle(),\r
(ci->propertyFlags & (sortedForwards | sortedBackwards)) == 0,\r
isColumnVisible (ci->id));\r
}\r
\r
lf.drawTableHeaderBackground (g, *this);\r
\r
- auto clip = g.getClipBounds();\r
+ for (auto* ci : columns)\r
+ {\r
+ if (ci->isVisible() && ci->getWidth() > 0)\r
+ {\r
+ Graphics::ScopedSaveState ss (g);\r
+\r
+ g.setOrigin (ci->getX(), ci->getY());\r
+ g.reduceClipRegion (0, 0, ci->getWidth(), ci->getHeight());\r
+\r
+ lf.drawTableHeaderColumn (g, *this, ci->getTitle(), ci->id, ci->width, getHeight(),\r
+ ci->id == columnIdUnderMouse,\r
+ ci->id == columnIdUnderMouse && isMouseButtonDown(),\r
+ ci->propertyFlags);\r
+ }\r
+ }\r
+}\r
+\r
+void TableHeaderComponent::resized()\r
+{\r
+ auto clip = getBounds();\r
\r
int x = 0;\r
\r
+ for (auto* ci : columns)\r
+ ci->setBounds (0, 0, 0, 0);\r
+\r
for (auto* ci : columns)\r
{\r
if (ci->isVisible())\r
{\r
if (x + ci->width > clip.getX()\r
- && (ci->id != columnIdBeingDragged\r
- || dragOverlayComp == nullptr\r
- || ! dragOverlayComp->isVisible()))\r
+ && (ci->id != columnIdBeingDragged\r
+ || dragOverlayComp == nullptr\r
+ || ! dragOverlayComp->isVisible()))\r
{\r
- Graphics::ScopedSaveState ss (g);\r
-\r
- g.setOrigin (x, 0);\r
- g.reduceClipRegion (0, 0, ci->width, getHeight());\r
-\r
- lf.drawTableHeaderColumn (g, *this, ci->name, ci->id, ci->width, getHeight(),\r
- ci->id == columnIdUnderMouse,\r
- ci->id == columnIdUnderMouse && isMouseButtonDown(),\r
- ci->propertyFlags);\r
+ ci->setBounds (x, 0, ci->width, getHeight());\r
}\r
\r
x += ci->width;\r
\r
void TableHeaderComponent::mouseDown (const MouseEvent& e)\r
{\r
+ resized();\r
repaint();\r
columnIdBeingResized = 0;\r
columnIdBeingDragged = 0;\r
moveColumn (columnIdBeingDragged, finalIndex);\r
\r
columnIdBeingDragged = 0;\r
+ resized();\r
repaint();\r
\r
for (int i = listeners.size(); --i >= 0;)\r
c->lastDeliberateWidth = c->width;\r
\r
columnIdBeingResized = 0;\r
+ resized();\r
repaint();\r
\r
endDrag (getIndexOfColumnId (columnIdBeingDragged, true));\r
}\r
\r
//==============================================================================\r
-bool TableHeaderComponent::ColumnInfo::isVisible() const\r
-{\r
- return (propertyFlags & TableHeaderComponent::visible) != 0;\r
-}\r
\r
TableHeaderComponent::ColumnInfo* TableHeaderComponent::getInfoForId (int id) const\r
{\r
if (stretchToFit && lastDeliberateWidth > 0)\r
resizeAllColumnsToFit (lastDeliberateWidth);\r
\r
+ resized();\r
repaint();\r
columnsChanged = true;\r
triggerAsyncUpdate();\r
return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::tableHeader);\r
}\r
\r
+std::unique_ptr<AccessibilityHandler> TableHeaderComponent::ColumnInfo::createAccessibilityHandler()\r
+{\r
+ return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::tableHeader);\r
+}\r
+\r
} // namespace juce\r
/** @internal */\r
void paint (Graphics&) override;\r
/** @internal */\r
+ void resized() override;\r
+ /** @internal */\r
void mouseMove (const MouseEvent&) override;\r
/** @internal */\r
void mouseEnter (const MouseEvent&) override;\r
virtual void showColumnChooserMenu (int columnIdClicked);\r
\r
private:\r
- struct ColumnInfo\r
+ struct ColumnInfo : public Component\r
{\r
- String name;\r
+ ColumnInfo() { setInterceptsMouseClicks (false, false); }\r
+ std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;\r
+\r
int id, propertyFlags, width, minimumWidth, maximumWidth;\r
double lastDeliberateWidth;\r
-\r
- bool isVisible() const;\r
};\r
\r
OwnedArray<ColumnInfo> columns;\r
namespace juce\r
{\r
\r
+static const Identifier tableColumnProperty { "_tableColumnId" };\r
+static const Identifier tableAccessiblePlaceholderProperty { "_accessiblePlaceholder" };\r
+\r
class TableListBox::RowComp : public Component,\r
public TooltipClient\r
{\r
tableModel->paintRowBackground (g, row, getWidth(), getHeight(), isSelected);\r
\r
auto& headerComp = owner.getHeader();\r
- auto numColumns = headerComp.getNumColumns (true);\r
- auto clipBounds = g.getClipBounds();\r
+ const auto numColumns = jmin ((int) columnComponents.size(), headerComp.getNumColumns (true));\r
+ const auto clipBounds = g.getClipBounds();\r
\r
for (int i = 0; i < numColumns; ++i)\r
{\r
- if (columnComponents[i] == nullptr)\r
+ if (columnComponents[(size_t) i]->getProperties().contains (tableAccessiblePlaceholderProperty))\r
{\r
auto columnRect = headerComp.getColumnPosition (i).withHeight (getHeight());\r
\r
\r
if (tableModel != nullptr && row < owner.getNumRows())\r
{\r
- const Identifier columnProperty ("_tableColumnId");\r
- auto numColumns = owner.getHeader().getNumColumns (true);\r
+ const ComponentDeleter deleter { columnForComponent };\r
+ const auto numColumns = owner.getHeader().getNumColumns (true);\r
+\r
+ while (numColumns < (int) columnComponents.size())\r
+ columnComponents.pop_back();\r
+\r
+ while ((int) columnComponents.size() < numColumns)\r
+ columnComponents.emplace_back (nullptr, deleter);\r
\r
for (int i = 0; i < numColumns; ++i)\r
{\r
auto columnId = owner.getHeader().getColumnIdOfIndex (i, true);\r
- auto* comp = columnComponents[i];\r
-\r
- if (comp != nullptr && columnId != static_cast<int> (comp->getProperties() [columnProperty]))\r
+ auto originalComp = std::move (columnComponents[(size_t) i]);\r
+ auto oldCustomComp = originalComp != nullptr && ! originalComp->getProperties().contains (tableAccessiblePlaceholderProperty)\r
+ ? std::move (originalComp)\r
+ : std::unique_ptr<Component, ComponentDeleter> { nullptr, deleter };\r
+ auto compToRefresh = oldCustomComp != nullptr && columnId == static_cast<int> (oldCustomComp->getProperties()[tableColumnProperty])\r
+ ? std::move (oldCustomComp)\r
+ : std::unique_ptr<Component, ComponentDeleter> { nullptr, deleter };\r
+\r
+ columnForComponent.erase (compToRefresh.get());\r
+ std::unique_ptr<Component, ComponentDeleter> newCustomComp { tableModel->refreshComponentForCell (row,\r
+ columnId,\r
+ isSelected,\r
+ compToRefresh.release()),\r
+ deleter };\r
+\r
+ auto columnComp = [&]\r
{\r
- columnComponents.set (i, nullptr);\r
- comp = nullptr;\r
- }\r
-\r
- comp = tableModel->refreshComponentForCell (row, columnId, isSelected, comp);\r
- columnComponents.set (i, comp, false);\r
-\r
- if (comp != nullptr)\r
- {\r
- comp->getProperties().set (columnProperty, columnId);\r
-\r
- addAndMakeVisible (comp);\r
- resizeCustomComp (i);\r
- }\r
+ // We got a result from refreshComponentForCell, so use that\r
+ if (newCustomComp != nullptr)\r
+ return std::move (newCustomComp);\r
+\r
+ // There was already a placeholder component for this column\r
+ if (originalComp != nullptr)\r
+ return std::move (originalComp);\r
+\r
+ // Create a new placeholder component to use\r
+ std::unique_ptr<Component, ComponentDeleter> comp { new Component, deleter };\r
+ comp->setInterceptsMouseClicks (false, false);\r
+ comp->getProperties().set (tableAccessiblePlaceholderProperty, true);\r
+ return comp;\r
+ }();\r
+\r
+ columnForComponent.emplace (columnComp.get(), i);\r
+\r
+ // In order for navigation to work correctly on macOS, the number of child\r
+ // accessibility elements on each row must match the number of header accessibility\r
+ // elements.\r
+ columnComp->setFocusContainerType (FocusContainerType::focusContainer);\r
+ columnComp->getProperties().set (tableColumnProperty, columnId);\r
+ addAndMakeVisible (*columnComp);\r
+\r
+ columnComponents[(size_t) i] = std::move (columnComp);\r
+ resizeCustomComp (i);\r
}\r
-\r
- columnComponents.removeRange (numColumns, columnComponents.size());\r
}\r
else\r
{\r
\r
void resized() override\r
{\r
- for (int i = columnComponents.size(); --i >= 0;)\r
+ for (auto i = (int) columnComponents.size(); --i >= 0;)\r
resizeCustomComp (i);\r
}\r
\r
void resizeCustomComp (int index)\r
{\r
- if (auto* c = columnComponents.getUnchecked (index))\r
- c->setBounds (owner.getHeader().getColumnPosition (index)\r
- .withY (0).withHeight (getHeight()));\r
+ if (auto& c = columnComponents[(size_t) index])\r
+ {\r
+ c->setBounds (owner.getHeader()\r
+ .getColumnPosition (index)\r
+ .withY (0)\r
+ .withHeight (getHeight()));\r
+ }\r
}\r
\r
void mouseDown (const MouseEvent& e) override\r
\r
Component* findChildComponentForColumn (int columnId) const\r
{\r
- return columnComponents [owner.getHeader().getIndexOfColumnId (columnId, true)];\r
+ const auto index = (size_t) owner.getHeader().getIndexOfColumnId (columnId, true);\r
+\r
+ if (isPositiveAndBelow (index, columnComponents.size()))\r
+ return columnComponents[index].get();\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ int getColumnNumberOfComponent (const Component* comp) const\r
+ {\r
+ const auto iter = columnForComponent.find (comp);\r
+ return iter != columnForComponent.cend() ? iter->second : -1;\r
}\r
\r
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
return state;\r
}\r
\r
+ private:\r
class RowComponentCellInterface : public AccessibilityCellInterface\r
{\r
public:\r
{\r
}\r
\r
- int getColumnIndex() const override { return 0; }\r
- int getColumnSpan() const override { return 1; }\r
-\r
- int getRowIndex() const override { return owner.rowComponent.row; }\r
- int getRowSpan() const override { return 1; }\r
-\r
int getDisclosureLevel() const override { return 0; }\r
\r
const AccessibilityHandler* getTableHandler() const override { return owner.rowComponent.owner.getAccessibilityHandler(); }\r
};\r
\r
//==============================================================================\r
+ class ComponentDeleter\r
+ {\r
+ public:\r
+ explicit ComponentDeleter (std::map<const Component*, int>& locations)\r
+ : columnForComponent (&locations) {}\r
+\r
+ void operator() (Component* comp) const\r
+ {\r
+ columnForComponent->erase (comp);\r
+\r
+ if (comp != nullptr)\r
+ delete comp;\r
+ }\r
+\r
+ private:\r
+ std::map<const Component*, int>* columnForComponent;\r
+ };\r
+\r
TableListBox& owner;\r
- OwnedArray<Component> columnComponents;\r
+ std::map<const Component*, int> columnForComponent;\r
+ std::vector<std::unique_ptr<Component, ComponentDeleter>> columnComponents;\r
int row = -1;\r
bool isSelected = false, isDragging = false, selectRowOnMouseUp = false;\r
\r
rowComp->resized();\r
}\r
\r
+template <typename FindIndex>\r
+Optional<AccessibilityTableInterface::Span> findRecursively (const AccessibilityHandler& handler,\r
+ Component* outermost,\r
+ FindIndex&& findIndexOfComponent)\r
+{\r
+ for (auto* comp = &handler.getComponent(); comp != outermost; comp = comp->getParentComponent())\r
+ {\r
+ const auto result = findIndexOfComponent (comp);\r
+\r
+ if (result != -1)\r
+ return AccessibilityTableInterface::Span { result, 1 };\r
+ }\r
+\r
+ return nullopt;\r
+}\r
+\r
std::unique_ptr<AccessibilityHandler> TableListBox::createAccessibilityHandler()\r
{\r
class TableInterface : public AccessibilityTableInterface\r
\r
int getNumColumns() const override\r
{\r
- return tableListBox.getHeader().getNumColumns (false);\r
+ return tableListBox.getHeader().getNumColumns (true);\r
}\r
\r
- const AccessibilityHandler* getCellHandler (int row, int column) const override\r
+ const AccessibilityHandler* getRowHandler (int row) const override\r
{\r
if (isPositiveAndBelow (row, getNumRows()))\r
- {\r
- if (isPositiveAndBelow (column, getNumColumns()))\r
- if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, false), row))\r
- return cellComponent->getAccessibilityHandler();\r
-\r
if (auto* rowComp = tableListBox.getComponentForRowNumber (row))\r
return rowComp->getAccessibilityHandler();\r
- }\r
\r
return nullptr;\r
}\r
\r
+ const AccessibilityHandler* getCellHandler (int row, int column) const override\r
+ {\r
+ if (isPositiveAndBelow (row, getNumRows()) && isPositiveAndBelow (column, getNumColumns()))\r
+ if (auto* cellComponent = tableListBox.getCellComponent (tableListBox.getHeader().getColumnIdOfIndex (column, true), row))\r
+ return cellComponent->getAccessibilityHandler();\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ const AccessibilityHandler* getHeaderHandler() const override\r
+ {\r
+ if (tableListBox.hasAccessibleHeaderComponent())\r
+ return tableListBox.headerComponent->getAccessibilityHandler();\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+ {\r
+ if (tableListBox.isParentOf (&handler.getComponent()))\r
+ return findRecursively (handler, &tableListBox, [&] (auto* c) { return tableListBox.getRowNumberOfComponent (c); });\r
+\r
+ return nullopt;\r
+ }\r
+\r
+ Optional<Span> getColumnSpan (const AccessibilityHandler& handler) const override\r
+ {\r
+ if (const auto rowSpan = getRowSpan (handler))\r
+ if (auto* rowComponent = dynamic_cast<RowComp*> (tableListBox.getComponentForRowNumber (rowSpan->begin)))\r
+ return findRecursively (handler, &tableListBox, [&] (auto* c) { return rowComponent->getColumnNumberOfComponent (c); });\r
+\r
+ return nullopt;\r
+ }\r
+\r
+ void showCell (const AccessibilityHandler& handler) const override\r
+ {\r
+ const auto row = getRowSpan (handler);\r
+ const auto col = getColumnSpan (handler);\r
+\r
+ if (row.hasValue() && col.hasValue())\r
+ {\r
+ tableListBox.scrollToEnsureRowIsOnscreen (row->begin);\r
+ tableListBox.scrollToEnsureColumnIsOnscreen (col->begin);\r
+ }\r
+ }\r
+\r
private:\r
TableListBox& tableListBox;\r
\r
};\r
\r
return std::make_unique<AccessibilityHandler> (*this,\r
- AccessibilityRole::list,\r
+ AccessibilityRole::table,\r
AccessibilityActions{},\r
AccessibilityHandler::Interfaces { std::make_unique<TableInterface> (*this) });\r
}\r
{\r
Iterator i (*this);\r
caret->setCaretPosition (getCaretRectangle().translated (leftIndent,\r
- topIndent + roundToInt (i.getYOffset())));\r
+ topIndent + roundToInt (i.getYOffset())) - getTextOffset());\r
\r
if (auto* handler = getAccessibilityHandler())\r
handler->notifyAccessibilityEvent (AccessibilityEvent::textSelectionChanged);\r
clearInternal (nullptr);\r
checkLayout();\r
undoManager.clearUndoHistory();\r
+ repaint();\r
}\r
\r
void TextEditor::setText (const String& newText, bool sendTextChangeMessage)\r
viewport->setViewPosition (vx, vy);\r
}\r
\r
-Rectangle<int> TextEditor::getCaretRectangle()\r
-{\r
- return getCaretRectangleFloat().getSmallestIntegerContainer();\r
-}\r
-\r
-Rectangle<float> TextEditor::getCaretRectangleFloat() const\r
+Rectangle<int> TextEditor::getCaretRectangleForCharIndex (int index) const\r
{\r
Point<float> anchor;\r
auto cursorHeight = currentFont.getHeight(); // (in case the text is empty and the call below doesn't set this value)\r
- getCharPosition (caretPosition, anchor, cursorHeight);\r
+ getCharPosition (index, anchor, cursorHeight);\r
\r
- return { anchor.x, anchor.y, 2.0f, cursorHeight };\r
+ return Rectangle<float> { anchor.x, anchor.y, 2.0f, cursorHeight }.getSmallestIntegerContainer() + getTextOffset();\r
}\r
\r
Point<int> TextEditor::getTextOffset() const noexcept\r
roundToInt ((float) getTopIndent() + (float) borderSize.getTop() + yOffset) - viewport->getViewPositionY() };\r
}\r
\r
-RectangleList<int> TextEditor::getTextBounds (Range<int> textRange)\r
+RectangleList<int> TextEditor::getTextBounds (Range<int> textRange) const\r
{\r
RectangleList<int> boundingBox;\r
Iterator i (*this);\r
if (keepCaretOnScreen)\r
{\r
auto viewPos = viewport->getViewPosition();\r
- auto caretRect = getCaretRectangle().translated (leftIndent, topIndent);\r
+ auto caretRect = getCaretRectangle().translated (leftIndent, topIndent) - getTextOffset();\r
auto relativeCursor = caretRect.getPosition() - viewPos;\r
\r
if (relativeCursor.x < jmax (1, proportionOfWidth (0.05f)))\r
(float) (y - offset.y));\r
}\r
\r
+int TextEditor::getTextIndexAt (const Point<int> pt) const\r
+{\r
+ return getTextIndexAt (pt.x, pt.y);\r
+}\r
+\r
+int TextEditor::getCharIndexForPoint (const Point<int> point) const\r
+{\r
+ return getTextIndexAt (isMultiLine() ? point : getTextBounds ({ 0, getTotalNumChars() }).getBounds().getConstrainedPoint (point));\r
+}\r
+\r
void TextEditor::insertTextAtCaret (const String& t)\r
{\r
String newText (inputFilter != nullptr ? inputFilter->filterNewText (*this, t) : t);\r
\r
void TextEditor::setHighlightedRegion (const Range<int>& newSelection)\r
{\r
- moveCaretTo (newSelection.getStart(), false);\r
- moveCaretTo (newSelection.getEnd(), true);\r
+ if (newSelection == getHighlightedRegion())\r
+ return;\r
+\r
+ const auto cursorAtStart = newSelection.getEnd() == getHighlightedRegion().getStart()\r
+ || newSelection.getEnd() == getHighlightedRegion().getEnd();\r
+ moveCaretTo (cursorAtStart ? newSelection.getEnd() : newSelection.getStart(), false);\r
+ moveCaretTo (cursorAtStart ? newSelection.getStart() : newSelection.getEnd(), true);\r
}\r
\r
//==============================================================================\r
{\r
if (! (popupMenuEnabled && e.mods.isPopupMenu()))\r
{\r
- moveCaretTo (getTextIndexAt (e.x, e.y),\r
- e.mods.isShiftDown());\r
+ moveCaretTo (getTextIndexAt (e.getPosition()), e.mods.isShiftDown());\r
\r
if (auto* peer = getPeer())\r
peer->closeInputMethodContext();\r
\r
if (wasFocused || ! selectAllTextWhenFocused)\r
if (! (popupMenuEnabled && e.mods.isPopupMenu()))\r
- moveCaretTo (getTextIndexAt (e.x, e.y), true);\r
+ moveCaretTo (getTextIndexAt (e.getPosition()), true);\r
}\r
\r
void TextEditor::mouseUp (const MouseEvent& e)\r
\r
if (wasFocused || ! selectAllTextWhenFocused)\r
if (e.mouseWasClicked() && ! (popupMenuEnabled && e.mods.isPopupMenu()))\r
- moveCaret (getTextIndexAt (e.x, e.y));\r
+ moveCaret (getTextIndexAt (e.getPosition()));\r
\r
wasFocused = true;\r
}\r
if (! mouseDownInEditor)\r
return;\r
\r
- int tokenEnd = getTextIndexAt (e.x, e.y);\r
+ int tokenEnd = getTextIndexAt (e.getPosition());\r
int tokenStart = 0;\r
\r
if (e.getNumberOfClicks() > 3)\r
if (! isMultiLine())\r
return moveCaretToStartOfLine (selecting);\r
\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - 1.0f), selecting);\r
}\r
\r
if (! isMultiLine())\r
return moveCaretToEndOfLine (selecting);\r
\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + 1.0f), selecting);\r
}\r
\r
if (! isMultiLine())\r
return moveCaretToStartOfLine (selecting);\r
\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getY() - (float) viewport->getViewHeight()), selecting);\r
}\r
\r
if (! isMultiLine())\r
return moveCaretToEndOfLine (selecting);\r
\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition (caretPos.getX(), caretPos.getBottom() + (float) viewport->getViewHeight()), selecting);\r
}\r
\r
\r
bool TextEditor::moveCaretToStartOfLine (bool selecting)\r
{\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition (0.0f, caretPos.getY()), selecting);\r
}\r
\r
\r
bool TextEditor::moveCaretToEndOfLine (bool selecting)\r
{\r
- auto caretPos = getCaretRectangleFloat();\r
+ const auto caretPos = (getCaretRectangle() - getTextOffset()).toFloat();\r
return moveCaretWithTransaction (indexAtPosition ((float) textHolder->getWidth(), caretPos.getY()), selecting);\r
}\r
\r
\r
void setSelection (Range<int> r) override\r
{\r
- if (r == textEditor.getHighlightedRegion())\r
- return;\r
-\r
- if (r.isEmpty())\r
- {\r
- textEditor.setCaretPosition (r.getStart());\r
- }\r
- else\r
- {\r
- const auto cursorAtStart = r.getEnd() == textEditor.getHighlightedRegion().getStart()\r
- || r.getEnd() == textEditor.getHighlightedRegion().getEnd();\r
- textEditor.moveCaretTo (cursorAtStart ? r.getEnd() : r.getStart(), false);\r
- textEditor.moveCaretTo (cursorAtStart ? r.getStart() : r.getEnd(), true);\r
- }\r
+ textEditor.setHighlightedRegion (r);\r
}\r
\r
String getText (Range<int> r) const override\r
\r
int getOffsetAtPoint (Point<int> point) const override\r
{\r
- auto localPoint = textEditor.getLocalPoint (nullptr, point);\r
- return textEditor.getTextIndexAt (localPoint.x, localPoint.y);\r
+ return textEditor.getTextIndexAt (textEditor.getLocalPoint (nullptr, point));\r
}\r
\r
private:\r
/** Returns the current index of the caret.\r
@see setCaretPosition\r
*/\r
- int getCaretPosition() const;\r
+ int getCaretPosition() const override;\r
\r
/** Moves the caret to be in front of a given character.\r
@see getCaretPosition, moveCaretToEnd\r
*/\r
void scrollEditorToPositionCaret (int desiredCaretX, int desiredCaretY);\r
\r
- /** Get the graphical position of the caret.\r
+ /** Get the graphical position of the caret for a particular index in the text.\r
\r
The rectangle returned is relative to the component's top-left corner.\r
- @see scrollEditorToPositionCaret\r
*/\r
- Rectangle<int> getCaretRectangle() override;\r
+ Rectangle<int> getCaretRectangleForCharIndex (int index) const override;\r
\r
/** Selects a section of the text. */\r
void setHighlightedRegion (const Range<int>& newSelection) override;\r
*/\r
int getTextIndexAt (int x, int y) const;\r
\r
+ /** Finds the index of the character at a given position.\r
+ The coordinates are relative to the component's top-left.\r
+ */\r
+ int getTextIndexAt (Point<int>) const;\r
+\r
+ /** Like getTextIndexAt, but doesn't snap to the beginning/end of the range for\r
+ points vertically outside the text.\r
+ */\r
+ int getCharIndexForPoint (Point<int> point) const override;\r
+\r
/** Counts the number of characters in the text.\r
\r
This is quicker than getting the text as a string if you just need to know\r
the length.\r
*/\r
- int getTotalNumChars() const;\r
+ int getTotalNumChars() const override;\r
\r
/** Returns the total width of the text, as it is currently laid-out.\r
\r
The bounds are relative to the component's top-left and may extend beyond the bounds\r
of the component if the text is long and word wrapping is disabled.\r
*/\r
- RectangleList<int> getTextBounds (Range<int> textRange);\r
+ RectangleList<int> getTextBounds (Range<int> textRange) const override;\r
\r
//==============================================================================\r
void moveCaretToEnd();\r
void reinsert (int insertIndex, const OwnedArray<UniformTextSection>&);\r
void remove (Range<int>, UndoManager*, int caretPositionToMoveTo);\r
void getCharPosition (int index, Point<float>&, float& lineHeight) const;\r
- Rectangle<float> getCaretRectangleFloat() const;\r
void updateCaretPosition();\r
void updateValueFromText();\r
void textWasChangedByValue();\r
public:\r
explicit ItemCellInterface (ItemComponent& c) : itemComponent (c) {}\r
\r
- int getColumnIndex() const override { return 0; }\r
- int getColumnSpan() const override { return 1; }\r
-\r
- int getRowIndex() const override\r
+ int getDisclosureLevel() const override\r
{\r
- return itemComponent.getRepresentedItem().getRowNumberInTree();\r
+ return getItemDepth (&itemComponent.getRepresentedItem());\r
}\r
\r
- int getRowSpan() const override\r
+ std::vector<const AccessibilityHandler*> getDisclosedRows() const override\r
{\r
- return 1;\r
- }\r
+ const auto& representedItem = itemComponent.getRepresentedItem();\r
+ const auto* tree = representedItem.getOwnerView();\r
\r
- int getDisclosureLevel() const override\r
- {\r
- return getItemDepth (&itemComponent.getRepresentedItem());\r
+ if (tree == nullptr)\r
+ return {};\r
+\r
+ const auto numSubItems = representedItem.isOpen() ? representedItem.getNumSubItems() : 0;\r
+\r
+ std::vector<const AccessibilityHandler*> result;\r
+ result.reserve ((size_t) numSubItems);\r
+\r
+ for (auto i = 0; i < numSubItems; ++i)\r
+ {\r
+ result.push_back ([&]() -> const AccessibilityHandler*\r
+ {\r
+ if (auto* subItem = representedItem.getSubItem (i))\r
+ if (auto* component = tree->getItemComponent (subItem))\r
+ return component->getAccessibilityHandler();\r
+\r
+ return nullptr;\r
+ }());\r
+ }\r
+\r
+ return result;\r
}\r
\r
const AccessibilityHandler* getTableHandler() const override\r
ItemComponent* getItemComponentAt (Point<int> p)\r
{\r
auto iter = std::find_if (itemComponents.cbegin(), itemComponents.cend(),\r
- [p] (const std::unique_ptr<ItemComponent>& c)\r
+ [p] (const auto& c)\r
{\r
return c->getBounds().contains (p);\r
});\r
ItemComponent* getComponentForItem (const TreeViewItem* item) const\r
{\r
const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(),\r
- [item] (const std::unique_ptr<ItemComponent>& c)\r
+ [item] (const auto& c)\r
{\r
return &c->getRepresentedItem() == item;\r
});\r
void itemBeingDeleted (const TreeViewItem* item)\r
{\r
const auto iter = std::find_if (itemComponents.begin(), itemComponents.end(),\r
- [item] (const std::unique_ptr<ItemComponent>& c)\r
+ [item] (const auto& c)\r
{\r
return &c->getRepresentedItem() == item;\r
});\r
}\r
}\r
\r
+ const TreeViewItem* getItemForItemComponent (const Component* comp) const\r
+ {\r
+ const auto iter = itemForItemComponent.find (comp);\r
+ return iter != itemForItemComponent.cend() ? iter->second : nullptr;\r
+ }\r
+\r
void updateComponents()\r
{\r
std::set<ItemComponent*> componentsToKeep;\r
}\r
else\r
{\r
- auto newComp = std::make_unique<ItemComponent> (*treeItem);\r
+ std::unique_ptr<ItemComponent, Deleter> newComp { new ItemComponent (*treeItem), Deleter { itemForItemComponent } };\r
+ itemForItemComponent.emplace (newComp.get(), treeItem);\r
\r
addAndMakeVisible (*newComp);\r
newComp->addMouseListener (this, treeItem->customComponentUsesTreeViewMouseHandler());\r
updateItemUnderMouse (e);\r
\r
isDragging = false;\r
- scopedScrollDisabler = nullptr;\r
+ scopedScrollDisabler = nullopt;\r
needSelectionOnMouseUp = false;\r
\r
if (! isEnabled())\r
auto imageOffset = pos.getPosition() - e.getPosition();\r
dragContainer->startDragging (dragDescription, &owner, { dragImage, additionalScale }, true, &imageOffset, &e.source);\r
\r
- scopedScrollDisabler = std::make_unique<ScopedDisableViewportScroll> (*itemComponent);\r
+ scopedScrollDisabler.emplace (*itemComponent);\r
}\r
else\r
{\r
return visibleItems;\r
}\r
\r
+ //==============================================================================\r
+ class Deleter\r
+ {\r
+ public:\r
+ explicit Deleter (std::map<const Component*, const TreeViewItem*>& map)\r
+ : itemForItemComponent (&map) {}\r
+\r
+ void operator() (ItemComponent* ptr) const\r
+ {\r
+ itemForItemComponent->erase (ptr);\r
+\r
+ if (ptr != nullptr)\r
+ delete ptr;\r
+ }\r
+\r
+ private:\r
+ std::map<const Component*, const TreeViewItem*>* itemForItemComponent = nullptr;\r
+ };\r
+\r
//==============================================================================\r
TreeView& owner;\r
\r
- std::vector<std::unique_ptr<ItemComponent>> itemComponents;\r
+ std::map<const Component*, const TreeViewItem*> itemForItemComponent;\r
+ std::vector<std::unique_ptr<ItemComponent, Deleter>> itemComponents;\r
ItemComponent* itemUnderMouse = nullptr;\r
- std::unique_ptr<ScopedDisableViewportScroll> scopedScrollDisabler;\r
+ Optional<ScopedDisableViewportScroll> scopedScrollDisabler;\r
bool isDragging = false, needSelectionOnMouseUp = false;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentComponent)\r
}\r
}\r
\r
-void TreeView::scrollToKeepItemVisible (TreeViewItem* item)\r
+void TreeView::scrollToKeepItemVisible (const TreeViewItem* item)\r
{\r
if (item != nullptr && item->ownerView == this)\r
{\r
int getNumRows() const override { return treeView.getNumRowsInTree(); }\r
int getNumColumns() const override { return 1; }\r
\r
- const AccessibilityHandler* getCellHandler (int row, int) const override\r
+ const AccessibilityHandler* getHeaderHandler() const override\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ const AccessibilityHandler* getRowHandler (int row) const override\r
{\r
if (auto* itemComp = treeView.getItemComponent (treeView.getItemOnRow (row)))\r
return itemComp->getAccessibilityHandler();\r
return nullptr;\r
}\r
\r
+ const AccessibilityHandler* getCellHandler (int, int) const override\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ Optional<Span> getRowSpan (const AccessibilityHandler& handler) const override\r
+ {\r
+ auto* item = getItemForHandler (handler);\r
+\r
+ if (item == nullptr)\r
+ return nullopt;\r
+\r
+ const auto rowNumber = item->getRowNumberInTree();\r
+\r
+ return rowNumber != -1 ? makeOptional (Span { rowNumber, 1 })\r
+ : nullopt;\r
+ }\r
+\r
+ Optional<Span> getColumnSpan (const AccessibilityHandler&) const override\r
+ {\r
+ return Span { 0, 1 };\r
+ }\r
+\r
+ void showCell (const AccessibilityHandler& cellHandler) const override\r
+ {\r
+ treeView.scrollToKeepItemVisible (getItemForHandler (cellHandler));\r
+ }\r
+\r
private:\r
+ const TreeViewItem* getItemForHandler (const AccessibilityHandler& handler) const\r
+ {\r
+ for (auto* comp = &handler.getComponent(); comp != &treeView; comp = comp->getParentComponent())\r
+ if (auto* result = treeView.viewport->getContentComp()->getItemForItemComponent (comp))\r
+ return result;\r
+\r
+ return nullptr;\r
+ }\r
+\r
TreeView& treeView;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableInterface)\r
}\r
}\r
\r
-TreeViewItem* TreeViewItem::getDeepestOpenParentItem() noexcept\r
+const TreeViewItem* TreeViewItem::getDeepestOpenParentItem() const noexcept\r
{\r
auto* result = this;\r
auto* item = this;\r
int getIndentX() const noexcept;\r
void setOwnerView (TreeView*) noexcept;\r
TreeViewItem* getTopLevelItem() noexcept;\r
- TreeViewItem* getDeepestOpenParentItem() noexcept;\r
+ const TreeViewItem* getDeepestOpenParentItem() const noexcept;\r
int getNumRows() const noexcept;\r
TreeViewItem* getItemOnRow (int) noexcept;\r
void deselectAllRecursively (TreeViewItem*);\r
TreeViewItem* getItemAt (int yPosition) const noexcept;\r
\r
/** Tries to scroll the tree so that this item is on-screen somewhere. */\r
- void scrollToKeepItemVisible (TreeViewItem* item);\r
+ void scrollToKeepItemVisible (const TreeViewItem* item);\r
\r
/** Returns the TreeView's Viewport object. */\r
Viewport* getViewport() const noexcept;\r
? Component::getApproximateScaleFactorForComponent (options.componentToCentreAround)\r
: 1.0f)\r
{\r
- setUsingNativeTitleBar (options.useNativeTitleBar);\r
- setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
-\r
if (options.content.willDeleteObject())\r
setContentOwned (options.content.release(), true);\r
else\r
\r
centreAroundComponent (options.componentToCentreAround, getWidth(), getHeight());\r
setResizable (options.resizable, options.useBottomRightCornerResizer);\r
+\r
+ setUsingNativeTitleBar (options.useNativeTitleBar);\r
+ setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
}\r
\r
void closeButtonPressed() override\r
\r
void setSelection (Range<int> r) override\r
{\r
- if (r == codeEditorComponent.getHighlightedRegion())\r
- return;\r
-\r
- if (r.isEmpty())\r
- {\r
- codeEditorComponent.caretPos.setPosition (r.getStart());\r
- return;\r
- }\r
-\r
- auto& doc = codeEditorComponent.document;\r
-\r
- const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart()\r
- || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd();\r
- codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()),\r
- CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd()));\r
+ codeEditorComponent.setHighlightedRegion (r);\r
}\r
\r
String getText (Range<int> r) const override\r
\r
RectangleList<int> getTextBounds (Range<int> textRange) const override\r
{\r
- auto& doc = codeEditorComponent.document;\r
-\r
- RectangleList<int> localRects;\r
-\r
- CodeDocument::Position startPosition (doc, textRange.getStart());\r
- CodeDocument::Position endPosition (doc, textRange.getEnd());\r
-\r
- for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line)\r
- {\r
- CodeDocument::Position lineStart (doc, line, 0);\r
- CodeDocument::Position lineEnd (doc, line, doc.getLine (line).length());\r
-\r
- if (line == startPosition.getLineNumber())\r
- lineStart = lineStart.movedBy (startPosition.getIndexInLine());\r
-\r
- if (line == endPosition.getLineNumber())\r
- lineEnd = { doc, line, endPosition.getIndexInLine() };\r
-\r
- auto startPos = codeEditorComponent.getCharacterBounds (lineStart).getTopLeft();\r
- auto endPos = codeEditorComponent.getCharacterBounds (lineEnd).getTopLeft();\r
-\r
- localRects.add (startPos.x,\r
- startPos.y,\r
- jmax (1, endPos.x - startPos.x),\r
- codeEditorComponent.getLineHeight());\r
- }\r
+ const auto localRects = codeEditorComponent.getTextBounds (textRange);\r
\r
RectangleList<int> globalRects;\r
\r
return true;\r
}\r
\r
- void getHighlightArea (RectangleList<float>& area, float x, int y, int lineH, float characterWidth) const\r
+ Optional<Rectangle<float>> getHighlightArea (float x, int y, int lineH, float characterWidth) const\r
{\r
- if (highlightColumnStart < highlightColumnEnd)\r
- area.add (Rectangle<float> (x + (float) highlightColumnStart * characterWidth - 1.0f, (float) y - 0.5f,\r
- (float) (highlightColumnEnd - highlightColumnStart) * characterWidth + 1.5f, (float) lineH + 1.0f));\r
+ return getHighlightArea (x, y, lineH, characterWidth, { highlightColumnStart, highlightColumnEnd });\r
+ }\r
+\r
+ Optional<Rectangle<float>> getHighlightArea (float x,\r
+ int y,\r
+ int lineH,\r
+ float characterWidth,\r
+ Range<int> highlightColumns) const\r
+ {\r
+ if (highlightColumns.isEmpty())\r
+ return {};\r
+\r
+ return Rectangle<float> (x + (float) highlightColumns.getStart() * characterWidth - 1.0f, (float) y - 0.5f,\r
+ (float) (highlightColumns.getEnd() - highlightColumns.getStart()) * characterWidth + 1.5f, (float) lineH + 1.0f);\r
+\r
}\r
\r
void draw (CodeEditorComponent& owner, Graphics& g, const Font& fontToUse,\r
jassertfalse; // TODO Windows IME not yet supported for this comp..\r
}\r
\r
-Rectangle<int> CodeEditorComponent::getCaretRectangle()\r
-{\r
- if (caret != nullptr)\r
- return getLocalArea (caret.get(), caret->getLocalBounds());\r
-\r
- return {};\r
-}\r
-\r
void CodeEditorComponent::setLineNumbersShown (const bool shouldBeShown)\r
{\r
if (showLineNumbers != shouldBeShown)\r
{\r
g.fillAll (findColour (CodeEditorComponent::backgroundColourId));\r
\r
- auto gutterSize = getGutterSize();\r
- auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight();\r
- auto right = verticalScrollBar.isVisible() ? verticalScrollBar.getX() : getWidth();\r
+ const auto gutterSize = getGutterSize();\r
+ const auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight();\r
+ const auto right = verticalScrollBar.isVisible() ? verticalScrollBar.getX() : getWidth();\r
\r
g.reduceClipRegion (gutterSize, 0, right - gutterSize, bottom);\r
\r
g.setFont (font);\r
\r
- auto clip = g.getClipBounds();\r
- auto firstLineToDraw = jmax (0, clip.getY() / lineHeight);\r
- auto lastLineToDraw = jmin (lines.size(), clip.getBottom() / lineHeight + 1);\r
- auto x = (float) (gutterSize - xOffset * charWidth);\r
- auto rightClip = (float) clip.getRight();\r
+ const auto clip = g.getClipBounds();\r
+ const auto firstLineToDraw = jmax (0, clip.getY() / lineHeight);\r
+ const auto lastLineToDraw = jmin (lines.size(), clip.getBottom() / lineHeight + 1);\r
+ const auto x = (float) (gutterSize - xOffset * charWidth);\r
+ const auto rightClip = (float) clip.getRight();\r
\r
{\r
RectangleList<float> highlightArea;\r
\r
for (int i = firstLineToDraw; i < lastLineToDraw; ++i)\r
- lines.getUnchecked(i)->getHighlightArea (highlightArea, x, lineHeight * i, lineHeight, charWidth);\r
+ if (const auto area = lines.getUnchecked(i)->getHighlightArea (x, lineHeight * i, lineHeight, charWidth))\r
+ highlightArea.add (*area);\r
\r
g.setColour (findColour (CodeEditorComponent::highlightColourId));\r
g.fillRectList (highlightArea);\r
return CodeDocument::Position (document, line, index);\r
}\r
\r
+int CodeEditorComponent::getCharIndexForPoint (Point<int> point) const\r
+{\r
+ return getPositionAt (point.x, point.y).getPosition();\r
+}\r
+\r
+RectangleList<int> CodeEditorComponent::getTextBounds (Range<int> textRange) const\r
+{\r
+ RectangleList<int> localRects;\r
+\r
+ const CodeDocument::Position startPosition (document, textRange.getStart());\r
+ const CodeDocument::Position endPosition (document, textRange.getEnd());\r
+\r
+ for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line)\r
+ {\r
+ const CodeDocument::Position lineStartColumn0 { document, line, 0 };\r
+\r
+ const auto lineStart = line == startPosition.getLineNumber() ? lineStartColumn0.movedBy (startPosition.getIndexInLine())\r
+ : lineStartColumn0;\r
+\r
+ const CodeDocument::Position lineEnd { document, line, line == endPosition.getLineNumber() ? endPosition.getIndexInLine()\r
+ : document.getLine (line).length() };\r
+\r
+ const auto startPos = getCharacterBounds (lineStart).getTopLeft();\r
+ const auto endPos = getCharacterBounds (lineEnd) .getTopLeft();\r
+\r
+ localRects.add (startPos.x, startPos.y, jmax (1, endPos.x - startPos.x), getLineHeight());\r
+ }\r
+\r
+ return localRects;\r
+}\r
+\r
//==============================================================================\r
void CodeEditorComponent::insertTextAtCaret (const String& newText)\r
{\r
\r
void CodeEditorComponent::setHighlightedRegion (const Range<int>& newRange)\r
{\r
- selectRegion (CodeDocument::Position (document, newRange.getStart()),\r
- CodeDocument::Position (document, newRange.getEnd()));\r
+ if (newRange == getHighlightedRegion())\r
+ return;\r
+\r
+ const auto cursorAtStart = newRange.getEnd() == getHighlightedRegion().getStart()\r
+ || newRange.getEnd() == getHighlightedRegion().getEnd();\r
+ selectRegion (CodeDocument::Position (document, cursorAtStart ? newRange.getEnd() : newRange.getStart()),\r
+ CodeDocument::Position (document, cursorAtStart ? newRange.getStart() : newRange.getEnd()));\r
}\r
\r
String CodeEditorComponent::getTextInRange (const Range<int>& range) const\r
/** Returns the current caret position. */\r
CodeDocument::Position getCaretPos() const { return caretPos; }\r
\r
- /** Returns the position of the caret, relative to the editor's origin. */\r
- Rectangle<int> getCaretRectangle() override;\r
+ /** Returns the total number of codepoints in the string. */\r
+ int getTotalNumChars() const override { return document.getNumCharacters(); }\r
\r
/** Moves the caret.\r
If selecting is true, the section of the document between the current\r
/** Enables or disables the line-number display in the gutter. */\r
void setLineNumbersShown (bool shouldBeShown);\r
\r
+ /** Returns the number of characters from the beginning of the document to the caret. */\r
+ int getCaretPosition() const override { return getCaretPos().getPosition(); }\r
+\r
+ /** @see getPositionAt */\r
+ int getCharIndexForPoint (Point<int> point) const override;\r
+\r
+ /** Returns the bounds of the caret at a particular location in the text. */\r
+ Rectangle<int> getCaretRectangleForCharIndex (int index) const override\r
+ {\r
+ return getCharacterBounds ({ document, index });\r
+ }\r
+\r
+ /** Returns the bounding box for a range of text in the editor. As the range may span\r
+ multiple lines, this method returns a RectangleList.\r
+\r
+ The bounds are relative to the component's top-left and may extend beyond the bounds\r
+ of the component if the text is long and word wrapping is disabled.\r
+ */\r
+ RectangleList<int> getTextBounds (Range<int> textRange) const override;\r
+\r
//==============================================================================\r
bool moveCaretLeft (bool moveInWholeWordSteps, bool selecting);\r
bool moveCaretRight (bool moveInWholeWordSteps, bool selecting);\r
#import <WebKit/WebKit.h>\r
\r
#if JUCE_PUSH_NOTIFICATIONS\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- #import <UserNotifications/UserNotifications.h>\r
- #endif\r
-\r
+ #import <UserNotifications/UserNotifications.h>\r
#include "native/juce_ios_PushNotifications.cpp"\r
#endif\r
\r
\r
BEGIN_JUCE_MODULE_DECLARATION\r
\r
- ID: juce_gui_extra\r
- vendor: juce\r
- version: 7.0.1\r
- name: JUCE extended GUI classes\r
- description: Miscellaneous GUI classes for specialised tasks.\r
- website: http://www.juce.com/juce\r
- license: GPL/Commercial\r
- minimumCppStandard: 14\r
-\r
- dependencies: juce_gui_basics\r
- OSXFrameworks: WebKit\r
- iOSFrameworks: WebKit\r
+ ID: juce_gui_extra\r
+ vendor: juce\r
+ version: 7.0.2\r
+ name: JUCE extended GUI classes\r
+ description: Miscellaneous GUI classes for specialised tasks.\r
+ website: http://www.juce.com/juce\r
+ license: GPL/Commercial\r
+ minimumCppStandard: 14\r
+\r
+ dependencies: juce_gui_basics\r
+ OSXFrameworks: WebKit\r
+ iOSFrameworks: WebKit\r
+ WeakiOSFrameworks: UserNotifications\r
+ WeakMacOSFrameworks: UserNotifications\r
\r
END_JUCE_MODULE_DECLARATION\r
\r
namespace juce\r
{\r
\r
-namespace PushNotificationsDelegateDetails\r
+struct PushNotificationsDelegateDetails\r
{\r
//==============================================================================\r
using Action = PushNotifications::Settings::Action;\r
using Category = PushNotifications::Settings::Category;\r
\r
- void* actionToNSAction (const Action& a, bool iOSEarlierThan10)\r
+ static void* actionToNSAction (const Action& a)\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- auto action = [[UIMutableUserNotificationAction alloc] init];\r
-\r
- action.identifier = juceStringToNS (a.identifier);\r
- action.title = juceStringToNS (a.title);\r
- action.behavior = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput\r
- : UIUserNotificationActionBehaviorDefault;\r
- action.parameters = varObjectToNSDictionary (a.parameters);\r
- action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground\r
- : UIUserNotificationActivationModeForeground;\r
- action.destructive = (bool) a.destructive;\r
-\r
- [action autorelease];\r
-\r
- return action;\r
- }\r
- else\r
- {\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
if (a.style == Action::text)\r
{\r
return [UNTextInputNotificationAction actionWithIdentifier: juceStringToNS (a.identifier)\r
return [UNNotificationAction actionWithIdentifier: juceStringToNS (a.identifier)\r
title: juceStringToNS (a.title)\r
options: NSUInteger (a.destructive << 1 | (! a.triggerInBackground) << 2)];\r
- #else\r
- return nullptr;\r
- #endif\r
}\r
- }\r
\r
- void* categoryToNSCategory (const Category& c, bool iOSEarlierThan10)\r
- {\r
- if (iOSEarlierThan10)\r
- {\r
- auto category = [[UIMutableUserNotificationCategory alloc] init];\r
- category.identifier = juceStringToNS (c.identifier);\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+ auto action = [[UIMutableUserNotificationAction alloc] init];\r
\r
- auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+ action.identifier = juceStringToNS (a.identifier);\r
+ action.title = juceStringToNS (a.title);\r
+ action.behavior = a.style == Action::text ? UIUserNotificationActionBehaviorTextInput\r
+ : UIUserNotificationActionBehaviorDefault;\r
+ action.parameters = varObjectToNSDictionary (a.parameters);\r
+ action.activationMode = a.triggerInBackground ? UIUserNotificationActivationModeBackground\r
+ : UIUserNotificationActivationModeForeground;\r
+ action.destructive = (bool) a.destructive;\r
\r
- for (const auto& a : c.actions)\r
- {\r
- auto* action = (UIUserNotificationAction*) actionToNSAction (a, iOSEarlierThan10);\r
- [actions addObject: action];\r
- }\r
-\r
- [category setActions: actions forContext: UIUserNotificationActionContextDefault];\r
- [category setActions: actions forContext: UIUserNotificationActionContextMinimal];\r
+ [action autorelease];\r
\r
- [category autorelease];\r
+ return action;\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
\r
- return category;\r
- }\r
- else\r
+ static void* categoryToNSCategory (const Category& c)\r
+ {\r
+ if (@available (iOS 10, *))\r
{\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
\r
for (const auto& a : c.actions)\r
{\r
- auto* action = (UNNotificationAction*) actionToNSAction (a, iOSEarlierThan10);\r
+ auto* action = (UNNotificationAction*) actionToNSAction (a);\r
[actions addObject: action];\r
}\r
\r
actions: actions\r
intentIdentifiers: @[]\r
options: c.sendDismissAction ? UNNotificationCategoryOptionCustomDismissAction : 0];\r
- #else\r
- return nullptr;\r
- #endif\r
}\r
+\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+ auto category = [[UIMutableUserNotificationCategory alloc] init];\r
+ category.identifier = juceStringToNS (c.identifier);\r
+\r
+ auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+\r
+ for (const auto& a : c.actions)\r
+ {\r
+ auto* action = (UIUserNotificationAction*) actionToNSAction (a);\r
+ [actions addObject: action];\r
+ }\r
+\r
+ [category setActions: actions forContext: UIUserNotificationActionContextDefault];\r
+ [category setActions: actions forContext: UIUserNotificationActionContextMinimal];\r
+\r
+ [category autorelease];\r
+\r
+ return category;\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
}\r
\r
//==============================================================================\r
- UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+ static UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
{\r
auto notification = [[UILocalNotification alloc] init];\r
\r
\r
return notification;\r
}\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
+ static UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
{\r
// content\r
auto content = [[UNMutableNotificationContent alloc] init];\r
\r
return request;\r
}\r
- #endif\r
\r
- String getUserResponseFromNSDictionary (NSDictionary* dictionary)\r
+ static String getUserResponseFromNSDictionary (NSDictionary* dictionary)\r
{\r
if (dictionary == nil || dictionary.count == 0)\r
return {};\r
}\r
\r
//==============================================================================\r
- var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar)\r
+ static var getNotificationPropertiesFromDictionaryVar (const var& dictionaryVar)\r
{\r
DynamicObject* dictionaryVarObject = dictionaryVar.getDynamicObject();\r
\r
}\r
\r
//==============================================================================\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t)\r
+ static double getIntervalSecFromUNNotificationTrigger (UNNotificationTrigger* t)\r
{\r
if (t != nil)\r
{\r
return 0.;\r
}\r
\r
- PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r)\r
+ static PushNotifications::Notification unNotificationRequestToJuceNotification (UNNotificationRequest* r)\r
{\r
PushNotifications::Notification n;\r
\r
return n;\r
}\r
\r
- PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n)\r
+ static PushNotifications::Notification unNotificationToJuceNotification (UNNotification* n)\r
{\r
return unNotificationRequestToJuceNotification (n.request);\r
}\r
- #endif\r
\r
- PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n)\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+ static PushNotifications::Notification uiLocalNotificationToJuceNotification (UILocalNotification* n)\r
{\r
PushNotifications::Notification notif;\r
\r
return notif;\r
}\r
\r
- Action uiUserNotificationActionToAction (UIUserNotificationAction* a)\r
+ static Action uiUserNotificationActionToAction (UIUserNotificationAction* a)\r
{\r
Action action;\r
\r
return action;\r
}\r
\r
- Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c)\r
+ static Category uiUserNotificationCategoryToCategory (UIUserNotificationCategory* c)\r
{\r
Category category;\r
category.identifier = nsStringToJuce (c.identifier);\r
\r
return category;\r
}\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- Action unNotificationActionToAction (UNNotificationAction* a)\r
+ static Action unNotificationActionToAction (UNNotificationAction* a)\r
{\r
Action action;\r
\r
return action;\r
}\r
\r
- Category unNotificationCategoryToCategory (UNNotificationCategory* c)\r
+ static Category unNotificationCategoryToCategory (UNNotificationCategory* c)\r
{\r
Category category;\r
\r
\r
return category;\r
}\r
- #endif\r
\r
- PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary)\r
+ static PushNotifications::Notification nsDictionaryToJuceNotification (NSDictionary* dictionary)\r
{\r
const var dictionaryVar = nsDictionaryToVar (dictionary);\r
\r
\r
return notification;\r
}\r
-}\r
-\r
-//==============================================================================\r
-struct PushNotificationsDelegate\r
-{\r
- PushNotificationsDelegate() : delegate ([getClass().createInstance() init])\r
- {\r
- Class::setThis (delegate.get(), this);\r
-\r
- id<UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
- if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)])\r
- [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()];\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
- }\r
-\r
- virtual ~PushNotificationsDelegate() {}\r
-\r
- virtual void didRegisterUserNotificationSettings (UIUserNotificationSettings* notificationSettings) = 0;\r
-\r
- virtual void registeredForRemoteNotifications (NSData* deviceToken) = 0;\r
-\r
- virtual void failedToRegisterForRemoteNotifications (NSError* error) = 0;\r
-\r
- virtual void didReceiveRemoteNotification (NSDictionary* userInfo) = 0;\r
-\r
- virtual void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo,\r
- void (^completionHandler)(UIBackgroundFetchResult result)) = 0;\r
-\r
- virtual void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier,\r
- NSDictionary* userInfo,\r
- NSDictionary* responseInfo,\r
- void (^completionHandler)()) = 0;\r
-\r
- virtual void didReceiveLocalNotification (UILocalNotification* notification) = 0;\r
-\r
- virtual void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier,\r
- UILocalNotification* notification,\r
- void (^completionHandler)()) = 0;\r
-\r
- virtual void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier,\r
- UILocalNotification* notification,\r
- NSDictionary* responseInfo,\r
- void (^completionHandler)()) = 0;\r
-\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- virtual void willPresentNotificationWithCompletionHandler (UNNotification* notification,\r
- void (^completionHandler)(UNNotificationPresentationOptions options)) = 0;\r
-\r
- virtual void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response,\r
- void (^completionHandler)()) = 0;\r
- #endif\r
-\r
-protected:\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- NSUniquePtr<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> delegate;\r
- #else\r
- NSUniquePtr<NSObject<UIApplicationDelegate>> delegate;\r
- #endif\r
\r
private:\r
- //==============================================================================\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- struct Class : public ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>>\r
- {\r
- Class() : ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> ("JucePushNotificationsDelegate_")\r
- #else\r
- struct Class : public ObjCClass<NSObject<UIApplicationDelegate>>\r
- {\r
- Class() : ObjCClass<NSObject<UIApplicationDelegate>> ("JucePushNotificationsDelegate_")\r
- #endif\r
- {\r
- addIvar<PushNotificationsDelegate*> ("self");\r
-\r
- addMethod (@selector (application:didRegisterUserNotificationSettings:), didRegisterUserNotificationSettings);\r
- addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), registeredForRemoteNotifications);\r
- addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), failedToRegisterForRemoteNotifications);\r
- addMethod (@selector (application:didReceiveRemoteNotification:), didReceiveRemoteNotification);\r
- addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:), didReceiveRemoteNotificationFetchCompletionHandler);\r
- addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), handleActionForRemoteNotificationCompletionHandler);\r
- addMethod (@selector (application:didReceiveLocalNotification:), didReceiveLocalNotification);\r
- addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:), handleActionForLocalNotificationCompletionHandler);\r
- addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:), handleActionForLocalNotificationWithResponseCompletionHandler);\r
-\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:), willPresentNotificationWithCompletionHandler);\r
- addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:), didReceiveNotificationResponseWithCompletionHandler);\r
- #endif\r
-\r
- registerClass();\r
- }\r
-\r
- //==============================================================================\r
- static PushNotificationsDelegate& getThis (id self) { return *getIvar<PushNotificationsDelegate*> (self, "self"); }\r
- static void setThis (id self, PushNotificationsDelegate* d) { object_setInstanceVariable (self, "self", d); }\r
-\r
- //==============================================================================\r
- static void didRegisterUserNotificationSettings (id self, SEL, UIApplication*,\r
- UIUserNotificationSettings* settings) { getThis (self).didRegisterUserNotificationSettings (settings); }\r
- static void registeredForRemoteNotifications (id self, SEL, UIApplication*,\r
- NSData* deviceToken) { getThis (self).registeredForRemoteNotifications (deviceToken); }\r
-\r
- static void failedToRegisterForRemoteNotifications (id self, SEL, UIApplication*,\r
- NSError* error) { getThis (self).failedToRegisterForRemoteNotifications (error); }\r
-\r
- static void didReceiveRemoteNotification (id self, SEL, UIApplication*,\r
- NSDictionary* userInfo) { getThis (self).didReceiveRemoteNotification (userInfo); }\r
-\r
- static void didReceiveRemoteNotificationFetchCompletionHandler (id self, SEL, UIApplication*,\r
- NSDictionary* userInfo,\r
- void (^completionHandler)(UIBackgroundFetchResult result)) { getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler); }\r
-\r
- static void handleActionForRemoteNotificationCompletionHandler (id self, SEL, UIApplication*,\r
- NSString* actionIdentifier,\r
- NSDictionary* userInfo,\r
- NSDictionary* responseInfo,\r
- void (^completionHandler)()) { getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler); }\r
-\r
- static void didReceiveLocalNotification (id self, SEL, UIApplication*,\r
- UILocalNotification* notification) { getThis (self).didReceiveLocalNotification (notification); }\r
-\r
- static void handleActionForLocalNotificationCompletionHandler (id self, SEL, UIApplication*,\r
- NSString* actionIdentifier,\r
- UILocalNotification* notification,\r
- void (^completionHandler)()) { getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler); }\r
-\r
- static void handleActionForLocalNotificationWithResponseCompletionHandler (id self, SEL, UIApplication*,\r
- NSString* actionIdentifier,\r
- UILocalNotification* notification,\r
- NSDictionary* responseInfo,\r
- void (^completionHandler)()) { getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler); }\r
-\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- static void willPresentNotificationWithCompletionHandler (id self, SEL, UNUserNotificationCenter*,\r
- UNNotification* notification,\r
- void (^completionHandler)(UNNotificationPresentationOptions options)) { getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler); }\r
-\r
- static void didReceiveNotificationResponseWithCompletionHandler (id self, SEL, UNUserNotificationCenter*,\r
- UNNotificationResponse* response,\r
- void (^completionHandler)()) { getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler); }\r
- #endif\r
- };\r
-\r
- //==============================================================================\r
- static Class& getClass()\r
- {\r
- static Class c;\r
- return c;\r
- }\r
+ ~PushNotificationsDelegateDetails() = delete;\r
};\r
\r
//==============================================================================\r
bool PushNotifications::Notification::isValid() const noexcept\r
{\r
- const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max;\r
+ if (@available (iOS 10, *))\r
+ return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty();\r
\r
- if (iOSEarlierThan10)\r
- return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty();\r
-\r
- return title.isNotEmpty() && body.isNotEmpty() && identifier.isNotEmpty() && category.isNotEmpty();\r
+ return title.isNotEmpty() && body.isNotEmpty() && category.isNotEmpty();\r
}\r
\r
//==============================================================================\r
-struct PushNotifications::Pimpl : private PushNotificationsDelegate\r
+struct PushNotifications::Pimpl\r
{\r
Pimpl (PushNotifications& p)\r
: owner (p)\r
{\r
+ Class::setThis (delegate.get(), this);\r
+\r
+ auto appDelegate = [[UIApplication sharedApplication] delegate];\r
+\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+ if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)])\r
+ [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()];\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
}\r
\r
void requestPermissionsWithSettings (const PushNotifications::Settings& settingsToUse)\r
\r
auto categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
\r
- if (iOSEarlierThan10)\r
- {\r
- for (const auto& c : settings.categories)\r
- {\r
- auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10);\r
- [categories addObject: category];\r
- }\r
-\r
- UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0\r
- | (bool)settings.allowSound << 1\r
- | (bool)settings.allowAlert << 2);\r
-\r
- UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories];\r
- [[UIApplication sharedApplication] registerUserNotificationSettings: s];\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
+ if (@available (iOS 10, *))\r
{\r
for (const auto& c : settings.categories)\r
{\r
- auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c, iOSEarlierThan10);\r
+ auto* category = (UNNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c);\r
[categories addObject: category];\r
}\r
\r
requestSettingsUsed();\r
}];\r
}\r
- #endif\r
+ else\r
+ {\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ for (const auto& c : settings.categories)\r
+ {\r
+ auto* category = (UIUserNotificationCategory*) PushNotificationsDelegateDetails::categoryToNSCategory (c);\r
+ [categories addObject: category];\r
+ }\r
+\r
+ UIUserNotificationType type = NSUInteger ((bool)settings.allowBadge << 0\r
+ | (bool)settings.allowSound << 1\r
+ | (bool)settings.allowAlert << 2);\r
+\r
+ UIUserNotificationSettings* s = [UIUserNotificationSettings settingsForTypes: type categories: categories];\r
+ [[UIApplication sharedApplication] registerUserNotificationSettings: s];\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
\r
[[UIApplication sharedApplication] registerForRemoteNotifications];\r
}\r
\r
void requestSettingsUsed()\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings;\r
-\r
- settings.allowBadge = s.types & UIUserNotificationTypeBadge;\r
- settings.allowSound = s.types & UIUserNotificationTypeSound;\r
- settings.allowAlert = s.types & UIUserNotificationTypeAlert;\r
-\r
- for (UIUserNotificationCategory *c in s.categories)\r
- settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c));\r
-\r
- owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); });\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
- {\r
-\r
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:\r
^(UNNotificationSettings* s)\r
{\r
\r
}];\r
}\r
- #endif\r
+ else\r
+ {\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ UIUserNotificationSettings* s = [UIApplication sharedApplication].currentUserNotificationSettings;\r
+\r
+ settings.allowBadge = s.types & UIUserNotificationTypeBadge;\r
+ settings.allowSound = s.types & UIUserNotificationTypeSound;\r
+ settings.allowAlert = s.types & UIUserNotificationTypeAlert;\r
+\r
+ for (UIUserNotificationCategory *c in s.categories)\r
+ settings.categories.add (PushNotificationsDelegateDetails::uiUserNotificationCategoryToCategory (c));\r
+\r
+ owner.listeners.call ([&] (Listener& l) { l.notificationSettingsReceived (settings); });\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
}\r
\r
bool areNotificationsEnabled() const { return true; }\r
\r
void sendLocalNotification (const Notification& n)\r
{\r
- if (iOSEarlierThan10)\r
- {\r
- auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n);\r
-\r
- [[UIApplication sharedApplication] scheduleLocalNotification: notification];\r
- [notification release];\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
+ if (@available (iOS 10, *))\r
{\r
-\r
UNNotificationRequest* request = PushNotificationsDelegateDetails::juceNotificationToUNNotificationRequest (n);\r
\r
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest: request\r
NSLog (nsStringLiteral ("addNotificationRequest error: %@"), error);\r
}];\r
}\r
- #endif\r
+ else\r
+ {\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ auto* notification = PushNotificationsDelegateDetails::juceNotificationToUILocalNotification (n);\r
+\r
+ [[UIApplication sharedApplication] scheduleLocalNotification: notification];\r
+ [notification release];\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
}\r
\r
void getDeliveredNotifications() const\r
{\r
- if (iOSEarlierThan10)\r
- {\r
- // Not supported on this platform\r
- jassertfalse;\r
- owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); });\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
+ if (@available (iOS 10, *))\r
{\r
[[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:\r
^(NSArray<UNNotification*>* notifications)\r
owner.listeners.call ([&] (Listener& l) { l.deliveredNotificationsListReceived (notifs); });\r
}];\r
}\r
- #endif\r
+ else\r
+ {\r
+ // Not supported on this platform\r
+ jassertfalse;\r
+ owner.listeners.call ([] (Listener& l) { l.deliveredNotificationsListReceived ({}); });\r
+ }\r
}\r
\r
void removeAllDeliveredNotifications()\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- // Not supported on this platform\r
- jassertfalse;\r
+ [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];\r
}\r
else\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
{\r
-\r
- [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];\r
+ // Not supported on this platform\r
+ jassertfalse;\r
}\r
- #endif\r
}\r
\r
void removeDeliveredNotification (const String& identifier)\r
{\r
- if (iOSEarlierThan10)\r
- {\r
- ignoreUnused (identifier);\r
- // Not supported on this platform\r
- jassertfalse;\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
+ if (@available (iOS 10, *))\r
{\r
\r
NSArray<NSString*>* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)];\r
\r
[[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers: identifiers];\r
}\r
- #endif\r
+ else\r
+ {\r
+ ignoreUnused (identifier);\r
+ // Not supported on this platform\r
+ jassertfalse;\r
+ }\r
}\r
\r
void setupChannels (const Array<ChannelGroup>& groups, const Array<Channel>& channels)\r
\r
void getPendingLocalNotifications() const\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- Array<PushNotifications::Notification> notifs;\r
-\r
- for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications)\r
- notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n));\r
-\r
- owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); });\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
- {\r
-\r
[[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:\r
^(NSArray<UNNotificationRequest*>* requests)\r
{\r
}\r
];\r
}\r
- #endif\r
+ else\r
+ {\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ Array<PushNotifications::Notification> notifs;\r
+\r
+ for (UILocalNotification* n in [UIApplication sharedApplication].scheduledLocalNotifications)\r
+ notifs.add (PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (n));\r
+\r
+ owner.listeners.call ([&] (Listener& l) { l.pendingLocalNotificationsListReceived (notifs); });\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }\r
}\r
\r
void removePendingLocalNotification (const String& identifier)\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- // Not supported on this platform\r
- jassertfalse;\r
- }\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- else\r
- {\r
-\r
NSArray<NSString*>* identifiers = [NSArray arrayWithObject: juceStringToNS (identifier)];\r
\r
[[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers: identifiers];\r
}\r
- #endif\r
+ else\r
+ {\r
+ // Not supported on this platform\r
+ jassertfalse;\r
+ }\r
}\r
\r
void removeAllPendingLocalNotifications()\r
{\r
- if (iOSEarlierThan10)\r
+ if (@available (iOS 10, *))\r
{\r
- [[UIApplication sharedApplication] cancelAllLocalNotifications];\r
+ [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];\r
}\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
else\r
{\r
- [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ [[UIApplication sharedApplication] cancelAllLocalNotifications];\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
}\r
- #endif\r
}\r
\r
String getDeviceToken()\r
return deviceToken;\r
}\r
\r
- //==============================================================================\r
- //PushNotificationsDelegate\r
- void didRegisterUserNotificationSettings (UIUserNotificationSettings*) override\r
+ void subscribeToTopic (const String& topic) { ignoreUnused (topic); }\r
+ void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+\r
+ void sendUpstreamMessage (const String& serverSenderId,\r
+ const String& collapseKey,\r
+ const String& messageId,\r
+ const String& messageType,\r
+ int timeToLive,\r
+ const StringPairArray& additionalData)\r
{\r
- requestSettingsUsed();\r
+ ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
+ ignoreUnused (timeToLive, additionalData);\r
}\r
\r
- void registeredForRemoteNotifications (NSData* deviceTokenToUse) override\r
+private:\r
+ //==============================================================================\r
+ void registeredForRemoteNotifications (NSData* deviceTokenToUse)\r
{\r
deviceToken = [deviceTokenToUse]() -> String\r
{\r
owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); });\r
}\r
\r
- void failedToRegisterForRemoteNotifications (NSError* error) override\r
+ void failedToRegisterForRemoteNotifications (NSError* error)\r
{\r
ignoreUnused (error);\r
\r
deviceToken.clear();\r
}\r
\r
- void didReceiveRemoteNotification (NSDictionary* userInfo) override\r
+ void didReceiveRemoteNotification (NSDictionary* userInfo)\r
{\r
auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo);\r
\r
}\r
\r
void didReceiveRemoteNotificationFetchCompletionHandler (NSDictionary* userInfo,\r
- void (^completionHandler)(UIBackgroundFetchResult result)) override\r
+ void (^completionHandler)(UIBackgroundFetchResult result))\r
{\r
didReceiveRemoteNotification (userInfo);\r
completionHandler (UIBackgroundFetchResultNewData);\r
void handleActionForRemoteNotificationCompletionHandler (NSString* actionIdentifier,\r
NSDictionary* userInfo,\r
NSDictionary* responseInfo,\r
- void (^completionHandler)()) override\r
+ void (^completionHandler)())\r
{\r
auto n = PushNotificationsDelegateDetails::nsDictionaryToJuceNotification (userInfo);\r
auto actionString = nsStringToJuce (actionIdentifier);\r
completionHandler();\r
}\r
\r
- void didReceiveLocalNotification (UILocalNotification* notification) override\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ void didRegisterUserNotificationSettings (UIUserNotificationSettings*)\r
+ {\r
+ requestSettingsUsed();\r
+ }\r
+\r
+ void didReceiveLocalNotification (UILocalNotification* notification)\r
{\r
auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification);\r
\r
\r
void handleActionForLocalNotificationCompletionHandler (NSString* actionIdentifier,\r
UILocalNotification* notification,\r
- void (^completionHandler)()) override\r
+ void (^completionHandler)())\r
{\r
handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier,\r
notification,\r
void handleActionForLocalNotificationWithResponseCompletionHandler (NSString* actionIdentifier,\r
UILocalNotification* notification,\r
NSDictionary* responseInfo,\r
- void (^completionHandler)()) override\r
+ void (^completionHandler)())\r
{\r
auto n = PushNotificationsDelegateDetails::uiLocalNotificationToJuceNotification (notification);\r
auto actionString = nsStringToJuce (actionIdentifier);\r
completionHandler();\r
}\r
\r
- #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
void willPresentNotificationWithCompletionHandler (UNNotification* notification,\r
- void (^completionHandler)(UNNotificationPresentationOptions options)) override\r
+ void (^completionHandler)(UNNotificationPresentationOptions options))\r
{\r
NSUInteger options = NSUInteger ((int)settings.allowBadge << 0\r
| (int)settings.allowSound << 1\r
}\r
\r
void didReceiveNotificationResponseWithCompletionHandler (UNNotificationResponse* response,\r
- void (^completionHandler)()) override\r
+ void (^completionHandler)())\r
{\r
const bool remote = [response.notification.request.trigger isKindOfClass: [UNPushNotificationTrigger class]];\r
\r
owner.listeners.call ([&] (Listener& l) { l.handleNotificationAction (! remote, n, actionString, responseString); });\r
completionHandler();\r
}\r
- #endif\r
\r
- void subscribeToTopic (const String& topic) { ignoreUnused (topic); }\r
- void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+ //==============================================================================\r
+ struct Class : public ObjCClass<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>>\r
+ {\r
+ Class()\r
+ : ObjCClass ("JucePushNotificationsDelegate_")\r
+ {\r
+ addIvar<Pimpl*> ("self");\r
\r
- void sendUpstreamMessage (const String& serverSenderId,\r
- const String& collapseKey,\r
- const String& messageId,\r
- const String& messageType,\r
- int timeToLive,\r
- const StringPairArray& additionalData)\r
+ addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), [] (id self, SEL, UIApplication*, NSData* data)\r
+ {\r
+ getThis (self).registeredForRemoteNotifications (data);\r
+ });\r
+\r
+ addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), [] (id self, SEL, UIApplication*, NSError* error)\r
+ {\r
+ getThis (self).failedToRegisterForRemoteNotifications (error);\r
+ });\r
+\r
+ addMethod (@selector (application:didReceiveRemoteNotification:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo)\r
+ {\r
+ getThis (self).didReceiveRemoteNotification (userInfo);\r
+ });\r
+\r
+ addMethod (@selector (application:didReceiveRemoteNotification:fetchCompletionHandler:), [] (id self, SEL, UIApplication*, NSDictionary* userInfo, void (^completionHandler)(UIBackgroundFetchResult result))\r
+ {\r
+ getThis (self).didReceiveRemoteNotificationFetchCompletionHandler (userInfo, completionHandler);\r
+ });\r
+\r
+ addMethod (@selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, NSDictionary* userInfo, NSDictionary* responseInfo, void (^completionHandler)())\r
+ {\r
+ getThis (self).handleActionForRemoteNotificationCompletionHandler (actionIdentifier, userInfo, responseInfo, completionHandler);\r
+ });\r
+\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
+ addMethod (@selector (application:didRegisterUserNotificationSettings:), [] (id self, SEL, UIApplication*, UIUserNotificationSettings* settingsToUse)\r
+ {\r
+ getThis (self).didRegisterUserNotificationSettings (settingsToUse);\r
+ });\r
+\r
+ addMethod (@selector (application:didReceiveLocalNotification:), [] (id self, SEL, UIApplication*, UILocalNotification* notification)\r
+ {\r
+ getThis (self).didReceiveLocalNotification (notification);\r
+ });\r
+\r
+ addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, void (^completionHandler)())\r
+ {\r
+ getThis (self).handleActionForLocalNotificationCompletionHandler (actionIdentifier, notification, completionHandler);\r
+ });\r
+\r
+ addMethod (@selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:), [] (id self, SEL, UIApplication*, NSString* actionIdentifier, UILocalNotification* notification, NSDictionary* responseInfo, void (^completionHandler)())\r
+ {\r
+ getThis (self). handleActionForLocalNotificationWithResponseCompletionHandler (actionIdentifier, notification, responseInfo, completionHandler);\r
+ });\r
+\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+ addMethod (@selector (userNotificationCenter:willPresentNotification:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotification* notification, void (^completionHandler)(UNNotificationPresentationOptions options))\r
+ {\r
+ getThis (self).willPresentNotificationWithCompletionHandler (notification, completionHandler);\r
+ });\r
+\r
+ addMethod (@selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:), [] (id self, SEL, UNUserNotificationCenter*, UNNotificationResponse* response, void (^completionHandler)())\r
+ {\r
+ getThis (self).didReceiveNotificationResponseWithCompletionHandler (response, completionHandler);\r
+ });\r
+\r
+ registerClass();\r
+ }\r
+\r
+ //==============================================================================\r
+ static Pimpl& getThis (id self) { return *getIvar<Pimpl*> (self, "self"); }\r
+ static void setThis (id self, Pimpl* d) { object_setInstanceVariable (self, "self", d); }\r
+ };\r
+\r
+ //==============================================================================\r
+ static Class& getClass()\r
{\r
- ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
- ignoreUnused (timeToLive, additionalData);\r
+ static Class c;\r
+ return c;\r
}\r
\r
-private:\r
- PushNotifications& owner;\r
+ NSUniquePtr<NSObject<UIApplicationDelegate, UNUserNotificationCenterDelegate>> delegate { [getClass().createInstance() init] };\r
\r
- const bool iOSEarlierThan10 = std::floor (NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max;\r
+ PushNotifications& owner;\r
\r
bool initialised = false;\r
String deviceToken;\r
\r
argv[4] = nullptr;\r
\r
- #if JUCE_STANDALONE_APPLICATION\r
- execv (arguments[0].toRawUTF8(), (char**) argv.getData());\r
- #else\r
- juce_gtkWebkitMain (4, (const char**) argv.getData());\r
- #endif\r
+ if (JUCEApplicationBase::isStandaloneApp())\r
+ execv (arguments[0].toRawUTF8(), (char**) argv.getData());\r
+ else\r
+ juce_gtkWebkitMain (4, (const char**) argv.getData());\r
+\r
exit (0);\r
}\r
\r
button.image = statusIcon.get();\r
button.target = eventForwarder.get();\r
button.action = @selector (handleEvent:);\r
- #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
[button sendActionOn: NSEventMaskLeftMouseDown | NSEventMaskRightMouseDown | NSEventMaskScrollWheel];\r
- #else\r
- [button sendActionOn: NSLeftMouseDownMask | NSRightMouseDownMask | NSScrollWheelMask];\r
- #endif\r
}\r
\r
~ButtonBasedStatusItem() override\r
namespace juce\r
{\r
\r
-#if JUCE_MAC && defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- #define WKWEBVIEW_OPENPANEL_SUPPORTED 1\r
-#endif\r
-\r
static NSURL* appendParametersToFileURL (const URL& url, NSURL* fileUrl)\r
{\r
if (@available (macOS 10.10, *))\r
WebViewKeyEquivalentResponder()\r
: ObjCClass<WebViewClass> ("WebViewKeyEquivalentResponder_")\r
{\r
- ObjCClass<WebViewClass>::addMethod (@selector (performKeyEquivalent:), performKeyEquivalent);\r
- ObjCClass<WebViewClass>::registerClass();\r
- }\r
-\r
-private:\r
- static BOOL performKeyEquivalent (id self, SEL selector, NSEvent* event)\r
- {\r
- const auto isCommandDown = [event]\r
- {\r
- const auto modifierFlags = [event modifierFlags];\r
-\r
- #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- if (@available (macOS 10.12, *))\r
- return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand;\r
- #endif\r
-\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
- return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask;\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
- }();\r
-\r
- if (isCommandDown)\r
- {\r
- auto sendAction = [&] (SEL actionSelector) -> BOOL\r
- {\r
- return [NSApp sendAction: actionSelector\r
- to: [[self window] firstResponder]\r
- from: self];\r
- };\r
-\r
- if ([[event charactersIgnoringModifiers] isEqualToString: @"x"]) return sendAction (@selector (cut:));\r
- if ([[event charactersIgnoringModifiers] isEqualToString: @"c"]) return sendAction (@selector (copy:));\r
- if ([[event charactersIgnoringModifiers] isEqualToString: @"v"]) return sendAction (@selector (paste:));\r
- if ([[event charactersIgnoringModifiers] isEqualToString: @"a"]) return sendAction (@selector (selectAll:));\r
- }\r
-\r
- return ObjCClass<WebViewClass>::template sendSuperclassMessage<BOOL> (self, selector, event);\r
+ this->addMethod (@selector (performKeyEquivalent:),\r
+ [] (id self, SEL selector, NSEvent* event)\r
+ {\r
+ const auto isCommandDown = [event]\r
+ {\r
+ const auto modifierFlags = [event modifierFlags];\r
+\r
+ if (@available (macOS 10.12, *))\r
+ return (modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand;\r
+\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+ return (modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask;\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+ }();\r
+\r
+ if (isCommandDown)\r
+ {\r
+ auto sendAction = [&] (SEL actionSelector) -> BOOL\r
+ {\r
+ return [NSApp sendAction:actionSelector\r
+ to:[[self window] firstResponder]\r
+ from:self];\r
+ };\r
+\r
+ if ([[event charactersIgnoringModifiers] isEqualToString:@"x"])\r
+ return sendAction (@selector (cut:));\r
+ if ([[event charactersIgnoringModifiers] isEqualToString:@"c"])\r
+ return sendAction (@selector (copy:));\r
+ if ([[event charactersIgnoringModifiers] isEqualToString:@"v"])\r
+ return sendAction (@selector (paste:));\r
+ if ([[event charactersIgnoringModifiers] isEqualToString:@"a"])\r
+ return sendAction (@selector (selectAll:));\r
+ }\r
+\r
+ return ObjCClass<WebViewClass>::template sendSuperclassMessage<BOOL> (self, selector, event);\r
+ });\r
+ this->registerClass();\r
}\r
};\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
struct DownloadClickDetectorClass : public ObjCClass<NSObject>\r
{\r
- DownloadClickDetectorClass() : ObjCClass<NSObject> ("JUCEWebClickDetector_")\r
+ DownloadClickDetectorClass() : ObjCClass ("JUCEWebClickDetector_")\r
{\r
addIvar<WebBrowserComponent*> ("owner");\r
\r
- addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:), decidePolicyForNavigationAction);\r
- addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), decidePolicyForNewWindowAction);\r
- addMethod (@selector (webView:didFinishLoadForFrame:), didFinishLoadForFrame);\r
- addMethod (@selector (webView:didFailLoadWithError:forFrame:), didFailLoadWithError);\r
- addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:), didFailLoadWithError);\r
- addMethod (@selector (webView:willCloseFrame:), willCloseFrame);\r
- addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:), runOpenPanel);\r
+ addMethod (@selector (webView:didFailLoadWithError:forFrame:), didFailLoadWithError);\r
+ addMethod (@selector (webView:didFailProvisionalLoadWithError:forFrame:), didFailLoadWithError);\r
+\r
+ addMethod (@selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener:),\r
+ [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, WebFrame*, id<WebPolicyDecisionListener> listener)\r
+ {\r
+ if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation)))\r
+ [listener use];\r
+ else\r
+ [listener ignore];\r
+ });\r
+\r
+ addMethod (@selector (webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:),\r
+ [] (id self, SEL, WebView*, NSDictionary* actionInformation, NSURLRequest*, NSString*, id<WebPolicyDecisionListener> listener)\r
+ {\r
+ getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation));\r
+ [listener ignore];\r
+ });\r
+\r
+ addMethod (@selector (webView:didFinishLoadForFrame:),\r
+ [] (id self, SEL, WebView* sender, WebFrame* frame)\r
+ {\r
+ if ([frame isEqual:[sender mainFrame]])\r
+ {\r
+ NSURL* url = [[[frame dataSource] request] URL];\r
+ getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString]));\r
+ }\r
+ });\r
+\r
+ addMethod (@selector (webView:willCloseFrame:),\r
+ [] (id self, SEL, WebView*, WebFrame*)\r
+ {\r
+ getOwner (self)->windowCloseRequest();\r
+ });\r
+\r
+ addMethod (@selector (webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:),\r
+ [] (id, SEL, WebView*, id<WebOpenPanelResultListener> resultListener, BOOL allowMultipleFiles)\r
+ {\r
+ struct DeletedFileChooserWrapper : private DeletedAtShutdown\r
+ {\r
+ DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, id<WebOpenPanelResultListener> rl)\r
+ : chooser (std::move (fc)), listener (rl)\r
+ {\r
+ [listener.get() retain];\r
+ }\r
+\r
+ std::unique_ptr<FileChooser> chooser;\r
+ ObjCObjectHandle<id<WebOpenPanelResultListener>> listener;\r
+ };\r
+\r
+ auto chooser = std::make_unique<FileChooser> (TRANS ("Select the file you want to upload..."),\r
+ File::getSpecialLocation (File::userHomeDirectory),\r
+ "*");\r
+ auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener);\r
+\r
+ auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
+ | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0);\r
+\r
+ wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
+ {\r
+ for (auto& f : wrapper->chooser->getResults())\r
+ [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())];\r
+\r
+ delete wrapper;\r
+ });\r
+ });\r
\r
registerClass();\r
}\r
return {};\r
}\r
\r
- static void decidePolicyForNavigationAction (id self, SEL, WebView*, NSDictionary* actionInformation,\r
- NSURLRequest*, WebFrame*, id<WebPolicyDecisionListener> listener)\r
- {\r
- if (getOwner (self)->pageAboutToLoad (getOriginalURL (actionInformation)))\r
- [listener use];\r
- else\r
- [listener ignore];\r
- }\r
-\r
- static void decidePolicyForNewWindowAction (id self, SEL, WebView*, NSDictionary* actionInformation,\r
- NSURLRequest*, NSString*, id<WebPolicyDecisionListener> listener)\r
- {\r
- getOwner (self)->newWindowAttemptingToLoad (getOriginalURL (actionInformation));\r
- [listener ignore];\r
- }\r
-\r
- static void didFinishLoadForFrame (id self, SEL, WebView* sender, WebFrame* frame)\r
- {\r
- if ([frame isEqual: [sender mainFrame]])\r
- {\r
- NSURL* url = [[[frame dataSource] request] URL];\r
- getOwner (self)->pageFinishedLoading (nsStringToJuce ([url absoluteString]));\r
- }\r
- }\r
-\r
static void didFailLoadWithError (id self, SEL, WebView* sender, NSError* error, WebFrame* frame)\r
{\r
if ([frame isEqual: [sender mainFrame]] && error != nullptr && [error code] != NSURLErrorCancelled)\r
getOwner (self)->goToURL ("data:text/plain;charset=UTF-8," + errorString);\r
}\r
}\r
-\r
- static void willCloseFrame (id self, SEL, WebView*, WebFrame*)\r
- {\r
- getOwner (self)->windowCloseRequest();\r
- }\r
-\r
- static void runOpenPanel (id, SEL, WebView*, id<WebOpenPanelResultListener> resultListener, BOOL allowMultipleFiles)\r
- {\r
- struct DeletedFileChooserWrapper : private DeletedAtShutdown\r
- {\r
- DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, id<WebOpenPanelResultListener> rl)\r
- : chooser (std::move (fc)), listener (rl)\r
- {\r
- [listener.get() retain];\r
- }\r
-\r
- std::unique_ptr<FileChooser> chooser;\r
- ObjCObjectHandle<id<WebOpenPanelResultListener>> listener;\r
- };\r
-\r
- auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
- File::getSpecialLocation (File::userHomeDirectory), "*");\r
- auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), resultListener);\r
-\r
- auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
- | (allowMultipleFiles ? FileBrowserComponent::canSelectMultipleItems : 0);\r
-\r
- wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
- {\r
- for (auto& f : wrapper->chooser->getResults())\r
- [wrapper->listener.get() chooseFilename: juceStringToNS (f.getFullPathName())];\r
-\r
- delete wrapper;\r
- });\r
- }\r
};\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
#endif\r
\r
struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass : public ObjCClass<NSObject>\r
{\r
- WebViewDelegateClass() : ObjCClass<NSObject> ("JUCEWebViewDelegate_")\r
+ WebViewDelegateClass() : ObjCClass ("JUCEWebViewDelegate_")\r
{\r
addIvar<WebBrowserComponent*> ("owner");\r
\r
- addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:), decidePolicyForNavigationAction);\r
- addMethod (@selector (webView:didFinishNavigation:), didFinishNavigation);\r
- addMethod (@selector (webView:didFailNavigation:withError:), didFailNavigation);\r
- addMethod (@selector (webView:didFailProvisionalNavigation:withError:), didFailProvisionalNavigation);\r
- addMethod (@selector (webViewDidClose:), webViewDidClose);\r
- addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:\r
- windowFeatures:), createWebView);\r
+ addMethod (@selector (webView:decidePolicyForNavigationAction:decisionHandler:),\r
+ [] (id self, SEL, WKWebView*, WKNavigationAction* navigationAction, void (^decisionHandler) (WKNavigationActionPolicy))\r
+ {\r
+ if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])))\r
+ decisionHandler (WKNavigationActionPolicyAllow);\r
+ else\r
+ decisionHandler (WKNavigationActionPolicyCancel);\r
+ });\r
+\r
+ addMethod (@selector (webView:didFinishNavigation:),\r
+ [] (id self, SEL, WKWebView* webview, WKNavigation*)\r
+ {\r
+ getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString]));\r
+ });\r
+\r
+ addMethod (@selector (webView:didFailNavigation:withError:),\r
+ [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
+ {\r
+ displayError (getOwner (self), error);\r
+ });\r
+\r
+ addMethod (@selector (webView:didFailProvisionalNavigation:withError:),\r
+ [] (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
+ {\r
+ displayError (getOwner (self), error);\r
+ });\r
+\r
+ addMethod (@selector (webViewDidClose:),\r
+ [] (id self, SEL, WKWebView*)\r
+ {\r
+ getOwner (self)->windowCloseRequest();\r
+ });\r
+\r
+ addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:),\r
+ [] (id self, SEL, WKWebView*, WKWebViewConfiguration*, WKNavigationAction* navigationAction, WKWindowFeatures*)\r
+ {\r
+ getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]));\r
+ return nil;\r
+ });\r
\r
- #if WKWEBVIEW_OPENPANEL_SUPPORTED\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
if (@available (macOS 10.12, *))\r
- addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:), runOpenPanel);\r
- #endif\r
+ {\r
+ addMethod (@selector (webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:),\r
+ [] (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, void (^completionHandler)(NSArray<NSURL*>*))\r
+ {\r
+ using CompletionHandlerType = decltype (completionHandler);\r
+\r
+ class DeletedFileChooserWrapper : private DeletedAtShutdown\r
+ {\r
+ public:\r
+ DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, CompletionHandlerType h)\r
+ : chooser (std::move (fc)), handler (h)\r
+ {\r
+ [handler.get() retain];\r
+ }\r
+\r
+ ~DeletedFileChooserWrapper()\r
+ {\r
+ callHandler (nullptr);\r
+ }\r
+\r
+ void callHandler (NSArray<NSURL*>* urls)\r
+ {\r
+ if (handlerCalled)\r
+ return;\r
+\r
+ handler.get() (urls);\r
+ handlerCalled = true;\r
+ }\r
+\r
+ std::unique_ptr<FileChooser> chooser;\r
+\r
+ private:\r
+ ObjCObjectHandle<CompletionHandlerType> handler;\r
+ bool handlerCalled = false;\r
+ };\r
+\r
+ auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
+ File::getSpecialLocation (File::userHomeDirectory), "*");\r
+ auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler);\r
+\r
+ auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
+ | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0);\r
+\r
+ #if JUCE_MAC\r
+ if (@available (macOS 10.14, *))\r
+ {\r
+ if ([parameters allowsDirectories])\r
+ flags |= FileBrowserComponent::canSelectDirectories;\r
+ }\r
+ #endif\r
+\r
+ wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
+ {\r
+ auto results = wrapper->chooser->getResults();\r
+ auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()];\r
+\r
+ for (auto& f : results)\r
+ [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]];\r
+\r
+ wrapper->callHandler (urls);\r
+ delete wrapper;\r
+ });\r
+ });\r
+ }\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
registerClass();\r
}\r
static WebBrowserComponent* getOwner (id self) { return getIvar<WebBrowserComponent*> (self, "owner"); }\r
\r
private:\r
- static void decidePolicyForNavigationAction (id self, SEL, WKWebView*, WKNavigationAction* navigationAction,\r
- void (^decisionHandler)(WKNavigationActionPolicy))\r
- {\r
- if (getOwner (self)->pageAboutToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString])))\r
- decisionHandler (WKNavigationActionPolicyAllow);\r
- else\r
- decisionHandler (WKNavigationActionPolicyCancel);\r
- }\r
-\r
- static void didFinishNavigation (id self, SEL, WKWebView* webview, WKNavigation*)\r
- {\r
- getOwner (self)->pageFinishedLoading (nsStringToJuce ([[webview URL] absoluteString]));\r
- }\r
-\r
static void displayError (WebBrowserComponent* owner, NSError* error)\r
{\r
if ([error code] != NSURLErrorCancelled)\r
owner->goToURL ("data:text/plain;charset=UTF-8," + errorString);\r
}\r
}\r
-\r
- static void didFailNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
- {\r
- displayError (getOwner (self), error);\r
- }\r
-\r
- static void didFailProvisionalNavigation (id self, SEL, WKWebView*, WKNavigation*, NSError* error)\r
- {\r
- displayError (getOwner (self), error);\r
- }\r
-\r
- static void webViewDidClose (id self, SEL, WKWebView*)\r
- {\r
- getOwner (self)->windowCloseRequest();\r
- }\r
-\r
- static WKWebView* createWebView (id self, SEL, WKWebView*, WKWebViewConfiguration*,\r
- WKNavigationAction* navigationAction, WKWindowFeatures*)\r
- {\r
- getOwner (self)->newWindowAttemptingToLoad (nsStringToJuce ([[[navigationAction request] URL] absoluteString]));\r
- return nil;\r
- }\r
-\r
- #if WKWEBVIEW_OPENPANEL_SUPPORTED\r
- API_AVAILABLE (macos (10.12))\r
- static void runOpenPanel (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*,\r
- void (^completionHandler)(NSArray<NSURL*>*))\r
- {\r
- using CompletionHandlerType = decltype (completionHandler);\r
-\r
- class DeletedFileChooserWrapper : private DeletedAtShutdown\r
- {\r
- public:\r
- DeletedFileChooserWrapper (std::unique_ptr<FileChooser> fc, CompletionHandlerType h)\r
- : chooser (std::move (fc)), handler (h)\r
- {\r
- [handler.get() retain];\r
- }\r
-\r
- ~DeletedFileChooserWrapper()\r
- {\r
- callHandler (nullptr);\r
- }\r
-\r
- void callHandler (NSArray<NSURL*>* urls)\r
- {\r
- if (handlerCalled)\r
- return;\r
-\r
- handler.get() (urls);\r
- handlerCalled = true;\r
- }\r
-\r
- std::unique_ptr<FileChooser> chooser;\r
-\r
- private:\r
- ObjCObjectHandle<CompletionHandlerType> handler;\r
- bool handlerCalled = false;\r
- };\r
-\r
- auto chooser = std::make_unique<FileChooser> (TRANS("Select the file you want to upload..."),\r
- File::getSpecialLocation (File::userHomeDirectory), "*");\r
- auto* wrapper = new DeletedFileChooserWrapper (std::move (chooser), completionHandler);\r
-\r
- auto flags = FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles\r
- | ([parameters allowsMultipleSelection] ? FileBrowserComponent::canSelectMultipleItems : 0);\r
-\r
- #if (defined (MAC_OS_X_VERSION_10_14) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14)\r
- if (@available (macOS 10.14, *))\r
- {\r
- if ([parameters allowsDirectories])\r
- flags |= FileBrowserComponent::canSelectDirectories;\r
- }\r
- #endif\r
-\r
- wrapper->chooser->launchAsync (flags, [wrapper] (const FileChooser&)\r
- {\r
- auto results = wrapper->chooser->getResults();\r
- auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) results.size()];\r
-\r
- for (auto& f : results)\r
- [urls addObject: [NSURL fileURLWithPath: juceStringToNS (f.getFullPathName())]];\r
-\r
- wrapper->callHandler (urls);\r
- delete wrapper;\r
- });\r
- }\r
- #endif\r
};\r
\r
//==============================================================================\r
}\r
\r
/** Creates a matrix from a 3D vector translation. */\r
- Matrix3D (Vector3D<Type> vector) noexcept\r
+ static Matrix3D fromTranslation (Vector3D<Type> vector) noexcept\r
{\r
- mat[0] = Type (1); mat[1] = 0; mat[2] = 0; mat[3] = 0;\r
- mat[4] = 0; mat[5] = Type (1); mat[6] = 0; mat[7] = 0;\r
- mat[8] = 0; mat[9] = 0; mat[10] = Type (1); mat[11] = 0;\r
- mat[12] = vector.x; mat[13] = vector.y; mat[14] = vector.z; mat[15] = Type (1);\r
+ return { Type (1), 0, 0, 0,\r
+ 0, Type (1), 0, 0,\r
+ 0, 0, Type (1), 0,\r
+ vector.x, vector.y, vector.z, Type (1) };\r
}\r
\r
/** Returns a new matrix from the given frustum values. */\r
{\r
auto&& m2 = other.mat;\r
\r
- return { mat[0] * m2[0] + mat[1] * m2[4] + mat[2] * m2[8] + mat[3] * m2[12],\r
- mat[0] * m2[1] + mat[1] * m2[5] + mat[2] * m2[9] + mat[3] * m2[13],\r
- mat[0] * m2[2] + mat[1] * m2[6] + mat[2] * m2[10] + mat[3] * m2[14],\r
- mat[0] * m2[3] + mat[1] * m2[7] + mat[2] * m2[11] + mat[3] * m2[15],\r
- mat[4] * m2[0] + mat[5] * m2[4] + mat[6] * m2[8] + mat[7] * m2[12],\r
- mat[4] * m2[1] + mat[5] * m2[5] + mat[6] * m2[9] + mat[7] * m2[13],\r
- mat[4] * m2[2] + mat[5] * m2[6] + mat[6] * m2[10] + mat[7] * m2[14],\r
- mat[4] * m2[3] + mat[5] * m2[7] + mat[6] * m2[11] + mat[7] * m2[15],\r
- mat[8] * m2[0] + mat[9] * m2[4] + mat[10] * m2[8] + mat[11] * m2[12],\r
- mat[8] * m2[1] + mat[9] * m2[5] + mat[10] * m2[9] + mat[11] * m2[13],\r
- mat[8] * m2[2] + mat[9] * m2[6] + mat[10] * m2[10] + mat[11] * m2[14],\r
- mat[8] * m2[3] + mat[9] * m2[7] + mat[10] * m2[11] + mat[11] * m2[15],\r
- mat[12] * m2[0] + mat[13] * m2[4] + mat[14] * m2[8] + mat[15] * m2[12],\r
- mat[12] * m2[1] + mat[13] * m2[5] + mat[14] * m2[9] + mat[15] * m2[13],\r
- mat[12] * m2[2] + mat[13] * m2[6] + mat[14] * m2[10] + mat[15] * m2[14],\r
- mat[12] * m2[3] + mat[13] * m2[7] + mat[14] * m2[11] + mat[15] * m2[15] };\r
+ return { mat[0] * m2[0] + mat[4] * m2[1] + mat[8] * m2[2] + mat[12] * m2[3],\r
+ mat[1] * m2[0] + mat[5] * m2[1] + mat[9] * m2[2] + mat[13] * m2[3],\r
+ mat[2] * m2[0] + mat[6] * m2[1] + mat[10] * m2[2] + mat[14] * m2[3],\r
+ mat[3] * m2[0] + mat[7] * m2[1] + mat[11] * m2[2] + mat[15] * m2[3],\r
+ mat[0] * m2[4] + mat[4] * m2[5] + mat[8] * m2[6] + mat[12] * m2[7],\r
+ mat[1] * m2[4] + mat[5] * m2[5] + mat[9] * m2[6] + mat[13] * m2[7],\r
+ mat[2] * m2[4] + mat[6] * m2[5] + mat[10] * m2[6] + mat[14] * m2[7],\r
+ mat[3] * m2[4] + mat[7] * m2[5] + mat[11] * m2[6] + mat[15] * m2[7],\r
+ mat[0] * m2[8] + mat[4] * m2[9] + mat[8] * m2[10] + mat[12] * m2[11],\r
+ mat[1] * m2[8] + mat[5] * m2[9] + mat[9] * m2[10] + mat[13] * m2[11],\r
+ mat[2] * m2[8] + mat[6] * m2[9] + mat[10] * m2[10] + mat[14] * m2[11],\r
+ mat[3] * m2[8] + mat[7] * m2[9] + mat[11] * m2[10] + mat[15] * m2[11],\r
+ mat[0] * m2[12] + mat[4] * m2[13] + mat[8] * m2[14] + mat[12] * m2[15],\r
+ mat[1] * m2[12] + mat[5] * m2[13] + mat[9] * m2[14] + mat[13] * m2[15],\r
+ mat[2] * m2[12] + mat[6] * m2[13] + mat[10] * m2[14] + mat[14] * m2[15],\r
+ mat[3] * m2[12] + mat[7] * m2[13] + mat[11] * m2[14] + mat[15] * m2[15] };\r
}\r
\r
/** The 4x4 matrix values. These are stored in the standard OpenGL order. */\r
\r
ID: juce_opengl\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE OpenGL classes\r
description: Classes for rendering OpenGL in a JUCE window.\r
website: http://www.juce.com/juce\r
\r
static NSOpenGLContextParameter getSwapIntervalParameter()\r
{\r
- #if defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12\r
- if (@available (macOS 10.12, *))\r
- return NSOpenGLContextParameterSwapInterval;\r
- #endif\r
+ if (@available (macOS 10.12, *))\r
+ return NSOpenGLContextParameterSwapInterval;\r
\r
return NSOpenGLCPSwapInterval;\r
}\r
\r
ID: juce_osc\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE OSC classes\r
description: Open Sound Control implementation.\r
website: http://www.juce.com/juce\r
\r
ID: juce_product_unlocking\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE Online marketplace support\r
description: Classes for online product authentication\r
website: http://www.juce.com/juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+ Agreement and JUCE Privacy Policy.\r
+\r
+ End User License Agreement: www.juce.com/juce-7-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+package com.rmsl.juce;\r
+\r
+import com.android.billingclient.api.*;\r
+\r
+public class JuceBillingClient implements PurchasesUpdatedListener,\r
+ BillingClientStateListener {\r
+ private native void productDetailsQueryCallback(long host, java.util.List<ProductDetails> productDetails);\r
+ private native void purchasesListQueryCallback(long host, java.util.List<Purchase> purchases);\r
+ private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode);\r
+ private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode);\r
+\r
+ public JuceBillingClient(android.content.Context context, long hostToUse) {\r
+ host = hostToUse;\r
+\r
+ billingClient = BillingClient.newBuilder(context)\r
+ .enablePendingPurchases()\r
+ .setListener(this)\r
+ .build();\r
+\r
+ billingClient.startConnection(this);\r
+ }\r
+\r
+ public void endConnection() {\r
+ billingClient.endConnection();\r
+ }\r
+\r
+ public boolean isReady() {\r
+ return billingClient.isReady();\r
+ }\r
+\r
+ public boolean isBillingSupported() {\r
+ return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode()\r
+ == BillingClient.BillingResponseCode.OK;\r
+ }\r
+\r
+ public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) {\r
+ java.util.ArrayList<QueryProductDetailsParams.Product> productList = new java.util.ArrayList<>();\r
+\r
+ for (String product : productsToQuery)\r
+ productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build());\r
+\r
+ return QueryProductDetailsParams.newBuilder().setProductList(productList).build();\r
+ }\r
+\r
+ public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List<String> productTypes, java.util.List<ProductDetails> details) {\r
+ if (productTypes == null || productTypes.isEmpty()) {\r
+ productDetailsQueryCallback(host, details);\r
+ } else {\r
+ billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() {\r
+ @Override\r
+ public void onProductDetailsResponse(BillingResult billingResult, java.util.List<ProductDetails> newDetails) {\r
+ if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+ details.addAll(newDetails);\r
+ queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details);\r
+ } else {\r
+ queryProductDetailsImpl(productsToQuery, null, details);\r
+ }\r
+ }\r
+ });\r
+ }\r
+ }\r
+\r
+ public void queryProductDetails(final String[] productsToQuery) {\r
+ executeOnBillingClientConnection(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
+ queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList<ProductDetails>());\r
+ }\r
+ });\r
+ }\r
+\r
+ public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) {\r
+ executeOnBillingClientConnection(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ BillingResult r = billingClient.launchBillingFlow(activity, params);\r
+ }\r
+ });\r
+ }\r
+\r
+ private void queryPurchasesImpl(java.util.List<String> toCheck, java.util.ArrayList<Purchase> purchases) {\r
+ if (toCheck == null || toCheck.isEmpty()) {\r
+ purchasesListQueryCallback(host, purchases);\r
+ } else {\r
+ billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() {\r
+ @Override\r
+ public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List<Purchase> list) {\r
+ if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+ purchases.addAll(list);\r
+ queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases);\r
+ } else {\r
+ queryPurchasesImpl(null, purchases);\r
+ }\r
+ }\r
+ });\r
+ }\r
+ }\r
+\r
+ public void queryPurchases() {\r
+ executeOnBillingClientConnection(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
+ queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList<Purchase>());\r
+ }\r
+ });\r
+ }\r
+\r
+ public void consumePurchase(final String productIdentifier, final String purchaseToken) {\r
+ executeOnBillingClientConnection(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ ConsumeParams consumeParams = ConsumeParams.newBuilder()\r
+ .setPurchaseToken(purchaseToken)\r
+ .build();\r
+\r
+ billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {\r
+ @Override\r
+ public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {\r
+ purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode());\r
+ }\r
+ });\r
+ }\r
+ });\r
+ }\r
+\r
+ @Override\r
+ public void onPurchasesUpdated(BillingResult result, java.util.List<Purchase> purchases) {\r
+ int responseCode = result.getResponseCode();\r
+\r
+ if (purchases != null) {\r
+ for (Purchase purchase : purchases) {\r
+ handlePurchase(purchase, responseCode);\r
+ }\r
+ } else {\r
+ purchaseCompletedCallback(host, null, responseCode);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onBillingServiceDisconnected()\r
+ {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onBillingSetupFinished(BillingResult billingResult)\r
+ {\r
+\r
+ }\r
+\r
+ private void executeOnBillingClientConnection(Runnable runnable) {\r
+ if (billingClient.isReady()) {\r
+ runnable.run();\r
+ } else {\r
+ connectAndExecute(runnable);\r
+ }\r
+ }\r
+\r
+ private void connectAndExecute(final Runnable executeOnSuccess) {\r
+ billingClient.startConnection(new BillingClientStateListener() {\r
+ @Override\r
+ public void onBillingSetupFinished(BillingResult billingResponse) {\r
+ if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
+ if (executeOnSuccess != null) {\r
+ executeOnSuccess.run();\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onBillingServiceDisconnected() {\r
+ }\r
+ });\r
+ }\r
+\r
+ private void handlePurchase(final Purchase purchase, final int responseCode) {\r
+ purchaseCompletedCallback(host, purchase, responseCode);\r
+\r
+ if (responseCode == BillingClient.BillingResponseCode.OK\r
+ && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED\r
+ && !purchase.isAcknowledged()) {\r
+ executeOnBillingClientConnection(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();\r
+ billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {\r
+ @Override\r
+ public void onAcknowledgePurchaseResponse(BillingResult billingResult) {\r
+\r
+ }\r
+ });\r
+ }\r
+ });\r
+ }\r
+ }\r
+\r
+ private long host = 0;\r
+ private final BillingClient billingClient;\r
+}\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2022 - Raw Material Software Limited\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
- Agreement and JUCE Privacy Policy.\r
-\r
- End User License Agreement: www.juce.com/juce-7-licence\r
- Privacy Policy: www.juce.com/juce-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-package com.rmsl.juce;\r
-\r
-import com.android.billingclient.api.*;\r
-\r
-public class JuceBillingClient implements PurchasesUpdatedListener,\r
- BillingClientStateListener {\r
- private native void productDetailsQueryCallback(long host, java.util.List<ProductDetails> productDetails);\r
- private native void purchasesListQueryCallback(long host, java.util.List<Purchase> purchases);\r
- private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode);\r
- private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode);\r
-\r
- public JuceBillingClient(android.content.Context context, long hostToUse) {\r
- host = hostToUse;\r
-\r
- billingClient = BillingClient.newBuilder(context)\r
- .enablePendingPurchases()\r
- .setListener(this)\r
- .build();\r
-\r
- billingClient.startConnection(this);\r
- }\r
-\r
- public void endConnection() {\r
- billingClient.endConnection();\r
- }\r
-\r
- public boolean isReady() {\r
- return billingClient.isReady();\r
- }\r
-\r
- public boolean isBillingSupported() {\r
- return billingClient.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS).getResponseCode()\r
- == BillingClient.BillingResponseCode.OK;\r
- }\r
-\r
- public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) {\r
- java.util.ArrayList<QueryProductDetailsParams.Product> productList = new java.util.ArrayList<>();\r
-\r
- for (String product : productsToQuery)\r
- productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build());\r
-\r
- return QueryProductDetailsParams.newBuilder().setProductList(productList).build();\r
- }\r
-\r
- public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List<String> productTypes, java.util.List<ProductDetails> details) {\r
- if (productTypes == null || productTypes.isEmpty()) {\r
- productDetailsQueryCallback(host, details);\r
- } else {\r
- billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() {\r
- @Override\r
- public void onProductDetailsResponse(BillingResult billingResult, java.util.List<ProductDetails> newDetails) {\r
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
- details.addAll(newDetails);\r
- queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details);\r
- } else {\r
- queryProductDetailsImpl(productsToQuery, null, details);\r
- }\r
- }\r
- });\r
- }\r
- }\r
-\r
- public void queryProductDetails(final String[] productsToQuery) {\r
- executeOnBillingClientConnection(new Runnable() {\r
- @Override\r
- public void run() {\r
- String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
- queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList<ProductDetails>());\r
- }\r
- });\r
- }\r
-\r
- public void launchBillingFlow(final android.app.Activity activity, final BillingFlowParams params) {\r
- executeOnBillingClientConnection(new Runnable() {\r
- @Override\r
- public void run() {\r
- BillingResult r = billingClient.launchBillingFlow(activity, params);\r
- }\r
- });\r
- }\r
-\r
- private void queryPurchasesImpl(java.util.List<String> toCheck, java.util.ArrayList<Purchase> purchases) {\r
- if (toCheck == null || toCheck.isEmpty()) {\r
- purchasesListQueryCallback(host, purchases);\r
- } else {\r
- billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() {\r
- @Override\r
- public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List<Purchase> list) {\r
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
- purchases.addAll(list);\r
- queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases);\r
- } else {\r
- queryPurchasesImpl(null, purchases);\r
- }\r
- }\r
- });\r
- }\r
- }\r
-\r
- public void queryPurchases() {\r
- executeOnBillingClientConnection(new Runnable() {\r
- @Override\r
- public void run() {\r
- String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS};\r
- queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList<Purchase>());\r
- }\r
- });\r
- }\r
-\r
- public void consumePurchase(final String productIdentifier, final String purchaseToken) {\r
- executeOnBillingClientConnection(new Runnable() {\r
- @Override\r
- public void run() {\r
- ConsumeParams consumeParams = ConsumeParams.newBuilder()\r
- .setPurchaseToken(purchaseToken)\r
- .build();\r
-\r
- billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {\r
- @Override\r
- public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {\r
- purchaseConsumedCallback(host, productIdentifier, billingResult.getResponseCode());\r
- }\r
- });\r
- }\r
- });\r
- }\r
-\r
- @Override\r
- public void onPurchasesUpdated(BillingResult result, java.util.List<Purchase> purchases) {\r
- int responseCode = result.getResponseCode();\r
-\r
- if (purchases != null) {\r
- for (Purchase purchase : purchases) {\r
- handlePurchase(purchase, responseCode);\r
- }\r
- } else {\r
- purchaseCompletedCallback(host, null, responseCode);\r
- }\r
- }\r
-\r
- @Override\r
- public void onBillingServiceDisconnected()\r
- {\r
-\r
- }\r
-\r
- @Override\r
- public void onBillingSetupFinished(BillingResult billingResult)\r
- {\r
-\r
- }\r
-\r
- private void executeOnBillingClientConnection(Runnable runnable) {\r
- if (billingClient.isReady()) {\r
- runnable.run();\r
- } else {\r
- connectAndExecute(runnable);\r
- }\r
- }\r
-\r
- private void connectAndExecute(final Runnable executeOnSuccess) {\r
- billingClient.startConnection(new BillingClientStateListener() {\r
- @Override\r
- public void onBillingSetupFinished(BillingResult billingResponse) {\r
- if (billingResponse.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r
- if (executeOnSuccess != null) {\r
- executeOnSuccess.run();\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- public void onBillingServiceDisconnected() {\r
- }\r
- });\r
- }\r
-\r
- private void handlePurchase(final Purchase purchase, final int responseCode) {\r
- purchaseCompletedCallback(host, purchase, responseCode);\r
-\r
- if (responseCode == BillingClient.BillingResponseCode.OK\r
- && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED\r
- && !purchase.isAcknowledged()) {\r
- executeOnBillingClientConnection(new Runnable() {\r
- @Override\r
- public void run() {\r
- AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();\r
- billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {\r
- @Override\r
- public void onAcknowledgePurchaseResponse(BillingResult billingResult) {\r
-\r
- }\r
- });\r
- }\r
- });\r
- }\r
- }\r
-\r
- private long host = 0;\r
- private final BillingClient billingClient;\r
-}\r
return result;\r
}\r
\r
+//==============================================================================\r
+constexpr unsigned char juceBillingClientCompiled[]\r
+{\r
+ 0x1f, 0x8b, 0x08, 0x08, 0xa4, 0x53, 0xd0, 0x62, 0x04, 0x03, 0x63, 0x6c,\r
+ 0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x5a,\r
+ 0x0b, 0x70, 0x54, 0xe7, 0x75, 0x3e, 0xff, 0xdd, 0xab, 0xf7, 0x4a, 0x5a,\r
+ 0xad, 0x1e, 0x2b, 0xf4, 0x5c, 0xed, 0x0a, 0x10, 0x42, 0xef, 0x87, 0x11,\r
+ 0xac, 0x82, 0x25, 0xc4, 0xc3, 0x02, 0x81, 0x01, 0x2d, 0xd8, 0x20, 0xa7,\r
+ 0xf6, 0xb2, 0x7b, 0x41, 0x0b, 0xab, 0xbb, 0xab, 0xdd, 0x15, 0x2f, 0xc7,\r
+ 0x94, 0x60, 0xec, 0x90, 0xc6, 0x8e, 0x69, 0x70, 0x1a, 0xc7, 0x66, 0xa6,\r
+ 0xee, 0x14, 0x4f, 0xdd, 0x09, 0xd3, 0x26, 0xa9, 0x99, 0x71, 0x62, 0xa6,\r
+ 0xf5, 0xc4, 0x6e, 0xea, 0x66, 0x68, 0x1b, 0x27, 0xa4, 0xd3, 0xcc, 0xb8,\r
+ 0x0d, 0xd3, 0x24, 0xa5, 0x9d, 0xe0, 0x3e, 0x5c, 0x77, 0xc6, 0x6d, 0x3d,\r
+ 0x6d, 0xbf, 0xf3, 0xdf, 0xff, 0xae, 0xae, 0x84, 0x5d, 0xc9, 0xbe, 0xf0,\r
+ 0xed, 0x39, 0xff, 0x39, 0xe7, 0x3f, 0xff, 0xf9, 0xcf, 0xff, 0xdc, 0xab,\r
+ 0x8d, 0x19, 0x27, 0x8b, 0x7b, 0xfa, 0x07, 0xe9, 0x77, 0x66, 0x07, 0x1f,\r
+ 0x79, 0xed, 0x89, 0xde, 0x5f, 0xfe, 0xe1, 0xa5, 0x7d, 0xcf, 0x5e, 0xf9,\r
+ 0x97, 0xa1, 0xef, 0xad, 0x2e, 0xdb, 0xfd, 0x83, 0xd1, 0x3f, 0xb8, 0x9d,\r
+ 0x7c, 0xb3, 0x8d, 0x28, 0x45, 0x44, 0x27, 0xf7, 0x0f, 0x78, 0x41, 0xac,\r
+ 0x07, 0xb2, 0xcb, 0xe0, 0x58, 0xde, 0x0f, 0xdc, 0xd2, 0x88, 0x36, 0x81,\r
+ 0x5e, 0x75, 0x11, 0xd5, 0x82, 0xbe, 0x99, 0x4f, 0xf4, 0x59, 0xd0, 0xf3,\r
+ 0x05, 0x44, 0x25, 0xa0, 0x89, 0x62, 0xa2, 0x0f, 0x1a, 0x88, 0x6e, 0xa0,\r
+ 0x70, 0xb8, 0x86, 0x28, 0x0e, 0xcc, 0x00, 0xb3, 0xc0, 0x29, 0xe0, 0x31,\r
+ 0xe0, 0x71, 0xe0, 0x49, 0xe0, 0x8b, 0xc0, 0xd3, 0xc0, 0x4b, 0xc0, 0xcb,\r
+ 0xc0, 0x55, 0xe0, 0x5b, 0xc0, 0x35, 0xe0, 0xbb, 0xc0, 0x8f, 0x80, 0x77,\r
+ 0x81, 0x1e, 0x1f, 0xd1, 0x31, 0xe0, 0x9b, 0xc0, 0x6d, 0xa0, 0x06, 0x0d,\r
+ 0xef, 0x05, 0x9e, 0x00, 0x5e, 0x01, 0x7e, 0x05, 0xd4, 0xad, 0x20, 0x9a,\r
+ 0x04, 0x1e, 0x07, 0xde, 0x00, 0xde, 0x05, 0xda, 0xea, 0x88, 0x0e, 0x01,\r
+ 0x2f, 0x01, 0xff, 0x0a, 0xf4, 0xd7, 0x13, 0x99, 0xc0, 0x55, 0xe0, 0xef,\r
+ 0x81, 0x02, 0xc4, 0xd9, 0x01, 0xec, 0x01, 0x8e, 0x03, 0x2f, 0x00, 0xdf,\r
+ 0x03, 0x6e, 0x03, 0xee, 0x46, 0xd8, 0x03, 0x0f, 0x02, 0x8f, 0x02, 0x2f,\r
+ 0x02, 0xaf, 0x03, 0x3f, 0x03, 0xfe, 0x1d, 0x28, 0x6a, 0x22, 0x6a, 0x04,\r
+ 0x06, 0x80, 0x1d, 0xc0, 0xc3, 0xc0, 0x09, 0xe0, 0x69, 0xe0, 0xb7, 0x81,\r
+ 0x6f, 0x01, 0xaf, 0x00, 0xdf, 0x01, 0xfe, 0x04, 0x78, 0x03, 0x78, 0x0b,\r
+ 0xf8, 0x0b, 0xe0, 0x26, 0xf0, 0x53, 0xe0, 0x67, 0xc0, 0x3f, 0x00, 0xff,\r
+ 0x04, 0xbc, 0x0b, 0x68, 0xcd, 0x44, 0x3e, 0x20, 0x08, 0x74, 0x03, 0x21,\r
+ 0x60, 0x1b, 0x10, 0x06, 0xe2, 0x80, 0x09, 0x1c, 0x07, 0xce, 0x00, 0x4f,\r
+ 0x03, 0xcf, 0x02, 0xbf, 0x07, 0x5c, 0x03, 0xbe, 0x0f, 0xfc, 0x1d, 0xf0,\r
+ 0x2e, 0x50, 0xee, 0x27, 0xaa, 0x02, 0xda, 0x81, 0x61, 0x60, 0x17, 0xf0,\r
+ 0x30, 0x90, 0x04, 0x4e, 0x02, 0x67, 0x80, 0x27, 0x80, 0xaf, 0x02, 0xbf,\r
+ 0x0f, 0x7c, 0x1b, 0xf8, 0x3e, 0xf0, 0x57, 0xc0, 0x4f, 0x81, 0x3b, 0xc0,\r
+ 0x7b, 0xc0, 0xff, 0x00, 0x7a, 0x0b, 0xe2, 0x01, 0x46, 0x81, 0x03, 0x40,\r
+ 0x02, 0x78, 0x12, 0x78, 0x1e, 0x78, 0x05, 0x78, 0x1b, 0xb8, 0x03, 0xe4,\r
+ 0x07, 0x88, 0x02, 0xc0, 0x3a, 0x60, 0x0f, 0x70, 0x14, 0x38, 0x0d, 0x3c,\r
+ 0x03, 0xfc, 0x2e, 0xf0, 0x32, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x31, 0xf0,\r
+ 0x73, 0xe0, 0x3f, 0x80, 0xff, 0x06, 0xdc, 0x41, 0xa2, 0x6a, 0xa0, 0x1e,\r
+ 0x68, 0x07, 0xfa, 0x80, 0x0d, 0xc0, 0x7d, 0xc0, 0x3e, 0xe0, 0x18, 0x70,\r
+ 0x02, 0xf8, 0x32, 0xf0, 0x22, 0x70, 0x0d, 0x78, 0x03, 0xf8, 0x6b, 0xe0,\r
+ 0x97, 0xc0, 0x7b, 0xc0, 0x7f, 0x02, 0x98, 0x8a, 0x84, 0x69, 0x48, 0xe5,\r
+ 0x80, 0x07, 0xa8, 0x00, 0x78, 0x22, 0x57, 0x02, 0x55, 0x40, 0x35, 0x80,\r
+ 0xe9, 0x44, 0x98, 0x42, 0x72, 0xee, 0x62, 0x8a, 0x10, 0xa6, 0x05, 0x61,\r
+ 0x2a, 0x10, 0x86, 0x94, 0x30, 0x04, 0x84, 0xf4, 0x91, 0x1f, 0x40, 0x97,\r
+ 0x08, 0xa1, 0x11, 0xdc, 0x52, 0x2b, 0xb0, 0x12, 0x58, 0x05, 0xac, 0x06,\r
+ 0xb0, 0x24, 0x68, 0x0d, 0xd0, 0x0e, 0xac, 0x05, 0x3a, 0x80, 0x4e, 0xa0,\r
+ 0x0b, 0xe8, 0x06, 0x7a, 0x80, 0x5e, 0xa0, 0x0f, 0xe0, 0x35, 0x33, 0x00,\r
+ 0x0c, 0x02, 0xf7, 0x00, 0xeb, 0x80, 0x21, 0x60, 0x03, 0x10, 0x02, 0x86,\r
+ 0x81, 0xcf, 0x00, 0xf7, 0x02, 0xe3, 0xc0, 0x0e, 0x60, 0x02, 0xe0, 0xbe,\r
+ 0xd8, 0x4f, 0x21, 0x18, 0x01, 0xb8, 0xd1, 0x01, 0x2c, 0x2f, 0xd2, 0x95,\r
+ 0xa2, 0x54, 0xf1, 0x55, 0x4a, 0x9e, 0xa7, 0xe4, 0x6c, 0xc3, 0x79, 0xe0,\r
+ 0x87, 0x6d, 0x98, 0x6f, 0x80, 0x8d, 0xcd, 0xb7, 0x2a, 0x7b, 0xf6, 0xcb,\r
+ 0x0f, 0xcb, 0x99, 0x67, 0xff, 0x65, 0xa0, 0x58, 0xba, 0xd4, 0xa1, 0xec,\r
+ 0x99, 0xb7, 0xfd, 0xbb, 0xc1, 0xf3, 0xc3, 0xf6, 0xcc, 0xdb, 0x72, 0x2e,\r
+ 0xf3, 0xc3, 0xed, 0x72, 0xae, 0xf9, 0x61, 0x19, 0xf3, 0x03, 0xaa, 0x2d,\r
+ 0xce, 0x3f, 0x3f, 0x2c, 0x67, 0xde, 0xae, 0x0b, 0xb5, 0x7c, 0xb8, 0x2e,\r
+ 0x8f, 0x0d, 0x3f, 0x1c, 0x03, 0xf3, 0xc3, 0xaa, 0x2e, 0x8f, 0x17, 0x3f,\r
+ 0x5c, 0x97, 0x79, 0xbb, 0x2e, 0x96, 0xbd, 0x7c, 0xb8, 0x2e, 0x8f, 0x0b,\r
+ 0x3f, 0x1c, 0x2f, 0xf3, 0x9b, 0x55, 0x5d, 0x1e, 0x27, 0x7e, 0xd8, 0xa6,\r
+ 0x53, 0x72, 0x56, 0xec, 0x3c, 0x56, 0x13, 0xb0, 0x61, 0x9f, 0xcc, 0x87,\r
+ 0xc1, 0xf3, 0x18, 0xf0, 0xf8, 0xf1, 0x33, 0x0a, 0x30, 0xff, 0x10, 0xe4,\r
+ 0x36, 0x3f, 0x0d, 0x7e, 0x44, 0xc9, 0xb3, 0xe0, 0xb7, 0x2a, 0x9e, 0x73,\r
+ 0xb5, 0x59, 0xf1, 0x9f, 0x73, 0xc8, 0xcf, 0x83, 0xdf, 0xa4, 0xe4, 0xef,\r
+ 0xa3, 0xd3, 0x36, 0xff, 0x94, 0xc3, 0xe6, 0x59, 0x07, 0x7f, 0xd9, 0xc1,\r
+ 0x5f, 0x01, 0x3f, 0xa6, 0xea, 0x5e, 0x75, 0xc8, 0x5f, 0x71, 0xf0, 0xd7,\r
+ 0xc1, 0xdb, 0x3e, 0xdf, 0x74, 0xf0, 0x37, 0x1c, 0xbc, 0x1b, 0xfc, 0x16,\r
+ 0xe5, 0xe7, 0x26, 0xf8, 0x6d, 0x8a, 0xbf, 0x05, 0xde, 0x8e, 0xff, 0x8e,\r
+ 0x83, 0x7f, 0xdf, 0x61, 0xf3, 0xa1, 0x83, 0x2f, 0xc4, 0x80, 0xd8, 0x75,\r
+ 0xab, 0xc0, 0xdf, 0xa7, 0xfc, 0xf8, 0xc1, 0xdb, 0x7e, 0x3a, 0xc0, 0xdb,\r
+ 0xf1, 0xbc, 0x83, 0xfe, 0xda, 0xf2, 0x01, 0x87, 0xcd, 0xb0, 0xc3, 0x66,\r
+ 0x33, 0x78, 0xdb, 0xe7, 0x04, 0x78, 0x9e, 0xff, 0xbc, 0x76, 0xf8, 0xd9,\r
+ 0x0e, 0x30, 0xff, 0x20, 0xe4, 0x36, 0xff, 0x08, 0xf8, 0x15, 0x58, 0x91,\r
+ 0x4f, 0x43, 0xbe, 0x02, 0xa3, 0x76, 0x51, 0xd1, 0x67, 0x25, 0xed, 0xa3,\r
+ 0xaf, 0x82, 0xd6, 0x29, 0x7d, 0x1d, 0x56, 0x1f, 0x97, 0xeb, 0x55, 0xb9,\r
+ 0x9e, 0x34, 0x7a, 0x46, 0x96, 0x8b, 0xe9, 0x2b, 0xa0, 0x0d, 0x4a, 0xde,\r
+ 0x80, 0x55, 0xfc, 0x9c, 0x2c, 0x77, 0xd1, 0xd7, 0x41, 0x1b, 0x95, 0xbc,\r
+ 0x09, 0x3b, 0xc1, 0x97, 0x51, 0x6e, 0x56, 0xe5, 0x66, 0xac, 0xf8, 0x4b,\r
+ 0xb2, 0xbc, 0x86, 0xbe, 0x06, 0xea, 0x57, 0x72, 0x3f, 0x76, 0x83, 0xdf,\r
+ 0x44, 0xb9, 0x05, 0xbb, 0x05, 0xdb, 0x07, 0x94, 0x3c, 0x80, 0x1d, 0xe8,\r
+ 0xb7, 0x50, 0x0e, 0x62, 0x65, 0xed, 0x97, 0x54, 0x90, 0x01, 0xaa, 0xe3,\r
+ 0xdf, 0x03, 0x92, 0xba, 0xe8, 0x0b, 0xa0, 0x79, 0x88, 0x2b, 0x09, 0x5a,\r
+ 0x00, 0x3b, 0x96, 0x17, 0x40, 0x32, 0x25, 0x69, 0x01, 0x3d, 0x0e, 0x5a,\r
+ 0x88, 0x9d, 0x67, 0xaf, 0xa4, 0xed, 0x74, 0x40, 0xd2, 0x66, 0x7a, 0x48,\r
+ 0xd2, 0x12, 0x3a, 0x2a, 0xe9, 0xbd, 0x74, 0x4c, 0xd2, 0x62, 0x9a, 0x91,\r
+ 0x34, 0x5f, 0xfa, 0x2b, 0xc4, 0xae, 0xf4, 0x98, 0x2c, 0x77, 0xd2, 0x59,\r
+ 0x49, 0x57, 0xd1, 0x17, 0x41, 0x79, 0x7d, 0x1c, 0x02, 0xdc, 0x58, 0x65,\r
+ 0xdc, 0x9e, 0x1b, 0x2b, 0x80, 0xe3, 0x28, 0x05, 0xc7, 0x71, 0x78, 0x80,\r
+ 0x47, 0x24, 0xad, 0xa7, 0x88, 0xa4, 0xf7, 0xd2, 0x11, 0xd0, 0x4a, 0xac,\r
+ 0x5a, 0xb6, 0xaf, 0x84, 0xc5, 0x13, 0xa0, 0x55, 0xe0, 0xb8, 0x5c, 0x85,\r
+ 0x1d, 0xf6, 0xbc, 0xa2, 0x4f, 0x82, 0x56, 0x63, 0xd7, 0x65, 0x3f, 0x35,\r
+ 0xd8, 0x85, 0x99, 0xfa, 0xb0, 0xd3, 0xb2, 0x9d, 0x0f, 0xff, 0x58, 0x5f,\r
+ 0x0b, 0x0d, 0xcb, 0x57, 0x60, 0x17, 0x74, 0x49, 0xba, 0x86, 0xe6, 0x40,\r
+ 0xeb, 0x68, 0xbd, 0x2c, 0xd7, 0x21, 0xe3, 0xe7, 0x50, 0xae, 0xc7, 0xf8,\r
+ 0xb1, 0xbe, 0x5e, 0x95, 0x1b, 0xb0, 0x7b, 0x72, 0xb9, 0x01, 0xe3, 0x70,\r
+ 0x02, 0xb4, 0x11, 0xb3, 0x83, 0xcb, 0x8d, 0x4a, 0xdf, 0x84, 0xf9, 0xc0,\r
+ 0xe5, 0x26, 0x8c, 0x47, 0x16, 0xb4, 0x19, 0x3b, 0x2e, 0x97, 0x9b, 0x95,\r
+ 0xde, 0x8f, 0x5d, 0x98, 0xcb, 0x7e, 0x94, 0xd3, 0x92, 0xae, 0xa6, 0x0c,\r
+ 0x68, 0x0b, 0x56, 0x39, 0xcb, 0x5b, 0xb0, 0x6b, 0xcc, 0x82, 0x06, 0xb0,\r
+ 0x63, 0x73, 0x39, 0xa0, 0xea, 0x05, 0xb1, 0xfb, 0x73, 0x39, 0x48, 0x45,\r
+ 0xb4, 0x53, 0xd2, 0x75, 0xb4, 0x4b, 0x52, 0x41, 0xf7, 0x4b, 0xda, 0x4b,\r
+ 0xbb, 0x25, 0xdd, 0x40, 0x0f, 0x4a, 0x1a, 0xa2, 0x83, 0x92, 0x5a, 0xe3,\r
+ 0x14, 0xc4, 0x4e, 0xff, 0x59, 0x59, 0xae, 0xa6, 0x87, 0x25, 0x5d, 0x4b,\r
+ 0x51, 0x49, 0xef, 0xa5, 0x69, 0x45, 0x79, 0xfc, 0x82, 0xf8, 0xc7, 0xe3,\r
+ 0x17, 0x54, 0xf1, 0x05, 0x11, 0x0f, 0xc7, 0x17, 0x44, 0x7f, 0x8f, 0x4b,\r
+ 0x1a, 0xa0, 0x93, 0x92, 0xfa, 0xe9, 0x94, 0xa4, 0x2d, 0x74, 0x5a, 0xc9,\r
+ 0x1f, 0x95, 0xf4, 0x33, 0xf4, 0x39, 0x49, 0x37, 0xd2, 0x19, 0x49, 0x9b,\r
+ 0xe9, 0xd7, 0x25, 0x1d, 0xa6, 0xcf, 0x83, 0xae, 0x86, 0x5f, 0xee, 0x47,\r
+ 0x9b, 0xea, 0x57, 0xbb, 0x2a, 0xb7, 0xd3, 0x08, 0x4d, 0x42, 0xde, 0x8e,\r
+ 0x5d, 0x2e, 0x0c, 0xba, 0x16, 0x19, 0xdc, 0x07, 0xda, 0x89, 0xdd, 0x30,\r
+ 0x26, 0xe9, 0x0a, 0x79, 0xf7, 0xeb, 0x52, 0xfa, 0x2e, 0x8c, 0xd4, 0xaf,\r
+ 0x41, 0xde, 0x05, 0x7d, 0x5c, 0xd2, 0x06, 0x4a, 0x48, 0x4a, 0x74, 0x41,\r
+ 0xd2, 0x46, 0xfa, 0x0d, 0x50, 0x3e, 0x5b, 0xf9, 0x59, 0x0d, 0xdc, 0xc4,\r
+ 0x5e, 0x50, 0x04, 0x5a, 0x8b, 0xc2, 0xaa, 0x95, 0x2c, 0xb5, 0xce, 0x5d,\r
+ 0xa6, 0xac, 0xe7, 0xbd, 0x82, 0xf5, 0x3d, 0x28, 0x8c, 0x28, 0x3d, 0x9f,\r
+ 0xc9, 0xfc, 0x38, 0xf5, 0x23, 0x28, 0x84, 0x95, 0x1e, 0x57, 0x34, 0xf9,\r
+ 0xb0, 0xfe, 0x17, 0xaa, 0xfe, 0x6e, 0x14, 0x8e, 0x29, 0x3d, 0x9f, 0xe7,\r
+ 0xfc, 0x38, 0xeb, 0x4f, 0xa3, 0x70, 0x4e, 0xe9, 0xf9, 0xac, 0xe7, 0x87,\r
+ 0xf5, 0x77, 0x54, 0xfd, 0x93, 0x28, 0x5c, 0x52, 0xfa, 0x66, 0xa9, 0x5d,\r
+ 0x58, 0xff, 0x02, 0xf4, 0x57, 0x94, 0xde, 0xef, 0xd0, 0xf3, 0xde, 0xce,\r
+ 0xf1, 0x3f, 0x07, 0xfd, 0x6b, 0x4a, 0xdf, 0xe2, 0xd0, 0x7f, 0xa8, 0xf4,\r
+ 0x2f, 0x43, 0xff, 0x63, 0xa5, 0x0f, 0x38, 0xf4, 0x76, 0xff, 0x5f, 0x85,\r
+ 0xfe, 0x17, 0x4a, 0x1f, 0x84, 0x5e, 0x00, 0x10, 0x91, 0x5e, 0x6d, 0xf9,\r
+ 0x7f, 0x0b, 0x85, 0x0f, 0x94, 0x3e, 0x0f, 0xfb, 0x04, 0xeb, 0x7f, 0x50,\r
+ 0x69, 0x9d, 0x67, 0x53, 0x28, 0x4c, 0x69, 0x82, 0xa6, 0x5c, 0x2e, 0x9a,\r
+ 0xd2, 0x35, 0x4a, 0x79, 0x78, 0x76, 0x96, 0xe1, 0x1e, 0xe1, 0x92, 0xf7,\r
+ 0x85, 0x1f, 0xc1, 0x6e, 0x2d, 0x24, 0xa6, 0xc7, 0x83, 0x72, 0xb1, 0xbe,\r
+ 0x5e, 0x6f, 0xa0, 0xf0, 0x80, 0xa0, 0xb4, 0xff, 0x01, 0x8c, 0x7b, 0x78,\r
+ 0x00, 0x99, 0x1d, 0x74, 0x51, 0xb8, 0x47, 0x23, 0x6f, 0x45, 0xda, 0xc3,\r
+ 0x3b, 0x50, 0xb1, 0x96, 0xee, 0x79, 0x88, 0x3c, 0x9a, 0x9b, 0xc2, 0xbd,\r
+ 0x82, 0xcc, 0x91, 0x09, 0x0a, 0x7b, 0xda, 0x4a, 0x6c, 0x4b, 0xaf, 0x43,\r
+ 0x5a, 0x06, 0x6b, 0x17, 0xfe, 0x71, 0x3c, 0x7f, 0x8b, 0x76, 0xf8, 0x2e,\r
+ 0x31, 0x25, 0x74, 0xc4, 0x93, 0x97, 0x8b, 0x83, 0xa3, 0xd5, 0x21, 0xff,\r
+ 0x39, 0xf4, 0x9c, 0x7b, 0xaf, 0x3f, 0x88, 0x15, 0xee, 0x15, 0x75, 0xda,\r
+ 0x61, 0xda, 0xa9, 0x91, 0xf0, 0x56, 0xd4, 0x69, 0x5f, 0x92, 0x5c, 0x78,\r
+ 0x54, 0xa7, 0xf0, 0xa6, 0x3c, 0x9a, 0xf5, 0x84, 0x61, 0xe7, 0xa6, 0x80,\r
+ 0xab, 0x1d, 0x5e, 0xf6, 0xc0, 0x3f, 0xc7, 0xd0, 0xd2, 0x53, 0x06, 0x3f,\r
+ 0xba, 0x6c, 0xeb, 0x36, 0x7c, 0x15, 0xcb, 0xb6, 0xf2, 0xd1, 0x56, 0x01,\r
+ 0xfa, 0x5e, 0x98, 0x6b, 0x8f, 0x2d, 0x78, 0xbe, 0xff, 0x33, 0x6c, 0x38,\r
+ 0xbe, 0x70, 0x4f, 0x3e, 0x3c, 0xae, 0x93, 0x1e, 0xc3, 0xbd, 0x05, 0x14,\r
+ 0xee, 0x2b, 0x24, 0xb3, 0xa7, 0x04, 0xfd, 0x9b, 0xf7, 0xf7, 0x5e, 0xce,\r
+ 0x5f, 0x11, 0xfc, 0x15, 0xc3, 0x5f, 0x49, 0xce, 0x5f, 0x9e, 0xec, 0x21,\r
+ 0xee, 0x99, 0xb0, 0xe1, 0x31, 0xe1, 0x3c, 0xba, 0xa8, 0xd8, 0xb5, 0xde,\r
+ 0x55, 0x47, 0xe1, 0x60, 0x31, 0x99, 0xfe, 0x49, 0x9c, 0xd7, 0xe1, 0x60,\r
+ 0x11, 0x85, 0x5b, 0x4b, 0xc8, 0xeb, 0xe1, 0x1c, 0x22, 0xcf, 0x82, 0x73,\r
+ 0xa8, 0x0b, 0xb7, 0x1e, 0xf6, 0x17, 0xd3, 0x6c, 0xcf, 0x10, 0x6c, 0xda,\r
+ 0x8a, 0xd8, 0xca, 0xeb, 0x90, 0x70, 0x7c, 0x1a, 0xfe, 0x71, 0xfe, 0x74,\r
+ 0xcc, 0x95, 0x7c, 0xd0, 0x29, 0xe1, 0xce, 0xb5, 0x6d, 0xf7, 0xa5, 0x08,\r
+ 0x3a, 0x9e, 0xf7, 0xff, 0x4f, 0xee, 0x7a, 0xdd, 0xf3, 0x79, 0xd3, 0xac,\r
+ 0xbc, 0x69, 0xb2, 0x5d, 0x81, 0x7e, 0xda, 0x6d, 0x94, 0xe5, 0xda, 0x28,\r
+ 0xcd, 0xb5, 0xc1, 0xf3, 0x24, 0x0f, 0xbe, 0xab, 0xa0, 0xe3, 0x7b, 0x55,\r
+ 0x78, 0xb0, 0x94, 0xc2, 0xfb, 0xca, 0x90, 0x37, 0x50, 0x64, 0x70, 0xd6,\r
+ 0xb3, 0x1e, 0xd2, 0x12, 0xe4, 0x0d, 0xe5, 0x40, 0x79, 0x6e, 0x1e, 0xcd,\r
+ 0x86, 0x37, 0x50, 0x5e, 0xcb, 0x7c, 0x0e, 0xeb, 0x51, 0xdf, 0x1a, 0x93,\r
+ 0x32, 0xe4, 0xd0, 0x83, 0x1c, 0x96, 0xe7, 0xda, 0xb0, 0xfb, 0x11, 0x84,\r
+ 0x0d, 0xaf, 0xcf, 0x59, 0x9c, 0x21, 0x3c, 0xc2, 0xe1, 0x5e, 0x0f, 0xf2,\r
+ 0xe7, 0xc5, 0xc9, 0xe2, 0x86, 0x5f, 0xbe, 0xb5, 0xb3, 0x8c, 0xdb, 0x5c,\r
+ 0x87, 0x9c, 0xb8, 0x45, 0x40, 0x6b, 0xa2, 0x94, 0x7f, 0x2d, 0xe6, 0x8b,\r
+ 0xd9, 0x53, 0x40, 0xdc, 0x93, 0xf9, 0xf9, 0xb6, 0x16, 0xbe, 0xac, 0xf9,\r
+ 0x56, 0x81, 0xf6, 0xbc, 0xb9, 0xb6, 0x84, 0xcc, 0x26, 0x0c, 0xf1, 0x70,\r
+ 0x5e, 0x9d, 0x39, 0xee, 0x43, 0x1d, 0x2e, 0xf3, 0x18, 0x0a, 0x8c, 0xd1,\r
+ 0x7a, 0x81, 0x51, 0x13, 0x5e, 0x1a, 0x12, 0x79, 0x94, 0xf6, 0xec, 0x86,\r
+ 0x6c, 0x3e, 0x57, 0x1b, 0x60, 0x6b, 0x8d, 0x47, 0x65, 0xce, 0x37, 0xe7,\r
+ 0xd1, 0x7e, 0x6c, 0xdf, 0xf6, 0xfc, 0x1f, 0xc9, 0xc5, 0x53, 0x85, 0x78,\r
+ 0xaa, 0x73, 0x75, 0xec, 0xbe, 0x6f, 0x83, 0xbe, 0x05, 0x95, 0x67, 0xa5,\r
+ 0x0f, 0xee, 0x67, 0x35, 0xe2, 0xa8, 0x46, 0x9b, 0x6e, 0x61, 0xfa, 0x85,\r
+ 0xca, 0x01, 0x7b, 0x67, 0x5d, 0x95, 0x23, 0x07, 0x2d, 0xc8, 0x41, 0x9f,\r
+ 0xcc, 0x41, 0x7e, 0x2e, 0x07, 0x42, 0x7a, 0xb9, 0x1f, 0x3e, 0xbd, 0xa8,\r
+ 0x11, 0xc6, 0x65, 0xac, 0x4e, 0x3c, 0x85, 0x5c, 0x16, 0x29, 0x3f, 0x7c,\r
+ 0x9a, 0x17, 0xe3, 0x64, 0xd5, 0x31, 0x23, 0xdb, 0x90, 0x9d, 0x72, 0xd8,\r
+ 0x5b, 0x99, 0x99, 0x44, 0x9d, 0x02, 0xae, 0xe3, 0xa9, 0x41, 0xfb, 0x3c,\r
+ 0x62, 0xc5, 0xf2, 0x7b, 0x93, 0x9d, 0xb7, 0x07, 0xa0, 0xe7, 0xf5, 0x13,\r
+ 0xc6, 0x79, 0xcd, 0x23, 0x52, 0x88, 0x12, 0xf7, 0xfa, 0x21, 0xc8, 0xbb,\r
+ 0x40, 0x03, 0x38, 0x31, 0x78, 0x55, 0xa2, 0x37, 0x11, 0xaf, 0x36, 0xe8,\r
+ 0xad, 0xa3, 0xad, 0xae, 0x7c, 0x6d, 0x56, 0xce, 0x4f, 0xb7, 0x6e, 0xfa,\r
+ 0xeb, 0x70, 0xde, 0xba, 0x5d, 0xa6, 0xbf, 0x1e, 0xa7, 0x18, 0xa8, 0x67,\r
+ 0x05, 0xea, 0x73, 0x79, 0x2f, 0xce, 0xed, 0xbf, 0xd1, 0x34, 0xd1, 0x76,\r
+ 0x7b, 0x56, 0xce, 0x01, 0x77, 0xbe, 0xe9, 0xaf, 0x45, 0x86, 0x41, 0x3d,\r
+ 0x3e, 0x49, 0x2b, 0xf2, 0xad, 0x9d, 0x84, 0xc8, 0x8e, 0x61, 0xd2, 0xef,\r
+ 0x43, 0x7f, 0xac, 0xbb, 0x13, 0xc7, 0x70, 0x04, 0x31, 0xf0, 0xf9, 0x60,\r
+ 0xed, 0x71, 0x07, 0x35, 0x1f, 0xb2, 0xe4, 0xb6, 0x32, 0xe8, 0xe1, 0x3c,\r
+ 0x73, 0x26, 0x79, 0xbf, 0x01, 0xf5, 0xb0, 0x2f, 0xb7, 0x98, 0x12, 0xe8,\r
+ 0xa5, 0xbf, 0x1c, 0xbc, 0x3d, 0x77, 0xb8, 0x6f, 0x19, 0xf8, 0xe1, 0x3d,\r
+ 0x29, 0xd5, 0xb3, 0x4b, 0xee, 0x03, 0xbc, 0xa7, 0xf2, 0x1a, 0x38, 0x6d,\r
+ 0xcb, 0xc3, 0xe3, 0xe4, 0xe9, 0xe3, 0xb9, 0xad, 0xc9, 0x5c, 0x9c, 0x83,\r
+ 0x9c, 0xef, 0x4f, 0x9c, 0xe7, 0x80, 0xf0, 0xa3, 0x5e, 0x37, 0xb5, 0xa0,\r
+ 0x4f, 0xe5, 0x88, 0x8e, 0xfd, 0xea, 0xb0, 0x62, 0x7f, 0x17, 0x60, 0xc7,\r
+ 0xe7, 0x01, 0xdf, 0x21, 0x52, 0x23, 0x9d, 0xe4, 0x09, 0xa6, 0xfc, 0x1b,\r
+ 0x55, 0xdb, 0x76, 0xfe, 0x9f, 0x81, 0x0d, 0xcf, 0x2b, 0x2b, 0xff, 0x3c,\r
+ 0x83, 0xcb, 0x64, 0x86, 0xb9, 0x7f, 0x97, 0xa0, 0xe3, 0xfe, 0x3a, 0xc7,\r
+ 0x66, 0x08, 0xd6, 0x3c, 0x37, 0x35, 0x6a, 0xd3, 0x53, 0xfe, 0x10, 0xe6,\r
+ 0x50, 0x19, 0x62, 0xb5, 0xd6, 0xec, 0x0b, 0xb0, 0xe7, 0xf5, 0xc4, 0x79,\r
+ 0x4a, 0x85, 0xef, 0x23, 0xad, 0x77, 0xbd, 0xee, 0xc3, 0xa8, 0x56, 0x41,\r
+ 0x5f, 0xac, 0x7b, 0x3d, 0xfd, 0x3a, 0xd6, 0x17, 0xc6, 0x99, 0x4b, 0xeb,\r
+ 0xf5, 0x62, 0x0a, 0xe8, 0x01, 0xc4, 0x3e, 0x40, 0xad, 0x2e, 0x8e, 0x6b,\r
+ 0xd3, 0x82, 0xd8, 0x5f, 0xca, 0xc5, 0x5e, 0x8f, 0xd8, 0x57, 0xa2, 0xff,\r
+ 0xf3, 0xb1, 0xdb, 0x73, 0x03, 0x4d, 0xa1, 0x37, 0xf3, 0x6b, 0x8a, 0xcb,\r
+ 0xfc, 0xd8, 0x32, 0x3b, 0xae, 0x6f, 0xc0, 0x17, 0xcf, 0x75, 0x7b, 0xaf,\r
+ 0x1c, 0xd2, 0x6b, 0xd0, 0x87, 0x83, 0xc8, 0x91, 0x5b, 0x4f, 0x7b, 0xf6,\r
+ 0x81, 0x16, 0xe3, 0x16, 0xe8, 0x85, 0x6c, 0x3f, 0xcb, 0x90, 0x2d, 0x0f,\r
+ 0xe2, 0x1a, 0x21, 0xcd, 0xd5, 0xf6, 0x6f, 0xdc, 0x17, 0xaf, 0x9e, 0x9a,\r
+ 0x44, 0x6f, 0x46, 0xad, 0x31, 0xb3, 0xc6, 0xe0, 0x5a, 0x2e, 0xbe, 0x3a,\r
+ 0xd8, 0x06, 0x31, 0x6e, 0xf3, 0xf1, 0x15, 0xc0, 0x0b, 0x8f, 0xdf, 0x77,\r
+ 0x61, 0xc3, 0xc7, 0xe4, 0x50, 0x1e, 0xee, 0x7a, 0x9e, 0x03, 0x90, 0x71,\r
+ 0x3b, 0x2e, 0x6a, 0xf3, 0x85, 0x7b, 0x6a, 0x70, 0xe6, 0xa4, 0xfd, 0x0f,\r
+ 0xe2, 0x9e, 0xea, 0x16, 0xcd, 0x62, 0x0d, 0x76, 0x94, 0x7b, 0x69, 0x4c,\r
+ 0xf0, 0x1e, 0x83, 0x7b, 0xce, 0xbe, 0x16, 0xea, 0xdb, 0x6a, 0x62, 0xc7,\r
+ 0xf3, 0x68, 0x6d, 0xf9, 0x93, 0x03, 0xc8, 0xe6, 0xc8, 0x36, 0x1a, 0x33,\r
+ 0xb8, 0x7d, 0x1e, 0x37, 0x1e, 0x9b, 0x3f, 0xcd, 0xb5, 0xdf, 0x88, 0xf5,\r
+ 0xb8, 0x86, 0x23, 0xce, 0x8d, 0xad, 0x7d, 0xd6, 0xfe, 0x39, 0x6c, 0x3a,\r
+ 0xb9, 0x7d, 0x7d, 0xb5, 0x6c, 0xdf, 0xea, 0x27, 0xda, 0x6f, 0xe6, 0xf6,\r
+ 0x67, 0xc9, 0x0f, 0x9d, 0x5b, 0x78, 0x35, 0x8e, 0xa3, 0x95, 0xdc, 0x5a,\r
+ 0xb3, 0x86, 0x38, 0xfc, 0xcd, 0xc8, 0x15, 0xcf, 0xd8, 0x26, 0xb4, 0xc4,\r
+ 0xf1, 0x34, 0xa0, 0xf5, 0xd5, 0xd4, 0xb7, 0xc5, 0xc4, 0x89, 0x27, 0xe3,\r
+ 0xc1, 0x6b, 0xb0, 0xd4, 0xc8, 0x76, 0x72, 0xed, 0x29, 0xa3, 0xed, 0x3c,\r
+ 0xcd, 0x30, 0x6e, 0x38, 0x39, 0xa9, 0x2c, 0x7e, 0x50, 0x54, 0x7b, 0xe8,\r
+ 0x00, 0xb3, 0xb8, 0x6a, 0xbe, 0x4d, 0x51, 0x9e, 0xdb, 0x65, 0x74, 0x18,\r
+ 0x48, 0x5a, 0x6c, 0x5a, 0x99, 0x55, 0x7a, 0xe8, 0x0c, 0x2f, 0x81, 0x73,\r
+ 0x02, 0x66, 0xcf, 0x08, 0x66, 0xbf, 0x22, 0x64, 0xbd, 0x0b, 0xc2, 0xb2,\r
+ 0xfc, 0x12, 0x64, 0xf1, 0x1d, 0x13, 0xf4, 0x9a, 0x25, 0xfe, 0x63, 0xb6,\r
+ 0x89, 0xef, 0xa0, 0x9f, 0x48, 0xdb, 0xb7, 0x2d, 0xe1, 0x4d, 0xc8, 0x84,\r
+ 0xb7, 0x1c, 0xdb, 0x4a, 0x19, 0x2e, 0xd9, 0x65, 0xd4, 0xc4, 0x7e, 0x36,\r
+ 0xb2, 0x9b, 0xa9, 0xb8, 0xa8, 0xf1, 0xd0, 0x4a, 0x66, 0x87, 0xbb, 0x76,\r
+ 0xec, 0xd8, 0x71, 0x94, 0x9a, 0x2c, 0xb7, 0x4d, 0x2a, 0xde, 0xd7, 0xa4,\r
+ 0x9f, 0x0b, 0x96, 0x9f, 0x5e, 0x54, 0xfb, 0x23, 0x16, 0x7c, 0x61, 0x82,\r
+ 0x6e, 0x48, 0xd1, 0xe9, 0x93, 0x71, 0x8a, 0xca, 0x78, 0x5e, 0x90, 0xe5,\r
+ 0x63, 0xff, 0xbb, 0x93, 0x0e, 0xb0, 0xf7, 0x6d, 0xec, 0xa6, 0xe3, 0xb4,\r
+ 0xa8, 0x71, 0xe3, 0x72, 0x5b, 0x46, 0x09, 0xd8, 0xa0, 0xd4, 0x84, 0x97,\r
+ 0x10, 0x3c, 0xe7, 0xca, 0x01, 0xa6, 0x6d, 0x8a, 0xf2, 0x7e, 0xc5, 0x65,\r
+ 0x1e, 0x37, 0xa6, 0xbc, 0x16, 0x99, 0xf2, 0x7a, 0x43, 0x4d, 0xcc, 0xb8,\r
+ 0x22, 0x59, 0x0e, 0x2a, 0xf9, 0x1a, 0x45, 0xb9, 0x11, 0xb6, 0xe3, 0xbd,\r
+ 0x94, 0xed, 0x34, 0xcc, 0x1b, 0x2e, 0x77, 0xa9, 0x72, 0x1f, 0xee, 0xe2,\r
+ 0x5c, 0xe6, 0x87, 0xf5, 0xfc, 0x70, 0xb9, 0x17, 0xb0, 0xea, 0xf2, 0xaa,\r
+ 0xb5, 0x79, 0xf6, 0x6a, 0xd9, 0x09, 0x78, 0x60, 0x7b, 0xde, 0x8b, 0x98,\r
+ 0xe6, 0x21, 0x12, 0xae, 0xc7, 0x7b, 0x09, 0x97, 0x4b, 0xe0, 0xd7, 0xa2,\r
+ 0x96, 0x5d, 0x29, 0x22, 0xe7, 0x32, 0x7b, 0x63, 0xca, 0xdf, 0xa5, 0x98,\r
+ 0xd6, 0x62, 0x27, 0xe6, 0x7a, 0x7c, 0x37, 0x65, 0x1a, 0x00, 0x38, 0xb1,\r
+ 0x41, 0x94, 0xb8, 0x35, 0x8e, 0x21, 0x08, 0x4b, 0xde, 0xcd, 0xd9, 0x1e,\r
+ 0xab, 0x43, 0xd1, 0x36, 0xa5, 0x5b, 0xe3, 0xb0, 0x6b, 0x97, 0xfd, 0xb2,\r
+ 0xea, 0x74, 0xc9, 0x77, 0x59, 0x96, 0xaf, 0x2e, 0x9c, 0x31, 0x56, 0x1c,\r
+ 0x7c, 0x43, 0x63, 0x3f, 0x5c, 0x8b, 0x29, 0x5b, 0x71, 0xbb, 0x7d, 0x00,\r
+ 0xd7, 0x63, 0x3b, 0xce, 0x0d, 0xcb, 0xf8, 0x4e, 0xc4, 0xb4, 0x83, 0x44,\r
+ 0x1b, 0x69, 0x6d, 0xdb, 0x81, 0x29, 0xca, 0x1f, 0x8e, 0x9b, 0xf1, 0xec,\r
+ 0x46, 0xd2, 0x36, 0x86, 0x48, 0xdf, 0x18, 0x5a, 0xb3, 0x9f, 0xc4, 0x38,\r
+ 0x09, 0xe8, 0xb6, 0x4f, 0x50, 0xcd, 0xf6, 0xb9, 0xa8, 0xb1, 0x29, 0x9e,\r
+ 0x48, 0xc4, 0xcd, 0x23, 0x63, 0x89, 0xb8, 0x61, 0x66, 0xbb, 0x8e, 0x46,\r
+ 0x8e, 0x47, 0x48, 0x4c, 0x90, 0x36, 0x31, 0x4e, 0xae, 0x89, 0xf1, 0x71,\r
+ 0x30, 0x13, 0x60, 0xf0, 0x51, 0x33, 0x11, 0x31, 0x63, 0xe9, 0x64, 0x3c,\r
+ 0xd6, 0x1d, 0x49, 0xa5, 0xba, 0x47, 0xa3, 0xd9, 0xf8, 0xf1, 0x78, 0xf6,\r
+ 0x54, 0x88, 0x56, 0xe4, 0xe4, 0xd1, 0xa4, 0x99, 0x85, 0x8f, 0xee, 0x31,\r
+ 0xa6, 0x27, 0xb3, 0x21, 0x1a, 0x9d, 0x88, 0x26, 0x67, 0xba, 0xed, 0x6a,\r
+ 0x87, 0xac, 0x86, 0xa2, 0xb2, 0x21, 0x38, 0x89, 0xc3, 0xc9, 0x31, 0x33,\r
+ 0x79, 0x22, 0x61, 0xc4, 0x8e, 0x18, 0xbb, 0xe7, 0xd2, 0xd1, 0xe9, 0x48,\r
+ 0xc6, 0xd8, 0x1d, 0x49, 0x47, 0x66, 0x32, 0xad, 0x9b, 0xe6, 0xe2, 0x89,\r
+ 0x98, 0x91, 0x0e, 0xd1, 0xfa, 0x4f, 0xeb, 0x22, 0x44, 0x63, 0x9f, 0xbc,\r
+ 0xea, 0x5e, 0x23, 0x93, 0x4a, 0x9a, 0x19, 0x63, 0x22, 0x9e, 0x41, 0x4f,\r
+ 0xb8, 0xfd, 0xc1, 0x25, 0x9c, 0x2c, 0xc8, 0xde, 0x7c, 0xd8, 0x9d, 0x9f,\r
+ 0xa4, 0x5a, 0x88, 0x36, 0x7c, 0x12, 0xf3, 0xc9, 0x6c, 0x24, 0xeb, 0x88,\r
+ 0xb0, 0x77, 0x79, 0x75, 0xb7, 0x26, 0x92, 0x27, 0xac, 0xe4, 0x86, 0x68,\r
+ 0x99, 0xd1, 0x21, 0x1b, 0x73, 0x09, 0x0c, 0xe3, 0x52, 0x39, 0xc0, 0x78,\r
+ 0x67, 0xe6, 0x66, 0xee, 0x1a, 0xba, 0xa5, 0x5a, 0x59, 0x50, 0x2d, 0x44,\r
+ 0xeb, 0x96, 0xe8, 0x87, 0x32, 0xbf, 0x7b, 0x88, 0xba, 0x96, 0xa8, 0xb8,\r
+ 0x3b, 0x9d, 0x8c, 0xcd, 0x45, 0xb3, 0x9b, 0x8d, 0x6c, 0x24, 0x9e, 0xc8,\r
+ 0x84, 0x68, 0xe3, 0x27, 0xb2, 0xbf, 0xbb, 0xbd, 0xb6, 0xa5, 0xea, 0xab,\r
+ 0xa9, 0xbc, 0xf4, 0xe4, 0xb5, 0x27, 0x7d, 0xe6, 0xee, 0x46, 0x86, 0x96,\r
+ 0xd9, 0x48, 0x66, 0x5f, 0x2a, 0x86, 0xe9, 0x10, 0x9b, 0x9f, 0xb1, 0x4b,\r
+ 0x2d, 0xba, 0x3d, 0x73, 0x46, 0xfa, 0xd4, 0xc2, 0x9c, 0x2c, 0x5e, 0x74,\r
+ 0xe3, 0x4b, 0x34, 0xfe, 0xf1, 0x2e, 0x94, 0xdf, 0xf9, 0x85, 0xf0, 0xe9,\r
+ 0xa3, 0x51, 0xae, 0x96, 0xce, 0xe2, 0xc7, 0x46, 0x13, 0xa2, 0xe1, 0x65,\r
+ 0x75, 0x44, 0x8d, 0x57, 0x66, 0x71, 0x1a, 0x06, 0x3e, 0x45, 0xed, 0x10,\r
+ 0x05, 0x65, 0xad, 0xf4, 0x4c, 0x26, 0xd1, 0x7d, 0x14, 0xdb, 0x6b, 0xf7,\r
+ 0x5d, 0x7b, 0x6c, 0x6b, 0xef, 0x72, 0x8c, 0xfa, 0x96, 0x63, 0xd4, 0xbf,\r
+ 0x1c, 0xa3, 0x81, 0xe5, 0x18, 0x0d, 0x86, 0x68, 0xe5, 0x92, 0x81, 0xdf,\r
+ 0xb3, 0xbc, 0xd0, 0xef, 0x59, 0x4e, 0x83, 0xeb, 0x96, 0xd3, 0xe0, 0xd0,\r
+ 0xf2, 0x1a, 0x1c, 0xc2, 0x5d, 0x7c, 0xa9, 0xe0, 0x39, 0xa6, 0x58, 0x24,\r
+ 0x71, 0x3c, 0x7e, 0x0c, 0x07, 0x92, 0x99, 0xc4, 0x1e, 0x1a, 0x4f, 0x9a,\r
+ 0xdd, 0x5b, 0xcc, 0x68, 0x22, 0x99, 0xc1, 0xf1, 0xb7, 0xd3, 0xc8, 0x4e,\r
+ 0x27, 0x63, 0x21, 0x6a, 0xfa, 0x08, 0xa3, 0x71, 0x13, 0x47, 0xc1, 0x58,\r
+ 0x22, 0x92, 0xc1, 0xe6, 0xd1, 0xf8, 0x11, 0xfa, 0xc9, 0xf8, 0x11, 0x33,\r
+ 0x92, 0x9d, 0x4b, 0x1b, 0x21, 0xf2, 0x4e, 0xf0, 0x01, 0xda, 0x9d, 0x88,\r
+ 0x98, 0x47, 0xba, 0xef, 0x3f, 0x74, 0xd4, 0x88, 0x62, 0xfb, 0xac, 0x72,\r
+ 0xc8, 0xf6, 0xce, 0x99, 0x66, 0xe4, 0x50, 0x62, 0x91, 0xe5, 0x64, 0x36,\r
+ 0x8d, 0x10, 0x42, 0x54, 0x6d, 0x59, 0xce, 0x65, 0xe3, 0x89, 0xee, 0xd1,\r
+ 0x74, 0x3a, 0x72, 0x8a, 0x57, 0xf5, 0xc7, 0x88, 0x87, 0xed, 0xb6, 0xe6,\r
+ 0xad, 0x11, 0x5e, 0x8d, 0xc3, 0xc3, 0x58, 0x32, 0x91, 0x40, 0x00, 0xe8,\r
+ 0x66, 0x2e, 0x06, 0x69, 0x3b, 0x9e, 0x35, 0xd2, 0x91, 0x6c, 0x12, 0x87,\r
+ 0x9b, 0xc7, 0x61, 0x6d, 0x35, 0xb5, 0x58, 0x32, 0x4c, 0x62, 0x3f, 0xb9,\r
+ 0xf6, 0xe3, 0xae, 0xa0, 0xe3, 0x03, 0xb7, 0x81, 0xfd, 0xb8, 0x0d, 0xec,\r
+ 0xe7, 0xbb, 0xc1, 0xfe, 0x89, 0xed, 0x94, 0x87, 0x0f, 0x8b, 0x67, 0x3d,\r
+ 0x5f, 0x12, 0x20, 0x61, 0x22, 0x0e, 0x92, 0x76, 0x70, 0x82, 0x2a, 0xa7,\r
+ 0x1c, 0x5d, 0xb7, 0xd3, 0xb1, 0x40, 0x68, 0xf7, 0xbc, 0x38, 0x12, 0x8d,\r
+ 0x1a, 0x99, 0x4c, 0x6b, 0x4f, 0x4f, 0x0f, 0xd9, 0x7c, 0xaf, 0x83, 0xef,\r
+ 0x73, 0xf0, 0xfd, 0xe0, 0x4b, 0x2c, 0xfb, 0xad, 0x89, 0xc8, 0x91, 0x0c,\r
+ 0x55, 0x46, 0xee, 0xbe, 0x47, 0x90, 0x2b, 0x12, 0x8b, 0x51, 0x3e, 0x3e,\r
+ 0x46, 0x13, 0x09, 0xd0, 0x0c, 0xf7, 0x8f, 0x4a, 0xd5, 0x1d, 0xc4, 0xba,\r
+ 0xec, 0x50, 0xde, 0x21, 0xbe, 0x66, 0x50, 0x45, 0x34, 0x89, 0x11, 0x8e,\r
+ 0x66, 0x47, 0xcd, 0xd8, 0x96, 0x93, 0x46, 0x74, 0x2e, 0x6b, 0x90, 0x1b,\r
+ 0x22, 0x3e, 0xd3, 0x46, 0x33, 0xa7, 0xcc, 0x28, 0x95, 0xab, 0x92, 0xbd,\r
+ 0x5f, 0x53, 0x8d, 0x21, 0x47, 0x71, 0xb7, 0x61, 0xc6, 0x30, 0x70, 0xb6,\r
+ 0x38, 0x43, 0xa5, 0x10, 0xe0, 0x9c, 0x62, 0x67, 0x48, 0x3b, 0xf9, 0x0d,\r
+ 0xcb, 0xdd, 0xfd, 0xe6, 0x82, 0x6b, 0x82, 0xc3, 0xc2, 0x75, 0xc4, 0xc8,\r
+ 0x52, 0x15, 0x3e, 0xd4, 0x6e, 0xc7, 0x51, 0x5a, 0xdb, 0x10, 0x79, 0x58,\r
+ 0xaa, 0xb6, 0x26, 0x79, 0xe4, 0x2f, 0x90, 0x84, 0x93, 0xc7, 0x0c, 0x93,\r
+ 0xca, 0x61, 0x63, 0x9f, 0x1d, 0x63, 0xc9, 0x98, 0x41, 0x65, 0xd3, 0xb8,\r
+ 0x6d, 0x25, 0x72, 0xb7, 0x29, 0x2a, 0xc0, 0x9d, 0x6a, 0x17, 0xee, 0x62,\r
+ 0xa4, 0x4f, 0x27, 0xd1, 0xff, 0xbc, 0xb8, 0x89, 0xcb, 0x1b, 0xbe, 0x4e,\r
+ 0x64, 0x1c, 0x57, 0xaf, 0x18, 0x79, 0xe3, 0x19, 0x15, 0xe0, 0xe4, 0x5c,\r
+ 0x2a, 0x95, 0x4c, 0xe3, 0x3c, 0xa1, 0x82, 0x78, 0x66, 0xcb, 0x4c, 0x2a,\r
+ 0x7b, 0x8a, 0x95, 0x5b, 0x0d, 0x39, 0xbd, 0x17, 0x28, 0xf7, 0x1a, 0x91,\r
+ 0xd8, 0x29, 0x2a, 0x8c, 0xab, 0xc9, 0x44, 0x15, 0x89, 0xc8, 0x9c, 0x19,\r
+ 0x9d, 0x56, 0x7e, 0xf8, 0xb6, 0x41, 0xba, 0x19, 0x99, 0x31, 0xa8, 0xd8,\r
+ 0x34, 0x4e, 0xa8, 0xeb, 0x1c, 0x24, 0x1c, 0x4b, 0x63, 0xd2, 0x74, 0x34,\r
+ 0x6f, 0xf7, 0xd1, 0xee, 0x07, 0x35, 0x24, 0xed, 0x74, 0x4d, 0x1a, 0xe9,\r
+ 0xe3, 0xf1, 0xa8, 0xb1, 0x39, 0x9e, 0xc1, 0x00, 0x70, 0x52, 0x11, 0x57,\r
+ 0x8d, 0x43, 0x9b, 0x9d, 0x4b, 0x6d, 0xc5, 0xed, 0x36, 0x33, 0x0d, 0x79,\r
+ 0x45, 0xd2, 0x44, 0x5e, 0x79, 0xcc, 0x72, 0x8e, 0x6a, 0x93, 0xe6, 0xc2,\r
+ 0x73, 0x2e, 0xa7, 0xf1, 0x42, 0x63, 0xef, 0xfa, 0xea, 0x00, 0x25, 0x58,\r
+ 0x5b, 0x27, 0x89, 0xad, 0xc8, 0x59, 0xd7, 0xa7, 0x16, 0xdc, 0x20, 0xa4,\r
+ 0xd5, 0x58, 0x24, 0x91, 0x38, 0x84, 0x79, 0x47, 0x2b, 0x52, 0xca, 0x7e,\r
+ 0x2c, 0x39, 0x93, 0x4a, 0x18, 0x08, 0x31, 0xa7, 0xaa, 0x9d, 0x57, 0xc9,\r
+ 0xc0, 0xe6, 0x35, 0x75, 0xb6, 0x46, 0x4e, 0xcb, 0x85, 0x0e, 0x2b, 0x67,\r
+ 0xef, 0x3e, 0xa0, 0xa9, 0xf6, 0x23, 0x84, 0xd6, 0xdc, 0xf4, 0x7d, 0x84,\r
+ 0x66, 0x1c, 0x91, 0x50, 0x99, 0xa5, 0xb0, 0x7b, 0x43, 0xca, 0xaf, 0x5d,\r
+ 0xb6, 0x6a, 0x7b, 0x17, 0x1a, 0xc9, 0x8a, 0xae, 0xf4, 0x9c, 0x49, 0x25,\r
+ 0x19, 0x23, 0xcb, 0x93, 0x91, 0x6f, 0xc1, 0xe4, 0x46, 0x41, 0x65, 0x72,\r
+ 0x3c, 0x46, 0x65, 0xf3, 0x25, 0xb9, 0xa8, 0x1c, 0xe5, 0xf0, 0xa9, 0x94,\r
+ 0x41, 0x1e, 0xd6, 0xab, 0x66, 0xac, 0x69, 0xaa, 0x67, 0xe2, 0xa7, 0x0d,\r
+ 0x2a, 0xcf, 0x64, 0x23, 0xe9, 0xac, 0x63, 0xf2, 0x17, 0x64, 0xe6, 0x0e,\r
+ 0x49, 0x0f, 0x3a, 0x18, 0x2c, 0x1e, 0xfe, 0x8c, 0xa6, 0xe3, 0x29, 0x5e,\r
+ 0x3b, 0x19, 0xca, 0xcf, 0x4e, 0xc7, 0xb1, 0x21, 0x28, 0xda, 0x4b, 0xee,\r
+ 0xe3, 0x91, 0x44, 0x6b, 0x44, 0x7d, 0xed, 0xa0, 0x12, 0x2e, 0xc5, 0xac,\r
+ 0x2b, 0x1d, 0x55, 0x71, 0x21, 0xb7, 0xd6, 0x26, 0xe7, 0xe4, 0x5e, 0x42,\r
+ 0xc5, 0x2c, 0x4d, 0xc9, 0xef, 0x13, 0x54, 0x2d, 0x79, 0x6b, 0x18, 0xc7,\r
+ 0x63, 0xf8, 0x92, 0x12, 0x3f, 0x1c, 0x47, 0xc7, 0x3c, 0x0e, 0x31, 0xc7,\r
+ 0x8e, 0xbd, 0xc4, 0x21, 0xc9, 0x84, 0x93, 0x7b, 0x78, 0x2c, 0xac, 0xa6,\r
+ 0xed, 0x21, 0xa3, 0x0a, 0x69, 0xb2, 0xa0, 0x83, 0xa5, 0x4e, 0x51, 0xc6,\r
+ 0x0a, 0x2e, 0x9b, 0x1c, 0x9b, 0x36, 0x30, 0x41, 0xf2, 0xa0, 0x9b, 0x33,\r
+ 0x68, 0xf6, 0xcc, 0x99, 0xcd, 0x43, 0x8f, 0x06, 0x78, 0xce, 0x60, 0x93,\r
+ 0x08, 0x6c, 0x08, 0xc4, 0x8c, 0x93, 0x81, 0x8e, 0x00, 0xbe, 0x20, 0xa5,\r
+ 0xe2, 0x09, 0x79, 0x18, 0x75, 0xce, 0x60, 0x05, 0x43, 0x91, 0x36, 0x12,\r
+ 0x06, 0xbe, 0x09, 0x41, 0x89, 0xc5, 0xdb, 0x19, 0x65, 0x27, 0x98, 0xd6,\r
+ 0x99, 0xc0, 0x86, 0xc3, 0x91, 0x44, 0xc6, 0xe8, 0x08, 0xcc, 0xc4, 0xcd,\r
+ 0x4e, 0x7c, 0x7b, 0x0a, 0x6c, 0xe8, 0xed, 0x08, 0x1c, 0x37, 0xd2, 0x19,\r
+ 0x64, 0x0b, 0xb5, 0xfa, 0xbb, 0xfa, 0xbb, 0xfa, 0x7a, 0x3a, 0x63, 0xc6,\r
+ 0xf1, 0xb5, 0x91, 0x64, 0x26, 0xd5, 0x1b, 0x78, 0x8c, 0xb4, 0x55, 0xe2,\r
+ 0x79, 0xd1, 0x90, 0x87, 0x3f, 0xfb, 0xd5, 0xfa, 0x36, 0xfa, 0x1a, 0x7c,\r
+ 0x79, 0x5a, 0x2b, 0x04, 0x75, 0x13, 0xda, 0x4a, 0x6d, 0x8f, 0x4e, 0x66,\r
+ 0x93, 0x55, 0xdc, 0x61, 0x91, 0xb1, 0x85, 0xd6, 0x4d, 0xb6, 0xf5, 0x2e,\r
+ 0x4b, 0xbd, 0xd3, 0x22, 0x5d, 0x16, 0x19, 0xb6, 0x48, 0xc8, 0x22, 0x83,\r
+ 0x16, 0x19, 0xb1, 0x3c, 0xe8, 0x3e, 0xa1, 0x5a, 0x93, 0xcd, 0x5b, 0x45,\r
+ 0x76, 0x27, 0x8b, 0x05, 0x88, 0x66, 0xa3, 0x6f, 0x9d, 0x4f, 0xf7, 0xad,\r
+ 0xf7, 0xe5, 0x84, 0x85, 0x3e, 0x0d, 0x22, 0x4b, 0x2c, 0x03, 0xc5, 0xeb,\r
+ 0x7a, 0x41, 0x17, 0xfd, 0xc2, 0xfe, 0xdf, 0x72, 0xf6, 0xac, 0x7e, 0xc3,\r
+ 0x17, 0x10, 0xef, 0xfb, 0x48, 0x13, 0x42, 0x97, 0xe2, 0x20, 0x64, 0xef,\r
+ 0xd4, 0xb6, 0x8a, 0x0f, 0x6b, 0xc9, 0x25, 0x44, 0xbe, 0x6d, 0xba, 0x12,\r
+ 0xe2, 0xb7, 0x56, 0xac, 0x12, 0x77, 0xf0, 0xb6, 0x53, 0x88, 0x22, 0x5b,\r
+ 0xbc, 0x1a, 0xe2, 0xe7, 0xea, 0xda, 0xc4, 0xf5, 0x3a, 0x12, 0x42, 0xb8,\r
+ 0x2f, 0xfa, 0xd7, 0x40, 0x70, 0xb9, 0xbe, 0x5d, 0xbc, 0x5a, 0xcf, 0x82,\r
+ 0xd2, 0x8b, 0xfe, 0xb5, 0x10, 0x9c, 0x6d, 0xe8, 0x10, 0x97, 0x1b, 0xb8,\r
+ 0x62, 0x99, 0x5d, 0xb1, 0x13, 0xe2, 0x77, 0x1a, 0xba, 0xc4, 0xd9, 0x46,\r
+ 0x34, 0xad, 0x55, 0x48, 0x71, 0x37, 0x64, 0x37, 0x1a, 0x7b, 0xc4, 0x9d,\r
+ 0x46, 0x21, 0xce, 0xe2, 0x5d, 0x91, 0x10, 0x95, 0x17, 0xfd, 0x7d, 0x10,\r
+ 0x5e, 0x6d, 0xea, 0x17, 0xf8, 0x85, 0x11, 0x62, 0xac, 0x92, 0x86, 0x03,\r
+ 0x5c, 0xb9, 0x69, 0x50, 0x7c, 0x08, 0x59, 0xa9, 0xbb, 0xc6, 0x2b, 0xb4,\r
+ 0x7b, 0x3e, 0x7f, 0x56, 0x7f, 0xbd, 0x45, 0x5c, 0xf0, 0x5f, 0xf1, 0xe3,\r
+ 0xe3, 0x42, 0x00, 0x1f, 0x2f, 0x73, 0xf1, 0xc5, 0x80, 0xd0, 0x5e, 0x0d,\r
+ 0xb8, 0xb4, 0x17, 0x83, 0x9a, 0xf6, 0xc3, 0x60, 0xc1, 0x39, 0xbc, 0xeb,\r
+ 0x72, 0x40, 0xd7, 0x6e, 0xad, 0x1a, 0x16, 0xb7, 0x02, 0x42, 0x9c, 0x0f,\r
+ 0x6a, 0xe2, 0xba, 0x5f, 0x13, 0x3f, 0x6c, 0x06, 0xef, 0x17, 0xe2, 0x72,\r
+ 0xab, 0x10, 0xaf, 0x03, 0x37, 0x81, 0x7f, 0x6c, 0xcd, 0x13, 0xd7, 0x57,\r
+ 0x0a, 0x71, 0x0b, 0xb8, 0xbe, 0x0a, 0x2f, 0x02, 0xf0, 0xf0, 0xfb, 0x80,\r
+ 0x44, 0xab, 0xf5, 0x2e, 0xe2, 0x31, 0xd0, 0xf3, 0x8a, 0x7f, 0xca, 0xc1,\r
+ 0x5f, 0x52, 0x3c, 0xdb, 0x3e, 0xaf, 0xf4, 0xdf, 0x70, 0xe8, 0xbf, 0xed,\r
+ 0xe0, 0xbf, 0xe3, 0xe0, 0x5f, 0x77, 0xf0, 0x7f, 0xe6, 0xe0, 0xff, 0xd2,\r
+ 0xc1, 0xff, 0x44, 0xf1, 0xec, 0xfb, 0x1d, 0xf0, 0x4c, 0x7f, 0xa5, 0xe8,\r
+ 0x7f, 0x29, 0x5a, 0x8e, 0x17, 0x85, 0x27, 0x1d, 0xf1, 0xc2, 0x44, 0xbe,\r
+ 0x57, 0x49, 0x41, 0x76, 0x5e, 0xc9, 0x59, 0xc6, 0xcf, 0xc5, 0x45, 0xe5,\r
+ 0x2b, 0x8b, 0xea, 0xf1, 0xfb, 0xa7, 0xcb, 0x90, 0x7d, 0x73, 0x91, 0x9d,\r
+ 0x9d, 0x0f, 0xe9, 0x04, 0x1f, 0x6f, 0x2d, 0xd2, 0xdf, 0x5c, 0x54, 0xbe,\r
+ 0xb5, 0xa8, 0x7c, 0x67, 0x51, 0x39, 0xa1, 0xca, 0xfc, 0xae, 0x93, 0x9f,\r
+ 0xad, 0x00, 0xb7, 0xbb, 0x0d, 0xf4, 0x03, 0xd0, 0xed, 0x2c, 0xc4, 0x0b,\r
+ 0x99, 0x09, 0x10, 0x0f, 0xe8, 0x2e, 0xd0, 0x42, 0x50, 0xeb, 0xed, 0x94,\r
+ 0x95, 0x07, 0x36, 0xe1, 0x7c, 0x5c, 0x06, 0x52, 0x00, 0xbf, 0xdf, 0xe9,\r
+ 0x07, 0x6e, 0x81, 0xe1, 0x77, 0x3b, 0x9b, 0x00, 0xfe, 0x8d, 0x9f, 0x0e,\r
+ 0xca, 0x7f, 0x0f, 0xe2, 0xdf, 0xf9, 0x71, 0x7b, 0xfc, 0xb7, 0x6c, 0xfe,\r
+ 0xad, 0x1f, 0x8a, 0xf2, 0xfd, 0x15, 0xff, 0xde, 0x4f, 0xf8, 0xad, 0xdf,\r
+ 0x42, 0xf1, 0x6f, 0xfe, 0x5c, 0xe0, 0xf9, 0xdd, 0x2b, 0xff, 0x5d, 0x52,\r
+ 0xa0, 0x41, 0x7e, 0x3f, 0xc4, 0x7f, 0xff, 0xd5, 0x20, 0xe7, 0xb6, 0xf8,\r
+ 0x37, 0x81, 0x3a, 0x78, 0x7e, 0x47, 0xc7, 0x73, 0x83, 0xc0, 0xf3, 0x7b,\r
+ 0x30, 0xfe, 0xbb, 0xb0, 0x0b, 0xf6, 0x52, 0x8e, 0x3e, 0xe4, 0x2b, 0x39,\r
+ 0xff, 0xcd, 0x98, 0x03, 0xe7, 0x58, 0xf9, 0x05, 0xdf, 0xff, 0x01, 0x8d,\r
+ 0xe0, 0xfe, 0xb8, 0xc4, 0x28, 0x00, 0x00\r
+};\r
+\r
//==============================================================================\r
struct InAppPurchases::Pimpl\r
{\r
CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \\r
CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V")\r
\r
- DECLARE_JNI_CLASS (JuceBillingClient, "com/rmsl/juce/JuceBillingClient")\r
+ DECLARE_JNI_CLASS_WITH_BYTECODE (JuceBillingClient,\r
+ "com/rmsl/juce/JuceBillingClient",\r
+ 16,\r
+ juceBillingClientCompiled,\r
+ numElementsInArray (juceBillingClientCompiled))\r
#undef JNI_CLASS_MEMBERS\r
\r
static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList)\r
return;\r
}\r
\r
- getEnv()->CallObjectMethod (billingClient,\r
- JuceBillingClient.consumePurchase,\r
- LocalRef<jstring> { javaString (productIdentifier) }.get(),\r
- LocalRef<jstring> { javaString (purchaseToken) }.get());\r
+ getEnv()->CallVoidMethod (billingClient,\r
+ JuceBillingClient.consumePurchase,\r
+ LocalRef<jstring> { javaString (productIdentifier) }.get(),\r
+ LocalRef<jstring> { javaString (purchaseToken) }.get());\r
}\r
\r
//==============================================================================\r
\r
ID: juce_video\r
vendor: juce\r
- version: 7.0.1\r
+ version: 7.0.2\r
name: JUCE video playback and capture classes\r
description: Classes for playing video and capturing camera input.\r
website: http://www.juce.com/juce\r
==============================================================================\r
*/\r
\r
-#if (defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
- #define JUCE_USE_NEW_CAMERA_API 1\r
-#endif\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
\r
struct CameraDevice::Pimpl\r
{\r
private:\r
static NSArray<AVCaptureDevice*>* getDevices()\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
std::unique_ptr<NSMutableArray<AVCaptureDeviceType>, NSObjectDeleter> deviceTypes ([[NSMutableArray alloc] initWithCapacity: 2]);\r
\r
return [discoverySession devices];\r
}\r
- #endif\r
\r
return [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo];\r
}\r
JUCE_CAMERA_LOG ("Supports custom exposure: " + String ((int)[device isExposureModeSupported: AVCaptureExposureModeCustom]));\r
JUCE_CAMERA_LOG ("Supports point of interest exposure: " + String ((int)device.exposurePointOfInterestSupported));\r
\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
JUCE_CAMERA_LOG ("Device type: " + nsStringToJuce (device.deviceType));\r
JUCE_CAMERA_LOG ("Locking focus with custom lens position supported: " + String ((int)device.lockingFocusWithCustomLensPositionSupported));\r
}\r
- #endif\r
\r
- #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
if (@available (iOS 11.0, *))\r
{\r
JUCE_CAMERA_LOG ("Min available video zoom factor: " + String (device.minAvailableVideoZoomFactor));\r
JUCE_CAMERA_LOG ("Max available video zoom factor: " + String (device.maxAvailableVideoZoomFactor));\r
JUCE_CAMERA_LOG ("Dual camera switch over video zoom factor: " + String (device.dualCameraSwitchOverVideoZoomFactor));\r
}\r
- #endif\r
\r
JUCE_CAMERA_LOG ("Capture formats start-------------------");\r
for (AVCaptureDeviceFormat* format in device.formats)\r
{\r
JUCE_CAMERA_LOG ("Media type: " + nsStringToJuce (format.mediaType));\r
\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
String colourSpaces;\r
\r
JUCE_CAMERA_LOG ("Supported colour spaces: " + colourSpaces);\r
}\r
- #endif\r
\r
JUCE_CAMERA_LOG ("Video field of view: " + String (format.videoFieldOfView));\r
JUCE_CAMERA_LOG ("Video max zoom factor: " + String (format.videoMaxZoomFactor));\r
JUCE_CAMERA_LOG ("Cinematic video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeCinematic]));\r
JUCE_CAMERA_LOG ("Auto video stabilization supported: " + String ((int) [format isVideoStabilizationModeSupported: AVCaptureVideoStabilizationModeAuto]));\r
\r
- #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
if (@available (iOS 11.0, *))\r
{\r
JUCE_CAMERA_LOG ("Min zoom factor for depth data delivery: " + String (format.videoMinZoomFactorForDepthDataDelivery));\r
JUCE_CAMERA_LOG ("Max zoom factor for depth data delivery: " + String (format.videoMaxZoomFactorForDepthDataDelivery));\r
}\r
- #endif\r
}\r
\r
static String getHighResStillImgDimensionsString (CMVideoDimensions d)\r
captureOutput (createCaptureOutput()),\r
photoOutputDelegate (nullptr)\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
static PhotoOutputDelegateClass cls;\r
photoOutputDelegate.reset ([cls.createInstance() init]);\r
PhotoOutputDelegateClass::setOwner (photoOutputDelegate.get(), this);\r
}\r
- #endif\r
\r
captureSession.addOutputIfPossible (captureOutput);\r
}\r
\r
if (auto* connection = findVideoConnection (captureOutput))\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
return;\r
}\r
}\r
- #endif\r
\r
auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
auto outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
private:\r
static AVCaptureOutput* createCaptureOutput()\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
return [AVCapturePhotoOutput new];\r
- #endif\r
\r
return [AVCaptureStillImageOutput new];\r
}\r
\r
static void printImageOutputDebugInfo (AVCaptureOutput* captureOutput)\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
{\r
if ([captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
JUCE_CAMERA_LOG ("Live photo capture supported: " + String ((int) photoOutput.livePhotoCaptureSupported));\r
\r
\r
- #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
if (@available (iOS 11.0, *))\r
{\r
typesString.clear();\r
JUCE_CAMERA_LOG ("Camera calibration data delivery supported: " + String ((int) photoOutput.cameraCalibrationDataDeliverySupported));\r
JUCE_CAMERA_LOG ("Depth data delivery supported: " + String ((int) photoOutput.depthDataDeliverySupported));\r
}\r
- #endif\r
\r
return;\r
}\r
}\r
- #endif\r
\r
auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
\r
}\r
\r
//==============================================================================\r
- #if JUCE_USE_NEW_CAMERA_API\r
class API_AVAILABLE (ios (10.0)) PhotoOutputDelegateClass : public ObjCClass<NSObject>\r
{\r
public:\r
addMethod (@selector (captureOutput:didCapturePhotoForResolvedSettings:), didCaptureForSettings);\r
addMethod (@selector (captureOutput:didFinishCaptureForResolvedSettings:error:), didFinishCaptureForSettings);\r
\r
- #if defined (__IPHONE_11_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\r
if (@available (iOS 11.0, *))\r
{\r
addMethod (@selector (captureOutput:didFinishProcessingPhoto:error:), didFinishProcessingPhoto);\r
}\r
else\r
- #endif\r
{\r
addMethod (@selector (captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:), didFinishProcessingPhotoSampleBuffer);\r
}\r
}\r
}\r
};\r
- #endif\r
\r
//==============================================================================\r
void callListeners (const Image& image)\r
\r
void startRecording (const File& file, AVCaptureVideoOrientation orientationToUse)\r
{\r
- #if JUCE_USE_NEW_CAMERA_API\r
if (@available (iOS 10.0, *))\r
printVideoOutputDebugInfo (movieFileOutput);\r
- #endif\r
\r
auto url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
isDirectory: NO];\r
return ".mov";\r
}\r
\r
-#if JUCE_USE_NEW_CAMERA_API\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-#endif\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
const auto codecType = []\r
{\r
- #if defined (MAC_OS_X_VERSION_10_13) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13\r
if (@available (macOS 10.13, *))\r
return AVVideoCodecTypeJPEG;\r
- #endif\r
\r
return AVVideoCodecJPEG;\r
}();\r