From ab3569a28521f7a2a28e04f53b03bd30c627b40b Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Tue, 3 Jul 2018 17:51:52 +0200 Subject: [PATCH] More macos fixes --- 3rdparty/qocoa/qbutton_mac.mm | 2 +- cmake/Rpm.cmake | 6 +- dist/CMakeLists.txt | 17 +- dist/macos/Info.plist.in | 235 +++++++ dist/macos/create-dmg.sh | 52 ++ dist/macos/macdeploy.py | 489 ++++++++++++++ dist/macos/strawberry.icns | Bin 0 -> 6604 bytes dist/{ => man}/strawberry-tagreader.1 | 0 dist/{ => man}/strawberry.1 | 0 dist/{ => rpm}/strawberry.spec.in | 0 dist/scripts/gen-icons-resource.sh | 114 ++++ dist/{ => scripts}/maketarball.sh.in | 2 +- dist/{ => unix}/strawberry.desktop | 0 dist/{ => unix}/strawberry.png | Bin dist/windows/Capabilities.nsh | 676 +++++++++++++++++++ dist/windows/FileAssociation.nsh | 190 ++++++ dist/windows/strawberry.nsi | 573 ++++++++++++++++ dist/windows/windres.rc.in | 6 +- ext/strawberry-tagreader/CMakeLists.txt | 8 +- src/CMakeLists.txt | 59 +- src/core/main.cpp | 37 +- src/covermanager/albumcoverloaderoptions.cpp | 1 - src/engine/gstengine.cpp | 16 +- src/engine/gstenginepipeline.cpp | 12 +- src/engine/osxdevicefinder.cpp | 4 +- 25 files changed, 2393 insertions(+), 106 deletions(-) create mode 100644 dist/macos/Info.plist.in create mode 100755 dist/macos/create-dmg.sh create mode 100755 dist/macos/macdeploy.py create mode 100644 dist/macos/strawberry.icns rename dist/{ => man}/strawberry-tagreader.1 (100%) rename dist/{ => man}/strawberry.1 (100%) rename dist/{ => rpm}/strawberry.spec.in (100%) create mode 100755 dist/scripts/gen-icons-resource.sh rename dist/{ => scripts}/maketarball.sh.in (92%) rename dist/{ => unix}/strawberry.desktop (100%) rename dist/{ => unix}/strawberry.png (100%) create mode 100644 dist/windows/Capabilities.nsh create mode 100644 dist/windows/FileAssociation.nsh create mode 100644 dist/windows/strawberry.nsi delete mode 100644 src/covermanager/albumcoverloaderoptions.cpp diff --git a/3rdparty/qocoa/qbutton_mac.mm b/3rdparty/qocoa/qbutton_mac.mm index bd68fda45..b7e1bc0c5 100644 --- a/3rdparty/qocoa/qbutton_mac.mm +++ b/3rdparty/qocoa/qbutton_mac.mm @@ -132,7 +132,7 @@ public: [nsButton setButtonType:NSMomentaryPushInButton]; } - // [nsButton setBezelStyle:bezelStyle]; + [nsButton setBezelStyle:(__bridge NSBezelStyle)bezelStyle]; } void clicked() diff --git a/cmake/Rpm.cmake b/cmake/Rpm.cmake index 4500be34a..2aca8ece6 100644 --- a/cmake/Rpm.cmake +++ b/cmake/Rpm.cmake @@ -5,8 +5,8 @@ set(RPM_DISTRO suse CACHE STRING "Suffix of the rpm file") set(RPM_ARCH x86_64 CACHE STRING "Architecture of the rpm file") add_custom_target(rpm - COMMAND ${CMAKE_SOURCE_DIR}/dist/maketarball.sh + COMMAND ${CMAKE_SOURCE_DIR}/dist/scripts/maketarball.sh COMMAND ${CMAKE_COMMAND} -E copy strawberry-${STRAWBERRY_VERSION_PACKAGE}.tar.xz ${RPMBUILD_DIR}/SOURCES/ - COMMAND rpmbuild -bs ${CMAKE_SOURCE_DIR}/dist/strawberry.spec - COMMAND rpmbuild -bb ${CMAKE_SOURCE_DIR}/dist/strawberry.spec + COMMAND rpmbuild -bs ${CMAKE_SOURCE_DIR}/dist/rpm/strawberry.spec + COMMAND rpmbuild -bb ${CMAKE_SOURCE_DIR}/dist/rpm/strawberry.spec ) diff --git a/dist/CMakeLists.txt b/dist/CMakeLists.txt index e1f6dd71c..9cbef0739 100644 --- a/dist/CMakeLists.txt +++ b/dist/CMakeLists.txt @@ -1,14 +1,19 @@ set(ENV{LC_ALL} "en_US.utf8") execute_process(COMMAND date "+%a %b %d %Y" OUTPUT_VARIABLE RPM_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/strawberry.spec.in ${CMAKE_CURRENT_SOURCE_DIR}/strawberry.spec @ONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/maketarball.sh.in ${CMAKE_CURRENT_SOURCE_DIR}/maketarball.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rpm/strawberry.spec.in ${CMAKE_CURRENT_SOURCE_DIR}/rpm/strawberry.spec @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/maketarball.sh.in ${CMAKE_CURRENT_SOURCE_DIR}/scripts/maketarball.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/macos/Info.plist.in ${CMAKE_CURRENT_SOURCE_DIR}/macos/Info.plist) -if (UNIX) +if (UNIX AND NOT APPLE) install(FILES ../data/icons/48x48/strawberry.png DESTINATION share/icons/hicolor/48x48/apps/) install(FILES ../data/icons/64x64/strawberry.png DESTINATION share/icons/hicolor/64x64/apps/) install(FILES ../data/icons/128x128/strawberry.png DESTINATION share/icons/hicolor/128x128/apps/) install(FILES ../data/icons/128x128/strawberry.svg DESTINATION share/icons/hicolor/scalable/apps/) - install(FILES strawberry.desktop DESTINATION share/applications) - install(FILES strawberry.1 strawberry-tagreader.1 DESTINATION share/man/man1) -endif (UNIX) + install(FILES unix/strawberry.desktop DESTINATION share/applications) + install(FILES man/strawberry.1 man/strawberry-tagreader.1 DESTINATION share/man/man1) +endif() + +if (APPLE) + install(FILES macos/strawberry.icns DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources") +endif() diff --git a/dist/macos/Info.plist.in b/dist/macos/Info.plist.in new file mode 100644 index 000000000..4e1004b5b --- /dev/null +++ b/dist/macos/Info.plist.in @@ -0,0 +1,235 @@ + + + + + NSPrincipalClass + NSApplication + CFBundleDevelopmentRegion + English + CFBundleExecutable + strawberry + CFBundleGetInfoString + Strawberry ${STRAWBERRY_VERSION_DISPLAY} + CFBundleIconFile + strawberry + CFBundleIdentifier + org.strawberry.strawberry + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + ${STRAWBERRY_VERSION_DISPLAY} + CFBundleName + Strawberry + CFBundlePackageType + APPL + CFBundleShortVersionString + ${STRAWBERRY_VERSION_DISPLAY} + CFBundleVersion + ${STRAWBERRY_VERSION_PACKAGE} + CSResourcesFileMapped + + LSRequiresCarbon + + LSApplicationCategoryType + public.app-category.music + LSMinimumSystemVersion + 10.7.0 + CFBundleDocumentTypes + + + CFBundleTypeOSTypes + + **** + fold + disk + + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + xspf + + CFBundleTypeIconFile + Generic.icns + CFBundleTypeMIMETypes + + application/xspf+xml + + CFBundleTypeName + XSPF Playlist + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + wav + + CFBundleTypeMIMETypes + + audio/x-wav + + CFBundleTypeName + WAVE Audio File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + pls + + CFBundleTypeIconFile + pls.icns + CFBundleTypeName + Shoutcast playlist + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + m3u + + CFBundleTypeIconFile + m3u.icns + CFBundleTypeMIMETypes + + audio/x-mpegurl + + CFBundleTypeName + Playlist file + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + aac + + CFBundleTypeIconFile + mpeg4.icns + CFBundleTypeName + AAC file + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + ogg + ogx + ogm + + CFBundleTypeIconFile + ogg.icns + CFBundleTypeMIMETypes + + audio/ogg + + CFBundleTypeName + Ogg Vorbis File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + oga + + CFBundleTypeIconFile + ogg.icns + CFBundleTypeMIMETypes + + audio/ogg + + CFBundleTypeName + Ogg Audio File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + wma + + CFBundleTypeIconFile + wma.icns + CFBundleTypeName + WIndows Media Audio + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + mp3 + + CFBundleTypeIconFile + mp3.icns + CFBundleTypeMIMETypes + + audio/mpeg + + CFBundleTypeName + MPEG Audio Layer 3 + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + 3gp + + CFBundleTypeIconFile + generic.icns + CFBundleTypeName + 3GPP File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + m4a + + CFBundleTypeIconFile + mpeg4.icns + CFBundleTypeName + MPEG-4 Audio File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + mpc + + CFBundleTypeIconFile + generic.icns + CFBundleTypeName + Musepack Audio File + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + flac + + CFBundleTypeIconFile + generic.icns + CFBundleTypeMIMETypes + + audio/flac + + CFBundleTypeName + FLAC Audio File + CFBundleTypeRole + Viewer + + + + diff --git a/dist/macos/create-dmg.sh b/dist/macos/create-dmg.sh new file mode 100755 index 000000000..4195ded12 --- /dev/null +++ b/dist/macos/create-dmg.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# author: max@last.fm, muesli@tomahawk-player.org +# brief: Produces a compressed DMG from a bundle directory +# usage: Pass the bundle directory as the only parameter +# note: This script depends on the Tomahawk build system, and must be run from +# the build directory +################################################################################ + + +#if [ -z $VERSION ] +#then +# echo VERSION must be set +# exit 2 +#fi + +if [ -z "$1" ] +then + echo "Please pass the bundle.app directory as the first parameter." + exit 3 +fi +################################################################################ + + +NAME=$(basename "$1" | perl -pe 's/(.*).app/\1/') +IN="$1" +TMP="dmg/$NAME" +OUT="$NAME.dmg" +mkdir -p "$TMP" +################################################################################ + +# clean up +rm -rf "$TMP" +rm -f "$OUT" + +# create DMG contents and copy files +mkdir -p "$TMP/.background" +#cp ../dist/macos/dmg_background.png "$TMP/.background/background.png" +#cp ../dist/macos/DS_Store.in "$TMP/.DS_Store" +#chmod go-rwx "$TMP/.DS_Store" +ln -s /Applications "$TMP/Applications" +# copies the prepared bundle into the dir that will become the DMG +cp -R "$IN" "$TMP" + +# create +hdiutil makehybrid -hfs -hfs-volume-name "$NAME" -hfs-openfolder "$TMP" "$TMP" -o tmp.dmg +hdiutil convert -format UDZO -imagekey zlib-level=9 tmp.dmg -o "$OUT" + +#genisoimage -D -V "Strawberry" -no-pad -r -apple -o $NAME.iso $TMP +#dmg dmg $NAME.iso $OUT + +# cleanup +#rm tmp.dmg diff --git a/dist/macos/macdeploy.py b/dist/macos/macdeploy.py new file mode 100755 index 000000000..d1278db7d --- /dev/null +++ b/dist/macos/macdeploy.py @@ -0,0 +1,489 @@ +#!/usr/bin/python + +# Strawberry Music Player +# This file was part of Clementine. +# +# Strawberry is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Strawberry is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Strawberry. If not, see . + +from distutils import spawn +import logging +import os +import re +import subprocess +import commands +import sys +import traceback + +LOGGER = logging.getLogger('macdeploy') + +LIBRARY_SEARCH_PATH = ['/usr/local/lib'] + +FRAMEWORK_SEARCH_PATH = [ + '/Library/Frameworks', + os.path.join(os.environ['HOME'], 'Library/Frameworks') +] + +QT_PLUGINS = [ + 'platforms/libqcocoa.dylib', + 'sqldrivers/libqsqlite.dylib', + 'imageformats/libqgif.dylib', + 'imageformats/libqicns.dylib', + 'imageformats/libqico.dylib', + 'imageformats/libqjpeg.dylib', + 'imageformats/libqsvg.dylib', + 'imageformats/libqtiff.dylib', +] + +QT_PLUGINS_SEARCH_PATH = [ + '/usr/local/opt/qt/plugins', +] + +GSTREAMER_SEARCH_PATH = [ + '/usr/local/lib/gstreamer-1.0', +] + +GSTREAMER_PLUGINS = [ + + 'libgstapetag.so', + 'libgstapp.so', + 'libgstaudioconvert.so', + 'libgstaudiofx.so', + 'libgstaudiomixer.so', + 'libgstaudioparsers.so', + 'libgstaudiorate.so', + 'libgstaudioresample.so', + 'libgstaudiotestsrc.so', + 'libgstauparse.so', + 'libgstautodetect.so', + 'libgstcoreelements.so', + 'libgstcoretracers.so', + 'libgstcutter.so', + 'libgstdebug.so', + 'libgstequalizer.so', + 'libgstgio.so', + 'libgsticydemux.so', + 'libgstid3demux.so', + 'libgstlevel.so', + 'libgstosxaudio.so', + 'libgstplayback.so', + 'libgstrawparse.so', + 'libgstrealmedia.so', + 'libgstreplaygain.so', + 'libgstsoup.so', + 'libgstspectrum.so', + 'libgsttypefindfunctions.so', + 'libgstvolume.so', + 'libgstxingmux.so', + + 'libgstflac.so', + 'libgstwavparse.so', + 'libgstfaac.so', + 'libgstfaad.so', + 'libgstlame.so', + 'libgstmad.so', + 'libgstogg.so', + 'libgstopus.so', + 'libgstasf.so', + 'libgstspeex.so', + 'libgsttaglib.so', + 'libgstvorbis.so', + 'libgstisomp4.so', + +] + +GIO_MODULES_SEARCH_PATH = ['/usr/local/lib/gio/modules',] + +INSTALL_NAME_TOOL_APPLE = 'install_name_tool' +INSTALL_NAME_TOOL_CROSS = 'x86_64-apple-darwin-%s' % INSTALL_NAME_TOOL_APPLE +INSTALL_NAME_TOOL = INSTALL_NAME_TOOL_CROSS if spawn.find_executable( + INSTALL_NAME_TOOL_CROSS) else INSTALL_NAME_TOOL_APPLE + +OTOOL_APPLE = 'otool' +OTOOL_CROSS = 'x86_64-apple-darwin-%s' % OTOOL_APPLE +OTOOL = OTOOL_CROSS if spawn.find_executable(OTOOL_CROSS) else OTOOL_APPLE + + +class Error(Exception): + pass + + +class CouldNotFindFrameworkError(Error): + pass + +class CouldNotFindGioModuleError(Error): + pass + +class CouldNotFindQtPluginError(Error): + pass + +class CouldNotParseFrameworkNameError(Error): + pass + +class InstallNameToolError(Error): + pass + + +class CouldNotFindGstreamerPluginError(Error): + pass + +class CouldNotFindXinePluginError(Error): + pass + +class CouldNotFindVLCPluginError(Error): + pass + +if len(sys.argv) < 2: + print 'Usage: %s ' % sys.argv[0] + +bundle_dir = sys.argv[1] + +bundle_name = os.path.basename(bundle_dir).split('.')[0] + +commands = [] + +frameworks_dir = os.path.join(bundle_dir, 'Contents', 'Frameworks') +commands.append(['mkdir', '-p', frameworks_dir]) +resources_dir = os.path.join(bundle_dir, 'Contents', 'Resources') +commands.append(['mkdir', '-p', resources_dir]) +plugins_dir = os.path.join(bundle_dir, 'Contents', 'PlugIns') +binary = os.path.join(bundle_dir, 'Contents', 'MacOS', bundle_name) + +fixed_libraries = set() +fixed_frameworks = set() + + +def GetBrokenLibraries(binary): + #print "Checking libs for binary: %s" % binary + output = subprocess.Popen([OTOOL, '-L', binary], stdout=subprocess.PIPE).communicate()[0] + broken_libs = {'frameworks': [], 'libs': []} + for line in [x.split(' ')[0].lstrip() for x in output.split('\n')[1:]]: + #print "Checking line: %s" % line + if not line: # skip empty lines + continue + if os.path.basename(binary) == os.path.basename(line): + #print "mnope %s-%s" % (os.path.basename(binary), os.path.basename(line)) + continue + if re.match(r'^\s*/System/', line): + continue # System framework + elif re.match(r'^\s*/usr/lib/', line): + #print "unix style system lib" + continue # unix style system library + elif re.match(r'^\s*@executable_path', line) or re.match(r'^\s*@loader_path', line): + # Potentially already fixed library + relative_path = os.path.join(*line.split('/')[3:]) + if not os.path.exists(os.path.join(frameworks_dir, relative_path)): + broken_libs['frameworks'].append(relative_path) + elif re.search(r'\w+\.framework', line): + broken_libs['frameworks'].append(line) + else: + broken_libs['libs'].append(line) + + return broken_libs + + +def FindFramework(path): + for search_path in FRAMEWORK_SEARCH_PATH: + abs_path = os.path.join(search_path, path) + if os.path.exists(abs_path): + LOGGER.debug("Found framework '%s' in '%s'", path, search_path) + return abs_path + + raise CouldNotFindFrameworkError(path) + + +def FindLibrary(path): + if os.path.exists(path): + return path + for search_path in LIBRARY_SEARCH_PATH: + abs_path = os.path.join(search_path, path) + if os.path.exists(abs_path): + LOGGER.debug("Found library '%s' in '%s'", path, search_path) + return abs_path + else: # try harder---look for lib name in library folders + newpath = os.path.join(search_path,os.path.basename(path)) + if os.path.exists(newpath): + return newpath + + raise CouldNotFindFrameworkError(path) + + +def FixAllLibraries(broken_libs): + for framework in broken_libs['frameworks']: + FixFramework(framework) + for lib in broken_libs['libs']: + FixLibrary(lib) + + +def FixFramework(path): + if path in fixed_frameworks: + return + else: + fixed_frameworks.add(path) + abs_path = FindFramework(path) + broken_libs = GetBrokenLibraries(abs_path) + FixAllLibraries(broken_libs) + + new_path = CopyFramework(abs_path) + id = os.sep.join(new_path.split(os.sep)[3:]) + FixFrameworkId(new_path, id) + for framework in broken_libs['frameworks']: + FixFrameworkInstallPath(framework, new_path) + for library in broken_libs['libs']: + FixLibraryInstallPath(library, new_path) + + +def FixLibrary(path): + if path in fixed_libraries or FindSystemLibrary(os.path.basename(path)) is not None: + return + else: + fixed_libraries.add(path) + abs_path = FindLibrary(path) + if abs_path == "": + print "Could not resolve %s, not fixing!" % path + return + broken_libs = GetBrokenLibraries(abs_path) + FixAllLibraries(broken_libs) + + new_path = CopyLibrary(abs_path) + FixLibraryId(new_path) + for framework in broken_libs['frameworks']: + FixFrameworkInstallPath(framework, new_path) + for library in broken_libs['libs']: + FixLibraryInstallPath(library, new_path) + + +def FixPlugin(abs_path, subdir): + broken_libs = GetBrokenLibraries(abs_path) + FixAllLibraries(broken_libs) + + new_path = CopyPlugin(abs_path, subdir) + for framework in broken_libs['frameworks']: + FixFrameworkInstallPath(framework, new_path) + for library in broken_libs['libs']: + FixLibraryInstallPath(library, new_path) + + +def FixBinary(path): + broken_libs = GetBrokenLibraries(path) + FixAllLibraries(broken_libs) + for framework in broken_libs['frameworks']: + FixFrameworkInstallPath(framework, path) + for library in broken_libs['libs']: + FixLibraryInstallPath(library, path) + + +def CopyLibrary(path): + new_path = os.path.join(frameworks_dir, os.path.basename(path)) + #args = ['cp', path, new_path] + args = ['ditto', '--arch=i386', '--arch=x86_64', path, new_path] + LOGGER.info("Copying library '%s'", path) + commands.append(args) + args = ['chmod', 'u+w', new_path] + commands.append(args) + return new_path + + +def CopyPlugin(path, subdir): + new_path = os.path.join(plugins_dir, subdir, os.path.basename(path)) + args = ['mkdir', '-p', os.path.dirname(new_path)] + commands.append(args) + #args = ['cp', path, new_path] + args = ['ditto', '--arch=i386', '--arch=x86_64', path, new_path] + commands.append(args) + LOGGER.info("Copying plugin '%s'", path) + args = ['chmod', 'u+w', new_path] + commands.append(args) + return new_path + +def CopyFramework(path): + parts = path.split(os.sep) + for i, part in enumerate(parts): + if re.match(r'\w+\.framework', part): + full_path = os.path.join(frameworks_dir, *parts[i:-1]) + framework_name = part.split(".framework")[0] + break + +def CopyFramework(src_binary): + while os.path.islink(src_binary): + src_binary = os.path.realpath(src_binary) + + m = re.match(r'(.*/([^/]+)\.framework)/Versions/([^/]+)/.*', src_binary) + if not m: + raise CouldNotParseFrameworkNameError(src_binary) + + src_base = m.group(1) + name = m.group(2) + version = m.group(3) + + LOGGER.info('Copying framework %s version %s', name, version) + + dest_base = os.path.join(frameworks_dir, '%s.framework' % name) + dest_dir = os.path.join(dest_base, 'Versions', version) + dest_binary = os.path.join(dest_dir, name) + + commands.append(['mkdir', '-p', dest_dir]) + commands.append(['cp', src_binary, dest_binary]) + + # Copy special files from various places: + # QtCore has Resources/qt_menu.nib (copy to app's Resources) + # Sparkle has Resources/* + # Qt* have Resources/Info.plist + resources_src = os.path.join(src_base, 'Resources') + menu_nib = os.path.join(resources_src, 'qt_menu.nib') + if os.path.exists(menu_nib): + LOGGER.info("Copying qt_menu.nib '%s'", menu_nib) + commands.append(['cp', '-r', menu_nib, resources_dir]) + elif os.path.exists(resources_src): + LOGGER.info("Copying resources dir '%s'", resources_src) + commands.append(['cp', '-r', resources_src, dest_dir]) + + info_plist = os.path.join(src_base, 'Contents', 'Info.plist') + if os.path.exists(info_plist): + LOGGER.info("Copying special file '%s'", info_plist) + resources_dest = os.path.join(dest_dir, 'Resources') + commands.append(['mkdir', resources_dest]) + commands.append(['cp', '-r', info_plist, resources_dest]) + + # Create symlinks in the Framework to make it look like + # https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html + commands.append([ + 'ln', '-sf', 'Versions/Current/%s' % name, os.path.join(dest_base, name) + ]) + commands.append([ + 'ln', '-sf', 'Versions/Current/Resources', + os.path.join(dest_base, 'Resources') + ]) + commands.append( + ['ln', '-sf', version, os.path.join(dest_base, 'Versions/Current')]) + + return dest_binary + + +def FixId(path, library_name): + id = '@executable_path/../Frameworks/%s' % library_name + args = [INSTALL_NAME_TOOL, '-id', id, path] + commands.append(args) + + +def FixLibraryId(path): + library_name = os.path.basename(path) + FixId(path, library_name) + + +def FixFrameworkId(path, id): + FixId(path, id) + + +def FixInstallPath(library_path, library, new_path): + args = [INSTALL_NAME_TOOL, '-change', library_path, new_path, library] + commands.append(args) + + +def FindSystemLibrary(library_name): + for path in ['/lib', '/usr/lib']: + full_path = os.path.join(path, library_name) + if os.path.exists(full_path): + return full_path + return None + + +def FixLibraryInstallPath(library_path, library): + system_library = FindSystemLibrary(os.path.basename(library_path)) + if system_library is None: + new_path = '@executable_path/../Frameworks/%s' % os.path.basename(library_path) + FixInstallPath(library_path, library, new_path) + else: + FixInstallPath(library_path, library, system_library) + + +def FixFrameworkInstallPath(library_path, library): + parts = library_path.split(os.sep) + for i, part in enumerate(parts): + if re.match(r'\w+\.framework', part): + full_path = os.path.join(*parts[i:]) + break + new_path = '@executable_path/../Frameworks/%s' % full_path + FixInstallPath(library_path, library, new_path) + + +def FindXinePlugin(name): + for path in XINEPLUGIN_SEARCH_PATH: + if os.path.exists(path): + for dir, dirs, files in os.walk(path): + if name in files: + return os.path.join(dir, name) + raise CouldNotFindXinePluginError(name) + + +def FindQtPlugin(name): + for path in QT_PLUGINS_SEARCH_PATH: + if os.path.exists(path): + if os.path.exists(os.path.join(path, name)): + return os.path.join(path, name) + raise CouldNotFindQtPluginError(name) + + +def FindGstreamerPlugin(name): + for path in GSTREAMER_SEARCH_PATH: + if os.path.exists(path): + for dir, dirs, files in os.walk(path): + if name in files: + return os.path.join(dir, name) + raise CouldNotFindGstreamerPluginError(name) + + +def FindGioModule(name): + for path in GIO_MODULES_SEARCH_PATH: + if os.path.exists(path): + for dir, dirs, files in os.walk(path): + if name in files: + return os.path.join(dir, name) + raise CouldNotFindGioModuleError(name) + + +def main(): + logging.basicConfig(filename='macdeploy.log', level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s') + + FixBinary(binary) + + for plugin in GSTREAMER_PLUGINS: + FixPlugin(FindGstreamerPlugin(plugin), 'gstreamer') + + #FixPlugin(FindGstreamerPlugin('gst-plugin-scanner'), '.') + FixPlugin(FindGioModule('libgiognutls.so'), 'gio-modules') + FixPlugin(FindGioModule('libgiognomeproxy.so'), 'gio-modules') + + try: + FixPlugin('strawberry-tagreader', '.') + except: + print 'Failed to find blob: %s' % traceback.format_exc() + + for plugin in QT_PLUGINS: + FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin)) + + if len(sys.argv) <= 2: + print 'Would run %d commands:' % len(commands) + for command in commands: + print ' '.join(command) + + print 'OK?' + raw_input() + + for command in commands: + p = subprocess.Popen(command) + os.waitpid(p.pid, 0) + + +if __name__ == "__main__": + main() diff --git a/dist/macos/strawberry.icns b/dist/macos/strawberry.icns new file mode 100644 index 0000000000000000000000000000000000000000..e15ec254b8bcdaf260630d1860c9b560a7f979eb GIT binary patch literal 6604 zcmV;-88haIP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 KMNUMnLSTab)QqtJ literal 0 HcmV?d00001 diff --git a/dist/strawberry-tagreader.1 b/dist/man/strawberry-tagreader.1 similarity index 100% rename from dist/strawberry-tagreader.1 rename to dist/man/strawberry-tagreader.1 diff --git a/dist/strawberry.1 b/dist/man/strawberry.1 similarity index 100% rename from dist/strawberry.1 rename to dist/man/strawberry.1 diff --git a/dist/strawberry.spec.in b/dist/rpm/strawberry.spec.in similarity index 100% rename from dist/strawberry.spec.in rename to dist/rpm/strawberry.spec.in diff --git a/dist/scripts/gen-icons-resource.sh b/dist/scripts/gen-icons-resource.sh new file mode 100755 index 000000000..357dd2151 --- /dev/null +++ b/dist/scripts/gen-icons-resource.sh @@ -0,0 +1,114 @@ +#!/bin/sh + +sizes="128x128 64x64 48x48 32x32 22x22" + +# + +for i in full/* +do + source=$i + file=`basename $i` + + id=`identify "$i"` || exit 1 + if [ "$id" = "" ] ; then + echo "ERROR: Cannot dermine format and geometry for image: \"$i\"." + continue + fi + g=`echo $id | awk '{print $3}'` || exit 1 + if [ "$g" = "" ] ; then + echo "ERROR: Cannot dermine geometry for image: \"$i\"." + continue + fi + + # Geometry can be 563x144+0+0 or 75x98 + # we need to get rid of the plus (+) and the x characters: + w=`echo $g | sed 's/[^0-9]/ /g' | awk '{print $1}'` || exit 1 + if [ "$w" = "" ] ; then + echo "ERROR: Cannot dermine width for image: \"$x\"." + continue + fi + h=`echo $g | sed 's/[^0-9]/ /g' | awk '{print $2}'` || exit 1 + if [ "$h" = "" ] ; then + echo "ERROR: Cannot dermine height for image: \"$x\"." + continue + fi + + for x in $sizes + do + + dest="$x/$file" + if [ -f $dest ]; then + continue + fi + + x_w=$(echo $x | cut -d 'x' -f1) + x_h=$(echo $x | cut -d 'x' -f2) + + if [ "$w" -lt "$x_w" ] || [ "$h" -lt "$x_h" ]; then + continue + fi + + echo "convert -verbose -resize $x $source $dest" + convert -verbose -resize $x $source $dest + + done +done + + +for i in $sizes +do + for x in $i/* + do + file=`basename $x` + if ! [ -f "full/$file" ]; then + echo "Warning: full/$file does not exist, but $x exists." + fi + + id=`identify "$x"` || exit 1 + if [ "$id" = "" ] ; then + echo "ERROR: Cannot dermine format and geometry for image: \"$x\"." + continue + fi + g=`echo $id | awk '{print $3}'` || exit 1 + if [ "$g" = "" ] ; then + echo "ERROR: Cannot dermine geometry for image: \"$x\"." + continue + fi + + # Geometry can be 563x144+0+0 or 75x98 + # we need to get rid of the plus (+) and the x characters: + w=`echo $g | sed 's/[^0-9]/ /g' | awk '{print $1}'` || exit 1 + if [ "$w" = "" ] ; then + echo "ERROR: Cannot dermine width for image: \"$x\"." + continue + fi + h=`echo $g | sed 's/[^0-9]/ /g' | awk '{print $2}'` || exit 1 + if [ "$h" = "" ] ; then + echo "ERROR: Cannot dermine height for image: \"$x\"." + continue + fi + + if ! [ "${h}x${w}" = "$i" ]; then + echo "Warning: $x is not $i, but ${h}x${w}!" + fi + + done +done + +file="../icons.qrc" +rm -rf "$file" +echo "" >>$file +echo "" >>$file + +for i in full $sizes +do + for x in $i/* + do + f=`basename $x` + echo " icons/$i/$f" >>$file + done +done + +echo "" >>$file +echo "" >>$file + diff --git a/dist/maketarball.sh.in b/dist/scripts/maketarball.sh.in similarity index 92% rename from dist/maketarball.sh.in rename to dist/scripts/maketarball.sh.in index 7d7fd404f..388b5ae97 100755 --- a/dist/maketarball.sh.in +++ b/dist/scripts/maketarball.sh.in @@ -3,7 +3,7 @@ name=strawberry version="@STRAWBERRY_VERSION_PACKAGE@" gitrev="@INCLUDE_GIT_REVISION@" -root=$(cd "${0%/*}/.." && echo $PWD/${0##*/}) +root=$(cd "${0%/*}/../.." && echo $PWD/${0##*/}) root=`dirname "$root"` rootnoslash=`echo $root | sed "s/^\///"` diff --git a/dist/strawberry.desktop b/dist/unix/strawberry.desktop similarity index 100% rename from dist/strawberry.desktop rename to dist/unix/strawberry.desktop diff --git a/dist/strawberry.png b/dist/unix/strawberry.png similarity index 100% rename from dist/strawberry.png rename to dist/unix/strawberry.png diff --git a/dist/windows/Capabilities.nsh b/dist/windows/Capabilities.nsh new file mode 100644 index 000000000..151d36ce2 --- /dev/null +++ b/dist/windows/Capabilities.nsh @@ -0,0 +1,676 @@ +/* +_____________________________________________________________________________ + + Application Capabilities (Default Programs) +_____________________________________________________________________________ + + By Joel Spadin + Loosely based on code taken from http://nsis.sourceforge.net/File_Association + + These functions register an application with Windows Vista's and Windows 7's + Default Programs window. + + Usage: + + !include "Capabilities.nsh" + !define CAPABILITIES_NAME "[program name]" + !define CAPABILITIES_DESCRIPTION "[description]" + !define CAPABILITIES_PROGID "[progid]" + !define CAPABILITIES_PATH "[path]" + ... + + During install, call ${RegisterCapabilities}, then use the other register + macros to create file type, MIME, and protocol associations. + + During uninstall, call ${UnRegisterCapabilities} + +_______________________________________________________________________________ + + More information about Default Programs and Client Types can be found here: + http://msdn.microsoft.com/en-us/library/cc144154(VS.85).aspx + http://msdn.microsoft.com/en-us/library/cc144109(v=VS.85).aspx + + Defines: All defines not marked [optional] are required. + + CAPABILITIES_NAME + The canonical name of the program. + + CAPABILITIES_LOCAL_NAME [optional] + The localized name of the program as it appears in Default Programs. + This should be in the format "@FilePath,-StringID" where FilePath is the + path to a .dll or .exe file and StringID is the ID of a resource contained + in the file. + + CAPABILITIES_DESCRIPTION + The localized description shown in Default Programs. This can be either a + string or in the same format as CAPABILITIES_LOCAL_NAME + + CAPABILITIES_PROGID + An identifier used in file associations. Usually, this is the name of the + program. This should not have any spaces in it. + + CAPABILITIES_PATH + The location where capabilities info is stored in the registry. + The "Capabilities" key will automatically be added. If the application is + a client of some sort, (browser, email, media player, etc.) use + "Software\Clients\[ClientType]\[ProgramName]". Otherwise, use + "Software\[CompanyName]\[ProgramName]" or just "Software\[ProgramName]". + + CAPABILITIES_ICON [optional] + The icon shown in Default Programs. This should be in the format + "FilePath,IconIndex" where FilePath is the path to a file containing the + icon. If IconIndex is positive, the number is used as the index of the + zero-based array of icons stored in the file. If IconIndex is negative, + the absolute value is used as a resource ID. + + CAPABILITIES_REINSTALL [optional] + The command executed when a user uses Set Program Access and Computer + Defaults to select this application as the default for its client type. + This command should launch a program that associates the application with + all the file and protocol types it can handle. + + CAPABILITIES_HIDE_ICONS [optional] + The command executed when a user uses Set Program Access and Computer + Defaults to disable access to this application. This command should launch + a program that hides all shortcuts and access points to this application. + It should also prevent the application from being run automatically and + update the IconsVisible registry value to 0. + + CAPABILITIES_SHOW_ICONS [optional] + The command executed when a user uses Set Program Access and Computer + Defaults to enable access to this application. This command should launch + a program that restores shortcuts and access points to the application, + allows the program to run, and updates the IconsVisible registry value to 1. + + +Macros: + + ${RegisterCapabilities} + Registers the program with Default Programs. Call this once on install + before using any other functions. + +${UnRegisterCapabilities} + Un-registers the program and all its associations. Call this once on + uninstall to clean up all installed registry values. + +${RegisterFileType} "[extension]" "[executable]" "[icon]" "[description]" + Registers a file type with the program + extension: The file extension to register (ex: .txt) + executable: The executable that opens the file type + icon: The icon shown for the file type + description: Description for the file type shown in Explorer + +${RegisterMediaType} "[extension]" "[executable]" "[icon]" "[description]" + Registers a media file type with the program (has a "Play" command) + (arguments are same as RegisterFileType) + +${RegisterMimeType} "[mime type]" "[shortname]" "[clsid]" + Registers a mime type with the program + mime type: The MIME type to register (ex: audio/mp3) + shortname: A short identifier for the type (ex: mp3) + clsid: The CLSID of the program to handle files of this type + +${RegisterProtocol} "[protocol]" "[executable]" "[icon]" "[description]" + Registers a URL protocol with the program + protocol: The protocol to register (ex: http) + (other arguments are same as RegisterFileType) + +${UnRegisterFileType} "[extension]" + Un-registers a previously registered file type + extension: The file extension to un-register + +${UnRegisterMimeType} "[mime type]" + Un-registers a previously registered MEME type + mime type: The MIME type to un-register + +${UnRegisterProtocol} "[protocol]" + Un-registers a previously registered URL protocol + protocol: The URL protocol to un-register + +*/ + + + + +!ifndef Capabilities_INCLUDED +!define Capabilities_INCLUDED + +!include "Util.nsh" +!include "StrFunc.nsh" + +${StrCase} + +!verbose push +!verbose 3 +!ifndef _Capabilities_VERBOSE + !define _Capabilities_VERBOSE 3 +!endif +!verbose ${_Capabilities_VERBOSE} +!define Capabilities_VERBOSE `!insertmacro Capabilities_VERBOSE` +!verbose pop + +!macro Capabilities_VERBOSE _VERBOSE + !verbose push + !verbose 3 + !undef _Capabilities_VERBOSE + !define _Capabilities_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + +!macro RegisterCapabilitiesCall + !verbose push + !verbose ${_Capabilities_VERBOSE} + ${CallArtificialFunction} RegisterCapabilities_ + !verbose pop +!macroend + +!macro UnRegisterCapabilitiesCall + !verbose push + !verbose ${_Capabilities_VERBOSE} + ${CallArtificialFunction} UnRegisterCapabilities_ + !verbose pop +!macroend + +!macro RegisterFileTypeCall _EXTENSION _EXECUTABLE _ICON _DESCRIPTION + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_ICON}` + Push `${_EXECUTABLE}` + Push `${_EXTENSION}` + ${CallArtificialFunction} RegisterFileType_ + !verbose pop +!macroend + +!macro RegisterMediaTypeCall _EXTENSION _EXECUTABLE _ICON _DESCRIPTION + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_ICON}` + Push `${_EXECUTABLE}` + Push `${_EXTENSION}` + ${CallArtificialFunction} RegisterMediaType_ + !verbose pop +!macroend + +!macro RegisterMimeTypeCall _MIMETYPE _SHORTNAME _CLSID + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_CLSID}` + Push `${_SHORTNAME}` + Push `${_MIMETYPE}` + ${CallArtificialFunction} RegisterMimeType_ + !verbose pop +!macroend + +!macro RegisterProtocolCall _PROTOCOL _EXECUTABLE _ICON _DESCRIPTION + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_ICON}` + Push `${_EXECUTABLE}` + Push `${_PROTOCOL}` + ${CallArtificialFunction} RegisterProtocol_ + !verbose pop +!macroend + +!macro UnRegisterFileTypeCall _EXTENSION + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_EXTENSION}` + ${CallArtificialFunction} UnRegisterFileType_ + !verbose pop +!macroend + +!macro UnRegisterMimeTypeCall _MIMETYPE + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_MIMETYPE}` + ${CallArtificialFunction} UnRegisterMimeType_ + !verbose pop +!macroend + +!macro UnRegisterProtocolCall _PROTOCOL + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push `${_MIMETYPE}` + ${CallArtificialFunction} UnRegisterProtocol_ + !verbose pop +!macroend + + + + +!define RegisterCapabilities `!insertmacro RegisterCapabilitiesCall` +!define un.RegisterCapabilities `!insertmacro RegisterCapabilitiesCall` + +!macro RegisterCapabilities +!macroend + +!macro un.RegisterCapabilities +!macroend + +!macro RegisterCapabilities_ + !verbose push + !verbose ${_Capabilities_VERBOSE} + Push $0 + + !ifndef CAPABILITIES_PATH + !error "CAPABILITIES_PATH not defined" + !endif + !ifndef CAPABILITIES_NAME + !error "CAPABILITIES_NAME not defined" + !endif + !ifndef CAPABILITIES_PROGID + !error "CAPABILITIES_PROGID not defined" + !endif + !ifndef CAPABILITIES_DESCRIPTION + !error "CAPABILITIES_DESCRIPTION not defined" + !endif + + StrCpy $0 "${CAPABILITIES_PATH}\Capabilities" + ; add the application to RegisteredApplications + WriteRegStr HKLM "Software\RegisteredApplications" "${CAPABILITIES_NAME}" "$0" + + ; write application info + WriteRegStr HKLM "${CAPABILITIES_PATH}" "" "${CAPABILITIES_NAME}" + + !ifdef CAPABILITIES_LOCAL_NAME + WriteRegStr HKLM "${CAPABILITIES_PATH}" "LocalizedString" "${CAPABILITIES_LOCAL_NAME}" + !endif + !ifdef CAPABILITIES_ICON + WriteRegStr HKLM "${CAPABILITIES_PATH}\DefaultIcon" "" "${CAPABILITIES_ICON}" + !endif + + ; write installinfo if defined + !ifdef CAPABILITIES_REINSTALL + WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "ReinstallCommand" "${CAPABILITIES_REINSTALL}" + !endif + !ifdef CAPABILITIES_HIDE_ICONS + WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "HideIconsCommand" "${CAPABILITIES_HIDE_ICONS}" + WriteRegDWORD HKLM "${CAPABILITIES_PATH}\InstallInfo" "IconsVisible" 0x1 + !endif + !ifdef CAPABILITIES_SHOW_ICONS + WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "ShowIconsCommand" "${CAPABILITIES_SHOW_ICONS}" + WriteRegDWORD HKLM "${CAPABILITIES_PATH}\InstallInfo" "IconsVisible" 0x1 + !endif + + ; write application capabilities info + !ifdef CAPABILITIES_LOCAL_NAME + WriteRegStr HKLM "$0" "ApplicationName" "${CAPABILITIES_LOCAL_NAME}" + !else + WriteRegStr HKLM "$0" "ApplicationName" "${CAPABILITIES_NAME}" + !endif + WriteRegStr HKLM "$0" "ApplicationDescription" "${CAPABILITIES_DESCRIPTION}" + + Pop $0 + !verbose pop +!macroend + + + +!define UnRegisterCapabilities `!insertmacro UnRegisterCapabilitiesCall` +!define un.UnRegisterCapabilities `!insertmacro UnRegisterCapabilitiesCall` + +!macro UnRegisterCapabilities +!macroend + +!macro un.UnRegisterCapabilities +!macroend + +!macro UnRegisterCapabilities_ + !define MacroID ${__LINE__} + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Push $0 + Push $1 + + ; remove all file associations + FileTypeLoop_${MacroID}: + EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" 0 + StrCmp $0 "" FileTypeDone_${MacroID} + + ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$0" + DeleteRegKey HKCR $1 + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$0" + + Goto FileTypeLoop_${MacroID} + FileTypeDone_${MacroID}: + + ; remove all MIME associations + MimeTypeLoop_${MacroID}: + EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" 0 + StrCmp $0 "" MimeTypeDone_${MacroID} + + ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$0" + DeleteRegKey HKCR "$1" + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$0" + + Goto MimeTypeLoop_${MacroID} + MimeTypeDone_${MacroID}: + + ; remove all protocol associations + ProtocolLoop_${MacroID}: + EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" 0 + StrCmp $0 "" ProtocolDone_${MacroID} + + ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$0" + DeleteRegKey HKCR "$1" + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$0" + + Goto ProtocolLoop_${MacroID} + ProtocolDone_${MacroID}: + + + ; remove capabilities keys + DeleteRegValue HKLM "Software\RegisteredApplications" "${CAPABILITIES_NAME}" + DeleteRegKey HKLM ${CAPABILITIES_PATH} + + Pop $1 + Pop $0 + !verbose pop + !undef MacroID +!macroend + + + + + +!define RegisterFileType `!insertmacro RegisterFileTypeCall` +!define un.RegisterFileType `!insertmacro RegisterFileTypeCall` + +!macro RegisterFileType +!macroend + +!macro un.RegisterFileType +!macroend + + +!macro RegisterFileType_ + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R3 ;ext + Exch + Exch $R2 ;exe + Exch 2 + Exch $R1 ;icon + Exch + Exch 3 + Exch $R0 ;desc + Push $0 + + ; create an association name + ; ex: .mp3 becomes ProgID.AssocFile.MP3 + ${StrCase} $0 "$R3" "U" + StrCpy $0 "${CAPABILITIES_PROGID}.AssocFile$0" + + ; link capabilities to association in classes root + WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R3" "$0" + + ; write file association in classes root + WriteRegStr HKCR "$0" "" "$R0" + WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" + WriteRegStr HKCR "$0\shell" "" "Open" + WriteRegStr HKCR "$0\shell\open" "" "&Open" + WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' + + Pop $0 + Pop $R0 + Pop $R1 + Pop $R2 + Pop $R3 + + !verbose pop +!macroend + + + + +!define RegisterMediaType `!insertmacro RegisterMediaTypeCall` +!define un.RegisterMediaType `!insertmacro RegisterMediaTypeCall` + +!macro RegisterMediaType +!macroend + +!macro un.RegisterMediaType +!macroend + + +!macro RegisterMediaType_ + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R3 ;ext + Exch + Exch $R2 ;exe + Exch 2 + Exch $R1 ;icon + Exch + Exch 3 + Exch $R0 ;desc + Push $0 + + + ; create an association name + ; ex: .mp3 becomes ProgID.AssocFile.MP3 + ${StrCase} $0 "$R3" "U" + StrCpy $0 "${CAPABILITIES_PROGID}.AssocFile$0" + + ; link capabilities to association in classes root + WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R3" "$0" + + ; write file association in classes root + WriteRegStr HKCR "$0" "" "$R0" + WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" + WriteRegStr HKCR "$0\shell" "" "Play" + WriteRegStr HKCR "$0\shell\open" "" "&Open" + WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' + WriteRegStr HKCR "$0\shell\play" "" "&Play" + WriteRegStr HKCR "$0\shell\play\command" "" '"$R2" "%L"' + + Pop $0 + Pop $R0 + Pop $R1 + Pop $R2 + Pop $R3 + + !verbose pop +!macroend + + + + +!define RegisterMimeType `!insertmacro RegisterMimeTypeCall` +!define un.RegisterMimeType `!insertmacro RegisterMimeTypeCall` + +!macro RegisterMimeType +!macroend + +!macro un.RegisterMimeType +!macroend + + +!macro RegisterMimeType_ + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R2 ;mime + Exch + Exch $R1 ;shortname + Exch + Exch 2 + Exch $R0 ;clsid + + Push $0 + + ; create an association name + ; ex: audio/mp3 becomes ProgID.AssocMIME.MP3 + ${StrCase} $0 "$R1" "U" + StrCpy $0 "${CAPABILITIES_PROGID}.AssocMIME.$0" + + ; link capabilities to association in classes root + WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R2" "$0" + + ; write file association in classes root + WriteRegStr HKCR "$0\CLSID" "" "$R0" + + Pop $0 + Pop $R0 + Pop $R1 + + !verbose pop +!macroend + + + +!define RegisterProtocol `!insertmacro RegisterProtocolCall` +!define un.RegisterProtocol `!insertmacro RegisterProtocolCall` + +!macro RegisterProtocol +!macroend + +!macro un.RegisterProtocol +!macroend + + +!macro RegisterProtocol_ + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R3 ;protocol + Exch + Exch $R2 ;exe + Exch 2 + Exch $R1 ;icon + Exch + Exch 3 + Exch $R0 ;desc + Push $0 + + + ; create an association name + ; ex: http becomes ProgID.AssocProtocol.HTTP + ${StrCase} $0 "$R3" "U" + StrCpy $0 "${CAPABILITIES_PROGID}.AssocProtocol.$0" + + ; link capabilities to association in classes root + WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R3" "$0" + + ; write file association in classes root + WriteRegStr HKCR "$0" "" "$R0" + WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" + WriteRegStr HKCR "$0\shell\open" "" "&Open" + WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' + + Pop $0 + Pop $R0 + Pop $R1 + Pop $R2 + Pop $R3 + + !verbose pop +!macroend + + + + +!define UnRegisterFileType `!insertmacro UnRegisterFileTypeCall` +!define un.UnRegisterFileType `!insertmacro UnRegisterFileTypeCall` + +!macro UnRegisterFileType +!macroend + +!macro un.UnRegisterFileType +!macroend + +!macro UnRegisterFileType_ + !define MacroID ${__LINE__} + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R0 ;ext + Push $0 + + ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R0" + StrCmp $0 "" skip_${MacroID} + + DeleteRegKey HKCR "$0" + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R0" + skip_${MacroID}: + + Pop $0 + Pop $R0 + !verbose pop + !undef MacroID +!macroend + + + +!define UnRegisterMimeType `!insertmacro UnRegisterMimeTypeCall` +!define un.UnRegisterMimeType `!insertmacro UnRegisterMimeTypeCall` + +!macro UnRegisterMimeType +!macroend + +!macro un.UnRegisterMimeType +!macroend + +!macro UnRegisterMimeType_ + !define MacroID ${__LINE__} + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R0 ;mime + Push $0 + + ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R0" + StrCmp $0 "" skip_${MacroID} + + DeleteRegKey HKCR "$0" + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R0" + skip_${MacroID}: + + Pop $0 + Pop $R0 + !verbose pop + !undef MacroID +!macroend + + + +!define UnRegisterProtocol `!insertmacro UnRegisterProtocolCall` +!define un.UnRegisterProtocol `!insertmacro UnRegisterProtocolCall` + +!macro UnRegisterProtocol +!macroend + +!macro un.UnRegisterProtocol +!macroend + +!macro UnRegisterProtocol_ + !define MacroID ${__LINE__} + !verbose push + !verbose ${_Capabilities_VERBOSE} + + Exch $R0 ;protocol + Push $0 + + ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R0" + StrCmp $0 "" skip_${MacroID} + + DeleteRegKey HKCR "$0" + DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R0" + skip_${MacroID}: + + Pop $0 + Pop $R0 + !verbose pop + !undef MacroID +!macroend + + + + +!endif \ No newline at end of file diff --git a/dist/windows/FileAssociation.nsh b/dist/windows/FileAssociation.nsh new file mode 100644 index 000000000..cc2f98583 --- /dev/null +++ b/dist/windows/FileAssociation.nsh @@ -0,0 +1,190 @@ +/* +_____________________________________________________________________________ + + File Association +_____________________________________________________________________________ + + Based on code taken from http://nsis.sourceforge.net/File_Association + + Usage in script: + 1. !include "FileAssociation.nsh" + 2. [Section|Function] + ${FileAssociationFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + FileAssociationFunction=[RegisterExtension|UnRegisterExtension] + +_____________________________________________________________________________ + + ${RegisterExtension} "[executable]" "[extension]" "[description]" + +"[executable]" ; executable which opens the file format + ; +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + + + ${UnRegisterExtension} "[extension]" "[description]" + +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + +_____________________________________________________________________________ + + Macros +_____________________________________________________________________________ + + Change log window verbosity (default: 3=no script) + + Example: + !include "FileAssociation.nsh" + !insertmacro RegisterExtension + ${FileAssociation_VERBOSE} 4 # all verbosity + !insertmacro UnRegisterExtension + ${FileAssociation_VERBOSE} 3 # no script +*/ + + +!ifndef FileAssociation_INCLUDED +!define FileAssociation_INCLUDED + +!include Util.nsh + +!verbose push +!verbose 3 +!ifndef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE 3 +!endif +!verbose ${_FileAssociation_VERBOSE} +!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` +!verbose pop + +!macro FileAssociation_VERBOSE _VERBOSE + !verbose push + !verbose 3 + !undef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + + + +!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_EXTENSION}` + Push `${_EXECUTABLE}` + ${CallArtificialFunction} RegisterExtension_ + !verbose pop +!macroend + +!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_EXTENSION}` + Push `${_DESCRIPTION}` + ${CallArtificialFunction} UnRegisterExtension_ + !verbose pop +!macroend + + + +!define RegisterExtension `!insertmacro RegisterExtensionCall` +!define un.RegisterExtension `!insertmacro RegisterExtensionCall` + +!macro RegisterExtension +!macroend + +!macro un.RegisterExtension +!macroend + +!macro RegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R2 ;exe + Exch + Exch $R1 ;ext + Exch + Exch 2 + Exch $R0 ;desc + Exch 2 + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R1 "" ; read current file association + StrCmp "$1" "" NoBackup ; is it empty + StrCmp "$1" "$R0" NoBackup ; is it our own + WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value +NoBackup: + WriteRegStr HKCR $R1 "" "$R0" ; set our file association + + ReadRegStr $0 HKCR $R0 "" + StrCmp $0 "" 0 Skip + WriteRegStr HKCR "$R0" "" "$R0" + WriteRegStr HKCR "$R0\shell" "" "open" + WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0" +Skip: + WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"' + WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" + WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"' + + Pop $1 + Pop $0 + Pop $R2 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + + + +!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` +!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` + +!macro UnRegisterExtension +!macroend + +!macro un.UnRegisterExtension +!macroend + +!macro UnRegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R1 ;desc + Exch + Exch $R0 ;ext + Exch + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R0 "" + StrCmp $1 $R1 0 NoOwn ; only do this if we own it + ReadRegStr $1 HKCR $R0 "backup_val" + StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key + DeleteRegKey HKCR $R0 + Goto NoOwn + +Restore: + WriteRegStr HKCR $R0 "" $1 + DeleteRegValue HKCR $R0 "backup_val" + DeleteRegKey HKCR $R1 ;Delete key with association name settings + +NoOwn: + + Pop $1 + Pop $0 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + +!endif # !FileAssociation_INCLUDED diff --git a/dist/windows/strawberry.nsi b/dist/windows/strawberry.nsi new file mode 100644 index 000000000..b6fb87789 --- /dev/null +++ b/dist/windows/strawberry.nsi @@ -0,0 +1,573 @@ +!define PRODUCT_NAME "Strawberry" +!define PRODUCT_PUBLISHER "Strawberry" +!define PRODUCT_VERSION_MAJOR 0 +!define PRODUCT_VERSION_MINOR 1 +!define PRODUCT_DISPLAY_VERSION "0.1.7" +!define PRODUCT_DISPLAY_VERSION_SHORT "0.1.7" +!define PRODUCT_WEB_SITE "http://www.strawbs.org/" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" +!define PRODUCT_INSTALL_DIR "$PROGRAMFILES\Strawberry Music Player" + +; Set Application Capabilities info +!define CAPABILITIES_NAME "Strawberry Music Player" +!define CAPABILITIES_LOCAL_NAME "Strawberry" +!define CAPABILITIES_PROGID "Strawberry Music Player" +!define CAPABILITIES_PATH "Software\Clients\Media\Strawberry" +!define CAPABILITIES_DESCRIPTION "Strawberry Music Player" +!define CAPABILITIES_ICON "$INSTDIR\strawberry.ico" +!define CAPABILITIES_REINSTALL "Command to reinstall" +!define CAPABILITIES_HIDE_ICONS "Command to hide icons" +!define CAPABILITIES_SHOW_ICONS "Command to show icons" + +SetCompressor /SOLID lzma +!addplugindir nsisplugins +!include "MUI2.nsh" +!include "FileAssociation.nsh" +!include "Capabilities.nsh" + +!define MUI_ICON "strawberry.ico" + +!define MUI_COMPONENTSPAGE_SMALLDESC +;!define MUI_FINISHPAGE_RUN +;!define MUI_FINISHPAGE_RUN_TEXT "Run Strawberry" +;!define MUI_FINISHPAGE_RUN_FUNCTION "RunStrawberry" + +; Installer pages +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" ;first language is the default language + +Name "${PRODUCT_NAME}" +OutFile "${PRODUCT_NAME}Setup-0.1.7.exe" +InstallDir "${PRODUCT_INSTALL_DIR}" + +; Get the path where Strawberry was installed previously and set it as default path +InstallDirRegKey ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString" + +ShowInstDetails show +ShowUnInstDetails show +RequestExecutionLevel admin +;RequestExecutionLevel user + +; Check for previous installation, and call the uninstaller if any +Function CheckPreviousInstall + + ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString" + StrCmp $R0 "" done + + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ + "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \ + previous version or `Cancel` to cancel this upgrade." \ + IDOK uninst + Abort +; Run the uninstaller +uninst: + ClearErrors + ExecWait '$R0' ; Do not copy the uninstaller to a temp file + +done: + +FunctionEnd + +Function .onInit + + !insertmacro MUI_LANGDLL_DISPLAY + + Call CheckPreviousInstall + +FunctionEnd + +;!define LVM_GETITEMCOUNT 0x1004 +!define LVM_GETITEMTEXT 0x102D + +Function DumpLog + Exch $5 + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $6 + + FindWindow $0 "#32770" "" $HWNDPARENT + GetDlgItem $0 $0 1016 + StrCmp $0 0 exit + FileOpen $5 $5 "w" + StrCmp $5 "" exit + SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6 + System::Alloc ${NSIS_MAX_STRLEN} + Pop $3 + StrCpy $2 0 + System::Call "*(i, i, i, i, i, i, i, i, i) i \ + (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1" + loop: StrCmp $2 $6 done + System::Call "User32::SendMessageA(i, i, i, i) i \ + ($0, ${LVM_GETITEMTEXT}, $2, r1)" + System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)" + FileWrite $5 "$4$\r$\n" + IntOp $2 $2 + 1 + Goto loop + done: + FileClose $5 + System::Free $1 + System::Free $3 + exit: + Pop $6 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $5 +FunctionEnd + +;Function RunStrawberry + ;ShellExecAsUser::ShellExecAsUser "" "$INSTDIR/strawberry.exe" "" +;FunctionEnd + +Section "Delete old files" oldfiles +SectionEnd + +Section "Strawberry" Strawberry + SetOutPath "$INSTDIR" + + File "strawberry.exe" + File "strawberry-tagreader.exe" + File "strawberry.ico" + + File "libbz2.dll" + File "libcdio-16.dll" + File "libchromaprint.dll" + File "libcrypto-1_1.dll" + File "libfaad-2.dll" + File "libffi-6.dll" + File "libFLAC-8.dll" + File "libfreetype-6.dll" + File "libgcc_s_sjlj-1.dll" + File "libgio-2.0-0.dll" + File "libglib-2.0-0.dll" + File "libgmodule-2.0-0.dll" + File "libgobject-2.0-0.dll" + File "libgstapp-1.0-0.dll" + File "libgstaudio-1.0-0.dll" + File "libgstbase-1.0-0.dll" + File "libgstfft-1.0-0.dll" + File "libgstpbutils-1.0-0.dll" + File "libgstreamer-1.0-0.dll" + File "libgstriff-1.0-0.dll" + File "libgstrtp-1.0-0.dll" + File "libgstrtsp-1.0-0.dll" + File "libgstsdp-1.0-0.dll" + File "libgsttag-1.0-0.dll" + File "libgstvideo-1.0-0.dll" + File "libharfbuzz-0.dll" + File "libiconv-2.dll" + File "libintl-8.dll" + File "libjpeg-9.dll" + File "liblastfm5.dll" + File "libmp3lame-0.dll" + File "libogg-0.dll" + File "libopus-0.dll" + File "libpcre-1.dll" + File "libpcre2-16-0.dll" + File "libpng16-16.dll" + File "libprotobuf-15.dll" + File "libspeex-1.dll" + File "libsqlite3-0.dll" + File "libssl-1_1.dll" + File "libstdc++-6.dll" + File "libtag.dll" + File "libvorbis-0.dll" + File "libvorbisenc-2.dll" + File "libwavpack-1.dll" + File "libwinpthread-1.dll" + File "Qt5Concurrent.dll" + File "Qt5Core.dll" + File "Qt5Gui.dll" + File "Qt5Network.dll" + File "Qt5Sql.dll" + File "Qt5Widgets.dll" + File "Qt5Xml.dll" + File "zlib1.dll" + File "libxine-2.dll" + File "libmpcdec-5.dll" + File "libtheora-0.dll" + File "libfftw3-3.dll" + + ; Register Strawberry with Default Programs + Var /GLOBAL AppIcon + Var /GLOBAL AppExe + StrCpy $AppExe "$INSTDIR\strawberry.exe" + StrCpy $AppIcon "$INSTDIR\strawberry.ico" + + ${RegisterCapabilities} + + ${RegisterMediaType} ".mp3" $AppExe $AppIcon "MP3 Audio File" + ${RegisterMediaType} ".flac" $AppExe $AppIcon "FLAC Audio File" + ${RegisterMediaType} ".ogg" $AppExe $AppIcon "OGG Audio File" + ${RegisterMediaType} ".spx" $AppExe $AppIcon "OGG Speex Audio File" + ${RegisterMediaType} ".m4a" $AppExe $AppIcon "MP4 Audio File" + ${RegisterMediaType} ".aac" $AppExe $AppIcon "AAC Audio File" + ${RegisterMediaType} ".wma" $AppExe $AppIcon "WMA Audio File" + ${RegisterMediaType} ".wav" $AppExe $AppIcon "WAV Audio File" + + ${RegisterMediaType} ".pls" $AppExe $AppIcon "PLS Audio File" + ${RegisterMediaType} ".m3u" $AppExe $AppIcon "M3U Audio File" + ${RegisterMediaType} ".xspf" $AppExe $AppIcon "XSPF Audio File" + ${RegisterMediaType} ".asx" $AppExe $AppIcon "Windows Media Audio/Video playlist" + + ${RegisterMimeType} "audio/mp3" "mp3" "{cd3afa76-b84f-48f0-9393-7edc34128127}" + ${RegisterMimeType} "audio/mp4" "m4a" "{cd3afa7c-b84f-48f0-9393-7edc34128127}" + ${RegisterMimeType} "audio/x-ms-wma" "wma" "{cd3afa84-b84f-48f0-9393-7edc34128127}" + ${RegisterMimeType} "audio/wav" "wav" "{cd3afa7b-b84f-48f0-9393-7edc34128127}" + + ${RegisterMimeType} "audio/mpegurl" "m3u" "{cd3afa78-b84f-48f0-9393-7edc34128127}" + ${RegisterMimeType} "application/x-wmplayer" "asx" "{cd3afa96-b84f-48f0-9393-7edc34128127}" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Qt Platforms" platforms + SetOutPath "$INSTDIR\platforms" + File "/oname=qwindows.dll" "platforms\qwindows.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Qt SQL Drivers" sqldrivers + SetOutPath "$INSTDIR\sqldrivers" + File "/oname=qsqlite.dll" "sqldrivers\qsqlite.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Qt image format plugins" imageformats + SetOutPath "$INSTDIR\imageformats" + File "/oname=qgif.dll" "imageformats\qgif.dll" + File "/oname=qico.dll" "imageformats\qico.dll" + File "/oname=qjpeg.dll" "imageformats\qjpeg.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Gstreamer plugins" gstreamer-plugins + SetOutPath "$INSTDIR\gstreamer-plugins" + + File "/oname=libgstapetag.dll" "gstreamer-plugins\libgstapetag.dll" + File "/oname=libgstapp.dll" "gstreamer-plugins\libgstapp.dll" + File "/oname=libgstasf.dll" "gstreamer-plugins\libgstasf.dll" + File "/oname=libgstaiff.dll" "gstreamer-plugins\libgstaiff.dll" + File "/oname=libgstaudioconvert.dll" "gstreamer-plugins\libgstaudioconvert.dll" + File "/oname=libgstaudiofx.dll" "gstreamer-plugins\libgstaudiofx.dll" + File "/oname=libgstaudioparsers.dll" "gstreamer-plugins\libgstaudioparsers.dll" + File "/oname=libgstaudioresample.dll" "gstreamer-plugins\libgstaudioresample.dll" + File "/oname=libgstaudiotestsrc.dll" "gstreamer-plugins\libgstaudiotestsrc.dll" + File "/oname=libgstautodetect.dll" "gstreamer-plugins\libgstautodetect.dll" + File "/oname=libgstcoreelements.dll" "gstreamer-plugins\libgstcoreelements.dll" + File "/oname=libgstdirectsound.dll" "gstreamer-plugins\libgstdirectsound.dll" + File "/oname=libgstequalizer.dll" "gstreamer-plugins\libgstequalizer.dll" + File "/oname=libgstfaad.dll" "gstreamer-plugins\libgstfaad.dll" + File "/oname=libgstflac.dll" "gstreamer-plugins\libgstflac.dll" + File "/oname=libgstgio.dll" "gstreamer-plugins\libgstgio.dll" + File "/oname=libgsticydemux.dll" "gstreamer-plugins\libgsticydemux.dll" + File "/oname=libgstid3demux.dll" "gstreamer-plugins\libgstid3demux.dll" + File "/oname=libgstisomp4.dll" "gstreamer-plugins\libgstisomp4.dll" + File "/oname=libgstlame.dll" "gstreamer-plugins\libgstlame.dll" + File "/oname=libgstogg.dll" "gstreamer-plugins\libgstogg.dll" + File "/oname=libgstopusparse.dll" "gstreamer-plugins\libgstopusparse.dll" + File "/oname=libgstplayback.dll" "gstreamer-plugins\libgstplayback.dll" + File "/oname=libgstreplaygain.dll" "gstreamer-plugins\libgstreplaygain.dll" + File "/oname=libgstspectrum.dll" "gstreamer-plugins\libgstspectrum.dll" + File "/oname=libgstspeex.dll" "gstreamer-plugins\libgstspeex.dll" + File "/oname=libgsttaglib.dll" "gstreamer-plugins\libgsttaglib.dll" + File "/oname=libgsttypefindfunctions.dll" "gstreamer-plugins\libgsttypefindfunctions.dll" + File "/oname=libgstvolume.dll" "gstreamer-plugins\libgstvolume.dll" + File "/oname=libgstvorbis.dll" "gstreamer-plugins\libgstvorbis.dll" + File "/oname=libgstwavpack.dll" "gstreamer-plugins\libgstwavpack.dll" + File "/oname=libgstwavparse.dll" "gstreamer-plugins\libgstwavparse.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Xine plugins" xine-plugins + SetOutPath "$INSTDIR\xine-plugins" + File "/oname=xineplug_ao_out_directx2.dll" "xine-plugins\xineplug_ao_out_directx2.dll" + File "/oname=xineplug_ao_out_directx.dll" "xine-plugins\xineplug_ao_out_directx.dll" + File "/oname=xineplug_decode_dts.dll" "xine-plugins\xineplug_decode_dts.dll" + File "/oname=xineplug_decode_dvaudio.dll" "xine-plugins\xineplug_decode_dvaudio.dll" + File "/oname=xineplug_decode_faad.dll" "xine-plugins\xineplug_decode_faad.dll" + File "/oname=xineplug_decode_gsm610.dll" "xine-plugins\xineplug_decode_gsm610.dll" + File "/oname=xineplug_decode_lpcm.dll" "xine-plugins\xineplug_decode_lpcm.dll" + File "/oname=xineplug_decode_mad.dll" "xine-plugins\xineplug_decode_mad.dll" + File "/oname=xineplug_decode_mpc.dll" "xine-plugins\xineplug_decode_mpc.dll" + File "/oname=xineplug_decode_mpeg2.dll" "xine-plugins\xineplug_decode_mpeg2.dll" + File "/oname=xineplug_dmx_asf.dll" "xine-plugins\xineplug_dmx_asf.dll" + File "/oname=xineplug_dmx_audio.dll" "xine-plugins\xineplug_dmx_audio.dll" + File "/oname=xineplug_dmx_playlist.dll" "xine-plugins\xineplug_dmx_playlist.dll" + File "/oname=xineplug_dmx_slave.dll" "xine-plugins\xineplug_dmx_slave.dll" + File "/oname=xineplug_flac.dll" "xine-plugins\xineplug_flac.dll" + File "/oname=xineplug_wavpack.dll" "xine-plugins\xineplug_wavpack.dll" + File "/oname=xineplug_xiph.dll" "xine-plugins\xineplug_xiph.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Xine plugins post" xine-plugins-post + SetOutPath "$INSTDIR\xine-plugins\post" + File "/oname=xineplug_post_audio_filters.dll" "xine-plugins\post\xineplug_post_audio_filters.dll" + File "/oname=xineplug_post_goom.dll" "xine-plugins\post\xineplug_post_goom.dll" + File "/oname=xineplug_post_mosaico.dll" "xine-plugins\post\xineplug_post_mosaico.dll" + File "/oname=xineplug_post_planar.dll" "xine-plugins\post\xineplug_post_planar.dll" + File "/oname=xineplug_post_switch.dll" "xine-plugins\post\xineplug_post_switch.dll" + File "/oname=xineplug_post_tvtime.dll" "xine-plugins\post\xineplug_post_tvtime.dll" + File "/oname=xineplug_post_visualizations.dll" "xine-plugins\post\xineplug_post_visualizations.dll" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Start menu items" startmenu + ; Create Start Menu folders and shortcuts. + SetShellVarContext all + + CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\strawberry.exe" + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Uninstaller" + ; Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\strawberry.ico" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_DISPLAY_VERSION}" + WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMajor" "${PRODUCT_VERSION_MAJOR}" + WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMinor" "${PRODUCT_VERSION_MINOR}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + + StrCpy $0 "$EXEDIR\install.log" + Push $0 + Call DumpLog + +SectionEnd + +Section "Uninstall" + ; Kill strawberry.exe if it's running + ; This calling convention is retarded... + ;StrCpy $0 "strawberry.exe" + ;KillProc::FindProcesses + ;StrCmp $1 "-1" wooops + + ;StrCmp $0 "0" completed + + ;DetailPrint "Killing running strawberry.exe..." + + ;StrCpy $0 "strawberry.exe" + ;KillProc::KillProcesses + ;StrCmp $1 "-1" wooops + + ;Sleep 2000 + ;Goto completed + + ;wooops: + ;DetailPrint "-> Error: Something went wrong while killing running strawberry.exe" + ;Abort + + ;completed: + + ; Delete all the files + + ;Delete "$EXEDIR\install.log" + + Delete "$INSTDIR\strawberry.ico" + Delete "$INSTDIR\strawberry.exe" + Delete "$INSTDIR\strawberry-tagreader.exe" + + Delete "$INSTDIR\libbz2.dll" + Delete "$INSTDIR\libcdio-16.dll" + Delete "$INSTDIR\libchromaprint.dll" + Delete "$INSTDIR\libcrypto-1_1.dll" + Delete "$INSTDIR\libfaad-2.dll" + Delete "$INSTDIR\libffi-6.dll" + Delete "$INSTDIR\libFLAC-8.dll" + Delete "$INSTDIR\libfreetype-6.dll" + Delete "$INSTDIR\libgcc_s_sjlj-1.dll" + Delete "$INSTDIR\libgio-2.0-0.dll" + Delete "$INSTDIR\libglib-2.0-0.dll" + Delete "$INSTDIR\libgmodule-2.0-0.dll" + Delete "$INSTDIR\libgobject-2.0-0.dll" + Delete "$INSTDIR\libgstapp-1.0-0.dll" + Delete "$INSTDIR\libgstaudio-1.0-0.dll" + Delete "$INSTDIR\libgstbase-1.0-0.dll" + Delete "$INSTDIR\libgstfft-1.0-0.dll" + Delete "$INSTDIR\libgstpbutils-1.0-0.dll" + Delete "$INSTDIR\libgstreamer-1.0-0.dll" + Delete "$INSTDIR\libgstriff-1.0-0.dll" + Delete "$INSTDIR\libgstrtp-1.0-0.dll" + Delete "$INSTDIR\libgstrtsp-1.0-0.dll" + Delete "$INSTDIR\libgstsdp-1.0-0.dll" + Delete "$INSTDIR\libgsttag-1.0-0.dll" + Delete "$INSTDIR\libgstvideo-1.0-0.dll" + Delete "$INSTDIR\libharfbuzz-0.dll" + Delete "$INSTDIR\libiconv-2.dll" + Delete "$INSTDIR\libintl-8.dll" + Delete "$INSTDIR\libjpeg-9.dll" + Delete "$INSTDIR\liblastfm5.dll" + Delete "$INSTDIR\libmp3lame-0.dll" + Delete "$INSTDIR\libogg-0.dll" + Delete "$INSTDIR\libopus-0.dll" + Delete "$INSTDIR\libpcre-1.dll" + Delete "$INSTDIR\libpcre2-16-0.dll" + Delete "$INSTDIR\libpng16-16.dll" + Delete "$INSTDIR\libprotobuf-15.dll" + Delete "$INSTDIR\libspeex-1.dll" + Delete "$INSTDIR\libsqlite3-0.dll" + Delete "$INSTDIR\libssl-1_1.dll" + Delete "$INSTDIR\libstdc++-6.dll" + Delete "$INSTDIR\libtag.dll" + Delete "$INSTDIR\libvorbis-0.dll" + Delete "$INSTDIR\libvorbisenc-2.dll" + Delete "$INSTDIR\libwavpack-1.dll" + Delete "$INSTDIR\libwinpthread-1.dll" + Delete "$INSTDIR\Qt5Concurrent.dll" + Delete "$INSTDIR\Qt5Core.dll" + Delete "$INSTDIR\Qt5Gui.dll" + Delete "$INSTDIR\Qt5Network.dll" + Delete "$INSTDIR\Qt5Sql.dll" + Delete "$INSTDIR\Qt5Widgets.dll" + Delete "$INSTDIR\Qt5Xml.dll" + Delete "$INSTDIR\zlib1.dll" + Delete "$INSTDIR\libxine-2.dll" + Delete "$INSTDIR\libmpcdec-5.dll" + Delete "$INSTDIR\libtheora-0.dll" + Delete "$INSTDIR\libfftw3-3.dll" + + Delete "$INSTDIR\platforms\qwindows.dll" + Delete "$INSTDIR\sqldrivers\qsqlite.dll" + + Delete "$INSTDIR\imageformats\qgif.dll" + Delete "$INSTDIR\imageformats\qico.dll" + Delete "$INSTDIR\imageformats\qjpeg.dll" + + Delete "$INSTDIR\gstreamer-plugins\libgstapetag.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstapp.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstasf.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaiff.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaudioconvert.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaudiofx.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaudioparsers.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaudioresample.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstaudiotestsrc.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstautodetect.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstcoreelements.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstdirectsound.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstequalizer.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstfaad.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstflac.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstgio.dll" + Delete "$INSTDIR\gstreamer-plugins\libgsticydemux.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstid3demux.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstisomp4.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstlame.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstogg.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstopusparse.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstplayback.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstreplaygain.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstspectrum.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstspeex.dll" + Delete "$INSTDIR\gstreamer-plugins\libgsttaglib.dll" + Delete "$INSTDIR\gstreamer-plugins\libgsttypefindfunctions.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstvolume.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstvorbis.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstwavpack.dll" + Delete "$INSTDIR\gstreamer-plugins\libgstwavparse.dll" + + Delete "$INSTDIR\xine-plugins\xineplug_ao_out_directx2.dll" + Delete "$INSTDIR\xine-plugins\xineplug_ao_out_directx.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_dts.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_dvaudio.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_faad.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_gsm610.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_lpcm.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_mad.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_mpc.dll" + Delete "$INSTDIR\xine-plugins\xineplug_decode_mpeg2.dll" + Delete "$INSTDIR\xine-plugins\xineplug_dmx_asf.dll" + Delete "$INSTDIR\xine-plugins\xineplug_dmx_audio.dll" + Delete "$INSTDIR\xine-plugins\xineplug_dmx_playlist.dll" + Delete "$INSTDIR\xine-plugins\xineplug_dmx_slave.dll" + Delete "$INSTDIR\xine-plugins\xineplug_flac.dll" + Delete "$INSTDIR\xine-plugins\xineplug_wavpack.dll" + Delete "$INSTDIR\xine-plugins\xineplug_xiph.dll" + + Delete "$INSTDIR\xine-plugins\post\xineplug_post_audio_filters.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_goom.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_mosaico.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_planar.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_switch.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_tvtime.dll" + Delete "$INSTDIR\xine-plugins\post\xineplug_post_visualizations.dll" + + Delete "$INSTDIR\Uninstall.exe" + + ; Remove the installation folders. + RMDir "$INSTDIR\platforms" + RMDir "$INSTDIR\sqldrivers" + RMDir "$INSTDIR\imageformats" + RMDir "$INSTDIR\gstreamer-plugins" + RMDir "$INSTDIR\xine-plugins\post" + RMDir "$INSTDIR\xine-plugins" + RMDir "$INSTDIR" + + ; Remove the Shortcuts + SetShellVarContext all + + Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" + RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" + + ; Remove the entry from 'installed programs list' + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + + ; Unregister from Default Programs + ${UnRegisterCapabilities} + +SectionEnd + diff --git a/dist/windows/windres.rc.in b/dist/windows/windres.rc.in index 12bdebf41..f09c35dd4 100644 --- a/dist/windows/windres.rc.in +++ b/dist/windows/windres.rc.in @@ -1,7 +1,7 @@ strawberry ICON "${CMAKE_CURRENT_SOURCE_DIR}/../dist/windows/strawberry.ico" 1 VERSIONINFO -FILEVERSION ${STRAWBERRY_VERSION_MAJOR},${STRAWBERRY_VERSION_MINOR},0,0 -PRODUCTVERSION ${STRAWBERRY_VERSION_MAJOR},${STRAWBERRY_VERSION_MINOR},0,0 +FILEVERSION ${STRAWBERRY_VERSION_MAJOR},${STRAWBERRY_VERSION_MINOR},{STRAWBERRY_VERSION_PATCH},0 +PRODUCTVERSION ${STRAWBERRY_VERSION_MAJOR},${STRAWBERRY_VERSION_MINOR},{STRAWBERRY_VERSION_PATCH},0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -11,7 +11,7 @@ BEGIN VALUE "FileDescription", "Strawberry Music Player" VALUE "FileVersion", "${STRAWBERRY_VERSION_DISPLAY}" VALUE "InternalName", "strawberry" - VALUE "LegalCopyright", "David Sansome" + VALUE "LegalCopyright", "David Sansome / Jonas Kvinge" VALUE "OriginalFilename", "strawberry.exe" VALUE "ProductName", "Strawberry" VALUE "ProductVersion", "${STRAWBERRY_VERSION_DISPLAY}" diff --git a/ext/strawberry-tagreader/CMakeLists.txt b/ext/strawberry-tagreader/CMakeLists.txt index 767f00f29..a3dc65839 100644 --- a/ext/strawberry-tagreader/CMakeLists.txt +++ b/ext/strawberry-tagreader/CMakeLists.txt @@ -45,9 +45,5 @@ if(APPLE) ) endif(APPLE) -if(NOT APPLE) - # macdeploy.py takes care of this on mac - install(TARGETS strawberry-tagreader - RUNTIME DESTINATION bin - ) -endif(NOT APPLE) + +install(TARGETS strawberry-tagreader RUNTIME DESTINATION bin) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e63966eab..38e3605d9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -179,7 +179,6 @@ set(SOURCES covermanager/albumcovermanager.cpp covermanager/albumcovermanagerlist.cpp covermanager/albumcoverloader.cpp - covermanager/albumcoverloaderoptions.cpp covermanager/albumcoverfetcher.cpp covermanager/albumcoverfetchersearch.cpp covermanager/albumcoversearcher.cpp @@ -790,12 +789,8 @@ optional_source(APPLE globalshortcuts/globalshortcutgrabber.mm globalshortcuts/macglobalshortcutbackend.mm HEADERS - core/mac_startup.h core/macsystemtrayicon.h - core/macscreensaver.h core/macfslistener.h - core/mac_utilities.h - core/mac_delegate.h globalshortcuts/macglobalshortcutbackend.h ) @@ -916,6 +911,7 @@ if (APPLE) "-framework IOKit" "-framework ScriptingBridge" ) + target_link_libraries(strawberry_lib ${SPMEDIAKEYTAP_LIBRARIES}) if (HAVE_SPARKLE) include_directories(${SPARKLE}/Headers) @@ -982,55 +978,10 @@ target_link_libraries(strawberry # macdeploy.py relies on the blob being built first. add_dependencies(strawberry strawberry-tagreader) -#set_target_properties(strawberry PROPERTIES - #MACOSX_BUNDLE_INFO_PLIST "../dist/macos/Info.plist" -#) +if (NOT APPLE) + install(TARGETS strawberry RUNTIME DESTINATION bin) +endif() if (APPLE) - install(FILES ../dist/macos/strawberry.icns DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources") - install(FILES ../dist/macos/qt.conf DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources") - install(FILES ../dist/macos/sparkle_pub.pem DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources") - - install(DIRECTORY "${QT_QTGUI_LIBRARY_RELEASE}/Versions/Current/Resources/" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources") - - if (HAVE_SPARKLE) - install(DIRECTORY "${SPARKLE}/Versions/Current/Resources" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/Sparkle.framework") - endif (HAVE_SPARKLE) - - install(FILES "${QT_QTCORE_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtCore.framework/Versions/4/Resources") - install(FILES "${QT_QTGUI_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources") - install(FILES "${QT_QTNETWORK_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtNetwork.framework/Versions/4/Resources") - install(FILES "${QT_QTOPENGL_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/Resources") - install(FILES "${QT_QTSQL_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtSql.framework/Versions/4/Resources") - install(FILES "${QT_QTSVG_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtSvg.framework/Versions/4/Resources") - install(FILES "${QT_QTXML_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/QtXml.framework/Versions/4/Resources") - - #add_custom_command(TARGET strawberry - # POST_BUILD - # COMMAND - # ${CMAKE_CURRENT_SOURCE_DIR}/../dist/macos/macdeploy.py ${PROJECT_BINARY_DIR}/strawberry.app -f - # WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - #) - - #if (APPLE_DEVELOPER_ID) - # add_custom_target( - # sign - # COMMAND - # ${PROJECT_SOURCE_DIR}/dist/macos/codesign.py ${APPLE_DEVELOPER_ID} ${PROJECT_BINARY_DIR}/strawberry.app - # DEPENDS strawberry - # VERBATIM - # ) - #endif() - - #add_custom_command( - # OUTPUT ${PROJECT_BINARY_DIR}/strawberry-${STRAWBERRY_VERSION_PACKAGE}.dmg ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/strawberry-$#{STRAWBERRY_VERSION_PACKAGE}.dmg - # COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../dist/macos/create-dmg.sh ${PROJECT_BINARY_DIR}/strawberry.app - # COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/strawberry.dmg ${PROJECT_BINARY_DIR}/strawberry-${STRAWBERRY_VERSION_PACKAGE}.dmg - # DEPENDS strawberry - # WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - #) - #add_custom_target(dmg - # DEPENDS ${PROJECT_BINARY_DIR}/strawberry-${STRAWBERRY_VERSION_PACKAGE}.dmg) -else (APPLE) - install(TARGETS strawberry RUNTIME DESTINATION bin ) + set_target_properties(strawberry PROPERTIES MACOSX_BUNDLE_INFO_PLIST "../dist/macos/Info.plist") endif (APPLE) diff --git a/src/core/main.cpp b/src/core/main.cpp index 755bd8e41..e104a56d6 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -22,29 +22,14 @@ #include "config.h" #include "version.h" +#include + #include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_DBUS -# include -#endif - #ifdef Q_OS_UNIX # include #endif @@ -62,6 +47,22 @@ #include #endif // Q_OS_WIN32 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_DBUS +# include +#endif + #include "main.h" #include "core/logging.h" @@ -161,7 +162,7 @@ int main(int argc, char* argv[]) { QtSingleApplication a(argc, argv); #ifdef Q_OS_MACOS - QCoreApplication::setLibraryPaths(QStringList() << QCoreApplication::applicationDirPath() + "/../PlugIns"); + //QCoreApplication::setLibraryPaths(QStringList() << QCoreApplication::applicationDirPath() + "/../PlugIns"); #endif a.setQuitOnLastWindowClosed(false); diff --git a/src/covermanager/albumcoverloaderoptions.cpp b/src/covermanager/albumcoverloaderoptions.cpp deleted file mode 100644 index 5dca642f9..000000000 --- a/src/covermanager/albumcoverloaderoptions.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "albumcoverloaderoptions.h" diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index 3261825fc..b3909b4f5 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -398,7 +398,6 @@ bool GstEngine::ValidOutput(const QString &output) { } - bool GstEngine::CustomDeviceSupport(const QString &output) { return (output == kALSASink || output == kOpenALSASink || output == kOSSSink || output == kOSS4Sink || output == kPulseSink || output == kA2DPSink || output == kAVDTPSink); } @@ -429,9 +428,12 @@ void GstEngine::SetEnvironment() { // On windows and mac we bundle the gstreamer plugins with strawberry #if defined(Q_OS_MACOS) - scanner_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gst-plugin-scanner"; - plugin_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gstreamer"; -#elif defined(Q_OS_WIN32) + //scanner_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gst-plugin-scanner"; + //plugin_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gstreamer"; + scanner_path = "/usr/local/Cellar/gstreamer/1.14.1/libexec/gstreamer-1.0/gst-plugin-scanner"; + plugin_path = "/usr/local/lib/gstreamer-1.0"; +#endif +#if defined(Q_OS_WIN32) plugin_path = QDir::toNativeSeparators(QCoreApplication::applicationDirPath() + "/gstreamer-plugins"); #endif @@ -451,9 +453,9 @@ void GstEngine::SetEnvironment() { Utilities::SetEnv("GST_REGISTRY", registry_filename); } -#ifdef Q_OS_MACOS - Utilities::SetEnv("GIO_EXTRA_MODULES", QCoreApplication::applicationDirPath() + "/../PlugIns/gio-modules"); -#endif +//#ifdef Q_OS_MACOS + //Utilities::SetEnv("GIO_EXTRA_MODULES", QCoreApplication::applicationDirPath() + "/../PlugIns/gio-modules"); +//#endif Utilities::SetEnv("PULSE_PROP_media.role", "music"); diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index 0b95f06b8..9bfbbec27 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -206,17 +206,19 @@ bool GstEnginePipeline::InitAudioBin() { if (device_.isValid() && g_object_class_find_property(G_OBJECT_GET_CLASS(audiosink_), "device")) { switch (device_.type()) { - case QVariant::Int: - g_object_set(G_OBJECT(audiosink_), "device", device_.toInt(), nullptr); - break; case QVariant::String: if (device_.toString().isEmpty()) break; g_object_set(G_OBJECT(audiosink_), "device", device_.toString().toUtf8().constData(), nullptr); break; - case QVariant::ByteArray: { + case QVariant::ByteArray: g_object_set(G_OBJECT(audiosink_), "device", device_.toByteArray().constData(), nullptr); break; - } + case QVariant::LongLong: + g_object_set(G_OBJECT(audiosink_), "device", device_.toLongLong(), nullptr); + break; + case QVariant::Int: + g_object_set(G_OBJECT(audiosink_), "device", device_.toInt(), nullptr); + break; default: qLog(Warning) << "Unknown device type" << device_; break; diff --git a/src/engine/osxdevicefinder.cpp b/src/engine/osxdevicefinder.cpp index 6dbb07160..2f342db9b 100644 --- a/src/engine/osxdevicefinder.cpp +++ b/src/engine/osxdevicefinder.cpp @@ -102,11 +102,13 @@ QList OsxDeviceFinder::ListDevices() { } Device dev; - dev.description = QString::fromUtf8(CFStringGetCStringPtr(*device_name, CFStringGetSystemEncoding())); dev.value = id; + dev.description = QString::fromUtf8(CFStringGetCStringPtr(*device_name, CFStringGetSystemEncoding())); + if (dev.description.isEmpty()) dev.description = QString("Unknown device " + dev.value.toString()); dev.iconname = GuessIconName(dev.description); ret.append(dev); } return ret; + }