diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bcaefa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +uninstall.sh +*.tar.xz diff --git a/README.md b/README.md index 0d77c0a..d023e48 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,17 @@ By providing this software, I do not give any guarantees of its work. This scrip ### Known issues - When hovering on toolbar item to see its instructions, black bars may appear around +- Wine's experimental wayland driver is completely broken +## Installation + +```bash +git clone https://github.com/shvedes/photoshop-linux +cd photoshop-linux +./install.sh +``` ## To Do -- [ ] Uninstall script +- [x] Uninstall script - [ ] More checks in the install script -- [ ] Ability for the user to select a default installation folder +- [x] Ability for the user to select a default installation folder diff --git a/generate_desktop_entry.sh b/generate_desktop_entry.sh deleted file mode 100755 index 86f0918..0000000 --- a/generate_desktop_entry.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# Adapted script from LinSoftWin/Photoshop-CC2022-Linux - -export WINEPREFIX="$HOME/Photoshop" -export DESKTOP_ENTRY_PATH="$HOME/.local/share/applications" - -[[ ! -d "$DESKTOP_ENTRY_PATH" ]] && mkdir "$DESKTOP_ENTRY_PATH" - -echo "[Desktop Entry]" > "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "Name=Adobe Photoshop CC 2021" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo 'Exec=bash -c "'$WINEPREFIX'/drive_c/launcher.sh %F"' >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "Type=Application" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "Comment=The industry-standard photo editing software (Wine)" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "Categories=Graphics;Photography;" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "Icon=$HOME/.local/share/icons/photoshop.png" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "MimeType=image/psd;image/x-psd;image/png;image/jpg;image/jpeg;image/webp;image/heif;image/raw" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" -echo "StartupWMClass=photoshop.exe" >> "${DESKTOP_ENTRY_PATH}/photoshop.desktop" diff --git a/install.sh b/install.sh index d06c440..507c64e 100755 --- a/install.sh +++ b/install.sh @@ -1,8 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash # Adapted script from LinSoftWin/Photoshop-CC2022-Linux -export WINEPREFIX="$HOME/Photoshop" +export WINEPREFIX="$1" export XDG_DATA_HOME="$HOME/.local/share" LOG_NORMAL="\e[1;97m" @@ -11,113 +11,257 @@ LOG_SUCCESS="\e[1;32m" LOG_RESET="\e[0m" TEMP_DIR="$(mktemp -d)" -ICON_URL="https://cdn3d.iconscout.com/3d/premium/thumb/adobe-photoshop-file-3d-icon-download-in-png-blend-fbx-gltf-formats--logo-format-graphic-design-pack-development-icons-9831950.png?f=webp" +FILENAME="Photoshop.tar.xz" -if [[ -d "$WINEPREFIX" ]]; then - echo -e "${LOG_NORMAL}Photoshop path (\$HOME/Photoshop) already exists${LOG_RESET}" - exit 1 -fi +trap 'on_error ${LINENO} "$BASH_COMMAND"' ERR +trap on_interrupt SIGINT + +on_interrupt() { + echo -e "\n${LOG_NORMAL}User intrrupt! Cleaning up..${LOG_RESET}" + + if [ -f "./$FILENAME" ]; then + rm "$FILENAME" + elif [ -d "./Adobe Photoshop 2021" ]; then + rm -rf "./Adobe Photoshop 2021" + fi + + [ -d "$WINEPREFIX" ] && rm -rf "$WINEPREFIX" + rm -rf "$TEMP_DIR" + exit 0 +} + +on_error() { + local lineno="$1" + local command="$2" + echo -e "${LOG_ERROR}[LOG] error in the line ${lineno}${LOG_RESET}: command '$command'" + exit 1 +} check_dependencies() { - local dependencies=("curl" "wine" "winetricks" "imagemagick") + declare -A packages=( + ["curl"]="curl" + ["wine"]="wine" + ["winetricks"]="winetricks" + ["magick"]="imagemagick" + ) + local missed_packages=() - for i in "${dependencies[@]}"; do - if ! command -v "$i" > /dev/null; then - missed_packages+=("$i") + for bin in "${!packages[@]}"; do + if ! command -v "$bin" > /dev/null; then + missed_packages+=("${packages[$bin]}") fi done if [ ${#missed_packages[@]} -eq 0 ]; then - echo -e "${LOG_GREEN}All dependencies are installed.${LOG_RESET}" + echo -e "${LOG_SUCCESS}[LOG] All dependencies are installed${LOG_RESET}" && sleep 1 else echo -e "${LOG_ERROR}Missing dependencies:${LOG_NORMAL} ${missed_packages[@]}${LOG_RESET}" - exit 1 + exit 1 fi } -mkdir $WINEPREFIX -echo -e "${LOG_NORMAL}[LOG] Folder $WINEPREFIX created${LOG_RESET}" +setup_wine() { -# In case if you executed this script before -if [[ -f "./AdobePhotoshop2021.tar.xz" ]]; then - echo -e "${LOG_NORMAL}[LOG] AdobePhotoshop2021.tar.xz already exists. Skipping download${LOG_RESET}" -else - echo -e "${LOG_NORMAL}[LOG] Downloading Photoshop (1.1GB)${LOG_RESET}" - curl -s "https://spyderrock.com/kMnq2220-AdobePhotoshop2021.xz" -o AdobePhotoshop2021.tar.xz -fi + mkdir "$WINEPREFIX" -echo -e "${LOG_NORMAL}[LOG] Initializing wine and setting up winetricks.. It may take some time${LOG_RESET}" -wineboot &> /dev/null -winetricks fontsmooth=rgb win10 gdiplus msxml3 msxml6 atmlib corefonts dxvk win10 vkd3d d3d12 vkd3d &> /dev/null + echo -e "${LOG_NORMAL}[LOG] Folder $WINEPREFIX created${LOG_RESET}" + echo -e "${LOG_NORMAL}[LOG] Initializing wine and setting up winetricks.. It may take some time${LOG_RESET}" -echo -e "${LOG_NORMAL}[LOG] Downloading Visual C++ runtime...${LOG_RESET}" -# 2015-2022 x64 -curl -s "https://aka.ms/vs/17/release/vc_redist.x64.exe" -o "${TEMP_DIR}/vc_redist_2015_2022_x64.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2015_2022_x64.exe${LOG_RESET}" -# 2015-2022 x86 -curl -s "https://aka.ms/vs/17/release/vc_redist.x86.exe" -o "${TEMP_DIR}/vc_redist_2015_2022_x86.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2015_2022_x86.exe${LOG_RESET}" -# 2013 x64 -curl -sL "https://aka.ms/highdpimfc2013x64enu" -o "${TEMP_DIR}/vc_redist_2013_x64.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2013_x64.exe${LOG_RESET}" -# 2013 x86 -curl -sL "https://aka.ms/highdpimfc2013x86enu" -o "${TEMP_DIR}/vc_redist_2013_x86.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2013_x86.exe${LOG_RESET}" -# 2012 x64 -curl -s "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe" -o "${TEMP_DIR}/vc_redist_2012_x64.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2012_x64.exe${LOG_RESET}" -# 2012 x86 -curl -s "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe" -o "${TEMP_DIR}/vc_redist_2012_x86.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2012_x86.exe${LOG_RESET}" -# 2010 x64 -curl -s "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe" -o "${TEMP_DIR}/vc_redist_2010_x64.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2010_x64.exe${LOG_RESET}" -# 2010 x86 -curl -s "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe" -o "${TEMP_DIR}/vc_redist_2010_x86.exe" -echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2010_x86.exe${LOG_RESET}" + wineboot &> /dev/null + winetricks fontsmooth=rgb win10 gdiplus msxml3 msxml6 atmlib corefonts dxvk win10 vkd3d d3d12 vkd3d &> /dev/null -echo -e "${LOG_NORMAL}[LOG] Installing Visual C++...${LOG_RESET}" + echo -e "${LOG_NORMAL}[LOG] Downloading Visual C++ runtime...${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2015_2022_x64.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2015_2022_x64.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2015_2022_x86.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2015_2022_x86.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2013_x64.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2013_x64.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2013_x86.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2013_x86.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2012_x64.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2012_x64.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2012_x86.exe" /install /quiet /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2012_x86.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2010_x64.exe" /q /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2010_x64.exe${LOG_RESET}" -wine "${TEMP_DIR}/vc_redist_2010_x86.exe" /q /norestart &> /dev/null -echo -e " ${LOG_SUCCESS}Insalled vc_redist_2010_x86.exe${LOG_RESET}" + # 2015-2022 x64 + curl -s "https://aka.ms/vs/17/release/vc_redist.x64.exe" -o "${TEMP_DIR}/vc_redist_2015_2022_x64.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2015_2022_x64.exe${LOG_RESET}" -winecfg -v win10 &> /dev/null + # 2015-2022 x86 + curl -s "https://aka.ms/vs/17/release/vc_redist.x86.exe" -o "${TEMP_DIR}/vc_redist_2015_2022_x86.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2015_2022_x86.exe${LOG_RESET}" -echo -e "${LOG_NORMAL}[LOG] Extracting Photoshop${LOG_RESET}" -tar -xf AdobePhotoshop2021.tar.xz -echo -e "${LOG_NORMAL}[LOG] Installing Photoshop${LOG_RESET}" -mv "./Adobe Photoshop 2021" "$WINEPREFIX/drive_c/Program Files/Adobe Photoshop 2021" + # 2013 x64 + curl -sL "https://aka.ms/highdpimfc2013x64enu" -o "${TEMP_DIR}/vc_redist_2013_x64.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2013_x64.exe${LOG_RESET}" -# Copy launcher to the wine prefix -echo -e "${LOG_NORMAL}[LOG] Finishing${LOG_RESET}" -cp ./launcher.sh "$WINEPREFIX/drive_c" + # 2013 x86 + curl -sL "https://aka.ms/highdpimfc2013x86enu" -o "${TEMP_DIR}/vc_redist_2013_x86.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2013_x86.exe${LOG_RESET}" -# Download & copy icon for .desktop entry -[[ ! -d "$XDG_DATA_HOME/icons" ]] && mkdir "$XDG_DATA_HOME/icons" -curl -s "$ICON_URL" -o ${TEMP_DIR}/icon.webp -[[ -f "$XDG_DATA_HOME/icons/photoshop.png" ]] && rm "$XDG_DATA_HOME/icons/photoshop.png" -magick "${TEMP_DIR}/icon.webp" "${XDG_DATA_HOME}/icons/photoshop.png" + # 2012 x64 + curl -s "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe" -o "${TEMP_DIR}/vc_redist_2012_x64.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2012_x64.exe${LOG_RESET}" -# Generate .desktop entry for Photoshop -./generate_desktop_entry.sh + # 2012 x86 + curl -s "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe" -o "${TEMP_DIR}/vc_redist_2012_x86.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2012_x86.exe${LOG_RESET}" -echo -e "${LOG_NORMAL}[LOG] Cleaning up...${LOG_RESET}" -rm ./AdobePhotoshop2021.tar.xz -rm -rf "$TEMP_DIR" + # 2010 x64 + curl -s "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe" -o "${TEMP_DIR}/vc_redist_2010_x64.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2010_x64.exe${LOG_RESET}" + # 2010 x86 + curl -s "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe" -o "${TEMP_DIR}/vc_redist_2010_x86.exe" + echo -e " ${LOG_SUCCESS}Downloaded vc_redist_2010_x86.exe${LOG_RESET}" -echo -e "${LOG_SUCCESS}Photoshop was successfully installed!${LOG_RESET}" + echo -e "${LOG_NORMAL}[LOG] Installing Visual C++...${LOG_RESET}" + + # 2015-2022 x64 + wine "${TEMP_DIR}/vc_redist_2015_2022_x64.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2015_2022_x64.exe${LOG_RESET}" + + # 2015-2022 x86 + wine "${TEMP_DIR}/vc_redist_2015_2022_x86.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2015_2022_x86.exe${LOG_RESET}" + + # 2013 x64 + wine "${TEMP_DIR}/vc_redist_2013_x64.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2013_x64.exe${LOG_RESET}" + + # 2013 x86 + wine "${TEMP_DIR}/vc_redist_2013_x86.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2013_x86.exe${LOG_RESET}" + + # 2012 x64 + wine "${TEMP_DIR}/vc_redist_2012_x64.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2012_x64.exe${LOG_RESET}" + + # 2012 x86 + wine "${TEMP_DIR}/vc_redist_2012_x86.exe" /install /quiet /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2012_x86.exe${LOG_RESET}" + + # 2010 x64 + wine "${TEMP_DIR}/vc_redist_2010_x64.exe" /q /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2010_x64.exe${LOG_RESET}" + + # 2010 x86 + wine "${TEMP_DIR}/vc_redist_2010_x86.exe" /q /norestart &> /dev/null + echo -e " ${LOG_SUCCESS}Installed vc_redist_2010_x86.exe${LOG_RESET}" + + winecfg -v win10 &> /dev/null +} + +download_ps() { + local url="https://spyderrock.com/kMnq2220-AdobePhotoshop2021.xz" + # https://github.com/LinSoftWin/Photoshop-CC2022-Linux + local checksum="8321b969161f2d2ad736067320d493c5b6ae579eaab9400cd1fda6871af2c033" + + if [ -f "./$FILENAME" ]; then + echo -e "${LOG_NORMAL}[LOG] Found existing archive. Comparing checksums${LOG_RESET}" + local actual_checksum="$(sha256sum $FILENAME | awk '{print $1}')" + + if [ "$actual_checksum" != "$checksum" ]; then + echo -e "${LOG_ERROR}[LOG] Corrupted archive!${LOG_NORMAL} Redownloading (1.1G)${LOG_RESET}" + rm "./$FILENAME" + curl -s "$url" -o "$FILENAME" + else + echo -e "${LOG_SUCCESS}[LOG] Done${LOG_SUCCESS}" + fi + else + echo -e "${LOG_NORMAL}[LOG] Downloading Photoshop (1.1G)${LOG_RESET}" + curl -s "$url" -o "$FILENAME" + echo -e "${LOG_SUCCESS}[LOG] Downloaded Photoshop${LOG_RESET}" + + actual_checksum="$(sha256sum $FILENAME | awk '{print $1}')" + echo -e "${LOG_NORMAL}[LOG] Verifying checksums${LOG_RESET}" + + if [[ "$actual_checksum" != "$checksum" ]]; then + echo -e "${LOG_ERROR}[ERROR] Checksums are not matched!${LOG_NORMAL} Try to remove '$FILENAME' and exec this script again${LOG_RESET}" + exit 1 + else + echo -e "${LOG_SUCCESS}[LOG] Done${LOG_RESET}" + fi + fi +} + +install_ps() { + echo -e "${LOG_NORMAL}[LOG] Extracting Photoshop${LOG_RESET}" + tar -xf "./$FILENAME" + + echo -e "${LOG_NORMAL}[LOG] Installing Photoshop${LOG_RESET}" + mv "Adobe Photoshop 2021" "$WINEPREFIX/drive_c/Program Files/Adobe Photoshop 2021" +} + +install_icon() { + if [ -d "/usr/share/icons/Papirus" ]; then + DESKTOP_ENTRY_ICON_NAME="photoshop" + elif [ -d "$XDG_DATA_HOME/icons/Papirus" ]; then + DESKTOP_ENTRY_ICON_NAME="photoshop" + else + DESKTOP_ENTRY_ICON_NAME="$XDG_DATA_HOME/icons/photoshop.png" + ICON_URL="https://cdn3d.iconscout.com/3d/premium/thumb/adobe-photoshop-file-3d-icon-download-in-png-blend-fbx-gltf-formats--logo-format-graphic-design-pack-development-icons-9831950.png" + curl -s "$ICON_URL" -o "${TEMP_DIR}/icon.webp" + magick "${TEMP_DIR}/icon.webp" "${TEMP_DIR}/icon.png" + + [ ! -d "$XDG_DATA_HOME/icons" ] && mkdir "$XDG_DATA_HOME/icons" + mv ${TEMP_DIR}/icon.png "$XDG_DATA_HOME/icons/photoshop.png" + fi +} + +install_desktop_entry() { + local path="$XDG_DATA_HOME/applications/photoshop.desktop" + + echo "[Desktop Entry]" > "$path" + echo "Name=Adobe Photoshop CC 2021" >> "$path" + echo "Exec=bash -c "$WINEPREFIX/drive_c/launcher.sh %F"" >> "$path" + echo "Type=Application" >> "$path" + echo "Comment=The industry-standard photo editing software (Wine)" >> "$path" + echo "Categories=Graphics" >> "$path" + echo "Icon=$DESKTOP_ENTRY_ICON_NAME" >> "$path" + echo "MimeType=image/psd;image/x-psd;image/png;image/jpg;image/jpeg;image/webp;image/heif;image/raw" >> "$path" + echo "StartupWMClass=photoshop.exe" >> "$path" +} + +install_launcher() { + echo -e "${LOG_NORMAL}[LOG] Installing launcher${LOG_RESET}" + + local path="$WINEPREFIX/drive_c/launcher.sh" + + echo "#!/usr/bin/env bash" > "$path" + echo " " >> "$path" + echo "WINEPREFIX=\"$WINEPREFIX\"" >> "$path" + echo "DXVK_LOG_PATH=\"\$WINEPREFIX/dxvk_cache\"" >> "$path" + echo "DXVK_STATE_CACHE_PATH=\"\$WINEPREFIX/dxvk_cache\"" >> "$path" + echo "PHOTOSHOP=\"\$WINEPREFIX/drive_c/Program Files/Adobe Photoshop 2021/photoshop.exe\"" >> "$path" + echo " " >> "$path" + echo "wine64 \"\$PHOTOSHOP\" \"\$@\" " >> "$path" + + chmod +x "$path" +} + +checks() { + if [ -z "$1" ]; then + echo -e "${LOG_NORMAL}Usage: ./install.sh ${LOG_RESET}" + exit 0 + else + if [ -d "$1" ]; then + echo -e "${LOG_ERROR}Install path alrady exists${LOG_RESET}" + read -p "$(tput setaf 3)Do you want to remove it? (y/n) $(tput sgr0)" answer + + case "$answer" in + y) + rm -rf "$WINEPREFIX" + ;; + n) + exit 1 + ;; + esac + else + if [[ "$1" != /* ]]; then + echo -e "${LOG_NORMAL}You need to specify absolute path, not relative${LOG_RESET}" + exit 1 + fi + fi + fi +} + +checks "$1" +check_dependencies +setup_wine +download_ps +install_ps +install_icon +install_desktop_entry +install_launcher + +echo -e "${LOG_SUCCESS}[LOG] Photoshop successfully installed${LOG_RESET}" diff --git a/launcher.sh b/launcher.sh deleted file mode 100755 index 24b855b..0000000 --- a/launcher.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -export WINEPREFIX="$HOME/Photoshop" -export DXVK_LOG_PATH="$WINEPREFIX/dxvk_cache" -export DXVK_STATE_CACHE_PATH="$WINEPREFIX/dxvk_cache" -export PHOTOSHOP="$WINEPREFIX/drive_c/Program Files/Adobe Photoshop 2021/photoshop.exe" - -FILE_PATH=$(winepath -w "$1") - -wine64 "$PHOTOSHOP" $FILE_PATH