functions_helper 57.8 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
    ping -w3 -c1 github.com &> /dev/null
    [ "$?" == "0" ] && return 0 || return 1
}

print_error () {
10
    printf "\E[31m%s Error: $@ %s\e[0m\n"
11
}
12
export -f print_error
13

14 15 16 17 18
fatal () {
    print_error "$@"
    exit 1
}

19 20 21 22 23
print_warning () {
    printf "\E[33m%s Warning: $@ %s\e[0m\n"
}
export -f print_warning

24
print_info () {
25
    printf "\E[36m%s Info: $@ %s\e[0m\n"
26
}
27
export -f print_info
28

29 30 31 32 33
print_debug () {
    printf "\E[35m%s Debug: $@ %s\e[0m\n"
}
export -f print_debug

34
print_var () {
35
    for vp in $@ ; do print_info "${vp}=${!vp}" ; done
36
}
37
export -f print_var
38

39 40
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}

41 42 43 44 45 46
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 ]
47
        then print_error "failed to copy file $1 to $2" && return 1
48
        else return 0
49 50 51
        fi
    fi
}
52
export -f try_copy_file
53 54 55 56 57 58 59 60 61 62

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
}
63
export -f try_copy_dir
64 65

try_remove_file () {
66
    if [ -f "$1" ] || [ ! -e "$1" ] ; then
67
        rm -f "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
68
        [ "$?" == 0 ] && return 0 || return 1
69 70
    fi
}
71
export -f try_remove_file
72 73 74 75

try_remove_dir () {
    if [ -d "$1" ] ; then
        rm -fr "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
76
        [ "$?" == 0 ] && return 0 || return 1
77 78
    fi
}
79
export -f try_remove_dir
80 81

try_force_link_file () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
82
    if [ ! -f "$1" ] ; then :
83
    elif [ -z "$2" ] ; then	print_error "no way to link file $1"
84
    else
85
        ln -s -f -r "$1" "$2"
86 87 88 89
        [ "$?" != 0 ] && print_error "failed to link file $1 to $2" || return 0
    fi
    return 1
}
90
export -f try_force_link_file
91

92
check_symlink () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
93 94
    CHK_SYMLINK_FILE="`file "$1"`"
    if [[ ! -z "`echo "$CHK_SYMLINK_FILE" | grep -v "broken" | grep "symbolic link to" | awk '{print $1}'`" ]] ; then
95
        return 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
96
    elif [[ ! -z "`echo "$CHK_SYMLINK_FILE" | grep "broken symbolic link to" | awk '{print $1}'`" ]] ; then
97 98
        print_error "remove broken symlink: $CHK_SYMLINK_FILE"
        rm -fr "$CHK_SYMLINK_FILE"
99 100 101 102 103
        return 1
    else
        return 1
    fi
}
104
export -f check_symlink
105

106
try_force_link_dir () {
107 108
    if [ ! -d "$1" ] ; then	print_info "directory $1 not found for link"
    elif [ -z "$2" ] ; then	print_error "no way to link directory $1"
109
    else
110
        ln -s -f -r "$1" "$2"
111 112 113 114
        [ "$?" != 0 ] && print_error "failed to link directory $1 to $2" || return 0
    fi
    return 1
}
115
export -f try_force_link_dir
116

117 118 119
check_process () {
    [ ! -n "`ps cax | grep "$1" | awk '{print $1}'`" ] && return 0 || return 1 
}
120
export -f check_process
121

122 123 124 125
try_download_game () {
    [[ -f "${PW_AUTOINSTALL_EXE}" ]] && try_remove_file "${PW_AUTOINSTALL_EXE}"
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
    set -o pipefail
Boria138's avatar
Boria138 committed
126
    curl -C - -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' -L "$1" -o "$2" 2>&1 | \
127
    tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
Boria138's avatar
Boria138 committed
128
    "${pw_yad_v12_3}" --progress --percentage=0 --text="Download ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
129
    --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
130
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
131 132 133 134 135 136 137 138
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
        print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME}."
        return 1   
    else
        return 0
    fi
}

139
try_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
140
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
141
    [[ ! -f "${pw_yad_v12_3}" ]] && local pw_yad_v12_3="yad"
142
    set -o pipefail
Boria138's avatar
Boria138 committed
143
    curl -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' -L "$1" -o "$2" 2>&1 | \
144
    tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
145
    "${pw_yad_v12_3}" --progress --percentage=0 --text="Download ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
146
    --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
147
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
148
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
149 150
        print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from GitHub."
        print_info "Try download ${PW_DOWNLOAD_FILE_NAME} from FTP"
151
        curl -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -L "ftp://171.22.215.18/archives/${PW_DOWNLOAD_FILE_NAME}" -o "$2" 2>&1 | \
152
        tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
153
        "${pw_yad_v12_3}" --progress --percentage=0 --text="Download ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
154
        --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
155
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
Mikhail Tergoev's avatar
Mikhail Tergoev committed
156 157 158 159
        if [ "${PIPESTATUS[0]}" != 0 ] ; then
            print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from FTP."
            return 1   
        fi
160
    fi
161
    try_remove_file "${PORT_WINE_TMP_PATH}/download_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
162
    return 0
163 164
}

165
try_download_to_path () {
166
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
167
    set -o pipefail
Boria138's avatar
Boria138 committed
168
    curl -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' -L "$1" -o "$2/$PW_DOWNLOAD_FILE_NAME" 2>&1 | \
169
    tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
170
    "${pw_yad_v12_3}" --progress --percentage=0 --text="Download ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
171
    --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
172
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
173
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
174
        print_error "Failed to download $1."
175 176 177 178
        return 1 
    else 
        return 0
    fi
179 180
}

181
try_download_silent () {
Boria138's avatar
Boria138 committed
182
    curl -sS -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' -L "$1" -o "$2"
183
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
184
        print_error "Failed to download $1. Skipping."
185 186 187 188 189
        try_remove_file "$2"
        return 1 
    else 
        return 0
    fi
190 191 192 193 194 195
}

create_new_dir () {
    if [ ! -d "$1" ] ; then
        mkdir -p "$1"
    fi
196
    return 0
197 198 199
}

var_winedlloverride_update () {
200 201 202
    if [ ! -z "$WINEDLLOVERRIDES" ]
    then export WINEDLLOVERRIDES="$1;$WINEDLLOVERRIDES"
    else export WINEDLLOVERRIDES="$1"
203
    fi
204
    return 0
205 206 207
}

var_vkd3d_config_update () {
208 209 210
    if [ ! -z "$VKD3D_CONFIG" ]
    then export VKD3D_CONFIG="$1;$VKD3D_CONFIG"
    else export VKD3D_CONFIG="$1"
211
    fi
212
    return 0
213 214
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
215
var_radv_perftest_config_update () {
216 217 218
    if [ ! -z "$RADV_PERFTEST" ]
    then export RADV_PERFTEST="$1;$RADV_PERFTEST"
    else export RADV_PERFTEST="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
219 220 221 222 223
    fi
    return 0
}

var_vk_istance_layers_config_update () {
224 225 226
    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
227 228 229 230
    fi
    return 0
}

231
var_ld_library_path_update() {
232 233 234
    if [ ! -z "$LD_LIBRARY_PATH" ]
    then export LD_LIBRARY_PATH="$1:$LD_LIBRARY_PATH"
    else export LD_LIBRARY_PATH="$1"
235 236 237 238
    fi
    return 0
}

239 240 241 242 243 244 245 246 247
pw_notify_send () {
    if command -v notify-send &>/dev/null ; then
        if [[ -f "$PW_GUI_ICON_PATH/portproton.svg" ]]
        then notify-send -a PortProton -i "$PW_GUI_ICON_PATH/portproton.svg" $@ "${PW_NOTIFY_TEXT}"
        else notify-send -a PortProton $@ "${PW_NOTIFY_TEXT}"
        fi
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
248 249
unpack_tar_zst () {
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
250
    unset PW_ZSTD_PORT
251
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/pw_loading_cover.gif"
Boria138's avatar
Boria138 committed
252
    if  [[ `command -v zstd` ]] &>/dev/null ; then
253 254
        tar -I zstd -xhvf "$1" -C "$2"
        pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
255 256
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    else
257
        env LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib" tar -I "${PW_PLUGINS_PATH}/portable/bin/zstd" -xhvf "$1" -C "$2"
258
        pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
259 260
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
261 262
}

263
unpack_tar_xz () {
264 265 266 267
    if [[ "$3" == "silent" ]] ; then
        tar -Jxhvf "$1" -C "$2" && return 0 || return 1
    else
        set -o pipefail
268 269 270
        pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/pw_loading_cover.gif"
        tar -Jxhvf "$1" -C "$2"
        pw_stop_progress_bar_cover_block
271 272
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    fi
273 274 275 276
}

unpack_tar_gz () {
    set -o pipefail
277 278 279
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/pw_loading_cover.gif"
    tar -xhzvf "$1" -C "$2"
    pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
280
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
281 282
}

283 284
unpack_tar () {
    set -o pipefail
285 286 287
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/pw_loading_cover.gif"
    tar -xhvf "$1" -C "$2"
    pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
288
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
289 290
}

castro-fidel's avatar
castro-fidel committed
291
pw_clear_pfx () {
292 293
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.dotnet48"
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver"
castro-fidel's avatar
castro-fidel committed
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
    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"
325 326
    rm -f "${PORT_WINE_TMP_PATH}"/*.bin
    rm -f "${PORT_WINE_TMP_PATH}"/*.foz
327
    return 0
328 329
}

castro-fidel's avatar
castro-fidel committed
330 331 332 333 334
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
335
            echo ""
castro-fidel's avatar
castro-fidel committed
336 337 338 339 340 341 342
            exit 1
        fi
    elif ! gui_question "${port_reinstall}" 
    then exit 1
    fi
    pw_clear_pfx
    try_remove_dir "${PORT_WINE_PATH}/data/dist"
343
    create_new_dir "${PORT_WINE_PATH}/data/dist"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
344
    try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
castro-fidel's avatar
castro-fidel committed
345 346
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    try_remove_file "${PORT_WINE_PATH}/data/user.conf"
347
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver"
castro-fidel's avatar
castro-fidel committed
348
    echo
349
    print_info "Restarting PP for reinstall files..."
castro-fidel's avatar
castro-fidel committed
350 351 352 353
    /usr/bin/env bash -c ${pw_full_command_line[*]} &
    exit 0
}

354 355
check_user_conf () {
    if [ ! -f "${USER_CONF}" ]; then
356
        echo "#!/usr/bin/env bash" > "${USER_CONF}"
357
        echo "# User overides db and var settings..." >> "${USER_CONF}"
358 359
        echo "# export DXVK_HUD=full" >> "${USER_CONF}"
        echo "# export GALLIUM_HUD=fps" >> "${USER_CONF}"
360
    elif grep "optirun_on" "${USER_CONF}" &>/dev/null ; then
361
        sed -i '/optirun_on/d' "${USER_CONF}"
362 363 364 365
    fi
}

init_wine_ver () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
366 367 368 369 370 371 372 373 374 375 376
    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
377
    if [[ -z `ls "${PORT_WINE_PATH}/data/dist/" | grep "${PW_WINE_USE}"` ]] ; then
378 379 380
        if [[ "$PW_WINE_USE" =~ PROTON_LG* ]]
        then export PW_WINE_USE=PROTON_LG
        else export PW_WINE_USE=WINE_LG
381 382
        fi
    fi
383
    if [[ "$PW_WINE_USE" == PROTON_LG ]] 
castro-fidel's avatar
castro-fidel committed
384
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
385
    elif [[ "$PW_WINE_USE" == WINE_LG ]]
386
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
387
    fi
castro-fidel's avatar
castro-fidel committed
388 389 390 391
    [ ! -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}"
392 393 394
    export WINE="${WINEDIR}/bin/wine"
    export WINELOADER="${WINEDIR}/bin/wine"
    export WINESERVER="${WINEDIR}/bin/wineserver"
castro-fidel's avatar
castro-fidel committed
395 396

    export WINEDLLPATH="${WINEDIR}/lib64/wine:${WINEDIR}/lib/wine"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
397
    if [[ -d "${PATH_TO_GAME}" ]] ; then
castro-fidel's avatar
castro-fidel committed
398
        export WINEDLLPATH+=":${PATH_TO_GAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
399
    fi
400

401
    if [[ -d "${WINEDIR}/files" && ! -d "${WINEDIR}/dist" ]] ; then
402 403 404 405 406
        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"
407 408 409 410 411 412
    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"
413 414 415 416 417 418
    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
419
    if [[ -d "${WINEDIR}" ]] ; then
castro-fidel's avatar
castro-fidel committed
420
        [[ ! -f "${WINEDIR}/version" ]] && echo "${PW_WINE_USE}" > "${WINEDIR}/version"
421

422 423 424 425 426
        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
427

428
        for mono_gecko_chk in "mono" "gecko" ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
429
            if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then
430
                print_info "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
431
            elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then
432 433
                pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/pw_loading_cover.gif" 
                try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}"
434 435
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine/
436
                print_info "Copy ${WINEDIR}/share/wine/${mono_gecko_chk} to tmp and create symlink to ${WINEDIR}/share/wine/. OK."
437
                pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
438 439 440
            else
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine
441
                print_warning "${WINEDIR}/share/wine/${mono_gecko_chk} is broken symlink. Repair... OK."
442 443
            fi
        done
castro-fidel's avatar
castro-fidel committed
444

Mikhail Tergoev's avatar
Mikhail Tergoev committed
445
        grep 'Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' "${WINEDIR}/share/wine/wine.inf" &> /dev/null
castro-fidel's avatar
castro-fidel committed
446 447 448
        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
449 450
            sed -i '/Steam.exe/d' "${WINEDIR}/share/wine/wine.inf"
            sed -i '/\\Valve\\Steam/d' "${WINEDIR}/share/wine/wine.inf"
451
            sed -i '/winemenubuilder/d' "${WINEDIR}/share/wine/wine.inf"
castro-fidel's avatar
castro-fidel committed
452
        fi
453
    fi
454

455 456 457
    rm -f "${WINEDIR}"/lib*/*steam* &>/dev/null
    rm -f "${WINEDIR}"/lib*/wine/*/*steam* &>/dev/null
    rm -f "${WINEDIR}"/lib*/wine/*-windows/winemenubuilder.exe &>/dev/null
458

459
    return 0
460 461
}

castro-fidel's avatar
castro-fidel committed
462
pw_init_runtime () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
463

464
    if grep -q -E '(ROSA Fresh|RED OS)' "/etc/os-release" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
465
        export LOCPATH="/run/host/usr/share/locale/"
466
    elif grep -q "altlinux" "/etc/os-release" ; then
castro-fidel's avatar
castro-fidel committed
467
        export LIBGL_DRIVERS_PATH="/usr/lib/X11/modules/dri:/usr/lib64/X11/modules/dri"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
468
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
469

castro-fidel's avatar
castro-fidel committed
470
    PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib" 
471
    export PW_LD_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/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
472 473 474 475 476 477

    if [ ! -z ${PATH_TMP} ]
    then export PATH="${PATH_TMP}"
    else export PATH_TMP="${PATH}"
    fi
    if [ ! -z "${PATH}" ]
478 479
    then export PATH="${WINEDIR}/bin:${PATH}:${PW_PLUGINS_PATH}/portable/bin"
    else export PATH="${WINEDIR}/bin:${PW_PLUGINS_PATH}/portable/bin"
castro-fidel's avatar
castro-fidel committed
480 481 482
    fi

    if [ "${PW_USE_GSTREAMER}" = 1 ] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
483 484 485
        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"
        fi
486 487 488 489 490 491
        create_new_dir "${WINEDIR}"/gstreamer_tmp/
        export WINE_GST_REGISTRY_DIR="${WINEDIR}"/gstreamer_tmp/
        export MEDIACONV_AUDIO_DUMP_FILE="${WINEDIR}"/gstreamer_tmp/audio.foz
        export MEDIACONV_AUDIO_TRANSCODED_FILE="${WINEDIR}"/gstreamer_tmp/transcoded_audio.foz
        export MEDIACONV_VIDEO_DUMP_FILE="${WINEDIR}"/gstreamer_tmp/video.foz
        export MEDIACONV_VIDEO_TRANSCODED_FILE="${WINEDIR}"/gstreamer_tmp/transcoded_video.foz
Mikhail Tergoev's avatar
Mikhail Tergoev committed
492 493 494 495
    else
        var_winedlloverride_update "winegstreamer="
    fi

castro-fidel's avatar
castro-fidel committed
496 497
    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
498
        --unshare-home \
castro-fidel's avatar
castro-fidel committed
499
        --home="${PW_SANDBOX_HOME_PATH}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
500
        --remove-game-overlay \
castro-fidel's avatar
castro-fidel committed
501
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
502
    else
castro-fidel's avatar
castro-fidel committed
503
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
504
        --share-home \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
505
        --remove-game-overlay \
castro-fidel's avatar
castro-fidel committed
506
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
507
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
508

509 510 511 512 513
    if [[ "$PW_USE_SYSTEM_VK_LAYERS" == "1" ]] ; then
        export PRESSURE_VESSEL_IMPORT_VULKAN_LAYERS=1
        unset PW_VK_LAYER_PATH
    else
        export PRESSURE_VESSEL_IMPORT_VULKAN_LAYERS=0
514
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
515 516
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
517
    # export PRESSURE_VESSEL_GRAPHICS_PROVIDER="/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
518 519

    unset PRESSURE_VESSEL_RUNTIME_ARCHIVE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
520 521
    export PRESSURE_VESSEL_COPY_RUNTIME=1
    export PRESSURE_VESSEL_GC_LEGACY_RUNTIMES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
522
    export PRESSURE_VESSEL_RUNTIME=runtime
castro-fidel's avatar
castro-fidel committed
523 524 525
    export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}"
    export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var"
    export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel"
526
    export FONTCONFIG_PATH=''
Mikhail Tergoev's avatar
Mikhail Tergoev committed
527 528

    unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW
castro-fidel's avatar
castro-fidel committed
529
    for PWRTMRO in ${PW_RT_MOUNT_RO[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
530 531 532 533 534
        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
535
    for PWRTMRW in ${PW_RT_MOUNT_RW[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
536 537 538 539 540
        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
541 542

    # drop portable: libssl 32-bit
543
    try_remove_file "${PW_PLUGINS_PATH}/portable/lib/lib32/libssl.so.1.1"
544
    print_info "RUNTIME is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
545 546
}

castro-fidel's avatar
castro-fidel committed
547
pw_mangohud_check () {
548
    if [[ "${PW_MANGOHUD}" == "1" ]] ; then
castro-fidel's avatar
castro-fidel committed
549
        export PW_MANGOHUD_SLR='MANGOHUD=1'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
550
        MANGOHUD_LIB_NAME="libMangoHud.so"
castro-fidel's avatar
castro-fidel committed
551
        if [[ "${PW_VULKAN_USE}" = "0" ]] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
552 553
	        MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:${MANGOHUD_LIB_NAME}"
        fi
castro-fidel's avatar
castro-fidel committed
554 555 556
        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
557
        fi
558
        var_vk_istance_layers_config_update "VK_LAYER_MANGOHUD_overlay64:VK_LAYER_MANGOHUD_overlay32"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
559 560
        print_info "MANGOHUD is enabled"
    else
castro-fidel's avatar
castro-fidel committed
561
        export PW_MANGOHUD_SLR='DISABLE_MANGOHUD=1'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
562 563 564 565 566
        print_info "MANGOHUD is disabled"
    fi
    return 0
}

castro-fidel's avatar
castro-fidel committed
567 568
pw_vkbasalt_check () {
    if [[ "${ENABLE_VKBASALT}" == 1 ]] && [[ "${PW_VULKAN_USE}" != "0" ]] && [[ "${PW_VULKAN_USE}" != "3" ]] ; then
Arta's avatar
Arta committed
569
        if [[ ! -z "${PW_VKBASALT_EFFECTS}" ]] && [[ ! -z "${PW_VKBASALT_FFX_CAS}" ]] ; then
570 571 572 573
            export VKBASALT_CONFIG_FILE="${PORT_WINE_PATH}/data/vkBasalt.conf"
            sed -ri "s/effects = .*/effects = ${PW_VKBASALT_EFFECTS}/g" "${VKBASALT_CONFIG_FILE}"
            sed -ri "s/casSharpness .*/casSharpness = ${PW_VKBASALT_FFX_CAS}/g" "${VKBASALT_CONFIG_FILE}"
            sed -ri "s|= .*/reshade|= \"${PW_WINELIB}\"/pressure-vessel/reshade|g" "${VKBASALT_CONFIG_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
574
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
575
        var_vk_istance_layers_config_update "VK_LAYER_VKBASALT_post_processing64:VK_LAYER_VKBASALT_post_processing32"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
576 577 578 579 580 581 582 583
        print_info "vkBasalt is enabled"
    else
        export DISABLE_VKBASALT=1
        print_info "vkBasalt is disabled"
    fi
    return 0
}

584
regdlloverrides () {
castro-fidel's avatar
castro-fidel committed
585 586 587 588 589 590 591 592 593
    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="" ;;
594
    esac
castro-fidel's avatar
castro-fidel committed
595
    grep 'HKCU,Software\\Wine\\AppDefaults\\'"${PW_DLL_EXE}"'\\DllOverrides,'\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\" "${WINEDIR}/share/wine/wine.inf"
596
    if [[ "$?" != "0" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
597 598
        grep "ProtonOverrides" "${WINEDIR}/share/wine/wine.inf"
        if [[ "$?" == "0" ]] ; then
castro-fidel's avatar
castro-fidel committed
599
            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
600
        else
castro-fidel's avatar
castro-fidel committed
601
            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
602
        fi
603 604 605
    fi
}

606 607 608 609
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
610
    return 0
611
}
612
export -f wait_wineserver
613 614

kill_portwine () {
615
    wine_pids="`ls -l /proc/*/exe 2>/dev/null | grep -ie ${portname} | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}'`"
616
    if  [ ! -z "${wine_pids}" ] ; then
castro-fidel's avatar
castro-fidel committed
617 618 619
        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  
620 621 622
            fi
        done
    fi
623 624
    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
625 626 627
        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
628 629
            fi
        done
630
    fi
631
    return 0
632 633 634
}
export -f kill_portwine

castro-fidel's avatar
castro-fidel committed
635
pw_kill_autostart () {
castro-fidel's avatar
castro-fidel committed
636 637 638 639
    if [[ -z "${2}" ]]
    then SWAIT=5
    else SWAIT="${2}"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
640 641 642
    sleep 5
    
    while true ; do
643
        if  [[ -z "`ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}'`" ]] && [[ ! -z "`ps aux | grep wrap | grep -v grep | grep -i ${portname} | head -n 1`" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
644
            echo -e "PID "$1" not found"
castro-fidel's avatar
castro-fidel committed
645
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
646
        else
castro-fidel's avatar
castro-fidel committed
647
            sleep "${SWAIT}"
648
            if [[ "$3" == please ]]
649
            then kill -s SIGTERM `ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}'`
650 651
            else kill_portwine
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
652 653 654 655
            break
        fi
    done

castro-fidel's avatar
castro-fidel committed
656 657
    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
658
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
659

660
    return 0
661
}
castro-fidel's avatar
castro-fidel committed
662
export -f pw_kill_autostart
663

664
stop_portwine () { 
665
    if [[ "$int_xneur" == "1"  ]] ; then
666 667
        xneur &
    fi
668
    if [[ "$PW_USE_US_LAYOUT" == "1" ]] && [[ "${XDG_SESSION_TYPE}" != "wayland" ]] && command -v setxkbmap &>/dev/null ; then
Boria138's avatar
Boria138 committed
669
        setxkbmap
670
    fi
671 672 673 674
    if [[ "${XDG_SESSION_TYPE}" != "wayland" ]] \
    && [[ "$(xrandr | sed -rn 's/^.*primary.* ([0-9]+x[0-9]+).*$/\1/p')" != "$PW_SCREEN_RESOLUTION" ]]
    then
        xrandr --output "$PW_SCREEN_PRIMARY" --mode "$PW_SCREEN_RESOLUTION"
675
    fi
castro-fidel's avatar
castro-fidel committed
676
    pw_stop_progress_bar
677 678
    try_remove_file "${PORT_SCRIPTS_PATH}/0"
    try_remove_file "${PORT_SCRIPTS_PATH}/1"
679
    kill_portwine &&
castro-fidel's avatar
castro-fidel committed
680 681
    try_remove_dir "${PW_WINELIB}/var"
    find "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/" -maxdepth 1 -type f -name "*.tmp" -delete
682 683
    if [ ! -z "`pgrep -a yad_v12_3 | grep "\--notification" | awk '{print $1}'`" ] ; then
        kill -s SIGUSR1 "`pgrep -a yad_v12_3 | grep "\--notification" | awk '{print $1}'`" 2>/dev/null
684
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
685
    add_in_stop_portwine #&>/dev/null
686
    kill -n 9 `pgrep -a start.sh | grep -i '/PortProton/' | awk '{print $1}'` > /dev/null 2>&1
687
    killall yad_v12_3 &>/dev/null
688
    exit 0
689
}
690
export -f stop_portwine
691

castro-fidel's avatar
castro-fidel committed
692
pw_download_libs () {
693 694
    if [[ ! -e "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \
    || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pv-bwrap" ]]
695
    then
696
        print_info "Download and install libraries..."
castro-fidel's avatar
castro-fidel committed
697 698 699
        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"
700 701 702 703
                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}`
                    do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_LIBS}"
                    done
704
                    # TODO: drop clear prefix, and add update prefix from new libs 
705 706
                    pw_clear_pfx
                fi
707
            else
castro-fidel's avatar
castro-fidel committed
708 709
                try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
710
                if yad_error_download
711 712 713 714 715
                then pw_download_libs
                else
                    export PW_LIBS_VER="$(echo _v$(($(echo $PW_LIBS_VER | sed 's/_v//') - 1)))"
                    export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                fi
716 717
            fi
        else
718
            if yad_error_download
719 720 721 722 723
            then pw_download_libs
            else
                export PW_LIBS_VER="$(echo _v$(($(echo $PW_LIBS_VER | sed 's/_v//') - 1)))"
                export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
            fi
724 725
        fi
    fi
726
    try_remove_dir "${PW_WINELIB}/portable"
727
    return 0
728 729
}

castro-fidel's avatar
castro-fidel committed
730
pw_check_and_download_wine () {
731
    [ ! -d "${PORT_WINE_PATH}/data/dist/" ] && create_new_dir "${PORT_WINE_PATH}/data/dist"
castro-fidel's avatar
castro-fidel committed
732
    if [[ "${PW_WINE_USE}" == "GET-OTHER-WINE" ]] ; then
733 734
        gui_proton_downloader
    fi
735
    if [[ "$PW_WINE_USE" == PROTON_LG ]] 
castro-fidel's avatar
castro-fidel committed
736
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
737
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
738
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
castro-fidel's avatar
castro-fidel committed
739 740 741 742 743 744 745 746
    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}"
747
            else
castro-fidel's avatar
castro-fidel committed
748 749 750
                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}"
751

752
                yad_error_download && pw_check_and_download_wine || exit 1
753 754
            fi
        else
755
            yad_error_download && pw_check_and_download_wine || exit 1
756 757
        fi
    fi
758
    return 0
759 760
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
761 762 763 764 765
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
766 767 768 769 770 771 772
            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}

773
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
774 775
                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
776 777 778 779 780 781
                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}

782
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
783 784
                fi
            else
785
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
786 787 788 789
            fi
        fi
    done

Mikhail Tergoev's avatar
Mikhail Tergoev committed
790
    #Download stable and git version VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
791 792 793
    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
794 795 796 797 798 799 800
            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}

801
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
802 803
                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
804 805 806 807 808 809
                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}

810
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
811 812
                fi
            else
813
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
814 815 816
            fi
        fi
    done
817 818 819 820 821 822 823 824 825 826 827

    #Download D8VK
    if [ ! -d "${PW_VULKAN_DIR}/d8vk-${D8VK_VER}" ] ; then
        print_info "Download and install D8VK v.${D8VK_VER}"
        if try_download "https://github.com/Castro-Fidel/vulkan/releases/download/d8vk-${D8VK_VER}/d8vk-${D8VK_VER}.tar.xz" "${PW_VULKAN_DIR}/d8vk-${D8VK_VER}.tar.xz" ; then
            if unpack_tar_xz "${PW_VULKAN_DIR}/d8vk-${D8VK_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
                try_remove_file "${PW_VULKAN_DIR}/d8vk-${D8VK_VER}.tar.xz"
            else
                try_remove_file "${PW_VULKAN_DIR}/d8vk-${D8VK_VER}.tar.xz"
                try_remove_dir "d8vk-${D8VK_VER}"

828
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
829 830
            fi
        else
831
            yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
832 833 834
        fi
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
835 836 837
    return 0
}

castro-fidel's avatar
castro-fidel committed
838
pw_check_and_download_plugins () {
839 840 841
    if [[ ! -f "${PW_PLUGINS_PATH}/portable/bin/yad_new" ]] \
    || [[ ! -f "${PW_PLUGINS_PATH}/portable/bin/yad_v12_3" ]]
    then
castro-fidel's avatar
castro-fidel committed
842
        print_info "Download and install plugins${PW_PLUGINS_VER}..."
843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
        if command -v yad &>/dev/null ; then
            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" 
                        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}`
                            do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
                            done
                        fi
                else
                    try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz"
                    try_remove_dir "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
                    if yad_error_download
                    then pw_check_and_download_plugins
                    else
                        export PW_PLUGINS_VER="$(echo _v$(($(echo $PW_PLUGINS_VER | sed 's/_v//') - 1)))"
                        export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"  
860
                    fi
861
                fi
862
            else
863
                if yad_error_download
864 865 866 867 868
                then pw_check_and_download_plugins
                else
                    export PW_PLUGINS_VER="$(echo _v$(($(echo $PW_PLUGINS_VER | sed 's/_v//') - 1)))"
                    export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"  
                fi
869 870
            fi
        else
871
            PW_NOTIFY_TEXT="Please wait for update PortProton"
872
            pw_notify_send -u critical 
873 874 875 876 877 878 879 880 881 882 883 884 885
            if try_download_silent "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" 
                    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}`
                        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
                        done
                    fi
                else
                    PW_NOTIFY_TEXT="Failed updating PortProton!"
                    pw_notify_send -u critical 
                    print_error "Failed updating PortProton!"
                fi
886
            fi
887 888
        fi
    fi
889 890 891 892 893
    export pw_yad="${PW_PLUGINS_PATH}/portable/bin/yad"
    export pw_yad_v12_3="${PW_PLUGINS_PATH}/portable/bin/yad_v12_3"
    export pw_zstd="${PW_PLUGINS_PATH}/portable/bin/zstd"
    export pw_7z="${PW_PLUGINS_PATH}/portable/lib/p7zip/7z"
    export PW_XTERM="${PW_PLUGINS_PATH}/portable/bin/xterm -geometry 159x37 -e"
894
    return 0
895 896
}

897
check_nvidia_rtx () {
898
    if [[ ! -z $(echo "$LSPCI_VGA" | grep -i "nvidia") ]]; then
899
        # Turing (without nvidia 16XX)
900
        [[ "$LSPCI_VGA" == *TU[0-9]* ]] && [[ "$LSPCI_VGA" != *TU11[6-7]* ]] && return 0
901
        # Ampere
902
        [[ "$LSPCI_VGA" == *GA[0-9]* ]] && return 0
903
        # Ada_Lovelace
904
        [[ "$LSPCI_VGA" == *AD[0-9]* ]] || [[ "$LSPCI_VGA" == *2[6-8][0-9]* ]] && return 0
905 906 907 908
    fi
    return 1
}

castro-fidel's avatar
castro-fidel committed
909
pw_init_db () {
910 911
    if [[ -f "${portwine_exe}" ]] ; then
        export PORTWINE_DB="$(basename "${portwine_exe}" .exe)"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
912
        if [[ -f "${portwine_exe}".ppdb ]] && [[ "${PORTWINE_DB}" != "RiotClientServices" ]] ; then
913
            export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
914
            . "${PORTWINE_DB_FILE}"
castro-fidel's avatar
castro-fidel committed
915 916 917
            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
918
            fi
919 920 921
        else
            orig_IFS="$IFS"
            IFS=$'\n'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
922
            PW_FIND_DB_FILE=`grep -ilw "#${PORTWINE_DB}.exe" "${PORT_SCRIPTS_PATH}/portwine_db"/* | sed s/".exe"/""/gi`
castro-fidel's avatar
castro-fidel committed
923
            if [[ `echo "$PW_FIND_DB_FILE" | wc -l` -gt 1 ]] ; then
924
                unset ADD_CB_DBFILE
castro-fidel's avatar
castro-fidel committed
925
                for PW_CHECK_DB_FILE in $PW_FIND_DB_FILE ; do
926
                    if [[ -z "${ADD_CB_DBFILE}" ]] ; then
927
                        export ADD_CB_DBFILE="`echo ${PW_CHECK_DB_FILE} | awk -F'/' '{print $NF}'`"
928
                    else
929
                        export ADD_CB_DBFILE="`echo ${PW_CHECK_DB_FILE} | awk -F'/' '{print $NF}'`!${ADD_CB_DBFILE}"
930 931
                    fi
                done
932 933 934
                PORTWINE_DB_FILE="${PORT_SCRIPTS_PATH}/portwine_db"/`"${pw_yad_v12_3}" --text-align=center \
                --text "${PW_SELECTION_DB_LOC}" --borders="${YAD_BORDERS}" --form \
                --title "Database file selection..." --window-icon="$PW_GUI_ICON_PATH/portproton.svg"  --form --separator="" \
935
                --field="DB FILE: :CB" "${ADD_CB_DBFILE}" 2>/dev/null`
936
                if [[ "$?" == "1" || "$?" == "252" ]] ; then exit 0 ; fi
castro-fidel's avatar
castro-fidel committed
937 938
            elif [[ `echo "$PW_FIND_DB_FILE" | wc -l` -eq 1 ]] ; then
                PORTWINE_DB_FILE="${PW_FIND_DB_FILE}"
939 940
            fi
            IFS="$orig_IFS"
castro-fidel's avatar
castro-fidel committed
941 942
            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
943
                export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
944 945 946 947
            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
948
                export PW_PREFIX_NAME=`echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}'`
949
            fi
950
        fi
951
        if [[ -f "${PORTWINE_DB_FILE}" ]] ; then
952
            . "${PORTWINE_DB_FILE}"
953

954
            init_wine_ver && 
955
            print_info "Use ${PORTWINE_DB_FILE} db file."
956
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
957
        if [[ -z "${PATH_TO_GAME}" ]] || [[ ! -d "${PATH_TO_GAME}" ]]; then
958
            export PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"        
959
        fi
960

961
        if [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] && [[ ! -z "${WINE_CPU_TOPOLOGY}" ]] ; then
962 963
            export PW_WINE_CPU_TOPOLOGY="${WINE_CPU_TOPOLOGY}"
        fi
964 965 966
        if ls "${PATH_TO_GAME}"/*_Data/Resources/ 2>/dev/null | grep "unity" &>/dev/null \
        && [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] \
        && [[ $(grep -c "^processor" /proc/cpuinfo) -gt "8" ]]
967 968 969 970
        then
                export PW_WINE_CPU_TOPOLOGY="8:0,1,2,3,4,5,6,7"
                print_info "Automatic added fix for unity games: WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7"
        fi
971

972 973 974 975
        if check_nvidia_rtx ; then
            check_variables PW_USE_NVAPI_AND_DLSS "1"
            check_variables PW_USE_FAKE_DLSS "0"
            check_variables PW_USE_RAY_TRACING "1"
976
        fi
977

978 979 980 981 982 983 984
        if [[ "${update_loc}" == "RUS" ]] ; then
            for chk_lang_and_uname in "steam_emu.ini" "steam_api.ini" "steam_api64.ini" ; do
                if [[ -f "${PATH_TO_GAME}/${chk_lang_and_uname}" ]] ; then
                    sed -i "s/Language=english/Language=russian/" "${PATH_TO_GAME}/${chk_lang_and_uname}"
                    sed -i "/UserName=/c\UserName=${USER}" "${PATH_TO_GAME}/${chk_lang_and_uname}"
                fi
            done
985
        fi
986
    fi
987
    [[ "${START_FROM_STEAM}" == 1 ]] && export PW_GUI_DISABLED_CS=1
988
    [[ "${START_FROM_PP_GUI}" == 1 ]] && export PW_GUI_DISABLED_CS=0 && unset START_FROM_PP_GUI
Mikhail Tergoev's avatar
Mikhail Tergoev committed
989

990
    return 0
991 992
}

castro-fidel's avatar
castro-fidel committed
993
pw_port_update () {
994
    ###SCRIPTS UPDATE###
995
    if [ ! -f "${PORT_WINE_TMP_PATH}/scripts_ver" ] ; then
996
        echo "2022" > "${PORT_WINE_TMP_PATH}/scripts_ver"
997 998
    fi
    export scripts_install_ver=`cat "${PORT_WINE_TMP_PATH}/scripts_ver" | head -n 1`
Mikhail Tergoev's avatar
Mikhail Tergoev committed
999
    print_info "Check update..."
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
    if curl -s --list-only --connect-timeout 3 "https://raw.githubusercontent.com/Castro-Fidel/PortWINE/master/data_from_portwine/scripts/var" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
    then
        URL_FOR_CHANGELOG="https://raw.githubusercontent.com/Castro-Fidel/PortWINE/master/data_from_portwine"
        URL_TO_PW_MASTER="https://github.com/Castro-Fidel/PortWINE/archive/refs/heads/master.tar.gz"
        print_info "OK."
    else
        if curl -s --list-only --connect-timeout 3 "https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/raw/master/data_from_portwine/scripts/var" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
        then
            URL_FOR_CHANGELOG="https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/raw/master/data_from_portwine"
            URL_TO_PW_MASTER="https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/-/archive/master/PortWINE-master.tar.gz"
            print_info "OK."
        else
            print_error "Unable to determine the version on the server. Skip it..."
            return 1
        fi
    fi
1016 1017 1018 1019 1020 1021 1022
    [[ ! -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
1023 1024 1025 1026 1027 1028 1029 1030 1031
            if [[ -f "${PW_PLUGINS_PATH}/portable/bin/yad_v12_3" ]]
            then export pw_yad_v12_3="${PW_PLUGINS_PATH}/portable/bin/yad_v12_3"
            elif command -v yad &>/dev/null
            then local pw_yad_v12_3="yad"
            else local pw_yad_v12_3="not_found"
            fi
            if [[ "${pw_yad_v12_3}" == "not_found" ]] ; then
                xcsd="${scripts_upd4}"
            else
1032
                curl -s --list-only "${URL_FOR_CHANGELOG}/${PW_CHANGELOG_FILE}" | tee "${PORT_WINE_TMP_PATH}/curent_var_ver"
1033
                CHANGLOG_NEWS=`cat "${PORT_WINE_TMP_PATH}/curent_var_ver" | sed "/Scripts version ${scripts_install_ver}/,$ d" | sed '1,/---/ d' `
1034 1035
                xcsd=`"${pw_yad_v12_3}" --title "${scripts_upd2} v.${scripts_current_ver}" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
                --borders=${YAD_BORDERS} --form --separator='%%%' --width=1200 --height=600 \
1036
                --field=":TXT" "${CHANGLOG_NEWS}" \
1037
                --field="   ${scripts_upd3} :CB" "${scripts_upd4}!${scripts_upd5}!${scripts_upd6}" 2>/dev/null`
1038 1039 1040 1041 1042 1043 1044 1045 1046
                YAD_STATUS="$?"
                if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then exit 0 ; fi
                xcsd=`echo "${xcsd}" | awk -F'%%%' '{print $2}'`
            fi
            case $xcsd in
                "${scripts_upd4}")
                    echo "######################################################"
                    print_info "Update scripts..."
                    try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
1047
                    if try_download "${URL_TO_PW_MASTER}" "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1048 1049 1050 1051 1052 1053
                        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
1054
                            try_remove_dir "${PORT_WINE_PATH}/data/scripts/portwine_db"
1055 1056 1057 1058
                            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
1059
                            [ "$?" == 0 ] && echo "Restarting PP after update..." && /usr/bin/env bash -c ${pw_full_command_line[*]} &
1060 1061 1062
                            exit 0
                        fi
                    else
1063
                        yad_error_download && pw_port_update || exit 1
1064 1065 1066 1067
                    fi ;;
                "${scripts_upd5}")
                    echo " " ;;
                "${scripts_upd6}")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1068
                    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
1069
            esac
1070 1071
        fi
    fi
1072
    try_remove_file "${PORT_WINE_TMP_PATH}/curent_var_ver"
1073
    return 0
1074 1075
}

1076
update_winetricks () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1077
    W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
    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
1088
    fi
1089 1090 1091
    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
1092
        sed -i 's/w_metadata vcrun2019 dlls \\/w_metadata !dont_use_2019! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
1093
        sed -i 's/w_set_winver win2k3/w_set_winver win7/' "${PORT_WINE_TMP_PATH}/winetricks"
1094
    fi
1095
    return 0
1096 1097 1098
}

edit_db_from_gui () {
1099
    print_info "edit_db_from_gui PORTWINE_DB_FILE=$PORTWINE_DB_FILE"
1100
    for mod_db in $@ ; do
1101
        print_info "${mod_db}=${!mod_db}"
1102
        if [ -z "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}="`" ] ; then
1103
            echo "export ${mod_db}=\"${!mod_db}\"" >> "${PORTWINE_DB_FILE}"
1104
        elif [ "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}=" | grep -v "#"`" ] ; then
1105 1106
            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}"
1107 1108
            fi
        elif [ "`cat "${PORTWINE_DB_FILE}" | grep "export ${mod_db}="`" != "export ${mod_db}=${!mod_db}" ] ; then
1109
            sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${PORTWINE_DB_FILE}"
1110
        fi
1111
    done
1112
    return 0
1113
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1114

1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
edit_user_conf_from_gui () {
    for mod_db in $@ ; do
        print_info "${mod_db}=${!mod_db}"
        if [ -z "`cat "${USER_CONF}" | grep "export ${mod_db}="`" ] ; then
            echo "export ${mod_db}=\"${!mod_db}\"" >> "${USER_CONF}"
        elif [ "`cat "${USER_CONF}" | grep "export ${mod_db}=" | grep -v "#"`" ] ; then
            if [ "`cat "${USER_CONF}" | grep "export ${mod_db}=" | grep -v "#"`" != "export ${mod_db}=\"${!mod_db}\"" ] ; then
                sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/" "${USER_CONF}"
            fi
        elif [ "`cat "${USER_CONF}" | grep "export ${mod_db}="`" != "export ${mod_db}=${!mod_db}" ] ; then
            sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${USER_CONF}"
        fi
    done
    return 0
}

castro-fidel's avatar
castro-fidel committed
1131
pw_create_gui_png () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1132 1133 1134 1135 1136
    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
1137
    PW_RESIZE_TO=128
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1138
    try_remove_file "${PORT_WINE_PATH}/data/img/setup.png"
1139 1140 1141
    try_remove_file "${PORT_WINE_PATH}/data/img/Setup.png"
    try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png"
    try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png"
1142
    if [[ ! -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1143 1144
        try_remove_dir "${PORT_WINE_TMP_PATH}/tmp_img"
        create_new_dir "${PORT_WINE_TMP_PATH}/tmp_img"
1145
        env LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" "${PW_PLUGINS_PATH}/portable/bin/wrestool" -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" -t14 "$(readlink -f "${portwine_exe}")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1146
        cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".ico" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
1147
        env LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" "${PW_PLUGINS_PATH}/portable/bin/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"
castro-fidel's avatar
castro-fidel committed
1148
        if [[ ! -f "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | grep "${PW_RESIZE_TO}x${PW_RESIZE_TO}")" ]] ; then 
1149
            env LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" "${PW_PLUGINS_PATH}/portable/bin/icotool" -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1150 1151
            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
1152
            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
1153
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1154 1155
        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
1156
    if [[ -z "`file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}"`" ]] && \
Boria138's avatar
Boria138 committed
1157
       [[ -x "`command -v "convert" 2>/dev/null`" ]] && [[ -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]] ; then
castro-fidel's avatar
castro-fidel committed
1158
        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
1159
    fi
castro-fidel's avatar
castro-fidel committed
1160 1161 1162
    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" 
1163
        else
castro-fidel's avatar
castro-fidel committed
1164
            export PW_ICON_FOR_YAD="${PW_GUI_ICON_PATH}/port_proton.png"
1165
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1166 1167
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1168 1169 1170 1171

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1175 1176 1177
    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
1178 1179 1180 1181
    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
1182 1183 1184

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1188
    OrigIFS="$IFS" && IFS=%
1189
    PW_SET_FIND_EXE="$("${pw_yad_v12_3}" --height="300" --width="1000" --list \
1190
    --text-align=center --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "Create shortcut for..." \
1191
    --text="\n${loc_gui_create_shortcut_for_exe}" --column="path to .exe file:" ${FIND_TO_GUI} 2>/dev/null)"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1192
    YAD_STATUS="$?"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1193
    print_var YAD_STATUS
1194 1195 1196
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
        if [[ -z "${PW_SET_FIND_EXE}" ]] ; then
            /usr/bin/env bash -c ${pw_full_command_line[*]} &
1197
            print_info "Restarting..."
1198
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1199 1200
        exit 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1201 1202
    IFS=$OrigIFS

1203
    if [[ ! -z "${PW_SET_FIND_EXE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1204 1205
        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
1206 1207
        /usr/bin/env bash -c ${pw_full_command_line[*]} &
        exit 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1208
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1209
}
1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228

pw_create_unique_exe () {
    BASEDIR_GAME="$(dirname "$portwine_exe")"
    if [[ -d "$BASEDIR_GAME" ]] ; then
        pushd "$BASEDIR_GAME"
        BASENAME_GAME_EXE="$(basename "$portwine_exe")"
        if [[ ! -z "$1" ]] ; then
            BASENAME_GAME="$(echo "$(basename "$1" .exe).exe")"
            ln -sf "$BASENAME_GAME_EXE" "$BASENAME_GAME"
            export portwine_exe="$BASEDIR_GAME/$BASENAME_GAME"
        elif [[ ! -z "$PORTWINE_CREATE_SHORTCUT_NAME" ]] ; then
            ln -sf "$BASENAME_GAME_EXE" "$PORTWINE_CREATE_SHORTCUT_NAME.exe"
            export portwine_exe="$BASEDIR_GAME/$PORTWINE_CREATE_SHORTCUT_NAME.exe"
        else 
            print_warning "There are no arguments for creating a symbolic link! Skip it..."
        fi
        popd
    fi
}