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 000000000..e15ec254b
Binary files /dev/null and b/dist/macos/strawberry.icns differ
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;
+
}