@@ -2,11 +2,14 @@ | |||
In this document, Mod is Ctrl on Windows/Linux and Cmd on Mac. | |||
### 1.2.0 (in development) | |||
- Enable app notarization on Mac, removing the "Apple cannot check for malicious software" message on launch. | |||
### 1.1.2 (2019-07-20) | |||
- Add app notarization on Mac, which removes the "Apple cannot check for malicious software" message on launch. | |||
- Write stack trace to log.txt and display dialog box when Rack crashes. | |||
- Re-enable JACK MIDI driver on Linux. | |||
- Fix scroll speed for mice and trackpads on Mac. | |||
- Fix undo history bug when dragging patch file to the Rack window. | |||
- Fix crash when pasting presets to an empty rack space with Mod-V. | |||
- Fix module expanders being assigned incorrectly when loading presets. | |||
- Add check for duplicate port IDs for modules. | |||
### 1.1.1 (2019-07-01) | |||
@@ -0,0 +1,77 @@ | |||
# Contributor Covenant Code of Conduct | |||
## Our Pledge | |||
In the interest of fostering an open and welcoming environment, we as | |||
contributors and maintainers pledge to making participation in our project and | |||
our community a harassment-free experience for everyone, regardless of age, body | |||
size, disability, ethnicity, sex characteristics, gender identity and expression, | |||
level of experience, education, socio-economic status, nationality, personal | |||
appearance, race, religion, or sexual identity and orientation. | |||
## Our Standards | |||
Examples of behavior that contributes to creating a positive environment | |||
include: | |||
* Using welcoming and inclusive language | |||
* Being respectful of differing viewpoints and experiences | |||
* Gracefully accepting constructive criticism | |||
* Focusing on what is best for the community | |||
* Showing empathy towards other community members | |||
Examples of unacceptable behavior by participants include: | |||
* The use of sexualized language or imagery and unwelcome sexual attention or | |||
advances | |||
* Trolling, insulting/derogatory comments, and personal or political attacks | |||
* Public or private harassment | |||
* Publishing others' private information, such as a physical or electronic | |||
address, without explicit permission | |||
* Other conduct which could reasonably be considered inappropriate in a | |||
professional setting | |||
## Our Responsibilities | |||
Project maintainers are responsible for clarifying the standards of acceptable | |||
behavior and are expected to take appropriate and fair corrective action in | |||
response to any instances of unacceptable behavior. | |||
Project maintainers have the right and responsibility to remove, edit, or | |||
reject comments, commits, code, wiki edits, issues, and other contributions | |||
that are not aligned to this Code of Conduct, or to ban temporarily or | |||
permanently any contributor for other behaviors that they deem inappropriate, | |||
threatening, offensive, or harmful. | |||
## Scope | |||
This Code of Conduct applies within all project spaces, and it also applies when | |||
an individual is representing the project or its community in public spaces. | |||
Examples of representing a project or community include using an official | |||
project e-mail address, posting via an official social media account, or acting | |||
as an appointed representative at an online or offline event. Representation of | |||
a project may be further defined and clarified by project maintainers. | |||
## Enforcement | |||
Instances of abusive, harassing, or otherwise unacceptable behavior may be | |||
reported by contacting the project team at contact@vcvrack.com. All | |||
complaints will be reviewed and investigated and will result in a response that | |||
is deemed necessary and appropriate to the circumstances. The project team is | |||
obligated to maintain confidentiality with regard to the reporter of an incident. | |||
Further details of specific enforcement policies may be posted separately. | |||
Project maintainers who do not follow or enforce the Code of Conduct in good | |||
faith may face temporary or permanent repercussions as determined by other | |||
members of the project's leadership. | |||
## Attribution | |||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, | |||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html | |||
[homepage]: https://www.contributor-covenant.org | |||
For answers to common questions about this code of conduct, see | |||
https://www.contributor-covenant.org/faq | |||
@@ -1,7 +1,7 @@ | |||
{ | |||
"slug": "Core", | |||
"name": "Core", | |||
"version": "1.0.0", | |||
"version": "1.1.2", | |||
"license": "GPL-3.0-only", | |||
"author": "VCV", | |||
"brand": "VCV", | |||
@@ -12,19 +12,19 @@ All VCV Rack **source code** is copyright © 2019 Andrew Belt and licensed under | |||
This means that non-commercial plugins do not need to be licensed under the GPLv3 and can be released under any license of your choice (open-source or proprietary freeware). However, plugins that copy a significant portion of non-API source code from Rack must be licensed under GPLv3. | |||
If you wish to release a proprietary commercial plugin, email contact@vcvrack.com for commercial licensing. A commercial license is included for plugins sold in the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||
If you wish to release a proprietary commercial plugin, email contact@vcvrack.com for commercial licensing. A commercial license is included for plugins sold in the [VCV Library](https://vcvrack.com/plugins.html). | |||
--- | |||
Licenses of **third-party libraries** are listed in [LICENSE-dist.txt](LICENSE-dist.txt). | |||
The **Component Library graphics** in the `res/ComponentLibrary` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). | |||
You may not freely sell plugins using Component Library graphics. | |||
However, a free commercial license is available for plugins sold through the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||
Email contact@vcvrack.com for more information about licensing or the VCV Plugin Manager. | |||
This means you may not freely sell plugins using Component Library graphics. | |||
However, a free commercial license is available for plugins sold through the [VCV Library](https://vcvrack.com/plugins.html). | |||
Email contact@vcvrack.com for more information about licensing or the VCV Library. | |||
The **Core panel graphics** in the `res/Core` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). | |||
You may not distribute modified adaptations of these graphics. | |||
This means you may not distribute modified adaptations of these graphics. | |||
The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works. | |||
@@ -1,6 +1,6 @@ | |||
RACK_DIR ?= . | |||
VERSION := 1.dev.$(shell git rev-parse --short HEAD) | |||
# VERSION := 1.1.1 | |||
# VERSION := 1.dev.$(shell git rev-parse --short HEAD) | |||
VERSION := 1.1.2 | |||
FLAGS += -DVERSION=$(VERSION) | |||
FLAGS += -Iinclude -Idep/include | |||
@@ -38,8 +38,8 @@ endif | |||
ifdef ARCH_WIN | |||
SOURCES += dep/osdialog/osdialog_win.c | |||
LDFLAGS += -Wl,--export-all-symbols,--out-implib,libRack.a -mwindows \ | |||
dep/lib/libglew32.a dep/lib/libglfw3.a dep/lib/libjansson.a dep/lib/libspeexdsp.a dep/lib/libzip.a dep/lib/libz.a dep/lib/libcurl.a dep/lib/libssl.a dep/lib/libcrypto.a dep/lib/librtaudio.a dep/lib/librtmidi.a \ | |||
-lpthread -lopengl32 -lgdi32 -lws2_32 -lcomdlg32 -lole32 -ldsound -lwinmm -lksuser -lshlwapi -lmfplat -lmfuuid -lwmcodecdspuuid -ldbghelp | |||
dep/lib/libglew32.a dep/lib/libglfw3.a dep/lib/libjansson.a dep/lib/libspeexdsp.a dep/lib/libzip.a dep/lib/libz.a dep/lib/libcurl.a dep/lib/librtaudio.a dep/lib/librtmidi.a \ | |||
-lpthread -lopengl32 -lgdi32 -lws2_32 -lcomdlg32 -lole32 -lcrypt32 -ldsound -lwinmm -lksuser -lshlwapi -lmfplat -lmfuuid -lwmcodecdspuuid -ldbghelp | |||
TARGET := Rack.exe | |||
OBJECTS += Rack.res | |||
endif | |||
@@ -130,7 +130,6 @@ ifdef ARCH_MAC | |||
# This will only work if you have the private key to my certificate | |||
codesign --verbose --sign "Developer ID Application: Andrew Belt (VRF26934X5)" --options runtime --entitlements Entitlements.plist --deep dist/$(TARGET).app | |||
codesign --verify --deep --strict --verbose=2 dist/$(TARGET).app | |||
# spctl --assess --type execute --ignore-cache --no-cache -vv dist/$(TARGET).app | |||
# Make ZIP | |||
cd dist && zip -q -9 -r Rack-$(VERSION)-$(ARCH).zip $(TARGET).app | |||
endif | |||
@@ -171,6 +170,7 @@ ifdef ARCH_MAC | |||
xcrun altool --notarize-app -f dist/Rack-$(VERSION)-$(ARCH).zip --primary-bundle-id=com.vcvrack.rack -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/UploadInfo.plist | |||
# Wait for Apple's servers to approve the app | |||
while true; do \ | |||
echo "Waiting on Apple servers..." ; \ | |||
xcrun altool --notarization-info `/usr/libexec/PlistBuddy -c "Print :notarization-upload:RequestUUID" dist/UploadInfo.plist` -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/RequestInfo.plist ; \ | |||
if [ "`/usr/libexec/PlistBuddy -c "Print :notarization-info:Status" dist/RequestInfo.plist`" != "in progress" ]; then \ | |||
break ; \ | |||
@@ -119,11 +119,24 @@ curl-7.64.1: | |||
$(UNTAR) curl-7.64.1.tar.gz | |||
rm curl-7.64.1.tar.gz | |||
$(libcurl): $(openssl) curl-7.64.1 | |||
cd curl-7.64.1 && PKG_CONFIG_PATH= $(CONFIGURE) \ | |||
--disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-shared --disable-symbol-hiding \ | |||
--without-zlib --without-libpsl --without-libmetalink --without-libssh2 --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-brotli \ | |||
--without-ca-bundle --with-ca-fallback --with-ssl="$(DEP_PATH)" | |||
CURL_FLAGS += --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-shared --disable-symbol-hiding | |||
CURL_FLAGS += --without-zlib --without-libpsl --without-libmetalink --without-libssh2 --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-brotli | |||
ifdef ARCH_LIN | |||
CURL_FLAGS += --with-ssl="$(DEP_PATH)" | |||
CURL_DEPS += $(openssl) | |||
endif | |||
ifdef ARCH_MAC | |||
# Since Rack supports Mac 10.7 but Apple's Secure Transport only supports TLS 1.0 on that OS, use OpenSSL instead. | |||
# CURL_FLAGS += --with-secure-transport | |||
CURL_FLAGS += --with-ssl="$(DEP_PATH)" | |||
CURL_DEPS += $(openssl) | |||
endif | |||
ifdef ARCH_WIN | |||
CURL_FLAGS += --with-schannel --without-ssl | |||
endif | |||
$(libcurl): $(CURL_DEPS) curl-7.64.1 | |||
cd curl-7.64.1 && PKG_CONFIG_PATH= $(CONFIGURE) $(CURL_FLAGS) | |||
$(MAKE) -C curl-7.64.1 | |||
$(MAKE) -C curl-7.64.1 install | |||
@@ -163,15 +176,15 @@ rtmidi-4.0.0: | |||
rm rtmidi-4.0.0.tar.gz | |||
RTMIDI_FLAGS += --enable-shared=no | |||
ifdef ARCH_LIN | |||
RTMIDI_FLAGS += --with-jack --with-alsa | |||
endif | |||
ifdef ARCH_MAC | |||
RTMIDI_FLAGS += --with-core --without-jack | |||
endif | |||
ifdef ARCH_WIN | |||
RTMIDI_FLAGS += --with-winmm | |||
endif | |||
ifdef ARCH_LIN | |||
RTMIDI_FLAGS += --with-jack --with-alsa | |||
endif | |||
$(rtmidi): rtmidi-4.0.0 | |||
cd rtmidi-4.0.0 && $(CONFIGURE) $(RTMIDI_FLAGS) | |||
@@ -179,15 +192,15 @@ $(rtmidi): rtmidi-4.0.0 | |||
$(MAKE) -C rtmidi-4.0.0 install | |||
RTAUDIO_FLAGS += -DRTAUDIO_BUILD_STATIC_LIBS=ON | |||
ifdef ARCH_LIN | |||
RTAUDIO_FLAGS += -DRTAUDIO_API_ALSA=ON -DRTAUDIO_API_JACK=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_OSS=OFF | |||
endif | |||
ifdef ARCH_MAC | |||
RTAUDIO_FLAGS += -DRTAUDIO_API_CORE=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_JACK=OFF | |||
endif | |||
ifdef ARCH_WIN | |||
RTAUDIO_FLAGS += -DRTAUDIO_API_DS=ON -DRTAUDIO_API_WASAPI=ON -DRTAUDIO_API_ASIO=ON | |||
endif | |||
ifdef ARCH_LIN | |||
RTAUDIO_FLAGS += -DRTAUDIO_API_ALSA=ON -DRTAUDIO_API_JACK=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_OSS=OFF | |||
endif | |||
$(rtaudio): rtaudio | |||
cd rtaudio && mkdir -p build | |||
@@ -26,6 +26,7 @@ std::string plugin(plugin::Plugin *plugin, std::string filename); | |||
extern std::string systemDir; | |||
extern std::string userDir; | |||
extern std::string logPath; | |||
extern std::string pluginsPath; | |||
extern std::string settingsPath; | |||
extern std::string autosavePath; | |||
@@ -447,6 +447,12 @@ struct BlueLight : GrayModuleLightWidget { | |||
} | |||
}; | |||
struct WhiteLight : GrayModuleLightWidget { | |||
WhiteLight() { | |||
addBaseColor(SCHEME_WHITE); | |||
} | |||
}; | |||
/** Reads two adjacent lightIds, so `lightId` and `lightId + 1` must be defined */ | |||
struct GreenRedLight : GrayModuleLightWidget { | |||
GreenRedLight() { | |||
@@ -26,8 +26,6 @@ json_t *requestJson(Method method, std::string url, json_t *dataJ); | |||
bool requestDownload(std::string url, const std::string &filename, float *progress); | |||
/** URL-encodes `s` */ | |||
std::string encodeUrl(const std::string &s); | |||
/** Computes the SHA256 of the file at `filename` */ | |||
std::string computeSHA256File(const std::string &filename); | |||
/** Gets the path portion of the URL. */ | |||
std::string urlPath(const std::string &url); | |||
@@ -1,2 +0,0 @@ | |||
Component Library graphics by Grayscale (http://grayscale.info/) | |||
Licensed under CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/) |
@@ -1,3 +0,0 @@ | |||
Core panel and VCV logo design © 2018 by Grayscale | |||
Derivative works may not use Core panel and VCV logo design. |
@@ -1,12 +0,0 @@ | |||
All icons are licensed under CC BY 3.0. | |||
https://creativecommons.org/licenses/by/3.0/ | |||
https://thenounproject.com/ | |||
Paper by Madeleine Bennett from the Noun Project | |||
Folder by Icon Solid from the Noun Project | |||
Save by Landan Lloyd from the Noun Project | |||
Cat by Nabilauzwa from the Noun Project | |||
Stopwatch by Arthur Shlain from the Noun Project | |||
Sound by Gregor Cresnar from the Noun Project | |||
Refresh by un·delivered from the Noun Project | |||
Lock by Andres Gleixner from the Noun Project |
@@ -1,61 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
data-name="Your Icon" | |||
viewBox="0 0 16 16" | |||
x="0px" | |||
y="0px" | |||
version="1.1" | |||
id="svg53" | |||
sodipodi:docname="noun_1084369_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||
<metadata | |||
id="metadata59"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title>Cycles</dc:title> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<defs | |||
id="defs57" /> | |||
<sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="900" | |||
id="namedview55" | |||
showgrid="false" | |||
inkscape:zoom="2.784" | |||
inkscape:cx="27.43027" | |||
inkscape:cy="86.426288" | |||
inkscape:window-x="0" | |||
inkscape:window-y="0" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg53" /> | |||
<title | |||
id="title45">Cycles</title> | |||
<path | |||
d="M 9.0117134,7.367368 11.174158,5.206575 a 4.1778634,4.1778634 0 1 0 0.728524,4.460353 h 1.90804 0.01652 q -0.0413,0.15033 -0.09416,0.297357 A 6,6 0 1 1 12.462704,3.919681 l 1.473568,-1.473568 v 4.921255 z" | |||
id="path47" | |||
inkscape:connector-curvature="0" | |||
style="stroke-width:0.16519824;fill:#b4b4b4;fill-opacity:1" /> | |||
</svg> |
@@ -1,47 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
viewBox="0 0 16 16" | |||
xml:space="preserve" | |||
id="svg9404" | |||
sodipodi:docname="noun_1240789_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata9410"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>111all</dc:title></cc:Work></rdf:RDF></metadata><defs | |||
id="defs9408" /><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="900" | |||
id="namedview9406" | |||
showgrid="false" | |||
inkscape:zoom="1.888" | |||
inkscape:cx="50" | |||
inkscape:cy="62.5" | |||
inkscape:window-x="0" | |||
inkscape:window-y="0" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg9404" /><title | |||
id="title9396">111all</title><path | |||
d="M 9.324675,3.5188325 C 9.041322,3.1363055 8.517119,3.0654675 8.134593,3.3346525 7.978749,3.4479935 7.865407,3.6180055 7.822904,3.8021855 L 6.292798,9.5400835 5.159386,7.1457505 C 5.01771,6.8482295 4.720189,6.6640505 4.3943329,6.6640505 H 2 v 1.700118 H 3.8559622 L 5.754427,12.345278 c 0.141677,0.297521 0.439198,0.4817 0.765054,0.4817 h 0.07084 c 0.354191,-0.02833 0.651712,-0.283353 0.736718,-0.623377 l 1.671782,-6.2621005 1.530107,2.068477 c 0.155844,0.212515 0.410861,0.340023 0.680047,0.340023 H 14 v -1.700118 h -2.337662 z" | |||
id="path9398" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.1416765" /></svg> |
@@ -1,71 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
viewBox="0 0 16 16" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
id="svg5499" | |||
sodipodi:docname="noun_1343811_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||
<metadata | |||
id="metadata5505"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title>7.3</dc:title> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<defs | |||
id="defs5503" /> | |||
<sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="900" | |||
id="namedview5501" | |||
showgrid="false" | |||
inkscape:zoom="1.888" | |||
inkscape:cx="-36.334746" | |||
inkscape:cy="62.5" | |||
inkscape:window-x="0" | |||
inkscape:window-y="0" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg5499" /> | |||
<title | |||
id="title5485">7.3</title> | |||
<desc | |||
id="desc5487">Created with Sketch.</desc> | |||
<g | |||
id="g5493" | |||
transform="matrix(0.3,0,0,0.3,-7,-7)" | |||
style="fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"> | |||
<g | |||
id="g5491" | |||
style="fill:#b4b4b4;fill-opacity:1"> | |||
<path | |||
d="m 42,31 v 10 0 c 0,0.552285 0.447715,1 1,1 h 14 v 0 c 0.552285,0 1,-0.447715 1,-1 v -10 0 c 0,-0.552285 0.447715,-1 1,-1 h 2.171573 v 0 c 0.530433,0 1.039141,0.210714 1.414213,0.585786 l 6.828428,6.828428 v 0 C 69.789286,37.789286 70,38.297994 70,38.828427 V 68 68 c 0,1.104569 -0.895431,2 -2,2 H 32 v 0 c -1.10457,0 -2,-0.895431 -2,-2 v -36 0 c 0,-1.10457 0.89543,-2 2,-2 h 9 v 0 c 0.552285,0 1,0.447715 1,1 z m 9,-1 h 2 v 0 c 0.552285,0 1,0.447715 1,1 v 6 0 c 0,0.552285 -0.447715,1 -1,1 h -2 v 0 c -0.552285,0 -1,-0.447715 -1,-1 v -6 0 c 0,-0.552285 0.447715,-1 1,-1 z m -8,26 v 0 0 c 0,3.865993 3.134007,7 7,7 v 0 0 c 3.865993,0 7,-3.134007 7,-7 v 0 0 c 0,-3.865993 -3.134007,-7 -7,-7 v 0 0 c -3.865993,0 -7,3.134007 -7,7 z" | |||
id="path5489" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1" /> | |||
</g> | |||
</g> | |||
</svg> |
@@ -1,71 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
viewBox="0 0 16 16" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
id="svg4854" | |||
sodipodi:docname="noun_1343816_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||
<metadata | |||
id="metadata4860"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title>8.3</dc:title> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<defs | |||
id="defs4858" /> | |||
<sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="900" | |||
id="namedview4856" | |||
showgrid="false" | |||
inkscape:zoom="1.888" | |||
inkscape:cx="-36.334746" | |||
inkscape:cy="62.5" | |||
inkscape:window-x="0" | |||
inkscape:window-y="0" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg4854" /> | |||
<title | |||
id="title4840">8.3</title> | |||
<desc | |||
id="desc4842">Created with Sketch.</desc> | |||
<g | |||
id="g4848" | |||
transform="matrix(0.3,0,0,0.3,-7,-7)" | |||
style="fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"> | |||
<g | |||
id="g4846" | |||
style="fill:#b4b4b4;fill-opacity:1"> | |||
<path | |||
d="m 42,31 v 10 0 c 0,0.552285 0.447715,1 1,1 h 14 v 0 c 0.552285,0 1,-0.447715 1,-1 v -10 0 c 0,-0.552285 0.447715,-1 1,-1 h 2.171573 v 0 c 0.530433,0 1.039141,0.210714 1.414213,0.585786 l 6.828428,6.828428 v 0 C 69.789286,37.789286 70,38.297994 70,38.828427 V 68 68 c 0,1.104569 -0.895431,2 -2,2 H 32 v 0 c -1.10457,0 -2,-0.895431 -2,-2 v -36 0 c 0,-1.10457 0.89543,-2 2,-2 h 9 v 0 c 0.552285,0 1,0.447715 1,1 z m 9,-1 h 2 v 0 c 0.552285,0 1,0.447715 1,1 v 6 0 c 0,0.552285 -0.447715,1 -1,1 h -2 v 0 c -0.552285,0 -1,-0.447715 -1,-1 v -6 0 c 0,-0.552285 0.447715,-1 1,-1 z" | |||
id="path4844" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1" /> | |||
</g> | |||
</g> | |||
</svg> |
@@ -1,56 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
viewBox="0 0 16 16" | |||
enable-background="new 0 0 90 90" | |||
xml:space="preserve" | |||
id="svg12754" | |||
sodipodi:docname="noun_146097_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata12760"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||
id="defs12758" /><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="882" | |||
id="namedview12756" | |||
showgrid="false" | |||
inkscape:zoom="2.0977778" | |||
inkscape:cx="-32.701271" | |||
inkscape:cy="56.25" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg12754" /><path | |||
stroke-miterlimit="10" | |||
d="M 8.0000005,3.115294" | |||
id="path12744" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.14117648;stroke-miterlimit:10" | |||
inkscape:connector-curvature="0" /><path | |||
d="M 12.531765,13.195294 V 6.122353 l -3.4164705,0.01412 c -0.465883,-2e-6 -0.847059,-0.381179 -0.847059,-0.847061 V 2 H 4.1317645 C 3.7647065,2 3.4682355,2.296471 3.4682355,2.663529 V 13.195294 C 3.4682355,13.632941 3.8211765,14 4.2729415,14 h 7.4541175 c 0.437647,0 0.804705,-0.367059 0.804706,-0.804706 z" | |||
id="path12746" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.14117648" | |||
inkscape:connector-curvature="0" /><path | |||
d="m 8.8188235,2.042353 v 3.063529 c 0,0.254118 0.211765,0.465883 0.465883,0.465883 h 3.1905885 z" | |||
id="path12748" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.14117648" | |||
inkscape:connector-curvature="0" /></svg> |
@@ -1,57 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
xml:space="preserve" | |||
version="1.1" | |||
style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" | |||
viewBox="0 0 16 16" | |||
x="0px" | |||
y="0px" | |||
id="svg3034" | |||
sodipodi:docname="noun_1745061_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata3038"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="900" | |||
id="namedview3036" | |||
showgrid="false" | |||
inkscape:zoom="2.9385214" | |||
inkscape:cx="24.568026" | |||
inkscape:cy="49.947022" | |||
inkscape:window-x="0" | |||
inkscape:window-y="0" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg3034" /><defs | |||
id="defs3024"><style | |||
type="text/css" | |||
id="style3022"> | |||
.fil0 {fill:black} | |||
</style></defs><g | |||
id="g3028" | |||
transform="matrix(0.04669261,0,0,0.04669261,2.6002034,1.9999996)" | |||
style="fill:#b4b4b4;fill-opacity:1"><path | |||
class="fil0" | |||
d="M 57,228 C -2,177 107,127 84,71 71,41 32,31 8,52 -7,64 2,79 17,69 34,55 56,62 64,81 c 12,29 -36,75 -43,102 -8,27 12,74 49,74 h 74 c 0,-9 -4,-13 -12,-14 20,-18 23,-40 1,-67 24,20 25,51 10,66 7,4 8,10 9,15 h 29 c -3,-4 -6,-8 -11,-10 -3,-50 25,-65 34,-94 6,-23 -3,-47 -10,-67 11,-8 25,6 37,-16 -10,-16 -5,-38 -26,-44 -4,-10 1,-17 6,-26 -52,18 -60,31 -65,73 -8,56 -22,34 -61,63 -37,27 -29,57 -28,92 z" | |||
id="path3026" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1" /></g></svg> |
@@ -1,62 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
viewBox="0 0 16 16" | |||
enable-background="new 0 0 100 100" | |||
xml:space="preserve" | |||
id="svg11502" | |||
sodipodi:docname="noun_305536_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata11508"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||
id="defs11506" /><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="882" | |||
id="namedview11504" | |||
showgrid="false" | |||
inkscape:zoom="5.3400704" | |||
inkscape:cx="46.20989" | |||
inkscape:cy="9.786758" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg11502" /><path | |||
d="M 8.666667,4.04 V 3.333333 H 9.333333 V 2 H 6.666667 V 3.333333 H 7.333333 V 4.04 C 4.893333,4.373333 3,6.466667 3,9 c 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 13,6.466667 11.106667,4.373333 8.666667,4.04 Z M 8,12.666667 c -2.026667,0 -3.666667,-1.64 -3.666667,-3.666667 0,-2.026667 1.64,-3.666667 3.666667,-3.666667 2.026667,0 3.666667,1.64 3.666667,3.666667 0,2.026667 -1.64,3.666667 -3.666667,3.666667 z" | |||
id="path11490" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><path | |||
d="M 3.013333,4.08 3.96,5.013333 C 4.493333,4.466667 5.12,4.053333 5.826667,3.76 L 5.32,2.533333 c -0.866667,0.36 -1.653333,0.88 -2.306667,1.546667 z" | |||
id="path11492" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><path | |||
d="m 12.92,4.013333 c -0.653333,-0.64 -1.4,-1.133333 -2.24,-1.48 L 10.173333,3.76 c 0.68,0.28 1.293334,0.68 1.813334,1.2 z" | |||
id="path11494" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><rect | |||
x="-12.687092" | |||
y="-0.70676142" | |||
transform="rotate(-135.00405)" | |||
width="1.3334148" | |||
height="2.8268394" | |||
id="rect11496" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13334148" /></svg> |
@@ -1,47 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
viewBox="0 0 16 16" | |||
enable-background="new 0 0 512 512" | |||
xml:space="preserve" | |||
id="svg10862" | |||
sodipodi:docname="noun_31859_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata10868"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||
id="defs10866" /><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="882" | |||
id="namedview10864" | |||
showgrid="false" | |||
inkscape:zoom="0.36875" | |||
inkscape:cx="212.61017" | |||
inkscape:cy="271.18644" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg10862" /><path | |||
d="m 13.957459,7.579605 -1.650881,4.54537 H 3.2451096 l 1.7050678,-4.54757 c 0.1450069,-0.38599 0.6013088,-0.7024 1.0136657,-0.7024 h 7.4999549 c 0.412357,0 0.635012,0.31713 0.493661,0.7046 z m -11.2301744,3.79099 1.5212251,-4.05614 c 0.2534282,-0.67823 0.990955,-1.18944 1.7153334,-1.18944 h 6.5360939 c 0,-0.41456 -0.335459,-0.75 -0.749996,-0.75 H 6.4999727 L 5.7499772,3.875025 H 2.7499954 c -0.41456,0 -0.7499955,0.33546 -0.7499955,0.75 v 5.99996 c 0,0.4065 0.3237168,0.73242 0.7272847,0.74561 z" | |||
id="path10856" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.02343736" /></svg> |
@@ -1,56 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
version="1.1" | |||
x="0px" | |||
y="0px" | |||
viewBox="-7074.5 3413.5 16 16" | |||
enable-background="new -7074.5 3413.5 24 24" | |||
xml:space="preserve" | |||
id="svg12" | |||
sodipodi:docname="noun_468341_cc.svg" | |||
width="16" | |||
height="16" | |||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||
id="metadata18"><rdf:RDF><cc:Work | |||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||
id="defs16" /><sodipodi:namedview | |||
pagecolor="#ffffff" | |||
bordercolor="#666666" | |||
borderopacity="1" | |||
objecttolerance="10" | |||
gridtolerance="10" | |||
guidetolerance="10" | |||
inkscape:pageopacity="0" | |||
inkscape:pageshadow="2" | |||
inkscape:window-width="1600" | |||
inkscape:window-height="882" | |||
id="namedview14" | |||
showgrid="false" | |||
inkscape:zoom="7.8666667" | |||
inkscape:cx="-9.7372881" | |||
inkscape:cy="15" | |||
inkscape:window-x="0" | |||
inkscape:window-y="18" | |||
inkscape:window-maximized="0" | |||
inkscape:current-layer="svg12" /><g | |||
id="g6" | |||
transform="matrix(0.49999833,0,0,0.49999833,-3535.2618,1708.7557)" | |||
style="fill:#b4b4b4;fill-opacity:1"><path | |||
d="m -7066.5,3420.5 c 0,-2 1.054,-4.287 4,-4.287 2.973,0 4,2.287 4,4.287 v 3 h 3 v -3.509 c 0,-3.491 -3.196,-6.478 -7,-6.491 -4.063,-0.018 -7.002,2.991 -7,7 -0.01,0.084 0,3 0,3 h 3 z" | |||
id="path2" | |||
inkscape:connector-curvature="0" | |||
style="fill:#b4b4b4;fill-opacity:1" /><rect | |||
x="-7071.5" | |||
y="3424.5" | |||
width="18" | |||
height="13" | |||
id="rect4" | |||
style="fill:#b4b4b4;fill-opacity:1" /></g></svg> |
@@ -249,16 +249,16 @@ struct ModelBox : widget::OpaqueWidget { | |||
std::string text; | |||
text = model->plugin->brand; | |||
text += " " + model->name; | |||
if (model->description != "") | |||
text += "\n" + model->description; | |||
// Tags | |||
if (!model->tags.empty()) { | |||
text += "\nTags: "; | |||
for (size_t i = 0; i < model->tags.size(); i++) { | |||
if (i > 0) | |||
text += ", "; | |||
text += model->tags[i]; | |||
} | |||
text += "\nTags: "; | |||
for (size_t i = 0; i < model->tags.size(); i++) { | |||
if (i > 0) | |||
text += ", "; | |||
text += model->tags[i]; | |||
} | |||
// Description | |||
if (model->description != "") { | |||
text += "\n" + model->description; | |||
} | |||
ui::Tooltip *tooltip = new ui::Tooltip; | |||
tooltip->text = text; | |||
@@ -112,6 +112,7 @@ void init() { | |||
templatePath = userDir + "/template.vcv"; | |||
} | |||
else { | |||
logPath = userDir + "/log.txt"; | |||
pluginsPath = userDir + "/plugins-v" + app::ABI_VERSION; | |||
settingsPath = userDir + "/settings-v" + app::ABI_VERSION + ".json"; | |||
autosavePath = userDir + "/autosave-v" + app::ABI_VERSION + ".vcv"; | |||
@@ -139,6 +140,7 @@ std::string plugin(plugin::Plugin *plugin, std::string filename) { | |||
std::string systemDir; | |||
std::string userDir; | |||
std::string logPath; | |||
std::string pluginsPath; | |||
std::string settingsPath; | |||
std::string autosavePath; | |||
@@ -21,10 +21,9 @@ void init() { | |||
return; | |||
} | |||
std::string logFilename = asset::user("log.txt"); | |||
outputFile = fopen(logFilename.c_str(), "w"); | |||
outputFile = fopen(asset::logPath.c_str(), "w"); | |||
if (!outputFile) { | |||
fprintf(stderr, "Could not open log at %s\n", logFilename.c_str()); | |||
fprintf(stderr, "Could not open log at %s\n", asset::logPath.c_str()); | |||
} | |||
} | |||
@@ -22,7 +22,6 @@ | |||
#include <thread> | |||
#include <unistd.h> // for getopt | |||
#include <signal.h> // for signal | |||
#if defined ARCH_WIN | |||
#include <windows.h> // for CreateMutex | |||
#endif | |||
@@ -31,18 +30,19 @@ using namespace rack; | |||
static void fatalSignalHandler(int sig) { | |||
// Only catch one signal | |||
static bool caught = false; | |||
bool localCaught = caught; | |||
caught = true; | |||
if (localCaught) | |||
exit(1); | |||
// Ignore this signal to avoid recursion. | |||
signal(sig, NULL); | |||
// Ignore abort() since we call it below. | |||
signal(SIGABRT, NULL); | |||
FATAL("Fatal signal %d. Stack trace:\n%s", sig, system::getStackTrace().c_str()); | |||
// osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack has crashed. See log.txt for details."); | |||
// This might fail because we might not be in the main thread. | |||
// But oh well, we're crashing anyway. | |||
std::string text = app::APP_NAME + " has crashed. See " + asset::logPath + " for details."; | |||
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, text.c_str()); | |||
exit(1); | |||
abort(); | |||
} | |||
@@ -56,6 +56,9 @@ int main(int argc, char *argv[]) { | |||
exit(1); | |||
} | |||
(void) instanceMutex; | |||
// Don't display "Assertion failed!" dialog message. | |||
_set_error_mode(_OUT_TO_STDERR); | |||
#endif | |||
std::string patchPath; | |||
@@ -98,8 +101,6 @@ int main(int argc, char *argv[]) { | |||
logger::init(); | |||
// We can now install a signal handler and log the output | |||
// Mac has its own decent crash handler | |||
#if 0 | |||
if (!settings::devMode) { | |||
signal(SIGABRT, fatalSignalHandler); | |||
signal(SIGFPE, fatalSignalHandler); | |||
@@ -107,7 +108,6 @@ int main(int argc, char *argv[]) { | |||
signal(SIGSEGV, fatalSignalHandler); | |||
signal(SIGTERM, fatalSignalHandler); | |||
} | |||
#endif | |||
// Log environment | |||
INFO("%s v%s", app::APP_NAME.c_str(), app::APP_VERSION.c_str()); | |||
@@ -1,7 +1,6 @@ | |||
#include <network.hpp> | |||
#define CURL_STATICLIB | |||
#include <curl/curl.h> | |||
#include <openssl/sha.h> | |||
namespace rack { | |||
@@ -79,12 +78,11 @@ json_t *requestJson(Method method, std::string url, json_t *dataJ) { | |||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, reqStr); | |||
std::string resText; | |||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); | |||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeStringCallback); | |||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | |||
// Perform request | |||
// INFO("Requesting %s", url.c_str()); | |||
// DEBUG("Requesting %s", url.c_str()); | |||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | |||
CURLcode res = curl_easy_perform(curl); | |||
@@ -132,7 +130,6 @@ bool requestDownload(std::string url, const std::string &filename, float *progre | |||
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | |||
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | |||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); | |||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); | |||
// Fail on 4xx and 5xx HTTP codes | |||
curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); | |||
@@ -157,37 +154,6 @@ std::string encodeUrl(const std::string &s) { | |||
return ret; | |||
} | |||
std::string computeSHA256File(const std::string &filename) { | |||
FILE *f = fopen(filename.c_str(), "rb"); | |||
if (!f) | |||
return ""; | |||
uint8_t hash[SHA256_DIGEST_LENGTH]; | |||
SHA256_CTX sha256; | |||
SHA256_Init(&sha256); | |||
const int bufferLen = 1 << 15; | |||
uint8_t *buffer = new uint8_t[bufferLen]; | |||
int len = 0; | |||
while ((len = fread(buffer, 1, bufferLen, f))) { | |||
SHA256_Update(&sha256, buffer, len); | |||
} | |||
SHA256_Final(hash, &sha256); | |||
delete[] buffer; | |||
fclose(f); | |||
// Convert binary hash to hex | |||
char hashHex[64]; | |||
const char hexTable[] = "0123456789abcdef"; | |||
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { | |||
uint8_t h = hash[i]; | |||
hashHex[2*i + 0] = hexTable[h >> 4]; | |||
hashHex[2*i + 1] = hexTable[h & 0x0f]; | |||
} | |||
std::string str(hashHex, sizeof(hashHex)); | |||
return str; | |||
} | |||
std::string urlPath(const std::string &url) { | |||
CURLU *curl = curl_url(); | |||
DEFER({ | |||
@@ -138,8 +138,9 @@ void PatchManager::saveAsDialog() { | |||
std::free(pathC); | |||
}); | |||
// Append .vcv extension if no extension was given. | |||
std::string pathStr = pathC; | |||
if (string::filenameExtension(pathStr).empty()) { | |||
if (string::filenameExtension(string::filename(pathStr)) == "") { | |||
pathStr += ".vcv"; | |||
} | |||
@@ -247,7 +247,7 @@ static void extractPackages(std::string path) { | |||
std::string message; | |||
for (std::string packagePath : system::getEntries(path)) { | |||
if (string::filenameExtension(packagePath) != "zip") | |||
if (string::filenameExtension(string::filename(packagePath)) != "zip") | |||
continue; | |||
INFO("Extracting package %s", packagePath.c_str()); | |||
// Extract package | |||
@@ -2,8 +2,10 @@ | |||
#include <string.hpp> | |||
#include <thread> | |||
#include <regex> | |||
#include <dirent.h> | |||
#include <sys/stat.h> | |||
#include <cxxabi.h> // for __cxxabiv1::__cxa_demangle | |||
#if defined ARCH_LIN || defined ARCH_MAC | |||
#include <pthread.h> | |||
@@ -166,10 +168,36 @@ std::string getStackTrace() { | |||
stackLen = backtrace(stack, stackLen); | |||
char **strings = backtrace_symbols(stack, stackLen); | |||
// Skip the first line because it's this function. | |||
for (int i = 1; i < stackLen; i++) { | |||
s += string::f("%d: %s\n", stackLen - i - 1, strings[i]); | |||
s += string::f("%d: ", stackLen - i - 1); | |||
std::string line = strings[i]; | |||
#if 0 | |||
// Parse line | |||
std::regex r(R"((.*)\((.*)\+(.*)\) (.*))"); | |||
std::smatch match; | |||
if (std::regex_search(line, match, r)) { | |||
s += match[1].str(); | |||
s += "("; | |||
std::string symbol = match[2].str(); | |||
// Demangle symbol | |||
char *symbolD = __cxxabiv1::__cxa_demangle(symbol.c_str(), NULL, NULL, NULL); | |||
if (symbolD) { | |||
symbol = symbolD; | |||
free(symbolD); | |||
} | |||
s += symbol; | |||
s += "+"; | |||
s += match[3].str(); | |||
s += ")"; | |||
} | |||
#else | |||
s += line; | |||
#endif | |||
s += "\n"; | |||
} | |||
free(strings); | |||
#elif defined ARCH_WIN | |||
HANDLE process = GetCurrentProcess(); | |||
SymInitialize(process, NULL, true); | |||