You need to sign in or sign up before continuing.
functions_helper 332 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
# shellcheck disable=SC2034
4
########################################################################
Vladislav's avatar
Vladislav committed
5
$PW_DEBUG
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6 7
print_error () { printf "\E[31m%s Error: $@ %s\e[0m\n" ;}
export -f print_error
Mikhail Tergoev's avatar
Mikhail Tergoev committed
8

Mikhail Tergoev's avatar
Mikhail Tergoev committed
9 10
print_warning () { printf "\E[33m%s Warning: $@ %s\e[0m\n" ;}
export -f print_warning
11

Mikhail Tergoev's avatar
Mikhail Tergoev committed
12 13
print_info () { printf "\E[36m%s Info: $@ %s\e[0m\n" ;}
export -f print_info
14

Mikhail Tergoev's avatar
Mikhail Tergoev committed
15 16
print_ok () { printf "\E[35m%s OK: $@ %s\e[0m\n" ;}
export -f print_ok
17

Mikhail Tergoev's avatar
Mikhail Tergoev committed
18 19 20
print_var () { for vp in $@ ; do print_info "${vp}=${!vp}" ; done ;}
export -f print_var

21 22 23 24 25
print_wrapped () {
    local text="$1"
    local a="0"
    local b="$2"

Vladislav's avatar
Vladislav committed
26
    if [[ -n "$3" ]] ; then
27
        if (( ${#text} > b )); then
Vladislav's avatar
Vladislav committed
28
            echo "${text:a:b}${3}"
29 30 31 32 33 34 35 36 37 38 39 40
        else
            echo "$text"
        fi
    else
        while (( a < ${#text} )) ; do
            echo "${text:a:b}"
            ((a+=b))
        done
    fi
}
export -f print_wrapped

Vladislav's avatar
Vladislav committed
41 42
make_acronym () {
    local words acronym i
43
    read -r -a words <<< "$1"
Vladislav's avatar
Vladislav committed
44
    acronym="${words[0]:0:1}"
Vladislav's avatar
Vladislav committed
45
    for ((i=1 ; i<${#words[@]} ; i++)) ; do
Vladislav's avatar
Vladislav committed
46
        acronym+="${words[$i]:0:1}"
Vladislav's avatar
Vladislav committed
47
    done
Vladislav's avatar
Vladislav committed
48
    echo "$acronym"
Vladislav's avatar
Vladislav committed
49
}
Vladislav's avatar
Vladislav committed
50
export -f make_acronym
Vladislav's avatar
Vladislav committed
51

Vladislav's avatar
Vladislav committed
52 53
make_abbreviation () {
    local word abbreviation i
54 55 56
    word=$1
    for (( i=0 ; i<${#word} ; i++ )) ; do
        if [[ ${word:$i:1} =~ ^[A-Z]$ ]] ; then
Vladislav's avatar
Vladislav committed
57
            abbreviation+="${word:$i:1}"
58 59
        fi
    done
Vladislav's avatar
Vladislav committed
60
    echo "$abbreviation"
Vladislav's avatar
Vladislav committed
61 62 63
}
export -f make_abbreviation

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

Vladislav's avatar
Vladislav committed
66 67 68 69
# Эксортирует несколько переменных за один раз (одной командой)
# и создаёт список этих переменных в $keys_all
# К примеру set_several_variables PW_MANGOHUD=1 PW_VKBASALT=0
set_several_variables () {
70 71
    local key value
    unset keys_all
Vladislav's avatar
Vladislav committed
72 73 74
    while (( $# > 0 )) ; do
        key=${1//=*/}
        value=${1//*=/}
75
        keys_all+="$key "
Vladislav's avatar
Vladislav committed
76
        export "$key"="$value" ; shift
77 78 79
    done
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
80
add_to_var () {
81 82
    if ! echo "${!1}" | grep "$2" &>/dev/null
    then export "$1"="${!1} $2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
83
    fi
84 85
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
86
rm_from_var () {
87 88
    if echo "${!1}" | grep "$2" &>/dev/null
    then export "$1"="$(echo "${!1//$2/}" | tr -s " ")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
89
    fi
90 91
}

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
add_to_array () {
    local array_name=$1
    local add_names=${*:2}

    if [[ -v "$array_name" ]] ; then
        for element in $add_names ; do
            eval "$array_name+=($element)"
        done
    else
        print_error "$array_name not found for array"
    fi
}

rm_from_array () {
    local array_name=$1
    local rm_names=${*:2}

    if [[ -v "$array_name" ]] ; then
        local count=0
        eval \
        "for element in \${$array_name[@]} ; do
            if [[ \$rm_names =~ \$element ]] ; then
                unset $array_name[\$count]
                $array_name=(\${$array_name[@]})
            fi
            ((count++))
        done"
    else
        print_error "$array_name not found for array"
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
124 125 126
fatal () {
    print_error "$@"
    exit 1
127 128
}

Boria138's avatar
Boria138 committed
129 130
change_locale () {
    if [[ -f "${PORT_WINE_TMP_PATH}/PortProton_loc" ]] ; then
131
        LANGUAGE=$(<"${PORT_WINE_TMP_PATH}/PortProton_loc")
132

Mikhail Tergoev's avatar
Mikhail Tergoev committed
133 134 135 136 137 138 139 140
        # TODO: drop legacy check language after 01.01.2025
        if [[ "$LANGUAGE" == "RUS" ]] ; then
            LANGUAGE="ru"
            echo "ru" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
        elif [[ "$LANGUAGE" == "ENG" ]] ; then
            LANGUAGE="en"
            echo "en" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
        fi
141 142
    fi

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
    local GAME_LANGUAGE="$LANGUAGE"

    if check_gamescope_session ; then
        LANGUAGE="en"
    else
        [[ ! -f "${pw_yad}" ]] && pw_yad="yad"
        if [[ -z "$LANGUAGE" ]] \
        || [[ "${PW_FORCE_CHANGE_LOC}" == "1" ]] ; then
            SET_LANG=(
                "${pw_yad}" --list
                --window-icon="$PW_GUI_ICON_PATH/portproton.svg"
                --title="Select language for PortProton"
                --column="Language" --column=""
                --width=400 --height=200

                "Russian (Русский)"                     ru
                "English"                               en
                "Spanish (Español・Española)"            es
            )

            out=$("${SET_LANG[@]}")
            if [[ -z $out ]] \
            && [[ -n "$LANGUAGE" ]] ; then
                echo "${LANGUAGE}" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
            elif [[ -z $out ]] ; then
                echo "en" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
            else
                LANGUAGE=$(echo "$out" | cut -d '|' -f2)
                echo "${LANGUAGE}" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
                create_translations
            fi
            unset PW_FORCE_CHANGE_LOC
            restart_pp
Boria138's avatar
Boria138 committed
176 177
        fi
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
178
    export LANGUAGE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
179

180
    case "$GAME_LANGUAGE" in
181
        ru)
182
            check_start_from_steam && export LC_ALL=ru_RU.UTF-8
183
            export FULL_LN="russian"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
184
            export LANGUAGE_GIF="ru"
185 186
            ;;
        es)
187
            check_start_from_steam && export LC_ALL=es_ES.UTF-8
188
            export FULL_LN="spanish"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
189
            export LANGUAGE_GIF="en"
190
            ;;
191
         *)
192
            export FULL_LN="english"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
193
            export LANGUAGE_GIF="en"
194
            export LANGUAGE="en"
195 196
            ;;
    esac
197

Boria138's avatar
Boria138 committed
198 199 200
}
export -f change_locale

Mikhail Tergoev's avatar
Mikhail Tergoev committed
201
generate_pot () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
202
    local FILES_FOR_GETTEXT i
203
    FILES_FOR_GETTEXT=(functions_helper start.sh setup.sh add_in_steam.sh)
204 205 206
    for i in "${FILES_FOR_GETTEXT[@]}" ; do
        sed -e 's/{translations\[/(gettext \"/g' -e 's/]}/")/g' -e 's/eval_translations/gettext/g' \
        "${PORT_SCRIPTS_PATH}/$i" > "${PORT_SCRIPTS_PATH}/${i}_tmp"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
207
    done
208
    #Когда присходит предупреждение: синтаксис $"..." запрещен по соображениям безопасности; используйте eval_gettext
Vladislav's avatar
Vladislav committed
209 210
    #и ругается на строку в которой нет перевода, можно использовать sed -i '//d' и убрать эту строку
    #либо отредактировать сам код, чтобы не было такой ошибки (к примеру вместо двойных ковычек использовать в таком месте одинарные)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
211
    for lang in $LANGUAGES_LIST ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
212
        echo "${lang}"
213
        create_new_dir "${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
214
        LANG_PO="${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/PortProton.po"
215
        #LANG_MO="${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/PortProton.mo"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
216
        TEMPLATE_POT="${PORT_WINE_PATH}/data/locales/PortProton.pot"
Vladislav's avatar
Vladislav committed
217
        pushd "${PORT_WINE_PATH}" 1>/dev/null || fatal
218
        xgettext --no-location --from-code=UTF-8 --language Shell -i \
219 220 221
        "data/scripts/start.sh_tmp" \
        "data/scripts/setup.sh_tmp" \
        "data/scripts/functions_helper_tmp" \
222
        "data/scripts/add_in_steam.sh_tmp" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
223
        -o "$TEMPLATE_POT"
Vladislav's avatar
Vladislav committed
224
        popd 1>/dev/null || fatal
Mikhail Tergoev's avatar
Mikhail Tergoev committed
225 226 227 228 229 230 231
        if [[ -f "$LANG_PO" ]] ; then
            echo "update $LANG_PO file"
            msgmerge --update "$LANG_PO" "$TEMPLATE_POT"
        else
            echo "create $LANG_PO file"
            msginit --input="$TEMPLATE_POT" --locale="${lang}" --output="$LANG_PO"
        fi
232
        #msgfmt --output-file="$LANG_MO" "$LANG_PO"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
233
    done
234 235 236
    try_remove_file "${PORT_SCRIPTS_PATH}/start.sh_tmp"
    try_remove_file "${PORT_SCRIPTS_PATH}/setup.sh_tmp"
    try_remove_file "${PORT_SCRIPTS_PATH}/functions_helper_tmp"
237
    try_remove_file "${PORT_SCRIPTS_PATH}/add_in_steam.sh_tmp"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
238
    try_remove_dir "${PW_CACHE_LANG_PATH}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
239 240
}
export -f generate_pot
Boria138's avatar
Boria138 committed
241

Vladislav's avatar
Vladislav committed
242 243
eval_translations () {
    # Для того чтобы раскрывать переменную уже после создания массива
Vladislav's avatar
Vladislav committed
244
    # Вместо {translations[\$TEST text]} нужно (eval_translations "\$%TEST% text" "TEST=test"), перевод должен быть с %% тоже
Vladislav's avatar
Vladislav committed
245
    # В остальных случаях можно использовать {translations[\$TEST text]} ,но переменную нужно обьявлять до создания массива
Mikhail Tergoev's avatar
Mikhail Tergoev committed
246
    # до source "${PW_CACHE_LANG_PATH}/$LANGUAGE" или можно использовать команды {translations[\$(cat file.txt) text]}
Vladislav's avatar
Vladislav committed
247
    # но тогда выполнение команды будет происходить во время создания массива всегда, а не там где это требуется
Vladislav's avatar
Vladislav committed
248
    echo "${translations[$1]//\$*"%"/${2//*=/}}"
Vladislav's avatar
Vladislav committed
249 250
}

251
create_translations () {
Vladislav's avatar
Vladislav committed
252
    local po_file msgid msgstr
Vladislav's avatar
Vladislav committed
253
    [[ ! -d $PW_CACHE_LANG_PATH ]] && create_new_dir "$PW_CACHE_LANG_PATH"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
254
    cat << EOF > "${PW_CACHE_LANG_PATH}/$LANGUAGE"
255 256 257 258 259
#!/usr/bin/env bash
TRANSLATIONS_VER=$scripts_install_ver
declare -A translations=(
EOF
    if [[ $LANGUAGE == "en" ]] ; then
260
        po_file="${PORT_WINE_PATH}/data/locales/PortProton.pot"
261 262 263 264
    else
        po_file="${PORT_WINE_PATH}/data/locales/$LANGUAGE/LC_MESSAGES/PortProton.po"
    fi

265
    while read -r line ; do
266
        while [[ $line =~ msgid ]] ; do
267 268 269
                unset msgid
                msgid="$line"
                read -r line
270
            while [[ ! $line =~ msgstr ]] ; do
271 272 273
                msgid+="$line"
                read -r line
            done
274
            if [[ $line =~ msgstr ]]; then
275
                if [[ $LANGUAGE == "en" ]] ; then
276 277 278
                    if [[ $msgid == "msgid   \"\"" ]] ; then
                        continue
                    fi
279 280 281 282 283
                    msgstr="$msgid"
                else
                    unset msgstr
                    msgstr="$line"
                    read -r line
284 285
                    while [[ ! $line =~ msgid ]] ; do
                        msgstr+=$line
286
                        read -r line
Vladislav's avatar
Vladislav committed
287
                        if [[ -z $line ]] ; then
288 289
                            break
                        fi
290 291 292
                    done
                fi
            fi
293 294 295 296
        if [[ $LANGUAGE != "en" ]] ; then
            msgstr=${msgstr//"msgstr "/}
            msgid=${msgid//"msgid "/}
        fi
297 298 299 300 301 302 303 304 305 306
        msgstr=${msgstr//" "/-_-}
        msgstr=${msgstr//"\n"\"\"/+_+}
        msgstr=${msgstr//\"\"/}
        msgstr=${msgstr//#*/}
        msgstr=${msgstr//"*"/#_#}
        msgid=${msgid//" "/-_-}
        msgid=${msgid//"\n"\"\"/+_+}
        msgid=${msgid//\"\"/}
        msgid=${msgid//#*/}
        msgid=${msgid//"*"/#_#}
307
        if [[ -n $msgid ]] ; then
308 309 310
            if [[ -z $msgstr ]] ; then
                msgstr="$msgid"
            fi
311 312 313 314
            if [[ $msgid =~ \$ ]] ; then
                msgid=${msgid//\$/\\$}
                if [[ $msgstr =~ \$% ]] ; then
                    msgstr=${msgstr//\$/\\$}
Vladislav's avatar
Vladislav committed
315
                fi
316
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
317
            echo \["$msgid"\]="$msgstr" >> "${PW_CACHE_LANG_PATH}/$LANGUAGE"
318 319 320 321
        fi
        done
    done < "$po_file"

Mikhail Tergoev's avatar
Mikhail Tergoev committed
322 323 324 325
    echo ")" >> "${PW_CACHE_LANG_PATH}/$LANGUAGE"
    sed -i 's/+_+/\n/g' "${PW_CACHE_LANG_PATH}/$LANGUAGE"
    sed -i 's/#_#/\*/g' "${PW_CACHE_LANG_PATH}/$LANGUAGE"
    sed -i 's/-_-/ /g' "${PW_CACHE_LANG_PATH}/$LANGUAGE"
326
    if [[ $LANGUAGE == "en" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
327
        sed -i 's/msgid   //g' "${PW_CACHE_LANG_PATH}/$LANGUAGE"
328
    fi
Vladislav's avatar
Vladislav committed
329
}
330
export -f create_translations
Vladislav's avatar
Vladislav committed
331

332
try_copy_file () {
333 334
    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
335 336 337 338 339 340 341
    elif [[ -L "$2" ]] ; then print_warning "$2 is a file with a symbolic link"
        try_remove_file "$2"
        cp -f "$1" "$2" && return 0 || return 1
    elif [[ -f "$2.sha256sum" ]] ; then print_warning "$2 this file has sha256sum"
        try_remove_file "$2"
        try_remove_file "$2.sha256sum"
        cp -f "$1" "$2" && return 0 || return 1
342
    else
343 344
        [[ -e "$2/$(basename "$1")" ]] && rm -f "$2/$(basename "$1")"
        cp -f "$1" "$2" && return 0 || return 1
345 346
    fi
}
347
export -f try_copy_file
348

349 350 351
try_copy_file_with_checksums () {
    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
352 353 354 355 356 357 358
    elif [[ -L "$2" ]] ; then print_warning "$2 is a file with a symbolic link"
        try_remove_file "$2"
        if cp -f "$1" "$2" ; then
            if [[ "${PW_FILESYSTEM}" == "ext2/ext3" ]] \
            || [[ "${PW_FILESYSTEM}" == "f2fs" ]] \
            || [[ "${PW_FILESYSTEM}" != "btrfs" ]]
            then
359 360
                checksum1="$(sha256sum "$1")"
                echo "${checksum1// */}" > "$2.sha256sum"
361 362 363 364 365
            fi
            return 0
        else
            return 1
        fi
366 367 368 369 370
    else
        if [[ "${PW_FILESYSTEM}" == "ext2/ext3" ]] \
        || [[ "${PW_FILESYSTEM}" == "f2fs" ]] \
        || [[ "${PW_FILESYSTEM}" != "btrfs" ]]
        then
371
            checksum1="$(sha256sum "$1")"
372
            if [[ ! -f "$2" ]] ; then
373
                if cp -f "$1" "$2" ; then
374
                    echo "${checksum1// */}" > "$2.sha256sum"
375 376 377 378
                    return 0
                else
                    return 1
                fi
379 380
            else
                if [[ ! -f "$2.sha256sum" ]] ; then
381 382
                    checksum2="$(sha256sum "$2")"
                    echo "${checksum2// */}" > "$2.sha256sum"
383
                else
384
                    checksum2="$(<"$2.sha256sum")"
385 386
                fi
            fi
387
            if [[ "${checksum1// */}" == "${checksum2// */}" ]] ; then
388 389
                return 0
            else
390 391
                try_remove_file "$2"
                if cp -f "$1" "$2" ; then
392
                    echo "${checksum1// */}" > "$2.sha256sum"
393 394 395 396
                    return 0
                else
                    return 1
                fi
397 398 399 400 401 402 403 404 405
            fi
        else
            [[ -e "$2/$(basename "$1")" ]] && rm -f "$2/$(basename "$1")"
            cp -f "$1" "$2" && return 0 || return 1
        fi
    fi
}
export -f try_copy_file_with_checksums

Vladislav's avatar
Vladislav committed
406
lsbash () {
Vladislav's avatar
Vladislav committed
407
    local grep_with_i grep_with_v find_name directory find_file found_successfully find_file_old find_file_old_array
Vladislav's avatar
Vladislav committed
408 409
    if [[ $1 =~ \/ ]] ; then
        directory=$1 ; shift
410
    else
Vladislav's avatar
Vladislav committed
411
        directory=$PWD
412
    fi
Vladislav's avatar
Vladislav committed
413
    grep_find_file1 () {
Vladislav's avatar
Vladislav committed
414
        find_file_old=$find_file
415 416 417 418
        if [[ $grep_with_i == true ]] ; then
            find_file=${find_file,,}
            find_name=${find_name,,}
        fi
Vladislav's avatar
Vladislav committed
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
        grep_find_file2 () {
            if [[ -z $1 ]] ; then
                echo "$find_file_old"
                found_successfully=1
            else
                find_file_old_array+=("$find_file_old")
            fi
        }
        if [[ $grep_with_v == true ]] ; then
            if [[ ! $find_file =~ $find_name ]] ; then
                grep_find_file2 "$@"
            fi
        else
            if [[ $find_file =~ $find_name ]] \
            || [[ -z $find_name ]] ; then
                grep_find_file2 "$@"
            fi
        fi
    }
    while true ; do
        unset grep_with_i grep_with_v
        if [[ $1 == --grep ]] ; then
            shift
            while true ; do
                # аналог grep -i
                if [[ $1 == "-i" ]] ; then
                    grep_with_i=true ; shift ; continue
                fi
                # аналог grep -v
                if [[ $1 == "-v" ]] ; then
                    grep_with_v=true ; shift ; continue
                fi
                find_name=$1 ; shift ; break
            done
453
        fi
Vladislav's avatar
Vladislav committed
454 455 456 457 458 459 460 461 462 463 464 465
        if [[ -n ${find_file_old_array[0]} ]] ; then
            for find_file in "${find_file_old_array[@]}" ; do
                unset find_file_old_array
                grep_find_file1 "$@"
            done
        else
            for find_file in "$directory"/* ; do
                find_file=${find_file//*\//}
                grep_find_file1 "$@"
            done
        fi
        if [[ -n $1 ]] ; then continue ; else break ; fi
466 467 468 469 470 471 472 473
    done
    if [[ $found_successfully == 1 ]] ; then
        return 0
    else
        return 1
    fi
}

474
try_copy_dir () {
475 476
    if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for copy"
    elif [[ -z "$2" ]] ; then print_error "no way to copy directory $1"
477
    else
478
        cp -fr "$1" "$2" && return 0 || print_error "failed to copy directory $1 to $2" && return 1
479 480
    fi
}
481
export -f try_copy_dir
482 483

try_remove_file () {
484
    if [[ -f "$1" ]] || [[ ! -e "$1" ]] ; then
485
        rm -f "$1" && return 0
486 487
    fi
}
488
export -f try_remove_file
489 490

try_remove_dir () {
491
    if [[ -d "$1" ]] ; then
492
        rm -fr "$1" && return 0
493 494
    fi
}
495
export -f try_remove_dir
496

497
create_new_dir () {
498
    if [[ ! -d "$1" ]] ; then
499
        mkdir -p "$1" || return 1
500 501 502 503
    fi
    return 0
}

504
try_force_link_file () {
505 506 507 508 509 510 511
    if [[ ! -f "$1" ]] ; then
        print_warning "file not found for link: $1"
        if [[ -f "$2" ]] ; then
            try_remove_file "$2"
            print_warning "removed old link: $2"
        fi
        return 1
512 513 514 515 516 517
    elif [[ -z "$2" ]] ; then print_error "no way to link file $1" && return 1
    elif [[ -f "$2.sha256sum" ]] ; then print_warning "$2 this file has sha256sum"
        try_remove_file "$2"
        try_remove_file "$2.sha256sum"
        ln -s -f -r "$1" "$2"
        return 0
518
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
519
        try_remove_file "$2"
520
        ln -s -f -r "$1" "$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
521
        return 0
522 523 524
    fi
    return 1
}
525
export -f try_force_link_file
526

527
check_symlink () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
528
    CHK_SYMLINK_FILE="$(file "$1")"
529
    if [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep -v "broken" | grep "symbolic link to" | awk '{print $1}')" ]] ; then
530
        return 0
531
    elif [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep "broken symbolic link to" | awk '{print $1}')" ]] ; then
532 533
        print_error "remove broken symlink: $CHK_SYMLINK_FILE"
        rm -fr "$CHK_SYMLINK_FILE"
534 535 536 537 538
        return 1
    else
        return 1
    fi
}
539
export -f check_symlink
540

541
try_force_link_dir () {
542 543
    if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for link"
    elif [[ -z "$2" ]] ; then print_error "no way to link directory $1"
544
    else
545
        if ln -s -f -r "$1" "$2" ; then
546 547 548 549 550
            return 0
        else
            print_error "failed to link directory $1 to $2"
            return 1
        fi
551 552
    fi
}
553
export -f try_force_link_dir
554

555
check_process () {
556
    [[ -z "$(ps cax | grep "$1" | awk '{print $1}')" ]] && return 0 || return 1
557
}
558
export -f check_process
559

Mikhail Tergoev's avatar
Mikhail Tergoev committed
560
try_check_sha256sum () {
561 562 563 564
    if [[ "$no_mirror" == true ]] ; then
        print_ok "Used no_mirror downloading. Skipping check sha256sum."
        return 0
    fi
565
    SHA256SUM_EXT=$(curl --silent -L "${1//.tar*/}.sha256sum" | awk '{print $1}')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
    if [[ ${#SHA256SUM_EXT} == 64 ]] ; then
        SHA256SUM_INT=$(sha256sum "$dest" | awk '{print $1}')
        if [[ "$SHA256SUM_EXT" == "$SHA256SUM_INT" ]] ; then
            print_ok "Verification sha256sum was successfully."
            return 0
        else
            print_error "Verification sha256sum was failed."
            return 1
        fi
    else
        print_warning "sha256sum not found for $(basename "$dest") on server. Skip it."
        return 0
    fi
}

581
try_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
582
    export dest="$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
583
    local silent="false"
584
    export no_mirror="false"
585

Mikhail Tergoev's avatar
Mikhail Tergoev committed
586
    case "$3" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
587
           silent)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
588 589 590 591 592
                silent=true ;;
        no_mirror)
                no_mirror=true
    esac

Vladislav's avatar
Vladislav committed
593
    local filename
Mikhail Tergoev's avatar
Mikhail Tergoev committed
594
    if [[ -n "${PW_AUTOINSTALL_EXE}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
595 596
    && [[ "$no_mirror" == "true" ]]
    then
597
        filename="${PW_AUTOINSTALL_EXE//*\//}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
598
    else
Vladislav's avatar
Vladislav committed
599
        filename="$(basename "$1")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
600 601
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
602
    if [[ "${MIRROR}" == CLOUD ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
603 604
    && [[ "$no_mirror" != "true" ]]
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
605
        FIRST_URL=("$url_cloud/$filename")
606
        read -r -a SECOND_URL <<< "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
607
    else
608
        read -r -a FIRST_URL <<< "$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
609
        SECOND_URL=("$url_cloud/$filename")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
610 611
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
612
    [[ ! -f "${pw_yad}" ]] && local pw_yad="yad"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
613 614

    # If gamescope session is active, use PW_TERM for downloading
615
    if check_gamescope_session ; then
616
        $PW_TERM "echo ; echo ; echo \"Downloading: $filename. Please wait...\" \
617
        ; curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
618
        -H 'Pragma: no-cache' -L ${FIRST_URL[*]} -o \"$dest\""
619
        [[ "$?" != 0 ]] && return 1 || return 0
620
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
621 622

    # Normal download
Mikhail Tergoev's avatar
Mikhail Tergoev committed
623
    print_info "Download $filename from ${FIRST_URL[0]}..."
624
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
625
    if [[ "$silent" == "true" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
626
        curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
627
        -H 'Pragma: no-cache' -L "${FIRST_URL[@]}" -o "$dest" 2>&1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
628 629
    else
        curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
630
        -H 'Pragma: no-cache' -L "${FIRST_URL[@]}" -o "$dest" 2>&1 | \
631 632
        tr '\r' '\n' | sed -ur 's|[# ]+||g;s|100||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
        "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
633
        --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
634
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
635
    fi
636

Mikhail Tergoev's avatar
Mikhail Tergoev committed
637
    if [[ "${PIPESTATUS[0]}" != 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
638
        if [[ "$no_mirror" != "true" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
639
            print_warning "Failed download $filename from ${FIRST_URL[0]}, trying mirror: ${SECOND_URL[0]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
640
            curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
641
            -H 'Pragma: no-cache' -L "${SECOND_URL[@]}" -o "$dest" 2>&1 | \
642 643
            tr '\r' '\n' | sed -ur 's|[# ]+||g;s|100||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
            "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
644
            --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
645
            --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
646
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
647 648 649 650
        if [[ "${PIPESTATUS[0]}" != 0 ]] ; then
            print_error "Failed to download $filename from mirror. Skipping..."
            return 1
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
651
            print_ok "File downloaded successfully: $filename from ${SECOND_URL[0]}"
652
            if try_check_sha256sum "${SECOND_URL[@]}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
653 654 655 656 657
                return 0
            else
                try_remove_file "$dest"
                return 1
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
658
        fi
659
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
660
    print_ok "File downloaded successfully: $filename from ${FIRST_URL[0]}"
661
    if try_check_sha256sum "${FIRST_URL[@]}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
662 663 664 665 666
        return 0
    else
        try_remove_file "$dest"
        return 1
    fi
667 668 669
}

var_winedlloverride_update () {
670
    if [[ "$WINEDLLOVERRIDES" ]]
671 672
    then export WINEDLLOVERRIDES="$1;$WINEDLLOVERRIDES"
    else export WINEDLLOVERRIDES="$1"
673
    fi
674
    return 0
675 676 677
}

var_vkd3d_config_update () {
678 679 680
    if echo "$VKD3D_CONFIG" | grep "$1"
    then return 0
    elif [[ "$VKD3D_CONFIG" ]]
681 682
    then export VKD3D_CONFIG="$1;$VKD3D_CONFIG"
    else export VKD3D_CONFIG="$1"
683
    fi
684
    return 0
685 686
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
687
var_radv_perftest_config_update () {
688 689 690
    if echo "$RADV_PERFTEST" | grep "$1"
    then return 0
    elif [[ "$RADV_PERFTEST" ]]
691 692
    then export RADV_PERFTEST="$1;$RADV_PERFTEST"
    else export RADV_PERFTEST="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
693 694 695 696
    fi
    return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
697
var_pw_vk_istance_layers_config_update () {
698 699 700
    if echo "$PW_VK_INSTANCE_LAYERS" | grep "$1"
    then return 0
    elif [[ "$PW_VK_INSTANCE_LAYERS" ]]
701 702
    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
703 704 705 706
    fi
    return 0
}

707
var_ld_library_path_update () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
708 709
    if echo "$LD_LIBRARY_PATH" | grep "$1"
    then return 0
710
    elif [[ "$LD_LIBRARY_PATH" ]]
711 712
    then export LD_LIBRARY_PATH="$1:$LD_LIBRARY_PATH"
    else export LD_LIBRARY_PATH="$1"
713 714 715 716
    fi
    return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
717
# GUI NOTIFY SEND
718
pw_notify_send () {
719
    if command -v gdbus &>/dev/null ; then
Vladislav's avatar
Vladislav committed
720 721 722 723
        local icon title body app timeout OPTIND
        app="PortProton"
        timeout="5000"
        OPTIND="1"
724 725
        while getopts a:i:t: opt ; do
            case "$opt" in
726
                a)
Vladislav's avatar
Vladislav committed
727
                    app=$OPTARG
728
                    ;;
729
                i)
730 731 732 733 734
                    case "$OPTARG" in
                        info) local OPTARG="${PORT_WINE_PATH}/data/img/gui/notify_info.svg";;
                        warning) local OPTARG="${PORT_WINE_PATH}/data/img/gui/notify_warning.svg";;
                        error) local OPTARG="${PORT_WINE_PATH}/data/img/gui/notify_error.svg";;
                    esac
Vladislav's avatar
Vladislav committed
735
                    icon=$OPTARG
736
                    ;;
737
                t)
Vladislav's avatar
Vladislav committed
738
                    timeout=$OPTARG
739
                    ;;
740
                *)
741 742 743 744 745 746 747 748 749 750
                    echo "usage: $0
                    [-a] name application (PortProton default)
                    [-i] info, warning, error (none default)
                    [-t] timeout in ms (5000 default)" >&2
                    return 1
                    ;;
            esac
        done
        shift $(( OPTIND - 1 ))
        [[ "$1" == "--" ]] && shift
Vladislav's avatar
Vladislav committed
751 752
        title="$1" ; shift
        body="$*"
753 754 755 756 757 758

        gdbus call --session --dest org.freedesktop.Notifications \
            --object-path /org/freedesktop/Notifications \
            --method org.freedesktop.Notifications.Notify \
            "$app" 0 "$icon" "$title" "$body" "[]" "{}" "$timeout" &>/dev/null
        return 0
759 760
    fi
}
761
export -f pw_notify_send
762

763 764 765 766 767 768 769
check_start_from_steam () {
    if [[ "${START_FROM_STEAM}" == 1 ]]
    then return 0
    else return 1
    fi
}

770
check_gamescope_session () {
771
    if [[ -n "$GAMESCOPE_IN_USE" ]]
772 773 774 775 776 777 778 779
    then [[ "$GAMESCOPE_IN_USE" == 1 ]] && return 0 || return 1
    fi
    if echo "${DESKTOP_SESSION}" | grep -i "gamescope" &>/dev/null ; then
        export GAMESCOPE_IN_USE=1
        return 0
    else
        export GAMESCOPE_IN_USE=0
        return 1
780 781 782
    fi
}

783
check_wayland_session () {
784
    if [[ -n "$WAYLAND_IN_USE" ]]
785 786 787 788 789 790 791 792 793 794
    then [[ "$WAYLAND_IN_USE" == 1 ]] && return 0 || return 1
    fi
    if echo "${XDG_SESSION_TYPE}" | grep -i "wayland" &>/dev/null ; then
        export WAYLAND_IN_USE=1
        return 0
    else
        export WAYLAND_IN_USE=0
        return 1
    fi
}
795
export -f check_wayland_session
796

Mikhail Tergoev's avatar
Mikhail Tergoev committed
797
check_flatpak () {
798
    if [[ -n "$FLATPAK_IN_USE" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
799 800 801 802
    then [[ "$FLATPAK_IN_USE" == 1 ]] && return 0 || return 1
    fi
    if grep -i "flatpak" /etc/os-release &>/dev/null ; then
        export FLATPAK_IN_USE=1
803 804 805
        if grep -i "Alpine Linux" "/run/host/etc/os-release" &>/dev/null ; then
            export ALPINE_FP=1
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
806 807 808 809 810 811
        return 0
    else
        export FLATPAK_IN_USE=0
        return 1
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
812
export -f check_flatpak
Mikhail Tergoev's avatar
Mikhail Tergoev committed
813

Vladislav's avatar
Vladislav committed
814 815 816 817 818 819 820 821 822 823 824 825 826 827 828
check_selinux () {
    if [[ -n "$SELINUX_IN_USE" ]]
    then [[ "$SELINUX_IN_USE" == 1 ]] && return 0 || return 1
    fi
    if check_flatpak ; then
        if grep -i ^"SELINUX=enforcing" /run/host/etc/selinux/config &>/dev/null ; then
            export SELINUX_IN_USE=1
            return 0
        fi
    else
        if grep -i ^"SELINUX=enforcing" /etc/selinux/config &>/dev/null ; then
            export SELINUX_IN_USE=1
            return 0
        fi
    fi
829 830
    export SELINUX_IN_USE=0
    return 1
Vladislav's avatar
Vladislav committed
831 832 833
}
export -f check_selinux

834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
check_vendor_gpu () {
    unset VENDOR_GPU_USE
    if [[ $PW_GPU_USE != disabled ]] ; then
        case "${PW_GPU_USE,,}" in
            *nvidia*)
                [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia")
                [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau")
            ;;
            *amd*)
                [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd")
            ;;
            *intel*)
                [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel")
            ;;
        esac
    fi

    if command -v glxinfo &>/dev/null ; then
        if [[ ! -f "${PW_TMPFS_PATH}/glxinfo.tmp" ]] ; then
            glxinfo -B &> "${PW_TMPFS_PATH}/glxinfo.tmp"
        fi
        case "$(<"${PW_TMPFS_PATH}/glxinfo.tmp" tr '[:upper:]' '[:lower:]')" in
            *nvidia*)
                [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia")
                [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau")
            ;;
            *amd*)
                [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd")
            ;;
            *intel*)
                [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel")
            ;;
        esac
    fi

    if [[ -z ${VENDOR_GPU_USE[0]} ]] ; then
        [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia")
        [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau")
        [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd")
        [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel")
    fi

    echo "${VENDOR_GPU_USE[*]}"
}

Vladislav's avatar
Vladislav committed
879
background_pid () {
880 881 882 883
    local arg1 arg2 arg3 PID
    arg1=$1 # --start или --end
    arg2=$2 # Название команды
    arg3=$3 # Номер процесса (1,2,3..)
Vladislav's avatar
Vladislav committed
884

885
    if [[ "$START_FROM_STEAM" == 1 ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
886
    || [[ "$PW_GUI_DISABLED_CS" == 1 ]] \
887 888 889 890 891 892 893 894 895 896 897 898
    || [[ -n "$PW_DEBUG" ]] ; then
        case $arg1 in
            --start) eval "$arg2" ;;
            --end) : ;;
        esac
    else
        get_bg_pid () {
            eval "echo \${$1}"
        }
        case $arg1 in
            --start)
                eval "$arg2 &"
899
                PID=$!
900 901
                export bg_pid"${arg3}"="$PID" ;;
            --end)
902
                PID=$(get_bg_pid bg_pid"${arg3}")
Vladislav's avatar
Vladislav committed
903 904
                [[ -z $PID ]] && return 1
                wait "$PID" 2>/dev/null && return 0 ;;
905
        esac
Vladislav's avatar
Vladislav committed
906 907 908 909
    fi
}
export -f background_pid

910 911
unpack () {
    case $1 in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
912 913 914 915
         *.tar.xz) local command="tar -Jxhf";;
         *.tar.gz) local command="tar -xhzf" ;;
        *.tar.zst) local command="tar -I zstd -xhf" ;;
            *.tar) local command="tar -xhf" ;;
916
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
917

918
    case $3 in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
919
        silent) local silent=true ;;
920
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
921

922 923
    # If gamescope session is active, use PW_TERM for unpack
    if check_gamescope_session ; then
924
        $PW_TERM "echo ; echo ; echo \"Unpacking file: $1. Please wait...\" ; $command \"$1\" -C \"$2\""
925
        [[ "$?" != 0 ]] && return 1 || return 0
926
    elif [[ "$silent" != "true" ]] ; then
927
        set -o pipefail
928
        pw_start_progress_bar_cover "${COVERS_PATH}/unpacking_${LANGUAGE_GIF}.gif" --block
929
        $command "$1" -C "$2" 2>/dev/null
930
        pw_stop_progress_bar
931
        [[ "${PIPESTATUS[0]}" != 0 ]] && print_error "File $1 unpacking error." && return 1 || return 0
932 933
    else
        $command "$1" -C "$2" && return 0 || return 1
934
    fi
935 936
}

937 938 939
debug_timer () {
    if [[ "$1" == "--start" ]] ; then
        START=$(date +%s%N)
Vladislav's avatar
Vladislav committed
940 941 942 943 944 945 946 947
        if [[ "$2" == "-s" ]] ; then
            case $3 in
                PW_TIME_IN_GAME)
                    START_PW_TIME_IN_GAME=$START ;;
                UPDATE_ETERFUND)
                    START_UPDATE_ETERFUND=$START ;;
                UPDATE_GITHUB)
                    START_UPDATE_GITHUB=$START ;;
948 949
                UPDATE_PP_GITEA)
                    START_UPDATE_PP_GITEA=$START ;;
Vladislav's avatar
Vladislav committed
950 951
            esac
        fi
952 953
    elif [[ "$1" == "--end" ]] ; then
        END=$(date +%s%N)
Vladislav's avatar
Vladislav committed
954
        if [[ -n "$2" ]] ; then
Vladislav's avatar
Vladislav committed
955
            if [[ "$2" == "-s" ]] ; then
Vladislav's avatar
Vladislav committed
956 957 958 959 960 961 962
                case $3 in
                    PW_TIME_IN_GAME)
                        START=$START_PW_TIME_IN_GAME ;;
                    UPDATE_ETERFUND)
                        START=$START_UPDATE_ETERFUND ;;
                    UPDATE_GITHUB)
                        START=$START_UPDATE_GITHUB ;;
963 964
                    UPDATE_PP_GITEA)
                        START=$START_UPDATE_PP_GITEA ;;
Vladislav's avatar
Vladislav committed
965 966
                esac
                export "$3"="$((( END - START )/1000000 ))"
Vladislav's avatar
Vladislav committed
967 968
            else
                DIFF=$((( END - START )/1000000 ))
969 970
                print_warning "It took $DIFF milliseconds for $2"
            fi
Vladislav's avatar
Vladislav committed
971
        else
Vladislav's avatar
Vladislav committed
972
            DIFF=$((( END - START )/1000000 ))
Vladislav's avatar
Vladislav committed
973 974
            print_warning "It took $DIFF milliseconds"
        fi
975
    fi
976 977
}

Vladislav's avatar
Vladislav committed
978 979
# Поиск нужного .desktop файла по $portwine_exe (для показа в комментариях нужного времени)
# Параллельное создание базы по времени после завершения приложения
980
search_desktop_file () {
Vladislav's avatar
Vladislav committed
981
    local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND
982 983 984 985 986
    if [[ -z $FILE_SHA256SUM ]] ; then
        read -r -a FILE_SHA256SUM_ARRAY < <(sha256sum "$portwine_exe")
        FILE_SHA256SUM=${FILE_SHA256SUM_ARRAY[0]}
        edit_db_from_gui FILE_SHA256SUM
    fi
Vladislav's avatar
Vladislav committed
987 988
    for desktop_file in "$PORT_WINE_PATH"/* ; do
        desktop_file_new="${desktop_file//"$PORT_WINE_PATH/"/}"
Vladislav's avatar
Vladislav committed
989
        if [[ $desktop_file_new =~ .desktop$ ]] ; then
Vladislav's avatar
Vladislav committed
990
            if [[ ! $desktop_file_new =~ (PortProton|readme) ]] ; then
991
                while read -r line1 ; do
Vladislav's avatar
Vladislav committed
992
                    if [[ $line1 =~ ^Exec= ]] ; then
993
                        if check_flatpak ; then
Vladislav's avatar
Vladislav committed
994
                            EXEC_DESKTOP=${line1//Exec=flatpak run ru.linux_gaming.PortProton /}
995
                        else
Vladislav's avatar
Vladislav committed
996
                            EXEC_DESKTOP=${line1//Exec=env \"$PORT_SCRIPTS_PATH\/start.sh\" /}
997 998 999
                        fi
                    fi
                done < "$desktop_file"
Vladislav's avatar
Vladislav committed
1000
                if [[ $portwine_exe == "${EXEC_DESKTOP//\"/}" ]] ; then
1001
                    DESKTOP_CORRECT_FILE="$desktop_file"
Vladislav's avatar
Vladislav committed
1002
                    break
Vladislav's avatar
Vladislav committed
1003
                fi
1004 1005 1006
            fi
        fi
    done
Vladislav's avatar
Vladislav committed
1007
    if [[ $DESKTOP_WITH_TIME == enabled ]] || [[ $SORT_WITH_TIME == enabled ]] ; then
1008
        while read -r -a line2 ; do
Vladislav's avatar
Vladislav committed
1009
            if [[ -z ${line2[0]} ]] \
Vladislav's avatar
Vladislav committed
1010
            || [[ ! ${line2[0],,} =~ .(bat|exe|msi|reg)$ ]] ; then
Vladislav's avatar
Vladislav committed
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
                BROKEN_LINE=1
                break
            fi
            if [[ ${line2[1]} == "$FILE_SHA256SUM" ]] ; then
                FILE_SHA256SUM_FOUND=1
                break
            fi
            if [[ ${line2[1]} != "$FILE_SHA256SUM" ]] \
            && [[ ${line2[0]} == "${portwine_exe// /#@_@#}" ]] ; then
                FILE_SHA256SUM_NOT_FOUND=1
                break
            fi
        done < "$PORT_WINE_TMP_PATH/statistics"
    fi
Vladislav's avatar
Vladislav committed
1025 1026 1027 1028 1029
    if [[ $DESKTOP_WITH_TIME == enabled ]] || [[ $SORT_WITH_TIME == enabled ]] ; then
        local line3 line4 count_line i TIME_TOTAL SKIP_REPAIR
        ## Ремонты:
        # Ремонт, проверяет чтобы длинна хеш суммы была равна 64 символам, в ином случае удалит битые
        if [[ $FILE_SHA256SUM_NOT_FOUND == 1 ]] && [[ ${#line2[1]} != "64" ]] ; then
1030
            while read -r -a line3 ; do
Vladislav's avatar
Vladislav committed
1031 1032 1033 1034 1035 1036
                if [[ ${#line3[1]} == "64" ]]
                then echo "${line3[*]}"
                fi
            done < "$PORT_WINE_TMP_PATH/statistics" > "$PORT_WINE_TMP_PATH/statistics_repair"
            try_remove_file "$PORT_WINE_TMP_PATH/statistics"
            mv -f "$PORT_WINE_TMP_PATH/statistics_repair" "$PORT_WINE_TMP_PATH/statistics"
1037
            return 1
Vladislav's avatar
Vladislav committed
1038
        fi
1039

Vladislav's avatar
Vladislav committed
1040 1041
        # Ремонт, если есть пустые строки и непонятные строки без .exe, .bat, .msi, .reg
        if [[ $BROKEN_LINE == 1 ]] ; then
1042
            while read -r -a line4 ; do
Vladislav's avatar
Vladislav committed
1043
                if [[ -n ${line4[0]} ]] && [[ ${line4[0],,} =~ .(bat|exe|msi|reg)$ ]]
Vladislav's avatar
Vladislav committed
1044 1045 1046 1047 1048
                then echo "${line4[*]}"
                fi
            done < "$PORT_WINE_TMP_PATH/statistics" > "$PORT_WINE_TMP_PATH/statistics_repair"
            try_remove_file "$PORT_WINE_TMP_PATH/statistics"
            mv -f "$PORT_WINE_TMP_PATH/statistics_repair" "$PORT_WINE_TMP_PATH/statistics"
1049
            return 1
Vladislav's avatar
Vladislav committed
1050
        fi
1051

Vladislav's avatar
Vladislav committed
1052 1053 1054 1055 1056
        # Ремонтирует путь на новый, если вдруг путь до .exe файла битый или изменился, но .exe файл он опознал
        if [[ $FILE_SHA256SUM_FOUND == 1 ]] && [[ ${line2[0]} != "${portwine_exe// /#@_@#}" ]] ; then
            sed -i "s|${line2[0]} ${line2[1]}|${portwine_exe// /#@_@#} ${line2[1]}|" "$PORT_WINE_TMP_PATH/statistics"
            line2[0]=${portwine_exe// /#@_@#}
        fi
1057

Vladislav's avatar
Vladislav committed
1058 1059 1060 1061 1062
        # Ремонт, если sha256sum изменилась, но путь до .exe тот же
        if [[ $FILE_SHA256SUM_NOT_FOUND == 1 ]] ; then
            sed -i "s|${line2[0]} ${line2[1]}|${line2[0]} $FILE_SHA256SUM|" "$PORT_WINE_TMP_PATH/statistics"
            line2[1]=$FILE_SHA256SUM
        fi
1063

Vladislav's avatar
Vladislav committed
1064 1065 1066
        # Когда приложения ещё нет в статистике
        [[ -z ${line2[2]} ]] && line2[2]=0
        # Ремонт, если сломалось время
Vladislav's avatar
Vladislav committed
1067
        if (( line2[2] >= 999999999 )) ; then
Vladislav's avatar
Vladislav committed
1068 1069
            sed -i "s|${line2[1]} ${line2[2]}|${line2[1]} 0|" "$PORT_WINE_TMP_PATH/statistics"
            line2[2]=0
Vladislav's avatar
Vladislav committed
1070
        fi
Vladislav's avatar
Vladislav committed
1071 1072 1073
        # Ремонт, если кто-то сломал время
        if [[ ! ${line2[2]} =~ ^[0-9]+$ ]] ; then
            sed -i "/${line2[1]}/d" "$PORT_WINE_TMP_PATH/statistics"
1074
            return 1
Vladislav's avatar
Vladislav committed
1075 1076 1077 1078
        fi

        ###############################
        # Общее проведённое время в секундах
Vladislav's avatar
Vladislav committed
1079
        export TIME_CURRENT=${line2[2]}
Vladislav's avatar
Vladislav committed
1080 1081 1082
        # количество запусков приложения
        export COUNT_STARTS=${line2[4]//L4-/}
        ###############################
1083

Vladislav's avatar
Vladislav committed
1084 1085 1086 1087 1088 1089 1090
        # Проверка новых десктоп файлов, чтобы их можно было сортировать первыми при первом создании в главном меню + ремонт
        if [[ $PW_NEW_DESKTOP == 1 ]] && [[ ${line2[3]} != NEW_DESKTOP ]] ; then
            if [[ $FILE_SHA256SUM_FOUND == 1 ]] ; then
                sed -i "s|${line2[1]} \(.*\) ${line2[3]}|${line2[1]} \1 NEW_DESKTOP|" "$PORT_WINE_TMP_PATH/statistics"
            else
                echo "${portwine_exe// /#@_@#} $FILE_SHA256SUM $TIME_CURRENT NEW_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics"
            fi
Vladislav's avatar
Vladislav committed
1091
        fi
Vladislav's avatar
Vladislav committed
1092 1093 1094 1095 1096 1097 1098 1099
        unset PW_NEW_DESKTOP

        # Когда приложение было запущено и завершено
        if [[ -n $PW_TIME_IN_GAME ]] ; then
            TIME_TOTAL=$(( TIME_CURRENT + PW_TIME_IN_GAME ))
            if [[ $FILE_SHA256SUM_FOUND == 1 ]] ; then
                # Когда есть предыдущее время
                sed -i "s|$FILE_SHA256SUM $TIME_CURRENT|$FILE_SHA256SUM $TIME_TOTAL|" "$PORT_WINE_TMP_PATH/statistics"
Vladislav's avatar
Vladislav committed
1100
            else
Vladislav's avatar
Vladislav committed
1101 1102 1103 1104 1105 1106
                # Когда только запустили приложение первый раз
                echo "${portwine_exe// /#@_@#} $FILE_SHA256SUM $TIME_TOTAL OLD_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics"
            fi
            count_line=4
            # Здесь добавляются новые линии для статистики (L4-) важен
            if [[ -z ${line2[4]} ]] ; then
Vladislav's avatar
Vladislav committed
1107
                SKIP_REPAIR=1
Vladislav's avatar
Vladislav committed
1108 1109 1110 1111 1112 1113 1114 1115 1116
                sed -i "s|$FILE_SHA256SUM \(.*\)|$FILE_SHA256SUM \1 L4-1|" "$PORT_WINE_TMP_PATH/statistics"
            else
                # ремонт, если L4 по каким-то причинам сломался
                if [[ ${line2[4]} =~ ^L4 ]] ; then
                    local NUMBER_OF_STARTS=$(( ${line2[4]//L4-/} + 1 ))
                else
                    SKIP_REPAIR=1
                    sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[4]}|$FILE_SHA256SUM \1 L4-1|" "$PORT_WINE_TMP_PATH/statistics"
                fi
Vladislav's avatar
Vladislav committed
1117
            fi
Vladislav's avatar
Vladislav committed
1118 1119 1120 1121
            (( count_line ++ ))

#             Пример для L5
#             if [[ -z ${line2[5]} ]] ; then
Vladislav's avatar
Vladislav committed
1122
#                 SKIP_REPAIR=1
Vladislav's avatar
Vladislav committed
1123 1124 1125 1126 1127 1128 1129 1130
#                 sed -i "s|$FILE_SHA256SUM \(.*\)|$FILE_SHA256SUM \1 L5-1|" "$PORT_WINE_TMP_PATH/statistics"
#             else
#                 if [[ ${line2[5]} =~ ^L5 ]] ; then
#                     local ЗДЕСЬ_НОВАЯ_ПЕРЕМЕННАЯ=$(( ${line2[5]//L5-/} + 1 ))
#                 else
#                     SKIP_REPAIR=1
#                     sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[5]}|$FILE_SHA256SUM \1 L5-1|" "$PORT_WINE_TMP_PATH/statistics"
#                 fi
Vladislav's avatar
Vladislav committed
1131
#             fi
Vladislav's avatar
Vladislav committed
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
#             (( count_line ++ ))

            if [[ $SKIP_REPAIR != 1 ]] ; then
                # Ремонт, если количество элементов массива по каким-то причина больше, чем должно быть
                if [[ -n ${line2["$count_line"]} ]] ; then
                    for i in $(seq $count_line ${#line2[@]}) ; do
                        unset 'line2[$i]'
                    done
                    sed -i "s|${portwine_exe// /#@_@#} $FILE_SHA256SUM \(.*\)|${line2[*]}|" "$PORT_WINE_TMP_PATH/statistics"
                fi
                # Сюда все sedы от L4, L5 и т.д. (после всех ремонтов)
                sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[4]}|$FILE_SHA256SUM \1 L4-$NUMBER_OF_STARTS|" "$PORT_WINE_TMP_PATH/statistics"
Vladislav's avatar
Vladislav committed
1144
#                 sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[5]}|$FILE_SHA256SUM \1 L5-$NUMBER_OF_STARTS|" "$PORT_WINE_TMP_PATH/statistics"
Vladislav's avatar
Vladislav committed
1145
            fi
1146
        fi
Vladislav's avatar
Vladislav committed
1147
    fi
1148 1149 1150 1151
    if [[ -n $PW_TIME_IN_GAME ]]
    then return 2
    else return 0
    fi
1152 1153
}

Vladislav's avatar
Vladislav committed
1154
create_name_desktop () {
1155 1156 1157
    while true ; do
        search_desktop_file
        local exit_code=$?
1158 1159 1160 1161 1162 1163
        case $exit_code in
            0) break ;;
            1) continue ;;
            2) return 0 ;;
            *) print_error "Broken search_desktop_file func. No exit_code." ;;
        esac
1164
    done
1165 1166 1167 1168
    if [[ -n $DESKTOP_NAME_FILE ]] ; then
        DESKTOP_NAME_FILE_OLD=$DESKTOP_NAME_FILE
        unset DESKTOP_NAME_FILE
    fi
1169 1170 1171 1172 1173 1174
    if [[ -n $DESKTOP_NAME_YAD ]] ; then
        DESKTOP_NAME_FILE="${DESKTOP_NAME_YAD//.desktop/}"
        unset DESKTOP_NAME_YAD
    elif [[ -n $name_desktop ]] ; then
        DESKTOP_NAME_FILE="$name_desktop"
        unset name_desktop
1175 1176
    elif [[ -n $DESKTOP_CORRECT_FILE ]] ; then
        DESKTOP_NAME_FILE="${DESKTOP_CORRECT_FILE//"$PORT_WINE_PATH/"/}"
1177
        unset DESKTOP_CORRECT_FILE
1178
        DESKTOP_NAME_FILE="${DESKTOP_NAME_FILE//.desktop/}"
Vladislav's avatar
Vladislav committed
1179
    fi
Vladislav's avatar
Vladislav committed
1180

1181 1182
    PORTWINE_DB_DESKTOP="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"

1183 1184 1185 1186 1187 1188 1189 1190
    if [[ -n $PORTPROTON_NAME ]] ; then
        PORTPROTON_NAME_ABBR=$(make_abbreviation "$PORTPROTON_NAME")
        PORTPROTON_NAME_ACRO=$(make_acronym "$PORTPROTON_NAME")
    fi
    if [[ -n $FILE_DESCRIPTION ]] ; then
        FILE_DESCRIPTION_ABBR=$(make_abbreviation "$FILE_DESCRIPTION")
        FILE_DESCRIPTION_ACRO=$(make_acronym "$FILE_DESCRIPTION")
    fi
Vladislav's avatar
Vladislav committed
1191

1192 1193 1194
    if [[ -n $PORTWINE_CREATE_SHORTCUT_NAME ]] ; then
        PW_NAME_DESKTOP_PROXY="$PORTWINE_CREATE_SHORTCUT_NAME"
    elif [[ -n $DESKTOP_NAME_FILE ]] ; then
Vladislav's avatar
Vladislav committed
1195
        PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE"
Vladislav's avatar
Vladislav committed
1196
    elif [[ -n $DESKTOP_NAME_FILE_OLD && ${PORTWINE_DB_DESKTOP^^} =~ ${DESKTOP_NAME_FILE_OLD^^} ]] ; then
1197
        PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE_OLD"
Vladislav's avatar
Vladislav committed
1198
    elif [[ -n $PORTPROTON_NAME && ${PORTPROTON_NAME^^} =~ ${PORTWINE_DB_DESKTOP^^} && $PORTPROTON_NAME != "$PORTWINE_DB_DESKTOP" ]] \
Vladislav's avatar
Vladislav committed
1199
    || [[ -n $PORTPROTON_NAME && ${#PORTPROTON_NAME_ABBR} -gt 2 && ${PORTWINE_DB_DESKTOP^^} =~ $PORTPROTON_NAME_ABBR ]] \
1200 1201
    || [[ -n $PORTPROTON_NAME && ${#PORTPROTON_NAME_ACRO} -gt 2 && ${PORTWINE_DB_DESKTOP^^} =~ ${PORTPROTON_NAME_ACRO^^} ]]
    then
Vladislav's avatar
Vladislav committed
1202 1203
        PW_NAME_DESKTOP_PROXY="$PORTPROTON_NAME"
    elif [[ -n $FILE_DESCRIPTION && ${FILE_DESCRIPTION^^} =~ ${PORTWINE_DB_DESKTOP^^} && $FILE_DESCRIPTION != "$PORTWINE_DB_DESKTOP" ]] \
Vladislav's avatar
Vladislav committed
1204
    || [[ -n $FILE_DESCRIPTION && ${#FILE_DESCRIPTION_ABBR} -gt 2 && ${PORTWINE_DB_DESKTOP^^} =~ $FILE_DESCRIPTION_ABBR ]] \
1205 1206
    || [[ -n $FILE_DESCRIPTION && ${#FILE_DESCRIPTION_ACRO} -gt 2 && ${PORTWINE_DB_DESKTOP^^} =~ ${FILE_DESCRIPTION_ACRO^^} ]]
    then
Vladislav's avatar
Vladislav committed
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
        PW_NAME_DESKTOP_PROXY="$FILE_DESCRIPTION"
    else
        unset PORTWINE_DB_PROXY PORTWINE_DB_NEW
        PORTWINE_DB_DESKTOP="${PORTWINE_DB_DESKTOP//_/ }"
        if [[ ${PORTWINE_DB_DESKTOP:0:1} =~ [a-z] ]] ; then
            PORTWINE_DB_UPPER="${PORTWINE_DB_DESKTOP^^}"
            PORTWINE_DB_DESKTOP="${PORTWINE_DB_UPPER:0:1}${PORTWINE_DB_DESKTOP:1}"
        fi
        if (( ${#PORTWINE_DB_DESKTOP} > 3 )) ; then
            for ((i=0 ; i<${#PORTWINE_DB_DESKTOP} ; i++)) ; do
Vladislav's avatar
Vladislav committed
1217 1218
                if [[ ${PORTWINE_DB_DESKTOP:i:2} =~ [a-z]([A-Z]|[0-9]) ]] \
                && [[ ! ${PORTWINE_DB_DESKTOP:i:3} =~ [a-z]([A-Z]|[0-9])" " ]] ; then
Vladislav's avatar
Vladislav committed
1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
                    PORTWINE_DB_PROXY+="${PORTWINE_DB_DESKTOP:i:1} "
                elif [[ ${PORTWINE_DB_DESKTOP:i:3} =~ [0-9][0-9][a-zA-Z] ]] ; then
                    PORTWINE_DB_PROXY+="${PORTWINE_DB_DESKTOP:i:2} "
                    ((i++))
                else
                    PORTWINE_DB_PROXY+="${PORTWINE_DB_DESKTOP:i:1}"
                fi
            done
            for ((i=0 ; i<${#PORTWINE_DB_PROXY} ; i++)) ; do
                if [[ ${PORTWINE_DB_PROXY:i:2} =~ " "[a-z] ]] ; then
                    PORTWINE_DB_UPPER="${PORTWINE_DB_PROXY:i:2}"
                    PORTWINE_DB_NEW+="${PORTWINE_DB_UPPER^^}"
                    ((i++))
                else
                    PORTWINE_DB_NEW+="${PORTWINE_DB_PROXY:i:1}"
                fi
            done
Vladislav's avatar
Vladislav committed
1236
        else
Vladislav's avatar
Vladislav committed
1237
            PORTWINE_DB_NEW="$PORTWINE_DB_DESKTOP"
Vladislav's avatar
Vladislav committed
1238
        fi
Vladislav's avatar
Vladislav committed
1239
        PW_NAME_DESKTOP_PROXY="$PORTWINE_DB_NEW"
Vladislav's avatar
Vladislav committed
1240 1241 1242
    fi
}

Vladislav's avatar
Vladislav committed
1243
# Конвертация секунд в дни, часы, минуты
1244
seconds_to_time () {
Vladislav's avatar
Vladislav committed
1245
    [[ ! $DESKTOP_WITH_TIME == enabled ]] && return 0
Vladislav's avatar
Vladislav committed
1246
    [[ -z $1 ]] && return 0
Vladislav's avatar
Vladislav committed
1247 1248
    local seconds days hours minutes
    seconds=$1
1249

Vladislav's avatar
Vladislav committed
1250 1251
    days=$((seconds / (60 * 60 * 24)))
    seconds=$((seconds % (60 * 60 * 24)))
Vladislav's avatar
Vladislav committed
1252

Vladislav's avatar
Vladislav committed
1253 1254
    hours=$((seconds / (60 * 60)))
    seconds=$((seconds % (60 * 60)))
Vladislav's avatar
Vladislav committed
1255

Vladislav's avatar
Vladislav committed
1256 1257
    minutes=$((seconds / 60))
    seconds=$((seconds % 60))
1258

Vladislav's avatar
Vladislav committed
1259
    if [[ $days =~ ^0$ ]] ; then
Vladislav's avatar
Vladislav committed
1260
        days=
Vladislav's avatar
Vladislav committed
1261
    elif [[ $days =~ ^1$ ]] ; then
Vladislav's avatar
Vladislav committed
1262
        days="$days ${translations[day]}, "
Vladislav's avatar
Vladislav committed
1263
    elif [[ $days =~ ^([2-9]1|[1-9][0-9]+1)$ ]] && [[ $LANGUAGE == ru ]] ; then
Vladislav's avatar
Vladislav committed
1264 1265 1266
        days="$days ${translations[day]}, "
    elif [[ $days =~ ^([2-4]|[2-9][2-4]|[1-9][0-9]+[2-4])$ ]] && [[ $LANGUAGE == ru ]] ; then
        days="$days дня, "
Vladislav's avatar
Vladislav committed
1267
    else
Vladislav's avatar
Vladislav committed
1268
        days="$days ${translations[days]}, "
Vladislav's avatar
Vladislav committed
1269 1270
    fi

Vladislav's avatar
Vladislav committed
1271
    if [[ $hours =~ ^0$ ]] ; then
Vladislav's avatar
Vladislav committed
1272
        hours=
Vladislav's avatar
Vladislav committed
1273
    elif [[ $hours =~ ^1$ ]] ; then
Vladislav's avatar
Vladislav committed
1274
        hours="$hours ${translations[hour]} ${translations[and]} "
Vladislav's avatar
Vladislav committed
1275
    elif [[ $hours =~ ^([2-4]|2[2-4])$ ]] && [[ $LANGUAGE == ru ]] ; then
Vladislav's avatar
Vladislav committed
1276
        hours="$hours часа ${translations[and]} "
Vladislav's avatar
Vladislav committed
1277
    elif [[ $hours =~ ^21$ ]] && [[ $LANGUAGE == ru ]] ; then
Vladislav's avatar
Vladislav committed
1278
        hours="$hours ${translations[hour]} ${translations[and]} "
1279
    else
Vladislav's avatar
Vladislav committed
1280
        hours="$hours ${translations[hours]} ${translations[and]} "
1281
    fi
Vladislav's avatar
Vladislav committed
1282

Vladislav's avatar
Vladislav committed
1283
    if [[ $minutes =~ ^0$ ]] ; then
Vladislav's avatar
Vladislav committed
1284 1285
        hours=${hours//" ${translations[and]} "/}
        minutes=
Vladislav's avatar
Vladislav committed
1286
        if [[ -z $days ]] || [[ -z $hours ]] ; then
Vladislav's avatar
Vladislav committed
1287
            days=${days//","/}
Vladislav's avatar
Vladislav committed
1288
        fi
Vladislav's avatar
Vladislav committed
1289
        if [[ -z $days ]] && [[ -z $hours ]] ; then
Vladislav's avatar
Vladislav committed
1290
            minutes="${translations[less than a minute]}"
Vladislav's avatar
Vladislav committed
1291 1292
        fi
    elif [[ $minutes =~ ^1$ ]] ; then
Vladislav's avatar
Vladislav committed
1293
        minutes="$minutes ${translations[minute]}"
Vladislav's avatar
Vladislav committed
1294
    elif [[ $minutes =~ ^[2-5]1$ ]] && [[ $LANGUAGE == ru ]] ; then
Vladislav's avatar
Vladislav committed
1295
        minutes="$minutes ${translations[minute]}"
Vladislav's avatar
Vladislav committed
1296
    elif [[ $minutes =~ ^([2-4]|[2-5][2-4])$ ]] && [[ $LANGUAGE == ru ]] ; then
Vladislav's avatar
Vladislav committed
1297
        minutes="$minutes минуты"
Vladislav's avatar
Vladislav committed
1298
    else
Vladislav's avatar
Vladislav committed
1299
        minutes="$minutes ${translations[minutes]}"
Vladislav's avatar
Vladislav committed
1300 1301
    fi

Vladislav's avatar
Vladislav committed
1302
    echo -e "<b>\n${translations[Time spent]}: $days$hours$minutes</b>"
1303 1304
}

1305
combobox_fix () {
1306
    if [[ -z "$1" ]] ; then
1307 1308 1309
        print_error "no argument specified for combobox_fix"
        return 1
    else
Vladislav's avatar
Vladislav committed
1310
        local name1 name2
1311
        if [[ "$1" == "--disabled" ]] ; then
1312
            if [[ -z "$3" ]] ; then
Vladislav's avatar
Vladislav committed
1313
                echo "${translations[Disabled]}"
1314 1315
                return 0
            fi
Vladislav's avatar
Vladislav committed
1316 1317
            name1="$2"
            name2="$3"
1318 1319 1320 1321
        elif [[ "$1" == "--empty" ]] ; then
            if [[ -z "$3" ]] ; then
                echo ""
                return 0
1322
            fi
Vladislav's avatar
Vladislav committed
1323 1324
            name1="$2"
            name2="$3"
1325
        else
Vladislav's avatar
Vladislav committed
1326
            name1="$1"
1327 1328 1329 1330
            if [[ -z "$2" ]] ; then
                echo "${name1}"
                return 0
            fi
Vladislav's avatar
Vladislav committed
1331
            name2="$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1332
        fi
Vladislav's avatar
Vladislav committed
1333 1334 1335 1336 1337
        local name3 name4
        name3="${name2//\!${name1}\!/\!}"
        name3="!${name3//${name1}\!/\!}"
        name3="${name3//\!\!/\!}"
        name4="${name3//*\!/}"
1338 1339 1340 1341
        if [[ ${name1} == "${name4}" ]] ; then
            name3="${name3%\!"${name1}"}"
        elif [[ ${name1} == "\\${name4}" ]] ; then
            name3="${name3%\!"${name1//\\/}"}"
1342 1343
        fi
        if [[ "$1" == "--disabled" ]] ; then
1344
            if [[ ${name1} == "disabled" ]] ; then
Vladislav's avatar
Vladislav committed
1345
                name1="${translations[Disabled]}"
1346
                if [[ ${name3} =~ enabled ]] ; then
Vladislav's avatar
Vladislav committed
1347
                    name3="${name3//enabled/${translations[Enable]}}"
1348 1349
                fi
            elif [[ ${name1} != "disabled" ]] ; then
Vladislav's avatar
Vladislav committed
1350
                fix_disabled="!${translations[Disable]}"
1351
                if [[ ${name1} == "enabled" ]] ; then
Vladislav's avatar
Vladislav committed
1352
                    name1="${translations[Enabled]}"
1353
                fi
1354 1355
            fi
            echo "${name1}${name3}${fix_disabled}"
1356 1357 1358 1359
        elif [[ "$1" == "--empty" && -n ${name1} ]] ; then
            if [[ ${name1} == "\\" ]]
            then fix_empty=""
            else fix_empty="!"
1360 1361 1362 1363 1364 1365
            fi
            echo "${name1}${name3}${fix_empty}"
        else
            echo "${name1}${name3}"
        fi
        return 0
1366 1367 1368
    fi
}

Vladislav's avatar
Vladislav committed
1369
get_and_set_reg_file () {
1370 1371 1372
    local name_block name_for_find find_block find_file find_line count name_for_new_block name_for_find_old
    local line_reg find_number_line find_check_file name_for_set name_type_reg name_fatal name_add_or_del
    name_add_or_del=$1
1373 1374
    name_block=$2
    name_for_find=$3
1375 1376 1377 1378 1379 1380 1381 1382
    name_type_reg=$4
    name_for_set=$5
    name_for_new_block=$6
    name_for_find_old=$name_for_find
    name_fatal="$name_block $name_for_find"

    case $name_type_reg in
            REG_DWORD)
1383
                name_for_find="\"$name_for_find\"=dword:"
1384 1385
                name_for_set=$(convert_dec_and_hex --dec "$name_for_set") ;;
            REG_SZ)
1386 1387
                name_for_find="\"$name_for_find\"="
                name_for_set="\"$name_for_set\"" ;;
1388 1389
            *)
                if [[ $name_add_or_del == --delete ]] ; then
1390
                    name_for_find="\"$name_for_find\""
1391 1392 1393 1394 1395
                else
                    print_error "Name type reg not set for $name_fatal"
                    return 1
                fi ;;
    esac
1396
    name_block=${name_block//\\/\\\\\\\\}
1397
    if [[ -n $name_for_new_block ]] ; then
1398
        find_block=$(grep -n "\[$name_block\]" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/$name_for_new_block.reg")
1399
    else
1400
        find_block=$(grep -n "\[$name_block\]" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/"*.reg)
1401
    fi
Vladislav's avatar
Vladislav committed
1402
    if [[ -n $find_block ]] ; then
1403 1404 1405 1406 1407 1408 1409 1410
        if [[ -n $name_for_new_block ]] ; then
            find_file="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/$name_for_new_block.reg"
            find_line=${find_block//:*/}
        else
            find_file=${find_block//:*/}
            find_line=${find_block//$find_file:/}
            find_line=${find_line//:*/}
        fi
1411
        count=-1
1412
        while read -r line_reg ; do
1413 1414
            ((count++))
            if [[ $line_reg =~ $name_for_find ]] ; then
1415 1416 1417 1418
                if [[ $line_reg == $name_for_find$name_for_set ]] ; then
                    # когда менять не нужно, потому что такое же
                    return 0
                fi
1419 1420 1421 1422 1423
                find_number_line=$(( count + find_line ))
                find_check_file=1
                break
            fi
            [[ -z $line_reg ]] && break
1424
        done <<< "$(sed -n "$find_line"',$p' "$find_file")"
Vladislav's avatar
Vladislav committed
1425
    fi
1426
    if [[ $name_add_or_del == --add ]] ; then
1427 1428
        if [[ -z $find_block ]] ; then
            if [[ -n $name_for_new_block ]] ; then
1429
                sed -i '$a\\n'\["$name_block"\] "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/$name_for_new_block.reg"
1430
                find_file="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/$name_for_new_block.reg"
1431 1432 1433
                find_line=$(wc -l "$find_file" | awk -F" " '{print $1}')
                find_line=$(( find_line - 1 ))
            else
1434
                print_error "$name_fatal not found in reg files"
1435 1436
                return 1
            fi
Vladislav's avatar
Vladislav committed
1437
        fi
1438 1439
        if [[ $find_check_file == 1 ]] ; then
            print_info "Change $name_for_find_old to reg file"
1440
            sed -i "${find_number_line}s|$name_for_find.*|$name_for_find$name_for_set|" "$find_file"
Vladislav's avatar
Vladislav committed
1441
        else
1442 1443
            print_info "Added $name_for_find_old to reg file"
            sed -i "$(( find_line + 1 ))a$name_for_find$name_for_set" "$find_file"
Vladislav's avatar
Vladislav committed
1444
        fi
1445
    elif [[ $name_add_or_del == --delete ]] ; then
1446
        [[ $find_check_file != 1 ]] && return 0
1447
        print_info "Delete $name_for_find_old to reg file"
1448
        sed -i "${find_number_line}d" "$find_file"
Vladislav's avatar
Vladislav committed
1449
    fi
Vladislav's avatar
Vladislav committed
1450 1451
}

Vladislav's avatar
Vladislav committed
1452
convert_dec_and_hex () {
Vladislav's avatar
Vladislav committed
1453 1454 1455 1456 1457 1458
    local type=$1
    local num=$2

    case "$type" in
        --dec)
        # Преобразование из десятичного в шестнадцатеричный
1459
        echo -n "$(printf "%08x" "$num")" ;;
Vladislav's avatar
Vladislav committed
1460 1461 1462 1463 1464 1465
        --hex)
        # Преобразование из шестнадцатеричного в десятичный
        echo $(( 0x$num )) ;;
        *)
        echo "Неверный тип преобразования. Используйте --dec или --hex." ;;
    esac
Vladislav's avatar
Vladislav committed
1466 1467
}

1468 1469 1470 1471 1472 1473 1474
recommend_dpi () {
    local height=$1

    if [[ -z "$height" ]] ; then
        echo "disabled"
        return 1
    fi
1475
    local dpi=$(( height / 11 ))
Vladislav's avatar
Vladislav committed
1476
    (( dpi < 96 )) && dpi="96"
1477 1478 1479 1480 1481 1482 1483 1484 1485
    echo "$dpi"
}

fixes_after_update () {
    local fixes_path line fixes_info IFS
    fixes_info=$1
    fixes_path="$PORT_WINE_TMP_PATH/fixes_apply"
    [[ ! -f $fixes_path ]] && touch "$fixes_path"

1486
    while read -r line ; do
1487 1488 1489 1490 1491 1492 1493 1494
        if [[ $line == "$fixes_info" ]] ; then
            return 1
        fi
    done < "$fixes_path"
    echo "$fixes_info" >> "$fixes_path"
    return 0
}

Vladislav's avatar
Vladislav committed
1495
restart_pp () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1496 1497 1498 1499
    case "$1" in
        --userconf) export RESTART_PP_USED="userconf" ;;
        --edit_db) export RESTART_PP_USED="edit_db" ;;
    esac
Vladislav's avatar
Vladislav committed
1500
    /usr/bin/env bash -c "${pw_full_command_line[@]}" &
Vladislav's avatar
Vladislav committed
1501
    exit 0
Vladislav's avatar
Vladislav committed
1502 1503
}

castro-fidel's avatar
castro-fidel committed
1504
pw_clear_pfx () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1505 1506
    rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/.dot*
    rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/.prog*
1507
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver"
castro-fidel's avatar
castro-fidel committed
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
    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 (x86)/Internet Explorer"
    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"
1537 1538
    rm -f "${PORT_WINE_TMP_PATH}"/*.bin
    rm -f "${PORT_WINE_TMP_PATH}"/*.foz
1539
    return 0
1540 1541
}

castro-fidel's avatar
castro-fidel committed
1542 1543 1544 1545 1546
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
1547
            echo ""
castro-fidel's avatar
castro-fidel committed
1548
            exit 1
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
        else
            pw_clear_pfx
            try_remove_dir "${PORT_WINE_PATH}/data/dist"
            create_new_dir "${PORT_WINE_PATH}/data/dist"
            try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
            try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
            try_remove_file "${PORT_WINE_PATH}/data/user.conf"
            try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver"
            echo ""
            unset SKIP_CHECK_UPDATES
            print_info "Restarting PP for reinstall files..."
castro-fidel's avatar
castro-fidel committed
1560
        fi
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571
    elif yad_question "${translations[Do you really want to reinstall PortProton?\\nFor this, an internet connection will be required.]}" ; then
        pw_clear_pfx
        try_remove_dir "${PORT_WINE_PATH}/data/dist"
        create_new_dir "${PORT_WINE_PATH}/data/dist"
        try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
        try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
        try_remove_file "${PORT_WINE_PATH}/data/user.conf"
        try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver"
        echo ""
        unset SKIP_CHECK_UPDATES
        print_info "Restarting PP for reinstall files..."
castro-fidel's avatar
castro-fidel committed
1572
    fi
Vladislav's avatar
Vladislav committed
1573
    restart_pp
castro-fidel's avatar
castro-fidel committed
1574 1575
}

1576
check_user_conf () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1577 1578
    if [[ ! -f "${USER_CONF}" ]] ; then
        cat << EOF > "${USER_CONF}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1579 1580 1581 1582
#!/usr/bin/env bash"
# User overides db and var settings..."
# export DXVK_HUD=full"
# export GALLIUM_HUD=fps"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1583
EOF
1584 1585 1586 1587
    fi
}

init_wine_ver () {
1588
    if [[ "${PW_WINE_VER}" == "${translations[USE_SYSTEM_WINE]}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1589
    then export PW_WINE_USE="USE_SYSTEM_WINE"
1590
    elif [[ "${PW_WINE_VER}" == "${translations[GET-OTHER-WINE]}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1591
    then gui_proton_downloader
1592
    elif [[ -n "${PW_WINE_VER}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1593 1594 1595 1596
    then export PW_WINE_USE="$PW_WINE_VER"
    fi
    unset PW_WINE_VER

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1597 1598
    if [[ "${PW_WINE_USE}" == "USE_SYSTEM_WINE" ]] \
    && command -v wine &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1599
        export WINEDIR="$RT_PREFIX/usr"
1600 1601
        WINE="$RT_PREFIX$(command -v wine)"
        export WINE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1602
        export WINELOADER="$WINE"
1603 1604
        WINESERVER="$RT_PREFIX$(command -v wineserver)"
        export WINESERVER
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1605
        export PW_NO_FSYNC=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1606
        unset WINEDLLPATH
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1607 1608
    else
        if [[ -d "${PORT_WINE_PATH}/data/dist" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1609
        IFS=$'\n'
Vladislav's avatar
Vladislav committed
1610
        for dist_dir in $(lsbash "${PORT_WINE_PATH}/data/dist/") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1611
            dist_dir_new=$(echo "${dist_dir}" | awk '$1=$1' | sed -e s/[[:blank:]]/_/g)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1612 1613 1614 1615 1616
            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"
1617
        fi
Vladislav's avatar
Vladislav committed
1618
        if [[ -z $(lsbash "${PORT_WINE_PATH}/data/dist/" --grep "${PW_WINE_USE}") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1619 1620 1621 1622 1623
            if [[ "$PW_WINE_USE" =~ PROTON_LG* ]]
            then export PW_WINE_USE=PROTON_LG
            else export PW_WINE_USE=WINE_LG
            fi
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1624
        if [[ "$PW_WINE_USE" == PROTON_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
        then export PW_WINE_USE="${PW_PROTON_LG_VER}"
        elif [[ "$PW_WINE_USE" == WINE_LG ]]
        then export PW_WINE_USE="${PW_WINE_LG_VER}"
        fi

        export WINEDIR="${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}"
        export WINE="${WINEDIR}/bin/wine"
        export WINELOADER="${WINEDIR}/bin/wine"
        export WINESERVER="${WINEDIR}/bin/wineserver"
        if [[ -d "${WINEDIR}/files" && ! -d "${WINEDIR}/dist" ]] ; then
Vladislav's avatar
Vladislav committed
1635
            for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(files|version)$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1636 1637 1638 1639 1640
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
            mv -f "${WINEDIR}/files"/* "${WINEDIR}/"
            rm -fr "${WINEDIR}/files"
        elif [[ ! -d "${WINEDIR}/files" && -d "${WINEDIR}/dist" ]] ; then
Vladislav's avatar
Vladislav committed
1641
            for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(dist|version)$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1642 1643 1644 1645
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
            mv -f "${WINEDIR}/dist"/* "${WINEDIR}/"
            rm -fr "${WINEDIR}/dist"
1646
        elif [[ -f "${WINEDIR}/proton_dist.tar" ]] ; then
1647
            unpack "${WINEDIR}/proton_dist.tar" "${WINEDIR}/"
Vladislav's avatar
Vladislav committed
1648
            for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(bin|lib|lib64|share|version)$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1649 1650 1651 1652 1653
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
        fi
        if [[ -d "${WINEDIR}" ]] ; then
            [[ ! -f "${WINEDIR}/version" ]] && echo "${PW_WINE_USE}" > "${WINEDIR}/version"
1654

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1655 1656 1657 1658 1659
            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
1660

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1661 1662 1663 1664
            for mono_gecko_chk in "mono" "gecko" ; do
                if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then
                    print_info "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK."
                elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then
1665
                    pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif" --block
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1666 1667 1668 1669
                    try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}"
                    try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                    try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine/
                    print_info "Copy ${WINEDIR}/share/wine/${mono_gecko_chk} to tmp and create symlink to ${WINEDIR}/share/wine/. OK."
1670
                    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1671 1672 1673 1674 1675 1676 1677
                else
                    try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
                    try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine
                    print_warning "${WINEDIR}/share/wine/${mono_gecko_chk} is broken symlink. Repair... OK."
                fi
            done

Vladislav's avatar
Vladislav committed
1678
            if ! grep 'Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' "${WINEDIR}/share/wine/wine.inf" &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1679
                echo 'HKLM,Software\NVIDIA Corporation\Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
1680
                echo -e 'HKLM,System\ControlSet001\Services\nvlddmkm,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1681 1682 1683
                sed -i '/Steam.exe/d' "${WINEDIR}/share/wine/wine.inf"
                sed -i '/\\Valve\\Steam/d' "${WINEDIR}/share/wine/wine.inf"
                sed -i '/winemenubuilder/d' "${WINEDIR}/share/wine/wine.inf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1684 1685 1686
                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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1687
            fi
1688
        fi
castro-fidel's avatar
castro-fidel committed
1689

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1690 1691 1692
        export WINEDLLPATH="${WINEDIR}/lib64/wine:${WINEDIR}/lib/wine"
        if [[ -d "${PATH_TO_GAME}" ]] ; then
            export WINEDLLPATH+=":${PATH_TO_GAME}"
castro-fidel's avatar
castro-fidel committed
1693
        fi
1694
    fi
1695

1696 1697 1698
	if ! check_flatpak ; then
		export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib"
	fi
1699

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1700 1701
    export MEDIACONV_BLANK_VIDEO_FILE="${WINEDIR}"/share/media/blank.mkv
    export MEDIACONV_BLANK_AUDIO_FILE="${WINEDIR}"/share/media/blank.ptna
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1702 1703 1704
    if  [[ -d "${WINEDIR}"/share/espeak-ng-data ]] ; then
        export ESPEAK_DATA_PATH="${WINEDIR}"/share/
    fi
1705
    return 0
1706 1707
}

castro-fidel's avatar
castro-fidel committed
1708
pw_init_runtime () {
Vladislav's avatar
Vladislav committed
1709
    check_flatpak && export PW_USE_RUNTIME="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1710
    if [[ "$PW_USE_RUNTIME" != "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1711
    || [[ "$PW_WINE_USE" == "USE_SYSTEM_WINE" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1712
    then
1713
        export PW_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1714
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
1715 1716
        if [[ -z "$PW_TERM" ]] ; then
            export PW_TERM="env LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\" ${PW_PLUGINS_PATH}/portable/bin/xterm -bg black -fg white -e"
1717
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1718
        export pw_runtime="env"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1719 1720
        return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1721

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1722
    if grep -i "altlinux" "/etc/os-release" &>/dev/null ; then
castro-fidel's avatar
castro-fidel committed
1723
        export LIBGL_DRIVERS_PATH="/usr/lib/X11/modules/dri:/usr/lib64/X11/modules/dri"
1724 1725 1726
        if [[ -f "/usr/share/vulkan/icd.d/nvidia_icd.json" ]] \
        && [[ "$LSPCI_VGA" == *nvidia* ]]
        then
1727 1728 1729
            VK_ADD_DRIVER_FILES="$(realpath /usr/share/vulkan/icd.d/nvidia_icd.json)"
            export VK_ADD_DRIVER_FILES
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1730 1731
    elif grep -i -E '(ROSA|RED OS)' "/etc/os-release" &>/dev/null ; then
        export LOCPATH="/run/host/usr/share/locale/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1732
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1733

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1734
    PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1735

1736 1737
	if ! check_flatpak; then
	  export PW_LD_LIBRARY_PATH="\
1738 1739 1740 1741 1742 1743 1744 1745
${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:\
/overrides/lib/x86_64-linux-gnu:\
/overrides/lib/i386-linux-gnu:\
/lib/x86_64-linux-gnu:\
/lib/i386-linux-gnu"
1746 1747
	fi

1748
    if [[ -n "${PATH}" ]]
1749 1750 1751 1752
    then export PW_PATH="${PATH}:${PW_PLUGINS_PATH}/portable/bin"
    else export PW_PATH="${PW_PLUGINS_PATH}/portable/bin"
    fi

1753
    if [[ -n "${PW_SANDBOX_HOME_PATH}" && -d "${PW_SANDBOX_HOME_PATH}" ]] ; then
castro-fidel's avatar
castro-fidel committed
1754
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1755
        --unshare-home \
1756
        --home=${PW_SANDBOX_HOME_PATH} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1757
        --remove-game-overlay \
1758
        --share-pid \
1759 1760
        ${PW_ADD_TO_ARGS_IN_RUNTIME} -- \
        env PATH=$PW_PATH "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1761
    else
castro-fidel's avatar
castro-fidel committed
1762
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1763
        --share-home \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1764
        --remove-game-overlay \
1765
        --share-pid \
1766 1767
        ${PW_ADD_TO_ARGS_IN_RUNTIME} -- \
        env PATH=$PW_PATH "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1768
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1769

1770 1771 1772 1773 1774
    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
1775
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
1776 1777
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1778
    # export PRESSURE_VESSEL_GRAPHICS_PROVIDER="/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1779 1780

    unset PRESSURE_VESSEL_RUNTIME_ARCHIVE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1781 1782
    export PRESSURE_VESSEL_COPY_RUNTIME=1
    export PRESSURE_VESSEL_GC_LEGACY_RUNTIMES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1783
    export PRESSURE_VESSEL_RUNTIME=runtime
castro-fidel's avatar
castro-fidel committed
1784 1785 1786
    export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}"
    export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var"
    export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel"
1787
    export FONTCONFIG_PATH=''
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1788 1789

    unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW
1790
    for PWRTMRO in "${PW_RT_MOUNT_RO[@]}" ; do
1791
        if [[ -n "${PRESSURE_VESSEL_FILESYSTEMS_RO}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1792 1793 1794 1795
        then export PRESSURE_VESSEL_FILESYSTEMS_RO="${PRESSURE_VESSEL_FILESYSTEMS_RO}:${PWRTMRO}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RO="${PWRTMRO}"
        fi
    done
1796
    for PWRTMRW in "${PW_RT_MOUNT_RW[@]}" ; do
1797
        if [[ -n "${PRESSURE_VESSEL_FILESYSTEMS_RW}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1798 1799 1800 1801
        then export PRESSURE_VESSEL_FILESYSTEMS_RW="${PRESSURE_VESSEL_FILESYSTEMS_RW}:${PWRTMRW}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RW="${PWRTMRW}"
        fi
    done
1802

1803 1804
    export PW_TERM="env LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\" ${PW_PLUGINS_PATH}/portable/bin/xterm -bg black -fg white -e"

1805
    print_info "RUNTIME is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1806 1807
}

castro-fidel's avatar
castro-fidel committed
1808
pw_mangohud_check () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1809 1810 1811
    if [[ "${PW_MANGOHUD}" == "1" ]] \
    && ! check_gamescope_session
    then
1812 1813 1814
        if [[ "$PW_USE_SYSTEM_VK_LAYERS" != "1" ]] ; then
            sed -i 's/: "VK_LAYER/: "PW_VK_LAYER/' "${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"/MangoHud*.json
            var_pw_vk_istance_layers_config_update "PW_VK_LAYER_MANGOHUD_overlay64:PW_VK_LAYER_MANGOHUD_overlay32"
1815
            print_info "Portable MangoHud is enabled"
1816
        else
1817
            print_info "System MangoHud is enabled"
1818
            export PW_MANGOHUD_SLR='MANGOHUD=1'
1819
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1820
        MANGOHUD_LIB_NAME="libMangoHud.so"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1821
        if [[ "${PW_VULKAN_USE}" = "0" ]] ; then
1822
            MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:libMangoHud_opengl.so:${MANGOHUD_LIB_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1823
        fi
1824
        if [[ -n "${PW_LD_PRELOAD}" ]]
castro-fidel's avatar
castro-fidel committed
1825 1826
        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
1827 1828
        fi
    else
1829
        export PW_MANGOHUD_SLR=''
1830
        print_info "MangoHud is disabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1831 1832 1833 1834
    fi
    return 0
}

castro-fidel's avatar
castro-fidel committed
1835
pw_vkbasalt_check () {
1836
    if [[ "${PW_VKBASALT}" == "1" ]] ; then
1837 1838 1839 1840 1841 1842
        if [[ "$PW_USE_SYSTEM_VK_LAYERS" != "1" ]] ; then
            sed -i 's/: "VK_LAYER/: "PW_VK_LAYER/' "${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"/vkBasalt*.json
            var_pw_vk_istance_layers_config_update "PW_VK_LAYER_VKBASALT_post_processing64:PW_VK_LAYER_VKBASALT_post_processing32"
            print_info "Portable vkBasalt is enabled"
        else
            print_info "System vkBasalt is enabled"
1843
            export ENABLE_VKBASALT="1"
1844
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1845
        export VKBASALT_CONFIG_FILE="${PORT_WINE_PATH}/data/vkBasalt.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1846 1847
        if ! grep "${PW_PLUGINS_PATH}/reshade" "${VKBASALT_CONFIG_FILE}" &>/dev/null
        then sed -ri "s|= .*/reshade|= \"${PW_PLUGINS_PATH}\"/reshade|g" "${VKBASALT_CONFIG_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1848
        fi
1849
        if [[ -n "${PW_VKBASALT_EFFECTS}" ]] && [[ -n "${PW_VKBASALT_FFX_CAS}" ]] ; then
1850 1851
            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}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1852 1853
        fi
    else
1854
        export DISABLE_VKBASALT="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1855 1856 1857 1858 1859
        print_info "vkBasalt is disabled"
    fi
    return 0
}

1860
regdlloverrides () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1861 1862 1863
    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}')
castro-fidel's avatar
castro-fidel committed
1864 1865 1866
    case "${PW_DLL_SET}" in
        "n,b") PW_DLL_IN_REG="native,builtin" ;;
        "b,n") PW_DLL_IN_REG="builtin,native" ;;
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1867 1868
          "n") PW_DLL_IN_REG="native" ;;
          "b") PW_DLL_IN_REG="builtin" ;;
castro-fidel's avatar
castro-fidel committed
1869
            *) PW_DLL_IN_REG="" ;;
1870
    esac
castro-fidel's avatar
castro-fidel committed
1871
    grep 'HKCU,Software\\Wine\\AppDefaults\\'"${PW_DLL_EXE}"'\\DllOverrides,'\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\" "${WINEDIR}/share/wine/wine.inf"
1872
    if [[ "$?" != "0" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1873 1874
        grep "ProtonOverrides" "${WINEDIR}/share/wine/wine.inf"
        if [[ "$?" == "0" ]] ; then
castro-fidel's avatar
castro-fidel committed
1875
            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
1876
        else
castro-fidel's avatar
castro-fidel committed
1877
            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
1878
        fi
1879 1880 1881
    fi
}

1882
wait_wineserver () {
1883
    while ls -l /proc/*/exe >/dev/null 2>&1 | grep -ie PortProton | grep -E 'wine(64)?-preloader|wineserver'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1884
    do
Vladislav's avatar
Vladislav committed
1885
        sleep 0.1
1886
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1887
    "$WINESERVER" -w
1888
    return 0
1889
}
1890
export -f wait_wineserver
1891 1892

kill_portwine () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1893
    if [[ "${PW_WINE_USE}" != "USE_SYSTEM_WINE" ]] ; then
1894
        if check_flatpak && [[ "$ALPINE_FP" == "1" ]] ; then
1895 1896 1897 1898 1899 1900
            wine_pids=$(ls -l /proc/*/exe >/dev/null 2>&1 | grep -ie PortProton | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')
            bwrap_pids=$(pgrep -f wrap | grep PortProton | head -n 1)
        else
            wine_pids=$(ls -l /proc/*/exe 2>/dev/null | grep -ie PortProton | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')
            bwrap_pids="$(pgrep -a wrap | grep PortProton | head -n 1 | awk '{print $1}')"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1901
    else
1902 1903
        wine_pids=$(ls -l /proc/*/exe 2>/dev/null | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')
        unset bwrap_pids
1904
    fi
1905 1906 1907 1908 1909 1910

    for pw_kill_pids in ${bwrap_pids} ${wine_pids}; do
        if ps cax | grep "${pw_kill_pids}" ; then
            kill -n 9 "${pw_kill_pids}" &>/dev/null
        fi
    done
1911
    return 0
1912 1913 1914
}
export -f kill_portwine

castro-fidel's avatar
castro-fidel committed
1915
pw_kill_autostart () {
castro-fidel's avatar
castro-fidel committed
1916
    if [[ -z "${2}" ]]
1917
    then SWAIT=3
castro-fidel's avatar
castro-fidel committed
1918 1919
    else SWAIT="${2}"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1920 1921
    sleep 5
    while true ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1922
        if  [[ -z "$(ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}')" ]] \
1923
        && [[ -n "$(ps aux | grep wrap | grep -v grep | grep -i "PortProton" | head -n 1)" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1924
        then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1925
            echo -e "PID $1 not found"
castro-fidel's avatar
castro-fidel committed
1926
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1927
        else
castro-fidel's avatar
castro-fidel committed
1928
            sleep "${SWAIT}"
1929
            if [[ "$3" == please ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1930
            then kill -s SIGTERM $(ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}')
1931 1932
            else kill_portwine
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1933 1934 1935
            break
        fi
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1936

Vladislav's avatar
Vladislav committed
1937
    if [[ -n "$(lsbash "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/ | grep -m 1 ".tmp")" ]] ; then
castro-fidel's avatar
castro-fidel committed
1938
        rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/*.tmp
1939
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1940

1941
    return 0
1942
}
castro-fidel's avatar
castro-fidel committed
1943
export -f pw_kill_autostart
1944

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
pw_exit_tray () {
    if [[ "$XDG_SESSION_TYPE" == "tty" ]] ; then
        if [[ -n "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')" ]] ; then
            kill -s SIGUSR1 "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')"
        fi
    else
        if [[ -n "$(pgrep -a tray_gui_pp)" ]] ; then
            kill -s SIGUSR1 $(pgrep -a tray_gui_pp) 2>/dev/null
        fi
    fi
    if [[ -n "$(pgrep -a yad_gui_pp)" ]] ; then
        kill -s SIGUSR1 $(pgrep -a yad_gui_pp) 2>/dev/null
    fi
}
export -f pw_exit_tray

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1961
stop_portwine () {
Vladislav's avatar
Vladislav committed
1962
    [[ "$int_xneur" == "1" ]] && xneur &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1963

1964
    if [[ "$PW_USE_US_LAYOUT" == "1" ]] \
1965
    && ! check_wayland_session \
1966 1967
    && command -v setxkbmap &>/dev/null
    then
Boria138's avatar
Boria138 committed
1968
        setxkbmap
1969
    fi
1970

1971
    if ! check_wayland_session \
1972 1973 1974
    && [[ "$(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"
1975
    fi
1976 1977

    if [[ "${PW_DISABLE_COMPOSITING}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1978
    && ! check_gamescope_session
1979
    then
Boria138's avatar
Boria138 committed
1980 1981 1982 1983 1984 1985 1986 1987
        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
1988 1989
        elif [[ "${DESKTOP_SESSION}" =~ "deepin" ]] ; then
            dbus-send --session --dest=com.deepin.WMSwitcher --type=method_call /com/deepin/WMSwitcher com.deepin.WMSwitcher.RequestSwitchWM
Boria138's avatar
Boria138 committed
1990 1991
        fi
    fi
1992

castro-fidel's avatar
castro-fidel committed
1993
    pw_stop_progress_bar
1994 1995
    try_remove_file "${PORT_SCRIPTS_PATH}/0"
    try_remove_file "${PORT_SCRIPTS_PATH}/1"
Vladislav's avatar
Vladislav committed
1996
    kill_portwine
castro-fidel's avatar
castro-fidel committed
1997 1998
    try_remove_dir "${PW_WINELIB}/var"
    find "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/" -maxdepth 1 -type f -name "*.tmp" -delete
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1999
    pw_exit_tray
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2000
    pw_auto_create_shortcut
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2001
    add_in_stop_portwine
Vladislav's avatar
Vladislav committed
2002

2003
    if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then
Vladislav's avatar
Vladislav committed
2004 2005
        debug_timer --end -s "PW_TIME_IN_GAME"
        PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) # в секундах
2006
        create_name_desktop
Vladislav's avatar
Vladislav committed
2007
    fi
Vladislav's avatar
Vladislav committed
2008

2009
    case "$1" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2010 2011
        --restart)
            restart_pp ;;
2012
        *)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2013 2014
            unset SKIP_CHECK_UPDATES
            exit 0 ;;
2015
    esac
2016
}
2017
export -f stop_portwine
2018

castro-fidel's avatar
castro-fidel committed
2019
pw_download_libs () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2020 2021
    if [[ ! -f "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \
    || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-wrap" ]]
2022
    then
2023
        print_info "Download and install libraries..."
2024 2025
        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
2026
            if unpack "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/" ; then
castro-fidel's avatar
castro-fidel committed
2027
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
Vladislav's avatar
Vladislav committed
2028 2029
                if lsbash "${PORT_WINE_TMP_PATH}" --grep libs_v --grep -v libs"${PW_LIBS_VER}" ; then
                    for RM_LIBS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep libs_v --grep -v libs"${PW_LIBS_VER}")
2030 2031 2032
                    do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_LIBS}"
                    done
                fi
2033
            else
castro-fidel's avatar
castro-fidel committed
2034 2035
                try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
2036
                if yad_error_download
2037 2038
                then pw_download_libs
                else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2039
                    export PW_LIBS_VER="_v$((${PW_LIBS_VER//_v/} - 1))"
2040 2041
                    export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                fi
2042 2043
            fi
        else
2044
            if yad_error_download
2045 2046
            then pw_download_libs
            else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2047
                export PW_LIBS_VER="_v$((${PW_LIBS_VER//_v/} - 1))"
2048 2049
                export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
            fi
2050 2051
        fi
    fi
2052
    return 0
2053 2054
}

castro-fidel's avatar
castro-fidel committed
2055
pw_check_and_download_wine () {
2056
    [[ ! -d "${PORT_WINE_PATH}/data/dist/" ]] && create_new_dir "${PORT_WINE_PATH}/data/dist"
castro-fidel's avatar
castro-fidel committed
2057
    if [[ "${PW_WINE_USE}" == "GET-OTHER-WINE" ]] ; then
2058 2059
        gui_proton_downloader
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2060
    if [[ "$PW_WINE_USE" == PROTON_LG ]]
castro-fidel's avatar
castro-fidel committed
2061
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
2062
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
2063
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
castro-fidel's avatar
castro-fidel committed
2064
    fi
2065
    if [[ ! -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ]] ; then
castro-fidel's avatar
castro-fidel committed
2066
        print_info "Download and install ${PW_WINE_USE}..."
2067 2068
        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
2069
            if unpack "${PORT_WINE_PATH}/data/tmp/${PW_WINE_USE}.tar.xz" "${PORT_WINE_PATH}/data/dist/" ; then
castro-fidel's avatar
castro-fidel committed
2070 2071 2072
                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}"
2073
            else
castro-fidel's avatar
castro-fidel committed
2074 2075 2076
                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}"
2077

2078
                yad_error_download && pw_check_and_download_wine || exit 1
2079 2080
            fi
        else
2081
            yad_error_download && pw_check_and_download_wine || exit 1
2082 2083
        fi
    fi
2084
    return 0
2085 2086
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2087
pw_check_and_download_dxvk_and_vkd3d () {
2088
    # Download stable and git version DXVK
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2089
    for DXVK_VAR_VER in "${DXVK_STABLE_VER}" "${DXVK_GIT_VER}" "${DXVK_LEGACY_VER}" ; do
2090
        if [[ ! -d "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2091
            print_info "Download and install DXVK v.${DXVK_VAR_VER}"
2092 2093
            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
2094
                if unpack "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2095 2096 2097
                    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"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2098
                    try_remove_dir "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2099

2100
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2101
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2102 2103
            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"  no_mirror ; then
2104
                if unpack "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2105 2106 2107
                    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"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2108
                    try_remove_dir "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2109

2110
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2111 2112
                fi
            else
2113
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2114 2115 2116 2117
            fi
        fi
    done

2118
    # Download stable and git version VKD3D
2119
    for VKD3D_VAR_VER in "${VKD3D_STABLE_VER}" "${VKD3D_GIT_VER}" ; do
2120
        if [[ ! -d "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2121
            print_info "Download and install VKD3D-PROTON v.${VKD3D_VAR_VER}"
2122 2123
            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
2124
                if unpack "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2125 2126 2127
                    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"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2128
                    try_remove_dir "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2129

2130
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2131
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2132 2133
            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" no_mirror ; then
2134
                if unpack "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2135 2136 2137
                    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"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2138
                    try_remove_dir "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2139

2140
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2141 2142
                fi
            else
2143
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2144 2145 2146
            fi
        fi
    done
2147

2148
    # Download DGVOODOO2
2149
    if [[ ! -f "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}/dgVoodoo.conf" ]] ; then
Vladislav's avatar
Vladislav committed
2150
        print_info "Download and install DGVOODOO2 v.${DGV2_VER}"
2151 2152
        if try_download "https://github.com/Castro-Fidel/vulkan/releases/download/dgvoodoo2-${DGV2_VER}/dgvoodoo2-${DGV2_VER}.tar.xz" \
        "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}.tar.xz"
Vladislav's avatar
Vladislav committed
2153
        then
2154 2155
            if unpack "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
                try_remove_file "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}.tar.xz"
Vladislav's avatar
Vladislav committed
2156
            else
2157
                try_remove_file "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}.tar.xz"
2158
                try_remove_dir "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}"
Vladislav's avatar
Vladislav committed
2159 2160 2161 2162 2163 2164 2165 2166

                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
            fi
        else
            yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
        fi
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2167 2168 2169
    return 0
}

castro-fidel's avatar
castro-fidel committed
2170
pw_check_and_download_plugins () {
2171
    if [[ ! -f "${PW_PLUGINS_PATH}/portable/lib/lib64/libvkbasalt.so" ]] ; then
castro-fidel's avatar
castro-fidel committed
2172
        print_info "Download and install plugins${PW_PLUGINS_VER}..."
2173 2174
        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
2175
                if unpack "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2176 2177
                    try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz"
                    # TODO: drop clear prefix, and add update prefix from new plugins
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2178
                    pw_clear_pfx
Vladislav's avatar
Vladislav committed
2179
                    if lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2180
                    then
Vladislav's avatar
Vladislav committed
2181
                        for RM_PLUGINS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}")
2182 2183 2184
                        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
                        done
                    fi
2185 2186 2187 2188 2189 2190
                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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2191
                        export PW_PLUGINS_VER="_v$((${PW_PLUGINS_VER//_v/} - 1))"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2192
                        export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
2193
                    fi
2194
                fi
2195
            else
2196
                if yad_error_download
2197 2198
                then pw_check_and_download_plugins
                else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2199
                    export PW_PLUGINS_VER="_v$((${PW_PLUGINS_VER//_v/} - 1))"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2200
                    export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
2201
                fi
2202 2203
            fi
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2204
            pw_notify_send -i info \
2205
            "${translations[Please wait for update PortProton]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2206 2207
            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" silent ; then
2208
                if unpack "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2209
                    try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2210
                    # TODO: drop clear prefix, and add update prefix from new plugins
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2211
                    pw_clear_pfx
Vladislav's avatar
Vladislav committed
2212
                    if lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2213
                    then
Vladislav's avatar
Vladislav committed
2214
                        for RM_PLUGINS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}")
2215 2216 2217 2218 2219
                        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
                        done
                    fi
                else
                    print_error "Failed updating PortProton!"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2220
                    pw_notify_send -i error \
2221
                    "${translations[Failed updating PortProton!]}"
2222
                fi
2223
            fi
2224 2225
        fi
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2226 2227 2228 2229
    if command -v 7z &>/dev/null
    then export pw_7z="7z"
    else export pw_7z="${PW_PLUGINS_PATH}/portable/lib/p7zip/7z"
    fi
2230
    return 0
2231 2232
}

2233 2234 2235 2236 2237 2238 2239
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/"

2240 2241 2242
        [[ ! -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:"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2243

2244 2245
        if [[ ! -d "${WINEPREFIX}/dosdevices/s:" ]] \
        && [[ -d "$HOME/.local/share/Steam/steamapps/common/" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2246 2247 2248 2249
        then
            try_force_link_dir "$HOME/.local/share/Steam/steamapps/common/" "${WINEPREFIX}/dosdevices/s:"
        fi

2250 2251 2252 2253
        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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2254
                try_force_link_file "${WINEDIR}/share/fonts/${link_font}" "${WINEPREFIX}/drive_c/windows/Fonts/${link_font}"
2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279
            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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2280
        DRIVES=(d e f g i j k l m n o p q r t u v w x y)
2281 2282
        DEF_MOUNT_DIRS=('/media' '/mnt' '/run/media')
        MOUNT_DIRS=($(find "${DEF_MOUNT_DIRS[@]}" -maxdepth 1 -mindepth 1  -type d 2>/dev/null | sort -u))
2283
        find -L "$WINEPREFIX/dosdevices" -maxdepth 1 -type l -exec rm -rf {} \; 2>/dev/null ;
2284 2285

        for drive_dir in "${MOUNT_DIRS[@]}" ; do
2286
            if  mountpoint -q "$drive_dir" ; then
2287
                if ! realpath "${WINEPREFIX}/dosdevices"/*: | grep -w "$drive_dir"$ &>/dev/null ; then
2288 2289 2290 2291 2292 2293 2294
                    drive_num=0
                    while [[ "$drive_num" -lt "${#DRIVES[@]}" ]] ; do
                        drive_path="${WINEPREFIX}/dosdevices/${DRIVES[$drive_num]}:"
                        mount_point=$(df -P "$drive_dir" | awk 'NR==2 {print $1}')
                        mount_name=$(lsblk -no pkname "$mount_point" 2>/dev/null)

                        if [[ ! -L "$drive_path" ]] ; then
2295
                            if [[ $(<"/sys/class/block/$mount_name/removable") != "1" ]] 2>/dev/null ; then
2296
                                if [[ ! "$mount_point" =~ "mmc" ]] ; then
2297
                                    ln -sf "$drive_dir" "$drive_path"
2298
                                    print_info "Mounted ${drive_dir} to ${drive_path}"
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310
                                    break
                                else
                                    ((drive_num++))
                                fi
                            else
                                ((drive_num++))
                            fi
                        else
                            ((drive_num++))
                        fi
                    done
                fi
2311 2312 2313 2314
            fi
        done
    }

2315
check_nvidia_rtx () {
2316
    if [[ "$LSPCI_VGA" == *nvidia* ]] ; then
2317
        # Turing (without nvidia 16XX)
2318
        [[ "$LSPCI_VGA" == *TU[0-9]* ]] && [[ "$LSPCI_VGA" != *TU11[6-7]* ]] && return 0
2319
        # Ampere
2320
        [[ "$LSPCI_VGA" == *GA[0-9]* ]] && return 0
2321
        # Ada_Lovelace
2322
        [[ "$LSPCI_VGA" == *AD[0-9]* ]] || [[ "$LSPCI_VGA" == *2[6-8][0-9]* ]] && return 0
2323 2324 2325 2326
    fi
    return 1
}

castro-fidel's avatar
castro-fidel committed
2327
pw_init_db () {
2328
    if [[ -f "${portwine_exe}" ]] ; then
2329
        PORTWINE_DB="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2330
        export PORTWINE_DB
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2331 2332 2333 2334 2335 2336
        if echo "${PORTWINE_DB}" | grep -i "_vo_\|_gv_" &>/dev/null ; then
            print_warning "Force use gamesvoice.ppdb file!"
            PORTWINE_DB_FILE="${PORT_SCRIPTS_PATH}/portwine_db/gamesvoice.ppdb"
            # shellcheck source=/dev/null
            source "${PORTWINE_DB_FILE}"
        elif [[ -f "${portwine_exe}".ppdb ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2337 2338 2339
            PORTWINE_DB_FILE="${portwine_exe}".ppdb
            # shellcheck source=/dev/null
            source "${PORTWINE_DB_FILE}"
2340
            if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then
Vladislav's avatar
Vladislav committed
2341
                if [[ -z $(lsbash "${PORT_WINE_PATH}/prefixes/" --grep ^"${PW_PREFIX_NAME}"$) ]] \
2342
                || [[ -z $(grep -e ^"export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]]
2343 2344 2345 2346
                then
                    PW_PREFIX_NAME=$(echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
                    edit_db_from_gui PW_PREFIX_NAME
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2347
            fi
2348 2349
        else
            IFS=$'\n'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2350 2351
            PW_FIND_DB_FILE=$(grep -ilw "#${PORTWINE_DB}.exe" "${PORT_SCRIPTS_PATH}/portwine_db"/* | sed s/".exe"/""/gi)
            if [[ $(echo "$PW_FIND_DB_FILE" | wc -l) -gt 1 ]] ; then
2352
                unset ADD_CB_DBFILE
castro-fidel's avatar
castro-fidel committed
2353
                for PW_CHECK_DB_FILE in $PW_FIND_DB_FILE ; do
2354
                    if [[ -z "${ADD_CB_DBFILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2355
                        ADD_CB_DBFILE="$(echo "${PW_CHECK_DB_FILE}" | awk -F'/' '{print $NF}')"
2356
                    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2357
                        ADD_CB_DBFILE="$(echo "${PW_CHECK_DB_FILE}" | awk -F'/' '{print $NF}')!${ADD_CB_DBFILE}"
2358 2359
                    fi
                done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2360
                PORTWINE_DB_FILE="${PORT_SCRIPTS_PATH}/portwine_db"/$("${pw_yad}" --text-align=center \
2361
                --text "${translations[More than one DB file found for the application being launched.\\nSelect the required one, or delete the extra DB file before the next run.\\n]}" --borders="${YAD_BORDERS}" --form \
2362
                --title "Database file selection..." --window-icon="$PW_GUI_ICON_PATH/portproton.svg"  --form --separator="" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2363
                --field="DB FILE: :CB" "${ADD_CB_DBFILE}" 2>/dev/null)
2364
                if [[ "$?" == "1" || "$?" == "252" ]] ; then exit 0 ; fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2365
            elif [[ $(echo "$PW_FIND_DB_FILE" | wc -l) -eq 1 ]] ; then
castro-fidel's avatar
castro-fidel committed
2366
                PORTWINE_DB_FILE="${PW_FIND_DB_FILE}"
2367 2368
            fi
            IFS="$orig_IFS"
2369

2370 2371 2372 2373 2374
            if [[ -f "${PW_FIND_DB_FILE}" ]] ; then
                # shellcheck source=/dev/null
                source "${PORTWINE_DB_FILE}"
            fi

2375
            if [[ -f "${PW_FIND_DB_FILE}" ]] \
2376
            && [[ "${PW_DISABLED_CREATE_DB}" != 1 ]]
2377
            then
castro-fidel's avatar
castro-fidel committed
2378
                try_copy_file "${PW_FIND_DB_FILE}" "${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2379
                PORTWINE_DB_FILE="${portwine_exe}".ppdb
2380
                if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then
Vladislav's avatar
Vladislav committed
2381
                    if [[ -z $(lsbash "${PORT_WINE_PATH}/prefixes/" --grep ^"${PW_PREFIX_NAME}"$) ]] \
2382
                    || [[ -z $(grep -e ^"export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]]
2383 2384 2385 2386 2387
                    then
                        PW_PREFIX_NAME=$(echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
                        edit_db_from_gui PW_PREFIX_NAME
                    fi
                fi
2388
            fi
2389
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2390

2391
        if [[ -f "${PORTWINE_DB_FILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2392 2393
            # shellcheck source=/dev/null
            source "${PORTWINE_DB_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2394
            init_wine_ver &&
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2395
            print_info "Use $PORTWINE_DB_FILE db file."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2396 2397
        else
            if [[ "${PW_DISABLED_CREATE_DB}" != 1 ]] ; then
2398
                if [[ -n "${PORTWINE_DB}" ]] ; then
2399 2400
                    PORTWINE_DB_FILE=$(grep -il "#${PORTWINE_DB}.exe" "${PORT_SCRIPTS_PATH}/portwine_db"/*)
                    export PORTWINE_DB_FILE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2401 2402 2403 2404 2405 2406 2407 2408 2409
                    if [[ -z "${PORTWINE_DB_FILE}" ]] ; then
                        {
                            echo "#!/usr/bin/env bash"
                            echo "#Author: ${USER}"
                            echo "#${PORTWINE_DB}.exe"
                            echo "#Rating=1-5"
                        } > "${portwine_exe}".ppdb
                        export PORTWINE_DB_FILE="${portwine_exe}".ppdb
                    fi
2410 2411
                    if [[ "${portwine_exe}" =~ "/data/prefixes/" ]] && \
                    [[ ! "${portwine_exe}" =~ "/data/prefixes/DEFAULT/" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2412 2413 2414 2415 2416 2417 2418 2419
                    then
                        PW_PREFIX_NAME=$(echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
                    fi
                    # shellcheck source=/dev/null
                    source "${PORTWINE_DB_FILE}"
                fi
                edit_db_from_gui PW_VULKAN_USE PW_WINE_USE PW_PREFIX_NAME
            fi
2420
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2421

2422
        if [[ -z "${PATH_TO_GAME}" ]] || [[ ! -d "${PATH_TO_GAME}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2423 2424
            PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"
            export PATH_TO_GAME
2425
        fi
2426

2427
        if [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] && [[ -n "${WINE_CPU_TOPOLOGY}" ]] ; then
2428 2429
            export PW_WINE_CPU_TOPOLOGY="${WINE_CPU_TOPOLOGY}"
        fi
Vladislav's avatar
Vladislav committed
2430
        if lsbash "${PATH_TO_GAME}"/*_Data/Resources/ --grep "unity" &>/dev/null \
2431
        && [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] \
2432
        && [[ $(grep -c ^"processor" /proc/cpuinfo) -gt "8" ]]
2433
        then
Vladislav's avatar
Vladislav committed
2434 2435
            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"
2436
        fi
2437
    fi
2438

2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474
	case "${PW_AMD_VULKAN_USE}" in
		"amdvlk")
		    PW_VK_ICD_FILENAMES=""
		    for dir in /opt/amdgpu/etc/vulkan/icd.d /etc/vulkan/icd.d /usr/share/vulkan/icd.d; do
		        for file in "$dir"/amd_icd*.json; do
		            [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file"
		        done
		    done
		    export PW_VK_ICD_FILENAMES
		    ;;

		"amdgpupro")
		    PW_VK_ICD_FILENAMES=""
		    for dir in /opt/amdgpu-pro/etc/vulkan/icd.d /usr/share/vulkan/icd.d; do
		        for file in "$dir"/amd_pro_icd*.json; do
		            [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file"
		        done
		    done

			# add libs from https://github.com/CosmicFusion/fedora-amdgpu-pro/tree/main/x86_64/libdrm-pro to ld_library_path (this repo is deprecated and archived but why not)
		    echo "$PW_VK_ICD_FILENAMES" | grep -qi "/opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd.*.json" && \
            var_ld_library_path_update "/opt/amdgpu/libdrm/lib64:/opt/amdgpu/libdrm/lib32"
            
		    export PW_VK_ICD_FILENAMES
		    ;;

		"radv")
		    PW_VK_ICD_FILENAMES=""
		    for file in /usr/share/vulkan/icd.d/radeon_icd.{i686,x86_64}.json; do
		        [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file"
		    done
		    export PW_VK_ICD_FILENAMES
		    ;;
	esac


2475
    [[ "${START_FROM_STEAM}" == 1 ]] && export PW_GUI_DISABLED_CS=1
2476
    [[ "${START_FROM_PP_GUI}" == 1 ]] && export PW_GUI_DISABLED_CS=0 && unset START_FROM_PP_GUI
2477
	
2478
    return 0
2479 2480
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2481
# GUI UPDATE SCRIPTS
castro-fidel's avatar
castro-fidel committed
2482
pw_port_update () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2483
    case "$BRANCH" in
2484 2485
        master|stable)
            BRANCH_VERSION_UPDATE="SCRIPTS_STABLE_VERSION"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2486 2487
            BRANCH="master"
            ;;
2488 2489
         devel|beta)
            BRANCH_VERSION_UPDATE="SCRIPTS_NEXT_VERSION"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2490 2491 2492 2493
            BRANCH="devel"
            ;;
    esac

2494
    if [[ ! -f "${PORT_WINE_TMP_PATH}/scripts_ver" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2495
        echo "2024" > "${PORT_WINE_TMP_PATH}/scripts_ver"
2496
    fi
2497 2498 2499

    URL_ETERFUND="https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/raw/${BRANCH}/data_from_portwine/scripts/var"
    URL_GITHUB="https://raw.githubusercontent.com/Castro-Fidel/PortWINE/${BRANCH}/data_from_portwine/scripts/var"
2500
    URL_PP_GITEA="https://git.linux-gaming.ru/CastroFidel/PortWINE/raw/branch/${BRANCH}/data_from_portwine/scripts/var"
2501 2502

    pw_check_update () {
Vladislav's avatar
Vladislav committed
2503
        debug_timer --start -s "UPDATE_ETERFUND"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2504
        if ! timeout 2 curl -f -s --list-only "$URL_ETERFUND" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
2505
        then
2506 2507 2508
            print_warning "https://gitlab.eterfund.ru/ broken. Skip it..."
            UPDATE_SKIP_ETERFUND="1"
        fi
Vladislav's avatar
Vladislav committed
2509
        debug_timer --end -s "UPDATE_ETERFUND"
2510

Vladislav's avatar
Vladislav committed
2511
        debug_timer --start -s "UPDATE_GITHUB"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2512
        if ! timeout 2 curl -f -s --list-only "$URL_GITHUB" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
2513 2514 2515 2516
        then
            print_warning "https://raw.githubusercontent.com/ broken. Skip it..."
            UPDATE_SKIP_GITHUB="1"
        fi
Vladislav's avatar
Vladislav committed
2517
        debug_timer --end -s "UPDATE_GITHUB"
2518

2519 2520 2521 2522 2523 2524 2525 2526
        debug_timer --start -s "UPDATE_PP_GITEA"
        if ! timeout 2 curl -f -s --list-only "$URL_PP_GITEA" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
        then
            print_warning "https://git.linux-gaming.ru/ broken. Skip it..."
            UPDATE_SKIP_PP_GITEA="1"
        fi
        debug_timer --end -s "UPDATE_PP_GITEA"

2527
        if [[ "$UPDATE_SKIP_ETERFUND" == "1" ]] \
2528 2529
        && [[ "$UPDATE_SKIP_GITHUB" == "1" ]] \
        && [[ "$UPDATE_SKIP_PP_GITEA" == "1" ]] ; then
2530 2531 2532
            print_error "Unable to determine the version on the server. Skip it..."
            return 1
        fi
2533

2534
        read -r -a PW_UPDATE_ALL_LIST <<< "$UPDATE_ETERFUND $UPDATE_GITHUB $UPDATE_PP_GITEA"
2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545

        UPDATE_MIN=${PW_UPDATE_ALL_LIST[0]}
        for i in "${!PW_UPDATE_ALL_LIST[@]}"; do
        if (( ${PW_UPDATE_ALL_LIST[$i]} < UPDATE_MIN )) ; then
            UPDATE_MIN=${PW_UPDATE_ALL_LIST[$i]}
        fi
        done

        UPDATE_DAYS=$(date +%-j)
        UPDATE_MINUTES=$(($(date +%-H) * 60 + $(date +%-M)))
        if [[ "$UPDATE_ETERFUND" == "$UPDATE_MIN" ]] ; then
2546
            print_info "Selected https://gitlab.eterfund.ru/"
2547 2548 2549
            echo "$UPDATE_DAYS $UPDATE_MINUTES UPDATE_ETERFUND $UPDATE_MINUTES" > "${PORT_WINE_TMP_PATH}/update_skip_mirror"
            UPDATE_URL_MIRROR="UPDATE_ETERFUND"
        elif [[ "$UPDATE_GITHUB" == "$UPDATE_MIN" ]] ; then
2550
            print_info "Selected https://raw.githubusercontent.com/"
2551 2552
            echo "$UPDATE_DAYS $UPDATE_MINUTES UPDATE_GITHUB $UPDATE_MINUTES" > "${PORT_WINE_TMP_PATH}/update_skip_mirror"
            UPDATE_URL_MIRROR="UPDATE_GITHUB"
2553 2554 2555 2556
        elif [[ "$UPDATE_PP_GITEA" == "$UPDATE_MIN" ]] ; then
            print_info "Selected https://git.linux-gaming.ru/"
            echo "$UPDATE_DAYS $UPDATE_MINUTES UPDATE_PP_GITEA $UPDATE_MINUTES" > "${PORT_WINE_TMP_PATH}/update_skip_mirror"
            UPDATE_URL_MIRROR="UPDATE_PP_GITEA"
2557
        fi
Vladislav's avatar
Vladislav committed
2558
        PW_FORCE_UPDATE="1"
2559 2560
    }

Vladislav's avatar
Vladislav committed
2561 2562 2563
    [[ ! -f "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ]] && echo "1" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    scripts_update_not=$(<"${PORT_WINE_TMP_PATH}/scripts_update_notifier")

2564 2565 2566
    if [[ ! -f "${PORT_WINE_TMP_PATH}/update_skip_mirror" ]] ; then
        pw_check_update
    else
2567 2568 2569 2570
        read -r -a CHECK_UPDATE_MIRROR <"${PORT_WINE_TMP_PATH}/update_skip_mirror"
        UPDATE_SKIP_DAYS="${CHECK_UPDATE_MIRROR[0]}"
        UPDATE_DATE_MIRROR="${CHECK_UPDATE_MIRROR[1]}"
        UPDATE_SKIP_DATE="${CHECK_UPDATE_MIRROR[3]}"
2571 2572
        UPDATE_DAYS=$(date +%-j)
        UPDATE_MINUTES=$(($(date +%-H) * 60 + $(date +%-M)))
Vladislav's avatar
Vladislav committed
2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584
        if [[ "${scripts_update_not}" != "0" ]] ; then
            if (( $((UPDATE_DATE_MIRROR + 360)) <= UPDATE_MINUTES )) \
            || [[ "$UPDATE_SKIP_DAYS" != "$UPDATE_DAYS" ]] \
            || [[ "$PW_FORCE_UPDATE" == "1" ]] ; then
                pw_check_update
            fi
        else
            if [[ "$UPDATE_SKIP_DAYS" != "$UPDATE_DAYS" ]] ; then
                pw_check_update
            else
                return 0
            fi
2585 2586 2587
        fi
    fi

Vladislav's avatar
Vladislav committed
2588
    if (( $((UPDATE_SKIP_DATE + $(((RANDOM%11)+25)) )) <= UPDATE_MINUTES )) \
Vladislav's avatar
Vladislav committed
2589 2590 2591 2592 2593
    || [[ "$PW_FORCE_UPDATE" == "1" ]] \
    || [[ "${scripts_update_not}" == "2" ]] ; then
        if [[ "${scripts_update_not}" == "2" ]] ; then
            echo "1" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
        fi
Vladislav's avatar
Vladislav committed
2594
        print_info "Check update..."
2595
        if [[ -z "$UPDATE_URL_MIRROR" ]] ; then
2596
            UPDATE_URL_MIRROR="${CHECK_UPDATE_MIRROR[2]}"
2597 2598 2599 2600
            sed -i 's/[0-9]*$/'"$UPDATE_MINUTES"'/' "${PORT_WINE_TMP_PATH}/update_skip_mirror"
        fi
        case "$UPDATE_URL_MIRROR" in
            UPDATE_ETERFUND)
Vladislav's avatar
Vladislav committed
2601 2602 2603 2604 2605 2606 2607
                if [[ ! -f "${PORT_WINE_TMP_PATH}/curent_var_ver" ]] \
                && ! timeout 2 curl -f -s --list-only "$URL_ETERFUND" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
                then
                    pw_check_update
                fi
                URL_FOR_CHANGELOG="https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/raw/${BRANCH}/data_from_portwine"
                URL_TO_PW_BRANCH="https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/-/archive/${BRANCH}/PortWINE-${BRANCH}.tar.gz"
2608 2609
                ;;
            UPDATE_GITHUB)
Vladislav's avatar
Vladislav committed
2610 2611 2612 2613 2614 2615 2616
                if [[ ! -f "${PORT_WINE_TMP_PATH}/curent_var_ver" ]] \
                && ! timeout 2 curl -f -s --list-only "$URL_GITHUB" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
                then
                    pw_check_update
                fi
                URL_FOR_CHANGELOG="https://raw.githubusercontent.com/Castro-Fidel/PortWINE/${BRANCH}/data_from_portwine"
                URL_TO_PW_BRANCH="https://github.com/Castro-Fidel/PortWINE/archive/refs/heads/${BRANCH}.tar.gz"
2617
                ;;
2618 2619 2620 2621 2622 2623 2624 2625 2626 2627
            UPDATE_PP_GITEA)
                if [[ ! -f "${PORT_WINE_TMP_PATH}/curent_var_ver" ]] \
                && ! timeout 2 curl -f -s --list-only "$URL_PP_GITEA" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
                then
                    pw_check_update
                fi
                URL_FOR_CHANGELOG="https://git.linux-gaming.ru/CastroFidel/PortWINE/raw/branch/${BRANCH}/data_from_portwine"
                URL_TO_PW_BRANCH="https://git.linux-gaming.ru/CastroFidel/PortWINE/archive/${BRANCH}.tar.gz"
                UPDATE_PP_GITEA_FIX=1
                ;;
2628 2629 2630
        esac
    else
        return 0
2631
    fi
2632

Vladislav's avatar
Vladislav committed
2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646
    scripts_current_ver=$(grep "$BRANCH_VERSION_UPDATE" "${PORT_WINE_TMP_PATH}/curent_var_ver" | awk -F "=" '{print $2}')
    if [[ ! -f "${PORT_WINE_TMP_PATH}/update_remind_later" ]] ; then
        echo "$scripts_current_ver" > "${PORT_WINE_TMP_PATH}/update_remind_later"
    else
        PW_REMIND_LATER=$(<"${PORT_WINE_TMP_PATH}/update_remind_later")
        if [[ $PW_REMIND_LATER != "$scripts_current_ver" ]] ; then
            echo "2" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
            echo "$scripts_current_ver" > "${PORT_WINE_TMP_PATH}/update_remind_later"
            scripts_update_not=$(<"${PORT_WINE_TMP_PATH}/scripts_update_notifier")
        fi
    fi

    if [[ "${scripts_update_not}" == [12] ]] ; then
        [[ "$LANGUAGE" == ru ]] && local PW_CHANGELOG_FILE="changelog_ru" || local PW_CHANGELOG_FILE="changelog_en"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2647
        print_info "Scripts version in git = ${scripts_current_ver}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2648
        print_info "Scripts version local = ${scripts_install_ver}\n"
2649 2650
        if [[ -n "${scripts_current_ver}" ]] && [[ "${scripts_current_ver}" -gt "${scripts_install_ver}" ]] ; then
            echo "2" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
2651 2652
            if [[ -f "${PW_GUI_THEMES_PATH}/gui/yad_gui_pp" ]]
            then export pw_yad="${PW_GUI_THEMES_PATH}/gui/yad_gui_pp"
2653
            elif command -v yad &>/dev/null
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2654 2655
            then local pw_yad="yad"
            else local pw_yad="not_found"
2656
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2657 2658
            if [[ "${pw_yad}" == "not_found" ]] \
            || [[ "$PW_CHANGE_BRANCH" == "1" ]] ; then
2659
                YAD_STATUS=20
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2660
                unset PW_CHANGE_BRANCH
2661
            else
2662 2663 2664 2665 2666
                curl -s --list-only "${URL_FOR_CHANGELOG}/${PW_CHANGELOG_FILE}" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
                sed -i "/Scripts version ${scripts_install_ver}/,$ d" "${PORT_WINE_TMP_PATH}/curent_var_ver"

                "${pw_yad}" --title "${translations[Update scripts:]} v.(${scripts_install_ver}${BRANCH_VERSION})" \
                --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --width=1280 --height=720 --text-info --wrap --scroll \
2667 2668 2669
                --button="${translations[DO NOT REMIND ME]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":16 \
                --button="${translations[REMIND ME LATER]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":18 \
                --button="${translations[UPDATING NOW]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":20 < "${PORT_WINE_TMP_PATH}/curent_var_ver" 2>/dev/null
2670
                YAD_STATUS="$?"
2671

2672
                # --button="${translations[EXIT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":252 \
2673
            fi
2674 2675 2676 2677 2678 2679 2680 2681 2682
            try_remove_file "${PORT_WINE_TMP_PATH}/curent_var_ver"
            case $YAD_STATUS in
                1|252)
                    exit 0 ;;
                16)
                    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
                18)
                    : ;;
                20)
2683 2684
                    echo "######################################################"
                    print_info "Update scripts..."
2685 2686 2687 2688 2689 2690
                    if [[ $UPDATE_PP_GITEA_FIX == 1 ]] ; then
                        unset UPDATE_PP_GITEA_FIX
                        PW_NAME_ARCHIVE="portwine"
                    else
                        PW_NAME_ARCHIVE="PortWINE-${BRANCH}"
                    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2691 2692 2693
                    try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}.tar.gz"
                    if try_download "${URL_TO_PW_BRANCH}" "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}.tar.gz" no_mirror ; then
                        if unpack "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}.tar.gz" "${PORT_WINE_TMP_PATH}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2694 2695
                        then
                            create_new_dir "${PORT_WINE_TMP_PATH}/scripts_backup"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2696
                            cd "${PORT_WINE_PATH}/data/" || fatal
2697 2698 2699
                            tar -czpf "${PORT_WINE_TMP_PATH}/scripts_backup/scripts_v.${scripts_install_ver}.tar.gz" \
                            ./scripts ./img/gui ./locales ./themes ./changelog* ./dxvk.conf ./vkBasalt.conf ./tmp/scripts_ver
                            try_remove_dir "${PORT_WINE_PATH}/data/scripts/"
2700
                            cp -fr "${PORT_WINE_TMP_PATH}/$PW_NAME_ARCHIVE/data_from_portwine/"* "${PORT_WINE_PATH}/data/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2701
                            try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}.tar.gz"
2702
                            try_remove_dir "${PORT_WINE_TMP_PATH}/$PW_NAME_ARCHIVE/"
2703
                            echo "${scripts_current_ver}" > "${PORT_WINE_TMP_PATH}/scripts_ver"
2704
                            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
2705 2706
                            echo "Restarting PP after update..."
                            restart_pp
2707 2708
                        fi
                    else
2709
                        yad_error_download && pw_port_update || exit 1
2710 2711
                    fi ;;
            esac
2712 2713
        fi
    fi
2714
    return 0
2715 2716
}

2717 2718 2719 2720 2721
pw_check_command () {
    local S_CMD="${1//" "*/}"
    local F_CMD="$1"

    [[ -z "$TIMEOUT_CMD" ]] && TIMEOUT_CMD="3"
2722

2723 2724 2725 2726 2727 2728
    if command -v "$S_CMD" &>/dev/null ; then
        if ! timeout "$TIMEOUT_CMD" $F_CMD &> "${PW_TMPFS_PATH}/$S_CMD.tmp" ; then
            print_error "$S_CMD - broken!"
            unset TIMEOUT_CMD
            return 1
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2729
            # print_info "$S_CMD - found"
2730 2731
            unset TIMEOUT_CMD
            return 0
Vladislav's avatar
Vladislav committed
2732 2733
        fi
    else
2734 2735 2736
        print_warning "$S_CMD - not found!"
        unset TIMEOUT_CMD
        return 1
Vladislav's avatar
Vladislav committed
2737
    fi
2738 2739
}
export -f pw_check_command
Vladislav's avatar
Vladislav committed
2740

2741
pw_get_tmp_files () {
2742 2743 2744 2745 2746 2747
    for f_cmd in "gamescope --help" "lspci -k" "xrandr --current" "locale -a"
    do pw_check_command "$f_cmd"
    done

    TIMEOUT_CMD="5"
    if ! pw_check_command vulkaninfo ; then
Vladislav's avatar
Vladislav committed
2748 2749 2750 2751 2752
        print_warning "use portable vulkaninfo"
        "$PW_PLUGINS_PATH"/portable/bin/x86_64-linux-gnu-vulkaninfo &> "${PW_TMPFS_PATH}/vulkaninfo.tmp"
    fi
}

2753
pw_skip_get_info () {
Vladislav's avatar
Vladislav committed
2754
    if [[ "${SKIP_CHECK_UPDATES_NEW}" != "1" ]] ; then
2755
        background_pid --end "pw_get_tmp_files" "1"
Vladislav's avatar
Vladislav committed
2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797

        if [[ -f "${PW_TMPFS_PATH}/gamescope.tmp" ]] ; then
            export GAMESCOPE_INSTALLED="1"
        fi

        if [[ -f "${PW_TMPFS_PATH}/vulkaninfo.tmp" ]] ; then
            VULKAN_DRIVER_NAME="$(grep -e 'driverName' "${PW_TMPFS_PATH}/vulkaninfo.tmp" | awk '{print$3}' | head -1)"
            GET_GPU_NAMES=$(awk -F '=' '/deviceName/{print $2}' "${PW_TMPFS_PATH}/vulkaninfo.tmp" | sed '/llvm/d'| sort -u | sed 's/^ //' | paste -sd '!')
            export VULKAN_DRIVER_NAME GET_GPU_NAMES
        fi

        if [[ -f "${PW_TMPFS_PATH}/lspci.tmp" ]] ; then
            LSPCI_VGA="$(grep -e 'VGA|3D' "${PW_TMPFS_PATH}/lspci.tmp" | tr -d '\n')"
            export LSPCI_VGA
        fi

        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"
        fi

        if [[ -f "${PW_TMPFS_PATH}/xrandr.tmp" ]] ; then
            PW_SCREEN_RESOLUTION="$(<"${PW_TMPFS_PATH}/xrandr.tmp" sed -rn 's/^.*primary.* ([0-9]+x[0-9]+).*$/\1/p')"
            PW_SCREEN_PRIMARY="$(grep -e 'primary' "${PW_TMPFS_PATH}/xrandr.tmp" | awk '{print $1}')"
            export PW_SCREEN_PRIMARY PW_SCREEN_RESOLUTION
        fi

        if [[ -f "${PW_TMPFS_PATH}/locale.tmp" ]] ; then
            GET_LOCALE_LIST="ru_RU.utf en_US.utf zh_CN.utf ja_JP.utf ko_KR.utf"
            unset LOCALE_LIST
            for LOCALE in $GET_LOCALE_LIST ; do
                if [[ $(<"${PW_TMPFS_PATH}/locale.tmp") =~ $LOCALE ]] ; then
                    if [[ -n "$LOCALE_LIST" ]]
                    then LOCALE_LIST+="!$LOCALE"
                    else LOCALE_LIST="$LOCALE"
                    fi
                fi
            done
            export LOCALE_LIST
        fi

2798 2799 2800
        GET_AMD_VULKAN_DRIVER_LIST="amdvlk amdgpupro radv"
        unset AMD_VULKAN_DRIVER_LIST

2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
        if ! check_flatpak \
        && [[ $(check_vendor_gpu) =~ amd ]]
        then
            for DRIVER in $GET_AMD_VULKAN_DRIVER_LIST; do
                case "$DRIVER" in
                    "amdvlk")
                        for file in /opt/amdgpu/etc/vulkan/icd.d/amd_icd*.json \
                                    /etc/vulkan/icd.d/amd_icd*.json \
                                    /usr/share/vulkan/icd.d/amd_icd*.json ; do
                            if [ -f "$file" ]; then
                                AMD_VULKAN_DRIVER_LIST+="amdvlk"
                                break
                            fi
                        done
                        ;;
                    "amdgpupro")
                        for file in /opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd*.json \
                                    /usr/share/vulkan/icd.d/amd_pro_icd*.json; do
                            if [ -f "$file" ]; then
                                AMD_VULKAN_DRIVER_LIST+="!amdgpupro"
                                break
                            fi
                        done
                        ;;
                    "radv")
                        for file in /usr/share/vulkan/icd.d/radeon_icd.*.json ; do
                            if [ -f "$file" ]; then
                                AMD_VULKAN_DRIVER_LIST+="!radv"
                                break
                            fi
                        done
                        ;;
                esac
            done
            export AMD_VULKAN_DRIVER_LIST
            export AMD_VULKAN_CB=":CB"
2837
        else
2838
            export AMD_VULKAN_CB=":DCB"
2839 2840
        fi

2841
        logical_cores=$(grep -c ^"processor" /proc/cpuinfo)
Vladislav's avatar
Vladislav committed
2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852
        if [[ "${logical_cores}" -le "4" ]] ; then
            GET_LOGICAL_CORE="1!$(seq -s! 1 $(( logical_cores - 1 )))"
        else
            GET_LOGICAL_CORE="1!2!$(seq -s! 4 4 $(( logical_cores - 1 )))"
        fi
        export GET_LOGICAL_CORE

        export SKIP_CHECK_UPDATES_NEW="1"
    fi
}

2853
update_winetricks () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2854
    W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
2855 2856
    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}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2857
    W_TRX_INT_VER="$(grep -i 'WINETRICKS_VERSION=' "${PORT_WINE_TMP_PATH}/winetricks" | sed 's/WINETRICKS_VERSION=//')"
2858
    print_info "Version winetricks in port: ${W_TRX_INT_VER}"
2859 2860
    if [[ ! -f "${PORT_WINE_TMP_PATH}/winetricks" && -n "$W_TRX_EXT_VER" ]] \
    || [[ "$W_TRX_INT_VER" != "$W_TRX_EXT_VER" && -n "$W_TRX_EXT_VER" ]]
2861 2862
    then
        try_remove_file "${PORT_WINE_TMP_PATH}/winetricks"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2863
        if try_download "${W_TRX_URL}" "${PORT_WINE_TMP_PATH}/winetricks" no_mirror ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2864 2865
            W_TRX_INT_VER="$(grep -i 'WINETRICKS_VERSION=' "${PORT_WINE_TMP_PATH}/winetricks" | sed 's/WINETRICKS_VERSION=//')"
            print_info "Winetricks version in port has been updated (${W_TRX_INT_VER})"
2866 2867
            chmod u+x "${PORT_WINE_TMP_PATH}/winetricks"
        fi
2868
    fi
2869
    if  [[ -f "${PORT_WINE_TMP_PATH}/winetricks" ]] ; then
2870 2871
        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
2872
        sed -i 's/w_metadata vcrun2019 dlls \\/w_metadata !dont_use_2019! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
2873
        sed -i 's/w_set_winver win2k3/w_set_winver win7/' "${PORT_WINE_TMP_PATH}/winetricks"
2874
    fi
2875
    return 0
2876 2877 2878
}

edit_db_from_gui () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2879
    if [[ "${PW_DISABLED_CREATE_DB}" == "1" ]] ; then
2880 2881 2882
        print_warning "Skipped edit_db_from_gui"
        return 0
    fi
2883
    print_info "edit_db_from_gui PORTWINE_DB_FILE=$PORTWINE_DB_FILE"
2884
    if [[ -n "$PORTWINE_DB_FILE" ]] \
2885 2886
    && [[ -f "$PORTWINE_DB_FILE" ]]
    then
2887
        for mod_db in "$@" ; do
2888
            proxy_mod_db="${!mod_db}"
Vladislav's avatar
Vladislav committed
2889
            if [[ $proxy_mod_db =~ (${translations[Disabled]}|${translations[Disable]}) ]] ; then
2890
                proxy_mod_db=disabled
Vladislav's avatar
Vladislav committed
2891
            elif [[ $proxy_mod_db =~ (${translations[Enabled]}|${translations[Enable]}) ]] ; then
2892 2893
                proxy_mod_db=enabled
            fi
2894
            if [[ $(<"${PORTWINE_DB_FILE}") =~ export\ ${mod_db}= ]]
2895 2896
            then sed -i "s|export ${mod_db}=.*|export ${mod_db}=\"$proxy_mod_db\"|g" "${PORTWINE_DB_FILE}"
            else echo "export ${mod_db}=\"$proxy_mod_db\"" >> "${PORTWINE_DB_FILE}"
2897
            fi
2898 2899
        done
    fi
2900
    return 0
2901
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2902

2903
edit_user_conf_from_gui () {
2904
    for mod_db in "$@" ; do
2905
        if [[ -z "${!mod_db}" ]] ; then
2906 2907
            sed -i "/^export ${mod_db}=/d" "${USER_CONF}"
            continue
2908
        fi
2909
        proxy_mod_db="${!mod_db}"
Vladislav's avatar
Vladislav committed
2910
        if [[ $proxy_mod_db =~ (${translations[Disabled]}|${translations[Disable]}) ]] ; then
2911
            proxy_mod_db=disabled
Vladislav's avatar
Vladislav committed
2912
        elif [[ $proxy_mod_db =~ (${translations[Enabled]}|${translations[Enable]}) ]] ; then
2913 2914
            proxy_mod_db=enabled
        fi
2915
        if ! grep "export ${mod_db}=" "${USER_CONF}" &>/dev/null
2916
        then echo "export ${mod_db}=\"$proxy_mod_db\"" >> "${USER_CONF}"
2917 2918
        elif grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#" &>/dev/null
        then
2919 2920
            if [[ "$(grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#")" != "export ${mod_db}=\"$proxy_mod_db\"" ]]
            then sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"$proxy_mod_db\"/" "${USER_CONF}"
2921
            fi
2922 2923
        elif [[ "$(grep "export ${mod_db}=" "${USER_CONF}")" != "export ${mod_db}=$proxy_mod_db" ]]
        then sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"$proxy_mod_db\"/g" "${USER_CONF}"
2924 2925 2926 2927 2928
        fi
    done
    return 0
}

castro-fidel's avatar
castro-fidel committed
2929
pw_create_gui_png () {
2930
    unset PORTPROTON_NAME name_desktop_png
2931
    basename_portwine_exe="$(basename "${portwine_exe}")"
Vladislav's avatar
Vladislav committed
2932
    if echo "$basename_portwine_exe" | grep -ie 'setup\|install\|\.msi$' &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2933
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/setup.png"
2934 2935
        export name_desktop_png="setup"
        return 0
Vladislav's avatar
Vladislav committed
2936
    elif echo "$basename_portwine_exe" | grep -ie '\.reg$' &>/dev/null ; then
2937 2938 2939
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/reg.png"
        export name_desktop_png="reg"
        return 0
Vladislav's avatar
Vladislav committed
2940
    elif echo "$basename_portwine_exe"| grep -ie '\.bat$' &>/dev/null ; then
2941 2942
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/bat.png"
        export name_desktop_png="bat"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2943 2944
        return 0
    fi
2945
    if [[ -z "$PORTPROTON_NAME" ]] \
Vladislav's avatar
Vladislav committed
2946
    || [[ -z "$FILE_DESCRIPTION" ]] \
2947 2948
    || [[ "$PW_NO_RESTART_PPDB" == "1" ]]
    then
2949
        if [[ -n "${PORTWINE_CREATE_SHORTCUT_NAME}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2950
            PORTPROTON_NAME="${PORTWINE_CREATE_SHORTCUT_NAME}"
2951
        else
2952
            if command -v exiftool &>/dev/null ; then
Vladislav's avatar
Vladislav committed
2953 2954 2955 2956
                if timeout 3 exiftool "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then
                    PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
                    FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
                else
2957 2958
                    print_error "exiftool - broken!"
                fi
2959
            else
2960
                print_warning "use portable exiftool"
Vladislav's avatar
Vladislav committed
2961 2962 2963
                env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp"
                PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
                FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
2964 2965
            fi

2966
            if [[ "$PW_PRODUCTNAME" =~ (Launcher|RU) ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2967
            then
Vladislav's avatar
Vladislav committed
2968
                PW_PRODUCTNAME=$(echo "$PW_PRODUCTNAME" | sed -r "s/(Launcher|RU)//g")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2969 2970
            fi

2971
            if [[ -n "$PW_PRODUCTNAME" ]] \
2972
            && [[ ! "$PW_PRODUCTNAME" =~ Bootstrap ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2973 2974 2975
            then
                PORTPROTON_NAME="$PW_PRODUCTNAME"
            else
2976
                PORTPROTON_NAME="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2977
            fi
2978
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2979

Vladislav's avatar
Vladislav committed
2980
        PW_PRODUCTNAME=$(echo "$PW_PRODUCTNAME" | sed -r "s/(\`|\"|'|\!)//g")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2981
        export PORTPROTON_NAME
2982
        edit_db_from_gui PORTPROTON_NAME FILE_DESCRIPTION
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2983
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2984

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2985
    resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2986

2987
    PORTPROTON_NAME_PNG="${PORTPROTON_NAME// /_}"
castro-fidel's avatar
castro-fidel committed
2988
    if [[ -z "${PW_ICON_FOR_YAD}" ]] ; then
2989
        if [[ -n "$(file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}")" ]] ; then
2990
            export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png"
2991
        else
castro-fidel's avatar
castro-fidel committed
2992
            export PW_ICON_FOR_YAD="${PW_GUI_ICON_PATH}/port_proton.png"
2993
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2994 2995
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2996 2997 2998 2999

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3003 3004 3005
    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/"

3006
    pw_start_progress_bar_block "${translations[Searching for .exe files... Please wait.]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3007
    find "${PW_PATH_FOR_FIND}" -type f -name '*.exe' ${PW_FIND_TIME} | grep -viE ${PW_EXCLUDE_EXE_FIND} | \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3008
    awk -F"/prefixes/" '{print $2}' > "${PW_TMPFS_PATH}/tmp_yad_find_exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3009
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3010 3011

    unset FIND_TO_GUI
Vladislav's avatar
Vladislav committed
3012
    while read -r line; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3013
        FIND_TO_GUI+="${line}%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3014
    done < "${PW_TMPFS_PATH}/tmp_yad_find_exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3015

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3016
    IFS="%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3017
    PW_SET_FIND_EXE="$("${pw_yad}" --height="500" --width="800" --list --text-align=center \
3018 3019 3020
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[Create shortcut for...]}" \
    --text="\n${translations[Choose the .exe file for which you need to create a shortcut and click OK.\\n]}" \
    --column="${translations[Choose path to .exe file:]}" ${FIND_TO_GUI} \
3021 3022
    --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1 \
    --button="${translations[OK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null)"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3023
    YAD_STATUS="$?"
Vladislav's avatar
Vladislav committed
3024
    IFS="$orig_IFS"
3025

3026
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
3027 3028
        print_info "Restarting..."
        restart_pp
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3029
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3030

3031
    if [[ -n "${PW_SET_FIND_EXE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3032
        portwine_exe="${PW_PATH_FOR_FIND}$(echo "${PW_SET_FIND_EXE}" | awk -F'|' '{print $1}')"
Vladislav's avatar
Vladislav committed
3033
        portwine_create_shortcut
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3034
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3035
}
3036 3037 3038 3039

pw_create_unique_exe () {
    BASEDIR_GAME="$(dirname "$portwine_exe")"
    if [[ -d "$BASEDIR_GAME" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3040
        pushd "$BASEDIR_GAME" || fatal
3041
        BASENAME_GAME_EXE="$(basename "$portwine_exe")"
3042
        if [[ -n "$1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3043
            BASENAME_GAME="$(basename "$1" .exe).exe"
3044 3045
            ln -sf "$BASENAME_GAME_EXE" "$BASENAME_GAME"
            export portwine_exe="$BASEDIR_GAME/$BASENAME_GAME"
3046
        elif [[ -n "$PORTWINE_CREATE_SHORTCUT_NAME" ]] ; then
3047 3048
            ln -sf "$BASENAME_GAME_EXE" "$PORTWINE_CREATE_SHORTCUT_NAME.exe"
            export portwine_exe="$BASEDIR_GAME/$PORTWINE_CREATE_SHORTCUT_NAME.exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3049
        else
3050 3051
            print_warning "There are no arguments for creating a symbolic link! Skip it..."
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3052
        popd || fatal
3053 3054
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3055 3056

start_portwine () {
3057
    pw_skip_get_info
3058
    if [[ "${PW_LOCALE_SELECT}" != "disabled" ]] && [[ -n "${PW_LOCALE_SELECT}" ]] ; then
3059 3060 3061 3062 3063 3064 3065
        export LC_ALL="${PW_LOCALE_SELECT}"
        if [[ "${PW_USE_RUNTIME}" == "1" ]] && [[ "${HOST_LC_ALL}" != "${LC_ALL}" ]] ; then
            export HOST_LC_ALL="${LC_ALL}"
        fi
    else
        export PW_LOCALE_SELECT="disabled"
    fi
3066

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3067 3068
    WINEPREFIX="$(readlink -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}")"
    export WINEPREFIX
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3069

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083
    pw_get_pfx () {
        case "${PW_PREFIX_NAME}" in
              DOTNET) local FILE_NAME_PFX="dotpfx${DOTPFX_VER}" ;;
                   *) return 0 ;;
        esac

        local PFX_URL="github.com/Castro-Fidel/PortWINE/releases/download/${FILE_NAME_PFX}/${FILE_NAME_PFX}.tar.xz"
        local PFX_TMP="${PORT_WINE_PATH}/data/tmp/pfx"
        create_new_dir "${PFX_TMP}"

        # TODO: drop this fix legacy file .dotnet later
        if [[ -f "${WINEPREFIX}/.dotnet${DOTPFX_VER}" ]] ; then
            touch "${WINEPREFIX}/.${FILE_NAME_PFX}"
            try_remove_file "${WINEPREFIX}/.dotnet${DOTPFX_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3084 3085
        fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101
        if [[ ! -f "${WINEPREFIX}/.${FILE_NAME_PFX}" ]] ; then
            print_info "Download and install ${FILE_NAME_PFX} pfx..."
            if [[ ! -f "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz" ]] ; then
                if try_download "${PFX_URL}" "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz" ; then
                    if unpack "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz" "${PORT_WINE_PATH}/data/prefixes/"
                    then touch "${WINEPREFIX}/.${FILE_NAME_PFX}"
                    fi
                else
                    try_remove_file "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz"
                    yad_error_download && exit 1
                fi
            else
                if unpack "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz" "${PORT_WINE_PATH}/data/prefixes/"
                then touch "${WINEPREFIX}/.${FILE_NAME_PFX}"
                else
                    try_remove_file "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz"
3102
                    yad_error_download && exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3103
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3104
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3105
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3106 3107 3108 3109
        return 0
    }

    pw_get_pfx
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3110 3111 3112 3113 3114 3115 3116

    var_winedlloverride_update "${PW_MUST_WINEDLLOVERRIDES}"
    pw_list_install_dll_in_prefix
    if [[ "${PW_WINE_USE}" != "USE_SYSTEM_WINE" ]]
    then pw_check_and_download_wine "${PW_WINE_USE}"
    fi
    init_wine_ver
3117 3118 3119

    if [[ "$PW_USE_OBS_VKCAPTURE" == "1" ]] ; then
        export OBS_VKCAPTURE="1"
3120 3121
        export PW_USE_SYSTEM_VK_LAYERS="1"
        print_warning "System mangohud, vkBasalt, obs-vk capture and other applications using vulkan layers are forcibly used."
3122 3123
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3124 3125
    pw_init_runtime

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3126 3127 3128 3129 3130 3131
    if [[ "${PW_USE_GSTREAMER}" == "1" ]] ; then
        if [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] \
        && ! check_flatpak
        then
            export GST_PLUGIN_SYSTEM_PATH_1_0="${WINEDIR}/lib64/gstreamer-1.0:${WINEDIR}/lib/gstreamer-1.0"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3132
        export GST_GL_WINDOW="surfaceless"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3133 3134
        create_new_dir "${PORT_WINE_TMP_PATH}"/gstreamer_tmp/
        export WINE_GST_REGISTRY_DIR="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3135
        export MEDIACONV_AUDIO_DUMP_FILE="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/audiov2.foz
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3136 3137 3138 3139 3140 3141 3142
        export MEDIACONV_AUDIO_TRANSCODED_FILE="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/transcoded_audio.foz
        export MEDIACONV_VIDEO_DUMP_FILE="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/video.foz
        export MEDIACONV_VIDEO_TRANSCODED_FILE="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/transcoded_video.foz
    else
        var_winedlloverride_update "winegstreamer="
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3143
    check_variables VKD3D_DEBUG none
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3144
    check_variables VKD3D_SHADER_DEBUG none
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3145
    check_variables DXVK_LOG_LEVEL none
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3146
    check_variables DXVK_NVAPI_LOG_LEVEL none
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3147 3148
    check_variables VK_LOADER_DEBUG none
    check_variables VKBASALT_LOG_LEVEL none
3149
    if [[ "${PW_LOG}" == 1 ]] \
3150
    || [[ -n "$PW_DEBUG" ]]
3151
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3152
        export WINEDEBUG="+loaddll,+gstreamer"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3153 3154 3155 3156 3157 3158 3159 3160
        export WINE_MONO_TRACE="E:System.NotImplementedException"
        export VKBASALT_LOG_LEVEL="error"
    else
        export WINEDEBUG="-all"
        unset WINE_MONO_TRACE
    fi

    pw_wineboot () {
3161
        LIST_NATIVE_WINE_DLL_LINKS="winevulkan ir50_32 amd_ags_x64 wined3d vulkan-1"
3162 3163 3164
        for dll in $LIST_NATIVE_WINE_DLL_LINKS ; do
            try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll"
            try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3165 3166
        done

Vladislav's avatar
Vladislav committed
3167
        LIST_NATIVE_WINE_DLL_COPY="atl100 ntdll shell32"
3168 3169 3170 3171 3172 3173 3174
        for dll in $LIST_NATIVE_WINE_DLL_COPY ; do
            try_copy_file "${WINEDIR}/lib64/wine/x86_64-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll"
            try_copy_file "${WINEDIR}/lib/wine/i386-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll"
        done

        LIST_ICU_DLL_LINKS="icuin68 icuuc68 icudt68"
        for dll in $LIST_ICU_DLL_LINKS ; do
3175
            try_force_link_file "${WINEDIR}/lib/icu/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll"
3176
            try_force_link_file "${WINEDIR}/lib64/icu/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3177
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3178

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3179
        print_info "Used wineboot $@ for prefix: ${PW_PREFIX_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3180
        ${pw_runtime} GST_PLUGIN_SYSTEM_PATH_1_0="" LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3181
        WINEDEBUG="fixme-all,err+loaddll,err+dll,err+file,err+reg" \
Vladislav's avatar
Vladislav committed
3182
        "${WINELOADER}" wineboot $@ &>>"${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193
        wait_wineserver
        print_info "The prefix has been updated."
    }

    if [[ ! -d "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/windows ]] \
    || [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/userdef.reg ]] \
    || [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/system.reg ]] \
    || [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/user.reg ]]
    then
        pw_clear_pfx
        check_dirs_and_files_in_pfx
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3194
        if [[ "${PW_PREFIX_NAME}" == "DEFAULT" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3195
            pw_update_pfx_cover_gui
3196
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3197
            pw_wineboot -r
3198
        elif [[ "${PW_CHECK_AUTOINSTALL}" == 1 ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3199 3200
        && [[ "${DISABLE_CP_DEFPFX}" != 1 ]] ; then
            pw_update_pfx_cover_gui
3201
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3202
            pw_wineboot -r
3203
        elif [[ "${PW_CHECK_AUTOINSTALL}" == 1 ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3204 3205
        && [[ "${DISABLE_CP_DEFPFX}" == 1 ]] ; then
            pw_update_pfx_cover_gui
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3206
            unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3207
            pw_wineboot -i
3208
        elif yad_question "${translations[Do you want to installing recommended libraries in the new prefix:]} ${PW_PREFIX_NAME}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3209
            pw_update_pfx_cover_gui
3210
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3211 3212 3213
            pw_wineboot -r
        else
            pw_update_pfx_cover_gui
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3214
            unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3215 3216
            pw_wineboot -i
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3217
        pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3218 3219 3220
    else
        check_dirs_and_files_in_pfx
        if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3221
        || [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/windows/system32/shell32.dll" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3222 3223 3224 3225
        || ! grep "${PW_WINE_USE}" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver" &>/dev/null
        then
            pw_update_pfx_cover_gui
            pw_wineboot -r
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3226
            pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3227 3228
        fi
    fi
3229
    rm -f "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3230

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3231 3232
    echo "${PW_WINE_USE}" > "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver"

3233 3234 3235 3236 3237
    ULIMIT_HN=$(ulimit -Hn)
    if [[ $ULIMIT_HN -lt 524288 ]] ; then
        print_warning "ESYNC dont work! (ulimit -Hn $ULIMIT_HN < 524288)"
        export WINEESYNC="0"
    elif [[ "${PW_NO_ESYNC}" == 1 ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3238 3239 3240 3241 3242 3243 3244 3245 3246 3247
    then export WINEESYNC="0"
    else export WINEESYNC="1"
    fi

    if [[ "${PW_NO_FSYNC}" == 1 ]] ; then
        export WINEFSYNC="0"
        export WINEFSYNC_FUTEX2="0"
    else
        export WINEFSYNC="1"
        export WINEFSYNC_SPINCOUNT=100
3248
        check_variables WINEFSYNC_FUTEX2 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3249 3250
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3251 3252 3253 3254 3255 3256 3257 3258 3259 3260
    # export WINE_SIMULATE_ASYNC_READ=1
    # export WINE_FSYNC_SIMULATE_SCHED_QUANTUM=1
    # export WINE_ALERT_SIMULATE_SCHED_QUANTUM=1
    # export WINE_FSYNC_YIELD_TO_WAITERS=1
    # export WINE_KERNEL_STACK_SIZE=64
    # export WINE_DISABLE_KERNEL_WRITEWATCH=1
    # export WINE_SIMULATE_WRITECOPY="1"

    if [[ "${PW_NO_WRITE_WATCH}" == 1 ]] ; then
        export WINE_DISABLE_WRITE_WATCH="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273
    fi

    if [[ "${PW_FORCE_LARGE_ADDRESS_AWARE}" == 1 ]]
    then export WINE_LARGE_ADDRESS_AWARE="1"
    else export WINE_LARGE_ADDRESS_AWARE="0"
    fi

    if [[ "${PW_OLD_GL_STRING}" == 1 ]] ; then
        export MESA_EXTENSION_MAX_YEAR="2003" #mesa override
        export __GL_ExtensionStringVersion="17700" #nvidia override
    fi

    if [[ "${PW_VULKAN_NO_ASYNC}" == 1 ]] ; then
3274
        export RADV_DEBUG+="llvm "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3275
        var_vkd3d_config_update single_queue
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3276 3277
    else
        export DXVK_ASYNC="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3278 3279 3280 3281
    fi

    enabled_fake_nvidia_videocard ()
    {
3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300
        case "$1" in
            old)
                sed -i /'dxgi.customDeviceDesc =/c # dxgi.customDeviceDesc =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customDeviceId =/c dxgi.customDeviceId = 222F' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customVendorId =/c dxgi.customVendorId = 10de' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideAmdGpu =/c # dxgi.hideAmdGpu =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideNvidiaGpu =/c # dxgi.hideNvidiaGpu =' "${DXVK_CONFIG_FILE}"
                unset WINE_HIDE_NVIDIA_GPU WINE_HIDE_AMD_GPU
                unset DXVK_NVAPI_DRIVER_VERSION DXVK_NVAPI_ALLOW_OTHER_DRIVERS
                ;;

            new)
                sed -i /'dxgi.customDeviceDesc =/c dxgi.customDeviceDesc = "NVIDIA GeForce RTX 4090"' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customDeviceId =/c dxgi.customDeviceId = 2684' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customVendorId =/c dxgi.customVendorId = 10de' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideAmdGpu =/c dxgi.hideAmdGpu = True' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideNvidiaGpu =/c dxgi.hideNvidiaGpu = False' "${DXVK_CONFIG_FILE}"
                export WINE_HIDE_NVIDIA_GPU="0"
                export WINE_HIDE_AMD_GPU="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3301
                export DXVK_NVAPI_DRIVER_VERSION="99999"
3302 3303 3304
                export DXVK_NVAPI_ALLOW_OTHER_DRIVERS="1"
                export WINEHAGS="1"
                ;;
3305

3306 3307 3308 3309 3310 3311 3312 3313 3314 3315
            *)
                sed -i /'dxgi.customDeviceDesc =/c # dxgi.customDeviceDesc =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customDeviceId =/c # dxgi.customDeviceId =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.customVendorId =/c # dxgi.customVendorId =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideAmdGpu =/c # dxgi.hideAmdGpu =' "${DXVK_CONFIG_FILE}"
                sed -i /'dxgi.hideNvidiaGpu =/c # dxgi.hideNvidiaGpu =' "${DXVK_CONFIG_FILE}"
                unset WINE_HIDE_NVIDIA_GPU WINE_HIDE_AMD_GPU
                unset DXVK_NVAPI_DRIVER_VERSION DXVK_NVAPI_ALLOW_OTHER_DRIVERS
                ;;
        esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3316 3317
    }

3318 3319
    # NVAPI, DLSS AND FAKE DLSS
    if [[ "${PW_USE_FAKE_DLSS_3}" == "1" ]] ; then
3320
        FAKE_DLSS_3_FILES="amd_fidelityfx_dx12.dll amd_fidelityfx_vk.dll dlss-enabler.dll dlss-enabler-upscaler.dll
3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331
        dlssg_to_fsr3_amd_is_better-3.0.dll dlssg_to_fsr3_amd_is_better.dll libxess.dll nvapi64-proxy.dll winmm.dll
        _nvngx.dll nvngx-wrapper.dll nvngx.ini"
        DXVK_ENABLE_NVAPI="1"
        for cp_fdlls3 in $FAKE_DLSS_3_FILES ; do
            try_copy_file_with_checksums "${PW_PLUGINS_PATH}/fake_dlss_3/$cp_fdlls3" "${WINEPREFIX}/drive_c/windows/system32/$cp_fdlls3"
            [[ "$cp_fdlls3" == *.dll ]] && var_winedlloverride_update "${cp_fdlls3//.dll}=n"
        done
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/nvngx.dll"
        # try_copy_file_with_checksums "${PW_PLUGINS_PATH}/fake_dlss/${PW_FAKE_DLSS_VER}/nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/nvngx.dll"
        enabled_fake_nvidia_videocard new
    elif [[ "${PW_USE_FAKE_DLSS}" == "1" ]] ; then
3332 3333 3334 3335
        DXVK_ENABLE_NVAPI="1"
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/_nvngx.dll"
        try_copy_file_with_checksums "${PW_PLUGINS_PATH}/fake_dlss/${PW_FAKE_DLSS_VER}/nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/nvngx.dll"
        try_copy_file_with_checksums "${PW_PLUGINS_PATH}/fake_dlss/${PW_FAKE_DLSS_VER}/nvngx.ini" "${WINEPREFIX}/drive_c/windows/system32/nvngx.ini"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3336 3337
        enabled_fake_nvidia_videocard old
    elif [[ "${PW_USE_NVAPI_AND_DLSS}" == 1 ]] ; then
3338 3339
        DXVK_ENABLE_NVAPI="1"
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/nvngx.ini"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3340
        FIND_NVNGX="$(dirname $(find /usr/* -type f -name "nvngx.dll" 2>/dev/null | head -n 1 | awk '{print $1}'))"
3341
        if [[ -n "$FIND_NVNGX" ]] ; then
3342 3343
            try_copy_file_with_checksums "${FIND_NVNGX}/nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/nvngx.dll"
            try_copy_file_with_checksums "${FIND_NVNGX}/_nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/_nvngx.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3344
            export NVIDIA_WINE_DLL_DIR="${FIND_NVNGX}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3345
        else
3346 3347
            try_copy_file_with_checksums "${PW_PLUGINS_PATH}/nvngx/nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/nvngx.dll"
            try_copy_file_with_checksums "${PW_PLUGINS_PATH}/nvngx/_nvngx.dll" "${WINEPREFIX}/drive_c/windows/system32/_nvngx.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3348
            export NVIDIA_WINE_DLL_DIR="${PW_PLUGINS_PATH}/nvngx"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3349 3350
        fi
        enabled_fake_nvidia_videocard 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3351
        var_winedlloverride_update "nvngx,_nvngx=n"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3352
    else
3353
        DXVK_ENABLE_NVAPI="0"
3354 3355 3356
        for rm_dll in "nvngx.ini" "nvngx.dll" "_nvngx.dll" ; do
            try_remove_file "${WINEPREFIX}/drive_c/windows/system32/$rm_dll"
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3357 3358 3359
        enabled_fake_nvidia_videocard 0
        var_winedlloverride_update "nvngx,_nvngx="
    fi
3360
    export DXVK_ENABLE_NVAPI
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389

    if [[ "${PW_HEAP_DELAY_FREE}" == 1 ]]
    then export WINE_HEAP_DELAY_FREE="1"
    else export WINE_HEAP_DELAY_FREE="0"
    fi

    if [[ "${PW_WINE_ALLOW_XIM}" == 1 ]]
    then export WINE_ALLOW_XIM="1"
    else export WINE_ALLOW_XIM="0"
    fi

    if [[ "${PW_FIX_VIDEO_IN_GAME}" == 1 ]]
    then export WINE_DO_NOT_CREATE_DXGI_DEVICE_MANAGER="1"
    else export WINE_DO_NOT_CREATE_DXGI_DEVICE_MANAGER="0"
    fi

    [[ "${PW_MANGOHUD_USER_CONF}" == 1 ]] && unset MANGOHUD_CONFIG
    [[ "${PW_VKBASALT_USER_CONF}" == 1 ]] && unset PW_VKBASALT_EFFECTS PW_VKBASALT_FFX_CAS

    if [[ "${PW_USE_DXR11}" == 1 ]] \
    || [[ "${PW_USE_DXR10}" == 1 ]] \
    || [[ "${PW_USE_RAY_TRACING}" == 1 ]]
    then
        var_vkd3d_config_update dxr
        var_radv_perftest_config_update rt
    else
        var_vkd3d_config_update nodxr
    fi

3390
    if [[ "${PW_GPU_USE}" != "disabled" ]] && [[ "${PW_AMD_VULKAN_USE}" == "disabled" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3391 3392 3393 3394 3395
        export DXVK_FILTER_DEVICE_NAME="${PW_GPU_USE}"
        export VKD3D_FILTER_DEVICE_NAME="${PW_GPU_USE}"
    fi

    export int_xneur=0
3396 3397 3398
    if command -v xneur &>/dev/null \
    && pgrep xneur
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3399 3400 3401 3402
        killall xneur
        export int_xneur=1
    fi

3403
    #https://github.com/flathub/net.lutris.Lutris/pull/368#issuecomment-1751381312
3404
    [[ $(check_vendor_gpu) =~ nvidia ]] && export WEBKIT_DISABLE_DMABUF_RENDERER=1
3405

Vladislav's avatar
Vladislav committed
3406 3407
    if check_gamescope_session ; then
        export PW_GAMEMODERUN_SLR=""
3408 3409 3410
    elif [[ "$PW_USE_GAMEMODE" = "1" ]] \
    && [[ -n "$DBUS_SESSION_BUS_ADDRESS" ]]
    then
3411
        if command -v systemctl &>/dev/null \
3412
        && (systemctl is-active --quiet ananicy.service \
3413 3414 3415
        || systemctl is-active --quiet ananicy-cpp.service \
        || systemctl is-active --quiet scx.service \
        || systemctl is-active --quiet scx_loader.service)
3416 3417 3418 3419 3420 3421
        then
            export GAMEMODERUN=0
            export PW_GAMEMODERUN_SLR=""
            if command -v powerprofilesctl &>/dev/null ; then
                if powerprofilesctl list | grep -q 'performance:' ; then
                    export PW_POWERPROFILECTL_SLR="powerprofilesctl launch -p performance --"
3422
                    print_info "Gamemode replaced by powerprofilectl to avoid conflict with ananicy and sched-ext."
3423 3424
                else
                    export PW_POWERPROFILECTL_SLR=""
Vladislav's avatar
Vladislav committed
3425 3426
                fi
            fi
3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444
        elif check_flatpak ; then
            export GAMEMODERUN=1
            PW_GAMEMODERUN_SLR="gamemoderun"
            print_info "Gamemode will be launched."
        elif command -v gamemoded &>/dev/null ; then
            export GAMEMODERUN=1
            PW_GAMEMODERUN_SLR="gamemoderun"
            systemctl enable --now --user gamemoded &>/dev/null
            print_info "Gamemode will be launched."
        elif [[ "$PW_USE_RUNTIME" == 1 ]] ; then
            export GAMEMODERUN=1
            if ! pidof gamemoded &>/dev/null ; then
                GAMEMODEAUTO_NAME="libgamemodeauto.so.0"
                if [[ -n "${PW_LD_PRELOAD}" ]]; then
                    export PW_LD_PRELOAD="${PW_LD_PRELOAD}:${GAMEMODEAUTO_NAME}"
                else
                    export PW_LD_PRELOAD="${GAMEMODEAUTO_NAME}"
                fi
Vladislav's avatar
Vladislav committed
3445

3446 3447
                env LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32" \
                    "${PW_PLUGINS_PATH}/portable/bin/gamemoded" &>/dev/null &
Vladislav's avatar
Vladislav committed
3448

3449 3450
                print_info "Gamemode will be launched."
                sleep 0.1
Vladislav's avatar
Vladislav committed
3451
            fi
3452 3453 3454 3455
        else
            export GAMEMODERUN=0
            export PW_GAMEMODERUN_SLR=""
            print_info "Gamemode is not installed or disabled in vars script or db file: PW_USE_GAMEMODE=$PW_USE_GAMEMODE"
Vladislav's avatar
Vladislav committed
3456 3457 3458 3459 3460
        fi
    else
        export GAMEMODERUN=0
        export PW_GAMEMODERUN_SLR=""
    fi
3461

3462 3463 3464
    if command -v systemd-inhibit &>/dev/null \
    && [[ "$GAMEMODERUN" != "1" ]]
    then
3465
        PW_INHIBIT_SLR="systemd-inhibit --mode=block --who=ru.linux_gaming.PortProton --why=${translations[Launched]}"
3466 3467
        print_info "Screensaver will be inhibit"
    fi
Vladislav's avatar
Vladislav committed
3468
    pw_other_fixes
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3469

3470
    # enabled BattleEye_Runtime and EasyAntiCheat_Runtime
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486
    if [[ "${PW_USE_EAC_AND_BE}" == 1 ]] ; then
        export PROTON_BATTLEYE_RUNTIME="${PW_PLUGINS_PATH}/BattlEye_Runtime"
        export PROTON_EAC_RUNTIME="${PW_PLUGINS_PATH}/EasyAntiCheat_Runtime"
        var_winedlloverride_update "beclient,beclient_x64=b,n"
    else
        unset PROTON_BATTLEYE_RUNTIME PROTON_EAC_RUNTIME
    fi

    if [[ "${PW_REDUCE_PULSE_LATENCY}" == 1 ]] ; then
        export PULSE_LATENCY_MSEC=60
        # export PIPEWIRE_LATENCY=128/48000
    else
        unset PULSE_LATENCY_MSEC
    fi

    if [[ "$PW_USE_US_LAYOUT" == "1" ]] \
3487
    && ! check_wayland_session \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
    && command -v setxkbmap &>/dev/null
    then
        setxkbmap -model pc101 us -print | xkbcomp - $DISPLAY &>/dev/null
    else
        export PW_USE_US_LAYOUT="0"
    fi

    D3D_EXTRAS_LIBS="d3dcompiler_33 d3dcompiler_34 d3dcompiler_35 d3dcompiler_36 d3dcompiler_37
    d3dcompiler_38 d3dcompiler_39 d3dcompiler_40 d3dcompiler_41 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46
    d3dcompiler_47 d3dx10_33 d3dx10_34 d3dx10_35 d3dx10_36 d3dx10_37 d3dx10_38 d3dx10_39 d3dx10_40 d3dx10_41
    d3dx10_42 d3dx10_43 d3dx10 d3dx11_42 d3dx11_43 d3dx9_24 d3dx9_25 d3dx9_26 d3dx9_27 d3dx9_28 d3dx9_29 d3dx9_30
    d3dx9_31 d3dx9_32 d3dx9_33 d3dx9_34 d3dx9_35 d3dx9_36 d3dx9_37 d3dx9_38 d3dx9_39 d3dx9_40 d3dx9_41 d3dx9_42 d3dx9_43"
    if [[ "${PW_USE_D3D_EXTRAS}" == 1 ]] ; then
        if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3502
        || [[ -z "$(grep d3dx9 "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log")" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3503 3504 3505 3506 3507 3508
        then
            echo "d3dx9" >> "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
        fi
        # try link d3d extras libs
        PATH_TO_D3DEXTRAS="${PW_PLUGINS_PATH}/d3d_extras"
        for d3d_extras_from_plugins in $D3D_EXTRAS_LIBS ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3509 3510
            try_force_link_file "${PATH_TO_D3DEXTRAS}/x64/${d3d_extras_from_plugins}.dll" "${WINEPREFIX}/drive_c/windows/system32/${d3d_extras_from_plugins}.dll"
            try_force_link_file "${PATH_TO_D3DEXTRAS}/x32/${d3d_extras_from_plugins}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${d3d_extras_from_plugins}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3511
            var_winedlloverride_update "${d3d_extras_from_plugins}=n"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3512
            if [[ -z "$(grep "${d3d_extras_from_plugins}" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log")" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3513 3514 3515 3516 3517
                echo "${d3d_extras_from_plugins}" >> "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
            fi
        done
    else
        for d3d_extras_from_plugins in $D3D_EXTRAS_LIBS ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3518 3519
            try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${d3d_extras_from_plugins}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${d3d_extras_from_plugins}.dll"
            try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${d3d_extras_from_plugins}.dll" "${WINEPREFIX}/drive_c/windows/system32/${d3d_extras_from_plugins}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3520 3521 3522 3523 3524 3525
        done
    fi

    # fix physx
    PHYSX_PATH="${WINEPREFIX}/drive_c/Program Files (x86)/NVIDIA Corporation/PhysX/Common"
    for physx_dll in PhysXDevice PhysXLoader PhysXUpdateLoader ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3526 3527
        try_force_link_file "${PHYSX_PATH}/${physx_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${physx_dll}.dll"
        try_force_link_file "${PHYSX_PATH}/${physx_dll}64.dll" "${WINEPREFIX}/drive_c/windows/system32/${physx_dll}64.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3528
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3529 3530
    try_force_link_file "${PHYSX_PATH}/cudart32_65.dll" "${WINEPREFIX}/drive_c/windows/syswow64/cudart32_65.dll"
    try_force_link_file "${PHYSX_PATH}/cudart64_65.dll" "${WINEPREFIX}/drive_c/windows/system32/cudart64_65.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3531

3532
    # 3D API
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3533
    unset CP_VKD3D_FILES CP_DXVK_FILES CP_DGV2_FILES CP_WINE_FILES
3534
    unset CP_GALLIUM_NINE_FILES PATH_TO_DXVK_FILES PATH_TO_VKD3D_FILES
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3535
    case "${PW_VULKAN_USE}" in
3536 3537
        0)
            # WINED3D OPENGL
3538
            print_info "Use WINED3D OpenGL"
3539 3540
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3541
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
3542 3543 3544
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
3545
            export PW_VKBASALT="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3546
            ;;
3547 3548
        1)
            # STABLE DXVK AND VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3549 3550
            print_info "DXVK v.${DXVK_STABLE_VER} in use"
            print_info "VKD3D-PROTON v.${VKD3D_STABLE_VER} in use"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3551 3552
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_STABLE_VER}"
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_STABLE_VER}"
3553
            CP_DXVK_FILES="d3d11 d3d10core d3d10_1 d3d10 d3d9 dxgi openvr_api_dxvk"
3554
            CP_VKD3D_FILES="d3d12 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3555
            CP_WINE_FILES="d3d12core d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3556
            ;;
3557 3558
        2)
            # NEWEST DXVK AND VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3559 3560
            print_info "DXVK v.${DXVK_GIT_VER} in use"
            print_info "VKD3D-PROTON v.${VKD3D_GIT_VER} in use"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3561 3562
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_GIT_VER}"
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
3563
            CP_DXVK_FILES="d3d11 d3d10core d3d9 d3d8 dxgi openvr_api_dxvk"
3564
            CP_VKD3D_FILES="d3d12 d3d12core libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3565
            CP_WINE_FILES="d3d10_1 d3d10"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3566
            ;;
3567 3568
        3)
            # GALLIUM NINE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3569
            print_info "Use GALLIUM-NINE (Native DX9 on MESA drivers)"
3570
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
3571
            CP_GALLIUM_NINE_FILES="d3d9"
3572
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3573
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d8 dxgi"
3574 3575 3576
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
3577
            export PW_VKBASALT="0"
3578 3579
            export PW_MANGOHUD="0"
            export PW_WINE_FULLSCREEN_FSR="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3580
            ;;
3581 3582
        4)
            # GALLIUM ZINK
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3583
            print_info "Use GALLIUM-ZINK (OpenGL on MESA vulkan drivers)"
3584 3585
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3586
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
3587 3588 3589
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
3590 3591
            export  __GLX_VENDOR_LIBRARY_NAME="mesa"
            export MESA_LOADER_DRIVER_OVERRIDE="zink"
3592
            export GALLIUM_DRIVER="zink"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3593 3594
            if ! check_wayland_session \
            && ! check_gamescope_session \
3595
            && [[ "${PW_GAMESCOPE}" != "1" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3596
            then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3597 3598
                export LIBGL_KOPPER_DRI2="1"
            fi
3599
            if [[ $(check_vendor_gpu) =~ nouveau ]] ; then
3600 3601
                export NOUVEAU_USE_ZINK="1"
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3602
            ;;
3603 3604
        5)
            # LEGACY DXVK
3605
            print_info "DXVK v.${DXVK_LEGACY_VER} in use"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3606
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_LEGACY_VER}"
3607
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
3608
            CP_DXVK_FILES="d3d11 d3d10core d3d10_1 d3d10 d3d9 dxgi"
3609
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3610
            CP_WINE_FILES="d3d12 d3d12core d3d8"
3611
            ;;
3612 3613
        6)
            # WINED3D VULKAN (DAMAVAND)
3614
            print_info "Use DAMAVAND (DirectX to wined3d vulkan)"
3615 3616
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
3617
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
3618
            export WINE_D3D_CONFIG="renderer=vulkan"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3619 3620
            ;;
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3621

3622
    # DGVOODOO2 enable:
3623
    if [[ "${PW_DGVOODOO2}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3624
        print_info "Try create symlink DGVOODOO2 files..."
3625
        PATH_TO_DGV2_FILES="${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}"
Vladislav's avatar
Vladislav committed
3626
        CP_DGV2_FILES="d3d9 d3d8 d3dimm ddraw glide3x glide2x glide"
3627 3628 3629
        try_copy_file "${PATH_TO_DGV2_FILES}/dgVoodoo.conf" "${WINEPREFIX}/drive_c/windows/syswow64/"
        DGV2CONF="${WINEPREFIX}/drive_c/windows/syswow64/dgVoodoo.conf"
        if [[ "${PW_DGV2_DISABLE_D3D}" == "1" ]] ; then
Vladislav's avatar
Vladislav committed
3630
            rm_from_var CP_DGV2_FILES "d3d9 d3d8"
3631
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3632
            try_force_link_file "${PATH_TO_DGV2_FILES}/x64/d3d9.dll" "${WINEPREFIX}/drive_c/windows/system32/d3d9.dll"
3633
            try_remove_file "${WINEPREFIX}/drive_c/windows/system32/dgVoodoo.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3634
            try_force_link_file "${DGV2CONF}" "${WINEPREFIX}/drive_c/windows/system32/dgVoodoo.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3635 3636
            case "${PW_VULKAN_USE}" in
                0)
Vladislav's avatar
Vladislav committed
3637
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3638 3639 3640
                    ;;
                1)
                    rm_from_var CP_DXVK_FILES "d3d9"
Vladislav's avatar
Vladislav committed
3641
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3642 3643
                    ;;
                2)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3644
                    rm_from_var CP_DXVK_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3645 3646 3647
                    ;;
                3)
                    rm_from_var CP_GALLIUM_NINE_FILES "d3d9"
Vladislav's avatar
Vladislav committed
3648
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3649 3650
                    ;;
                4)
Vladislav's avatar
Vladislav committed
3651
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3652 3653 3654
                    ;;
                5)
                    rm_from_var CP_DXVK_FILES "d3d9"
Vladislav's avatar
Vladislav committed
3655
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3656 3657
                    ;;
                6)
Vladislav's avatar
Vladislav committed
3658
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3659 3660
                    ;;
            esac
3661
        fi
3662 3663 3664 3665 3666 3667 3668

        if [[ "${PW_DGV2_GLIDE_NAPALM}" == "1" ]] ; then
            rm_from_var CP_DGV2_FILES "glide3x"
            try_force_link_file "${PATH_TO_DGV2_FILES}/x32/glide3x-napalm.dll" "${WINEPREFIX}/drive_c/windows/syswow64/glide3x.dll"
            var_winedlloverride_update "glide3x=n"
        fi

3669
        for wine_dgv2_dll in $CP_DGV2_FILES ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3670
            try_force_link_file "${PATH_TO_DGV2_FILES}/x32/${wine_dgv2_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_dgv2_dll}.dll"
3671 3672 3673
            var_winedlloverride_update "${wine_dgv2_dll}=n"
        done
        # DGVOODOO2 settings:
3674
        if [[ "${PW_DGV2_USE_DX12}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3675
            if [[ "${PW_VULKAN_USE}" == "1" ]] || [[ "${PW_VULKAN_USE}" == "2" ]]
3676
            then sed -i "s/OutputAPI = d3d11_fl11_0/OutputAPI = d3d12_fl12_0/" "$DGV2CONF"
3677 3678
            fi
        fi
3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694

        if [[ "${PW_DGV2_ENABLE_CRT}" == "1" ]] ; then
            sed -i "s/ScalingMode = unspecified/ScalingMode = stretched_ar_crt/" "$DGV2CONF"
        else
            if [[ "${PW_DGV2_RESAMPLING}" != "disabled" ]] ; then
                sed -i "s/ScalingMode = unspecified/ScalingMode = stretched_ar/" "$DGV2CONF"
            elif [[ "${PW_DGV2_DISPLAY_ROI}" != "disabled" ]] ; then
                sed -i "s/ScalingMode = unspecified/ScalingMode = stretched_ar/" "$DGV2CONF"
            elif [[ "${PW_DGV2_CURSOR_SCALE}" != "0" ]] ; then
                sed -i "s/ScalingMode = unspecified/ScalingMode = stretched_ar/" "$DGV2CONF"
            else
                sed -i "s/ScalingMode = unspecified/ScalingMode = stretched/" "$DGV2CONF"
            fi
        fi

        [[ "${PW_DGV2_FREE_MOUSE}" == "1" ]] && sed -i "s/FreeMouse = false/FreeMouse = true/" "$DGV2CONF"
3695
        [[ "${PW_DGV2_FASTMEMORY}" == "1" ]] && sed -i "s/FastVideoMemoryAccess = false/FastVideoMemoryAccess = true/" "$DGV2CONF"
3696
        [[ "${PW_DGV2_FORCE_VSYNC}" == "1" ]] && sed -i "s/ForceVerticalSync = false/ForceVerticalSync = true/" "$DGV2CONF"
3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707
        [[ "${PW_DGV2_DISABLE_MIPMAPPING}" == "1" ]] && sed -i "s/DisableMipmapping = false/DisableMipmapping = true/g" "$DGV2CONF"
        [[ "${PW_DGV2_GLIDE_GAMMA_RAMP}" != "1" ]] && sed -i "s/EnableGlideGammaRamp = true/EnableGlideGammaRamp = false/" "$DGV2CONF"
        [[ "${PW_DGV2_BLIT_STRETCH}" == "1" ]] && sed -i "s/BilinearBlitStretch = false/BilinearBlitStretch = true/" "$DGV2CONF"
        [[ "${PW_DGV2_PHONG_SHADING}" == "1" ]] && sed -i "s/PhongShadingWhenPossible = false/PhongShadingWhenPossible = true/" "$DGV2CONF"
        [[ "${PW_DGV2_16_BIT_DEPTH_BUFFER}" == "1" ]] && sed -i "s/16BitDepthBuffer = false/16BitDepthBuffer = true/" "$DGV2CONF"
        [[ "${PW_DGV2_3DFX_SPLASH_SCREEN}" == "1" ]] && sed -i "s/3DfxSplashScreen = false/3DfxSplashScreen = true/" "$DGV2CONF"
        [[ "${PW_DGV2_3DFX_WATERMARK}" == "1" ]] && sed -i "s/3DfxWatermark = false/3DfxWatermark = true/" "$DGV2CONF"
        [[ "${PW_DGV2_FILTER_POINT_SAMPLED}" == "1" ]] && sed -i "s/KeepFilterIfPointSampled = false/KeepFilterIfPointSampled = true/" "$DGV2CONF"
        [[ "${PW_DGV2_DGVOODOO_WATERMARK}" == "1" ]] && sed -i "s/dgVoodooWatermark = false/dgVoodooWatermark = true/" "$DGV2CONF"
        [[ "${PW_DGV2_EMULATING_PCI_ACCESS}" == "1" ]] && sed -i "s/ForceEmulatingTruePCIAccess = false/ForceEmulatingTruePCIAccess = true/" "$DGV2CONF"
        [[ "${PW_DGV2_INACTIVE_APP_STATE}" == "1" ]] && sed -i "s/EnableInactiveAppState = false/EnableInactiveAppState = true/" "$DGV2CONF"
3708 3709 3710 3711 3712 3713 3714
        [[ "${PW_DGV2_DISPLAY_ROI}" != "disabled" ]] && sed -i "s/DisplayROI =/DisplayROI = ${PW_DGV2_DISPLAY_ROI}, pos:centered/" "$DGV2CONF"
        [[ "${PW_DGV2_FPS_LIMIT}" != "disabled" ]] && sed -i "s/FPSLimit = 0/FPSLimit = ${PW_DGV2_FPS_LIMIT}/" "$DGV2CONF"
        [[ "${PW_DGV2_BIT_DEPTH}" != "disabled" ]] && sed -i "s/DesktopBitDepth =/DesktopBitDepth = ${PW_DGV2_BIT_DEPTH}/" "$DGV2CONF"
        [[ "${PW_DGV2_CURSOR_SCALE}" != "0" ]] && sed -i "s/CursorScaleFactor = 0/CursorScaleFactor = ${PW_DGV2_CURSOR_SCALE}/" "$DGV2CONF"
        [[ "${PW_DGV2_BRIGHTNESS}" != "100" ]] && sed -i "s/Brightness = 100/Brightness = ${PW_DGV2_BRIGHTNESS}/" "$DGV2CONF"
        [[ "${PW_DGV2_COLOR}" != "100" ]] && sed -i "s/Color = 100/Color = ${PW_DGV2_COLOR}/" "$DGV2CONF"
        [[ "${PW_DGV2_CONTRAST}" != "100" ]] && sed -i "s/Contrast = 100/Contrast = ${PW_DGV2_CONTRAST}/" "$DGV2CONF"
3715

3716
        if [[ "${PW_DGV2_FILTERING}" != "disabled" ]] ; then
3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727
            case "$PW_DGV2_FILTERING" in
                "Point sampled") sed -i "s/\<Filtering = appdriven\>/Filtering = pointsampled/" "$DGV2CONF" ;;
                Bilinear) sed -i "s/\<Filtering = appdriven\>/Filtering = bilinear/" "$DGV2CONF" ;;
                "Linear mip") sed -i "s/\<Filtering = appdriven\>/Filtering = linearmip/" "$DGV2CONF" ;;
                Trilinear) sed -i "s/\<Filtering = appdriven\>/Filtering = trilinear/" "$DGV2CONF" ;;
                "Anisotropic 2x") sed -i "s/\<Filtering = appdriven\>/Filtering = 2/" "$DGV2CONF" ;;
                "Anisotropic 4x") sed -i "s/\<Filtering = appdriven\>/Filtering = 4/" "$DGV2CONF" ;;
                "Anisotropic 8x") sed -i "s/\<Filtering = appdriven\>/Filtering = 8/" "$DGV2CONF" ;;
                "Anisotropic 16x") sed -i "s/\<Filtering = appdriven\>/Filtering = 16/" "$DGV2CONF" ;;
            esac
            case "$PW_DGV2_FILTERING" in
3728 3729
                "Point sampled")
                    sed -i "s/TMUFiltering = appdriven/TMUFiltering = pointsampled/" "$DGV2CONF" ;;
3730
                Bilinear|"Linear mip"|Trilinear|"Anisotropic 2x"|"Anisotropic 4x"|"Anisotropic 8x"|"Anisotropic 16x")
3731
                    sed -i "s/TMUFiltering = appdriven/TMUFiltering = bilinear/" "$DGV2CONF" ;;
3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766
            esac
        fi

        if [[ "${PW_DGV2_ANTIALIASING}" != "disabled" ]] && [[ "${PW_DGV2_GLIDE_NAPALM}" != "1" ]] ; then
            sed -i "s/Antialiasing = appdriven/Antialiasing = ${PW_DGV2_ANTIALIASING}/g" "$DGV2CONF"
        elif [[ "${PW_DGV2_ANTIALIASING}" != "disabled" ]] && [[ "${PW_DGV2_GLIDE_NAPALM}" == "1" ]] ; then
            sed -i "86s/Antialiasing = appdriven/Antialiasing = ${PW_DGV2_ANTIALIASING}/" "$DGV2CONF"
        fi

        if [[ "${PW_DGV2_VRAM}" != "disabled" ]] ; then
            if [[ "${PW_DGV2_VIDEOCARD}" == "dgVoodoo2 SVGA 3D" ]] ; then
                if [[ "${PW_DGV2_VRAM}" -le "128" ]] ; then
                    sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
                else
                    sed -i "s/VRAM = 256/VRAM = 64/" "$DGV2CONF"
                fi
            fi
            [[ "${PW_DGV2_VIDEOCARD}" == "Geforce 4 Ti 4800" ]] && [[ "${PW_DGV2_VRAM}" -ge "64" ]] && [[ "${PW_DGV2_VRAM}" -le "256" ]] \
                && sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "ATI Radeon 8500" ]] && [[ "${PW_DGV2_VRAM}" -ge "64" ]] && [[ "${PW_DGV2_VRAM}" -le "256" ]] \
                && sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "Matrox Parhelia-512" ]] && [[ "${PW_DGV2_VRAM}" -ge "128" ]] && [[ "${PW_DGV2_VRAM}" -le "256" ]] \
                && sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "GeForce FX 5700 Ultra" ]] && [[ "${PW_DGV2_VRAM}" -ge "64" ]] && [[ "${PW_DGV2_VRAM}" -le "256" ]] \
                && sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
            if [[ "${PW_DGV2_VIDEOCARD}" == "GeForce 9800 GT" ]] ; then
                if [[ "${PW_DGV2_VRAM}" -ge "512" ]] && [[ "${PW_DGV2_VRAM}" -le "1024" ]] ; then
                    sed -i "s/VRAM = 256/VRAM = ${PW_DGV2_VRAM}/" "$DGV2CONF"
                else
                    sed -i "s/VRAM = 256/VRAM = 512/" "$DGV2CONF"
                fi
            fi
        else
            [[ "${PW_DGV2_VIDEOCARD}" == "dgVoodoo2 SVGA 3D" ]] && sed -i "s/VRAM = 256/VRAM = 64/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "GeForce 9800 GT" ]] && sed -i "s/VRAM = 256/VRAM = 512/" "$DGV2CONF"
3767
        fi
3768

3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781
        if [[ "$PW_DGV2_RESOLUTION" != "disabled" ]] ; then
            case "$PW_DGV2_RESOLUTION" in
                "2x app resolution")
                    sed -i "s/Resolution = unforced/Resolution = 2x/g" "$DGV2CONF" ;;
                "3x app resolution")
                    sed -i "s/Resolution = unforced/Resolution = 3x/g" "$DGV2CONF" ;;
                "4x app resolution")
                    sed -i "s/Resolution = unforced/Resolution = 4x/g" "$DGV2CONF" ;;
                *)
                    H_RES_DGV2="${PW_DGV2_RESOLUTION:0:4}"
                    V_RES_DGV2="${PW_DGV2_RESOLUTION:5:9}"
                    sed -i "s/Resolution = unforced/Resolution = h:$H_RES_DGV2, v:$V_RES_DGV2/g" "$DGV2CONF" ;;
            esac
3782 3783
        fi

3784 3785 3786 3787 3788 3789 3790
        if [[ "$PW_DGV2_RESAMPLING" != "disabled" ]] ; then
            case "$PW_DGV2_RESAMPLING" in
                "Point sampled") sed -i "s/Resampling = bilinear/Resampling = pointsampled/" "$DGV2CONF" ;;
                Lanczos-2) sed -i "s/Resampling = bilinear/Resampling = lanczos-2" "$DGV2CONF" ;;
                Bicubic) sed -i "s/Resampling = bilinear/Resampling = bicubic" "$DGV2CONF" ;;
                Lanczos-3) sed -i "s/Resampling = bilinear/Resampling = lanczos-3" "$DGV2CONF" ;;
            esac
3791 3792
        fi

3793 3794 3795 3796 3797 3798 3799 3800 3801
        if [[ $PW_DGV2_VIDEOCARD != "dgVoodoo2 Virtual 3D" ]] ; then
            case "$PW_DGV2_VIDEOCARD" in
                "dgVoodoo2 SVGA 3D") sed -i "s/VideoCard = internal3D/VideoCard = svga/" "$DGV2CONF" ;;
                "Geforce 4 Ti 4800") sed -i "s/VideoCard = internal3D/VideoCard = geforce_ti_4800/" "$DGV2CONF" ;;
                "ATI Radeon 8500") sed -i "s/VideoCard = internal3D/VideoCard = ati_radeon_8500/" "$DGV2CONF" ;;
                "Matrox Parhelia-512") sed -i "s/VideoCard = internal3D/VideoCard = matrox_parhelia-512/" "$DGV2CONF" ;;
                "GeForce FX 5700 Ultra") sed -i "s/VideoCard = internal3D/VideoCard = geforce_fx_5700_ultra/" "$DGV2CONF" ;;
                "GeForce 9800 GT") sed -i "s/VideoCard = internal3D/VideoCard = geforce_9800_gt/" "$DGV2CONF" ;;
            esac
3802 3803 3804
            if [[ "${PW_DGV2_VIDEOCARD}" == "Voodoo Graphics" ]] ; then
                sed -i "s/VideoCard = voodoo_2/VideoCard = voodoo_graphics/" "$DGV2CONF"
                sed -i "s/NumberOfTMUs = 2/NumberOfTMUs = 1/" "$DGV2CONF"
3805 3806 3807
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]]
                then sed -i "s/OnboardRAM = 8/OnboardRAM = 4/" "$DGV2CONF"
                else sed -i "s/OnboardRAM = 8/OnboardRAM = 2/" "$DGV2CONF"
3808 3809 3810 3811 3812
                fi
            fi
            if [[ "${PW_DGV2_VIDEOCARD}" == "Voodoo Rush" ]] ; then
                sed -i "s/VideoCard = voodoo_2/VideoCard = voodoo_rush/" "$DGV2CONF"
                sed -i "s/NumberOfTMUs = 2/NumberOfTMUs = 1/" "$DGV2CONF"
3813 3814 3815
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]]
                then sed -i "s/OnboardRAM = 8/OnboardRAM = 4/" "$DGV2CONF"
                else sed -i "s/OnboardRAM = 8/OnboardRAM = 2/" "$DGV2CONF"
3816 3817
                fi
            fi
3818 3819
            if [[ "${PW_DGV2_VIDEOCARD}" == "Voodoo 2" ]] && [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]] ; then
                sed -i "s/OnboardRAM = 8/OnboardRAM = 12/" "$DGV2CONF"
3820 3821 3822 3823 3824 3825 3826 3827
            fi
            if [[ "${PW_DGV2_VIDEOCARD}" == "Voodoo Banshee" ]] ; then
                sed -i "s/VideoCard = voodoo_2/VideoCard = voodoo_banshee/" "$DGV2CONF"
                sed -i "s/NumberOfTMUs = 2/NumberOfTMUs = 1/" "$DGV2CONF"
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]] ; then
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 16/" "$DGV2CONF"
                fi
            fi
3828
        fi
3829 3830 3831 3832
    else
        for rm_dgv2_dll in d3dimm glide glide2x glide3x ; do
            try_remove_file "${WINEPREFIX}/drive_c/windows/syswow64/${rm_dgv2_dll}.dll"
        done
Vladislav's avatar
Vladislav committed
3833
        add_to_var CP_WINE_FILES "ddraw"
3834 3835
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3836 3837 3838 3839 3840
    # force use dxgi.dll from wine
    if [[ "${PW_USE_WINE_DXGI}" == "1" ]] ; then
        rm_from_var CP_DXVK_FILES "dxgi"
        add_to_var CP_WINE_FILES "dxgi"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3841

Vladislav's avatar
Vladislav committed
3842 3843
    print_info "Try create symlink WINE files..."
    for copy_wine_dll in $CP_WINE_FILES ; do
3844 3845
        try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${copy_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${copy_wine_dll}.dll"
        try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${copy_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${copy_wine_dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3846
    done
3847

3848
    if [[ -n "$CP_DXVK_FILES" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3849
        print_info "Try create symlink DXVK files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3850
        for wine_dxvk_dll in $CP_DXVK_FILES ; do
Vladislav's avatar
Vladislav committed
3851
            if [[ -f "${PATH_TO_DXVK_FILES}/x64/${wine_dxvk_dll}.dll" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3852 3853
                try_force_link_file "${PATH_TO_DXVK_FILES}/x32/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_dxvk_dll}.dll"
                try_force_link_file "${PATH_TO_DXVK_FILES}/x64/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_dxvk_dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3854 3855 3856
                var_winedlloverride_update "${wine_dxvk_dll}=n"
            fi
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3857 3858 3859 3860
        create_new_dir "${PATH_TO_DXVK_FILES}/dxvk_cache"
        export DXVK_STATE_CACHE_PATH="${PATH_TO_DXVK_FILES}"/dxvk_cache
        export DXVK_STATE_CACHE="1"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3861

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3862
    if [[ "$DXVK_ENABLE_NVAPI" == "1" ]] ; then
Vladislav's avatar
Vladislav committed
3863
        print_info "Try create symlink NVAPI files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3864 3865
        try_force_link_file "${PATH_TO_DXVK_FILES}/x32/nvapi.dll" "${WINEPREFIX}/drive_c/windows/syswow64/nvapi.dll"
        try_force_link_file "${PATH_TO_DXVK_FILES}/x64/nvapi64.dll" "${WINEPREFIX}/drive_c/windows/system32/nvapi64.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3866 3867 3868 3869 3870 3871
        try_force_link_file "${PATH_TO_DXVK_FILES}/x64/nvofapi64.dll" "${WINEPREFIX}/drive_c/windows/system32/nvofapi64.dll"
        var_winedlloverride_update "nvapi64,nvofapi64,nvapi=n;nvcuda=b"
    else
        try_remove_file "${WINEPREFIX}/drive_c/windows/syswow64/nvapi.dll"
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/nvapi64.dll"
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/nvofapi64.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3872
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3873

3874
    if [[ -n "$CP_VKD3D_FILES" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3875
        print_info "Try create symlink VKD3D files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3876 3877
        for wine_vkd3d_dll in $CP_VKD3D_FILES ; do
            if [[ -f "${PATH_TO_VKD3D_FILES}/x64/${wine_vkd3d_dll}.dll" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3878 3879
                try_force_link_file "${PATH_TO_VKD3D_FILES}/x86/${wine_vkd3d_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_vkd3d_dll}.dll"
                try_force_link_file "${PATH_TO_VKD3D_FILES}/x64/${wine_vkd3d_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_vkd3d_dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3880 3881 3882 3883 3884 3885 3886
                var_winedlloverride_update "${wine_vkd3d_dll}=n"
            fi
        done
        create_new_dir "${PATH_TO_VKD3D_FILES}/vkd3d_cache"
        export VKD3D_SHADER_CACHE_PATH="${PATH_TO_VKD3D_FILES}/vkd3d_cache"
    fi

3887
    if [[ "$CP_GALLIUM_NINE_FILES" == "d3d9" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3888
        print_info "Try create symlink GALLIUM_NINE files..."
3889
        PATH_TO_GALLIUM_NINE_FILES="${PW_PLUGINS_PATH}/gallium_nine_v.${PW_GALLIUM_NINE_VER}"
3890 3891
        try_force_link_file "${PATH_TO_GALLIUM_NINE_FILES}/lib32/d3d9-nine.dll.so" "${WINEPREFIX}/drive_c/windows/syswow64/d3d9.dll"
        try_force_link_file "${PATH_TO_GALLIUM_NINE_FILES}/lib64/d3d9-nine.dll.so" "${WINEPREFIX}/drive_c/windows/system32/d3d9.dll"
3892 3893 3894
        unset FIND_D3D_MODULE D3D_MODULE_PATH
        if ! check_flatpak ; then
            FIND_D3D_MODULE=$(dirname $(find /usr/ -maxdepth 4 -type f -name "d3dadapter9.so.*") 2>/dev/null)
3895
            if [[ -n "$FIND_D3D_MODULE" ]] ; then
3896 3897
                IFS=$'\n'
                for D3D_MP in $FIND_D3D_MODULE ; do
3898
                    if [[ -n "$D3D_MODULE_PATH" ]]
3899 3900 3901 3902
                    then export D3D_MODULE_PATH="$D3D_MODULE_PATH:/run/host${D3D_MP}"
                    else export D3D_MODULE_PATH="/run/host${D3D_MP}"
                    fi
                done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3903
                IFS="$orig_IFS"
3904 3905 3906
                print_info "D3D_MODULE_PATH=${D3D_MODULE_PATH}"
            else
                pw_stop_progress_bar
3907
                yad_error "${translations[d3dadapter9.so.1.0.0 - Not found in the system.\\nInstall the missing package: <b>d3dadapter9</b>]}"
3908 3909 3910 3911 3912
                stop_portwine
            fi
        else
            export D3D_MODULE_PATH="/app/lib/i386-linux-gnu/GL/default/lib/d3d:/usr/lib/x86_64-linux-gnu/GL/default/lib/d3d"
            print_info "D3D_MODULE_PATH=${D3D_MODULE_PATH}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3913
        fi
3914
        var_winedlloverride_update "d3d9=n"
3915 3916
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3917 3918
    if [[ ! -d "${WINEPREFIX}/drive_c/vrclient/bin" ]] ; then
        create_new_dir "${WINEPREFIX}/drive_c/vrclient/bin"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3919 3920
        try_force_link_file "${WINEDIR}"/lib/wine/i386-windows/vrclient.dll "${WINEPREFIX}/drive_c/vrclient/bin/vrclient.dll"
        try_force_link_file "${WINEDIR}"/lib64/wine/x86_64-windows/vrclient_x64.dll "${WINEPREFIX}/drive_c/vrclient/bin/vrclient_x64.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3921 3922
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3923
    if [[ "${PW_USE_SHADER_CACHE}" == "1" ]] ; then
3924
        create_new_dir "${PW_VULKAN_DIR}/gl_shader_cache"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3925 3926 3927 3928
        export __GL_SHADER_DISK_CACHE="1"
        export __GL_SHADER_DISK_CACHE_PATH="${PW_VULKAN_DIR}/gl_shader_cache"
        export __GL_SHADER_DISK_CACHE_SIZE="50000000000"
        export __GL_SHADER_DISK_CACHE_SKIP_CLEANUP="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3929
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3930 3931 3932
        export __GL_SHADER_DISK_CACHE="0"
        export DXVK_STATE_CACHE="disable"
        export VKD3D_SHADER_CACHE_PATH="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3933 3934
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3935
    if [[ "${PW_WINE_FULLSCREEN_FSR}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3936
    && ! check_gamescope_session
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3937 3938 3939 3940
    then
        export WINE_FULLSCREEN_FSR="1"
        export WINE_FULLSCREEN_FSR_STRENGTH="2"
        export WINE_FULLSCREEN_INTEGER_SCALING="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3941
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3942
        export WINE_FULLSCREEN_FSR="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3943 3944 3945 3946 3947 3948 3949
        unset WINE_FULLSCREEN_FAKE_CURRENT_RES WINE_FULLSCREEN_FSR_STRENGTH WINE_FULLSCREEN_INTEGER_SCALING
    fi

    if [[ "${PW_WINE_CPU_TOPOLOGY}" != "disabled" ]] ; then
        export WINE_CPU_TOPOLOGY="${PW_WINE_CPU_TOPOLOGY}"
    fi

3950
    if [[ -n "${PW_VK_ICD_FILENAMES}" ]] ; then
3951 3952 3953 3954
        export VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES}"
        export VK_DRIVER_FILES="${PW_VK_ICD_FILENAMES}"
    fi

3955 3956
    if [[ "${PW_MESA_GL_VERSION_OVERRIDE}" != "disabled" ]] ; then
        export MESA_GL_VERSION_OVERRIDE="${PW_MESA_GL_VERSION_OVERRIDE}"
3957 3958 3959 3960 3961 3962
        if [[ $PW_MESA_GL_VERSION_OVERRIDE = 3.2COMPAT ]] ; then
            export MESA_GLSL_VERSION_OVERRIDE="150"
        else
            MESA_GLSL_VERSION_OVERRIDE="${PW_MESA_GL_VERSION_OVERRIDE//./}"
            export MESA_GLSL_VERSION_OVERRIDE="${MESA_GLSL_VERSION_OVERRIDE//COMPAT/}0"
        fi
3963 3964
    fi

3965 3966 3967 3968
    if [[ "${PW_VKD3D_FEATURE_LEVEL}" != "disabled" ]] ; then
        export VKD3D_FEATURE_LEVEL="${PW_VKD3D_FEATURE_LEVEL}"
    fi

3969 3970 3971
    if [[ "${PW_MESA_VK_WSI_PRESENT_MODE}" != "disabled" ]] ; then
        export MESA_VK_WSI_PRESENT_MODE="${PW_MESA_VK_WSI_PRESENT_MODE}"
        case "$PW_MESA_VK_WSI_PRESENT_MODE" in
3972 3973 3974 3975 3976 3977
            immediate|mailbox)
                export vblank_mode=0
                export __GL_SYNC_TO_VBLANK=0 ;;
            relaxed|fifo)
                export vblank_mode=1
                export __GL_SYNC_TO_VBLANK=1 ;;
3978 3979 3980
        esac
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3981
    #run_winetricks_from_db
3982
    if [[ -n "${PW_MUST_HAVE_DLL}" ]] ; then
3983 3984
        PW_DLL_INSTALL="$(echo "${PW_MUST_HAVE_DLL} ${PW_DLL_INSTALL}" | awk '{ for(i=1;i<=NF;i++){a[$i]++} }END{ for(i in a){printf("%s ",i)} }' )"
        export PW_DLL_INSTALL
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3985 3986
    fi

3987
    if [[ -n "${PW_DLL_INSTALL}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3988 3989
        export PW_DLL_NEED_INSTALL=""
        export USE_WT_FROM_DB=0
3990
        if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012
            touch "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
        fi
        for need_install_dll_to_pfx in ${PW_DLL_INSTALL} ; do
            if [[ "${need_install_dll_to_pfx}" == vcrun201[5-9] ]] \
            || [[ "${need_install_dll_to_pfx}" == vcrun2022 ]] ; then
                need_install_dll_to_pfx="vcrun2022"
                sed -i '/vcrun2015/d' "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
                sed -i '/vcrun2017/d' "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
                sed -i '/vcrun2019/d' "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
            fi
            grep "${need_install_dll_to_pfx}" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" &>/dev/null
            if [[ "$?" == "1" ]] ; then
                if [[ -z "${PW_DLL_NEED_INSTALL}" ]]
                then export PW_DLL_NEED_INSTALL="${need_install_dll_to_pfx}"
                else export PW_DLL_NEED_INSTALL="${need_install_dll_to_pfx} ${PW_DLL_NEED_INSTALL}"
                fi
                export USE_WT_FROM_DB=1
            fi
        done
        if [[ "${USE_WT_FROM_DB}" == "1" ]] ; then
            pw_update_pfx_cover_gui
            update_winetricks
Vladislav's avatar
Vladislav committed
4013 4014
            echo "START WINETRICKS..." >> "${PW_TMPFS_PATH}/update_pfx_log"
            echo "Try to install DLL in prefix: ${PW_DLL_NEED_INSTALL}" >> "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4015
            print_info "Try to install DLL in prefix: ${PW_DLL_NEED_INSTALL}"
4016
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Vladislav's avatar
Vladislav committed
4017
            "${PORT_WINE_TMP_PATH}/winetricks" -q -r -f ${PW_DLL_NEED_INSTALL} | tee -a "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4018 4019 4020 4021 4022 4023
            wait_wineserver
            kill_portwine
        fi
    fi

    if [[ -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4024
    && [[ -z $(grep "Windows $PW_WINDOWS_VER" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg") ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4025
    then
4026
        if [[ -n $PW_WINDOWS_VER ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4027 4028
        && [[ $(echo "$PW_WINDOWS_VER" | sed 's/.*/\L&/') == "xp" ]]
        then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4029 4030
            export PW_WINDOWS_VER="xp64"
        fi
4031
        ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4032
        "${WINELOADER}" winecfg -v $(echo "win${PW_WINDOWS_VER}" | sed 's/.*/\L&/')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4033 4034 4035 4036 4037
        wait_wineserver
        kill_portwine
        echo "Set to win${PW_WINDOWS_VER}"
    fi

4038
    if [[ $portwine_exe == *-Shipping.exe ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4039
        echo "Disable EAC"
Vladislav's avatar
Vladislav committed
4040
        [[ -z "$LAUNCH_PARAMETERS" ]] && export LAUNCH_PARAMETERS+=" -eac-nop-loaded "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4041
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4042

4043
    if [[ $PW_DINPUT_PROTOCOL == "1" ]] ; then
4044 4045
        get_and_set_reg_file --add 'System\CurrentControlSet\Services\winebus' 'DisableHidraw' 'REG_DWORD' "0" "system"
        get_and_set_reg_file --add 'System\CurrentControlSet\Services\winebus' 'Enable SDL' 'REG_DWORD' "0" "system"
Llein's avatar
Llein committed
4046
    else
4047 4048
        get_and_set_reg_file --add 'System\CurrentControlSet\Services\winebus' 'DisableHidraw' 'REG_DWORD' "1" "system"
        get_and_set_reg_file --add 'System\CurrentControlSet\Services\winebus' 'Enable SDL' 'REG_DWORD' "1" "system"
Vladislav's avatar
Vladislav committed
4049
    fi
Llein's avatar
Llein committed
4050

4051 4052
    if [[ $PW_WINE_DPI_VALUE != "disabled" ]] ; then
        if [[ $PW_WINE_DPI_VALUE == "recommended" ]] ; then
4053 4054 4055 4056 4057
            PW_RECOMMENDED_DPI=$(recommend_dpi "${PW_SCREEN_RESOLUTION:5:8}")
            get_and_set_reg_file --add 'Control Panel\Desktop' 'LogPixels' 'REG_DWORD' "$PW_RECOMMENDED_DPI" "user"
        else
            get_and_set_reg_file --add 'Control Panel\Desktop' 'LogPixels' 'REG_DWORD' "$PW_WINE_DPI_VALUE" "user"
        fi
4058 4059
    fi

4060
    if [[ $PW_USE_NATIVE_WAYLAND == "1" ]] ; then
4061 4062
        export PW_DISPLAY="env DISPLAY="
        export PW_USE_RUNTIME="0"
4063
        get_and_set_reg_file --add 'Software\Wine\Drivers' 'Graphics' 'REG_SZ' "x11,wayland" "user"
4064 4065
    else
        unset PW_DISPLAY
4066
        get_and_set_reg_file --delete 'Software\Wine\Drivers' 'Graphics'
4067 4068
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4069 4070 4071 4072 4073 4074 4075

    case "$PW_SOUND_DRIVER_USE" in
        pulse) get_and_set_reg_file --add 'Software\Wine\Drivers' 'Audio' 'REG_SZ' "pulse" "user" ;;
         alsa) get_and_set_reg_file --add 'Software\Wine\Drivers' 'Audio' 'REG_SZ' "alsa" "user" ;;
          oss) get_and_set_reg_file --add 'Software\Wine\Drivers' 'Audio' 'REG_SZ' "oss" "user" ;;
            *) get_and_set_reg_file --delete 'Software\Wine\Drivers' 'Audio' ;;
    esac
4076

4077
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4078 4079
    if ! check_start_from_steam ; then
        pw_tray_icon
4080 4081
    fi

4082
    if [[ $PW_CHECK_AUTOINSTALL != "1" ]] ; then
4083
        pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4084 4085 4086 4087 4088 4089 4090
    fi
    add_in_start_portwine

    if [[ -f "${PATH_TO_GAME}/dxvk.conf" ]] ; then
        export DXVK_CONFIG_FILE="${PATH_TO_GAME}/dxvk.conf"
    fi

4091 4092
    for chk_lang_and_uname in "steam_emu.ini" "steam_api.ini" "steam_api64.ini" "SteamConfig.ini" ; do
        if [[ -f "${PATH_TO_GAME}/${chk_lang_and_uname}" ]] ; then
4093 4094 4095
            sed -i "/^Language/c\Language=${FULL_LN}" "${PATH_TO_GAME}/${chk_lang_and_uname}"
            sed -i "/^UserName/c\UserName=${USER}" "${PATH_TO_GAME}/${chk_lang_and_uname}"
            sed -i "/^PlayerName/c\PlayerName=${USER}" "${PATH_TO_GAME}/${chk_lang_and_uname}"
4096 4097
        fi
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4098

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109
    if [[ "${PW_DISABLE_COMPOSITING}" == "1" ]] \
    && ! check_gamescope_session
    then
        if [[ "${DESKTOP_SESSION}" =~ "plasma" ]] ; then
            qdbus org.kde.KWin /Compositor suspend
        elif [[ "${DESKTOP_SESSION}" =~ "mate" ]] ; then
            gsettings set org.mate.Marco.general compositing-manager false
        elif [[ "${DESKTOP_SESSION}" =~ "xfce" ]] ; then
            xfconf-query -c xfwm4 -p /general/use_compositing -s false
        elif [[ "${DESKTOP_SESSION}" =~ "cinnamon" ]] ; then
            gsettings set org.cinnamon.muffin unredirect-fullscreen-windows true
4110 4111
        elif [[ "${DESKTOP_SESSION}" =~ "deepin" ]] ; then
            dbus-send --session --dest=com.deepin.WMSwitcher --type=method_call /com/deepin/WMSwitcher com.deepin.WMSwitcher.RequestSwitchWM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4112 4113 4114
        fi
    fi

4115 4116
    unset PW_GAMESCOPE_ARGS_NEW PW_GAMESCOPE_VARIABLES_BEFORE PW_GAMESCOPE_VARIABLES_AFTER
    # GAMESCOPE fixes:
4117 4118 4119 4120
    if [[ "${PW_GAMESCOPE}" == "1" && "${GAMESCOPE_INSTALLED}" == "1" ]] \
    || check_gamescope_session
    then
        export vk_xwayland_wait_ready="false"
4121
        if [[ $(check_vendor_gpu) =~ amd ]] ; then
4122 4123
            export RADV_DEBUG+="nodcc "
            export AMD_DEBUG="nodcc"
4124
            if [[ ! $(<"${PW_TMPFS_PATH}/vulkaninfo.tmp") =~ VK_EXT_image_drm_format_modifier ]] ; then
4125 4126 4127 4128
                export R600_DEBUG="nodcc"
                grep -e '--backend' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null && PW_GS_BACKEND_SDL="1"
            fi
        fi
4129
        if [[ $(check_vendor_gpu) =~ intel ]] ; then
4130 4131
            export INTEL_DEBUG="norbc"
        fi
4132
        if [[ $(check_vendor_gpu) =~ nvidia ]] ; then
4133 4134 4135
            PW_GAMESCOPE_VARIABLES_BEFORE+="__GL_THREADED_OPTIMIZATIONS=0 "
            PW_GAMESCOPE_VARIABLES_AFTER+="__GL_THREADED_OPTIMIZATIONS=1 "
        fi
4136
    fi
4137
    # GAMESCOPE enable:
4138
    if [[ "${PW_GAMESCOPE}" == "1" && "${GAMESCOPE_INSTALLED}" == "1" ]] \
4139 4140 4141
    && ! check_gamescope_session
    then
        if [[ "${PW_GPU_USE}" != "disabled" ]] ; then
4142 4143
            PW_vendorID="$(grep -B3 "${PW_GPU_USE}" "${PW_TMPFS_PATH}/vulkaninfo.tmp" | grep vendorID | sort -u | awk -F'0x' '{print $2}')"
            PW_deviceID="$(grep -B3 "${PW_GPU_USE}" "${PW_TMPFS_PATH}/vulkaninfo.tmp" | grep deviceID | sort -u | awk -F'0x' '{print $2}')"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4144
            PW_ID_VIDEO=" --prefer-vk-device ${PW_vendorID}:${PW_deviceID}"
4145
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4146
            PW_ID_VIDEO=""
4147
        fi
4148

4149
        #checkbox
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4150 4151
        [[ "${PW_GS_FULLSCREEN}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" -f"
        [[ "${PW_GS_FORCE_FULLSCREEN}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --force-windows-fullscreen"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4152
        [[ "${PW_GS_BORDERLESS_WINDOW}" == "1" ]] &&  PW_GAMESCOPE_ARGS_NEW+=" -b"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4153
        [[ "${PW_GS_FORCE_GRAB_CURSOR}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --force-grab-cursor"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4154
        [[ "${PW_GS_FORCE_GRAB_KEYBOARD}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" -g"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4155

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4156
        if [[ "${PW_GS_HDR_ENABLE}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4157
            PW_GAMESCOPE_ARGS_NEW+=" --hdr-enabled"
4158 4159
            export DXVK_HDR="1"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4160

4161 4162
        [[ "${PW_GS_ENABLE_GAMESCOPE_WSI}" == "1" ]] && export ENABLE_GAMESCOPE_WSI="1"

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178
        [[ "${PW_GS_HDR_ITM_ENABLE}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-itm-enable"
        [[ "${PW_GS_SDR_GAMMUT_WIDENESS}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --sdr-gamut-wideness"
        [[ "${PW_GS_FORCE_COMPOSITION}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --force-composition"
        [[ "${PW_GS_HDR_FORCE_SUPPORT}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-debug-force-support"
        [[ "${PW_GS_HDR_FORCE_OUTPUT}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-debug-force-output"
        [[ "${PW_GS_HDR_FORCE_HEATMAP}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-debug-heatmap"
        [[ "${PW_GS_EXPOSE_WAYLAND}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --expose-wayland"
        [[ "${PW_GS_REALTIME_SCHEDULING}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --rt"

        if [[ "${PW_GS_MANGOAPP}" == "1" ]] ; then
            PW_GAMESCOPE_ARGS_NEW+=" --mangoapp"
            export PW_MANGOHUD="0"
        fi

        [[ "${PW_GS_BACKEND_SDL}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --backend sdl"
        [[ "${PW_GS_SDL_VIDEODRIVER_X11}" == "1" ]] && export SDL_VIDEODRIVER="x11"
4179
        [[ "${PW_GS_CURSOR_SCALE_HEIGHT}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --cursor-scale-height 1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4180

4181 4182 4183 4184 4185 4186
        #combobox
        if [[ "${PW_GS_SHOW_RESOLUTION}" != "disabled" ]] ; then
            PWGSRESSW1="${PW_GS_SHOW_RESOLUTION%x*}"
            PWGSRESSW="${PWGSRESSW1%%-*}"
            PWGSRESSH1="${PW_GS_SHOW_RESOLUTION#*x}"
            PWGSRESSH="${PWGSRESSH1%%-*}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4187
            PW_GAMESCOPE_ARGS_NEW+=" -W ${PWGSRESSW} -H ${PWGSRESSH}"
4188 4189 4190 4191

            if [[ "${PW_GS_INTERNAL_RESOLUTION}" != "0.0" ]] ; then
                GS_RES_W=${PW_GS_SHOW_RESOLUTION:0:4}
                GS_RES_H=${PW_GS_SHOW_RESOLUTION:5:8}
Vladislav's avatar
Vladislav committed
4192 4193
                PWGSRESIW=$(echo "${GS_RES_W}" "${PW_GS_INTERNAL_RESOLUTION}" | awk '{print $1*$2}')
                PWGSRESIH=$(echo "${GS_RES_H}" "${PW_GS_INTERNAL_RESOLUTION}" | awk '{print $1*$2}')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4194
                PW_GAMESCOPE_ARGS_NEW+=" -w ${PWGSRESIW} -h ${PWGSRESIH}"
4195 4196
            fi
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4197 4198 4199 4200 4201

        [[ "${PW_GS_FRAME_LIMIT}" != "disabled" ]] && PW_GAMESCOPE_ARGS_NEW+=" -r ${PW_GS_FRAME_LIMIT}"
        [[ "${PW_GS_MAX_SCALE_FACTOR}" != "0.0" ]] && PW_GAMESCOPE_ARGS_NEW+=" -m ${PW_GS_MAX_SCALE_FACTOR}"
        [[ "${PW_GS_SCALER_MODE}" != "disabled" ]] && PW_GAMESCOPE_ARGS_NEW+=" -S ${PW_GS_SCALER_MODE}"

4202 4203 4204
        if [[ "${PW_GS_FILTER_MODE}" != "disabled" ]] ; then
            export PW_WINE_FULLSCREEN_FSR="0"
            if [[ "${PW_GS_FILTER_MODE_OLD}" != "true" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4205
                PW_GAMESCOPE_ARGS_NEW+=" -F ${PW_GS_FILTER_MODE}"
4206 4207
            else
                if [[ "${PW_GS_FILTER_MODE}" == "fsr" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4208
                    PW_GAMESCOPE_ARGS_NEW+=" -U"
4209
                elif [[ "${PW_GS_FILTER_MODE}" == "nis" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4210
                    PW_GAMESCOPE_ARGS_NEW+=" -Y"
4211 4212
                fi
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4213
            PW_GAMESCOPE_ARGS_NEW+=" --sharpness ${PW_GS_UPSCALE_SHARPNESS}"
4214
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4215 4216 4217 4218 4219 4220

        [[ "${PW_GS_MOUSE_SENSITIVITY}" != "0.0" ]] && PW_GAMESCOPE_ARGS_NEW+=" -s ${PW_GS_MOUSE_SENSITIVITY}"
        [[ "${PW_GS_SDR_CONTENT_NITS}" != "400" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-sdr-content-nits ${PW_GS_SDR_CONTENT_NITS}"
        [[ "${PW_GS_ITM_SDR_NITS}" != "0" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-itm-sdr-nits ${PW_GS_ITM_SDR_NITS}"
        [[ "${PW_GS_ITM_TARGET_NITS}" != "0" ]] && PW_GAMESCOPE_ARGS_NEW+=" --hdr-itm-target-nits ${PW_GS_ITM_TARGET_NITS}"

4221
        edit_db_from_gui PW_GAMESCOPE_ARGS_NEW
Vladislav's avatar
Vladislav committed
4222
        export PW_RUN_GAMESCOPE="env ${PW_GAMESCOPE_VARIABLES_BEFORE}gamescope${PW_ID_VIDEO}${PW_GAMESCOPE_ARGS_NEW} env ${PW_GAMESCOPE_VARIABLES_AFTER}--"
4223 4224
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4225 4226 4227 4228 4229 4230
    pw_mangohud_check
    pw_vkbasalt_check
}

pw_run () {
    unset GDK_BACKEND
4231
    if [[ -n "${PATH_TO_GAME}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4232 4233
    && [[ -d "${PATH_TO_GAME}" ]]
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4234
        cd "${PATH_TO_GAME}" || :
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4235 4236 4237
    elif [[ -f "$portwine_exe" ]]
    then
        PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4238
        cd "${PATH_TO_GAME}" || :
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4239
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4240
        cd "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c" || :
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4241
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4242 4243
    PW_LOG_TO_FILE="${PORT_WINE_PATH}/PortProton.log"
    PW_LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4244
    print_var "WINEDIR" "WINEPREFIX" "WINEDLLOVERRIDES" "PATH_TO_GAME" "PW_WINE_USE" "PW_VULKAN_USE" "VULKAN_DRIVER_NAME"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4245
    print_var "VKD3D_CONFIG" "PW_LD_LIBRARY_PATH" "PATH" "WINEESYNC" "WINEFSYNC" "WINEFSYNC_FUTEX2"
4246
    print_var "WINEDLLPATH" "WINE_CPU_TOPOLOGY" "PW_RUN_GAMESCOPE" "LD_LIBRARY_PATH" "PW_VK_ICD_FILENAMES"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4247 4248 4249 4250 4251 4252
    if [[ "$PW_USE_RUNTIME" == 1 ]] \
    && [[ "$PW_WINE_USE" != "USE_SYSTEM_WINE" ]]
    then
        if [[ "${PW_LOG}" == 1 ]] ; then
            echo "WINEDLLOVERRIDES=${WINEDLLOVERRIDES}" >> "${PW_LOG_TO_FILE}"
            echo "------------------------------------" >> "${PW_LOG_TO_FILE}"
Vladislav's avatar
Vladislav committed
4253
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log" >> "${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4254 4255 4256 4257 4258
            echo "-" >> "${PW_LOG_TO_FILE}"
            echo "Log WINE:" >> "${PW_LOG_TO_FILE}"
            echo ""
            print_info "Log from RUNTIME and WINE:"
            ${PW_RUN_GAMESCOPE} \
4259
            ${PW_POWERPROFILECTL_SLR} \
4260
            ${PW_INHIBIT_SLR}\
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4261 4262 4263 4264 4265 4266 4267
            ${pw_runtime} \
            LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" \
            LD_PRELOAD="${PW_LD_PRELOAD}" \
            VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
            VK_INSTANCE_LAYERS=${PW_VK_INSTANCE_LAYERS} \
            ${PW_GAMEMODERUN_SLR} \
            ${PW_MANGOHUD_SLR} \
4268
            ${PW_DISPLAY} \
4269
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4270
        else
Vladislav's avatar
Vladislav committed
4271 4272
            if [[ "$PW_USE_TERMINAL" == 1 ]] ; then
                PW_ADD_TO_ARGS_IN_RUNTIME="--xterm"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4273 4274 4275 4276 4277
                pw_init_runtime
            fi
            echo ""
            echo "Log WINE:" > "${PW_LOG_TO_FILE}"
            ${PW_RUN_GAMESCOPE} \
4278
            ${PW_POWERPROFILECTL_SLR} \
4279
            ${PW_INHIBIT_SLR}\
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4280 4281 4282 4283 4284 4285 4286
            ${pw_runtime} \
            LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" \
            LD_PRELOAD="${PW_LD_PRELOAD}" \
            VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
            VK_INSTANCE_LAYERS="${PW_VK_INSTANCE_LAYERS}" \
            ${PW_GAMEMODERUN_SLR} \
            ${PW_MANGOHUD_SLR} \
4287
            ${PW_DISPLAY} \
4288
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4289
            print_info "Update prefix log:"
Vladislav's avatar
Vladislav committed
4290
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4291 4292
            echo
            print_info "Log from RUNTIME and WINE:"
4293
            awk '! a[$0]++' "${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4294 4295 4296 4297 4298 4299
            echo
        fi
    else
        if [[ "${PW_LOG}" == 1 ]] ; then
            echo "WINEDLLOVERRIDES=${WINEDLLOVERRIDES}" >> "${PW_LOG_TO_FILE}"
            echo "------------------------------------" >> "${PW_LOG_TO_FILE}"
Vladislav's avatar
Vladislav committed
4300
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log" >> "${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4301 4302 4303 4304 4305
            echo "-" >> "${PW_LOG_TO_FILE}"
            echo "Log WINE:" >> "${PW_LOG_TO_FILE}"
            echo ""
            print_info "Log WINE:"
            env FAKE_VAR= \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4306 4307 4308 4309
            LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" \
            LD_PRELOAD="${PW_LD_PRELOAD}" \
            VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
            VK_INSTANCE_LAYERS="${PW_VK_INSTANCE_LAYERS}" \
4310
            ${PW_RUN_GAMESCOPE} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4311
            ${PW_GAMEMODERUN_SLR} \
4312
            ${PW_POWERPROFILECTL_SLR} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4313
            ${PW_MANGOHUD_SLR} \
4314
            ${PW_DISPLAY} \
4315
            ${PW_INHIBIT_SLR}\
4316
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4317 4318 4319
            wait_wineserver
        else
            print_info "Update prefix log:"
Vladislav's avatar
Vladislav committed
4320
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4321 4322 4323 4324
            echo ""
            echo "Log WINE:" > "${PW_LOG_TO_FILE}"
            print_info "Log WINE:"
            env FAKE_VAR= \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4325 4326 4327 4328
            LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" \
            LD_PRELOAD="${PW_LD_PRELOAD}" \
            VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
            VK_INSTANCE_LAYERS="${PW_VK_INSTANCE_LAYERS}" \
4329
            ${PW_RUN_GAMESCOPE} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4330
            ${PW_GAMEMODERUN_SLR} \
4331
            ${PW_POWERPROFILECTL_SLR} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4332
            ${PW_MANGOHUD_SLR} \
4333
            ${PW_DISPLAY} \
4334
            ${PW_INHIBIT_SLR}\
4335
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4336 4337 4338 4339 4340
            wait_wineserver
        fi
    fi
}
export -f pw_run
4341

4342
pw_yad_set_form () {
4343
    if [[ -n $(<"${PW_TMPFS_PATH}/tmp_yad_form") ]] ; then
4344
        pw_skip_get_info
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4345
        PW_YAD_SET=$(head -n 1 "${PW_TMPFS_PATH}/tmp_yad_form" | awk '{print $1}')
4346 4347 4348 4349 4350
        export PW_YAD_SET
    fi
}

pw_yad_form_vulkan () {
4351
    if [[ -n "$(<"${PW_TMPFS_PATH}/tmp_yad_form_vulkan")" ]] ; then
4352
        if [[ -n "${KEY_START}" ]] ; then
4353 4354 4355 4356 4357 4358 4359 4360 4361 4362
            YAD_FORM_VULKAN=$(sed 's/$/\;/' "${PW_TMPFS_PATH}/tmp_yad_form_vulkan")
            VULKAN_MOD=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $1}')
            PW_WINE_VER=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $2}')
            PW_PREFIX_NAME=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $3}' | sed -e s/[[:blank:]]/_/g)
        else
            YAD_FORM_VULKAN=$(<"${PW_TMPFS_PATH}/tmp_yad_form_vulkan")
            VULKAN_MOD=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $1}')
            PW_PREFIX_NAME=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $2}' | sed -e s/[[:blank:]]/_/g)
            PW_WINE_VER=$(echo "${YAD_FORM_VULKAN}" | grep \;\; | awk -F";" '{print $3}')
        fi
4363 4364 4365
        if [[ -z "${PW_PREFIX_NAME}" ]]
        then PW_PREFIX_NAME="DEFAULT"
        else PW_PREFIX_NAME="${PW_PREFIX_NAME^^}"
4366 4367 4368 4369 4370
        fi
        export PW_PREFIX_NAME PW_WINE_VER VULKAN_MOD
    fi
}

4371 4372
portwine_launch () {
    start_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4373
    unset PW_VD_TMP
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4374
    if [[ "${PW_VIRTUAL_DESKTOP}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4375
        PW_VD_TMP=(explorer "/desktop=PortProton,${PW_SCREEN_RESOLUTION}")
4376
    fi
4377

Vladislav's avatar
Vladislav committed
4378
    [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME"
4379
    if [[ -n "${LAUNCH_URI}" ]] ; then
Alex Smith's avatar
Alex Smith committed
4380
        pw_run start /high /b "${LAUNCH_URI}" &
4381
        unset GAMEPID
4382
        while true ; do
4383 4384 4385
            sleep 5
            if [[ -z "$GAMEPID" ]] ; then
                GAMEPID="$(pgrep -fa 'EpicPortal|epicusername|epiclocale|AUTH_LOGIN' | awk '{print $1}')"
4386
            else
4387 4388 4389 4390 4391
                if waitpid "$GAMEPID" ; then
                    sleep 1
                    GAMEPID="$(pgrep -fa 'EpicPortal|epicusername|epiclocale|AUTH_LOGIN' | awk '{print $1}')"
                    [[ -z "$GAMEPID" ]] && break || continue
                fi
4392
            fi
Alex Smith's avatar
Alex Smith committed
4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413
        done
    else
        case "${portwine_exe,,}" in
            *.exe)
                pw_run "${PW_VD_TMP[@]}" ${WINE_WIN_START} "$portwine_exe"
            ;;
            *.bat)
                PW_USE_TERMINAL=1
                pw_run "${PW_VD_TMP[@]}" "$portwine_exe"
            ;;
            *.msi)
                pw_run "${PW_VD_TMP[@]}" msiexec /i "$portwine_exe"
            ;;
            *.reg)
                pw_run "${PW_VD_TMP[@]}" regedit "$portwine_exe"
            ;;
            *)
                pw_run "${PW_VD_TMP[@]}" winefile
            ;;
        esac
    fi
4414 4415 4416 4417 4418 4419
}

pw_winecfg () {
    start_portwine
    export GST_PLUGIN_SYSTEM_PATH_1_0=""
    pw_run winecfg
4420
    stop_portwine --restart
4421 4422 4423 4424 4425
}

pw_winefile () {
    start_portwine
    pw_run winefile
4426
    stop_portwine --restart
4427 4428 4429 4430
}

pw_winecmd () {
    start_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4431
    cd "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c" || fatal
Vladislav's avatar
Vladislav committed
4432 4433 4434 4435 4436 4437
    if check_flatpak ; then
        $PW_TERM "pw_run cmd"
    else
        export PW_USE_TERMINAL=1
        pw_run cmd
    fi
4438
    stop_portwine --restart
4439 4440 4441 4442 4443 4444
}

pw_winereg () {
    start_portwine
    export GST_PLUGIN_SYSTEM_PATH_1_0=""
    pw_run regedit
4445
    stop_portwine --restart
4446 4447 4448
}

pw_start_cont_xterm () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4449
    cd "$HOME" || :
4450 4451 4452 4453 4454 4455 4456 4457
    unset PW_SANDBOX_HOME_PATH
    pw_init_runtime
    ${pw_runtime} \
    LD_PRELOAD="${PW_LD_PRELOAD}" \
    VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
    VK_INSTANCE_LAYERS="${PW_VK_INSTANCE_LAYERS}" \
    ${PW_GAMEMODERUN_SLR} \
    ${PW_MANGOHUD_SLR} \
4458
    ${PW_TERM} bash
4459
    restart_pp
4460 4461
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4462
# GUI INFO
4463 4464
yad_info () {
    print_info "$@"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4465 4466 4467
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
4468
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4469
    "${pw_yad}" --no-wrap --text "$@" --width=400 --height=150 --borders=15 --title "INFO" \
Vladislav's avatar
Vladislav committed
4470
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4471
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/info.svg" \
4472
    --text-align=center --fixed \
4473
    --button="${translations[OK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png" 2>/dev/null
4474 4475 4476
}
export -f yad_info

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4477
# GUI ERROR
4478 4479
yad_error () {
    print_error "$@"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4480 4481 4482
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
4483
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4484
    "${pw_yad}" --no-wrap --text "$@" --width=400 --height=150 --borders=15 --title "ERROR" \
Vladislav's avatar
Vladislav committed
4485
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4486
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/error.svg" \
4487
    --text-align=center --fixed \
4488
    --button="${translations[EXIT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png" 2>/dev/null
4489 4490 4491 4492
}
export -f yad_error

yad_error_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4493 4494 4495
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
4496
    fi
4497 4498
    "${pw_yad}" --text "${translations[You will need to check internet connection,and\\npress Repeat for repeat download]}" \
    --width=400 --borders=15 --title "${translations[Error]}" \
Vladislav's avatar
Vladislav committed
4499
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4500
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/download.svg" \
4501
    --no-wrap --text-align=center \
4502 4503
    --button="${translations[SKIP]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1 \
    --button="${translations[REPEAT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null
4504 4505 4506
    [[ "$?" != 0 ]] && return 1 || return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4507
# GUI QUESTIONS
4508
yad_question () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4509 4510 4511
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
4512
    fi
4513
    "${pw_yad}" --text "${1}" --width=400 --height=150 --borders=15 --title "${translations[Choices]}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4514
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/question.svg" \
Vladislav's avatar
Vladislav committed
4515
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
4516
    --no-wrap --text-align=center --fixed \
4517 4518
    --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1 \
    --button="${translations[OK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null
4519 4520 4521 4522
    [[ "$?" != 0 ]] && return 1 || return 0
}

pw_start_progress_bar_cover () {
4523
    [[ "$2" != "--block" ]] && local AUTOCLOUSE="--close-on-unfocus"
4524 4525
    if check_gamescope_session ; then
        PW_GIF_FILE="${COVERS_PATH}/loading_deck.gif"
4526
        "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --borders=0 --no-buttons --undecorated --fullscreen --skip-taskbar > /dev/null 2>&1 &
4527
        PW_YAD_PID_PROGRESS_BAR+=($!)
4528
    elif ! check_start_from_steam ; then
4529
        PW_GIF_FILE="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4530 4531
        PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}')
        PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}')
4532
        "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --no-buttons --undecorated \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4533
        --skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 &
4534
        PW_YAD_PID_PROGRESS_BAR+=($!)
4535
    fi
4536
    return 0
4537 4538 4539
}

pw_update_pfx_cover_gui () {
4540 4541 4542 4543
    if check_gamescope_session ; then
        pw_start_progress_bar_cover
        return 0
    elif [[ "$1" == "winetricks" ]] ; then
4544
        TAB_PLACE="--tab=${translations[TERMINAL]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png --tab=${translations[LOGO]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png"
4545 4546 4547 4548
        TAB_N1=2
        TAB_N2=1
        YAD_UNDECORATED=""
    else
4549
        TAB_PLACE="--tab=${translations[LOGO]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png --tab=${translations[TERMINAL]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png"
4550 4551
        TAB_N1=1
        TAB_N2=2
4552
        YAD_UNDECORATED="--undecorated"
4553
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4554

4555 4556 4557
    if ! check_start_from_steam \
    && ! pgrep -a yad | grep "yad_gui_pp --notebook --key=$PW_KEY_PROGRESS_BAR_UP" &>/dev/null
    then
4558
        PW_KEY_PROGRESS_BAR_UP=$RANDOM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4559
        PW_GIF_FILE="${COVERS_PATH}/update_prefix_${LANGUAGE_GIF}.gif"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4560
        PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 20}')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4561
        PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 65}')
Vladislav's avatar
Vladislav committed
4562
        echo "UPDATE PREFIX..." > "${PW_TMPFS_PATH}/update_pfx_log"
4563
        local PW_TIMER=0
4564
        while read -r line || [[ -n $(pgrep -a yad | grep "yad_gui_pp --notebook --key=$PW_KEY_PROGRESS_BAR_UP" | awk '{print $1}') ]] ; do
4565
                sleep 0.005
4566
                if [[ -n "${line}" ]] && ! echo "${line}" | grep -qi "gstreamer\|kerberos\|ntlm" ; then
4567 4568 4569 4570 4571 4572
                    echo "# ${line}"
                fi
                if [[ "${PW_TIMER}" != 1 ]] ; then
                    sleep 3
                    PW_TIMER=1
                fi
Vladislav's avatar
Vladislav committed
4573
        done < "${PW_TMPFS_PATH}/update_pfx_log" | "${pw_yad}" --plug=$PW_KEY_PROGRESS_BAR_UP --tabnum=$TAB_N2 --text-info --tail  2>/dev/null &
4574
        "${pw_yad}" --plug=$PW_KEY_PROGRESS_BAR_UP --tabnum=$TAB_N1 --picture --filename="${PW_GIF_FILE}" 2>/dev/null &
4575

4576
        "${pw_yad}" --notebook --key="$PW_KEY_PROGRESS_BAR_UP" $TAB_PLACE --no-buttons \
4577 4578
        --skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" $YAD_UNDECORATED \
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "PortProton" --tab-pos="bottom" --expand 2>/dev/null &
4579
        PW_YAD_PID_PROGRESS_BAR+=($!)
4580 4581 4582 4583 4584 4585
        return 0
    fi
}

pw_start_progress_bar_cs () {
    if ! check_start_from_steam ; then
4586 4587
        "${pw_yad}" --progress-old --text="$@
        " --pulsate --hide-text --close-on-unfocus --borders="$PROGRESS_BAR_BORDERS_SIZE" \
4588
        --no-buttons --undecorated --skip-taskbar \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4589 4590
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
4591
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
4592
        PW_YAD_PID_PROGRESS_BAR+=($!)
4593 4594 4595 4596 4597 4598
        return 0
    fi
}

pw_start_progress_bar_block () {
    if ! check_start_from_steam ; then
4599 4600
        "${pw_yad}" --progress-old --text="$@
        " --pulsate --hide-text --borders="$PROGRESS_BAR_BORDERS_SIZE" \
4601
        --no-buttons --undecorated --skip-taskbar \
4602
        --no-escape --text-align="center" --height=90 --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4603 4604
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
4605
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
4606
        PW_YAD_PID_PROGRESS_BAR+=($!)
4607 4608 4609 4610
        return 0
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4611 4612
pw_start_progress_bar_install_game () {
    if ! check_start_from_steam ; then
4613
        "${pw_yad}" --progress-old --text="${translations[Please wait. Installing the]} $@
4614
        " --pulsate --hide-text --borders="$PROGRESS_BAR_BORDERS_SIZE" \
4615
        --no-buttons --undecorated --skip-taskbar \
4616
        --no-escape --text-align="center" --height=90 --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4617 4618 4619
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
4620
        PW_YAD_PID_PROGRESS_BAR+=($!)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4621 4622 4623 4624
        return 0
    fi
}

4625
pw_stop_progress_bar () {
4626
    if [[ -n ${PW_YAD_PID_PROGRESS_BAR[0]} ]] ; then
4627
        local pid
4628
        for pid in "${PW_YAD_PID_PROGRESS_BAR[@]}" ; do
4629 4630
            # Здесь sleep нужен, потому что pid может уже быть, но kill его не убьет
            # со sleep 0.01 он делает 2 kill, c 0.02 нормально один
4631
            while sleep 0.02 && [[ -f /proc/$pid/exe ]] ; do
4632 4633 4634
                kill -s SIGUSR1 "$pid" &>/dev/null
            done
        done
4635
        unset PW_YAD_PID_PROGRESS_BAR
4636
    fi
4637 4638 4639 4640
}
export -f pw_stop_progress_bar

open_changelog () {
4641 4642 4643 4644
    if [[ "$LANGUAGE" == ru ]]
    then local PW_CHANGELOG_FILE="changelog_ru"
    else local PW_CHANGELOG_FILE="changelog_en"
    fi
4645
    "${pw_yad}" --title="${translations[CHANGELOG]}" --no-buttons \
4646 4647 4648
    --text-info --show-uri --wrap --width=1200 --height=700 --uri-color=red \
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
    --filename="${PORT_WINE_PATH}/data/${PW_CHANGELOG_FILE}" &>/dev/null
4649
    YAD_STATUS="$?"
Vladislav's avatar
Vladislav committed
4650

Vladislav's avatar
Vladislav committed
4651
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] && [[ -z "$WINEPREFIX" ]] ; then
4652
        print_info "Restarting..."
Vladislav's avatar
Vladislav committed
4653
        restart_pp
Vladislav's avatar
Vladislav committed
4654 4655
    else
        exit 0
4656
    fi
4657 4658 4659 4660
}
export -f open_changelog

pw_tray_icon () {
Vladislav's avatar
Vladislav committed
4661
    if [[ "$XDG_SESSION_TYPE" == "tty" ]] ; then
4662
        if [[ -n "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')" ]] ; then
Vladislav's avatar
Vladislav committed
4663 4664 4665
            kill -s SIGUSR1 "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')"
        fi
    else
4666
        if [[ -n "$(pgrep -a tray_gui_pp)" ]] ; then
Vladislav's avatar
Vladislav committed
4667 4668
            kill -s SIGUSR1 $(pgrep -a tray_gui_pp) 2>/dev/null
        fi
4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686
    fi

    pw_tray_winefile () {
        pw_run winefile "C:\\users\\${USER}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\"
    }
    export -f pw_tray_winefile

    pw_tray_taskmgr () {
        pw_run taskmgr
    }
    export -f pw_tray_taskmgr

    tray_icon_click_exit () {
        pw_stop_progress_bar
        stop_portwine
    }
    export -f tray_icon_click_exit

Vladislav's avatar
Vladislav committed
4687 4688 4689 4690 4691 4692 4693 4694 4695 4696
    if [[ "$XDG_SESSION_TYPE" == "tty" ]] ; then
        tray_icon_click () {
            echo ""
        }
        export -f tray_icon_click
        "${pw_yad}" --notification --no-middle \
        --image="$PW_GUI_ICON_PATH/portproton_tray_flatpak.svg" \
        --command="bash -c tray_icon_click" \
        --tooltip="PortProton" \
        --icon-size=32 --menu="| \
4697 4698 4699 4700
        ${translations[WINEFILE]}!bash -c pw_tray_winefile!"$PW_GUI_ICON_PATH/wine_file.svg"|| \
        ${translations[TASKMGR]}!bash -c pw_tray_taskmgr!"$PW_GUI_ICON_PATH/wine_system.svg"|| \
        ${translations[CHANGELOG]}!bash -c open_changelog!"$PW_GUI_ICON_PATH/history.svg"|| \
        ${translations[FORCE EXIT]}!bash -c tray_icon_click_exit!"$PW_GUI_ICON_PATH/close.svg"||" 2>/dev/null &
Vladislav's avatar
Vladislav committed
4701 4702 4703 4704
    else
        PW_GUI_TRAY_PATH="${PW_GUI_THEMES_PATH}/tray"
        env LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" "${PW_GUI_TRAY_PATH}/tray_gui_pp" &
    fi
4705 4706
}

4707
# GUI GET OTHER WINE
4708
gui_proton_downloader () {
4709
    unset VERSION_WINE_GIT VERSION_INSTALLED_WINE URL_VERSION_PROTON_GIT GIVE_WINE_URL
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4710 4711 4712 4713 4714 4715
    try_remove_file "${PW_TMPFS_PATH}/tmp_proton_pw_git"
    try_remove_file "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
    try_remove_file "${PW_TMPFS_PATH}/tmp_proton_ge_git"
    try_remove_file "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
    try_remove_file "${PW_TMPFS_PATH}/tmp_installed_wine"
    try_remove_file "${PW_TMPFS_PATH}/tmp_set_wine"
4716

4717
    if [[ "$PW_WINE_USE" == PROTON_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4718
    then PW_WINE_USE="${PW_PROTON_LG_VER}"
4719
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4720
    then PW_WINE_USE="${PW_WINE_LG_VER}"
4721
    elif [[ "$1" == "silent" ]] && [[ -n "$2" ]]
4722
    then PW_WINE_USE="$2"
4723
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4724
    export PW_WINE_USE
4725

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4726 4727
    if [[ "$1" == "silent" ]] \
    && [[ -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ]] ; then
4728 4729
        return 0
    fi
4730

4731
    pw_start_progress_bar_block "${translations[Check new version WINE...]}"
4732

4733
    # PROTON_GE
4734
    read -r -d '' -a PROTON_GE_GIT < <(curl -s "https://api.github.com/repos/GloriousEggroll/proton-ge-custom/releases" | grep "browser_download_url.*\.tar\.gz" | cut -d \" -f 4)
4735 4736 4737
    if [[ -n "${PROTON_GE_GIT[0]}" ]] ; then
        for PGEGIT in "${PROTON_GE_GIT[@]}" ; do
            echo "${PGEGIT}" | awk -F/ '{print $NF}' | sed 's/.tar.gz//' >> "${PW_TMPFS_PATH}/tmp_proton_ge_git"
4738
        done
4739
        sed -i -e '/Proton-6.5-GE-2/,$d' -e '/github-action/d' -e '/^$/d' "${PW_TMPFS_PATH}/tmp_proton_ge_git"
4740 4741 4742
    fi

    # WINE_KRON4EK
4743
    read -r -d '' -a WINE_KRON4EK < <(curl -s "https://api.github.com/repos/Kron4ek/Wine-Builds/releases" | grep "browser_download_url.*\.tar\.xz" | cut -d \" -f 4)
4744 4745 4746
    if [[ -n "${WINE_KRON4EK[0]}" ]] ; then
        for PGEGIT in "${WINE_KRON4EK[@]}" ; do
            echo "${PGEGIT}" | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
4747
        done
4748
        sed -i -e '/6.3/,$d' -e '/-x86/d' -e '/-wow64/d' -e '/^$/d' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
4749 4750 4751
    fi

    # WINE_GE_CUSTOM
4752
    read -r -d '' -a WINE_GE_CUSTOM < <(curl -s "https://api.github.com/repos/GloriousEggroll/wine-ge-custom/releases" | grep "browser_download_url.*\.tar\.xz" | cut -d \" -f 4)
4753 4754 4755
    if [[ -n "${WINE_GE_CUSTOM[0]}" ]] ; then
        for PGEGIT in "${WINE_GE_CUSTOM[@]}" ; do
            echo "${PGEGIT}" | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
4756
        done
4757
        sed -i -e '/6.23/,$d' -e '/^$/d' "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
4758 4759 4760
    fi

    # PROTON_LG
4761
    read -r -d '' -a PROTON_PW_GIT < <(curl -s "https://api.github.com/repos/Castro-Fidel/wine_builds/releases" | grep "browser_download_url.*\.tar\.xz" | cut -d \" -f 4 | sort -r)
4762 4763 4764
    if [[ -n "${PROTON_PW_GIT[0]}" ]] ; then
        for PPWGIT in "${PROTON_PW_GIT[@]}" ; do
            echo "${PPWGIT}" | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_proton_pw_git"
4765
        done
4766
        sed -i -e "/${PW_WINE_LG_VER}/d" -e '/plugins/d' -e '/^$/d' "${PW_TMPFS_PATH}/tmp_proton_pw_git"
4767 4768
    fi
    pw_stop_progress_bar
4769

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4770
    if [[ -z "${PROTON_PW_GIT}" ]] ; then
4771
        yad_error "${translations[Error: check wine.]}"
Vladislav's avatar
Vladislav committed
4772
        restart_pp
4773
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4774 4775 4776

    pushd "${PORT_WINE_PATH}/data/dist/" || fatal
    for INSTALLING_VERSION_IN_DIST in * ; do
4777 4778 4779
        sed -i "/${INSTALLING_VERSION_IN_DIST}$/Id" "${PW_TMPFS_PATH}/tmp_proton_pw_git" \
        "${PW_TMPFS_PATH}/tmp_proton_ge_git" "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git" \
        "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
4780
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4781
    popd 1>/dev/null || fatal
4782

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4783 4784 4785 4786
    TMP_PROTON_PW_GIT="$(sed 's/^/FALSE /' "${PW_TMPFS_PATH}/tmp_proton_pw_git" | tr '\n' ' ')"
    TMP_PROTON_GE_GIT="$(sed 's/^/FALSE /' "${PW_TMPFS_PATH}/tmp_proton_ge_git" | tr '\n' ' ')"
    TMP_PROTON_KR_GIT="$(sed 's/^/FALSE /' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git" | tr '\n' ' ')"
    TMP_PROTON_CU_GIT="$(sed 's/^/FALSE /' "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git" | tr '\n' ' ')"
4787

4788
    ls -l ${PORT_WINE_PATH}/data/dist | awk '{print $9}' | sed -e "/$PW_PROTON_LG_VER/d" -e "/$PW_WINE_LG_VER/d" -e '/^$/d' 1>"${PW_TMPFS_PATH}/tmp_installed_wine"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4789
    TMP_INSTALLED_WINE="$(sed 's/^/FALSE /' "${PW_TMPFS_PATH}/tmp_installed_wine" | tr '\n' ' ')"
4790

4791 4792 4793
    if [[ "$1" != "silent" ]] ; then
        # GUI
        export KEY_WINE=$RANDOM
4794 4795

        "${pw_yad}" --plug=$KEY_WINE --tabnum=1 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
4796
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
4797 4798
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
4799
        $TMP_PROTON_PW_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4800
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
4801 4802 4803
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=2 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
4804
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
4805 4806
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
4807
        $TMP_PROTON_KR_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4808
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
4809 4810 4811
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=3 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
4812
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
4813 4814
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
4815
        $TMP_PROTON_GE_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4816
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
4817 4818 4819
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=4 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
4820
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
4821 4822
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
4823
        $TMP_PROTON_CU_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4824
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
4825 4826 4827
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=5 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
4828
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
4829 4830
        --column "${translations[Set]}" \
        --column "${translations[Select installed WINE for delete:]}" \
4831
        $TMP_INSTALLED_WINE \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4832
        1> "${PW_TMPFS_PATH}/tmp_installed_wine_set" \
4833 4834
        2>/dev/null &

Vladislav's avatar
Vladislav committed
4835
        "${pw_yad}" --key=$KEY_WINE --notebook --width=500 --height=600 --text-align=center \
4836
        --gui-type="settings-notebook" \
4837
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[WINE MANAGER]}" --separator="" --expand \
4838
        --tab-pos="top" \
4839 4840 4841 4842 4843 4844 4845
        --tab="PROTON-LG!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="WINE-KRON4EK!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="PROTON-GE!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="WINE-GE-CUSTOM!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="${translations[INSTALLED]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":1 \
        --button="${translations[OK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":0 2>/dev/null
4846 4847
        YAD_WINE_STATUS="$?"
        if [[ "$YAD_WINE_STATUS" == "1" || "$YAD_WINE_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
4848
            restart_pp
4849
        fi
4850
        if [[ -n $(<"${PW_TMPFS_PATH}/tmp_set_wine") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4851
            VERSION_WINE_GIT="$(sed 's/TRUE//' "${PW_TMPFS_PATH}/tmp_set_wine")"
4852
        fi
4853
        if [[ -n $(<"${PW_TMPFS_PATH}/tmp_installed_wine_set") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4854
            VERSION_INSTALLED_WINE="$(sed 's/TRUE//' "${PW_TMPFS_PATH}/tmp_installed_wine_set")"
4855 4856
        fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4857 4858
        if [[ -z "${VERSION_WINE_GIT}" ]] \
        && [[ -z "${VERSION_INSTALLED_WINE}" ]]
4859
        then
4860
            print_info "Nothing to do."
Vladislav's avatar
Vladislav committed
4861
            restart_pp
4862 4863
        fi

4864
    elif [[ "$1" == "silent" ]] && [[ -n "$2" ]] ; then
4865 4866 4867
        VERSION_WINE_GIT="$2"
    fi

4868 4869 4870
    pw_download_get_wine () {
        print_info "Download and install ${VERSION_WINE_GIT}..."
        FILENAME="$(basename "${URL_VERSION_PROTON_GIT}")"
4871 4872 4873 4874 4875
        if [[ "${URL_VERSION_PROTON_GIT}" =~ _LG ]]
        then USE_MIRROR=""
        else USE_MIRROR="no_mirror"
        fi
        if try_download "${URL_VERSION_PROTON_GIT}" "${PORT_WINE_PATH}/data/tmp/$FILENAME" "$USE_MIRROR" ; then
4876 4877
            if unpack "${PORT_WINE_PATH}/data/tmp/${FILENAME}" "${PORT_WINE_PATH}/data/dist/" ; then
                try_remove_file "${PORT_WINE_PATH}/data/tmp/${FILENAME}"
4878
                if [[ -n "${portwine_exe}" ]] ; then
4879
                    PW_WINE_USE=${VERSION_WINE_GIT^^}
4880 4881 4882 4883 4884 4885
                    edit_db_from_gui PW_WINE_USE
                fi
            else
                try_remove_file "${PORT_WINE_PATH}/data/tmp/${FILENAME}"
                try_remove_dir "${PORT_WINE_PATH}/data/dist/${FILENAME}"
                if yad_error_download
4886
                then gui_proton_downloader ""
4887
                else
4888 4889
                    export PW_WINE_VER="$PW_WINE_USE"
                    init_wine_ver
4890 4891
                fi
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4892
        else
4893
            if yad_error_download
4894
            then gui_proton_downloader ""
4895 4896 4897 4898 4899 4900 4901
            else
                export PW_WINE_VER="$PW_WINE_USE"
                init_wine_ver
            fi
        fi
    }

4902
    if [[ -n "${VERSION_INSTALLED_WINE}" ]] ; then
4903 4904 4905
        for REMOVE_WINE in ${VERSION_INSTALLED_WINE} ; do
            try_remove_dir "${PORT_WINE_PATH}/data/dist/${REMOVE_WINE}"
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4906
        if [[ -z "${VERSION_WINE_GIT}" ]] ; then
Vladislav's avatar
Vladislav committed
4907
            restart_pp
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4908
        fi
4909 4910 4911
    fi

    if [[ "$1" != "silent" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4912
        for GIVE_ALL_WINE in ${VERSION_WINE_GIT} ; do
Vladislav's avatar
Vladislav committed
4913 4914 4915
            for GIVE_WINE_URL in "${WINE_GE_CUSTOM[@]}" "${PROTON_GE_GIT[@]}" "${WINE_KRON4EK[@]}" "${PROTON_PW_GIT[@]}" ; do
                if [[ ${GIVE_WINE_URL^^} =~ ${GIVE_ALL_WINE^^} ]] ; then
                    export URL_VERSION_PROTON_GIT=$GIVE_WINE_URL
4916 4917
                fi
            done
4918
            pw_download_get_wine ""
4919
        done
4920
        edit_db_from_gui
Vladislav's avatar
Vladislav committed
4921
        restart_pp
4922
    else
4923
        print_error "$PW_WINE_USE"
Vladislav's avatar
Vladislav committed
4924 4925 4926
        for GIVE_WINE_URL in "${WINE_GE_CUSTOM[@]}" "${PROTON_GE_GIT[@]}" "${WINE_KRON4EK[@]}" "${PROTON_PW_GIT[@]}" ; do
            if [[ ${GIVE_WINE_URL^^} =~ ${PW_WINE_USE^^} ]] ; then
                export URL_VERSION_PROTON_GIT=$GIVE_WINE_URL
4927 4928
            fi
        done
4929
        pw_download_get_wine ""
4930 4931 4932 4933
    fi
}
export -f gui_proton_downloader

4934 4935 4936
# GUI EDIT_DB
gui_edit_db () {
    KEY_EDIT_DB_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
4937
    PW_EDIT_DB_LIST=(PW_MANGOHUD PW_MANGOHUD_USER_CONF PW_VKBASALT PW_VKBASALT_USER_CONF PW_DGVOODOO2 PW_GAMESCOPE
4938 4939 4940 4941 4942
    PW_NO_ESYNC PW_NO_FSYNC PW_USE_RAY_TRACING PW_USE_NVAPI_AND_DLSS PW_USE_FAKE_DLSS PW_WINE_FULLSCREEN_FSR
    PW_HIDE_NVIDIA_GPU PW_VIRTUAL_DESKTOP PW_USE_TERMINAL PW_GUI_DISABLED_CS PW_USE_GAMEMODE PW_USE_D3D_EXTRAS
    PW_FIX_VIDEO_IN_GAME PW_REDUCE_PULSE_LATENCY PW_USE_US_LAYOUT PW_USE_GSTREAMER PW_FORCE_LARGE_ADDRESS_AWARE
    PW_USE_SHADER_CACHE PW_USE_WINE_DXGI PW_USE_EAC_AND_BE PW_USE_SYSTEM_VK_LAYERS PW_USE_OBS_VKCAPTURE
    PW_DISABLE_COMPOSITING PW_USE_RUNTIME PW_DINPUT_PROTOCOL PW_USE_NATIVE_WAYLAND
Vladislav's avatar
Vladislav committed
4943
    )
4944
    # PW_USE_FAKE_DLSS_3
4945 4946

    if check_wayland_session ; then
4947
        rm_from_array "PW_EDIT_DB_LIST" PW_USE_US_LAYOUT
Vladislav's avatar
Vladislav committed
4948
    else
4949
        rm_from_array "PW_EDIT_DB_LIST" PW_USE_NATIVE_WAYLAND
4950
    fi
Vladislav's avatar
Vladislav committed
4951

4952
    if check_flatpak ; then
4953
        rm_from_array "PW_EDIT_DB_LIST" PW_USE_RUNTIME
4954
    fi
4955
    # PW_HEAP_DELAY_FREE
4956

4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977
    PW_DGVOODOO2_INFO=${translations[Enable dgVoodoo2. Forced use all dgVoodoo2 libs (Glide 2.11-3.1, DirectDraw 1-7, Direct3D 2-9) on all 3D API. For WineD3D OpenGL need use WineLG (For Gallium Nine and Zink use too)]}
    PW_DINPUT_PROTOCOL_INFO=${translations[Force use DirectInput protocol instead of XInput]}
    PW_USE_NATIVE_WAYLAND_INFO=${translations[Enable experemental native Wayland support (need special wine build to work)]}
    PW_VKBASALT_INFO=${translations[Enable vkBasalt by default to improve graphics in games running on Vulkan. (The HOME hotkey disables vkbasalt)]}
    PW_NO_ESYNC_INFO=${translations[Do not use in-process synchronization primitives based on eventfd. (It is recommended not to change the value.)]}
    PW_NO_FSYNC_INFO=${translations[Do not use futex-based in-process synchronization primitives. (Automatically disabled on systems without FUTEX_WAIT_MULTIPLE support) (It is recommended not to change the value)]}
    PW_USE_RAY_TRACING_INFO=${translations[Enable vkd3d support - Ray Tracing]}
    PW_FIX_VIDEO_IN_GAME_INFO=${translations[Required for video playback in some games so that it is not distorted (usually colored pink)]}
    PW_VULKAN_NO_ASYNC_INFO=${translations[Disable asynchronous calls for VULKAN and DXVK modes]}
    PW_USE_NVAPI_AND_DLSS_INFO=${translations[Enable DLSS on supported NVIDIA graphics cards]}
    PW_OLD_GL_STRING_INFO=${translations[Forced use of older versions of OpenGL]}
    PW_HIDE_NVIDIA_GPU_INFO=${translations[Disguise all features used for NVIDIA graphics cards]}
    PW_VIRTUAL_DESKTOP_INFO=${translations[Enable the application to run in the WINE virtual desktop]}
    PW_USE_TERMINAL_INFO=${translations[Run the application in the terminal]}
    PW_HEAP_DELAY_FREE_INFO=${translations[Include a delay in releasing some memory to bypass errors associated with using the application after the memory is released]}
    PW_NO_WRITE_WATCH_INFO=${translations[A very dangerous way to hack the memory write timer in ntdll. This improves the performance of some very specific games. (It is recommended not to change the value.)]}
    PW_GUI_DISABLED_CS_INFO=${translations[Disable the window for selecting startup modes and WINE versions]}
    PW_USE_GSTREAMER_INFO=${translations[Use Gstreamer to output clips in games (WMF support)]}
    PW_FORCE_LARGE_ADDRESS_AWARE_INFO=${translations[Increases RAM usage limits for 32-bit applications from two to four gigabytes]}
    PW_USE_RUNTIME_INFO=${translations[Use container launch mode (It is recommended not to change the value)]}
    PW_MANGOHUD_INFO=${translations[Using FPS and system load monitoring (Turns on and off by the key combination - right Shift + F12)]}
Vladislav's avatar
Vladislav committed
4978
    PW_USE_GAMEMODE_INFO=${translations[Using automatic system optimization to improve performance in games (provided the gamemode package is installed on the system, doesn\'t work with ananicy)]}
4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994
    PW_USE_WINE_DXGI_INFO=${translations[Forced use of built-in DXGI library (in rare cases it solves problems with DX12 games)]}
    PW_MANGOHUD_USER_CONF_INFO=${translations[Forced use of MANGOHUD system settings (GOverlay, etc.)]}
    PW_VKBASALT_USER_CONF_INFO=${translations[Forced use of VKBASALT system settings (GOverlay, etc.)]}
    PW_USE_D3D_EXTRAS_INFO=${translations[Enable forced use of third-party DirectX libraries]}
    PW_USE_WINDOWS_7_INFO=${translations[Change the version of WINDOWS 10 to WINDOWS 7 in the prefix]}
    PW_USE_SHADER_CACHE_INFO=${translations[Use WINE shader caching (disable only if there are microfreezes in the game)]}
    PW_WINE_FULLSCREEN_FSR_INFO=${translations[Works while using any version of ProtonGE in full screen mode at a resolution below the standard screen]}
    PW_USE_FAKE_DLSS_INFO=${translations[Enable DLSS translator in FSR 2 in DirectX 12 games (CyberFSR2)]}
    PW_USE_EAC_AND_BE_INFO=${translations[Enable Easy Anti-Cheat and BattlEye Anti-Cheat runtimes (required if game used this anti-cheats)]}
    PW_REDUCE_PULSE_LATENCY_INFO=${translations[Reduce pulseaudio latency to fix intermittent sound]}
    PW_USE_US_LAYOUT_INFO=${translations[Forced use of the us layout (useful for games in which the control works correctly only on the us layout)]}
    PW_RESTORE_RESOLUTION_INFO=${translations[Remember the screen resolution when starting the game and return it when closing (useful for games that change the screen resolution when closing)]}
    PW_USE_SYSTEM_VK_LAYERS_INFO=${translations[Use system mangohud, vkBasalt, obs-vkcapture and other applications using vulkan layers]}
    PW_USE_OBS_VKCAPTURE_INFO=${translations[Enable the ability to write to OBS Studio using obs-vkcapture (ATTENTION: the forced use of system mangohud, vkBasalt, obs-vkcapture and other applications using vulkan layers will be enabled)]}
    PW_DISABLE_COMPOSITING_INFO=${translations[Disable desktop compositing (effects). It often improves performance.]}
    PW_GAMESCOPE_INFO=${translations[<b>Super + F :</b> Toggle fullscreen
4995 4996 4997 4998 4999 5000 5001
<b>Super + N :</b> Toggle nearest neighbour filtering
<b>Super + U :</b> Toggle FSR upscaling
<b>Super + Y :</b> Toggle NIS upscaling
<b>Super + I :</b> Increase FSR sharpness by 1
<b>Super + O :</b> Decrease FSR sharpness by 1
<b>Super + S :</b> Take screenshot (currently goes to /tmp/gamescope_DATE.png)
<b>Super + G :</b> Toggle keyboard grab
5002
<b>Super + C :</b> Update clipboard]}
5003

5004 5005 5006
    case "${PW_VULKAN_USE}" in
        0)
            # WineD3D OpenGL
5007
            VKD3D_CB="DCB"
5008 5009 5010 5011
            DISABLE_EDIT_DB_LIST="PW_VKBASALT PW_VKBASALT_USER_CONF PW_USE_RAY_TRACING PW_USE_OBS_VKCAPTURE
            "
            ;;
        1|2)
5012
            # Stable, Newest
5013
            VKD3D_CB="CB"
5014 5015 5016
            ;;
        3)
            # Gallium Nine
5017
            VKD3D_CB="DCB"
5018 5019 5020 5021 5022 5023
            DISABLE_EDIT_DB_LIST="PW_MANGOHUD PW_MANGOHUD_USER_CONF PW_VKBASALT PW_VKBASALT_USER_CONF PW_USE_RAY_TRACING PW_WINE_FULLSCREEN_FSR
            PW_USE_SYSTEM_VK_LAYERS PW_USE_OBS_VKCAPTURE
            "
            ;;
        4|5|6)
            # Galliun Zink, Legacy, WineD3D Vulkan
5024
            VKD3D_CB="DCB"
5025 5026 5027 5028 5029
            DISABLE_EDIT_DB_LIST="PW_USE_RAY_TRACING
            "
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5030
    unset ADD_CHK_BOX_EDIT_DB
5031
    for int_to_boole in "${PW_EDIT_DB_LIST[@]}" ; do
5032
        if [[ "${!int_to_boole}" == "1" ]]
5033 5034
        then export "$int_to_boole"="TRUE"
        else export "$int_to_boole"="FALSE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5035 5036
        fi
        TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
5037 5038
        int_to_boole_non_pw="${int_to_boole//PW_/}"
        int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
5039 5040 5041 5042 5043 5044 5045 5046 5047
        if [[ ! "${PW_VULKAN_USE}" =~ ^(1|2)$ ]] \
        && [[ -n $DISABLE_EDIT_DB_LIST ]] ; then
            unset CHECK_BOOLE_TRUE
            for check_boole in $DISABLE_EDIT_DB_LIST ; do
                if [[ $check_boole == "$int_to_boole" ]] ; then
                    CHECK_BOOLE_TRUE=1
                    ADD_CHK_BOX_EDIT_DB+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
                fi
            done
Vladislav's avatar
Vladislav committed
5048 5049 5050
        fi
        if [[ $CHECK_BOOLE_TRUE != 1 ]] ; then
            ADD_CHK_BOX_EDIT_DB+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:${THEME_CHKBOX}%${!int_to_boole}%"
5051
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5052
    done
5053 5054 5055

    IFS="%"
    "${pw_yad}" --plug=$KEY_EDIT_DB_GUI --tabnum="1" --form --separator=" " --columns=3 ${ADD_CHK_BOX_EDIT_DB} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5056
    1> "${PW_TMPFS_PATH}/tmp_output_yad_edit_db" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5057
    IFS="$orig_IFS"
5058 5059

    case ${PW_WINDOWS_VER} in
5060 5061 5062 5063
         "7") ADD_WINVER_EDIT_DB="7!10!11!XP" ;;
        "XP") ADD_WINVER_EDIT_DB="XP!7!10!11" ;;
        "10") ADD_WINVER_EDIT_DB="10!11!7!XP" ;;
           *) ADD_WINVER_EDIT_DB="11!10!7!XP" ;;
5064 5065
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5066 5067 5068
    if [[ "${PW_WINE_CPU_TOPOLOGY}" == *[0-9]:* ]] \
    && [[ "${PW_WINE_CPU_TOPOLOGY}" != "disabled" ]]
    then
Vladislav's avatar
Vladislav committed
5069
        CPU_LIMIT_VAR="${PW_WINE_CPU_TOPOLOGY%%:*}"
5070 5071 5072 5073
    else
        CPU_LIMIT_VAR="disabled"
    fi

5074
    if [[ -n "${PW_AMD_VULKAN_USE}" ]] && \
5075 5076 5077 5078 5079 5080 5081
    [[ "${PW_AMD_VULKAN_USE}" != "disabled" ]] ; then
        AMD_VULKAN_VAR="${PW_AMD_VULKAN_USE}"
        export DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1
    else
        AMD_VULKAN_VAR="disabled"
    fi

5082
    "${pw_yad}" --plug=$KEY_EDIT_DB_GUI --tabnum="2" --form --separator="%" --columns=1 \
5083 5084 5085
    --field="${translations[Change the version of <b>WINDOWS</b> emulation]}!${translations[Changing the <b>WINDOWS</b> emulation version may be required to run older games. <b>WINDOWS</b> versions below 10 do not support new games with DirectX 12]} :CB" "${ADD_WINVER_EDIT_DB}" \
    --field="${translations[AUTOINSTALL WITH <b>WINETRICKS</b>]}!${translations[Automatically install with <b>WINETRICKS</b> additional libraries required to run the game/program. List of libraries separated by spaces]} :CBE" "$(combobox_fix --empty "${PW_DLL_INSTALL}" "vcrun2019 corefonts lucida")" \
    --field="${translations[Forced to use/disable libraries]}!${translations[Forced to use/disable the library only for the given application. (There are examples in the drop-down list)
5086 5087 5088 5089 5090 5091 5092 5093

A brief instruction:
    * libraries are written <b>WITHOUT</b> the .dll file extension
    * libraries are separated by semicolons - <b>;</b>
    * library=n - use the <b>WINDOWS</b> (third-party) library
    * library=b - use <b>WINE</b> (built-in) library
    * library=n,b - use <b>WINDOWS</b> library and then <b>WINE</b>
    * library=b,n - use <b>WINE</b> library and then <b>WINDOWS</b>
5094
    * library= - disable the use of this library]} :CBE" "$(combobox_fix --empty "${WINEDLLOVERRIDES}" "libglesv2=!d3dx9_36,d3dx9_42=n,b;mfc120=b,n")" \
5095
    --field="${translations[ADD ARGUMENTS FOR .EXE FILE]}!${translations[Adding an argument after the <b>.exe</b> file, just like you would add an argument in a shortcut on a <b>WINDOWS </b> system]} :CBE" "$(combobox_fix --empty "\\${LAUNCH_PARAMETERS}" "-dx11 -skipintro 1")" \
5096
    --field="${translations[Limit the use of processor cores]}!${translations[Limiting the number of CPU cores is useful for Unity games (It is recommended to set the value equal to 8)]} :CB" "$(combobox_fix --disabled "${CPU_LIMIT_VAR}" "${GET_LOGICAL_CORE}")" \
5097
    --field="${translations[Forcibly select the OpenGL version for the game]}!${translations[You can select the required OpenGL version, some games require a forced Compatibility Profile (COMPAT). (Examples are in the drop-down list)]} :CB" "$(combobox_fix --disabled "${PW_MESA_GL_VERSION_OVERRIDE}" "4.6COMPAT!4.5COMPAT!4.3COMPAT!4.1COMPAT!3.3COMPAT!3.2COMPAT")" \
5098
    --field="${translations[Forcibly select the VKD3D feature level]}!${translations[You can set a forced feature level VKD3D for games on DirectX12]} :$VKD3D_CB" "$(combobox_fix --disabled "${PW_VKD3D_FEATURE_LEVEL}" "12_2!12_1!12_0!11_1!11_0")" \
5099
    --field="${translations[Force certain locale for an app:]}!${translations[Fixes encoding issues in legacy software]} :CB" "$(combobox_fix --disabled "${PW_LOCALE_SELECT}" "$LOCALE_LIST")" \
Vladislav's avatar
Vladislav committed
5100
    --field="${translations[Window mode (for Vulkan and OpenGL)]}!${translations[fifo - First in, first out. Limits the frame rate + no tearing. (VSync)
5101 5102 5103
immediate - Unlimited frame rate + tearing.
mailbox - Triple buffering. Unlimited frame rate + no tearing.
relaxed - Same as fifo but allows tearing when below the monitors refresh rate.]} :CB" "$(combobox_fix --disabled "${PW_MESA_VK_WSI_PRESENT_MODE}" "fifo!immediate!mailbox!relaxed")" \
5104
    --field="${translations[Select needed AMD vulkan implementation]}!${translations[Choosing which implementation of vulkan will be used to run the game]} $AMD_VULKAN_CB" "$(combobox_fix --disabled "$AMD_VULKAN_VAR" "$AMD_VULKAN_DRIVER_LIST")" \
5105 5106 5107
    1> "$PW_TMPFS_PATH/tmp_output_yad_fps_limit" 2>/dev/null &

    "${pw_yad}" --notebook --key="$KEY_EDIT_DB_GUI" --title "${translations[EDIT DB]}" --text-align=center \
Vladislav's avatar
Vladislav committed
5108
    --text "${translations[Change settings in database file for]} <b>$PW_NAME_DESKTOP_PROXY</b>\n ${translations[<b>NOTE:</b> To display help for each item, simply hover your mouse over the text]}" \
5109
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --separator=" " --expand \
5110
    --gui-type="settings-base" \
Vladislav's avatar
Vladislav committed
5111
    --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" \
5112 5113 5114 5115 5116 5117
    --tab="${translations[MAIN]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
    --tab="${translations[ADVANCED]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
    --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
    --button="${translations[RESET SETTINGS]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings]}":2 \
    --button="${translations[OPEN THE SETTINGS FILE]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Open the <b>.ppdb</b> settings file in a system text editor to view and change variables manually]}":150 \
    --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":0 2>/dev/null
5118 5119 5120
    YAD_STATUS="$?"

    case "$YAD_STATUS" in
5121
        1|252)
Vladislav's avatar
Vladislav committed
5122
            restart_pp
Vladislav's avatar
Vladislav committed
5123 5124 5125
            ;;
        2)
            try_remove_file "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
5126
            restart_pp
Vladislav's avatar
Vladislav committed
5127 5128 5129 5130
            ;;
        150)
            gui_edit_db_file
            ;;
5131 5132
    esac

5133
    read -r -a output_yad_edit_db <"${PW_TMPFS_PATH}/tmp_output_yad_edit_db"
Vladislav's avatar
Vladislav committed
5134
    bool_from_yad="0"
5135 5136
    for boole_to_int in "${PW_EDIT_DB_LIST[@]}" ; do
        export "${boole_to_int}"="${output_yad_edit_db[$bool_from_yad]}"
5137
        if [[ "${!boole_to_int}" == "TRUE" ]]
5138 5139
        then export "${boole_to_int}"="1"
        else export "${boole_to_int}"="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5140
        fi
Vladislav's avatar
Vladislav committed
5141
        export bool_from_yad=$(( bool_from_yad + 1 ))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5142
    done
5143

5144 5145 5146 5147
    IFS='%' read -r -a PW_ADD_SETTINGS <"${PW_TMPFS_PATH}/tmp_output_yad_fps_limit"
    PW_WINDOWS_VER="${PW_ADD_SETTINGS[0]}"
    PW_DLL_INSTALL="${PW_ADD_SETTINGS[1]}"
    WINEDLLOVERRIDES="${PW_ADD_SETTINGS[2]}"
5148 5149 5150 5151 5152 5153
    LAUNCH_PARAMETERS="${PW_ADD_SETTINGS[3]}"
    CPU_LIMIT="${PW_ADD_SETTINGS[4]}"
    PW_MESA_GL_VERSION_OVERRIDE="${PW_ADD_SETTINGS[5]}"
    PW_VKD3D_FEATURE_LEVEL="${PW_ADD_SETTINGS[6]}"
    PW_LOCALE_SELECT="${PW_ADD_SETTINGS[7]}"
    PW_MESA_VK_WSI_PRESENT_MODE="${PW_ADD_SETTINGS[8]}"
5154
    PW_AMD_VULKAN_USE="${PW_ADD_SETTINGS[9]}"
5155

Vladislav's avatar
Vladislav committed
5156
    if [[ "${CPU_LIMIT}" =~ ^[0-9]+$ ]] ; then
Vladislav's avatar
Vladislav committed
5157
        PW_WINE_CPU_TOPOLOGY="${CPU_LIMIT}:$(seq -s, 0 $(( CPU_LIMIT - 1 )))"
5158
    else
Vladislav's avatar
Vladislav committed
5159
        PW_WINE_CPU_TOPOLOGY="disabled"
5160
    fi
Vladislav's avatar
Vladislav committed
5161
    export PW_WINE_CPU_TOPOLOGY
5162

5163
    edit_db_from_gui "${PW_EDIT_DB_LIST[@]}" LAUNCH_PARAMETERS PW_WINDOWS_VER PW_DLL_INSTALL WINEDLLOVERRIDES PW_WINE_CPU_TOPOLOGY \
5164
    PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PW_LOCALE_SELECT PW_MESA_VK_WSI_PRESENT_MODE PW_AMD_VULKAN_USE
5165 5166 5167 5168 5169

    if [[ -z "$MANGOHUD_CONFIG" ]] ; then
        MONITOR_HEIGHT="$(echo "$PW_SCREEN_RESOLUTION" | awk -F'x' '{print $2}')"
        MH_FONT_SIZE="font_size=$(( MONITOR_HEIGHT / 45 ))"

5170
        if [[ -n "$MH_FONT_SIZE" ]]
5171 5172 5173 5174 5175 5176 5177
        then MANGOHUD_CONFIG="$DEFAULT_MANGOHUD_CONFIG,$MH_FONT_SIZE"
        else MANGOHUD_CONFIG="$DEFAULT_MANGOHUD_CONFIG"
        fi

        edit_db_from_gui MANGOHUD_CONFIG
    fi

Vladislav's avatar
Vladislav committed
5178 5179
    if [[ "$YAD_STATUS" == "0" ]] ; then
        print_info "Restarting PP after update ppdb file..."
Vladislav's avatar
Vladislav committed
5180
        restart_pp
Vladislav's avatar
Vladislav committed
5181
    fi
5182 5183
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5184
# GUI VKBASALT
5185
gui_vkbasalt () {
5186 5187
    KEY_FX_GUI=$RANDOM
    FILE_VKBASALT_CONF="${PORT_WINE_PATH}/data/vkBasalt.conf"
5188 5189
    read -r -d '' -a LIST_FX < <(grep -E '.fx$|.fxh$' "$FILE_VKBASALT_CONF" | awk '{print $1}')
    read -r -a GET_FX_IN_FILE < <(echo "$PW_VKBASALT_EFFECTS" | sed -e s/"cas:"// -e s/":"/" "/g)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5190

5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245
    PW_3DFX_INFO=${translations[Simulation of an old 3dfx graphics accelerator (adds horizontal stripes)]}
    PW_AdaptiveSharpen_INFO=${translations[Sharpness increase, can be used with CAS]}
    PW_Bloom_INFO=${translations[Adds glow from bright light sources in the game]}
    PW_Border_INFO=${translations[Cropping the image from the top and bottom (like in a movie =)]}
    PW_Cartoon_INFO=${translations[Strong sharpening of texture edges]}
    PW_ChromaticAberration_INFO=${translations[Adds chromatic aberration to an image]}
    PW_Clarity_INFO=${translations[Sharpening textures with slight modifications of image contrast (similar in effect to CAS)]}
    PW_ColorMatrix_INFO=${translations[Adding cool colors]}
    PW_Colourfulness_INFO=${translations[Increasing color saturation]}
    PW_FakeHDR_INFO=${translations[Add fake HDR]}
    PW_FilmGrain2_INFO=${translations[Adding the film grain effect]}
    PW_Curves_INFO=${translations[Increases the contrast of the image without affecting the bright and dark areas, so that the detail in shadows and sky is not lost]}
    PW_Denoise_INFO=${translations[Reducing noise by blurring the image]}
    PW_Emphasize_INFO=${translations[Reducing the bit depth of color]}
    PW_FakeMotionBlur_INFO=${translations[Strong blurring of objects in motion]}
    PW_FilmicAnamorphSharpen_INFO=${translations[Sharpening (recommended for cartoon games)]}
    PW_FilmicPass_INFO=${translations[Adding cold colors]}
    PW_SMAA_INFO=${translations[Alternative antialiasing option (less effect, but with less consumption of GPU resources, relative to the standard SMAA)]}
    PW_GaussianBlur_INFO=${translations[Slight blur effect on bright objects (such as flames)]}
    PW_Glitch_INFO=${translations[Glitch effect]}
    PW_HighPassSharpen_INFO=${translations[Another method of sharpening using highpass frequencies]}
    PW_HQ4X_INFO=${translations[Smoothing of nearby pixels with the drawing of missing parts (in normal games the picture is blurred)]}
    PW_HSLShift_INFO=${translations[Advanced HSL shift (for each shade)]}
    PW_Layer_INFO=${translations[Image overlay on the game]}
    PW_Levels_INFO=${translations[Increases contrast, but some detail in shadows or highlights may be lost]}
    PW_LevelsPlus_INFO=${translations[Same as Levels, but with less loss of detail]}
    PW_LiftGammaGain_INFO=${translations[Gamma correction by individual color channels: red, green and blue]}
    PW_LightDoF_INFO=${translations[Increases depth of field (greatly affects FPS)]}
    PW_LumaSharpen_INFO=${translations[Enhances image sharpness for improved detail]}
    PW_LUT_INFO=${translations[Image color correction]}
    PW_MagicBloom_INFO=${translations[Same as Bloom, but more natural]}
    PW_Monochrome_INFO=${translations[Converts the image into monochrome]}
    PW_MultiLUT_INFO=${translations[Extended version of the LUT (Hollywood loot is pre-installed)]}
    PW_MXAO_INFO=${translations[SSAO algorithm (Greatly affects FPS)]}
    PW_NightVision_INFO=${translations[Night vision effect]}
    PW_Nostalgia_INFO=${translations[Makes the picture look like old photos]}
    PW_PerfectPerspective_INFO=${translations[Fisheye effect (suitable for VR)]}
    PW_PPFX_Godrays_INFO=${translations[Add God rays (also called 3D light rays) effect]}
    PW_Prism_INFO=${translations[The prismatic lens effect]}
    PW_ReflectiveBumpMapping_INFO=${translations[Creates the illusion of depth in textures]}
    PW_Sepia_INFO=${translations[Adds a sepia effect like in old photos]}
    PW_Splitscreen_INFO=${translations[Splits the image into raw and processed output for comparison]}
    PW_SurfaceBlur_INFO=${translations[Reducing object detail without blurring contrast contours]}
    PW_Technicolor_INFO=${translations[Makes the picture look like films from the 1930s]}
    PW_Technicolor2_INFO=${translations[The updated version of Technicolor, gives a different picture by changing colors more aggressively]}
    PW_TiltShift_INFO=${translations[Blur on the edges of the screen to create a Tilt Shift effect]}
    PW_Tonemap_INFO=${translations[Changes the saturation of the picture]}
    PW_TriDither_INFO=${translations[Reduces the amount of noise]}
    PW_UIDetect_INFO=${translations[Automatically switches effects depending on the visibility of the UI]}
    PW_Vibrance_INFO=${translations[Saturates faded colors without touching the bright ones]}
    PW_Vignette_INFO=${translations[Adds a vignette to the image]}
    PW_AspectRatio_INFO=${translations[An effect for adjusting the aspect ratio (for games that do not support widescreen monitors)]}
    PW_UIMask_INFO=${translations[Part of the overall ReShade shader . It uses a mask with gradients from black to white to determine where the effects will be applied]}
    PW_StageDepth_INFO=${translations[Allows you to add new elements to the 3d space inside the game and apply custom textures]}
    PW_PPFX_Bloom_INFO=${translations[Adds a Bloom effect]}
Boria138's avatar
Boria138 committed
5246

5247
    unset ADD_GUI_FX GUI_FX_RESULT
5248 5249
    for add_list_fx in "${LIST_FX[@]}" ; do
        unset PW_FX_TRUE
5250
        PW_VKBASALT_GUI_HELP="PW_${add_list_fx}_INFO"
5251 5252 5253 5254 5255 5256 5257
        for check_list_fx in "${GET_FX_IN_FILE[@]}" ; do
            if [[ $check_list_fx == "$add_list_fx" ]] ; then
                PW_FX_TRUE=1
                ADD_GUI_FX+="--field=${CHKBOX_SPACE}${add_list_fx}!${!PW_VKBASALT_GUI_HELP}:${THEME_CHKBOX}%TRUE%"
            fi
        done
        if [[ $PW_FX_TRUE != 1 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5258
            ADD_GUI_FX+="--field=${CHKBOX_SPACE}${add_list_fx}!${!PW_VKBASALT_GUI_HELP}:${THEME_CHKBOX}%FALSE%"
5259 5260
        fi
    done
Vladislav's avatar
Vladislav committed
5261

5262 5263 5264 5265 5266 5267 5268
    case "$PW_VKBASALT_FFX_CAS" in
        0|-1) VKBASALT_FFX_CAS_GUI="0" ;;
           1) VKBASALT_FFX_CAS_GUI="100" ;;
        0.0*) VKBASALT_FFX_CAS_GUI="$(echo "$PW_VKBASALT_FFX_CAS" | awk -F'0.0' '{print $2}')" ;;
           *) VKBASALT_FFX_CAS_GUI="$(echo "$PW_VKBASALT_FFX_CAS" | awk -F'0.' '{print $2}')" ;;
    esac
    export VKBASALT_FFX_CAS_GUI
5269

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5270
    IFS="%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5271
    "${pw_yad}" --plug=$KEY_FX_GUI --tabnum="1" --form --columns=4 --separator=" " \
5272
    --text-align=center --text="${translations[VkBasalt settings for adding effects to games running under Vulkan. (The <b>HOME</b> key disables vkbasalt)\\n<b>NOTE:</b> To display help for each item, simply hover over the text]}" \
Vladislav's avatar
Vladislav committed
5273
    --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5274
    ${ADD_GUI_FX} 1> "${PW_TMPFS_PATH}/tmp_yad_basalt_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5275
    IFS="$orig_IFS"
5276

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5277
    "${pw_yad}" --plug=$KEY_FX_GUI --tabnum="2" --separator=" " --form \
Vladislav's avatar
Vladislav committed
5278
    --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
5279
    --field="AMD FidelityFX - Contrast Adaptive Sharpening!${translations[AMD FidelityFX - CAS is designed to dramatically improve texture sharpness without additional modification settings for games, with minimal loss of performance. (For older games it is recommended to set value = 100)]}":SCL "${VKBASALT_FFX_CAS_GUI}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5280
    1> "${PW_TMPFS_PATH}/tmp_yad_cas_set" 2>/dev/null &
5281

5282
    "${pw_yad}" --paned --key="$KEY_FX_GUI" --sensitive --title="vkBasalt" \
5283
    --gui-type="settings-paned" \
5284
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
5285 5286 5287 5288
    --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
    --button="${translations[RESET]} VKBASALT!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings for]} vkBasalt":178 \
    --button="${translations[DISABLE]} VKBASALT!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Disable vkBasalt and go to the previous menu]}":180 \
    --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":182 2>/dev/null
5289
    YAD_VKBASALT_STATUS="$?"
5290

5291 5292
    case "${YAD_VKBASALT_STATUS}" in
        1|252)
Vladislav's avatar
Vladislav committed
5293 5294
            restart_pp
            ;;
5295 5296
        178)
            sed -i '/VKBASALT/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
5297 5298
            restart_pp
            ;;
5299
        180)
Vladislav's avatar
Vladislav committed
5300 5301
            export PW_VKBASALT="0"
            ;;
5302
        182)
Vladislav's avatar
Vladislav committed
5303 5304
            export PW_VKBASALT="1"
            ;;
5305
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5306
    YAD_BASALT_SET=$(<"${PW_TMPFS_PATH}/tmp_yad_basalt_set")
5307
    YAD_CAS_SET=$(sed s/" "//g "${PW_TMPFS_PATH}/tmp_yad_cas_set")
5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319

    INT_COUNT_FX=0
    for read_list_fx in ${YAD_BASALT_SET} ; do
        if [[ "$read_list_fx" == "TRUE" ]] ; then
            export GUI_FX_RESULT+="${LIST_FX[$INT_COUNT_FX]}:"
        fi
        ((INT_COUNT_FX++))
    done
    GUI_FX_RESULT="${GUI_FX_RESULT}cas"
    export PW_VKBASALT_EFFECTS="${GUI_FX_RESULT}"

    if [[ "$YAD_CAS_SET" == "0" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5320
    then export PW_VKBASALT_FFX_CAS="-1"
5321 5322 5323 5324 5325 5326
    elif [[ "$YAD_CAS_SET" == "100" ]]
    then export PW_VKBASALT_FFX_CAS="1"
    elif [[ "$YAD_CAS_SET" -lt 10 ]]
    then export PW_VKBASALT_FFX_CAS="0.0$YAD_CAS_SET"
    else export PW_VKBASALT_FFX_CAS="0.$YAD_CAS_SET"
    fi
5327

5328
    edit_db_from_gui PW_VKBASALT_EFFECTS PW_VKBASALT_FFX_CAS PW_VKBASALT
Vladislav's avatar
Vladislav committed
5329
    restart_pp
5330 5331
}

5332
# GUI MANGOHUD
5333
gui_mangohud () {
5334 5335
    KEY_MH_GUI=$RANDOM
    LIST_MH=(
Vladislav's avatar
Vladislav committed
5336 5337 5338 5339 5340 5341 5342 5343 5344
        ARCH BATTERY BATTERY_ICON BATTERY_TIME BATTERY_WATT CORE_BARS CORE_LOAD
        CPU_MHZ CPU_POWER CPU_TEMP DEVICE_BATTERY_ICON ENGINE_SHORT_NAMES
        ENGINE_VERSION EXEC_NAME FCAT FPS_METRICS FRAME_COUNT FRAMETIME FULL
        GAMEMODE GPU_CORE_CLOCK GPU_FAN GPU_JUNCTION_TEMP GPU_MEM_CLOCK
        GPU_MEM_TEMP GPU_NAME GPU_POWER GPU_TEMP GPU_VOLTAGE HISTOGRAM HORIZONTAL
        HORIZONTAL_STRETCH HUD_COMPACT HUD_NO_MARGIN IO_READ IO_WRITE NO_DISPLAY
        NO_SMALL_FONT PROCMEM PROCMEM_SHARED PROCMEM_VIRT RAM RESOLUTION
        SHOW_FPS_LIMIT SWAP TEMP_FAHRENHEIT THROTTLING_STATUS THROTTLING_STATUS_GRAPH
        TIME VERSION VKBASALT VRAM VULKAN_DRIVER WINE
5345 5346
    )

Vladislav's avatar
Vladislav committed
5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400
    PW_MH_ARCH_INFO=${translations[Show if the application is 32- or 64-bit]}
    PW_MH_BATTERY_INFO=${translations[Display current battery percent and energy consumption]}
    PW_MH_BATTERY_ICON_INFO=${translations[Display battery icon instead of percent]}
    PW_MH_BATTERY_TIME_INFO=${translations[Display remaining time for battery option]}
    PW_MH_BATTERY_WATT_INFO=${translations[Display wattage for the battery option]}
    PW_MH_CORE_BARS_INFO=${translations[Change the display of core_load from numbers to vertical bars]}
    PW_MH_CORE_LOAD_INFO=${translations[Display load & frequency per core]}
    PW_MH_CPU_MHZ_INFO=${translations[Show the CPUs current MHz]}
    PW_MH_CPU_POWER_INFO=${translations[Display CPU draw in watts]}
    PW_MH_CPU_TEMP_INFO=${translations[Display current CPU temperature]}
    PW_MH_DEVICE_BATTERY_ICON_INFO=${translations[Display wirless device battery icon.]}
    PW_MH_ENGINE_SHORT_NAMES_INFO=${translations[Display a short version of the used engine (e.g. OGL instead of OpenGL)]}
    PW_MH_ENGINE_VERSION_INFO=${translations[Display OpenGL or vulkan and vulkan-based render engines version]}
    PW_MH_EXEC_NAME_INFO=${translations[Display current exec name]}
    PW_MH_FCAT_INFO=${translations[Enables frame capture analysis]}
    PW_MH_FPS_METRICS_INFO=${translations[Takes a list of decimal values or the value avg, e.g avg,0.001]}
    PW_MH_FRAME_COUNT_INFO=${translations[Display frame count]}
    PW_MH_FRAMETIME_INFO=${translations[Display frametime next to FPS text]}
    PW_MH_FULL_INFO=${translations[Enable most of the toggleable parameters (currently excludes histogram)]}
    PW_MH_GAMEMODE_INFO=${translations[Show if GameMode is on]}
    PW_MH_GPU_CORE_CLOCK_INFO=${translations[Display GPU core frequency]}
    PW_MH_GPU_FAN_INFO=${translations[GPU fan in rpm on AMD, FAN in percent on NVIDIA]}
    PW_MH_GPU_JUNCTION_TEMP_INFO=${translations[Display current GPU temperature]}
    PW_MH_GPU_MEM_CLOCK_INFO=${translations[Display GPU memory frequency]}
    PW_MH_GPU_MEM_TEMP_INFO=${translations[Display current GPU temperature]}
    PW_MH_GPU_NAME_INFO=${translations[Display GPU name from pci.ids]}
    PW_MH_GPU_POWER_INFO=${translations[Display GPU draw in watts]}
    PW_MH_GPU_TEMP_INFO=${translations[Display current GPU temperature]}
    PW_MH_GPU_VOLTAGE_INFO=${translations[Display GPU voltage (only works on AMD GPUs)]}
    PW_MH_HISTOGRAM_INFO=${translations[Change FPS graph to histogram]}
    PW_MH_HORIZONTAL_INFO=${translations[Display Mangohud in a horizontal position]}
    PW_MH_HORIZONTAL_STRETCH_INFO=${translations[Stretches the background to the screens width in horizontal mode]}
    PW_MH_HUD_COMPACT_INFO=${translations[Display compact version of MangoHud]}
    PW_MH_HUD_NO_MARGIN_INFO=${translations[Remove margins around MangoHud]}
    PW_MH_IO_READ_INFO=${translations[Show non-cached IO read, in MiB/s]}
    PW_MH_IO_WRITE_INFO=${translations[Show non-cached IO write, in MiB/s]}
    PW_MH_NO_DISPLAY_INFO=${translations[Hide the HUD by default]}
    PW_MH_NO_SMALL_FONT_INFO=${translations[Use primary font size for smaller text like units]}
    PW_MH_PROCMEM_INFO=${translations[Displays process memory usage: resident procmem (resident) also toggles others off if disabled]}
    PW_MH_PROCMEM_SHARED_INFO=${translations[Displays process memory usage: shared]}
    PW_MH_PROCMEM_VIRT_INFO=${translations[Displays process memory usage: virtual]}
    PW_MH_RAM_INFO=${translations[Display system RAM usage]}
    PW_MH_RESOLUTION_INFO=${translations[Display the current resolution]}
    PW_MH_SHOW_FPS_LIMIT_INFO=${translations[Display the current FPS limit]}
    PW_MH_SWAP_INFO=${translations[Display swap space usage next to system RAM usage]}
    PW_MH_TEMP_FAHRENHEIT_INFO=${translations[Show temperature in Fahrenheit]}
    PW_MH_THROTTLING_STATUS_INFO=${translations[Show if GPU is throttling based on Power, current, temp or "other" (Only shows if throttling is currently happening). Currently disabled by default for Nvidia as it causes lag on 3000 series]}
    PW_MH_THROTTLING_STATUS_GRAPH_INFO=${translations[Same as throttling_status but displays throttling in the frametime graph and only power and temp throttling]}
    PW_MH_TIME_INFO=${translations[Display time]}
    PW_MH_VERSION_INFO=${translations[Show current MangoHud version]}
    PW_MH_VKBASALT_INFO=${translations[Show if vkBasalt is on]}
    PW_MH_VRAM_INFO=${translations[Display system VRAM usage]}
    PW_MH_VULKAN_DRIVER_INFO=${translations[Display used Vulkan driver (radv/amdgpu-pro/amdvlk)]}
    PW_MH_WINE_INFO=${translations[Show current Wine or Proton version in use]}
Boria138's avatar
Boria138 committed
5401

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5402
    unset ADD_GUI_MH GUI_MH_RESULT ADD_GUI_MH_FPS GUI_MH_FPS_RESULT PW_FPS_LIMIT_VAR PW_MANGOHUD_CONFIG
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5403 5404
    try_remove_file "${PW_TMPFS_PATH}/tmp_yad_mh_set"
    try_remove_file "${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit"
5405

Boria138's avatar
Boria138 committed
5406
    GET_REFRESH_RATE=(30 40 45 48 60 75 90 120 144 165 175 240)
5407

5408
    if [[ -n "$MANGOHUD_CONFIG" ]] ; then
5409
        PW_MANGOHUD_CONFIG=$MANGOHUD_CONFIG
5410
    else
5411
        PW_MANGOHUD_CONFIG=$DEFAULT_MANGOHUD_CONFIG
5412
    fi
5413
    IFS=',' read -r -a PW_MANGOHUD_CONFIG <<< "${PW_MANGOHUD_CONFIG^^}"
5414

5415
    if [[ -n "$FPS_LIMIT" ]] ; then
5416
        IFS='+' read -r -a PW_FPS_LIMIT_VAR <<< "$FPS_LIMIT"
Boria138's avatar
Boria138 committed
5417 5418
    fi

5419 5420
    for add_list_mh in "${LIST_MH[@]}" ; do
        unset PW_MH_TRUE
5421
        PW_MH_GUI_HELP="PW_MH_${add_list_mh}_INFO"
5422 5423 5424 5425 5426 5427 5428 5429
        for check_list_mh in "${PW_MANGOHUD_CONFIG[@]}" ; do
            [[ $check_list_mh =~ = ]] && continue
            if [[ $check_list_mh == "$add_list_mh" ]] ; then
                PW_MH_TRUE=1
                ADD_GUI_MH+="--field=${CHKBOX_SPACE}${add_list_mh//"_"/" "}!${!PW_MH_GUI_HELP}:${THEME_CHKBOX}%TRUE%"
            fi
        done
        if [[ $PW_MH_TRUE != 1 ]] ; then
Vladislav's avatar
Vladislav committed
5430
            ADD_GUI_MH+="--field=${CHKBOX_SPACE}${add_list_mh//"_"/" "}!${!PW_MH_GUI_HELP}:${THEME_CHKBOX}%FALSE%"
5431 5432 5433
        fi
    done

5434 5435 5436 5437 5438 5439 5440 5441 5442
    for add_list_mh_fps in "${GET_REFRESH_RATE[@]}" ; do
        unset PW_MH_TRUE
        for check_list_mh_fps in "${PW_FPS_LIMIT_VAR[@]}" ; do
            if [[ $check_list_mh_fps == "$add_list_mh_fps" ]] ; then
                PW_MH_TRUE=1
                ADD_GUI_MH_FPS+="--field=${CHKBOX_SPACE}$add_list_mh_fps:${THEME_CHKBOX}%TRUE%"
            fi
        done
        if [[ $PW_MH_TRUE != 1 ]] ; then
Boria138's avatar
Boria138 committed
5443 5444 5445 5446
            ADD_GUI_MH_FPS+="--field=${CHKBOX_SPACE}$add_list_mh_fps:${THEME_CHKBOX}%FALSE%"
        fi
    done

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5447
    IFS="%"
5448
    "${pw_yad}" --plug=$KEY_MH_GUI --tabnum="1" --form --columns=5 --separator=" " --text-align=center \
5449
        --text="${translations[MangoHud settings (Keys <b>R_SHIFT + F12</b> disable MangoHud)\\n<b>note:</b> To display help for each item, just hover the mouse cursor over the text.]}" \
Vladislav's avatar
Vladislav committed
5450
        --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5451
        ${ADD_GUI_MH} 1> "${PW_TMPFS_PATH}/tmp_yad_mh_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5452
    "${pw_yad}" --plug=$KEY_MH_GUI --tabnum="2" --form --columns=10 --separator=" " --text-align=center \
5453
        --text="${translations[Enabling fps limitation with MANGOHUD tools built into PortProton (Keys <b>L_SHIFT + F1</b> Toggles fps limitation)]}" \
Vladislav's avatar
Vladislav committed
5454
        --gui-type-text="${PANED_GUI_TYPE_TEXT_DOWN}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5455
        ${ADD_GUI_MH_FPS} 1> "${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5456
    IFS="$orig_IFS"
5457

5458
    "${pw_yad}" --paned --key="$KEY_MH_GUI" --title="MangoHud" \
Vladislav's avatar
Vladislav committed
5459
        --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --sensitive \
5460
        --gui-type="settings-paned" \
5461 5462 5463 5464 5465
        --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
        --button="${translations[RESET]} MANGOHUD!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings for]} MangoHud":180 \
        --button="${translations[PREVIEW CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Start vkcube for preview changes]}":184 \
        --button="${translations[DISABLE]} MANGOHUD!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Disable MangoHud and go to the previous menu]}":182 \
        --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":186  2>/dev/null
5466
    YAD_MANGOHUD_STATUS="$?"
5467

5468
    case "${YAD_MANGOHUD_STATUS}" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5469
        1|252)
Vladislav's avatar
Vladislav committed
5470
            restart_pp
5471
            ;;
5472 5473 5474
        180)
            sed -i '/FPS_LIMIT/d' "$portwine_exe".ppdb
            sed -i '/MANGOHUD/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
5475 5476
            restart_pp
            ;;
5477 5478
        182)
            export PW_MANGOHUD="0"
5479
            ;;
5480
        186)
5481
            export PW_MANGOHUD="1"
5482 5483 5484
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5485 5486
    YAD_MH_SET=$(<"${PW_TMPFS_PATH}/tmp_yad_mh_set")
    YAD_MH_FPS_LIMIT=$(<"${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit")
5487

Vladislav's avatar
Vladislav committed
5488
    MONITOR_HEIGHT="$(echo "$PW_SCREEN_RESOLUTION" | awk -F'x' '{print $2}')"
5489
    if [[ -n "$MONITOR_HEIGHT" ]]
5490 5491
    then MH_FONT_SIZE="font_size=$(( MONITOR_HEIGHT / 45 ))"
    fi
5492

Vladislav's avatar
Vladislav committed
5493
    INT_COUNT_MH="0"
5494 5495
    for read_list_mh in ${YAD_MH_SET} ; do
        if [[ "$read_list_mh" == "TRUE" ]]
Vladislav's avatar
Vladislav committed
5496
        then GUI_MH_RESULT+="${LIST_MH[$INT_COUNT_MH]},"
5497 5498 5499
        fi
        ((INT_COUNT_MH++))
    done
5500 5501
    GUI_MH_RESULT=${GUI_MH_RESULT// /_}
    GUI_MH_RESULT=${GUI_MH_RESULT,,}
5502

Vladislav's avatar
Vladislav committed
5503
    INT_COUNT_MH_FPS="0"
Boria138's avatar
Boria138 committed
5504 5505
    for read_list_mh_fps in ${YAD_MH_FPS_LIMIT} ; do
        if [[ "$read_list_mh_fps" == "TRUE" ]]
Vladislav's avatar
Vladislav committed
5506
        then GUI_MH_FPS_RESULT+="${GET_REFRESH_RATE[$INT_COUNT_MH_FPS]}+"
Boria138's avatar
Boria138 committed
5507 5508 5509 5510
        fi
        ((INT_COUNT_MH_FPS++))
    done

5511
    if [[ "$(echo "${GUI_MH_FPS_RESULT}" | awk -F'+' '{print $2}')" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5512
        export FPS_LIMIT="${GUI_MH_FPS_RESULT%+}"
Boria138's avatar
Boria138 committed
5513 5514 5515 5516
        if [[ ! "${GUI_MH_RESULT}" =~ "show_fps_limit" ]] ; then
            GUI_MH_RESULT="${GUI_MH_RESULT}show_fps_limit,"
        fi
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5517
        export FPS_LIMIT="${GUI_MH_FPS_RESULT%+}"
Boria138's avatar
Boria138 committed
5518 5519
    fi

5520
    if [[ -n "$MH_FONT_SIZE" ]]
5521 5522 5523 5524
    then GUI_MH_RESULT="${GUI_MH_RESULT}${MH_FONT_SIZE}"
    else GUI_MH_RESULT="${GUI_MH_RESULT%,}"
    fi

5525
    if [[ -n "$FPS_LIMIT" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5526
        GUI_MH_RESULT="${GUI_MH_RESULT},fps_limit=$FPS_LIMIT"
Boria138's avatar
Boria138 committed
5527 5528
    elif [[ "$FPS_LIMIT" == "disabled" ]] ; then
        GUI_MH_RESULT="${GUI_MH_RESULT},fps_limit=0"
5529 5530
    fi

5531
    if [[ "${GUI_MH_RESULT}" =~ "fps_only" ]] ; then
Vladislav's avatar
Vladislav committed
5532
        GUI_MH_RESULT="fps_only"
5533 5534 5535 5536
        print_info "In the MangoHud config fps_only is detected all settings are reseted"
    fi

    export MANGOHUD_CONFIG="${GUI_MH_RESULT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5537 5538
    export PW_MANGOHUD FPS_LIMIT
    edit_db_from_gui MANGOHUD_CONFIG PW_MANGOHUD FPS_LIMIT
5539

Vladislav's avatar
Vladislav committed
5540
    if [[ "${YAD_MANGOHUD_STATUS}" == "184" ]] ; then
5541
        PW_MANGOHUD="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5542 5543 5544 5545 5546 5547 5548
        pw_init_runtime
        pw_mangohud_check
        ${pw_runtime} \
        LD_PRELOAD="${PW_LD_PRELOAD}" \
        VK_LAYER_PATH="${PW_VK_LAYER_PATH}" \
        VK_INSTANCE_LAYERS="${PW_VK_INSTANCE_LAYERS}" \
        "${PW_PLUGINS_PATH}/portable/bin/vkcube"
5549
        gui_mangohud
5550 5551
    fi

Vladislav's avatar
Vladislav committed
5552
    restart_pp
5553 5554
}

5555
# GUI DGVOODOO2
5556
gui_dgvoodoo2 () {
5557
    KEY_DGV2_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
5558
    PW_DGV2_LIST=(PW_DGV2_USE_DX12 PW_DGV2_DISABLE_MIPMAPPING PW_DGV2_FREE_MOUSE PW_DGV2_ENABLE_CRT PW_DGV2_DISABLE_D3D PW_DGV2_FILTER_POINT_SAMPLED
5559 5560 5561
    PW_DGV2_BLIT_STRETCH PW_DGV2_FORCE_VSYNC PW_DGV2_FASTMEMORY PW_DGV2_PHONG_SHADING PW_DGV2_DGVOODOO_WATERMARK PW_DGV2_GLIDE_NAPALM PW_DGV2_ONBOARD_RAM
    PW_DGV2_GLIDE_GAMMA_RAMP PW_DGV2_EMULATING_PCI_ACCESS PW_DGV2_16_BIT_DEPTH_BUFFER PW_DGV2_3DFX_WATERMARK PW_DGV2_3DFX_SPLASH_SCREEN
    PW_DGV2_INACTIVE_APP_STATE
Vladislav's avatar
Vladislav committed
5562
    )
5563

5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582
    PW_DGV2_USE_DX12_INFO=${translations[Use DirectX12 for dgVoodoo2. Doesnt always work better. (Working only on newest and stable dxvk/vkd3d) (Direct3D and Glide settings)]}
    PW_DGV2_FORCE_VSYNC_INFO=${translations[Force the vertical sync to avoid tearing or prevent the GPU from rendering at crazy high speed. Keep in mind that some application need unforced vSync because of synchronization reasons. (Direct3D settings)]}
    PW_DGV2_DGVOODOO_WATERMARK_INFO=${translations[Shows the dgVoodoo watermark in-game when enabled. (Direct3D settings)]}
    PW_DGV2_ENABLE_CRT_INFO=${translations[CRT-like blurred appearance. (Direct3D and Glide settings)]}
    PW_DGV2_DISABLE_MIPMAPPING_INFO=${translations[Disabling mipmapping can be used to make textured surfaces sharper. (Direct3D and Glide settings)]}
    PW_DGV2_FREE_MOUSE_INFO=${translations[If enabled then physical mouse is free to move inside the game window when using emulated scaling and/or application and forced resolution differs. Can be useful when a game relies and the physical window size. (Direct3D and Glide settings)]}
    PW_DGV2_DISABLE_D3D_INFO=${translations[Do not use d3d8 and d3d9 dgVoodoo2 libraries. For some old games, using the example of Space Rangers, a bug with a black screen is corrected. (Direct3D settings)]}
    PW_DGV2_FILTER_POINT_SAMPLED_INFO=${translations[if enabled then forced filtering affects only non-point sampled textures. (Direct3D settings)]}
    PW_DGV2_FASTMEMORY_INFO=${translations[Enable fast memory access. (Enable if games have poor performance, using Unreal 2 as an example) (Direct3D settings)]}
    PW_DGV2_PHONG_SHADING_INFO=${translations[If this option is enabled then Phong shading is applied in place of Gouraud when it is possible. It works only when an application uses the fixed function vertex/pixel pipline and pushes all the work of the vertex transforming and lighting to Direct3D when rendering primitives. Keep in mind that it requires much more GPU power than default shading. (Direct3D settings)]}
    PW_DGV2_BLIT_STRETCH_INFO=${translations[If this options enabled then linear filtering is applied for stretched copying between 2D surfaces (DirectDraw only). Early hardware did not support or apply point sampled blitting which can end up very pixelated results. Linear filtering is much nicer in general but can cause artifacts especially with colorkeyed blitting. (Direct3D settings)]}
    PW_DGV2_GLIDE_NAPALM_INFO=${translations[Use 3dfx glide napalm, uses antialiasing provided by the application. (Disables antialiasing setting) (Glide settings)]}
    PW_DGV2_GLIDE_GAMMA_RAMP_INFO=${translations[Enable gamma ramp coming for Glide. (Glide settings)]}
    PW_DGV2_ONBOARD_RAM_INFO=${translations[Increases memory for videocard Voodoo Graphics, Voodoo Rush, Voodoo 2, Voodoo Banshee. You can set the game resolution higher. (Glide settings)]}
    PW_DGV2_EMULATING_PCI_ACCESS_INFO=${translations[When enabled, the virtual 3Dfx card will have PCI bus speeds emulated as closely as possible. Emulation of true PCI access should theoretically never be disabled but there can be possible degradation of performance when left enabled. Only some games require accurate emulation of the PCI bus, so in most cases PCI bus emulation should be left disabled. (Glide settings)]}
    PW_DGV2_16_BIT_DEPTH_BUFFER_INFO=${translations[Enabling 16-bit depth buffers can prevent Z-fighting in games, but also has the disadvantage of possibly causing artifacting. (Glide settings)]}
    PW_DGV2_3DFX_WATERMARK_INFO=${translations[Shows the 3Dfx watermark in-game when enabled. (Glide settings)]}
    PW_DGV2_3DFX_SPLASH_SCREEN_INFO=${translations[The 3Dfx splash screen is seen when an application starts, disabling this option prevents this animation from playing. (Glide settings)]}
    PW_DGV2_INACTIVE_APP_STATE_INFO=${translations[Enabling inactive state prevents the application from detecting losing the application focus. Most of the Glide applications close or deactivate themself when losing focus, so this can be used to let the application run in the background. (Glide settings)]}
5583

5584 5585 5586 5587
    # fix
    [[ "${PW_DGV2_FILTERING}" == "0" ]] && export PW_DGV2_FILTERING="disabled" && edit_db_from_gui PW_DGV2_FILTERING
    [[ "${PW_DGV2_ANTIALIASING}" == "0" ]] && export PW_DGV2_ANTIALIASING="disabled" && edit_db_from_gui PW_DGV2_ANTIALIASING

5588 5589 5590 5591 5592 5593 5594
    case "${PW_VULKAN_USE}" in
        0|3|4|5|6)
            DISABLE_DGV2_LIST="PW_DGV2_USE_DX12
            "
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5595
    unset ADD_CHK_BOX_DGV2
5596
    for int_to_boole in "${PW_DGV2_LIST[@]}" ; do
5597
        if [[ "${!int_to_boole}" == "1" ]]
5598 5599
        then export "$int_to_boole"="TRUE"
        else export "$int_to_boole"="FALSE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5600 5601
        fi
        TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
5602 5603
        int_to_boole_non_pw="${int_to_boole//PW_DGV2/}"
        int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
5604 5605 5606 5607 5608 5609 5610 5611 5612
        if [[ ! "${PW_VULKAN_USE}" =~ ^(1|2)$ ]] \
        && [[ -n $DISABLE_DGV2_LIST ]] ; then
            unset CHECK_BOOLE_TRUE
            for check_boole in $DISABLE_DGV2_LIST ; do
                if [[ $check_boole == "$int_to_boole" ]] ; then
                    CHECK_BOOLE_TRUE=1
                    ADD_CHK_BOX_DGV2+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
                fi
            done
Vladislav's avatar
Vladislav committed
5613 5614 5615
        fi
        if [[ $CHECK_BOOLE_TRUE != 1 ]] ; then
            ADD_CHK_BOX_DGV2+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:${THEME_CHKBOX}%${!int_to_boole}%"
5616
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5617
    done
5618

5619
    IFS="%"
5620
    "${pw_yad}" --plug=$KEY_DGV2_GUI --tabnum="1" --form --separator=" " --columns=4 ${ADD_CHK_BOX_DGV2} --text-align=center \
Vladislav's avatar
Vladislav committed
5621
    --text="${translations[dgVoodoo2 settings\\n<b>NOTE:</b> To display help for each item, simply hover over the text]}" \
Vladislav's avatar
Vladislav committed
5622
    --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5623
    1> "${PW_TMPFS_PATH}/tmp_yad_dgv2_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5624
    IFS="$orig_IFS"
5625

5626
    DGVOODOO2_XRANDR="$(grep -e '[0-9]x' "${PW_TMPFS_PATH}/xrandr.tmp" | awk '{print $1}' | sort -rVu | grep ^"[0-9]" | tr '\n' ' ')"
5627 5628 5629 5630 5631 5632
    for drop_low in ${DGVOODOO2_XRANDR} ; do
        if (( "${drop_low//x/}" > "1000000" )) ; then
            DGVOODOO2_XRANDR_NEW+="${drop_low}!"
        fi
    done

5633 5634 5635 5636 5637
    DGVOODOO2_FILTERING="Point sampled!Bilinear!Linear mip!Trilinear!Anisotropic 2x!Anisotropic 4x!Anisotropic 8x!Anisotropic 16x"
    DGVOODOO2_RESAMPLING="Point sampled!Bilinear!Lanczos-2!Bicubic!Lanczos-3"
    DGVOODOO2_VIDEOCARD="dgVoodoo2 SVGA 3D!dgVoodoo2 Virtual 3D!Geforce 4 Ti 4800!ATI Radeon 8500!Matrox Parhelia-512!GeForce FX 5700 Ultra!GeForce 9800 GT!Voodoo Graphics!Voodoo Rush!Voodoo 2!Voodoo Banshee"

    "${pw_yad}" --plug=$KEY_DGV2_GUI --tabnum="2" --form --columns=3 --separator="%" \
Vladislav's avatar
Vladislav committed
5638
    --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
5639 5640 5641 5642 5643 5644 5645
    --field="${CHKBOX_SPACE}RESOLUTION!${translations[Set the resolution used. (Direct3D and Glide settings)]} :CBE" "$(combobox_fix --disabled "${PW_DGV2_RESOLUTION}" "4x app resolution!3x app resolution!2x app resolution!${DGVOODOO2_XRANDR_NEW::-1}")" \
    --field="${CHKBOX_SPACE}FPS LIMIT!${translations[You can configure fps limit. (Direct3D and Glide settings)]} :CBE" "$(combobox_fix --disabled "${PW_DGV2_FPS_LIMIT}" "30!40!45!48!60!75!90!120!144!165!175!240")" \
    --field="${CHKBOX_SPACE}FILTERING!${translations[You can select from various texture filtering modes here. Forcing other than the app default can result in glitches or break some rendering effects. (Glide have max filtering bilinear) (Direct3D and Glide settings)]} :CB" "$(combobox_fix --disabled "${PW_DGV2_FILTERING}" "${DGVOODOO2_FILTERING}")" \
    --field="${CHKBOX_SPACE}ANTIALIASING!${translations[Forcing antialiasing. This can cause artifacts. (Direct3D and Glide settings)]} :CB" "$(combobox_fix --disabled "${PW_DGV2_ANTIALIASING}" "2x!4x!8x")" \
    --field="${CHKBOX_SPACE}BIT DEPTH!${translations[You can define what screen bit depth should be reported through dgVoodoo. (For game MOTO need 16 bit depth) (Direct3D and Glide settings)]} :CB" "$(combobox_fix --disabled "${PW_DGV2_BIT_DEPTH}" "8!16!32")" \
    --field="${CHKBOX_SPACE}VIDEOCARD!${translations[You can select a virtual video card. (For game Quake 2 need Voodoo Graphics or Voodoo Rush card) (Direct3D and Glide settings)]} :CB" "$(combobox_fix "${PW_DGV2_VIDEOCARD}" "${DGVOODOO2_VIDEOCARD}")" \
    --field="${CHKBOX_SPACE}VRAM!${translations[Increase the amount of vram for dgVoodoo2. (Direct3D settings)
5646 5647 5648 5649 5650 5651
- dgVoodoo2 SVGA 3D: 16 - 128
- dgVoodoo2 Virtual 3D: 16 - 4096
- Geforce 4 Ti 4800: 64 - 256
- ATI Radeon 8500: 64 - 256
- Matrox Parhelia-512: 128 - 256
- GeForce FX 5700 Ultra: 64 - 256
5652 5653 5654 5655 5656 5657
- GeForce 9800 GT: 512 - 1024]} :CB" "$(combobox_fix "${PW_DGV2_VRAM}" "16!32!64!128!256!512!1024!2048!4096")" \
    --field="${CHKBOX_SPACE}BRIGHTNESS!${translations[Brightness can be finetuned here. (Direct3D and Glide settings)]} :NUM" "${PW_DGV2_BRIGHTNESS}:!0..400" \
    --field="${CHKBOX_SPACE}COLOR!${translations[Color intensity. Finetued it to make colors or less vital compared to the application default, or even Black and White, according to your taste. (Direct3D and Glide settings)]} :NUM" "${PW_DGV2_COLOR}:!0..400" \
    --field="${CHKBOX_SPACE}CONTRAST!${translations[Contrast is the intensity difference between dark and bright regions. Only static contrast is implemented and you can finetune it here. (Direct3D and Glide settings)]} :NUM" "${PW_DGV2_CONTRAST}:!0..400" \
    --field="${CHKBOX_SPACE}DISPLAY ROI!${translations[Useful for applications rendering into a widescreen subrectangle inside a 4:3 resolution - the widescreen subrectangle can be defined as display ROI, the input of the scaling process. (Direct3D and Glide settings)]} :CBE" "$(combobox_fix --disabled "${PW_DGV2_DISPLAY_ROI}" "3_2!4_3!5_4!16_9!16_10!21_9")" \
    --field="${CHKBOX_SPACE}RESAMPLING!${translations[If scaling is done by the dgVoodoo than you can choose which resampling method to use. The more complex filter the more computationally expensive. Available ones in order of complexty. (Direct3D and Glide settings)
5658 5659 5660 5661
- Point sampled (unblurred pixels)
- Bilinear (smoothed)
- Lanczos-2 (smoothed but sharper)
- Bicubic (smoothed but sharper)
5662 5663
- Lanczos-3 (smoothed, sharpest)]} :CB" "$(combobox_fix --disabled "${PW_DGV2_RESAMPLING}" "${DGVOODOO2_RESAMPLING}")" \
    --field="${CHKBOX_SPACE}CURSOR SCALE!${translations[Integer scale factor of the emulated hardware mouse cursor. 0: calculated from the application and forced resolution. (Direct3D and Glide settings)]} :NUM" "${PW_DGV2_CURSOR_SCALE}:!0..5" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5664
    1> "${PW_TMPFS_PATH}/tmp_yad_dgv2_set_cb" 2>/dev/null &
5665

5666
    "${pw_yad}" --paned --key=$KEY_DGV2_GUI --height="350" --title="dgVoodoo2" \
5667
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
5668
    --gui-type="settings-paned" \
5669 5670 5671 5672
    --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
    --button="${translations[RESET]} DGVOODOO2!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings for]} dgVoodoo2":162 \
    --button="${translations[DISABLE]} DGVOODOO2!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Disable dgVoodoo2 and go to the previous menu]}":164 \
    --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":166 \
5673 5674
    2>/dev/null
    YAD_DGV2_STATUS="$?"
5675

5676 5677
    case "${YAD_DGV2_STATUS}" in
        1|252)
Vladislav's avatar
Vladislav committed
5678
            restart_pp
5679 5680
            ;;
        162)
5681
            sed -i '/PW_DGV2/d' "$portwine_exe".ppdb
5682
            sed -i '/DGVOODOO2/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
5683
            restart_pp
5684 5685
            ;;
        164)
5686
            export PW_DGVOODOO2="0"
5687 5688
            ;;
        166)
5689
            export PW_DGVOODOO2="1"
5690 5691 5692
            ;;
    esac

5693
    read -r -a output_yad_dgv2 <"${PW_TMPFS_PATH}/tmp_yad_dgv2_set"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5694
    bool_from_yad=0
5695 5696
    for boole_to_int in "${PW_DGV2_LIST[@]}" ; do
        export "${boole_to_int}"="${output_yad_dgv2[$bool_from_yad]}"
5697
        if [[ "${!boole_to_int}" == "TRUE" ]]
5698 5699
        then export "${boole_to_int}"="1"
        else export "${boole_to_int}"="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5700
        fi
Vladislav's avatar
Vladislav committed
5701
        export bool_from_yad=$(( bool_from_yad + 1 ))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5702
    done
5703

5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717
    IFS='%' read -r -a PW_ADD_SETTINGS_DGV2 <"${PW_TMPFS_PATH}/tmp_yad_dgv2_set_cb"
    PW_DGV2_RESOLUTION="${PW_ADD_SETTINGS_DGV2[0]}"
    PW_DGV2_FPS_LIMIT="${PW_ADD_SETTINGS_DGV2[1]}"
    PW_DGV2_FILTERING="${PW_ADD_SETTINGS_DGV2[2]}"
    PW_DGV2_ANTIALIASING="${PW_ADD_SETTINGS_DGV2[3]}"
    PW_DGV2_BIT_DEPTH="${PW_ADD_SETTINGS_DGV2[4]}"
    PW_DGV2_VIDEOCARD="${PW_ADD_SETTINGS_DGV2[5]}"
    PW_DGV2_VRAM="${PW_ADD_SETTINGS_DGV2[6]}"
    PW_DGV2_BRIGHTNESS="${PW_ADD_SETTINGS_DGV2[7]}"
    PW_DGV2_COLOR="${PW_ADD_SETTINGS_DGV2[8]}"
    PW_DGV2_CONTRAST="${PW_ADD_SETTINGS_DGV2[9]}"
    PW_DGV2_DISPLAY_ROI="${PW_ADD_SETTINGS_DGV2[10]}"
    PW_DGV2_RESAMPLING="${PW_ADD_SETTINGS_DGV2[11]}"
    PW_DGV2_CURSOR_SCALE="${PW_ADD_SETTINGS_DGV2[12]}"
Vladislav's avatar
Vladislav committed
5718

5719
    edit_db_from_gui "${PW_DGV2_LIST[@]}" PW_DGVOODOO2 PW_DGV2_FILTERING PW_DGV2_ANTIALIASING PW_DGV2_VRAM PW_DGV2_RESOLUTION \
5720 5721
    PW_DGV2_FPS_LIMIT PW_DGV2_BIT_DEPTH PW_DGV2_BRIGHTNESS PW_DGV2_COLOR PW_DGV2_CONTRAST PW_DGV2_VIDEOCARD PW_DGV2_DISPLAY_ROI \
    PW_DGV2_CURSOR_SCALE PW_DGV2_RESAMPLING
5722

Vladislav's avatar
Vladislav committed
5723
    restart_pp
5724 5725 5726 5727
}

# GUI GAMESCOPE
gui_gamescope () {
5728
    KEY_GS_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
5729
    PW_GS_LIST=(PW_GS_FULLSCREEN PW_GS_FORCE_FULLSCREEN PW_GS_BORDERLESS_WINDOW PW_GS_FORCE_GRAB_CURSOR
5730
    PW_GS_FORCE_GRAB_KEYBOARD PW_GS_HDR_ENABLE PW_GS_ENABLE_GAMESCOPE_WSI PW_GS_HDR_ITM_ENABLE PW_GS_SDR_GAMMUT_WIDENESS
5731
    PW_GS_FORCE_COMPOSITION PW_GS_HDR_FORCE_SUPPORT PW_GS_HDR_FORCE_OUTPUT PW_GS_HDR_FORCE_HEATMAP
5732
    PW_GS_EXPOSE_WAYLAND PW_GS_REALTIME_SCHEDULING
Vladislav's avatar
Vladislav committed
5733
    )
5734

5735 5736 5737 5738
    [[ $(<"${PW_TMPFS_PATH}/gamescope.tmp") =~ '--mangoapp' ]] && add_to_array "PW_GS_LIST" PW_GS_MANGOAPP
    [[ $(<"${PW_TMPFS_PATH}/gamescope.tmp") =~ '--backend' ]] && add_to_array "PW_GS_LIST" PW_GS_BACKEND_SDL
    check_wayland_session && add_to_array "PW_GS_LIST" PW_GS_SDL_VIDEODRIVER_X11
    [[ $(<"${PW_TMPFS_PATH}/gamescope.tmp") =~ '--cursor-scale-height' ]] && add_to_array "PW_GS_LIST" PW_GS_CURSOR_SCALE_HEIGHT
5739

5740
    #debian bookworm fix
5741
    if [[ $(<"${PW_TMPFS_PATH}/gamescope.tmp") =~ '-U, --fsr-upscaling' ]] ; then
5742 5743
        GS_FILTER_CB="fsr!nis"
        export PW_GS_FILTER_MODE_OLD="true"
5744 5745
        rm_from_array "PW_GS_LIST" PW_GS_FORCE_GRAB_CURSOR PW_GS_FORCE_GRAB_KEYBOARD PW_GS_HDR_ENABLE PW_GS_HDR_FORCE_SUPPORT \
        PW_GS_HDR_FORCE_OUTPUT
5746 5747
    else
        GS_FILTER_CB="linear!nearest!fsr!nis!pixel"
5748 5749
    fi

5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767
    PW_GS_FULLSCREEN_INFO=${translations[Make the window fullscreen]}
    PW_GS_FORCE_FULLSCREEN_INFO=${translations[Force windows inside of gamescope to be the size of the nested display (fullscreen)]}
    PW_GS_BORDERLESS_WINDOW_INFO=${translations[Make the window borderless. Working only with backend sdl or X11 session.]}
    PW_GS_FORCE_GRAB_KEYBOARD_INFO=${translations[Grab the keyboard]}
    PW_GS_FORCE_GRAB_CURSOR_INFO=${translations[Always use relative mouse mode instead of flipping dependent on cursor visibility.]}
    PW_GS_HDR_ENABLE_INFO=${translations[Enable HDR output (needs Gamescope WSI layer enabled for support from clients). If this is not set, and there is a HDR client, it will be tonemapped SDR.]}
    PW_GS_ENABLE_GAMESCOPE_WSI_INFO=${translations[This can be useful for some HDR options and for some DXVK v2.3 vsync optimisations]}
    PW_GS_SDR_GAMMUT_WIDENESS_INFO=${translations[Set the \'wideness\' of the gamut for SDR comment. 0 - 1.]}
    PW_GS_HDR_ITM_ENABLE_INFO=${translations[Enable SDR->HDR inverse tone mapping. only works for SDR input.]}
    PW_GS_FORCE_COMPOSITION_INFO=${translations[Disables direct scan-out]}
    PW_GS_HDR_FORCE_SUPPORT_INFO=${translations[Forces support for HDR and associated opptions even if the current display does not support it]}
    PW_GS_HDR_FORCE_OUTPUT_INFO=${translations[Forces support and output to HDR10 PQ even if the output does not support it (will look very wrong if it doesn\'t)]}
    PW_GS_HDR_FORCE_HEATMAP_INFO=${translations[Displays a heatmap-style debug view of HDR luminence across the scene in nits.]}
    PW_GS_EXPOSE_WAYLAND_INFO=${translations[Expose Wayland clients using xdg-shell]}
    PW_GS_REALTIME_SCHEDULING_INFO=${translations[Enable GameScope realtime scheduling]}
    PW_GS_MANGOAPP_INFO=${translations[Launch with the mangoapp (mangohud) performance overlay enabled. You should use this instead of using mangohud on the game or gamescope.]}
    PW_GS_BACKEND_SDL_INFO=${translations[Use sdl backend. (by default wayland backend is used).]}
    PW_GS_SDL_VIDEODRIVER_X11_INFO=${translations[Force use sdl videodriver x11, works with BACKEND SDL. (Default is wayland)]}
5768
    PW_GS_CURSOR_SCALE_HEIGHT_INFO=${translations[if specified, sets a base output height to linearly scale the cursor against.]}
5769

5770 5771
    unset ADD_CHK_BOX_GS
    if [[ "${GAMESCOPE_INSTALLED}" == 1 ]] ; then
Vladislav's avatar
Vladislav committed
5772
        GAMESCOPE_NEED_INSTALL="${translations[Change settings gamescope for]} <b>$PW_NAME_DESKTOP_PROXY</b>\n ${translations[<b>NOTE:</b> To display help for each item, simply hover your mouse over the text]}"
5773
        GS_CB="CB" && GS_CBE="CBE" && GS_NUM="NUM" && GS_NUMN="NUMN"
5774
        for int_to_boole in "${PW_GS_LIST[@]}" ; do
5775
            if [[ "${!int_to_boole}" == "1" ]]
Vladislav's avatar
Vladislav committed
5776 5777
            then export "$int_to_boole"="TRUE"
            else export "$int_to_boole"="FALSE"
5778 5779
            fi
            TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
5780 5781
            int_to_boole_non_pw="${int_to_boole//PW_GS/}"
            int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
5782 5783 5784 5785
            ADD_CHK_BOX_GS+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:${THEME_CHKBOX}%${!int_to_boole}%"
        done
    else
        if check_flatpak ; then
Vladislav's avatar
Vladislav committed
5786
            GAMESCOPE_VERSION="$(grep 'VERSION_ID=' /etc/os-release)"
Vladislav's avatar
Vladislav committed
5787
            GAMESCOPE_NEED_INSTALL=$(eval_translations "<b>Gamescope is not detected on the system, to install it, run the command in the terminal:\\nflatpak install -y runtime/org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/\$%{GAMESCOPE_VERSION}%\\n(Can be selected and copied)</b>" "GAMESCOPE_VERSION=${GAMESCOPE_VERSION//VERSION_ID=/}")
5788
            YAD_TEXT_SELECTION="--selectable-labels"
5789
        else
5790
            GAMESCOPE_NEED_INSTALL="${translations[<b>Gamescope is not detected on the system, please contact the manufacturer of your distribution\\nor search the Internet for information on how to install gamescope on your system.</b>]}"
5791 5792
        fi
        GS_CB="DCB" && GS_CBE="DCBE" && GS_NUM="DNUM" && GS_NUMN="DNUMN"
5793
        for int_to_boole in "${PW_GS_LIST[@]}" ; do
5794
            if [[ "${!int_to_boole}" == "1" ]]
Vladislav's avatar
Vladislav committed
5795 5796
            then export "$int_to_boole"="TRUE"
            else export "$int_to_boole"="FALSE"
5797 5798
            fi
            TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
5799 5800
            int_to_boole_non_pw="${int_to_boole//PW_GS/}"
            int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
5801
            ADD_CHK_BOX_GS+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
5802 5803 5804
        done
    fi

5805
    IFS="%"
Vladislav's avatar
Vladislav committed
5806
    "${pw_yad}" --plug=$KEY_GS_GUI --tabnum="1" --form --columns=4 --separator=" " --text-align=center --text "$GAMESCOPE_NEED_INSTALL" \
Vladislav's avatar
Vladislav committed
5807
    --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" $YAD_TEXT_SELECTION \
5808
    ${ADD_CHK_BOX_GS} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5809
    1> "${PW_TMPFS_PATH}/tmp_yad_gs_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5810
    IFS="$orig_IFS"
5811

5812
    GAMESCOPE_XRANDR="$(grep -e '[0-9]x' "${PW_TMPFS_PATH}/xrandr.tmp" | awk '{print $1}' | sort -rVu | grep ^"[0-9]" | tr '\n' ' ')"
5813 5814 5815 5816 5817
    for drop_low in ${GAMESCOPE_XRANDR} ; do
        if (( "${drop_low//x/}" > "1000000" )) ; then
            GAMESCOPE_XRANDR_NEW+="${drop_low}!"
        fi
    done
5818

Vladislav's avatar
Vladislav committed
5819
    "${pw_yad}" --plug=$KEY_GS_GUI --tabnum="2" --form --columns=2 --separator="%" --homogeneous-row \
Vladislav's avatar
Vladislav committed
5820
    --gui-type-text="${PANED_GUI_TYPE_TEXT_DOWN}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831
    --field="${CHKBOX_SPACE}${translations[Show resolution]}!${translations[Set the resolution used by gamescope. Resizing the gamescope window will update these settings. Defaults to 1280x720.]} :${GS_CBE}" "$(combobox_fix --disabled "${PW_GS_SHOW_RESOLUTION}" "${GAMESCOPE_XRANDR_NEW::-1}")" \
    --field="${CHKBOX_SPACE}${translations[Internal resolution]}!${translations[Scale internal resolution (0.0 is unused)]} :${GS_NUMN}" "${PW_GS_INTERNAL_RESOLUTION}:!0..2" \
    --field="${CHKBOX_SPACE}${translations[Frame limit]}!${translations[Set a framerate limit. Specified in frames per second]} :${GS_CBE}" "$(combobox_fix --disabled "${PW_GS_FRAME_LIMIT}" "30!40!45!48!60!75!90!120!144!165!175!240")" \
    --field="${CHKBOX_SPACE}${translations[Scaler mode]}!${translations[Specify how to scale the GameScope window content]} :${GS_CB}" "$(combobox_fix --disabled "${PW_GS_SCALER_MODE}" "auto!integer!fit!fill!stretch")" \
    --field="${CHKBOX_SPACE}${translations[Filter mode]}!${translations[Use a filter such as AMD FidelityFX SuperResolution 1.0 (FSR) or NVIDIA Image Scaling v1.0.3 (NIS)]} :${GS_CB}" "$(combobox_fix --disabled "${PW_GS_FILTER_MODE}" "${GS_FILTER_CB}")" \
    --field="${CHKBOX_SPACE}${translations[Upscale sharpness]}!${translations[Sharpening value for FidelityFX SuperResolution 1.0 (FSR) and NVIDIA Image Scaling v1.0.3 (NIS). 0 is max sharpening, 20 is min sharpening.]} :${GS_NUM}" "${PW_GS_UPSCALE_SHARPNESS}:!0..20" \
    --field="${CHKBOX_SPACE}${translations[Max scale factor]}!${translations[Maximum Scale Factor. Working only on X11 or backend sdl (0.0 is unused)]} :${GS_NUMN}" "${PW_GS_MAX_SCALE_FACTOR}:!0..100" \
    --field="${CHKBOX_SPACE}${translations[Mouse sensitivity]}!${translations[Configurable mouse sensitivity, multiply mouse movement by specified decimal number amount]} :${GS_NUMN}" "${PW_GS_MOUSE_SENSITIVITY}:!0..100" \
    --field="${CHKBOX_SPACE}${translations[HDR SDR nits]}!${translations[Set the luminance of SDR content in nits. Default: 400 nits.]} :${GS_NUM}" "${PW_GS_SDR_CONTENT_NITS}:!0..10000" \
    --field="${CHKBOX_SPACE}${translations[HDR inverse SDR]}!${translations[Set the luminance of SDR content in nets used as the input for the inverse tone mapping process - Maximum is 1000 nits]} :${GS_NUM}" "${PW_GS_ITM_SDR_NITS}:!0..1000" \
    --field="${CHKBOX_SPACE}${translations[HDR inverse target]}!${translations[Set the target luninance of the inverse tone mapping process - Max is 10000 nits]} :${GS_NUM}" "${PW_GS_ITM_TARGET_NITS}:!0..10000" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5832
    1> "${PW_TMPFS_PATH}/tmp_yad_gs_set_cb" 2>/dev/null &
5833

5834
    "${pw_yad}" --paned --key="$KEY_GS_GUI" --title="GameScope" \
5835
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
5836
    --gui-type="settings-paned" \
5837 5838 5839 5840
    --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
    --button="${translations[RESET]} GAMESCOPE!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings for]} GameScope":162 \
    --button="${translations[DISABLE]} GAMESCOPE!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Disable GameScope and go to the previous menu]}":164 \
    --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":166 \
5841 5842
    2>/dev/null
    YAD_GAMESCOPE_STATUS="$?"
5843

5844
    case "${YAD_GAMESCOPE_STATUS}" in
5845
        1|252)
Vladislav's avatar
Vladislav committed
5846
            restart_pp
5847 5848
            ;;
        162)
5849
            sed -i '/PW_GS/d' "$portwine_exe".ppdb
5850
            sed -i '/GAMESCOPE/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
5851
            restart_pp
5852
            ;;
5853
        164)
5854
            export PW_GAMESCOPE="0"
5855
            ;;
5856
        166)
5857
            export PW_GAMESCOPE="1"
5858 5859 5860
            ;;
    esac

5861
    read -r -a output_yad_gs <"${PW_TMPFS_PATH}/tmp_yad_gs_set"
Vladislav's avatar
Vladislav committed
5862
    bool_from_yad="0"
5863 5864
    for boole_to_int in "${PW_GS_LIST[@]}" ; do
        export "${boole_to_int}"="${output_yad_gs[$bool_from_yad]}"
5865
        if [[ "${!boole_to_int}" == "TRUE" ]]
5866 5867
        then export "${boole_to_int}"="1"
        else export "${boole_to_int}"="0"
5868
        fi
Vladislav's avatar
Vladislav committed
5869
        export bool_from_yad=$(( bool_from_yad + 1 ))
5870 5871
    done

5872 5873 5874 5875
    IFS='%' read -r -a PW_ADD_SETTINGS_GS <"${PW_TMPFS_PATH}/tmp_yad_gs_set_cb"
    PW_GS_SHOW_RESOLUTION="${PW_ADD_SETTINGS_GS[0]}"
    PW_GS_INTERNAL_RESOLUTION="${PW_ADD_SETTINGS_GS[1]//','/'.'}"
    PW_GS_FRAME_LIMIT="${PW_ADD_SETTINGS_GS[2]}"
5876 5877 5878 5879 5880 5881 5882 5883
    PW_GS_SCALER_MODE="${PW_ADD_SETTINGS_GS[3]}"
    PW_GS_FILTER_MODE="${PW_ADD_SETTINGS_GS[4]}"
    PW_GS_UPSCALE_SHARPNESS="${PW_ADD_SETTINGS_GS[5]}"
    PW_GS_MAX_SCALE_FACTOR="${PW_ADD_SETTINGS_GS[6]//','/'.'}"
    PW_GS_MOUSE_SENSITIVITY="${PW_ADD_SETTINGS_GS[7]//','/'.'}"
    PW_GS_SDR_CONTENT_NITS="${PW_ADD_SETTINGS_GS[8]}"
    PW_GS_ITM_SDR_NITS="${PW_ADD_SETTINGS_GS[9]}"
    PW_GS_ITM_TARGET_NITS="${PW_ADD_SETTINGS_GS[10]}"
Vladislav's avatar
Vladislav committed
5884

5885
    edit_db_from_gui "${PW_GS_LIST[@]}" PW_GAMESCOPE PW_GS_SHOW_RESOLUTION PW_GS_INTERNAL_RESOLUTION \
5886
    PW_GS_FRAME_LIMIT PW_GS_SCALER_MODE PW_GS_FILTER_MODE \
5887 5888
    PW_GS_UPSCALE_SHARPNESS PW_GS_MAX_SCALE_FACTOR PW_GS_MOUSE_SENSITIVITY \
    PW_GS_SDR_CONTENT_NITS PW_GS_ITM_SDR_NITS PW_GS_ITM_TARGET_NITS
5889

Vladislav's avatar
Vladislav committed
5890
    restart_pp
5891 5892
}

Vladislav's avatar
Vladislav committed
5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910
# GUI USERCONF
gui_userconf () {
    if [[ -f "${portwine_exe}" ]] ; then
        export PW_YAD_FORM_TAB="1"
        export TAB_START="2"
    fi

    if [[ "$MIRROR" == "CLOUD" ]]
    then NEW_MIRROR="GITHUB"
    else NEW_MIRROR="CLOUD"
    fi

    if [[ "$BRANCH" == "master" ]]
    then NEW_BRANCH="DEVEL"
    else NEW_BRANCH="STABLE"
    fi

    if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]]
5911 5912
    then NEW_STEAM_BEHAVIOR="${translations[Disable]}"
    else NEW_STEAM_BEHAVIOR="${translations[Enable]}"
Vladislav's avatar
Vladislav committed
5913 5914 5915 5916 5917 5918 5919 5920 5921
    fi

    if [[ "$PW_GUI_START" == "NOTEBOOK" ]]
    then NEW_START_GUI="PANED"
    else NEW_START_GUI="NOTEBOOK"
    fi

    KEY_USERCONF_GUI=$RANDOM

Vladislav's avatar
Vladislav committed
5922
    "${pw_yad}" --plug=$KEY_USERCONF_GUI --tabnum="1" --form --columns=2 --separator=" " --text-align=center \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5923
    --text "${translations[Change global settings]} <b>(edit user.conf)</b>\n ${translations[<b>NOTE:</b> To display help for each item, simply hover your mouse over the text]}" \
5924
    --align-buttons --homogeneous-column --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
5925 5926 5927 5928
    --field="   ${translations[Change mirror to]} $NEW_MIRROR!$PW_GUI_ICON_PATH/$BUTTON_SIZE_MM.png!${translations[Depending on which mirror is selected, updates will be downloaded from there.]}":"FBTN" '@bash -c "button_click --userconf change_mirror"' \
    --field="   ${translations[Change branch to]} $NEW_BRANCH!$PW_GUI_ICON_PATH/$BUTTON_SIZE_MM.png!${translations[Depending on the version of the scripts, PortProton will receive the latest changes first (the DEVEL branch), the STABLE branch is updated later and is stable.]}":"FBTN" '@bash -c "button_click --userconf change_branch"' \
    --field="   ${translations[Change start gui to]} $NEW_START_GUI!$PW_GUI_ICON_PATH/$BUTTON_SIZE_MM.png!${translations[When using PANED in the game start menu, additional buttons are located on one large page; if NOTEBOOK, then they are divided into several.]}":"FBTN" '@bash -c "button_click --userconf change_gui_start"' \
    --field="   $NEW_STEAM_BEHAVIOR ${translations[steam covers download]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE_MM.png!${translations[If downloading steam covers is enabled, they will be downloaded and created. (Disablement is provided in cases where their downloading is unavailable for some reason)]}":"FBTN" '@bash -c "button_click --userconf change_download_grid"' \
Vladislav's avatar
Vladislav committed
5929 5930
    2>/dev/null &

Vladislav's avatar
Vladislav committed
5931 5932
    if [[ -n "$PW_SOUND_DRIVER_USE" ]] \
    && [[ "$PW_SOUND_DRIVER_USE" != "disabled" ]]
Vladislav's avatar
Vladislav committed
5933
    then
Vladislav's avatar
Vladislav committed
5934
        SOUND_DRIVER_VAR="$PW_SOUND_DRIVER_USE"
Vladislav's avatar
Vladislav committed
5935 5936 5937 5938
    else
        SOUND_DRIVER_VAR="disabled"
    fi

Vladislav's avatar
Vladislav committed
5939 5940
    if [[ -n "$PW_GPU_USE" ]] \
    && [[ "$PW_GPU_USE" != "disabled" ]]
Vladislav's avatar
Vladislav committed
5941
    then
Vladislav's avatar
Vladislav committed
5942
        GPU_VAR="$PW_GPU_USE"
Vladislav's avatar
Vladislav committed
5943 5944 5945 5946
    else
        GPU_VAR="disabled"
    fi

Vladislav's avatar
Vladislav committed
5947 5948
    if [[ -n "$DESKTOP_WITH_TIME" ]] \
    && [[ "$DESKTOP_WITH_TIME" != "disabled" ]]
5949
    then
5950
        DESKTOP_WITH_TIME="enabled"
5951
    else
5952 5953 5954
        DESKTOP_WITH_TIME="disabled"
    fi

Vladislav's avatar
Vladislav committed
5955 5956
    if [[ -n "$SORT_WITH_TIME" ]] \
    && [[ "$SORT_WITH_TIME" == "disabled" ]]
5957 5958 5959 5960
    then
        SORT_WITH_TIME="disabled"
    else
        SORT_WITH_TIME="enabled"
5961 5962
    fi

5963 5964 5965
    if [[ $PW_WINE_DPI_VALUE == "recommended" ]] ; then
        PW_WINE_DPI_VALUE="${translations[Recommended value]}"
    fi
Vladislav's avatar
Vladislav committed
5966 5967 5968 5969 5970 5971 5972 5973
    if [[ -n "$PW_WINE_DPI_VALUE" ]] \
    && [[ "$PW_WINE_DPI_VALUE" != "disabled" ]]
    then
        YAD_DPI_VAR="$PW_WINE_DPI_VALUE"
    else
        YAD_DPI_VAR="disabled"
    fi

5974 5975 5976 5977 5978
    if [[ $GUI_THEME == default ]] ; then GUI_THEME=${translations[default]}
    elif [[ $GUI_THEME == compact ]] ; then GUI_THEME=${translations[compact]}
    elif [[ $GUI_THEME == classic ]] ; then GUI_THEME=${translations[classic]}
    fi

Vladislav's avatar
Vladislav committed
5979
    if command -v gsettings &>/dev/null ; then
5980
        YAD_GTK_THEME=$(gsettings get org.gnome.desktop.interface gtk-theme)
5981
        [[ $YAD_GTK_THEME == \'Adwaita\' ]] && unset YAD_GTK_THEME
5982
        [[ -n $YAD_GTK_THEME ]] && YAD_GTK_THEME="${YAD_GTK_THEME//\'/}!"
5983
    fi
Vladislav's avatar
Vladislav committed
5984 5985 5986 5987
    if [[ -z $GTK_THEME ]] ; then GTK_THEME=${translations[default]}
    elif [[ $GTK_THEME =~ light$ ]] ; then GTK_THEME="${GTK_THEME//light/${translations[light]}}"
    elif [[ $GTK_THEME =~ dark$ ]] ; then GTK_THEME="${GTK_THEME//dark/${translations[dark]}}"
    fi
5988

5989
    "${pw_yad}" --plug=$KEY_USERCONF_GUI --tabnum="2" --form --columns=1 --separator="%" --homogeneous-row \
5990 5991
    --gui-type-text="$PANED_GUI_TYPE_TEXT_DOWN" --gui-type-layout="$PANED_GUI_TYPE_LAYOUT_DOWN" \
    --field="${translations[Choose a graphics card to run the game]}!${translations[Select which video card will be used to run the game (used for all running games and programs in PortProton)]} :CB" "$(combobox_fix --disabled "$GPU_VAR" "$GET_GPU_NAMES")" \
5992
    --field="${translations[Force dpi]}!${translations[Here you can set forced dpi for applications wine]} :CB" "$(combobox_fix --disabled "$YAD_DPI_VAR" "${translations[Recommended value]}!80!96!120!144!168!192!216!240")" \
5993
    --field="${translations[Choice wine audio driver]}!${translations[Fixes sound popling if choice alsa]} :CB" "$(combobox_fix --disabled "$SOUND_DRIVER_VAR" "alsa!oss!pulse")" \
5994
    --field="${translations[Select PortProton theme]}!${translations[Allows you to select a theme for PortProton]} :CB" "$(combobox_fix "$GUI_THEME" "${translations[default]}!${translations[compact]}!${translations[classic]}")" \
Vladislav's avatar
Vladislav committed
5995
    --field="${translations[Select gtk theme]}!${translations[Allows you to select a theme for GTK.]} :CB" "$(combobox_fix "$GTK_THEME" "${YAD_GTK_THEME}Adwaita:${translations[light]}!Adwaita:${translations[dark]}!${translations[default]}")" \
5996 5997
    --field="${translations[Time display]}!${translations[Displays time spent in an application or game]} :CB" "$(combobox_fix --disabled "$DESKTOP_WITH_TIME" "enabled")" \
    --field="${translations[Sort shortcuts by time]}!${translations[This setting sorts the shortcuts in the main menu depending on the time spent in the application or game]} :CB" "$(combobox_fix --disabled "$SORT_WITH_TIME" "enabled")" \
Vladislav's avatar
Vladislav committed
5998 5999
    1> "${PW_TMPFS_PATH}/tmp_yad_userconf_set_cb" 2>/dev/null &

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6000
    "${pw_yad}" --key=$KEY_USERCONF_GUI --paned --sensitive \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6001
    --title="${translations[GLOBAL SETTINGS (USER.CONF)]}" \
Vladislav's avatar
Vladislav committed
6002 6003
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
    --gui-type="settings-paned" \
6004 6005 6006 6007
    --button="${translations[CANCEL THE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Cancel the current changes and return to the previous menu]}":1 \
    --button="${translations[RESET]} USER.CONF!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Restore default settings for]} user.conf":2 \
    --button="${translations[OPEN THE SETTINGS FILE]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Open the <b>user.conf</b> settings file in a system text editor to view and change variables manually]}":164 \
    --button="${translations[SAVE CHANGES]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Save the current changes, and go to the previous menu]}":166 \
Vladislav's avatar
Vladislav committed
6008 6009 6010 6011 6012
    2>/dev/null
    YAD_USERCONF_STATUS="$?"

    case "$YAD_USERCONF_STATUS" in
        1|252)
Vladislav's avatar
Vladislav committed
6013
            restart_pp
Vladislav's avatar
Vladislav committed
6014
            ;;
6015
        2)
6016
            if yad_question "${translations[Do you really want to reset settings for]} <b>user.conf</b>?"
6017 6018 6019 6020 6021 6022 6023
            then
                try_remove_file "$USER_CONF"
                exit 0
            else
                restart_pp --userconf
            fi
            ;;
Vladislav's avatar
Vladislav committed
6024 6025 6026 6027
        164)
            gui_open_user_conf
            ;;
        166)
6028
            IFS='%' read -r -a PW_ADD_SETTINGS_UC <"${PW_TMPFS_PATH}/tmp_yad_userconf_set_cb"
Vladislav's avatar
Vladislav committed
6029
            PW_GPU_USE="${PW_ADD_SETTINGS_UC[0]}"
Vladislav's avatar
Vladislav committed
6030 6031 6032
            PW_WINE_DPI_VALUE="${PW_ADD_SETTINGS_UC[1]}"
            PW_SOUND_DRIVER_USE="${PW_ADD_SETTINGS_UC[2]}"
            GUI_THEME="${PW_ADD_SETTINGS_UC[3]}"
6033 6034 6035 6036
            GTK_THEME="${PW_ADD_SETTINGS_UC[4]}"
            DESKTOP_WITH_TIME="${PW_ADD_SETTINGS_UC[5]}"
            SORT_WITH_TIME="${PW_ADD_SETTINGS_UC[6]}"

6037 6038 6039
            if [[ $PW_WINE_DPI_VALUE == "${translations[Recommended value]}" ]] ; then
                PW_WINE_DPI_VALUE="recommended"
            fi
6040 6041 6042
            if [[ $GUI_THEME == "${translations[default]}" ]] ; then GUI_THEME=default
            elif [[ $GUI_THEME == "${translations[compact]}" ]] ; then GUI_THEME=compact
            elif [[ $GUI_THEME == "${translations[classic]}" ]] ; then GUI_THEME=classic
6043
            fi
6044
            if [[ $GTK_THEME == "${translations[default]}" ]] ; then unset GTK_THEME
6045 6046
            elif [[ $GTK_THEME =~ ${translations[light]} ]] ; then GTK_THEME=${GTK_THEME//${translations[light]}/light}
            elif [[ $GTK_THEME =~ ${translations[dark]} ]] ; then GTK_THEME=${GTK_THEME//${translations[dark]}/dark}
6047
            fi
6048

6049
            edit_user_conf_from_gui PW_GPU_USE PW_WINE_DPI_VALUE PW_SOUND_DRIVER_USE GUI_THEME GTK_THEME DESKTOP_WITH_TIME SORT_WITH_TIME
Vladislav's avatar
Vladislav committed
6050
            restart_pp
Vladislav's avatar
Vladislav committed
6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070
            ;;
    esac

    pw_yad_set_form
    case "$PW_YAD_SET" in
        change_mirror)
            change_mirror
            ;;
        change_branch)
            change_branch
            ;;
        change_gui_start)
            change_gui_start
            ;;
        change_download_grid)
            change_download_grid
            ;;
    esac
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6071 6072
# RESIZE PNG FILE
resize_png () {
6073
    if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6074 6075 6076 6077
        print_error "no argument specified for resize_png"
        return 1
    else
        local RESIZE_FILE="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6078
        local RESIZE_NAME_PNG="${2// /_}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6079 6080
        local RESIZE_TO="$3"
    fi
6081

6082
    if [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" ]] \
6083 6084
    || [[ ! -f "${RESIZE_FILE}" ]] \
    || [[ ! ${RESIZE_FILE,,} =~ .exe$ ]]
6085 6086 6087
    then
        return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6088 6089 6090 6091
    try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png"
    try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png"

    if check_flatpak ; then
6092
        if ! timeout 3 \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6093
        exe-thumbnailer --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" \
6094
        && [[ "$ALPINE_FP" != "1" ]]
6095 6096 6097
        then
            print_error "exe-thumbnailer - broken!"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6098
    else
6099
        print_warning "use portable exe-thumbnailer"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6100 6101 6102 6103 6104 6105 6106 6107
        env PYTHONPATH="${PW_PLUGINS_PATH}/portable/lib/python3.9/site-packages/" \
        LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" \
        "${PW_WINELIB}/runtime/files/bin/python3.9"  \
        "${PW_PLUGINS_PATH}/portable/bin/exe-thumbnailer" --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png"
    fi
    return 0
}

6108
# GUI CREATE SHORTCUT
6109
portwine_create_shortcut () {
6110
    export GDK_BACKEND="x11"
6111
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6112
    pw_exit_tray
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6113 6114
    [[ ! -e ${portwine_exe} ]] && return 1
    pw_create_gui_png
6115

6116 6117 6118 6119
    [[ -z "${PW_SHORTCUT_MENU}" ]] && PW_SHORTCUT_MENU="TRUE"
    [[ -z "${PW_SHORTCUT_DESKTOP}" ]] && PW_SHORTCUT_DESKTOP="TRUE"
    [[ -z "${PW_SHORTCUT_STEAM}" ]] && PW_SHORTCUT_STEAM="FALSE"

Vladislav's avatar
Vladislav committed
6120 6121 6122
    unset name_desktop
    create_name_desktop
    export name_desktop="$PW_NAME_DESKTOP_PROXY"
6123 6124 6125

    [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}"

6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136
    OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \
    --gui-type="settings-shortcut" \
    --gui-type-box="${NOTEBOOK_GUI_TYPE_BOX}" --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" \
    --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" --gui-type-images="${NOTEBOOK_GUI_TYPE_IMAGE}" \
    --window-icon "$PW_GUI_ICON_PATH/portproton.svg" \
    --image "${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" \
    --text-align="center" --text "${translations[The shortcut will be created in the PortProton directory.]}" \
    --field="${translations[Name]}" "${name_desktop}" \
    --field="  ${translations[Add shortcut to MENU -> GAMES]}":CHK "$PW_SHORTCUT_MENU" \
    --field="  ${translations[Add shortcut to Desktop]}":CHK "$PW_SHORTCUT_DESKTOP" \
    --field="  ${translations[Add shortcut to STEAM library]}":CHK "$PW_SHORTCUT_STEAM" \
6137 6138
    --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":2 \
    --button="${translations[CREATE SHORTCUT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null)
6139
    PW_YAD_OUT=$?
6140 6141
    portwine_output_yad_shortcut
}
6142

6143
portwine_output_yad_shortcut () {
6144
    if [[ "$PW_YAD_OUT" == "0" ]] ; then
6145
        name_desktop=$(echo "$OUTPUT" | awk -F'|' '{print $1}' | sed -e "s/\`//g" -e "s/\"//g" -e "s/'//g" -e "s/\!//g")
6146 6147 6148
        PW_SHORTCUT_MENU=$(echo "$OUTPUT" | awk -F'|' '{print $2}')
        PW_SHORTCUT_DESKTOP=$(echo "$OUTPUT" | awk -F'|' '{print $3}')
        PW_SHORTCUT_STEAM=$(echo "$OUTPUT" | awk -F'|' '{print $4}')
6149

6150 6151
        if [[ $PORTWINE_CHANGE_SHORTCUT != 1 ]] ; then
            edit_user_conf_from_gui PW_SHORTCUT_MENU PW_SHORTCUT_DESKTOP PW_SHORTCUT_STEAM
6152
        fi
6153

6154
        portwine_delete_shortcut
6155

Vladislav's avatar
Vladislav committed
6156
        [[ -z $name_desktop ]] && create_name_desktop && export name_desktop="$PW_NAME_DESKTOP_PROXY"
6157

6158 6159 6160
        echo "[Desktop Entry]" > "${PORT_WINE_PATH}/${name_desktop}.desktop"
        echo "Name=${name_desktop}" >> "${PORT_WINE_PATH}/${name_desktop}.desktop"
        if check_flatpak
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6161 6162 6163 6164 6165 6166 6167 6168
        then echo "Exec=flatpak run ru.linux_gaming.PortProton \"${portwine_exe}\"" >> "${PORT_WINE_PATH}/${name_desktop}.desktop"
        else echo "Exec=env \"${PORT_SCRIPTS_PATH}/start.sh\" \"${portwine_exe}\"" >> "${PORT_WINE_PATH}/${name_desktop}.desktop"
        fi
        {
            echo "Type=Application"
            echo "Categories=Game"
            echo "StartupNotify=true"
            echo "Path=${PORT_SCRIPTS_PATH}/"
6169
            echo "Icon=${PORT_WINE_PATH}/data/img/${name_desktop_png}.png"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6170
        } >> "${PORT_WINE_PATH}/${name_desktop}.desktop"
6171
        chmod +x "${PORT_WINE_PATH}/${name_desktop}.desktop"
6172

6173
        if [[ "${PW_SHORTCUT_MENU}" == "TRUE" ]] ; then
6174 6175 6176 6177
            try_remove_file "${HOME}/.local/share/applications/${name_desktop}.desktop"
            cp -f "${PORT_WINE_PATH}/${name_desktop}.desktop" "${HOME}/.local/share/applications/"
        fi

6178
        if [[ "${PW_SHORTCUT_DESKTOP}" == "TRUE" ]] ; then
6179 6180 6181 6182 6183 6184 6185 6186 6187
            if [[ -d "${HOME}/Desktop" ]] ; then
                cp -f "${PORT_WINE_PATH}/${name_desktop}.desktop" "${HOME}/Desktop/"
            elif [[ -d "${HOME}/Рабочий стол" ]] ; then
                cp -f "${PORT_WINE_PATH}/${name_desktop}.desktop" "${HOME}/Рабочий стол/"
            elif [[ $(xdg-user-dir DESKTOP) ]] ; then
                cp -f "${PORT_WINE_PATH}/${name_desktop}.desktop" "$(xdg-user-dir DESKTOP)"
            fi
        fi

6188
        if [[ "${PW_SHORTCUT_STEAM}" == "TRUE" ]] ; then
Alex Smith's avatar
Alex Smith committed
6189 6190
            source "${PORT_SCRIPTS_PATH}/add_in_steam.sh"
            addNonSteamGame
6191 6192
        fi

Vladislav's avatar
Vladislav committed
6193
        export PW_NEW_DESKTOP="1"
Vladislav's avatar
Vladislav committed
6194

6195
        if [[ "$PW_NO_RESTART_PPDB" != "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6196
            print_info "Restarting PP..."
Vladislav's avatar
Vladislav committed
6197
            [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB
Vladislav's avatar
Vladislav committed
6198
            restart_pp
6199
        fi
Vladislav's avatar
Vladislav committed
6200
    elif [[ "$PW_YAD_OUT" =~ ^(1|2|252)$ ]] ; then
6201
        print_info "Restarting PP..."
Vladislav's avatar
Vladislav committed
6202
        [[ -n $KEY_MENU ]] && unset portwine_exe
Vladislav's avatar
Vladislav committed
6203
        [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB
6204
        [[ -z ${LINKS[0]} ]] && restart_pp
6205 6206 6207
    fi
}

6208 6209
parse_lnk () {
    prefix_name=$(echo "$1" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
Alex Smith's avatar
Alex Smith committed
6210 6211
    if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then
        exe_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
6212
    else
Alex Smith's avatar
Alex Smith committed
6213
        exe_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
6214
    fi
Alex Smith's avatar
Alex Smith committed
6215
    get_lnk_path "${exe_path}"
6216 6217 6218 6219
    link_name=$(sed -n 's/^File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|\.lnk||')
    link_cmd=$(sed -n 's/^Command Line Arguments\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
}

Alex Smith's avatar
Alex Smith committed
6220 6221 6222 6223 6224
get_lnk_path () {
    link_drive=$(echo "$1" | cut -d: -f1 | awk '{print tolower($0)}')
    link_path=$(echo "$1" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-${PW_PREFIX_NAME:-DEFAULT}}/dosdevices/${link_drive}|g" | sed 's/\\/\//g')
}

6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238
get_lnk () {
    if command -v exiftool &>/dev/null ; then
        if timeout 3 exiftool "$1" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then
            parse_lnk "$1"
        else
            print_error "exiftool - broken!"
        fi
    else
        print_warning "use portable exiftool"
        env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$1" &> "${PW_TMPFS_PATH}/exiftool.tmp"
        parse_lnk "$1"
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6239
pw_auto_create_shortcut () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6240 6241
    if [[ "${PW_CHECK_AUTOINSTALL}" == "1" ]] \
    || [[ "${PW_NO_AUTO_CREATE_SHORTCUT}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6242
    || [[ -z "${portwine_exe}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6243
    || echo "${portwine_exe}" | grep -i "gc_api.exe\|vkplay\|pulseonline" &>/dev/null
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6244 6245 6246
    then
        print_warning "Skipping auto create shortcut"
        return 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6247
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6248

Alex Smith's avatar
Alex Smith committed
6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263
    if [[ "${portwine_exe}" =~ EpicGamesLauncher.exe$ ]]; then
        for item_file in "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/Epic/EpicGamesLauncher/Data/Manifests/"*".item"; do
            if [[ -f "${item_file}" ]]; then
                exe_path=$(jq -r '.InstallLocation + "\\" + .LaunchExecutable' "${item_file}")
                get_lnk_path "${exe_path}"
                PORTWINE_CREATE_SHORTCUT_NAME=$(jq -r '.DisplayName' "${item_file}")
                if ! exe_path="$(realpath "${link_path}" 2>/dev/null)" || [[ ! -f "${exe_path}" ]]; then
                    print_warning "Link broken for: ${PORTWINE_CREATE_SHORTCUT_NAME}"
                elif [[ ! -f "${exe_path}.ppdb" ]]; then
                    unset FILE_SHA256SUM DESKTOP_NAME_FILE DESKTOP_CORRECT_FILE
                    item_id=$(jq -r '.AppName' "${item_file}")
                    portwine_exe="${exe_path}"
                    PORTWINE_DB_FILE="${portwine_exe}.ppdb"
                    LAUNCH_URI="com.epicgames.launcher://apps/${item_id}?action=launch&silent=true"
                    pw_init_db
6264
                    export PW_NO_RESTART_PPDB="1"
Alex Smith's avatar
Alex Smith committed
6265 6266 6267 6268 6269 6270 6271 6272
                    edit_db_from_gui PW_PREFIX_NAME LAUNCH_URI
                    portwine_create_shortcut
                fi
            fi
        done
        return 0
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6273
    unset LINKS
Vladislav's avatar
Vladislav committed
6274 6275 6276
    for link_file in "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk ; do
        link_file=$(readlink -f "$link_file")
        LINKS+=("${link_file// /#@_@#}")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6277
    done
Vladislav's avatar
Vladislav committed
6278

6279
    [[ -z "${LINKS[0]}" ]] && return 0
6280
    read -r -a SORTED_LINKS < <(echo "${LINKS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6281

Vladislav's avatar
Vladislav committed
6282
    for link_file in "${SORTED_LINKS[@]//#@_@#/ }" ; do
6283
        get_lnk "${link_file}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6284
        if ! exe_path="$(realpath "${link_path}" 2>/dev/null)" ; then
Vladislav's avatar
Vladislav committed
6285
            print_warning "Link broken for: $link_name"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6286 6287
        else
            print_info "Created link for: $link_name"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6288 6289
            PORTPROTON_NAME="$link_name"
            export portwine_exe="$exe_path"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6290
            resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128"
Vladislav's avatar
Vladislav committed
6291
            export PW_NO_RESTART_PPDB=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6292
            portwine_create_shortcut
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6293 6294 6295 6296 6297
        fi
    done
}
export -f pw_auto_create_shortcut

6298 6299 6300 6301
# GUI CHANGE SHORTCUT
portwine_change_shortcut () {
    export GDK_BACKEND="x11"

6302 6303 6304 6305 6306 6307 6308 6309 6310
    portwine_search_shortcut
    if [[ -n $PW_DELETE_MENU ]]
    then PW_SHORTCUT_MENU="TRUE"
    else PW_SHORTCUT_MENU="FALSE"
    fi
    if [[ -n ${PW_DELETE_SHORTCUT_DESKTOP[0]} ]]
    then PW_SHORTCUT_DESKTOP="TRUE"
    else PW_SHORTCUT_DESKTOP="FALSE"
    fi
Alex Smith's avatar
Alex Smith committed
6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322
    if [[ -n $PW_DELETE_STEAM ]]; then
        source "${PORT_SCRIPTS_PATH}/add_in_steam.sh"
        NOSTSHPATH="${PW_DELETE_SHORTCUT_STEAM[0]//#@_@#/ }"
        NOSTAIDGRID=$(getAppId "${NOSTSHPATH}")
        if [[ -n "${NOSTSHPATH}" ]] && [[ -n "${NOSTAIDGRID}" ]]; then
            PW_SHORTCUT_STEAM="TRUE"
        else
            PW_SHORTCUT_STEAM="FALSE"
        fi
    else
        PW_SHORTCUT_STEAM="FALSE"
    fi
6323 6324 6325 6326 6327

    unset name_desktop
    create_name_desktop
    export name_desktop="$PW_NAME_DESKTOP_PROXY"

6328
    pw_create_gui_png
6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341
    [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}"

    OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \
    --gui-type="settings-shortcut" \
    --gui-type-box="${NOTEBOOK_GUI_TYPE_BOX}" --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" \
    --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" --gui-type-images="${NOTEBOOK_GUI_TYPE_IMAGE}" \
    --window-icon "$PW_GUI_ICON_PATH/portproton.svg" \
    --image "${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" \
    --text-align="center" --text "${translations[The shortcut will be changed in the PortProton directory.]}" \
    --field="${translations[Name]}" "${name_desktop}" \
    --field="  ${translations[Add shortcut to MENU -> GAMES]}":CHK "$PW_SHORTCUT_MENU" \
    --field="  ${translations[Add shortcut to Desktop]}":CHK "$PW_SHORTCUT_DESKTOP" \
    --field="  ${translations[Add shortcut to STEAM library]}":CHK "$PW_SHORTCUT_STEAM" \
6342 6343
    --button="${translations[REMOVE SHORTCUT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1 \
    --button="${translations[CHANGE SHORTCUT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null)
6344
    PW_YAD_OUT=$?
6345
    PORTWINE_CHANGE_SHORTCUT=1
6346 6347
    if [[ $PW_YAD_OUT == 1 ]] ; then
        [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB
Alex Smith's avatar
Alex Smith committed
6348
        PW_SHORTCUT_STEAM="FALSE"
6349 6350 6351 6352 6353 6354
        portwine_delete_shortcut
        restart_pp
    fi
    portwine_output_yad_shortcut
}

6355
portwine_search_shortcut () {
Alex Smith's avatar
Alex Smith committed
6356 6357 6358 6359
    unset PW_DELETE_SHORTCUT_MENU PW_DELETE_SHORTCUT_STEAM PW_DELETE_SHORTCUT_DESKTOP
    if [[ -n "${portwine_exe}" ]]; then
        PW_DELETE_MENU="$(grep -il "${portwine_exe}" "${HOME}/.local/share/applications"/*.desktop 2>/dev/null)"
        read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_MENU// /#@_@#}"
6360

Alex Smith's avatar
Alex Smith committed
6361 6362
        PW_DELETE_PP="$(grep -il "${portwine_exe}" "${PORT_WINE_PATH}"/*.desktop 2>/dev/null)"
        read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_PP// /#@_@#}"
6363

Alex Smith's avatar
Alex Smith committed
6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378
        PW_DELETE_STEAM="$(grep -il "${portwine_exe}" "${STEAM_SCRIPTS}"/*.sh 2>/dev/null)"
        read -r -d '' -a PW_DELETE_SHORTCUT_STEAM <<< "${PW_DELETE_SHORTCUT_STEAM[*]} ${PW_DELETE_STEAM// /#@_@#}"

        if [[ -d "${HOME}/Desktop" ]] ; then
            PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Desktop"/*.desktop 2>/dev/null)"
            read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}"
        fi
        if [[ -d "${HOME}/Рабочий стол" ]] ; then
            PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Рабочий стол"/*.desktop 2>/dev/null)"
            read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}"
        fi
        if [[ $(xdg-user-dir DESKTOP) ]] ; then
            PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "$(xdg-user-dir DESKTOP)"/*.desktop 2>/dev/null)"
            read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}"
        fi
6379
    fi
6380
}
6381

6382 6383 6384
portwine_delete_shortcut () {
    if [[ $PORTWINE_CHANGE_SHORTCUT != 1 ]] ; then
        portwine_search_shortcut
6385
    fi
6386
    unset PORTWINE_CHANGE_SHORTCUT
6387

6388
    for delete_shortcut in "${PW_DELETE_SHORTCUT_MENU[@]}" "${PW_DELETE_SHORTCUT_DESKTOP[@]}" ; do
Vladislav's avatar
Vladislav committed
6389
        rm -f "${delete_shortcut//#@_@#/ }"
6390
    done
Alex Smith's avatar
Alex Smith committed
6391 6392 6393 6394 6395

    if [[ "${PW_SHORTCUT_STEAM}" == "FALSE" ]] && [[ -n "${NOSTSHPATH}" ]] && [[ -n "${NOSTAIDGRID}" ]]; then
        source "${PORT_SCRIPTS_PATH}/add_in_steam.sh"
        removeNonSteamGame "${NOSTAIDGRID}" "${NOSTSHPATH}"
    fi
6396 6397 6398
}

portwine_missing_shortcut () {
6399
    "${pw_yad}" --title="${translations[Error]}" --form \
6400
    --window-icon "$PW_GUI_ICON_PATH/portproton.svg" --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6401
    --image "$PW_GUI_ICON_PATH/error.svg" \
6402
    --text "\n${translations[Could not find the file:]}\n$(print_wrapped "${portwine_exe}" "50")\n\n${translations[ATTENTION:\\nIf you forgot to mount the disk with the running application, click CANCEL!]}\n" \
6403 6404
    --button="${translations[DELETE SHORTCUT]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 \
    --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1
6405
    if [[ $? -eq "0" ]] ; then
6406 6407
        portwine_delete_shortcut
    fi
6408 6409 6410 6411 6412 6413
    if [[ -n $AI_SKIP ]]
    then
        unset TAB_MAIN_MENU
        restart_pp
    else
        exit 0
6414
    fi
6415 6416
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6417
# GUI WINETRICKS | GUI PREFIX MANAGER
6418 6419 6420
pw_prefix_manager () {
    update_winetricks
    start_portwine
6421
    if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ]] ; then
6422 6423 6424
        touch "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
    fi

6425
    pw_start_progress_bar_block "${translations[Starting prefix manager:]} $PW_PREFIX_NAME"
Vladislav's avatar
Vladislav committed
6426 6427 6428
    "${PORT_WINE_TMP_PATH}/winetricks" dlls list | awk -F'(' '{print $1}' 1> "${PW_TMPFS_PATH}/dll_list"
    "${PORT_WINE_TMP_PATH}/winetricks" fonts list | awk -F'(' '{print $1}' 1> "${PW_TMPFS_PATH}/fonts_list"
    "${PORT_WINE_TMP_PATH}/winetricks" settings list | awk -F'(' '{print $1}' 1> "${PW_TMPFS_PATH}/settings_list"
6429 6430 6431 6432

    gui_prefix_manager () {
        unset SET_FROM_PFX_MANAGER_TMP SET_FROM_PFX_MANAGER
        IFS=$'\n'
6433 6434 6435 6436 6437
        try_remove_file "${PW_TMPFS_PATH}/dll_list_tmp"
        while read -r PW_BOOL_IN_DLL_LIST ; do
            if [[ ! ${PW_BOOL_IN_DLL_LIST} =~ (d3d|directx9|dont_use|dxvk|vkd3d|galliumnine|faudio1|Foundation) ]] ; then
                if grep ^"$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{print $1}')"$ "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ; then
                    echo -e "true\n$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/dll_list_tmp"
6438
                else
6439
                    echo -e "false\n$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/dll_list_tmp"
6440 6441
                fi
            fi
Vladislav's avatar
Vladislav committed
6442
        done < "${PW_TMPFS_PATH}/dll_list"
6443 6444 6445 6446
        try_remove_file "${PW_TMPFS_PATH}/fonts_list_tmp"
        while read -r PW_BOOL_IN_FONTS_LIST ; do
            if [[ ! ${PW_BOOL_IN_FONTS_LIST} =~ dont_use ]] ; then
                if grep ^"$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')"$ "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ; then
Vladislav's avatar
Vladislav committed
6447
                    echo -e "true\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/fonts_list_tmp"
6448
                else
Vladislav's avatar
Vladislav committed
6449
                    echo -e "false\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/fonts_list_tmp"
6450 6451
                fi
            fi
Vladislav's avatar
Vladislav committed
6452
        done < "${PW_TMPFS_PATH}/fonts_list"
6453 6454 6455 6456
        try_remove_file "${PW_TMPFS_PATH}/settings_list_tmp"
        while read -r PW_BOOL_IN_FONTS_LIST ; do
            if [[ ! ${PW_BOOL_IN_FONTS_LIST} =~ (vista|alldlls|autostart_|bad|good|win|videomemory|vd=|isolate_home) ]] ; then
                if grep ^"$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')"$ "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ; then
Vladislav's avatar
Vladislav committed
6457
                    echo -e "true\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/settings_list_tmp"
6458
                else
Vladislav's avatar
Vladislav committed
6459
                    echo -e "false\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{print $1}')\n$(echo "${PW_BOOL_IN_FONTS_LIST}" | awk '{ $1 = ""; print substr($0, 2) }')" >> "${PW_TMPFS_PATH}/settings_list_tmp"
6460 6461
                fi
            fi
Vladislav's avatar
Vladislav committed
6462
        done < "${PW_TMPFS_PATH}/settings_list"
6463 6464 6465
        pw_stop_progress_bar

        KEY_EDIT_MANAGER_GUI=$RANDOM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6466
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=1 --list --checklist \
Vladislav's avatar
Vladislav committed
6467
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
6468 6469 6470
        --text="${translations[Select components to install in prefix:]} <b>\"${PW_PREFIX_NAME}\"</b>, ${translations[using wine:]} <b>\"${PW_WINE_USE}\"</b>" \
        --column="${translations[Set]}" --column="${translations[Libraries]}" \
        --column="${translations[Information]}" < "${PW_TMPFS_PATH}/dll_list_tmp" 1>> "${PW_TMPFS_PATH}/to_winetricks" 2>/dev/null &
6471

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6472
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=2 --list --checklist \
Vladislav's avatar
Vladislav committed
6473
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
6474 6475 6476
        --text="${translations[Select fonts to install in prefix:]} <b>\"${PW_PREFIX_NAME}\"</b>, ${translations[using wine:]} <b>\"${PW_WINE_USE}\"</b>" \
        --column="${translations[Set]}" --column="${translations[Libraries]}" \
        --column="${translations[Information]}" < "${PW_TMPFS_PATH}/fonts_list_tmp" 1>> "${PW_TMPFS_PATH}/to_winetricks" 2>/dev/null &
6477

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6478
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=3 --list --checklist \
Vladislav's avatar
Vladislav committed
6479
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
6480 6481 6482
        --text="${translations[Change config for prefix:]} <b>\"${PW_PREFIX_NAME}\"</b>" \
        --column="${translations[Set]}" --column="${translations[Libraries]}" \
        --column="${translations[Information]}" < "${PW_TMPFS_PATH}/settings_list_tmp" 1>> "${PW_TMPFS_PATH}/to_winetricks" 2>/dev/null &
6483

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6484
        "${pw_yad}" --key=$KEY_EDIT_MANAGER_GUI --notebook \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6485
        --width=700 --height=700 --expand \
6486
        --gui-type="settings-notebook" \
6487
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[PREFIX MANAGER]}" \
6488 6489 6490
        --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":1 \
        --button="${translations[FORCE INSTALL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Installation with forced redownload of libraries]}":2 \
        --button="${translations[INSTALL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!${translations[Standard installation.]}":0 \
6491
        --tab-pos="top" \
6492 6493 6494
        --tab="${translations[DLLS]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="${translations[FONTS]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" \
        --tab="${translations[SETTINGS]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png!" 2>/dev/null
6495
        YAD_STATUS="$?"
6496

Vladislav's avatar
Vladislav committed
6497 6498 6499
        try_remove_file  "${PW_TMPFS_PATH}/dll_list_tmp"
        try_remove_file  "${PW_TMPFS_PATH}/fonts_list_tmp"
        try_remove_file  "${PW_TMPFS_PATH}/settings_list_tmp"
6500

6501 6502 6503 6504 6505 6506 6507 6508 6509
        case "$YAD_STATUS" in
            0)
                WT_FORCE=""
                ;;
            2)
                WT_FORCE="-r -f"
                ;;
        esac

Vladislav's avatar
Vladislav committed
6510
        for STPFXMNG in $(<"${PW_TMPFS_PATH}/to_winetricks") ; do
6511
            grep $(echo ${STPFXMNG} | awk -F'|' '{print $2}') "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" &>/dev/null
6512 6513
            if [[ "$?" == "1" ]] ; then
                [[ -n "${STPFXMNG}" ]] && SET_FROM_PFX_MANAGER+="$(echo "${STPFXMNG}" | awk -F'|' '{print $2}') "
6514 6515
            fi
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6516
        IFS="$orig_IFS"
Vladislav's avatar
Vladislav committed
6517
        try_remove_file "${PW_TMPFS_PATH}/to_winetricks"
6518

6519
        if [[ -n ${SET_FROM_PFX_MANAGER} ]] ; then
6520
            pw_update_pfx_cover_gui "winetricks"
Vladislav's avatar
Vladislav committed
6521 6522
            echo "START WINETRICKS..." >> "${PW_TMPFS_PATH}/update_pfx_log"
            echo "Try to install DLL in prefix: ${SET_FROM_PFX_MANAGER}" >> "${PW_TMPFS_PATH}/update_pfx_log"
6523
            print_info "Try to install DLL in prefix: ${SET_FROM_PFX_MANAGER}"
6524
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
6525
            "${PORT_WINE_TMP_PATH}/winetricks" -q ${WT_FORCE} ${SET_FROM_PFX_MANAGER} | tee -a "${PW_TMPFS_PATH}/update_pfx_log"
6526 6527 6528 6529 6530 6531
            wait_wineserver
            kill_portwine
            pw_stop_progress_bar
            gui_prefix_manager
        else
            print_info "Nothing to do. Restarting PortProton..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6532
            stop_portwine --restart
6533 6534 6535 6536 6537 6538
        fi
    }
    gui_prefix_manager
}

portwine_start_debug () {
6539
    pw_skip_get_info
6540 6541 6542
    kill_portwine
    export PW_LOG=1
    if [[ -z "$VULKAN_DRIVER_NAME" ]] || [[ "$VULKAN_DRIVER_NAME" == "llvmpipe" ]] ; then
Vladislav's avatar
Vladislav committed
6543 6544 6545
        pw_notify_send -i warning \
        "${translations[Attention working version of vulkan not detected!]}" \
        "${translations[It is recommended to run games in OpenGL (low performance possible)!]}"
6546
    fi
6547
    echo "${translations[PortProton was launched in creation mode PortProton.log and it is successfully stored in the root directory of the port]}" > "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6548
    echo "${translations[To diagnose the problem, copy ALL of the log to:]} https://linux-gaming.ru/t/opisanie-kategorii-portproton-pomoshh/1642" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6549 6550 6551 6552 6553 6554 6555 6556
    echo "-------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "PortWINE version:" >> "${PORT_WINE_PATH}/PortProton.log"
    read install_ver < "${PORT_WINE_TMP_PATH}/PortProton_ver"
    echo "PortProton-${install_ver}" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Scripts version:" >> "${PORT_WINE_PATH}/PortProton.log"
    cat "${PORT_WINE_TMP_PATH}/scripts_ver" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-----------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6557 6558
    if check_flatpak ; then
        echo "FLATPAK in used" >> "${PORT_WINE_PATH}/PortProton.log"
6559
    elif [[ "${PW_USE_RUNTIME}" = 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6560
        echo "RUNTIME is disabled" >> "${PORT_WINE_PATH}/PortProton.log"
6561
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6562
        echo "RUNTIME is enabled" >> "${PORT_WINE_PATH}/PortProton.log"
6563
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6564
    echo "----------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6565
    if [[ -n "${portwine_exe}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6566 6567 6568
        echo "Debug for programm:" >> "${PORT_WINE_PATH}/PortProton.log"
        echo "${portwine_exe}" >> "${PORT_WINE_PATH}/PortProton.log"
        echo "---------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6569
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6570 6571 6572
    echo "GLIBC version:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo $(ldd --version | grep -m1 ldd | awk '{print $NF}') >> "${PORT_WINE_PATH}/PortProton.log"
    echo "--------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6573 6574 6575 6576 6577 6578 6579 6580 6581 6582
    case "$PW_VULKAN_USE" in
        0) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - DirectX to wined3d opengl" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        1) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - DXVK v.${DXVK_STABLE_VER}, VKD3D-PROTON v.${VKD3D_STABLE_VER}" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        2) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - DXVK v.${DXVK_GIT_VER}, VKD3D-PROTON v.${VKD3D_GIT_VER}" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        3) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - Native DX9 on MESA drivers" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        4) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - OpenGL on MESA vulkan drivers" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        5) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - DXVK v.${DXVK_LEGACY_VER}" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        6) echo "PW_VULKAN_USE=${PW_VULKAN_USE} - DirectX to wined3d vulkan" >> "${PORT_WINE_PATH}/PortProton.log" ;;
        *) echo "PW_VULKAN_USE=${PW_VULKAN_USE}" >> "${PORT_WINE_PATH}/PortProton.log" ;;
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6583 6584 6585 6586 6587
    echo "--------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Version WINE in use:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "$PW_WINE_USE" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Program bit depth:" >> "${PORT_WINE_PATH}/PortProton.log"
6588
    if [[ $(file "$portwine_exe") =~ x86-64 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6589 6590
        echo "64 bit" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-----------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6591
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6592 6593 6594 6595 6596 6597 6598 6599 6600
        echo "32 bit" >> "${PORT_WINE_PATH}/PortProton.log"
    fi
    echo "--------------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Date and time of start debug for PortProton:" >> "${PORT_WINE_PATH}/PortProton.log"
    date >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-----------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "The installation path of the PortProton:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "$PORT_WINE_PATH" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6601 6602
    if check_flatpak ; then
        echo "Flatpak runtime:" >> "${PORT_WINE_PATH}/PortProton.log"
6603
        grep -oP 'PRETTY_NAME="\K[^"]+' /etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
6604
        echo "Operating system:" >> "${PORT_WINE_PATH}/PortProton.log"
6605
        grep -oP 'PRETTY_NAME="\K[^"]+' /run/host/etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
6606 6607
    else
        echo "Operating system:" >> "${PORT_WINE_PATH}/PortProton.log"
6608
        grep -oP 'PRETTY_NAME="\K[^"]+' /etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
6609
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6610 6611 6612 6613 6614 6615 6616 6617 6618 6619
    echo "--------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Desktop environment:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Desktop session: ${DESKTOP_SESSION}" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Current desktop: ${XDG_CURRENT_DESKTOP}" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Session type: ${XDG_SESSION_TYPE}" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "---------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Kernel:" >> "${PORT_WINE_PATH}/PortProton.log"
    uname -r >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "CPU:" >> "${PORT_WINE_PATH}/PortProton.log"
6620 6621 6622
    echo "CPU physical cores:$(grep 'cpu cores' /proc/cpuinfo | sort -u | cut -d':' -f2)" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "CPU logical cores: $(grep 'processor' /proc/cpuinfo | wc -l)" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "CPU model name:$(grep 'model name' /proc/cpuinfo | sort -u | cut -d':' -f2)" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6623 6624 6625
    echo "------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "RAM:" >> "${PORT_WINE_PATH}/PortProton.log"
    free -m >> "${PORT_WINE_PATH}/PortProton.log"
6626
    echo "--------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6627 6628 6629
    echo "Filesystem ${PATH_TO_GAME} - $(stat -f -c %T "${PATH_TO_GAME}")" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Filesystem ${PORT_WINE_PATH} - $(stat -f -c %T "${PORT_WINE_PATH}")" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Filesystem ${PW_TMPFS_PATH} - $(stat -f -c %T "${PW_TMPFS_PATH}")" >> "${PORT_WINE_PATH}/PortProton.log"
6630
    echo "---------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6631 6632
    echo "Graphic cards and drivers:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo 'lspci -k | grep -EA3 VGA|3D|Display :' >> "${PORT_WINE_PATH}/PortProton.log"
6633
    lspci -k | grep -EA3 'VGA|3D|Display' >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6634
    echo "----" >> "${PORT_WINE_PATH}/PortProton.log"
6635
    command -v glxinfo &>/dev/null && glxinfo -B >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6636 6637
    echo "-----" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "inxi -G:" >> "${PORT_WINE_PATH}/PortProton.log"
6638 6639
    if ! check_flatpak ; then
        "${PW_PLUGINS_PATH}/portable/bin/inxi" -Gc0 >> "${PORT_WINE_PATH}/PortProton.log"
6640 6641 6642
    fi
    if echo "$LSPCI_VGA" | grep -i nvidia &>/dev/null ; then
        if command -v ldconfig &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6643 6644 6645
            echo "------" >> "${PORT_WINE_PATH}/PortProton.log"
            echo "ldconfig -p | grep libGLX_nvidia" >> "${PORT_WINE_PATH}/PortProton.log"
            ldconfig -p | grep libGLX_nvidia >> "${PORT_WINE_PATH}/PortProton.log"
6646 6647
        fi
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6648 6649 6650 6651
    echo "PW_SCREEN_RESOLUTION=$PW_SCREEN_RESOLUTION" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "PW_SCREEN_PRIMARY=$PW_SCREEN_PRIMARY" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "----------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "Vulkan info device name:" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6652
    grep -E '^GPU|deviceName|driverName' "${PW_TMPFS_PATH}/vulkaninfo.tmp" >> "${PORT_WINE_PATH}/PortProton.log"
6653
    "${PW_PLUGINS_PATH}/portable/bin/vkcube" --c 50
6654
    if [[ $? -eq 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6655
        echo "Vulkan cube test passed successfully" >> "${PORT_WINE_PATH}/PortProton.log"
6656
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6657 6658 6659 6660 6661 6662 6663 6664 6665
        echo "Vulkan cube test completed with error" >> "${PORT_WINE_PATH}/PortProton.log"
    fi
    echo "----------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo 'locale:' >> "${PORT_WINE_PATH}/PortProton.log"
    locale >> "${PORT_WINE_PATH}/PortProton.log"
    echo "---" >> "${PORT_WINE_PATH}/PortProton.log"
    echo 'locale -a | grep -i "$(locale | grep -e '^LANG=' | sed 's/LANG=//' | sed  's/\-8//')" :' >> "${PORT_WINE_PATH}/PortProton.log"
    locale -a | grep -i "$(locale | grep -e '^LANG=' | sed 's/LANG=//' | sed  's/\-8//')" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6666
    if [[ "${PW_USE_D3D_EXTRAS}" != 1 ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6667 6668
    then echo "D3D_EXTRAS - disabled" >> "${PORT_WINE_PATH}/PortProton.log"
    else echo "D3D_EXTRAS - enabled" >> "${PORT_WINE_PATH}/PortProton.log"
6669
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6670 6671
    echo "------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "winetricks.log:" >> "${PORT_WINE_PATH}/PortProton.log"
6672
    cat "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" | sed -e /^"d3dcomp*"/d -e /^"d3dx*"/d >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6673
    echo "-----------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6674
    if [[ -n "${PORTWINE_DB_FILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6675 6676
        echo "Use ${PORTWINE_DB_FILE} db file:" >> "${PORT_WINE_PATH}/PortProton.log"
        cat "${PORTWINE_DB_FILE}" | sed '/##/d' >> "${PORT_WINE_PATH}/PortProton.log"
6677
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6678 6679
        echo "Use ${PORT_SCRIPTS_PATH}/portwine_db/default db file:" >> "${PORT_WINE_PATH}/PortProton.log"
        cat "${PORT_SCRIPTS_PATH}/portwine_db/default" | sed '/##/d' >> "${PORT_WINE_PATH}/PortProton.log"
6680
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6681
    echo "----------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6682
    if [[ -f "${USER_CONF}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6683
        cat "${USER_CONF}" | sed '/bash/d' >> "${PORT_WINE_PATH}/PortProton.log"
6684
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6685
    echo "---------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
6686 6687 6688 6689 6690

    export DXVK_HUD="full"

    portwine_launch &
    sleep 3
6691
    pw_stop_progress_bar
6692
    local PW_TIMER=0
6693
    while read -r line || [[ -n $(pgrep -a yad | grep "yad_gui_pp --text-info --tail --button="STOP!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 --title="DEBUG"" | awk '{print $1}') ]] ; do
6694
            sleep 0.005
6695
            if [[ -n "${line}" ]] && ! echo "${line}" | grep -qi "kerberos\|ntlm" ; then
6696 6697 6698 6699 6700 6701
                echo "# ${line}"
            fi
            if [[ "${PW_TIMER}" != 1 ]] ; then
                sleep 3
                PW_TIMER=1
            fi
6702
    done < "${PORT_WINE_PATH}/PortProton.log" | "${pw_yad}" --text-info --tail --button="STOP!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 --title="DEBUG" \
6703
    --skip-taskbar --width=800 --height=400 --text "${translations[Please wait! After finishing the PortProton, click STOP.]}" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" 2>/dev/null &&
6704
    kill_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6705 6706 6707 6708 6709 6710
    sed -i '/.fx$/d' "${PORT_WINE_PATH}/PortProton.log"
    sed -i '/HACK_does_openvr_work/d' "${PORT_WINE_PATH}/PortProton.log"
    sed -i '/Uploading is disabled/d' "${PORT_WINE_PATH}/PortProton.log"
    sed -i '/wine: RLIMIT_NICE is <= 20/d' "${PORT_WINE_PATH}/PortProton.log"
    sed -i '/ALT_2.24/d' "${PORT_WINE_PATH}/PortProton.log"
    sed -i '/UDEV monitor/d' "${PORT_WINE_PATH}/PortProton.log"
6711
    deb_text=$(awk '! a[$0]++' "${PORT_WINE_PATH}/PortProton.log")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6712 6713
    echo "$deb_text" > "${PORT_WINE_PATH}/PortProton.log"
    "$pw_yad" --title="PortProton.log" --no-buttons --text-align=center \
6714
    --text-info --show-uri --wrap --width=1200 --height=550  --uri-color=red \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6715
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6716
    --filename="${PORT_WINE_PATH}/PortProton.log"
6717 6718 6719 6720
    stop_portwine
}

pw_create_prefix_backup () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6721
    cd "$HOME" || :
6722
    PW_PREFIX_TO_BACKUP=$("${pw_yad}" --file --directory --width=800 --height=500 \
6723
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[BACKUP PREFIX TO...]}" \
6724 6725
    --button="${translations[CANCEL]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1 \
    --button="${translations[OK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 2>/dev/null)
6726
    YAD_STATUS="$?"
6727

Vladislav's avatar
Vladislav committed
6728
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
6729
        restart_pp
Vladislav's avatar
Vladislav committed
6730
    fi
6731
    if [[ -n "$(grep "/${PW_PREFIX_NAME}/" "${PORT_WINE_PATH}"/*.desktop )" ]] ; then
6732 6733 6734 6735 6736 6737
        try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.create_shortcut"
        grep "/${PW_PREFIX_NAME}/" "${PORT_WINE_PATH}"/*.desktop | awk -F"/${PW_PREFIX_NAME}/" '{print $2}' \
        | awk -F\" '{print $1}' > "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.create_shortcut"
    fi
    unset PW_SANDBOX_HOME_PATH
    pw_init_runtime
6738 6739
    if check_flatpak
    then TMP_ALL_PATH=""
6740
    else TMP_ALL_PATH="LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\""
6741
    fi
6742
    chmod -R u+w "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6743
cat << EOF > "${PORT_WINE_TMP_PATH}"/pp_pfx_backup.sh
6744 6745 6746 6747 6748
    #!/usr/bin/env bash
    ${TMP_ALL_PATH} mksquashfs "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}" \
    "${PW_PREFIX_TO_BACKUP}/${PW_PREFIX_NAME}.ppack.part" -comp zstd \
    || rm -f "${PW_PREFIX_TO_BACKUP}/${PW_PREFIX_NAME}.ppack.part"
EOF
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6749 6750 6751
    chmod u+x "${PORT_WINE_TMP_PATH}"/pp_pfx_backup.sh
    ${pw_runtime} ${PW_TERM} "${PORT_WINE_TMP_PATH}"/pp_pfx_backup.sh
    try_remove_file "${PORT_WINE_TMP_PATH}"/pp_pfx_backup.sh
6752 6753
    if [[ -f "${PW_PREFIX_TO_BACKUP}/${PW_PREFIX_NAME}.ppack.part" ]] ; then
        mv -f "${PW_PREFIX_TO_BACKUP}/${PW_PREFIX_NAME}.ppack.part" "${PW_PREFIX_TO_BACKUP}/${PW_PREFIX_NAME}.ppack"
6754
        yad_info "${translations[Backup has been successfully created for prefix:]} $PW_PREFIX_NAME"
6755
        if [[ ! -f "${PORT_WINE_TMP_PATH}/pfx_backup_info" ]] ; then
6756
            yad_info "${translations[Attention! Do not pass the resev copy to third parties, there is a risk of losing accounts!]}"
6757 6758 6759
            echo "1" > "${PORT_WINE_TMP_PATH}/pfx_backup_info"
        fi
    else
6760
        yad_error "${translations[An error occurred while backing up the prefix:]} $PW_PREFIX_NAME"
6761
    fi
Vladislav's avatar
Vladislav committed
6762
    restart_pp
6763 6764 6765 6766 6767 6768
}

pw_autoinstall_from_db () {
    export PW_USER_TEMP="${PORT_WINE_TMP_PATH}"
    export PW_FORCE_LARGE_ADDRESS_AWARE=1
    export PW_USE_GAMEMODE=0
6769
    export PW_CHECK_AUTOINSTALL=1
6770 6771 6772 6773 6774 6775 6776 6777 6778
    export PW_GUI_DISABLED_CS=1
    export PW_NO_WRITE_WATCH=0
    export PW_VULKAN_USE=1
    export PW_USE_EAC_AND_BE=0
    export PW_NO_FSYNC=1
    export PW_NO_ESYNC=1
    unset PORTWINE_CREATE_SHORTCUT_NAME
    export PW_DISABLED_CREATE_DB=1
    export PW_MANGOHUD=0
6779
    export PW_VKBASALT=0
6780
    export PW_USE_D3D_EXTRAS=1
6781
    # shellcheck source=/dev/null
6782 6783 6784 6785
    . "${PORT_SCRIPTS_PATH}/pw_autoinstall/${PW_YAD_SET}"
}

button_click () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6786 6787
    echo "$2" > "${PW_TMPFS_PATH}/tmp_yad_form"

6788
    case "$1" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6789
        --normal)
6790
            kill -s SIGUSR1 "$(pgrep -a yad | grep "\--key=${KEY_MENU}" | awk '{print $1}')" > /dev/null 2>&1
6791 6792
            ;;
        --start)
6793
            kill -s SIGUSR1 "$(pgrep -a yad | grep "\--key=${KEY_START}" | awk '{print $1}')" > /dev/null 2>&1
6794 6795
            ;;
        --userconf)
6796
            kill -s SIGUSR1 "$(pgrep -a yad | grep "\--key=${KEY_USERCONF_GUI}" | awk '{print $1}')" > /dev/null 2>&1
6797
            ;;
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6798
        --desktop)
6799
            kill -s SIGUSR1 "$(pgrep -a yad | grep "\--key=${KEY_MENU}" | awk '{print $1}')" > /dev/null 2>&1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6800
            PW_YAD_SET="${PORT_WINE_PATH}/${PW_YAD_SET//#@_@#/ }"
6801
            if [[ -n $PW_DESKTOP_FILES_REGEX ]] ; then
Vladislav's avatar
Vladislav committed
6802 6803
                local count=1
                for y in "${PW_DESKTOP_FILES_REGEX[@]}" ; do
6804 6805 6806
                    PW_YAD_SET="${PW_YAD_SET//#+_$count#/$y}"
                    (( count++ ))
                done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6807
            fi
6808
            export DESKTOP_NAME_YAD="${PW_YAD_SET//"$PORT_WINE_PATH/"/}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6809 6810 6811 6812
            if check_flatpak
            then PW_EXEC_FROM_DESKTOP="$(grep Exec "$PW_YAD_SET" | head -n 1 | sed 's|flatpak run ru.linux_gaming.PortProton|\"${PORT_SCRIPTS_PATH}/start.sh\"|' | awk -F'=' '{print $2}')"
            else PW_EXEC_FROM_DESKTOP="$(grep Exec "$PW_YAD_SET" | head -n 1 | awk -F"=env " '{print $2}')"
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6813

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6814 6815 6816 6817 6818 6819
            print_info "Restarting PP after choose desktop file..."
            # stop_portwine
            /usr/bin/env bash -c "${PW_EXEC_FROM_DESKTOP}" &
            exit 0
            ;;
    esac
6820
}
6821
export -f button_click
6822 6823

gui_clear_pfx () {
6824
    if yad_question "${translations[Do you want to clear prefix in PortProton?]}" ; then
6825 6826 6827
        pw_clear_pfx
        print_info "Restarting PP after clearing prefix..."
    fi
6828
    restart_pp
6829 6830 6831 6832
}
export -f gui_clear_pfx

gui_rm_portproton () {
6833
    if yad_question "${translations[Do you really want to remove PortProton?]}" ; then
6834 6835 6836
        rm -fr "${PORT_WINE_PATH}"
        rm -fr "${PORT_WINE_TMP_PATH}"
        rm -fr "${HOME}/PortWINE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6837
        rm -f "$(grep -il PortProton "${HOME}/.local/share/applications"/*.desktop)"
6838
        update-desktop-database -q "${HOME}/.local/share/applications"
6839
        exit 0
6840
    fi
6841
    restart_pp
6842 6843 6844 6845
}
export -f gui_rm_portproton

gui_pw_update () {
6846
    export PW_FORCE_UPDATE="1"
6847 6848
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    print_info "Restarting PP for check update..."
6849
    unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
6850
    restart_pp
6851
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6852
export -f gui_pw_update
6853 6854

change_loc () {
6855
    export PW_FORCE_CHANGE_LOC="1"
6856
    print_info "Restarting PP for change language..."
Vladislav's avatar
Vladislav committed
6857
    restart_pp
6858
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6859 6860 6861
export -f change_loc

change_mirror () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6862 6863
    if [[ "$MIRROR" == "CLOUD" ]] ; then
        sed -i 's/="CLOUD"/="GITHUB"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6864
        pw_notify_send -i info \
6865
        "${translations[Mirror changed to:]}" "<b>https://github.com/Castro-Fidel</b>"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6866
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6867
        sed -i 's/="GITHUB"/="CLOUD"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6868
        pw_notify_send -i info \
6869
        "${translations[Mirror changed to:]}" "<b>https://cloud.linux-gaming.ru</b>"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6870 6871
    fi
    print_info "Restarting PP for change mirror..."
Vladislav's avatar
Vladislav committed
6872
    restart_pp --userconf
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6873 6874
}
export -f change_mirror
6875

Mikhail Tergoev's avatar
Mikhail Tergoev committed
6876 6877
change_branch () {
    if [[ "$BRANCH" == "master" ]] ; then
6878
        if yad_question "${translations[Do you actually want to change the scripts version to:]} <b>DEVEL?</b>" ; then
6879 6880 6881
            sed -i 's/="master"/="devel"/g' "$USER_CONF"
            export MIRROR="GITHUB"
            pw_notify_send -i info \
6882
            "${translations[Branch changed to:]}" "<b>DEVEL</b>"
6883
            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
6884
            export PW_FORCE_UPDATE="1"
6885
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6886
    else
6887
        if yad_question "${translations[Do you actually want to change the scripts version to:]} <b>STABLE?</b>" ; then
6888 6889 6890 6891
            sed -i 's/="devel"/="master"/g' "$USER_CONF"
            echo "2024" > "${PORT_WINE_TMP_PATH}/scripts_ver"
            export PW_CHANGE_BRANCH="1"
            pw_notify_send -i info \
6892
            "${translations[Branch changed to:]}" "<b>STABLE</b>"
6893
            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
6894
            export PW_FORCE_UPDATE="1"
6895
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6896 6897
    fi
    print_info "Restarting PP for change branch..."
Vladislav's avatar
Vladislav committed
6898
    restart_pp --userconf
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6899 6900 6901
}
export -f change_branch

6902 6903 6904 6905
change_download_grid () {
    if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then
        sed -i 's/DOWNLOAD_STEAM_GRID=.*/DOWNLOAD_STEAM_GRID="0"/' "$USER_CONF"
        pw_notify_send -i info \
6906
        "${translations[Cover downloads are disabled]}"
6907 6908 6909
    else
        sed -i 's/DOWNLOAD_STEAM_GRID=.*/DOWNLOAD_STEAM_GRID="1"/' "$USER_CONF"
        pw_notify_send -i info \
6910
        "${translations[Cover downloads are enabled]}"
6911 6912
    fi
    print_info "Restarting PP for change cover download behavior..."
Vladislav's avatar
Vladislav committed
6913
    restart_pp --userconf
6914 6915 6916
}
export -f change_download_grid

Vladislav's avatar
Vladislav committed
6917 6918 6919
open_game_folder () {
    xdg-open "${PATH_TO_GAME}"
    print_info "Restarting PP after open game folder..."
Vladislav's avatar
Vladislav committed
6920
    restart_pp
Vladislav's avatar
Vladislav committed
6921 6922 6923
}
export -f open_game_folder

6924 6925 6926
change_gui_start () {
    if [[ "$PW_GUI_START" == "NOTEBOOK" ]] ; then
        sed -i 's/="NOTEBOOK"/="PANED"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6927
        pw_notify_send -i info \
6928
        "${translations[Gui start changed to:]}" "<b>PANED</b>"
6929 6930
    else
        sed -i 's/="PANED"/="NOTEBOOK"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
6931
        pw_notify_send -i info \
6932
        "${translations[Gui start changed to:]}" "<b>NOTEBOOK</b>"
6933 6934
    fi
    print_info "Restarting PP for change gui start..."
Vladislav's avatar
Vladislav committed
6935
    restart_pp --userconf
6936 6937 6938
}
export -f change_gui_start

6939 6940 6941
gui_wine_uninstaller () {
    start_portwine
    pw_run uninstaller
6942
    stop_portwine --restart
6943 6944 6945 6946
}
export -f gui_wine_uninstaller

gui_open_user_conf () {
6947
    PW_USERCONF_GUI="$("${pw_yad}" --title="${translations[EDIT USER CONFIG]}" \
6948 6949
    --text-info --editable --width=800 --height=600 \
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
6950 6951
    --button="${translations[BACK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":1 \
    --button="${translations[SAVE]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":2 \
6952 6953 6954 6955 6956 6957
    --filename="${PORT_WINE_PATH}/data/user.conf" 2>/dev/null)"
    YAD_STATUS="$?"

    case "${YAD_STATUS}" in
        1|252)
                print_info "Restarting..."
Vladislav's avatar
Vladislav committed
6958
                restart_pp --userconf
6959 6960 6961 6962
                ;;
            2)
                echo "${PW_USERCONF_GUI}" > "${PORT_WINE_PATH}/data/user.conf"
                print_info "Restarting..."
Vladislav's avatar
Vladislav committed
6963
                restart_pp --userconf
6964 6965
                ;;
    esac
6966 6967 6968
}
export -f gui_open_user_conf

Vladislav's avatar
Vladislav committed
6969
gui_edit_db_file () {
6970
    GUI_EDIT_DB_FILE="$("${pw_yad}" --title="${translations[EDIT DB]}" \
Vladislav's avatar
Vladislav committed
6971 6972
    --text-info --editable --width=800 --height=600 \
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
6973 6974
    --button="${translations[BACK]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":1 \
    --button="${translations[SAVE]}!$PW_GUI_ICON_PATH/$BUTTON_SIZE.png!":2 \
Vladislav's avatar
Vladislav committed
6975 6976 6977 6978 6979
    --filename="${PORTWINE_DB_FILE}" 2>/dev/null)"
    YAD_STATUS="$?"

    case "$YAD_STATUS" in
        1|252)
Vladislav's avatar
Vladislav committed
6980
                restart_pp --edit_db
Vladislav's avatar
Vladislav committed
6981 6982 6983
                ;;
          2)
                echo "${GUI_EDIT_DB_FILE}" > "${PORTWINE_DB_FILE}"
Vladislav's avatar
Vladislav committed
6984
                restart_pp --edit_db
Vladislav's avatar
Vladislav committed
6985 6986 6987 6988
                ;;
    esac
}

6989
gui_open_scripts_from_backup () {
6990
    [[ -d "${PORT_WINE_TMP_PATH}/scripts_backup/" ]] && cd "${PORT_WINE_TMP_PATH}/scripts_backup/" || cd "$HOME"
6991
    PW_SCRIPT_FROM_BACKUP=$("${pw_yad}" --file --width=650 --height=500 \
6992 6993
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "SCRIPTS FROM BACKUP" --file-filter="backup_scripts|scripts_v*.tar.gz" 2>/dev/null )
    YAD_STATUS="$?"
6994

Vladislav's avatar
Vladislav committed
6995
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
6996
        restart_pp
Vladislav's avatar
Vladislav committed
6997
    fi
6998
    unpack "$PW_SCRIPT_FROM_BACKUP" "${PORT_WINE_PATH}/data/"
6999 7000
    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    print_info "Restarting PP after backup..."
Vladislav's avatar
Vladislav committed
7001
    restart_pp
7002 7003
}
export -f gui_open_scripts_from_backup
7004 7005 7006 7007 7008 7009 7010 7011

#GUI CREDITS AND ABOUT
gui_credits () {
    ########################################################################
    # grep ';subscription;' stat-subscriptions.csv | awk -F';' '{print $1}' | sort -u | sed "s/\"//g" > thanks
    ########################################################################
    KEY_CREDITS=$RANDOM

7012 7013
    # shellcheck source=/dev/null
    source "${PORT_WINE_PATH}/data/scripts/thanks"
7014 7015

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=1 --show-uri --scroll \
Vladislav's avatar
Vladislav committed
7016 7017
    --text-align=center --text="${translations[PortProton v. \${install_ver}
scripts v. \${scripts_install_ver}]}" --text-info <<< "https://linux-gaming.ru
7018

Vladislav's avatar
Vladislav committed
7019
$(eval_translations "Copyright © \$%DATE% Castro-Fidel (linux-gaming.ru)" "DATE=$(date +%Y)")
7020

7021 7022
${translations[This program comes with absolutely no warranty.
See the License for details.]}" 2>/dev/null &
7023 7024

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=2 --scroll \
7025
    --text-info <<< "${translations[Author:   Casro-Fidel (Mikhail Tergoev)
7026

7027 7028
Developer assistants and testers:]}
$(credits_devel)" 2>/dev/null &
7029

7030
    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=3 --text-info --scroll < <(eval_translations "MIT License
7031

Vladislav's avatar
Vladislav committed
7032
Copyright © \$%DATE% Castro-Fidel (linux-gaming.ru)
7033

7034
Permission is hereby granted, free of charge, to any person obtaining a copy
7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049
of this software and associated documentation files (the \"Software\"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED (AS IS), WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7050
SOFTWARE." "DATE=$(date +%Y)") 2>/dev/null &
7051 7052 7053

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=4 \
    --text-info --show-uri --scroll \
7054 7055
    <<< "${translations[The project was supported:
https://boosty.to/portwine-linux.ru]}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
7056
$(credits_boosty)
7057

7058
${translations[The list will be updated...]}" 2>/dev/null &
7059 7060

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=5 \
7061
    --text="${translations[Do you want to join and help in the development of the project:]}" \
7062
    --image-path="$PW_GUI_ICON_PATH" --image="port_proton" \
7063
    --uri-color=red --show-uri --text-info --scroll <<< "${translations[Website:  http://linux-gaming.ru
7064 7065 7066 7067 7068 7069
Discord:  http://discord.gg/yJSEFjF
VK:       https://vk.com/linuxgamingru
-------------------------------------------
Become a paid subscriber:
boosty:  https://boosty.to/portwine-linux.ru
Yandex wallet:   410012267513818
7070
-------------------------------------------]}" 2>/dev/null &
7071 7072

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=6 --show-uri --title="THIRD PARTY LIBRARIES" \
7073
    --text-info <<< "${translations[                               Third-party libraries that are used in PortProton
7074 7075 7076 7077 7078 7079 7080

            PortProton is built on the basis of the following free software libraries:

WINE-PROTON: https://github.com/ValveSoftware/Proton
WINE-PROTON-GE: https://github.com/GloriousEggroll/proton-ge-custom/
Kron4ek/Wine: https://github.com/Kron4ek/Wine-Builds
YAD: https://github.com/v1cont/yad
7081
DGVOODOO2: https://dege.fw.hu/]}" 2>/dev/null &
7082

7083
    "${pw_yad}" --title "${translations[ABOUT US]}" --key="${KEY_CREDITS}" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
7084
    --notebook --no-buttons  --tab-pos=bottom --expand --width=750 --height=400 \
7085 7086
    --tab="${translations[ABOUT PORTPROTON]}" --tab="${translations[AUTORS]}" --tab="${translations[LICENSE]}" \
    --tab="${translations[SPONSORS]}" --tab="${translations[JOIN]}" --tab="${translations[THIRD PARTY LIBRARIES]}"
7087

Vladislav's avatar
Vladislav committed
7088
    restart_pp
7089
}