functions_helper 47.3 KB
Newer Older
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1
#!/usr/bin/env bash
castro-fidel's avatar
castro-fidel committed
2
# Author: Castro-Fidel (linux-gaming.ru)
3
########################################################################
castro-fidel's avatar
castro-fidel committed
4
pw_ping_test () {
5 6 7 8 9 10 11
    ping -w3 -c1 github.com &> /dev/null
    [ "$?" == "0" ] && return 0 || return 1
}

print_error () {
    echo "ERROR: $@"
}
12
export -f print_error
13 14 15 16

print_info () {
    echo "INFO: $@"
}
17
export -f print_info
18 19 20 21

print_var () {
    for vp in $@ ; do echo "${vp}=${!vp}" ; done
}
22
export -f print_var
23 24 25 26 27 28 29 30

try_copy_file () {
    if [ ! -f "$1" ] ; then	print_info "file $1 not found for copy" && return 1
    elif [ -z "$2" ] ; then	print_error "no way to copy file $1" && return 1
    else
        cp -f "$1" "$2"
        if [ "$?" != 0 ]
        then print_error "failed to copy file $1 to $2" || return 1
31
        else return 0
32 33 34
        fi
    fi
}
35
export -f try_copy_file
36 37 38 39 40 41 42 43 44 45

try_copy_dir () {
    if [ ! -d "$1" ] ; then	print_info "directory $1 not found for copy"
    elif [ -z "$2" ] ; then	print_error "no way to copy directory $1"
    else
        cp -fr "$1" "$2"
        [ "$?" != 0 ] && print_error "failed to copy directory $1 to $2" || return 0
    fi
    return 1
}
46
export -f try_copy_dir
47 48 49 50

try_remove_file () {
    if [ -f "$1" ] ; then
        rm -f "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
51
        [ "$?" == 0 ] && return 0 || return 1
52 53
    fi
}
54
export -f try_remove_file
55 56 57 58

try_remove_dir () {
    if [ -d "$1" ] ; then
        rm -fr "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
59
        [ "$?" == 0 ] && return 0 || return 1
60 61
    fi
}
62
export -f try_remove_dir
63 64

try_force_link_file () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
65
    if [ ! -f "$1" ] ; then :
66
    elif [ -z "$2" ] ; then	print_error "no way to link file $1"
67 68 69 70 71 72
    else
        ln -sf "$1" "$2"
        [ "$?" != 0 ] && print_error "failed to link file $1 to $2" || return 0
    fi
    return 1
}
73
export -f try_force_link_file
74

75
check_symlink () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
76 77
    CHK_SYMLINK_FILE="`file "$1"`"
    if [[ ! -z "`echo "$CHK_SYMLINK_FILE" | grep -v "broken" | grep "symbolic link to" | awk '{print $1}'`" ]] ; then
78
        return 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
79
    elif [[ ! -z "`echo "$CHK_SYMLINK_FILE" | grep "broken symbolic link to" | awk '{print $1}'`" ]] ; then
80 81
        print_error "remove broken symlink: $CHK_SYMLINK_FILE"
        rm -fr "$CHK_SYMLINK_FILE"
82 83 84 85 86
        return 1
    else
        return 1
    fi
}
87
export -f check_symlink
88

89
try_force_link_dir () {
90 91
    if [ ! -d "$1" ] ; then	print_info "directory $1 not found for link"
    elif [ -z "$2" ] ; then	print_error "no way to link directory $1"
92 93 94 95 96 97
    else
        ln -sf "$1" "$2"
        [ "$?" != 0 ] && print_error "failed to link directory $1 to $2" || return 0
    fi
    return 1
}
98
export -f try_force_link_dir
99

100 101 102
check_process () {
    [ ! -n "`ps cax | grep "$1" | awk '{print $1}'`" ] && return 0 || return 1 
}
103
export -f check_process
104

105
try_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
106
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
107
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
108 109
    wget -O "$2" --read-timeout 300 --retry-connrefused --timeout 15 --tries 2 \
    --user-agent="Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "${1}" 2>&1 | \
110
    tr '\r' '\n' | sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\/, \2\/s, ETA \3/; s/^20[0-9][0-9].*/#Done./' | \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
111
    zenity --progress --percentage=0 --title="Download ${PW_DOWNLOAD_FILE_NAME}" --text=Starting... --auto-close --width=500 --height=90
112
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
113 114
        print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from GitHub."
        print_info "Try download ${PW_DOWNLOAD_FILE_NAME} from FTP"
115
        try_remove_file "$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
116 117 118 119 120 121 122 123 124
        wget -O "$2" --read-timeout 300 --retry-connrefused --timeout 15 --tries 2 \
        --user-agent="Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" --ftp-user=anonymous "ftp://171.22.215.18/archives/${PW_DOWNLOAD_FILE_NAME}" 2>&1 | \
        tr '\r' '\n' | sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\/, \2\/s, ETA \3/; s/^20[0-9][0-9].*/#Done./' | \
        zenity --progress --percentage=0 --title="Download ${PW_DOWNLOAD_FILE_NAME}" --text=Starting... --auto-close --width=500 --height=90
        if [ "${PIPESTATUS[0]}" != 0 ] ; then
            print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from FTP."
            try_remove_file "$2"
            return 1   
        fi
125
    fi
126
    try_remove_file "${PORT_WINE_TMP_PATH}/download_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
127
    return 0
128 129
}

130 131
try_download_to_path () {
    set -o pipefail
132 133
    wget --directory-prefix="$2" --read-timeout 300 --retry-connrefused --timeout 15 --tries 3 \
    --user-agent="Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$1" 2>&1 | \
134
    tr '\r' '\n' | sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\/, \2\/s, ETA \3/; s/^20[0-9][0-9].*/#Done./' | \
135
    zenity --progress --percentage=0 --title="Download $(basename $1)" --text=Starting... --auto-close --width=500 --height=90
136
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
137
        print_error "Failed to download $1."
138 139 140 141
        return 1 
    else 
        return 0
    fi
142 143
}

144
try_download_silent () {
145 146
    wget -O "$2" --read-timeout 300 --retry-connrefused --timeout 15 --tries 3 \
    --user-agent="Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$1"
147
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
148
        print_error "Failed to download $1. Skipping."
149 150 151 152 153
        try_remove_file "$2"
        return 1 
    else 
        return 0
    fi
154 155 156 157 158 159
}

create_new_dir () {
    if [ ! -d "$1" ] ; then
        mkdir -p "$1"
    fi
160
    return 0
161 162 163 164 165 166 167
}

var_winedlloverride_update () {
    if [ ! -z "${WINEDLLOVERRIDES}" ]
    then export WINEDLLOVERRIDES="${1};${WINEDLLOVERRIDES}"
    else export WINEDLLOVERRIDES="${1}"
    fi
168
    return 0
169 170 171 172 173 174 175
}

var_vkd3d_config_update () {
    if [ ! -z "${VKD3D_CONFIG}" ]
    then export VKD3D_CONFIG="${1};${VKD3D_CONFIG}"
    else export VKD3D_CONFIG="${1}"
    fi
176
    return 0
177 178
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
179 180 181 182 183 184 185 186 187
var_radv_perftest_config_update () {
    if [ ! -z "${RADV_PERFTEST}" ]
    then export RADV_PERFTEST="${1};${RADV_PERFTEST}"
    else export RADV_PERFTEST="${1}"
    fi
    return 0
}

var_vk_istance_layers_config_update () {
castro-fidel's avatar
castro-fidel committed
188 189 190
    if [ ! -z "${PW_VK_INSTANCE_LAYERS}" ]
    then export PW_VK_INSTANCE_LAYERS="${1}:${PW_VK_INSTANCE_LAYERS}"
    else export PW_VK_INSTANCE_LAYERS="${1}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
191 192 193 194
    fi
    return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
195 196
unpack_tar_zst () {
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
197 198
    unset PW_ZSTD_PORT
    if  [[ `which zstd` ]] &>/dev/null ; then
199
        tar -I zstd -xhvf "$1" -C "$2" | sszen
Mikhail Tergoev's avatar
Mikhail Tergoev committed
200 201
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    else
202
        env LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_WINELIB}/portable/lib/lib64:${PW_WINELIB}/portable/lib/lib" tar -I "${PW_WINELIB}/portable/bin/zstd" -xhvf "$1" -C "$2" | sszen
Mikhail Tergoev's avatar
Mikhail Tergoev committed
203 204
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
205 206
}

207 208
unpack_tar_xz () {
    set -o pipefail
209
    tar -Jxhvf "$1" -C "$2" | sszen
Mikhail Tergoev's avatar
Mikhail Tergoev committed
210
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
211 212 213 214
}

unpack_tar_gz () {
    set -o pipefail
215
    tar -xhzvf "$1" -C "$2" | sszen
Mikhail Tergoev's avatar
Mikhail Tergoev committed
216
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
217 218
}

219 220
unpack_tar () {
    set -o pipefail
221
    tar -xhvf "$1" -C "$2" | sszen
Mikhail Tergoev's avatar
Mikhail Tergoev committed
222
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
223 224
}

castro-fidel's avatar
castro-fidel committed
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
pw_clear_pfx () {
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/userdef.reg"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.update-timestamp"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/.windows-serial"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/windows/"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/Setup"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/Windows"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/WindowsTask"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/Package Cache"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Local Settings/Application Data/Microsoft"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Local Settings/Application Data/Temp"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Local Settings/Temporary Internet Files"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Application Data/Microsoft"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Application Data/wine_gecko"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/Public/Temp"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Local Settings/Application Data/Microsoft"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Local Settings/Application Data/Temp"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Local Settings/Temporary Internet Files"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Application Data/Microsoft"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Application Data/wine_gecko"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/Temp"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files/Internet Explorer"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files/Windows Media Player"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files/Windows NT"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files/Common Files"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files (x86)/Internet Explorer"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files (x86)/Common Files"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files (x86)/Windows Media Player"
    try_remove_dir "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/Program Files (x86)/Windows NT"
257 258
    rm -f "${PORT_WINE_TMP_PATH}"/*.bin
    rm -f "${PORT_WINE_TMP_PATH}"/*.foz
259
    return 0
260 261
}

castro-fidel's avatar
castro-fidel committed
262 263 264 265 266 267 268 269 270 271 272 273 274
pw_reinstall_pp () {
    if [[ "${PW_REINSTALL_FROM_TERMINAL}" == 1 ]] ; then
        read -p "Do you want to reinstall PortProton? (Y,y - Yes):   " -n 1 -r
        if [[ ! $REPLY =~ ^[Yy]$ ]]
        then
            echo
            exit 1
        fi
    elif ! gui_question "${port_reinstall}" 
    then exit 1
    fi
    pw_clear_pfx
    try_remove_dir "${PORT_WINE_PATH}/data/dist"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
275
    try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
castro-fidel's avatar
castro-fidel committed
276 277 278 279 280 281 282 283 284
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    try_remove_file "${PORT_WINE_PATH}/data/user.conf"
    echo 1000 > "${PORT_WINE_TMP_PATH}/scripts_ver"
    echo
    echo "Restarting PP for reinstall files..."
    /usr/bin/env bash -c ${pw_full_command_line[*]} &
    exit 0
}

285 286
check_user_conf () {
    if [ ! -f "${USER_CONF}" ]; then
287
        echo "#!/usr/bin/env bash" > "${USER_CONF}"
288 289 290
        echo "# User overides db and var settings..." >> "${USER_CONF}"
        chmod u+x "${USER_CONF}"
    fi
291
    return 0
292 293 294
}

init_wine_ver () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
295 296 297 298 299 300 301 302 303 304 305
    if [[ -d "${PORT_WINE_PATH}/data/dist" ]] ; then
        orig_IFS="$IFS"
        IFS=$'\n'
        for dist_dir in $(ls -1 "${PORT_WINE_PATH}/data/dist/") ; do
            dist_dir_new=`echo "${dist_dir}" | awk '$1=$1' | sed -e s/[[:blank:]]/_/g`
            if [[ ! -d "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}" ]] ; then
                mv -- "${PORT_WINE_PATH}/data/dist/$dist_dir" "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}"
            fi
        done
        IFS="$orig_IFS"
    fi
castro-fidel's avatar
castro-fidel committed
306 307 308
    if [[ -z `ls "${PORT_WINE_PATH}/data/dist/" | grep "${PW_WINE_USE}"` ]] ; then
        if [[ ! -z `echo "${PW_WINE_USE}" | grep "PROTON_LG"` ]] ; then
            export PW_WINE_USE=PROTON_LG
309
        else
castro-fidel's avatar
castro-fidel committed
310
            export PW_WINE_USE=PROTON_GE
311 312
        fi
    fi
castro-fidel's avatar
castro-fidel committed
313 314 315 316
    if [[ ! -z `echo "${PW_WINE_USE}" | grep "^PROTON_LG$"` ]] 
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
    elif [[ ! -z `echo "${PW_WINE_USE}" | grep "^PROTON_GE$"` ]]
    then export PW_WINE_USE="${PW_PROTON_GE_VER}"
317
    fi
castro-fidel's avatar
castro-fidel committed
318 319 320 321
    [ ! -z "${PW_WINE_VER}" ] && export PW_WINE_USE=`echo "${PW_WINE_VER}" | tr [[:lower:]] [[:upper:]]`
    [ ! -z "${PW_WINE_USE}" ] && export PW_WINE_USE=`echo "${PW_WINE_USE}" | tr [[:lower:]] [[:upper:]]`
    unset PW_WINE_VER
    export WINEDIR="${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}"
322 323 324
    export WINE="${WINEDIR}/bin/wine"
    export WINELOADER="${WINEDIR}/bin/wine"
    export WINESERVER="${WINEDIR}/bin/wineserver"
castro-fidel's avatar
castro-fidel committed
325 326 327 328

    export WINEDLLPATH="${WINEDIR}/lib64/wine:${WINEDIR}/lib/wine"
    if [[ ! -z "${PATH_TO_GAME}" ]] ; then
        export WINEDLLPATH+=":${PATH_TO_GAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
329
    fi
330

331
    if [[ -d "${WINEDIR}/files" && ! -d "${WINEDIR}/dist" ]] ; then
332 333 334 335 336
        for clear_dist_files in `ls "${WINEDIR}" | sed -e "s/^files$//g" | sed -e "s/^version$//g"` ; do 
            rm -fr "${WINEDIR}/$clear_dist_files"
        done
        mv -f "${WINEDIR}/files"/* "${WINEDIR}/"
        rm -fr "${WINEDIR}/files"
337 338 339 340 341 342
    elif [[ ! -d "${WINEDIR}/files" && -d "${WINEDIR}/dist" ]] ; then
        for clear_dist_files in `ls "${WINEDIR}" | sed -e "s/^dist$//g" | sed -e "s/^version$//g"` ; do 
            rm -fr "${WINEDIR}/$clear_dist_files"
        done
        mv -f "${WINEDIR}/dist"/* "${WINEDIR}/"
        rm -fr "${WINEDIR}/dist"
343 344 345 346 347 348
    elif [ -f "${WINEDIR}/proton_dist.tar" ] ; then
        unpack_tar "${WINEDIR}/proton_dist.tar" "${WINEDIR}/"
        for clear_dist_files in `ls "${WINEDIR}" | sed -e "s/^bin$//g" | sed -e "s/^lib$//g" | sed -e "s/^lib64$//g" | sed -e "s/^share$//g" | sed -e "s/^version$//g"` ; do 
            rm -fr "${WINEDIR}/$clear_dist_files"
        done
    fi
349
    if [[ -d "${WINEDIR}" ]] ; then
castro-fidel's avatar
castro-fidel committed
350
        [[ ! -f "${WINEDIR}/version" ]] && echo "${PW_WINE_USE}" > "${WINEDIR}/version"
351

castro-fidel's avatar
castro-fidel committed
352 353 354 355 356
        # if [[ -d "${WINEDIR}/lib32/" ]] ; then
        #     mv -f "${WINEDIR}/lib" "${WINEDIR}/lib64"
        #     mv -f "${WINEDIR}/lib32" "${WINEDIR}/lib"
        # fi

357 358 359 360 361
        if [[ ! -d "${WINEDIR}/lib64/" && -d "${WINEDIR}/lib/wine/x86_64-unix" ]] ; then
            create_new_dir "${WINEDIR}/lib64/wine"
            mv -f "${WINEDIR}/lib/wine/x86_64-unix" "${WINEDIR}/lib64/wine/"
            mv -f "${WINEDIR}/lib/wine/x86_64-windows" "${WINEDIR}/lib64/wine/"
        fi
castro-fidel's avatar
castro-fidel committed
362

Mikhail Tergoev's avatar
Mikhail Tergoev committed
363 364 365
        try_remove_file "${WINEDIR}/lib/libsteam_api.so"
        try_remove_file "${WINEDIR}/lib64/libsteam_api.so"
        
366
        for mono_gecko_chk in "mono" "gecko" ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
367 368 369
            if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then
                echo "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK."
            elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
370
                try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}" | sszen
371 372
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine/
Mikhail Tergoev's avatar
Mikhail Tergoev committed
373 374 375 376 377
                echo "Copy ${WINEDIR}/share/wine/${mono_gecko_chk} to tmp and create symlink to ${WINEDIR}/share/wine/. OK."
            else
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine
                echo "${WINEDIR}/share/wine/${mono_gecko_chk} is broken symlink. Repair... OK."
378 379
            fi
        done
castro-fidel's avatar
castro-fidel committed
380

Mikhail Tergoev's avatar
Mikhail Tergoev committed
381
        grep 'Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' "${WINEDIR}/share/wine/wine.inf" &> /dev/null
castro-fidel's avatar
castro-fidel committed
382 383 384
        if [[ "$?" != "0" ]] ; then
            echo 'HKLM,Software\NVIDIA Corporation\Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
            echo 'HKLM,System\ControlSet001\Services\nvlddmkm,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
castro-fidel's avatar
castro-fidel committed
385 386
            sed -i '/Steam.exe/d' "${WINEDIR}/share/wine/wine.inf"
            sed -i '/\\Valve\\Steam/d' "${WINEDIR}/share/wine/wine.inf"
castro-fidel's avatar
castro-fidel committed
387
        fi
388
    fi
389
    return 0
390 391
}

castro-fidel's avatar
castro-fidel committed
392
pw_init_runtime () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
393

Mikhail Tergoev's avatar
Mikhail Tergoev committed
394
    if [[ -n "$(grep "ROSA Fresh" "/etc/os-release")" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
395
        export LOCPATH="/run/host/usr/share/locale/"
castro-fidel's avatar
castro-fidel committed
396 397
    elif [[ -n "$(grep "altlinux" "/etc/os-release")" ]] ; then
        export LIBGL_DRIVERS_PATH="/usr/lib/X11/modules/dri:/usr/lib64/X11/modules/dri"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
398
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
399

castro-fidel's avatar
castro-fidel committed
400 401
    PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib" 
    export PW_LD_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib:${PW_WINELIB}/portable/lib/lib64:${PW_WINELIB}/portable/lib/lib32:${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:${PW_PV_OVERRIDES}/i386-linux-gnu/aliases"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
402

castro-fidel's avatar
castro-fidel committed
403
    export PW_VK_LAYER_PATH="${PW_WINELIB}/portable/share/vulkan/implicit_layer.d"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
404

Mikhail Tergoev's avatar
Mikhail Tergoev committed
405 406 407 408 409
    if [ ! -z ${PATH_TMP} ]
    then export PATH="${PATH_TMP}"
    else export PATH_TMP="${PATH}"
    fi
    if [ ! -z "${PATH}" ]
castro-fidel's avatar
castro-fidel committed
410 411 412 413 414
    then export PATH="${WINEDIR}/bin:${PATH}:${PW_WINELIB}/portable/bin"
    else export PATH="${WINEDIR}/bin:${PW_WINELIB}/portable/bin"
    fi

    if [ "${PW_USE_GSTREAMER}" = 1 ] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
415 416
        if [ -d "${WINEDIR}/lib64/gstreamer-1.0" ] ; then
            export GST_PLUGIN_SYSTEM_PATH_1_0="${WINEDIR}/lib64/gstreamer-1.0:${WINEDIR}/lib/gstreamer-1.0"
castro-fidel's avatar
castro-fidel committed
417 418
        elif [ -d "${PW_WINELIB}/portable/lib/lib64/gstreamer-1.0" ] ; then
            export GST_PLUGIN_SYSTEM_PATH_1_0="${PW_WINELIB}/portable/lib/lib64/gstreamer-1.0:${PW_WINELIB}/portable/lib/lib32/gstreamer-1.0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
419 420 421 422 423 424 425 426 427 428
        fi
        export WINE_GST_REGISTRY_DIR="${PORT_WINE_TMP_PATH}"
        export MEDIACONV_AUDIO_DUMP_FILE="${PORT_WINE_TMP_PATH}"/audio.foz
        export MEDIACONV_AUDIO_TRANSCODED_FILE="${PORT_WINE_TMP_PATH}"/transcoded_audio.foz
        export MEDIACONV_VIDEO_DUMP_FILE="${PORT_WINE_TMP_PATH}"/video.foz
        export MEDIACONV_VIDEO_TRANSCODED_FILE="${PORT_WINE_TMP_PATH}"/transcoded_video.foz
    else
        var_winedlloverride_update "winegstreamer="
    fi

castro-fidel's avatar
castro-fidel committed
429 430
    if [[ ! -z "${PW_SANDBOX_HOME_PATH}" && -d "${PW_SANDBOX_HOME_PATH}" ]] ; then
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
431
        --unshare-home \
castro-fidel's avatar
castro-fidel committed
432 433
        --home="${PW_SANDBOX_HOME_PATH}" \
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
434
    else
castro-fidel's avatar
castro-fidel committed
435
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
436
        --share-home \
castro-fidel's avatar
castro-fidel committed
437
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
438
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
439

Mikhail Tergoev's avatar
Mikhail Tergoev committed
440
    export PRESSURE_VESSEL_IMPORT_VULKAN_LAYERS=0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
441
    # export PRESSURE_VESSEL_GRAPHICS_PROVIDER="/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
442 443

    unset PRESSURE_VESSEL_RUNTIME_ARCHIVE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
444 445
    export PRESSURE_VESSEL_COPY_RUNTIME=1
    export PRESSURE_VESSEL_GC_LEGACY_RUNTIMES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
446
    export PRESSURE_VESSEL_RUNTIME=runtime
castro-fidel's avatar
castro-fidel committed
447 448 449
    export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}"
    export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var"
    export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
450 451

    unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW
castro-fidel's avatar
castro-fidel committed
452
    for PWRTMRO in ${PW_RT_MOUNT_RO[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
453 454 455 456 457
        if [ ! -z "${PRESSURE_VESSEL_FILESYSTEMS_RO}" ]
        then export PRESSURE_VESSEL_FILESYSTEMS_RO="${PRESSURE_VESSEL_FILESYSTEMS_RO}:${PWRTMRO}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RO="${PWRTMRO}"
        fi
    done
castro-fidel's avatar
castro-fidel committed
458
    for PWRTMRW in ${PW_RT_MOUNT_RW[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
459 460 461 462 463 464
        if [ ! -z "${PRESSURE_VESSEL_FILESYSTEMS_RW}" ]
        then export PRESSURE_VESSEL_FILESYSTEMS_RW="${PRESSURE_VESSEL_FILESYSTEMS_RW}:${PWRTMRW}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RW="${PWRTMRW}"
        fi
    done
    echo "RUNTIME is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
465 466
}

castro-fidel's avatar
castro-fidel committed
467
pw_mangohud_check () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
468
    if [[ "${PW_MANGOHUD}" == "1" ]] || [[ "${PW_MANGOHUD_x32}" = "1" ]]; then
castro-fidel's avatar
castro-fidel committed
469
        export PW_MANGOHUD_SLR='MANGOHUD=1'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
470
        MANGOHUD_LIB_NAME="libMangoHud.so"
castro-fidel's avatar
castro-fidel committed
471
        if [[ "${PW_VULKAN_USE}" = "0" ]] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
472 473
	        MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:${MANGOHUD_LIB_NAME}"
        fi
castro-fidel's avatar
castro-fidel committed
474 475 476
        if [[ ! -z "${PW_LD_PRELOAD}" ]]
        then export PW_LD_PRELOAD="${PW_LD_PRELOAD}:${MANGOHUD_LIB_NAME}"
        else export PW_LD_PRELOAD="${MANGOHUD_LIB_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
477
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
478 479 480 481
        var_vk_istance_layers_config_update "VK_LAYER_MANGOHUD_overlay64"
        if [[ "${PW_MANGOHUD_x32}" = "1" ]] ; then 
            var_vk_istance_layers_config_update "VK_LAYER_MANGOHUD_overlay32"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
482 483
        print_info "MANGOHUD is enabled"
    else
castro-fidel's avatar
castro-fidel committed
484
        export PW_MANGOHUD_SLR='DISABLE_MANGOHUD=1'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
485 486 487 488 489
        print_info "MANGOHUD is disabled"
    fi
    return 0
}

castro-fidel's avatar
castro-fidel committed
490 491 492 493
pw_vkbasalt_check () {
    if [[ "${ENABLE_VKBASALT}" == 1 ]] && [[ "${PW_VULKAN_USE}" != "0" ]] && [[ "${PW_VULKAN_USE}" != "3" ]] ; then
        if [[ -z "${PW_VKBASALT_EFFECTS}" ]] ; then
            export PW_VKBASALT_EFFECTS="Curves:cas" 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
494
        fi
castro-fidel's avatar
castro-fidel committed
495 496 497
        sed -ri "s/effects = .*/effects = ${PW_VKBASALT_EFFECTS}/g" "${PORT_WINE_PATH}/data/vkBasalt.conf"
        if [[ -z "${PW_VKBASALT_FFX_CAS}" ]] ; then
            export PW_VKBASALT_FFX_CAS="0.7" 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
498
        fi
castro-fidel's avatar
castro-fidel committed
499
        sed -ri "s/casSharpness .*/casSharpness = ${PW_VKBASALT_FFX_CAS}/g" "${PORT_WINE_PATH}/data/vkBasalt.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
500
        export VKBASALT_CONFIG_FILE="${PORT_WINE_PATH}/data/vkBasalt.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
501
        var_vk_istance_layers_config_update "VK_LAYER_VKBASALT_post_processing64:VK_LAYER_VKBASALT_post_processing32"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
502 503 504 505 506 507 508 509 510
        print_info "vkBasalt is enabled"
    else
        export DISABLE_VKBASALT=1
        print_info "vkBasalt is disabled"
    fi
    return 0
}

check_nvidia_vk_icd_file () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
511 512 513 514 515 516 517
    if [[ -f "/usr/share/vulkan/icd.d/nvidia_icd.json" ]] ; then
        export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"
    elif [[ -f "/etc/vulkan/icd.d/nvidia_icd.json" ]] ; then
        export VK_ICD_FILENAMES="/etc/vulkan/icd.d/nvidia_icd.json"
    fi
}

518
regdlloverrides () {
castro-fidel's avatar
castro-fidel committed
519 520 521 522 523 524 525 526 527
    PW_DLL_EXE=`echo $@ | awk -F: '{print $1}'`
    PW_DLL_LIB=`echo $@ | awk -F: '{print $2}' | awk -F= '{print $1}'`
    PW_DLL_SET=`echo $@ | awk -F= '{print $NF}'`
    case "${PW_DLL_SET}" in
        "n,b") PW_DLL_IN_REG="native,builtin" ;;
        "b,n") PW_DLL_IN_REG="builtin,native" ;;
            "n") PW_DLL_IN_REG="native" ;;
            "b") PW_DLL_IN_REG="builtin" ;;
            *) PW_DLL_IN_REG="" ;;
528
    esac
castro-fidel's avatar
castro-fidel committed
529
    grep 'HKCU,Software\\Wine\\AppDefaults\\'"${PW_DLL_EXE}"'\\DllOverrides,'\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\" "${WINEDIR}/share/wine/wine.inf"
530
    if [[ "$?" != "0" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
531 532
        grep "ProtonOverrides" "${WINEDIR}/share/wine/wine.inf"
        if [[ "$?" == "0" ]] ; then
castro-fidel's avatar
castro-fidel committed
533
            sed -i "/\[ProtonOverrides\]/a HKCU,Software\\\Wine\\\AppDefaults\\\\${PW_DLL_EXE}\\\DllOverrides,\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\"" "${WINEDIR}/share/wine/wine.inf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
534
        else
castro-fidel's avatar
castro-fidel committed
535
            sed -i "/\[SteamClient.ntamd64\]/a HKCU,Software\\\Wine\\\AppDefaults\\\\${PW_DLL_EXE}\\\DllOverrides,\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\"" "${WINEDIR}/share/wine/wine.inf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
536
        fi
537 538 539
    fi
}

540 541 542 543
wait_wineserver () {
    while [ ! -z "$(ls -l /proc/*/exe 2>/dev/null | grep -ie ${portname} | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')" ] ; do
        sleep 1
    done
544
    return 0
545
}
546
export -f wait_wineserver
547 548

kill_portwine () {
549
    wine_pids="`ls -l /proc/*/exe 2>/dev/null | grep -ie ${portname} | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}'`"
550
    if  [ ! -z "${wine_pids}" ] ; then
castro-fidel's avatar
castro-fidel committed
551 552 553
        for pw_kill_pids in ${wine_pids} ; do
            if [ "`ps cax | grep ${pw_kill_pids}`" ] ; then
                kill -n 9 ${pw_kill_pids} > /dev/null 2>&1  
554 555 556
            fi
        done
    fi
557 558
    bwrap_pids="`pgrep -a wrap | grep ${portname} | head -n 1 | awk '{print $1}'`"
    if  [ ! -z "${bwrap_pids}" ] ; then
castro-fidel's avatar
castro-fidel committed
559 560 561
        for pw_kill_pids in ${bwrap_pids} ; do
            if [ "`ps cax | grep ${pw_kill_pids}`" ] ; then
                kill -n 9 ${pw_kill_pids} > /dev/null 2>&1
562 563
            fi
        done
564
    fi
565
    return 0
566 567 568
}
export -f kill_portwine

castro-fidel's avatar
castro-fidel committed
569
pw_kill_autostart () {
castro-fidel's avatar
castro-fidel committed
570 571 572 573
    if [[ -z "${2}" ]]
    then SWAIT=5
    else SWAIT="${2}"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
574 575 576 577 578
    sleep 5
    
    while true ; do
        if  [[ -z "`ps aux | grep -m 1 "$1" | grep -v grep | awk '{print $2}'`" ]] && [[ ! -z "`ps aux | grep wrap | grep -v grep | grep -i ${portname} | head -n 1`" ]] ; then
            echo -e "PID "$1" not found"
castro-fidel's avatar
castro-fidel committed
579
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
580
        else
castro-fidel's avatar
castro-fidel committed
581
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
582 583 584 585 586
            kill_portwine 
            break
        fi
    done

castro-fidel's avatar
castro-fidel committed
587 588
    if [[ ! -z "`ls "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/ | grep -m 1 ".tmp"`" ]] ; then
        rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/*.tmp
589
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
590

591
    return 0
592
}
castro-fidel's avatar
castro-fidel committed
593
export -f pw_kill_autostart
594

595
stop_portwine () { 
596 597 598
    if [ "$int_xneur" = "1"  ]; then
        xneur &
    fi
castro-fidel's avatar
castro-fidel committed
599 600
    if [ ! -z ${PW_XKBD} ]; then
        setxkbmap ${PW_XKBD}
601
    fi
castro-fidel's avatar
castro-fidel committed
602
    pw_stop_progress_bar
603 604
    try_remove_file "${PORT_SCRIPTS_PATH}/0"
    try_remove_file "${PORT_SCRIPTS_PATH}/1"
605
    kill_portwine &&
castro-fidel's avatar
castro-fidel committed
606 607
    try_remove_dir "${PW_WINELIB}/var"
    find "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/" -maxdepth 1 -type f -name "*.tmp" -delete
608
    if [ ! -z "`pgrep -a yad_new | grep "\-\-notification" | awk '{print $1}'`" ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
609
        kill -s SIGUSR1 "`pgrep -a yad_new | grep "\-\-notification" | awk '{print $1}'`" 2>/dev/null
610
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
611
    add_in_stop_portwine #&>/dev/null
612
    kill -n 9 `pgrep -a start.sh | grep -i '/PortProton/' | awk '{print $1}'` > /dev/null 2>&1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
613
    killall yad_new &>/dev/null
614
    exit 0
615
}
616
export -f stop_portwine
617

castro-fidel's avatar
castro-fidel committed
618 619 620
pw_download_libs () {
    if [ ! -z "`ls ${PORT_WINE_TMP_PATH} | grep libs_v | grep -v libs${PW_LIBS_VER}`" ] ; then
        for RM_LIBS in `ls ${PORT_WINE_TMP_PATH} | grep libs_v | grep -v libs${PW_LIBS_VER}`
621 622
        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_LIBS}"
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
623
        pw_clear_pfx
624
    fi
castro-fidel's avatar
castro-fidel committed
625 626
    if [[ ! -e "${PW_WINELIB}/portable/bin/yad" || ! -e "${PW_WINELIB}/portable/lib/p7zip/7z" \
    || ! -e "${PW_WINELIB}/runtime/files/bin/vkcube" || -e "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" ]] ;
627
    then
628
        print_info "Download and install libraries..."
castro-fidel's avatar
castro-fidel committed
629 630 631
        if try_download "github.com/Castro-Fidel/PortWINE/releases/download/libs${PW_LIBS_VER}/libs${PW_LIBS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" ; then
            if unpack_tar_xz "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/" ; then
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
632
            else
castro-fidel's avatar
castro-fidel committed
633 634 635
                try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
                zenity_error_download && pw_download_libs
636 637
            fi
        else
castro-fidel's avatar
castro-fidel committed
638
            zenity_error_download && pw_download_libs
639 640
        fi
    fi
castro-fidel's avatar
castro-fidel committed
641 642 643 644
    export pw_yad="${PW_WINELIB}/portable/bin/yad"
    export pw_yad_new="${PW_WINELIB}/portable/bin/yad_new"
    export pw_zstd="${PW_WINELIB}/portable/bin/zstd"
    export pw_7z="${PW_WINELIB}/portable/lib/p7zip/7z"
645 646
    if [ -x "`which xterm 2>/dev/null`" ]; then
        export SYS_XTERM=`which xterm`
castro-fidel's avatar
castro-fidel committed
647
        export PW_XTERM="${SYS_XTERM} -geometry 159x37 -e"
648
    else
castro-fidel's avatar
castro-fidel committed
649
        export PW_XTERM="${PW_WINELIB}/runtime/files/bin/xterm -geometry 159x37 -e"
650
    fi
651
    return 0
652 653
}

castro-fidel's avatar
castro-fidel committed
654
pw_check_and_download_wine () {
655
    [ ! -d "${PORT_WINE_PATH}/data/dist/" ] && create_new_dir "${PORT_WINE_PATH}/data/dist"
castro-fidel's avatar
castro-fidel committed
656
    if [[ "${PW_WINE_USE}" == "GET-OTHER-WINE" ]] ; then
657 658
        gui_proton_downloader
    fi
castro-fidel's avatar
castro-fidel committed
659 660 661 662 663 664 665 666 667 668 669 670
    if [[ ! -z `echo "${PW_WINE_USE}" | grep "^PROTON_LG$"` ]] 
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
    elif [[ ! -z `echo "${PW_WINE_USE}" | grep "^PROTON_GE$"` ]]
    then export PW_WINE_USE="${PW_PROTON_GE_VER}"
    fi
    if [ ! -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ] ; then
        print_info "Download and install ${PW_WINE_USE}..."
        if try_download "github.com/Castro-Fidel/wine_builds/releases/download/${PW_WINE_USE}/${PW_WINE_USE}.tar.xz" "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}.tar.xz" ; then
            if unpack_tar_xz "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}.tar.xz" "${PORT_WINE_PATH}/data/dist/" ; then
                echo "${PW_WINE_USE}" > "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}/version"
                try_remove_file "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}.tar.xz"
                try_remove_dir "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}"
671
            else
castro-fidel's avatar
castro-fidel committed
672 673 674
                try_remove_file "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}.tar.xz"
                try_remove_dir "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}"
                try_remove_dir "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}"
675

castro-fidel's avatar
castro-fidel committed
676
                zenity_error_download && pw_check_and_download_wine
677 678
            fi
        else
castro-fidel's avatar
castro-fidel committed
679
            zenity_error_download && pw_check_and_download_wine
680 681
        fi
    fi
682
    return 0
683 684
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
685 686 687 688 689
pw_check_and_download_dxvk_and_vkd3d () {
    #Download stable and git version DXVK
    for DXVK_VAR_VER in "${DXVK_STABLE_VER}" "${DXVK_GIT_VER}" ; do
        if [ ! -d "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}" ] ; then
            print_info "Download and install DXVK v.${DXVK_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
690 691 692 693 694 695 696 697 698 699
            if try_download "https://github.com/Castro-Fidel/vulkan/releases/download/dxvk-${DXVK_VAR_VER}/dxvk-${DXVK_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz" ; then
                if unpack_tar_xz "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
                    try_remove_file "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz"
                else
                    try_remove_file "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz"
                    try_remove_dir dxvk-${DXVK_VAR_VER}

                    zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
                fi
            elif try_download "https://github.com/doitsujin/dxvk/releases/download/v${DXVK_VAR_VER}/dxvk-${DXVK_VAR_VER}.tar.gz" "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
700 701 702 703 704 705 706 707 708 709 710 711 712 713
                if unpack_tar_gz "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz" "${PW_VULKAN_DIR}" ; then
                    try_remove_file "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz"
                else
                    try_remove_file "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz"
                    try_remove_dir dxvk-${DXVK_VAR_VER}

                    zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
                fi
            else
                zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
            fi
        fi
    done

Mikhail Tergoev's avatar
Mikhail Tergoev committed
714
    #Download stable and git version VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
715 716 717
    for VKD3D_VAR_VER in "${VKD3D_STABLE_VER}" "${VKD3D_GIT_VER}" ; do
        if [ ! -d "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}" ] ; then
            print_info "Download and install VKD3D-PROTON v.${VKD3D_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
718 719 720 721 722 723 724 725 726 727
            if try_download "https://github.com/Castro-Fidel/vulkan/releases/download/vkd3d-proton-${VKD3D_VAR_VER}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz" ; then
                if unpack_tar_xz "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
                    try_remove_file "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz"
                else
                    try_remove_file "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz"
                    try_remove_dir vkd3d-proton-${VKD3D_VAR_VER}

                    zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
                fi
            elif try_download "https://github.com/HansKristian-Work/vkd3d-proton/releases/download/v${VKD3D_VAR_VER}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst" "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
                if unpack_tar_zst "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst" "${PW_VULKAN_DIR}" ; then
                    try_remove_file "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst"
                else
                    try_remove_file "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst"
                    try_remove_dir vkd3d-proton-${VKD3D_VAR_VER}

                    zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
                fi
            else
                zenity_error_download && pw_check_and_download_dxvk_and_vkd3d
            fi
        fi
    done
    return 0
}

castro-fidel's avatar
castro-fidel committed
744 745 746
pw_check_and_download_plugins () {
    if [ ! -z "`ls ${PORT_WINE_TMP_PATH} | grep plugins_v | grep -v plugins${PW_PLUGINS_VER}`" ] ; then
        for RM_PLUGINS in `ls ${PORT_WINE_TMP_PATH} | grep plugins_v | grep -v plugins${PW_PLUGINS_VER}`
747 748 749
        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
        done
    fi
castro-fidel's avatar
castro-fidel committed
750
    if [[ ! -d "${PW_PLUGINS_PATH}/BattlEye_Runtime" || ! -d "${PW_PLUGINS_PATH}/fake_dlss" \
castro-fidel's avatar
castro-fidel committed
751
    || ! -d "${PW_PLUGINS_PATH}/nvapi" || ! -d "${PW_PLUGINS_PATH}/nvml" ]]
752
    then
castro-fidel's avatar
castro-fidel committed
753 754 755 756
        print_info "Download and install plugins${PW_PLUGINS_VER}..."
        if try_download "github.com/Castro-Fidel/wine_builds/releases/download/plugins${PW_PLUGINS_VER}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" ; then
            if unpack_tar_xz "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}" ; then
                try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" 
757
            else
castro-fidel's avatar
castro-fidel committed
758 759
                try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz"
                try_remove_dir "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
760

castro-fidel's avatar
castro-fidel committed
761
                zenity_error_download && pw_check_and_download_wine
762 763
            fi
        else
castro-fidel's avatar
castro-fidel committed
764
            zenity_error_download && pw_check_and_download_wine
765 766
        fi
    fi
767
    return 0
768 769
}

castro-fidel's avatar
castro-fidel committed
770
pw_init_db () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
771
    if [[ ! -z "${portwine_exe}" ]] ; then
772
        export PORTWINE_DB=`echo "${portwine_exe}" | awk -F '/' 'NF>1{print $NF}' | sed s/".exe"/""/gi`
Mikhail Tergoev's avatar
Mikhail Tergoev committed
773
        if [[ -f "${portwine_exe}".ppdb ]] && [[ "${PORTWINE_DB}" != "RiotClientServices" ]] ; then
774
            export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
775
            # sed -i 's/ PP_/ PW_/g' "${PORTWINE_DB_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
776
            . "${PORTWINE_DB_FILE}"
castro-fidel's avatar
castro-fidel committed
777 778 779
            if [[ -z "`ls -p "${PORT_WINE_PATH}/prefixes/" | grep -e "^${PW_PREFIX_NAME}/"`" ]] ; then
                export PW_PREFIX_NAME=`echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}'`
                edit_db_from_gui PW_PREFIX_NAME
Mikhail Tergoev's avatar
Mikhail Tergoev committed
780
            fi
781 782 783
        else
            orig_IFS="$IFS"
            IFS=$'\n'
castro-fidel's avatar
castro-fidel committed
784 785
            PW_FIND_DB_FILE=`grep -ilw "#${PORTWINE_DB}.exe" "${PORT_SCRIPTS_PATH}/portwine_db"/* | sed s/".exe"/""/gi`
            if [[ `echo "$PW_FIND_DB_FILE" | wc -l` -gt 1 ]] ; then
786
                unset ADD_CB_DBFILE
castro-fidel's avatar
castro-fidel committed
787
                for PW_CHECK_DB_FILE in $PW_FIND_DB_FILE ; do
788
                    if [[ -z "${ADD_CB_DBFILE}" ]] ; then
castro-fidel's avatar
castro-fidel committed
789
                        export ADD_CB_DBFILE="${PW_CHECK_DB_FILE}"
790
                    else
castro-fidel's avatar
castro-fidel committed
791
                        export ADD_CB_DBFILE="${PW_CHECK_DB_FILE}!${ADD_CB_DBFILE}"
792 793
                    fi
                done
castro-fidel's avatar
castro-fidel committed
794 795
                PORTWINE_DB_FILE=`"${pw_yad_new}" --text-align=center --text "${PW_SELECTION_DB_LOC}" --borders=15 --form --center  \
                --title "Database file selection..." --window-icon="$PW_GUI_ICON_PATH/port_proton.png"  --form --separator="" \
796 797
                --field="DB FILE: :CB" "${ADD_CB_DBFILE}"`
                if [[ "$?" == "1" || "$?" == "252" ]] ; then exit 0 ; fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
798
                # sed -i 's/ PP_/ PW_/g' "${PORTWINE_DB_FILE}"
castro-fidel's avatar
castro-fidel committed
799 800
            elif [[ `echo "$PW_FIND_DB_FILE" | wc -l` -eq 1 ]] ; then
                PORTWINE_DB_FILE="${PW_FIND_DB_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
801
                # sed -i 's/ PP_/ PW_/g' "${PORTWINE_DB_FILE}"
802 803
            fi
            IFS="$orig_IFS"
castro-fidel's avatar
castro-fidel committed
804 805
            if [[ -f "${PW_FIND_DB_FILE}" ]] && [[ -z `grep "^export PW_DISABLED_CREATE_DB=1" "${PW_FIND_DB_FILE}"` ]] ; then
                try_copy_file "${PW_FIND_DB_FILE}" "${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
806
                export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
807 808 809 810
            fi
            if [[ ! -z `echo "${portwine_exe}" | grep "/data/prefixes/"` ]] && \
                [[ -z `echo "${portwine_exe}" | grep "/data/prefixes/DEFAULT/"` ]]
            then 
castro-fidel's avatar
castro-fidel committed
811 812
                export PW_PREFIX_NAME=`echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}'`
                edit_db_from_gui PW_PREFIX_NAME
813
            fi
814
        fi
815 816
        if [ ! -z "${PORTWINE_DB_FILE}" ]; then
            . "${PORTWINE_DB_FILE}"
817
            init_wine_ver &&
818
            print_info "Use ${PORTWINE_DB_FILE} db file."
819
        fi
820 821 822
        if [ -z "$PATH_TO_GAME" ] ; then
            export PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"
        fi
823
    fi
824
    return 0
825 826
}

castro-fidel's avatar
castro-fidel committed
827
pw_port_update () {
828
    ###SCRIPTS UPDATE###
829
    if [ ! -f "${PORT_WINE_TMP_PATH}/scripts_ver" ] ; then
830
        echo "2022" > "${PORT_WINE_TMP_PATH}/scripts_ver"
831 832
    fi
    export scripts_install_ver=`cat "${PORT_WINE_TMP_PATH}/scripts_ver" | head -n 1`
Mikhail Tergoev's avatar
Mikhail Tergoev committed
833
    print_info "Check update..."
834
    curl -s --list-only https://raw.githubusercontent.com/Castro-Fidel/PortWINE/master/data_from_portwine/scripts/var > "${PORT_WINE_TMP_PATH}/curent_var_ver"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
835
    [[ $? == 0 ]] && print_info "OK!" || print_info "ERROR!"
836 837 838 839 840 841 842
    [[ ! -f "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ]] && echo "1" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    read "scripts_update_not" < "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    if [[ "${scripts_update_not}" == "1" ]] ; then
        export scripts_current_ver=`cat "${PORT_WINE_TMP_PATH}/curent_var_ver" | grep SCRIPTS_NEXT_VERSION | awk -F "=" '{print $2}'`
        print_info "Scripts version in github = ${scripts_current_ver}"
        print_info "Scripts version local = ${scripts_install_ver}"
        if [[ ! -z "${scripts_current_ver}" ]] &&  [[ "${scripts_current_ver}" -gt "${scripts_install_ver}" ]] ; then
castro-fidel's avatar
castro-fidel committed
843 844 845
            if [[ -f "${PW_WINELIB}/portable/bin/yad_new" ]] ; then
                export pw_yad_new="${PW_WINELIB}/portable/bin/yad_new"
                curl -s --list-only "https://raw.githubusercontent.com/Castro-Fidel/PortWINE/master/data_from_portwine/${PW_CHANGELOG_FILE}" | tee "${PORT_WINE_TMP_PATH}/curent_var_ver" | sszen
846
                CHANGLOG_NEWS=`cat "${PORT_WINE_TMP_PATH}/curent_var_ver" | sed "/Scripts version ${scripts_install_ver}/,$ d" | sed '1,/---/ d' `
castro-fidel's avatar
castro-fidel committed
847
                xcsd=`"${pw_yad_new}" --title "${scripts_upd2} v.${scripts_current_ver}" --window-icon="$PW_GUI_ICON_PATH/port_proton.png" \
848 849 850 851 852 853 854
                --borders=5 --form --separator='%%%' --width=1000 --height=350 --center \
                --field=":TXT" "${CHANGLOG_NEWS}" \
                --field="   ${scripts_upd3} :CB" "${scripts_upd4}!${scripts_upd5}!${scripts_upd6}" `
                YAD_STATUS="$?"
                if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then exit 0 ; fi
                xcsd=`echo "${xcsd}" | awk -F'%%%' '{print $2}'`
            else
855
                xcsd=`zenity --title  "${scripts_upd1}" --text "${scripts_upd2}" --list --radiolist --height=240 --column="${inst_set}" --column "${scripts_upd3}" \
856 857 858
                TRUE "${scripts_upd4}" \
                FALSE "${scripts_upd5}" \
                FALSE "${scripts_upd6}"`
859 860 861 862 863 864
            fi
            case $xcsd in
                "${scripts_upd4}")
                    echo "######################################################"
                    print_info "Update scripts..."
                    try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
865
                    if try_download "github.com/Castro-Fidel/PortWINE/archive/refs/heads/master.tar.gz" "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
866 867 868 869 870 871
                        if unpack_tar_gz "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz" "${PORT_WINE_TMP_PATH}"
                        then
                            create_new_dir "${PORT_WINE_TMP_PATH}/scripts_backup"
                            cd "${PORT_WINE_PATH}/data/"
                            tar -czpf "${PORT_WINE_TMP_PATH}/scripts_backup/scripts_v.${scripts_install_ver}.tar.gz" ./scripts ./img \
                            ./changelog* ./dxvk.conf ./vkBasalt.conf ./tmp/scripts_ver
872 873 874 875
                            cp -fr "${PORT_WINE_TMP_PATH}/PortWINE-master/data_from_portwine/"* "${PORT_WINE_PATH}/data/"
                            try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
                            try_remove_dir "${PORT_WINE_TMP_PATH}/PortWINE-master/"
                            echo "${scripts_current_ver}" > "${PORT_WINE_TMP_PATH}/scripts_ver"
castro-fidel's avatar
castro-fidel committed
876
                            if [[ -z "${pw_yad_new}" ]] ; then
877
                                zenity --title="Changelog" --text-info --width=1200 --height=550 \
castro-fidel's avatar
castro-fidel committed
878 879 880
                                --filename="${PORT_WINE_PATH}/data/${PW_CHANGELOG_FILE}"
                            fi 
                            [ "$?" == 0 ] && echo "Restarting PP after update..." && /usr/bin/env bash -c ${pw_full_command_line[*]} &
881 882 883
                            exit 0
                        fi
                    else
castro-fidel's avatar
castro-fidel committed
884
                        zenity_error_download && pw_scripts_update
885 886 887 888
                    fi ;;
                "${scripts_upd5}")
                    echo " " ;;
                "${scripts_upd6}")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
889
                    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
890
            esac
891 892
        fi
    fi
893
    try_remove_file "${PORT_WINE_TMP_PATH}/curent_var_ver"
894
    return 0
895 896
}

897 898

update_winetricks () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
899
    W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
900 901 902 903 904 905 906 907 908 909
    W_TRX_EXT_VER="$(curl -s --list-only ${W_TRX_URL} | grep -i 'WINETRICKS_VERSION=' | sed 's/WINETRICKS_VERSION=//')"
    print_info "Version winetricks on server: ${W_TRX_EXT_VER}"
    W_TRX_INT_VER="$(cat "${PORT_WINE_TMP_PATH}/winetricks" | grep -i 'WINETRICKS_VERSION=' | sed 's/WINETRICKS_VERSION=//')"
    print_info "Version winetricks in port: ${W_TRX_INT_VER}"
    if [[ ! -f "${PORT_WINE_TMP_PATH}/winetricks" && ! -z "$W_TRX_EXT_VER" ]] || [[ "$W_TRX_INT_VER" != "$W_TRX_EXT_VER" && ! -z "$W_TRX_EXT_VER" ]]; then
        if try_download "${W_TRX_URL}" "${PORT_WINE_TMP_PATH}/winetricks_new" ; then
            mv -f "${PORT_WINE_TMP_PATH}/winetricks_new" "${PORT_WINE_TMP_PATH}/winetricks"
            W_TRX_INT_VER="$(cat "${PORT_WINE_TMP_PATH}/winetricks" | grep -i 'WINETRICKS_VERSION=' | sed 's/WINETRICKS_VERSION=//')" && print_info "Winetricks version in port has been updated (${W_TRX_INT_VER})" 
            chmod u+x "${PORT_WINE_TMP_PATH}/winetricks"
        fi
910
    fi
911 912 913
    if  [ -f "${PORT_WINE_TMP_PATH}/winetricks" ] ; then
        sed -i 's/w_metadata vcrun2015 dlls \\/w_metadata !dont_use_2015! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
        sed -i 's/w_metadata vcrun2017 dlls \\/w_metadata !dont_use_2017! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
914
        sed -i 's/w_metadata vcrun2019 dlls \\/w_metadata !dont_use_2019! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
915
    fi
916
    return 0
917 918 919
}

edit_db_from_gui () {
920
    echo "edit_db_from_gui PORTWINE_DB_FILE=$PORTWINE_DB_FILE"
921
    for mod_db in $@ ; do
922 923
        echo "${mod_db}=${!mod_db}"
        if [ -z "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}="`" ] ; then
924
            echo "export ${mod_db}=\"${!mod_db}\"" >> "${PORTWINE_DB_FILE}"
925
        elif [ "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}=" | grep -v "#"`" ] ; then
926 927
            if [ "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}=" | grep -v "#"`" != "export ${mod_db}=\"${!mod_db}\"" ] ; then
                sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/" "${PORTWINE_DB_FILE}"
928 929
            fi
        elif [ "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}="`" != "export ${mod_db}=${!mod_db}" ] ; then
930
            sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${PORTWINE_DB_FILE}"
931
        fi
932
    done
933
    return 0
934
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
935

castro-fidel's avatar
castro-fidel committed
936
pw_create_gui_png () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
937 938 939 940 941
    if [ ! -z "${PORTWINE_CREATE_SHORTCUT_NAME}" ] ; then
        export PORTPROTON_NAME="${PORTWINE_CREATE_SHORTCUT_NAME}"
    else
        export PORTPROTON_NAME="$(basename "${portwine_exe}" | sed s/".exe"/""/gi )"
    fi
castro-fidel's avatar
castro-fidel committed
942
    PW_RESIZE_TO=128
Mikhail Tergoev's avatar
Mikhail Tergoev committed
943
    try_remove_file "${PORT_WINE_PATH}/data/img/setup.png"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
944 945 946 947
    if [[ -x "`which wrestool 2>/dev/null`" ]] && [[ ! -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]] ; then
        try_remove_dir "${PORT_WINE_TMP_PATH}/tmp_img"
        create_new_dir "${PORT_WINE_TMP_PATH}/tmp_img"
        wrestool -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" -t14 "${portwine_exe}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
948
        cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".ico" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
castro-fidel's avatar
castro-fidel committed
949 950
        icotool -x --width=${PW_RESIZE_TO} --height=${PW_RESIZE_TO} --output="${PORT_WINE_TMP_PATH}/tmp_img/" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
        if [[ ! -f "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | grep "${PW_RESIZE_TO}x${PW_RESIZE_TO}")" ]] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
951 952 953
            icotool -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
            cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.png"
        else
castro-fidel's avatar
castro-fidel committed
954
            cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | grep "${PW_RESIZE_TO}x${PW_RESIZE_TO}" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.png"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
955
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
956 957
        cp -f "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.png" "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png"
    fi
castro-fidel's avatar
castro-fidel committed
958
    if [[ -z "`file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}"`" ]] && \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
959
       [[ -x "`which "convert" 2>/dev/null`" ]] && [[ -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]] ; then
castro-fidel's avatar
castro-fidel committed
960
        convert "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" -resize ${PW_RESIZE_TO}x${PW_RESIZE_TO} "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
961
    fi
castro-fidel's avatar
castro-fidel committed
962 963 964
    if [[ -z "${PW_ICON_FOR_YAD}" ]] ; then
        if [[ ! -z "`file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}"`" ]] ; then
            export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" 
965
        else
castro-fidel's avatar
castro-fidel committed
966
            export PW_ICON_FOR_YAD="${PW_GUI_ICON_PATH}/port_proton.png"
967
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
968 969
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
970 971 972 973

pw_find_exe () {
    unset PW_FIND_TIME
    case "$1" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
974
        "news") PW_FIND_TIME="-cmin -180" ;;
Mikhail Tergoev's avatar
Mikhail Tergoev committed
975 976
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
977 978 979
    PW_EXCLUDE_EXE_FIND='(windows|explorer|anticheat|programdata|redist|setup|.ppdb|unin|error|crash|handler|install|/jre/|steam|uploader|eac|netframe)'
    PW_PATH_FOR_FIND="${PORT_WINE_PATH}/data/prefixes/"

Mikhail Tergoev's avatar
Mikhail Tergoev committed
980 981 982 983
    pw_start_progress_bar_block "Searching for .exe files... Please wait."
    find -P "${PW_PATH_FOR_FIND}" -type f -name "*.exe" ${PW_FIND_TIME} | grep -viE ${PW_EXCLUDE_EXE_FIND} | \
    awk -F"/prefixes/" '{print $2}' > "${PORT_WINE_TMP_PATH}/tmp_yad_find_exe"
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
984 985 986

    unset FIND_TO_GUI
    while read line; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
987
        FIND_TO_GUI+="${line}%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
988
    done < "${PORT_WINE_TMP_PATH}/tmp_yad_find_exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
989

Mikhail Tergoev's avatar
Mikhail Tergoev committed
990
    OrigIFS="$IFS" && IFS=%
Mikhail Tergoev's avatar
Mikhail Tergoev committed
991
    PW_SET_FIND_EXE="$("${pw_yad_new}" --height="300" --width="1000" --center --list \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
992
    --text-align=center --window-icon="$PW_GUI_ICON_PATH/port_proton.png" --title "Create shortcut for..." \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
993
    --text="\n${loc_gui_create_shortcut_for_exe}" --column="path to .exe file:" ${FIND_TO_GUI})"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
994
    YAD_STATUS="$?"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
995
    print_var YAD_STATUS
Mikhail Tergoev's avatar
Mikhail Tergoev committed
996 997 998 999 1000
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
        if [[ -z "${PW_SET_FIND_EXE}" ]] ; then
            /usr/bin/env bash -c ${pw_full_command_line[*]} &
            echo "Restarting..."
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1001 1002
        exit 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1003 1004 1005
    IFS=$OrigIFS

    if [[ -n "${PW_SET_FIND_EXE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1006 1007
        portwine_exe="${PW_PATH_FOR_FIND}$(echo "${PW_SET_FIND_EXE}" | awk -F'|' '{print $1}')"
        portwine_create_shortcut silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1008 1009
        /usr/bin/env bash -c ${pw_full_command_line[*]} &
        exit 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1010
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1011
}