functions_helper 63.6 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
print_ok () {
    printf "\E[35m%s OK: $@ %s\e[0m\n"
31
}
32
export -f print_ok
33

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

122
try_download_no_mirror () {
123
    [[ -f "${PW_AUTOINSTALL_EXE}" ]] && try_remove_file "${PW_AUTOINSTALL_EXE}"
124
    PW_DOWNLOAD_FILE_NAME="$(basename $2)"
125
    set -o pipefail
126
    curl -f -# -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' | \
128
    "${pw_yad_v12_3}" --progress --percentage=0 --text="${loc_downloading} ${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
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
132 133
        print_error "Failed to download $PW_DOWNLOAD_FILE_NAME"
        return 1
134
    else
135
        print_ok "File downloaded successfully: $PW_DOWNLOAD_FILE_NAME from $1"
136 137 138 139
        return 0
    fi
}

140
try_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
141
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
142
    [[ ! -f "${pw_yad_v12_3}" ]] && local pw_yad_v12_3="yad"
143
    set -o pipefail
144
    curl -f -# -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 | \
145
    tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
146
    "${pw_yad_v12_3}" --progress --percentage=0 --text="${loc_downloading} ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
147
    --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
148
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
149
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
150 151
        print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from GitHub."
        print_info "Try download ${PW_DOWNLOAD_FILE_NAME} from FTP"
152
        curl -f -# -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 | \
153
        tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
154
        "${pw_yad_v12_3}" --progress --percentage=0 --text="${loc_downloading} ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
155
        --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
156
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
Mikhail Tergoev's avatar
Mikhail Tergoev committed
157 158
        if [ "${PIPESTATUS[0]}" != 0 ] ; then
            print_error "Failed to download ${PW_DOWNLOAD_FILE_NAME} from FTP."
159
            return 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
160
        fi
161
    fi
162
    try_remove_file "${PORT_WINE_TMP_PATH}/download_log"
163
    print_ok "File downloaded successfully: $PW_DOWNLOAD_FILE_NAME from $1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
164
    return 0
165 166
}

167
try_download_to_path () {
168
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
169
    set -o pipefail
170
    curl -f -# -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 | \
171
    tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
172
    "${pw_yad_v12_3}" --progress --percentage=0 --text="${loc_downloading} ${PW_DOWNLOAD_FILE_NAME}" --auto-close --no-escape \
173
    --auto-kill --center --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
174
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders=15
175
    if [ "${PIPESTATUS[0]}" != 0 ] ; then
176 177 178 179
        print_error "Failed to download $PW_DOWNLOAD_FILE_NAME"
        return 1
    else
        print_ok "File downloaded successfully: $PW_DOWNLOAD_FILE_NAME from $1"
180 181
        return 0
    fi
182 183
}

184
try_download_silent () {
185 186 187 188
    PW_DOWNLOAD_FILE_NAME="$(basename $1)"
    curl -f -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"
    if [ "$?" != 0 ] ; then
        print_error "Failed to download $PW_DOWNLOAD_FILE_NAME. Skipping."
189
        try_remove_file "$2"
190 191 192
        return 1
    else
        print_ok "File downloaded successfully: $PW_DOWNLOAD_FILE_NAME from $1"
193 194
        return 0
    fi
195 196 197 198 199 200
}

create_new_dir () {
    if [ ! -d "$1" ] ; then
        mkdir -p "$1"
    fi
201
    return 0
202 203 204
}

var_winedlloverride_update () {
205 206 207
    if [ ! -z "$WINEDLLOVERRIDES" ]
    then export WINEDLLOVERRIDES="$1;$WINEDLLOVERRIDES"
    else export WINEDLLOVERRIDES="$1"
208
    fi
209
    return 0
210 211 212
}

var_vkd3d_config_update () {
213 214 215
    if [ ! -z "$VKD3D_CONFIG" ]
    then export VKD3D_CONFIG="$1;$VKD3D_CONFIG"
    else export VKD3D_CONFIG="$1"
216
    fi
217
    return 0
218 219
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
220
var_radv_perftest_config_update () {
221 222 223
    if [ ! -z "$RADV_PERFTEST" ]
    then export RADV_PERFTEST="$1;$RADV_PERFTEST"
    else export RADV_PERFTEST="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
224 225 226 227 228
    fi
    return 0
}

var_vk_istance_layers_config_update () {
229 230 231
    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
232 233 234 235
    fi
    return 0
}

236
var_ld_library_path_update () {
237 238 239
    if [ ! -z "$LD_LIBRARY_PATH" ]
    then export LD_LIBRARY_PATH="$1:$LD_LIBRARY_PATH"
    else export LD_LIBRARY_PATH="$1"
240 241 242 243
    fi
    return 0
}

244 245 246 247 248 249 250 251 252
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
}

253 254 255 256 257 258 259
check_start_from_steam () {
    if [[ "${START_FROM_STEAM}" == 1 ]]
    then return 0
    else return 1
    fi
}

260 261 262 263 264 265 266
check_gamescope_session () {
    if echo "${DESKTOP_SESSION}" | grep -i "gamescope" &>/dev/null
    then return 0
    else return 1
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
267 268
unpack_tar_zst () {
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
269
    unset PW_ZSTD_PORT
270
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/unpacking_${update_loc}.gif"
271
    if command -v zstd &>/dev/null ; then
272 273
        tar -I zstd -xhvf "$1" -C "$2"
        pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
274 275
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    else
276
        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"
277
        pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
278 279
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
280 281
}

282
unpack_tar_xz () {
283 284 285 286
    if [[ "$3" == "silent" ]] ; then
        tar -Jxhvf "$1" -C "$2" && return 0 || return 1
    else
        set -o pipefail
287
        pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/unpacking_${update_loc}.gif"
288 289
        tar -Jxhvf "$1" -C "$2"
        pw_stop_progress_bar_cover_block
290 291
        [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
    fi
292 293 294 295
}

unpack_tar_gz () {
    set -o pipefail
296
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/unpacking_${update_loc}.gif"
297 298
    tar -xhzvf "$1" -C "$2"
    pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
299
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
300 301
}

302 303
unpack_tar () {
    set -o pipefail
304
    pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/unpacking_${update_loc}.gif"
305 306
    tar -xhvf "$1" -C "$2"
    pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
307
    [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $1 unpacking error." && return 1 || return 0
308 309
}

castro-fidel's avatar
castro-fidel committed
310
pw_clear_pfx () {
311 312
    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
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
    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"
344 345
    rm -f "${PORT_WINE_TMP_PATH}"/*.bin
    rm -f "${PORT_WINE_TMP_PATH}"/*.foz
346
    return 0
347 348
}

castro-fidel's avatar
castro-fidel committed
349 350 351 352 353
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
354
            echo ""
castro-fidel's avatar
castro-fidel committed
355 356
            exit 1
        fi
357
    elif ! yad_question "${port_reinstall}" 
castro-fidel's avatar
castro-fidel committed
358 359 360 361
    then exit 1
    fi
    pw_clear_pfx
    try_remove_dir "${PORT_WINE_PATH}/data/dist"
362
    create_new_dir "${PORT_WINE_PATH}/data/dist"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
363
    try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
castro-fidel's avatar
castro-fidel committed
364 365
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    try_remove_file "${PORT_WINE_PATH}/data/user.conf"
366
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver"
castro-fidel's avatar
castro-fidel committed
367
    echo
368
    print_info "Restarting PP for reinstall files..."
369
    export SKIP_CHECK_UPDATES=0
castro-fidel's avatar
castro-fidel committed
370 371 372 373
    /usr/bin/env bash -c ${pw_full_command_line[*]} &
    exit 0
}

374 375
check_user_conf () {
    if [ ! -f "${USER_CONF}" ]; then
376
        echo "#!/usr/bin/env bash" > "${USER_CONF}"
377
        echo "# User overides db and var settings..." >> "${USER_CONF}"
378 379
        echo "# export DXVK_HUD=full" >> "${USER_CONF}"
        echo "# export GALLIUM_HUD=fps" >> "${USER_CONF}"
380
    elif grep "optirun_on" "${USER_CONF}" &>/dev/null ; then
381
        sed -i '/optirun_on/d' "${USER_CONF}"
382 383 384 385
    fi
}

init_wine_ver () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
386 387 388 389 390 391 392 393 394 395 396
    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
397
    if [[ -z `ls "${PORT_WINE_PATH}/data/dist/" | grep "${PW_WINE_USE}"` ]] ; then
398 399 400
        if [[ "$PW_WINE_USE" =~ PROTON_LG* ]]
        then export PW_WINE_USE=PROTON_LG
        else export PW_WINE_USE=WINE_LG
401 402
        fi
    fi
403
    if [[ "$PW_WINE_USE" == PROTON_LG ]] 
castro-fidel's avatar
castro-fidel committed
404
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
405
    elif [[ "$PW_WINE_USE" == WINE_LG ]]
406
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
407
    fi
castro-fidel's avatar
castro-fidel committed
408 409 410 411
    [ ! -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}"
412 413 414
    export WINE="${WINEDIR}/bin/wine"
    export WINELOADER="${WINEDIR}/bin/wine"
    export WINESERVER="${WINEDIR}/bin/wineserver"
castro-fidel's avatar
castro-fidel committed
415 416

    export WINEDLLPATH="${WINEDIR}/lib64/wine:${WINEDIR}/lib/wine"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
417
    if [[ -d "${PATH_TO_GAME}" ]] ; then
castro-fidel's avatar
castro-fidel committed
418
        export WINEDLLPATH+=":${PATH_TO_GAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
419
    fi
420

421
    if [[ -d "${WINEDIR}/files" && ! -d "${WINEDIR}/dist" ]] ; then
422 423 424 425 426
        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"
427 428 429 430 431 432
    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"
433 434 435 436 437 438
    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
439
    if [[ -d "${WINEDIR}" ]] ; then
castro-fidel's avatar
castro-fidel committed
440
        [[ ! -f "${WINEDIR}/version" ]] && echo "${PW_WINE_USE}" > "${WINEDIR}/version"
441

442
        if [[ ! -d "${WINEDIR}/lib64/" ]] && [[ -d "${WINEDIR}/lib/wine/x86_64-unix" ]] ; then
443 444 445 446
            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
447

448
        for mono_gecko_chk in "mono" "gecko" ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
449
            if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then
450
                print_info "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
451
            elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then
452
                pw_start_progress_bar_cover_block "${PW_GUI_ICON_PATH}/covers/loading_${update_loc}.gif" 
453
                try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}"
454 455
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine/
456
                print_info "Copy ${WINEDIR}/share/wine/${mono_gecko_chk} to tmp and create symlink to ${WINEDIR}/share/wine/. OK."
457
                pw_stop_progress_bar_cover_block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
458 459 460
            else
                try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine
461
                print_warning "${WINEDIR}/share/wine/${mono_gecko_chk} is broken symlink. Repair... OK."
462 463
            fi
        done
castro-fidel's avatar
castro-fidel committed
464

Mikhail Tergoev's avatar
Mikhail Tergoev committed
465
        grep 'Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' "${WINEDIR}/share/wine/wine.inf" &> /dev/null
castro-fidel's avatar
castro-fidel committed
466 467 468
        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
469 470
            sed -i '/Steam.exe/d' "${WINEDIR}/share/wine/wine.inf"
            sed -i '/\\Valve\\Steam/d' "${WINEDIR}/share/wine/wine.inf"
471
            sed -i '/winemenubuilder/d' "${WINEDIR}/share/wine/wine.inf"
castro-fidel's avatar
castro-fidel committed
472
        fi
473
    fi
474

475 476 477
    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
478

479
    return 0
480 481
}

castro-fidel's avatar
castro-fidel committed
482
pw_init_runtime () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
483

484
    if grep -i -E '(ROSA|RED OS)' "/etc/os-release" &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
485
        export LOCPATH="/run/host/usr/share/locale/"
486
    elif grep -i "altlinux" "/etc/os-release" &>/dev/null ; then
castro-fidel's avatar
castro-fidel committed
487
        export LIBGL_DRIVERS_PATH="/usr/lib/X11/modules/dri:/usr/lib64/X11/modules/dri"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
488
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
489

castro-fidel's avatar
castro-fidel committed
490
    PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib" 
491
    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
492 493 494 495 496 497

    if [ ! -z ${PATH_TMP} ]
    then export PATH="${PATH_TMP}"
    else export PATH_TMP="${PATH}"
    fi
    if [ ! -z "${PATH}" ]
498 499
    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
500 501 502
    fi

    if [ "${PW_USE_GSTREAMER}" = 1 ] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
503 504 505
        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
506 507 508 509 510 511
        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
512 513 514 515
    else
        var_winedlloverride_update "winegstreamer="
    fi

castro-fidel's avatar
castro-fidel committed
516 517
    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
518
        --unshare-home \
castro-fidel's avatar
castro-fidel committed
519
        --home="${PW_SANDBOX_HOME_PATH}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
520
        --remove-game-overlay \
castro-fidel's avatar
castro-fidel committed
521
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
522
    else
castro-fidel's avatar
castro-fidel committed
523
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
524
        --share-home \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
525
        --remove-game-overlay \
castro-fidel's avatar
castro-fidel committed
526
        ${PW_ADD_TO_ARGS_IN_RUNTIME} --"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
527
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
528

529 530 531 532 533
    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
534
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
535 536
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
537
    # export PRESSURE_VESSEL_GRAPHICS_PROVIDER="/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
538 539

    unset PRESSURE_VESSEL_RUNTIME_ARCHIVE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
540 541
    export PRESSURE_VESSEL_COPY_RUNTIME=1
    export PRESSURE_VESSEL_GC_LEGACY_RUNTIMES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
542
    export PRESSURE_VESSEL_RUNTIME=runtime
castro-fidel's avatar
castro-fidel committed
543 544 545
    export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}"
    export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var"
    export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel"
546
    export FONTCONFIG_PATH=''
Mikhail Tergoev's avatar
Mikhail Tergoev committed
547 548

    unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW
castro-fidel's avatar
castro-fidel committed
549
    for PWRTMRO in ${PW_RT_MOUNT_RO[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
550 551 552 553 554
        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
555
    for PWRTMRW in ${PW_RT_MOUNT_RW[*]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
556 557 558 559 560
        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
561 562

    # drop portable: libssl 32-bit
563
    try_remove_file "${PW_PLUGINS_PATH}/portable/lib/lib32/libssl.so.1.1"
564
    print_info "RUNTIME is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
565 566
}

castro-fidel's avatar
castro-fidel committed
567
pw_mangohud_check () {
568
    if [[ "${PW_MANGOHUD}" == "1" ]] && ! check_gamescope_session ; then
castro-fidel's avatar
castro-fidel committed
569
        export PW_MANGOHUD_SLR='MANGOHUD=1'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
570
        MANGOHUD_LIB_NAME="libMangoHud.so"
castro-fidel's avatar
castro-fidel committed
571
        if [[ "${PW_VULKAN_USE}" = "0" ]] ; then 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
572 573
	        MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:${MANGOHUD_LIB_NAME}"
        fi
castro-fidel's avatar
castro-fidel committed
574 575 576
        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
577
        fi
578
        var_vk_istance_layers_config_update "VK_LAYER_MANGOHUD_overlay64:VK_LAYER_MANGOHUD_overlay32"
579
        print_info "Portable MANGOHUD is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
580
    else
581 582
        export PW_MANGOHUD_SLR=""
        print_info "Portable MANGOHUD is disabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
583 584 585 586
    fi
    return 0
}

castro-fidel's avatar
castro-fidel committed
587 588
pw_vkbasalt_check () {
    if [[ "${ENABLE_VKBASALT}" == 1 ]] && [[ "${PW_VULKAN_USE}" != "0" ]] && [[ "${PW_VULKAN_USE}" != "3" ]] ; then
Arta's avatar
Arta committed
589
        if [[ ! -z "${PW_VKBASALT_EFFECTS}" ]] && [[ ! -z "${PW_VKBASALT_FFX_CAS}" ]] ; then
590 591 592 593
            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
594
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
595
        var_vk_istance_layers_config_update "VK_LAYER_VKBASALT_post_processing64:VK_LAYER_VKBASALT_post_processing32"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
596 597 598 599 600 601 602 603
        print_info "vkBasalt is enabled"
    else
        export DISABLE_VKBASALT=1
        print_info "vkBasalt is disabled"
    fi
    return 0
}

604
regdlloverrides () {
castro-fidel's avatar
castro-fidel committed
605 606 607 608 609 610 611 612 613
    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="" ;;
614
    esac
castro-fidel's avatar
castro-fidel committed
615
    grep 'HKCU,Software\\Wine\\AppDefaults\\'"${PW_DLL_EXE}"'\\DllOverrides,'\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\" "${WINEDIR}/share/wine/wine.inf"
616
    if [[ "$?" != "0" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
617 618
        grep "ProtonOverrides" "${WINEDIR}/share/wine/wine.inf"
        if [[ "$?" == "0" ]] ; then
castro-fidel's avatar
castro-fidel committed
619
            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
620
        else
castro-fidel's avatar
castro-fidel committed
621
            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
622
        fi
623 624 625
    fi
}

626 627 628 629
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
630
    return 0
631
}
632
export -f wait_wineserver
633 634

kill_portwine () {
635
    wine_pids="`ls -l /proc/*/exe 2>/dev/null | grep -ie ${portname} | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}'`"
636
    if  [ ! -z "${wine_pids}" ] ; then
castro-fidel's avatar
castro-fidel committed
637 638 639
        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  
640 641 642
            fi
        done
    fi
643 644
    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
645 646 647
        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
648 649
            fi
        done
650
    fi
651
    return 0
652 653 654
}
export -f kill_portwine

castro-fidel's avatar
castro-fidel committed
655
pw_kill_autostart () {
castro-fidel's avatar
castro-fidel committed
656 657 658 659
    if [[ -z "${2}" ]]
    then SWAIT=5
    else SWAIT="${2}"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
660 661 662
    sleep 5
    
    while true ; do
663
        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
664
            echo -e "PID "$1" not found"
castro-fidel's avatar
castro-fidel committed
665
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
666
        else
castro-fidel's avatar
castro-fidel committed
667
            sleep "${SWAIT}"
668
            if [[ "$3" == please ]]
669
            then kill -s SIGTERM `ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}'`
670 671
            else kill_portwine
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
672 673 674 675
            break
        fi
    done

castro-fidel's avatar
castro-fidel committed
676 677
    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
678
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
679

680
    return 0
681
}
castro-fidel's avatar
castro-fidel committed
682
export -f pw_kill_autostart
683

684
stop_portwine () { 
685 686 687 688 689 690
    [[ "$int_xneur" == "1"  ]] && xneur &
    
    if [[ "$PW_USE_US_LAYOUT" == "1" ]] \
    && [[ "${XDG_SESSION_TYPE}" != "wayland" ]] \
    && command -v setxkbmap &>/dev/null
    then
Boria138's avatar
Boria138 committed
691
        setxkbmap
692
    fi
693

694 695 696 697
    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"
698
    fi
699 700 701 702

    if [[ "${PW_DISABLE_COMPOSITING}" == "1" ]] \
    && ! check_gamescope_session 
    then
Boria138's avatar
Boria138 committed
703 704 705 706 707 708 709 710 711 712
        if [[ "${DESKTOP_SESSION}" =~ "plasma" ]] ; then
            qdbus org.kde.KWin /Compositor resume
        elif [[ "${DESKTOP_SESSION}" =~ "mate" ]] ; then
            gsettings set org.mate.Marco.general compositing-manager true
        elif [[ "${DESKTOP_SESSION}" =~ "xfce" ]] ; then
            xfconf-query -c xfwm4 -p /general/use_compositing -s true
        elif [[ "${DESKTOP_SESSION}" =~ "cinnamon" ]] ; then
            gsettings set org.cinnamon.muffin unredirect-fullscreen-windows false
        fi
    fi
713

castro-fidel's avatar
castro-fidel committed
714
    pw_stop_progress_bar
715 716
    try_remove_file "${PORT_SCRIPTS_PATH}/0"
    try_remove_file "${PORT_SCRIPTS_PATH}/1"
717
    kill_portwine &&
castro-fidel's avatar
castro-fidel committed
718 719
    try_remove_dir "${PW_WINELIB}/var"
    find "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/" -maxdepth 1 -type f -name "*.tmp" -delete
720
    if [[ ! -z "$(pgrep -a yad_v12_3 | grep "\--notification" | awk '{print $1}')" ]] ; then
721
        kill -s SIGUSR1 "`pgrep -a yad_v12_3 | grep "\--notification" | awk '{print $1}'`" 2>/dev/null
722
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
723
    add_in_stop_portwine #&>/dev/null
724
    kill -n 9 `pgrep -a start.sh | grep -i '/PortProton/' | awk '{print $1}'` > /dev/null 2>&1
725
    killall yad_v12_3 &>/dev/null
726
    exit 0
727
}
728
export -f stop_portwine
729

castro-fidel's avatar
castro-fidel committed
730
pw_download_libs () {
731 732
    if [[ ! -e "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \
    || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pv-bwrap" ]]
733
    then
734
        print_info "Download and install libraries..."
735 736
        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
castro-fidel's avatar
castro-fidel committed
737 738
            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"
739 740 741 742
                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
743
                    # TODO: drop clear prefix, and add update prefix from new libs 
744 745
                    pw_clear_pfx
                fi
746
            else
castro-fidel's avatar
castro-fidel committed
747 748
                try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
749
                if yad_error_download
750 751 752 753 754
                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
755 756
            fi
        else
757
            if yad_error_download
758 759 760 761 762
            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
763 764
        fi
    fi
765
    try_remove_dir "${PW_WINELIB}/portable"
766
    return 0
767 768
}

castro-fidel's avatar
castro-fidel committed
769
pw_check_and_download_wine () {
770
    [ ! -d "${PORT_WINE_PATH}/data/dist/" ] && create_new_dir "${PORT_WINE_PATH}/data/dist"
castro-fidel's avatar
castro-fidel committed
771
    if [[ "${PW_WINE_USE}" == "GET-OTHER-WINE" ]] ; then
772 773
        gui_proton_downloader
    fi
774
    if [[ "$PW_WINE_USE" == PROTON_LG ]] 
castro-fidel's avatar
castro-fidel committed
775
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
776
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
777
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
castro-fidel's avatar
castro-fidel committed
778 779 780
    fi
    if [ ! -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ] ; then
        print_info "Download and install ${PW_WINE_USE}..."
781 782
        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
castro-fidel's avatar
castro-fidel committed
783 784 785 786
            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}"
787
            else
castro-fidel's avatar
castro-fidel committed
788 789 790
                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}"
791

792
                yad_error_download && pw_check_and_download_wine || exit 1
793 794
            fi
        else
795
            yad_error_download && pw_check_and_download_wine || exit 1
796 797
        fi
    fi
798
    return 0
799 800
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
801 802 803 804 805
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}"
806 807
            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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
808 809 810 811 812 813
                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}

814
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
815
                fi
816 817
            elif try_download_no_mirror "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
818 819 820 821 822 823
                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}

824
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
825 826
                fi
            else
827
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
828 829 830 831
            fi
        fi
    done

Mikhail Tergoev's avatar
Mikhail Tergoev committed
832
    #Download stable and git version VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
833 834 835
    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}"
836 837
            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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
838 839 840 841 842 843
                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}

844
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
845
                fi
846 847
            elif try_download_no_mirror "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
848 849 850 851 852 853
                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}

854
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
855 856
                fi
            else
857
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
858 859 860
            fi
        fi
    done
861 862 863 864 865 866 867 868 869 870 871

    #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}"

872
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
873 874
            fi
        else
875
            yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
876 877 878
        fi
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
879 880 881
    return 0
}

castro-fidel's avatar
castro-fidel committed
882
pw_check_and_download_plugins () {
883 884 885
    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
886
        print_info "Download and install plugins${PW_PLUGINS_VER}..."
887 888 889 890
        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" 
891 892 893 894 895
                    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
896 897 898 899 900 901 902 903
                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}"  
904
                    fi
905
                fi
906
            else
907
                if yad_error_download
908 909 910 911 912
                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
913 914
            fi
        else
915
            PW_NOTIFY_TEXT="Please wait for update PortProton"
916
            pw_notify_send -u normal 
917 918
            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
919 920 921 922 923 924 925 926 927 928 929 930
                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
931
            fi
932 933
        fi
    fi
934 935 936 937 938
    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"
939
    return 0
940 941
}

942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
check_dirs_and_files_in_pfx () {
        create_new_dir "${WINEPREFIX}/dosdevices"
        create_new_dir "${WINEPREFIX}/drive_c/windows/syswow64/"
        create_new_dir "${WINEPREFIX}/drive_c/windows/system32/"
        create_new_dir "${WINEPREFIX}/drive_c/tmp/.private/$USER/"
        create_new_dir "${WINEPREFIX}/drive_c/tmp/.private/steamuser/"

        [ ! -d "${WINEPREFIX}/dosdevices/c:" ] && try_force_link_dir "${WINEPREFIX}/drive_c/" "${WINEPREFIX}/dosdevices/c:"
        [ ! -d "${WINEPREFIX}/dosdevices/z:" ] && try_force_link_dir "/" "${WINEPREFIX}/dosdevices/z:"
        [ ! -d "${WINEPREFIX}/dosdevices/h:" ] && try_force_link_dir "$HOME" "${WINEPREFIX}/dosdevices/h:"
        
        create_new_dir "${WINEPREFIX}/drive_c/windows/Fonts/"
        LN_FONTS="arialbd.ttf courbd.ttf georgia.ttf micross.ttf msyh.ttf simsun.ttc arial.ttf cour.ttf malgun.ttf msgothic.ttc nirmala.ttf times.ttf"
        for link_font in $LN_FONTS ; do
            if [[ ! -f "${WINEPREFIX}/drive_c/windows/Fonts/${link_font}" ]] ; then
                try_force_link_file "${WINEDIR}/share/fonts/${link_font}" "${WINEPREFIX}/drive_c/windows/Fonts/"
            fi
        done

        create_new_dir "${WINEPREFIX}/drive_c/users/steamuser"
        if [[ ! -d "${WINEPREFIX}/drive_c/users/${USER}" ]]
        then try_force_link_dir "${WINEPREFIX}/drive_c/users/steamuser" "${WINEPREFIX}/drive_c/users/${USER}"
        fi

        create_new_dir "${WINEPREFIX}/drive_c/users/Public/Documents/Steam"
        create_new_dir "${WINEPREFIX}/drive_c/users/steamuser/Documents/Steam"
        if [[ ! -d "${WINEPREFIX}/drive_c/users/steamuser/My Documents" ]]
        then try_force_link_dir "${WINEPREFIX}/drive_c/users/steamuser/Documents" "${WINEPREFIX}/drive_c/users/steamuser/My Documents"
        fi

        create_new_dir "${WINEPREFIX}/drive_c/users/steamuser/AppData/Roaming"
        if [[ ! -d "${WINEPREFIX}/drive_c/users/steamuser/Application Data" ]]
        then try_force_link_dir "${WINEPREFIX}/drive_c/users/steamuser/AppData/Roaming" "${WINEPREFIX}/drive_c/users/steamuser/Application Data"
        fi

        create_new_dir "${WINEPREFIX}/drive_c/users/steamuser/AppData/Local"
        create_new_dir "${WINEPREFIX}/drive_c/users/steamuser/Local Settings"
        if [[ ! -d "${WINEPREFIX}/drive_c/users/steamuser/Local Settings/Application Data" ]]
        then try_force_link_dir "${WINEPREFIX}/drive_c/users/steamuser/AppData/Local" "${WINEPREFIX}/drive_c/users/steamuser/Local Settings/Application Data"
        fi

        find "${WINEPREFIX}/dosdevices" -xtype l -maxdepth 1 2>/dev/null -exec rm {} \;
        rm -f "${WINEPREFIX}/dosdevices/"*::
        DRIVES=(d e f g i j k l m n o p q r s t u v w x y)
        DEF_MOUNT_DIRS=('/media' "/media/$USER" '/mnt' '/run/media' "/run/media/$USER")
        MOUNT_DIRS=($(find "${DEF_MOUNT_DIRS[@]}" -maxdepth 1 -type d 2>/dev/null | sort -u))

        for drive_dir in "${MOUNT_DIRS[@]}" ; do
            if [[ ! "${DEF_MOUNT_DIRS[@]}" =~ "$drive_dir" ]] \
            && ! realpath "${WINEPREFIX}/dosdevices"/*: | grep "$drive_dir" &>/dev/null ; then
                drive_num=0
                while [[ "$drive_num" -lt "${#DRIVES[@]}" ]] ; do
                    drive_path="${WINEPREFIX}/dosdevices/${DRIVES[$drive_num]}:"
                    if [ ! -d "$drive_path" ] ; then
                        ln -sf "$drive_dir" "$drive_path"
                        break
                    else
                        ((drive_num++))
                    fi
                done
            fi
        done
    }

1006
check_nvidia_rtx () {
1007
    if [[ ! -z $(echo "$LSPCI_VGA" | grep -i "nvidia") ]]; then
1008
        # Turing (without nvidia 16XX)
1009
        [[ "$LSPCI_VGA" == *TU[0-9]* ]] && [[ "$LSPCI_VGA" != *TU11[6-7]* ]] && return 0
1010
        # Ampere
1011
        [[ "$LSPCI_VGA" == *GA[0-9]* ]] && return 0
1012
        # Ada_Lovelace
1013
        [[ "$LSPCI_VGA" == *AD[0-9]* ]] || [[ "$LSPCI_VGA" == *2[6-8][0-9]* ]] && return 0
1014 1015 1016 1017
    fi
    return 1
}

castro-fidel's avatar
castro-fidel committed
1018
pw_init_db () {
1019 1020
    if [[ -f "${portwine_exe}" ]] ; then
        export PORTWINE_DB="$(basename "${portwine_exe}" .exe)"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1021
        if [[ -f "${portwine_exe}".ppdb ]] && [[ "${PORTWINE_DB}" != "RiotClientServices" ]] ; then
1022
            export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1023
            . "${PORTWINE_DB_FILE}"
castro-fidel's avatar
castro-fidel committed
1024 1025 1026
            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
1027
            fi
1028 1029 1030
        else
            orig_IFS="$IFS"
            IFS=$'\n'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1031
            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
1032
            if [[ `echo "$PW_FIND_DB_FILE" | wc -l` -gt 1 ]] ; then
1033
                unset ADD_CB_DBFILE
castro-fidel's avatar
castro-fidel committed
1034
                for PW_CHECK_DB_FILE in $PW_FIND_DB_FILE ; do
1035
                    if [[ -z "${ADD_CB_DBFILE}" ]] ; then
1036
                        export ADD_CB_DBFILE="`echo ${PW_CHECK_DB_FILE} | awk -F'/' '{print $NF}'`"
1037
                    else
1038
                        export ADD_CB_DBFILE="`echo ${PW_CHECK_DB_FILE} | awk -F'/' '{print $NF}'`!${ADD_CB_DBFILE}"
1039 1040
                    fi
                done
1041 1042 1043
                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="" \
1044
                --field="DB FILE: :CB" "${ADD_CB_DBFILE}" 2>/dev/null`
1045
                if [[ "$?" == "1" || "$?" == "252" ]] ; then exit 0 ; fi
castro-fidel's avatar
castro-fidel committed
1046 1047
            elif [[ `echo "$PW_FIND_DB_FILE" | wc -l` -eq 1 ]] ; then
                PORTWINE_DB_FILE="${PW_FIND_DB_FILE}"
1048 1049
            fi
            IFS="$orig_IFS"
castro-fidel's avatar
castro-fidel committed
1050 1051
            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
1052
                export PORTWINE_DB_FILE="${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1053 1054 1055 1056
            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
1057
                export PW_PREFIX_NAME=`echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}'`
1058
            fi
1059
        fi
1060
        if [[ -f "${PORTWINE_DB_FILE}" ]] ; then
1061
            . "${PORTWINE_DB_FILE}"
1062

1063
            init_wine_ver && 
1064
            print_info "Use ${PORTWINE_DB_FILE} db file."
1065
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1066
        if [[ -z "${PATH_TO_GAME}" ]] || [[ ! -d "${PATH_TO_GAME}" ]]; then
1067
            export PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"        
1068
        fi
1069

1070
        if [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] && [[ ! -z "${WINE_CPU_TOPOLOGY}" ]] ; then
1071 1072
            export PW_WINE_CPU_TOPOLOGY="${WINE_CPU_TOPOLOGY}"
        fi
1073 1074 1075
        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" ]]
1076 1077 1078 1079
        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
1080

1081 1082 1083 1084
        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"
1085
        fi
1086

1087 1088 1089 1090 1091 1092 1093
        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
1094
        fi
1095
    fi
1096
    [[ "${START_FROM_STEAM}" == 1 ]] && export PW_GUI_DISABLED_CS=1
1097
    [[ "${START_FROM_PP_GUI}" == 1 ]] && export PW_GUI_DISABLED_CS=0 && unset START_FROM_PP_GUI
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1098

1099
    return 0
1100 1101
}

castro-fidel's avatar
castro-fidel committed
1102
pw_port_update () {
1103
    ###SCRIPTS UPDATE###
1104
    if [ ! -f "${PORT_WINE_TMP_PATH}/scripts_ver" ] ; then
1105
        echo "2022" > "${PORT_WINE_TMP_PATH}/scripts_ver"
1106 1107
    fi
    export scripts_install_ver=`cat "${PORT_WINE_TMP_PATH}/scripts_ver" | head -n 1`
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1108
    print_info "Check update..."
1109
    if curl -f -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"
1110 1111 1112 1113 1114
    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
1115
        if curl -f -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"
1116 1117 1118 1119 1120 1121 1122 1123 1124
        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
1125 1126 1127 1128 1129 1130 1131
    [[ ! -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
1132 1133 1134 1135 1136 1137 1138 1139 1140
            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
1141
                curl -s --list-only "${URL_FOR_CHANGELOG}/${PW_CHANGELOG_FILE}" | tee "${PORT_WINE_TMP_PATH}/curent_var_ver"
1142
                CHANGLOG_NEWS=`cat "${PORT_WINE_TMP_PATH}/curent_var_ver" | sed "/Scripts version ${scripts_install_ver}/,$ d" | sed '1,/---/ d' `
1143 1144
                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 \
1145
                --field=":TXT" "${CHANGLOG_NEWS}" \
1146
                --field="   ${scripts_upd3} :CB" "${scripts_upd4}!${scripts_upd5}!${scripts_upd6}" 2>/dev/null`
1147 1148 1149 1150 1151 1152 1153 1154 1155
                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"
1156
                    if try_download_no_mirror "${URL_TO_PW_MASTER}" "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1157 1158 1159 1160 1161 1162
                        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
1163
                            try_remove_dir "${PORT_WINE_PATH}/data/scripts/portwine_db"
1164 1165 1166 1167
                            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"
1168 1169 1170
                            echo "Restarting PP after update..."
                            export SKIP_CHECK_UPDATES=1
                            /usr/bin/env bash -c ${pw_full_command_line[*]} &
1171 1172 1173
                            exit 0
                        fi
                    else
1174
                        yad_error_download && pw_port_update || exit 1
1175 1176 1177 1178
                    fi ;;
                "${scripts_upd5}")
                    echo " " ;;
                "${scripts_upd6}")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1179
                    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
1180
            esac
1181 1182
        fi
    fi
1183
    try_remove_file "${PORT_WINE_TMP_PATH}/curent_var_ver"
1184
    return 0
1185 1186
}

1187
update_winetricks () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1188
    W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
1189 1190 1191 1192 1193
    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
1194
        if try_download_no_mirror "${W_TRX_URL}" "${PORT_WINE_TMP_PATH}/winetricks_new" ; then
1195 1196 1197 1198
            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
1199
    fi
1200 1201 1202
    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
1203
        sed -i 's/w_metadata vcrun2019 dlls \\/w_metadata !dont_use_2019! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
1204
        sed -i 's/w_set_winver win2k3/w_set_winver win7/' "${PORT_WINE_TMP_PATH}/winetricks"
1205
    fi
1206
    return 0
1207 1208 1209
}

edit_db_from_gui () {
1210
    print_info "edit_db_from_gui PORTWINE_DB_FILE=$PORTWINE_DB_FILE"
1211
    for mod_db in $@ ; do
1212 1213 1214 1215 1216 1217
        if ! grep "export ${mod_db}=" "${PORTWINE_DB_FILE}" &>/dev/null
        then echo "export ${mod_db}=\"${!mod_db}\"" >> "${PORTWINE_DB_FILE}"
        elif grep "export ${mod_db}=" "${PORTWINE_DB_FILE}" | grep -v "#" &>/dev/null
        then
            if [[ "$(grep "export ${mod_db}=" "${PORTWINE_DB_FILE}" | grep -v "#")" != "export ${mod_db}=\"${!mod_db}\"" ]]
            then sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/" "${PORTWINE_DB_FILE}"
1218
            fi
1219 1220
        elif [[ "$(grep "export ${mod_db}=" "${PORTWINE_DB_FILE}")" != "export ${mod_db}=${!mod_db}" ]]
        then sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${PORTWINE_DB_FILE}"
1221
        fi
1222
    done
1223
    return 0
1224
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1225

1226 1227
edit_user_conf_from_gui () {
    for mod_db in $@ ; do
1228 1229 1230 1231 1232 1233
        if ! grep "export ${mod_db}=" "${USER_CONF}" &>/dev/null
        then echo "export ${mod_db}=\"${!mod_db}\"" >> "${USER_CONF}"
        elif grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#" &>/dev/null
        then
            if [[ "$(grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#")" != "export ${mod_db}=\"${!mod_db}\"" ]]
            then sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/" "${USER_CONF}"
1234
            fi
1235 1236
        elif [[ "$(grep "export ${mod_db}=" "${USER_CONF}")" != "export ${mod_db}=${!mod_db}" ]]
        then sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${USER_CONF}"
1237 1238 1239 1240 1241
        fi
    done
    return 0
}

castro-fidel's avatar
castro-fidel committed
1242
pw_create_gui_png () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1243 1244 1245 1246 1247
    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
1248
    PW_RESIZE_TO=128
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1249
    try_remove_file "${PORT_WINE_PATH}/data/img/setup.png"
1250 1251 1252
    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"
1253
    if [[ ! -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1254 1255
        try_remove_dir "${PORT_WINE_TMP_PATH}/tmp_img"
        create_new_dir "${PORT_WINE_TMP_PATH}/tmp_img"
1256 1257 1258 1259 1260 1261
        if command -v wrestool &>/dev/null ; then
            wrestool -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" -t14 "$(readlink -f "${portwine_exe}")"
        else
            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}")"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1262
        cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".ico" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
1263 1264 1265 1266 1267 1268 1269 1270 1271
        
        if command -v icotool &>/dev/null ; then
            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"
        else
            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"
        fi
castro-fidel's avatar
castro-fidel committed
1272
        if [[ ! -f "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | grep "${PW_RESIZE_TO}x${PW_RESIZE_TO}")" ]] ; then 
1273 1274 1275 1276 1277 1278
            if command -v icotool &>/dev/null ; then
                icotool -x --output="${PORT_WINE_TMP_PATH}/tmp_img/" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.ico"
            else
                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"
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1279 1280
            cp "$(ls -S -1 "${PORT_WINE_TMP_PATH}/tmp_img/"*".png" | head -n 1)" "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.png"
        else
1281 1282
            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
1283
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1284 1285
        cp -f "${PORT_WINE_TMP_PATH}/tmp_img/${PORTPROTON_NAME}.png" "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png"
    fi
1286 1287 1288 1289
    if [[ -z "`file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}"`" ]] \
    && command -v convert &>/dev/null \
    && [[ -f "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME}.png" ]]
    then
castro-fidel's avatar
castro-fidel committed
1290
        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
1291
    fi
castro-fidel's avatar
castro-fidel committed
1292 1293 1294
    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" 
1295
        else
castro-fidel's avatar
castro-fidel committed
1296
            export PW_ICON_FOR_YAD="${PW_GUI_ICON_PATH}/port_proton.png"
1297
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1298 1299
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1300 1301 1302 1303

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1307 1308 1309
    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
1310 1311 1312 1313
    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
1314 1315 1316

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1320
    OrigIFS="$IFS" && IFS=%
1321
    PW_SET_FIND_EXE="$("${pw_yad_v12_3}" --height="300" --width="1000" --list \
1322
    --text-align=center --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "Create shortcut for..." \
1323
    --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
1324
    YAD_STATUS="$?"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1325
    print_var YAD_STATUS
1326 1327
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
        if [[ -z "${PW_SET_FIND_EXE}" ]] ; then
1328
            export SKIP_CHECK_UPDATES=1
1329
            /usr/bin/env bash -c ${pw_full_command_line[*]} &
1330
            print_info "Restarting..."
1331
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1332 1333
        exit 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1334 1335
    IFS=$OrigIFS

1336
    if [[ ! -z "${PW_SET_FIND_EXE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1337 1338
        portwine_exe="${PW_PATH_FOR_FIND}$(echo "${PW_SET_FIND_EXE}" | awk -F'|' '{print $1}')"
        portwine_create_shortcut silent
1339
        export SKIP_CHECK_UPDATES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1340 1341
        /usr/bin/env bash -c ${pw_full_command_line[*]} &
        exit 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1342
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1343
}
1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362

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
}