JUCE breaking changes
=====================
+Version 6.1.6
+=============
+
+Change
+------
+Unhandled mouse wheel and magnify events will now be passed to the closest
+enclosing enabled ancestor component.
+
+Possible Issues
+---------------
+Components that previously blocked mouse wheel events when in a disabled state
+may no longer block the events as expected.
+
+Workaround
+----------
+If a component should explicitly prevent events from propagating when disabled,
+it should override mouseWheelMove() and mouseMagnify() to do nothing when the
+component is disabled.
+
+Rationale
+---------
+Previously, unhandled wheel events would be passed to the parent component,
+but only if the parent was enabled. This meant that scrolling on a component
+nested inside a disabled component would have no effect by default. This
+behaviour was not intuitive.
+
+
+Change
+------
+The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and
+invalidTiltY members of MouseInputSource have been deprecated.
+
+Possible Issues
+---------------
+Deprecation warnings will be seen when compiling code which uses these members
+and eventually builds will fail when they are later removed from the API.
+
+Workaround
+----------
+Use the equivalent defaultPressure, defaultOrientation, defaultRotation,
+defaultTiltX and defaultTiltY members of MouseInputSource.
+
+Rationale
+---------
+The deprecated members represent valid values and the isPressureValid() etc.
+functions return true when using them. This could be a source of confusion and
+may be inviting programming errors. The new names are in line with the ongoing
+practice of using these values to provide a neutral default in the absence of
+actual OS provided values.
+
+
+Change
+------
+Plugin wrappers will no longer call processBlockBypassed() if the wrapped
+AudioProcessor returns a parameter from getBypassParameter().
+
+Possible Issues
+---------------
+Plugins that used to depend on processBlockBypassed() being called may no
+longer correctly enter a bypassed state.
+
+Workaround
+----------
+AudioProcessors that implement getBypassParameter() must check the current
+value of the bypass parameter on each call to processBlock(), and bypass
+processing as appropriate. When switching between bypassed and non-bypassed
+states, the plugin must use some sort of ramping or smoothing to avoid
+discontinuities in the output. If the plugin introduces latency when not
+bypassed, the plugin must delay its output when in bypassed mode so that the
+overall latency does not change when enabling/disabling bypass.
+
+Rationale
+---------
+The documentation for AudioProcessor::getBypassParameter() says
+> if this method returns a non-null value, you should never call
+ processBlockBypassed but use the returned parameter to control the bypass
+ state instead.
+Some plugin wrappers were not following this rule. After this change, the
+behaviour of all plugin wrappers is consistent with the documented behaviour.
+
+
+Change
+------
+The ComponentPeer::getFrameSize() function has been deprecated on Linux.
+
+Possible Issues
+---------------
+Deprecation warnings will be seen when compiling code which uses this function
+and eventually builds will fail when it is later removed from the API.
+
+Workaround
+----------
+Use the ComponentPeer::getFrameSizeIfPresent() function. The new function returns
+an OptionalBorderSize object. Use operator bool() to determine if the border size
+is valid, then access the value using operator*() only if it is.
+
+Rationale
+---------
+The XWindow system cannot return a valid border size immediately after window
+creation. ComponentPeer::getFrameSize() returns a default constructed
+BorderSize<int> instance in such cases that corresponds to a frame size of
+zero. That however can be a valid value, and needs to be treated differently
+from the situation when the frame size is not yet available.
+
+
+Change
+------
+The return type of XWindowSystem::getBorderSize() was changed to
+ComponentPeer::OptionalBorderSize.
+
+Possible Issues
+---------------
+User code that uses XWindowSystem::getBorderSize() will fail to build.
+
+Workaround
+----------
+Use operator bool() to determine the validity of the new return value and
+access the contained value using operator*().
+
+Rationale
+---------
+The XWindow system cannot immediately report the correct border size after
+window creation. The underlying X11 calls will signal whether querying the
+border size was successful, but there was no way to forward this information
+through XWindowSystem::getBorderSize() until this change.
+
+
Version 6.1.5
=============
cmake_minimum_required(VERSION 3.15)
-project(JUCE VERSION 6.1.5 LANGUAGES C CXX)
+project(JUCE VERSION 6.1.6 LANGUAGES C CXX)
include(CMakeDependentOption)
install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
- "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake"
+ "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake"
"${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard"
"${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib"
"${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in"
+ "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake"
"${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake"
"${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp"
DESTINATION "${JUCE_INSTALL_DESTINATION}")
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 6.1.6\r
+ - Improved the handling of AU multichannel layouts\r
+ - Added JUCE_NODISCARD to builder-patten functions\r
+ - Added recursion options to DirectoryIterator\r
+ - Unified the loading of OpenGL 3.2 core profiles\r
+ - Improved macOS full-screen behaviour with non-native titlebars\r
+\r
Version 6.1.5\r
- Improved the accessibility framework\r
- Added handling of non-Latin virtual key codes on macOS\r
plist if `APP_SANDBOX_ENABLED` is `TRUE`. Each key should be in the form `com.apple.security.*`
where `*` is a specific entitlement.
+`APP_SANDBOX_FILE_ACCESS_HOME_RO`
+- A set of space-separated paths that will be added to this target's entitlements plist for
+ accessing read-only paths relative to the home directory if `APP_SANDBOX_ENABLED` is `TRUE`.
+
+`APP_SANDBOX_FILE_ACCESS_HOME_RW`
+- A set of space-separated paths that will be added to this target's entitlements plist for
+ accessing read/write paths relative to the home directory if `APP_SANDBOX_ENABLED` is `TRUE`.
+
+`APP_SANDBOX_FILE_ACCESS_ABS_RO`
+- A set of space-separated paths that will be added to this target's entitlements plist for
+ accessing read-only absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`.
+
+`APP_SANDBOX_FILE_ACCESS_ABS_RW`
+- A set of space-separated paths that will be added to this target's entitlements plist for
+ accessing read/write absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`.
+
`PLIST_TO_MERGE`
- A string to insert into an app/plugin's Info.plist.
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=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]])
+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=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]])
include_directories( AFTER
"../../../JuceLibraryCode"
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=0x60105]] [[-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_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=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-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_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=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]] [[-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=0x60105]] [[-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_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=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DNDEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-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_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=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]] [[-DNDEBUG=1]])
else()
message( FATAL_ERROR "No matching build-configuration found." )
endif()
"../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h"
"../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"
"../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"
+ "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.5"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.6"
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=0x60105" "-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_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=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(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=0x60106" "-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_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=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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_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=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(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=0x60106" "-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_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=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := DemoRunner
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</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>..\..\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=0x60105;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_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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\0"\r
END\r
END\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\0"\r
END\r
END\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\0"\r
END\r
END\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</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="6.1.5" companyName="Raw Material Software Limited"\r
+ bundleIdentifier="com.rmsl.jucedemorunner" version="6.1.6" 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 = "6.1.5";\r
- const int versionNumber = 0x60105;\r
+ const char* const versionString = "6.1.6";\r
+ const int versionNumber = 0x60106;\r
}\r
#endif\r
\r
void setShaderProgram (const String& vertexShader, const String& fragmentShader)\r
{\r
+ const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status\r
newVertexShader = vertexShader;\r
newFragmentShader = fragmentShader;\r
}\r
private:\r
void handleAsyncUpdate() override\r
{\r
+ const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status\r
controlsOverlay->statusLabel.setText (statusText, dontSendNotification);\r
}\r
\r
OpenGLUtils::DemoTexture* textureToUse = nullptr;\r
OpenGLUtils::DemoTexture* lastTexture = nullptr;\r
\r
+ CriticalSection shaderMutex;\r
String newVertexShader, newFragmentShader, statusText;\r
\r
struct BackgroundStar\r
//==============================================================================\r
void updateShader()\r
{\r
+ const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status\r
+\r
if (newVertexShader.isNotEmpty() || newFragmentShader.isNotEmpty())\r
{\r
std::unique_ptr<OpenGLShaderProgram> newShader (new OpenGLShaderProgram (openGLContext));\r
{\r
if (e.mods.isRightButtonDown())\r
if (auto* c = editor.getHostContext())\r
- if (auto menuInfo = c->getContextMenuForParameterIndex (¶m))\r
+ if (auto menuInfo = c->getContextMenuForParameter (¶m))\r
menuInfo->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options{}.withTargetComponent (this)\r
.withMousePosition());\r
}\r
template <typename It>\r
void addMessages (It begin, It end)\r
{\r
+ if (begin == end)\r
+ return;\r
+\r
const auto numNewMessages = (int) std::distance (begin, end);\r
const auto numToAdd = juce::jmin (numToStore, numNewMessages);\r
const auto numToRemove = jmax (0, (int) messages.size() + numToAdd - numToStore);\r
testResultsBox.setFont ({ Font::getDefaultMonospacedFontName(), 12.0f, Font::plain });\r
\r
logMessage (String ("This demo uses the ChildProcessCoordinator and ChildProcessWorker classes to launch and communicate "\r
- "with a child process, sending messages in the form of serialised ValueTree objects.") + newLine);\r
+ "with a child process, sending messages in the form of serialised ValueTree objects.") + newLine\r
+ + String ("In this demo, the child process will automatically quit if it fails to receive a ping message at least every ")\r
+ + String (timeoutSeconds)\r
+ + String (" seconds. To keep the process alive, press the \"")\r
+ + pingButton.getButtonText()\r
+ + String ("\" button periodically.") + newLine);\r
\r
setSize (500, 500);\r
}\r
{\r
if (coordinatorProcess.get() == nullptr)\r
{\r
- coordinatorProcess.reset (new DemoCoordinatorProcess (*this));\r
+ coordinatorProcess = std::make_unique<DemoCoordinatorProcess> (*this);\r
\r
- if (coordinatorProcess->launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), demoCommandLineUID))\r
+ if (coordinatorProcess->launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile),\r
+ demoCommandLineUID,\r
+ timeoutMillis))\r
+ {\r
logMessage ("Child process started");\r
+ }\r
}\r
}\r
\r
// This class is used by the main process, acting as the coordinator and receiving messages\r
// from the worker process.\r
class DemoCoordinatorProcess : public ChildProcessCoordinator,\r
- private DeletedAtShutdown\r
+ private DeletedAtShutdown,\r
+ private AsyncUpdater\r
{\r
public:\r
DemoCoordinatorProcess (ChildProcessDemo& d) : demo (d) {}\r
\r
+ ~DemoCoordinatorProcess() override { cancelPendingUpdate(); }\r
+\r
// This gets called when a message arrives from the worker process..\r
void handleMessageFromWorker (const MemoryBlock& mb) override\r
{\r
void handleConnectionLost() override\r
{\r
demo.logMessage ("Connection lost to child process!");\r
+ triggerAsyncUpdate();\r
+ }\r
+\r
+ void handleAsyncUpdate() override\r
+ {\r
demo.killChildProcess();\r
}\r
\r
//==============================================================================\r
std::unique_ptr<DemoCoordinatorProcess> coordinatorProcess;\r
\r
+ static constexpr auto timeoutSeconds = 10;\r
+ static constexpr auto timeoutMillis = timeoutSeconds * 1000;\r
+\r
private:\r
+\r
TextButton launchButton { "Launch Child Process" };\r
TextButton pingButton { "Send Ping" };\r
TextButton killButton { "Kill Child Process" };\r
}\r
\r
/* If no pings are received from the coordinator process for a number of seconds, then this will get invoked.\r
- Typically you'll want to use this as a signal to kill the process as quickly as possible, as you\r
- don't want to leave it hanging around as a zombie..\r
+ Typically, you'll want to use this as a signal to kill the process as quickly as possible, as you\r
+ don't want to leave it hanging around as a zombie.\r
*/\r
void handleConnectionLost() override\r
{\r
//==============================================================================\r
/* The JUCEApplication::initialise method calls this function to allow the\r
child process to launch when the command line parameters indicate that we're\r
- being asked to run as a child process..\r
+ being asked to run as a child process.\r
*/\r
bool invokeChildProcessDemo (const String& commandLine)\r
{\r
- std::unique_ptr<DemoWorkerProcess> worker (new DemoWorkerProcess());\r
+ auto worker = std::make_unique<DemoWorkerProcess>();\r
\r
- if (worker->initialiseFromCommandLine (commandLine, demoCommandLineUID))\r
+ if (worker->initialiseFromCommandLine (commandLine, demoCommandLineUID, ChildProcessDemo::timeoutMillis))\r
{\r
worker.release(); // allow the worker object to stay alive - it'll handle its own deletion.\r
return true;\r
if (invokeChildProcessDemo (commandLine))\r
return;\r
\r
- mainWindow.reset (new MainWindow ("ChildProcessDemo", new ChildProcessDemo()));\r
+ mainWindow = std::make_unique<MainWindow> ("ChildProcessDemo", std::make_unique<ChildProcessDemo>());\r
}\r
\r
void shutdown() override { mainWindow = nullptr; }\r
class MainWindow : public DocumentWindow\r
{\r
public:\r
- MainWindow (const String& name, Component* c) : DocumentWindow (name,\r
- Desktop::getInstance().getDefaultLookAndFeel()\r
- .findColour (ResizableWindow::backgroundColourId),\r
- DocumentWindow::allButtons)\r
+ MainWindow (const String& name, std::unique_ptr<Component> c)\r
+ : DocumentWindow (name,\r
+ Desktop::getInstance().getDefaultLookAndFeel()\r
+ .findColour (ResizableWindow::backgroundColourId),\r
+ DocumentWindow::allButtons)\r
{\r
setUsingNativeTitleBar (true);\r
- setContentOwned (c, true);\r
+ setContentOwned (c.release(), true);\r
\r
centreWithSize (getWidth(), getHeight());\r
\r
\r
Component* refreshComponentForRow (int row, bool selected, Component* existing) override\r
{\r
+ auto safePtr = rawToUniquePtr (existing);\r
+\r
if (isPositiveAndBelow (row, voiceProducts.size()))\r
{\r
- if (existing == nullptr)\r
- existing = new VoiceRow (purchases);\r
+ if (safePtr == nullptr)\r
+ safePtr = std::make_unique<VoiceRow> (purchases);\r
\r
- if (auto* voiceRow = dynamic_cast<VoiceRow*> (existing))\r
+ if (auto* voiceRow = dynamic_cast<VoiceRow*> (safePtr.get()))\r
voiceRow->update (row, selected);\r
\r
- return existing;\r
+ return safePtr.release();\r
}\r
\r
return nullptr;\r
voiceListBox.setRowHeight (66);\r
voiceListBox.selectRow (0);\r
voiceListBox.updateContent();\r
- voiceListBox.getViewport()->setScrollOnDragEnabled (true);\r
\r
addAndMakeVisible (phraseLabel);\r
addAndMakeVisible (phraseListBox);\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=0x60105]] [[-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=0x60106]] [[-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=0x60105]] [[-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=0x60106]] [[-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_gui_basics/mouse/juce_MouseInputSource.h"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h"
"../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"
"../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"
+ "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
- package="com.juce.AudioPerformanceTest">
+ package="com.juce.audioperformancetest">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPerformanceTest
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>\r
</ItemGroup>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
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=0x60105]] [[-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_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=0x60106]] [[-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_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=0x60105]] [[-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_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=0x60106]] [[-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_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_gui_basics/mouse/juce_MouseInputSource.h"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h"
"../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"
"../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"
+ "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY 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=0x60105" "-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_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/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=0x60106" "-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_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/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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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_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/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=0x60106" "-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_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/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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPluginHost
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
private AsyncUpdater\r
{\r
public:\r
- PluginScannerSubprocess()\r
- {\r
- formatManager.addDefaultFormats();\r
- }\r
-\r
using ChildProcessWorker::initialiseFromCommandLine;\r
\r
private:\r
void handleMessageFromCoordinator (const MemoryBlock& mb) override\r
{\r
+ if (mb.isEmpty())\r
+ return;\r
+\r
+ if (! doScan (mb))\r
{\r
- const std::lock_guard<std::mutex> lock (mutex);\r
- pendingBlocks.emplace (mb);\r
- }\r
+ {\r
+ const std::lock_guard<std::mutex> lock (mutex);\r
+ pendingBlocks.emplace (mb);\r
+ }\r
\r
- triggerAsyncUpdate();\r
+ triggerAsyncUpdate();\r
+ }\r
}\r
\r
void handleConnectionLost() override\r
JUCEApplicationBase::quit();\r
}\r
\r
- // It's important to run the plugin scan on the main thread!\r
void handleAsyncUpdate() override\r
{\r
for (;;)\r
if (block.isEmpty())\r
return;\r
\r
- MemoryInputStream stream { block, false };\r
- const auto formatName = stream.readString();\r
- const auto identifier = stream.readString();\r
+ doScan (block);\r
+ }\r
+ }\r
+\r
+ bool doScan (const MemoryBlock& block)\r
+ {\r
+ AudioPluginFormatManager formatManager;\r
+ formatManager.addDefaultFormats();\r
+\r
+ MemoryInputStream stream { block, false };\r
+ const auto formatName = stream.readString();\r
+ const auto identifier = stream.readString();\r
\r
- OwnedArray<PluginDescription> results;\r
+ PluginDescription pd;\r
+ pd.fileOrIdentifier = identifier;\r
+ pd.uniqueId = pd.deprecatedUid = 0;\r
\r
+ const auto matchingFormat = [&]() -> AudioPluginFormat*\r
+ {\r
for (auto* format : formatManager.getFormats())\r
if (format->getName() == formatName)\r
- format->findAllTypesForFile (results, identifier);\r
-\r
- XmlElement xml ("LIST");\r
+ return format;\r
\r
- for (const auto& desc : results)\r
- xml.addChildElement (desc->createXml().release());\r
+ return nullptr;\r
+ }();\r
\r
- const auto str = xml.toString();\r
- sendMessageToCoordinator ({ str.toRawUTF8(), str.getNumBytesAsUTF8() });\r
+ if (matchingFormat == nullptr\r
+ || (! MessageManager::getInstance()->isThisTheMessageThread()\r
+ && ! matchingFormat->requiresUnblockedMessageThreadDuringCreation (pd)))\r
+ {\r
+ return false;\r
}\r
+\r
+ OwnedArray<PluginDescription> results;\r
+ matchingFormat->findAllTypesForFile (results, identifier);\r
+ sendPluginDescriptions (results);\r
+ return true;\r
}\r
\r
- AudioPluginFormatManager formatManager;\r
+ void sendPluginDescriptions (const OwnedArray<PluginDescription>& results)\r
+ {\r
+ XmlElement xml ("LIST");\r
+\r
+ for (const auto& desc : results)\r
+ xml.addChildElement (desc->createXml().release());\r
+\r
+ const auto str = xml.toString();\r
+ sendMessageToCoordinator ({ str.toRawUTF8(), str.getNumBytesAsUTF8() });\r
+ }\r
\r
std::mutex mutex;\r
std::queue<MemoryBlock> pendingBlocks;\r
appProperties->setStorageParameters (options);\r
\r
mainWindow.reset (new MainHostWindow());\r
- mainWindow->setUsingNativeTitleBar (true);\r
\r
commandManager.registerAllCommandsForTarget (this);\r
commandManager.registerAllCommandsForTarget (mainWindow.get());\r
\r
//==============================================================================\r
class IOConfigurationWindow::InputOutputConfig : public Component,\r
- private ComboBox::Listener,\r
private Button::Listener,\r
private NumberedBoxes::Listener\r
{\r
layoutLabel.setFont (layoutLabel.getFont().withStyle (Font::bold));\r
enabledToggle.setClickingTogglesState (true);\r
\r
- layouts.addListener (this);\r
enabledToggle.addListener (this);\r
\r
addAndMakeVisible (layoutLabel);\r
{\r
name.setText (bus->getName(), NotificationType::dontSendNotification);\r
\r
- int i;\r
- for (i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i)\r
- if ((layouts.indexOfItemId(i) == -1) != bus->supportedLayoutWithChannels (i).isDisabled())\r
- break;\r
-\r
// supported layouts have changed\r
- if (i < AudioChannelSet::maxChannelsOfNamedLayout)\r
- {\r
- layouts.clear();\r
+ layouts.clear (dontSendNotification);\r
+ auto* menu = layouts.getRootMenu();\r
+\r
+ auto itemId = 1;\r
+ auto selectedId = -1;\r
\r
- for (i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i)\r
+ for (auto i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i)\r
+ {\r
+ for (const auto& set : AudioChannelSet::channelSetsWithNumberOfChannels (i))\r
{\r
- auto set = bus->supportedLayoutWithChannels (i);\r
+ if (bus->isLayoutSupported (set))\r
+ {\r
+ menu->addItem (PopupMenu::Item { set.getDescription() }\r
+ .setAction ([this, set] { applyBusLayout (set); })\r
+ .setID (itemId));\r
+ }\r
\r
- if (! set.isDisabled())\r
- layouts.addItem (set.getDescription(), i);\r
+ if (bus->getCurrentLayout() == set)\r
+ selectedId = itemId;\r
+\r
+ ++itemId;\r
}\r
}\r
\r
- layouts.setSelectedId (bus->getLastEnabledLayout().size());\r
+ layouts.setSelectedId (selectedId);\r
\r
const bool canBeDisabled = bus->isNumberOfChannelsSupported (0);\r
\r
}\r
\r
//==============================================================================\r
- void comboBoxChanged (ComboBox* combo) override\r
+ void applyBusLayout (const AudioChannelSet& set)\r
{\r
- if (combo == &layouts)\r
+ if (auto* p = owner.getAudioProcessor())\r
{\r
- if (auto* p = owner.getAudioProcessor())\r
+ if (auto* bus = p->getBus (isInput, currentBus))\r
{\r
- if (auto* bus = p->getBus (isInput, currentBus))\r
+ if (bus->setCurrentLayoutWithoutEnabling (set))\r
{\r
- auto selectedNumChannels = layouts.getSelectedId();\r
-\r
- if (selectedNumChannels != bus->getLastEnabledLayout().size())\r
- {\r
- if (isPositiveAndBelow (selectedNumChannels, AudioChannelSet::maxChannelsOfNamedLayout)\r
- && bus->setCurrentLayoutWithoutEnabling (bus->supportedLayoutWithChannels (selectedNumChannels)))\r
- {\r
- if (auto* config = owner.getConfig (! isInput))\r
- config->updateBusLayout();\r
+ if (auto* config = owner.getConfig (! isInput))\r
+ config->updateBusLayout();\r
\r
- owner.update();\r
- }\r
- }\r
+ owner.update();\r
}\r
}\r
}\r
void showPopupMenu()\r
{\r
menu.reset (new PopupMenu);\r
- menu->addItem (1, "Delete this filter");\r
- menu->addItem (2, "Disconnect all pins");\r
- menu->addItem (3, "Toggle Bypass");\r
+ menu->addItem ("Delete this filter", [this] { graph.graph.removeNode (pluginID); });\r
+ menu->addItem ("Disconnect all pins", [this] { graph.graph.disconnectNode (pluginID); });\r
+ menu->addItem ("Toggle Bypass", [this]\r
+ {\r
+ if (auto* node = graph.graph.getNodeForId (pluginID))\r
+ node->setBypassed (! node->isBypassed());\r
+\r
+ repaint();\r
+ });\r
\r
menu->addSeparator();\r
if (getProcessor()->hasEditor())\r
- menu->addItem (10, "Show plugin GUI");\r
+ menu->addItem ("Show plugin GUI", [this] { showWindow (PluginWindow::Type::normal); });\r
\r
- menu->addItem (11, "Show all programs");\r
- menu->addItem (12, "Show all parameters");\r
- menu->addItem (13, "Show debug log");\r
+ menu->addItem ("Show all programs", [this] { showWindow (PluginWindow::Type::programs); });\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 (autoScaleOptionAvailable)\r
addPluginAutoScaleOptionsSubMenu (dynamic_cast<AudioPluginInstance*> (getProcessor()), *menu);\r
\r
menu->addSeparator();\r
- menu->addItem (20, "Configure Audio I/O");\r
- menu->addItem (21, "Test state save/load");\r
-\r
- menu->showMenuAsync ({}, ModalCallbackFunction::create\r
- ([this] (int r) {\r
- switch (r)\r
- {\r
- case 1: graph.graph.removeNode (pluginID); break;\r
- case 2: graph.graph.disconnectNode (pluginID); break;\r
- case 3:\r
- {\r
- if (auto* node = graph.graph.getNodeForId (pluginID))\r
- node->setBypassed (! node->isBypassed());\r
+ menu->addItem ("Configure Audio I/O", [this] { showWindow (PluginWindow::Type::audioIO); });\r
+ menu->addItem ("Test state save/load", [this] { testStateSaveLoad(); });\r
\r
- repaint();\r
+ #if ! JUCE_IOS && ! JUCE_ANDROID\r
+ menu->addSeparator();\r
+ menu->addItem ("Save plugin state", [this] { savePluginState(); });\r
+ menu->addItem ("Load plugin state", [this] { loadPluginState(); });\r
+ #endif\r
\r
- break;\r
- }\r
- case 10: showWindow (PluginWindow::Type::normal); break;\r
- case 11: showWindow (PluginWindow::Type::programs); break;\r
- case 12: showWindow (PluginWindow::Type::generic) ; break;\r
- case 13: showWindow (PluginWindow::Type::debug); break;\r
- case 20: showWindow (PluginWindow::Type::audioIO); break;\r
- case 21: testStateSaveLoad(); break;\r
-\r
- default: break;\r
- }\r
- }));\r
+ menu->showMenuAsync ({});\r
}\r
\r
void testStateSaveLoad()\r
\r
void handleAsyncUpdate() override { repaint(); }\r
\r
+ void savePluginState()\r
+ {\r
+ fileChooser = std::make_unique<FileChooser> ("Save plugin state");\r
+\r
+ const auto onChosen = [ref = SafePointer<PluginComponent> (this)] (const FileChooser& chooser)\r
+ {\r
+ if (ref == nullptr)\r
+ return;\r
+\r
+ const auto result = chooser.getResult();\r
+\r
+ if (result == File())\r
+ return;\r
+\r
+ if (auto* node = ref->graph.graph.getNodeForId (ref->pluginID))\r
+ {\r
+ MemoryBlock block;\r
+ node->getProcessor()->getStateInformation (block);\r
+ result.replaceWithData (block.getData(), block.getSize());\r
+ }\r
+ };\r
+\r
+ fileChooser->launchAsync (FileBrowserComponent::saveMode | FileBrowserComponent::warnAboutOverwriting, onChosen);\r
+ }\r
+\r
+ void loadPluginState()\r
+ {\r
+ fileChooser = std::make_unique<FileChooser> ("Load plugin state");\r
+\r
+ const auto onChosen = [ref = SafePointer<PluginComponent> (this)] (const FileChooser& chooser)\r
+ {\r
+ if (ref == nullptr)\r
+ return;\r
+\r
+ const auto result = chooser.getResult();\r
+\r
+ if (result == File())\r
+ return;\r
+\r
+ if (auto* node = ref->graph.graph.getNodeForId (ref->pluginID))\r
+ {\r
+ if (auto stream = result.createInputStream())\r
+ {\r
+ MemoryBlock block;\r
+ stream->readIntoMemoryBlock (block);\r
+ node->getProcessor()->setStateInformation (block.getData(), (int) block.getSize());\r
+ }\r
+ }\r
+ };\r
+\r
+ fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles, onChosen);\r
+ }\r
+\r
GraphEditorPanel& panel;\r
PluginGraph& graph;\r
const AudioProcessorGraph::NodeID pluginID;\r
int numIns = 0, numOuts = 0;\r
DropShadowEffect shadow;\r
std::unique_ptr<PopupMenu> menu;\r
+ std::unique_ptr<FileChooser> fileChooser;\r
const String formatSuffix = getFormatSuffix (getProcessor());\r
};\r
\r
\r
setContentNonOwned (graphHolder.get(), false);\r
\r
+ setUsingNativeTitleBar (true);\r
+\r
restoreWindowStateFromString (getAppProperties().getUserSettings()->getValue ("mainWindowPos"));\r
\r
setVisible (true);\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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := BinaryBuilder
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105;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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
-Wsign-conversion -Wbool-conversion -Wextra-semi -Wunreachable-code
-Wcast-align -Wshift-sign-overflow -Wno-missing-field-initializers
-Wnullable-to-nonnull-conversion -Wno-ignored-qualifiers -Wswitch-enum
- -Wpedantic
+ -Wpedantic -Wdeprecated
$<$<OR:$<COMPILE_LANGUAGE:CXX>,$<COMPILE_LANGUAGE:OBJCXX>>:
-Wzero-as-null-pointer-constant -Wunused-private-field
-Woverloaded-virtual -Wreorder
_juce_append_target_property(file_content APP_SANDBOX_INHERIT ${target} JUCE_APP_SANDBOX_INHERIT)
_juce_append_target_property(file_content HARDENED_RUNTIME_OPTIONS ${target} JUCE_HARDENED_RUNTIME_OPTIONS)
_juce_append_target_property(file_content APP_SANDBOX_OPTIONS ${target} JUCE_APP_SANDBOX_OPTIONS)
+ _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_HOME_RO ${target} JUCE_APP_SANDBOX_FILE_ACCESS_HOME_RO)
+ _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_HOME_RW ${target} JUCE_APP_SANDBOX_FILE_ACCESS_HOME_RW)
+ _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_ABS_RO ${target} JUCE_APP_SANDBOX_FILE_ACCESS_ABS_RO)
+ _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_ABS_RW ${target} JUCE_APP_SANDBOX_FILE_ACCESS_ABS_RW)
_juce_append_target_property(file_content APP_GROUPS_ENABLED ${target} JUCE_APP_GROUPS_ENABLED)
_juce_append_target_property(file_content APP_GROUP_IDS ${target} JUCE_APP_GROUP_IDS)
_juce_append_target_property(file_content IS_PLUGIN ${target} JUCE_IS_PLUGIN)
string(LENGTH "${str}" string_length)
if(NOT "${string_length}" EQUAL "4")
- message(FATAL_ERROR "The ${help_text} code must contain exactly four characters, but it was set to '${str}'")
+ message(WARNING "The ${help_text} code must contain exactly four characters, but it was set to '${str}'")
endif()
# Round-tripping through a file is the simplest way to convert a string to hex...
file(READ "${scratch_file}" four_chars_hex HEX)
file(REMOVE "${scratch_file}")
- set(${out_var} ${four_chars_hex} PARENT_SCOPE)
+ string(SUBSTRING "${four_chars_hex}00000000" 0 8 four_chars_hex)
+ set(${out_var} "${four_chars_hex}" PARENT_SCOPE)
endfunction()
# ==================================================================================================
get_target_property(source "${target}" JUCE_PLUGIN_ARTEFACT_FILE)
if(source)
- get_target_property(dest "${target}" JUCE_PLUGIN_COPY_DIR)
+ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ add_custom_command(TARGET ${target} POST_BUILD
+ COMMAND "${CMAKE_COMMAND}"
+ "-Dsrc=${source}"
+ "-P" "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake"
+ VERBATIM)
+ endif()
+
+ get_target_property(dest "${target}" JUCE_PLUGIN_COPY_DIR)
if(dest)
_juce_copy_dir("${target}" "${source}" "$<GENEX_EVAL:${dest}>")
VST3_CATEGORIES
HARDENED_RUNTIME_OPTIONS
APP_SANDBOX_OPTIONS
+ APP_SANDBOX_FILE_ACCESS_HOME_RO
+ APP_SANDBOX_FILE_ACCESS_HOME_RW
+ APP_SANDBOX_FILE_ACCESS_ABS_RO
+ APP_SANDBOX_FILE_ACCESS_ABS_RW
DOCUMENT_EXTENSIONS
AAX_CATEGORY
IPHONE_SCREEN_ORIENTATIONS # iOS only
--- /dev/null
+# ==============================================================================
+#
+# This file is part of the JUCE library.
+# Copyright (c) 2020 - Raw Material Software Limited
+#
+# JUCE is an open source library subject to commercial or open-source
+# licensing.
+#
+# By using JUCE, you agree to the terms of both the JUCE 6 End-User License
+# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
+#
+# End User License Agreement: www.juce.com/juce-6-licence
+# Privacy Policy: www.juce.com/juce-privacy-policy
+#
+# Or: You may also use this code under the terms of the GPL v3 (see
+# www.gnu.org/licenses).
+#
+# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+# DISCLAIMED.
+#
+# ==============================================================================
+
+find_program(JUCE_XCRUN xcrun)
+
+if(NOT JUCE_XCRUN)
+ return()
+endif()
+
+execute_process(
+ COMMAND "${JUCE_XCRUN}" codesign --verify "${src}"
+ RESULT_VARIABLE result)
+
+if(result)
+ message(STATUS "Replacing invalid signature with ad-hoc signature")
+ execute_process(COMMAND "${JUCE_XCRUN}" codesign -s - "${src}")
+endif()
\r
ID: juce_build_tools\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE Build Tools\r
description: Classes for generating intermediate files for JUCE projects.\r
website: http://www.juce.com/juce\r
if (isAppGroupsEnabled)\r
{\r
auto appGroups = StringArray::fromTokens (appGroupIdString, ";", {});\r
- auto groups = String ("<array>");\r
+ String groups = "<array>";\r
\r
for (auto group : appGroups)\r
groups += "\n\t\t<string>" + group.trim() + "</string>";\r
{\r
// no other sandbox options can be specified if sandbox inheritance is enabled!\r
jassert (appSandboxOptions.isEmpty());\r
+ jassert (appSandboxTemporaryPaths.empty());\r
\r
entitlements.set ("com.apple.security.inherit", "<true/>");\r
}\r
\r
if (isAppSandboxEnabled)\r
+ {\r
for (auto& option : appSandboxOptions)\r
entitlements.set (option, "<true/>");\r
+\r
+ for (auto& option : appSandboxTemporaryPaths)\r
+ {\r
+ String paths = "<array>";\r
+\r
+ for (const auto& path : option.values)\r
+ paths += "\n\t\t<string>" + path + "</string>";\r
+\r
+ paths += "\n\t</array>";\r
+ entitlements.set (option.key, paths);\r
+ }\r
+ }\r
}\r
\r
if (isNetworkingMulticastEnabled)\r
StringArray hardenedRuntimeOptions;\r
StringArray appSandboxOptions;\r
\r
+ struct KeyAndStringArray\r
+ {\r
+ String key;\r
+ StringArray values;\r
+ };\r
+\r
+ std::vector<KeyAndStringArray> appSandboxTemporaryPaths;\r
+\r
private:\r
StringPairArray getEntitlements() const;\r
};\r
# environment variables, which is unfortunate because we really don't want to cross-compile
# juceaide. If you really want to set the compilers for juceaide, pass the appropriate
# CMAKE_<lang>_COMPILER flags when configuring CMake.
- if((CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "iOS"))
+ if(CMAKE_CROSSCOMPILING)
unset(ENV{ASM})
unset(ENV{CC})
unset(ENV{CXX})
+ else()
+ # When building with clang-cl in Clion on Windows for an x64 target, the ABI detection phase
+ # of the inner build can fail unless we pass through these flags too
+ set(extra_configure_flags
+ "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
+ "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
+ "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}"
+ "-DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}")
endif()
message(STATUS "Configuring juceaide")
"-DCMAKE_BUILD_TYPE=Debug"
"-DJUCE_BUILD_HELPER_TOOLS=ON"
"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
+ ${extra_configure_flags}
WORKING_DIRECTORY "${JUCE_SOURCE_DIR}"
OUTPUT_VARIABLE command_output
ERROR_VARIABLE command_output
updateField ("APP_SANDBOX_OPTIONS", result.appSandboxOptions);\r
updateField ("NETWORK_MULTICAST_ENABLED", result.isNetworkingMulticastEnabled);\r
\r
+ struct SandboxTemporaryAccessKey\r
+ {\r
+ juce::String cMakeVar, key;\r
+ };\r
+\r
+ SandboxTemporaryAccessKey sandboxTemporaryAccessKeys[]\r
+ {\r
+ { "APP_SANDBOX_FILE_ACCESS_HOME_RO", "home-relative-path.read-only" },\r
+ { "APP_SANDBOX_FILE_ACCESS_HOME_RW", "home-relative-path.read-write" },\r
+ { "APP_SANDBOX_FILE_ACCESS_ABS_RO", "absolute-path.read-only" },\r
+ { "APP_SANDBOX_FILE_ACCESS_ABS_RW", "absolute-path.read-write" }\r
+ };\r
+\r
+ for (const auto& entry : sandboxTemporaryAccessKeys)\r
+ {\r
+ juce::StringArray values;\r
+ updateField (entry.cMakeVar, values);\r
+\r
+ if (! values.isEmpty())\r
+ result.appSandboxTemporaryPaths.push_back ({ "com.apple.security.temporary-exception.files." + entry.key,\r
+ std::move (values) });\r
+ }\r
+\r
result.type = type;\r
\r
return result;\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=0x60105]] [[-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=0x60106]] [[-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=0x60105]] [[-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=0x60106]] [[-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_gui_basics/mouse/juce_MouseInputSource.h"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp"
"../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h"
"../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"
"../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"
"../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"
+ "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h"
"../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"
"../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
- package="com.juce.NetworkGraphicsDemo">
+ package="com.juce.networkgraphicsdemo">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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=0x60106" "-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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
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=0x60105" "-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=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(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=0x60106" "-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=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(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=0x60106" "-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=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := Projucer
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.5</string>\r
+ <string>6.1.6</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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=6.1.5",
- "JUCE_APP_VERSION_HEX=0x60105",
+ "JUCE_APP_VERSION=6.1.6",
+ "JUCE_APP_VERSION_HEX=0x60106",
"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=0x60105;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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/>\r
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,5,0\r
+FILEVERSION 6,1,6,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", "6.1.5\0"\r
+ VALUE "FileVersion", "6.1.6\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.5\0"\r
+ VALUE "ProductVersion", "6.1.6\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 = "6.1.5";\r
- const int versionNumber = 0x60105;\r
+ const char* const versionString = "6.1.6";\r
+ const int versionNumber = 0x60106;\r
}\r
#endif\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
- version="6.1.5" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+ version="6.1.6" 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
auto screenLimits = Desktop::getInstance().getDisplays().getDisplayForRect (windowBounds)->userArea;\r
\r
if (auto* peer = windowToCheck.getPeer())\r
- peer->getFrameSize().subtractFrom (screenLimits);\r
+ if (const auto frameSize = peer->getFrameSizeIfPresent())\r
+ frameSize->subtractFrom (screenLimits);\r
\r
auto constrainedX = jlimit (screenLimits.getX(), jmax (screenLimits.getX(), screenLimits.getRight() - windowBounds.getWidth()), windowBounds.getX());\r
auto constrainedY = jlimit (screenLimits.getY(), jmax (screenLimits.getY(), screenLimits.getBottom() - windowBounds.getHeight()), windowBounds.getY());\r
findPanel = (1 << 2)\r
};\r
\r
- AdditionalComponents with (Type t)\r
+ JUCE_NODISCARD AdditionalComponents with (Type t)\r
{\r
auto copy = *this;\r
copy.componentTypes |= t;\r
\r
for (auto& pp : properties)\r
{\r
- const auto propertyHeight = pp->getPreferredHeight()\r
- + (getHeightMultiplier (pp.get()) * pp->getPreferredHeight());\r
+ const auto propertyHeight = jmax (pp->getPreferredHeight(), getApproximateLabelHeight (*pp));\r
\r
auto iter = std::find_if (propertyComponentsWithInfo.begin(), propertyComponentsWithInfo.end(),\r
[&pp] (const std::unique_ptr<PropertyAndInfoWrapper>& w) { return &w->propertyComponent == pp.get(); });\r
}\r
}\r
\r
- int getHeightMultiplier (PropertyComponent* pp)\r
+ static int getApproximateLabelHeight (const PropertyComponent& pp)\r
{\r
auto availableTextWidth = ProjucerLookAndFeel::getTextWidthForPropertyComponent (pp);\r
\r
- auto font = ProjucerLookAndFeel::getPropertyComponentFont();\r
- auto nameWidth = font.getStringWidthFloat (pp->getName());\r
-\r
if (availableTextWidth == 0)\r
return 0;\r
\r
- return static_cast<int> (nameWidth / (float) availableTextWidth);\r
+ const auto font = ProjucerLookAndFeel::getPropertyComponentFont();\r
+ const auto labelWidth = font.getStringWidthFloat (pp.getName());\r
+ const auto numLines = (int) (labelWidth / (float) availableTextWidth) + 1;\r
+ return (int) std::round ((float) numLines * font.getHeight() * 1.1f);\r
}\r
\r
//==============================================================================\r
}\r
}\r
\r
+void Project::updateCodeWarning (Identifier identifier, String value)\r
+{\r
+ if (value.length() != 4 || value.toStdString().size() != 4)\r
+ addProjectMessage (identifier, {});\r
+ else\r
+ removeProjectMessage (identifier);\r
+}\r
+\r
void Project::updateModuleWarnings()\r
{\r
auto& modules = getEnabledModules();\r
{\r
updateModuleWarnings();\r
}\r
+ else if (property == Ids::pluginCode)\r
+ {\r
+ updateCodeWarning (ProjectMessages::Ids::pluginCodeInvalid, pluginCodeValue.get());\r
+ }\r
+ else if (property == Ids::pluginManufacturerCode)\r
+ {\r
+ updateCodeWarning (ProjectMessages::Ids::manufacturerCodeInvalid, pluginManufacturerCodeValue.get());\r
+ }\r
}\r
\r
changed();\r
uint32 hexRepresentation = 0;\r
\r
for (int i = 0; i < 4; ++i)\r
- hexRepresentation = (hexRepresentation << 8u)\r
- | (static_cast<unsigned int> (fourCharCode[i]) & 0xffu);\r
+ {\r
+ const auto character = (unsigned int) (i < fourCharCode.length() ? fourCharCode[i] : 0);\r
+ hexRepresentation = (hexRepresentation << 8u) | (character & 0xffu);\r
+ }\r
\r
return "0x" + String::toHexString (static_cast<int> (hexRepresentation));\r
};\r
DECLARE_ID (oldProjucer);\r
DECLARE_ID (cLion);\r
DECLARE_ID (newVersionAvailable);\r
+ DECLARE_ID (pluginCodeInvalid);\r
+ DECLARE_ID (manufacturerCodeInvalid);\r
\r
DECLARE_ID (notification);\r
DECLARE_ID (warning);\r
{\r
static Identifier warnings[] = { Ids::incompatibleLicense, Ids::cppStandard, Ids::moduleNotFound,\r
Ids::jucePath, Ids::jucerFileModified, Ids::missingModuleDependencies,\r
- Ids::oldProjucer, Ids::cLion };\r
+ Ids::oldProjucer, Ids::cLion, Ids::pluginCodeInvalid, Ids::manufacturerCodeInvalid };\r
\r
if (std::find (std::begin (warnings), std::end (warnings), message) != std::end (warnings))\r
return Ids::warning;\r
if (message == Ids::oldProjucer) return "Projucer Out of Date";\r
if (message == Ids::newVersionAvailable) return "New Version Available";\r
if (message == Ids::cLion) return "Deprecated Exporter";\r
+ if (message == Ids::pluginCodeInvalid) return "Invalid Plugin Code";\r
+ if (message == Ids::manufacturerCodeInvalid) return "Invalid Manufacturer Code";\r
\r
jassertfalse;\r
return {};\r
if (message == Ids::oldProjucer) return "The version of the Projucer you are using is out of date.";\r
if (message == Ids::newVersionAvailable) return "A new version of JUCE is available to download.";\r
if (message == Ids::cLion) return "The CLion exporter is deprecated. Use JUCE's CMake support instead.";\r
+ if (message == Ids::pluginCodeInvalid) return "The plugin code should be exactly four characters in length.";\r
+ if (message == Ids::manufacturerCodeInvalid) return "The manufacturer code should be exactly four characters in length.";\r
\r
jassertfalse;\r
return {};\r
void updateOldProjucerWarning (bool showWarning);\r
void updateCLionWarning (bool showWarning);\r
void updateModuleNotFoundWarning (bool showWarning);\r
+ void updateCodeWarning (Identifier identifier, String value);\r
\r
ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {},\r
{ { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } };\r
setAttributeIfNotPresent (*manifest, "xmlns:android", "http://schemas.android.com/apk/res/android");\r
setAttributeIfNotPresent (*manifest, "android:versionCode", androidVersionCode.get());\r
setAttributeIfNotPresent (*manifest, "android:versionName", project.getVersionString());\r
- setAttributeIfNotPresent (*manifest, "package", project.getBundleIdentifierString());\r
+ setAttributeIfNotPresent (*manifest, "package", project.getBundleIdentifierString().toLowerCase());\r
\r
return manifest;\r
}\r
return str;\r
}\r
\r
+inline StringArray msBuildEscape (StringArray range)\r
+{\r
+ for (auto& i : range)\r
+ i = msBuildEscape (i);\r
+\r
+ return range;\r
+}\r
+\r
//==============================================================================\r
class MSVCProjectExporterBase : public ProjectExporter\r
{\r
intdir->addTextElement (build_tools::windowsStylePath (intermediatesPath));\r
}\r
\r
-\r
{\r
auto* targetName = props->createNewChildElement ("TargetName");\r
setConditionAttribute (*targetName, config);\r
return librarySearchPaths;\r
}\r
\r
+ /* Libraries specified in the Projucer don't get escaped automatically.\r
+ To include a special character in the name of a library,\r
+ you must use the appropriate escape code instead.\r
+ Module and shared code library names are not preprocessed.\r
+ Special characters in the names of these libraries will be toEscape\r
+ as appropriate.\r
+ */\r
StringArray getExternalLibraries (const MSVCBuildConfiguration& config, const StringArray& otherLibs) const\r
{\r
- const auto sharedCodeLib = [&]() -> StringArray\r
- {\r
- if (type != SharedCodeTarget)\r
- if (auto* shared = getOwner().getSharedCodeTarget())\r
- return { shared->getBinaryNameWithSuffix (config, false) };\r
-\r
- return {};\r
- }();\r
-\r
auto result = otherLibs;\r
- result.addArray (getOwner().getModuleLibs());\r
- result.addArray (sharedCodeLib);\r
\r
for (auto& i : result)\r
- i = msBuildEscape (getOwner().replacePreprocessorTokens (config, i).trim());\r
+ i = getOwner().replacePreprocessorTokens (config, i).trim();\r
+\r
+ result.addArray (msBuildEscape (getOwner().getModuleLibs()));\r
+\r
+ if (type != SharedCodeTarget)\r
+ if (auto* shared = getOwner().getSharedCodeTarget())\r
+ result.add (msBuildEscape (shared->getBinaryNameWithSuffix (config, false)));\r
\r
return result;\r
}\r
appSandboxValue (settings, Ids::appSandbox, getUndoManager()),\r
appSandboxInheritanceValue (settings, Ids::appSandboxInheritance, getUndoManager()),\r
appSandboxOptionsValue (settings, Ids::appSandboxOptions, getUndoManager(), Array<var>(), ","),\r
+ appSandboxHomeDirROValue (settings, Ids::appSandboxHomeDirRO, getUndoManager()),\r
+ appSandboxHomeDirRWValue (settings, Ids::appSandboxHomeDirRW, getUndoManager()),\r
+ appSandboxAbsDirROValue (settings, Ids::appSandboxAbsDirRO, getUndoManager()),\r
+ appSandboxAbsDirRWValue (settings, Ids::appSandboxAbsDirRW, getUndoManager()),\r
hardenedRuntimeValue (settings, Ids::hardenedRuntime, getUndoManager()),\r
hardenedRuntimeOptionsValue (settings, Ids::hardenedRuntimeOptions, getUndoManager(), Array<var>(), ","),\r
microphonePermissionNeededValue (settings, Ids::microphonePermissionNeeded, getUndoManager()),\r
bool isAppSandboxInhertianceEnabled() const { return appSandboxInheritanceValue.get(); }\r
Array<var> getAppSandboxOptions() const { return *appSandboxOptionsValue.get().getArray(); }\r
\r
+ auto getAppSandboxTemporaryPaths() const\r
+ {\r
+ std::vector<build_tools::EntitlementOptions::KeyAndStringArray> result;\r
+\r
+ for (const auto& entry : sandboxFileAccessProperties)\r
+ {\r
+ auto paths = getCommaOrWhitespaceSeparatedItems (entry.property.get());\r
+\r
+ if (! paths.isEmpty())\r
+ result.push_back ({ "com.apple.security.temporary-exception.files." + entry.key, std::move (paths) });\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
Array<var> getValidArchs() const { return *validArchsValue.get().getArray(); }\r
\r
bool isMicrophonePermissionEnabled() const { return microphonePermissionNeededValue.get(); }\r
{ "Temporary Exception: Audio Unit Hosting", "temporary-exception.audio-unit-host" },\r
{ "Temporary Exception: Global Mach Service", "temporary-exception.mach-lookup.global-name" },\r
{ "Temporary Exception: Global Mach Service Dynamic Registration", "temporary-exception.mach-register.global-name" },\r
- { "Temporary Exception: Home Directory File Access (Read Only)", "temporary-exception.files.home-relative-path.read-only" },\r
- { "Temporary Exception: Home Directory File Access (Read/Write)", "temporary-exception.files.home-relative-path.read-write" },\r
- { "Temporary Exception: Absolute Path File Access (Read Only)", "temporary-exception.files.absolute-path.read-only" },\r
- { "Temporary Exception: Absolute Path File Access (Read/Write)", "temporary-exception.files.absolute-path.read-write" },\r
{ "Temporary Exception: IOKit User Client Class", "temporary-exception.iokit-user-client-class" },\r
{ "Temporary Exception: Shared Preference Domain (Read Only)", "temporary-exception.shared-preference.read-only" },\r
{ "Temporary Exception: Shared Preference Domain (Read/Write)", "temporary-exception.shared-preference.read-write" }\r
};\r
\r
StringArray sandboxKeys;\r
- Array<var> sanboxValues;\r
+ Array<var> sandboxValues;\r
\r
for (auto& opt : sandboxOptions)\r
{\r
sandboxKeys.add (opt.first);\r
- sanboxValues.add ("com.apple.security." + opt.second);\r
+ sandboxValues.add ("com.apple.security." + opt.second);\r
}\r
\r
props.add (new MultiChoicePropertyComponentWithEnablement (appSandboxOptionsValue,\r
appSandboxValue,\r
"App Sandbox Options",\r
sandboxKeys,\r
- sanboxValues));\r
+ sandboxValues));\r
+\r
+ for (const auto& entry : sandboxFileAccessProperties)\r
+ {\r
+ props.add (new TextPropertyComponentWithEnablement (entry.property,\r
+ appSandboxValue,\r
+ entry.label,\r
+ 8192,\r
+ true),\r
+ "A list of the corresponding paths (separated by newlines or whitespace). "\r
+ "See Apple's File Access Temporary Exceptions documentation.");\r
+ }\r
\r
props.add (new ChoicePropertyComponent (hardenedRuntimeValue, "Use Hardened Runtime"),\r
"Enable this to use the hardened runtime required for app notarization.");\r
options.appGroupIdString = getAppGroupIdString();\r
options.hardenedRuntimeOptions = getHardenedRuntimeOptions();\r
options.appSandboxOptions = getAppSandboxOptions();\r
+ options.appSandboxTemporaryPaths = getAppSandboxTemporaryPaths();\r
\r
const auto entitlementsFile = getTargetFolder().getChildFile (target.getEntitlementsFilename());\r
build_tools::overwriteFileIfDifferentOrThrow (entitlementsFile, options.getEntitlementsFileContent());\r
duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue,\r
iPadScreenOrientationValue, customXcodeResourceFoldersValue, customXcassetsFolderValue,\r
appSandboxValue, appSandboxInheritanceValue, appSandboxOptionsValue,\r
+ appSandboxHomeDirROValue, appSandboxHomeDirRWValue, appSandboxAbsDirROValue, appSandboxAbsDirRWValue,\r
hardenedRuntimeValue, hardenedRuntimeOptionsValue,\r
microphonePermissionNeededValue, microphonePermissionsTextValue,\r
cameraPermissionNeededValue, cameraPermissionTextValue,\r
networkingMulticastValue, iosDevelopmentTeamIDValue, iosAppGroupsIDValue, keepCustomXcodeSchemesValue, useHeaderMapValue, customLaunchStoryboardValue,\r
exporterBundleIdentifierValue, suppressPlistResourceUsageValue, useLegacyBuildSystemValue, buildNumber;\r
\r
+ struct SandboxFileAccessProperty\r
+ {\r
+ const ValueTreePropertyWithDefault& property;\r
+ const String label, key;\r
+ };\r
+\r
+ const std::vector<SandboxFileAccessProperty> sandboxFileAccessProperties\r
+ {\r
+ { appSandboxHomeDirROValue, "App sandbox temporary exception: home directory read only file access", "home-relative-path.read-only" },\r
+ { appSandboxHomeDirRWValue, "App sandbox temporary exception: home directory read/write file access", "home-relative-path.read-write" },\r
+ { appSandboxAbsDirROValue, "App sandbox temporary exception: absolute path read only file access", "absolute-path.read-only" },\r
+ { appSandboxAbsDirRWValue, "App sandbox temporary exception: absolute path read/write file access", "absolute-path.read-write" }\r
+ };\r
+\r
JUCE_DECLARE_NON_COPYABLE (XcodeProjectExporter)\r
};\r
\r
if (errors.isEmpty())\r
{\r
- if (project.isAudioPluginProject())\r
- {\r
- const auto isInvalidCode = [] (String code)\r
- {\r
- return code.length() != 4 || code.toStdString().size() != 4;\r
- };\r
-\r
- if (isInvalidCode (project.getPluginManufacturerCodeString()))\r
- return Result::fail ("The plugin manufacturer code must contain exactly four characters.");\r
-\r
- if (isInvalidCode (project.getPluginCodeString()))\r
- return Result::fail ("The plugin code must contain exactly four characters.");\r
- }\r
-\r
if (project.isAudioPluginProject())\r
{\r
if (project.shouldBuildUnityPlugin())\r
DECLARE_ID (appSandbox);\r
DECLARE_ID (appSandboxInheritance);\r
DECLARE_ID (appSandboxOptions);\r
+ DECLARE_ID (appSandboxHomeDirRO);\r
+ DECLARE_ID (appSandboxHomeDirRW);\r
+ DECLARE_ID (appSandboxAbsDirRO);\r
+ DECLARE_ID (appSandboxAbsDirRW);\r
DECLARE_ID (hardenedRuntime);\r
DECLARE_ID (hardenedRuntimeOptions);\r
DECLARE_ID (microphonePermissionNeeded);\r
return 120;\r
}\r
\r
-void ProjucerLookAndFeel::drawPropertyComponentLabel (Graphics& g, int width, int height, PropertyComponent& component)\r
+void ProjucerLookAndFeel::drawPropertyComponentLabel (Graphics& g, int, int height, PropertyComponent& component)\r
{\r
- ignoreUnused (width);\r
-\r
g.setColour (component.findColour (defaultTextColourId)\r
.withMultipliedAlpha (component.isEnabled() ? 1.0f : 0.6f));\r
\r
- auto textWidth = getTextWidthForPropertyComponent (&component);\r
+ auto textWidth = getTextWidthForPropertyComponent (component);\r
\r
g.setFont (getPropertyComponentFont());\r
- g.drawFittedText (component.getName(), 0, 0, textWidth - 5, height, Justification::centredLeft, 5, 1.0f);\r
+ g.drawFittedText (component.getName(), 0, 0, textWidth, height, Justification::centredLeft, 5, 1.0f);\r
}\r
\r
Rectangle<int> ProjucerLookAndFeel::getPropertyComponentContentPosition (PropertyComponent& component)\r
{\r
- const auto textW = getTextWidthForPropertyComponent (&component);\r
- return { textW, 0, component.getWidth() - textW, component.getHeight() - 1 };\r
+ const auto paddedTextW = getTextWidthForPropertyComponent (component) + 5;\r
+ return { paddedTextW , 0, component.getWidth() - paddedTextW, component.getHeight() - 1 };\r
}\r
\r
void ProjucerLookAndFeel::drawButtonBackground (Graphics& g,\r
const bool filled, const Justification justification);\r
static Path getChoiceComponentArrowPath (Rectangle<float> arrowZone);\r
\r
- static Font getPropertyComponentFont() { return { 14.0f, Font::FontStyleFlags::bold }; }\r
- static int getTextWidthForPropertyComponent (PropertyComponent* pp) { return jmin (200, pp->getWidth() / 2); }\r
+ static Font getPropertyComponentFont() { return { 14.0f, Font::FontStyleFlags::bold }; }\r
+ static int getTextWidthForPropertyComponent (const PropertyComponent& pc) { return jmin (200, pc.getWidth() / 2); }\r
\r
static ColourScheme getProjucerDarkColourScheme()\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=0x60105" "-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_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../../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=0x60106" "-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_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../../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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=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=0x60105" "-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_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../../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=0x60106" "-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_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../../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_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := UnitTestRunner
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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=0x60105",
+ "JUCE_PROJUCER_VERSION=0x60106",
"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>..\..\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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
<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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
<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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;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_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=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=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Matrix3D.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_MouseListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_PointerState.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h">\r
<Filter>JUCE Modules\juce_gui_basics\mouse</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h">\r
+ <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h">\r
<Filter>JUCE Modules\juce_gui_extra</Filter>\r
</ClInclude>\r
\r
ID: juce_analytics\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE analytics classes\r
description: Classes to collect analytics and send to destinations\r
website: http://www.juce.com/juce\r
double getEffectiveRate() const { return pulldown ? (double) base / 1.001 : (double) base; }\r
\r
/** Returns a copy of this object with the specified base rate. */\r
- FrameRate withBaseRate (int x) const { return with (&FrameRate::base, x); }\r
+ JUCE_NODISCARD FrameRate withBaseRate (int x) const { return with (&FrameRate::base, x); }\r
\r
/** Returns a copy of this object with drop frames enabled or disabled, as specified. */\r
- FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); }\r
+ JUCE_NODISCARD FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); }\r
\r
/** Returns a copy of this object with pulldown enabled or disabled, as specified. */\r
- FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); }\r
+ JUCE_NODISCARD FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); }\r
\r
/** Returns true if this instance is equal to other. */\r
bool operator== (const FrameRate& other) const\r
{\r
retval.add (AudioChannelSet::discreteChannels (numChannels));\r
\r
- if (numChannels == 1)\r
+ retval.addArray ([numChannels]() -> Array<AudioChannelSet>\r
{\r
- retval.add (AudioChannelSet::mono());\r
- }\r
- else if (numChannels == 2)\r
- {\r
- retval.add (AudioChannelSet::stereo());\r
- }\r
- else if (numChannels == 3)\r
- {\r
- retval.add (AudioChannelSet::createLCR());\r
- retval.add (AudioChannelSet::createLRS());\r
- }\r
- else if (numChannels == 4)\r
- {\r
- retval.add (AudioChannelSet::quadraphonic());\r
- retval.add (AudioChannelSet::createLCRS());\r
- }\r
- else if (numChannels == 5)\r
- {\r
- retval.add (AudioChannelSet::create5point0());\r
- retval.add (AudioChannelSet::pentagonal());\r
- }\r
- else if (numChannels == 6)\r
- {\r
- retval.add (AudioChannelSet::create5point1());\r
- retval.add (AudioChannelSet::create6point0());\r
- retval.add (AudioChannelSet::create6point0Music());\r
- retval.add (AudioChannelSet::hexagonal());\r
- }\r
- else if (numChannels == 7)\r
- {\r
- retval.add (AudioChannelSet::create7point0());\r
- retval.add (AudioChannelSet::create7point0SDDS());\r
- retval.add (AudioChannelSet::create6point1());\r
- retval.add (AudioChannelSet::create6point1Music());\r
- }\r
- else if (numChannels == 8)\r
- {\r
- retval.add (AudioChannelSet::create7point1());\r
- retval.add (AudioChannelSet::create7point1SDDS());\r
- retval.add (AudioChannelSet::octagonal());\r
- }\r
+ switch (numChannels)\r
+ {\r
+ case 1:\r
+ return { AudioChannelSet::mono() };\r
+ case 2:\r
+ return { AudioChannelSet::stereo() };\r
+ case 3:\r
+ return { AudioChannelSet::createLCR(),\r
+ AudioChannelSet::createLRS() };\r
+ case 4:\r
+ return { AudioChannelSet::quadraphonic(),\r
+ AudioChannelSet::createLCRS() };\r
+ case 5:\r
+ return { AudioChannelSet::create5point0(),\r
+ AudioChannelSet::pentagonal() };\r
+ case 6:\r
+ return { AudioChannelSet::create5point1(),\r
+ AudioChannelSet::create6point0(),\r
+ AudioChannelSet::create6point0Music(),\r
+ AudioChannelSet::hexagonal() };\r
+ case 7:\r
+ return { AudioChannelSet::create7point0(),\r
+ AudioChannelSet::create7point0SDDS(),\r
+ AudioChannelSet::create6point1(),\r
+ AudioChannelSet::create6point1Music() };\r
+ case 8:\r
+ return { AudioChannelSet::create7point1(),\r
+ AudioChannelSet::create7point1SDDS(),\r
+ AudioChannelSet::octagonal(),\r
+ AudioChannelSet::create5point1point2() };\r
+ case 9:\r
+ return { AudioChannelSet::create7point0point2() };\r
+ case 10:\r
+ return { AudioChannelSet::create5point1point4(),\r
+ AudioChannelSet::create7point1point2() };\r
+ case 11:\r
+ return { AudioChannelSet::create7point0point4() };\r
+ case 12:\r
+ return { AudioChannelSet::create7point1point4() };\r
+ case 14:\r
+ return { AudioChannelSet::create7point1point6() };\r
+ case 16:\r
+ return { AudioChannelSet::create9point1point6() };\r
+ }\r
+\r
+ return {};\r
+ }());\r
\r
auto order = getAmbisonicOrderForNumChannels (numChannels);\r
if (order >= 0)\r
\r
ID: juce_audio_basics\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
void findAllTimeSigEvents (MidiMessageSequence& timeSigEvents) const;\r
\r
- /** Makes a list of all the time-signature meta-events from all tracks in the midi file.\r
+ /** Makes a list of all the key-signature meta-events from all tracks in the midi file.\r
@param keySigEvents a list to which all the events will be added\r
*/\r
void findAllKeySigEvents (MidiMessageSequence& keySigEvents) const;\r
/** Constructor. */\r
SmoothedValueBase() = default;\r
\r
- virtual ~SmoothedValueBase() {}\r
-\r
//==============================================================================\r
/** Returns true if the current value is currently being interpolated. */\r
bool isSmoothing() const noexcept { return countdown > 0; }\r
\r
ID: juce_audio_devices\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
newCallback->audioDeviceAboutToStart (this);\r
\r
const ScopedLock sl (callbackLock);\r
- previousCallback = std::exchange (callback, newCallback);\r
+ previousCallback = callback = newCallback;\r
}\r
}\r
\r
const char* const WavAudioFormat::riffInfoWrittenBy = "IWRI";\r
const char* const WavAudioFormat::riffInfoYear = "YEAR";\r
\r
-const char* const WavAudioFormat::ISRC = "ISRC";\r
-const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info";\r
+const char* const WavAudioFormat::ISRC = "ISRC";\r
+const char* const WavAudioFormat::internationalStandardRecordingCode = "international standard recording code";\r
+const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info";\r
\r
//==============================================================================\r
namespace WavFileHelpers\r
auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
\r
if (ISRCCode.isNotEmpty())\r
- destValues[WavAudioFormat::ISRC] = ISRCCode;\r
+ {\r
+ // We set ISRC here for backwards compatibility.\r
+ // If the INFO 'source' field is set in the info chunk, then the\r
+ // value for this key will be overwritten later.\r
+ destValues[WavAudioFormat::riffInfoSource] = destValues[WavAudioFormat::internationalStandardRecordingCode] = ISRCCode;\r
+ }\r
}\r
}\r
}\r
\r
static MemoryBlock createFrom (const StringMap& values)\r
{\r
- auto ISRC = getValueWithDefault (values, WavAudioFormat::ISRC);\r
+ // Use the new ISRC key if it is present, but fall back to the\r
+ // INFO 'source' value for backwards compatibility.\r
+ auto ISRC = getValueWithDefault (values,\r
+ WavAudioFormat::internationalStandardRecordingCode,\r
+ getValueWithDefault (values, WavAudioFormat::riffInfoSource));\r
+\r
MemoryOutputStream xml;\r
\r
if (ISRC.isNotEmpty())\r
{\r
+ // If you are trying to set the ISRC, make sure that you are using\r
+ // WavAudioFormat::internationalStandardRecordingCode as the metadata key,\r
+ // and that the value is 12 characters long. If you are trying to set the\r
+ // 'source' field in the INFO chunk, set the\r
+ // WavAudioFormat::internationalStandardRecordingCode metadata field to the\r
+ // empty string to silence this assertion.\r
+ jassert (ISRC.length() == 12);\r
+\r
xml << "<ebucore:ebuCoreMain xmlns:dc=\" http://purl.org/dc/elements/1.1/\" "\r
"xmlns:ebucore=\"urn:ebu:metadata-schema:ebuCore_2012\">"\r
"<ebucore:coreMetadata>"\r
for (int i = numElementsInArray (WavFileHelpers::ListInfoChunk::types); --i >= 0;)\r
metadataValues[WavFileHelpers::ListInfoChunk::types[i]] = WavFileHelpers::ListInfoChunk::types[i];\r
\r
+ metadataValues[WavAudioFormat::internationalStandardRecordingCode] = WavAudioFormat::internationalStandardRecordingCode;\r
+\r
if (metadataValues.size() > 0)\r
metadataValues["MetaDataSource"] = "WAV";\r
\r
metadataArray.addUnorderedMap (metadataValues);\r
\r
{\r
- beginTest ("Creating a basic wave writer");\r
+ beginTest ("Metadata can be written and read");\r
\r
- std::unique_ptr<AudioFormatWriter> writer (format.createWriterFor (new MemoryOutputStream (memoryBlock, false),\r
- 44100.0, numTestAudioBufferChannels,\r
- 32, metadataArray, 0));\r
- expect (writer != nullptr);\r
+ const auto newMetadata = getMetadataAfterReading (format, writeToBlock (format, metadataArray));\r
+ expect (newMetadata == metadataArray, "Somehow, the metadata is different!");\r
+ }\r
\r
- AudioBuffer<float> buffer (numTestAudioBufferChannels, numTestAudioBufferSamples);\r
- buffer.clear();\r
+ {\r
+ beginTest ("Files containing a riff info source and an empty ISRC associate the source with the riffInfoSource key");\r
+ StringPairArray meta;\r
+ meta.addMap ({ { WavAudioFormat::riffInfoSource, "customsource" },\r
+ { WavAudioFormat::internationalStandardRecordingCode, "" } });\r
+ const auto mb = writeToBlock (format, meta);\r
+ checkPatternsPresent (mb, { "INFOISRC" });\r
+ checkPatternsNotPresent (mb, { "ISRC:", "<ebucore" });\r
+ const auto a = getMetadataAfterReading (format, mb);\r
+ expect (a[WavAudioFormat::riffInfoSource] == "customsource");\r
+ expect (a[WavAudioFormat::internationalStandardRecordingCode] == "");\r
+ }\r
\r
- beginTest ("Writing audio data to the basic wave writer");\r
- expect (writer->writeFromAudioSampleBuffer (buffer, 0, numTestAudioBufferSamples));\r
+ {\r
+ beginTest ("Files containing a riff info source and no ISRC associate the source with both keys "\r
+ "for backwards compatibility");\r
+ StringPairArray meta;\r
+ meta.addMap ({ { WavAudioFormat::riffInfoSource, "customsource" } });\r
+ const auto mb = writeToBlock (format, meta);\r
+ checkPatternsPresent (mb, { "INFOISRC", "ISRC:customsource", "<ebucore" });\r
+ const auto a = getMetadataAfterReading (format, mb);\r
+ expect (a[WavAudioFormat::riffInfoSource] == "customsource");\r
+ expect (a[WavAudioFormat::internationalStandardRecordingCode] == "customsource");\r
}\r
\r
{\r
- beginTest ("Creating a basic wave reader");\r
+ beginTest ("Files containing an ISRC associate the value with the internationalStandardRecordingCode key "\r
+ "and the riffInfoSource key for backwards compatibility");\r
+ StringPairArray meta;\r
+ meta.addMap ({ { WavAudioFormat::internationalStandardRecordingCode, "AABBBCCDDDDD" } });\r
+ const auto mb = writeToBlock (format, meta);\r
+ checkPatternsPresent (mb, { "ISRC:AABBBCCDDDDD", "<ebucore" });\r
+ checkPatternsNotPresent (mb, { "INFOISRC" });\r
+ const auto a = getMetadataAfterReading (format, mb);\r
+ expect (a[WavAudioFormat::riffInfoSource] == "AABBBCCDDDDD");\r
+ expect (a[WavAudioFormat::internationalStandardRecordingCode] == "AABBBCCDDDDD");\r
+ }\r
\r
- std::unique_ptr<AudioFormatReader> reader (format.createReaderFor (new MemoryInputStream (memoryBlock, false), false));\r
- expect (reader != nullptr);\r
- expect (reader->metadataValues == metadataArray, "Somehow, the metadata is different!");\r
+ {\r
+ beginTest ("Files containing an ISRC and a riff info source associate the values with the appropriate keys");\r
+ StringPairArray meta;\r
+ meta.addMap ({ { WavAudioFormat::riffInfoSource, "source" } });\r
+ meta.addMap ({ { WavAudioFormat::internationalStandardRecordingCode, "UUVVVXXYYYYY" } });\r
+ const auto mb = writeToBlock (format, meta);\r
+ checkPatternsPresent (mb, { "INFOISRC", "ISRC:UUVVVXXYYYYY", "<ebucore" });\r
+ const auto a = getMetadataAfterReading (format, mb);\r
+ expect (a[WavAudioFormat::riffInfoSource] == "source");\r
+ expect (a[WavAudioFormat::internationalStandardRecordingCode] == "UUVVVXXYYYYY");\r
}\r
}\r
\r
private:\r
+ MemoryBlock writeToBlock (WavAudioFormat& format, StringPairArray meta)\r
+ {\r
+ MemoryBlock mb;\r
+\r
+ {\r
+ // The destructor of the writer will modify the block, so make sure that we've\r
+ // destroyed the writer before returning the block!\r
+ auto writer = rawToUniquePtr (format.createWriterFor (new MemoryOutputStream (mb, false),\r
+ 44100.0,\r
+ numTestAudioBufferChannels,\r
+ 16,\r
+ meta,\r
+ 0));\r
+ expect (writer != nullptr);\r
+ AudioBuffer<float> buffer (numTestAudioBufferChannels, numTestAudioBufferSamples);\r
+ expect (writer->writeFromAudioSampleBuffer (buffer, 0, numTestAudioBufferSamples));\r
+ }\r
+\r
+ return mb;\r
+ }\r
+\r
+ StringPairArray getMetadataAfterReading (WavAudioFormat& format, const MemoryBlock& mb)\r
+ {\r
+ auto reader = rawToUniquePtr (format.createReaderFor (new MemoryInputStream (mb, false), true));\r
+ expect (reader != nullptr);\r
+ return reader->metadataValues;\r
+ }\r
+\r
+ template <typename Fn>\r
+ void checkPatterns (const MemoryBlock& mb, const std::vector<std::string>& patterns, Fn&& fn)\r
+ {\r
+ for (const auto& pattern : patterns)\r
+ {\r
+ const auto begin = static_cast<const char*> (mb.getData());\r
+ const auto end = begin + mb.getSize();\r
+ expect (fn (std::search (begin, end, pattern.begin(), pattern.end()), end));\r
+ }\r
+ }\r
+\r
+ void checkPatternsPresent (const MemoryBlock& mb, const std::vector<std::string>& patterns)\r
+ {\r
+ checkPatterns (mb, patterns, std::not_equal_to<>{});\r
+ }\r
+\r
+ void checkPatternsNotPresent (const MemoryBlock& mb, const std::vector<std::string>& patterns)\r
+ {\r
+ checkPatterns (mb, patterns, std::equal_to<>{});\r
+ }\r
+\r
enum\r
{\r
numTestAudioBufferChannels = 2,\r
\r
//==============================================================================\r
/** Metadata property name used when reading an ISRC code from an AXML chunk. */\r
+ [[deprecated ("This string is identical to riffInfoSource, making it impossible to differentiate between the two")]]\r
static const char* const ISRC;\r
\r
+ /** Metadata property name used when reading and writing ISRC codes to/from AXML chunks. */\r
+ static const char* const internationalStandardRecordingCode;\r
+\r
/** Metadata property name used when reading a WAV file with a Tracktion chunk. */\r
static const char* const tracktionLoopInfo;\r
\r
\r
ID: juce_audio_formats\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
}\r
}\r
\r
- if (bypass)\r
+ if (bypass && pluginInstance->getBypassParameter() == nullptr)\r
pluginInstance->processBlockBypassed (buffer, midiBuffer);\r
else\r
pluginInstance->processBlock (buffer, midiBuffer);\r
\r
AudioBuffer<float> chans (channels, totalChans, numSamples);\r
\r
- if (mBypassed)\r
+ if (mBypassed && juceFilter->getBypassParameter() == nullptr)\r
juceFilter->processBlockBypassed (chans, midiEvents);\r
else\r
juceFilter->processBlock (chans, midiEvents);\r
else\r
{\r
mBypassed = (value > 0);\r
+\r
+ if (auto* param = juceFilter->getBypassParameter())\r
+ if (mBypassed != (param->getValue() >= 0.5f))\r
+ param.setValueNotifyingHost (mBypassed ? 1.0f : 0.0f);\r
}\r
\r
return CProcess::UpdateControlValue (controlIndex, value);\r
: DocumentWindow (title, backgroundColour, DocumentWindow::minimiseButton | DocumentWindow::closeButton),\r
optionsButton ("Options")\r
{\r
+ setConstrainer (&decoratorConstrainer);\r
+\r
#if JUCE_IOS || JUCE_ANDROID\r
setTitleBarHeight (0);\r
#else\r
\r
#if JUCE_IOS || JUCE_ANDROID\r
setFullScreen (true);\r
- setContentOwned (new MainContentComponent (*this), false);\r
+ updateContent();\r
#else\r
- setContentOwned (new MainContentComponent (*this), true);\r
+ updateContent();\r
\r
const auto windowScreenBounds = [this]() -> Rectangle<int>\r
{\r
props->removeValue ("filterState");\r
\r
pluginHolder->createPlugin();\r
- setContentOwned (new MainContentComponent (*this), true);\r
+ updateContent();\r
pluginHolder->startPlaying();\r
}\r
\r
std::unique_ptr<StandalonePluginHolder> pluginHolder;\r
\r
private:\r
+ void updateContent()\r
+ {\r
+ auto* content = new MainContentComponent (*this);\r
+ decoratorConstrainer.setMainContentComponent (content);\r
+\r
+ #if JUCE_IOS || JUCE_ANDROID\r
+ constexpr auto resizeAutomatically = false;\r
+ #else\r
+ constexpr auto resizeAutomatically = true;\r
+ #endif\r
+\r
+ setContentOwned (content, resizeAutomatically);\r
+ }\r
+\r
void buttonClicked (Button*) override\r
{\r
PopupMenu m;\r
}\r
}\r
\r
+ ComponentBoundsConstrainer* getEditorConstrainer() const\r
+ {\r
+ if (auto* e = editor.get())\r
+ return e->getConstrainer();\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ BorderSize<int> computeBorder() const\r
+ {\r
+ const auto outer = owner.getContentComponentBorder();\r
+ return { outer.getTop() + (shouldShowNotification ? NotificationArea::height : 0),\r
+ outer.getLeft(),\r
+ outer.getBottom(),\r
+ outer.getRight() };\r
+ }\r
+\r
private:\r
//==============================================================================\r
class NotificationArea : public Component\r
{\r
const int extraHeight = shouldShowNotification ? NotificationArea::height : 0;\r
const auto rect = getSizeToContainEditor();\r
-\r
- if (auto* editorConstrainer = editor->getConstrainer())\r
- {\r
- const auto borders = owner.getContentComponentBorder();\r
-\r
- const auto windowBorders = [&]() -> BorderSize<int>\r
- {\r
- if (auto* peer = owner.getPeer())\r
- return peer->getFrameSize();\r
-\r
- return {};\r
- }();\r
-\r
- const auto extraWindowWidth = borders.getLeftAndRight() + windowBorders.getLeftAndRight();\r
- const auto extraWindowHeight = extraHeight + borders.getTopAndBottom() + windowBorders.getTopAndBottom();\r
-\r
- owner.setResizeLimits (jmax (10, editorConstrainer->getMinimumWidth() + extraWindowWidth),\r
- jmax (10, editorConstrainer->getMinimumHeight() + extraWindowHeight),\r
- editorConstrainer->getMaximumWidth() + extraWindowWidth,\r
- editorConstrainer->getMaximumHeight() + extraWindowHeight);\r
- }\r
-\r
setSize (rect.getWidth(), rect.getHeight() + extraHeight);\r
}\r
#endif\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)\r
};\r
\r
+ /* This custom constrainer checks with the AudioProcessorEditor (which might itself be\r
+ constrained) to ensure that any size we choose for the standalone window will be suitable\r
+ for the editor too.\r
+\r
+ Without this constrainer, attempting to resize the standalone window may set bounds on the\r
+ peer that are unsupported by the inner editor. In this scenario, the peer will be set to a\r
+ 'bad' size, then the inner editor will be resized. The editor will check the new bounds with\r
+ its own constrainer, and may set itself to a more suitable size. After that, the resizable\r
+ window will see that its content component has changed size, and set the bounds of the peer\r
+ accordingly. The end result is that the peer is resized twice in a row to different sizes,\r
+ which can appear glitchy/flickery to the user.\r
+ */\r
+ struct DecoratorConstrainer : public ComponentBoundsConstrainer\r
+ {\r
+ void checkBounds (Rectangle<int>& bounds,\r
+ const Rectangle<int>& previousBounds,\r
+ const Rectangle<int>& limits,\r
+ bool isStretchingTop,\r
+ bool isStretchingLeft,\r
+ bool isStretchingBottom,\r
+ bool isStretchingRight) override\r
+ {\r
+ auto* decorated = contentComponent != nullptr ? contentComponent->getEditorConstrainer()\r
+ : nullptr;\r
+\r
+ if (decorated != nullptr)\r
+ {\r
+ const auto border = contentComponent->computeBorder();\r
+ const auto requestedBounds = bounds;\r
+\r
+ border.subtractFrom (bounds);\r
+ decorated->checkBounds (bounds,\r
+ border.subtractedFrom (previousBounds),\r
+ limits,\r
+ isStretchingTop,\r
+ isStretchingLeft,\r
+ isStretchingBottom,\r
+ isStretchingRight);\r
+ border.addTo (bounds);\r
+ bounds = bounds.withPosition (requestedBounds.getPosition());\r
+\r
+ if (isStretchingTop && ! isStretchingBottom)\r
+ bounds = bounds.withBottomY (previousBounds.getBottom());\r
+\r
+ if (! isStretchingTop && isStretchingBottom)\r
+ bounds = bounds.withY (previousBounds.getY());\r
+\r
+ if (isStretchingLeft && ! isStretchingRight)\r
+ bounds = bounds.withRightX (previousBounds.getRight());\r
+\r
+ if (! isStretchingLeft && isStretchingRight)\r
+ bounds = bounds.withX (previousBounds.getX());\r
+ }\r
+ else\r
+ {\r
+ ComponentBoundsConstrainer::checkBounds (bounds,\r
+ previousBounds,\r
+ limits,\r
+ isStretchingTop,\r
+ isStretchingLeft,\r
+ isStretchingBottom,\r
+ isStretchingRight);\r
+ }\r
+ }\r
+\r
+ void setMainContentComponent (MainContentComponent* in) { contentComponent = in; }\r
+\r
+ private:\r
+ MainContentComponent* contentComponent = nullptr;\r
+ };\r
+\r
//==============================================================================\r
TextButton optionsButton;\r
+ DecoratorConstrainer decoratorConstrainer;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandaloneFilterWindow)\r
};\r
{\r
ModifierKeys::currentModifiers = mods;\r
\r
- handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::invalidPressure,\r
- juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
+ handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::defaultPressure,\r
+ juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis());\r
}\r
\r
void forwardKeyPress (int code, String name, ModifierKeys mods)\r
{\r
ignoreUnused (mode);\r
\r
- bitmap.data = imageData + x * pixelStride + y * lineStride;\r
+ const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride;\r
+ bitmap.data = imageData + offset;\r
+ bitmap.size = (size_t) (lineStride * height) - offset;\r
bitmap.pixelFormat = pixelFormat;\r
bitmap.lineStride = lineStride;\r
bitmap.pixelStride = pixelStride;\r
\r
if (! ms.getCurrentModifiers().isLeftButtonDown())\r
owner.handleMouseEvent (juce::MouseInputSource::mouse, owner.globalToLocal (pos.toFloat()), {},\r
- juce::MouseInputSource::invalidPressure, juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
+ juce::MouseInputSource::defaultPressure, juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis());\r
\r
lastMousePos = pos;\r
}\r
bool isFocused() const override { return true; }\r
void grabFocus() override {}\r
void* getNativeHandle() const override { return nullptr; }\r
+ OptionalBorderSize getFrameSizeIfPresent() const override { return {}; }\r
BorderSize<int> getFrameSize() const override { return {}; }\r
void setVisible (bool) override {}\r
void setTitle (const String&) override {}\r
\r
void process (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed)\r
{\r
+ // If the plugin has a bypass parameter, set it to the current bypass state\r
+ if (auto* param = pluginInstance->getBypassParameter())\r
+ if (isBypassed != (param->getValue() >= 0.5f))\r
+ param->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f);\r
+\r
for (int pos = 0; pos < bufferSize;)\r
{\r
auto max = jmin (bufferSize - pos, samplesPerBlock);\r
{\r
MidiBuffer mb;\r
\r
- if (isBypassed)\r
+ if (isBypassed && pluginInstance->getBypassParameter() == nullptr)\r
pluginInstance->processBlockBypassed (scratchBuffer, mb);\r
else\r
pluginInstance->processBlock (scratchBuffer, mb);\r
auto isMuted = ((state->flags & stateIsMuted) != 0);\r
auto isPaused = ((state->flags & stateIsPaused) != 0);\r
\r
- auto bypassed = ! isPlaying || (isMuted || isPaused);\r
-\r
+ const auto bypassed = ! isPlaying || (isMuted || isPaused);\r
pluginInstance->process (inBuffer, outBuffer, static_cast<int> (bufferSize), numInChannels, numOutChannels, bypassed);\r
}\r
else\r
const int numChannels = jmax (numIn, numOut);\r
AudioBuffer<FloatType> chans (tmpBuffers.channels, isMidiEffect ? 0 : numChannels, numSamples);\r
\r
- if (isBypassed)\r
+ if (isBypassed && processor->getBypassParameter() == nullptr)\r
processor->processBlockBypassed (chans, midiEvents);\r
else\r
processor->processBlock (chans, midiEvents);\r
void parameterValueChanged (int, float newValue) override\r
{\r
// this can only come from the bypass parameter\r
- isBypassed = (newValue != 0.0f);\r
+ isBypassed = (newValue >= 0.5f);\r
}\r
\r
void parameterGestureChanged (int, bool) override {}\r
\r
pointer_sized_int handleSetBypass (VstOpCodeArguments args)\r
{\r
- isBypassed = (args.value != 0);\r
+ isBypassed = args.value != 0;\r
\r
- if (auto* bypass = processor->getBypassParameter())\r
- bypass->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f);\r
+ if (auto* param = processor->getBypassParameter())\r
+ param->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f);\r
\r
return 1;\r
}\r
cachedParamValues = CachedParamValues { { vstParamIDs.begin(), vstParamIDs.end() } };\r
}\r
\r
- Vst::ParamID generateVSTParamIDForParam (AudioProcessorParameter* param)\r
+ Vst::ParamID generateVSTParamIDForParam (const AudioProcessorParameter* param)\r
{\r
auto juceParamID = LegacyAudioParameter::getParamID (param, false);\r
\r
//==============================================================================\r
void beginGesture (Vst::ParamID vstParamId)\r
{\r
- if (MessageManager::getInstance()->isThisTheMessageThread())\r
+ if (! inSetState && MessageManager::getInstance()->isThisTheMessageThread())\r
beginEdit (vstParamId);\r
}\r
\r
void endGesture (Vst::ParamID vstParamId)\r
{\r
- if (MessageManager::getInstance()->isThisTheMessageThread())\r
+ if (! inSetState && MessageManager::getInstance()->isThisTheMessageThread())\r
endEdit (vstParamId);\r
}\r
\r
void paramChanged (Steinberg::int32 parameterIndex, Vst::ParamID vstParamId, double newValue)\r
{\r
- if (inParameterChangedCallback)\r
+ if (inParameterChangedCallback || inSetState)\r
return;\r
\r
if (MessageManager::getInstance()->isThisTheMessageThread())\r
std::vector<std::unique_ptr<OwnedParameterListener>> ownedParameterListeners;\r
\r
//==============================================================================\r
+ bool inSetState = false;\r
std::atomic<bool> vst3IsPlaying { false },\r
inSetupProcessing { false };\r
\r
Steinberg::IPlugView* viewIn)\r
: processor (processorIn), editor (editorIn), componentHandler (handler), view (viewIn) {}\r
\r
- std::unique_ptr<HostProvidedContextMenu> getContextMenuForParameterIndex (const AudioProcessorParameter* parameter) const override\r
+ std::unique_ptr<HostProvidedContextMenu> getContextMenuForParameter (const AudioProcessorParameter* parameter) const override\r
{\r
if (componentHandler == nullptr || view == nullptr)\r
return {};\r
{\r
public:\r
JuceVST3Component (Vst::IHostApplication* h)\r
- : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)),\r
- host (h)\r
+ : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)),\r
+ host (h)\r
{\r
inParameterChangedCallback = false;\r
\r
#ifdef JucePlugin_PreferredChannelConfigurations\r
short configs[][2] = { JucePlugin_PreferredChannelConfigurations };\r
- const int numConfigs = sizeof (configs) / sizeof (short[2]);\r
+ const int numConfigs = numElementsInArray (configs);\r
\r
ignoreUnused (numConfigs);\r
jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0));\r
tresult PLUGIN_API getRoutingInfo (Vst::RoutingInfo&, Vst::RoutingInfo&) override { return kNotImplemented; }\r
\r
//==============================================================================\r
- bool isBypassed()\r
+ bool isBypassed() const\r
{\r
if (auto* bypassParam = comPluginInstance->getBypassParameter())\r
- return (bypassParam->getValue() != 0.0f);\r
+ return bypassParam->getValue() >= 0.5f;\r
\r
return false;\r
}\r
\r
void setStateInformation (const void* data, int sizeAsInt)\r
{\r
+ bool unusedState = false;\r
+ auto& flagToSet = juceVST3EditController != nullptr ? juceVST3EditController->inSetState : unusedState;\r
+ const ScopedValueSetter<bool> scope (flagToSet, true);\r
+\r
auto size = (uint64) sizeAsInt;\r
\r
// Check if this data was written with a newer JUCE version\r
\r
tresult PLUGIN_API setState (IBStream* state) override\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
+\r
if (state == nullptr)\r
return kInvalidArgument;\r
\r
\r
#ifdef JucePlugin_PreferredChannelConfigurations\r
short configs[][2] = {JucePlugin_PreferredChannelConfigurations};\r
- const int numConfigs = sizeof (configs) / sizeof (short[2]);\r
+ const int numConfigs = numElementsInArray (configs);\r
\r
bool hasOnlyZeroChannels = true;\r
\r
if (totalInputChans == pluginInstance->getTotalNumInputChannels()\r
&& totalOutputChans == pluginInstance->getTotalNumOutputChannels())\r
{\r
- if (isBypassed())\r
+ // processBlockBypassed should only ever be called if the AudioProcessor doesn't\r
+ // return a valid parameter from getBypassParameter\r
+ if (pluginInstance->getBypassParameter() == nullptr && comPluginInstance->getBypassParameter()->getValue() >= 0.5f)\r
pluginInstance->processBlockBypassed (buffer, midiBuffer);\r
else\r
pluginInstance->processBlock (buffer, midiBuffer);\r
ptr = {};\r
}\r
\r
- T* operator->() { return ptr.operator->(); }\r
+ T* operator->() const { return ptr.operator->(); }\r
T* get() const noexcept { return ptr.get(); }\r
operator T*() const noexcept { return ptr.get(); }\r
\r
\r
ID: juce_audio_plugin_client\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE audio plugin wrapper classes\r
description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.\r
website: http://www.juce.com/juce\r
*/\r
virtual FileSearchPath getDefaultLocationsToSearch() = 0;\r
\r
+ /** Returns true if instantiation of this plugin type must be done from a non-message thread. */\r
+ virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const = 0;\r
+\r
protected:\r
//==============================================================================\r
friend class AudioPluginFormatManager;\r
virtual void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
int initialBufferSize, PluginCreationCallback) = 0;\r
\r
- /** Returns true if instantiation of this plugin type must be done from a non-message thread. */\r
- virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const = 0;\r
-\r
private:\r
struct AsyncCreateMessage;\r
void handleMessage (const Message&) override;\r
}\r
}\r
\r
- void clearInputBus (int index)\r
+ void clearInputBus (int index, int bufferLength)\r
{\r
if (isPositiveAndBelow (index, inputBusOffsets.size() - 1))\r
- clearChannels (inputBusOffsets[(size_t) index], inputBusOffsets[(size_t) (index + 1)]);\r
+ clearChannels ({ inputBusOffsets[(size_t) index], inputBusOffsets[(size_t) (index + 1)] }, bufferLength);\r
}\r
\r
- void clearUnusedChannels()\r
+ void clearUnusedChannels (int bufferLength)\r
{\r
jassert (! inputBusOffsets .empty());\r
jassert (! outputBusOffsets.empty());\r
\r
- clearChannels (inputBusOffsets.back(), outputBusOffsets.back());\r
+ clearChannels ({ inputBusOffsets.back(), outputBusOffsets.back() }, bufferLength);\r
}\r
\r
private:\r
- void clearChannels (int begin, int end)\r
+ void clearChannels (Range<int> range, int bufferLength)\r
{\r
- for (auto i = begin; i < end; ++i)\r
- zeromem (scratch.getWritePointer (i), sizeof (float) * (size_t) scratch.getNumSamples());\r
+ jassert (bufferLength <= scratch.getNumSamples());\r
+\r
+ if (range.getEnd() <= (int) channels.size())\r
+ {\r
+ std::for_each (channels.begin() + range.getStart(),\r
+ channels.begin() + range.getEnd(),\r
+ [bufferLength] (float* ptr) { zeromem (ptr, sizeof (float) * (size_t) bufferLength); });\r
+ }\r
}\r
\r
float* uniqueBuffer (int idx, float* buffer) noexcept\r
void handleAsyncUpdate() override { resizeToFitView(); }\r
};\r
#endif\r
+\r
+ template <typename Value>\r
+ struct BasicOptional\r
+ {\r
+ BasicOptional() = default;\r
+\r
+ explicit constexpr BasicOptional (Value&& v) : value (std::move (v)), isValid (true) {}\r
+ explicit constexpr BasicOptional (const Value& v) : value (v), isValid (true) {}\r
+\r
+ explicit constexpr operator bool() const noexcept { return isValid; }\r
+\r
+ Value value;\r
+ bool isValid { false };\r
+ };\r
+\r
+ template <typename Value>\r
+ static BasicOptional<Value> tryGetProperty (AudioUnit inUnit,\r
+ AudioUnitPropertyID inID,\r
+ AudioUnitScope inScope,\r
+ AudioUnitElement inElement)\r
+ {\r
+ Value data;\r
+ auto size = (UInt32) sizeof (Value);\r
+\r
+ if (AudioUnitGetProperty (inUnit, inID, inScope, inElement, &data, &size) == noErr)\r
+ return BasicOptional<Value> (data);\r
+\r
+ return BasicOptional<Value>();\r
+ }\r
+\r
+ static UInt32 getElementCount (AudioUnit comp, AudioUnitScope scope) noexcept\r
+ {\r
+ const auto count = tryGetProperty<UInt32> (comp, kAudioUnitProperty_ElementCount, scope, 0);\r
+ jassert (count.isValid);\r
+ return count.value;\r
+ }\r
+\r
+ /* The plugin may expect its channels in a particular order, reported to the host\r
+ using kAudioUnitProperty_AudioChannelLayout.\r
+ This remapper allows us to respect the channel order requested by the plugin,\r
+ while still using the JUCE channel ordering for the AudioBuffer argument\r
+ of AudioProcessor::processBlock.\r
+ */\r
+ class SingleDirectionChannelMapping\r
+ {\r
+ public:\r
+ void setUpMapping (AudioUnit comp, bool isInput)\r
+ {\r
+ channels.clear();\r
+ busOffset.clear();\r
+\r
+ const auto scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;\r
+ const auto n = getElementCount (comp, scope);\r
+\r
+ for (UInt32 busIndex = 0; busIndex < n; ++busIndex)\r
+ {\r
+ std::vector<size_t> busMap;\r
+\r
+ if (const auto layout = tryGetProperty<AudioChannelLayout> (comp, kAudioUnitProperty_AudioChannelLayout, scope, busIndex))\r
+ {\r
+ const auto juceChannelOrder = CoreAudioLayouts::fromCoreAudio (layout.value);\r
+ const auto auChannelOrder = CoreAudioLayouts::getCoreAudioLayoutChannels (layout.value);\r
+\r
+ for (auto juceChannelIndex = 0; juceChannelIndex < juceChannelOrder.size(); ++juceChannelIndex)\r
+ busMap.push_back ((size_t) auChannelOrder.indexOf (juceChannelOrder.getTypeOfChannel (juceChannelIndex)));\r
+ }\r
+\r
+ busOffset.push_back (busMap.empty() ? unknownChannelCount : channels.size());\r
+ channels.insert (channels.end(), busMap.begin(), busMap.end());\r
+ }\r
+ }\r
+\r
+ size_t getAuIndexForJuceChannel (size_t bus, size_t channel) const noexcept\r
+ {\r
+ const auto baseOffset = busOffset[bus];\r
+ return baseOffset != unknownChannelCount ? channels[baseOffset + channel]\r
+ : channel;\r
+ }\r
+\r
+ private:\r
+ static constexpr size_t unknownChannelCount = std::numeric_limits<size_t>::max();\r
+\r
+ /* The index (in the channels vector) of the first channel in each bus.\r
+ e.g the index of the first channel in the second bus can be found at busOffset[1].\r
+ It's possible for a bus not to report its channel layout, and in this case a value\r
+ of unknownChannelCount will be stored for that bus.\r
+ */\r
+ std::vector<size_t> busOffset;\r
+\r
+ /* The index in a collection of JUCE channels of the AU channel with a matching channel\r
+ type. The mappings for all buses are stored in bus order. To find the start offset for a\r
+ particular bus, use the busOffset vector.\r
+ e.g. the index of the AU channel with the same type as the fifth channel of the third bus\r
+ in JUCE layout is found at channels[busOffset[2] + 4].\r
+ If the busOffset for the bus is unknownChannelCount, then assume there is no mapping\r
+ between JUCE/AU channel layouts.\r
+ */\r
+ std::vector<size_t> channels;\r
+ };\r
}\r
\r
//==============================================================================\r
return defaultValue;\r
}\r
\r
- String getName (int /*maximumStringLength*/) const override\r
- {\r
- return name;\r
- }\r
-\r
- String getLabel() const override\r
- {\r
- return valueLabel;\r
- }\r
+ String getName (int /*maximumStringLength*/) const override { return name; }\r
+ String getLabel() const override { return valueLabel; }\r
\r
String getText (float value, int maximumLength) const override\r
{\r
\r
UInt32 getRawParamID() const { return paramID; }\r
\r
+ void setName (String&& newName) { name = std::move (newName); }\r
+ void setLabel (String&& newLabel) { valueLabel = std::move (newLabel); }\r
+\r
private:\r
AudioUnitPluginInstance& pluginInstance;\r
const UInt32 paramID;\r
- const String name;\r
+ String name;\r
const AudioUnitParameterValue minValue, maxValue, range;\r
const bool automatable, discrete;\r
const int numSteps;\r
const bool valuesHaveStrings, isSwitch;\r
- const String valueLabel;\r
+ String valueLabel;\r
const AudioUnitParameterValue defaultValue;\r
StringArray auValueStrings;\r
};\r
\r
bool canApplyBusCountChange (bool isInput, bool isAdding, BusProperties& outProperties) override\r
{\r
- int currentCount = getBusCount (isInput);\r
- int newCount = currentCount + (isAdding ? 1 : -1);\r
+ auto currentCount = (UInt32) getBusCount (isInput);\r
+ auto newCount = (UInt32) ((int) currentCount + (isAdding ? 1 : -1));\r
AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;\r
\r
if (AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount)) == noErr)\r
timeStamp.mHostTime = GetCurrentHostTime (0, newSampleRate, isAUv3);\r
timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid;\r
\r
- currentBuffer = nullptr;\r
wasPlaying = false;\r
\r
resetBuses();\r
AudioUnitUninitialize (audioUnit);\r
}\r
}\r
+\r
+ inMapping .setUpMapping (audioUnit, true);\r
+ outMapping.setUpMapping (audioUnit, false);\r
+\r
+ preparedChannels = jmax (getTotalNumInputChannels(), getTotalNumOutputChannels());\r
+ preparedSamples = estimatedSamplesPerBlock;\r
+ inputBuffer.setSize (preparedChannels, preparedSamples);\r
}\r
}\r
\r
AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0);\r
\r
outputBufferList.clear();\r
- currentBuffer = nullptr;\r
prepared = false;\r
}\r
\r
\r
void processAudio (AudioBuffer<float>& buffer, MidiBuffer& midiMessages, bool processBlockBypassedCalled)\r
{\r
+ // If these are hit, we might allocate in the process block!\r
+ jassert (buffer.getNumChannels() <= preparedChannels);\r
+ jassert (buffer.getNumSamples() <= preparedSamples);\r
+ // Copy the input buffer to guard against the case where a bus has more output channels\r
+ // than input channels, so rendering the output for that bus might stamp over the input\r
+ // to the following bus.\r
+ inputBuffer.makeCopyOf (buffer, true);\r
+\r
auto numSamples = buffer.getNumSamples();\r
\r
if (auSupportsBypass)\r
if (prepared)\r
{\r
timeStamp.mHostTime = GetCurrentHostTime (numSamples, getSampleRate(), isAUv3);\r
- int numOutputBuses;\r
\r
- int chIdx = 0;\r
- numOutputBuses = getBusCount (false);\r
+ const auto numOutputBuses = getBusCount (false);\r
\r
for (int i = 0; i < numOutputBuses; ++i)\r
{\r
if (AUBuffer* buf = outputBufferList[i])\r
{\r
AudioBufferList& abl = *buf;\r
+ const auto* bus = getBus (false, i);\r
+ const auto channelCount = bus != nullptr ? bus->getNumberOfChannels() : 0;\r
\r
- for (AudioUnitElement j = 0; j < abl.mNumberBuffers; ++j)\r
+ for (auto juceChannel = 0; juceChannel < channelCount; ++juceChannel)\r
{\r
- abl.mBuffers[j].mNumberChannels = 1;\r
- abl.mBuffers[j].mDataByteSize = (UInt32) ((size_t) numSamples * sizeof (float));\r
- abl.mBuffers[j].mData = buffer.getWritePointer (chIdx++);\r
+ const auto auChannel = outMapping.getAuIndexForJuceChannel ((size_t) i, (size_t) juceChannel);\r
+ abl.mBuffers[auChannel].mNumberChannels = 1;\r
+ abl.mBuffers[auChannel].mDataByteSize = (UInt32) ((size_t) numSamples * sizeof (float));\r
+ abl.mBuffers[auChannel].mData = buffer.getWritePointer (bus->getChannelIndexInProcessBlockBuffer (juceChannel));\r
}\r
}\r
}\r
\r
- currentBuffer = &buffer;\r
-\r
if (wantsMidiMessages)\r
{\r
for (const auto metadata : midiMessages)\r
\r
for (int dir = 0; dir < 2; ++dir)\r
{\r
- const bool isInput = (dir == 0);\r
- const int n = getElementCount (comp, isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);\r
+ const auto isInput = (dir == 0);\r
+ const auto n = AudioUnitFormatHelpers::getElementCount (comp, isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);\r
\r
- for (int i = 0; i < n; ++i)\r
+ for (UInt32 i = 0; i < n; ++i)\r
{\r
String busName;\r
AudioChannelSet currentLayout;\r
\r
for (size_t i = 0; i < numParams; ++i)\r
{\r
- AudioUnitParameterInfo info;\r
- UInt32 sz = sizeof (info);\r
-\r
- if (AudioUnitGetProperty (audioUnit,\r
- kAudioUnitProperty_ParameterInfo,\r
- kAudioUnitScope_Global,\r
- ids[i], &info, &sz) == noErr)\r
+ const ScopedAudioUnitParameterInfo info { audioUnit, ids[i] };\r
+\r
+ if (! info.isValid())\r
+ continue;\r
+\r
+ const auto paramName = getParamName (info.get());\r
+ const auto label = getParamLabel (info.get());\r
+ const auto isDiscrete = (info.get().unit == kAudioUnitParameterUnit_Indexed\r
+ || info.get().unit == kAudioUnitParameterUnit_Boolean);\r
+ const auto isBoolean = info.get().unit == kAudioUnitParameterUnit_Boolean;\r
+\r
+ auto parameter = std::make_unique<AUInstanceParameter> (*this,\r
+ ids[i],\r
+ paramName,\r
+ info.get().minValue,\r
+ info.get().maxValue,\r
+ info.get().defaultValue,\r
+ (info.get().flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
+ isDiscrete,\r
+ isDiscrete ? (int) (info.get().maxValue - info.get().minValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
+ isBoolean,\r
+ label,\r
+ (info.get().flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0);\r
+\r
+ paramIDToParameter.emplace (ids[i], parameter.get());\r
+\r
+ if (info.get().flags & kAudioUnitParameterFlag_HasClump)\r
{\r
- String paramName;\r
-\r
- if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) != 0)\r
- {\r
- paramName = String::fromCFString (info.cfNameString);\r
-\r
- if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) != 0)\r
- CFRelease (info.cfNameString);\r
- }\r
- else\r
- {\r
- paramName = String (info.name, sizeof (info.name));\r
- }\r
+ auto groupInfo = groupIDMap.find (info.get().clumpID);\r
\r
- bool isDiscrete = (info.unit == kAudioUnitParameterUnit_Indexed\r
- || info.unit == kAudioUnitParameterUnit_Boolean);\r
- bool isBoolean = info.unit == kAudioUnitParameterUnit_Boolean;\r
-\r
- auto label = [info]() -> String\r
- {\r
- if (info.unit == kAudioUnitParameterUnit_Percent) return "%";\r
- if (info.unit == kAudioUnitParameterUnit_Seconds) return "s";\r
- if (info.unit == kAudioUnitParameterUnit_Hertz) return "Hz";\r
- if (info.unit == kAudioUnitParameterUnit_Decibels) return "dB";\r
- if (info.unit == kAudioUnitParameterUnit_Milliseconds) return "ms";\r
-\r
- return {};\r
- }();\r
-\r
- auto parameter = std::make_unique<AUInstanceParameter> (*this,\r
- ids[i],\r
- paramName,\r
- info.minValue,\r
- info.maxValue,\r
- info.defaultValue,\r
- (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
- isDiscrete,\r
- isDiscrete ? (int) (info.maxValue - info.minValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
- isBoolean,\r
- label,\r
- (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0);\r
-\r
- paramIDToParameter.emplace (ids[i], parameter.get());\r
-\r
- if (info.flags & kAudioUnitParameterFlag_HasClump)\r
+ if (groupInfo == groupIDMap.end())\r
{\r
- auto groupInfo = groupIDMap.find (info.clumpID);\r
-\r
- if (groupInfo == groupIDMap.end())\r
- {\r
- auto getClumpName = [this, info]\r
- {\r
- AudioUnitParameterNameInfo clumpNameInfo;\r
- UInt32 clumpSz = sizeof (clumpNameInfo);\r
- zerostruct (clumpNameInfo);\r
- clumpNameInfo.inID = info.clumpID;\r
- clumpNameInfo.inDesiredLength = (SInt32) 256;\r
-\r
- if (AudioUnitGetProperty (audioUnit,\r
- kAudioUnitProperty_ParameterClumpName,\r
- kAudioUnitScope_Global,\r
- 0,\r
- &clumpNameInfo,\r
- &clumpSz) == noErr)\r
- return String::fromCFString (clumpNameInfo.outName);\r
-\r
- return String (info.clumpID);\r
- };\r
-\r
- auto group = std::make_unique<AudioProcessorParameterGroup> (String (info.clumpID),\r
- getClumpName(), String());\r
- group->addChild (std::move (parameter));\r
- groupIDMap[info.clumpID] = group.get();\r
- newParameterTree.addChild (std::move (group));\r
- }\r
- else\r
+ const auto clumpName = [this, &info]\r
{\r
- groupInfo->second->addChild (std::move (parameter));\r
- }\r
+ AudioUnitParameterNameInfo clumpNameInfo;\r
+ UInt32 clumpSz = sizeof (clumpNameInfo);\r
+ zerostruct (clumpNameInfo);\r
+ clumpNameInfo.inID = info.get().clumpID;\r
+ clumpNameInfo.inDesiredLength = (SInt32) 256;\r
+\r
+ if (AudioUnitGetProperty (audioUnit,\r
+ kAudioUnitProperty_ParameterClumpName,\r
+ kAudioUnitScope_Global,\r
+ 0,\r
+ &clumpNameInfo,\r
+ &clumpSz) == noErr)\r
+ return String::fromCFString (clumpNameInfo.outName);\r
+\r
+ return String (info.get().clumpID);\r
+ }();\r
+\r
+ auto group = std::make_unique<AudioProcessorParameterGroup> (String (info.get().clumpID),\r
+ clumpName, String());\r
+ group->addChild (std::move (parameter));\r
+ groupIDMap[info.get().clumpID] = group.get();\r
+ newParameterTree.addChild (std::move (group));\r
}\r
else\r
{\r
- newParameterTree.addChild (std::move (parameter));\r
+ groupInfo->second->addChild (std::move (parameter));\r
}\r
}\r
+ else\r
+ {\r
+ newParameterTree.addChild (std::move (parameter));\r
+ }\r
}\r
}\r
}\r
\r
OwnedArray<AUBuffer> outputBufferList;\r
AudioTimeStamp timeStamp;\r
- AudioBuffer<float>* currentBuffer = nullptr;\r
+ AudioBuffer<float> inputBuffer;\r
Array<Array<AudioChannelSet>> supportedInLayouts, supportedOutLayouts;\r
\r
- int numChannelInfos;\r
+ int numChannelInfos, preparedChannels = 0, preparedSamples = 0;\r
HeapBlock<AUChannelInfo> channelInfos;\r
\r
AudioUnit audioUnit;\r
\r
std::map<UInt32, AUInstanceParameter*> paramIDToParameter;\r
\r
+ AudioUnitFormatHelpers::SingleDirectionChannelMapping inMapping, outMapping;\r
MidiDataConcatenator midiConcatenator;\r
CriticalSection midiInLock;\r
MidiBuffer incomingMidi;\r
switch (prop.mPropertyID)\r
{\r
case kAudioUnitProperty_ParameterList:\r
+ updateParameterInfo();\r
updateHostDisplay (AudioProcessorListener::ChangeDetails().withParameterInfoChanged (true));\r
break;\r
\r
static void eventListenerCallback (void* userRef, void*, const AudioUnitEvent* event,\r
UInt64, AudioUnitParameterValue value)\r
{\r
+ JUCE_ASSERT_MESSAGE_THREAD\r
jassert (event != nullptr);\r
static_cast<AudioUnitPluginInstance*> (userRef)->eventCallback (*event, value);\r
}\r
+\r
+ void updateParameterInfo()\r
+ {\r
+ for (const auto& idAndParam : paramIDToParameter)\r
+ {\r
+ const auto& id = idAndParam.first;\r
+ const auto& param = idAndParam.second;\r
+\r
+ const ScopedAudioUnitParameterInfo info { audioUnit, id };\r
+\r
+ if (! info.isValid())\r
+ continue;\r
+\r
+ param->setName (getParamName (info.get()));\r
+ param->setLabel (getParamLabel (info.get()));\r
+ }\r
+ }\r
#endif\r
\r
+ /* Some fields in the AudioUnitParameterInfo may need to be released after use,\r
+ so we'll do that using RAII.\r
+ */\r
+ class ScopedAudioUnitParameterInfo\r
+ {\r
+ public:\r
+ ScopedAudioUnitParameterInfo (AudioUnit au, UInt32 paramId)\r
+ {\r
+ auto sz = (UInt32) sizeof (info);\r
+ valid = noErr == AudioUnitGetProperty (au,\r
+ kAudioUnitProperty_ParameterInfo,\r
+ kAudioUnitScope_Global,\r
+ paramId,\r
+ &info,\r
+ &sz);\r
+ }\r
+\r
+ ScopedAudioUnitParameterInfo (const ScopedAudioUnitParameterInfo&) = delete;\r
+ ScopedAudioUnitParameterInfo (ScopedAudioUnitParameterInfo&&) = delete;\r
+ ScopedAudioUnitParameterInfo& operator= (const ScopedAudioUnitParameterInfo&) = delete;\r
+ ScopedAudioUnitParameterInfo& operator= (ScopedAudioUnitParameterInfo&&) = delete;\r
+\r
+ ~ScopedAudioUnitParameterInfo() noexcept\r
+ {\r
+ if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) == 0)\r
+ return;\r
+\r
+ if (info.cfNameString != nullptr)\r
+ CFRelease (info.cfNameString);\r
+\r
+ if (info.unit == kAudioUnitParameterUnit_CustomUnit && info.unitName != nullptr)\r
+ CFRelease (info.unitName);\r
+ }\r
+\r
+ bool isValid() const { return valid; }\r
+\r
+ const AudioUnitParameterInfo& get() const noexcept { return info; }\r
+\r
+ private:\r
+ AudioUnitParameterInfo info;\r
+ bool valid = false;\r
+ };\r
+\r
+ static String getParamName (const AudioUnitParameterInfo& info)\r
+ {\r
+ if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) == 0)\r
+ return { info.name, sizeof (info.name) };\r
+\r
+ return String::fromCFString (info.cfNameString);\r
+ }\r
+\r
+ static String getParamLabel (const AudioUnitParameterInfo& info)\r
+ {\r
+ if (info.unit == kAudioUnitParameterUnit_CustomUnit) return String::fromCFString (info.unitName);\r
+ if (info.unit == kAudioUnitParameterUnit_Percent) return "%";\r
+ if (info.unit == kAudioUnitParameterUnit_Seconds) return "s";\r
+ if (info.unit == kAudioUnitParameterUnit_Hertz) return "Hz";\r
+ if (info.unit == kAudioUnitParameterUnit_Decibels) return "dB";\r
+ if (info.unit == kAudioUnitParameterUnit_Milliseconds) return "ms";\r
+\r
+ return {};\r
+ }\r
+\r
//==============================================================================\r
OSStatus renderGetInput (AudioUnitRenderActionFlags*,\r
const AudioTimeStamp*,\r
UInt32 inBusNumber,\r
UInt32 inNumberFrames,\r
- AudioBufferList* ioData) const\r
+ AudioBufferList* ioData)\r
{\r
- if (currentBuffer != nullptr)\r
+ if (inputBuffer.getNumChannels() <= 0)\r
{\r
- // if this ever happens, might need to add extra handling\r
- jassert (inNumberFrames == (UInt32) currentBuffer->getNumSamples());\r
- auto buffer = static_cast<int> (inBusNumber) < getBusCount (true)\r
- ? getBusBuffer (*currentBuffer, true, static_cast<int> (inBusNumber))\r
- : AudioBuffer<float>();\r
+ jassertfalse;\r
+ return noErr;\r
+ }\r
\r
- for (int i = 0; i < static_cast<int> (ioData->mNumberBuffers); ++i)\r
- {\r
- if (i < buffer.getNumChannels())\r
- {\r
- memcpy (ioData->mBuffers[i].mData,\r
- buffer.getReadPointer (i),\r
- sizeof (float) * inNumberFrames);\r
- }\r
- else\r
- {\r
- zeromem (ioData->mBuffers[i].mData,\r
- sizeof (float) * inNumberFrames);\r
- }\r
- }\r
+ // if this ever happens, might need to add extra handling\r
+ if (inputBuffer.getNumSamples() != (int) inNumberFrames)\r
+ {\r
+ jassertfalse;\r
+ return noErr;\r
+ }\r
+\r
+ const auto buffer = static_cast<int> (inBusNumber) < getBusCount (true)\r
+ ? getBusBuffer (inputBuffer, true, static_cast<int> (inBusNumber))\r
+ : AudioBuffer<float>();\r
+\r
+ for (int juceChannel = 0; juceChannel < buffer.getNumChannels(); ++juceChannel)\r
+ {\r
+ const auto auChannel = (int) inMapping.getAuIndexForJuceChannel (inBusNumber, (size_t) juceChannel);\r
+\r
+ if (auChannel < buffer.getNumChannels())\r
+ memcpy (ioData->mBuffers[auChannel].mData, buffer.getReadPointer (juceChannel), sizeof (float) * inNumberFrames);\r
+ else\r
+ zeromem (ioData->mBuffers[auChannel].mData, sizeof (float) * inNumberFrames);\r
}\r
\r
return noErr;\r
//==============================================================================\r
int getElementCount (AudioUnitScope scope) const noexcept\r
{\r
- return static_cast<int> (getElementCount (audioUnit, scope));\r
- }\r
-\r
- static int getElementCount (AudioUnit comp, AudioUnitScope scope) noexcept\r
- {\r
- UInt32 count;\r
- UInt32 countSize = sizeof (count);\r
-\r
- auto err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);\r
- jassert (err == noErr);\r
- ignoreUnused (err);\r
-\r
- return static_cast<int> (count);\r
+ return static_cast<int> (AudioUnitFormatHelpers::getElementCount (audioUnit, scope));\r
}\r
\r
//==============================================================================\r
- void getBusProperties (bool isInput, int busIdx, String& busName, AudioChannelSet& currentLayout) const\r
+ void getBusProperties (bool isInput, UInt32 busIdx, String& busName, AudioChannelSet& currentLayout) const\r
{\r
getBusProperties (audioUnit, isInput, busIdx, busName, currentLayout);\r
}\r
\r
- static void getBusProperties (AudioUnit comp, bool isInput, int busIdx, String& busName, AudioChannelSet& currentLayout)\r
+ static void getBusProperties (AudioUnit comp, bool isInput, UInt32 busIdx, String& busName, AudioChannelSet& currentLayout)\r
{\r
const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;\r
busName = (isInput ? "Input #" : "Output #") + String (busIdx + 1);\r
CFObjectHolder<CFStringRef> busNameCF;\r
UInt32 propertySize = sizeof (busNameCF.object);\r
\r
- if (AudioUnitGetProperty (comp, kAudioUnitProperty_ElementName, scope, static_cast<UInt32> (busIdx), &busNameCF.object, &propertySize) == noErr)\r
+ if (AudioUnitGetProperty (comp, kAudioUnitProperty_ElementName, scope, busIdx, &busNameCF.object, &propertySize) == noErr)\r
if (busNameCF.object != nullptr)\r
busName = nsStringToJuce ((NSString*) busNameCF.object);\r
\r
AudioChannelLayout auLayout;\r
propertySize = sizeof (auLayout);\r
\r
- if (AudioUnitGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (busIdx), &auLayout, &propertySize) == noErr)\r
+ if (AudioUnitGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, busIdx, &auLayout, &propertySize) == noErr)\r
currentLayout = CoreAudioLayouts::fromCoreAudio (auLayout);\r
}\r
\r
AudioStreamBasicDescription descr;\r
propertySize = sizeof (descr);\r
\r
- if (AudioUnitGetProperty (comp, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (busIdx), &descr, &propertySize) == noErr)\r
+ if (AudioUnitGetProperty (comp, kAudioUnitProperty_StreamFormat, scope, busIdx, &descr, &propertySize) == noErr)\r
currentLayout = AudioChannelSet::canonicalChannelSet (static_cast<int> (descr.mChannelsPerFrame));\r
}\r
}\r
warnOnFailure (view->setFrame (this));\r
view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
\r
- if (scaleInterface != nullptr)\r
- warnOnFailure (scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor));\r
-\r
+ setContentScaleFactor();\r
resizeToFit();\r
}\r
\r
embeddedComponent.removeClient();\r
#endif\r
\r
- warnOnFailure (view->removed());\r
+ if (attachedCalled)\r
+ warnOnFailure (view->removed());\r
+\r
warnOnFailure (view->setFrame (nullptr));\r
\r
processor.editorBeingDeleted (this);\r
return;\r
}\r
\r
- warnOnFailure (view->attached ((void*) pluginHandle, defaultVST3WindowType));\r
+ const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType);\r
+ ignoreUnused (warnOnFailure (attachedResult));\r
+\r
+ if (attachedResult == kResultOk)\r
+ attachedCalled = true;\r
+\r
updatePluginScale();\r
}\r
}\r
void updatePluginScale()\r
{\r
if (scaleInterface != nullptr)\r
- warnOnFailure (scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor));\r
+ setContentScaleFactor();\r
else\r
resizeToFit();\r
}\r
\r
+ void setContentScaleFactor()\r
+ {\r
+ if (scaleInterface != nullptr)\r
+ {\r
+ const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor);\r
+ ignoreUnused (result);\r
+\r
+ #if ! JUCE_MAC\r
+ ignoreUnused (warnOnFailure (result));\r
+ #endif\r
+ }\r
+ }\r
+\r
//==============================================================================\r
Atomic<int> refCount { 1 };\r
VSTComSmartPtr<IPlugView> view;\r
#endif\r
\r
HandleFormat pluginHandle = {};\r
- bool recursiveResize = false, isInOnSize = false;\r
+ bool recursiveResize = false, isInOnSize = false, attachedCalled = false;\r
\r
ComponentPeer* currentPeer = nullptr;\r
Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
// transfers ownership to the plugin instance!\r
AudioPluginInstance* createPluginInstance();\r
\r
+ bool isIComponentAlsoIEditController() const\r
+ {\r
+ if (component == nullptr)\r
+ {\r
+ jassertfalse;\r
+ return false;\r
+ }\r
+\r
+ return VSTComSmartPtr<Vst::IEditController>().loadFrom (component);\r
+ }\r
+\r
bool fetchController (VSTComSmartPtr<Vst::IEditController>& editController)\r
{\r
if (! isComponentInitialised && ! initialise())\r
return false;\r
\r
+ editController.loadFrom (component);\r
+\r
// Get the IEditController:\r
TUID controllerCID = { 0 };\r
\r
- if (component->getControllerClassId (controllerCID) == kResultTrue && FUID (controllerCID).isValid())\r
+ if (editController == nullptr\r
+ && component->getControllerClassId (controllerCID) == kResultTrue\r
+ && FUID (controllerCID).isValid())\r
+ {\r
editController.loadFrom (factory, controllerCID);\r
+ }\r
\r
if (editController == nullptr)\r
{\r
}\r
}\r
\r
- if (editController == nullptr)\r
- editController.loadFrom (component);\r
-\r
return (editController != nullptr);\r
}\r
\r
\r
editController->setComponentHandler (nullptr);\r
\r
- if (isControllerInitialised)\r
+ if (isControllerInitialised && ! holder->isIComponentAlsoIEditController())\r
editController->terminate();\r
\r
holder->terminate();\r
if (! (isControllerInitialised || holder->fetchController (editController)))\r
return false;\r
\r
- // (May return an error if the plugin combines the IComponent and IEditController implementations)\r
- editController->initialize (holder->host->getFUnknown());\r
+ // If the IComponent and IEditController are the same, we will have\r
+ // already initialized the object at this point and should avoid doing so again.\r
+ if (! holder->isIComponentAlsoIEditController())\r
+ editController->initialize (holder->host->getFUnknown());\r
\r
isControllerInitialised = true;\r
editController->setComponentHandler (holder->host);\r
\r
MemoryBlock getStateForPresetFile() const\r
{\r
- VSTComSmartPtr<Steinberg::MemoryStream> memoryStream = new Steinberg::MemoryStream();\r
+ VSTComSmartPtr<Steinberg::MemoryStream> memoryStream (new Steinberg::MemoryStream(), false);\r
\r
if (memoryStream == nullptr || holder->component == nullptr)\r
return {};\r
\r
bool setStateFromPresetFile (const MemoryBlock& rawData) const\r
{\r
- MemoryBlock rawDataCopy (rawData);\r
- VSTComSmartPtr<Steinberg::MemoryStream> memoryStream = new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize());\r
+ auto rawDataCopy = rawData;\r
+ VSTComSmartPtr<Steinberg::MemoryStream> memoryStream (new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()), false);\r
\r
if (memoryStream == nullptr || holder->component == nullptr)\r
return false;\r
FileSearchPath VST3PluginFormat::getDefaultLocationsToSearch()\r
{\r
#if JUCE_WINDOWS\r
- auto programFiles = File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName();\r
- return FileSearchPath (programFiles + "\\Common Files\\VST3");\r
+ const auto localAppData = File::getSpecialLocation (File::windowsLocalAppData) .getFullPathName();\r
+ const auto programFiles = File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName();\r
+ return FileSearchPath (localAppData + "\\Programs\\Common\\VST3;" + programFiles + "\\Common Files\\VST3");\r
#elif JUCE_MAC\r
- return FileSearchPath ("/Library/Audio/Plug-Ins/VST3;~/Library/Audio/Plug-Ins/VST3");\r
+ return FileSearchPath ("~/Library/Audio/Plug-Ins/VST3;/Library/Audio/Plug-Ins/VST3");\r
#else\r
- return FileSearchPath ("/usr/lib/vst3/;/usr/local/lib/vst3/;~/.vst3/");\r
+ return FileSearchPath ("~/.vst3/;/usr/lib/vst3/;/usr/local/lib/vst3/");\r
#endif\r
}\r
\r
\r
ID: juce_audio_processors\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
\r
void addBus (bool isInput, const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true);\r
\r
- BusesProperties withInput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const;\r
- BusesProperties withOutput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const;\r
+ JUCE_NODISCARD BusesProperties withInput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const;\r
+ JUCE_NODISCARD BusesProperties withOutput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const;\r
};\r
\r
/** Callback to query if adding/removing buses currently possible.\r
/** Returns an object which can be used to display a context menu for the\r
parameter with the given index.\r
*/\r
- virtual std::unique_ptr<HostProvidedContextMenu> getContextMenuForParameterIndex (const AudioProcessorParameter *) const = 0;\r
+ virtual std::unique_ptr<HostProvidedContextMenu> getContextMenuForParameter (const AudioProcessorParameter *) const = 0;\r
+\r
+ /** The naming of this function is misleading. Use getContextMenuForParameter() instead.\r
+\r
+ Returns an object which can be used to display a context menu for the\r
+ parameter with the given index.\r
+ */\r
+ [[deprecated ("The naming of this function has been fixed, use getContextMenuForParameter instead")]]\r
+ virtual std::unique_ptr<HostProvidedContextMenu> getContextMenuForParameterIndex (const AudioProcessorParameter * p) const\r
+ {\r
+ return getContextMenuForParameter (p);\r
+ }\r
};\r
\r
} // namespace juce\r
\r
@see latencyChanged\r
*/\r
- ChangeDetails withLatencyChanged (bool b) const noexcept { return with (&ChangeDetails::latencyChanged, b); }\r
+ JUCE_NODISCARD ChangeDetails withLatencyChanged (bool b) const noexcept { return with (&ChangeDetails::latencyChanged, b); }\r
\r
/** Indicates that some attributes of the AudioProcessor's parameters have changed.\r
\r
\r
@see parameterInfoChanged\r
*/\r
- ChangeDetails withParameterInfoChanged (bool b) const noexcept { return with (&ChangeDetails::parameterInfoChanged, b); }\r
+ JUCE_NODISCARD ChangeDetails withParameterInfoChanged (bool b) const noexcept { return with (&ChangeDetails::parameterInfoChanged, b); }\r
\r
/** Indicates that the loaded program has changed.\r
\r
\r
@see programChanged\r
*/\r
- ChangeDetails withProgramChanged (bool b) const noexcept { return with (&ChangeDetails::programChanged, b); }\r
+ JUCE_NODISCARD ChangeDetails withProgramChanged (bool b) const noexcept { return with (&ChangeDetails::programChanged, b); }\r
\r
/** Indicates that the plugin state has changed (but not its parameters!).\r
\r
\r
@see nonParameterStateChanged\r
*/\r
- ChangeDetails withNonParameterStateChanged (bool b) const noexcept { return with (&ChangeDetails::nonParameterStateChanged, b); }\r
+ JUCE_NODISCARD ChangeDetails withNonParameterStateChanged (bool b) const noexcept { return with (&ChangeDetails::nonParameterStateChanged, b); }\r
\r
/** Returns the default set of flags that will be used when\r
AudioProcessor::updateHostDisplay() is called with no arguments.\r
\r
enum Category\r
{\r
- genericParameter = (0 << 16) | 0, /** If your parameter is not a meter then you should use this category */\r
+ genericParameter = (0 << 16) | 0, /**< If your parameter is not a meter then you should use this category */\r
\r
- inputGain = (1 << 16) | 0, /** Currently not used */\r
+ inputGain = (1 << 16) | 0, /**< Currently not used */\r
outputGain = (1 << 16) | 1,\r
\r
/** The following categories tell the host that this parameter is a meter level value\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterListener)\r
};\r
\r
+class ParameterComponent : public Component,\r
+ public ParameterListener\r
+{\r
+public:\r
+ using ParameterListener::ParameterListener;\r
+};\r
+\r
//==============================================================================\r
-class BooleanParameterComponent final : public Component,\r
- private ParameterListener\r
+class BooleanParameterComponent : public ParameterComponent\r
{\r
public:\r
BooleanParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ : ParameterComponent (proc, param)\r
{\r
// Set the initial value.\r
handleNewParameterValue();\r
button.setBounds (area.reduced (0, 10));\r
}\r
\r
-private:\r
void handleNewParameterValue() override\r
{\r
button.setToggleState (isParameterOn(), dontSendNotification);\r
}\r
\r
+private:\r
void buttonClicked()\r
{\r
if (isParameterOn() != button.getToggleState())\r
};\r
\r
//==============================================================================\r
-class SwitchParameterComponent final : public Component,\r
- private ParameterListener\r
+class SwitchParameterComponent : public ParameterComponent\r
{\r
public:\r
SwitchParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ : ParameterComponent (proc, param)\r
{\r
for (auto& button : buttons)\r
{\r
button.setBounds (area.removeFromLeft (80));\r
}\r
\r
-private:\r
void handleNewParameterValue() override\r
{\r
bool newState = isParameterOn();\r
}\r
}\r
\r
+private:\r
void rightButtonChanged()\r
{\r
auto buttonState = buttons[1].getToggleState();\r
};\r
\r
//==============================================================================\r
-class ChoiceParameterComponent final : public Component,\r
- private ParameterListener\r
+class ChoiceParameterComponent : public ParameterComponent\r
{\r
public:\r
ChoiceParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param),\r
+ : ParameterComponent (proc, param),\r
parameterValues (getParameter().getAllValueStrings())\r
{\r
box.addItemList (parameterValues, 1);\r
};\r
\r
//==============================================================================\r
-class SliderParameterComponent final : public Component,\r
- private ParameterListener\r
+class SliderParameterComponent : public ParameterComponent\r
{\r
public:\r
SliderParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ : ParameterComponent (proc, param)\r
{\r
if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps())\r
slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0));\r
slider.setBounds (area);\r
}\r
\r
-private:\r
- void updateTextDisplay()\r
- {\r
- valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification);\r
- }\r
-\r
void handleNewParameterValue() override\r
{\r
if (! isDragging)\r
}\r
}\r
\r
+private:\r
+ void updateTextDisplay()\r
+ {\r
+ valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification);\r
+ }\r
+\r
void sliderValueChanged()\r
{\r
auto newVal = (float) slider.getValue();\r
{\r
if (e.mods.isRightButtonDown())\r
if (auto* context = editor.getHostContext())\r
- if (auto menu = context->getContextMenuForParameterIndex (¶meter))\r
+ if (auto menu = context->getContextMenuForParameter (¶meter))\r
menu->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
.withMousePosition());\r
}\r
AudioProcessorEditor& editor;\r
AudioProcessorParameter& parameter;\r
Label parameterName, parameterLabel;\r
- std::unique_ptr<Component> parameterComp;\r
+ std::unique_ptr<ParameterComponent> parameterComp;\r
\r
- std::unique_ptr<Component> createParameterComp (AudioProcessor& processor) const\r
+ std::unique_ptr<ParameterComponent> createParameterComp (AudioProcessor& processor) const\r
{\r
// The AU, AUv3 and VST (only via a .vstxml file) SDKs support\r
// marking a parameter as boolean. If you want consistency across\r
{\r
parameterName .setText (parameter.getName (128), dontSendNotification);\r
parameterLabel.setText (parameter.getLabel(), dontSendNotification);\r
+\r
+ if (auto* p = parameterComp.get())\r
+ p->handleNewParameterValue();\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterDisplayComponent)\r
\r
String PluginDescription::createIdentifierString() const\r
{\r
- return pluginFormatName + "-" + name + getPluginDescSuffix (*this, uniqueId);\r
+ const auto idToUse = uniqueId != 0 ? uniqueId : deprecatedUid;\r
+ return pluginFormatName + "-" + name + getPluginDescSuffix (*this, idToUse);\r
}\r
\r
std::unique_ptr<XmlElement> PluginDescription::createXml() const\r
File deadMansPedalFile;\r
StringArray failedFiles;\r
Atomic<int> nextIndex;\r
- float progress = 0;\r
+ std::atomic<float> progress { 0.0f };\r
const bool allowAsync;\r
\r
void updateProgress();\r
String pluginBeingScanned;\r
double progress = 0;\r
const int numThreads;\r
- bool allowAsync, finished = false, timerReentrancyCheck = false;\r
+ bool allowAsync, timerReentrancyCheck = false;\r
+ std::atomic<bool> finished { false };\r
std::unique_ptr<ThreadPool> pool;\r
std::set<String> initiallyBlacklistedFiles;\r
\r
if (timerReentrancyCheck)\r
return;\r
\r
+ progress = scanner->getProgress();\r
+\r
if (pool == nullptr)\r
{\r
const ScopedValueSetter<bool> setter (timerReentrancyCheck, true);\r
bool doNextScan()\r
{\r
if (scanner->scanNextFile (true, pluginBeingScanned))\r
- {\r
- progress = scanner->getProgress();\r
return true;\r
- }\r
\r
finished = true;\r
return false;\r
\r
ID: juce_audio_utils\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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: 6.1.5\r
+ version: 6.1.6\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
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wconversion",\r
"-Wshadow-field",\r
"-Wzero-as-null-pointer-constant",\r
- "-Wsign-conversion")\r
+ "-Wsign-conversion",\r
+ "-Wdeprecated")\r
\r
#include <climits>\r
#include <cfloat>\r
\r
if (! filename.containsOnly ("."))\r
{\r
+ const auto fullPath = File::createFileWithoutCheckingPath (path + filename);\r
bool matches = false;\r
\r
if (isDirectory)\r
{\r
- if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden))\r
- subIterator.reset (new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename),\r
- true, wildCard, whatToLookFor));\r
+ const auto mayRecurseIntoPossibleHiddenDir = [this, &isHidden]\r
+ {\r
+ return (whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden;\r
+ };\r
+\r
+ const auto mayRecurseIntoPossibleSymlink = [this, &fullPath]\r
+ {\r
+ return followSymlinks == File::FollowSymlinks::yes\r
+ || ! fullPath.isSymbolicLink()\r
+ || (followSymlinks == File::FollowSymlinks::noCycles\r
+ && knownPaths->find (fullPath.getLinkedTarget()) == knownPaths->end());\r
+ };\r
+\r
+ if (isRecursive && mayRecurseIntoPossibleHiddenDir() && mayRecurseIntoPossibleSymlink())\r
+ subIterator.reset (new DirectoryIterator (fullPath, true, wildCard, whatToLookFor, followSymlinks, knownPaths));\r
\r
matches = (whatToLookFor & File::findDirectories) != 0;\r
}\r
\r
if (matches)\r
{\r
- currentFile = File::createFileWithoutCheckingPath (path + filename);\r
+ currentFile = fullPath;\r
if (isHiddenResult != nullptr) *isHiddenResult = isHidden;\r
if (isDirResult != nullptr) *isDirResult = isDirectory;\r
\r
A DirectoryIterator will search through a directory and its subdirectories using\r
a wildcard filepattern match.\r
\r
+ The iterator keeps track of directories that it has previously traversed, and will\r
+ skip any previously-seen directories in the case of cycles caused by symbolic links.\r
+ It is also possible to avoid following symbolic links altogether.\r
+\r
If you may be scanning a large number of files, it's usually smarter to use this\r
class than File::findChildFiles() because it allows you to stop at any time, rather\r
than having to wait for the entire scan to finish before getting the results.\r
DirectoryIterator (const File& directory,\r
bool recursive,\r
const String& pattern = "*",\r
- int type = File::findFiles)\r
- : wildCards (parseWildcards (pattern)),\r
- fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern),\r
- wildCard (pattern),\r
- path (File::addTrailingSeparator (directory.getFullPathName())),\r
- whatToLookFor (type),\r
- isRecursive (recursive)\r
+ int type = File::findFiles,\r
+ File::FollowSymlinks follow = File::FollowSymlinks::yes)\r
+ : DirectoryIterator (directory, recursive, pattern, type, follow, nullptr)\r
{\r
- // you have to specify the type of files you're looking for!\r
- jassert ((whatToLookFor & (File::findFiles | File::findDirectories)) != 0);\r
- jassert (whatToLookFor > 0 && whatToLookFor <= 7);\r
}\r
\r
/** Moves the iterator along to the next file.\r
float getEstimatedProgress() const;\r
\r
private:\r
+ using KnownPaths = std::set<File>;\r
+\r
+ DirectoryIterator (const File& directory,\r
+ bool recursive,\r
+ const String& pattern,\r
+ int type,\r
+ File::FollowSymlinks follow,\r
+ KnownPaths* seenPaths)\r
+ : wildCards (parseWildcards (pattern)),\r
+ fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern),\r
+ wildCard (pattern),\r
+ path (File::addTrailingSeparator (directory.getFullPathName())),\r
+ whatToLookFor (type),\r
+ isRecursive (recursive),\r
+ followSymlinks (follow),\r
+ knownPaths (seenPaths)\r
+ {\r
+ // you have to specify the type of files you're looking for!\r
+ jassert ((whatToLookFor & (File::findFiles | File::findDirectories)) != 0);\r
+ jassert (whatToLookFor > 0 && whatToLookFor <= 7);\r
+\r
+ if (followSymlinks == File::FollowSymlinks::noCycles)\r
+ {\r
+ if (knownPaths == nullptr)\r
+ {\r
+ heapKnownPaths = std::make_unique<KnownPaths>();\r
+ knownPaths = heapKnownPaths.get();\r
+ }\r
+\r
+ knownPaths->insert (directory);\r
+ }\r
+ }\r
+\r
//==============================================================================\r
struct NativeIterator\r
{\r
bool hasBeenAdvanced = false;\r
std::unique_ptr<DirectoryIterator> subIterator;\r
File currentFile;\r
+ File::FollowSymlinks followSymlinks = File::FollowSymlinks::yes;\r
+ KnownPaths* knownPaths = nullptr;\r
+ std::unique_ptr<KnownPaths> heapKnownPaths;\r
\r
static StringArray parseWildcards (const String& pattern);\r
static bool fileMatches (const StringArray& wildCards, const String& filename);\r
}\r
\r
//==============================================================================\r
-Array<File> File::findChildFiles (int whatToLookFor, bool searchRecursively, const String& wildcard) const\r
+Array<File> File::findChildFiles (int whatToLookFor, bool searchRecursively, const String& wildcard, FollowSymlinks followSymlinks) const\r
{\r
Array<File> results;\r
- findChildFiles (results, whatToLookFor, searchRecursively, wildcard);\r
+ findChildFiles (results, whatToLookFor, searchRecursively, wildcard, followSymlinks);\r
return results;\r
}\r
\r
-int File::findChildFiles (Array<File>& results, int whatToLookFor, bool searchRecursively, const String& wildcard) const\r
+int File::findChildFiles (Array<File>& results, int whatToLookFor, bool searchRecursively, const String& wildcard, FollowSymlinks followSymlinks) const\r
{\r
int total = 0;\r
\r
- for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor))\r
+ for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor, followSymlinks))\r
{\r
results.add (di.getFile());\r
++total;\r
ignoreHiddenFiles = 4 /**< Add this flag to avoid returning any hidden files in the results. */\r
};\r
\r
+ enum class FollowSymlinks\r
+ {\r
+ /** Requests that a file system traversal should not follow any symbolic links. */\r
+ no,\r
+\r
+ /** Requests that a file system traversal may follow symbolic links, but should attempt to\r
+ skip any symbolic links to directories that may cause a cycle.\r
+ */\r
+ noCycles,\r
+\r
+ /** Requests that a file system traversal follow all symbolic links. Use with care, as this\r
+ may produce inconsistent results, or fail to terminate, if the filesystem contains cycles\r
+ due to symbolic links.\r
+ */\r
+ yes\r
+ };\r
+\r
/** Searches this directory for files matching a wildcard pattern.\r
\r
Assuming that this file is a directory, this method will search it\r
@param searchRecursively if true, all subdirectories will be recursed into to do\r
an exhaustive search\r
@param wildCardPattern the filename pattern to search for, e.g. "*.txt"\r
+ @param followSymlinks the method that should be used to handle symbolic links\r
@returns the set of files that were found\r
\r
@see getNumberOfChildFiles, RangedDirectoryIterator\r
*/\r
Array<File> findChildFiles (int whatToLookFor,\r
bool searchRecursively,\r
- const String& wildCardPattern = "*") const;\r
+ const String& wildCardPattern = "*",\r
+ FollowSymlinks followSymlinks = FollowSymlinks::yes) const;\r
\r
/** Searches inside a directory for files matching a wildcard pattern.\r
Note that there's a newer, better version of this method which returns the results\r
mainly for legacy code to use.\r
*/\r
int findChildFiles (Array<File>& results, int whatToLookFor,\r
- bool searchRecursively, const String& wildCardPattern = "*") const;\r
+ bool searchRecursively, const String& wildCardPattern = "*",\r
+ FollowSymlinks followSymlinks = FollowSymlinks::yes) const;\r
\r
/** Searches inside a directory and counts how many files match a wildcard pattern.\r
\r
\r
@see globalApplicationsDirectory\r
*/\r
- globalApplicationsDirectoryX86\r
+ globalApplicationsDirectoryX86,\r
+\r
+ /** On a Windows machine returns the %LOCALAPPDATA% folder. */\r
+ windowsLocalAppData\r
#endif\r
};\r
\r
RangedDirectoryIterator::RangedDirectoryIterator (const File& directory,\r
bool isRecursive,\r
const String& wildCard,\r
- int whatToLookFor)\r
+ int whatToLookFor,\r
+ File::FollowSymlinks followSymlinks)\r
: iterator (new DirectoryIterator (directory,\r
isRecursive,\r
wildCard,\r
- whatToLookFor))\r
+ whatToLookFor,\r
+ followSymlinks))\r
{\r
entry.iterator = iterator;\r
increment();\r
separated by a semi-colon or comma, e.g. "*.jpg;*.png"\r
@param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying\r
whether to look for files, directories, or both.\r
+ @param followSymlinks the policy to use when symlinks are encountered\r
*/\r
RangedDirectoryIterator (const File& directory,\r
bool isRecursive,\r
const String& wildCard = "*",\r
- int whatToLookFor = File::findFiles);\r
+ int whatToLookFor = File::findFiles,\r
+ File::FollowSymlinks followSymlinks = File::FollowSymlinks::yes);\r
\r
/** Returns true if both iterators are in their end/sentinel state,\r
otherwise returns false.\r
namespace juce\r
{\r
\r
+// Using Random::getSystemRandom() can be a bit dangerous in multithreaded contexts!\r
+class LockedRandom\r
+{\r
+public:\r
+ int nextInt()\r
+ {\r
+ const ScopedLock lock (mutex);\r
+ return random.nextInt();\r
+ }\r
+\r
+private:\r
+ CriticalSection mutex;\r
+ Random random;\r
+};\r
+\r
+static LockedRandom lockedRandom;\r
+\r
static File createTempFile (const File& parentDirectory, String name,\r
const String& suffix, int optionFlags)\r
{\r
\r
TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags)\r
: temporaryFile (createTempFile (File::getSpecialLocation (File::tempDirectory),\r
- "temp_" + String::toHexString (Random::getSystemRandom().nextInt()),\r
+ "temp_" + String::toHexString (lockedRandom.nextInt()),\r
suffix, optionFlags)),\r
targetFile()\r
{\r
TemporaryFile::TemporaryFile (const File& target, const int optionFlags)\r
: temporaryFile (createTempFile (target.getParentDirectory(),\r
target.getFileNameWithoutExtension()\r
- + "_temp" + String::toHexString (Random::getSystemRandom().nextInt()),\r
+ + "_temp" + String::toHexString (lockedRandom.nextInt()),\r
target.getFileExtension(), optionFlags)),\r
targetFile (target)\r
{\r
\r
ID: juce_core\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
}\r
\r
/** Scans an array of values, returning the minimum value that it contains. */\r
-template <typename Type>\r
-Type findMinimum (const Type* data, int numValues)\r
+template <typename Type, typename Size>\r
+Type findMinimum (const Type* data, Size numValues)\r
{\r
if (numValues <= 0)\r
return Type (0);\r
}\r
\r
/** Scans an array of values, returning the maximum value that it contains. */\r
-template <typename Type>\r
-Type findMaximum (const Type* values, int numValues)\r
+template <typename Type, typename Size>\r
+Type findMaximum (const Type* values, Size numValues)\r
{\r
if (numValues <= 0)\r
return Type (0);\r
setSeedRandomly();\r
}\r
\r
-Random::~Random() noexcept\r
-{\r
-}\r
-\r
void Random::setSeed (const int64 newSeed) noexcept\r
{\r
if (this == &getSystemRandom())\r
*/\r
Random();\r
\r
- /** Destructor. */\r
- ~Random() noexcept;\r
-\r
/** Returns the next random 32 bit integer.\r
@returns a random integer from the full range 0x80000000 to 0x7fffffff\r
*/\r
}\r
\r
/** Returns a range with a given start and length. */\r
- static Range withStartAndLength (const ValueType startValue, const ValueType length) noexcept\r
+ JUCE_NODISCARD static Range withStartAndLength (const ValueType startValue, const ValueType length) noexcept\r
{\r
jassert (length >= ValueType());\r
return Range (startValue, startValue + length);\r
}\r
\r
/** Returns a range with the specified start position and a length of zero. */\r
- constexpr static Range emptyRange (const ValueType start) noexcept\r
+ JUCE_NODISCARD constexpr static Range emptyRange (const ValueType start) noexcept\r
{\r
return Range (start, start);\r
}\r
If the new start position is higher than the current end of the range, the end point\r
will be pushed along to equal it, returning an empty range at the new position.\r
*/\r
- constexpr Range withStart (const ValueType newStart) const noexcept\r
+ JUCE_NODISCARD constexpr Range withStart (const ValueType newStart) const noexcept\r
{\r
return Range (newStart, jmax (newStart, end));\r
}\r
\r
/** Returns a range with the same length as this one, but moved to have the given start position. */\r
- constexpr Range movedToStartAt (const ValueType newStart) const noexcept\r
+ JUCE_NODISCARD constexpr Range movedToStartAt (const ValueType newStart) const noexcept\r
{\r
return Range (newStart, end + (newStart - start));\r
}\r
If the new end position is below the current start of the range, the start point\r
will be pushed back to equal the new end point.\r
*/\r
- constexpr Range withEnd (const ValueType newEnd) const noexcept\r
+ JUCE_NODISCARD constexpr Range withEnd (const ValueType newEnd) const noexcept\r
{\r
return Range (jmin (start, newEnd), newEnd);\r
}\r
\r
/** Returns a range with the same length as this one, but moved to have the given end position. */\r
- constexpr Range movedToEndAt (const ValueType newEnd) const noexcept\r
+ JUCE_NODISCARD constexpr Range movedToEndAt (const ValueType newEnd) const noexcept\r
{\r
return Range (start + (newEnd - end), newEnd);\r
}\r
/** Returns a range with the same start as this one, but a different length.\r
Lengths less than zero are treated as zero.\r
*/\r
- constexpr Range withLength (const ValueType newLength) const noexcept\r
+ JUCE_NODISCARD constexpr Range withLength (const ValueType newLength) const noexcept\r
{\r
return Range (start, start + newLength);\r
}\r
given amount.\r
@returns The returned range will be (start - amount, end + amount)\r
*/\r
- constexpr Range expanded (ValueType amount) const noexcept\r
+ JUCE_NODISCARD constexpr Range expanded (ValueType amount) const noexcept\r
{\r
return Range (start - amount, end + amount);\r
}\r
\r
/** Returns the range that is the intersection of the two ranges, or an empty range\r
with an undefined start position if they don't overlap. */\r
- constexpr Range getIntersectionWith (Range other) const noexcept\r
+ JUCE_NODISCARD constexpr Range getIntersectionWith (Range other) const noexcept\r
{\r
return Range (jmax (start, other.start),\r
jmin (end, other.end));\r
}\r
\r
/** Returns the smallest range that contains both this one and the other one. */\r
- constexpr Range getUnionWith (Range other) const noexcept\r
+ JUCE_NODISCARD constexpr Range getUnionWith (Range other) const noexcept\r
{\r
return Range (jmin (start, other.start),\r
jmax (end, other.end));\r
}\r
\r
/** Returns the smallest range that contains both this one and the given value. */\r
- constexpr Range getUnionWith (const ValueType valueToInclude) const noexcept\r
+ JUCE_NODISCARD constexpr Range getUnionWith (const ValueType valueToInclude) const noexcept\r
{\r
return Range (jmin (valueToInclude, start),\r
jmax (valueToInclude, end));\r
#include <winsock2.h>\r
#include <ws2tcpip.h>\r
#include <iphlpapi.h>\r
+\r
+ #if ! JUCE_CXX17_IS_AVAILABLE\r
+ #pragma push_macro ("WIN_NOEXCEPT")\r
+ #define WIN_NOEXCEPT\r
+ #endif\r
+\r
#include <mapi.h>\r
+\r
+ #if ! JUCE_CXX17_IS_AVAILABLE\r
+ #pragma pop_macro ("WIN_NOEXCEPT")\r
+ #endif\r
+\r
#include <float.h>\r
#include <process.h>\r
#include <shlobj.h>\r
\r
~Pimpl()\r
{\r
- if (pipeIn != -1) ::close (pipeIn);\r
- if (pipeOut != -1) ::close (pipeOut);\r
+ pipeIn .close();\r
+ pipeOut.close();\r
\r
if (createdPipe)\r
{\r
\r
bool connect (int timeOutMilliseconds)\r
{\r
- return openPipe (true, getTimeoutEnd (timeOutMilliseconds));\r
+ return openPipe (true, getTimeoutEnd (timeOutMilliseconds)) != invalidPipe;\r
}\r
\r
int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds)\r
\r
while (bytesRead < maxBytesToRead)\r
{\r
+ const auto pipe = pipeIn.get();\r
+\r
auto bytesThisTime = maxBytesToRead - bytesRead;\r
- auto numRead = (int) ::read (pipeIn, destBuffer, (size_t) bytesThisTime);\r
+ auto numRead = (int) ::read (pipe, destBuffer, (size_t) bytesThisTime);\r
\r
if (numRead <= 0)\r
{\r
return -1;\r
\r
const int maxWaitingTime = 30;\r
- waitForInput (pipeIn, timeoutEnd == 0 ? maxWaitingTime\r
- : jmin (maxWaitingTime,\r
- (int) (timeoutEnd - Time::getMillisecondCounter())));\r
+ waitForInput (pipe, timeoutEnd == 0 ? maxWaitingTime\r
+ : jmin (maxWaitingTime,\r
+ (int) (timeoutEnd - Time::getMillisecondCounter())));\r
continue;\r
}\r
\r
{\r
auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds);\r
\r
- if (! openPipe (false, timeoutEnd))\r
+ const auto pipe = openPipe (false, timeoutEnd);\r
+\r
+ if (pipe == invalidPipe)\r
return -1;\r
\r
int bytesWritten = 0;\r
while (bytesWritten < numBytesToWrite && ! hasExpired (timeoutEnd))\r
{\r
auto bytesThisTime = numBytesToWrite - bytesWritten;\r
- auto numWritten = (int) ::write (pipeOut, sourceBuffer, (size_t) bytesThisTime);\r
+ auto numWritten = (int) ::write (pipe, sourceBuffer, (size_t) bytesThisTime);\r
\r
if (numWritten < 0)\r
{\r
const int maxWaitingTime = 30;\r
\r
if (error == EWOULDBLOCK || error == EAGAIN)\r
- waitToWrite (pipeOut, timeoutEnd == 0 ? maxWaitingTime\r
- : jmin (maxWaitingTime,\r
- (int) (timeoutEnd - Time::getMillisecondCounter())));\r
+ waitToWrite (pipe, timeoutEnd == 0 ? maxWaitingTime\r
+ : jmin (maxWaitingTime,\r
+ (int) (timeoutEnd - Time::getMillisecondCounter())));\r
else\r
return -1;\r
\r
return createdFifoIn && createdFifoOut;\r
}\r
\r
+ static constexpr auto invalidPipe = -1;\r
+\r
+ class PipeDescriptor\r
+ {\r
+ public:\r
+ template <typename Fn>\r
+ int get (Fn&& fn)\r
+ {\r
+ {\r
+ const ScopedReadLock l (mutex);\r
+\r
+ if (descriptor != invalidPipe)\r
+ return descriptor;\r
+ }\r
+\r
+ const ScopedWriteLock l (mutex);\r
+ return descriptor = fn();\r
+ }\r
+\r
+ void close()\r
+ {\r
+ {\r
+ const ScopedReadLock l (mutex);\r
+\r
+ if (descriptor == invalidPipe)\r
+ return;\r
+ }\r
+\r
+ const ScopedWriteLock l (mutex);\r
+ ::close (descriptor);\r
+ descriptor = invalidPipe;\r
+ }\r
+\r
+ int get()\r
+ {\r
+ const ScopedReadLock l (mutex);\r
+ return descriptor;\r
+ }\r
+\r
+ private:\r
+ ReadWriteLock mutex;\r
+ int descriptor = invalidPipe;\r
+ };\r
+\r
const String pipeInName, pipeOutName;\r
- int pipeIn = -1, pipeOut = -1;\r
+ PipeDescriptor pipeIn, pipeOut;\r
bool createdFifoIn = false, createdFifoOut = false;\r
\r
const bool createdPipe;\r
{\r
auto p = ::open (name.toUTF8(), flags);\r
\r
- if (p != -1 || hasExpired (timeoutEnd) || stopReadOperation.load())\r
+ if (p != invalidPipe || hasExpired (timeoutEnd) || stopReadOperation.load())\r
return p;\r
\r
Thread::sleep (2);\r
}\r
}\r
\r
- bool openPipe (bool isInput, uint32 timeoutEnd)\r
+ int openPipe (bool isInput, uint32 timeoutEnd)\r
{\r
auto& pipe = isInput ? pipeIn : pipeOut;\r
- int flags = (isInput ? O_RDWR : O_WRONLY) | O_NONBLOCK;\r
+ const auto flags = (isInput ? O_RDWR : O_WRONLY) | O_NONBLOCK;\r
\r
const String& pipeName = isInput ? (createdPipe ? pipeInName : pipeOutName)\r
: (createdPipe ? pipeOutName : pipeInName);\r
\r
- if (pipe == -1)\r
+ return pipe.get ([this, &pipeName, &flags, &timeoutEnd]\r
{\r
- pipe = openPipe (pipeName, flags, timeoutEnd);\r
-\r
- if (pipe == -1)\r
- return false;\r
- }\r
-\r
- return true;\r
+ return openPipe (pipeName, flags, timeoutEnd);\r
+ });\r
}\r
\r
static void waitForInput (int handle, int timeoutMsecs) noexcept\r
\r
void NamedPipe::close()\r
{\r
- {\r
- ScopedReadLock sl (lock);\r
+ ScopedWriteLock sl (lock);\r
\r
- if (pimpl != nullptr)\r
- {\r
- pimpl->stopReadOperation = true;\r
+ if (pimpl != nullptr)\r
+ {\r
+ pimpl->stopReadOperation = true;\r
\r
- char buffer[1] = { 0 };\r
- ssize_t done = ::write (pimpl->pipeIn, buffer, 1);\r
- ignoreUnused (done);\r
- }\r
+ const char buffer[] { 0 };\r
+ const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer));\r
+ ignoreUnused (done);\r
}\r
\r
- {\r
- ScopedWriteLock sl (lock);\r
- pimpl.reset();\r
- }\r
+ pimpl.reset();\r
}\r
\r
bool NamedPipe::openInternal (const String& pipeName, bool createPipe, bool mustNotExist)\r
\r
switch (type)\r
{\r
- case userHomeDirectory: csidlType = CSIDL_PROFILE; break;\r
- case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break;\r
- case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break;\r
- case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break;\r
- case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break;\r
- case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break;\r
- case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break;\r
- case globalApplicationsDirectoryX86: csidlType = CSIDL_PROGRAM_FILESX86; break;\r
- case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break;\r
- case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break;\r
- case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break;\r
+ case userHomeDirectory: csidlType = CSIDL_PROFILE; break;\r
+ case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break;\r
+ case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break;\r
+ case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break;\r
+ case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break;\r
+ case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break;\r
+ case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break;\r
+ case globalApplicationsDirectoryX86: csidlType = CSIDL_PROGRAM_FILESX86; break;\r
+ case windowsLocalAppData: csidlType = CSIDL_LOCAL_APPDATA; break;\r
+ case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break;\r
+ case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break;\r
+ case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break;\r
\r
case tempDirectory:\r
{\r
\r
@see withNewSubPath\r
*/\r
- URL withNewDomainAndPath (const String& newFullPath) const;\r
+ JUCE_NODISCARD URL withNewDomainAndPath (const String& newFullPath) const;\r
\r
/** Returns a new version of this URL with a different sub-path.\r
\r
\r
@see withNewDomainAndPath\r
*/\r
- URL withNewSubPath (const String& newPath) const;\r
+ JUCE_NODISCARD URL withNewSubPath (const String& newPath) const;\r
\r
/** Attempts to return a URL which is the parent folder containing this URL.\r
\r
\r
@see getParameterNames, getParameterValues\r
*/\r
- URL withParameter (const String& parameterName,\r
- const String& parameterValue) const;\r
+ JUCE_NODISCARD URL withParameter (const String& parameterName,\r
+ const String& parameterValue) const;\r
\r
/** Returns a copy of this URL, with a set of GET or POST parameters added.\r
\r
\r
@see withParameter\r
*/\r
- URL withParameters (const StringPairArray& parametersToAdd) const;\r
+ JUCE_NODISCARD URL withParameters (const StringPairArray& parametersToAdd) const;\r
\r
/** Returns a copy of this URL, with a file-upload type parameter added to it.\r
\r
\r
@see withDataToUpload\r
*/\r
- URL withFileToUpload (const String& parameterName,\r
- const File& fileToUpload,\r
- const String& mimeType) const;\r
+ JUCE_NODISCARD URL withFileToUpload (const String& parameterName,\r
+ const File& fileToUpload,\r
+ const String& mimeType) const;\r
\r
/** Returns a copy of this URL, with a file-upload type parameter added to it.\r
\r
\r
@see withFileToUpload\r
*/\r
- URL withDataToUpload (const String& parameterName,\r
- const String& filename,\r
- const MemoryBlock& fileContentToUpload,\r
- const String& mimeType) const;\r
+ JUCE_NODISCARD URL withDataToUpload (const String& parameterName,\r
+ const String& filename,\r
+ const MemoryBlock& fileContentToUpload,\r
+ const String& mimeType) const;\r
\r
/** Returns an array of the names of all the URL's parameters.\r
\r
If no HTTP command is set when calling createInputStream() to read from\r
this URL and some data has been set, it will do a POST request.\r
*/\r
- URL withPOSTData (const String& postData) const;\r
+ JUCE_NODISCARD URL withPOSTData (const String& postData) const;\r
\r
/** Returns a copy of this URL, with a block of data to send as the POST data.\r
\r
If no HTTP command is set when calling createInputStream() to read from\r
this URL and some data has been set, it will do a POST request.\r
*/\r
- URL withPOSTData (const MemoryBlock& postData) const;\r
+ JUCE_NODISCARD URL withPOSTData (const MemoryBlock& postData) const;\r
\r
/** Returns the data that was set using withPOSTData(). */\r
String getPostData() const { return postData.toString(); }\r
\r
This can be useful for lengthy POST operations, so that you can provide user feedback.\r
*/\r
- InputStreamOptions withProgressCallback (std::function<bool (int bytesSent, int totalBytes)> progressCallback) const;\r
+ JUCE_NODISCARD InputStreamOptions withProgressCallback (std::function<bool (int bytesSent, int totalBytes)> progressCallback) const;\r
\r
/** A string that will be appended onto the headers that are used for the request.\r
\r
It must be a valid set of HTML header directives, separated by newlines.\r
*/\r
- InputStreamOptions withExtraHeaders (const String& extraHeaders) const;\r
+ JUCE_NODISCARD InputStreamOptions withExtraHeaders (const String& extraHeaders) const;\r
\r
/** Specifies a timeout for the request in milliseconds.\r
\r
If 0, this will use whatever default setting the OS chooses. If a negative\r
number, it will be infinite.\r
*/\r
- InputStreamOptions withConnectionTimeoutMs (int connectionTimeoutMs) const;\r
+ JUCE_NODISCARD InputStreamOptions withConnectionTimeoutMs (int connectionTimeoutMs) const;\r
\r
/** If this is non-null, all the (key, value) pairs received as headers\r
in the response will be stored in this array.\r
*/\r
- InputStreamOptions withResponseHeaders (StringPairArray* responseHeaders) const;\r
+ JUCE_NODISCARD InputStreamOptions withResponseHeaders (StringPairArray* responseHeaders) const;\r
\r
/** If this is non-null, it will get set to the http status code, if one\r
is known, or 0 if a code isn't available.\r
*/\r
- InputStreamOptions withStatusCode (int* statusCode) const;\r
+ JUCE_NODISCARD InputStreamOptions withStatusCode (int* statusCode) const;\r
\r
/** Specifies the number of redirects that will be followed before returning a response.\r
\r
N.B. This will be ignored on Android which follows up to 5 redirects.\r
*/\r
- InputStreamOptions withNumRedirectsToFollow (int numRedirectsToFollow) const;\r
+ JUCE_NODISCARD InputStreamOptions withNumRedirectsToFollow (int numRedirectsToFollow) const;\r
\r
/** Specifies which HTTP request command to use.\r
\r
via withPOSTData(), withFileToUpload(), or withDataToUpload(). Otherwise it\r
will be GET.\r
*/\r
- InputStreamOptions withHttpRequestCmd (const String& httpRequestCmd) const;\r
+ JUCE_NODISCARD InputStreamOptions withHttpRequestCmd (const String& httpRequestCmd) const;\r
\r
//==============================================================================\r
ParameterHandling getParameterHandling() const noexcept { return parameterHandling; }\r
bool usePost = false;\r
\r
/** Specifies headers to add to the request. */\r
- auto withExtraHeaders (String value) const { return with (&DownloadTaskOptions::extraHeaders, std::move (value)); }\r
+ JUCE_NODISCARD auto withExtraHeaders (String value) const { return with (&DownloadTaskOptions::extraHeaders, std::move (value)); }\r
\r
/** On iOS, specifies the container where the downloaded file will be stored.\r
\r
\r
This is currently unused on other platforms.\r
*/\r
- auto withSharedContainer (String value) const { return with (&DownloadTaskOptions::sharedContainer, std::move (value)); }\r
+ JUCE_NODISCARD auto withSharedContainer (String value) const { return with (&DownloadTaskOptions::sharedContainer, std::move (value)); }\r
\r
/** Specifies an observer for the download task. */\r
- auto withListener (DownloadTaskListener* value) const { return with (&DownloadTaskOptions::listener, std::move (value)); }\r
+ JUCE_NODISCARD auto withListener (DownloadTaskListener* value) const { return with (&DownloadTaskOptions::listener, std::move (value)); }\r
\r
/** Specifies whether a post command should be used. */\r
- auto withUsePost (bool value) const { return with (&DownloadTaskOptions::usePost, value); }\r
+ JUCE_NODISCARD auto withUsePost (bool value) const { return with (&DownloadTaskOptions::usePost, value); }\r
\r
private:\r
template <typename Member, typename Value>\r
- DownloadTaskOptions with (Member&& member, Value&& value) const\r
+ JUCE_NODISCARD DownloadTaskOptions with (Member&& member, Value&& value) const\r
{\r
auto copy = *this;\r
copy.*member = std::forward<Value> (value);\r
#define JUCE_DELETED_FUNCTION = delete\r
#define JUCE_CONSTEXPR constexpr\r
#endif\r
+\r
+#if JUCE_CXX17_IS_AVAILABLE\r
+ #define JUCE_NODISCARD [[nodiscard]]\r
+#else\r
+ #define JUCE_NODISCARD\r
+#endif\r
*/\r
#define JUCE_MAJOR_VERSION 6\r
#define JUCE_MINOR_VERSION 1\r
-#define JUCE_BUILDNUMBER 5\r
+#define JUCE_BUILDNUMBER 6\r
\r
/** Current JUCE version number.\r
\r
#include <limits>\r
#include <list>\r
#include <map>\r
-#include <unordered_map>\r
#include <memory>\r
#include <mutex>\r
#include <numeric>\r
#include <queue>\r
+#include <set>\r
#include <sstream>\r
#include <typeindex>\r
+#include <unordered_map>\r
#include <unordered_set>\r
#include <vector>\r
#include <set>\r
\r
while (! t.isEmpty())\r
{\r
- auto hexValue = static_cast<ResultType> (CharacterFunctions::getHexDigitValue (t.getAndAdvance()));\r
+ auto hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance());\r
\r
if (hexValue >= 0)\r
- result = static_cast<ResultType> (result << 4) | hexValue;\r
+ result = static_cast<ResultType> (result << 4) | static_cast<ResultType> (hexValue);\r
}\r
\r
return result;\r
expect (String (StringRef ("abc")) == StringRef ("abc"));\r
expect (String ("abc") + StringRef ("def") == "abcdef");\r
\r
+ expect (String ("0x00").getHexValue32() == 0);\r
+ expect (String ("0x100").getHexValue32() == 256);\r
+\r
String s2 ("123");\r
s2 << ((int) 4) << ((short) 5) << "678" << L"9" << '0';\r
s2 += "xyz";\r
int lineWrapLength = 60; /**< A maximum line length before wrapping is done. (If newLineChars is nullptr, this is ignored) */\r
const char* newLineChars = "\r\n"; /**< Allows the newline characters to be set. If you set this to nullptr, then the whole XML document will be placed on a single line. */\r
\r
- TextFormat singleLine() const; /**< returns a copy of this format with newLineChars set to nullptr. */\r
- TextFormat withoutHeader() const; /**< returns a copy of this format with the addDefaultHeader flag set to false. */\r
+ JUCE_NODISCARD TextFormat singleLine() const; /**< returns a copy of this format with newLineChars set to nullptr. */\r
+ JUCE_NODISCARD TextFormat withoutHeader() const; /**< returns a copy of this format with the addDefaultHeader flag set to false. */\r
};\r
\r
/** Returns a text version of this XML element.\r
}\r
}\r
\r
-RSAKey::~RSAKey()\r
-{\r
-}\r
-\r
bool RSAKey::operator== (const RSAKey& other) const noexcept\r
{\r
return part1 == other.part1 && part2 == other.part2;\r
*/\r
explicit RSAKey (const String& stringRepresentation);\r
\r
- /** Destructor. */\r
- ~RSAKey();\r
-\r
bool operator== (const RSAKey& other) const noexcept;\r
bool operator!= (const RSAKey& other) const noexcept;\r
\r
\r
ID: juce_cryptography\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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: 6.1.5\r
+ version: 6.1.6\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
size_t numElements = std::numeric_limits<size_t>::max()) const\r
{\r
auto dstlen = static_cast<size_t> (dst.getNumSamples()) / sizeFactor;\r
- auto n = static_cast<int> (jmin (numSamples - srcPos, dstlen - dstPos, numElements) * sizeFactor);\r
+ auto n = jmin (numSamples - srcPos, dstlen - dstPos, numElements) * sizeFactor;\r
auto maxChannels = jmin (static_cast<size_t> (dst.getNumChannels()), static_cast<size_t> (numChannels));\r
\r
for (size_t ch = 0; ch < maxChannels; ++ch)\r
- FloatVectorOperations::copy (dst.getWritePointer (static_cast<int> (ch),\r
- static_cast<int> (dstPos * sizeFactor)),\r
+ FloatVectorOperations::copy (dst.getWritePointer ((int) ch, (int) (dstPos * sizeFactor)),\r
getDataPointer (ch) + (srcPos * sizeFactor),\r
n);\r
}\r
if (numChannels == 0)\r
return {};\r
\r
- auto n = static_cast<int> (numSamples * sizeFactor);\r
+ auto n = numSamples * sizeFactor;\r
auto minmax = FloatVectorOperations::findMinAndMax (getDataPointer (0), n);\r
\r
for (size_t ch = 1; ch < numChannels; ++ch)\r
//==============================================================================\r
void JUCE_VECTOR_CALLTYPE clearInternal() const noexcept\r
{\r
- auto n = static_cast<int> (numSamples * sizeFactor);\r
+ auto n = numSamples * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::clear (getDataPointer (ch), n);\r
\r
void JUCE_VECTOR_CALLTYPE fillInternal (NumericType value) const noexcept\r
{\r
- auto n = static_cast<int> (numSamples * sizeFactor);\r
+ auto n = numSamples * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::fill (getDataPointer (ch), value, n);\r
void copyFromInternal (const AudioBlock<OtherSampleType>& src) const noexcept\r
{\r
auto maxChannels = jmin (src.numChannels, numChannels);\r
- auto n = static_cast<int> (jmin (src.numSamples * src.sizeFactor,\r
- numSamples * sizeFactor));\r
+ auto n = jmin (src.numSamples * src.sizeFactor, numSamples * sizeFactor);\r
\r
for (size_t ch = 0; ch < maxChannels; ++ch)\r
FloatVectorOperations::copy (getDataPointer (ch), src.getDataPointer (ch), n);\r
void copyFromInternal (const AudioBuffer<OtherNumericType>& src, size_t srcPos, size_t dstPos, size_t numElements) const\r
{\r
auto srclen = static_cast<size_t> (src.getNumSamples()) / sizeFactor;\r
- auto n = static_cast<int> (jmin (srclen - srcPos, numSamples - dstPos, numElements) * sizeFactor);\r
+ auto n = jmin (srclen - srcPos, numSamples - dstPos, numElements) * sizeFactor;\r
auto maxChannels = jmin (static_cast<size_t> (src.getNumChannels()), static_cast<size_t> (numChannels));\r
\r
for (size_t ch = 0; ch < maxChannels; ++ch)\r
FloatVectorOperations::copy (getDataPointer (ch) + (dstPos * sizeFactor),\r
- src.getReadPointer (static_cast<int> (ch),\r
- static_cast<int> (srcPos * sizeFactor)),\r
+ src.getReadPointer ((int) ch, (int) (srcPos * sizeFactor)),\r
n);\r
}\r
\r
//==============================================================================\r
void JUCE_VECTOR_CALLTYPE addInternal (NumericType value) const noexcept\r
{\r
- auto n = static_cast<int> (numSamples * sizeFactor);\r
+ auto n = numSamples * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::add (getDataPointer (ch), value, n);\r
void addInternal (AudioBlock<OtherSampleType> src) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::add (getDataPointer (ch), src.getDataPointer (ch), n);\r
void JUCE_VECTOR_CALLTYPE replaceWithSumOfInternal (AudioBlock<OtherSampleType> src, NumericType value) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::add (getDataPointer (ch), src.getDataPointer (ch), value, n);\r
void replaceWithSumOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::add (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
void subtractInternal (AudioBlock<OtherSampleType> src) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::subtract (getDataPointer (ch), src.getDataPointer (ch), n);\r
void replaceWithDifferenceOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::subtract (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
//==============================================================================\r
void JUCE_VECTOR_CALLTYPE multiplyByInternal (NumericType value) const noexcept\r
{\r
- auto n = static_cast<int> (numSamples * sizeFactor);\r
+ auto n = numSamples * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::multiply (getDataPointer (ch), value, n);\r
void multiplyByInternal (AudioBlock<OtherSampleType> src) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::multiply (getDataPointer (ch), src.getDataPointer (ch), n);\r
void JUCE_VECTOR_CALLTYPE replaceWithProductOfInternal (AudioBlock<OtherSampleType> src, NumericType value) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::multiply (getDataPointer (ch), src.getDataPointer (ch), value, n);\r
void replaceWithProductOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::multiply (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
void JUCE_VECTOR_CALLTYPE addProductOfInternal (AudioBlock<OtherSampleType> src, NumericType factor) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::addWithMultiply (getDataPointer (ch), src.getDataPointer (ch), factor, n);\r
void addProductOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::addWithMultiply (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
void replaceWithNegativeOfInternal (AudioBlock<OtherSampleType> src) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::negate (getDataPointer (ch), src.getDataPointer (ch), n);\r
void replaceWithAbsoluteValueOfInternal (AudioBlock<OtherSampleType> src) const noexcept\r
{\r
jassert (numChannels == src.numChannels);\r
- auto n = static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);\r
+ auto n = jmin (numSamples, src.numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::abs (getDataPointer (ch), src.getDataPointer (ch), n);\r
void replaceWithMinOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor);\r
+ auto n = jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::min (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
void replaceWithMaxOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2) const noexcept\r
{\r
jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);\r
- auto n = static_cast<int> (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor);\r
+ auto n = jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor;\r
\r
for (size_t ch = 0; ch < numChannels; ++ch)\r
FloatVectorOperations::max (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n);\r
throw std::runtime_error { "this was meant to happen" };\r
}\r
\r
+ BadConstructor (const BadConstructor&) = default;\r
+ BadConstructor& operator= (const BadConstructor&) = delete;\r
+\r
~BadConstructor() noexcept { counts.destructions += 1; }\r
\r
void operator()() const noexcept { counts.calls += 1; }\r
template <typename Type>\r
struct SIMDRegister<Type>::ElementAccess\r
{\r
- operator Type() const { return simd.get (idx); }\r
- ElementAccess& operator= (Type scalar) noexcept { simd.set (idx, scalar); return *this; }\r
- ElementAccess& operator= (ElementAccess& o) noexcept { return operator= ((Type) o); }\r
+ ElementAccess (const ElementAccess&) = default;\r
+ operator Type() const { return simd.get (idx); }\r
+ ElementAccess& operator= (Type scalar) noexcept { simd.set (idx, scalar); return *this; }\r
+ ElementAccess& operator= (const ElementAccess& o) noexcept { return operator= ((Type) o); }\r
\r
private:\r
friend struct SIMDRegister;\r
\r
ID: juce_dsp\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
using AudioBlockType = AudioBlock<SampleType>;\r
using ConstAudioBlockType = AudioBlock<const SampleType>;\r
\r
- /** Creates a ProcessContextReplacing that uses the given input and output blocks.\r
+ /** Creates a ProcessContextNonReplacing that uses the given input and output blocks.\r
Note that the caller must not delete these blocks while they are still in use by this object!\r
*/\r
ProcessContextNonReplacing (const ConstAudioBlockType& input, AudioBlockType& output) noexcept\r
{\r
public:\r
ChangeBroadcasterCallback();\r
+ ~ChangeBroadcasterCallback() override { cancelPendingUpdate(); }\r
void handleAsyncUpdate() override;\r
\r
ChangeBroadcaster* owner;\r
pingReceived();\r
}\r
\r
+ void startPinging() { startThread (4); }\r
+\r
void pingReceived() noexcept { countdown = timeoutMs / 1000 + 1; }\r
void triggerConnectionLostMessage() { triggerAsyncUpdate(); }\r
\r
ChildProcessPingThread (timeout),\r
owner (m)\r
{\r
- if (createPipe (pipeName, timeoutMs))\r
- startThread (4);\r
+ createPipe (pipeName, timeoutMs);\r
}\r
\r
~Connection() override\r
stopThread (10000);\r
}\r
\r
+ using ChildProcessPingThread::startPinging;\r
+\r
private:\r
void connectionMade() override {}\r
void connectionLost() override { owner.handleConnectionLost(); }\r
owner (p)\r
{\r
connectToPipe (pipeName, timeoutMs);\r
- startThread (4);\r
}\r
\r
~Connection() override\r
{\r
stopThread (10000);\r
+ disconnect();\r
}\r
\r
+ using ChildProcessPingThread::startPinging;\r
+\r
private:\r
ChildProcessWorker& owner;\r
\r
{\r
connection.reset (new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs));\r
\r
- if (! connection->isConnected())\r
+ if (connection->isConnected())\r
+ connection->startPinging();\r
+ else\r
connection.reset();\r
}\r
}\r
\r
ID: juce_events\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
~TimerThread() override\r
{\r
+ cancelPendingUpdate();\r
signalThreadShouldExit();\r
callbackArrived.signal();\r
stopThread (4000);\r
\r
//==============================================================================\r
/** Returns a copy of this colour with a different hue. */\r
- Colour withHue (float newHue) const noexcept;\r
+ JUCE_NODISCARD Colour withHue (float newHue) const noexcept;\r
\r
/** Returns a copy of this colour with a different saturation. */\r
- Colour withSaturation (float newSaturation) const noexcept;\r
+ JUCE_NODISCARD Colour withSaturation (float newSaturation) const noexcept;\r
\r
/** Returns a copy of this colour with a different saturation in the HSL colour space. */\r
- Colour withSaturationHSL (float newSaturation) const noexcept;\r
+ JUCE_NODISCARD Colour withSaturationHSL (float newSaturation) const noexcept;\r
\r
/** Returns a copy of this colour with a different brightness.\r
@see brighter, darker, withMultipliedBrightness\r
*/\r
- Colour withBrightness (float newBrightness) const noexcept;\r
+ JUCE_NODISCARD Colour withBrightness (float newBrightness) const noexcept;\r
\r
/** Returns a copy of this colour with a different lightness.\r
@see lighter, darker, withMultipliedLightness\r
*/\r
- Colour withLightness (float newLightness) const noexcept;\r
+ JUCE_NODISCARD Colour withLightness (float newLightness) const noexcept;\r
\r
/** Returns a copy of this colour with its hue rotated.\r
The new colour's hue is ((this->getHue() + amountToRotate) % 1.0)\r
@see brighter, darker, withMultipliedBrightness\r
*/\r
- Colour withRotatedHue (float amountToRotate) const noexcept;\r
+ JUCE_NODISCARD Colour withRotatedHue (float amountToRotate) const noexcept;\r
\r
/** Returns a copy of this colour with its saturation multiplied by the given value.\r
The new colour's saturation is (this->getSaturation() * multiplier)\r
(the result is clipped to legal limits).\r
*/\r
- Colour withMultipliedSaturation (float multiplier) const noexcept;\r
+ JUCE_NODISCARD Colour withMultipliedSaturation (float multiplier) const noexcept;\r
\r
/** Returns a copy of this colour with its saturation multiplied by the given value.\r
The new colour's saturation is (this->getSaturation() * multiplier)\r
\r
This will be in the HSL colour space.\r
*/\r
- Colour withMultipliedSaturationHSL (float multiplier) const noexcept;\r
+ JUCE_NODISCARD Colour withMultipliedSaturationHSL (float multiplier) const noexcept;\r
\r
/** Returns a copy of this colour with its brightness multiplied by the given value.\r
The new colour's brightness is (this->getBrightness() * multiplier)\r
(the result is clipped to legal limits).\r
*/\r
- Colour withMultipliedBrightness (float amount) const noexcept;\r
+ JUCE_NODISCARD Colour withMultipliedBrightness (float amount) const noexcept;\r
\r
/** Returns a copy of this colour with its lightness multiplied by the given value.\r
The new colour's lightness is (this->lightness() * multiplier)\r
(the result is clipped to legal limits).\r
*/\r
- Colour withMultipliedLightness (float amount) const noexcept;\r
+ JUCE_NODISCARD Colour withMultipliedLightness (float amount) const noexcept;\r
\r
//==============================================================================\r
/** Returns a brighter version of this colour.\r
where 0 is unchanged, and higher values make it brighter\r
@see withMultipliedBrightness\r
*/\r
- Colour brighter (float amountBrighter = 0.4f) const noexcept;\r
+ JUCE_NODISCARD Colour brighter (float amountBrighter = 0.4f) const noexcept;\r
\r
/** Returns a darker version of this colour.\r
@param amountDarker how much darker to make it - a value greater than or equal to 0,\r
where 0 is unchanged, and higher values make it darker\r
@see withMultipliedBrightness\r
*/\r
- Colour darker (float amountDarker = 0.4f) const noexcept;\r
+ JUCE_NODISCARD Colour darker (float amountDarker = 0.4f) const noexcept;\r
\r
//==============================================================================\r
/** Returns a colour that will be clearly visible against this colour.\r
that's just a little bit lighter; Colours::black.contrasting (1.0f) will\r
return white; Colours::white.contrasting (1.0f) will return black, etc.\r
*/\r
- Colour contrasting (float amount = 1.0f) const noexcept;\r
+ JUCE_NODISCARD Colour contrasting (float amount = 1.0f) const noexcept;\r
\r
/** Returns a colour that is as close as possible to a target colour whilst\r
still being in contrast to this one.\r
nudged up or down so that it differs from the luminosity of this colour\r
by at least the amount specified by minLuminosityDiff.\r
*/\r
- Colour contrasting (Colour targetColour, float minLuminosityDiff) const noexcept;\r
+ JUCE_NODISCARD Colour contrasting (Colour targetColour, float minLuminosityDiff) const noexcept;\r
\r
/** Returns a colour that contrasts against two colours.\r
Looks for a colour that contrasts with both of the colours passed-in.\r
Handy for things like choosing a highlight colour in text editors, etc.\r
*/\r
- static Colour contrasting (Colour colour1,\r
- Colour colour2) noexcept;\r
+ JUCE_NODISCARD static Colour contrasting (Colour colour1,\r
+ Colour colour2) noexcept;\r
\r
//==============================================================================\r
/** Returns an opaque shade of grey.\r
@param brightness the level of grey to return - 0 is black, 1.0 is white\r
*/\r
- static Colour greyLevel (float brightness) noexcept;\r
+ JUCE_NODISCARD static Colour greyLevel (float brightness) noexcept;\r
\r
//==============================================================================\r
/** Returns a stringified version of this colour.\r
String toString() const;\r
\r
/** Reads the colour from a string that was created with toString(). */\r
- static Colour fromString (StringRef encodedColourString);\r
+ JUCE_NODISCARD static Colour fromString (StringRef encodedColourString);\r
\r
/** Returns the colour as a hex string in the form RRGGBB or AARRGGBB. */\r
String toDisplayString (bool includeAlphaValue) const;\r
}\r
}\r
\r
-//==============================================================================\r
-LowLevelGraphicsContext::LowLevelGraphicsContext() {}\r
-LowLevelGraphicsContext::~LowLevelGraphicsContext() {}\r
-\r
//==============================================================================\r
Graphics::Graphics (const Image& imageToDrawOnto)\r
: contextHolder (imageToDrawOnto.createLowLevelContext()),\r
{\r
}\r
\r
-Graphics::~Graphics()\r
-{\r
-}\r
-\r
//==============================================================================\r
void Graphics::resetToDefaultState()\r
{\r
*/\r
explicit Graphics (const Image& imageToDrawOnto);\r
\r
- /** Destructor. */\r
- ~Graphics();\r
-\r
//==============================================================================\r
/** Changes the current drawing colour.\r
\r
{\r
protected:\r
//==============================================================================\r
- LowLevelGraphicsContext();\r
+ LowLevelGraphicsContext() = default;\r
\r
public:\r
- virtual ~LowLevelGraphicsContext();\r
+ virtual ~LowLevelGraphicsContext() = default;\r
\r
/** Returns true if this device is vector-based, e.g. a printer. */\r
virtual bool isVectorDevice() const = 0;\r
<< scale << ' ' << scale << " scale\n\n";\r
}\r
\r
-LowLevelGraphicsPostScriptRenderer::~LowLevelGraphicsPostScriptRenderer()\r
-{\r
-}\r
-\r
//==============================================================================\r
bool LowLevelGraphicsPostScriptRenderer::isVectorDevice() const\r
{\r
{\r
}\r
\r
-LowLevelGraphicsPostScriptRenderer::SavedState::~SavedState()\r
-{\r
-}\r
-\r
void LowLevelGraphicsPostScriptRenderer::saveState()\r
{\r
stateStack.add (new SavedState (*stateStack.getLast()));\r
int totalWidth,\r
int totalHeight);\r
\r
- ~LowLevelGraphicsPostScriptRenderer() override;\r
-\r
//==============================================================================\r
bool isVectorDevice() const override;\r
void setOrigin (Point<int>) override;\r
{\r
SavedState();\r
SavedState& operator= (const SavedState&) = delete;\r
- ~SavedState();\r
\r
RectangleList<int> clip;\r
int xOffset, yOffset;\r
}\r
}\r
\r
+ inline bool areInvariantsMaintained (const String& text, const Array<AttributedString::Attribute>& atts)\r
+ {\r
+ if (atts.isEmpty())\r
+ return true;\r
+\r
+ if (atts.getFirst().range.getStart() != 0)\r
+ return false;\r
+\r
+ if (atts.getLast().range.getEnd() != text.length())\r
+ return false;\r
+\r
+ for (auto it = std::next (atts.begin()); it != atts.end(); ++it)\r
+ if (it->range.getStart() != std::prev (it)->range.getEnd())\r
+ return false;\r
+\r
+ return true;\r
+ }\r
+\r
Range<int> splitAttributeRanges (Array<AttributedString::Attribute>& atts, Range<int> newRange)\r
{\r
newRange = newRange.getIntersectionWith ({ 0, getLength (atts) });\r
truncate (attributes, newLength);\r
\r
text = newText;\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::append (const String& textToAppend)\r
{\r
text += textToAppend;\r
appendRange (attributes, textToAppend.length(), nullptr, nullptr);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::append (const String& textToAppend, const Font& font)\r
{\r
text += textToAppend;\r
appendRange (attributes, textToAppend.length(), &font, nullptr);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::append (const String& textToAppend, Colour colour)\r
{\r
text += textToAppend;\r
appendRange (attributes, textToAppend.length(), nullptr, &colour);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::append (const String& textToAppend, const Font& font, Colour colour)\r
{\r
text += textToAppend;\r
appendRange (attributes, textToAppend.length(), &font, &colour);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::append (const AttributedString& other)\r
attributes.getReference (i).range += originalLength;\r
\r
mergeAdjacentRanges (attributes);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::clear()\r
void AttributedString::setColour (Range<int> range, Colour colour)\r
{\r
applyFontAndColour (attributes, range, nullptr, &colour);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::setFont (Range<int> range, const Font& font)\r
{\r
applyFontAndColour (attributes, range, &font, nullptr);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::setColour (Colour colour)\r
{\r
setColour ({ 0, getLength (attributes) }, colour);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::setFont (const Font& font)\r
{\r
setFont ({ 0, getLength (attributes) }, font);\r
+ jassert (areInvariantsMaintained (text, attributes));\r
}\r
\r
void AttributedString::draw (Graphics& g, const Rectangle<float>& area) const\r
An attributed string lets you create a string with varied fonts, colours, word-wrapping,\r
layout, etc., and draw it using AttributedString::draw().\r
\r
+ Invariants:\r
+ - Every character in the string is a member of exactly one attribute.\r
+ - Attributes are sorted such that the range-end of attribute 'i' is equal to the\r
+ range-begin of attribute 'i + 1'.\r
+\r
@see TextLayout\r
\r
@tags{Graphics}\r
/** Returns a copy of this font with a new typeface style.\r
@see getAvailableStyles()\r
*/\r
- Font withTypefaceStyle (const String& newStyle) const;\r
+ JUCE_NODISCARD Font withTypefaceStyle (const String& newStyle) const;\r
\r
/** Returns a list of the styles that this font can use. */\r
StringArray getAvailableStyles() const;\r
\r
//==============================================================================\r
/** Returns a copy of this font with a new height. */\r
- Font withHeight (float height) const;\r
+ JUCE_NODISCARD Font withHeight (float height) const;\r
\r
/** Returns a copy of this font with a new height, specified in points. */\r
- Font withPointHeight (float heightInPoints) const;\r
+ JUCE_NODISCARD Font withPointHeight (float heightInPoints) const;\r
\r
/** Changes the font's height.\r
@see getHeight, withHeight, setHeightWithoutChangingWidth\r
@param styleFlags a bitwise-or'ed combination of values from the FontStyleFlags enum.\r
@see FontStyleFlags, getStyleFlags\r
*/\r
- Font withStyle (int styleFlags) const;\r
+ JUCE_NODISCARD Font withStyle (int styleFlags) const;\r
\r
/** Changes the font's style.\r
@param newFlags a bitwise-or'ed combination of values from the FontStyleFlags enum.\r
/** Returns a copy of this font with the bold attribute set.\r
If the font does not have a bold version, this will return the default font.\r
*/\r
- Font boldened() const;\r
+ JUCE_NODISCARD Font boldened() const;\r
\r
/** Returns true if the font is bold. */\r
bool isBold() const noexcept;\r
/** Makes the font italic or non-italic. */\r
void setItalic (bool shouldBeItalic);\r
/** Returns a copy of this font with the italic attribute set. */\r
- Font italicised() const;\r
+ JUCE_NODISCARD Font italicised() const;\r
/** Returns true if the font is italic. */\r
bool isItalic() const noexcept;\r
\r
narrower, greater than 1.0 will be stretched out.\r
@see getHorizontalScale\r
*/\r
- Font withHorizontalScale (float scaleFactor) const;\r
+ JUCE_NODISCARD Font withHorizontalScale (float scaleFactor) const;\r
\r
/** Changes the font's horizontal scale factor.\r
@param scaleFactor a value of 1.0 is the normal scale, less than this will be\r
normal spacing, positive values spread the letters out,\r
negative values make them closer together.\r
*/\r
- Font withExtraKerningFactor (float extraKerning) const;\r
+ JUCE_NODISCARD Font withExtraKerningFactor (float extraKerning) const;\r
\r
/** Changes the font's kerning.\r
@param extraKerning a multiple of the font's height that will be added\r
namespace juce\r
{\r
\r
+static constexpr bool isNonBreakingSpace (const juce_wchar c)\r
+{\r
+ return c == 0x00a0\r
+ || c == 0x2007\r
+ || c == 0x202f\r
+ || c == 0x2060;\r
+}\r
+\r
PositionedGlyph::PositionedGlyph() noexcept\r
: character (0), glyph (0), x (0), y (0), w (0), whitespace (false)\r
{\r
{\r
}\r
\r
-PositionedGlyph::~PositionedGlyph() {}\r
-\r
static void drawGlyphWithFont (Graphics& g, int glyph, const Font& font, AffineTransform t)\r
{\r
auto& context = g.getInternalContext();\r
}\r
\r
auto thisX = xOffsets.getUnchecked (i);\r
- bool isWhitespace = t.isWhitespace();\r
+ auto isWhitespace = isNonBreakingSpace (*t) || t.isWhitespace();\r
\r
glyphs.add (PositionedGlyph (font, t.getAndAdvance(),\r
newGlyphs.getUnchecked(i),\r
\r
static bool isBreakableGlyph (const PositionedGlyph& g) noexcept\r
{\r
- return g.isWhitespace() || g.getCharacter() == '-';\r
+ return ! isNonBreakingSpace (g.getCharacter()) && (g.isWhitespace() || g.getCharacter() == '-');\r
}\r
\r
void GlyphArrangement::splitLines (const String& text, Font font, int startIndex,\r
PositionedGlyph (const Font& font, juce_wchar character, int glyphNumber,\r
float anchorX, float baselineY, float width, bool isWhitespace);\r
\r
- PositionedGlyph (const PositionedGlyph&) = default;\r
- PositionedGlyph& operator= (const PositionedGlyph&) = default;\r
- PositionedGlyph (PositionedGlyph&&) noexcept = default;\r
- PositionedGlyph& operator= (PositionedGlyph&&) noexcept = default;\r
-\r
- ~PositionedGlyph();\r
-\r
/** Returns the character the glyph represents. */\r
juce_wchar getCharacter() const noexcept { return character; }\r
/** Checks whether the glyph is actually empty. */\r
*/\r
BorderSize() = default;\r
\r
- /** Creates a copy of another border. */\r
- BorderSize (const BorderSize&) = default;\r
-\r
/** Creates a border with the given gaps. */\r
BorderSize (ValueType topGap, ValueType leftGap, ValueType bottomGap, ValueType rightGap) noexcept\r
: top (topGap), left (leftGap), bottom (bottomGap), right (rightGap)\r
return contains (point.x, point.y, tolerance);\r
}\r
\r
-bool Path::intersectsLine (Line<float> line, float tolerance)\r
+bool Path::intersectsLine (Line<float> line, float tolerance) const\r
{\r
PathFlatteningIterator i (*this, AffineTransform(), tolerance);\r
Point<float> intersection;\r
outside the path's boundary.\r
*/\r
bool intersectsLine (Line<float> line,\r
- float tolerance = defaultToleranceForTesting);\r
+ float tolerance = defaultToleranceForTesting) const;\r
\r
/** Cuts off parts of a line to keep the parts that are either inside or\r
outside this path.\r
void setVerticalRange (Range<ValueType> range) noexcept { pos.y = range.getStart(); h = range.getLength(); }\r
\r
/** Returns a rectangle which has the same size and y-position as this one, but with a different x-position. */\r
- Rectangle withX (ValueType newX) const noexcept { return { newX, pos.y, w, h }; }\r
+ JUCE_NODISCARD Rectangle withX (ValueType newX) const noexcept { return { newX, pos.y, w, h }; }\r
\r
/** Returns a rectangle which has the same size and x-position as this one, but with a different y-position. */\r
- Rectangle withY (ValueType newY) const noexcept { return { pos.x, newY, w, h }; }\r
+ JUCE_NODISCARD Rectangle withY (ValueType newY) const noexcept { return { pos.x, newY, w, h }; }\r
\r
/** Returns a rectangle which has the same size and y-position as this one, but whose right-hand edge has the given position. */\r
- Rectangle withRightX (ValueType newRightX) const noexcept { return { newRightX - w, pos.y, w, h }; }\r
+ JUCE_NODISCARD Rectangle withRightX (ValueType newRightX) const noexcept { return { newRightX - w, pos.y, w, h }; }\r
\r
/** Returns a rectangle which has the same size and x-position as this one, but whose bottom edge has the given position. */\r
- Rectangle withBottomY (ValueType newBottomY) const noexcept { return { pos.x, newBottomY - h, w, h }; }\r
+ JUCE_NODISCARD Rectangle withBottomY (ValueType newBottomY) const noexcept { return { pos.x, newBottomY - h, w, h }; }\r
\r
/** Returns a rectangle with the same size as this one, but a new position. */\r
- Rectangle withPosition (ValueType newX, ValueType newY) const noexcept { return { newX, newY, w, h }; }\r
+ JUCE_NODISCARD Rectangle withPosition (ValueType newX, ValueType newY) const noexcept { return { newX, newY, w, h }; }\r
\r
/** Returns a rectangle with the same size as this one, but a new position. */\r
- Rectangle withPosition (Point<ValueType> newPos) const noexcept { return { newPos.x, newPos.y, w, h }; }\r
+ JUCE_NODISCARD Rectangle withPosition (Point<ValueType> newPos) const noexcept { return { newPos.x, newPos.y, w, h }; }\r
\r
/** Returns a rectangle whose size is the same as this one, but whose top-left position is (0, 0). */\r
- Rectangle withZeroOrigin() const noexcept { return { w, h }; }\r
+ JUCE_NODISCARD Rectangle withZeroOrigin() const noexcept { return { w, h }; }\r
\r
/** Returns a rectangle with the same size as this one, but a new centre position. */\r
- Rectangle withCentre (Point<ValueType> newCentre) const noexcept { return { newCentre.x - w / (ValueType) 2,\r
+ JUCE_NODISCARD Rectangle withCentre (Point<ValueType> newCentre) const noexcept { return { newCentre.x - w / (ValueType) 2,\r
newCentre.y - h / (ValueType) 2, w, h }; }\r
\r
/** Returns a rectangle which has the same position and height as this one, but with a different width. */\r
- Rectangle withWidth (ValueType newWidth) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), h }; }\r
+ JUCE_NODISCARD Rectangle withWidth (ValueType newWidth) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), h }; }\r
\r
/** Returns a rectangle which has the same position and width as this one, but with a different height. */\r
- Rectangle withHeight (ValueType newHeight) const noexcept { return { pos.x, pos.y, w, jmax (ValueType(), newHeight) }; }\r
+ JUCE_NODISCARD Rectangle withHeight (ValueType newHeight) const noexcept { return { pos.x, pos.y, w, jmax (ValueType(), newHeight) }; }\r
\r
/** Returns a rectangle with the same top-left position as this one, but a new size. */\r
- Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), jmax (ValueType(), newHeight) }; }\r
+ JUCE_NODISCARD Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), jmax (ValueType(), newHeight) }; }\r
\r
/** Returns a rectangle with the same centre position as this one, but a new size. */\r
- Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x + (w - newWidth) / (ValueType) 2,\r
- pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight }; }\r
+ JUCE_NODISCARD Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x + (w - newWidth) / (ValueType) 2,\r
+ pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight }; }\r
\r
/** Moves the x position, adjusting the width so that the right-hand edge remains in the same place.\r
If the x is moved to be on the right of the current right-hand edge, the width will be set to zero.\r
If the new x is beyond the right of the current right-hand edge, the width will be set to zero.\r
@see setLeft\r
*/\r
- Rectangle withLeft (ValueType newLeft) const noexcept { return { newLeft, pos.y, jmax (ValueType(), pos.x + w - newLeft), h }; }\r
+ JUCE_NODISCARD Rectangle withLeft (ValueType newLeft) const noexcept { return { newLeft, pos.y, jmax (ValueType(), pos.x + w - newLeft), h }; }\r
\r
/** Moves the y position, adjusting the height so that the bottom edge remains in the same place.\r
If the y is moved to be below the current bottom edge, the height will be set to zero.\r
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.\r
@see setTop\r
*/\r
- Rectangle withTop (ValueType newTop) const noexcept { return { pos.x, newTop, w, jmax (ValueType(), pos.y + h - newTop) }; }\r
+ JUCE_NODISCARD Rectangle withTop (ValueType newTop) const noexcept { return { pos.x, newTop, w, jmax (ValueType(), pos.y + h - newTop) }; }\r
\r
/** Adjusts the width so that the right-hand edge of the rectangle has this new value.\r
If the new right is below the current X value, the X will be pushed down to match it.\r
If the new right edge is below the current left-hand edge, the width will be set to zero.\r
@see setRight\r
*/\r
- Rectangle withRight (ValueType newRight) const noexcept { return { jmin (pos.x, newRight), pos.y, jmax (ValueType(), newRight - pos.x), h }; }\r
+ JUCE_NODISCARD Rectangle withRight (ValueType newRight) const noexcept { return { jmin (pos.x, newRight), pos.y, jmax (ValueType(), newRight - pos.x), h }; }\r
\r
/** Adjusts the height so that the bottom edge of the rectangle has this new value.\r
If the new bottom is lower than the current Y value, the Y will be pushed down to match it.\r
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.\r
@see setBottom\r
*/\r
- Rectangle withBottom (ValueType newBottom) const noexcept { return { pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y) }; }\r
+ JUCE_NODISCARD Rectangle withBottom (ValueType newBottom) const noexcept { return { pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y) }; }\r
\r
/** Returns a version of this rectangle with the given amount removed from its left-hand edge. */\r
- Rectangle withTrimmedLeft (ValueType amountToRemove) const noexcept { return withLeft (pos.x + amountToRemove); }\r
+ JUCE_NODISCARD Rectangle withTrimmedLeft (ValueType amountToRemove) const noexcept { return withLeft (pos.x + amountToRemove); }\r
\r
/** Returns a version of this rectangle with the given amount removed from its right-hand edge. */\r
- Rectangle withTrimmedRight (ValueType amountToRemove) const noexcept { return withWidth (w - amountToRemove); }\r
+ JUCE_NODISCARD Rectangle withTrimmedRight (ValueType amountToRemove) const noexcept { return withWidth (w - amountToRemove); }\r
\r
/** Returns a version of this rectangle with the given amount removed from its top edge. */\r
- Rectangle withTrimmedTop (ValueType amountToRemove) const noexcept { return withTop (pos.y + amountToRemove); }\r
+ JUCE_NODISCARD Rectangle withTrimmedTop (ValueType amountToRemove) const noexcept { return withTop (pos.y + amountToRemove); }\r
\r
/** Returns a version of this rectangle with the given amount removed from its bottom edge. */\r
- Rectangle withTrimmedBottom (ValueType amountToRemove) const noexcept { return withHeight (h - amountToRemove); }\r
+ JUCE_NODISCARD Rectangle withTrimmedBottom (ValueType amountToRemove) const noexcept { return withHeight (h - amountToRemove); }\r
\r
//==============================================================================\r
/** Moves the rectangle's position by adding amount to its x and y coordinates. */\r
\r
void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
{\r
- bitmap.data = imageData + (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride;\r
+ const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride;\r
+ bitmap.data = imageData + offset;\r
+ bitmap.size = (size_t) (height * lineStride) - offset;\r
bitmap.pixelFormat = pixelFormat;\r
bitmap.lineStride = lineStride;\r
bitmap.pixelStride = pixelStride;\r
Rectangle<int> getBounds() const noexcept { return Rectangle<int> (width, height); }\r
\r
uint8* data; /**< The raw pixel data, packed according to the image's pixel format. */\r
+ size_t size; /**< The number of valid/allocated bytes after data. May be smaller than "lineStride * height" if this is a section of a larger image. */\r
PixelFormat pixelFormat; /**< The format of the data. */\r
int lineStride; /**< The number of bytes between each line. */\r
int pixelStride; /**< The number of bytes between each pixel. */\r
\r
ID: juce_graphics\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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
void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
{\r
- bitmap.data = imageData->data + x * pixelStride + y * lineStride;\r
+ const auto offset = (size_t) (x * pixelStride + y * lineStride);\r
+ bitmap.data = imageData->data + offset;\r
+ bitmap.size = (size_t) (lineStride * height) - offset;\r
bitmap.pixelFormat = pixelFormat;\r
bitmap.lineStride = lineStride;\r
bitmap.pixelStride = pixelStride;\r
static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace)\r
{\r
const Image::BitmapData srcData (juceImage, Image::BitmapData::readOnly);\r
- detail::DataProviderPtr provider;\r
\r
- if (auto* cgim = dynamic_cast<CoreGraphicsPixelData*> (juceImage.getPixelData()))\r
+ const auto provider = [&]\r
{\r
- provider = detail::DataProviderPtr { CGDataProviderCreateWithData (new ImageDataContainer::Ptr (cgim->imageData),\r
+ if (auto* cgim = dynamic_cast<CoreGraphicsPixelData*> (juceImage.getPixelData()))\r
+ {\r
+ return detail::DataProviderPtr { CGDataProviderCreateWithData (new ImageDataContainer::Ptr (cgim->imageData),\r
srcData.data,\r
- (size_t) srcData.lineStride * (size_t) srcData.height,\r
+ srcData.size,\r
[] (void * __nullable info, const void*, size_t) { delete (ImageDataContainer::Ptr*) info; }) };\r
- }\r
- else\r
- {\r
- CFUniquePtr<CFDataRef> data (CFDataCreate (nullptr,\r
- (const UInt8*) srcData.data,\r
- (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height)));\r
- provider = detail::DataProviderPtr { CGDataProviderCreateWithCFData (data.get()) };\r
- }\r
+ }\r
+\r
+ CFUniquePtr<CFDataRef> data (CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) srcData.size));\r
+ return detail::DataProviderPtr { CGDataProviderCreateWithCFData (data.get()) };\r
+ }();\r
\r
CGImageRef imageRef = CGImageCreate ((size_t) srcData.width,\r
(size_t) srcData.height,\r
\r
auto colourSpace = sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace.get()\r
: rgbColourSpace.get();\r
- auto image = detail::ImagePtr { CoreGraphicsPixelData::getCachedImageRef (sourceImage, colourSpace) };\r
+ detail::ImagePtr image { CoreGraphicsPixelData::getCachedImageRef (sourceImage, colourSpace) };\r
\r
ScopedCGContextState scopedState (context.get());\r
CGContextSetAlpha (context.get(), state->fillType.getOpacity());\r
}\r
\r
//==============================================================================\r
+ // A flatmap that properly retains/releases font refs\r
+ class FontMap\r
+ {\r
+ public:\r
+ void emplace (CTFontRef ctFontRef, Font value)\r
+ {\r
+ pairs.emplace (std::lower_bound (pairs.begin(), pairs.end(), ctFontRef), ctFontRef, std::move (value));\r
+ }\r
+\r
+ const Font* find (CTFontRef ctFontRef) const\r
+ {\r
+ const auto iter = std::lower_bound (pairs.begin(), pairs.end(), ctFontRef);\r
+\r
+ if (iter == pairs.end())\r
+ return nullptr;\r
+\r
+ if (iter->key.get() != ctFontRef)\r
+ return nullptr;\r
+\r
+ return &iter->value;\r
+ }\r
+\r
+ private:\r
+ struct Pair\r
+ {\r
+ Pair (CTFontRef ref, Font font) : key (ref), value (std::move (font)) { CFRetain (ref); }\r
+\r
+ bool operator< (CTFontRef other) const { return key.get() < other; }\r
+\r
+ CFUniquePtr<CTFontRef> key;\r
+ Font value;\r
+ };\r
+\r
+ std::vector<Pair> pairs;\r
+ };\r
+\r
struct AttributedStringAndFontMap\r
{\r
CFUniquePtr<CFAttributedStringRef> string;\r
- std::map<CTFontRef, Font> fontMap;\r
+ FontMap fontMap;\r
};\r
\r
static AttributedStringAndFontMap createCFAttributedString (const AttributedString& text)\r
{\r
- std::map<CTFontRef, Font> fontMap;\r
+ FontMap fontMap;\r
\r
const detail::ColorSpacePtr rgbColourSpace { CGColorSpaceCreateWithName (kCGColorSpaceSRGB) };\r
\r
auto attribString = CFAttributedStringCreateMutable (kCFAllocatorDefault, 0);\r
CFUniquePtr<CFStringRef> cfText (text.getText().toCFString());\r
+\r
CFAttributedStringReplaceString (attribString, CFRangeMake (0, 0), cfText.get());\r
\r
- auto numCharacterAttributes = text.getNumAttributes();\r
- auto attribStringLen = CFAttributedStringGetLength (attribString);\r
+ const auto numCharacterAttributes = text.getNumAttributes();\r
+ const auto attribStringLen = CFAttributedStringGetLength (attribString);\r
+ const auto beginPtr = text.getText().toUTF16();\r
+ auto currentPosition = beginPtr;\r
\r
- for (int i = 0; i < numCharacterAttributes; ++i)\r
+ for (int i = 0; i < numCharacterAttributes; currentPosition += text.getAttribute (i).range.getLength(), ++i)\r
{\r
- auto& attr = text.getAttribute (i);\r
- auto rangeStart = attr.range.getStart();\r
+ const auto& attr = text.getAttribute (i);\r
+ const auto wordBegin = currentPosition.getAddress() - beginPtr.getAddress();\r
\r
- if (rangeStart >= attribStringLen)\r
+ if (attribStringLen <= wordBegin)\r
continue;\r
\r
- auto range = CFRangeMake (rangeStart, jmin (attr.range.getEnd(), (int) attribStringLen) - rangeStart);\r
+ const auto wordEnd = jmin (attribStringLen, (currentPosition + attr.range.getLength()).getAddress() - beginPtr.getAddress());\r
+ const auto range = CFRangeMake (wordBegin, wordEnd - wordBegin);\r
\r
if (auto ctFontRef = getOrCreateFont (attr.font))\r
{\r
struct FramesetterAndFontMap\r
{\r
CFUniquePtr<CTFramesetterRef> framesetter;\r
- std::map<CTFontRef, Font> fontMap;\r
+ FontMap fontMap;\r
};\r
\r
static FramesetterAndFontMap createCTFramesetter (const AttributedString& text)\r
struct FrameAndFontMap\r
{\r
CFUniquePtr<CTFrameRef> frame;\r
- std::map<CTFontRef, Font> fontMap;\r
+ FontMap fontMap;\r
};\r
\r
static FrameAndFontMap createCTFrame (const AttributedString& text, CGRect bounds)\r
{\r
glyphRun->font = [&]\r
{\r
- auto it = frameAndMap.fontMap.find (ctRunFont);\r
-\r
- if (it != frameAndMap.fontMap.end())\r
- return it->second;\r
+ if (auto* it = frameAndMap.fontMap.find (ctRunFont))\r
+ return *it;\r
\r
CFUniquePtr<CFStringRef> cfsFontName (CTFontCopyPostScriptName (ctRunFont));\r
CFUniquePtr<CTFontRef> ctFontRef (CTFontCreateWithName (cfsFontName.get(), referenceFontSize, nullptr));\r
format.SetWordWrapping (wrapType);\r
}\r
\r
- void addAttributedRange (const AttributedString::Attribute& attr, IDWriteTextLayout& textLayout,\r
- const int textLen, ID2D1RenderTarget& renderTarget, IDWriteFontCollection& fontCollection)\r
+ void addAttributedRange (const AttributedString::Attribute& attr,\r
+ IDWriteTextLayout& textLayout,\r
+ CharPointer_UTF16 begin,\r
+ CharPointer_UTF16 textPointer,\r
+ const UINT32 textLen,\r
+ ID2D1RenderTarget& renderTarget,\r
+ IDWriteFontCollection& fontCollection)\r
{\r
DWRITE_TEXT_RANGE range;\r
- range.startPosition = (UINT32) attr.range.getStart();\r
- range.length = (UINT32) jmin (attr.range.getLength(), textLen - attr.range.getStart());\r
+ range.startPosition = (UINT32) (textPointer.getAddress() - begin.getAddress());\r
+\r
+ if (textLen <= range.startPosition)\r
+ return;\r
+\r
+ const auto wordEnd = jmin (textLen, (UINT32) ((textPointer + attr.range.getLength()).getAddress() - begin.getAddress()));\r
+ range.length = wordEnd - range.startPosition;\r
\r
{\r
auto familyName = FontStyleHelpers::getConcreteFamilyName (attr.font);\r
hr = dwTextFormat->SetTrimming (&trimming, trimmingSign);\r
}\r
\r
- auto textLen = text.getText().length();\r
+ const auto beginPtr = text.getText().toUTF16();\r
+ const auto textLen = (UINT32) (beginPtr.findTerminatingNull().getAddress() - beginPtr.getAddress());\r
\r
- hr = directWriteFactory.CreateTextLayout (text.getText().toWideCharPointer(), (UINT32) textLen, dwTextFormat,\r
- maxWidth, maxHeight, textLayout.resetAndGetPointerAddress());\r
+ hr = directWriteFactory.CreateTextLayout (beginPtr.getAddress(),\r
+ textLen,\r
+ dwTextFormat,\r
+ maxWidth,\r
+ maxHeight,\r
+ textLayout.resetAndGetPointerAddress());\r
\r
if (FAILED (hr) || textLayout == nullptr)\r
return false;\r
\r
- auto numAttributes = text.getNumAttributes();\r
+ const auto numAttributes = text.getNumAttributes();\r
+ auto rangePointer = beginPtr;\r
\r
for (int i = 0; i < numAttributes; ++i)\r
- addAttributedRange (text.getAttribute (i), *textLayout, textLen, renderTarget, fontCollection);\r
+ {\r
+ const auto attribute = text.getAttribute (i);\r
+ addAttributedRange (attribute, *textLayout, beginPtr, rangePointer, textLen, renderTarget, fontCollection);\r
+ rangePointer += attribute.range.getLength();\r
+ }\r
\r
return true;\r
}\r
\r
@see isCheckable\r
*/\r
- AccessibleState withCheckable() const noexcept { return withFlag (Flags::checkable); }\r
+ JUCE_NODISCARD AccessibleState withCheckable() const noexcept { return withFlag (Flags::checkable); }\r
\r
/** Sets the checked flag and returns the new state.\r
\r
@see isChecked\r
*/\r
- AccessibleState withChecked() const noexcept { return withFlag (Flags::checked); }\r
+ JUCE_NODISCARD AccessibleState withChecked() const noexcept { return withFlag (Flags::checked); }\r
\r
/** Sets the collapsed flag and returns the new state.\r
\r
@see isCollapsed\r
*/\r
- AccessibleState withCollapsed() const noexcept { return withFlag (Flags::collapsed); }\r
+ JUCE_NODISCARD AccessibleState withCollapsed() const noexcept { return withFlag (Flags::collapsed); }\r
\r
/** Sets the expandable flag and returns the new state.\r
\r
@see isExpandable\r
*/\r
- AccessibleState withExpandable() const noexcept { return withFlag (Flags::expandable); }\r
+ JUCE_NODISCARD AccessibleState withExpandable() const noexcept { return withFlag (Flags::expandable); }\r
\r
/** Sets the expanded flag and returns the new state.\r
\r
@see isExpanded\r
*/\r
- AccessibleState withExpanded() const noexcept { return withFlag (Flags::expanded); }\r
+ JUCE_NODISCARD AccessibleState withExpanded() const noexcept { return withFlag (Flags::expanded); }\r
\r
/** Sets the focusable flag and returns the new state.\r
\r
@see isFocusable\r
*/\r
- AccessibleState withFocusable() const noexcept { return withFlag (Flags::focusable); }\r
+ JUCE_NODISCARD AccessibleState withFocusable() const noexcept { return withFlag (Flags::focusable); }\r
\r
/** Sets the focused flag and returns the new state.\r
\r
@see isFocused\r
*/\r
- AccessibleState withFocused() const noexcept { return withFlag (Flags::focused); }\r
+ JUCE_NODISCARD AccessibleState withFocused() const noexcept { return withFlag (Flags::focused); }\r
\r
/** Sets the ignored flag and returns the new state.\r
\r
@see isIgnored\r
*/\r
- AccessibleState withIgnored() const noexcept { return withFlag (Flags::ignored); }\r
+ JUCE_NODISCARD AccessibleState withIgnored() const noexcept { return withFlag (Flags::ignored); }\r
\r
/** Sets the selectable flag and returns the new state.\r
\r
@see isSelectable\r
*/\r
- AccessibleState withSelectable() const noexcept { return withFlag (Flags::selectable); }\r
+ JUCE_NODISCARD AccessibleState withSelectable() const noexcept { return withFlag (Flags::selectable); }\r
\r
/** Sets the multiSelectable flag and returns the new state.\r
\r
@see isMultiSelectable\r
*/\r
- AccessibleState withMultiSelectable() const noexcept { return withFlag (Flags::multiSelectable); }\r
+ JUCE_NODISCARD AccessibleState withMultiSelectable() const noexcept { return withFlag (Flags::multiSelectable); }\r
\r
/** Sets the selected flag and returns the new state.\r
\r
@see isSelected\r
*/\r
- AccessibleState withSelected() const noexcept { return withFlag (Flags::selected); }\r
+ JUCE_NODISCARD AccessibleState withSelected() const noexcept { return withFlag (Flags::selected); }\r
\r
/** Sets the accessible offscreen flag and returns the new state.\r
\r
@see isSelected\r
*/\r
- AccessibleState withAccessibleOffscreen() const noexcept { return withFlag (Flags::accessibleOffscreen); }\r
+ JUCE_NODISCARD AccessibleState withAccessibleOffscreen() const noexcept { return withFlag (Flags::accessibleOffscreen); }\r
\r
//==============================================================================\r
/** Returns true if the UI element is checkable.\r
accessibleOffscreen = (1 << 11)\r
};\r
\r
- AccessibleState withFlag (int flag) const noexcept\r
+ JUCE_NODISCARD AccessibleState withFlag (int flag) const noexcept\r
{\r
auto copy = *this;\r
copy.flags |= flag;\r
namespace juce\r
{\r
\r
+static Component* findFirstEnabledAncestor (Component* in)\r
+{\r
+ if (in == nullptr)\r
+ return nullptr;\r
+\r
+ if (in->isEnabled())\r
+ return in;\r
+\r
+ return findFirstEnabledAncestor (in->getParentComponent());\r
+}\r
+\r
Component* Component::currentlyFocusedComponent = nullptr;\r
\r
\r
static Rectangle<int> subtractPosition (Rectangle<int> p, const Component& c) noexcept { return p - c.getPosition(); }\r
static Point<float> subtractPosition (Point<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); }\r
static Rectangle<float> subtractPosition (Rectangle<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); }\r
+\r
+ static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos)\r
+ {\r
+ if (auto* peer = comp.getPeer())\r
+ {\r
+ pos = peer->globalToLocal (pos);\r
+ auto& peerComp = peer->getComponent();\r
+ return comp.getLocalPoint (&peerComp, unscaledScreenPosToScaled (peerComp, pos));\r
+ }\r
+\r
+ return comp.getLocalPoint (nullptr, unscaledScreenPosToScaled (comp, pos));\r
+ }\r
};\r
\r
static const char colourPropertyPrefix[] = "jcclr_";\r
\r
void Component::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel)\r
{\r
- // the base class just passes this event up to its parent..\r
- if (parentComponent != nullptr && parentComponent->isEnabled())\r
- parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), wheel);\r
+ // the base class just passes this event up to the nearest enabled ancestor\r
+ if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent()))\r
+ enabledComponent->mouseWheelMove (e.getEventRelativeTo (enabledComponent), wheel);\r
}\r
\r
void Component::mouseMagnify (const MouseEvent& e, float magnifyAmount)\r
{\r
- // the base class just passes this event up to its parent..\r
- if (parentComponent != nullptr && parentComponent->isEnabled())\r
- parentComponent->mouseMagnify (e.getEventRelativeTo (parentComponent), magnifyAmount);\r
+ // the base class just passes this event up to the nearest enabled ancestor\r
+ if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent()))\r
+ enabledComponent->mouseMagnify (e.getEventRelativeTo (enabledComponent), magnifyAmount);\r
}\r
\r
//==============================================================================\r
\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- this, this, time, relativePos, time, 0, false);\r
+ const auto me = makeMouseEvent (source,\r
+ PointerState().withPosition (relativePos),\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePos,\r
+ time,\r
+ 0,\r
+ false);\r
mouseEnter (me);\r
\r
flags.cachedMouseInsideComponent = true;\r
\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- this, this, time, relativePos, time, 0, false);\r
+ const auto me = makeMouseEvent (source,\r
+ PointerState().withPosition (relativePos),\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePos,\r
+ time,\r
+ 0,\r
+ false);\r
\r
mouseExit (me);\r
\r
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseExit, me);\r
}\r
\r
-void Component::internalMouseDown (MouseInputSource source, Point<float> relativePos, Time time,\r
- float pressure, float orientation, float rotation, float tiltX, float tiltY)\r
+void Component::internalMouseDown (MouseInputSource source, const PointerState& relativePointerState, Time time)\r
{\r
auto& desktop = Desktop::getInstance();\r
BailOutChecker checker (this);\r
if (isCurrentlyBlockedByAnotherModalComponent())\r
{\r
// allow blocked mouse-events to go to global listeners..\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure,\r
- orientation, rotation, tiltX, tiltY, this, this, time, relativePos,\r
- time, source.getNumberOfMultipleClicks(), false);\r
+ const auto me = makeMouseEvent (source,\r
+ relativePointerState,\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePointerState.position,\r
+ time,\r
+ source.getNumberOfMultipleClicks(),\r
+ false);\r
\r
desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); });\r
return;\r
if (flags.repaintOnMouseActivityFlag)\r
repaint();\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure,\r
- orientation, rotation, tiltX, tiltY, this, this, time, relativePos,\r
- time, source.getNumberOfMultipleClicks(), false);\r
+ const auto me = makeMouseEvent (source,\r
+ relativePointerState,\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePointerState.position,\r
+ time,\r
+ source.getNumberOfMultipleClicks(),\r
+ false);\r
mouseDown (me);\r
\r
if (checker.shouldBailOut())\r
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseDown, me);\r
}\r
\r
-void Component::internalMouseUp (MouseInputSource source, Point<float> relativePos, Time time,\r
- const ModifierKeys oldModifiers, float pressure, float orientation, float rotation, float tiltX, float tiltY)\r
+void Component::internalMouseUp (MouseInputSource source, const PointerState& relativePointerState, Time time, const ModifierKeys oldModifiers)\r
{\r
if (flags.mouseDownWasBlocked && isCurrentlyBlockedByAnotherModalComponent())\r
return;\r
if (flags.repaintOnMouseActivityFlag)\r
repaint();\r
\r
- const MouseEvent me (source, relativePos, oldModifiers, pressure, orientation,\r
- rotation, tiltX, tiltY, this, this, time,\r
- getLocalPoint (nullptr, source.getLastMouseDownPosition()),\r
- source.getLastMouseDownTime(),\r
- source.getNumberOfMultipleClicks(),\r
- source.isLongPressOrDrag());\r
+ const auto me = makeMouseEvent (source,\r
+ relativePointerState,\r
+ oldModifiers,\r
+ this,\r
+ this,\r
+ time,\r
+ getLocalPoint (nullptr, source.getLastMouseDownPosition()),\r
+ source.getLastMouseDownTime(),\r
+ source.getNumberOfMultipleClicks(),\r
+ source.isLongPressOrDrag());\r
mouseUp (me);\r
\r
if (checker.shouldBailOut())\r
}\r
}\r
\r
-void Component::internalMouseDrag (MouseInputSource source, Point<float> relativePos, Time time,\r
- float pressure, float orientation, float rotation, float tiltX, float tiltY)\r
+void Component::internalMouseDrag (MouseInputSource source, const PointerState& relativePointerState, Time time)\r
{\r
if (! isCurrentlyBlockedByAnotherModalComponent())\r
{\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(),\r
- pressure, orientation, rotation, tiltX, tiltY, this, this, time,\r
- getLocalPoint (nullptr, source.getLastMouseDownPosition()),\r
- source.getLastMouseDownTime(),\r
- source.getNumberOfMultipleClicks(),\r
- source.isLongPressOrDrag());\r
+ const auto me = makeMouseEvent (source,\r
+ relativePointerState,\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ getLocalPoint (nullptr, source.getLastMouseDownPosition()),\r
+ source.getLastMouseDownTime(),\r
+ source.getNumberOfMultipleClicks(),\r
+ source.isLongPressOrDrag());\r
mouseDrag (me);\r
\r
if (checker.shouldBailOut())\r
{\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- this, this, time, relativePos, time, 0, false);\r
+ const auto me = makeMouseEvent (source,\r
+ PointerState().withPosition (relativePos),\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePos,\r
+ time,\r
+ 0,\r
+ false);\r
mouseMove (me);\r
\r
if (checker.shouldBailOut())\r
auto& desktop = Desktop::getInstance();\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- this, this, time, relativePos, time, 0, false);\r
+ const auto me = makeMouseEvent (source,\r
+ PointerState().withPosition (relativePos),\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePos,\r
+ time,\r
+ 0,\r
+ false);\r
\r
if (isCurrentlyBlockedByAnotherModalComponent())\r
{\r
auto& desktop = Desktop::getInstance();\r
BailOutChecker checker (this);\r
\r
- const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- this, this, time, relativePos, time, 0, false);\r
+ const auto me = makeMouseEvent (source,\r
+ PointerState().withPosition (relativePos),\r
+ source.getCurrentModifiers(),\r
+ this,\r
+ this,\r
+ time,\r
+ relativePos,\r
+ time,\r
+ 0,\r
+ false);\r
\r
if (isCurrentlyBlockedByAnotherModalComponent())\r
{\r
//==============================================================================\r
void internalMouseEnter (MouseInputSource, Point<float>, Time);\r
void internalMouseExit (MouseInputSource, Point<float>, Time);\r
- void internalMouseDown (MouseInputSource, Point<float>, Time, float, float, float, float, float);\r
- void internalMouseUp (MouseInputSource, Point<float>, Time, const ModifierKeys oldModifiers, float, float, float, float, float);\r
- void internalMouseDrag (MouseInputSource, Point<float>, Time, float, float, float, float, float);\r
+ void internalMouseDown (MouseInputSource, const PointerState&, Time);\r
+ void internalMouseUp (MouseInputSource, const PointerState&, Time, const ModifierKeys oldModifiers);\r
+ void internalMouseDrag (MouseInputSource, const PointerState&, Time);\r
void internalMouseMove (MouseInputSource, Point<float>, Time);\r
void internalMouseWheel (MouseInputSource, Point<float>, Time, const MouseWheelDetails&);\r
void internalMagnifyGesture (MouseInputSource, Point<float>, Time, float);\r
auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);\r
auto now = Time::getCurrentTime();\r
\r
- const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
target, target, now, pos, now, 0, false);\r
\r
if (me.mods.isAnyMouseButtonDown())\r
{\r
\r
//==============================================================================\r
-class FileChooser::NonNative : public FileChooser::Pimpl\r
+class FileChooser::NonNative : public std::enable_shared_from_this<NonNative>,\r
+ public FileChooser::Pimpl\r
{\r
public:\r
NonNative (FileChooser& fileChooser, int flags, FilePreviewComponent* preview)\r
void launch() override\r
{\r
dialogBox.centreWithDefaultSize (nullptr);\r
- dialogBox.enterModalState (true, ModalCallbackFunction::create ([this] (int r) { modalStateFinished (r); }), true);\r
+\r
+ const std::weak_ptr<NonNative> ref (shared_from_this());\r
+ auto* callback = ModalCallbackFunction::create ([ref] (int r)\r
+ {\r
+ if (auto locked = ref.lock())\r
+ locked->modalStateFinished (r);\r
+ });\r
+\r
+ dialogBox.enterModalState (true, callback, true);\r
}\r
\r
void runModally() override\r
};\r
} // namespace juce\r
\r
+#include "mouse/juce_PointerState.h"\r
+\r
#include "accessibility/juce_AccessibilityHandler.cpp"\r
#include "components/juce_Component.cpp"\r
#include "components/juce_ComponentListener.cpp"\r
\r
ID: juce_gui_basics\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE GUI core classes\r
description: Basic user-interface components and related classes.\r
website: http://www.juce.com/juce\r
class Displays;\r
class AccessibilityHandler;\r
class KeyboardFocusTraverser;\r
+ class PointerState;\r
\r
class FlexBox;\r
class Grid;\r
\r
//==============================================================================\r
/** Returns a copy of only the mouse-button flags */\r
- ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); }\r
+ JUCE_NODISCARD ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); }\r
\r
/** Returns a copy of only the non-mouse flags */\r
- ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); }\r
+ JUCE_NODISCARD ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); }\r
\r
- bool operator== (const ModifierKeys other) const noexcept { return flags == other.flags; }\r
- bool operator!= (const ModifierKeys other) const noexcept { return flags != other.flags; }\r
+ bool operator== (const ModifierKeys other) const noexcept { return flags == other.flags; }\r
+ bool operator!= (const ModifierKeys other) const noexcept { return flags != other.flags; }\r
\r
//==============================================================================\r
/** Returns the raw flags for direct testing. */\r
- inline int getRawFlags() const noexcept { return flags; }\r
+ inline int getRawFlags() const noexcept { return flags; }\r
\r
- ModifierKeys withoutFlags (int rawFlagsToClear) const noexcept { return ModifierKeys (flags & ~rawFlagsToClear); }\r
- ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); }\r
+ JUCE_NODISCARD ModifierKeys withoutFlags (int rawFlagsToClear) const noexcept { return ModifierKeys (flags & ~rawFlagsToClear); }\r
+ JUCE_NODISCARD ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); }\r
\r
/** Tests a combination of flags and returns true if any of them are set. */\r
- bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; }\r
+ bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; }\r
\r
/** Returns the total number of mouse buttons that are down. */\r
int getNumMouseButtonsDown() const noexcept;\r
This method is here for backwards compatibility and there's no need to call it anymore,\r
you should use the public currentModifiers member directly.\r
*/\r
- static ModifierKeys getCurrentModifiers() noexcept { return currentModifiers; }\r
+ static ModifierKeys getCurrentModifiers() noexcept { return currentModifiers; }\r
\r
/** Creates a ModifierKeys object to represent the current state of the\r
keyboard and mouse buttons.\r
{\r
jassert (component != nullptr);\r
\r
- Rectangle<int> limits, bounds (targetBounds);\r
- BorderSize<int> border;\r
+ auto bounds = targetBounds;\r
\r
- if (auto* parent = component->getParentComponent())\r
+ auto limits = [&]() -> Rectangle<int>\r
{\r
- limits.setSize (parent->getWidth(), parent->getHeight());\r
- }\r
- else\r
- {\r
- if (auto* peer = component->getPeer())\r
- border = peer->getFrameSize();\r
+ if (auto* parent = component->getParentComponent())\r
+ return { parent->getWidth(), parent->getHeight() };\r
\r
- auto screenBounds = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre())->userArea;\r
+ if (auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre()))\r
+ return component->getLocalArea (nullptr, display->userArea) + component->getPosition();\r
\r
- limits = component->getLocalArea (nullptr, screenBounds) + component->getPosition();\r
- }\r
+ const auto max = std::numeric_limits<int>::max();\r
+ return { max, max };\r
+ }();\r
+\r
+ auto border = [&]() -> BorderSize<int>\r
+ {\r
+ if (component->getParentComponent() == nullptr)\r
+ if (auto* peer = component->getPeer())\r
+ if (const auto frameSize = peer->getFrameSizeIfPresent())\r
+ return *frameSize;\r
+\r
+ return {};\r
+ }();\r
\r
border.addTo (bounds);\r
\r
};\r
\r
//==============================================================================\r
-FlexBox::FlexBox() noexcept = default;\r
-FlexBox::~FlexBox() noexcept = default;\r
-\r
FlexBox::FlexBox (JustifyContent jc) noexcept : justifyContent (jc) {}\r
\r
FlexBox::FlexBox (Direction d, Wrap w, AlignContent ac, AlignItems ai, JustifyContent jc) noexcept\r
\r
//==============================================================================\r
/** Creates an empty FlexBox container with default parameters. */\r
- FlexBox() noexcept;\r
+ FlexBox() noexcept = default;\r
\r
/** Creates an empty FlexBox container with these parameters. */\r
FlexBox (Direction, Wrap, AlignContent, AlignItems, JustifyContent) noexcept;\r
/** Creates an empty FlexBox container with the given content-justification mode. */\r
FlexBox (JustifyContent) noexcept;\r
\r
- /** Destructor. */\r
- ~FlexBox() noexcept;\r
-\r
//==============================================================================\r
/** Lays-out the box's items within the given rectangle. */\r
void performLayout (Rectangle<float> targetArea);\r
GridItem::Margin::Margin (float t, float r, float b, float l) noexcept : left (l), right (r), top (t), bottom (b) {}\r
\r
//==============================================================================\r
-GridItem::GridItem() noexcept {}\r
-GridItem::~GridItem() noexcept {}\r
-\r
+GridItem::GridItem() noexcept = default;\r
GridItem::GridItem (Component& componentToUse) noexcept : associatedComponent (&componentToUse) {}\r
GridItem::GridItem (Component* componentToUse) noexcept : associatedComponent (componentToUse) {}\r
\r
/** Creates an item with a given Component to use. */\r
GridItem (Component* componentToUse) noexcept;\r
\r
- /** Destructor. */\r
- ~GridItem() noexcept;\r
-\r
//==============================================================================\r
/** If this is non-null, it represents a Component whose bounds are controlled by this item. */\r
Component* associatedComponent = nullptr;\r
namespace juce\r
{\r
\r
-Viewport::Viewport (const String& name) : Component (name)\r
+static bool viewportWouldScrollOnEvent (const Viewport* vp, const MouseInputSource& src) noexcept\r
+{\r
+ if (vp != nullptr)\r
+ {\r
+ switch (vp->getScrollOnDragMode())\r
+ {\r
+ case Viewport::ScrollOnDragMode::all: return true;\r
+ case Viewport::ScrollOnDragMode::nonHover: return ! src.canHover();\r
+ case Viewport::ScrollOnDragMode::never: return false;\r
+ }\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+using ViewportDragPosition = AnimatedPosition<AnimatedPositionBehaviours::ContinuousWithMomentum>;\r
+\r
+struct Viewport::DragToScrollListener : private MouseListener,\r
+ private ViewportDragPosition::Listener\r
+{\r
+ DragToScrollListener (Viewport& v) : viewport (v)\r
+ {\r
+ viewport.contentHolder.addMouseListener (this, true);\r
+ offsetX.addListener (this);\r
+ offsetY.addListener (this);\r
+ offsetX.behaviour.setMinimumVelocity (60);\r
+ offsetY.behaviour.setMinimumVelocity (60);\r
+ }\r
+\r
+ ~DragToScrollListener() override\r
+ {\r
+ viewport.contentHolder.removeMouseListener (this);\r
+ Desktop::getInstance().removeGlobalMouseListener (this);\r
+ }\r
+\r
+ void positionChanged (ViewportDragPosition&, double) override\r
+ {\r
+ viewport.setViewPosition (originalViewPos - Point<int> ((int) offsetX.getPosition(),\r
+ (int) offsetY.getPosition()));\r
+ }\r
+\r
+ void mouseDown (const MouseEvent& e) override\r
+ {\r
+ if (! isGlobalMouseListener && viewportWouldScrollOnEvent (&viewport, e.source))\r
+ {\r
+ offsetX.setPosition (offsetX.getPosition());\r
+ offsetY.setPosition (offsetY.getPosition());\r
+\r
+ // switch to a global mouse listener so we still receive mouseUp events\r
+ // if the original event component is deleted\r
+ viewport.contentHolder.removeMouseListener (this);\r
+ Desktop::getInstance().addGlobalMouseListener (this);\r
+\r
+ isGlobalMouseListener = true;\r
+\r
+ scrollSource = e.source;\r
+ }\r
+ }\r
+\r
+ void mouseDrag (const MouseEvent& e) override\r
+ {\r
+ if (e.source == scrollSource\r
+ && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent))\r
+ {\r
+ auto totalOffset = e.getOffsetFromDragStart().toFloat();\r
+\r
+ if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f && viewportWouldScrollOnEvent (&viewport, e.source))\r
+ {\r
+ isDragging = true;\r
+\r
+ originalViewPos = viewport.getViewPosition();\r
+ offsetX.setPosition (0.0);\r
+ offsetX.beginDrag();\r
+ offsetY.setPosition (0.0);\r
+ offsetY.beginDrag();\r
+ }\r
+\r
+ if (isDragging)\r
+ {\r
+ offsetX.drag (totalOffset.x);\r
+ offsetY.drag (totalOffset.y);\r
+ }\r
+ }\r
+ }\r
+\r
+ void mouseUp (const MouseEvent& e) override\r
+ {\r
+ if (isGlobalMouseListener && e.source == scrollSource)\r
+ endDragAndClearGlobalMouseListener();\r
+ }\r
+\r
+ void endDragAndClearGlobalMouseListener()\r
+ {\r
+ offsetX.endDrag();\r
+ offsetY.endDrag();\r
+ isDragging = false;\r
+\r
+ viewport.contentHolder.addMouseListener (this, true);\r
+ Desktop::getInstance().removeGlobalMouseListener (this);\r
+\r
+ isGlobalMouseListener = false;\r
+ }\r
+\r
+ bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp)\r
+ {\r
+ for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent())\r
+ if (c->getViewportIgnoreDragFlag())\r
+ return true;\r
+\r
+ return false;\r
+ }\r
+\r
+ Viewport& viewport;\r
+ ViewportDragPosition offsetX, offsetY;\r
+ Point<int> originalViewPos;\r
+ MouseInputSource scrollSource = Desktop::getInstance().getMainMouseSource();\r
+ bool isDragging = false;\r
+ bool isGlobalMouseListener = false;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener)\r
+};\r
+\r
+//==============================================================================\r
+Viewport::Viewport (const String& name)\r
+ : Component (name),\r
+ dragToScrollListener (std::make_unique<DragToScrollListener> (*this))\r
{\r
// content holder is used to clip the contents so they don't overlap the scrollbars\r
addAndMakeVisible (contentHolder);\r
\r
setInterceptsMouseClicks (false, true);\r
setWantsKeyboardFocus (true);\r
- setScrollOnDragEnabled (Desktop::getInstance().getMainMouseSource().isTouch());\r
\r
recreateScrollbars();\r
}\r
\r
Viewport::~Viewport()\r
{\r
- setScrollOnDragEnabled (false);\r
deleteOrRemoveContentComp();\r
}\r
\r
}\r
\r
//==============================================================================\r
-typedef AnimatedPosition<AnimatedPositionBehaviours::ContinuousWithMomentum> ViewportDragPosition;\r
-\r
-struct Viewport::DragToScrollListener : private MouseListener,\r
- private ViewportDragPosition::Listener\r
-{\r
- DragToScrollListener (Viewport& v) : viewport (v)\r
- {\r
- viewport.contentHolder.addMouseListener (this, true);\r
- offsetX.addListener (this);\r
- offsetY.addListener (this);\r
- offsetX.behaviour.setMinimumVelocity (60);\r
- offsetY.behaviour.setMinimumVelocity (60);\r
- }\r
-\r
- ~DragToScrollListener() override\r
- {\r
- viewport.contentHolder.removeMouseListener (this);\r
- Desktop::getInstance().removeGlobalMouseListener (this);\r
- }\r
-\r
- void positionChanged (ViewportDragPosition&, double) override\r
- {\r
- viewport.setViewPosition (originalViewPos - Point<int> ((int) offsetX.getPosition(),\r
- (int) offsetY.getPosition()));\r
- }\r
-\r
- void mouseDown (const MouseEvent& e) override\r
- {\r
- if (! isGlobalMouseListener)\r
- {\r
- offsetX.setPosition (offsetX.getPosition());\r
- offsetY.setPosition (offsetY.getPosition());\r
-\r
- // switch to a global mouse listener so we still receive mouseUp events\r
- // if the original event component is deleted\r
- viewport.contentHolder.removeMouseListener (this);\r
- Desktop::getInstance().addGlobalMouseListener (this);\r
-\r
- isGlobalMouseListener = true;\r
-\r
- scrollSource = e.source;\r
- }\r
- }\r
-\r
- void mouseDrag (const MouseEvent& e) override\r
- {\r
- if (e.source == scrollSource\r
- && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent))\r
- {\r
- auto totalOffset = e.getOffsetFromDragStart().toFloat();\r
-\r
- if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f)\r
- {\r
- isDragging = true;\r
-\r
- originalViewPos = viewport.getViewPosition();\r
- offsetX.setPosition (0.0);\r
- offsetX.beginDrag();\r
- offsetY.setPosition (0.0);\r
- offsetY.beginDrag();\r
- }\r
-\r
- if (isDragging)\r
- {\r
- offsetX.drag (totalOffset.x);\r
- offsetY.drag (totalOffset.y);\r
- }\r
- }\r
- }\r
-\r
- void mouseUp (const MouseEvent& e) override\r
- {\r
- if (isGlobalMouseListener && e.source == scrollSource)\r
- endDragAndClearGlobalMouseListener();\r
- }\r
-\r
- void endDragAndClearGlobalMouseListener()\r
- {\r
- offsetX.endDrag();\r
- offsetY.endDrag();\r
- isDragging = false;\r
-\r
- viewport.contentHolder.addMouseListener (this, true);\r
- Desktop::getInstance().removeGlobalMouseListener (this);\r
-\r
- isGlobalMouseListener = false;\r
- }\r
-\r
- bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp)\r
- {\r
- for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent())\r
- if (c->getViewportIgnoreDragFlag())\r
- return true;\r
-\r
- return false;\r
- }\r
-\r
- Viewport& viewport;\r
- ViewportDragPosition offsetX, offsetY;\r
- Point<int> originalViewPos;\r
- MouseInputSource scrollSource = Desktop::getInstance().getMainMouseSource();\r
- bool isDragging = false;\r
- bool isGlobalMouseListener = false;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener)\r
-};\r
-\r
-void Viewport::setScrollOnDragEnabled (bool shouldScrollOnDrag)\r
-{\r
- if (isScrollOnDragEnabled() != shouldScrollOnDrag)\r
- {\r
- if (shouldScrollOnDrag)\r
- dragToScrollListener.reset (new DragToScrollListener (*this));\r
- else\r
- dragToScrollListener.reset();\r
- }\r
-}\r
-\r
-bool Viewport::isScrollOnDragEnabled() const noexcept\r
+void Viewport::setScrollOnDragMode (const ScrollOnDragMode mode)\r
{\r
- return dragToScrollListener != nullptr;\r
+ scrollOnDragMode = mode;\r
}\r
\r
bool Viewport::isCurrentlyScrollingOnDrag() const noexcept\r
{\r
- return dragToScrollListener != nullptr && dragToScrollListener->isDragging;\r
+ return dragToScrollListener->isDragging;\r
}\r
\r
//==============================================================================\r
*/\r
bool canScrollHorizontally() const noexcept;\r
\r
- /** Enables or disables drag-to-scroll functionality in the viewport.\r
+ /** Enables or disables drag-to-scroll functionality for mouse sources in the viewport.\r
\r
If your viewport contains a Component that you don't want to receive mouse events when the\r
user is drag-scrolling, you can disable this with the Component::setViewportIgnoreDragFlag()\r
method.\r
*/\r
- void setScrollOnDragEnabled (bool shouldScrollOnDrag);\r
+ [[deprecated ("Use setScrollOnDragMode instead.")]]\r
+ void setScrollOnDragEnabled (bool shouldScrollOnDrag)\r
+ {\r
+ setScrollOnDragMode (shouldScrollOnDrag ? ScrollOnDragMode::all : ScrollOnDragMode::never);\r
+ }\r
\r
- /** Returns true if drag-to-scroll functionality is enabled. */\r
- bool isScrollOnDragEnabled() const noexcept;\r
+ /** Returns true if drag-to-scroll functionality is enabled for mouse input sources. */\r
+ [[deprecated ("Use getScrollOnDragMode instead.")]]\r
+ bool isScrollOnDragEnabled() const noexcept { return getScrollOnDragMode() == ScrollOnDragMode::all; }\r
+\r
+ enum class ScrollOnDragMode\r
+ {\r
+ never, /**< Dragging will never scroll the viewport. */\r
+ nonHover, /**< Dragging will only scroll the viewport if the input source cannot hover. */\r
+ all /**< Dragging will always scroll the viewport. */\r
+ };\r
+\r
+ /** Sets the current scroll-on-drag mode. The default is ScrollOnDragMode::nonHover.\r
+\r
+ If your viewport contains a Component that you don't want to receive mouse events when the\r
+ user is drag-scrolling, you can disable this with the Component::setViewportIgnoreDragFlag()\r
+ method.\r
+ */\r
+ void setScrollOnDragMode (ScrollOnDragMode scrollOnDragMode);\r
+\r
+ /** Returns the current scroll-on-drag mode. */\r
+ ScrollOnDragMode getScrollOnDragMode() const { return scrollOnDragMode; }\r
\r
/** Returns true if the user is currently dragging-to-scroll.\r
@see setScrollOnDragEnabled\r
Rectangle<int> lastVisibleArea;\r
int scrollBarThickness = 0;\r
int singleStepX = 16, singleStepY = 16;\r
+ ScrollOnDragMode scrollOnDragMode = ScrollOnDragMode::nonHover;\r
bool showHScrollbar = true, showVScrollbar = true, deleteContent = true;\r
bool customScrollBarThickness = false;\r
bool allowScrollingWithoutScrollbarV = false, allowScrollingWithoutScrollbarH = false;\r
overImage.addAndMakeVisible (ellipse.createCopy().release());\r
overImage.addAndMakeVisible (dp.createCopy().release());\r
\r
- auto db = new DrawableButton ("tabs", DrawableButton::ImageFitted);\r
+ auto db = new DrawableButton (TRANS ("Additional Items"), DrawableButton::ImageFitted);\r
db->setImages (&normalImage, &overImage, nullptr);\r
return db;\r
}\r
auto resultID = options.hasWatchedComponentBeenDeleted() ? 0 : getResultItemID (item);\r
\r
exitModalState (resultID);\r
+ exitingModalState = true;\r
\r
if (makeInvisible && deletionChecker != nullptr)\r
setVisible (false);\r
if (! treeContains (currentlyModalWindow))\r
return false;\r
\r
+ if (exitingModalState)\r
+ return false;\r
+\r
return true;\r
}\r
\r
uint32 windowCreationTime, lastFocusedTime, timeEnteredCurrentChildComp;\r
OwnedArray<MouseSourceState> mouseSourceStates;\r
float scaleFactor;\r
+ bool exitingModalState = false;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MenuWindow)\r
};\r
\r
@see withTargetComponent, withTargetScreenArea\r
*/\r
- Options withTargetComponent (Component* targetComponent) const;\r
- Options withTargetComponent (Component& targetComponent) const;\r
+ JUCE_NODISCARD Options withTargetComponent (Component* targetComponent) const;\r
+ JUCE_NODISCARD Options withTargetComponent (Component& targetComponent) const;\r
\r
/** Sets the region of the screen next to which the menu should be displayed.\r
\r
\r
@see withMousePosition\r
*/\r
- Options withTargetScreenArea (Rectangle<int> targetArea) const;\r
+ JUCE_NODISCARD Options withTargetScreenArea (Rectangle<int> targetArea) const;\r
\r
/** Sets the target screen area to match the current mouse position.\r
\r
\r
@see withTargetScreenArea\r
*/\r
- Options withMousePosition() const;\r
+ JUCE_NODISCARD Options withMousePosition() const;\r
\r
/** If the passed component has been deleted when the popup menu exits,\r
the selected item's action will not be called.\r
callback, in the case that the callback needs to access a component that\r
may be deleted.\r
*/\r
- Options withDeletionCheck (Component& componentToWatchForDeletion) const;\r
+ JUCE_NODISCARD Options withDeletionCheck (Component& componentToWatchForDeletion) const;\r
\r
/** Sets the minimum width of the popup window. */\r
- Options withMinimumWidth (int minWidth) const;\r
+ JUCE_NODISCARD Options withMinimumWidth (int minWidth) const;\r
\r
/** Sets the minimum number of columns in the popup window. */\r
- Options withMinimumNumColumns (int minNumColumns) const;\r
+ JUCE_NODISCARD Options withMinimumNumColumns (int minNumColumns) const;\r
\r
/** Sets the maximum number of columns in the popup window. */\r
- Options withMaximumNumColumns (int maxNumColumns) const;\r
+ JUCE_NODISCARD Options withMaximumNumColumns (int maxNumColumns) const;\r
\r
/** Sets the default height of each item in the popup menu. */\r
- Options withStandardItemHeight (int standardHeight) const;\r
+ JUCE_NODISCARD Options withStandardItemHeight (int standardHeight) const;\r
\r
/** Sets an item which must be visible when the menu is initially drawn.\r
\r
This is useful to ensure that a particular item is shown when the menu\r
contains too many items to display on a single screen.\r
*/\r
- Options withItemThatMustBeVisible (int idOfItemToBeVisible) const;\r
+ JUCE_NODISCARD Options withItemThatMustBeVisible (int idOfItemToBeVisible) const;\r
\r
/** Sets a component that the popup menu will be drawn into.\r
\r
avoid this unwanted behaviour, but with the downside that the menu size\r
will be constrained by the size of the parent component.\r
*/\r
- Options withParentComponent (Component* parentComponent) const;\r
+ JUCE_NODISCARD Options withParentComponent (Component* parentComponent) const;\r
\r
/** Sets the direction of the popup menu relative to the target screen area. */\r
- Options withPreferredPopupDirection (PopupDirection direction) const;\r
+ JUCE_NODISCARD Options withPreferredPopupDirection (PopupDirection direction) const;\r
\r
/** Sets an item to select in the menu.\r
\r
than needing to move the highlighted row down from the top of the menu each time\r
it is opened.\r
*/\r
- Options withInitiallySelectedItem (int idOfItemToBeSelected) const;\r
+ JUCE_NODISCARD Options withInitiallySelectedItem (int idOfItemToBeSelected) const;\r
\r
//==============================================================================\r
/** Gets the parent component. This may be nullptr if the Component has been deleted.\r
{\r
}\r
\r
-MouseEvent::~MouseEvent() noexcept\r
-{\r
-}\r
-\r
//==============================================================================\r
MouseEvent MouseEvent::getEventRelativeTo (Component* const otherComponent) const noexcept\r
{\r
int numberOfClicks,\r
bool mouseWasDragged) noexcept;\r
\r
- /** Destructor. */\r
- ~MouseEvent() noexcept;\r
+ MouseEvent (const MouseEvent&) = default;\r
+ MouseEvent& operator= (const MouseEvent&) = delete;\r
+\r
+ MouseEvent (MouseEvent&&) = default;\r
+ MouseEvent& operator= (MouseEvent&&) = delete;\r
\r
//==============================================================================\r
/** The position of the mouse when the event occurred.\r
private:\r
//==============================================================================\r
const uint8 numberOfClicks, wasMovedSinceMouseDown;\r
-\r
- MouseEvent& operator= (const MouseEvent&);\r
};\r
\r
\r
return lastPeer;\r
}\r
\r
- static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos)\r
- {\r
- if (auto* peer = comp.getPeer())\r
- {\r
- pos = peer->globalToLocal (pos);\r
- auto& peerComp = peer->getComponent();\r
- return comp.getLocalPoint (&peerComp, ScalingHelpers::unscaledScreenPosToScaled (peerComp, pos));\r
- }\r
-\r
- return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp, pos));\r
- }\r
-\r
Component* findComponentAt (Point<float> screenPos)\r
{\r
if (auto* peer = getPeer())\r
Point<float> getRawScreenPosition() const noexcept\r
{\r
return unboundedMouseOffset + (inputType != MouseInputSource::InputSourceType::touch ? MouseInputSource::getCurrentRawMousePosition()\r
- : lastScreenPos);\r
+ : lastPointerState.position);\r
}\r
\r
void setScreenPosition (Point<float> p)\r
MouseInputSource::setRawMousePosition (ScalingHelpers::scaledScreenPosToUnscaled (p));\r
}\r
\r
- bool isPressureValid() const noexcept { return pressure >= 0.0f && pressure <= 1.0f; }\r
- bool isOrientationValid() const noexcept { return orientation >= 0.0f && orientation <= MathConstants<float>::twoPi; }\r
- bool isRotationValid() const noexcept { return rotation >= 0.0f && rotation <= MathConstants<float>::twoPi; }\r
- bool isTiltValid (bool isX) const noexcept { return isX ? (tiltX >= -1.0f && tiltX <= 1.0f) : (tiltY >= -1.0f && tiltY <= 1.0f); }\r
-\r
//==============================================================================\r
#if JUCE_DUMP_MOUSE_EVENTS\r
- #define JUCE_MOUSE_EVENT_DBG(desc) DBG ("Mouse " << desc << " #" << index \\r
- << ": " << screenPosToLocalPos (comp, screenPos).toString() \\r
- << " - Comp: " << String::toHexString ((pointer_sized_int) &comp));\r
+ #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) DBG ("Mouse " << desc << " #" << index \\r
+ << ": " << ScalingHelpers::screenPosToLocalPos (comp, screenPos).toString() \\r
+ << " - Comp: " << String::toHexString ((pointer_sized_int) &comp));\r
#else\r
- #define JUCE_MOUSE_EVENT_DBG(desc)\r
+ #define JUCE_MOUSE_EVENT_DBG(desc, screenPos)\r
#endif\r
\r
- void sendMouseEnter (Component& comp, Point<float> screenPos, Time time)\r
+ void sendMouseEnter (Component& comp, const PointerState& pointerState, Time time)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("enter")\r
- comp.internalMouseEnter (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time);\r
+ JUCE_MOUSE_EVENT_DBG ("enter", pointerState.position)\r
+ comp.internalMouseEnter (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);\r
}\r
\r
- void sendMouseExit (Component& comp, Point<float> screenPos, Time time)\r
+ void sendMouseExit (Component& comp, const PointerState& pointerState, Time time)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("exit")\r
- comp.internalMouseExit (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time);\r
+ JUCE_MOUSE_EVENT_DBG ("exit", pointerState.position)\r
+ comp.internalMouseExit (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);\r
}\r
\r
- void sendMouseMove (Component& comp, Point<float> screenPos, Time time)\r
+ void sendMouseMove (Component& comp, const PointerState& pointerState, Time time)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("move")\r
- comp.internalMouseMove (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time);\r
+ JUCE_MOUSE_EVENT_DBG ("move", pointerState.position)\r
+ comp.internalMouseMove (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);\r
}\r
\r
- void sendMouseDown (Component& comp, Point<float> screenPos, Time time)\r
+ void sendMouseDown (Component& comp, const PointerState& pointerState, Time time)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("down")\r
- comp.internalMouseDown (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY);\r
+ JUCE_MOUSE_EVENT_DBG ("down", pointerState.position)\r
+ comp.internalMouseDown (MouseInputSource (this),\r
+ pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),\r
+ time);\r
}\r
\r
- void sendMouseDrag (Component& comp, Point<float> screenPos, Time time)\r
+ void sendMouseDrag (Component& comp, const PointerState& pointerState, Time time)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("drag")\r
- comp.internalMouseDrag (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY);\r
+ JUCE_MOUSE_EVENT_DBG ("drag", pointerState.position)\r
+ comp.internalMouseDrag (MouseInputSource (this),\r
+ pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),\r
+ time);\r
}\r
\r
- void sendMouseUp (Component& comp, Point<float> screenPos, Time time, ModifierKeys oldMods)\r
+ void sendMouseUp (Component& comp, const PointerState& pointerState, Time time, ModifierKeys oldMods)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("up")\r
- comp.internalMouseUp (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, oldMods, pressure, orientation, rotation, tiltX, tiltY);\r
+ JUCE_MOUSE_EVENT_DBG ("up", pointerState.position)\r
+ comp.internalMouseUp (MouseInputSource (this),\r
+ pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),\r
+ time,\r
+ oldMods);\r
}\r
\r
void sendMouseWheel (Component& comp, Point<float> screenPos, Time time, const MouseWheelDetails& wheel)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("wheel")\r
- comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel);\r
+ JUCE_MOUSE_EVENT_DBG ("wheel", screenPos)\r
+ comp.internalMouseWheel (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, wheel);\r
}\r
\r
void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount)\r
{\r
- JUCE_MOUSE_EVENT_DBG ("magnify")\r
- comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount);\r
+ JUCE_MOUSE_EVENT_DBG ("magnify", screenPos)\r
+ comp.internalMagnifyGesture (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, amount);\r
}\r
\r
//==============================================================================\r
// (returns true if the button change caused a modal event loop)\r
- bool setButtons (Point<float> screenPos, Time time, ModifierKeys newButtonState)\r
+ bool setButtons (const PointerState& pointerState, Time time, ModifierKeys newButtonState)\r
{\r
if (buttonState == newButtonState)\r
return false;\r
\r
// (avoid sending a spurious mouse-drag when we receive a mouse-up)\r
if (! (isDragging() && ! newButtonState.isAnyMouseButtonDown()))\r
- setScreenPos (screenPos, time, false);\r
+ setPointerState (pointerState, time, false);\r
\r
// (ignore secondary clicks when there's already a button down)\r
if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown())\r
auto oldMods = getCurrentModifiers();\r
buttonState = newButtonState; // must change this before calling sendMouseUp, in case it runs a modal loop\r
\r
- sendMouseUp (*current, screenPos + unboundedMouseOffset, time, oldMods);\r
+ sendMouseUp (*current, pointerState.withPositionOffset (unboundedMouseOffset), time, oldMods);\r
\r
if (lastCounter != mouseEventCounter)\r
return true; // if a modal loop happened, then newButtonState is no longer valid.\r
\r
if (auto* current = getComponentUnderMouse())\r
{\r
- registerMouseDown (screenPos, time, *current, buttonState,\r
+ registerMouseDown (pointerState.position, time, *current, buttonState,\r
inputType == MouseInputSource::InputSourceType::touch);\r
- sendMouseDown (*current, screenPos, time);\r
+ sendMouseDown (*current, pointerState, time);\r
}\r
}\r
\r
return lastCounter != mouseEventCounter;\r
}\r
\r
- void setComponentUnderMouse (Component* newComponent, Point<float> screenPos, Time time)\r
+ void setComponentUnderMouse (Component* newComponent, const PointerState& pointerState, Time time)\r
{\r
auto* current = getComponentUnderMouse();\r
\r
if (current != nullptr)\r
{\r
WeakReference<Component> safeOldComp (current);\r
- setButtons (screenPos, time, ModifierKeys());\r
+ setButtons (pointerState, time, ModifierKeys());\r
\r
if (auto oldComp = safeOldComp.get())\r
{\r
componentUnderMouse = safeNewComp;\r
- sendMouseExit (*oldComp, screenPos, time);\r
+ sendMouseExit (*oldComp, pointerState, time);\r
}\r
\r
buttonState = originalButtonState;\r
current = safeNewComp.get();\r
\r
if (current != nullptr)\r
- sendMouseEnter (*current, screenPos, time);\r
+ sendMouseEnter (*current, pointerState, time);\r
\r
revealCursor (false);\r
- setButtons (screenPos, time, originalButtonState);\r
+ setButtons (pointerState, time, originalButtonState);\r
}\r
}\r
\r
- void setPeer (ComponentPeer& newPeer, Point<float> screenPos, Time time)\r
+ void setPeer (ComponentPeer& newPeer, const PointerState& pointerState, Time time)\r
{\r
if (&newPeer != lastPeer)\r
{\r
- setComponentUnderMouse (nullptr, screenPos, time);\r
+ setComponentUnderMouse (nullptr, pointerState, time);\r
lastPeer = &newPeer;\r
- setComponentUnderMouse (findComponentAt (screenPos), screenPos, time);\r
+ setComponentUnderMouse (findComponentAt (pointerState.position), pointerState, time);\r
}\r
}\r
\r
- void setScreenPos (Point<float> newScreenPos, Time time, bool forceUpdate)\r
+ void setPointerState (const PointerState& newPointerState, Time time, bool forceUpdate)\r
{\r
+ const auto& newScreenPos = newPointerState.position;\r
+\r
if (! isDragging())\r
- setComponentUnderMouse (findComponentAt (newScreenPos), newScreenPos, time);\r
+ setComponentUnderMouse (findComponentAt (newScreenPos), newPointerState, time);\r
\r
- if (newScreenPos != lastScreenPos || forceUpdate)\r
+ if ((newPointerState != lastPointerState) || forceUpdate)\r
{\r
cancelPendingUpdate();\r
\r
- if (newScreenPos != MouseInputSource::offscreenMousePos)\r
- lastScreenPos = newScreenPos;\r
+ if (newPointerState.position != MouseInputSource::offscreenMousePos)\r
+ lastPointerState = newPointerState;\r
\r
if (auto* current = getComponentUnderMouse())\r
{\r
if (isDragging())\r
{\r
registerMouseDrag (newScreenPos);\r
- sendMouseDrag (*current, newScreenPos + unboundedMouseOffset, time);\r
+ sendMouseDrag (*current, newPointerState.withPositionOffset (unboundedMouseOffset), time);\r
\r
if (isUnboundedMouseModeOn)\r
handleUnboundedDrag (*current);\r
}\r
else\r
{\r
- sendMouseMove (*current, newScreenPos, time);\r
+ sendMouseMove (*current, newPointerState, time);\r
}\r
}\r
\r
const ModifierKeys newMods, float newPressure, float newOrientation, PenDetails pen)\r
{\r
lastTime = time;\r
-\r
- const bool pressureChanged = (pressure != newPressure);\r
- pressure = newPressure;\r
-\r
- const bool orientationChanged = (orientation != newOrientation);\r
- orientation = newOrientation;\r
-\r
- const bool rotationChanged = (rotation != pen.rotation);\r
- rotation = pen.rotation;\r
-\r
- const bool tiltChanged = (tiltX != pen.tiltX || tiltY != pen.tiltY);\r
- tiltX = pen.tiltX;\r
- tiltY = pen.tiltY;\r
-\r
- const bool shouldUpdate = (pressureChanged || orientationChanged || rotationChanged || tiltChanged);\r
-\r
++mouseEventCounter;\r
-\r
- auto screenPos = newPeer.localToGlobal (positionWithinPeer);\r
+ const auto pointerState = PointerState().withPosition (newPeer.localToGlobal (positionWithinPeer))\r
+ .withPressure (newPressure)\r
+ .withOrientation (newOrientation)\r
+ .withRotation (MouseInputSource::defaultRotation)\r
+ .withTiltX (pen.tiltX)\r
+ .withTiltY (pen.tiltY);\r
\r
if (isDragging() && newMods.isAnyMouseButtonDown())\r
{\r
- setScreenPos (screenPos, time, shouldUpdate);\r
+ setPointerState (pointerState, time, false);\r
}\r
else\r
{\r
- setPeer (newPeer, screenPos, time);\r
+ setPeer (newPeer, pointerState, time);\r
\r
if (auto* peer = getPeer())\r
{\r
- if (setButtons (screenPos, time, newMods))\r
+ if (setButtons (pointerState, time, newMods))\r
return; // some modal events have been dispatched, so the current event is now out-of-date\r
\r
peer = getPeer();\r
\r
if (peer != nullptr)\r
- setScreenPos (screenPos, time, shouldUpdate);\r
+ setPointerState (pointerState, time, false);\r
}\r
}\r
}\r
++mouseEventCounter;\r
\r
screenPos = peer.localToGlobal (positionWithinPeer);\r
- setPeer (peer, screenPos, time);\r
- setScreenPos (screenPos, time, false);\r
+ const auto pointerState = lastPointerState.withPosition (screenPos);\r
+ setPeer (peer, pointerState, time);\r
+ setPointerState (pointerState, time, false);\r
triggerFakeMove();\r
\r
return getComponentUnderMouse();\r
\r
void handleAsyncUpdate() override\r
{\r
- setScreenPos (lastScreenPos, jmax (lastTime, Time::getCurrentTime()), true);\r
+ setPointerState (lastPointerState, jmax (lastTime, Time::getCurrentTime()), true);\r
}\r
\r
//==============================================================================\r
// when released, return the mouse to within the component's bounds\r
if (auto* current = getComponentUnderMouse())\r
setScreenPosition (current->getScreenBounds().toFloat()\r
- .getConstrainedPoint (ScalingHelpers::unscaledScreenPosToScaled (lastScreenPos)));\r
+ .getConstrainedPoint (ScalingHelpers::unscaledScreenPosToScaled (lastPointerState.position)));\r
}\r
\r
isUnboundedMouseModeOn = enable;\r
{\r
auto componentScreenBounds = ScalingHelpers::scaledScreenPosToUnscaled (current.getParentMonitorArea().reduced (2, 2).toFloat());\r
\r
- if (! componentScreenBounds.contains (lastScreenPos))\r
+ if (! componentScreenBounds.contains (lastPointerState.position))\r
{\r
auto componentCentre = current.getScreenBounds().toFloat().getCentre();\r
- unboundedMouseOffset += (lastScreenPos - ScalingHelpers::scaledScreenPosToUnscaled (componentCentre));\r
+ unboundedMouseOffset += (lastPointerState.position - ScalingHelpers::scaledScreenPosToUnscaled (componentCentre));\r
setScreenPosition (componentCentre);\r
}\r
else if (isCursorVisibleUntilOffscreen\r
&& (! unboundedMouseOffset.isOrigin())\r
- && componentScreenBounds.contains (lastScreenPos + unboundedMouseOffset))\r
+ && componentScreenBounds.contains (lastPointerState.position + unboundedMouseOffset))\r
{\r
- MouseInputSource::setRawMousePosition (lastScreenPos + unboundedMouseOffset);\r
+ MouseInputSource::setRawMousePosition (lastPointerState.position + unboundedMouseOffset);\r
unboundedMouseOffset = {};\r
}\r
}\r
//==============================================================================\r
const int index;\r
const MouseInputSource::InputSourceType inputType;\r
- Point<float> lastScreenPos, unboundedMouseOffset; // NB: these are unscaled coords\r
+ Point<float> unboundedMouseOffset; // NB: these are unscaled coords\r
+ PointerState lastPointerState;\r
ModifierKeys buttonState;\r
- float pressure = 0;\r
- float orientation = 0;\r
- float rotation = 0;\r
- float tiltX = 0;\r
- float tiltY = 0;\r
\r
bool isUnboundedMouseModeOn = false, isCursorVisibleUntilOffscreen = false;\r
\r
Point<float> MouseInputSource::getScreenPosition() const noexcept { return pimpl->getScreenPosition(); }\r
Point<float> MouseInputSource::getRawScreenPosition() const noexcept { return pimpl->getRawScreenPosition(); }\r
ModifierKeys MouseInputSource::getCurrentModifiers() const noexcept { return pimpl->getCurrentModifiers(); }\r
-float MouseInputSource::getCurrentPressure() const noexcept { return pimpl->pressure; }\r
-bool MouseInputSource::isPressureValid() const noexcept { return pimpl->isPressureValid(); }\r
-float MouseInputSource::getCurrentOrientation() const noexcept { return pimpl->orientation; }\r
-bool MouseInputSource::isOrientationValid() const noexcept { return pimpl->isOrientationValid(); }\r
-float MouseInputSource::getCurrentRotation() const noexcept { return pimpl->rotation; }\r
-bool MouseInputSource::isRotationValid() const noexcept { return pimpl->isRotationValid(); }\r
-float MouseInputSource::getCurrentTilt (bool tiltX) const noexcept { return tiltX ? pimpl->tiltX : pimpl->tiltY; }\r
-bool MouseInputSource::isTiltValid (bool isX) const noexcept { return pimpl->isTiltValid (isX); }\r
+float MouseInputSource::getCurrentPressure() const noexcept { return pimpl->lastPointerState.pressure; }\r
+bool MouseInputSource::isPressureValid() const noexcept { return pimpl->lastPointerState.isPressureValid(); }\r
+float MouseInputSource::getCurrentOrientation() const noexcept { return pimpl->lastPointerState.orientation; }\r
+bool MouseInputSource::isOrientationValid() const noexcept { return pimpl->lastPointerState.isOrientationValid(); }\r
+float MouseInputSource::getCurrentRotation() const noexcept { return pimpl->lastPointerState.rotation; }\r
+bool MouseInputSource::isRotationValid() const noexcept { return pimpl->lastPointerState.isRotationValid(); }\r
+float MouseInputSource::getCurrentTilt (bool tiltX) const noexcept { return tiltX ? pimpl->lastPointerState.tiltX : pimpl->lastPointerState.tiltY; }\r
+bool MouseInputSource::isTiltValid (bool isX) const noexcept { return pimpl->lastPointerState.isTiltValid (isX); }\r
Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); }\r
void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); }\r
int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); }\r
}\r
else if (type == MouseInputSource::InputSourceType::touch)\r
{\r
- jassert (touchIndex >= 0 && touchIndex < 100); // sanity-check on number of fingers\r
+ jassert (0 <= touchIndex && touchIndex < 100); // sanity-check on number of fingers\r
\r
for (auto& m : sourceArray)\r
if (type == m.getType() && touchIndex == m.getIndex())\r
// because on some OSes the queue can get overloaded with messages so that mouse-events don't get through..\r
if (s->isDragging() && ComponentPeer::getCurrentModifiersRealtime().isAnyMouseButtonDown())\r
{\r
- s->lastScreenPos = s->getRawScreenPosition();\r
+ s->lastPointerState.position = s->getRawScreenPosition();\r
s->triggerFakeMove();\r
anyDragging = true;\r
}\r
/** A default value for pressure, which is used when a device doesn't support it, or for\r
mouse-moves, mouse-ups, etc.\r
*/\r
- static const float invalidPressure;\r
+ static constexpr float defaultPressure = 0.0f;\r
\r
/** A default value for orientation, which is used when a device doesn't support it */\r
- static const float invalidOrientation;\r
+ static constexpr float defaultOrientation = 0.0f;\r
\r
/** A default value for rotation, which is used when a device doesn't support it */\r
- static const float invalidRotation;\r
+ static constexpr float defaultRotation = 0.0f;\r
\r
/** Default values for tilt, which are used when a device doesn't support it */\r
+ static constexpr float defaultTiltX = 0.0f;\r
+ static constexpr float defaultTiltY = 0.0f;\r
+\r
+ /** A default value for pressure, which is used when a device doesn't support it.\r
+\r
+ This is a valid value, returning true when calling isPressureValid() hence the\r
+ deprecation. Use defaultPressure instead.\r
+ */\r
+ [[deprecated ("Use defaultPressure instead.")]]\r
+ static const float invalidPressure;\r
+\r
+ /** A default value for orientation, which is used when a device doesn't support it.\r
+\r
+ This is a valid value, returning true when calling isOrientationValid() hence the\r
+ deprecation. Use defaultOrientation instead.\r
+ */\r
+ [[deprecated ("Use defaultOrientation instead.")]]\r
+ static const float invalidOrientation;\r
+\r
+ /** A default value for rotation, which is used when a device doesn't support it.\r
+\r
+ This is a valid value, returning true when calling isRotationValid() hence the\r
+ deprecation. Use defaultRotation instead.\r
+ */\r
+ [[deprecated ("Use defaultRotation instead.")]]\r
+ static const float invalidRotation;\r
+\r
+ /** Default values for tilt, which are used when a device doesn't support it\r
+\r
+ These are valid values, returning true when calling isTiltValid() hence the\r
+ deprecation. Use defaultTiltX and defaultTiltY instead.\r
+ */\r
+ [[deprecated ("Use defaultTiltX instead.")]]\r
static const float invalidTiltX;\r
+ [[deprecated ("Use defaultTiltY instead.")]]\r
static const float invalidTiltY;\r
\r
/** An offscreen mouse position used when triggering mouse exits where we don't want to move\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - 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 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-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
+namespace juce\r
+{\r
+\r
+#ifndef DOXYGEN\r
+\r
+class PointerState\r
+{\r
+ auto tie() const noexcept\r
+ {\r
+ return std::tie (position, pressure, orientation, rotation, tiltX, tiltY);\r
+ }\r
+\r
+public:\r
+ PointerState() = default;\r
+\r
+ bool operator== (const PointerState& other) const noexcept { return tie() == other.tie(); }\r
+ bool operator!= (const PointerState& other) const noexcept { return tie() != other.tie(); }\r
+\r
+ JUCE_NODISCARD PointerState withPositionOffset (Point<float> x) const noexcept { return with (&PointerState::position, position + x); }\r
+ JUCE_NODISCARD PointerState withPosition (Point<float> x) const noexcept { return with (&PointerState::position, x); }\r
+ JUCE_NODISCARD PointerState withPressure (float x) const noexcept { return with (&PointerState::pressure, x); }\r
+ JUCE_NODISCARD PointerState withOrientation (float x) const noexcept { return with (&PointerState::orientation, x); }\r
+ JUCE_NODISCARD PointerState withRotation (float x) const noexcept { return with (&PointerState::rotation, x); }\r
+ JUCE_NODISCARD PointerState withTiltX (float x) const noexcept { return with (&PointerState::tiltX, x); }\r
+ JUCE_NODISCARD PointerState withTiltY (float x) const noexcept { return with (&PointerState::tiltY, x); }\r
+\r
+ Point<float> position;\r
+ float pressure = MouseInputSource::defaultPressure;\r
+ float orientation = MouseInputSource::defaultOrientation;\r
+ float rotation = MouseInputSource::defaultRotation;\r
+ float tiltX = MouseInputSource::defaultTiltX;\r
+ float tiltY = MouseInputSource::defaultTiltY;\r
+\r
+ bool isPressureValid() const noexcept { return 0.0f <= pressure && pressure <= 1.0f; }\r
+ bool isOrientationValid() const noexcept { return 0.0f <= orientation && orientation <= MathConstants<float>::twoPi; }\r
+ bool isRotationValid() const noexcept { return 0.0f <= rotation && rotation <= MathConstants<float>::twoPi; }\r
+ bool isTiltValid (bool isX) const noexcept\r
+ {\r
+ return isX ? (-1.0f <= tiltX && tiltX <= 1.0f)\r
+ : (-1.0f <= tiltY && tiltY <= 1.0f);\r
+ }\r
+\r
+private:\r
+ template <typename Value>\r
+ PointerState with (Value PointerState::* member, Value item) const\r
+ {\r
+ auto copy = *this;\r
+ copy.*member = std::move (item);\r
+ return copy;\r
+ }\r
+};\r
+\r
+inline auto makeMouseEvent (MouseInputSource source,\r
+ const PointerState& ps,\r
+ ModifierKeys modifiers,\r
+ Component* eventComponent,\r
+ Component* originator,\r
+ Time eventTime,\r
+ Point<float> mouseDownPos,\r
+ Time mouseDownTime,\r
+ int numberOfClicks,\r
+ bool mouseWasDragged)\r
+{\r
+ return MouseEvent (source,\r
+ ps.position,\r
+ modifiers,\r
+ ps.pressure,\r
+ ps.orientation,\r
+ ps.rotation,\r
+ ps.tiltX,\r
+ ps.tiltY,\r
+ eventComponent,\r
+ originator,\r
+ eventTime,\r
+ mouseDownPos,\r
+ mouseDownTime,\r
+ numberOfClicks,\r
+ mouseWasDragged);\r
+}\r
+\r
+\r
+#endif\r
+\r
+} // namespace juce\r
const auto numCharacters = textInterface.getTotalNumCharacters();\r
const auto isForwards = (direction == Direction::forwards);\r
\r
- auto offsetWithDirecton = [isForwards] (int input) { return isForwards ? input : -input; };\r
+ const auto offsetWithDirecton = [isForwards] (int input) { return isForwards ? input : -input; };\r
\r
switch (boundary)\r
{\r
case BoundaryType::character:\r
- return jlimit (0, numCharacters, currentPosition + offsetWithDirecton (1));\r
+ return jlimit (0, numCharacters, isForwards ? currentPosition + 1 : currentPosition);\r
\r
case BoundaryType::word:\r
case BoundaryType::line:\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
\r
static id getAccessibilityDataTableCellElementForRowColumn (id self, SEL, NSUInteger row, NSUInteger column)\r
{\r
- if (auto* tableInterface = getTableInterface (self))\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
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
{\r
uiaWrapper->disconnectProvider (provider);\r
\r
- if (providerCount == 0)\r
+ if (providerCount == 0 && JUCEApplicationBase::isStandaloneApp())\r
uiaWrapper->disconnectAllProviders();\r
}\r
}\r
(float) localPos.y * scale));\r
}\r
\r
+ OptionalBorderSize getFrameSizeIfPresent() const override\r
+ {\r
+ // TODO\r
+ return {};\r
+ }\r
+\r
BorderSize<int> getFrameSize() const override\r
{\r
// TODO\r
handleMouseEvent (MouseInputSource::InputSourceType::touch,\r
pos,\r
ModifierKeys::currentModifiers.withoutMouseButtons(),\r
- MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation,\r
+ MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation,\r
time,\r
{},\r
index);\r
handleMouseEvent (MouseInputSource::InputSourceType::touch,\r
pos,\r
ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier),\r
- MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation,\r
+ MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation,\r
time,\r
{},\r
index);\r
handleMouseEvent (MouseInputSource::InputSourceType::touch,\r
pos,\r
ModifierKeys::currentModifiers.withoutMouseButtons(),\r
- MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation,\r
+ MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation,\r
time,\r
{},\r
index);\r
bm.lineStride = width * static_cast<int> (sizeof (jint));\r
bm.pixelStride = static_cast<int> (sizeof (jint));\r
bm.pixelFormat = Image::ARGB;\r
- bm.data = (uint8*) (data + x + y * width);\r
+ const auto offset = (size_t) x + (size_t) y * (size_t) width;\r
+ bm.data = (uint8*) (data + offset);\r
+ bm.size = sizeof (jint) * (((size_t) height * (size_t) width) - offset);\r
}\r
\r
ImagePixelData::Ptr clone() override\r
controller = [newController retain];\r
}\r
\r
- Rectangle<int> getBounds() const override { return getBounds (! isSharedWindow); }\r
+ Rectangle<int> getBounds() const override { return getBounds (! isSharedWindow); }\r
Rectangle<int> getBounds (bool global) const;\r
Point<float> localToGlobal (Point<float> relativePosition) override;\r
Point<float> globalToLocal (Point<float> screenPosition) override;\r
using ComponentPeer::localToGlobal;\r
using ComponentPeer::globalToLocal;\r
void setAlpha (float newAlpha) override;\r
- void setMinimised (bool) override {}\r
- bool isMinimised() const override { return false; }\r
+ void setMinimised (bool) override {}\r
+ bool isMinimised() const override { return false; }\r
void setFullScreen (bool shouldBeFullScreen) override;\r
- bool isFullScreen() const override { return fullScreen; }\r
+ bool isFullScreen() const override { return fullScreen; }\r
bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override;\r
- BorderSize<int> getFrameSize() const override { return BorderSize<int>(); }\r
+ OptionalBorderSize getFrameSizeIfPresent() const override { return {}; }\r
+ BorderSize<int> getFrameSize() const override { return BorderSize<int>(); }\r
bool setAlwaysOnTop (bool alwaysOnTop) override;\r
void toFront (bool makeActiveWindow) override;\r
void toBehind (ComponentPeer* other) override;\r
void setIcon (const Image& newIcon) override;\r
- StringArray getAvailableRenderingEngines() override { return StringArray ("CoreGraphics Renderer"); }\r
+ StringArray getAvailableRenderingEngines() override { return StringArray ("CoreGraphics Renderer"); }\r
\r
void drawRect (CGRect);\r
bool canBecomeKeyWindow();\r
\r
// this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.\r
handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, modsToSend.withoutMouseButtons(),\r
- MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, time, {}, touchIndex);\r
+ MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, time, {}, touchIndex);\r
\r
if (! isValidPeer (this)) // (in case this component was deleted by the event)\r
return;\r
\r
// NB: some devices return 0 or 1.0 if pressure is unknown, so we'll clip our value to a believable range:\r
auto pressure = maximumForce > 0 ? jlimit (0.0001f, 0.9999f, getTouchForce (touch) / maximumForce)\r
- : MouseInputSource::invalidPressure;\r
+ : MouseInputSource::defaultPressure;\r
\r
handleMouseEvent (MouseInputSource::InputSourceType::touch,\r
- pos, modsToSend, pressure, MouseInputSource::invalidOrientation, time, { }, touchIndex);\r
+ pos, modsToSend, pressure, MouseInputSource::defaultOrientation, time, { }, touchIndex);\r
\r
if (! isValidPeer (this)) // (in case this component was deleted by the event)\r
return;\r
if (isUp (mouseEventFlags))\r
{\r
handleMouseEvent (MouseInputSource::InputSourceType::touch, MouseInputSource::offscreenMousePos, modsToSend,\r
- MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, time, {}, touchIndex);\r
+ MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, time, {}, touchIndex);\r
\r
if (! isValidPeer (this))\r
return;\r
handleMouseEvent (MouseInputSource::InputSourceType::touch,\r
pos,\r
ModifierKeys::currentModifiers,\r
- MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation,\r
+ MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation,\r
UIViewComponentPeer::getMouseTime ([[NSProcessInfo processInfo] systemUptime]),\r
{});\r
}\r
return bounds;\r
}\r
\r
- BorderSize<int> getFrameSize() const override\r
+ OptionalBorderSize getFrameSizeIfPresent() const override\r
{\r
return windowBorder;\r
}\r
\r
+ BorderSize<int> getFrameSize() const override\r
+ {\r
+ const auto optionalBorderSize = getFrameSizeIfPresent();\r
+ return optionalBorderSize ? (*optionalBorderSize) : BorderSize<int>();\r
+ }\r
+\r
Point<float> localToGlobal (Point<float> relativePosition) override\r
{\r
return relativePosition + getScreenPosition (false).toFloat();\r
void updateBorderSize()\r
{\r
if ((styleFlags & windowHasTitleBar) == 0)\r
- windowBorder = {};\r
- else if (windowBorder.getTopAndBottom() == 0 && windowBorder.getLeftAndRight() == 0)\r
+ {\r
+ windowBorder = ComponentPeer::OptionalBorderSize { BorderSize<int>() };\r
+ }\r
+ else if (! windowBorder\r
+ || ((*windowBorder).getTopAndBottom() == 0 && (*windowBorder).getLeftAndRight() == 0))\r
+ {\r
windowBorder = XWindowSystem::getInstance()->getBorderSize (windowH);\r
+ }\r
}\r
\r
//==============================================================================\r
\r
::Window windowH = {}, parentWindow = {};\r
Rectangle<int> bounds;\r
- BorderSize<int> windowBorder;\r
+ ComponentPeer::OptionalBorderSize windowBorder;\r
bool fullScreen = false, isAlwaysOnTop = false;\r
double currentScaleFactor = 1.0;\r
Array<Component*> glRepaintListeners;\r
| NSTrackingEnabledDuringMouseDrag\r
| NSTrackingActiveAlways\r
| NSTrackingInVisibleRect;\r
- [view addTrackingArea: [[NSTrackingArea alloc] initWithRect: r\r
- options: options\r
- owner: view\r
- userInfo: nil]];\r
+ const NSUniquePtr<NSTrackingArea> trackingArea { [[NSTrackingArea alloc] initWithRect: r\r
+ options: options\r
+ owner: view\r
+ userInfo: nil] };\r
+ [view addTrackingArea: trackingArea.get()];\r
\r
notificationCenter = [NSNotificationCenter defaultCenter];\r
\r
if (isSharedWindow)\r
return;\r
\r
- setCollectionBehaviour (shouldBeFullScreen);\r
+ if (shouldBeFullScreen)\r
+ setCollectionBehaviour (true);\r
\r
if (isMinimised())\r
setMinimised (false);\r
\r
- if (hasNativeTitleBar())\r
- {\r
- if (shouldBeFullScreen != isFullScreen())\r
- [window toggleFullScreen: nil];\r
- }\r
- else\r
- {\r
- [window zoom: nil];\r
- }\r
+ if (shouldBeFullScreen != isFullScreen())\r
+ [window toggleFullScreen: nil];\r
}\r
\r
bool isFullScreen() const override\r
: (v == view);\r
}\r
\r
- BorderSize<int> getFrameSize() const override\r
+ OptionalBorderSize getFrameSizeIfPresent() const override\r
{\r
- BorderSize<int> b;\r
-\r
if (! isSharedWindow)\r
{\r
+ BorderSize<int> b;\r
+\r
NSRect v = [view convertRect: [view frame] toView: nil];\r
NSRect w = [window frame];\r
\r
b.setBottom ((int) v.origin.y);\r
b.setLeft ((int) v.origin.x);\r
b.setRight ((int) (w.size.width - (v.origin.x + v.size.width)));\r
+\r
+ return OptionalBorderSize { b };\r
}\r
\r
- return b;\r
+ return {};\r
+ }\r
+\r
+ BorderSize<int> getFrameSize() const override\r
+ {\r
+ if (const auto frameSize = getFrameSizeIfPresent())\r
+ return *frameSize;\r
+\r
+ return {};\r
}\r
\r
bool hasNativeTitleBar() const\r
else\r
// moved into another window which overlaps this one, so trigger an exit\r
handleMouseEvent (MouseInputSource::InputSourceType::mouse, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers,\r
- getMousePressure (ev), MouseInputSource::invalidOrientation, getMouseTime (ev));\r
+ getMousePressure (ev), MouseInputSource::defaultOrientation, getMouseTime (ev));\r
\r
showArrowCursorIfNeeded();\r
}\r
{\r
updateModifiers (ev);\r
handleMouseEvent (MouseInputSource::InputSourceType::mouse, getMousePos (ev, view), ModifierKeys::currentModifiers,\r
- getMousePressure (ev), MouseInputSource::invalidOrientation, getMouseTime (ev));\r
+ getMousePressure (ev), MouseInputSource::defaultOrientation, getMouseTime (ev));\r
}\r
\r
bool handleKeyEvent (NSEvent* ev, bool isKeyDown)\r
return false;\r
}\r
\r
- void sendModalInputAttemptIfBlocked()\r
+ enum class KeyWindowChanged { no, yes };\r
+\r
+ void sendModalInputAttemptIfBlocked (KeyWindowChanged keyChanged)\r
{\r
- if (isBlockedByModalComponent())\r
- if (auto* modal = Component::getCurrentlyModalComponent())\r
- if (auto* otherPeer = modal->getPeer())\r
- if ((otherPeer->getStyleFlags() & ComponentPeer::windowIsTemporary) != 0)\r
- modal->inputAttemptWhenModal();\r
+ if (! isBlockedByModalComponent())\r
+ return;\r
+\r
+ if (auto* modal = Component::getCurrentlyModalComponent())\r
+ {\r
+ if (auto* otherPeer = modal->getPeer())\r
+ {\r
+ const auto modalPeerIsTemporary = (otherPeer->getStyleFlags() & ComponentPeer::windowIsTemporary) != 0;\r
+\r
+ if (! modalPeerIsTemporary)\r
+ return;\r
+\r
+ // When a peer resigns key status, it might be because we just created a modal\r
+ // component that is now key.\r
+ // In this case, we should only dismiss the modal component if it isn't key,\r
+ // implying that a third window has become key.\r
+ const auto modalPeerIsKey = [NSApp keyWindow] == static_cast<NSViewComponentPeer*> (otherPeer)->window;\r
+\r
+ if (keyChanged == KeyWindowChanged::yes && modalPeerIsKey)\r
+ return;\r
+\r
+ modal->inputAttemptWhenModal();\r
+ }\r
+ }\r
}\r
\r
bool canBecomeKeyWindow()\r
{\r
[notificationCenter addObserver: view\r
selector: dismissModalsSelector\r
- name: NSWindowDidMoveNotification\r
+ name: NSWindowWillMoveNotification\r
object: currentWindow];\r
\r
[notificationCenter addObserver: view\r
void dismissModals()\r
{\r
if (hasNativeTitleBar() || isSharedWindow)\r
- sendModalInputAttemptIfBlocked();\r
+ sendModalInputAttemptIfBlocked (KeyWindowChanged::no);\r
}\r
\r
void becomeKey()\r
void resignKey()\r
{\r
viewFocusLoss();\r
- sendModalInputAttemptIfBlocked();\r
+ sendModalInputAttemptIfBlocked (KeyWindowChanged::yes);\r
}\r
\r
void liveResizingStart()\r
return [NSArray arrayWithObjects: type, (NSString*) kPasteboardTypeFileURLPromise, NSPasteboardTypeString, nil];\r
}\r
\r
- BOOL sendDragCallback (const int type, id <NSDraggingInfo> sender)\r
+ BOOL sendDragCallback (bool (ComponentPeer::* callback) (const DragInfo&), id <NSDraggingInfo> sender)\r
{\r
NSPasteboard* pasteboard = [sender draggingPasteboard];\r
NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()];\r
if (contentType == nil)\r
return false;\r
\r
- NSPoint p = [view convertPoint: [sender draggingLocation] fromView: nil];\r
+ const auto p = localToGlobal (convertToPointFloat ([view convertPoint: [sender draggingLocation] fromView: nil]));\r
+\r
ComponentPeer::DragInfo dragInfo;\r
- dragInfo.position.setXY ((int) p.x, (int) p.y);\r
+ dragInfo.position = ScalingHelpers::screenPosToLocalPos (component, p).roundToInt();\r
\r
if (contentType == NSPasteboardTypeString)\r
dragInfo.text = nsStringToJuce ([pasteboard stringForType: NSPasteboardTypeString]);\r
dragInfo.files = getDroppedFiles (pasteboard, contentType);\r
\r
if (! dragInfo.isEmpty())\r
- {\r
- switch (type)\r
- {\r
- case 0: return handleDragMove (dragInfo);\r
- case 1: return handleDragExit (dragInfo);\r
- case 2: return handleDragDrop (dragInfo);\r
- default: jassertfalse; break;\r
- }\r
- }\r
+ return (this->*callback) (dragInfo);\r
\r
return false;\r
}\r
String stringBeingComposed;\r
NSNotificationCenter* notificationCenter = nil;\r
\r
+ Rectangle<float> lastSizeBeforeZoom;\r
RectangleList<float> deferredRepaints;\r
uint32 lastRepaintTime;\r
\r
static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)\r
{\r
if (auto* owner = getOwner (self))\r
- if (owner->sendDragCallback (0, sender))\r
+ if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))\r
return NSDragOperationGeneric;\r
\r
return NSDragOperationNone;\r
\r
static void draggingExited (id self, SEL, id<NSDraggingInfo> sender)\r
{\r
- callOnOwner (self, &NSViewComponentPeer::sendDragCallback, 1, sender);\r
+ callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender);\r
}\r
\r
static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>)\r
static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender)\r
{\r
auto* owner = getOwner (self);\r
- return owner != nullptr && owner->sendDragCallback (2, sender);\r
+ return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);\r
}\r
\r
static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {}\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
\r
addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
\r
+ addMethod (@selector (toggleFullScreen:), toggleFullScreen);\r
+\r
addProtocol (@protocol (NSWindowDelegate));\r
\r
registerClass();\r
#endif\r
}\r
\r
- static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect r)\r
+ static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow* window, NSRect r)\r
{\r
if (auto* owner = getOwner (self))\r
{\r
if (auto* constrainer = owner->getConstrainer())\r
{\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 (convertToRectFloat (flippedScreenRect (r)));\r
- return flippedScreenRect (makeNSRect (constrained));\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
return r;\r
}\r
\r
- static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow* window, NSRect frame)\r
+ static BOOL windowShouldZoomToFrame (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
- return convertToRectFloat ([window frame]).withZeroOrigin() != convertToRectFloat (frame).withZeroOrigin();\r
+ return YES;\r
}\r
\r
static BOOL canBecomeKeyWindow (id self, SEL)\r
return frameRect.size;\r
}\r
\r
+ static void toggleFullScreen (id self, SEL name, id sender)\r
+ {\r
+ if (auto* owner = getOwner (self))\r
+ {\r
+ const auto isFullScreen = owner->isFullScreen();\r
+\r
+ if (! isFullScreen)\r
+ owner->lastSizeBeforeZoom = owner->getBounds().toFloat();\r
+\r
+ sendSuperclassMessage<void> (self, name, sender);\r
+\r
+ if (isFullScreen)\r
+ {\r
+ [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
+ owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false);\r
+ }\r
+ }\r
+ }\r
+\r
static void windowDidExitFullScreen (id self, SEL, NSNotification*)\r
{\r
if (auto* owner = getOwner (self))\r
owner->resetWindowPresentation();\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
+\r
static void windowWillEnterFullScreen (id self, SEL, NSNotification*)\r
{\r
if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9)\r
\r
int getResult() const\r
{\r
- switch (getRawResult())\r
+ return convertResult ([getAlert() runModal]);\r
+ }\r
+\r
+ using AsyncUpdater::triggerAsyncUpdate;\r
+\r
+private:\r
+ static int convertResult (NSModalResponse response)\r
+ {\r
+ switch (response)\r
{\r
case NSAlertFirstButtonReturn: return 0;\r
case NSAlertSecondButtonReturn: return 1;\r
return 0;\r
}\r
\r
- using AsyncUpdater::triggerAsyncUpdate;\r
-\r
-private:\r
void handleAsyncUpdate() override\r
{\r
- auto result = getResult();\r
+ if (auto* comp = options.getAssociatedComponent())\r
+ {\r
+ if (auto* peer = comp->getPeer())\r
+ {\r
+ if (auto* view = static_cast<NSView*> (peer->getNativeHandle()))\r
+ {\r
+ if (auto* window = [view window])\r
+ {\r
+ if (@available (macOS 10.9, *))\r
+ {\r
+ [getAlert() beginSheetModalForWindow: window completionHandler: ^(NSModalResponse result)\r
+ {\r
+ handleModalFinished (result);\r
+ }];\r
+\r
+ return;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
+ handleModalFinished ([getAlert() runModal]);\r
+ }\r
+\r
+ void handleModalFinished (NSModalResponse result)\r
+ {\r
if (callback != nullptr)\r
- callback->modalStateFinished (result);\r
+ callback->modalStateFinished (convertResult (result));\r
\r
delete this;\r
}\r
[alert addButtonWithTitle: juceStringToNS (button)];\r
}\r
\r
- NSInteger getRawResult() const\r
+ NSAlert* getAlert() const\r
{\r
NSAlert* alert = [[[NSAlert alloc] init] autorelease];\r
\r
addButton (alert, options.getButtonText (1));\r
addButton (alert, options.getButtonText (2));\r
\r
- return [alert runModal];\r
+ return alert;\r
}\r
\r
MessageBoxOptions options;\r
#if JUCE_MODAL_LOOPS_PERMITTED\r
void JUCE_CALLTYPE NativeMessageBox::showMessageBox (MessageBoxIconType iconType,\r
const String& title, const String& message,\r
- Component* /*associatedComponent*/)\r
+ Component* associatedComponent)\r
{\r
showDialog (MessageBoxOptions()\r
.withIconType (iconType)\r
.withTitle (title)\r
.withMessage (message)\r
- .withButton (TRANS("OK")),\r
+ .withButton (TRANS("OK"))\r
+ .withAssociatedComponent (associatedComponent),\r
nullptr, AlertWindowMappings::messageBox);\r
}\r
\r
\r
void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (MessageBoxIconType iconType,\r
const String& title, const String& message,\r
- Component* /*associatedComponent*/,\r
+ Component* associatedComponent,\r
ModalComponentManager::Callback* callback)\r
{\r
showDialog (MessageBoxOptions()\r
.withIconType (iconType)\r
.withTitle (title)\r
.withMessage (message)\r
- .withButton (TRANS("OK")),\r
+ .withButton (TRANS("OK"))\r
+ .withAssociatedComponent (associatedComponent),\r
callback, AlertWindowMappings::messageBox);\r
}\r
\r
bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (MessageBoxIconType iconType,\r
const String& title, const String& message,\r
- Component* /*associatedComponent*/,\r
+ Component* associatedComponent,\r
ModalComponentManager::Callback* callback)\r
{\r
return showDialog (MessageBoxOptions()\r
.withTitle (title)\r
.withMessage (message)\r
.withButton (TRANS("OK"))\r
- .withButton (TRANS("Cancel")),\r
+ .withButton (TRANS("Cancel"))\r
+ .withAssociatedComponent (associatedComponent),\r
callback, AlertWindowMappings::okCancel) != 0;\r
}\r
\r
int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (MessageBoxIconType iconType,\r
const String& title, const String& message,\r
- Component* /*associatedComponent*/,\r
+ Component* associatedComponent,\r
ModalComponentManager::Callback* callback)\r
{\r
return showDialog (MessageBoxOptions()\r
.withMessage (message)\r
.withButton (TRANS("Yes"))\r
.withButton (TRANS("No"))\r
- .withButton (TRANS("Cancel")),\r
+ .withButton (TRANS("Cancel"))\r
+ .withAssociatedComponent (associatedComponent),\r
callback, AlertWindowMappings::yesNoCancel);\r
}\r
\r
int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (MessageBoxIconType iconType,\r
const String& title, const String& message,\r
- Component* /*associatedComponent*/,\r
+ Component* associatedComponent,\r
ModalComponentManager::Callback* callback)\r
{\r
return showDialog (MessageBoxOptions()\r
.withTitle (title)\r
.withMessage (message)\r
.withButton (TRANS("Yes"))\r
- .withButton (TRANS("No")),\r
+ .withButton (TRANS("No"))\r
+ .withAssociatedComponent (associatedComponent),\r
callback, AlertWindowMappings::okCancel);\r
}\r
\r
#endif\r
}\r
\r
+ ~NativeDarkModeChangeDetectorImpl()\r
+ {\r
+ UnhookWindowsHookEx (hook);\r
+ }\r
+\r
bool isDarkModeEnabled() const noexcept { return darkModeEnabled; }\r
\r
private:\r
\r
void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
{\r
- bitmap.data = imageData + x * pixelStride + y * lineStride;\r
+ const auto offset = (size_t) (x * pixelStride + y * lineStride);\r
+ bitmap.data = imageData + offset;\r
+ bitmap.size = (size_t) (lineStride * height) - offset;\r
bitmap.pixelFormat = pixelFormat;\r
bitmap.lineStride = lineStride;\r
bitmap.pixelStride = pixelStride;\r
\r
void setBounds (const Rectangle<int>& bounds, bool isNowFullScreen) override\r
{\r
+ // If we try to set new bounds while handling an existing position change,\r
+ // Windows may get confused about our current scale and size.\r
+ // This can happen when moving a window between displays, because the mouse-move\r
+ // generator in handlePositionChanged can cause the window to move again.\r
+ if (inHandlePositionChanged)\r
+ return;\r
+\r
const ScopedValueSetter<bool> scope (shouldIgnoreModalDismiss, true);\r
\r
fullScreen = isNowFullScreen;\r
if (! hasMoved) flags |= SWP_NOMOVE;\r
if (! hasResized) flags |= SWP_NOSIZE;\r
\r
- setWindowPos (hwnd, newBounds, flags, numInDpiChange == 0);\r
+ setWindowPos (hwnd, newBounds, flags, ! inDpiChange);\r
\r
if (hasResized && isValidPeer (this))\r
{\r
return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0));\r
}\r
\r
+ OptionalBorderSize getFrameSizeIfPresent() const override\r
+ {\r
+ return ComponentPeer::OptionalBorderSize { windowBorder };\r
+ }\r
+\r
BorderSize<int> getFrameSize() const override\r
{\r
return windowBorder;\r
private:\r
Point<float> getMousePos (POINTL mousePos) const\r
{\r
- return peer.getComponent().getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }),\r
- (HWND) peer.getNativeHandle()).toFloat());\r
+ const auto originalPos = pointFromPOINT ({ mousePos.x, mousePos.y });\r
+ const auto logicalPos = convertPhysicalScreenPointToLogical (originalPos, peer.hwnd);\r
+ return ScalingHelpers::screenPosToLocalPos (peer.component, logicalPos.toFloat());\r
}\r
\r
struct DroppedData\r
#endif\r
\r
double scaleFactor = 1.0;\r
- int numInDpiChange = 0;\r
+ bool inDpiChange = 0, inHandlePositionChanged = 0;\r
\r
bool isAccessibilityActive = false;\r
\r
}\r
else\r
{\r
+ TCHAR messageBuffer[256] = {};\r
+\r
+ FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r
+ nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
+ messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr);\r
+\r
+ DBG (messageBuffer);\r
jassertfalse;\r
}\r
}\r
if (now >= lastMouseTime + minTimeBetweenMouses)\r
{\r
lastMouseTime = now;\r
- doMouseEvent (position, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, modsToSend);\r
+ doMouseEvent (position, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, modsToSend);\r
}\r
}\r
\r
\r
isDragging = true;\r
\r
- doMouseEvent (position, MouseInputSource::invalidPressure);\r
+ doMouseEvent (position, MouseInputSource::defaultPressure);\r
}\r
}\r
\r
// NB: under some circumstances (e.g. double-clicking a native title bar), a mouse-up can\r
// arrive without a mouse-down, so in that case we need to avoid sending a message.\r
if (wasDragging)\r
- doMouseEvent (position, MouseInputSource::invalidPressure);\r
+ doMouseEvent (position, MouseInputSource::defaultPressure);\r
}\r
\r
void doCaptureChanged()\r
isMouseOver = false;\r
\r
if (! areOtherTouchSourcesActive())\r
- doMouseEvent (getCurrentMousePos(), MouseInputSource::invalidPressure);\r
+ doMouseEvent (getCurrentMousePos(), MouseInputSource::defaultPressure);\r
}\r
\r
ComponentPeer* findPeerUnderMouse (Point<float>& localPos)\r
}\r
\r
bool handleTouchInput (const TOUCHINPUT& touch, const bool isDown, const bool isUp,\r
- const float touchPressure = MouseInputSource::invalidPressure,\r
+ const float touchPressure = MouseInputSource::defaultPressure,\r
const float orientation = 0.0f)\r
{\r
auto isCancel = false;\r
return false;\r
\r
const auto pressure = touchInfo.touchMask & TOUCH_MASK_PRESSURE ? static_cast<float> (touchInfo.pressure)\r
- : MouseInputSource::invalidPressure;\r
+ : MouseInputSource::defaultPressure;\r
const auto orientation = touchInfo.touchMask & TOUCH_MASK_ORIENTATION ? degreesToRadians (static_cast<float> (touchInfo.orientation))\r
- : MouseInputSource::invalidOrientation;\r
+ : MouseInputSource::defaultOrientation;\r
\r
if (! handleTouchInput (emulateTouchEventFromPointer (touchInfo.pointerInfo.ptPixelLocationRaw, wParam),\r
isDown, isUp, pressure, orientation))\r
if (! getPointerPenInfo (GET_POINTERID_WPARAM (wParam), &penInfo))\r
return false;\r
\r
- const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? (float) penInfo.pressure / 1024.0f : MouseInputSource::invalidPressure;\r
+ const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? (float) penInfo.pressure / 1024.0f : MouseInputSource::defaultPressure;\r
\r
if (! handlePenInput (penInfo, globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (lParam)), hwnd).toFloat()),\r
pressure, isDown, isUp))\r
ModifierKeys modsToSend (ModifierKeys::currentModifiers);\r
PenDetails penDetails;\r
\r
- penDetails.rotation = (penInfo.penMask & PEN_MASK_ROTATION) ? degreesToRadians (static_cast<float> (penInfo.rotation)) : MouseInputSource::invalidRotation;\r
- penDetails.tiltX = (penInfo.penMask & PEN_MASK_TILT_X) ? (float) penInfo.tiltX / 90.0f : MouseInputSource::invalidTiltX;\r
- penDetails.tiltY = (penInfo.penMask & PEN_MASK_TILT_Y) ? (float) penInfo.tiltY / 90.0f : MouseInputSource::invalidTiltY;\r
+ penDetails.rotation = (penInfo.penMask & PEN_MASK_ROTATION) ? degreesToRadians (static_cast<float> (penInfo.rotation)) : MouseInputSource::defaultRotation;\r
+ penDetails.tiltX = (penInfo.penMask & PEN_MASK_TILT_X) ? (float) penInfo.tiltX / 90.0f : MouseInputSource::defaultTiltX;\r
+ penDetails.tiltY = (penInfo.penMask & PEN_MASK_TILT_Y) ? (float) penInfo.tiltY / 90.0f : MouseInputSource::defaultTiltY;\r
\r
auto pInfoFlags = penInfo.pointerInfo.pointerFlags;\r
\r
\r
// this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.\r
handleMouseEvent (MouseInputSource::InputSourceType::pen, pos, modsToSend.withoutMouseButtons(),\r
- pressure, MouseInputSource::invalidOrientation, time, penDetails);\r
+ pressure, MouseInputSource::defaultOrientation, time, penDetails);\r
\r
if (! isValidPeer (this)) // (in case this component was deleted by the event)\r
return false;\r
}\r
\r
handleMouseEvent (MouseInputSource::InputSourceType::pen, pos, modsToSend, pressure,\r
- MouseInputSource::invalidOrientation, time, penDetails);\r
+ MouseInputSource::defaultOrientation, time, penDetails);\r
\r
if (! isValidPeer (this)) // (in case this component was deleted by the event)\r
return false;\r
if (isUp)\r
{\r
handleMouseEvent (MouseInputSource::InputSourceType::pen, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers,\r
- pressure, MouseInputSource::invalidOrientation, time, penDetails);\r
+ pressure, MouseInputSource::defaultOrientation, time, penDetails);\r
\r
if (! isValidPeer (this))\r
return false;\r
\r
if (contains (pos.roundToInt(), false))\r
{\r
+ const ScopedValueSetter<bool> scope (inHandlePositionChanged, true);\r
+\r
if (! areOtherTouchSourcesActive())\r
- doMouseEvent (pos, MouseInputSource::invalidPressure);\r
+ doMouseEvent (pos, MouseInputSource::defaultPressure);\r
\r
if (! isValidPeer (this))\r
return true;\r
scaleFactor = newScale;\r
\r
{\r
- const ScopedValueSetter<int> setter (numInDpiChange, numInDpiChange + 1);\r
- setBounds (windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (newRect), hwnd)), fullScreen);\r
+ const ScopedValueSetter<bool> setter (inDpiChange, true);\r
+ SetWindowPos (hwnd,\r
+ nullptr,\r
+ newRect.left,\r
+ newRect.top,\r
+ newRect.right - newRect.left,\r
+ newRect.bottom - newRect.top,\r
+ SWP_NOZORDER | SWP_NOACTIVATE);\r
}\r
\r
// This is to handle reentrancy. If responding to a DPI change triggers further DPI changes,\r
// we should only notify listeners and resize windows once all of the DPI changes have\r
// resolved.\r
- if (numInDpiChange != 0)\r
+ if (inDpiChange)\r
+ {\r
+ // Danger! Re-entrant call to handleDPIChanging.\r
+ // Please report this issue on the JUCE forum, along with instructions\r
+ // so that a JUCE developer can reproduce the issue.\r
+ jassertfalse;\r
return 0;\r
+ }\r
\r
updateShadower();\r
InvalidateRect (hwnd, nullptr, FALSE);\r
if (windowH == 0)\r
windowH = (::Window) peer->getNativeHandle();\r
\r
- auto dropPos = Desktop::getInstance().getDisplays().physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16,\r
- (int) clientMsg.data.l[2] & 0xffff));\r
- dropPos -= peer->getBounds().getPosition();\r
+ const auto displays = Desktop::getInstance().getDisplays();\r
+ const auto logicalPos = displays.physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16,\r
+ (int) clientMsg.data.l[2] & 0xffff));\r
+ const auto dropPos = ScalingHelpers::screenPosToLocalPos (peer->getComponent(), logicalPos.toFloat()).roundToInt();\r
\r
const auto& atoms = getAtoms();\r
\r
if (atom == None)\r
return "None";\r
\r
- return X11Symbols::getInstance()->xGetAtomName (display, atom);\r
+ return makeXFreePtr (X11Symbols::getInstance()->xGetAtomName (display, atom)).get();\r
}\r
\r
bool XWindowSystemUtilities::Atoms::isMimeTypeFile (::Display* display, Atom atom)\r
void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y,\r
Image::BitmapData::ReadWriteMode mode) override\r
{\r
- bitmap.data = imageData + x * pixelStride + y * lineStride;\r
+ const auto offset = (size_t) (x * pixelStride + y * lineStride);\r
+ bitmap.data = imageData + offset;\r
+ bitmap.size = (size_t) (lineStride * height) - offset;\r
bitmap.pixelFormat = pixelFormat;\r
bitmap.lineStride = lineStride;\r
bitmap.pixelStride = pixelStride;\r
X11Symbols::getInstance()->xSetWMNormalHints (display, windowH, hints.get());\r
}\r
\r
- auto windowBorder = peer->getFrameSize();\r
+ const auto windowBorder = [&]() -> BorderSize<int>\r
+ {\r
+ if (const auto& frameSize = peer->getFrameSizeIfPresent())\r
+ return *frameSize;\r
+\r
+ return {};\r
+ }();\r
\r
X11Symbols::getInstance()->xMoveResizeWindow (display, windowH,\r
newBounds.getX() - windowBorder.getLeft(),\r
}\r
else if (auto* c = peer.getConstrainer())\r
{\r
- const auto windowBorder = peer.getFrameSize();\r
+ const auto windowBorder = [&]() -> BorderSize<int>\r
+ {\r
+ if (const auto& frameSize = peer.getFrameSizeIfPresent())\r
+ return *frameSize;\r
+\r
+ return {};\r
+ }();\r
+\r
const auto factor = peer.getPlatformScaleFactor();\r
const auto leftAndRight = windowBorder.getLeftAndRight();\r
const auto topAndBottom = windowBorder.getTopAndBottom();\r
&& child == None;\r
}\r
\r
-BorderSize<int> XWindowSystem::getBorderSize (::Window windowH) const\r
+ComponentPeer::OptionalBorderSize XWindowSystem::getBorderSize (::Window windowH) const\r
{\r
jassert (windowH != 0);\r
\r
data += sizeof (unsigned long);\r
}\r
\r
- return { (int) sizes[2], (int) sizes[0], (int) sizes[3], (int) sizes[1] };\r
+ return ComponentPeer::OptionalBorderSize ({ (int) sizes[2], (int) sizes[0], (int) sizes[3], (int) sizes[1] });\r
}\r
}\r
\r
{\r
jassert (display != nullptr);\r
\r
- XWindowSystemUtilities::ScopedXLock xLock;\r
+ {\r
+ XWindowSystemUtilities::ScopedXLock xLock;\r
\r
- X11Symbols::getInstance()->xDestroyWindow (display, juce_messageWindowHandle);\r
- juce_messageWindowHandle = 0;\r
- X11Symbols::getInstance()->xSync (display, True);\r
+ X11Symbols::getInstance()->xDestroyWindow (display, juce_messageWindowHandle);\r
+ juce_messageWindowHandle = 0;\r
+ X11Symbols::getInstance()->xSync (display, True);\r
+ }\r
\r
LinuxEventLoop::unregisterFdCallback (X11Symbols::getInstance()->xConnectionNumber (display));\r
\r
- X11Symbols::getInstance()->xCloseDisplay (display);\r
- display = nullptr;\r
- displayVisuals = nullptr;\r
+ {\r
+ XWindowSystemUtilities::ScopedXLock xLock;\r
+ X11Symbols::getInstance()->xCloseDisplay (display);\r
+ display = nullptr;\r
+ displayVisuals = nullptr;\r
+ }\r
}\r
}\r
\r
ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withFlags (buttonModifierFlag);\r
peer->toFront (true);\r
peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (buttonPressEvent, peer->getPlatformScaleFactor()),\r
- ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, getEventTime (buttonPressEvent), {});\r
+ ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, getEventTime (buttonPressEvent), {});\r
}\r
\r
void XWindowSystem::handleButtonPressEvent (LinuxComponentPeer* peer, const XButtonPressedEvent& buttonPressEvent) const\r
dragState.handleExternalDragButtonReleaseEvent();\r
\r
peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (buttonRelEvent, peer->getPlatformScaleFactor()),\r
- ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, getEventTime (buttonRelEvent));\r
+ ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, getEventTime (buttonRelEvent));\r
}\r
\r
void XWindowSystem::handleMotionNotifyEvent (LinuxComponentPeer* peer, const XPointerMovedEvent& movedEvent) const\r
dragState.handleExternalDragMotionNotify();\r
\r
peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (movedEvent, peer->getPlatformScaleFactor()),\r
- ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, getEventTime (movedEvent));\r
+ ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, getEventTime (movedEvent));\r
}\r
\r
void XWindowSystem::handleEnterNotifyEvent (LinuxComponentPeer* peer, const XEnterWindowEvent& enterEvent) const\r
{\r
updateKeyModifiers ((int) enterEvent.state);\r
peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (enterEvent, peer->getPlatformScaleFactor()),\r
- ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, getEventTime (enterEvent));\r
+ ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, getEventTime (enterEvent));\r
}\r
}\r
\r
{\r
updateKeyModifiers ((int) leaveEvent.state);\r
peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (leaveEvent, peer->getPlatformScaleFactor()),\r
- ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, getEventTime (leaveEvent));\r
+ ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation, getEventTime (leaveEvent));\r
}\r
}\r
\r
void setBounds (::Window, Rectangle<int>, bool fullScreen) const;\r
void updateConstraints (::Window) const;\r
\r
- BorderSize<int> getBorderSize (::Window) const;\r
- Rectangle<int> getWindowBounds (::Window, ::Window parentWindow);\r
+ ComponentPeer::OptionalBorderSize getBorderSize (::Window) const;\r
+ Rectangle<int> getWindowBounds (::Window, ::Window parentWindow);\r
Point<int> getPhysicalParentScreenPosition() const;\r
\r
bool contains (::Window, Point<int> localPos) const;\r
m->listBoxItemClicked (row, e);\r
}\r
\r
- bool isInDragToScrollViewport() const noexcept\r
- {\r
- if (auto* vp = owner.getViewport())\r
- return vp->isScrollOnDragEnabled() && (vp->canScrollVertically() || vp->canScrollHorizontally());\r
-\r
- return false;\r
- }\r
-\r
void mouseDown (const MouseEvent& e) override\r
{\r
isDragging = false;\r
\r
if (isEnabled())\r
{\r
- if (owner.selectOnMouseDown && ! (isSelected || isInDragToScrollViewport()))\r
+ if (owner.selectOnMouseDown && ! isSelected && ! viewportWouldScrollOnEvent (owner.getViewport(), e.source))\r
performSelection (e, false);\r
else\r
selectRowOnMouseUp = true;\r
Toolbar::Toolbar()\r
{\r
lookAndFeelChanged();\r
- addChildComponent (missingItemsButton.get());\r
-\r
- missingItemsButton->setAlwaysOnTop (true);\r
- missingItemsButton->onClick = [this] { showMissingItems(); };\r
+ initMissingItemButton();\r
}\r
\r
Toolbar::~Toolbar()\r
}\r
\r
//==============================================================================\r
+void Toolbar::initMissingItemButton()\r
+{\r
+ if (missingItemsButton == nullptr)\r
+ return;\r
+\r
+ addChildComponent (*missingItemsButton);\r
+ missingItemsButton->setAlwaysOnTop (true);\r
+ missingItemsButton->onClick = [this] { showMissingItems(); };\r
+}\r
+\r
void Toolbar::showMissingItems()\r
{\r
jassert (missingItemsButton->isShowing());\r
{\r
PopupMenu m;\r
auto comp = std::make_unique<MissingItemsComponent> (*this, getThickness());\r
- m.addCustomItem (1, std::move (comp));\r
+ m.addCustomItem (1, std::move (comp), nullptr, TRANS ("Additional Items"));\r
m.showMenuAsync (PopupMenu::Options().withTargetComponent (missingItemsButton.get()));\r
}\r
}\r
void Toolbar::lookAndFeelChanged()\r
{\r
missingItemsButton.reset (getLookAndFeel().createToolbarMissingItemsButton (*this));\r
+ initMissingItemButton();\r
}\r
\r
void Toolbar::mouseDown (const MouseEvent&) {}\r
class CustomisationDialog;\r
\r
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;\r
+ void initMissingItemButton();\r
void showMissingItems();\r
void addItemInternal (ToolbarItemFactory& factory, int itemId, int insertIndex);\r
\r
}\r
\r
//==============================================================================\r
-class TreeView::ItemComponent : public Component\r
+class TreeView::ItemComponent : public Component,\r
+ public TooltipClient\r
{\r
public:\r
explicit ItemComponent (TreeViewItem& itemToRepresent)\r
return item;\r
}\r
\r
+ String getTooltip() override\r
+ {\r
+ return item.getTooltip();\r
+ }\r
+\r
private:\r
//==============================================================================\r
class ItemAccessibilityHandler : public AccessibilityHandler\r
auto topLeft = itemComp.getRepresentedItem().getItemPosition (false).toFloat().getTopLeft();\r
\r
return { Desktop::getInstance().getMainMouseSource(), topLeft, mods,\r
- MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&itemComp, &itemComp, Time::getCurrentTime(), topLeft, Time::getCurrentTime(), 0, false };\r
}\r
\r
auto newComp = std::make_unique<ItemComponent> (*treeItem);\r
\r
addAndMakeVisible (*newComp);\r
- newComp->addMouseListener (this, false);\r
+ newComp->addMouseListener (this, treeItem->customComponentUsesTreeViewMouseHandler());\r
componentsToKeep.insert (newComp.get());\r
\r
itemComponents.push_back (std::move (newComp));\r
/** Draws the line that extends vertically up towards one of its parents, or down to one of its children. */\r
virtual void paintVerticalConnectingLine (Graphics&, const Line<float>& line);\r
\r
+ /** This should return true if you want to use a custom component, and also use\r
+ the TreeView's built-in mouse handling support, enabling drag-and-drop,\r
+ itemClicked() and itemDoubleClicked(); return false if the component should\r
+ consume all mouse clicks.\r
+ */\r
+ virtual bool customComponentUsesTreeViewMouseHandler() const { return false; }\r
+\r
/** Called when the user clicks on this item.\r
\r
If you're using createItemComponent() to create a custom component for the\r
\r
};\r
\r
+ /** Represents the window borders around a window component.\r
+\r
+ You must use operator bool() to evaluate the validity of the object before accessing\r
+ its value.\r
+\r
+ Returned by getFrameSizeIfPresent(). A missing value may be returned on Linux for a\r
+ short time after window creation.\r
+ */\r
+ class JUCE_API OptionalBorderSize final\r
+ {\r
+ public:\r
+ /** Default constructor. Creates an invalid object. */\r
+ OptionalBorderSize() : valid (false) {}\r
+\r
+ /** Constructor. Creates a valid object containing the provided BorderSize<int>. */\r
+ explicit OptionalBorderSize (BorderSize<int> size) : valid (true), borderSize (std::move (size)) {}\r
+\r
+ /** Returns true if a valid value has been provided. */\r
+ explicit operator bool() const noexcept { return valid; }\r
+\r
+ /** Returns a reference to the value.\r
+\r
+ You must not call this function on an invalid object. Use operator bool() to\r
+ determine validity.\r
+ */\r
+ const auto& operator*() const noexcept\r
+ {\r
+ jassert (valid);\r
+ return borderSize;\r
+ }\r
+\r
+ /** Returns a pointer to the value.\r
+\r
+ You must not call this function on an invalid object. Use operator bool() to\r
+ determine validity.\r
+ */\r
+ const auto* operator->() const noexcept\r
+ {\r
+ jassert (valid);\r
+ return &borderSize;\r
+ }\r
+\r
+ private:\r
+ bool valid;\r
+ BorderSize<int> borderSize;\r
+ };\r
+\r
//==============================================================================\r
/** Creates a peer.\r
\r
*/\r
virtual bool contains (Point<int> localPos, bool trueIfInAChildWindow) const = 0;\r
\r
+ /** Returns the size of the window frame that's around this window.\r
+\r
+ Depending on the platform the border size may be invalid for a short transient\r
+ after creating a new window. Hence the returned value must be checked using\r
+ operator bool() and the contained value can be accessed using operator*() only\r
+ if it is present.\r
+\r
+ Whether or not the window has a normal window frame depends on the flags\r
+ that were set when the window was created by Component::addToDesktop()\r
+ */\r
+ virtual OptionalBorderSize getFrameSizeIfPresent() const = 0;\r
+\r
/** Returns the size of the window frame that's around this window.\r
Whether or not the window has a normal window frame depends on the flags\r
that were set when the window was created by Component::addToDesktop()\r
*/\r
+ #if JUCE_LINUX || JUCE_BSD\r
+ [[deprecated ("Use getFrameSizeIfPresent instead.")]]\r
+ #endif\r
virtual BorderSize<int> getFrameSize() const = 0;\r
\r
/** This is called when the window's bounds change.\r
that it can be "allButtons" to get them all. You\r
can change this later with the setTitleBarButtonsRequired()\r
method, which can also specify where they are positioned.\r
+ The behaviour of native titlebars on macOS is slightly different:\r
+ the maximiseButton flag controls whether or not the window can enter\r
+ native fullscreen mode, and the zoom button can be disabled by\r
+ making the window non-resizable.\r
@param addToDesktop if true, the window will be automatically added to the\r
desktop; if false, you can use it as a child component\r
@see TitleBarButtons\r
should be shown on the title bar. This value is a bitwise\r
combination of values from the TitleBarButtons enum. Note\r
that it can be "allButtons" to get them all.\r
+ The behaviour of native titlebars on macOS is slightly different:\r
+ the maximiseButton flag controls whether or not the window can enter\r
+ native fullscreen mode, and the zoom button can be disabled by\r
+ making the window non-resizable.\r
@param positionTitleBarButtonsOnLeft if true, the buttons should go at the\r
left side of the bar; if false, they'll be placed at the right\r
*/\r
\r
/** Callback that is triggered when the minimise button is pressed.\r
\r
+ This function is only called when using a non-native titlebar.\r
+\r
The default implementation of this calls ResizableWindow::setMinimised(), but\r
you can override it to do more customised behaviour.\r
*/\r
/** Callback that is triggered when the maximise button is pressed, or when the\r
title-bar is double-clicked.\r
\r
+ This function is only called when using a non-native titlebar.\r
+\r
The default implementation of this calls ResizableWindow::setFullScreen(), but\r
you can override it to do more customised behaviour.\r
*/\r
\r
//==============================================================================\r
/** Sets the type of icon that should be used for the dialog box. */\r
- MessageBoxOptions withIconType (MessageBoxIconType type) const { return with (*this, &MessageBoxOptions::iconType, type); }\r
+ JUCE_NODISCARD MessageBoxOptions withIconType (MessageBoxIconType type) const { return with (*this, &MessageBoxOptions::iconType, type); }\r
\r
/** Sets the title of the dialog box. */\r
- MessageBoxOptions withTitle (const String& boxTitle) const { return with (*this, &MessageBoxOptions::title, boxTitle); }\r
+ JUCE_NODISCARD MessageBoxOptions withTitle (const String& boxTitle) const { return with (*this, &MessageBoxOptions::title, boxTitle); }\r
\r
/** Sets the message that should be displayed in the dialog box. */\r
- MessageBoxOptions withMessage (const String& boxMessage) const { return with (*this, &MessageBoxOptions::message, boxMessage); }\r
+ JUCE_NODISCARD MessageBoxOptions withMessage (const String& boxMessage) const { return with (*this, &MessageBoxOptions::message, boxMessage); }\r
\r
/** If the string passed in is not empty, this will add a button to the\r
dialog box with the specified text.\r
Generally up to 3 buttons are supported for dialog boxes, so adding any more\r
than this may have no effect.\r
*/\r
- MessageBoxOptions withButton (const String& text) const { auto copy = *this; copy.buttons.add (text); return copy; }\r
+ JUCE_NODISCARD MessageBoxOptions withButton (const String& text) const { auto copy = *this; copy.buttons.add (text); return copy; }\r
\r
/** The component that the dialog box should be associated with. */\r
- MessageBoxOptions withAssociatedComponent (Component* component) const { return with (*this, &MessageBoxOptions::associatedComponent, component); }\r
+ JUCE_NODISCARD MessageBoxOptions withAssociatedComponent (Component* component) const { return with (*this, &MessageBoxOptions::associatedComponent, component); }\r
\r
//==============================================================================\r
/** Returns the icon type of the dialog box.\r
#if JUCE_LINUX\r
if (auto* peer = isOnDesktop() ? getPeer() : nullptr)\r
{\r
- const auto frameSize = peer->getFrameSize();\r
- stateString << " frame " << frameSize.getTop() << ' ' << frameSize.getLeft()\r
- << ' ' << frameSize.getBottom() << ' ' << frameSize.getRight();\r
+ if (const auto optionalFrameSize = peer->getFrameSizeIfPresent())\r
+ {\r
+ const auto& frameSize = *optionalFrameSize;\r
+ stateString << " frame " << frameSize.getTop() << ' ' << frameSize.getLeft()\r
+ << ' ' << frameSize.getBottom() << ' ' << frameSize.getRight();\r
+ }\r
}\r
#endif\r
\r
\r
if (peer != nullptr)\r
{\r
- peer->getFrameSize().addTo (newPos);\r
+ if (const auto frameSize = peer->getFrameSizeIfPresent())\r
+ frameSize->addTo (newPos);\r
}\r
+\r
#if JUCE_LINUX\r
- else\r
+ if (peer == nullptr || ! peer->getFrameSizeIfPresent())\r
{\r
// We need to adjust for the frame size before we create a peer, as X11\r
// doesn't provide this information at construction time.\r
tokens[firstCoord + 7].getIntValue(),\r
tokens[firstCoord + 8].getIntValue() };\r
\r
- frame.addTo (newPos);\r
+ newPos.setX (newPos.getX() - frame.getLeft());\r
+ newPos.setY (newPos.getY() - frame.getTop());\r
+\r
setBounds (newPos);\r
}\r
}\r
\r
if (peer != nullptr)\r
{\r
- peer->getFrameSize().subtractFrom (newPos);\r
+ if (const auto frameSize = peer->getFrameSizeIfPresent())\r
+ frameSize->subtractFrom (newPos);\r
+\r
peer->setNonFullScreenBounds (newPos);\r
}\r
\r
const auto tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
const auto now = Time::getApproximateMillisecondCounter();\r
\r
+ lastComponentUnderMouse = newComp;\r
+ lastTipUnderMouse = newTip;\r
+\r
if (tipChanged || dismissalMouseEventOccurred || mouseMovedQuickly)\r
lastCompChangeTime = now;\r
\r
showTip();\r
}\r
}\r
-\r
- lastComponentUnderMouse = newComp;\r
- lastTipUnderMouse = newTip;\r
}\r
}\r
\r
private:\r
//==============================================================================\r
Point<float> lastMousePos;\r
- Component* lastComponentUnderMouse = nullptr;\r
+ SafePointer<Component> lastComponentUnderMouse;\r
String tipShowing, lastTipUnderMouse, manuallyShownTip;\r
int millisecondsBeforeTipAppears;\r
unsigned int lastCompChangeTime = 0, lastHideTime = 0;\r
#if JUCE_MAC || JUCE_IOS\r
\r
#if JUCE_MAC\r
+ #include "native/juce_mac_NSViewFrameWatcher.h"\r
#include "native/juce_mac_NSViewComponent.mm"\r
#include "native/juce_mac_AppleRemote.mm"\r
#include "native/juce_mac_SystemTrayIcon.cpp"\r
\r
ID: juce_gui_extra\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE extended GUI classes\r
description: Miscellaneous GUI classes for specialised tasks.\r
website: http://www.juce.com/juce\r
{\r
}\r
\r
-RecentlyOpenedFilesList::~RecentlyOpenedFilesList()\r
-{\r
-}\r
-\r
//==============================================================================\r
void RecentlyOpenedFilesList::setMaxNumberOfItems (const int newMaxNumber)\r
{\r
*/\r
RecentlyOpenedFilesList();\r
\r
- /** Destructor. */\r
- ~RecentlyOpenedFilesList();\r
-\r
//==============================================================================\r
/** Sets a limit for the number of files that will be stored in the list.\r
\r
/** Sets a custom location for the WebView2Loader.dll that is not a part of the\r
standard system DLL search paths.\r
*/\r
- WebView2Preferences withDLLLocation (const File& location) const { return with (&WebView2Preferences::dllLocation, location); }\r
+ JUCE_NODISCARD WebView2Preferences withDLLLocation (const File& location) const { return with (&WebView2Preferences::dllLocation, location); }\r
\r
/** Sets a non-default location for storing user data for the browser instance. */\r
WebView2Preferences withUserDataFolder (const File& folder) const { return with (&WebView2Preferences::userDataFolder, folder); }\r
/** If this is set, the status bar usually displayed in the lower-left of the webview\r
will be disabled.\r
*/\r
- WebView2Preferences withStatusBarDisabled() const { return with (&WebView2Preferences::disableStatusBar, true); }\r
+ JUCE_NODISCARD WebView2Preferences withStatusBarDisabled() const { return with (&WebView2Preferences::disableStatusBar, true); }\r
\r
/** If this is set, a blank page will be displayed on error instead of the default\r
built-in error page.\r
*/\r
- WebView2Preferences withBuiltInErrorPageDisabled() const { return with (&WebView2Preferences::disableBuiltInErrorPage, true); }\r
+ JUCE_NODISCARD WebView2Preferences withBuiltInErrorPageDisabled() const { return with (&WebView2Preferences::disableBuiltInErrorPage, true); }\r
\r
/** Sets the background colour that WebView2 renders underneath all web content.\r
\r
This colour must either be fully opaque or transparent. On Windows 7 this\r
colour must be opaque.\r
*/\r
- WebView2Preferences withBackgroundColour (const Colour& colour) const\r
+ JUCE_NODISCARD WebView2Preferences withBackgroundColour (const Colour& colour) const\r
{\r
// the background colour must be either fully opaque or transparent!\r
jassert (colour.isOpaque() || colour.isTransparent());\r
namespace juce\r
{\r
\r
-JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-static const auto nsViewFrameChangedSelector = @selector (frameChanged:);\r
-JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
-struct NSViewCallbackInterface\r
-{\r
- virtual ~NSViewCallbackInterface() = default;\r
- virtual void frameChanged() = 0;\r
-};\r
-\r
-//==============================================================================\r
-struct NSViewFrameChangeCallbackClass : public ObjCClass<NSObject>\r
-{\r
- NSViewFrameChangeCallbackClass()\r
- : ObjCClass ("JUCE_NSViewCallback_")\r
- {\r
- addIvar<NSViewCallbackInterface*> ("target");\r
-\r
- addMethod (nsViewFrameChangedSelector, frameChanged);\r
-\r
- registerClass();\r
- }\r
-\r
- static void setTarget (id self, NSViewCallbackInterface* c)\r
- {\r
- object_setInstanceVariable (self, "target", c);\r
- }\r
-\r
-private:\r
- static void frameChanged (id self, SEL, NSNotification*)\r
- {\r
- if (auto* target = getIvar<NSViewCallbackInterface*> (self, "target"))\r
- target->frameChanged();\r
- }\r
-\r
- JUCE_DECLARE_NON_COPYABLE (NSViewFrameChangeCallbackClass)\r
-};\r
-\r
-//==============================================================================\r
-class NSViewFrameWatcher : private NSViewCallbackInterface\r
-{\r
-public:\r
- NSViewFrameWatcher (NSView* viewToWatch, std::function<void()> viewResizedIn)\r
- : viewResized (std::move (viewResizedIn)), callback (makeCallbackForView (viewToWatch))\r
- {\r
- }\r
-\r
- ~NSViewFrameWatcher() override\r
- {\r
- [[NSNotificationCenter defaultCenter] removeObserver: callback];\r
- [callback release];\r
- callback = nil;\r
- }\r
-\r
- JUCE_DECLARE_NON_COPYABLE (NSViewFrameWatcher)\r
- JUCE_DECLARE_NON_MOVEABLE (NSViewFrameWatcher)\r
-\r
-private:\r
- id makeCallbackForView (NSView* view)\r
- {\r
- static NSViewFrameChangeCallbackClass cls;\r
- auto* result = [cls.createInstance() init];\r
- NSViewFrameChangeCallbackClass::setTarget (result, this);\r
-\r
- [[NSNotificationCenter defaultCenter] addObserver: result\r
- selector: nsViewFrameChangedSelector\r
- name: NSViewFrameDidChangeNotification\r
- object: view];\r
-\r
- return result;\r
- }\r
-\r
- void frameChanged() override { viewResized(); }\r
-\r
- std::function<void()> viewResized;\r
- id callback;\r
-};\r
-\r
-//==============================================================================\r
class NSViewAttachment : public ReferenceCountedObject,\r
public ComponentMovementWatcher\r
{\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - 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 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-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
+#if JUCE_MAC\r
+\r
+namespace juce\r
+{\r
+\r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+const auto nsViewFrameChangedSelector = @selector (frameChanged:);\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
+struct NSViewCallbackInterface\r
+{\r
+ virtual ~NSViewCallbackInterface() = default;\r
+ virtual void frameChanged() = 0;\r
+};\r
+\r
+//==============================================================================\r
+struct NSViewFrameChangeCallbackClass : public ObjCClass<NSObject>\r
+{\r
+ NSViewFrameChangeCallbackClass()\r
+ : ObjCClass ("JUCE_NSViewCallback_")\r
+ {\r
+ addIvar<NSViewCallbackInterface*> ("target");\r
+\r
+ addMethod (nsViewFrameChangedSelector, frameChanged);\r
+\r
+ registerClass();\r
+ }\r
+\r
+ static void setTarget (id self, NSViewCallbackInterface* c)\r
+ {\r
+ object_setInstanceVariable (self, "target", c);\r
+ }\r
+\r
+private:\r
+ static void frameChanged (id self, SEL, NSNotification*)\r
+ {\r
+ if (auto* target = getIvar<NSViewCallbackInterface*> (self, "target"))\r
+ target->frameChanged();\r
+ }\r
+\r
+ JUCE_DECLARE_NON_COPYABLE (NSViewFrameChangeCallbackClass)\r
+};\r
+\r
+//==============================================================================\r
+class NSViewFrameWatcher : private NSViewCallbackInterface\r
+{\r
+public:\r
+ NSViewFrameWatcher (NSView* viewToWatch, std::function<void()> viewResizedIn)\r
+ : viewResized (std::move (viewResizedIn)), callback (makeCallbackForView (viewToWatch))\r
+ {\r
+ }\r
+\r
+ ~NSViewFrameWatcher() override\r
+ {\r
+ [[NSNotificationCenter defaultCenter] removeObserver: callback];\r
+ [callback release];\r
+ callback = nil;\r
+ }\r
+\r
+ JUCE_DECLARE_NON_COPYABLE (NSViewFrameWatcher)\r
+ JUCE_DECLARE_NON_MOVEABLE (NSViewFrameWatcher)\r
+\r
+private:\r
+ id makeCallbackForView (NSView* view)\r
+ {\r
+ static NSViewFrameChangeCallbackClass cls;\r
+ auto* result = [cls.createInstance() init];\r
+ NSViewFrameChangeCallbackClass::setTarget (result, this);\r
+\r
+ [[NSNotificationCenter defaultCenter] addObserver: result\r
+ selector: nsViewFrameChangedSelector\r
+ name: NSViewFrameDidChangeNotification\r
+ object: view];\r
+\r
+ return result;\r
+ }\r
+\r
+ void frameChanged() override { viewResized(); }\r
+\r
+ std::function<void()> viewResized;\r
+ id callback;\r
+};\r
+\r
+} // namespace juce\r
+\r
+#endif\r
eventMods.withFlags (isLeft ? ModifierKeys::leftButtonModifier\r
: ModifierKeys::rightButtonModifier),\r
pressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false });\r
\r
owner.mouseUp ({ mouseSource, {},\r
eventMods.withoutMouseButtons(),\r
pressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false });\r
}\r
else if (type == NSEventTypeMouseMoved)\r
{\r
owner.mouseMove (MouseEvent (mouseSource, {}, eventMods, pressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false));\r
}\r
}\r
owner.mouseDown (MouseEvent (mouseSource, {},\r
eventMods.withFlags (isLeft ? ModifierKeys::leftButtonModifier\r
: ModifierKeys::rightButtonModifier),\r
- pressure, MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ pressure, MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false));\r
\r
owner.mouseUp (MouseEvent (mouseSource, {}, eventMods.withoutMouseButtons(), pressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false));\r
}\r
else if (type == NSEventTypeMouseMoved)\r
{\r
owner.mouseMove (MouseEvent (mouseSource, {}, eventMods, pressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,\r
+ MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, now, {}, now, 1, false));\r
}\r
}\r
{ (float) (GET_X_LPARAM (lParam) + activeXRect.left - peerRect.left),\r
(float) (GET_Y_LPARAM (lParam) + activeXRect.top - peerRect.top) },\r
ComponentPeer::getCurrentModifiersRealtime(),\r
- MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation,\r
+ MouseInputSource::defaultPressure,\r
+ MouseInputSource::defaultOrientation,\r
getMouseEventTime());\r
break;\r
}\r
const Time eventTime (getMouseEventTime());\r
\r
const MouseEvent e (Desktop::getInstance().getMainMouseSource(), {}, eventMods,\r
- MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation,\r
- MouseInputSource::invalidRotation, MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation,\r
+ MouseInputSource::defaultRotation, MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,\r
&owner, &owner, eventTime, {}, eventTime, 1, false);\r
\r
if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN)\r
ComSmartPtr<ICoreWebView2Settings> settings;\r
webView->get_Settings (settings.resetAndGetPointerAddress());\r
\r
- if (settings == nullptr)\r
+ if (settings != nullptr)\r
{\r
settings->put_IsStatusBarEnabled (! preferences.getIsStatusBarDisabled());\r
settings->put_IsBuiltInErrorPageEnabled (! preferences.getIsBuiltInErrorPageDisabled());\r
\r
ID: juce_opengl\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\r
name: JUCE OpenGL classes\r
description: Classes for rendering OpenGL in a JUCE window.\r
website: http://www.juce.com/juce\r
NSOpenGLView* view = nil;\r
ReferenceCountedObjectPtr<ReferenceCountedObject> viewAttachment;\r
double lastSwapTime = 0;\r
- int minSwapTimeMs = 0, underrunCounter = 0, numFramesPerSwap = 0;\r
+ std::atomic<int> minSwapTimeMs { 0 };\r
+ int underrunCounter = 0, numFramesPerSwap = 0;\r
double videoRefreshPeriodS = 1.0 / 60.0;\r
\r
//==============================================================================\r
{\r
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,\r
WGL_CONTEXT_MINOR_VERSION_ARB, 2,\r
- WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,\r
+ WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,\r
0\r
};\r
\r
class OpenGLContext::CachedImage : public CachedComponentImage,\r
private ThreadPoolJob\r
{\r
+ struct AreaAndScale\r
+ {\r
+ Rectangle<int> area;\r
+ double scale;\r
+\r
+ auto tie() const { return std::tie (area, scale); }\r
+\r
+ auto operator== (const AreaAndScale& other) const { return tie() == other.tie(); }\r
+ auto operator!= (const AreaAndScale& other) const { return tie() != other.tie(); }\r
+ };\r
+\r
+ class LockedAreaAndScale\r
+ {\r
+ public:\r
+ auto get() const\r
+ {\r
+ const ScopedLock lock (mutex);\r
+ return data;\r
+ }\r
+\r
+ template <typename Fn>\r
+ void set (const AreaAndScale& d, Fn&& ifDifferent)\r
+ {\r
+ const auto old = [&]\r
+ {\r
+ const ScopedLock lock (mutex);\r
+ return std::exchange (data, d);\r
+ }();\r
+\r
+ if (old != d)\r
+ ifDifferent();\r
+ }\r
+\r
+ private:\r
+ CriticalSection mutex;\r
+ AreaAndScale data { {}, 1.0 };\r
+ };\r
+\r
public:\r
CachedImage (OpenGLContext& c, Component& comp,\r
const OpenGLPixelFormat& pixFormat, void* contextToShare)\r
}\r
\r
//==============================================================================\r
- bool ensureFrameBufferSize()\r
+ bool ensureFrameBufferSize (Rectangle<int> viewportArea)\r
{\r
+ JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
auto fbW = cachedImageFrameBuffer.getWidth();\r
auto fbH = cachedImageFrameBuffer.getHeight();\r
\r
\r
doWorkWhileWaitingForLock (true);\r
\r
+ const auto currentAreaAndScale = areaAndScale.get();\r
+ const auto viewportArea = currentAreaAndScale.area;\r
+\r
if (context.renderer != nullptr)\r
{\r
glViewport (0, 0, viewportArea.getWidth(), viewportArea.getHeight());\r
- context.currentRenderScale = scale;\r
+ context.currentRenderScale = currentAreaAndScale.scale;\r
context.renderer->renderOpenGL();\r
clearGLError();\r
\r
{\r
if (isUpdating)\r
{\r
- paintComponent();\r
+ paintComponent (currentAreaAndScale);\r
\r
if (! hasInitialised)\r
return false;\r
if (auto* peer = component.getPeer())\r
{\r
#if JUCE_MAC\r
- const auto displayScale = [this]\r
+ const auto displayScale = Desktop::getInstance().getGlobalScaleFactor() * [this]\r
{\r
if (auto* wrapper = cvDisplayLinkWrapper.get())\r
if (wrapper->updateActiveDisplay())\r
return [window backingScaleFactor];\r
}\r
\r
- return scale;\r
+ return areaAndScale.get().scale;\r
}();\r
#else\r
const auto displayScale = Desktop::getInstance().getDisplays().getDisplayForRect (component.getTopLevelComponent()->getScreenBounds())->scale;\r
auto newScale = displayScale;\r
#endif\r
\r
- if (scale != newScale || viewportArea != newArea)\r
+ areaAndScale.set ({ newArea, newScale }, [&]\r
{\r
- scale = newScale;\r
- viewportArea = newArea;\r
+ // Transform is only accessed when the message manager is locked\r
transform = AffineTransform::scale ((float) newArea.getWidth() / (float) localBounds.getWidth(),\r
(float) newArea.getHeight() / (float) localBounds.getHeight());\r
\r
\r
if (canTriggerUpdate)\r
invalidateAll();\r
- }\r
+ });\r
}\r
}\r
\r
void bindVertexArray() noexcept\r
{\r
- if (openGLVersion.major >= 3)\r
+ if (shouldUseCustomVAO())\r
if (vertexArrayObject != 0)\r
context.extensions.glBindVertexArray (vertexArrayObject);\r
}\r
}\r
}\r
\r
- void paintComponent()\r
+ void paintComponent (const AreaAndScale& currentAreaAndScale)\r
{\r
+ JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
// you mustn't set your own cached image object when attaching a GL context!\r
jassert (get (component) == this);\r
\r
- if (! ensureFrameBufferSize())\r
+ if (! ensureFrameBufferSize (currentAreaAndScale.area))\r
return;\r
\r
- RectangleList<int> invalid (viewportArea);\r
+ RectangleList<int> invalid (currentAreaAndScale.area);\r
invalid.subtract (validArea);\r
- validArea = viewportArea;\r
+ validArea = currentAreaAndScale.area;\r
\r
if (! invalid.isEmpty())\r
{\r
\r
gl::loadFunctions();\r
\r
- openGLVersion = getOpenGLVersion();\r
-\r
- if (openGLVersion.major >= 3)\r
+ if (shouldUseCustomVAO())\r
{\r
context.extensions.glGenVertexArrays (1, &vertexArrayObject);\r
bindVertexArray();\r
}\r
\r
- glViewport (0, 0, viewportArea.getWidth(), viewportArea.getHeight());\r
+ const auto currentViewportArea = areaAndScale.get().area;\r
+ glViewport (0, 0, currentViewportArea.getWidth(), currentViewportArea.getHeight());\r
\r
nativeContext->setSwapInterval (1);\r
\r
nativeContext->shutdownOnRenderThread();\r
}\r
\r
+ /* Returns true if the context requires a non-zero vertex array object (VAO) to be bound.\r
+\r
+ If the context is a compatibility context, we can just pretend that VAOs don't exist,\r
+ and use the default VAO all the time instead. This provides a more consistent experience\r
+ in user code, which might make calls (like glVertexPointer()) that only work when VAO 0 is\r
+ bound in OpenGL 3.2+.\r
+ */\r
+ bool shouldUseCustomVAO() const\r
+ {\r
+ #if JUCE_OPENGL_ES\r
+ return false;\r
+ #else\r
+ clearGLError();\r
+ GLint mask = 0;\r
+ glGetIntegerv (GL_CONTEXT_PROFILE_MASK, &mask);\r
+\r
+ // The context isn't aware of the profile mask, so it pre-dates the core profile\r
+ if (glGetError() == GL_INVALID_ENUM)\r
+ return false;\r
+\r
+ // Also assumes a compatibility profile if the mask is completely empty for some reason\r
+ return (mask & (GLint) GL_CONTEXT_CORE_PROFILE_BIT) != 0;\r
+ #endif\r
+ }\r
+\r
//==============================================================================\r
struct BlockingWorker : public OpenGLContext::AsyncWorker\r
{\r
OpenGLContext& context;\r
Component& component;\r
\r
- Version openGLVersion;\r
OpenGLFrameBuffer cachedImageFrameBuffer;\r
RectangleList<int> validArea;\r
- Rectangle<int> viewportArea, lastScreenBounds;\r
- double scale = 1.0;\r
+ Rectangle<int> lastScreenBounds;\r
AffineTransform transform;\r
GLuint vertexArrayObject = 0;\r
+ LockedAreaAndScale areaAndScale;\r
\r
StringArray associatedObjectNames;\r
ReferenceCountedArray<ReferenceCountedObject> associatedObjects;\r
jassert (extensionName != nullptr); // you must supply a genuine string for this.\r
jassert (isContextActive()); // An OpenGL context will need to be active before calling this.\r
\r
+ if (getOpenGLVersion().major >= 3)\r
+ {\r
+ using GetStringi = const GLubyte* (*) (GLenum, GLuint);\r
+\r
+ if (auto* thisGlGetStringi = reinterpret_cast<GetStringi> (getExtensionFunction ("glGetStringi")))\r
+ {\r
+ GLint n = 0;\r
+ glGetIntegerv (GL_NUM_EXTENSIONS, &n);\r
+\r
+ for (auto i = (decltype (n)) 0; i < n; ++i)\r
+ if (StringRef (extensionName) == StringRef ((const char*) thisGlGetStringi (GL_EXTENSIONS, (GLuint) i)))\r
+ return true;\r
+\r
+ return false;\r
+ }\r
+ }\r
+\r
const char* extensions = (const char*) glGetString (GL_EXTENSIONS);\r
jassert (extensions != nullptr); // Perhaps you didn't activate an OpenGL context before calling this?\r
\r
bitmapData.dataReleaser.reset (r);\r
\r
bitmapData.data = (uint8*) r->data.get();\r
+ bitmapData.size = (size_t) bitmapData.width\r
+ * (size_t) bitmapData.height\r
+ * sizeof (PixelARGB);\r
bitmapData.lineStride = (bitmapData.width * bitmapData.pixelStride + 3) & ~3;\r
\r
ReaderType::read (frameBuffer, bitmapData, x, y);\r
\r
ID: juce_osc\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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: 6.1.5\r
+ version: 6.1.6\r
name: JUCE Online marketplace support\r
description: Classes for online product authentication\r
website: http://www.juce.com/juce\r
\r
ID: juce_video\r
vendor: juce\r
- version: 6.1.5\r
+ version: 6.1.6\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