New upstream version 6.1.6~ds0
authorIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Fri, 18 Mar 2022 14:18:52 +0000 (15:18 +0100)
committerIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Fri, 18 Mar 2022 14:18:52 +0000 (15:18 +0100)
265 files changed:
BREAKING-CHANGES.txt
CMakeLists.txt
ChangeList.txt
docs/CMake API.md
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/Info-App.plist
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2015/resources.rc
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2017/resources.rc
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2019/resources.rc
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2022/resources.rc
examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/iOS/Info-App.plist
examples/DemoRunner/DemoRunner.jucer
examples/DemoRunner/JuceLibraryCode/JuceHeader.h
examples/GUI/OpenGLDemo.h
examples/Plugins/DSPModulePluginDemo.h
examples/Plugins/MidiLoggerPluginDemo.h
examples/Utilities/ChildProcessDemo.h
examples/Utilities/InAppPurchasesDemo.h
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml
extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Source/HostStartup.cpp
extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp
extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp
extras/AudioPluginHost/Source/UI/MainHostWindow.cpp
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
extras/Build/CMake/JUCEHelperTargets.cmake
extras/Build/CMake/JUCEUtils.cmake
extras/Build/CMake/checkBundleSigning.cmake [new file with mode: 0644]
extras/Build/juce_build_tools/juce_build_tools.h
extras/Build/juce_build_tools/utils/juce_Entitlements.cpp
extras/Build/juce_build_tools/utils/juce_Entitlements.h
extras/Build/juceaide/CMakeLists.txt
extras/Build/juceaide/Main.cpp
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml
extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2015/resources.rc
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2017/resources.rc
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2019/resources.rc
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2022/resources.rc
extras/Projucer/JuceLibraryCode/JuceHeader.h
extras/Projucer/Projucer.jucer
extras/Projucer/Source/Application/jucer_MainWindow.cpp
extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h
extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h
extras/Projucer/Source/Project/jucer_Project.cpp
extras/Projucer/Source/Project/jucer_Project.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp
extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h
extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp
extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h
extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
modules/juce_analytics/juce_analytics.h
modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h
modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_basics/midi/juce_MidiFile.h
modules/juce_audio_basics/utilities/juce_SmoothedValue.h
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp
modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_WavAudioFormat.h
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp
modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
modules/juce_audio_plugin_client/juce_audio_plugin_client.h
modules/juce_audio_processors/format/juce_AudioPluginFormat.h
modules/juce_audio_processors/format_types/juce_AU_Shared.h
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/processors/juce_AudioProcessor.h
modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h
modules/juce_audio_processors/processors/juce_AudioProcessorListener.h
modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h
modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
modules/juce_audio_processors/processors/juce_PluginDescription.cpp
modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h
modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_box2d/juce_box2d.h
modules/juce_core/files/juce_DirectoryIterator.cpp
modules/juce_core/files/juce_DirectoryIterator.h
modules/juce_core/files/juce_File.cpp
modules/juce_core/files/juce_File.h
modules/juce_core/files/juce_RangedDirectoryIterator.cpp
modules/juce_core/files/juce_RangedDirectoryIterator.h
modules/juce_core/files/juce_TemporaryFile.cpp
modules/juce_core/juce_core.h
modules/juce_core/maths/juce_MathsFunctions.h
modules/juce_core/maths/juce_Random.cpp
modules/juce_core/maths/juce_Random.h
modules/juce_core/maths/juce_Range.h
modules/juce_core/native/juce_BasicNativeHeaders.h
modules/juce_core/native/juce_posix_NamedPipe.cpp
modules/juce_core/native/juce_win32_Files.cpp
modules/juce_core/network/juce_URL.h
modules/juce_core/system/juce_CompilerSupport.h
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/text/juce_CharacterFunctions.h
modules/juce_core/text/juce_String.cpp
modules/juce_core/xml/juce_XmlElement.h
modules/juce_cryptography/encryption/juce_RSAKey.cpp
modules/juce_cryptography/encryption/juce_RSAKey.h
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/juce_data_structures.h
modules/juce_dsp/containers/juce_AudioBlock.h
modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp
modules/juce_dsp/containers/juce_SIMDRegister_Impl.h
modules/juce_dsp/juce_dsp.h
modules/juce_dsp/processors/juce_ProcessContext.h
modules/juce_events/broadcasters/juce_ChangeBroadcaster.h
modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp
modules/juce_events/juce_events.h
modules/juce_events/timers/juce_Timer.cpp
modules/juce_graphics/colour/juce_Colour.h
modules/juce_graphics/contexts/juce_GraphicsContext.cpp
modules/juce_graphics/contexts/juce_GraphicsContext.h
modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h
modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp
modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h
modules/juce_graphics/fonts/juce_AttributedString.cpp
modules/juce_graphics/fonts/juce_AttributedString.h
modules/juce_graphics/fonts/juce_Font.h
modules/juce_graphics/fonts/juce_GlyphArrangement.cpp
modules/juce_graphics/fonts/juce_GlyphArrangement.h
modules/juce_graphics/geometry/juce_BorderSize.h
modules/juce_graphics/geometry/juce_Path.cpp
modules/juce_graphics/geometry/juce_Path.h
modules/juce_graphics/geometry/juce_Rectangle.h
modules/juce_graphics/images/juce_Image.cpp
modules/juce_graphics/images/juce_Image.h
modules/juce_graphics/juce_graphics.h
modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
modules/juce_graphics/native/juce_mac_Fonts.mm
modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp
modules/juce_gui_basics/accessibility/juce_AccessibilityState.h
modules/juce_gui_basics/components/juce_Component.cpp
modules/juce_gui_basics/components/juce_Component.h
modules/juce_gui_basics/desktop/juce_Desktop.cpp
modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/keyboard/juce_ModifierKeys.h
modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp
modules/juce_gui_basics/layout/juce_FlexBox.cpp
modules/juce_gui_basics/layout/juce_FlexBox.h
modules/juce_gui_basics/layout/juce_GridItem.cpp
modules/juce_gui_basics/layout/juce_GridItem.h
modules/juce_gui_basics/layout/juce_Viewport.cpp
modules/juce_gui_basics/layout/juce_Viewport.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
modules/juce_gui_basics/menus/juce_PopupMenu.cpp
modules/juce_gui_basics/menus/juce_PopupMenu.h
modules/juce_gui_basics/mouse/juce_MouseEvent.cpp
modules/juce_gui_basics/mouse/juce_MouseEvent.h
modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp
modules/juce_gui_basics/mouse/juce_MouseInputSource.h
modules/juce_gui_basics/mouse/juce_PointerState.h [new file with mode: 0644]
modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h
modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm
modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm
modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm
modules/juce_gui_basics/native/juce_linux_Windowing.cpp
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
modules/juce_gui_basics/native/juce_mac_Windowing.mm
modules/juce_gui_basics/native/juce_win32_Windowing.cpp
modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp
modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp
modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h
modules/juce_gui_basics/widgets/juce_ListBox.cpp
modules/juce_gui_basics/widgets/juce_Toolbar.cpp
modules/juce_gui_basics/widgets/juce_Toolbar.h
modules/juce_gui_basics/widgets/juce_TreeView.cpp
modules/juce_gui_basics/widgets/juce_TreeView.h
modules/juce_gui_basics/windows/juce_ComponentPeer.h
modules/juce_gui_basics/windows/juce_DocumentWindow.h
modules/juce_gui_basics/windows/juce_MessageBoxOptions.h
modules/juce_gui_basics/windows/juce_ResizableWindow.cpp
modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
modules/juce_gui_basics/windows/juce_TooltipWindow.h
modules/juce_gui_extra/juce_gui_extra.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp
modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h
modules/juce_gui_extra/misc/juce_WebBrowserComponent.h
modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm
modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h [new file with mode: 0644]
modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp
modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp
modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp
modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGL_osx.h
modules/juce_opengl/native/juce_OpenGL_win32.h
modules/juce_opengl/opengl/juce_OpenGLContext.cpp
modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp
modules/juce_opengl/opengl/juce_OpenGLImage.cpp
modules/juce_osc/juce_osc.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_video/juce_video.h

index cffdd352d23b282390283c771d766996bfb2b8cb..29aa4155edd0bd93ed594a527eff3c0bbb6844dc 100644 (file)
@@ -1,6 +1,133 @@
 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
 =============
 
index a82922e7d970bf8c4f6b6845712ff8395048635a..f9c8f408936632df1d82e858a73c878b85b50873 100644 (file)
@@ -23,7 +23,7 @@
 
 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)
 
@@ -141,8 +141,8 @@ configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
 
 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"
@@ -151,6 +151,7 @@ install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
               "${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}")
index 355874e4a0e292d532434c7aaf40addaccbac24c..b664abe7c5b26ffbe54eee93694841ddebc1966e 100644 (file)
@@ -3,6 +3,13 @@
 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
index a2fecc77ff8feed804fadf1be2fcc7556b80d182..c1e90ae12283a2cf583f42d16fa7943b2d2fa25e 100644 (file)
@@ -427,6 +427,22 @@ attributes directly to these creation functions, rather than adding them later.
   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.
 
index 00cd71bfec0429987fcab31b0683091c8c0963ea..01cc0b28fad38fac73400d1e70cfbb55c9e6eb7b 100644 (file)
@@ -12,7 +12,7 @@ add_subdirectory (${OBOE_DIR} ./oboe)
 add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")
 set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")
 
-add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=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"
@@ -23,9 +23,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=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()
@@ -1554,6 +1554,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -1740,6 +1741,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -3371,6 +3373,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_M
 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)
@@ -3557,6 +3560,7 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l
 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)
index 0c1ab29600526d51de58a6b844a66585d7f14fbe..24204de3aa0083b85ef9b27dd9480312ff1fea3d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="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"/>
index 7cb5459a77b524a11714b26b3ff2c7c680c99b3b..a358044c7fd5af3eb941f030f12055206cd96061 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index e539126497301219714c9ee81fff54cf929e05b9..a849e33a090b1e1cc989dae8176e10348b377af1 100644 (file)
                                        "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",
index 53459d9d1e29796d9401580ecb440db6320f0dec..9be8092344526d67badc6c13422e01f1d45a85fd 100644 (file)
@@ -24,9 +24,9 @@
     <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
index bf9d778e6fa9727c145a8c076c7b7b3498269072..34af5bd18f8c1e89f0e5508ffa56f17039b23f62 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 58720860e001a976944e73deba9080a0957d04e8..324de953e0da3ccf859213e8a8376398c6dd4bec 100644 (file)
     <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
index 9e9c7ab87b154dbb003d6856ee385b9dea5a1911..f22dabbc9c92e22fa1980b08e32fa23a2f524956 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "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
index 728fcd1215eaf49a07a389fa546e1bffcf460fce..34f9f529bcfe7ec959e76336373c44d7654e9471 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index c8693e6e3353a18427c7b382bddd2d14fdd08ed4..8d3510754d2c411e8a8f902890908670fa48acf0 100644 (file)
     <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
index 9e9c7ab87b154dbb003d6856ee385b9dea5a1911..f22dabbc9c92e22fa1980b08e32fa23a2f524956 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "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
index f682aa48c8ee66062baf506056498164895f4dbf..1048fd4f9d823b7947a995589f46d03ddc9e7f94 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 0625f8546380863502ed4adaf526df28d1fa457b..79b0a421f6be22365a7df9ff375ab67005cb6fe7 100644 (file)
     <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
index 9e9c7ab87b154dbb003d6856ee385b9dea5a1911..f22dabbc9c92e22fa1980b08e32fa23a2f524956 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "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
index 82fbdfe48d6202c8e7540e38cbc4e83b645cdde9..3c2086003227a9d6c14bf01ed41c462fe66ea352 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 1cd8e513e3ce3874e3bd39c4cc8060142c6072fc..c42d4c981941bd0527a20e8f1a3471217f1035f9 100644 (file)
     <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
index 9e9c7ab87b154dbb003d6856ee385b9dea5a1911..f22dabbc9c92e22fa1980b08e32fa23a2f524956 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "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
index 8bf9dc23e19572531e364a150948d36f086f93be..26d37ebc1c789412ddf7734ff9a093a30e32c4f9 100644 (file)
                                        "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",
index 35cdb0539ffda37885d9102722b59d7635ccf288..48e7afdaf61d5ffcd8f58397f15fc1242bedd735 100644 (file)
@@ -30,9 +30,9 @@
     <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
index cb2c5eab78126fd8b123be93592d0a819d7e010f..058501ac20aa3f9ece3ed0d9d95cf8f7033340bf 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"\r
-              bundleIdentifier="com.rmsl.jucedemorunner" version="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
index 3cbba619ef7aebaf67ebbf210975af61b7138c14..0b9a843ab7e66e3921f89ff96ebd3c9a03f48990 100644 (file)
@@ -54,7 +54,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "DemoRunner";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "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
index a962d119ee7c6052fc58633d977a644e94c9ce50..ad3e0bd560b0005a6a5030b5eb24f8b304faf5c8 100644 (file)
@@ -906,6 +906,7 @@ public:
 \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
@@ -931,6 +932,7 @@ public:
 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
@@ -1246,6 +1248,7 @@ private:
     OpenGLUtils::DemoTexture* textureToUse = nullptr;\r
     OpenGLUtils::DemoTexture* lastTexture  = nullptr;\r
 \r
+    CriticalSection shaderMutex;\r
     String newVertexShader, newFragmentShader, statusText;\r
 \r
     struct BackgroundStar\r
@@ -1258,6 +1261,8 @@ private:
     //==============================================================================\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
index a5c5479b3aa76b5aa01dd9cab4fbcc4a5587f9b7..edfa54256cc0342e68ccd30d75da544d628ae348 100644 (file)
@@ -1712,7 +1712,7 @@ private:
         {\r
             if (e.mods.isRightButtonDown())\r
                 if (auto* c = editor.getHostContext())\r
-                    if (auto menuInfo = c->getContextMenuForParameterIndex (&param))\r
+                    if (auto menuInfo = c->getContextMenuForParameter (&param))\r
                         menuInfo->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options{}.withTargetComponent (this)\r
                                                                                               .withMousePosition());\r
         }\r
index b2e3d09147cc1534af27d703a3151578b0bd06d8..740f861d556a6f842adf32e4f3971d84d5b5a086 100644 (file)
@@ -80,6 +80,9 @@ public:
     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
index e6eb544611ab43099384124a2ba733f8b855a80b..2b3c4a580a03d714b23309d8562ef3f7f12bbe4a 100644 (file)
@@ -98,7 +98,12 @@ public:
         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
@@ -136,10 +141,14 @@ public:
     {\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
@@ -166,11 +175,14 @@ public:
     // 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
@@ -183,6 +195,11 @@ public:
         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
@@ -203,7 +220,11 @@ public:
     //==============================================================================\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
@@ -268,8 +289,8 @@ public:
     }\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
@@ -280,13 +301,13 @@ public:
 //==============================================================================\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
@@ -316,7 +337,7 @@ bool invokeChildProcessDemo (const String& commandLine)
          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
@@ -325,13 +346,14 @@ bool invokeChildProcessDemo (const String& commandLine)
      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
index b9157457fc6a8ae7fd580ee0c305d86f68836037..8979b1832c8999e4ea1fb67c96e4cbc72da888fb 100644 (file)
@@ -442,15 +442,17 @@ public:
 \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
@@ -499,7 +501,6 @@ public:
         voiceListBox.setRowHeight (66);\r
         voiceListBox.selectRow (0);\r
         voiceListBox.updateContent();\r
-        voiceListBox.getViewport()->setScrollOnDragEnabled (true);\r
 \r
         addAndMakeVisible (phraseLabel);\r
         addAndMakeVisible (phraseListBox);\r
index b3d271b241f8a6401ac5333fac6c325cd1da23de..53c54a49f97f104a00e7d2f02141e6e677998202 100644 (file)
@@ -23,9 +23,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=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()
@@ -1340,6 +1340,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -1526,6 +1527,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -2855,6 +2857,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_M
 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)
@@ -3041,6 +3044,7 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l
 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)
index fe61ddc888384a96a7e2ee26538b8d36dd1277b6..e25451f6d38f27d8b684f57bedb66f30192a7815 100644 (file)
@@ -1,7 +1,7 @@
 <?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"/>
index f20fcca677fcd0ec7120c1f51a3a4586af7f351e..3c889e5f43ebcf02ba1d3b56b8369832532f8003 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index c8aaea8622cd88e83d96ec2a6978e564bdbd185f..dd7d19f3addb90a9fdbf23a50632d7c304d3adc0 100644 (file)
                                        "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",
index a63cc3300924db063cd389ed104c2beb3a35e5ac..c44b7acf9772ab30d87cfb93d9cc62047e877282 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 8e1afa8f487f204c300ca0186a5dbb9692edf562..e5ba07848dab03b89259c4676e2f382ece9cb84b 100644 (file)
     <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
index 5ca7242e657915220bc55e3376f3a668c6252bae..30323f434acf467501e1da7836943b6e5240bbd6 100644 (file)
                                        "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",
index 04cf1cdff65907e5d29273864f60f553780fb9d2..132b0f8cc3b2ff386fcd83c46434697a1472074b 100644 (file)
@@ -24,9 +24,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=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")
@@ -1462,6 +1462,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -1648,6 +1649,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -3131,6 +3133,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_M
 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)
@@ -3317,6 +3320,7 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l
 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)
index 757a64cb66f62edae24dd5d6c69ba7a8b515c804..04ea63942266aad644e32313098652b4701b3adc 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index 6c1e29755830cc402506b92bf38ee38b4eb91893..4437f8df077151badf9afa8893b361b6a6c7c90b 100644 (file)
                                        "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",
index 1293b09d57e2d2df7aef052bf8ff70db5c65d74a..909c58f8c3a18d32b49d138e7b0475283cacb751 100644 (file)
@@ -64,7 +64,7 @@
       <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
index 5b1acf0571f2feb221787e51f503dba96b83174b..a75bf0cc3e8a434d1d7a97bd89e42c36a2c88a08 100644 (file)
     <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
index 5cf57bf1db9692bd9c7ae5bd137e8242e970bc09..4c24ccaba5e56059faa222f97e92f7476f230f4f 100644 (file)
@@ -64,7 +64,7 @@
       <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
index 90873cc0f40ff96d31f757d0b0d9da46897ce77a..58ea4cf67c93c7d4960a0486bef559a4dfb3697b 100644 (file)
     <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
index f541961d4347fd0bad069e5fd7c44646f6e12373..2519b8cfe1016657698c7510ba030b526a8c1f2b 100644 (file)
@@ -64,7 +64,7 @@
       <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
index af1fc5101944a7aa54e734dd1a6b68dddce5f7aa..3aa165b0af638c26c873ef057e02f4166f4a4328 100644 (file)
     <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
index d775d8563c6a2270f3dc6009c9228b8f629bd747..02f36e9bf61d0613d401e4b5cf391a38ea865dcc 100644 (file)
@@ -64,7 +64,7 @@
       <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
index 0fcd7b285c3b231d37e76a6cde53157880087121..58772fbb68cb5d691731e2a307832d36a437fbfd 100644 (file)
     <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
index 99935fc8b4e2c2b98b2032e6d7beab78bac9a24c..5895abd3e207885affc23a0166b490bc65c94d5a 100644 (file)
                                        "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",
index 175d85055e5e4d41b35999214fd055a7b832a33d..485fce90c79d37f2e6c95af19c9a17d16feaacaa 100644 (file)
@@ -35,22 +35,23 @@ class PluginScannerSubprocess : private ChildProcessWorker,
                                 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
@@ -58,7 +59,6 @@ private:
         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
@@ -78,27 +78,55 @@ private:
             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
@@ -132,7 +160,6 @@ public:
         appProperties->setStorageParameters (options);\r
 \r
         mainWindow.reset (new MainHostWindow());\r
-        mainWindow->setUsingNativeTitleBar (true);\r
 \r
         commandManager.registerAllCommandsForTarget (this);\r
         commandManager.registerAllCommandsForTarget (mainWindow.get());\r
index f0cfe3394fba62ca83d323b0569fcf72019cc178..db77d0cb86d8dfa6d719c5b436cb5a972d514175 100644 (file)
@@ -171,7 +171,6 @@ private:
 \r
 //==============================================================================\r
 class IOConfigurationWindow::InputOutputConfig  : public Component,\r
-                                                  private ComboBox::Listener,\r
                                                   private Button::Listener,\r
                                                   private NumberedBoxes::Listener\r
 {\r
@@ -187,7 +186,6 @@ public:
         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
@@ -262,26 +260,32 @@ private:
             {\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
@@ -294,27 +298,18 @@ private:
     }\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
index e7a90ce55b7c35a5f16e1123ad17a1f566514ca6..7060ac7454da807c82048ebfb4b11656d64edeac 100644 (file)
@@ -401,50 +401,38 @@ struct GraphEditorPanel::PluginComponent   : public Component,
     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
@@ -484,6 +472,59 @@ struct GraphEditorPanel::PluginComponent   : public Component,
 \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
@@ -495,6 +536,7 @@ struct GraphEditorPanel::PluginComponent   : public Component,
     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
index a0e410fdaee442e0179d8f7d7dd779aa04e0772a..0c7da61de9a07f0096487307217714acdbd13ea3 100644 (file)
@@ -300,6 +300,8 @@ MainHostWindow::MainHostWindow()
 \r
     setContentNonOwned (graphHolder.get(), false);\r
 \r
+    setUsingNativeTitleBar (true);\r
+\r
     restoreWindowStateFromString (getAppProperties().getUserSettings()->getValue ("mainWindowPos"));\r
 \r
     setVisible (true);\r
index 7df3dbc180ad2030c034eacfcb7fe2957daf62bd..3f8015de0132603467b5c0ef206cb3eebb08c7cc 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index 62f404f3466cf5f8fec962f3d7ded9ac9f50805a..83de5c3d8daa8c6d5b286adc414b6c56f91ba972 100644 (file)
                                        "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",
index 4d20d07de12f59fe0f2321dd4fdb9c351c10f396..2b14ea80e3ac7ed63e38b84afd5f10e13039867a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 4d145ebf38c91fb723dfa76a39dd77bd484ed3d9..f592f9945b75fdb15db1b0e09146d776e3c4f1bc 100644 (file)
@@ -11,7 +11,7 @@ elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQU
         -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
index a734f2dae142abb589c5b17b435aab484edfb890..245fe233e649418270653d98c59a9a2f4932beb6 100644 (file)
@@ -318,6 +318,10 @@ function(_juce_write_configure_time_info target)
     _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)
@@ -451,7 +455,7 @@ function(_juce_to_char_literal str out_var help_text)
     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...
@@ -463,7 +467,8 @@ function(_juce_to_char_literal str out_var help_text)
     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()
 
 # ==================================================================================================
@@ -855,7 +860,15 @@ function(juce_enable_copy_plugin_step shared_code_target)
         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}>")
@@ -1537,6 +1550,10 @@ function(_juce_initialise_target target)
         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
diff --git a/extras/Build/CMake/checkBundleSigning.cmake b/extras/Build/CMake/checkBundleSigning.cmake
new file mode 100644 (file)
index 0000000..457edd7
--- /dev/null
@@ -0,0 +1,37 @@
+# ==============================================================================
+#
+#  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()
index 03db74ba03aa413b3e05313704f8edfd0cb9d5c8..d3e72f55679fb0b9575b54f60d7b5cc4d33d23eb 100644 (file)
@@ -34,7 +34,7 @@
 \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
index bb4c02f1d82980dc6008ec9bee3e0f575c143635..faac95a587af476fbb87c8a73d906fc1f8c5742d 100644 (file)
@@ -79,7 +79,7 @@ namespace build_tools
         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
@@ -101,13 +101,27 @@ namespace build_tools
             {\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
index b7d1538597c5987e794c3bf93707f2397bcc8e5a..a706fd355ff96402ca42407939f5c1e6e4b39558 100644 (file)
@@ -49,6 +49,14 @@ namespace build_tools
         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
index dd680eae54b3198286d7c35aa38755e3a9c2147a..1839c6683e0d93742c88ffaab238a3a2f9c32eaa 100644 (file)
@@ -53,10 +53,18 @@ else()
     # 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")
@@ -70,6 +78,7 @@ else()
             "-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
index cdfcda1dba72b2b23e5d0a0fbb886b6cb2f89590..4a9e61e62d85d8c44f2f2c4816fa1fafda1deb0e 100644 (file)
@@ -343,6 +343,29 @@ juce::build_tools::EntitlementOptions parseEntitlementsOptions (const juce::File
     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
index e2b9a8172525edb0fbc4760fb422048c8d490a4e..9bde976da4a5da7eb2f02c566a56fb9a67c1a7b7 100644 (file)
@@ -23,9 +23,9 @@ include_directories( AFTER
 enable_language(ASM)
 
 if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=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()
@@ -1359,6 +1359,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -1545,6 +1546,7 @@ add_library( ${BINARY_NAME}
     "../../../../../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"
@@ -2954,6 +2956,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_M
 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)
@@ -3140,6 +3143,7 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l
 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)
index c04fe00a3e972e2f2b5b5b96e9121a09f46310cf..03a1cd0902bd410cef9bd64efee58204ef1719e1 100644 (file)
@@ -1,7 +1,7 @@
 <?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"/>
index 3ad21c8909ab7b7828ee418d27ea063a1a4110c8..96872426db7585d7aab7ffe8edccc538bc91e3d5 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index c53bae38d12b0c5843939b21cf50ec0a6e17b53a..d9d37e82ef601dabc6771ae34675af21be67bf6a 100644 (file)
                                        "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",
index cc36f559fbf2edeea46a0270cc36e834d6c1f4d5..168fd925e24571e08d510e710ef6e622329ba1f5 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 38fa4896c842e66e3d55679e1a63d488898868cf..4f1b6e470857c96aa08b5e3e4270edd325f5f64e 100644 (file)
     <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
index 047082899a5a0332bae1173b227c870925cf9d38..4edd34810e58228a3f16c2537cb3193a00aa1065 100644 (file)
                                        "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",
index 9b120486e4e95be5dccd2afbea90e83a78120ceb..e2e84b71c415509c56504fb5e1aac2365487596f 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index 7679227a64d0f1425aace0eeaeb55122da9a7387..c1bafadd8a91a08d9b7a45415e1f20ae5553a9f9 100644 (file)
@@ -22,9 +22,9 @@
     <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
index 04d087953466b0076988b5fbf388a7b60b07eb38..0f3d07cc02d0b7f4a8672ea1896b8bc58a5e0122 100644 (file)
                                        "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",
index 9412df3f12da9c1436978c95fa329046dc7da80d..e8f9dccb2b95e380b7ffdf228e3fbb192558158a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index da0dedf9cc298efc95814a5cfab7280d27831039..15a5ecd45a7f1e9be34cba731456355389cc0fa4 100644 (file)
     <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
index 421842fdd8752f9bc14303fc1b25a8ea2f015fdc..c41ddea2af8c885a1dc0f3a296f1030a73aaf93c 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "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
index c138918bec0856a6302a373c86941f2faad20233..468c60158a50766eb24edfda1c6483462ddd7a8d 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 8f5bd1b238f009cebeaa5331c7cad7cad4d54734..2be8d1126e4a306eca0c10c5982faad1edc6dbab 100644 (file)
     <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
index 421842fdd8752f9bc14303fc1b25a8ea2f015fdc..c41ddea2af8c885a1dc0f3a296f1030a73aaf93c 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "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
index 78d54220715ce0176a233a00d93778ed5fb80455..4753e8f76ebf12326ec3f5531a8eafb4fc407f0f 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 87d1846d024fae788f0d3ef98ca5a5407db5889c..c92b2abf455ffa8d3d6013664137aa1c4b895d89 100644 (file)
     <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
index 421842fdd8752f9bc14303fc1b25a8ea2f015fdc..c41ddea2af8c885a1dc0f3a296f1030a73aaf93c 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "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
index 2e63c16af70330913cbde24818f528aca4b9aa00..11fd5e536987525aee1f56697be4903e06051c71 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 034c23cfb402c0db44cc4be6a50950d92cf881ac..bc6960b02da24106ead3c80d5f6779f4ac5f3804 100644 (file)
     <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
index 421842fdd8752f9bc14303fc1b25a8ea2f015fdc..c41ddea2af8c885a1dc0f3a296f1030a73aaf93c 100644 (file)
@@ -9,7 +9,7 @@
 #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
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "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
index e164b35e42b51bcc13d675e44468a868c8c8cc98..80aa599940181e050fbd5429d26d96e54062d80a 100644 (file)
@@ -44,7 +44,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "Projucer";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "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
index 72c2f91539df9d5dc253740c9d60fc1f7b73af22..49dd7305e06f70233c5c396de0911ad30dd736f3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              version="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
index ca750a3e23b17b11bab32abf14f6f659ebd5ba2c..b12e2419c6685e8cf2e75225584ca0e5e4a9a23a 100644 (file)
@@ -1012,7 +1012,8 @@ void MainWindowList::checkWindowBounds (MainWindow& windowToCheck)
         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
index a81eca1f2429501e425ee1dc2ab16824566c0844..f88e8a7388ff0e91ad7ed8601c7dcdca235588ea 100644 (file)
@@ -185,7 +185,7 @@ public:
             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
index ab970eac39b249e5e5ead436bea1a387126616ec..e6c79f8e4f8ea9b103ae6a01a5363dd5bb389186 100644 (file)
@@ -302,8 +302,7 @@ public:
 \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
@@ -418,17 +417,17 @@ private:
         }\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
index fd69c0985c72b3ea245c74a91085dffa01e0136f..28dc55f4d751068f28d187af58657a371524a470 100644 (file)
@@ -826,6 +826,14 @@ void Project::updateJUCEPathWarning()
     }\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
@@ -1091,6 +1099,14 @@ void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& prope
         {\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
@@ -2578,8 +2594,10 @@ StringPairArray Project::getAudioPluginFlags() const
         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
index a02a01a45a026d451b5ceaf39352a92f0da14c65..8f1a3a91f9d2e6240ed11ce348357fd41bba1e16 100644 (file)
@@ -50,6 +50,8 @@ namespace ProjectMessages
         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
@@ -63,7 +65,7 @@ namespace ProjectMessages
     {\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
@@ -86,6 +88,8 @@ namespace ProjectMessages
         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
@@ -102,6 +106,8 @@ namespace ProjectMessages
         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
@@ -618,6 +624,7 @@ private:
     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
index 9b08423857528deb64b1cc9724e3b20d204e30e8..b4312a6add57d43ed6863a1308fe8f399eeebf85 100644 (file)
@@ -1639,7 +1639,7 @@ private:
         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
index 43bc3c15cf2109e49e4e6307516fcdb749d5e02a..cf4c000ff6f90bd9729ace9b1fd838d864ffdaa2 100644 (file)
@@ -34,6 +34,14 @@ inline String msBuildEscape (String str)
     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
@@ -509,7 +517,6 @@ public:
                         intdir->addTextElement (build_tools::windowsStylePath (intermediatesPath));\r
                     }\r
 \r
-\r
                     {\r
                         auto* targetName = props->createNewChildElement ("TargetName");\r
                         setConditionAttribute (*targetName, config);\r
@@ -1332,23 +1339,25 @@ public:
             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
index f5333e283a450945c08eb55eeea053833f6c61e5..7723b12ccb3a34ab4da5d1d454ffabd7824a3b2e 100644 (file)
@@ -74,6 +74,10 @@ public:
           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
@@ -173,6 +177,21 @@ public:
     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
@@ -457,29 +476,36 @@ public:
                 { "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
@@ -3085,6 +3111,7 @@ private:
         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
@@ -3566,6 +3593,7 @@ private:
                                  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
@@ -3576,5 +3604,19 @@ private:
                                  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
index fcfa71b003a16b265828b792127717727aa50bca..f61cf2e4a628ca99038af2d91f32b32b53aa4113 100644 (file)
@@ -291,20 +291,6 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave)
 \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
index 018706b09c506c01793b7462c4111288d2ecef8f..a502beb9901c42b0ebde14db01f858000432db69 100644 (file)
@@ -196,6 +196,10 @@ namespace Ids
     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
index ead10092146c89660f3c7315ad13a1fcc1e3b46b..943521b80c4184e7b6dbde47bb63bea1da001e70 100644 (file)
@@ -94,23 +94,21 @@ int ProjucerLookAndFeel::getTabButtonBestWidth (TabBarButton& button, int)
     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
index 33b25809dcfaa8892a7839cc46c5e5754e9a70ab..c9a7745377714a7cf8392334ef5dd952bdd75b6d 100644 (file)
@@ -81,8 +81,8 @@ public:
                               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
index 6f42ffcea34a38131885534902ef49b881e9dedf..5632ca384bb4cbaf7686d15ba58d0f5d6447b51b 100644 (file)
@@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
@@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := 
   endif
 
-  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=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
 
index e88f582e05f3f4849897837f3753f18bcc48b4a6..003f63a32af58eb9154779cdc240fec55c336727 100644 (file)
                                        "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",
index 78e0e4ced5a9d7fd530d08612dbfba284892ce1b..e8fe99e2c93dd9e0e2348be48697f7c9025c53c0 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 8d471c3f24c6b4c0a8ad92c15e15f59374421324..ad8f6e7e34489abfb95b689fa39dd7ed93bb0831 100644 (file)
     <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
index db1c0bf12f51b218e49af8109195ade9ec9f81ee..f4773208186851108a3c8779e0b3cf75741df2e3 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index c8054d4c137f01dfe0917105190675608a7501aa..eccd02ee1635d9357040a75dd4da3e4179b4212b 100644 (file)
     <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
index 6a6b540700c1ab950b2684de1bb0ba59172c3e88..5b5714eac86310546a608f4bb3240af7c1c95565 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index e0e8c3fe4b1d786a482922f1b53f6510ce28accb..816c592a9d6540c0ed91bbde9ab6eb4191d14170 100644 (file)
     <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
index c657eda5d1021c488f9471e146c38732c599b981..b16fe4dce50f0cd0b6917ceeef1e2bf29f8c33ef 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=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
index 67a686fb4e4fa1059948942536cf8705a5bcc49d..6b1f6585926a1be967a5bf3859fc6eeb1b757edb 100644 (file)
     <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
index eb7e43889c572b4364467248f6697a3d6c32dc65..ff53d8683e8dae5717d11f0cd7bba675fbc82c2d 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 0e83537ad1de372d3f6ce34b212a30d004cf743a..17bc7d836147026e05f223bea212fef167194e0c 100644 (file)
@@ -102,13 +102,13 @@ public:
         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
index 97bb15c4db9e6e45c1dc1a68a5e30c573e150315..f7d74fd84a56f76c6cb7ce6ead85dc6de52a0cd6 100644 (file)
@@ -544,49 +544,55 @@ Array<AudioChannelSet> AudioChannelSet::channelSetsWithNumberOfChannels (int num
     {\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
index 1db887e9d7d4f74829eda69eeacb5400356e2d16..97b559e8f80e4253e4718691e9f3d29723ebdf72 100644 (file)
@@ -32,7 +32,7 @@
 \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
index 95f0e3ab1020b18eb024d9add098449f7d17cf75..40662c26162fdde676080f0a9469ca10635766ff 100644 (file)
@@ -133,7 +133,7 @@ public:
     */\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
index 5ee6cd6510f9a61542214594e2fbc7cf26c3b47f..1757966fe9db0cf47b61eb2d3dbb0af03c557b03 100644 (file)
@@ -58,8 +58,6 @@ public:
     /** 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
index 96179a76fdafaddcb7cdd66f3687c50a0c20fcb3..b40770228ec82857382a91a55405d213db77f3c8 100644 (file)
@@ -32,7 +32,7 @@
 \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
index 8cb3f367f7cb358f640ab80e0cdb1f0e99b1ab41..24e5bfda7b094f72344ac6a16c98c90948afad89 100644 (file)
@@ -1555,7 +1555,7 @@ public:
                 newCallback->audioDeviceAboutToStart (this);\r
 \r
             const ScopedLock sl (callbackLock);\r
-            previousCallback = std::exchange (callback, newCallback);\r
+            previousCallback = callback = newCallback;\r
         }\r
     }\r
 \r
index 8414d5c87311034cc975239df71c711de3617c99..aa2ef4ffa9e2e802f6af4213f217deb2fcc6309b 100644 (file)
@@ -168,8 +168,9 @@ const char* const WavAudioFormat::riffInfoWatermarkURL          = "IWMU";
 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
@@ -880,7 +881,12 @@ namespace WavFileHelpers
                                 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
@@ -890,11 +896,24 @@ namespace WavFileHelpers
 \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
@@ -1869,6 +1888,8 @@ struct WaveAudioFormatTests : public UnitTest
         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
@@ -1882,30 +1903,113 @@ struct WaveAudioFormatTests : public UnitTest
         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
index 55f5c4bf28ea78536820c8c5445a5eade46127f2..766d76b8cd99361d39352b86c9c993cce9b66dd7 100644 (file)
@@ -177,8 +177,12 @@ public:
 \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
index a2b9cb7e5e00001d40b1c750e8c67ff223537d76..461d3cf09a4eac0d660590542cd043fe7311d5ab 100644 (file)
@@ -35,7 +35,7 @@
 \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
index ecbc4dbdb4ccab9253f176906ee01b4aaa1d2d9f..67f29bee0bda89a5bfd394522604ae4bf47d0b8b 100644 (file)
@@ -1533,7 +1533,7 @@ namespace AAXClasses
                     }\r
                 }\r
 \r
-                if (bypass)\r
+                if (bypass && pluginInstance->getBypassParameter() == nullptr)\r
                     pluginInstance->processBlockBypassed (buffer, midiBuffer);\r
                 else\r
                     pluginInstance->processBlock (buffer, midiBuffer);\r
index 99defb774e774a75ab6101e539082eca82d1fb88..91a49867d6ce38d8c65bd17d1df61d04b766e321 100644 (file)
@@ -588,7 +588,7 @@ public:
 \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
@@ -685,6 +685,10 @@ public:
         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
index 58b458da9fed598ece7a3b5c453c48ff21c02945..85ffae7d464edb69ee8441e5fe9f8098a2890cc3 100644 (file)
@@ -709,6 +709,8 @@ public:
         : 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
@@ -725,9 +727,9 @@ public:
 \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
@@ -798,7 +800,7 @@ public:
             props->removeValue ("filterState");\r
 \r
         pluginHolder->createPlugin();\r
-        setContentOwned (new MainContentComponent (*this), true);\r
+        updateContent();\r
         pluginHolder->startPlaying();\r
     }\r
 \r
@@ -839,6 +841,20 @@ public:
     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
@@ -914,6 +930,23 @@ private:
             }\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
@@ -975,28 +1008,6 @@ private:
             {\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
@@ -1045,8 +1056,80 @@ private:
         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
index 08018247c74cf919b2ea4798ba6717dce17f99ff..7aae5b91e9b92ed4a763c89e421a9c75b6cbf85a 100644 (file)
@@ -126,8 +126,8 @@ public:
     {\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
@@ -162,7 +162,9 @@ private:
         {\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
@@ -199,7 +201,7 @@ private:
 \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
@@ -270,6 +272,7 @@ private:
     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
@@ -349,6 +352,11 @@ public:
 \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
@@ -451,7 +459,7 @@ private:
             {\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
@@ -618,8 +626,7 @@ namespace UnityCallbacks
             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
index 24fc168aa980a8db0567bc1acc7eacf9bdfe4211..bca6cd74239017b57b07d4139cf0aa9ceb4e2873 100644 (file)
@@ -447,7 +447,7 @@ public:
                     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
@@ -737,7 +737,7 @@ public:
     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
@@ -1800,10 +1800,10 @@ private:
 \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
index ded1cf1a7a97231c7e6a2122c2a51be69ed45d8f..623ca9aef2a88485b8aa1d30efa182bb8cc3a6cc 100644 (file)
@@ -582,7 +582,7 @@ private:
         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
@@ -1174,19 +1174,19 @@ public:
     //==============================================================================\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
@@ -1354,6 +1354,7 @@ private:
     std::vector<std::unique_ptr<OwnedParameterListener>> ownedParameterListeners;\r
 \r
     //==============================================================================\r
+    bool inSetState = false;\r
     std::atomic<bool> vst3IsPlaying     { false },\r
                       inSetupProcessing { false };\r
 \r
@@ -1579,7 +1580,7 @@ private:
                            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
@@ -2207,14 +2208,14 @@ class JuceVST3Component : public Vst::IComponent,
 {\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
@@ -2370,10 +2371,10 @@ public:
     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
@@ -2433,6 +2434,10 @@ public:
 \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
@@ -2636,6 +2641,10 @@ public:
 \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
@@ -2763,7 +2772,7 @@ public:
 \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
@@ -3374,7 +3383,9 @@ private:
                 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
@@ -3489,7 +3500,7 @@ private:
             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
index e178dfffca4f990b338f2e8b2f2e1d00979e8360..1171fdae33c706635cda45f483363ee02ce32c87 100644 (file)
@@ -35,7 +35,7 @@
 \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
index f3bc826820c98763995fd4cf3983f9f1ed10e32c..8ada020006aa45d48a63fd519eacd89bf7e22801 100644 (file)
@@ -137,6 +137,9 @@ public:
     */\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
@@ -149,9 +152,6 @@ protected:
     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
index aad9a4f407c2ae7148f03c53e27390d4636f5900..06e739d8632bf661e56f2b57c6128fb6964ef366 100644 (file)
@@ -215,25 +215,31 @@ struct AudioUnitHelpers
             }\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
index b878bd034576c90a2790992e519315367b3cfe6e..8389dd6c65d99a47ecc96c4a7ab3621314ce4d46 100644 (file)
@@ -312,6 +312,105 @@ namespace AudioUnitFormatHelpers
         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
@@ -386,15 +485,8 @@ public:
             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
@@ -510,15 +602,18 @@ public:
 \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
@@ -624,8 +719,8 @@ public:
 \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
@@ -980,7 +1075,6 @@ public:
             timeStamp.mHostTime = GetCurrentHostTime (0, newSampleRate, isAUv3);\r
             timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid;\r
 \r
-            currentBuffer = nullptr;\r
             wasPlaying = false;\r
 \r
             resetBuses();\r
@@ -1003,6 +1097,13 @@ public:
                     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
@@ -1015,7 +1116,6 @@ public:
             AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0);\r
 \r
             outputBufferList.clear();\r
-            currentBuffer = nullptr;\r
             prepared = false;\r
         }\r
 \r
@@ -1030,6 +1130,14 @@ public:
 \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
@@ -1045,28 +1153,27 @@ public:
         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
@@ -1142,10 +1249,10 @@ public:
 \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
@@ -1383,99 +1490,72 @@ public:
 \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
@@ -1642,10 +1722,10 @@ private:
 \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
@@ -1655,6 +1735,7 @@ private:
 \r
     std::map<UInt32, AUInstanceParameter*> paramIDToParameter;\r
 \r
+    AudioUnitFormatHelpers::SingleDirectionChannelMapping inMapping, outMapping;\r
     MidiDataConcatenator midiConcatenator;\r
     CriticalSection midiInLock;\r
     MidiBuffer incomingMidi;\r
@@ -1778,6 +1859,7 @@ private:
         switch (prop.mPropertyID)\r
         {\r
             case kAudioUnitProperty_ParameterList:\r
+                updateParameterInfo();\r
                 updateHostDisplay (AudioProcessorListener::ChangeDetails().withParameterInfoChanged (true));\r
                 break;\r
 \r
@@ -1801,40 +1883,124 @@ private:
     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
@@ -2017,28 +2183,16 @@ private:
     //==============================================================================\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
@@ -2047,7 +2201,7 @@ private:
             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
@@ -2055,7 +2209,7 @@ private:
                 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
@@ -2064,7 +2218,7 @@ private:
                 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
index e566f7cc8a4855f2a8255a0e9d76e12f17779b38..90121aa093ce7e269b956994f7bd3b35728ac308 100644 (file)
@@ -1348,9 +1348,7 @@ struct VST3PluginWindow : public AudioProcessorEditor,
         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
@@ -1365,7 +1363,9 @@ struct VST3PluginWindow : public AudioProcessorEditor,
          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
@@ -1573,7 +1573,12 @@ private:
                 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
@@ -1591,11 +1596,24 @@ private:
     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
@@ -1641,7 +1659,7 @@ private:
    #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
@@ -1669,16 +1687,33 @@ struct VST3ComponentHolder
     // 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
@@ -1695,9 +1730,6 @@ struct VST3ComponentHolder
             }\r
         }\r
 \r
-        if (editController == nullptr)\r
-            editController.loadFrom (component);\r
-\r
         return (editController != nullptr);\r
     }\r
 \r
@@ -2213,7 +2245,7 @@ public:
 \r
         editController->setComponentHandler (nullptr);\r
 \r
-        if (isControllerInitialised)\r
+        if (isControllerInitialised && ! holder->isIComponentAlsoIEditController())\r
             editController->terminate();\r
 \r
         holder->terminate();\r
@@ -2245,8 +2277,10 @@ public:
         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
@@ -2903,7 +2937,7 @@ public:
 \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
@@ -2921,8 +2955,8 @@ public:
 \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
@@ -3746,12 +3780,13 @@ void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& di
 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
index 026b05adea218e8492b9290f5d0f2d843fb5b4bc..6e6b90e97477939714d095b6144dd45b55a79fb4 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 3cb5b78e8aee85b300fe01779d7cc27bbdd33a9d..d4ef6fb4a2816254b7161576ab8e0d2ed4d4f446 100644 (file)
@@ -1340,8 +1340,8 @@ protected:
 \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
index 8b01a7c5de950e2da0ff6a2ad12ba8250abed865..af7bf1b8cf40c0c5f3cf0cb5a17d94e6925bdbd8 100644 (file)
@@ -72,7 +72,18 @@ struct AudioProcessorEditorHostContext
     /** 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
index aba6310412ef0e3bee4fc9a8d14aa97b2690c92f..9f695ddcf86e21ede762990fa0a5abcc8166aa56 100644 (file)
@@ -78,7 +78,7 @@ public:
 \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
@@ -88,7 +88,7 @@ public:
 \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
@@ -97,7 +97,7 @@ public:
 \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
@@ -110,7 +110,7 @@ public:
 \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
index 4e39d4cc90f06e2dd69ba8e7c447ca2abfebe18f..bdb5360dd38eece386ddb98dc40bb91f30865e00 100644 (file)
@@ -178,9 +178,9 @@ public:
 \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
index e380d0c6235d1b0f9f84933a40b98c8a674c9281..8c9df0d45a67af306ad5110927a11f480769ce40 100644 (file)
@@ -97,13 +97,19 @@ private:
     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
@@ -122,12 +128,12 @@ public:
         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
@@ -146,12 +152,11 @@ private:
 };\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
@@ -186,7 +191,6 @@ public:
             button.setBounds (area.removeFromLeft (80));\r
     }\r
 \r
-private:\r
     void handleNewParameterValue() override\r
     {\r
         bool newState = isParameterOn();\r
@@ -198,6 +202,7 @@ private:
         }\r
     }\r
 \r
+private:\r
     void rightButtonChanged()\r
     {\r
         auto buttonState = buttons[1].getToggleState();\r
@@ -249,12 +254,11 @@ private:
 };\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
@@ -312,12 +316,11 @@ private:
 };\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
@@ -354,12 +357,6 @@ public:
         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
@@ -369,6 +366,12 @@ private:
         }\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
@@ -449,7 +452,7 @@ public:
     {\r
         if (e.mods.isRightButtonDown())\r
             if (auto* context = editor.getHostContext())\r
-                if (auto menu = context->getContextMenuForParameterIndex (&parameter))\r
+                if (auto menu = context->getContextMenuForParameter (&parameter))\r
                     menu->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
                                                                                       .withMousePosition());\r
     }\r
@@ -458,9 +461,9 @@ private:
     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
@@ -501,6 +504,9 @@ private:
     {\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
index 63f22e23d52d7e45b373d6f0ab3134d00156ab9c..a7f2d1c79b5948cdfb912f139e661da3220d3054 100644 (file)
@@ -54,7 +54,8 @@ bool PluginDescription::matchesIdentifierString (const String& identifierString)
 \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
index 7da639b1ea617082e5450471d2fd7a3f576b8478..fc8aa8c506f734605ca41648915d64201e537ba5 100644 (file)
@@ -126,7 +126,7 @@ private:
     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
index b56ea638662ed35be7804040a700eebd3385ba4d..b1e3484a2dab17f2cbb0ca1d99613be629bc500a 100644 (file)
@@ -451,7 +451,8 @@ private:
     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
@@ -582,6 +583,8 @@ private:
         if (timerReentrancyCheck)\r
             return;\r
 \r
+        progress = scanner->getProgress();\r
+\r
         if (pool == nullptr)\r
         {\r
             const ScopedValueSetter<bool> setter (timerReentrancyCheck, true);\r
@@ -602,10 +605,7 @@ private:
     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
index 90ba324d5e33b179c28deb9f8f16d28e57496530..7eab5d0e7c8080db91ed92b86fb5f46a147d8992 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 3b9ca41b1deb887850ed0e8f4362747f3c564138..2b93878f9af53b18d895133308c6e34a73300743 100644 (file)
@@ -35,7 +35,7 @@
 \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
@@ -58,7 +58,8 @@
 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
index 767a3ac4806ca61a38ad215e2c9bf326b02bf6b0..ea72ed7e7bfe7eb370b68eb8ac2fc8640e62462f 100644 (file)
@@ -75,13 +75,26 @@ bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fi
 \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
@@ -99,7 +112,7 @@ bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fi
 \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
index 8b99b3bfe2b8cd4e196daeec3f37e919ffe4a21a..27a7aea9a603a0fa04e4ab4257b15f6a1af04a28 100644 (file)
@@ -34,6 +34,10 @@ namespace juce
     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
@@ -73,17 +77,10 @@ public:
     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
@@ -126,6 +123,39 @@ public:
     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
@@ -152,6 +182,9 @@ private:
     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
index e17e57633f1013f297918e8416289dd2cc410728..85fd0b7da53f7d0eafd82fc5d283c965ab7c89ce 100644 (file)
@@ -561,18 +561,18 @@ void File::readLines (StringArray& destLines) const
 }\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
index ac38105ea66847cf00ac3b72f1244959fd1856bf..a6f9f71ac460fd18f85d78dabfd4dc6ef51465f2 100644 (file)
@@ -560,6 +560,23 @@ public:
         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
@@ -572,13 +589,15 @@ public:
         @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
@@ -586,7 +605,8 @@ public:
         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
@@ -942,7 +962,10 @@ public:
 \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
index cbf3dbd6183b473ce27f22dc0e02e3c63d4e5eed..fa5796cb4cc9eaaac7052d9de34f01799805a3ec 100644 (file)
@@ -39,11 +39,13 @@ float DirectoryEntry::getEstimatedProgress() const
 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
index 0c2ba664542a1ea33485317789fb032c075debb2..db34e8938b19f2ed042c7b462f1e64cac25cf138 100644 (file)
@@ -118,11 +118,13 @@ public:
                                 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
index 4cf2f9f332324aa4dfa23cc2ae794dd7fa5507ae..eda1edcdd0f1e3fb9daae014623f8fe17c72cf52 100644 (file)
 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
@@ -34,7 +51,7 @@ static File createTempFile (const File& parentDirectory, String name,
 \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
@@ -43,7 +60,7 @@ TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags)
 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
index 5b582e57158ed773ac867b273d8ac6ec9e40b2a9..41a292204fdbb1c9c5cb5fc2fcd79e2912f27d8c 100644 (file)
@@ -32,7 +32,7 @@
 \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
index f6f5829787fbd1da3e409d046cd1f89d32c7454d..4ead2726764fccdec34064218ddccc5ac5437cf6 100644 (file)
@@ -175,8 +175,8 @@ Type mapFromLog10 (Type valueInLogRange, Type logRangeMin, Type logRangeMax)
 }\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
@@ -195,8 +195,8 @@ Type findMinimum (const Type* data, int numValues)
 }\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
index c2b75d478b75aefbebf1e37e44347efdc01278c2..dc14a53e2ef907361e0f51590e882415ef846673 100644 (file)
@@ -32,10 +32,6 @@ Random::Random()  : seed (1)
     setSeedRandomly();\r
 }\r
 \r
-Random::~Random() noexcept\r
-{\r
-}\r
-\r
 void Random::setSeed (const int64 newSeed) noexcept\r
 {\r
     if (this == &getSystemRandom())\r
index 2a24fa75aec7e582ff9ddd90714e3baa3c95a936..ff25e60d130ac164ac8566eb115be38fae84dcc8 100644 (file)
@@ -50,9 +50,6 @@ public:
     */\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
index bf540d81f4db6e821e11cc96937386a6cf865d84..de5a3f78368dee2923262c7a6dea990333fc2ad1 100644 (file)
@@ -63,14 +63,14 @@ public:
     }\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
@@ -104,13 +104,13 @@ public:
         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
@@ -130,13 +130,13 @@ public:
         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
@@ -152,7 +152,7 @@ public:
     /** 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
@@ -161,7 +161,7 @@ public:
         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
@@ -231,21 +231,21 @@ public:
 \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
index d524214b430eeb6460ef3827235b626f5021ba3f..acf7d041ce9ca57d7a2ae5eb54ef05202abe0efc 100644 (file)
  #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
index 5af501ce6a9690497940275d9a19a393ef5e2e32..0e6e678324d6d6853880a2210e40888ded98736d 100644 (file)
@@ -39,8 +39,8 @@ public:
 \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
@@ -51,7 +51,7 @@ public:
 \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
@@ -61,8 +61,10 @@ public:
 \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
@@ -72,9 +74,9 @@ public:
                     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
@@ -89,7 +91,9 @@ public:
     {\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
@@ -97,7 +101,7 @@ public:
         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
@@ -105,9 +109,9 @@ public:
                 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
@@ -134,8 +138,52 @@ public:
         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
@@ -160,30 +208,25 @@ private:
         {\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
@@ -203,23 +246,18 @@ private:
 \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
index b9628eb13695b7a76a98080515ed53715c1a10bc..b8ab52ca792ee17d6879cc2b958bb801c3f7da67 100644 (file)
@@ -618,17 +618,18 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
 \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
index 2623bb977aada6012e8235597aa8f4caba8441bb..7908ed26f4e55b6b759e8a2ddba45ae0ae3ae639 100644 (file)
@@ -147,7 +147,7 @@ public:
 \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
@@ -156,7 +156,7 @@ public:
 \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
@@ -189,8 +189,8 @@ public:
 \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
@@ -198,7 +198,7 @@ public:
 \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
@@ -211,9 +211,9 @@ public:
 \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
@@ -225,10 +225,10 @@ public:
 \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
@@ -264,7 +264,7 @@ public:
         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
@@ -274,7 +274,7 @@ public:
         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
@@ -337,36 +337,36 @@ public:
 \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
@@ -375,7 +375,7 @@ public:
             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
@@ -459,7 +459,7 @@ public:
         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
@@ -468,17 +468,17 @@ public:
 \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
index 72e889a8ac12b08d5e7ec9b5f8696e9058796fc5..7fd571e457b8c08f5482126ea11a4a3aac279415 100644 (file)
  #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
index 919c864b09944658101399cf5399530c7733dbc6..fe164cdd315710676e8be875a564e4b03dcc8ea3 100644 (file)
@@ -29,7 +29,7 @@
 */\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
index f89dc6112f91a3782f7128bd08fa420c821a298f..764417e69d7a02113d63ceda0c540cd739343875 100644 (file)
@@ -500,10 +500,10 @@ public:
 \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
index b2102bb6fd6afced8c2d6578694cb0fb8e0c7db6..8a00e2835b9718eea8052f2d12e99daaaa15389f 100644 (file)
@@ -2467,6 +2467,9 @@ public:
             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
index 109ea384b4c2e3611af3da04f431dc9b5a2ae815..1a42f072836c54308b5dc5cba80a0223a2d5e899 100644 (file)
@@ -144,8 +144,8 @@ public:
         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
index e79cf4e9817a3e05a1c51764eb2f4e7148c34c64..2090f812e26cb4dafb8ab3c9dc62c08b8c7ccf70 100644 (file)
@@ -44,10 +44,6 @@ RSAKey::RSAKey (const String& s)
     }\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
index 1d9eedb848defe2e5011aeb6fa006ced1fa81e6e..ed8d3fdf7206b39670c3e756f4a00b9f555d62d3 100644 (file)
@@ -107,9 +107,6 @@ public:
     */\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
index 794d2b99062c862c646c56cd6ec71836b38ebbaa..f9bf9c510a03f7983e0d10e8019841b4fcc57615 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 1017ca5a857594bdd8b405a0784ea97c350e7acc..1e86e71b6bcb92812fe51e29d48d0dcf7e5a040e 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 7fa027e509108a0b74f1a23a9ade7cb66de9c4f1..9f4dd8473425907bc731ae04f82904dbef0bf3af 100644 (file)
@@ -341,12 +341,11 @@ public:
                  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
@@ -524,7 +523,7 @@ public:
         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
@@ -601,7 +600,7 @@ private:
     //==============================================================================\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
@@ -609,7 +608,7 @@ private:
 \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
@@ -619,8 +618,7 @@ private:
     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
@@ -630,13 +628,12 @@ private:
     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
@@ -655,7 +652,7 @@ private:
     //==============================================================================\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
@@ -665,7 +662,7 @@ private:
     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
@@ -675,7 +672,7 @@ private:
     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
@@ -685,7 +682,7 @@ private:
     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
@@ -701,7 +698,7 @@ private:
     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
@@ -717,7 +714,7 @@ private:
     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
@@ -726,7 +723,7 @@ private:
     //==============================================================================\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
@@ -736,7 +733,7 @@ private:
     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
@@ -746,7 +743,7 @@ private:
     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
@@ -756,7 +753,7 @@ private:
     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
@@ -809,7 +806,7 @@ private:
     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
@@ -819,7 +816,7 @@ private:
     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
@@ -835,7 +832,7 @@ private:
     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
@@ -845,7 +842,7 @@ private:
     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
@@ -856,7 +853,7 @@ private:
     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
@@ -866,7 +863,7 @@ private:
     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
index e0b7ac43b89b4ecc381e76a21bc86f60e9cebe78..acb17f4ff77dec4e1f0b0151acc81bf8937730df 100644 (file)
@@ -204,6 +204,9 @@ public:
                     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
index 8b0d1a1b6d389b229a837f950f6e4931d963d6aa..7b0178ba2e8586e61ebc12a1da9c09212a366b77 100644 (file)
@@ -33,9 +33,10 @@ namespace dsp
 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
index 7d7ff801c683a007a82decbadacafdab8aa03e5b..2c7a37488585a710f43eb41cce7bf3e2df1a763b 100644 (file)
@@ -35,7 +35,7 @@
 \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
index bb170646f8260354c2fc41c0f1f23f76e555524e..1a00fcff7c475d9c8a98fc7746abb94c227717de 100644 (file)
@@ -146,7 +146,7 @@ public:
     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
index bf97413dcddfad72afaf513209b7bc1f363f1648..9e8b03caff0f9871d2c8fb2ce608de844e7e44cd 100644 (file)
@@ -86,6 +86,7 @@ private:
     {\r
     public:\r
         ChangeBroadcasterCallback();\r
+        ~ChangeBroadcasterCallback() override { cancelPendingUpdate(); }\r
         void handleAsyncUpdate() override;\r
 \r
         ChangeBroadcaster* owner;\r
index 731d9ad61b7fe6a07853722cb77ed69415312c3e..3623c064c563c4ad8533796defa3e30ceaf4e425 100644 (file)
@@ -51,6 +51,8 @@ struct ChildProcessPingThread  : public Thread,
         pingReceived();\r
     }\r
 \r
+    void startPinging()                     { startThread (4); }\r
+\r
     void pingReceived() noexcept            { countdown = timeoutMs / 1000 + 1; }\r
     void triggerConnectionLostMessage()     { triggerAsyncUpdate(); }\r
 \r
@@ -90,8 +92,7 @@ struct ChildProcessCoordinator::Connection  : public InterprocessConnection,
           ChildProcessPingThread (timeout),\r
           owner (m)\r
     {\r
-        if (createPipe (pipeName, timeoutMs))\r
-            startThread (4);\r
+        createPipe (pipeName, timeoutMs);\r
     }\r
 \r
     ~Connection() override\r
@@ -99,6 +100,8 @@ struct ChildProcessCoordinator::Connection  : public InterprocessConnection,
         stopThread (10000);\r
     }\r
 \r
+    using ChildProcessPingThread::startPinging;\r
+\r
 private:\r
     void connectionMade() override  {}\r
     void connectionLost() override  { owner.handleConnectionLost(); }\r
@@ -198,14 +201,16 @@ struct ChildProcessWorker::Connection  : public InterprocessConnection,
           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
@@ -274,7 +279,9 @@ bool ChildProcessWorker::initialiseFromCommandLine (const String& commandLine,
         {\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
index 6bff21aec3e1c37cf8ab3b1743edbc074c89a7b0..12594a06aa1404298601fd9e96c1cc5d2ea95f43 100644 (file)
@@ -32,7 +32,7 @@
 \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
index 52e12919b07d1079fa0de7542da3673b34391f2e..32c4e12bf817c6d6e4ea8655e0bfd9dad82f78d4 100644 (file)
@@ -38,6 +38,7 @@ public:
 \r
     ~TimerThread() override\r
     {\r
+        cancelPendingUpdate();\r
         signalThreadShouldExit();\r
         callbackArrived.signal();\r
         stopThread (4000);\r
index b8fb7535c8ef8f152e0cd971183d5ee89c580f2c..fffa2902d674f0cd65cbe9cd4d718b3a60945767 100644 (file)
@@ -299,35 +299,35 @@ public:
 \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
@@ -335,19 +335,19 @@ public:
 \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
@@ -355,14 +355,14 @@ public:
                                 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
@@ -372,7 +372,7 @@ public:
         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
@@ -381,20 +381,20 @@ public:
         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
@@ -403,7 +403,7 @@ public:
     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
index 0c0e211f274891e946e596fc70cfa7d0f8f6dd0d..85f098d17e5c9810d036e277755a511b873f193d 100644 (file)
@@ -44,10 +44,6 @@ namespace
     }\r
 }\r
 \r
-//==============================================================================\r
-LowLevelGraphicsContext::LowLevelGraphicsContext() {}\r
-LowLevelGraphicsContext::~LowLevelGraphicsContext() {}\r
-\r
 //==============================================================================\r
 Graphics::Graphics (const Image& imageToDrawOnto)\r
     : contextHolder (imageToDrawOnto.createLowLevelContext()),\r
@@ -61,10 +57,6 @@ Graphics::Graphics (LowLevelGraphicsContext& internalContext) noexcept
 {\r
 }\r
 \r
-Graphics::~Graphics()\r
-{\r
-}\r
-\r
 //==============================================================================\r
 void Graphics::resetToDefaultState()\r
 {\r
index 8622eecd1a9197b6d973a6d1562fa40407cd8825..9f8274b4ee8cb9dd1f7b544ac98345f13c99bfea 100644 (file)
@@ -56,9 +56,6 @@ public:
     */\r
     explicit Graphics (const Image& imageToDrawOnto);\r
 \r
-    /** Destructor. */\r
-    ~Graphics();\r
-\r
     //==============================================================================\r
     /** Changes the current drawing colour.\r
 \r
index a647b886dc57c48c180b6a477be7b2a99c6e6d8b..92e36a81a35e2c2034587536f59888f6ccc3e200 100644 (file)
@@ -46,10 +46,10 @@ class JUCE_API  LowLevelGraphicsContext
 {\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
index e7fbe8477af7c2d07cb70b1f80b9a691296ad242..ecc8881d395c51a984e235c3b7345811e2ad109f 100644 (file)
@@ -83,10 +83,6 @@ LowLevelGraphicsPostScriptRenderer::LowLevelGraphicsPostScriptRenderer (OutputSt
         << scale << ' ' << scale << " scale\n\n";\r
 }\r
 \r
-LowLevelGraphicsPostScriptRenderer::~LowLevelGraphicsPostScriptRenderer()\r
-{\r
-}\r
-\r
 //==============================================================================\r
 bool LowLevelGraphicsPostScriptRenderer::isVectorDevice() const\r
 {\r
@@ -168,10 +164,6 @@ LowLevelGraphicsPostScriptRenderer::SavedState::SavedState()
 {\r
 }\r
 \r
-LowLevelGraphicsPostScriptRenderer::SavedState::~SavedState()\r
-{\r
-}\r
-\r
 void LowLevelGraphicsPostScriptRenderer::saveState()\r
 {\r
     stateStack.add (new SavedState (*stateStack.getLast()));\r
index d8e3509e90f9eec7755df5e5363fd79909bb9bd1..5c4631c248e7142fd64ecedf48d59641524ee3f6 100644 (file)
@@ -42,8 +42,6 @@ public:
                                         int totalWidth,\r
                                         int totalHeight);\r
 \r
-    ~LowLevelGraphicsPostScriptRenderer() override;\r
-\r
     //==============================================================================\r
     bool isVectorDevice() const override;\r
     void setOrigin (Point<int>) override;\r
@@ -96,7 +94,6 @@ protected:
     {\r
         SavedState();\r
         SavedState& operator= (const SavedState&) = delete;\r
-        ~SavedState();\r
 \r
         RectangleList<int> clip;\r
         int xOffset, yOffset;\r
index 2a2ef4b7c801878e6cd2b9fee8148cdce16815c3..ce09e29a4f39b23dc25d3c579f748c4ce1382138 100644 (file)
@@ -54,6 +54,24 @@ namespace
         }\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
@@ -151,30 +169,35 @@ void AttributedString::setText (const String& newText)
         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
@@ -188,6 +211,7 @@ void AttributedString::append (const AttributedString& other)
         attributes.getReference (i).range += originalLength;\r
 \r
     mergeAdjacentRanges (attributes);\r
+    jassert (areInvariantsMaintained (text, attributes));\r
 }\r
 \r
 void AttributedString::clear()\r
@@ -219,21 +243,25 @@ void AttributedString::setLineSpacing (const float newLineSpacing) noexcept
 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
index 9721939a0683345d86a2c0e05f86179946e9ff52..5f7fffdfbfb2f2fd47d88e82d8e61f1b46a97be0 100644 (file)
@@ -34,6 +34,11 @@ namespace juce
     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
index befd42f0ff5e1abae5109d24dc9270492ad7e3d3..e4eae256f668ae9401fb419d956cae6094221cb8 100644 (file)
@@ -154,7 +154,7 @@ public:
     /** 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
@@ -204,10 +204,10 @@ public:
 \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
@@ -271,7 +271,7 @@ public:
         @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
@@ -286,7 +286,7 @@ public:
     /** 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
@@ -294,7 +294,7 @@ public:
     /** 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
@@ -317,7 +317,7 @@ public:
                             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
@@ -353,7 +353,7 @@ public:
                                 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
index 1d621f85176a31554ad945696b0c798e358fe732..eb5313eee338446d21a7fde5fc2ab8d6545cd87e 100644 (file)
 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
@@ -38,8 +46,6 @@ PositionedGlyph::PositionedGlyph (const Font& font_, juce_wchar character_, int
 {\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
@@ -168,7 +174,7 @@ void GlyphArrangement::addCurtailedLineOfText (const Font& font, const String& t
             }\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
@@ -545,7 +551,7 @@ void GlyphArrangement::spreadOutLine (int start, int num, float targetWidth)
 \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
index 18500f5366bc692ed8732d9f6a771105fad90e5d..068e46b24f870bc0c262e8108868dce25915235e 100644 (file)
@@ -47,13 +47,6 @@ public:
     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
index 0fea60d3190fb16cfc9878bd53801111d0e92163..ea94102766112eec813142ade39648db30f29fa5 100644 (file)
@@ -47,9 +47,6 @@ public:
     */\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
index 851e65c587b66be84c637bbb8cf4c4c2c283f6a7..fc809fa20686a972dce9a186c58ac9355074c5d2 100644 (file)
@@ -970,7 +970,7 @@ bool Path::contains (Point<float> point, float tolerance) const
     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
index b9a5ee5f7ece15d5a35f0510e2df134913201303..893fa435b5c02941dbd772a2d2ee214e078cf9cc 100644 (file)
@@ -144,7 +144,7 @@ public:
         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
index 780f46dfc566fed91f856177e6d3016b0e5b2ebe..d8854a039b28c36f987a5120bb64b5a1167d0908 100644 (file)
@@ -217,42 +217,42 @@ public:
     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
@@ -264,7 +264,7 @@ public:
         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
@@ -276,7 +276,7 @@ public:
         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
@@ -288,7 +288,7 @@ public:
         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
@@ -300,19 +300,19 @@ public:
         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
index 10213980edfd2306cec0181d4a1b8bea83898992..c4355fe78bec28b8b6e916bb4fea34bec182bae4 100644 (file)
@@ -97,7 +97,9 @@ public:
 \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
index 714472304f1eee515cf18071e02bd15568feb68e..62bb19fd2761d17be358dce34f95a2b533540791 100644 (file)
@@ -349,6 +349,7 @@ public:
         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
index 1fcf6d2e1e10324f0544b58c2de1dc715f5daf0e..6404d5ed0a0ab66d322a5629a90dea6e8cf8dcf1 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 941862203bc9f4a6ebf8e5aeb8d9260d8649a38e..df5f9f94875059790bb9b390d9ee5942db5a075f 100644 (file)
@@ -71,7 +71,9 @@ public:
 \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
@@ -111,22 +113,20 @@ public:
     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
@@ -512,7 +512,7 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans
 \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
index 4802dc492c126d5a602fd858cfa45ceac865165f..83ba29472a04fde4da04ae85d995ca5177c8ee4e 100644 (file)
@@ -208,34 +208,74 @@ namespace CoreTextTypeLayout
     }\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
@@ -300,7 +340,7 @@ namespace CoreTextTypeLayout
     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
@@ -324,7 +364,7 @@ namespace CoreTextTypeLayout
     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
@@ -476,10 +516,8 @@ namespace CoreTextTypeLayout
                 {\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
index a877e559b69fdc28b246de27179bdfaf69c1e393..28931e9f33e8cd8e80717061a43c334df085e097 100644 (file)
@@ -271,12 +271,22 @@ namespace DirectWriteTypeLayout
         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
@@ -367,18 +377,28 @@ namespace DirectWriteTypeLayout
             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
index 769c605508bfdb0a00182facc0d49be15d27c8df..9b061c297d1cb1a598f39fa19d1e662cf7876f19 100644 (file)
@@ -50,73 +50,73 @@ public:
 \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
@@ -208,7 +208,7 @@ private:
         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
index 5ee474f9ea71146a24b6c54e888b7c4ce8b532ef..691fbbaead253c18d0729852d58a930398a9fecc 100644 (file)
 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
@@ -264,6 +275,18 @@ struct ScalingHelpers
     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
@@ -2269,16 +2292,16 @@ void Component::mouseDoubleClick (const MouseEvent&)    {}
 \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
@@ -2382,10 +2405,16 @@ void Component::internalMouseEnter (MouseInputSource source, Point<float> relati
 \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
@@ -2414,10 +2443,16 @@ void Component::internalMouseExit (MouseInputSource source, Point<float> relativ
 \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
@@ -2429,8 +2464,7 @@ void Component::internalMouseExit (MouseInputSource source, Point<float> relativ
     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
@@ -2448,9 +2482,16 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
         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
@@ -2481,9 +2522,16 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
     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
@@ -2494,8 +2542,7 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
     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
@@ -2505,12 +2552,16 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
     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
@@ -2537,19 +2588,22 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
     }\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
@@ -2574,10 +2628,16 @@ void Component::internalMouseMove (MouseInputSource source, Point<float> relativ
     {\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
@@ -2595,10 +2655,16 @@ void Component::internalMouseWheel (MouseInputSource source, Point<float> relati
     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
@@ -2625,10 +2691,16 @@ void Component::internalMagnifyGesture (MouseInputSource source, Point<float> re
     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
index a53392c19606137ac3559fa540fe69c99986f543..711d3d55411622bc90899b7d637e1671c7736ae7 100644 (file)
@@ -2594,9 +2594,9 @@ private:
     //==============================================================================\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
index a6df54ff853952fc548f316d62ff02bf2113197a..cd56e721033c948446ee1bb1e151cbac57e878ec 100644 (file)
@@ -276,9 +276,9 @@ void Desktop::sendMouseMove()
             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
index e8086a41cbb5dfbe0ac2b08bd12e466e7ce2d0a7..58ee108b7f5bedcfbdb59520d78d156c8b767b22 100644 (file)
@@ -27,7 +27,8 @@ namespace juce
 {\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
@@ -50,7 +51,15 @@ public:
     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
index 2a1fb141f0b2adc4f028c969fa26da21bce4a5d8..644774631310282b36f920cd747a4205fb77f7c8 100644 (file)
@@ -127,6 +127,8 @@ namespace juce
     };\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
index f497d0385c461a973114571a020ce056a272608e..5eaf306fcb85857b249f86d9f47c4e00d6630762 100644 (file)
@@ -35,7 +35,7 @@
 \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
@@ -158,6 +158,7 @@ namespace juce
     class Displays;\r
     class AccessibilityHandler;\r
     class KeyboardFocusTraverser;\r
+    class PointerState;\r
 \r
     class FlexBox;\r
     class Grid;\r
index b4eb4488cef7b085bcf75b2d574d75d31d5198f8..3789c8c1babd5c90c31b379a2fe6b2cc4fd12f13 100644 (file)
@@ -163,23 +163,23 @@ public:
 \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
@@ -194,7 +194,7 @@ public:
         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
index 9ea63b21518b2f56ab8386a9dafd5ad7acd86f07..4575a13d6f3d03148479dec5456667cddef749a3 100644 (file)
@@ -104,22 +104,29 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* component,
 {\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
index e2fdb6895021a7b2e7d97bcb3bd70aa9e50e2ce2..c24d1e8fdf7d93313e729a2de4ad36805c946bf7 100644 (file)
@@ -738,9 +738,6 @@ private:
 };\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
index 1d685a3cd2add88256a5c365e3eccba643e4cb44..d80e7dc2f660feff8caac442dd8b968647573f5b 100644 (file)
@@ -91,7 +91,7 @@ public:
 \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
@@ -99,9 +99,6 @@ public:
     /** 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
index 9cb29bc9b90c0f342ad8ec72c46e3ee0b13826ec..50ef81284664b31ecc63a37b0e4ce2aa99529b49 100644 (file)
@@ -68,9 +68,7 @@ GridItem::Margin::Margin (float v) noexcept : left (v), right (v), top (v), bott
 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
index 8dffbf36182dbf0aaae2ad74240d397a021e1a16..7da2c089f20f31a2ca1ba753c499fc4a8ad05092 100644 (file)
@@ -128,9 +128,6 @@ public:
     /** 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
index dfccd68ac9ceac79016b317515fd36df9833acf5..b59de1164e6c75ffaa4e07dede69899fc3b7226e 100644 (file)
 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
@@ -36,14 +161,12 @@ Viewport::Viewport (const String& name)  : Component (name)
 \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
@@ -196,132 +319,14 @@ void Viewport::componentMovedOrResized (Component&, bool, bool)
 }\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
index 9738517f332f76ac9a3906a92779e4ab1468998f..77e6700b7cccc8c3517deac7e23ca9d79f5867a2 100644 (file)
@@ -271,16 +271,39 @@ public:
     */\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
@@ -320,6 +343,7 @@ private:
     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
index 7ea997dec359a13c3d3739c054c63e207115807f..bdbe6b97e6c224f2baccfa8edea8e5580ac72ebb 100644 (file)
@@ -2456,7 +2456,7 @@ Button* LookAndFeel_V2::createTabBarExtrasButton()
     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
index 22668e1044a6e3790805617ca5e7ce3684aea6b5..a03e01b6bc2e59e850e2704bdb8a99d7b7e23fe1 100644 (file)
@@ -541,6 +541,7 @@ struct MenuWindow  : public Component
             auto resultID = options.hasWatchedComponentBeenDeleted() ? 0 : getResultItemID (item);\r
 \r
             exitModalState (resultID);\r
+            exitingModalState = true;\r
 \r
             if (makeInvisible && deletionChecker != nullptr)\r
                 setVisible (false);\r
@@ -739,6 +740,9 @@ struct MenuWindow  : public Component
             if (! treeContains (currentlyModalWindow))\r
                 return false;\r
 \r
+        if (exitingModalState)\r
+            return false;\r
+\r
         return true;\r
     }\r
 \r
@@ -1323,6 +1327,7 @@ struct MenuWindow  : public Component
     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
index 95677219b9324ef9a1907004bcb995ab8a01993e..6bb4dcaa546b9103e7a6dbe034a0e88827b66350 100644 (file)
@@ -483,8 +483,8 @@ public:
 \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
@@ -500,7 +500,7 @@ public:
 \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
@@ -508,7 +508,7 @@ public:
 \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
@@ -517,26 +517,26 @@ public:
             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
@@ -547,10 +547,10 @@ public:
             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
@@ -560,7 +560,7 @@ public:
             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
index d0923b0ae9373fc85b5d9ef7d70aad0de5842bf8..47fd8b15502e2ccaebd56bd6498d3201ad8c2949 100644 (file)
@@ -57,10 +57,6 @@ MouseEvent::MouseEvent (MouseInputSource inputSource,
 {\r
 }\r
 \r
-MouseEvent::~MouseEvent() noexcept\r
-{\r
-}\r
-\r
 //==============================================================================\r
 MouseEvent MouseEvent::getEventRelativeTo (Component* const otherComponent) const noexcept\r
 {\r
index d63c2a49c548a46a820da20a20fe86c9a467f858..729a95d79e216e2e5b1d75b5790f33976411e836 100644 (file)
@@ -79,8 +79,11 @@ public:
                 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
@@ -374,8 +377,6 @@ public:
 private:\r
     //==============================================================================\r
     const uint8 numberOfClicks, wasMovedSinceMouseDown;\r
-\r
-    MouseEvent& operator= (const MouseEvent&);\r
 };\r
 \r
 \r
index 449e6530e533d7af9121f120bcd62150f7f674e9..a8ed7b02bbf81ad8ce2b3ad5b475cbfc3808911e 100644 (file)
@@ -57,18 +57,6 @@ public:
         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
@@ -95,7 +83,7 @@ public:
     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
@@ -103,78 +91,80 @@ public:
         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
@@ -192,7 +182,7 @@ public:
                 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
@@ -209,16 +199,16 @@ public:
 \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
@@ -230,12 +220,12 @@ public:
             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
@@ -245,48 +235,50 @@ public:
             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
@@ -299,43 +291,31 @@ public:
                       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
@@ -347,8 +327,9 @@ public:
         ++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
@@ -428,7 +409,7 @@ public:
 \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
@@ -444,7 +425,7 @@ public:
                 // 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
@@ -458,17 +439,17 @@ public:
     {\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
@@ -507,13 +488,9 @@ public:
     //==============================================================================\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
@@ -600,14 +577,14 @@ bool MouseInputSource::isDragging() const noexcept
 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
@@ -698,7 +675,7 @@ struct MouseInputSource::SourceList  : public Timer
         }\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
@@ -763,7 +740,7 @@ struct MouseInputSource::SourceList  : public Timer
             // 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
index 736b8ec7ad8ed35131069a3adad56b4994a7fc3b..07a7358e66529c14e3107c5d1f842a3d904b3395 100644 (file)
@@ -224,16 +224,50 @@ public:
     /** 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
diff --git a/modules/juce_gui_basics/mouse/juce_PointerState.h b/modules/juce_gui_basics/mouse/juce_PointerState.h
new file mode 100644 (file)
index 0000000..767d6f0
--- /dev/null
@@ -0,0 +1,109 @@
+/*\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
index 3c74b331e7d93e0f8ece058469ccc28e86cf8289..a519fd323dfaf7275fc47da4b9c459cd0b35df0b 100644 (file)
@@ -50,12 +50,12 @@ namespace AccessibilityTextHelpers
         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
index eacd2753c5ccd04c4256a77785780a43b3b4fed9..3efbc9dc50a802fe3a1c63429ddcf79c857c7ee0 100644 (file)
@@ -225,8 +225,11 @@ private:
                 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
@@ -435,7 +438,7 @@ private:
 \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
index b188848fde730a2daaa482522e3d1fa86ac4cdfd..15e79845e8d561d4eeb510048bf18ccb6f3a4332 100644 (file)
@@ -71,6 +71,18 @@ protected:
     static AccessibilityTableInterface* getTableInterface (id self) noexcept  { return getInterface (self, &AccessibilityHandler::getTableInterface); }\r
     static AccessibilityCellInterface*  getCellInterface  (id self) noexcept  { return getInterface (self, &AccessibilityHandler::getCellInterface); }\r
 \r
+    template <typename MemberFn>\r
+    static auto getEnclosingInterface (AccessibilityHandler* handler, MemberFn fn) noexcept -> decltype ((std::declval<AccessibilityHandler>().*fn)())\r
+    {\r
+        if (handler == nullptr)\r
+            return nullptr;\r
+\r
+        if (auto* interface = (handler->*fn)())\r
+            return interface;\r
+\r
+        return getEnclosingInterface (handler->getParent(), fn);\r
+    }\r
+\r
     static bool hasEditableText (AccessibilityHandler& handler) noexcept\r
     {\r
         return handler.getRole() == AccessibilityRole::editableText\r
index a116d1aa2e6a0c710d3d3a437014b45e519def41..78d521eb3abd719c413e3d2e0e41c75744b767a2 100644 (file)
@@ -73,7 +73,7 @@ public:
         {\r
             uiaWrapper->disconnectProvider (provider);\r
 \r
-            if (providerCount == 0)\r
+            if (providerCount == 0 && JUCEApplicationBase::isStandaloneApp())\r
                 uiaWrapper->disconnectAllProviders();\r
         }\r
     }\r
index a6ba22a53ca7cecf2fbe7d5f041f0dd72612a40b..7609d0181feb1f03f9a0582d4c85fc173677242e 100644 (file)
@@ -631,6 +631,12 @@ public:
                                                                     (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
@@ -673,8 +679,8 @@ public:
         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
@@ -696,8 +702,8 @@ public:
         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
@@ -717,8 +723,8 @@ public:
         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
@@ -1207,7 +1213,9 @@ private:
             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
index 8ff1ddfc070b25371a25a9355b2afd58cd3a9f94..5f7ffdf429de41858a6293441a81c65b41d36141 100644 (file)
@@ -211,24 +211,25 @@ public:
         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
@@ -957,7 +958,7 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEv
 \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
@@ -982,10 +983,10 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEv
 \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
@@ -993,7 +994,7 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEv
         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
@@ -1010,7 +1011,7 @@ void UIViewComponentPeer::onHover (UIHoverGestureRecognizer* gesture)
     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
index e81cc47ddcd148f0dbdeaaee1d4cb5a6a29ef205..58cd71637989acea7ba0179ea41fc107059c1eef 100644 (file)
@@ -141,11 +141,17 @@ public:
         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
@@ -362,9 +368,14 @@ public:
     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
@@ -504,7 +515,7 @@ private:
 \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
index 1ed8e31ade1352d6e4fd5eaae6f2454e1dace818..902e8f13a1b31f37631dbdc67b284ce07b000d77 100644 (file)
@@ -126,10 +126,11 @@ public:
                            | 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
@@ -429,20 +430,14 @@ public:
         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
@@ -493,12 +488,12 @@ public:
                                     : (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
@@ -506,9 +501,19 @@ public:
             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
@@ -684,7 +689,7 @@ public:
         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
@@ -796,7 +801,7 @@ public:
     {\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
@@ -1094,13 +1099,34 @@ public:
         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
@@ -1163,7 +1189,7 @@ public:
         {\r
             [notificationCenter addObserver: view\r
                                    selector: dismissModalsSelector\r
-                                       name: NSWindowDidMoveNotification\r
+                                       name: NSWindowWillMoveNotification\r
                                      object: currentWindow];\r
 \r
             [notificationCenter addObserver: view\r
@@ -1186,7 +1212,7 @@ public:
     void dismissModals()\r
     {\r
         if (hasNativeTitleBar() || isSharedWindow)\r
-            sendModalInputAttemptIfBlocked();\r
+            sendModalInputAttemptIfBlocked (KeyWindowChanged::no);\r
     }\r
 \r
     void becomeKey()\r
@@ -1197,7 +1223,7 @@ public:
     void resignKey()\r
     {\r
         viewFocusLoss();\r
-        sendModalInputAttemptIfBlocked();\r
+        sendModalInputAttemptIfBlocked (KeyWindowChanged::yes);\r
     }\r
 \r
     void liveResizingStart()\r
@@ -1432,7 +1458,7 @@ public:
         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
@@ -1440,9 +1466,10 @@ public:
         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
@@ -1450,15 +1477,7 @@ public:
             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
@@ -1594,6 +1613,7 @@ public:
     String stringBeingComposed;\r
     NSNotificationCenter* notificationCenter = nil;\r
 \r
+    Rectangle<float> lastSizeBeforeZoom;\r
     RectangleList<float> deferredRepaints;\r
     uint32 lastRepaintTime;\r
 \r
@@ -2190,7 +2210,7 @@ private:
     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
@@ -2203,7 +2223,7 @@ private:
 \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
@@ -2214,7 +2234,7 @@ private:
     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
@@ -2303,6 +2323,7 @@ struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindo
         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
@@ -2321,6 +2342,8 @@ struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindo
 \r
         addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
 \r
+        addMethod (@selector (toggleFullScreen:),                                         toggleFullScreen);\r
+\r
         addProtocol (@protocol (NSWindowDelegate));\r
 \r
         registerClass();\r
@@ -2353,30 +2376,42 @@ private:
        #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
@@ -2459,12 +2494,39 @@ private:
         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
index 2f9778cbb60ac875a8d565611a0b591283f843ad..b3c3fa2b188f54188858ad4857da349c9134faba 100644 (file)
@@ -43,7 +43,15 @@ public:
 \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
@@ -55,15 +63,37 @@ public:
         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
@@ -74,7 +104,7 @@ private:
             [alert addButtonWithTitle: juceStringToNS (button)];\r
     }\r
 \r
-    NSInteger getRawResult() const\r
+    NSAlert* getAlert() const\r
     {\r
         NSAlert* alert = [[[NSAlert alloc] init] autorelease];\r
 \r
@@ -90,7 +120,7 @@ private:
         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
@@ -125,13 +155,14 @@ static int showDialog (const MessageBoxOptions& options,
 #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
@@ -143,20 +174,21 @@ int JUCE_CALLTYPE NativeMessageBox::show (const MessageBoxOptions& options)
 \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
@@ -164,13 +196,14 @@ bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (MessageBoxIconType iconTyp
                          .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
@@ -179,13 +212,14 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (MessageBoxIconType iconT
                          .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
@@ -193,7 +227,8 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (MessageBoxIconType iconType,
                          .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
index c58995d0cc4fba7b014d5cd51a25c1797e1019c9..4ffc09d9a8e318f5fcee364fac1838ab271a2522 100644 (file)
@@ -758,6 +758,11 @@ public:
        #endif\r
     }\r
 \r
+    ~NativeDarkModeChangeDetectorImpl()\r
+    {\r
+        UnhookWindowsHookEx (hook);\r
+    }\r
+\r
     bool isDarkModeEnabled() const noexcept  { return darkModeEnabled; }\r
 \r
 private:\r
@@ -990,7 +995,9 @@ public:
 \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
@@ -1583,6 +1590,13 @@ public:
 \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
@@ -1608,7 +1622,7 @@ public:
         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
@@ -1757,6 +1771,11 @@ public:
         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
@@ -1981,8 +2000,9 @@ public:
     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
@@ -2125,7 +2145,7 @@ private:
    #endif\r
 \r
     double scaleFactor = 1.0;\r
-    int numInDpiChange = 0;\r
+    bool inDpiChange = 0, inHandlePositionChanged = 0;\r
 \r
     bool isAccessibilityActive = false;\r
 \r
@@ -2394,6 +2414,13 @@ private:
         }\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
@@ -2798,8 +2825,8 @@ private:
         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
@@ -2825,7 +2852,7 @@ private:
 \r
             isDragging = true;\r
 \r
-            doMouseEvent (position, MouseInputSource::invalidPressure);\r
+            doMouseEvent (position, MouseInputSource::defaultPressure);\r
         }\r
     }\r
 \r
@@ -2852,7 +2879,7 @@ private:
         // 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
@@ -2874,7 +2901,7 @@ private:
         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
@@ -2991,7 +3018,7 @@ private:
     }\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
@@ -3068,9 +3095,9 @@ private:
                 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
@@ -3083,7 +3110,7 @@ private:
             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
@@ -3114,9 +3141,9 @@ private:
         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
@@ -3131,7 +3158,7 @@ private:
 \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
@@ -3143,7 +3170,7 @@ private:
         }\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
@@ -3151,7 +3178,7 @@ private:
         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
@@ -3448,8 +3475,10 @@ private:
 \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
@@ -3477,15 +3506,27 @@ private:
         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
index 3a5c9f27af090aa515966afd906a53bf5dfb5220..3e24e1f26c97a0bb78283d9d9aeb8122bd0dd71b 100644 (file)
@@ -156,9 +156,10 @@ public:
         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
index 8e9a87d5710d424e7c473419fcaa29db4f3a8401..2ea809908b8e230927ca40e655b412bd675ea55e 100644 (file)
@@ -154,7 +154,7 @@ String XWindowSystemUtilities::Atoms::getName (::Display* display, Atom atom)
     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
@@ -968,7 +968,9 @@ public:
     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
@@ -1744,7 +1746,13 @@ void XWindowSystem::setBounds (::Window windowH, Rectangle<int> newBounds, bool
             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
@@ -1774,7 +1782,14 @@ void XWindowSystem::updateConstraints (::Window windowH, ComponentPeer& peer) co
         }\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
@@ -1802,7 +1817,7 @@ bool XWindowSystem::contains (::Window windowH, Point<int> localPos) const
           && 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
@@ -1824,7 +1839,7 @@ BorderSize<int> XWindowSystem::getBorderSize (::Window windowH) const
                 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
@@ -3185,17 +3200,22 @@ void XWindowSystem::destroyXDisplay()
     {\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
@@ -3459,8 +3479,8 @@ void XWindowSystem::handleButtonPressEvent (LinuxComponentPeer* peer, const XBut
     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
@@ -3509,7 +3529,7 @@ void XWindowSystem::handleButtonReleaseEvent (LinuxComponentPeer* peer, const XB
         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
@@ -3522,8 +3542,8 @@ void XWindowSystem::handleMotionNotifyEvent (LinuxComponentPeer* peer, const XPo
         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
@@ -3535,8 +3555,8 @@ void XWindowSystem::handleEnterNotifyEvent (LinuxComponentPeer* peer, const XEnt
     {\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
@@ -3550,8 +3570,8 @@ void XWindowSystem::handleLeaveNotifyEvent (LinuxComponentPeer* peer, const XLea
     {\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
index 9369f8244af45f2c62f45eee2a0e5e2ac9055d32..587b81e150ea1e09c33c27d0be358b3ed9b98a5c 100644 (file)
@@ -181,8 +181,8 @@ public:
     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
index 5c98a310e1cf0933d1e04e406391334ecb4bc184..0d488e725a13dc2826cc44149c0116c1f250577d 100644 (file)
@@ -107,14 +107,6 @@ public:
             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
@@ -123,7 +115,7 @@ public:
 \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
index 97cf5034d7228024fd6a66be13dd8feaad143766..6a8c08e5e1b259191f366f5ea0f4c6493303adba 100644 (file)
@@ -243,10 +243,7 @@ private:
 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
@@ -534,6 +531,16 @@ void Toolbar::updateAllItemPositions (bool animate)
 }\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
@@ -542,7 +549,7 @@ void Toolbar::showMissingItems()
     {\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
@@ -643,6 +650,7 @@ void Toolbar::itemDropped (const SourceDetails& dragSourceDetails)
 void Toolbar::lookAndFeelChanged()\r
 {\r
     missingItemsButton.reset (getLookAndFeel().createToolbarMissingItemsButton (*this));\r
+    initMissingItemButton();\r
 }\r
 \r
 void Toolbar::mouseDown (const MouseEvent&) {}\r
index 7bb3825a5e64011f817e4fdbe0d20c67b16a4914..992f1bf4528c158d2e8e71dc883990f40091cee2 100644 (file)
@@ -323,6 +323,7 @@ private:
     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
index 305d602385868cc1ad4722e8e2ba53cbd25554bd..ba5e4a8bdda415ef4c96a0cf2d7e23ff13409495 100644 (file)
@@ -40,7 +40,8 @@ static int getItemDepth (const TreeViewItem* item)
 }\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
@@ -78,6 +79,11 @@ public:
         return item;\r
     }\r
 \r
+    String getTooltip() override\r
+    {\r
+        return item.getTooltip();\r
+    }\r
+\r
 private:\r
     //==============================================================================\r
     class ItemAccessibilityHandler  : public AccessibilityHandler\r
@@ -216,8 +222,8 @@ private:
             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
@@ -338,7 +344,7 @@ public:
                 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
index aa4547bbe6121d3bd1065efe8fafc5e9e2846ac6..85f57fc75336fd1a468785f3234b6f17a739af5a 100644 (file)
@@ -363,6 +363,13 @@ public:
     /** 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
index 639e012e7259c0ca094a7d3d6e3720d1dcfc9821..06c0a729db95067692b9b64917b22c3627b579a8 100644 (file)
@@ -76,6 +76,53 @@ public:
 \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
@@ -219,10 +266,25 @@ public:
     */\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
index 4fc4d076db3e44b18d092c8bc5c88790a64eb2b2..6e794793df4cbf0348bca5823f60238b8245cdf4 100644 (file)
@@ -82,6 +82,10 @@ public:
                                 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
@@ -124,6 +128,10 @@ public:
                                 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
@@ -188,6 +196,8 @@ public:
 \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
@@ -196,6 +206,8 @@ public:
     /** 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
index 19571e993e2c0a8f75eb54e96587fa99ebe44b18..f7c3f44cc41b658ba2473fca711ca90ac262d72c 100644 (file)
@@ -68,13 +68,13 @@ public:
 \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
@@ -82,10 +82,10 @@ public:
         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
index d1d009a457eb13581bd17e5f781f6ea1b216cf99..437475c7e5981464023a7b0181733368c0bebfe8 100644 (file)
@@ -532,9 +532,12 @@ String ResizableWindow::getWindowStateAsString()
    #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
@@ -566,10 +569,12 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s)
 \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
@@ -580,7 +585,9 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s)
                                     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
@@ -606,7 +613,9 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s)
 \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
index 8f1eb5de6373fccf004b690aecb25313644ad73e..86435e0f803bc8cff37b44870f1c8525ca33c94b 100644 (file)
@@ -218,6 +218,9 @@ void TooltipWindow::timerCallback()
         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
@@ -246,9 +249,6 @@ void TooltipWindow::timerCallback()
                 showTip();\r
             }\r
         }\r
-\r
-        lastComponentUnderMouse = newComp;\r
-        lastTipUnderMouse = newTip;\r
     }\r
 }\r
 \r
index 72deb74a96871f94e329c58e5b95217fa77fd2e8..34e27fbd246cdb9b9c99818c923768d4bca427d3 100644 (file)
@@ -136,7 +136,7 @@ public:
 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
index b1562373140808cec556e7310f331dfd365a2c90..d78ca233779b9cd19590e608338bd339599297a3 100644 (file)
 #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
index 3a421dc2a9e0f46ec605ff3ac502b746e8ffe1d3..a7ca7529b5df28d7afd6815111d540f7194b2b83 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 9786c087588e58a2305cedaa62efdbee47b5a4de..a11ae05d744a6f7db568dd7b90cc92053c44861d 100644 (file)
@@ -31,10 +31,6 @@ RecentlyOpenedFilesList::RecentlyOpenedFilesList()
 {\r
 }\r
 \r
-RecentlyOpenedFilesList::~RecentlyOpenedFilesList()\r
-{\r
-}\r
-\r
 //==============================================================================\r
 void RecentlyOpenedFilesList::setMaxNumberOfItems (const int newMaxNumber)\r
 {\r
index 7d2208583ee4fbed0667e114df64635fcb536ee1..2bcd7e3050480a3e05f89e9ccf5414a5887158e2 100644 (file)
@@ -46,9 +46,6 @@ public:
     */\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
index 7b9160c7c1383837cdb10b879afd6406e9e9a55d..f52cf472909250ae83442f85cdf1422ee514779f 100644 (file)
@@ -182,7 +182,7 @@ public:
     /** 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
@@ -190,19 +190,19 @@ public:
     /** 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
index 270f3528e38434b0ea51282dac0eede569b84847..0a5ae11fd4c222a13d7d77f68dc5f0fb637727b1 100644 (file)
 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
diff --git a/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h b/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h
new file mode 100644 (file)
index 0000000..62f69a5
--- /dev/null
@@ -0,0 +1,111 @@
+/*\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
index dc33b0c0cf91acd88f0b6d227f16dfe642232f21..ca7537f41eee23f416af0e880c217e132b61c081 100644 (file)
@@ -160,22 +160,22 @@ struct ButtonBasedStatusItem   : public StatusItemContainer
                                    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
@@ -289,20 +289,20 @@ struct ViewBasedStatusItem   : public StatusItemContainer
                 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
index 54da2726f9caf2dca67926acfed0cf3d8e7a3a1d..822907034d284191d22aa227d55c34557c14d58f 100644 (file)
@@ -224,8 +224,8 @@ namespace ActiveXHelpers
                                         { (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
index 629d958a9f92d7f95e71717782b1c770669b3cb9..6bef4160d678652e2de8a819d5738a5f0619086c 100644 (file)
@@ -115,8 +115,8 @@ public:
             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
index 579e3aafbdbda789f2245c645bdbc8b6fdbc471d..56db0f0b5ad3fcdc9a82072ded74bf1b90516ca0 100644 (file)
@@ -609,7 +609,7 @@ private:
         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
index 62f58319b364301878b47c7790e0d369cabbf54b..5f03aa3ef20afd2c5c7c71bef4d803ffc54c9a41 100644 (file)
@@ -35,7 +35,7 @@
 \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
index fb404f6670c555e74cea9a784054cfc5a59a03a8..8445269e342daf63eebe125bfde7df27babef42b 100644 (file)
@@ -248,7 +248,8 @@ public:
     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
index 6ea6ef174b01880b28bc35b96e8d1185cc0156c4..b272a256db115423b12b6d9ebae342b6613f9be3 100644 (file)
@@ -212,7 +212,7 @@ private:
             {\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
index fce1b7634210ebd2cf955414d98a53d6714ee4af..868df91d28621b0dd8801825703e043e16034392 100644 (file)
@@ -91,6 +91,44 @@ static bool contextHasTextureNpotFeature()
 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
@@ -205,8 +243,10 @@ public:
     }\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
@@ -276,10 +316,13 @@ public:
 \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
@@ -290,7 +333,7 @@ public:
         {\r
             if (isUpdating)\r
             {\r
-                paintComponent();\r
+                paintComponent (currentAreaAndScale);\r
 \r
                 if (! hasInitialised)\r
                     return false;\r
@@ -316,7 +359,7 @@ public:
         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
@@ -331,7 +374,7 @@ public:
                         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
@@ -350,10 +393,9 @@ public:
             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
@@ -361,13 +403,13 @@ public:
 \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
@@ -383,17 +425,19 @@ public:
         }\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
@@ -572,15 +616,14 @@ public:
 \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
@@ -617,6 +660,31 @@ public:
         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
@@ -707,13 +775,12 @@ public:
     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
index 54ea447f8a01b12e9c052418e0da5e3939fbb5b4..f4b26e795faf59e940f4bdd4fe66802c111941f8 100644 (file)
@@ -133,6 +133,23 @@ bool OpenGLHelpers::isExtensionSupported (const char* const extensionName)
     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
index 716cec64734ebd7ef59d80a33ef790ad2f6fea01..709b6778daa3ebc4011b85159e38244ea9215f23 100644 (file)
@@ -168,6 +168,9 @@ private:
             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
index d196b31d7ba3da40e4cdc98e47a03759663cebd9..fe0c552adffc449542383de76aa8756652c8cbbe 100644 (file)
@@ -35,7 +35,7 @@
 \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
index f264eb542e10fc7a74586568e047d76d3154a79b..1f0a2e98d14443dbcf92bd8133875217ebecaac8 100644 (file)
@@ -35,7 +35,7 @@
 \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
index 5b2414c84fcc3638e9614996c199929e18e61b82..42529475757e94bb6dd6e5db497d7386cb33835e 100644 (file)
@@ -35,7 +35,7 @@
 \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