diff --git a/.travis.yml b/.travis.yml index ac554314..f34f04ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ matrix: addons: apt: sources: - - sourceline: 'ppa:beineri/opt-qt-5.12.3-xenial' + - sourceline: 'ppa:beineri/opt-qt-5.15.0-xenial' - sourceline: 'ppa:brightbox/ruby-ng' packages: # FPM dependencies @@ -16,9 +16,9 @@ matrix: - ruby2.3 - ruby2.3-dev # QT - - qt512base - - qt512multimedia - - qt512tools + - qt515base + - qt515multimedia + - qt515tools - mesa-common-dev - libgl1-mesa-dev # PCap @@ -40,18 +40,18 @@ matrix: - echo "Uploading $BASENAME to file.io..." && curl -sF "file=@$FILE" https://file.io | xargs printf "$BASENAME uploaded - %s\n" - os: osx - osx_image: xcode9.4 + osx_image: xcode11.6 + addons: + homebrew: + packages: + - libpcap + - qt + - create-dmg before_install: - chmod +x install/mac/sign-mac-executable.sh - ./install/mac/sign-mac-executable.sh - - brew update install: - # PCap - - brew install libpcap - # QT 5.12.3 - - git -C "$(brew --repo homebrew/core)" pull --unshallow - - git -C "$(brew --repo homebrew/core)" checkout -b qt5.12.3 65a45a9e61f15046a256cdba6a008f38f79570c9 - - HOMEBREW_NO_AUTO_UPDATE=1 brew install qt + # QT - brew link --force qt script: - qmake diff --git a/appveyor.yml b/appveyor.yml index 26b28103..b7519198 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,11 +20,11 @@ environment: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 QT_Ver: 5.6 MSVC_Compiler: msvc2015 - MSVC_Name: Microsoft Visual Studio 14.0 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - QT_Ver: 5.12 - MSVC_Compiler: msvc2017 - MSVC_Name: Microsoft Visual Studio 14.0 + VCVAR: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat' + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + QT_Ver: 5.15 + MSVC_Compiler: msvc2019 + VCVAR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat' # build platform, i.e. x86, x64, Any CPU. This setting is optional. platform: x86 @@ -47,7 +47,7 @@ install: # MSVC Paths # https://www.appveyor.com/docs/lang/cpp/#visual-studio - - call "C:\Program Files (x86)\%MSVC_Name%\VC\vcvarsall.bat" x86 + - call "%VCVAR%" x86 # QT Paths # https://www.appveyor.com/docs/build-environment/#qt diff --git a/deploy.pri b/deploy.pri index a962f689..dad20532 100644 --- a/deploy.pri +++ b/deploy.pri @@ -49,8 +49,9 @@ macx { DEPLOY_CLEANUP = codesign --force --deep --verify --verbose --sign \"Thomas Steer\" $${DEPLOY_TARGET} $$escape_expand(\\n\\t) DEPLOY_CLEANUP += $${QMAKE_DEL_FILE} $${DEPLOY_DIR}/sACNView*.dmg - DEPLOY_INSTALLER = $${_PRO_FILE_PWD_}/install/mac/create-dmg --volname "sACNView_Installer" --volicon "$${_PRO_FILE_PWD_}/res/icon.icns" - DEPLOY_INSTALLER += --background "$${_PRO_FILE_PWD_}/res/mac_install_bg.png" --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon $${TARGET}$${TARGET_CUSTOM_EXT} 200 190 --hide-extension $${TARGET}$${TARGET_CUSTOM_EXT} --app-drop-link 600 185 + DEPLOY_INSTALLER = create-dmg --volname "sACNView_Installer" --volicon "$${_PRO_FILE_PWD_}/res/icon.icns" + DEPLOY_INSTALLER += --background "$${_PRO_FILE_PWD_}/res/mac_install_bg.png" --window-pos 200 120 --window-size 800 400 --icon-size 100 + DEPLOY_INSTALLER += --icon $${TARGET}$${TARGET_CUSTOM_EXT} 200 190 --hide-extension $${TARGET}$${TARGET_CUSTOM_EXT} --app-drop-link 600 185 --skip-jenkins DEPLOY_INSTALLER += $${DEPLOY_DIR}/sACNView_$${VERSION}.dmg $${OUT_PWD}/$${TARGET}$${TARGET_CUSTOM_EXT} } linux { diff --git a/install/mac/create-dmg b/install/mac/create-dmg index 3e55dd97..79185a5a 100755 --- a/install/mac/create-dmg +++ b/install/mac/create-dmg @@ -1,230 +1,438 @@ -#! /bin/bash +#!/usr/bin/env bash # Create a read-only disk image of the contents of a folder +# Bail out on any unhandled errors set -e; +CDMG_VERSION='1.0.8' + +# The full path to the "support/" directory this script is using +# (This will be set up by code later in the script.) +CDMG_SUPPORT_DIR="" + +WINX=10 +WINY=60 +WINW=500 +WINH=350 +ICON_SIZE=128 +TEXT_SIZE=16 +FORMAT="UDZO" +ADD_FILE_SOURCES=() +ADD_FILE_TARGETS=() +IMAGEKEY="" +HDIUTIL_VERBOSITY="" +SANDBOX_SAFE=0 +SKIP_JENKINS=0 + function pure_version() { - echo '1.0.0.2' + echo "$CDMG_VERSION" } function version() { - echo "create-dmg $(pure_version)" + echo "create-dmg $(pure_version)" } function usage() { - version - echo "Creates a fancy DMG file." - echo "Usage: $(basename $0) options... image.dmg source_folder" - echo "All contents of source_folder will be copied into the disk image." - echo "Options:" - echo " --volname name" - echo " set volume name (displayed in the Finder sidebar and window title)" - echo " --volicon icon.icns" - echo " set volume icon" - echo " --background pic.png" - echo " set folder background image (provide png, gif, jpg)" - echo " --window-pos x y" - echo " set position the folder window" - echo " --window-size width height" - echo " set size of the folder window" - echo " --text-size text_size" - echo " set window text size (10-16)" - echo " --icon-size icon_size" - echo " set window icons size (up to 128)" - echo " --icon file_name x y" - echo " set position of the file's icon" - echo " --hide-extension file_name" - echo " hide the extension of file" - echo " --custom-icon file_name custom_icon_or_sample_file x y" - echo " set position and custom icon" - echo " --app-drop-link x y" - echo " make a drop link to Applications, at location x,y" - echo " --eula eula_file" - echo " attach a license file to the dmg" - echo " --no-internet-enable" - echo " disable automatic mount©" - echo " --version show tool version number" - echo " -h, --help display this help" - exit 0 + version + cat < + +All contents of will be copied into the disk image. + +Options: + --volname + set volume name (displayed in the Finder sidebar and window title) + --volicon + set volume icon + --background + set folder background image (provide png, gif, or jpg) + --window-pos + set position the folder window + --window-size + set size of the folder window + --text-size + set window text size (10-16) + --icon-size + set window icons size (up to 128) + --icon file_name + set position of the file's icon + --hide-extension + hide the extension of file + --custom-icon + set position and custom icon + --app-drop-link + make a drop link to Applications, at location x,y + --ql-drop-link + make a drop link to user QuickLook install dir, at location x,y + --eula + attach a license file to the dmg (plain text or RTF) + --no-internet-enable + disable automatic mount & copy + --format + specify the final image format (default is UDZO) + --add-file | + add additional file or folder (can be used multiple times) + --disk-image-size + set the disk image size manually to x MB + --hdiutil-verbose + execute hdiutil in verbose mode + --hdiutil-quiet + execute hdiutil in quiet mode + --sandbox-safe + execute hdiutil with sandbox compatibility and do not bless + --rez + use custom path to Rez tool + --version + show create-dmg version number + -h, --help + display this help screen + +EOHELP + exit 0 } -WINX=10 -WINY=60 -WINW=500 -WINH=350 -ICON_SIZE=128 -TEXT_SIZE=16 +# Argument parsing -while test "${1:0:1}" = "-"; do - case $1 in - --volname) - VOLUME_NAME="$2" - shift; shift;; - --volicon) - VOLUME_ICON_FILE="$2" - shift; shift;; - --background) - BACKGROUND_FILE="$2" - BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)" - BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" - REPOSITION_HIDDEN_FILES_CLAUSE="set position of every item to {theBottomRightX + 100, 100}" - shift; shift;; - --icon-size) - ICON_SIZE="$2" - shift; shift;; - --text-size) - TEXT_SIZE="$2" - shift; shift;; - --window-pos) - WINX=$2; WINY=$3 - shift; shift; shift;; - --window-size) - WINW=$2; WINH=$3 - shift; shift; shift;; - --icon) - POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} -" - shift; shift; shift; shift;; - --hide-extension) - HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true -" - shift; shift;; - --custom-icon) - shift; shift; shift; shift; shift;; - -h | --help) - usage;; - --version) - version; exit 0;; - --pure-version) - pure_version; exit 0;; - --app-drop-link) - APPLICATION_LINK=$2 - APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3} -" - shift; shift; shift;; - --eula) - EULA_RSRC=$2 - shift; shift;; - --no-internet-enable) - NOINTERNET=1 - shift;; - -*) - echo "Unknown option $1. Run with --help for help." - exit 1;; - esac +while [[ "${1:0:1}" = "-" ]]; do + case $1 in + --volname) + VOLUME_NAME="$2" + shift; shift;; + --volicon) + VOLUME_ICON_FILE="$2" + shift; shift;; + --background) + BACKGROUND_FILE="$2" + BACKGROUND_FILE_NAME="$(basename "$BACKGROUND_FILE")" + BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" + REPOSITION_HIDDEN_FILES_CLAUSE="set position of every item to {theBottomRightX + 100, 100}" + shift; shift;; + --icon-size) + ICON_SIZE="$2" + shift; shift;; + --text-size) + TEXT_SIZE="$2" + shift; shift;; + --window-pos) + WINX=$2; WINY=$3 + shift; shift; shift;; + --window-size) + WINW=$2; WINH=$3 + shift; shift; shift;; + --icon) + POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} + " + shift; shift; shift; shift;; + --hide-extension) + HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true + " + shift; shift;; + --custom-icon) + shift; shift; shift; shift; shift;; + -h | --help) + usage;; + --version) + version; exit 0;; + --pure-version) + pure_version; exit 0;; + --ql-drop-link) + QL_LINK=$2 + QL_CLAUSE="set position of item \"QuickLook\" to {$2, $3} + " + shift; shift; shift;; + --app-drop-link) + APPLICATION_LINK=$2 + APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3} + " + shift; shift; shift;; + --eula) + EULA_RSRC=$2 + shift; shift;; + --no-internet-enable) + NOINTERNET=1 + shift;; + --format) + FORMAT="$2" + shift; shift;; + --add-file | --add-folder) + ADD_FILE_TARGETS+=("$2") + ADD_FILE_SOURCES+=("$3") + POSITION_CLAUSE="${POSITION_CLAUSE} + set position of item \"$2\" to {$4, $5} + " + shift; shift; shift; shift; shift;; + --disk-image-size) + DISK_IMAGE_SIZE="$2" + shift; shift;; + --hdiutil-verbose) + HDIUTIL_VERBOSITY='-verbose' + shift;; + --hdiutil-quiet) + HDIUTIL_VERBOSITY='-quiet' + shift;; + --sandbox-safe) + SANDBOX_SAFE=1 + shift;; + --rez) + REZ_PATH="$2" + shift; shift;; + --skip-jenkins) + SKIP_JENKINS=1 + shift;; + -*) + echo "Unknown option: $1. Run 'create-dmg --help' for help." + exit 1;; + esac + case $FORMAT in + UDZO) + IMAGEKEY="-imagekey zlib-level=9";; + UDBZ) + IMAGEKEY="-imagekey bzip2-level=9";; + *) + echo >&2 "Unknown format: $FORMAT" + exit 1;; + esac done -test -z "$2" && { - echo "Not enough arguments. Invoke with --help for help." - exit 1 -} +if [[ -z "$2" ]]; then + echo "Not enough arguments. Run 'create-dmg --help' for help." + exit 1 +fi -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DMG_PATH="$1" +SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" + +# Main script logic + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DMG_DIRNAME="$(dirname "$DMG_PATH")" DMG_DIR="$(cd "$DMG_DIRNAME" > /dev/null; pwd)" DMG_NAME="$(basename "$DMG_PATH")" DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" -SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" -test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" -AUX_PATH="$SCRIPT_DIR/support" +# Detect where we're running from -test -d "$AUX_PATH" || { - echo "Cannot find support directory: $AUX_PATH" - exit 1 -} +sentinel_file="$SCRIPT_DIR/.this-is-the-create-dmg-repo" +if [[ -f "$sentinel_file" ]]; then + # We're running from inside a repo + CDMG_SUPPORT_DIR="$SCRIPT_DIR/support" +else + # We're running inside an installed location + bin_dir="$SCRIPT_DIR" + prefix_dir=$(dirname "$bin_dir") + CDMG_SUPPORT_DIR="$prefix_dir/share/create-dmg/support" +fi -if [ -f "$SRC_FOLDER/.DS_Store" ]; then - echo "Deleting any .DS_Store in source folder" - rm "$SRC_FOLDER/.DS_Store" +if [[ -z "$VOLUME_NAME" ]]; then + VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" +fi + +if [[ ! -d "$CDMG_SUPPORT_DIR" ]]; then + echo >&2 "Cannot find support/ directory: expected at: $CDMG_SUPPORT_DIR" + exit 1 +fi + +if [[ -f "$SRC_FOLDER/.DS_Store" ]]; then + echo "Deleting .DS_Store found in source folder" + rm "$SRC_FOLDER/.DS_Store" fi # Create the image echo "Creating disk image..." -test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}" -ACTUAL_SIZE=`du -sm "$SRC_FOLDER" | sed -e 's/ .*//g'` -DISK_IMAGE_SIZE=$(expr $ACTUAL_SIZE + 20) -hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}" +if [[ -f "${DMG_TEMP_NAME}" ]]; then + rm -f "${DMG_TEMP_NAME}" +fi + +# Use Megabytes since hdiutil fails with very large byte numbers +function blocks_to_megabytes() { + # Add 1 extra MB, since there's no decimal retention here + MB_SIZE=$((($1 * 512 / 1000 / 1000) + 1)) + echo $MB_SIZE +} + +function get_size() { + # Get block size in disk + bytes_size=$(du -s "$1" | sed -e 's/ .*//g') + echo $(blocks_to_megabytes $bytes_size) +} + +# Create the DMG with the specified size or the hdiutil estimation +CUSTOM_SIZE='' +if [[ -n "$DISK_IMAGE_SIZE" ]]; then + CUSTOM_SIZE="-size ${DISK_IMAGE_SIZE}m" +fi + +if [[ $SANDBOX_SAFE -eq 0 ]]; then + hdiutil create ${HDIUTIL_VERBOSITY} -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" \ + -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW ${CUSTOM_SIZE} "${DMG_TEMP_NAME}" +else + hdiutil makehybrid ${HDIUTIL_VERBOSITY} -default-volume-name "${VOLUME_NAME}" -hfs -o "${DMG_TEMP_NAME}" "$SRC_FOLDER" + hdiutil convert -format UDRW -ov -o "${DMG_TEMP_NAME}" "${DMG_TEMP_NAME}" + DISK_IMAGE_SIZE_CUSTOM=$DISK_IMAGE_SIZE +fi + +# Get the created DMG actual size +DISK_IMAGE_SIZE=$(get_size "${DMG_TEMP_NAME}") + +# Use the custom size if bigger +if [[ $SANDBOX_SAFE -eq 1 ]] && [[ ! -z "$DISK_IMAGE_SIZE_CUSTOM" ]] && [[ $DISK_IMAGE_SIZE_CUSTOM -gt $DISK_IMAGE_SIZE ]]; then + DISK_IMAGE_SIZE=$DISK_IMAGE_SIZE_CUSTOM +fi + +# Estimate the additional soruces size +if [[ -n "$ADD_FILE_SOURCES" ]]; then + for i in "${!ADD_FILE_SOURCES[@]}"; do + SOURCE_SIZE=$(get_size "${ADD_FILE_SOURCES[$i]}") + DISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + $SOURCE_SIZE) + done +fi + +# Add extra space for additional resources +DISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + 20) + +# Resize the image for the extra stuff +hdiutil resize ${HDIUTIL_VERBOSITY} -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}" + +# Mount the new DMG -# mount it -echo "Mounting disk image..." MOUNT_DIR="/Volumes/${VOLUME_NAME}" -# try unmount dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it) -echo "Unmounting disk image..." -DEV_NAME=$(hdiutil info | egrep '^/dev/' | sed 1q | awk '{print $1}') -test -d "${MOUNT_DIR}" && hdiutil detach "${DEV_NAME}" +# Unmount leftover dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it) +if [[ -d "${MOUNT_DIR}" ]]; then + echo "Unmounting old disk image from $MOUNT_DIR..." + DEV_NAME=$(hdiutil info | egrep --color=never '^/dev/' | sed 1q | awk '{print $1}') + hdiutil detach "${DEV_NAME}" +fi + +echo "Mounting disk image..." echo "Mount directory: $MOUNT_DIR" -DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') +DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep --color=never '^/dev/' | sed 1q | awk '{print $1}') echo "Device name: $DEV_NAME" -if ! test -z "$BACKGROUND_FILE"; then - echo "Copying background file..." - test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background" - cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" +if [[ -n "$BACKGROUND_FILE" ]]; then + echo "Copying background file..." + [[ -d "$MOUNT_DIR/.background" ]] || mkdir "$MOUNT_DIR/.background" + cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" fi -if ! test -z "$APPLICATION_LINK"; then - echo "making link to Applications dir" - echo $MOUNT_DIR - ln -s /Applications "$MOUNT_DIR/Applications" +if [[ -n "$APPLICATION_LINK" ]]; then + echo "Making link to Applications dir..." + echo $MOUNT_DIR + ln -s /Applications "$MOUNT_DIR/Applications" fi -if ! test -z "$VOLUME_ICON_FILE"; then - echo "Copying volume icon file '$VOLUME_ICON_FILE'..." - cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns" - SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" +if [[ -n "$QL_LINK" ]]; then + echo "Making link to QuickLook install dir..." + echo $MOUNT_DIR + ln -s "/Library/QuickLook" "$MOUNT_DIR/QuickLook" fi -# run applescript -APPLESCRIPT=$(mktemp -t createdmg) -cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" -e "s/TEXT_SIZE/$TEXT_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" >"$APPLESCRIPT" +if [[ -n "$VOLUME_ICON_FILE" ]]; then + echo "Copying volume icon file '$VOLUME_ICON_FILE'..." + cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns" + SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" +fi -echo "Running Applescript: /usr/bin/osascript \"${APPLESCRIPT}\" \"${VOLUME_NAME}\"" -"/usr/bin/osascript" "${APPLESCRIPT}" "${VOLUME_NAME}" || true -echo "Done running the applescript..." -sleep 4 +if [[ -n "$ADD_FILE_SOURCES" ]]; then + echo "Copying custom files..." + for i in "${!ADD_FILE_SOURCES[@]}"; do + echo "${ADD_FILE_SOURCES[$i]}" + cp -a "${ADD_FILE_SOURCES[$i]}" "$MOUNT_DIR/${ADD_FILE_TARGETS[$i]}" + done +fi -rm "$APPLESCRIPT" +# Run AppleScript to do all the Finder cosmetic stuff +APPLESCRIPT_FILE=$(mktemp -t createdmg.tmp.XXXXXXXXXX) +if [[ $SANDBOX_SAFE -eq 1 ]]; then + echo "Skipping Finder-prettifying AppleScript because we are in Sandbox..." +else + if [[ $SKIP_JENKINS -eq 0 ]]; then + cat "$CDMG_SUPPORT_DIR/template.applescript" \ + | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" \ + -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" \ + -e "s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g" \ + -e "s/ICON_SIZE/$ICON_SIZE/g" -e "s/TEXT_SIZE/$TEXT_SIZE/g" \ + | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" \ + | perl -pe "s/QL_CLAUSE/$QL_CLAUSE/g" \ + | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" \ + | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" \ + > "$APPLESCRIPT_FILE" + sleep 2 # pause to workaround occasional "Can’t get disk" (-1728) issues + echo "Running AppleScript to make Finder stuff pretty: /usr/bin/osascript \"${APPLESCRIPT_FILE}\" \"${VOLUME_NAME}\"" + if /usr/bin/osascript "${APPLESCRIPT_FILE}" "${VOLUME_NAME}"; then + # Okay, we're cool + true + else + echo >&2 "Failed running AppleScript" + hdiutil detach "${DEV_NAME}" + exit 64 + fi + echo "Done running the AppleScript..." + sleep 4 + rm "$APPLESCRIPT_FILE" + fi +fi -# make sure it's not world writeable +# Make sure it's not world writeable echo "Fixing permissions..." chmod -Rf go-w "${MOUNT_DIR}" &> /dev/null || true -echo "Done fixing permissions." +echo "Done fixing permissions" -# make the top window open itself on mount: -echo "Blessing started" -bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}" -echo "Blessing finished" +# Make the top window open itself on mount: +if [[ $SANDBOX_SAFE -eq 0 ]]; then + echo "Blessing started" + bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}" + echo "Blessing finished" +else + echo "Skipping blessing on sandbox" +fi -if ! test -z "$VOLUME_ICON_FILE"; then - # tell the volume that it has a special file attribute - SetFile -a C "$MOUNT_DIR" +if [[ -n "$VOLUME_ICON_FILE" ]]; then + # Tell the volume that it has a special file attribute + SetFile -a C "$MOUNT_DIR" fi -# unmount +# Unmount echo "Unmounting disk image..." hdiutil detach "${DEV_NAME}" -# compress image +# Compress image echo "Compressing disk image..." -hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}" +hdiutil convert ${HDIUTIL_VERBOSITY} "${DMG_TEMP_NAME}" -format ${FORMAT} ${IMAGEKEY} -o "${DMG_DIR}/${DMG_NAME}" rm -f "${DMG_TEMP_NAME}" -# adding EULA resources -if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then - echo "adding EULA resources" - "${AUX_PATH}/dmg-license.py" "${DMG_DIR}/${DMG_NAME}" "${EULA_RSRC}" +# Adding EULA resources +if [[ -n "${EULA_RSRC}" && "${EULA_RSRC}" != "-null-" ]]; then + echo "Adding EULA resources..." + REZ_ARG="" + if [[ -n "${REZ_PATH}" && "${REZ_PATH}" != "-null-" ]]; then + REZ_ARG="--rez ${REZ_PATH}" + else + xcode_path=$(xcode-select -p) + default_rez="$xcode_path/Tools/Rez" + REZ_ARG="--rez ${default_rez}" + fi + "${CDMG_SUPPORT_DIR}/licenseDMG.py" "${DMG_DIR}/${DMG_NAME}" "${EULA_RSRC}" ${REZ_ARG} fi -if [ ! -z "${NOINTERNET}" -a "${NOINTERNET}" == 1 ]; then - echo "not setting 'internet-enable' on the dmg" +# Enable "internet", whatever that is +if [[ ! -z "${NOINTERNET}" && "${NOINTERNET}" == 1 ]]; then + echo "Not setting 'internet-enable' on the dmg, per caller request" else - hdiutil internet-enable -yes "${DMG_DIR}/${DMG_NAME}" + # Check if hdiutil supports internet-enable + # Support was removed in macOS 10.15. See https://github.com/andreyvit/create-dmg/issues/76 + if hdiutil internet-enable -help >/dev/null 2>/dev/null; then + hdiutil internet-enable -yes "${DMG_DIR}/${DMG_NAME}" + else + echo "hdiutil does not support internet-enable. Note it was removed in macOS 10.15." + fi fi +# All done! echo "Disk image done" exit 0 diff --git a/libs.pri b/libs.pri index 25fb96bc..3ddb7dbc 100644 --- a/libs.pri +++ b/libs.pri @@ -112,6 +112,9 @@ win32 { equals(QT_MAJOR_VERSION, 5):equals(QT_MINOR_VERSION, 12) { #https://wiki.qt.io/Qt_5.12_Tools_and_Versions OPENSSL_VERS = 1.1.1b } + equals(QT_MAJOR_VERSION, 5):equals(QT_MINOR_VERSION, 15) { #https://wiki.qt.io/Qt_5.15_Tools_and_Versions + OPENSSL_VERS = 1.1.1g + } contains(QT_ARCH, i386) { OPENSSL_PATH = $${_PRO_FILE_PWD_}/libs/openssl-$${OPENSSL_VERS}-win32 } else { diff --git a/libs/openssl-1.1.1g-win32/LICENSE b/libs/openssl-1.1.1g-win32/LICENSE new file mode 100644 index 00000000..9601ab43 --- /dev/null +++ b/libs/openssl-1.1.1g-win32/LICENSE @@ -0,0 +1,125 @@ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + diff --git a/libs/openssl-1.1.1g-win32/libcrypto-1_1.dll b/libs/openssl-1.1.1g-win32/libcrypto-1_1.dll new file mode 100644 index 00000000..0384783a Binary files /dev/null and b/libs/openssl-1.1.1g-win32/libcrypto-1_1.dll differ diff --git a/libs/openssl-1.1.1g-win32/libssl-1_1.dll b/libs/openssl-1.1.1g-win32/libssl-1_1.dll new file mode 100644 index 00000000..8bbabb1a Binary files /dev/null and b/libs/openssl-1.1.1g-win32/libssl-1_1.dll differ diff --git a/libs/openssl-1.1.1g-win32/readme.txt b/libs/openssl-1.1.1g-win32/readme.txt new file mode 100644 index 00000000..a414e791 --- /dev/null +++ b/libs/openssl-1.1.1g-win32/readme.txt @@ -0,0 +1,40 @@ +----------------------------------------------------------------------- +OpenSSL v1.1.1g Win32 for ICS, http://www.overbyte.be +----------------------------------------------------------------------- + +Only supports Windows Vista/Server 2008, and later, not Windows XP. + +The OpenSSL DLLs and EXE files are digitally code signed 'Open Source +Developer, Fran�ois PIETTE', the lead developer for ICS. ICS V8.38 and +later check the DLLs are correctly signed when opening them. Beware +that Windows needs recent root certificates to check newly signed code, +and may give an error if the root store has not been kept current by +Windows Update, particularly on older versions of Windows such as Vista, +7 and Windows 2008. + +Built with: + Visual Studio Build Tools 2017 + The Netwide Assembler (NASM) v2.14.02 + Strawberry Perl v5.20.3.1 + +Build Commands: + perl configure VC-WIN32-rtt + nmake + +Custom configuration file (.conf file at the "Configurations" folder): + +## -*- mode: perl; -*- +## Personal configuration targets + +%targets = ( + "VC-WIN32-rtt" => { + inherit_from => [ "VC-WIN32" ], + cflags => sub{my $v=pop; $v=~ s/\/MD/\/MT/ig; return $v}, + lflags => "/nologo /release", + }, + "VC-WIN64A-rtt" => { + inherit_from => [ "VC-WIN64A" ], + cflags => sub{my $v=pop; $v=~ s/\/MD/\/MT/ig; return $v}, + lflags => "/nologo /release", + }, +); diff --git a/libs/openssl-1.1.1g-win64/LICENSE b/libs/openssl-1.1.1g-win64/LICENSE new file mode 100644 index 00000000..9601ab43 --- /dev/null +++ b/libs/openssl-1.1.1g-win64/LICENSE @@ -0,0 +1,125 @@ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + diff --git a/libs/openssl-1.1.1g-win64/libcrypto-1_1-x64.dll b/libs/openssl-1.1.1g-win64/libcrypto-1_1-x64.dll new file mode 100644 index 00000000..b0bc445d Binary files /dev/null and b/libs/openssl-1.1.1g-win64/libcrypto-1_1-x64.dll differ diff --git a/libs/openssl-1.1.1g-win64/libssl-1_1-x64.dll b/libs/openssl-1.1.1g-win64/libssl-1_1-x64.dll new file mode 100644 index 00000000..cb71c57f Binary files /dev/null and b/libs/openssl-1.1.1g-win64/libssl-1_1-x64.dll differ diff --git a/libs/openssl-1.1.1g-win64/readme.txt b/libs/openssl-1.1.1g-win64/readme.txt new file mode 100644 index 00000000..5fe90c5b --- /dev/null +++ b/libs/openssl-1.1.1g-win64/readme.txt @@ -0,0 +1,40 @@ +----------------------------------------------------------------------- +OpenSSL v1.1.1g Win64 for ICS, http://www.overbyte.be +----------------------------------------------------------------------- + +Only supports Windows Vista/Server 2008, and later, not Windows XP. + +The OpenSSL DLLs and EXE files are digitally code signed 'Open Source +Developer, Fran�ois PIETTE', the lead developer for ICS. ICS V8.38 and +later check the DLLs are correctly signed when opening them. Beware +that Windows needs recent root certificates to check newly signed code, +and may give an error if the root store has not been kept current by +Windows Update, particularly on older versions of Windows such as Vista, +7 and Windows 2008. + +Built with: + Visual Studio Build Tools 2017 + The Netwide Assembler (NASM) v2.14.02 + Strawberry Perl v5.20.3.1 + +Build Commands: + perl configure VC-WIN64A-rtt + nmake + +Custom configuration file (.conf file at the "Configurations" folder): + +## -*- mode: perl; -*- +## Personal configuration targets + +%targets = ( + "VC-WIN32-rtt" => { + inherit_from => [ "VC-WIN32" ], + cflags => sub{my $v=pop; $v=~ s/\/MD/\/MT/ig; return $v}, + lflags => "/nologo /release", + }, + "VC-WIN64A-rtt" => { + inherit_from => [ "VC-WIN64A" ], + cflags => sub{my $v=pop; $v=~ s/\/MD/\/MT/ig; return $v}, + lflags => "/nologo /release", + }, +); diff --git a/src/sacn/sacnsocket.cpp b/src/sacn/sacnsocket.cpp index 2286aef1..8b781773 100644 --- a/src/sacn/sacnsocket.cpp +++ b/src/sacn/sacnsocket.cpp @@ -113,13 +113,26 @@ bool sACNTxSocket::bind() return ok; } +bool writeDatagramLoopbackTest(const QHostAddress &dest, QHostAddress localAddress) { +#ifdef Q_OS_WIN + return false; +#endif + +#ifdef Q_OS_LINUX + return (dest.isMulticast() && !localAddress.isLoopback()); +#endif + +#ifdef Q_OS_MACOS + return (dest.isMulticast()); +#endif +} + qint64 sACNTxSocket::writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port) { -#ifndef Q_OS_WIN - // If multicast, copy to correct internal listener(s) - if (host.isMulticast()) { + // Copy to correct internal listener(s) for local display, if required by platform + if (writeDatagramLoopbackTest(host, localAddress())) { CIPAddr addr; - for (auto weakListener : sACNManager::getInstance()->getListenerList()) { + for (auto &weakListener : sACNManager::getInstance()->getListenerList()) { sACNManager::tListener listener(weakListener); if (listener) { GetUniverseAddress(listener->universe(), addr); @@ -132,7 +145,6 @@ qint64 sACNTxSocket::writeDatagram(const char *data, qint64 len, const QHostAddr } } } -#endif // Send to world return QUdpSocket::writeDatagram(data, len, host, port); diff --git a/src/scopewidget.cpp b/src/scopewidget.cpp index 8a853116..174a0998 100644 --- a/src/scopewidget.cpp +++ b/src/scopewidget.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "sacn/sacnlistener.h" #define AXIS_WIDTH 50 diff --git a/src/theme/darkstyle.cpp b/src/theme/darkstyle.cpp index 7d5ece66..a5cea94b 100644 --- a/src/theme/darkstyle.cpp +++ b/src/theme/darkstyle.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "darkstyle.h"