New upstream version 5.4.7~ds0
IOhannes m zmölnig
4 years ago
1 | 1 | |
2 | 2 | This file just lists the more notable headline features. For more detailed info |
3 | 3 | about minor changes and bugfixes, please see the git log! |
4 | ||
5 | Version 5.4.7 | |
6 | - Fixed a macOS focus bug causing Components to not receive mouse events | |
7 | - Fixed a potential NullPointerException in the Android IAP code | |
8 | - Fixed an entitlements file generation bug in the Projucer | |
9 | - Send VST2 audioMasterUpdateDisplay opcode on the message thread to fix some hosts not updating | |
10 | - Fixed some build errors and warnings when using Clang on Windows | |
11 | - Changed the default architecture specified in Linux Makefiles generated by the Projucer | |
4 | 12 | |
5 | 13 | Version 5.4.6 |
6 | 14 | - Fixed compatibility with macOS versions below 10.11 |
7 | 7 | add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c") |
8 | 8 | set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression") |
9 | 9 | |
10 | add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY=\"com/roli/juce/JuceActivity\"" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.4.6" "-DJUCE_APP_VERSION_HEX=0x50406") | |
10 | add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY=\"com/roli/juce/JuceActivity\"" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.4.7" "-DJUCE_APP_VERSION_HEX=0x50407") | |
11 | 11 | |
12 | 12 | include_directories( AFTER |
13 | 13 | "../../../JuceLibraryCode" |
0 | 0 | <?xml version="1.0" encoding="utf-8"?> |
1 | 1 | |
2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.4.6" | |
2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.4.7" | |
3 | 3 | package="com.juce.demorunner"> |
4 | 4 | <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/> |
5 | 5 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.6 -DJUCE_APP_VERSION_HEX=0x50406 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.7 -DJUCE_APP_VERSION_HEX=0x50407 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
38 | 38 | 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 |
39 | 39 | JUCE_TARGET_APP := DemoRunner |
40 | 40 | |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.6 -DJUCE_APP_VERSION_HEX=0x50406 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.7 -DJUCE_APP_VERSION_HEX=0x50407 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
59 | 59 | 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 |
60 | 60 | JUCE_TARGET_APP := DemoRunner |
61 | 61 |
933 | 933 | "JUCE_DEMO_RUNNER=1", |
934 | 934 | "JUCE_UNIT_TESTS=1", |
935 | 935 | "JUCER_XCODE_MAC_F6D2F4CF=1", |
936 | "JUCE_APP_VERSION=5.4.6", | |
937 | "JUCE_APP_VERSION_HEX=0x50406", | |
936 | "JUCE_APP_VERSION=5.4.7", | |
937 | "JUCE_APP_VERSION_HEX=0x50407", | |
938 | 938 | "JucePlugin_Build_VST=0", |
939 | 939 | "JucePlugin_Build_VST3=0", |
940 | 940 | "JucePlugin_Build_AU=0", |
979 | 979 | "JUCE_DEMO_RUNNER=1", |
980 | 980 | "JUCE_UNIT_TESTS=1", |
981 | 981 | "JUCER_XCODE_MAC_F6D2F4CF=1", |
982 | "JUCE_APP_VERSION=5.4.6", | |
983 | "JUCE_APP_VERSION_HEX=0x50406", | |
982 | "JUCE_APP_VERSION=5.4.7", | |
983 | "JUCE_APP_VERSION_HEX=0x50407", | |
984 | 984 | "JucePlugin_Build_VST=0", |
985 | 985 | "JucePlugin_Build_VST3=0", |
986 | 986 | "JucePlugin_Build_AU=0", |
21 | 21 | <key>CFBundleSignature</key> |
22 | 22 | <string>????</string> |
23 | 23 | <key>CFBundleShortVersionString</key> |
24 | <string>5.4.6</string> | |
24 | <string>5.4.7</string> | |
25 | 25 | <key>CFBundleVersion</key> |
26 | <string>5.4.6</string> | |
26 | <string>5.4.7</string> | |
27 | 27 | <key>NSHumanReadableCopyright</key> |
28 | 28 | <string>Copyright (c) 2018 - ROLI Ltd.</string> |
29 | 29 | <key>NSHighResolutionCapable</key> |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "DemoRunner\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "DemoRunner\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "DemoRunner\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "DemoRunner\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "DemoRunner\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "DemoRunner\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
918 | 918 | "JUCE_DEMO_RUNNER=1", |
919 | 919 | "JUCE_UNIT_TESTS=1", |
920 | 920 | "JUCER_XCODE_IPHONE_5BC26AE3=1", |
921 | "JUCE_APP_VERSION=5.4.6", | |
922 | "JUCE_APP_VERSION_HEX=0x50406", | |
921 | "JUCE_APP_VERSION=5.4.7", | |
922 | "JUCE_APP_VERSION_HEX=0x50407", | |
923 | 923 | "JucePlugin_Build_VST=0", |
924 | 924 | "JucePlugin_Build_VST3=0", |
925 | 925 | "JucePlugin_Build_AU=0", |
965 | 965 | "JUCE_DEMO_RUNNER=1", |
966 | 966 | "JUCE_UNIT_TESTS=1", |
967 | 967 | "JUCER_XCODE_IPHONE_5BC26AE3=1", |
968 | "JUCE_APP_VERSION=5.4.6", | |
969 | "JUCE_APP_VERSION_HEX=0x50406", | |
968 | "JUCE_APP_VERSION=5.4.7", | |
969 | "JUCE_APP_VERSION_HEX=0x50407", | |
970 | 970 | "JucePlugin_Build_VST=0", |
971 | 971 | "JucePlugin_Build_VST3=0", |
972 | 972 | "JucePlugin_Build_AU=0", |
29 | 29 | <key>CFBundleSignature</key> |
30 | 30 | <string>????</string> |
31 | 31 | <key>CFBundleShortVersionString</key> |
32 | <string>5.4.6</string> | |
32 | <string>5.4.7</string> | |
33 | 33 | <key>CFBundleVersion</key> |
34 | <string>5.4.6</string> | |
34 | <string>5.4.7</string> | |
35 | 35 | <key>NSHumanReadableCopyright</key> |
36 | 36 | <string>Copyright (c) 2018 - ROLI Ltd.</string> |
37 | 37 | <key>NSHighResolutionCapable</key> |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | <JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.4.6" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1" | |
3 | bundleIdentifier="com.juce.demorunner" version="5.4.6" companyName="ROLI Ltd." | |
2 | <JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.4.7" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1" | |
3 | bundleIdentifier="com.juce.demorunner" version="5.4.7" companyName="ROLI Ltd." | |
4 | 4 | companyCopyright="Copyright (c) 2018 - ROLI Ltd." companyWebsite="https://www.juce.com/" |
5 | companyEmail="info@juce.com" id="yj7xMM" reportAppUsage="1"> | |
5 | companyEmail="info@juce.com" id="yj7xMM" reportAppUsage="0"> | |
6 | 6 | <MAINGROUP id="G8kbr7" name="DemoRunner"> |
7 | 7 | <GROUP id="{20E3F84A-29E9-D5FF-4559-1A9E4A70CD60}" name="Source"> |
8 | 8 | <GROUP id="{272A692A-6AFE-68BD-C8E8-63B3D62245B1}" name="Demos"> |
39 | 39 | #endif |
40 | 40 | |
41 | 41 | #ifndef JUCE_REPORT_APP_USAGE |
42 | #define JUCE_REPORT_APP_USAGE 1 | |
42 | #define JUCE_REPORT_APP_USAGE 0 | |
43 | 43 | #endif |
44 | 44 | |
45 | 45 | // END SECTION A |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_analytics 1 |
55 | 55 | { |
56 | 56 | const char* const projectName = "DemoRunner"; |
57 | 57 | const char* const companyName = "ROLI Ltd."; |
58 | const char* const versionString = "5.4.6"; | |
59 | const int versionNumber = 0x50406; | |
58 | const char* const versionString = "5.4.7"; | |
59 | const int versionNumber = 0x50407; | |
60 | 60 | } |
61 | 61 | #endif |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="AKfc5m" name="AudioPerformanceTest" projectType="guiapp" |
3 | bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.4.6" | |
3 | bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.4.7" | |
4 | 4 | displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd." |
5 | 5 | companyCopyright="ROLI Ltd."> |
6 | 6 | <MAINGROUP id="b1eVTe" name="AudioPerformanceTest"> |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | 37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | 58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="NTe0XB0ij" name="AudioPluginHost" projectType="guiapp" version="1.0.0" |
3 | 3 | juceFolder="../../../juce" bundleIdentifier="com.roli.juce.pluginhost" |
4 | jucerVersion="5.4.6" companyName="ROLI Ltd." displaySplashScreen="0" | |
4 | jucerVersion="5.4.7" companyName="ROLI Ltd." displaySplashScreen="0" | |
5 | 5 | reportAppUsage="0" companyCopyright="ROLI Ltd."> |
6 | 6 | <EXPORTFORMATS> |
7 | 7 | <XCODE_MAC targetFolder="Builds/MacOSX" rtasFolder="~/SDKs/PT_80_SDK" objCExtraSuffix="M73TRi" |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | 37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | 58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
48 | 48 | |
49 | 49 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
50 | 50 | |
51 | #define JUCE_PROJUCER_VERSION 0x50406 | |
51 | #define JUCE_PROJUCER_VERSION 0x50407 | |
52 | 52 | |
53 | 53 | //============================================================================== |
54 | 54 | #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="3t6YqETY1" name="BinaryBuilder" projectType="consoleapp" |
3 | juceFolder="../../../juce" jucerVersion="5.4.6" bundleIdentifier="com.roli.binarybuilder" | |
3 | juceFolder="../../../juce" jucerVersion="5.4.7" bundleIdentifier="com.roli.binarybuilder" | |
4 | 4 | displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd." |
5 | 5 | companyCopyright="ROLI Ltd."> |
6 | 6 | <EXPORTFORMATS> |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | 37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=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) |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | 58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=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) |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_core 1 |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | 37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | 58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="gWI5Ir" name="NetworkGraphicsDemo" projectType="guiapp" bundleIdentifier="com.juce.NetworkGraphicsDemo" |
3 | jucerVersion="5.4.6" displaySplashScreen="0" reportAppUsage="0" | |
3 | jucerVersion="5.4.7" displaySplashScreen="0" reportAppUsage="0" | |
4 | 4 | companyName="ROLI Ltd." companyCopyright="ROLI Ltd."> |
5 | 5 | <MAINGROUP id="OT9rJ2" name="NetworkGraphicsDemo"> |
6 | 6 | <GROUP id="{48D54E6E-37F4-B20A-E038-C63E4EDFD4D9}" name="Source"> |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.6 -DJUCE_APP_VERSION_HEX=0x50406 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.7 -DJUCE_APP_VERSION_HEX=0x50407 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
38 | 38 | 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 |
39 | 39 | JUCE_TARGET_APP := Projucer |
40 | 40 | |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.6 -DJUCE_APP_VERSION_HEX=0x50406 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.7 -DJUCE_APP_VERSION_HEX=0x50407 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |
59 | 59 | 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 |
60 | 60 | JUCE_TARGET_APP := Projucer |
61 | 61 |
2 | 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
3 | 3 | <plist> |
4 | 4 | <dict> |
5 | <key>NSAppTransportSecurity</key> | |
6 | <dict> | |
7 | <key>NSAllowsArbitraryLoads</key> | |
8 | <true/> | |
9 | <key>NSExceptionDomains</key> | |
10 | <dict> | |
11 | <key>amazonaws.com</key> | |
12 | <dict> | |
13 | <key>NSExceptionAllowsInsecureHTTPLoads</key> | |
14 | <true/> | |
15 | <key>NSIncludesSubdomains</key> | |
16 | <true/> | |
17 | </dict> | |
18 | </dict> | |
19 | </dict> | |
20 | 5 | <key>NSMicrophoneUsageDescription</key> |
21 | 6 | <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string> |
22 | 7 | <key>NSCameraUsageDescription</key> |
36 | 21 | <key>CFBundleSignature</key> |
37 | 22 | <string>????</string> |
38 | 23 | <key>CFBundleShortVersionString</key> |
39 | <string>5.4.6</string> | |
24 | <string>5.4.7</string> | |
40 | 25 | <key>CFBundleVersion</key> |
41 | <string>5.4.6</string> | |
26 | <string>5.4.7</string> | |
42 | 27 | <key>NSHumanReadableCopyright</key> |
43 | 28 | <string>ROLI Ltd.</string> |
44 | 29 | <key>NSHighResolutionCapable</key> |
3227 | 3227 | "_DEBUG=1", |
3228 | 3228 | "DEBUG=1", |
3229 | 3229 | "JUCER_XCODE_MAC_F6D2F4CF=1", |
3230 | "JUCE_APP_VERSION=5.4.6", | |
3231 | "JUCE_APP_VERSION_HEX=0x50406", | |
3230 | "JUCE_APP_VERSION=5.4.7", | |
3231 | "JUCE_APP_VERSION_HEX=0x50407", | |
3232 | 3232 | "JucePlugin_Build_VST=0", |
3233 | 3233 | "JucePlugin_Build_VST3=0", |
3234 | 3234 | "JucePlugin_Build_AU=0", |
3271 | 3271 | "_NDEBUG=1", |
3272 | 3272 | "NDEBUG=1", |
3273 | 3273 | "JUCER_XCODE_MAC_F6D2F4CF=1", |
3274 | "JUCE_APP_VERSION=5.4.6", | |
3275 | "JUCE_APP_VERSION_HEX=0x50406", | |
3274 | "JUCE_APP_VERSION=5.4.7", | |
3275 | "JUCE_APP_VERSION_HEX=0x50407", | |
3276 | 3276 | "JucePlugin_Build_VST=0", |
3277 | 3277 | "JucePlugin_Build_VST3=0", |
3278 | 3278 | "JucePlugin_Build_AU=0", |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "Projucer\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "Projucer\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "Projucer\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "Projucer\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
63 | 63 | <Optimization>Disabled</Optimization> |
64 | 64 | <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
65 | 65 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
66 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
67 | 67 | <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> |
68 | 68 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
69 | 69 | <PrecompiledHeader/> |
105 | 105 | <ClCompile> |
106 | 106 | <Optimization>Full</Optimization> |
107 | 107 | <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.6;JUCE_APP_VERSION_HEX=0x50406;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> | |
108 | <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=5.4.7;JUCE_APP_VERSION_HEX=0x50407;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> | |
109 | 109 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> |
110 | 110 | <RuntimeTypeInfo>true</RuntimeTypeInfo> |
111 | 111 | <PrecompiledHeader/> |
6 | 6 | #include <windows.h> |
7 | 7 | |
8 | 8 | VS_VERSION_INFO VERSIONINFO |
9 | FILEVERSION 5,4,6,0 | |
9 | FILEVERSION 5,4,7,0 | |
10 | 10 | BEGIN |
11 | 11 | BLOCK "StringFileInfo" |
12 | 12 | BEGIN |
15 | 15 | VALUE "CompanyName", "ROLI Ltd.\0" |
16 | 16 | VALUE "LegalCopyright", "ROLI Ltd.\0" |
17 | 17 | VALUE "FileDescription", "Projucer\0" |
18 | VALUE "FileVersion", "5.4.6\0" | |
18 | VALUE "FileVersion", "5.4.7\0" | |
19 | 19 | VALUE "ProductName", "Projucer\0" |
20 | VALUE "ProductVersion", "5.4.6\0" | |
20 | VALUE "ProductVersion", "5.4.7\0" | |
21 | 21 | END |
22 | 22 | END |
23 | 23 |
65 | 65 | |
66 | 66 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
67 | 67 | |
68 | #define JUCE_PROJUCER_VERSION 0x50406 | |
68 | #define JUCE_PROJUCER_VERSION 0x50407 | |
69 | 69 | |
70 | 70 | //============================================================================== |
71 | 71 | #define JUCE_MODULE_AVAILABLE_juce_analytics 1 |
44 | 44 | { |
45 | 45 | const char* const projectName = "Projucer"; |
46 | 46 | const char* const companyName = "ROLI Ltd."; |
47 | const char* const versionString = "5.4.6"; | |
48 | const int versionNumber = 0x50406; | |
47 | const char* const versionString = "5.4.7"; | |
48 | const int versionNumber = 0x50407; | |
49 | 49 | } |
50 | 50 | #endif |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce" |
3 | jucerVersion="5.4.6" version="5.4.6" bundleIdentifier="com.juce.theprojucer" | |
3 | jucerVersion="5.4.7" version="5.4.7" bundleIdentifier="com.juce.theprojucer" | |
4 | 4 | splashScreenColour="Dark" displaySplashScreen="0" reportAppUsage="0" |
5 | 5 | companyName="ROLI Ltd." companyCopyright="ROLI Ltd." cppLanguageStandard="11"> |
6 | 6 | <EXPORTFORMATS> |
7 | 7 | <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" |
8 | 8 | documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="rv1F4h" |
9 | customPList="<plist> <dict> 	<key>NSAppTransportSecurity</key> 	<dict> 		<key>NSAllowsArbitraryLoads</key> 		<true/> 		<key>NSExceptionDomains</key> 		<dict> 			<key>amazonaws.com</key> 			<dict> 				<key>NSExceptionAllowsInsecureHTTPLoads</key> 				<true/> 				<key>NSIncludesSubdomains</key> 				<true/> 			</dict> 		</dict> 	</dict> </dict> </plist>" | |
10 | 9 | extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime" |
11 | 10 | microphonePermissionNeeded="1" cameraPermissionNeeded="1"> |
12 | 11 | <CONFIGURATIONS> |
74 | 74 | auto juceValue = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()); |
75 | 75 | auto userValue = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()); |
76 | 76 | |
77 | auto jucePathNeedsScanning = (! juceValue.isUsingDefault() && juceValue.get() != lastJUCEModulePath); | |
78 | auto userPathNeedsScanning = (! userValue.isUsingDefault() && userValue.get() != lastUserModulePath); | |
79 | ||
80 | if (jucePathNeedsScanning) | |
81 | ProjucerApplication::getApp().rescanJUCEPathModules(); | |
82 | ||
83 | if (userPathNeedsScanning) | |
84 | ProjucerApplication::getApp().rescanUserPathModules(); | |
77 | if (juceValue.get() != lastJUCEModulePath) ProjucerApplication::getApp().rescanJUCEPathModules(); | |
78 | if (userValue.get() != lastUserModulePath) ProjucerApplication::getApp().rescanUserPathModules(); | |
85 | 79 | } |
86 | 80 | |
87 | 81 | void paint (Graphics& g) override |
255 | 255 | build.setGlobalDefs (getGlobalDefs()); |
256 | 256 | build.setCompileFlags (project.getCompileEngineSettings().getExtraCompilerFlagsString()); |
257 | 257 | build.setExtraDLLs (getExtraDLLs()); |
258 | build.setJuceModulesFolder (EnabledModuleList::findDefaultModulesFolder (project).getFullPathName()); | |
258 | build.setJuceModulesFolder (project.getEnabledModules().getDefaultModulesFolder().getFullPathName()); | |
259 | 259 | |
260 | 260 | build.setUtilsCppInclude (project.getAppIncludeFile().getFullPathName()); |
261 | 261 | |
387 | 387 | { |
388 | 388 | for (auto* m : modules) |
389 | 389 | { |
390 | auto localModuleFolder = proj.getEnabledModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue() | |
391 | ? proj.getLocalModuleFolder (m->moduleInfo.getID()) | |
392 | : m->moduleInfo.getFolder(); | |
393 | ||
390 | auto copyLocally = proj.getEnabledModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()); | |
391 | ||
392 | auto localModuleFolder = copyLocally ? proj.getLocalModuleFolder (m->moduleInfo.getID()) | |
393 | : m->moduleInfo.getFolder(); | |
394 | 394 | |
395 | 395 | m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, |
396 | 396 | isPluginProject || isVSTHost ? ProjectType::Target::SharedCodeTarget |
152 | 152 | group.properties.clear(); |
153 | 153 | exporterModulePathDefaultValues.clear(); |
154 | 154 | exporterModulePathValues.clear(); |
155 | globalPathValues.clear(); | |
155 | 156 | |
156 | 157 | for (Project::ExporterIterator exporter (project); exporter.next();) |
157 | 158 | { |
178 | 179 | "This can be an absolute path, or relative to the jucer project folder, but it " |
179 | 180 | "must be valid on the filesystem of the target machine that will be performing this build. If this " |
180 | 181 | "is empty then the global path will be used."); |
182 | ||
183 | globalPathValues.add (getAppSettings().getStoredPath (isJUCEModule (moduleID) ? Ids::defaultJuceModulePath : Ids::defaultUserModulePath, | |
184 | exporter->getTargetOSForExporter()).getPropertyAsValue()); | |
181 | 185 | } |
182 | 186 | |
183 | 187 | for (int i = 0; i < exporterModulePathDefaultValues.size(); ++i) |
184 | 188 | { |
185 | 189 | exporterModulePathDefaultValues.getReference (i).onDefaultChange = [this] { startTimer (50); }; |
190 | ||
186 | 191 | exporterModulePathValues.getReference (i).addListener (this); |
187 | } | |
188 | ||
189 | globalPathValue.removeListener (this); | |
190 | globalPathValue.referTo (modules.getShouldUseGlobalPathValue (moduleID)); | |
191 | globalPathValue.addListener (this); | |
192 | globalPathValues.getReference (i).addListener (this); | |
193 | } | |
194 | ||
195 | useGlobalPathValue.removeListener (this); | |
196 | useGlobalPathValue.referTo (modules.shouldUseGlobalPathValue (moduleID)); | |
197 | useGlobalPathValue.addListener (this); | |
192 | 198 | |
193 | 199 | auto menuItemString = (TargetOS::getThisOS() == TargetOS::osx ? "\"Projucer->Global Paths...\"" |
194 | 200 | : "\"File->Global Paths...\""); |
195 | 201 | |
196 | props.add (new BooleanPropertyComponent (globalPathValue, | |
202 | props.add (new BooleanPropertyComponent (useGlobalPathValue, | |
197 | 203 | "Use global path", "Use global path for this module"), |
198 | 204 | String ("If this is enabled, then the locally-stored global path (set in the ") + menuItemString + " menu item) " |
199 | 205 | "will be used as the path to this module. " |
200 | 206 | "This means that if this Projucer project is opened on another machine it will use that machine's global path as the path to this module."); |
201 | 207 | |
202 | props.add (new BooleanPropertyComponent (modules.shouldCopyModuleFilesLocally (moduleID), | |
208 | props.add (new BooleanPropertyComponent (modules.shouldCopyModuleFilesLocallyValue (moduleID), | |
203 | 209 | "Create local copy", "Copy the module into the project folder"), |
204 | 210 | "If this is enabled, then a local copy of the entire module will be made inside your project (in the auto-generated JuceLibraryFiles folder), " |
205 | 211 | "so that your project will be self-contained, and won't need to contain any references to files in other folders. " |
206 | 212 | "This also means that you can check the module into your source-control system to make sure it is always in sync with your own code."); |
207 | 213 | |
208 | props.add (new BooleanPropertyComponent (modules.shouldShowAllModuleFilesInProject (moduleID), | |
214 | props.add (new BooleanPropertyComponent (modules.shouldShowAllModuleFilesInProjectValue (moduleID), | |
209 | 215 | "Add source to project", "Make module files browsable in projects"), |
210 | 216 | "If this is enabled, then the entire source tree from this module will be shown inside your project, " |
211 | 217 | "making it easy to browse/edit the module's classes. If disabled, then only the minimum number of files " |
261 | 267 | |
262 | 268 | //============================================================================== |
263 | 269 | Array<ValueWithDefault> exporterModulePathDefaultValues; |
264 | Array<Value> exporterModulePathValues; | |
265 | Value globalPathValue; | |
270 | Array<Value> exporterModulePathValues, globalPathValues; | |
271 | Value useGlobalPathValue; | |
266 | 272 | |
267 | 273 | OwnedArray <Project::ConfigFlag> configFlags; |
268 | 274 | |
474 | 480 | public: |
475 | 481 | EnabledModulesItem (Project& p) |
476 | 482 | : project (p), |
477 | moduleListTree (p.getEnabledModules().state) | |
483 | moduleListTree (project.getEnabledModules().getState()) | |
478 | 484 | { |
479 | 485 | moduleListTree.addListener (this); |
480 | 486 | |
617 | 623 | } |
618 | 624 | else if (resultCode > 0) |
619 | 625 | { |
620 | std::vector<ModuleIDAndFolder> list; | |
626 | std::vector<AvailableModuleList::ModuleIDAndFolder> list; | |
621 | 627 | int offset = -1; |
622 | 628 | |
623 | 629 | if (resultCode < 200) |
34 | 34 | public: |
35 | 35 | ModulesInformationComponent (Project& p) |
36 | 36 | : project (p), |
37 | modulesValueTree (p.getEnabledModules().state) | |
37 | modulesValueTree (project.getEnabledModules().getState()) | |
38 | 38 | { |
39 | 39 | listHeader = new ListBoxHeader ( { "Module", "Version", "Make Local Copy", "Paths" }, |
40 | 40 | { 0.25f, 0.2f, 0.2f, 0.35f } ); |
134 | 134 | g.drawFittedText (version, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (1) * width)), Justification::centredLeft, 1); |
135 | 135 | |
136 | 136 | //============================================================================== |
137 | auto copyLocally = project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue() ? "Yes" : "No"; | |
138 | ||
139 | g.drawFittedText (copyLocally, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (2) * width)), Justification::centredLeft, 1); | |
137 | g.drawFittedText (String (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID) ? "Yes" : "No"), | |
138 | bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (2) * width)), Justification::centredLeft, 1); | |
140 | 139 | |
141 | 140 | //============================================================================== |
142 | 141 | String pathText; |
214 | 213 | repaint(); |
215 | 214 | } |
216 | 215 | |
216 | static void setLocalCopyModeForAllModules (Project& project, bool copyLocally) | |
217 | { | |
218 | auto& modules = project.getEnabledModules(); | |
219 | ||
220 | for (auto i = modules.getNumModules(); --i >= 0;) | |
221 | modules.shouldCopyModuleFilesLocallyValue (modules.getModuleID (i)) = copyLocally; | |
222 | } | |
223 | ||
217 | 224 | void showCopyModeMenu() |
218 | 225 | { |
219 | 226 | PopupMenu m; |
220 | 227 | |
221 | 228 | m.addItem (PopupMenu::Item ("Set all modules to copy locally") |
222 | .setAction ([&] { project.getEnabledModules().setLocalCopyModeForAllModules (true); })); | |
229 | .setAction ([&] { setLocalCopyModeForAllModules (project, true); })); | |
223 | 230 | |
224 | 231 | m.addItem (PopupMenu::Item ("Set all modules to not copy locally") |
225 | .setAction ([&] { project.getEnabledModules().setLocalCopyModeForAllModules (false); })); | |
232 | .setAction ([&] { setLocalCopyModeForAllModules (project, false); })); | |
226 | 233 | |
227 | 234 | m.showMenuAsync (PopupMenu::Options().withTargetComponent (setCopyModeButton)); |
228 | 235 | } |
229 | 236 | |
230 | 237 | static void setAllModulesToUseGlobalPaths (Project& project, bool useGlobal) |
231 | 238 | { |
232 | auto& moduleList = project.getEnabledModules(); | |
233 | ||
234 | for (auto id : moduleList.getAllModules()) | |
235 | moduleList.getShouldUseGlobalPathValue (id).setValue (useGlobal); | |
239 | auto& modules = project.getEnabledModules(); | |
240 | ||
241 | for (auto moduleID : modules.getAllModules()) | |
242 | modules.shouldUseGlobalPathValue (moduleID) = useGlobal; | |
236 | 243 | } |
237 | 244 | |
238 | 245 | static void setSelectedModulesToUseGlobalPaths (Project& project, SparseSet<int> selected, bool useGlobal) |
239 | 246 | { |
240 | auto& moduleList = project.getEnabledModules(); | |
247 | auto& modules = project.getEnabledModules(); | |
241 | 248 | |
242 | 249 | for (int i = 0; i < selected.size(); ++i) |
243 | moduleList.getShouldUseGlobalPathValue (moduleList.getModuleID (selected[i])).setValue (useGlobal); | |
250 | modules.shouldUseGlobalPathValue (modules.getModuleID (selected[i])) = useGlobal; | |
244 | 251 | } |
245 | 252 | |
246 | 253 | void showGlobalPathsMenu() |
39 | 39 | { |
40 | 40 | if (moduleFolder != File()) |
41 | 41 | { |
42 | const char* extensions[] = { ".h", ".hpp", ".hxx" }; | |
42 | static const char* extensions[] = { ".h", ".hpp", ".hxx" }; | |
43 | 43 | |
44 | 44 | for (auto e : extensions) |
45 | 45 | { |
55 | 55 | |
56 | 56 | StringArray ModuleDescription::getDependencies() const |
57 | 57 | { |
58 | auto deps = StringArray::fromTokens (moduleInfo ["dependencies"].toString(), " \t;,", "\"'"); | |
59 | deps.trim(); | |
60 | deps.removeEmptyStrings(); | |
61 | return deps; | |
58 | auto moduleDependencies = StringArray::fromTokens (moduleInfo ["dependencies"].toString(), " \t;,", "\"'"); | |
59 | moduleDependencies.trim(); | |
60 | moduleDependencies.removeEmptyStrings(); | |
61 | ||
62 | return moduleDependencies; | |
62 | 63 | } |
63 | 64 | |
64 | 65 | //============================================================================== |
65 | static bool tryToAddModuleFromFolder (const File& path, ModuleIDAndFolderList& list) | |
66 | static bool tryToAddModuleFromFolder (const File& path, AvailableModuleList::ModuleIDAndFolderList& list) | |
66 | 67 | { |
67 | 68 | ModuleDescription m (path); |
68 | 69 | |
75 | 76 | return false; |
76 | 77 | } |
77 | 78 | |
78 | static void addAllModulesInSubfoldersRecursively (const File& path, int depth, ModuleIDAndFolderList& list) | |
79 | static void addAllModulesInSubfoldersRecursively (const File& path, int depth, AvailableModuleList::ModuleIDAndFolderList& list) | |
79 | 80 | { |
80 | 81 | if (depth > 0) |
81 | 82 | { |
93 | 94 | } |
94 | 95 | } |
95 | 96 | |
96 | static void addAllModulesInFolder (const File& path, ModuleIDAndFolderList& list) | |
97 | static void addAllModulesInFolder (const File& path, AvailableModuleList::ModuleIDAndFolderList& list) | |
97 | 98 | { |
98 | 99 | if (! tryToAddModuleFromFolder (path, list)) |
99 | 100 | { |
100 | int subfolders = 3; | |
101 | static constexpr int subfolders = 3; | |
101 | 102 | addAllModulesInSubfoldersRecursively (path, subfolders, list); |
102 | 103 | } |
103 | 104 | } |
104 | 105 | |
105 | static void sort (ModuleIDAndFolderList& listToSort) | |
106 | { | |
107 | std::sort (listToSort.begin(), listToSort.end(), [] (const ModuleIDAndFolder& m1, const ModuleIDAndFolder& m2) | |
108 | { | |
109 | return m1.first.compareIgnoreCase (m2.first) < 0; | |
110 | }); | |
111 | } | |
112 | ||
113 | //============================================================================== | |
114 | struct ModuleScannerJob : public ThreadPoolJob | |
115 | { | |
116 | ModuleScannerJob (const Array<File>& paths, std::function<void (const ModuleIDAndFolderList&)>&& callback) | |
106 | struct ModuleScannerJob : public ThreadPoolJob | |
107 | { | |
108 | ModuleScannerJob (const Array<File>& paths, | |
109 | std::function<void (const AvailableModuleList::ModuleIDAndFolderList&)>&& callback) | |
117 | 110 | : ThreadPoolJob ("ModuleScannerJob"), |
118 | 111 | pathsToScan (paths), |
119 | 112 | completionCallback (std::move (callback)) |
122 | 115 | |
123 | 116 | JobStatus runJob() override |
124 | 117 | { |
125 | ModuleIDAndFolderList list; | |
118 | AvailableModuleList::ModuleIDAndFolderList list; | |
126 | 119 | |
127 | 120 | for (auto& p : pathsToScan) |
128 | 121 | addAllModulesInFolder (p, list); |
129 | 122 | |
130 | 123 | if (! shouldExit()) |
131 | 124 | { |
132 | sort (list); | |
125 | std::sort (list.begin(), list.end(), [] (const AvailableModuleList::ModuleIDAndFolder& m1, | |
126 | const AvailableModuleList::ModuleIDAndFolder& m2) | |
127 | { | |
128 | return m1.first.compareIgnoreCase (m2.first) < 0; | |
129 | }); | |
130 | ||
133 | 131 | completionCallback (list); |
134 | 132 | } |
135 | 133 | |
137 | 135 | } |
138 | 136 | |
139 | 137 | Array<File> pathsToScan; |
140 | std::function<void (const ModuleIDAndFolderList&)> completionCallback; | |
138 | std::function<void (const AvailableModuleList::ModuleIDAndFolderList&)> completionCallback; | |
141 | 139 | }; |
142 | 140 | |
143 | AvailableModuleList::AvailableModuleList() | |
144 | { | |
145 | } | |
146 | ||
147 | 141 | ThreadPoolJob* AvailableModuleList::createScannerJob (const Array<File>& paths) |
148 | 142 | { |
149 | return new ModuleScannerJob (paths, [this] (ModuleIDAndFolderList scannedModuleList) | |
143 | return new ModuleScannerJob (paths, [this] (AvailableModuleList::ModuleIDAndFolderList scannedModuleList) | |
150 | 144 | { |
151 | 145 | { |
152 | 146 | const ScopedLock swapLock (lock); |
176 | 170 | removePendingAndAddJob (createScannerJob (paths)); |
177 | 171 | } |
178 | 172 | |
179 | ModuleIDAndFolderList AvailableModuleList::getAllModules() const | |
173 | AvailableModuleList::ModuleIDAndFolderList AvailableModuleList::getAllModules() const | |
180 | 174 | { |
181 | 175 | const ScopedLock readLock (lock); |
182 | ||
183 | 176 | return moduleList; |
184 | 177 | } |
185 | 178 | |
186 | ModuleIDAndFolder AvailableModuleList::getModuleWithID (const String& id) const | |
179 | AvailableModuleList::ModuleIDAndFolder AvailableModuleList::getModuleWithID (const String& id) const | |
187 | 180 | { |
188 | 181 | const ScopedLock readLock (lock); |
189 | 182 | |
213 | 206 | { |
214 | 207 | } |
215 | 208 | |
216 | //============================================================================== | |
217 | 209 | void LibraryModule::writeIncludes (ProjectSaver& projectSaver, OutputStream& out) |
218 | 210 | { |
219 | 211 | auto& project = projectSaver.project; |
220 | 212 | auto& modules = project.getEnabledModules(); |
221 | 213 | |
222 | auto id = getID(); | |
223 | ||
224 | if (modules.shouldCopyModuleFilesLocally (id).getValue()) | |
214 | auto moduleID = getID(); | |
215 | ||
216 | if (modules.shouldCopyModuleFilesLocally (moduleID)) | |
225 | 217 | { |
226 | 218 | auto juceModuleFolder = moduleInfo.getFolder(); |
227 | 219 | |
228 | auto localModuleFolder = project.getLocalModuleFolder (id); | |
220 | auto localModuleFolder = project.getLocalModuleFolder (moduleID); | |
229 | 221 | localModuleFolder.createDirectory(); |
230 | 222 | projectSaver.copyFolder (juceModuleFolder, localModuleFolder); |
231 | 223 | } |
235 | 227 | << ">" << newLine; |
236 | 228 | } |
237 | 229 | |
238 | //============================================================================== | |
239 | static void parseAndAddLibs (StringArray& libList, const String& libs) | |
240 | { | |
241 | libList.addTokens (libs, ", ", {}); | |
242 | libList.trim(); | |
243 | libList.removeDuplicates (false); | |
244 | } | |
245 | ||
246 | void LibraryModule::addSettingsForModuleToExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const | |
247 | { | |
248 | auto& project = exporter.getProject(); | |
249 | ||
230 | void LibraryModule::addSearchPathsToExporter (ProjectExporter& exporter) const | |
231 | { | |
250 | 232 | auto moduleRelativePath = exporter.getModuleFolderRelativeToProject (getID()); |
251 | 233 | |
252 | 234 | exporter.addToExtraSearchPaths (moduleRelativePath.getParentDirectory()); |
253 | 235 | |
254 | 236 | String libDirPlatform; |
237 | ||
255 | 238 | if (exporter.isLinux()) |
256 | 239 | libDirPlatform = "Linux"; |
257 | 240 | else if (exporter.isCodeBlocks() && exporter.isWindows()) |
260 | 243 | libDirPlatform = exporter.getTargetFolder().getFileName(); |
261 | 244 | |
262 | 245 | auto libSubdirPath = moduleRelativePath.toUnixStyle() + "/libs/" + libDirPlatform; |
263 | auto moduleLibDir = File (project.getProjectFolder().getFullPathName() + "/" + libSubdirPath); | |
246 | auto moduleLibDir = File (exporter.getProject().getProjectFolder().getFullPathName() + "/" + libSubdirPath); | |
264 | 247 | |
265 | 248 | if (moduleLibDir.exists()) |
266 | 249 | exporter.addToModuleLibPaths ({ libSubdirPath, moduleRelativePath.getRoot() }); |
274 | 257 | for (auto& path : paths) |
275 | 258 | exporter.addToExtraSearchPaths (moduleRelativePath.getChildFile (path.unquoted())); |
276 | 259 | } |
277 | ||
278 | { | |
279 | auto extraDefs = moduleInfo.getPreprocessorDefs().trim(); | |
280 | ||
281 | if (extraDefs.isNotEmpty()) | |
282 | exporter.getExporterPreprocessorDefsValue() = exporter.getExporterPreprocessorDefsString() + "\n" + extraDefs; | |
283 | } | |
284 | ||
285 | { | |
286 | Array<File> compiled; | |
287 | auto& modules = project.getEnabledModules(); | |
288 | auto id = getID(); | |
289 | ||
290 | auto localModuleFolder = modules.shouldCopyModuleFilesLocally (id).getValue() ? project.getLocalModuleFolder (id) | |
291 | : moduleInfo.getFolder(); | |
292 | ||
293 | findAndAddCompiledUnits (exporter, &projectSaver, compiled); | |
294 | ||
295 | if (modules.shouldShowAllModuleFilesInProject (id).getValue()) | |
296 | addBrowseableCode (exporter, compiled, localModuleFolder); | |
297 | } | |
260 | } | |
261 | ||
262 | void LibraryModule::addDefinesToExporter (ProjectExporter& exporter) const | |
263 | { | |
264 | auto extraDefs = moduleInfo.getPreprocessorDefs().trim(); | |
265 | ||
266 | if (extraDefs.isNotEmpty()) | |
267 | exporter.getExporterPreprocessorDefsValue() = exporter.getExporterPreprocessorDefsString() + "\n" + extraDefs; | |
268 | } | |
269 | ||
270 | void LibraryModule::addCompileUnitsToExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const | |
271 | { | |
272 | auto& project = exporter.getProject(); | |
273 | auto& modules = project.getEnabledModules(); | |
274 | ||
275 | auto moduleID = getID(); | |
276 | ||
277 | auto localModuleFolder = modules.shouldCopyModuleFilesLocally (moduleID) ? project.getLocalModuleFolder (moduleID) | |
278 | : moduleInfo.getFolder(); | |
279 | ||
280 | Array<File> compiled; | |
281 | findAndAddCompiledUnits (exporter, &projectSaver, compiled); | |
282 | ||
283 | if (modules.shouldShowAllModuleFilesInProject (moduleID)) | |
284 | addBrowseableCode (exporter, compiled, localModuleFolder); | |
285 | } | |
286 | ||
287 | void LibraryModule::addLibsToExporter (ProjectExporter& exporter) const | |
288 | { | |
289 | auto parseAndAddLibsToList = [] (StringArray& libList, const String& libs) | |
290 | { | |
291 | libList.addTokens (libs, ", ", {}); | |
292 | libList.trim(); | |
293 | libList.removeDuplicates (false); | |
294 | }; | |
295 | ||
296 | auto& project = exporter.getProject(); | |
298 | 297 | |
299 | 298 | if (exporter.isXcode()) |
300 | 299 | { |
311 | 310 | auto frameworks = moduleInfo.moduleInfo [xcodeExporter.isOSX() ? "OSXFrameworks" : "iOSFrameworks"].toString(); |
312 | 311 | xcodeExporter.xcodeFrameworks.addTokens (frameworks, ", ", {}); |
313 | 312 | |
314 | parseAndAddLibs (xcodeExporter.xcodeLibs, moduleInfo.moduleInfo [exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); | |
313 | parseAndAddLibsToList (xcodeExporter.xcodeLibs, moduleInfo.moduleInfo [exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); | |
315 | 314 | } |
316 | 315 | else if (exporter.isLinux()) |
317 | 316 | { |
318 | parseAndAddLibs (exporter.linuxLibs, moduleInfo.moduleInfo ["linuxLibs"].toString()); | |
319 | parseAndAddLibs (exporter.linuxPackages, moduleInfo.moduleInfo ["linuxPackages"].toString()); | |
317 | parseAndAddLibsToList (exporter.linuxLibs, moduleInfo.moduleInfo ["linuxLibs"].toString()); | |
318 | parseAndAddLibsToList (exporter.linuxPackages, moduleInfo.moduleInfo ["linuxPackages"].toString()); | |
320 | 319 | } |
321 | 320 | else if (exporter.isWindows()) |
322 | 321 | { |
323 | 322 | if (exporter.isCodeBlocks()) |
324 | parseAndAddLibs (exporter.mingwLibs, moduleInfo.moduleInfo ["mingwLibs"].toString()); | |
323 | parseAndAddLibsToList (exporter.mingwLibs, moduleInfo.moduleInfo ["mingwLibs"].toString()); | |
325 | 324 | else |
326 | parseAndAddLibs (exporter.windowsLibs, moduleInfo.moduleInfo ["windowsLibs"].toString()); | |
325 | parseAndAddLibsToList (exporter.windowsLibs, moduleInfo.moduleInfo ["windowsLibs"].toString()); | |
327 | 326 | } |
328 | 327 | else if (exporter.isAndroid()) |
329 | 328 | { |
330 | parseAndAddLibs (exporter.androidLibs, moduleInfo.moduleInfo ["androidLibs"].toString()); | |
331 | } | |
329 | parseAndAddLibsToList (exporter.androidLibs, moduleInfo.moduleInfo ["androidLibs"].toString()); | |
330 | } | |
331 | } | |
332 | ||
333 | void LibraryModule::addSettingsForModuleToExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const | |
334 | { | |
335 | addSearchPathsToExporter (exporter); | |
336 | addDefinesToExporter (exporter); | |
337 | addCompileUnitsToExporter (exporter, projectSaver); | |
338 | addLibsToExporter (exporter); | |
332 | 339 | } |
333 | 340 | |
334 | 341 | void LibraryModule::getConfigFlags (Project& project, OwnedArray<Project::ConfigFlag>& flags) const |
383 | 390 | } |
384 | 391 | } |
385 | 392 | |
386 | //============================================================================== | |
393 | static void addFileWithGroups (Project::Item& group, const RelativePath& file, const String& path) | |
394 | { | |
395 | auto slash = path.indexOfChar (File::getSeparatorChar()); | |
396 | ||
397 | if (slash >= 0) | |
398 | { | |
399 | auto topLevelGroup = path.substring (0, slash); | |
400 | auto remainingPath = path.substring (slash + 1); | |
401 | ||
402 | auto newGroup = group.getOrCreateSubGroup (topLevelGroup); | |
403 | addFileWithGroups (newGroup, file, remainingPath); | |
404 | } | |
405 | else | |
406 | { | |
407 | if (! group.containsChildForFile (file)) | |
408 | group.addRelativeFile (file, -1, false); | |
409 | } | |
410 | } | |
411 | ||
387 | 412 | struct FileSorter |
388 | 413 | { |
389 | 414 | static int compareElements (const File& f1, const File& f2) |
392 | 417 | } |
393 | 418 | }; |
394 | 419 | |
395 | bool LibraryModule::CompileUnit::hasSuffix (const File& f, const char* suffix) | |
396 | { | |
397 | auto fileWithoutSuffix = f.getFileNameWithoutExtension() + "."; | |
398 | ||
399 | return fileWithoutSuffix.containsIgnoreCase (suffix + String (".")) | |
400 | || fileWithoutSuffix.containsIgnoreCase (suffix + String ("_")); | |
401 | } | |
402 | ||
403 | void LibraryModule::CompileUnit::writeInclude (MemoryOutputStream&) const | |
404 | { | |
420 | void LibraryModule::findBrowseableFiles (const File& folder, Array<File>& filesFound) const | |
421 | { | |
422 | Array<File> tempList; | |
423 | FileSorter sorter; | |
424 | ||
425 | DirectoryIterator iter (folder, true, "*", File::findFiles); | |
426 | bool isHiddenFile; | |
427 | ||
428 | while (iter.next (nullptr, &isHiddenFile, nullptr, nullptr, nullptr, nullptr)) | |
429 | if (! isHiddenFile && iter.getFile().hasFileExtension (browseableFileExtensions)) | |
430 | tempList.addSorted (sorter, iter.getFile()); | |
431 | ||
432 | filesFound.addArray (tempList); | |
405 | 433 | } |
406 | 434 | |
407 | 435 | bool LibraryModule::CompileUnit::isNeededForExporter (ProjectExporter& exporter) const |
425 | 453 | String LibraryModule::CompileUnit::getFilenameForProxyFile() const |
426 | 454 | { |
427 | 455 | return "include_" + file.getFileName(); |
456 | } | |
457 | ||
458 | bool LibraryModule::CompileUnit::hasSuffix (const File& f, const char* suffix) | |
459 | { | |
460 | auto fileWithoutSuffix = f.getFileNameWithoutExtension() + "."; | |
461 | ||
462 | return fileWithoutSuffix.containsIgnoreCase (suffix + String (".")) | |
463 | || fileWithoutSuffix.containsIgnoreCase (suffix + String ("_")); | |
428 | 464 | } |
429 | 465 | |
430 | 466 | Array<LibraryModule::CompileUnit> LibraryModule::getAllCompileUnits (ProjectType::Target::Type forTarget) const |
485 | 521 | } |
486 | 522 | } |
487 | 523 | |
488 | static void addFileWithGroups (Project::Item& group, const RelativePath& file, const String& path) | |
489 | { | |
490 | auto slash = path.indexOfChar (File::getSeparatorChar()); | |
491 | ||
492 | if (slash >= 0) | |
493 | { | |
494 | auto topLevelGroup = path.substring (0, slash); | |
495 | auto remainingPath = path.substring (slash + 1); | |
496 | ||
497 | auto newGroup = group.getOrCreateSubGroup (topLevelGroup); | |
498 | addFileWithGroups (newGroup, file, remainingPath); | |
499 | } | |
500 | else | |
501 | { | |
502 | if (! group.containsChildForFile (file)) | |
503 | group.addRelativeFile (file, -1, false); | |
504 | } | |
505 | } | |
506 | ||
507 | void LibraryModule::findBrowseableFiles (const File& folder, Array<File>& filesFound) const | |
508 | { | |
509 | Array<File> tempList; | |
510 | FileSorter sorter; | |
511 | ||
512 | DirectoryIterator iter (folder, true, "*", File::findFiles); | |
513 | bool isHiddenFile; | |
514 | ||
515 | while (iter.next (nullptr, &isHiddenFile, nullptr, nullptr, nullptr, nullptr)) | |
516 | if (! isHiddenFile && iter.getFile().hasFileExtension (browseableFileExtensions)) | |
517 | tempList.addSorted (sorter, iter.getFile()); | |
518 | ||
519 | filesFound.addArray (tempList); | |
520 | } | |
521 | ||
522 | 524 | void LibraryModule::addBrowseableCode (ProjectExporter& exporter, const Array<File>& compiled, const File& localModuleFolder) const |
523 | 525 | { |
524 | 526 | if (sourceFiles.isEmpty()) |
530 | 532 | |
531 | 533 | auto& project = exporter.getProject(); |
532 | 534 | |
533 | if (project.getEnabledModules().shouldCopyModuleFilesLocally (getID()).getValue()) | |
535 | if (project.getEnabledModules().shouldCopyModuleFilesLocally (getID())) | |
534 | 536 | moduleHeader = project.getLocalModuleFolder (getID()).getChildFile (moduleHeader.getFileName()); |
535 | 537 | |
536 | 538 | auto isModuleHeader = [&] (const File& f) { return f.getFileName() == moduleHeader.getFileName(); }; |
551 | 553 | exporter.getModulesGroup().state.appendChild (sourceGroup.state.createCopy(), nullptr); |
552 | 554 | } |
553 | 555 | |
554 | ||
555 | 556 | //============================================================================== |
556 | 557 | EnabledModuleList::EnabledModuleList (Project& p, const ValueTree& s) |
557 | 558 | : project (p), state (s) |
558 | 559 | { |
559 | 560 | } |
560 | 561 | |
562 | StringArray EnabledModuleList::getAllModules() const | |
563 | { | |
564 | StringArray moduleIDs; | |
565 | ||
566 | for (int i = 0; i < getNumModules(); ++i) | |
567 | moduleIDs.add (getModuleID (i)); | |
568 | ||
569 | return moduleIDs; | |
570 | } | |
571 | ||
572 | void EnabledModuleList::createRequiredModules (OwnedArray<LibraryModule>& modules) | |
573 | { | |
574 | for (int i = 0; i < getNumModules(); ++i) | |
575 | modules.add (new LibraryModule (getModuleInfo (getModuleID (i)))); | |
576 | } | |
577 | ||
578 | void EnabledModuleList::sortAlphabetically() | |
579 | { | |
580 | struct ModuleTreeSorter | |
581 | { | |
582 | static int compareElements (const ValueTree& m1, const ValueTree& m2) | |
583 | { | |
584 | return m1[Ids::ID].toString().compareIgnoreCase (m2[Ids::ID]); | |
585 | } | |
586 | }; | |
587 | ||
588 | ModuleTreeSorter sorter; | |
589 | state.sort (sorter, getUndoManager(), false); | |
590 | } | |
591 | ||
592 | File EnabledModuleList::getDefaultModulesFolder() const | |
593 | { | |
594 | File globalPath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString()); | |
595 | ||
596 | if (globalPath.exists()) | |
597 | return globalPath; | |
598 | ||
599 | for (auto& exporterPathModule : project.getExporterPathsModuleList().getAllModules()) | |
600 | { | |
601 | auto f = exporterPathModule.second; | |
602 | ||
603 | if (f.isDirectory()) | |
604 | return f.getParentDirectory(); | |
605 | } | |
606 | ||
607 | return File::getCurrentWorkingDirectory(); | |
608 | } | |
609 | ||
561 | 610 | ModuleDescription EnabledModuleList::getModuleInfo (const String& moduleID) |
562 | 611 | { |
563 | 612 | return ModuleDescription (project.getModuleWithID (moduleID).second); |
568 | 617 | return state.getChildWithProperty (Ids::ID, moduleID).isValid(); |
569 | 618 | } |
570 | 619 | |
571 | bool EnabledModuleList::isAudioPluginModuleMissing() const | |
572 | { | |
573 | return project.isAudioPluginProject() | |
574 | && ! isModuleEnabled ("juce_audio_plugin_client"); | |
620 | static void getDependencies (Project& project, const String& moduleID, StringArray& dependencies) | |
621 | { | |
622 | auto info = project.getEnabledModules().getModuleInfo (moduleID); | |
623 | ||
624 | for (auto uid : info.getDependencies()) | |
625 | { | |
626 | if (! dependencies.contains (uid, true)) | |
627 | { | |
628 | dependencies.add (uid); | |
629 | getDependencies (project, uid, dependencies); | |
630 | } | |
631 | } | |
632 | } | |
633 | ||
634 | StringArray EnabledModuleList::getExtraDependenciesNeeded (const String& moduleID) const | |
635 | { | |
636 | StringArray dependencies, extraDepsNeeded; | |
637 | getDependencies (project, moduleID, dependencies); | |
638 | ||
639 | for (auto dep : dependencies) | |
640 | if (dep != moduleID && ! isModuleEnabled (dep)) | |
641 | extraDepsNeeded.add (dep); | |
642 | ||
643 | return extraDepsNeeded; | |
644 | } | |
645 | ||
646 | bool EnabledModuleList::doesModuleHaveHigherCppStandardThanProject (const String& moduleID) | |
647 | { | |
648 | auto projectCppStandard = project.getCppStandardString(); | |
649 | ||
650 | if (projectCppStandard == "latest") | |
651 | return false; | |
652 | ||
653 | auto moduleCppStandard = getModuleInfo (moduleID).getMinimumCppStandard(); | |
654 | ||
655 | return (moduleCppStandard.getIntValue() > projectCppStandard.getIntValue()); | |
575 | 656 | } |
576 | 657 | |
577 | 658 | bool EnabledModuleList::shouldUseGlobalPath (const String& moduleID) const |
578 | 659 | { |
579 | return static_cast<bool> (state.getChildWithProperty (Ids::ID, moduleID) | |
580 | .getProperty (Ids::useGlobalPath)); | |
581 | } | |
582 | ||
583 | Value EnabledModuleList::getShouldUseGlobalPathValue (const String& moduleID) const | |
660 | return (bool) shouldUseGlobalPathValue (moduleID).getValue(); | |
661 | } | |
662 | ||
663 | Value EnabledModuleList::shouldUseGlobalPathValue (const String& moduleID) const | |
584 | 664 | { |
585 | 665 | return state.getChildWithProperty (Ids::ID, moduleID) |
586 | 666 | .getPropertyAsValue (Ids::useGlobalPath, getUndoManager()); |
587 | 667 | } |
588 | 668 | |
589 | Value EnabledModuleList::shouldShowAllModuleFilesInProject (const String& moduleID) | |
669 | bool EnabledModuleList::shouldShowAllModuleFilesInProject (const String& moduleID) const | |
670 | { | |
671 | return (bool) shouldShowAllModuleFilesInProjectValue (moduleID).getValue(); | |
672 | } | |
673 | ||
674 | Value EnabledModuleList::shouldShowAllModuleFilesInProjectValue (const String& moduleID) const | |
590 | 675 | { |
591 | 676 | return state.getChildWithProperty (Ids::ID, moduleID) |
592 | 677 | .getPropertyAsValue (Ids::showAllCode, getUndoManager()); |
593 | 678 | } |
594 | 679 | |
595 | struct ModuleTreeSorter | |
596 | { | |
597 | static int compareElements (const ValueTree& m1, const ValueTree& m2) | |
598 | { | |
599 | return m1[Ids::ID].toString().compareIgnoreCase (m2[Ids::ID]); | |
600 | } | |
601 | }; | |
602 | ||
603 | void EnabledModuleList::sortAlphabetically() | |
604 | { | |
605 | ModuleTreeSorter sorter; | |
606 | state.sort (sorter, getUndoManager(), false); | |
607 | } | |
608 | ||
609 | Value EnabledModuleList::shouldCopyModuleFilesLocally (const String& moduleID) const | |
680 | bool EnabledModuleList::shouldCopyModuleFilesLocally (const String& moduleID) const | |
681 | { | |
682 | return (bool) shouldCopyModuleFilesLocallyValue (moduleID).getValue(); | |
683 | } | |
684 | ||
685 | Value EnabledModuleList::shouldCopyModuleFilesLocallyValue (const String& moduleID) const | |
610 | 686 | { |
611 | 687 | return state.getChildWithProperty (Ids::ID, moduleID) |
612 | 688 | .getPropertyAsValue (Ids::useLocalCopy, getUndoManager()); |
613 | 689 | } |
614 | 690 | |
691 | bool EnabledModuleList::areMostModulesUsingGlobalPath() const | |
692 | { | |
693 | int numYes = 0, numNo = 0; | |
694 | ||
695 | for (auto i = getNumModules(); --i >= 0;) | |
696 | { | |
697 | if (shouldUseGlobalPath (getModuleID (i))) | |
698 | ++numYes; | |
699 | else | |
700 | ++numNo; | |
701 | } | |
702 | ||
703 | return numYes > numNo; | |
704 | } | |
705 | ||
706 | bool EnabledModuleList::areMostModulesCopiedLocally() const | |
707 | { | |
708 | int numYes = 0, numNo = 0; | |
709 | ||
710 | for (auto i = getNumModules(); --i >= 0;) | |
711 | { | |
712 | if (shouldCopyModuleFilesLocally (getModuleID (i))) | |
713 | ++numYes; | |
714 | else | |
715 | ++numNo; | |
716 | } | |
717 | ||
718 | return numYes > numNo; | |
719 | } | |
720 | ||
615 | 721 | void EnabledModuleList::addModule (const File& moduleFolder, bool copyLocally, bool useGlobalPath, bool sendAnalyticsEvent) |
616 | 722 | { |
617 | 723 | ModuleDescription info (moduleFolder); |
628 | 734 | state.appendChild (module, getUndoManager()); |
629 | 735 | sortAlphabetically(); |
630 | 736 | |
631 | shouldShowAllModuleFilesInProject (moduleID) = true; | |
632 | shouldCopyModuleFilesLocally (moduleID) = copyLocally; | |
633 | getShouldUseGlobalPathValue (moduleID) = useGlobalPath; | |
737 | shouldShowAllModuleFilesInProjectValue (moduleID) = true; | |
738 | shouldCopyModuleFilesLocallyValue (moduleID) = copyLocally; | |
739 | shouldUseGlobalPathValue (moduleID) = useGlobalPath; | |
634 | 740 | |
635 | 741 | RelativePath path (moduleFolder.getParentDirectory(), |
636 | 742 | project.getProjectFolder(), RelativePath::projectFolder); |
652 | 758 | } |
653 | 759 | } |
654 | 760 | |
761 | void EnabledModuleList::addModuleInteractive (const String& moduleID) | |
762 | { | |
763 | auto f = project.getModuleWithID (moduleID).second; | |
764 | ||
765 | if (f != File()) | |
766 | { | |
767 | addModule (f, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true); | |
768 | return; | |
769 | } | |
770 | ||
771 | addModuleFromUserSelectedFile(); | |
772 | } | |
773 | ||
774 | void EnabledModuleList::addModuleFromUserSelectedFile() | |
775 | { | |
776 | auto lastLocation = getDefaultModulesFolder(); | |
777 | ||
778 | FileChooser fc ("Select a module to add...", lastLocation, {}); | |
779 | ||
780 | if (fc.browseForDirectory()) | |
781 | { | |
782 | lastLocation = fc.getResult(); | |
783 | addModuleOfferingToCopy (lastLocation, true); | |
784 | } | |
785 | } | |
786 | ||
787 | void EnabledModuleList::addModuleOfferingToCopy (const File& f, bool isFromUserSpecifiedFolder) | |
788 | { | |
789 | ModuleDescription m (f); | |
790 | ||
791 | if (! m.isValid()) | |
792 | { | |
793 | AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | |
794 | "Add Module", "This wasn't a valid module folder!"); | |
795 | return; | |
796 | } | |
797 | ||
798 | if (isModuleEnabled (m.getID())) | |
799 | { | |
800 | AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | |
801 | "Add Module", "The project already contains this module!"); | |
802 | return; | |
803 | } | |
804 | ||
805 | addModule (m.moduleFolder, areMostModulesCopiedLocally(), | |
806 | isFromUserSpecifiedFolder ? false : areMostModulesUsingGlobalPath(), | |
807 | true); | |
808 | } | |
809 | ||
655 | 810 | void EnabledModuleList::removeModule (String moduleID) // must be pass-by-value, and not a const ref! |
656 | 811 | { |
657 | 812 | for (auto i = state.getNumChildren(); --i >= 0;) |
661 | 816 | for (Project::ExporterIterator exporter (project); exporter.next();) |
662 | 817 | exporter->removePathForModule (moduleID); |
663 | 818 | } |
664 | ||
665 | void EnabledModuleList::createRequiredModules (OwnedArray<LibraryModule>& modules) | |
666 | { | |
667 | for (int i = 0; i < getNumModules(); ++i) | |
668 | modules.add (new LibraryModule (getModuleInfo (getModuleID (i)))); | |
669 | } | |
670 | ||
671 | StringArray EnabledModuleList::getAllModules() const | |
672 | { | |
673 | StringArray moduleIDs; | |
674 | ||
675 | for (int i = 0; i < getNumModules(); ++i) | |
676 | moduleIDs.add (getModuleID (i)); | |
677 | ||
678 | return moduleIDs; | |
679 | } | |
680 | ||
681 | static void getDependencies (Project& project, const String& moduleID, StringArray& dependencies) | |
682 | { | |
683 | auto info = project.getEnabledModules().getModuleInfo (moduleID); | |
684 | ||
685 | for (auto uid : info.getDependencies()) | |
686 | { | |
687 | if (! dependencies.contains (uid, true)) | |
688 | { | |
689 | dependencies.add (uid); | |
690 | getDependencies (project, uid, dependencies); | |
691 | } | |
692 | } | |
693 | } | |
694 | ||
695 | StringArray EnabledModuleList::getExtraDependenciesNeeded (const String& moduleID) const | |
696 | { | |
697 | StringArray dependencies, extraDepsNeeded; | |
698 | getDependencies (project, moduleID, dependencies); | |
699 | ||
700 | for (auto dep : dependencies) | |
701 | if (dep != moduleID && ! isModuleEnabled (dep)) | |
702 | extraDepsNeeded.add (dep); | |
703 | ||
704 | return extraDepsNeeded; | |
705 | } | |
706 | ||
707 | bool EnabledModuleList::doesModuleHaveHigherCppStandardThanProject (const String& moduleID) | |
708 | { | |
709 | auto projectCppStandard = project.getCppStandardString(); | |
710 | ||
711 | if (projectCppStandard == "latest") | |
712 | return false; | |
713 | ||
714 | auto moduleCppStandard = getModuleInfo (moduleID).getMinimumCppStandard(); | |
715 | ||
716 | return (moduleCppStandard.getIntValue() > projectCppStandard.getIntValue()); | |
717 | } | |
718 | ||
719 | bool EnabledModuleList::areMostModulesUsingGlobalPath() const | |
720 | { | |
721 | int numYes = 0, numNo = 0; | |
722 | ||
723 | for (auto i = getNumModules(); --i >= 0;) | |
724 | { | |
725 | if (shouldUseGlobalPath (getModuleID (i))) | |
726 | ++numYes; | |
727 | else | |
728 | ++numNo; | |
729 | } | |
730 | ||
731 | return numYes > numNo; | |
732 | } | |
733 | ||
734 | bool EnabledModuleList::areMostModulesCopiedLocally() const | |
735 | { | |
736 | int numYes = 0, numNo = 0; | |
737 | ||
738 | for (auto i = getNumModules(); --i >= 0;) | |
739 | { | |
740 | if (shouldCopyModuleFilesLocally (getModuleID (i)).getValue()) | |
741 | ++numYes; | |
742 | else | |
743 | ++numNo; | |
744 | } | |
745 | ||
746 | return numYes > numNo; | |
747 | } | |
748 | ||
749 | void EnabledModuleList::setLocalCopyModeForAllModules (bool copyLocally) | |
750 | { | |
751 | for (auto i = getNumModules(); --i >= 0;) | |
752 | shouldCopyModuleFilesLocally (project.getEnabledModules().getModuleID (i)) = copyLocally; | |
753 | } | |
754 | ||
755 | File EnabledModuleList::findDefaultModulesFolder (Project& project) | |
756 | { | |
757 | File globalPath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString()); | |
758 | ||
759 | if (globalPath.exists()) | |
760 | return globalPath; | |
761 | ||
762 | for (auto& exporterPathModule : project.getExporterPathsModuleList().getAllModules()) | |
763 | { | |
764 | auto f = exporterPathModule.second; | |
765 | ||
766 | if (f.isDirectory()) | |
767 | return f.getParentDirectory(); | |
768 | } | |
769 | ||
770 | return File::getCurrentWorkingDirectory(); | |
771 | } | |
772 | ||
773 | void EnabledModuleList::addModuleFromUserSelectedFile() | |
774 | { | |
775 | static auto lastLocation = findDefaultModulesFolder (project); | |
776 | ||
777 | FileChooser fc ("Select a module to add...", lastLocation, {}); | |
778 | ||
779 | if (fc.browseForDirectory()) | |
780 | { | |
781 | lastLocation = fc.getResult(); | |
782 | addModuleOfferingToCopy (lastLocation, true); | |
783 | } | |
784 | } | |
785 | ||
786 | void EnabledModuleList::addModuleInteractive (const String& moduleID) | |
787 | { | |
788 | auto f = project.getModuleWithID (moduleID).second; | |
789 | ||
790 | if (f != File()) | |
791 | { | |
792 | addModule (f, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true); | |
793 | return; | |
794 | } | |
795 | ||
796 | addModuleFromUserSelectedFile(); | |
797 | } | |
798 | ||
799 | void EnabledModuleList::addModuleOfferingToCopy (const File& f, bool isFromUserSpecifiedFolder) | |
800 | { | |
801 | ModuleDescription m (f); | |
802 | ||
803 | if (! m.isValid()) | |
804 | { | |
805 | AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | |
806 | "Add Module", "This wasn't a valid module folder!"); | |
807 | return; | |
808 | } | |
809 | ||
810 | if (isModuleEnabled (m.getID())) | |
811 | { | |
812 | AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | |
813 | "Add Module", "The project already contains this module!"); | |
814 | return; | |
815 | } | |
816 | ||
817 | addModule (m.moduleFolder, areMostModulesCopiedLocally(), | |
818 | isFromUserSpecifiedFolder ? false : areMostModulesUsingGlobalPath(), | |
819 | true); | |
820 | } | |
821 | ||
822 | bool isJUCEFolder (const File& f) | |
823 | { | |
824 | return isJUCEModulesFolder (f.getChildFile ("modules")); | |
825 | } | |
826 | ||
827 | bool isJUCEModulesFolder (const File& f) | |
828 | { | |
829 | return f.isDirectory() && f.getChildFile ("juce_core").isDirectory(); | |
830 | } |
30 | 30 | class ProjectSaver; |
31 | 31 | |
32 | 32 | //============================================================================== |
33 | bool isJUCEModulesFolder (const File&); | |
34 | bool isJUCEFolder (const File&); | |
35 | ||
36 | //============================================================================== | |
37 | 33 | struct ModuleDescription |
38 | 34 | { |
39 | ModuleDescription() {} | |
35 | ModuleDescription() = default; | |
40 | 36 | ModuleDescription (const File& folder); |
41 | ModuleDescription (const var& info) : moduleInfo (info) {} | |
42 | 37 | |
43 | 38 | bool isValid() const { return getID().isNotEmpty(); } |
44 | 39 | |
56 | 51 | File getFolder() const { jassert (moduleFolder != File()); return moduleFolder; } |
57 | 52 | File getHeader() const; |
58 | 53 | |
59 | bool isPluginClient() const { return getID() == "juce_audio_plugin_client"; } | |
60 | ||
61 | 54 | File moduleFolder; |
62 | 55 | var moduleInfo; |
63 | 56 | URL url; |
90 | 83 | File file; |
91 | 84 | bool isCompiledForObjC, isCompiledForNonObjC; |
92 | 85 | |
93 | void writeInclude (MemoryOutputStream&) const; | |
94 | 86 | bool isNeededForExporter (ProjectExporter&) const; |
95 | 87 | String getFilenameForProxyFile() const; |
96 | 88 | static bool hasSuffix (const File&, const char*); |
103 | 95 | ModuleDescription moduleInfo; |
104 | 96 | |
105 | 97 | private: |
98 | void addSearchPathsToExporter (ProjectExporter&) const; | |
99 | void addDefinesToExporter (ProjectExporter&) const; | |
100 | void addCompileUnitsToExporter (ProjectExporter&, ProjectSaver&) const; | |
101 | void addLibsToExporter (ProjectExporter&) const; | |
102 | ||
103 | void addBrowseableCode (ProjectExporter&, const Array<File>& compiled, const File& localModuleFolder) const; | |
104 | ||
106 | 105 | mutable Array<File> sourceFiles; |
107 | 106 | OwnedArray<Project::ConfigFlag> configFlags; |
108 | ||
109 | void addBrowseableCode (ProjectExporter&, const Array<File>& compiled, const File& localModuleFolder) const; | |
110 | }; | |
111 | ||
112 | //============================================================================== | |
113 | using ModuleIDAndFolder = std::pair<String, File>; | |
114 | using ModuleIDAndFolderList = std::vector<ModuleIDAndFolder>; | |
115 | ||
107 | }; | |
108 | ||
109 | //============================================================================== | |
116 | 110 | class AvailableModuleList |
117 | 111 | { |
118 | 112 | public: |
119 | AvailableModuleList(); | |
113 | using ModuleIDAndFolder = std::pair<String, File>; | |
114 | using ModuleIDAndFolderList = std::vector<ModuleIDAndFolder>; | |
115 | ||
116 | AvailableModuleList() = default; | |
120 | 117 | |
121 | 118 | void scanPaths (const Array<File>&); |
122 | 119 | void scanPathsAsync (const Array<File>&); |
156 | 153 | public: |
157 | 154 | EnabledModuleList (Project&, const ValueTree&); |
158 | 155 | |
159 | static File findDefaultModulesFolder (Project&); | |
156 | //============================================================================== | |
157 | ValueTree getState() const { return state; } | |
158 | ||
159 | StringArray getAllModules() const; | |
160 | void createRequiredModules (OwnedArray<LibraryModule>& modules); | |
161 | void sortAlphabetically(); | |
162 | ||
163 | File getDefaultModulesFolder() const; | |
164 | ||
165 | int getNumModules() const { return state.getNumChildren(); } | |
166 | String getModuleID (int index) const { return state.getChild (index) [Ids::ID].toString(); } | |
167 | ||
168 | ModuleDescription getModuleInfo (const String& moduleID); | |
160 | 169 | |
161 | 170 | bool isModuleEnabled (const String& moduleID) const; |
171 | StringArray getExtraDependenciesNeeded (const String& moduleID) const; | |
172 | bool doesModuleHaveHigherCppStandardThanProject (const String& moduleID); | |
162 | 173 | |
163 | 174 | bool shouldUseGlobalPath (const String& moduleID) const; |
164 | Value getShouldUseGlobalPathValue (const String& moduleID) const; | |
165 | ||
166 | Value shouldShowAllModuleFilesInProject (const String& moduleID); | |
167 | Value shouldCopyModuleFilesLocally (const String& moduleID) const; | |
168 | ||
169 | void removeModule (String moduleID); | |
170 | bool isAudioPluginModuleMissing() const; | |
171 | ||
172 | ModuleDescription getModuleInfo (const String& moduleID); | |
173 | ||
175 | Value shouldUseGlobalPathValue (const String& moduleID) const; | |
176 | ||
177 | bool shouldShowAllModuleFilesInProject (const String& moduleID) const; | |
178 | Value shouldShowAllModuleFilesInProjectValue (const String& moduleID) const; | |
179 | ||
180 | bool shouldCopyModuleFilesLocally (const String& moduleID) const; | |
181 | Value shouldCopyModuleFilesLocallyValue (const String& moduleID) const; | |
182 | ||
183 | bool areMostModulesUsingGlobalPath() const; | |
184 | bool areMostModulesCopiedLocally() const; | |
185 | ||
186 | //============================================================================== | |
174 | 187 | void addModule (const File& moduleManifestFile, bool copyLocally, bool useGlobalPath, bool sendAnalyticsEvent); |
175 | 188 | void addModuleInteractive (const String& moduleID); |
176 | 189 | void addModuleFromUserSelectedFile(); |
177 | 190 | void addModuleOfferingToCopy (const File&, bool isFromUserSpecifiedFolder); |
178 | 191 | |
179 | StringArray getAllModules() const; | |
180 | StringArray getExtraDependenciesNeeded (const String& moduleID) const; | |
181 | bool doesModuleHaveHigherCppStandardThanProject (const String& moduleID); | |
182 | void createRequiredModules (OwnedArray<LibraryModule>& modules); | |
183 | ||
184 | int getNumModules() const { return state.getNumChildren(); } | |
185 | String getModuleID (int index) const { return state.getChild (index) [Ids::ID].toString(); } | |
186 | ||
187 | bool areMostModulesUsingGlobalPath() const; | |
188 | bool areMostModulesCopiedLocally() const; | |
189 | ||
190 | void setLocalCopyModeForAllModules (bool copyLocally); | |
191 | ||
192 | void sortAlphabetically(); | |
192 | void removeModule (String moduleID); | |
193 | ||
194 | private: | |
195 | UndoManager* getUndoManager() const { return project.getUndoManagerFor (state); } | |
193 | 196 | |
194 | 197 | Project& project; |
195 | 198 | ValueTree state; |
196 | 199 | |
197 | private: | |
198 | UndoManager* getUndoManager() const { return project.getUndoManagerFor (state); } | |
199 | ||
200 | 200 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnabledModuleList) |
201 | 201 | }; |
2099 | 2099 | exporterPathsModuleList->scanPaths (getExporterModulePathsToScan (*this)); |
2100 | 2100 | } |
2101 | 2101 | |
2102 | ModuleIDAndFolder Project::getModuleWithID (const String& id) | |
2102 | AvailableModuleList::ModuleIDAndFolder Project::getModuleWithID (const String& id) | |
2103 | 2103 | { |
2104 | 2104 | if (! getEnabledModules().shouldUseGlobalPath (id)) |
2105 | 2105 | { |
36 | 36 | public: |
37 | 37 | MakeBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e) |
38 | 38 | : BuildConfiguration (p, settings, e), |
39 | architectureTypeValue (config, Ids::linuxArchitecture, getUndoManager(), "-march=native") | |
39 | architectureTypeValue (config, Ids::linuxArchitecture, getUndoManager(), String()) | |
40 | 40 | { |
41 | 41 | linkTimeOptimisationValue.setDefault (false); |
42 | 42 | optimisationLevelValue.setDefault (isDebug() ? gccO0 : gccO3); |
2151 | 2151 | void addFilesAndGroupsToProject (StringArray& topLevelGroupIDs) const |
2152 | 2152 | { |
2153 | 2153 | for (auto* target : targets) |
2154 | addEntitlementsFile (*target); | |
2154 | if (target->shouldAddEntitlements()) | |
2155 | addEntitlementsFile (*target); | |
2155 | 2156 | |
2156 | 2157 | for (auto& group : getAllGroups()) |
2157 | 2158 | { |
3185 | 3186 | |
3186 | 3187 | void addEntitlementsFile (XcodeTarget& target) const |
3187 | 3188 | { |
3189 | String content = | |
3190 | "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | |
3191 | "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" | |
3192 | "<plist version=\"1.0\">\n" | |
3193 | "<dict>\n"; | |
3194 | ||
3188 | 3195 | auto entitlements = getEntitlements (target); |
3189 | 3196 | |
3190 | if (entitlements.size() > 0) | |
3191 | { | |
3192 | String content = | |
3193 | "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | |
3194 | "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" | |
3195 | "<plist version=\"1.0\">\n" | |
3196 | "<dict>\n"; | |
3197 | ||
3198 | for (auto& key : entitlements.getAllKeys()) | |
3199 | content += "\t<key>" + key + "</key>\n" | |
3200 | "\t" + entitlements[key] + "\n"; | |
3201 | ||
3202 | content += "</dict>\n" | |
3203 | "</plist>\n"; | |
3204 | ||
3205 | auto entitlementsFile = getTargetFolder().getChildFile (target.getEntitlementsFilename()); | |
3206 | overwriteFileIfDifferentOrThrow (entitlementsFile, content); | |
3207 | ||
3208 | RelativePath entitlementsPath (entitlementsFile, getTargetFolder(), RelativePath::buildTargetFolder); | |
3209 | addFile (entitlementsPath, false, false, false, false, nullptr, {}); | |
3210 | } | |
3197 | for (auto& key : entitlements.getAllKeys()) | |
3198 | content += "\t<key>" + key + "</key>\n" | |
3199 | "\t" + entitlements[key] + "\n"; | |
3200 | ||
3201 | content += "</dict>\n" | |
3202 | "</plist>\n"; | |
3203 | ||
3204 | auto entitlementsFile = getTargetFolder().getChildFile (target.getEntitlementsFilename()); | |
3205 | overwriteFileIfDifferentOrThrow (entitlementsFile, content); | |
3206 | ||
3207 | RelativePath entitlementsPath (entitlementsFile, getTargetFolder(), RelativePath::buildTargetFolder); | |
3208 | addFile (entitlementsPath, false, false, false, false, nullptr, {}); | |
3211 | 3209 | } |
3212 | 3210 | |
3213 | 3211 | String addProjectItem (const Project::Item& projectItem) const |
616 | 616 | |
617 | 617 | RelativePath ProjectExporter::getModuleFolderRelativeToProject (const String& moduleID) const |
618 | 618 | { |
619 | if (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue()) | |
619 | if (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID)) | |
620 | 620 | return RelativePath (project.getRelativePathForFile (project.getLocalModuleFolder (moduleID)), |
621 | 621 | RelativePath::projectFolder); |
622 | 622 | |
635 | 635 | |
636 | 636 | RelativePath ProjectExporter::getLegacyModulePath (const String& moduleID) const |
637 | 637 | { |
638 | if (project.getEnabledModules().state.getChildWithProperty (Ids::ID, moduleID) ["useLocalCopy"]) | |
638 | if (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID)) | |
639 | 639 | return RelativePath (project.getRelativePathForFile (project.getGeneratedCodeFolder() |
640 | 640 | .getChildFile ("modules") |
641 | 641 | .getChildFile (moduleID)), RelativePath::projectFolder); |
410 | 410 | return directory.getChildFile ("Assets").getChildFile ("juce_icon.png").existsAsFile(); |
411 | 411 | } |
412 | 412 | |
413 | bool isJUCEFolder (const File& f) | |
414 | { | |
415 | return isJUCEModulesFolder (f.getChildFile ("modules")); | |
416 | } | |
417 | ||
418 | bool isJUCEModulesFolder (const File& f) | |
419 | { | |
420 | return f.isDirectory() && f.getChildFile ("juce_core").isDirectory(); | |
421 | } | |
422 | ||
413 | 423 | //============================================================================== |
414 | 424 | static var parseJUCEHeaderMetadata (const StringArray& lines) |
415 | 425 | { |
72 | 72 | |
73 | 73 | bool isValidJUCEExamplesDirectory (const File&) noexcept; |
74 | 74 | |
75 | bool isJUCEModulesFolder (const File&); | |
76 | bool isJUCEFolder (const File&); | |
77 | ||
75 | 78 | //============================================================================== |
76 | 79 | int indexOfLineStartingWith (const StringArray& lines, const String& text, int startIndex); |
77 | 80 |
+0
-1
86 | 86 | |
87 | 87 | void filesDropped (const StringArray& selectedFiles, int, int) override |
88 | 88 | { |
89 | ||
90 | 89 | setTo (selectedFiles[0]); |
91 | 90 | |
92 | 91 | highlightForDragAndDrop = false; |
31 | 31 | JUCE_OUTDIR := build |
32 | 32 | |
33 | 33 | ifeq ($(TARGET_ARCH),) |
34 | TARGET_ARCH := -march=native | |
34 | TARGET_ARCH := | |
35 | 35 | endif |
36 | 36 | |
37 | 37 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=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 x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
52 | 52 | JUCE_OUTDIR := build |
53 | 53 | |
54 | 54 | ifeq ($(TARGET_ARCH),) |
55 | TARGET_ARCH := -march=native | |
55 | TARGET_ARCH := | |
56 | 56 | endif |
57 | 57 | |
58 | 58 | JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=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 x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_analytics 1 |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="Z2Xzcp" name="UnitTestRunner" projectType="consoleapp" bundleIdentifier="com.roli.UnitTestRunner" |
3 | jucerVersion="5.4.6" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0" | |
3 | jucerVersion="5.4.7" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0" | |
4 | 4 | reportAppUsage="0" companyName="ROLI Ltd." companyCopyright="ROLI Ltd."> |
5 | 5 | <MAINGROUP id="GZdWCU" name="UnitTestRunner"> |
6 | 6 | <GROUP id="{22894462-E1A9-036F-ED94-B51A50C87552}" name="Source"> |
46 | 46 | |
47 | 47 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 |
48 | 48 | |
49 | #define JUCE_PROJUCER_VERSION 0x50406 | |
49 | #define JUCE_PROJUCER_VERSION 0x50407 | |
50 | 50 | |
51 | 51 | //============================================================================== |
52 | 52 | #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | |
2 | 2 | <JUCERPROJECT id="IvabE4" name="WindowsDLL" projectType="library" juceLinkage="none" |
3 | bundleIdentifier="com.roli.jucedll" jucerVersion="5.4.6" defines="JUCE_DLL_BUILD=1" | |
3 | bundleIdentifier="com.roli.jucedll" jucerVersion="5.4.7" defines="JUCE_DLL_BUILD=1" | |
4 | 4 | displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd." |
5 | 5 | companyCopyright="ROLI Ltd."> |
6 | 6 | <EXPORTFORMATS> |
35 | 35 | |
36 | 36 | ID: juce_analytics |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE analytics classes |
40 | 40 | description: Classes to collect analytics and send to destinations |
41 | 41 | website: http://www.juce.com/juce |
31 | 31 | |
32 | 32 | ID: juce_audio_basics |
33 | 33 | vendor: juce |
34 | version: 5.4.6 | |
34 | version: 5.4.7 | |
35 | 35 | name: JUCE audio and MIDI data classes |
36 | 36 | description: Classes for audio buffer manipulation, midi message handling, synthesis, etc. |
37 | 37 | website: http://www.juce.com/juce |
31 | 31 | |
32 | 32 | ID: juce_audio_devices |
33 | 33 | vendor: juce |
34 | version: 5.4.6 | |
34 | version: 5.4.7 | |
35 | 35 | name: JUCE audio and MIDI I/O device classes |
36 | 36 | description: Classes to play and record from audio and MIDI I/O devices |
37 | 37 | website: http://www.juce.com/juce |
513 | 513 | IDirectSoundBuffer* pOutputBuffer; |
514 | 514 | DWORD writeOffset; |
515 | 515 | int totalBytesPerBuffer, bytesPerBuffer; |
516 | unsigned int lastPlayCursor; | |
517 | 516 | |
518 | 517 | bool firstPlayTime; |
519 | 518 | int64 lastPlayTime, ticksPerBuffer; |
1214 | 1213 | initialiseDSoundFunctions(); |
1215 | 1214 | } |
1216 | 1215 | |
1217 | void scanForDevices() | |
1216 | void scanForDevices() override | |
1218 | 1217 | { |
1219 | 1218 | hasScanned = true; |
1220 | 1219 | deviceList.scan(); |
1221 | 1220 | } |
1222 | 1221 | |
1223 | StringArray getDeviceNames (bool wantInputNames) const | |
1222 | StringArray getDeviceNames (bool wantInputNames) const override | |
1224 | 1223 | { |
1225 | 1224 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1226 | 1225 | |
1228 | 1227 | : deviceList.outputDeviceNames; |
1229 | 1228 | } |
1230 | 1229 | |
1231 | int getDefaultDeviceIndex (bool /*forInput*/) const | |
1230 | int getDefaultDeviceIndex (bool /*forInput*/) const override | |
1232 | 1231 | { |
1233 | 1232 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1234 | 1233 | return 0; |
1235 | 1234 | } |
1236 | 1235 | |
1237 | int getIndexOfDevice (AudioIODevice* device, bool asInput) const | |
1236 | int getIndexOfDevice (AudioIODevice* device, bool asInput) const override | |
1238 | 1237 | { |
1239 | 1238 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1240 | 1239 | |
1245 | 1244 | return -1; |
1246 | 1245 | } |
1247 | 1246 | |
1248 | bool hasSeparateInputsAndOutputs() const { return true; } | |
1247 | bool hasSeparateInputsAndOutputs() const override { return true; } | |
1249 | 1248 | |
1250 | 1249 | AudioIODevice* createDevice (const String& outputDeviceName, |
1251 | const String& inputDeviceName) | |
1250 | const String& inputDeviceName) override | |
1252 | 1251 | { |
1253 | 1252 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1254 | 1253 |
1444 | 1444 | } |
1445 | 1445 | |
1446 | 1446 | //============================================================================== |
1447 | void scanForDevices() | |
1447 | void scanForDevices() override | |
1448 | 1448 | { |
1449 | 1449 | hasScanned = true; |
1450 | 1450 | |
1457 | 1457 | outputDeviceIds, inputDeviceIds); |
1458 | 1458 | } |
1459 | 1459 | |
1460 | StringArray getDeviceNames (bool wantInputNames) const | |
1460 | StringArray getDeviceNames (bool wantInputNames) const override | |
1461 | 1461 | { |
1462 | 1462 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1463 | 1463 | |
1465 | 1465 | : outputDeviceNames; |
1466 | 1466 | } |
1467 | 1467 | |
1468 | int getDefaultDeviceIndex (bool /*forInput*/) const | |
1468 | int getDefaultDeviceIndex (bool /*forInput*/) const override | |
1469 | 1469 | { |
1470 | 1470 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1471 | 1471 | return 0; |
1472 | 1472 | } |
1473 | 1473 | |
1474 | int getIndexOfDevice (AudioIODevice* device, bool asInput) const | |
1474 | int getIndexOfDevice (AudioIODevice* device, bool asInput) const override | |
1475 | 1475 | { |
1476 | 1476 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1477 | 1477 | |
1482 | 1482 | return -1; |
1483 | 1483 | } |
1484 | 1484 | |
1485 | bool hasSeparateInputsAndOutputs() const { return true; } | |
1485 | bool hasSeparateInputsAndOutputs() const override { return true; } | |
1486 | 1486 | |
1487 | 1487 | AudioIODevice* createDevice (const String& outputDeviceName, |
1488 | const String& inputDeviceName) | |
1488 | const String& inputDeviceName) override | |
1489 | 1489 | { |
1490 | 1490 | jassert (hasScanned); // need to call scanForDevices() before doing this |
1491 | 1491 |
35 | 35 | |
36 | 36 | ID: juce_audio_formats |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE audio file format codecs |
40 | 40 | description: Classes for reading and writing various audio file formats. |
41 | 41 | website: http://www.juce.com/juce |
29 | 29 | //============================================================================== |
30 | 30 | #define UNITY_AUDIO_PLUGIN_API_VERSION 0x010401 |
31 | 31 | |
32 | #if JUCE_WINDOWS | |
32 | #if JUCE_MSVC | |
33 | 33 | #define UNITY_INTERFACE_API __stdcall |
34 | 34 | #define UNITY_INTERFACE_EXPORT __declspec(dllexport) |
35 | 35 | #else |
834 | 834 | void audioProcessorChanged (AudioProcessor*) override |
835 | 835 | { |
836 | 836 | vstEffect.initialDelay = processor->getLatencySamples(); |
837 | ||
837 | triggerAsyncUpdate(); | |
838 | } | |
839 | ||
840 | void handleAsyncUpdate() override | |
841 | { | |
838 | 842 | if (hostCallback != nullptr) |
843 | { | |
839 | 844 | hostCallback (&vstEffect, Vst2::audioMasterUpdateDisplay, 0, 0, nullptr, 0); |
840 | ||
841 | triggerAsyncUpdate(); | |
842 | } | |
843 | ||
844 | void handleAsyncUpdate() override | |
845 | { | |
846 | if (hostCallback != nullptr) | |
847 | hostCallback (&vstEffect, Vst2::audioMasterIOChanged, 0, 0, nullptr, 0); | |
845 | hostCallback (&vstEffect, Vst2::audioMasterIOChanged, 0, 0, nullptr, 0); | |
846 | } | |
848 | 847 | } |
849 | 848 | |
850 | 849 | bool getPinProperties (Vst2::VstPinProperties& properties, bool direction, int index) const |
3174 | 3174 | { |
3175 | 3175 | PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST3; |
3176 | 3176 | |
3177 | #if JUCE_WINDOWS | |
3177 | #if JUCE_MSVC | |
3178 | 3178 | // Cunning trick to force this function to be exported. Life's too short to |
3179 | 3179 | // faff around creating .def files for this kind of thing. |
3180 | 3180 | #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__) |
35 | 35 | |
36 | 36 | ID: juce_audio_plugin_client |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE audio plugin wrapper classes |
40 | 40 | description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins. |
41 | 41 | website: http://www.juce.com/juce |
30 | 30 | #define STRICT 1 |
31 | 31 | #include <windows.h> |
32 | 32 | #include <float.h> |
33 | #if ! JUCE_MINGW | |
33 | #if JUCE_MSVC | |
34 | 34 | #pragma warning (disable : 4312 4355) |
35 | 35 | #endif |
36 | 36 | #ifdef __INTEL_COMPILER |
35 | 35 | |
36 | 36 | ID: juce_audio_processors |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE audio processor classes |
40 | 40 | description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. |
41 | 41 | website: http://www.juce.com/juce |
35 | 35 | |
36 | 36 | ID: juce_audio_utils |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE extra audio utility classes |
40 | 40 | description: Classes for audio-related GUI and miscellaneous tasks. |
41 | 41 | website: http://www.juce.com/juce |
31 | 31 | |
32 | 32 | ID: juce_blocks_basics |
33 | 33 | vendor: juce |
34 | version: 5.4.6 | |
34 | version: 5.4.7 | |
35 | 35 | name: Provides low-level control over ROLI BLOCKS devices |
36 | 36 | description: JUCE wrapper for low-level control over ROLI BLOCKS devices. |
37 | 37 | website: http://developer.roli.com |
35 | 35 | |
36 | 36 | ID: juce_box2d |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE wrapper for the Box2D physics engine |
40 | 40 | description: The Box2D physics engine and some utility classes. |
41 | 41 | website: http://www.juce.com/juce |
47 | 47 | #if JUCE_WINDOWS |
48 | 48 | #include <ctime> |
49 | 49 | |
50 | #if ! JUCE_MINGW | |
50 | #if JUCE_MINGW | |
51 | #include <ws2spi.h> | |
52 | #include <cstdio> | |
53 | #include <locale.h> | |
54 | #else | |
51 | 55 | #pragma warning (push) |
52 | 56 | #pragma warning (disable: 4091) |
53 | 57 | #include <Dbghelp.h> |
56 | 60 | #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES |
57 | 61 | #pragma comment (lib, "DbgHelp.lib") |
58 | 62 | #endif |
59 | #endif | |
60 | ||
61 | #if JUCE_MINGW | |
62 | #include <ws2spi.h> | |
63 | #include <cstdio> | |
64 | #include <locale.h> | |
65 | 63 | #endif |
66 | 64 | |
67 | 65 | #else |
31 | 31 | |
32 | 32 | ID: juce_core |
33 | 33 | vendor: juce |
34 | version: 5.4.6 | |
34 | version: 5.4.7 | |
35 | 35 | name: JUCE core classes |
36 | 36 | 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. |
37 | 37 | website: http://www.juce.com/juce |
106 | 106 | //============================================================================== |
107 | 107 | /** Config: JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES |
108 | 108 | |
109 | In a Visual C++ build, this can be used to stop the required system libs being | |
109 | In a Windows build, this can be used to stop the required system libs being | |
110 | 110 | automatically added to the link stage. |
111 | 111 | */ |
112 | 112 | #ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES |
175 | 175 | #pragma warning (4: 4511 4512 4100) |
176 | 176 | #endif |
177 | 177 | |
178 | #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
178 | #if ! JUCE_MINGW && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
179 | 179 | #pragma comment (lib, "kernel32.lib") |
180 | 180 | #pragma comment (lib, "user32.lib") |
181 | 181 | #pragma comment (lib, "wininet.lib") |
22 | 22 | namespace juce |
23 | 23 | { |
24 | 24 | |
25 | #if ! JUCE_MINGW | |
25 | #if JUCE_MSVC | |
26 | 26 | #pragma intrinsic (__cpuid) |
27 | 27 | #pragma intrinsic (__rdtsc) |
28 | 28 | #endif |
40 | 40 | |
41 | 41 | //============================================================================== |
42 | 42 | |
43 | #if JUCE_MINGW | |
43 | #if JUCE_MINGW || JUCE_CLANG | |
44 | 44 | static void callCPUID (int result[4], uint32 type) |
45 | 45 | { |
46 | 46 | uint32 la = result[0], lb = result[1], lc = result[2], ld = result[3]; |
28 | 28 | */ |
29 | 29 | #define JUCE_MAJOR_VERSION 5 |
30 | 30 | #define JUCE_MINOR_VERSION 4 |
31 | #define JUCE_BUILDNUMBER 6 | |
31 | #define JUCE_BUILDNUMBER 7 | |
32 | 32 | |
33 | 33 | /** Current JUCE version number. |
34 | 34 |
35 | 35 | |
36 | 36 | ID: juce_cryptography |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE cryptography classes |
40 | 40 | description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc. |
41 | 41 | website: http://www.juce.com/juce |
35 | 35 | |
36 | 36 | ID: juce_data_structures |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE data model helper classes |
40 | 40 | description: Classes for undo/redo management, and smart data structures. |
41 | 41 | website: http://www.juce.com/juce |
35 | 35 | |
36 | 36 | ID: juce_dsp |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE DSP classes |
40 | 40 | description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc. |
41 | 41 | website: http://www.juce.com/juce |
31 | 31 | |
32 | 32 | ID: juce_events |
33 | 33 | vendor: juce |
34 | version: 5.4.6 | |
34 | version: 5.4.7 | |
35 | 35 | name: JUCE message and event handling classes |
36 | 36 | description: Classes for running an application's main event loop and sending/receiving messages, timers, etc. |
37 | 37 | website: http://www.juce.com/juce |
35 | 35 | |
36 | 36 | ID: juce_graphics |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE graphics classes |
40 | 40 | description: Classes for 2D vector graphics, image loading/saving, font handling, etc. |
41 | 41 | website: http://www.juce.com/juce |
59 | 59 | CGColorSpaceRelease (colourSpace); |
60 | 60 | } |
61 | 61 | |
62 | ~CoreGraphicsPixelData() override | |
63 | { | |
64 | freeCachedImageRef(); | |
65 | CGContextRelease (context); | |
66 | } | |
62 | ~CoreGraphicsPixelData() override; | |
67 | 63 | |
68 | 64 | std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override |
69 | 65 | { |
187 | 183 | |
188 | 184 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsPixelData) |
189 | 185 | }; |
186 | ||
187 | // The following implementation is outside of the class definition to avoid spurious | |
188 | // warning messages when dynamically loading libraries at runtime on macOS | |
189 | CoreGraphicsPixelData::~CoreGraphicsPixelData() | |
190 | { | |
191 | freeCachedImageRef(); | |
192 | CGContextRelease (context); | |
193 | } | |
190 | 194 | |
191 | 195 | ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const |
192 | 196 | { |
47 | 47 | return ComBaseClassHelper<IDWriteTextRenderer>::QueryInterface (refId, result); |
48 | 48 | } |
49 | 49 | |
50 | JUCE_COMRESULT IsPixelSnappingDisabled (void* /*clientDrawingContext*/, BOOL* isDisabled) override | |
50 | JUCE_COMRESULT IsPixelSnappingDisabled (void* /*clientDrawingContext*/, BOOL* isDisabled) noexcept override | |
51 | 51 | { |
52 | 52 | *isDisabled = FALSE; |
53 | 53 | return S_OK; |
54 | 54 | } |
55 | 55 | |
56 | JUCE_COMRESULT GetCurrentTransform (void*, DWRITE_MATRIX* matrix) override | |
56 | JUCE_COMRESULT GetCurrentTransform (void*, DWRITE_MATRIX* matrix) noexcept override | |
57 | 57 | { |
58 | 58 | matrix->m11 = 1.0f; matrix->m12 = 0.0f; |
59 | 59 | matrix->m21 = 0.0f; matrix->m22 = 1.0f; |
61 | 61 | return S_OK; |
62 | 62 | } |
63 | 63 | |
64 | JUCE_COMRESULT GetPixelsPerDip (void*, FLOAT* pixelsPerDip) override | |
64 | JUCE_COMRESULT GetPixelsPerDip (void*, FLOAT* pixelsPerDip) noexcept override | |
65 | 65 | { |
66 | 66 | *pixelsPerDip = 1.0f; |
67 | 67 | return S_OK; |
68 | 68 | } |
69 | 69 | |
70 | JUCE_COMRESULT DrawUnderline (void*, FLOAT, FLOAT, DWRITE_UNDERLINE const*, IUnknown*) override | |
70 | JUCE_COMRESULT DrawUnderline (void*, FLOAT, FLOAT, DWRITE_UNDERLINE const*, IUnknown*) noexcept override | |
71 | 71 | { |
72 | 72 | return E_NOTIMPL; |
73 | 73 | } |
74 | 74 | |
75 | JUCE_COMRESULT DrawStrikethrough (void*, FLOAT, FLOAT, DWRITE_STRIKETHROUGH const*, IUnknown*) override | |
75 | JUCE_COMRESULT DrawStrikethrough (void*, FLOAT, FLOAT, DWRITE_STRIKETHROUGH const*, IUnknown*) noexcept override | |
76 | 76 | { |
77 | 77 | return E_NOTIMPL; |
78 | 78 | } |
79 | 79 | |
80 | JUCE_COMRESULT DrawInlineObject (void*, FLOAT, FLOAT, IDWriteInlineObject*, BOOL, BOOL, IUnknown*) override | |
80 | JUCE_COMRESULT DrawInlineObject (void*, FLOAT, FLOAT, IDWriteInlineObject*, BOOL, BOOL, IUnknown*) noexcept override | |
81 | 81 | { |
82 | 82 | return E_NOTIMPL; |
83 | 83 | } |
84 | 84 | |
85 | 85 | JUCE_COMRESULT DrawGlyphRun (void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE, |
86 | 86 | DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* runDescription, |
87 | IUnknown* clientDrawingEffect) override | |
87 | IUnknown* clientDrawingEffect) noexcept override | |
88 | 88 | { |
89 | 89 | auto layout = static_cast<TextLayout*> (clientDrawingContext); |
90 | 90 | |
206 | 206 | DWRITE_FONT_METRICS dwFontMetrics; |
207 | 207 | dwFontFace->GetMetrics (&dwFontMetrics); |
208 | 208 | |
209 | const float totalHeight = (float) (std::abs (dwFontMetrics.ascent) + std::abs (dwFontMetrics.descent)); | |
209 | const float totalHeight = (float) (dwFontMetrics.ascent + dwFontMetrics.descent); | |
210 | 210 | return dwFontMetrics.designUnitsPerEm / totalHeight; |
211 | 211 | } |
212 | 212 |
284 | 284 | { |
285 | 285 | PathGeometrySink() : ComBaseClassHelper<IDWriteGeometrySink> (0) {} |
286 | 286 | |
287 | void __stdcall AddBeziers (const D2D1_BEZIER_SEGMENT* beziers, UINT beziersCount) override | |
287 | void __stdcall AddBeziers (const D2D1_BEZIER_SEGMENT* beziers, UINT beziersCount) noexcept override | |
288 | 288 | { |
289 | 289 | for (UINT i = 0; i < beziersCount; ++i) |
290 | 290 | path.cubicTo (convertPoint (beziers[i].point1), |
292 | 292 | convertPoint (beziers[i].point3)); |
293 | 293 | } |
294 | 294 | |
295 | void __stdcall AddLines (const D2D1_POINT_2F* points, UINT pointsCount) override | |
295 | void __stdcall AddLines (const D2D1_POINT_2F* points, UINT pointsCount) noexcept override | |
296 | 296 | { |
297 | 297 | for (UINT i = 0; i < pointsCount; ++i) |
298 | 298 | path.lineTo (convertPoint (points[i])); |
299 | 299 | } |
300 | 300 | |
301 | void __stdcall BeginFigure (D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN) override | |
301 | void __stdcall BeginFigure (D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN) noexcept override | |
302 | 302 | { |
303 | 303 | path.startNewSubPath (convertPoint (startPoint)); |
304 | 304 | } |
305 | 305 | |
306 | void __stdcall EndFigure (D2D1_FIGURE_END figureEnd) override | |
306 | void __stdcall EndFigure (D2D1_FIGURE_END figureEnd) noexcept override | |
307 | 307 | { |
308 | 308 | if (figureEnd == D2D1_FIGURE_END_CLOSED) |
309 | 309 | path.closeSubPath(); |
310 | 310 | } |
311 | 311 | |
312 | void __stdcall SetFillMode (D2D1_FILL_MODE fillMode) override | |
312 | void __stdcall SetFillMode (D2D1_FILL_MODE fillMode) noexcept override | |
313 | 313 | { |
314 | 314 | path.setUsingNonZeroWinding (fillMode == D2D1_FILL_MODE_WINDING); |
315 | 315 | } |
316 | 316 | |
317 | void __stdcall SetSegmentFlags (D2D1_PATH_SEGMENT) override {} | |
318 | JUCE_COMRESULT Close() override { return S_OK; } | |
317 | void __stdcall SetSegmentFlags (D2D1_PATH_SEGMENT) noexcept override {} | |
318 | JUCE_COMRESULT Close() noexcept override { return S_OK; } | |
319 | 319 | |
320 | 320 | Path path; |
321 | 321 |
70 | 70 | #include <exdispid.h> |
71 | 71 | #endif |
72 | 72 | |
73 | #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
73 | #if JUCE_MINGW | |
74 | #include <imm.h> | |
75 | #elif ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
74 | 76 | #pragma comment(lib, "vfw32.lib") |
75 | 77 | #pragma comment(lib, "imm32.lib") |
76 | #endif | |
77 | ||
78 | #if JUCE_OPENGL | |
79 | #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
78 | ||
79 | #if JUCE_OPENGL | |
80 | 80 | #pragma comment(lib, "OpenGL32.Lib") |
81 | 81 | #pragma comment(lib, "GlU32.Lib") |
82 | 82 | #endif |
83 | #endif | |
84 | ||
85 | #if JUCE_DIRECT2D && JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
86 | #pragma comment (lib, "Dwrite.lib") | |
87 | #pragma comment (lib, "D2d1.lib") | |
88 | #endif | |
89 | ||
90 | #if JUCE_MINGW | |
91 | #include <imm.h> | |
83 | ||
84 | #if JUCE_DIRECT2D | |
85 | #pragma comment (lib, "Dwrite.lib") | |
86 | #pragma comment (lib, "D2d1.lib") | |
87 | #endif | |
92 | 88 | #endif |
93 | 89 | |
94 | 90 | //============================================================================== |
35 | 35 | |
36 | 36 | ID: juce_gui_basics |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE GUI core classes |
40 | 40 | description: Basic user-interface components and related classes. |
41 | 41 | website: http://www.juce.com/juce |
996 | 996 | } |
997 | 997 | |
998 | 998 | //============================================================================== |
999 | bool sendModalInputAttemptIfBlocked() | |
999 | bool isBlockedByModalComponent() | |
1000 | 1000 | { |
1001 | 1001 | if (auto* modal = Component::getCurrentlyModalComponent()) |
1002 | 1002 | { |
1004 | 1004 | && (! getComponent().isParentOf (modal)) |
1005 | 1005 | && getComponent().isCurrentlyBlockedByAnotherModalComponent()) |
1006 | 1006 | { |
1007 | return true; | |
1008 | } | |
1009 | } | |
1010 | ||
1011 | return false; | |
1012 | } | |
1013 | ||
1014 | void sendModalInputAttemptIfBlocked() | |
1015 | { | |
1016 | if (isBlockedByModalComponent()) | |
1017 | if (auto* modal = Component::getCurrentlyModalComponent()) | |
1007 | 1018 | modal->inputAttemptWhenModal(); |
1008 | return true; | |
1009 | } | |
1010 | } | |
1011 | ||
1012 | return false; | |
1013 | 1019 | } |
1014 | 1020 | |
1015 | 1021 | bool canBecomeKeyWindow() |
1880 | 1886 | static BOOL becomeFirstResponder (id self, SEL) |
1881 | 1887 | { |
1882 | 1888 | if (auto* owner = getOwner (self)) |
1883 | { | |
1884 | if (owner->canBecomeKeyWindow()) | |
1885 | { | |
1886 | owner->viewFocusGain(); | |
1887 | return YES; | |
1888 | } | |
1889 | } | |
1890 | ||
1891 | return NO; | |
1889 | owner->viewFocusGain(); | |
1890 | ||
1891 | return YES; | |
1892 | 1892 | } |
1893 | 1893 | |
1894 | 1894 | static BOOL resignFirstResponder (id self, SEL) |
1987 | 1987 | |
1988 | 1988 | return owner != nullptr |
1989 | 1989 | && owner->canBecomeKeyWindow() |
1990 | && ! owner->sendModalInputAttemptIfBlocked(); | |
1990 | && ! owner->isBlockedByModalComponent(); | |
1991 | 1991 | } |
1992 | 1992 | |
1993 | 1993 | static BOOL canBecomeMainWindow (id self, SEL) |
1996 | 1996 | |
1997 | 1997 | return owner != nullptr |
1998 | 1998 | && owner->canBecomeMainWindow() |
1999 | && ! owner->sendModalInputAttemptIfBlocked(); | |
1999 | && ! owner->isBlockedByModalComponent(); | |
2000 | 2000 | } |
2001 | 2001 | |
2002 | 2002 | static void becomeKeyWindow (id self, SEL) |
124 | 124 | class JuceDataObject : public ComBaseClassHelper <IDataObject> |
125 | 125 | { |
126 | 126 | public: |
127 | JuceDataObject (JuceDropSource* s, const FORMATETC* f, const STGMEDIUM* m) | |
128 | : dropSource (s), format (f), medium (m) | |
127 | JuceDataObject (const FORMATETC* f, const STGMEDIUM* m) | |
128 | : format (f), medium (m) | |
129 | 129 | { |
130 | 130 | } |
131 | 131 | |
202 | 202 | JUCE_COMRESULT EnumDAdvise (IEnumSTATDATA**) { return OLE_E_ADVISENOTSUPPORTED; } |
203 | 203 | |
204 | 204 | private: |
205 | JuceDropSource* const dropSource; | |
206 | 205 | const FORMATETC* const format; |
207 | 206 | const STGMEDIUM* const medium; |
208 | 207 | |
254 | 253 | OleInitialize (0); |
255 | 254 | |
256 | 255 | auto source = new JuceDropSource(); |
257 | auto data = new JuceDataObject (source, &format, &medium); | |
256 | auto data = new JuceDataObject (&format, &medium); | |
258 | 257 | |
259 | 258 | DWORD effect; |
260 | 259 | DoDragDrop (data, source, whatToDo, &effect); |
2240 | 2240 | } |
2241 | 2241 | } |
2242 | 2242 | |
2243 | void setIcon (const Image& newIcon) | |
2243 | void setIcon (const Image& newIcon) override | |
2244 | 2244 | { |
2245 | 2245 | if (auto hicon = IconConverters::createHICONFromImage (newIcon, TRUE, 0, 0)) |
2246 | 2246 | { |
722 | 722 | if (multiple) |
723 | 723 | selectRangeOfRows (lastRowSelected, lastRowSelected + 1); |
724 | 724 | else |
725 | selectRow (jmin (totalItems - 1, jmax (0, lastRowSelected) + 1)); | |
725 | selectRow (jmin (totalItems - 1, jmax (0, lastRowSelected + 1))); | |
726 | 726 | } |
727 | 727 | else if (key.isKeyCode (KeyPress::pageUpKey)) |
728 | 728 | { |
35 | 35 | |
36 | 36 | ID: juce_gui_extra |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE extended GUI classes |
40 | 40 | description: Miscellaneous GUI classes for specialised tasks. |
41 | 41 | website: http://www.juce.com/juce |
152 | 152 | { |
153 | 153 | EventHandler (WebBrowserComponent& w) : ComponentMovementWatcher (&w), owner (w) {} |
154 | 154 | |
155 | JUCE_COMRESULT GetTypeInfoCount (UINT*) { return E_NOTIMPL; } | |
156 | JUCE_COMRESULT GetTypeInfo (UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } | |
157 | JUCE_COMRESULT GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; } | |
155 | JUCE_COMRESULT GetTypeInfoCount (UINT*) override { return E_NOTIMPL; } | |
156 | JUCE_COMRESULT GetTypeInfo (UINT, LCID, ITypeInfo**) override { return E_NOTIMPL; } | |
157 | JUCE_COMRESULT GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) override { return E_NOTIMPL; } | |
158 | 158 | |
159 | 159 | JUCE_COMRESULT Invoke (DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pDispParams, |
160 | VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) | |
160 | VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) override | |
161 | 161 | { |
162 | 162 | if (dispIdMember == DISPID_BEFORENAVIGATE2) |
163 | 163 | { |
47 | 47 | #elif JUCE_WINDOWS |
48 | 48 | #include <windowsx.h> |
49 | 49 | |
50 | #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
50 | #if ! JUCE_MINGW && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
51 | 51 | #pragma comment(lib, "OpenGL32.Lib") |
52 | 52 | #endif |
53 | 53 |
35 | 35 | |
36 | 36 | ID: juce_opengl |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE OpenGL classes |
40 | 40 | description: Classes for rendering OpenGL in a JUCE window. |
41 | 41 | website: http://www.juce.com/juce |
35 | 35 | |
36 | 36 | ID: juce_osc |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE OSC classes |
40 | 40 | description: Open Sound Control implementation. |
41 | 41 | website: http://www.juce.com/juce |
63 | 63 | |
64 | 64 | An OSCBundle Element contains either one OSCMessage or one OSCBundle. |
65 | 65 | */ |
66 | class Element | |
66 | class JUCE_API Element | |
67 | 67 | { |
68 | 68 | public: |
69 | 69 | //============================================================================== |
35 | 35 | |
36 | 36 | ID: juce_product_unlocking |
37 | 37 | vendor: juce |
38 | version: 5.4.6 | |
38 | version: 5.4.7 | |
39 | 39 | name: JUCE Online marketplace support |
40 | 40 | description: Classes for online product authentication |
41 | 41 | website: http://www.juce.com/juce |
+20
-3
1 | 1 | |
2 | 2 | import com.android.billingclient.api.*; |
3 | 3 | |
4 | public class JuceBillingClient implements PurchasesUpdatedListener { | |
4 | public class JuceBillingClient implements PurchasesUpdatedListener, BillingClientStateListener { | |
5 | 5 | private native void skuDetailsQueryCallback(long host, java.util.List<SkuDetails> skuDetails); |
6 | 6 | private native void purchasesListQueryCallback(long host, java.util.List<Purchase> purchases); |
7 | 7 | private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode); |
15 | 15 | .setListener(this) |
16 | 16 | .build(); |
17 | 17 | |
18 | billingClient.startConnection(null); | |
18 | billingClient.startConnection(this); | |
19 | 19 | } |
20 | 20 | |
21 | 21 | public void endConnection() { |
126 | 126 | } |
127 | 127 | } |
128 | 128 | |
129 | @Override | |
130 | public void onBillingServiceDisconnected() | |
131 | { | |
132 | ||
133 | } | |
134 | ||
135 | @Override | |
136 | public void onBillingSetupFinished(BillingResult billingResult) | |
137 | { | |
138 | ||
139 | } | |
140 | ||
129 | 141 | private void executeOnBillingClientConnection(Runnable runnable) { |
130 | 142 | if (billingClient.isReady()) { |
131 | 143 | runnable.run(); |
161 | 173 | @Override |
162 | 174 | public void run() { |
163 | 175 | AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); |
164 | billingClient.acknowledgePurchase(acknowledgePurchaseParams, null); | |
176 | billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() { | |
177 | @Override | |
178 | public void onAcknowledgePurchaseResponse(BillingResult billingResult) { | |
179 | ||
180 | } | |
181 | }); | |
165 | 182 | } |
166 | 183 | }); |
167 | 184 | } |
44 | 44 | #import <AVKit/AVKit.h> |
45 | 45 | |
46 | 46 | //============================================================================== |
47 | #elif JUCE_MSVC | |
47 | #elif JUCE_WINDOWS && ! JUCE_MINGW | |
48 | 48 | /* If you're using the camera classes, you'll need access to a few DirectShow headers. |
49 | 49 | These files are provided in the normal Windows SDK. */ |
50 | 50 | #include <dshow.h> |
51 | 51 | #include <dshowasf.h> |
52 | 52 | #include <evr.h> |
53 | 53 | |
54 | #if JUCE_USE_CAMERA && JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
55 | #pragma comment (lib, "Strmiids.lib") | |
56 | #pragma comment (lib, "wmvcore.lib") | |
57 | #endif | |
54 | #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
55 | #pragma comment (lib, "strmiids.lib") | |
58 | 56 | |
59 | #if JUCE_MEDIAFOUNDATION && JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
60 | #pragma comment (lib, "mfuuid.lib") | |
61 | #endif | |
57 | #if JUCE_USE_CAMERA | |
58 | #pragma comment (lib, "Strmiids.lib") | |
59 | #pragma comment (lib, "wmvcore.lib") | |
60 | #endif | |
62 | 61 | |
63 | #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |
64 | #pragma comment (lib, "strmiids.lib") | |
62 | #if JUCE_MEDIAFOUNDATION | |
63 | #pragma comment (lib, "mfuuid.lib") | |
64 | #endif | |
65 | 65 | #endif |
66 | 66 | #endif |
67 | 67 |