functions_helper 292 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)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3
# shellcheck disable=SC2140,SC2034,SC2068,SC2206
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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
41
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
42

Mikhail Tergoev's avatar
Mikhail Tergoev committed
43 44 45 46
add_to_var () {
    if ! echo ${!1} | grep "$2" &>/dev/null
    then export $1="${!1} $2"
    fi
47 48
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
49 50 51 52
rm_from_var () {
    if echo ${!1} | grep "$2" &>/dev/null
    then export $1="$(echo "${!1//$2/}" | tr -s " ")"
    fi
53 54
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
55 56 57
fatal () {
    print_error "$@"
    exit 1
58 59
}

Boria138's avatar
Boria138 committed
60 61
change_locale () {
    if [[ -f "${PORT_WINE_TMP_PATH}/PortProton_loc" ]] ; then
62
        LANGUAGE=$(<"${PORT_WINE_TMP_PATH}/PortProton_loc")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
63 64 65 66 67 68 69 70 71
        # 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
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
72
        [[ ! -f "${pw_yad}" ]] && pw_yad="yad"
73
        SET_LANG=(
74
            "${pw_yad}" --list
75
            --window-icon="$PW_GUI_ICON_PATH/portproton.svg"
76 77 78 79 80 81 82 83 84 85
            --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[@]}")
Vladislav's avatar
Vladislav committed
86 87 88 89 90
        if [[ -z $out ]] ; then
            fatal "Language is not set!"
        else
            LANGUAGE=$(echo "$out" | cut -d '|' -f2)
            echo "${LANGUAGE}" > "${PORT_WINE_TMP_PATH}/PortProton_loc"
91
            create_translations
Boria138's avatar
Boria138 committed
92
        fi
93
        restart_pp
Boria138's avatar
Boria138 committed
94
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
95
    export LANGUAGE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
96

97
    case "$LANGUAGE" in
98
        ru)
99
            check_start_from_steam && export LC_ALL=ru_RU.UTF-8
100
            export FULL_LN="russian"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
101
            export LANGUAGE_GIF="ru"
102 103
            ;;
        es)
104
            check_start_from_steam && export LC_ALL=es_ES.UTF-8
105
            export FULL_LN="spanish"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
106
            export LANGUAGE_GIF="en"
107
            ;;
108
         *)
109
            export FULL_LN="english"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
110
            export LANGUAGE_GIF="en"
111 112
            ;;
    esac
113

Boria138's avatar
Boria138 committed
114 115 116
}
export -f change_locale

Mikhail Tergoev's avatar
Mikhail Tergoev committed
117
generate_pot () {
118 119
    sed 's/{translations\[/(gettext \"/g' functions_helper > functions_helper_tmp
    sed -i 's/]}/")/g' functions_helper_tmp
Vladislav's avatar
Vladislav committed
120
    sed -i 's/eval_translations/gettext/g' functions_helper_tmp
121 122 123

    sed 's/{translations\[/(gettext \"/g' start.sh > start.sh_tmp
    sed -i 's/]}/")/g' start.sh_tmp
Vladislav's avatar
Vladislav committed
124
    sed -i 's/eval_translations/gettext/g' start.sh_tmp
125 126 127

    sed 's/{translations\[/(gettext \"/g' setup.sh > setup.sh_tmp
    sed -i 's/]}/")/g' setup.sh_tmp
Vladislav's avatar
Vladislav committed
128
    sed -i 's/eval_translations/gettext/g' setup.sh_tmp
129 130

    #Когда присходит предупреждение: синтаксис $"..." запрещен по соображениям безопасности; используйте eval_gettext
Vladislav's avatar
Vladislav committed
131 132
    #и ругается на строку в которой нет перевода, можно использовать sed -i '//d' и убрать эту строку
    #либо отредактировать сам код, чтобы не было такой ошибки (к примеру вместо двойных ковычек использовать в таком месте одинарные)
133

Mikhail Tergoev's avatar
Mikhail Tergoev committed
134
    for lang in $LANGUAGES_LIST
Mikhail Tergoev's avatar
Mikhail Tergoev committed
135
    do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
136
        echo "${lang}"
137
        create_new_dir "${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
138
        LANG_PO="${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/PortProton.po"
139
        #LANG_MO="${PORT_WINE_PATH}/data/locales/${lang}/LC_MESSAGES/PortProton.mo"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
140
        TEMPLATE_POT="${PORT_WINE_PATH}/data/locales/PortProton.pot"
Vladislav's avatar
Vladislav committed
141
        pushd "${PORT_WINE_PATH}" 1>/dev/null || fatal
142
        xgettext --no-location --from-code=UTF-8 --language Shell -i \
143 144 145
        "data/scripts/start.sh_tmp" \
        "data/scripts/setup.sh_tmp" \
        "data/scripts/functions_helper_tmp" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
146
        -o "$TEMPLATE_POT"
Vladislav's avatar
Vladislav committed
147
        popd 1>/dev/null || fatal
Mikhail Tergoev's avatar
Mikhail Tergoev committed
148 149 150 151 152 153 154
        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
155
        #msgfmt --output-file="$LANG_MO" "$LANG_PO"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
156
    done
157 158 159
    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"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
160
    try_remove_dir "${PW_CACHE_LANG_PATH}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
161 162
}
export -f generate_pot
Boria138's avatar
Boria138 committed
163

Vladislav's avatar
Vladislav committed
164 165
eval_translations () {
    # Для того чтобы раскрывать переменную уже после создания массива
Vladislav's avatar
Vladislav committed
166
    # Вместо {translations[\$TEST text]} нужно (eval_translations "\$%TEST% text" "TEST=test"), перевод должен быть с %% тоже
Vladislav's avatar
Vladislav committed
167
    # В остальных случаях можно использовать {translations[\$TEST text]} ,но переменную нужно обьявлять до создания массива
Mikhail Tergoev's avatar
Mikhail Tergoev committed
168
    # до source "${PW_CACHE_LANG_PATH}/$LANGUAGE" или можно использовать команды {translations[\$(cat file.txt) text]}
Vladislav's avatar
Vladislav committed
169
    # но тогда выполнение команды будет происходить во время создания массива всегда, а не там где это требуется
Vladislav's avatar
Vladislav committed
170
    echo "${translations[$1]//\$*"%"/${2//*=/}}"
Vladislav's avatar
Vladislav committed
171 172
}

173
create_translations () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
174 175
    if [[ ! -d "${PW_CACHE_LANG_PATH}" ]] ; then
        create_new_dir "${PW_CACHE_LANG_PATH}"
176
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
177
    cat << EOF > "${PW_CACHE_LANG_PATH}/$LANGUAGE"
178 179 180 181 182
#!/usr/bin/env bash
TRANSLATIONS_VER=$scripts_install_ver
declare -A translations=(
EOF
    if [[ $LANGUAGE == "en" ]] ; then
183
        po_file="${PORT_WINE_PATH}/data/locales/PortProton.pot"
184 185 186 187
    else
        po_file="${PORT_WINE_PATH}/data/locales/$LANGUAGE/LC_MESSAGES/PortProton.po"
    fi

Vladislav's avatar
Vladislav committed
188
    while IFS= read -r line ; do
189
        while [[ $line =~ msgid ]] ; do
190 191 192
                unset msgid
                msgid="$line"
                read -r line
193
            while [[ ! $line =~ msgstr ]] ; do
194 195 196
                msgid+="$line"
                read -r line
            done
197
            if [[ $line =~ msgstr ]]; then
198
                if [[ $LANGUAGE == "en" ]] ; then
199 200 201
                    if [[ $msgid == "msgid   \"\"" ]] ; then
                        continue
                    fi
202 203 204 205 206
                    msgstr="$msgid"
                else
                    unset msgstr
                    msgstr="$line"
                    read -r line
207 208
                    while [[ ! $line =~ msgid ]] ; do
                        msgstr+=$line
209
                        read -r line
210 211 212
                        if [[ $line == "" ]] ; then
                            break
                        fi
213 214 215
                    done
                fi
            fi
216 217 218 219
        if [[ $LANGUAGE != "en" ]] ; then
            msgstr=${msgstr//"msgstr "/}
            msgid=${msgid//"msgid "/}
        fi
220 221 222 223 224 225 226 227 228 229 230
        msgstr=${msgstr//" "/-_-}
        msgstr=${msgstr//"\n"\"\"/+_+}
        msgstr=${msgstr//\"\"/}
        msgstr=${msgstr//#*/}
        msgstr=${msgstr//"*"/#_#}
        msgid=${msgid//" "/-_-}
        msgid=${msgid//"\n"\"\"/+_+}
        msgid=${msgid//\"\"/}
        msgid=${msgid//#*/}
        msgid=${msgid//"*"/#_#}
        if [[ $msgid != "" ]] ; then
231 232 233 234 235
            if [[ -z $msgstr ]] ; then
                msgstr="$msgid"
            fi
            if [[ $msgid =~ "\$" ]] ; then
                msgid=${msgid//"\$"/\\$}
Vladislav's avatar
Vladislav committed
236
                if [[ $msgstr =~ "\$%" ]] ; then
Vladislav's avatar
Vladislav committed
237 238
                    msgstr=${msgstr//"\$"/\\$}
                fi
239
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
240
            echo \["$msgid"\]="$msgstr" >> "${PW_CACHE_LANG_PATH}/$LANGUAGE"
241 242 243
        fi
        done
    done < "$po_file"
244
    IFS="$orig_IFS"
245

Mikhail Tergoev's avatar
Mikhail Tergoev committed
246 247 248 249
    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"
250
    if [[ $LANGUAGE == "en" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
251
        sed -i 's/msgid   //g' "${PW_CACHE_LANG_PATH}/$LANGUAGE"
252
    fi
Vladislav's avatar
Vladislav committed
253
}
254
export -f create_translations
Vladislav's avatar
Vladislav committed
255

256
try_copy_file () {
257 258
    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
259 260 261 262 263 264 265
    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
266
    else
267 268
        [[ -e "$2/$(basename "$1")" ]] && rm -f "$2/$(basename "$1")"
        cp -f "$1" "$2" && return 0 || return 1
269 270
    fi
}
271
export -f try_copy_file
272

273 274 275
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
276 277 278 279 280 281 282
    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
283 284
                checksum1="$(sha256sum "$1")"
                echo "${checksum1// */}" > "$2.sha256sum"
285 286 287 288 289
            fi
            return 0
        else
            return 1
        fi
290 291 292 293 294
    else
        if [[ "${PW_FILESYSTEM}" == "ext2/ext3" ]] \
        || [[ "${PW_FILESYSTEM}" == "f2fs" ]] \
        || [[ "${PW_FILESYSTEM}" != "btrfs" ]]
        then
295
            checksum1="$(sha256sum "$1")"
296
            if [[ ! -f "$2" ]] ; then
297
                if cp -f "$1" "$2" ; then
298
                    echo "${checksum1// */}" > "$2.sha256sum"
299 300 301 302
                    return 0
                else
                    return 1
                fi
303 304
            else
                if [[ ! -f "$2.sha256sum" ]] ; then
305 306
                    checksum2="$(sha256sum "$2")"
                    echo "${checksum2// */}" > "$2.sha256sum"
307
                else
308
                    checksum2="$(<"$2.sha256sum")"
309 310
                fi
            fi
311
            if [[ "${checksum1// */}" == "${checksum2// */}" ]] ; then
312 313
                return 0
            else
314 315
                try_remove_file "$2"
                if cp -f "$1" "$2" ; then
316
                    echo "${checksum1// */}" > "$2.sha256sum"
317 318 319 320
                    return 0
                else
                    return 1
                fi
321 322 323 324 325 326 327 328 329
            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

330
try_copy_dir () {
331 332
    if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for copy"
    elif [[ -z "$2" ]] ; then print_error "no way to copy directory $1"
333 334
    else
        cp -fr "$1" "$2"
335
        [[ "$?" != 0 ]] && print_error "failed to copy directory $1 to $2" || return 0
336 337 338
    fi
    return 1
}
339
export -f try_copy_dir
340 341

try_remove_file () {
342
    if [[ -f "$1" ]] || [[ ! -e "$1" ]] ; then
343
        rm -f "$1"
344
        [[ "$?" == 0 ]] && return 0 || return 1
345 346
    fi
}
347
export -f try_remove_file
348 349

try_remove_dir () {
350
    if [[ -d "$1" ]] ; then
351
        rm -fr "$1"
352
        [[ "$?" == 0 ]] && return 0 || return 1
353 354
    fi
}
355
export -f try_remove_dir
356

357
create_new_dir () {
358
    if [[ ! -d "$1" ]] ; then
359 360 361 362 363
        mkdir -p "$1"
    fi
    return 0
}

364
try_force_link_file () {
365 366 367 368 369 370 371
    if [[ ! -f "$1" ]] ; then print_warning "file not found for link: $1" && return 1
    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
372
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
373
        try_remove_file "$2"
374
        ln -s -f -r "$1" "$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
375
        return 0
376 377 378
    fi
    return 1
}
379
export -f try_force_link_file
380

381
check_symlink () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
382
    CHK_SYMLINK_FILE="$(file "$1")"
383
    if [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep -v "broken" | grep "symbolic link to" | awk '{print $1}')" ]] ; then
384
        return 0
385
    elif [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep "broken symbolic link to" | awk '{print $1}')" ]] ; then
386 387
        print_error "remove broken symlink: $CHK_SYMLINK_FILE"
        rm -fr "$CHK_SYMLINK_FILE"
388 389 390 391 392
        return 1
    else
        return 1
    fi
}
393
export -f check_symlink
394

395
try_force_link_dir () {
396 397
    if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for link"
    elif [[ -z "$2" ]] ; then print_error "no way to link directory $1"
398
    else
399
        ln -s -f -r "$1" "$2"
400
        [[ "$?" != 0 ]] && print_error "failed to link directory $1 to $2" || return 0
401 402 403
    fi
    return 1
}
404
export -f try_force_link_dir
405

406
check_process () {
407
    [[ -z "$(ps cax | grep "$1" | awk '{print $1}')" ]] && return 0 || return 1
408
}
409
export -f check_process
410

Mikhail Tergoev's avatar
Mikhail Tergoev committed
411
try_check_sha256sum () {
412
    SHA256SUM_EXT=$(curl --silent -L "${1//.tar*/}.sha256sum" | awk '{print $1}')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
    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
}

428
try_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
429
    export dest="$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
430 431
    local silent="false"
    local no_mirror="false"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
432
 
Mikhail Tergoev's avatar
Mikhail Tergoev committed
433
    case "$3" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
434
           silent)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
435 436 437 438 439
                silent=true ;;
        no_mirror)
                no_mirror=true
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
440
    if [[ -n "${PW_AUTOINSTALL_EXE}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
441 442
    && [[ "$no_mirror" == "true" ]]
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
443 444 445 446 447
        local filename="$(basename "${PW_AUTOINSTALL_EXE}")"
    else
        local filename="$(basename "$1")"
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
448
    if [[ "${MIRROR}" == CLOUD ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
449 450
    && [[ "$no_mirror" != "true" ]]
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
451 452
        FIRST_URL=("$url_cloud/$filename")
        SECOND_URL=($1)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
453
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
454 455
        FIRST_URL=($1)
        SECOND_URL=("$url_cloud/$filename")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
456 457
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
458
    [[ ! -f "${pw_yad}" ]] && local pw_yad="yad"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
459 460

    # If gamescope session is active, use PW_TERM for downloading
461
    if check_gamescope_session ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
462
        $PW_TERM curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
463
        -H 'Pragma: no-cache' -L ${FIRST_URL[@]} -o "$dest"
464
        [[ "$?" != 0 ]] && return 1 || return 0
465
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
466 467

    # Normal download
Mikhail Tergoev's avatar
Mikhail Tergoev committed
468
    print_info "Download $filename from ${FIRST_URL[0]}..."
469
    set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
470
    if [[ "$silent" == "true" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
471
        curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
472
        -H 'Pragma: no-cache' -L ${FIRST_URL[@]} -o "$dest" 2>&1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
473 474
    else
        curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
475
        -H 'Pragma: no-cache' -L ${FIRST_URL[@]} -o "$dest" 2>&1 | \
476
        tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
477
        "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
478
        --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
479
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
480
    fi
481

Mikhail Tergoev's avatar
Mikhail Tergoev committed
482
    if [[ "${PIPESTATUS[0]}" != 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
483
        if [[ "$no_mirror" != "true" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
484
            print_warning "Failed download $filename from ${FIRST_URL[0]}, trying mirror: ${SECOND_URL[0]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
485
            curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
486
            -H 'Pragma: no-cache' -L ${SECOND_URL[@]} -o "$dest" 2>&1 | \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
487
            tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
488
            "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
489
            --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
490
            --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
491
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
492 493 494 495
        if [[ "${PIPESTATUS[0]}" != 0 ]] ; then
            print_error "Failed to download $filename from mirror. Skipping..."
            return 1
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
496
            print_ok "File downloaded successfully: $filename from ${SECOND_URL[0]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
497 498 499 500 501 502
            if try_check_sha256sum ${SECOND_URL[@]} ; then
                return 0
            else
                try_remove_file "$dest"
                return 1
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
503
        fi
504
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
505
    print_ok "File downloaded successfully: $filename from ${FIRST_URL[0]}"
506
    if try_check_sha256sum ${FIRST_URL[@]} ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
507 508 509 510 511
        return 0
    else
        try_remove_file "$dest"
        return 1
    fi
512 513 514
}

var_winedlloverride_update () {
515
    if [[ "$WINEDLLOVERRIDES" ]]
516 517
    then export WINEDLLOVERRIDES="$1;$WINEDLLOVERRIDES"
    else export WINEDLLOVERRIDES="$1"
518
    fi
519
    return 0
520 521 522
}

var_vkd3d_config_update () {
523 524 525
    if echo "$VKD3D_CONFIG" | grep "$1"
    then return 0
    elif [[ "$VKD3D_CONFIG" ]]
526 527
    then export VKD3D_CONFIG="$1;$VKD3D_CONFIG"
    else export VKD3D_CONFIG="$1"
528
    fi
529
    return 0
530 531
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
532
var_radv_perftest_config_update () {
533 534 535
    if echo "$RADV_PERFTEST" | grep "$1"
    then return 0
    elif [[ "$RADV_PERFTEST" ]]
536 537
    then export RADV_PERFTEST="$1;$RADV_PERFTEST"
    else export RADV_PERFTEST="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
538 539 540 541
    fi
    return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
542
var_pw_vk_istance_layers_config_update () {
543 544 545
    if echo "$PW_VK_INSTANCE_LAYERS" | grep "$1"
    then return 0
    elif [[ "$PW_VK_INSTANCE_LAYERS" ]]
546 547
    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
548 549 550 551
    fi
    return 0
}

552
var_ld_library_path_update () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
553 554
    if echo "$LD_LIBRARY_PATH" | grep "$1"
    then return 0
555
    elif [[ "$LD_LIBRARY_PATH" ]]
556 557
    then export LD_LIBRARY_PATH="$1:$LD_LIBRARY_PATH"
    else export LD_LIBRARY_PATH="$1"
558 559 560 561
    fi
    return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
562
# GUI NOTIFY SEND
563
pw_notify_send () {
564 565 566 567 568 569 570 571 572 573
    if command -v gdbus &>/dev/null ; then
        local app="PortProton"
        local icon=""
        local timeout="5000"
        local title=""
        local body=""

        local OPTIND="1"
        while getopts a:i:t: opt ; do
            case "$opt" in
574
                a)
575 576
                    local app=$OPTARG
                    ;;
577
                i)
578 579 580 581 582 583 584
                    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
                    local icon=$OPTARG
                    ;;
585
                t)
586 587
                    local timeout=$OPTARG
                    ;;
588
                *)
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
                    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

        local title="$1"
        shift
        local body="$*"

        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
609 610
    fi
}
611
export -f pw_notify_send
612

613 614 615 616 617 618 619
check_start_from_steam () {
    if [[ "${START_FROM_STEAM}" == 1 ]]
    then return 0
    else return 1
    fi
}

620
check_gamescope_session () {
621
    if [[ -n "$GAMESCOPE_IN_USE" ]]
622 623 624 625 626 627 628 629
    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
630 631 632
    fi
}

633
check_wayland_session () {
634
    if [[ -n "$WAYLAND_IN_USE" ]]
635 636 637 638 639 640 641 642 643 644
    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
}
645
export -f check_wayland_session
646

Mikhail Tergoev's avatar
Mikhail Tergoev committed
647
check_flatpak () {
648
    if [[ -n "$FLATPAK_IN_USE" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
649 650 651 652
    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
653 654 655
        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
656 657 658 659 660 661
        return 0
    else
        export FLATPAK_IN_USE=0
        return 1
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
662
export -f check_flatpak
Mikhail Tergoev's avatar
Mikhail Tergoev committed
663

664 665
unpack () {
    case $1 in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
666 667 668 669
         *.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" ;;
670
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
671

672
    case $3 in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
673
        silent) local silent=true ;;
674
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
675

676
    if [[ "$silent" != "true" ]] ; then
677
        set -o pipefail
Mikhail Tergoev's avatar
Mikhail Tergoev committed
678
        pw_start_progress_bar_cover_block "${COVERS_PATH}/unpacking_${LANGUAGE_GIF}.gif"
679
        $command "$1" -C "$2" 2>/dev/null
680
        pw_stop_progress_bar_cover_block
681
        [[ "${PIPESTATUS[0]}" != 0 ]] && print_error "File $1 unpacking error." && return 1 || return 0
682 683
    else
        $command "$1" -C "$2" && return 0 || return 1
684
    fi
685 686
}

687 688 689 690 691 692
debug_timer () {
    if [[ "$1" == "--start" ]] ; then
        START=$(date +%s%N)
    elif [[ "$1" == "--end" ]] ; then
        END=$(date +%s%N)
        DIFF=$((($END - $START)/1000000))
Vladislav's avatar
Vladislav committed
693
        if [[ -n "$2" ]] ; then
694 695 696
            if [[ "$2" != "-s" ]] ; then
                print_warning "It took $DIFF milliseconds for $2"
            fi
Vladislav's avatar
Vladislav committed
697 698 699
        else
            print_warning "It took $DIFF milliseconds"
        fi
700
    fi
701
    return 0
702 703
}

704
combobox_fix () {
705
    if [[ -z "$1" ]] ; then
706 707 708
        print_error "no argument specified for combobox_fix"
        return 1
    else
709
        if [[ "$1" == "--disabled" ]] ; then
710
            if [[ -z "$3" ]] ; then
711 712 713 714 715 716 717 718 719
                echo "disabled"
                return 0
            fi
            name1="$2"
            name2="$3"
        elif [[ "$1" == "--empty" ]] ; then
            if [[ -z "$3" ]] ; then
                echo ""
                return 0
720 721 722 723 724
            fi
            name1="$2"
            name2="$3"
        else
            name1="$1"
725 726 727 728
            if [[ -z "$2" ]] ; then
                echo "${name1}"
                return 0
            fi
729
            name2="$2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
730
        fi
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754
        name3="${name2//\!${name1}\!/\!}"
        name3="!${name3//${name1}\!/\!}"
        name3="${name3//\!\!/\!}"
        name4="${name3//*\!/}"
        if [[ ${name1} == "${name4}" ]] || [[ ${name1} == "\\${name4}" ]]
        then name3="${name3%\!${name1}}"
        fi
        if [[ "$1" == "--disabled" ]] ; then
            if [[ ${name1} != "disabled" ]]
            then fix_disabled="!disabled"
            fi
            echo "${name1}${name3}${fix_disabled}"
        elif [[ "$1" == "--empty" ]] ; then
            if [[ ${name1} != "" ]] ; then
                if [[ ${name1} == "\\" ]]
                then fix_empty=""
                else fix_empty="!"
                fi
            fi
            echo "${name1}${name3}${fix_empty}"
        else
            echo "${name1}${name3}"
        fi
        return 0
755 756 757
    fi
}

Vladislav's avatar
Vladislav committed
758
restart_pp () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
759 760 761 762
    case "$1" in
        --userconf) export RESTART_PP_USED="userconf" ;;
        --edit_db) export RESTART_PP_USED="edit_db" ;;
    esac
Vladislav's avatar
Vladislav committed
763 764
    /usr/bin/env bash -c ${pw_full_command_line[@]} &
    exit 0
Vladislav's avatar
Vladislav committed
765 766
}

castro-fidel's avatar
castro-fidel committed
767
pw_clear_pfx () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
768 769
    rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/.dot*
    rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/.prog*
770
    try_remove_file "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver"
castro-fidel's avatar
castro-fidel committed
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799
    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"
800 801
    rm -f "${PORT_WINE_TMP_PATH}"/*.bin
    rm -f "${PORT_WINE_TMP_PATH}"/*.foz
802
    return 0
803 804
}

castro-fidel's avatar
castro-fidel committed
805 806 807 808 809
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
810
            echo ""
castro-fidel's avatar
castro-fidel committed
811 812
            exit 1
        fi
813
    elif ! yad_question "${translations[Do you really want to reinstall PortProton?\\nFor this, an internet connection will be required.]}"
castro-fidel's avatar
castro-fidel committed
814 815 816 817
    then exit 1
    fi
    pw_clear_pfx
    try_remove_dir "${PORT_WINE_PATH}/data/dist"
818
    create_new_dir "${PORT_WINE_PATH}/data/dist"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
819
    try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN"
castro-fidel's avatar
castro-fidel committed
820 821
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    try_remove_file "${PORT_WINE_PATH}/data/user.conf"
822
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver"
Vladislav's avatar
Vladislav committed
823
    echo ""
824
    unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
825 826
    print_info "Restarting PP for reinstall files..."
    restart_pp
castro-fidel's avatar
castro-fidel committed
827 828
}

829
check_user_conf () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
830 831
    if [[ ! -f "${USER_CONF}" ]] ; then
        cat << EOF > "${USER_CONF}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
832 833 834 835
#!/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
836
EOF
837 838 839 840
    fi
}

init_wine_ver () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
841 842
    if [[ "${PW_WINE_VER}" == "USE_SYSTEM_WINE" ]]
    then export PW_WINE_USE="USE_SYSTEM_WINE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
843 844
    elif [[ "${PW_WINE_VER}" == "GET-OTHER-WINE" ]]
    then gui_proton_downloader
845
    elif [[ -n "${PW_WINE_VER}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
846 847 848 849
    then export PW_WINE_USE="$PW_WINE_VER"
    fi
    unset PW_WINE_VER

Mikhail Tergoev's avatar
Mikhail Tergoev committed
850 851
    if [[ "${PW_WINE_USE}" == "USE_SYSTEM_WINE" ]] \
    && command -v wine &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
852 853 854 855 856
        export WINEDIR="$RT_PREFIX/usr"
        export WINE="$RT_PREFIX$(command -v wine)"
        export WINELOADER="$WINE"
        export WINESERVER="$RT_PREFIX$(command -v wineserver)"
        export PW_NO_FSYNC=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
857
        unset WINEDLLPATH
Mikhail Tergoev's avatar
Mikhail Tergoev committed
858 859
    else
        if [[ -d "${PORT_WINE_PATH}/data/dist" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
860 861
        IFS=$'\n'
        for dist_dir in $(ls -1 "${PORT_WINE_PATH}/data/dist/") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
862
            dist_dir_new=$(echo "${dist_dir}" | awk '$1=$1' | sed -e s/[[:blank:]]/_/g)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
863 864 865 866 867
            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"
868
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
869
        if [[ -z $(ls "${PORT_WINE_PATH}/data/dist/" | grep "${PW_WINE_USE}") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
870 871 872 873 874
            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
875
        if [[ "$PW_WINE_USE" == PROTON_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
876 877 878 879 880 881 882 883 884 885
        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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
886
            for clear_dist_files in $(ls "${WINEDIR}" | sed -e "s/^files$//g" | sed -e "s/^version$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
887 888 889 890 891
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
            mv -f "${WINEDIR}/files"/* "${WINEDIR}/"
            rm -fr "${WINEDIR}/files"
        elif [[ ! -d "${WINEDIR}/files" && -d "${WINEDIR}/dist" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
892
            for clear_dist_files in $(ls "${WINEDIR}" | sed -e "s/^dist$//g" | sed -e "s/^version$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
893 894 895 896
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
            mv -f "${WINEDIR}/dist"/* "${WINEDIR}/"
            rm -fr "${WINEDIR}/dist"
897
        elif [[ -f "${WINEDIR}/proton_dist.tar" ]] ; then
898
            unpack "${WINEDIR}/proton_dist.tar" "${WINEDIR}/"
Llein's avatar
Llein committed
899
            for clear_dist_files in $(ls "${WINEDIR}" | sed -e "s/^bin$//g" | sed -e "s/^lib$//g" | sed -e "s/^lib64$//g" | sed -e "s/^share$//g" | sed -e "s/^version$//g") ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
900 901 902 903 904
                rm -fr "${WINEDIR}/$clear_dist_files"
            done
        fi
        if [[ -d "${WINEDIR}" ]] ; then
            [[ ! -f "${WINEDIR}/version" ]] && echo "${PW_WINE_USE}" > "${WINEDIR}/version"
905

Mikhail Tergoev's avatar
Mikhail Tergoev committed
906 907 908 909 910
            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
911

Mikhail Tergoev's avatar
Mikhail Tergoev committed
912 913 914 915
            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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
916
                    pw_start_progress_bar_cover_block "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
917 918 919 920 921 922 923 924 925 926 927 928
                    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."
                    pw_stop_progress_bar_cover_block
                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
929
            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
930 931 932 933 934
                echo 'HKLM,Software\NVIDIA Corporation\Global,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
                echo 'HKLM,System\ControlSet001\Services\nvlddmkm,"{41FCC608-8496-4DEF-B43E-7D9BD675A6FF}",0x10001,0x00000001' >> "${WINEDIR}/share/wine/wine.inf"
                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
935 936 937
                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
938
            fi
939
        fi
castro-fidel's avatar
castro-fidel committed
940

Mikhail Tergoev's avatar
Mikhail Tergoev committed
941 942 943
        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
944
        fi
945
    fi
946

Mikhail Tergoev's avatar
Mikhail Tergoev committed
947
    export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
948 949
    export MEDIACONV_BLANK_VIDEO_FILE="${WINEDIR}"/share/media/blank.mkv
    export MEDIACONV_BLANK_AUDIO_FILE="${WINEDIR}"/share/media/blank.ptna
950
    return 0
951 952
}

castro-fidel's avatar
castro-fidel committed
953
pw_init_runtime () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
954
    check_flatpak && export PW_USE_RUNTIME="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
955 956

    if [[ "$PW_USE_RUNTIME" != "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
957
    || [[ "$PW_WINE_USE" == "USE_SYSTEM_WINE" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
958
    then
959
        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
960
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
961 962 963 964 965 966
        if check_flatpak
        then
            if check_gamescope_session
            then PW_TERM="xterm -fullscreen -bg black -fg white -e"
            else PW_TERM="xterm -bg black -fg white -e"
            fi
967 968 969
        else PW_TERM="env LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\" ${PW_PLUGINS_PATH}/portable/bin/xterm -bg black -fg white -e"
        fi
        export PW_TERM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
970
        export pw_runtime="env"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
971 972
        return 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
973

Mikhail Tergoev's avatar
Mikhail Tergoev committed
974
    if grep -i "altlinux" "/etc/os-release" &>/dev/null ; then
castro-fidel's avatar
castro-fidel committed
975
        export LIBGL_DRIVERS_PATH="/usr/lib/X11/modules/dri:/usr/lib64/X11/modules/dri"
976 977 978 979
        if [[ -f "/usr/share/vulkan/icd.d/nvidia_icd.json" ]] ; then
            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
980 981
    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
982
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
983

Mikhail Tergoev's avatar
Mikhail Tergoev committed
984
    PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
985 986 987 988 989 990 991

    export PW_LD_LIBRARY_PATH="\
${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:\
992 993 994
/overrides/lib/i386-linux-gnu:\
/lib/x86_64-linux-gnu:\
/lib/i386-linux-gnu"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
995

996
    if [[ -n "${PATH}" ]]
997 998 999 1000
    then export PW_PATH="${PATH}:${PW_PLUGINS_PATH}/portable/bin"
    else export PW_PATH="${PW_PLUGINS_PATH}/portable/bin"
    fi

1001
    if [[ -n "${PW_SANDBOX_HOME_PATH}" && -d "${PW_SANDBOX_HOME_PATH}" ]] ; then
castro-fidel's avatar
castro-fidel committed
1002
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1003
        --unshare-home \
1004
        --home=${PW_SANDBOX_HOME_PATH} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1005
        --remove-game-overlay \
1006
        --share-pid \
1007 1008
        ${PW_ADD_TO_ARGS_IN_RUNTIME} -- \
        env PATH=$PW_PATH "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1009
    else
castro-fidel's avatar
castro-fidel committed
1010
        export pw_runtime="${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-unruntime \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1011
        --share-home \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1012
        --remove-game-overlay \
1013
        --share-pid \
1014 1015
        ${PW_ADD_TO_ARGS_IN_RUNTIME} -- \
        env PATH=$PW_PATH "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1016
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1017

1018 1019 1020 1021 1022
    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
1023
        export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d"
1024 1025
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1026
    # export PRESSURE_VESSEL_GRAPHICS_PROVIDER="/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1027 1028

    unset PRESSURE_VESSEL_RUNTIME_ARCHIVE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1029 1030
    export PRESSURE_VESSEL_COPY_RUNTIME=1
    export PRESSURE_VESSEL_GC_LEGACY_RUNTIMES=1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1031
    export PRESSURE_VESSEL_RUNTIME=runtime
castro-fidel's avatar
castro-fidel committed
1032 1033 1034
    export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}"
    export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var"
    export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel"
1035
    export FONTCONFIG_PATH=''
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1036 1037

    unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW
castro-fidel's avatar
castro-fidel committed
1038
    for PWRTMRO in ${PW_RT_MOUNT_RO[*]} ; do
1039
        if [[ -n "${PRESSURE_VESSEL_FILESYSTEMS_RO}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1040 1041 1042 1043
        then export PRESSURE_VESSEL_FILESYSTEMS_RO="${PRESSURE_VESSEL_FILESYSTEMS_RO}:${PWRTMRO}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RO="${PWRTMRO}"
        fi
    done
castro-fidel's avatar
castro-fidel committed
1044
    for PWRTMRW in ${PW_RT_MOUNT_RW[*]} ; do
1045
        if [[ -n "${PRESSURE_VESSEL_FILESYSTEMS_RW}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1046 1047 1048 1049
        then export PRESSURE_VESSEL_FILESYSTEMS_RW="${PRESSURE_VESSEL_FILESYSTEMS_RW}:${PWRTMRW}"
        else export PRESSURE_VESSEL_FILESYSTEMS_RW="${PWRTMRW}"
        fi
    done
1050

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

1053
    print_info "RUNTIME is enabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1054 1055
}

castro-fidel's avatar
castro-fidel committed
1056
pw_mangohud_check () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1057 1058 1059
    if [[ "${PW_MANGOHUD}" == "1" ]] \
    && ! check_gamescope_session
    then
1060 1061 1062
        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"
1063
            print_info "Portable MangoHud is enabled"
1064
        else
1065
            print_info "System MangoHud is enabled"
1066
            export PW_MANGOHUD_SLR='MANGOHUD=1'
1067
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1068
        MANGOHUD_LIB_NAME="libMangoHud.so"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1069
        if [[ "${PW_VULKAN_USE}" = "0" ]] ; then
1070
            MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:libMangoHud_opengl.so:${MANGOHUD_LIB_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1071
        fi
1072
        if [[ -n "${PW_LD_PRELOAD}" ]]
castro-fidel's avatar
castro-fidel committed
1073 1074
        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
1075 1076
        fi
    else
1077
        export PW_MANGOHUD_SLR=''
1078
        print_info "MangoHud is disabled"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1079 1080 1081 1082
    fi
    return 0
}

castro-fidel's avatar
castro-fidel committed
1083
pw_vkbasalt_check () {
1084
    if [[ "${PW_VKBASALT}" == "1" ]] ; then
1085 1086 1087 1088 1089 1090
        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"
1091
            export ENABLE_VKBASALT="1"
1092
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1093
        export VKBASALT_CONFIG_FILE="${PORT_WINE_PATH}/data/vkBasalt.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1094 1095
        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
1096
        fi
1097
        if [[ -n "${PW_VKBASALT_EFFECTS}" ]] && [[ -n "${PW_VKBASALT_FFX_CAS}" ]] ; then
1098 1099
            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
1100 1101
        fi
    else
1102
        export DISABLE_VKBASALT="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1103 1104 1105 1106 1107
        print_info "vkBasalt is disabled"
    fi
    return 0
}

1108
regdlloverrides () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1109 1110 1111
    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
1112 1113 1114
    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
1115 1116
          "n") PW_DLL_IN_REG="native" ;;
          "b") PW_DLL_IN_REG="builtin" ;;
castro-fidel's avatar
castro-fidel committed
1117
            *) PW_DLL_IN_REG="" ;;
1118
    esac
castro-fidel's avatar
castro-fidel committed
1119
    grep 'HKCU,Software\\Wine\\AppDefaults\\'"${PW_DLL_EXE}"'\\DllOverrides,'\"${PW_DLL_LIB}\",0x2,\"${PW_DLL_IN_REG}\" "${WINEDIR}/share/wine/wine.inf"
1120
    if [[ "$?" != "0" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1121 1122
        grep "ProtonOverrides" "${WINEDIR}/share/wine/wine.inf"
        if [[ "$?" == "0" ]] ; then
castro-fidel's avatar
castro-fidel committed
1123
            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
1124
        else
castro-fidel's avatar
castro-fidel committed
1125
            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
1126
        fi
1127 1128 1129
    fi
}

1130
wait_wineserver () {
1131
    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
1132
    do
1133 1134
        sleep 1
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1135
    "$WINESERVER" -w
1136
    return 0
1137
}
1138
export -f wait_wineserver
1139 1140

kill_portwine () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1141
    if [[ "${PW_WINE_USE}" != "USE_SYSTEM_WINE" ]] ; then
1142 1143 1144 1145 1146 1147 1148 1149
        check_flatpak
        if [[ "$ALPINE_FP" == "1" ]] ; then
            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
1150
    else
1151 1152
        wine_pids=$(ls -l /proc/*/exe 2>/dev/null | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')
        unset bwrap_pids
1153
    fi
1154 1155 1156 1157 1158 1159 1160

    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

1161
    return 0
1162 1163 1164
}
export -f kill_portwine

castro-fidel's avatar
castro-fidel committed
1165
pw_kill_autostart () {
castro-fidel's avatar
castro-fidel committed
1166
    if [[ -z "${2}" ]]
1167
    then SWAIT=3
castro-fidel's avatar
castro-fidel committed
1168 1169
    else SWAIT="${2}"
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1170 1171
    sleep 5
    while true ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1172
        if  [[ -z "$(ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}')" ]] \
1173
        && [[ -n "$(ps aux | grep wrap | grep -v grep | grep -i "PortProton" | head -n 1)" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1174
        then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1175
            echo -e "PID $1 not found"
castro-fidel's avatar
castro-fidel committed
1176
            sleep "${SWAIT}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1177
        else
castro-fidel's avatar
castro-fidel committed
1178
            sleep "${SWAIT}"
1179
            if [[ "$3" == please ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1180
            then kill -s SIGTERM $(ps aux | grep -m 1 -i "$1" | grep -v grep | awk '{print $2}')
1181 1182
            else kill_portwine
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1183 1184 1185
            break
        fi
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1186

1187
    if [[ -n "$(ls "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/ | grep -m 1 ".tmp")" ]] ; then
castro-fidel's avatar
castro-fidel committed
1188
        rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/*.tmp
1189
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1190

1191
    return 0
1192
}
castro-fidel's avatar
castro-fidel committed
1193
export -f pw_kill_autostart
1194

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210
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
1211
stop_portwine () {
1212
    [[ "$int_xneur" == "1"  ]] && xneur &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1213

1214
    if [[ "$PW_USE_US_LAYOUT" == "1" ]] \
1215
    && ! check_wayland_session \
1216 1217
    && command -v setxkbmap &>/dev/null
    then
Boria138's avatar
Boria138 committed
1218
        setxkbmap
1219
    fi
1220

1221
    if ! check_wayland_session \
1222 1223 1224
    && [[ "$(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"
1225
    fi
1226 1227

    if [[ "${PW_DISABLE_COMPOSITING}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1228
    && ! check_gamescope_session
1229
    then
Boria138's avatar
Boria138 committed
1230 1231 1232 1233 1234 1235 1236 1237
        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
1238 1239
        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
1240 1241
        fi
    fi
1242

castro-fidel's avatar
castro-fidel committed
1243
    pw_stop_progress_bar
1244 1245
    try_remove_file "${PORT_SCRIPTS_PATH}/0"
    try_remove_file "${PORT_SCRIPTS_PATH}/1"
1246
    kill_portwine &&
castro-fidel's avatar
castro-fidel committed
1247 1248
    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
1249
    pw_exit_tray
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1250
    pw_auto_create_shortcut
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1251
    add_in_stop_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1252
    unset SKIP_CHECK_UPDATES
1253
    exit 0
1254
}
1255
export -f stop_portwine
1256

castro-fidel's avatar
castro-fidel committed
1257
pw_download_libs () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1258 1259
    if [[ ! -f "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \
    || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-wrap" ]]
1260
    then
1261
        print_info "Download and install libraries..."
1262 1263
        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
1264
            if unpack "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/" ; then
castro-fidel's avatar
castro-fidel committed
1265
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1266 1267
                if ls "${PORT_WINE_TMP_PATH}" | grep libs_v | grep -v libs"${PW_LIBS_VER}" ; then
                    for RM_LIBS in $(ls "${PORT_WINE_TMP_PATH}" | grep libs_v | grep -v libs"${PW_LIBS_VER}")
1268 1269 1270
                    do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_LIBS}"
                    done
                fi
1271
            else
castro-fidel's avatar
castro-fidel committed
1272 1273
                try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz"
1274
                if yad_error_download
1275 1276
                then pw_download_libs
                else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1277
                    export PW_LIBS_VER="_v$((${PW_LIBS_VER//_v/} - 1))"
1278 1279
                    export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
                fi
1280 1281
            fi
        else
1282
            if yad_error_download
1283 1284
            then pw_download_libs
            else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1285
                export PW_LIBS_VER="_v$((${PW_LIBS_VER//_v/} - 1))"
1286 1287
                export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}"
            fi
1288 1289
        fi
    fi
1290
    return 0
1291 1292
}

castro-fidel's avatar
castro-fidel committed
1293
pw_check_and_download_wine () {
1294
    [[ ! -d "${PORT_WINE_PATH}/data/dist/" ]] && create_new_dir "${PORT_WINE_PATH}/data/dist"
castro-fidel's avatar
castro-fidel committed
1295
    if [[ "${PW_WINE_USE}" == "GET-OTHER-WINE" ]] ; then
1296 1297
        gui_proton_downloader
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1298
    if [[ "$PW_WINE_USE" == PROTON_LG ]]
castro-fidel's avatar
castro-fidel committed
1299
    then export PW_WINE_USE="${PW_PROTON_LG_VER}"
1300
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
1301
    then export PW_WINE_USE="${PW_WINE_LG_VER}"
castro-fidel's avatar
castro-fidel committed
1302
    fi
1303
    if [[ ! -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ]] ; then
castro-fidel's avatar
castro-fidel committed
1304
        print_info "Download and install ${PW_WINE_USE}..."
1305 1306
        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
1307
            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
1308 1309 1310
                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}"
1311
            else
castro-fidel's avatar
castro-fidel committed
1312 1313 1314
                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}"
1315

1316
                yad_error_download && pw_check_and_download_wine || exit 1
1317 1318
            fi
        else
1319
            yad_error_download && pw_check_and_download_wine || exit 1
1320 1321
        fi
    fi
1322
    return 0
1323 1324
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1325
pw_check_and_download_dxvk_and_vkd3d () {
1326
    # Download stable and git version DXVK
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1327
    for DXVK_VAR_VER in "${DXVK_STABLE_VER}" "${DXVK_GIT_VER}" "${DXVK_LEGACY_VER}" ; do
1328
        if [[ ! -d "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1329
            print_info "Download and install DXVK v.${DXVK_VAR_VER}"
1330 1331
            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
1332
                if unpack "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1333 1334 1335
                    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
1336
                    try_remove_dir "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1337

1338
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1339
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1340 1341
            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
1342
                if unpack "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}.tar.gz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1343 1344 1345
                    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
1346
                    try_remove_dir "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1347

1348
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1349 1350
                fi
            else
1351
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1352 1353 1354 1355
            fi
        fi
    done

1356
    # Download stable and git version VKD3D
1357
    for VKD3D_VAR_VER in "${VKD3D_STABLE_VER}" "${VKD3D_GIT_VER}" ; do
1358
        if [[ ! -d "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1359
            print_info "Download and install VKD3D-PROTON v.${VKD3D_VAR_VER}"
1360 1361
            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
1362
                if unpack "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.xz" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1363 1364 1365
                    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
1366
                    try_remove_dir "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1367

1368
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1369
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1370 1371
            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
1372
                if unpack "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}.tar.zst" "${PW_VULKAN_DIR}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1373 1374 1375
                    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
1376
                    try_remove_dir "${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_VAR_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1377

1378
                    yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1379 1380
                fi
            else
1381
                yad_error_download && pw_check_and_download_dxvk_and_vkd3d || exit 1
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1382 1383 1384
            fi
        fi
    done
1385

1386
    # Download DGVOODOO2
1387
    if [[ ! -f "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}/dgVoodoo.conf" ]] ; then
Vladislav's avatar
Vladislav committed
1388
        print_info "Download and install DGVOODOO2 v.${DGV2_VER}"
1389 1390
        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
1391
        then
1392 1393
            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
1394
            else
1395
                try_remove_file "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}.tar.xz"
1396
                try_remove_dir "${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}"
Vladislav's avatar
Vladislav committed
1397 1398 1399 1400 1401 1402 1403 1404

                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
1405 1406 1407
    return 0
}

castro-fidel's avatar
castro-fidel committed
1408
pw_check_and_download_plugins () {
1409
    if [[ ! -f "${PW_PLUGINS_PATH}/portable/lib/lib64/libvkbasalt.so" ]] ; then
castro-fidel's avatar
castro-fidel committed
1410
        print_info "Download and install plugins${PW_PLUGINS_VER}..."
1411 1412
        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
1413
                if unpack "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1414 1415
                    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
1416
                    pw_clear_pfx
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1417 1418 1419
                    if ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}"
                    then
                        for RM_PLUGINS in $(ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}")
1420 1421 1422
                        do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}"
                        done
                    fi
1423 1424 1425 1426 1427 1428
                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
1429
                        export PW_PLUGINS_VER="_v$((${PW_PLUGINS_VER//_v/} - 1))"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1430
                        export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
1431
                    fi
1432
                fi
1433
            else
1434
                if yad_error_download
1435 1436
                then pw_check_and_download_plugins
                else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1437
                    export PW_PLUGINS_VER="_v$((${PW_PLUGINS_VER//_v/} - 1))"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1438
                    export PW_PLUGINS_PATH="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}"
1439
                fi
1440 1441
            fi
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1442
            pw_notify_send -i info \
1443
            "${translations[Please wait for update PortProton]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1444 1445
            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
1446
                if unpack "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1447
                    try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1448
                    # TODO: drop clear prefix, and add update prefix from new plugins
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1449
                    pw_clear_pfx
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1450 1451 1452
                    if ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}"
                    then
                        for RM_PLUGINS in $(ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}")
1453 1454 1455 1456 1457
                        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
1458
                    pw_notify_send -i error \
1459
                    "${translations[Failed updating PortProton!]}"
1460
                fi
1461
            fi
1462 1463
        fi
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1464 1465 1466 1467
    if command -v 7z &>/dev/null
    then export pw_7z="7z"
    else export pw_7z="${PW_PLUGINS_PATH}/portable/lib/p7zip/7z"
    fi
1468
    return 0
1469 1470
}

1471 1472 1473 1474 1475 1476 1477
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/"

1478 1479 1480
        [[ ! -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
1481

1482 1483
        if [[ ! -d "${WINEPREFIX}/dosdevices/s:" ]] \
        && [[ -d "$HOME/.local/share/Steam/steamapps/common/" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1484 1485 1486 1487
        then
            try_force_link_dir "$HOME/.local/share/Steam/steamapps/common/" "${WINEPREFIX}/dosdevices/s:"
        fi

1488 1489 1490 1491
        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
1492
                try_force_link_file "${WINEDIR}/share/fonts/${link_font}" "${WINEPREFIX}/drive_c/windows/Fonts/${link_font}"
1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
            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
1518
        DRIVES=(d e f g i j k l m n o p q r t u v w x y)
1519 1520
        DEF_MOUNT_DIRS=('/media' '/mnt' '/run/media')
        MOUNT_DIRS=($(find "${DEF_MOUNT_DIRS[@]}" -maxdepth 1 -mindepth 1  -type d 2>/dev/null | sort -u))
1521
        find -L "$WINEPREFIX/dosdevices" -maxdepth 1 -type l -exec rm -rf {} \; 2>/dev/null ;
1522 1523

        for drive_dir in "${MOUNT_DIRS[@]}" ; do
1524 1525 1526 1527 1528 1529 1530 1531 1532
            if  mountpoint -q "$drive_dir" ; then
                if ! realpath "${WINEPREFIX}/dosdevices"/*: | grep -w "$drive_dir$" &>/dev/null ; then
                    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
1533
                            if [[ $(<"/sys/class/block/$mount_name/removable") != "1" ]] 2>/dev/null ; then
1534 1535
                                if [[ ! $(echo "$mount_point" | grep "mmc") ]] 2>/dev/null ; then
                                    ln -sf "$drive_dir" "$drive_path"
1536
                                    print_info "Mounted ${drive_dir} to ${drive_path}"
1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548
                                    break
                                else
                                    ((drive_num++))
                                fi
                            else
                                ((drive_num++))
                            fi
                        else
                            ((drive_num++))
                        fi
                    done
                fi
1549 1550 1551 1552
            fi
        done
    }

1553
check_nvidia_rtx () {
1554
    if [[ -n $(echo "$LSPCI_VGA" | grep -i "nvidia") ]] ; then
1555
        # Turing (without nvidia 16XX)
1556
        [[ "$LSPCI_VGA" == *TU[0-9]* ]] && [[ "$LSPCI_VGA" != *TU11[6-7]* ]] && return 0
1557
        # Ampere
1558
        [[ "$LSPCI_VGA" == *GA[0-9]* ]] && return 0
1559
        # Ada_Lovelace
1560
        [[ "$LSPCI_VGA" == *AD[0-9]* ]] || [[ "$LSPCI_VGA" == *2[6-8][0-9]* ]] && return 0
1561 1562 1563 1564
    fi
    return 1
}

castro-fidel's avatar
castro-fidel committed
1565
pw_init_db () {
1566
    if [[ -f "${portwine_exe}" ]] ; then
1567
        PORTWINE_DB="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1568
        export PORTWINE_DB
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1569 1570 1571 1572 1573 1574
        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
1575 1576 1577
            PORTWINE_DB_FILE="${portwine_exe}".ppdb
            # shellcheck source=/dev/null
            source "${PORTWINE_DB_FILE}"
1578 1579 1580 1581 1582 1583 1584
            if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then
                if [[ -z $(ls "${PORT_WINE_PATH}/prefixes/" | grep -e "^${PW_PREFIX_NAME}$") ]] \
                || [[ -z $(grep -e "^export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]]
                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
1585
            fi
1586 1587
        else
            IFS=$'\n'
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1588 1589
            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
1590
                unset ADD_CB_DBFILE
castro-fidel's avatar
castro-fidel committed
1591
                for PW_CHECK_DB_FILE in $PW_FIND_DB_FILE ; do
1592
                    if [[ -z "${ADD_CB_DBFILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1593
                        ADD_CB_DBFILE="$(echo "${PW_CHECK_DB_FILE}" | awk -F'/' '{print $NF}')"
1594
                    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1595
                        ADD_CB_DBFILE="$(echo "${PW_CHECK_DB_FILE}" | awk -F'/' '{print $NF}')!${ADD_CB_DBFILE}"
1596 1597
                    fi
                done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1598
                PORTWINE_DB_FILE="${PORT_SCRIPTS_PATH}/portwine_db"/$("${pw_yad}" --text-align=center \
1599
                --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 \
1600
                --title "Database file selection..." --window-icon="$PW_GUI_ICON_PATH/portproton.svg"  --form --separator="" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1601
                --field="DB FILE: :CB" "${ADD_CB_DBFILE}" 2>/dev/null)
1602
                if [[ "$?" == "1" || "$?" == "252" ]] ; then exit 0 ; fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1603
            elif [[ $(echo "$PW_FIND_DB_FILE" | wc -l) -eq 1 ]] ; then
castro-fidel's avatar
castro-fidel committed
1604
                PORTWINE_DB_FILE="${PW_FIND_DB_FILE}"
1605 1606
            fi
            IFS="$orig_IFS"
1607

1608 1609 1610 1611 1612
            if [[ -f "${PW_FIND_DB_FILE}" ]] ; then
                # shellcheck source=/dev/null
                source "${PORTWINE_DB_FILE}"
            fi

1613
            if [[ -f "${PW_FIND_DB_FILE}" ]] \
1614
            && [[ "${PW_DISABLED_CREATE_DB}" != 1 ]]
1615
            then
castro-fidel's avatar
castro-fidel committed
1616
                try_copy_file "${PW_FIND_DB_FILE}" "${portwine_exe}".ppdb
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1617
                PORTWINE_DB_FILE="${portwine_exe}".ppdb
1618 1619 1620 1621 1622 1623 1624 1625
                if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then
                    if [[ -z $(ls "${PORT_WINE_PATH}/prefixes/" | grep -e "^${PW_PREFIX_NAME}$") ]] \
                    || [[ -z $(grep -e "^export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]]
                    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
1626
            fi
1627
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1628

1629
        if [[ -f "${PORTWINE_DB_FILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1630 1631
            # shellcheck source=/dev/null
            source "${PORTWINE_DB_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1632
            init_wine_ver &&
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1633
            print_info "Use $PORTWINE_DB_FILE db file."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1634 1635
        else
            if [[ "${PW_DISABLED_CREATE_DB}" != 1 ]] ; then
1636
                if [[ -n "${PORTWINE_DB}" ]] ; then
Vladislav's avatar
Vladislav committed
1637
                    export PORTWINE_DB_FILE=$(grep -il "#${PORTWINE_DB}.exe" "${PORT_SCRIPTS_PATH}/portwine_db"/*)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1638 1639 1640 1641 1642 1643 1644 1645 1646
                    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
1647
                    if [[ -n $(echo "${portwine_exe}" | grep "/data/prefixes/") ]] && \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1648 1649 1650 1651 1652 1653 1654 1655 1656
                        [[ -z $(echo "${portwine_exe}" | grep "/data/prefixes/DEFAULT/") ]]
                    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
1657
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1658

1659
        if [[ -z "${PATH_TO_GAME}" ]] || [[ ! -d "${PATH_TO_GAME}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1660 1661
            PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"
            export PATH_TO_GAME
1662
        fi
1663

1664
        if [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] && [[ -n "${WINE_CPU_TOPOLOGY}" ]] ; then
1665 1666
            export PW_WINE_CPU_TOPOLOGY="${WINE_CPU_TOPOLOGY}"
        fi
1667 1668 1669
        if ls "${PATH_TO_GAME}"/*_Data/Resources/ 2>/dev/null | grep "unity" &>/dev/null \
        && [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] \
        && [[ $(grep -c "^processor" /proc/cpuinfo) -gt "8" ]]
1670 1671 1672 1673
        then
                export PW_WINE_CPU_TOPOLOGY="8:0,1,2,3,4,5,6,7"
                print_info "Automatic added fix for unity games: WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7"
        fi
1674

1675 1676 1677 1678
        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"
1679
        fi
1680
    fi
1681

1682
    [[ "${START_FROM_STEAM}" == 1 ]] && export PW_GUI_DISABLED_CS=1
1683
    [[ "${START_FROM_PP_GUI}" == 1 ]] && export PW_GUI_DISABLED_CS=0 && unset START_FROM_PP_GUI
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1684

1685
    return 0
1686 1687
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1688
# GUI UPDATE SCRIPTS
castro-fidel's avatar
castro-fidel committed
1689
pw_port_update () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1690
    case "$BRANCH" in
1691 1692
        master|stable)
            BRANCH_VERSION_UPDATE="SCRIPTS_STABLE_VERSION"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1693 1694
            BRANCH="master"
            ;;
1695 1696
         devel|beta)
            BRANCH_VERSION_UPDATE="SCRIPTS_NEXT_VERSION"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1697 1698 1699 1700
            BRANCH="devel"
            ;;
    esac

1701
    if [[ ! -f "${PORT_WINE_TMP_PATH}/scripts_ver" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1702
        echo "2024" > "${PORT_WINE_TMP_PATH}/scripts_ver"
1703
    fi
1704 1705 1706 1707 1708 1709

    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"

    pw_check_update () {
        debug_timer --start
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1710
        if ! timeout 2 curl -f -s --list-only "$URL_ETERFUND" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
1711
        then
1712 1713 1714 1715 1716 1717 1718
            print_warning "https://gitlab.eterfund.ru/ broken. Skip it..."
            UPDATE_SKIP_ETERFUND="1"
        fi
        debug_timer --end -s
        UPDATE_ETERFUND="$DIFF"

        debug_timer --start
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1719
        if ! timeout 2 curl -f -s --list-only "$URL_GITHUB" > "${PORT_WINE_TMP_PATH}/curent_var_ver"
1720 1721 1722 1723 1724 1725 1726 1727 1728
        then
            print_warning "https://raw.githubusercontent.com/ broken. Skip it..."
            UPDATE_SKIP_GITHUB="1"
        fi
        debug_timer --end -s
        UPDATE_GITHUB="$DIFF"

        if [[ "$UPDATE_SKIP_ETERFUND" == "1" ]] \
        && [[ "$UPDATE_SKIP_GITHUB" == "1" ]] ; then
1729 1730 1731
            print_error "Unable to determine the version on the server. Skip it..."
            return 1
        fi
1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744

        PW_UPDATE_ALL_LIST=($UPDATE_ETERFUND $UPDATE_GITHUB)

        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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1745
            # print_info "Selected https://gitlab.eterfund.ru/"
1746 1747 1748
            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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1749
            # print_info "Selected https://raw.githubusercontent.com/"
1750 1751 1752
            echo "$UPDATE_DAYS $UPDATE_MINUTES UPDATE_GITHUB $UPDATE_MINUTES" > "${PORT_WINE_TMP_PATH}/update_skip_mirror"
            UPDATE_URL_MIRROR="UPDATE_GITHUB"
        fi
Vladislav's avatar
Vladislav committed
1753
        PW_FORCE_UPDATE="1"
1754 1755
    }

Vladislav's avatar
Vladislav committed
1756 1757 1758
    [[ ! -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")

1759 1760 1761
    if [[ ! -f "${PORT_WINE_TMP_PATH}/update_skip_mirror" ]] ; then
        pw_check_update
    else
Vladislav's avatar
Vladislav committed
1762
        CHECK_UPDATE_MIRROR=$(<"${PORT_WINE_TMP_PATH}/update_skip_mirror")
1763 1764 1765 1766 1767
        UPDATE_SKIP_DAYS="$(echo "${CHECK_UPDATE_MIRROR}" | awk -F" " '{print $1}')"
        UPDATE_DATE_MIRROR="$(echo "${CHECK_UPDATE_MIRROR}" | awk -F" " '{print $2}')"
        UPDATE_SKIP_DATE="$(echo "${CHECK_UPDATE_MIRROR}" | awk -F" " '{print $4}')"
        UPDATE_DAYS=$(date +%-j)
        UPDATE_MINUTES=$(($(date +%-H) * 60 + $(date +%-M)))
Vladislav's avatar
Vladislav committed
1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
        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
1780 1781 1782
        fi
    fi

Vladislav's avatar
Vladislav committed
1783
    if (( $((UPDATE_SKIP_DATE + $(((RANDOM%11)+25)) )) <= UPDATE_MINUTES )) \
Vladislav's avatar
Vladislav committed
1784 1785 1786 1787 1788
    || [[ "$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
1789 1790
        print_info "Check update..."
        echo ""
1791 1792 1793 1794 1795 1796
        if [[ -z "$UPDATE_URL_MIRROR" ]] ; then
            UPDATE_URL_MIRROR="$(echo "${CHECK_UPDATE_MIRROR}" | awk -F" " '{print $3}')"
            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
1797 1798 1799 1800 1801 1802 1803
                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"
1804 1805
                ;;
            UPDATE_GITHUB)
Vladislav's avatar
Vladislav committed
1806 1807 1808 1809 1810 1811 1812
                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"
1813 1814 1815 1816
                ;;
        esac
    else
        return 0
1817
    fi
1818

Vladislav's avatar
Vladislav committed
1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
    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
1833
        print_info "Scripts version in git = ${scripts_current_ver}"
1834
        print_info "Scripts version local = ${scripts_install_ver}"
1835
        if [[ -n "${scripts_current_ver}" ]] &&  [[ "${scripts_current_ver}" -gt "${scripts_install_ver}" ]] ; then
1836 1837
            if [[ -f "${PW_GUI_THEMES_PATH}/gui/yad_gui_pp" ]]
            then export pw_yad="${PW_GUI_THEMES_PATH}/gui/yad_gui_pp"
1838
            elif command -v yad &>/dev/null
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1839 1840
            then local pw_yad="yad"
            else local pw_yad="not_found"
1841
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1842 1843
            if [[ "${pw_yad}" == "not_found" ]] \
            || [[ "$PW_CHANGE_BRANCH" == "1" ]] ; then
1844
                xcsd="${translations[UPDATING NOW]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1845
                unset PW_CHANGE_BRANCH
1846
            else
1847
                curl -s --list-only "${URL_FOR_CHANGELOG}/${PW_CHANGELOG_FILE}" | tee "${PORT_WINE_TMP_PATH}/curent_var_ver"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1848
                CHANGLOG_NEWS=$(sed "/Scripts version ${scripts_install_ver}/,$ d" "${PORT_WINE_TMP_PATH}/curent_var_ver" | sed '1,/---/ d' )
1849
                xcsd=$("${pw_yad}" --title "${translations[Update scripts:]} v.(${scripts_install_ver}${BRANCH_VERSION})" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1850
                --form --separator='%%%' --width=1000 --height=500 \
1851
                --field=":TXT" "${CHANGLOG_NEWS}" \
1852 1853 1854
                --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 2>/dev/null)
1855
                YAD_STATUS="$?"
1856

1857
                # --button="${translations[EXIT]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png"!"":252 \
1858

Vladislav's avatar
Vladislav committed
1859 1860 1861 1862
                try_remove_file "${PORT_WINE_TMP_PATH}/curent_var_ver"

                case ${YAD_STATUS} in
                    1|252) echo "2" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" && exit 0 ;;
1863 1864 1865
                       16) xcsd="${translations[DO NOT REMIND ME]}" ;;
                       18) xcsd="${translations[REMIND ME LATER]}" ;;
                       20) xcsd="${translations[UPDATING NOW]}" ;;
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1866
                esac
1867 1868
            fi
            case $xcsd in
1869
                "${translations[UPDATING NOW]}")
1870 1871
                    echo "######################################################"
                    print_info "Update scripts..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1872 1873 1874
                    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
1875 1876
                        then
                            create_new_dir "${PORT_WINE_TMP_PATH}/scripts_backup"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1877
                            cd "${PORT_WINE_PATH}/data/" || fatal
1878 1879 1880
                            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/"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1881 1882 1883
                            cp -fr "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}/data_from_portwine/"* "${PORT_WINE_PATH}/data/"
                            try_remove_file "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}.tar.gz"
                            try_remove_dir "${PORT_WINE_TMP_PATH}/PortWINE-${BRANCH}/"
1884
                            echo "${scripts_current_ver}" > "${PORT_WINE_TMP_PATH}/scripts_ver"
1885
                            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
1886 1887
                            echo "Restarting PP after update..."
                            restart_pp
1888 1889
                        fi
                    else
1890
                        yad_error_download && pw_port_update || exit 1
1891
                    fi ;;
1892
                "${translations[REMIND ME LATER]}")
Vladislav's avatar
Vladislav committed
1893
                    echo "2" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
1894
                "${translations[DO NOT REMIND ME]}")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1895
                    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier" ;;
1896
            esac
1897 1898
        fi
    fi
1899
    return 0
1900 1901
}

1902
update_winetricks () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1903
    W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
1904 1905
    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
1906
    W_TRX_INT_VER="$(grep -i 'WINETRICKS_VERSION=' "${PORT_WINE_TMP_PATH}/winetricks" | sed 's/WINETRICKS_VERSION=//')"
1907
    print_info "Version winetricks in port: ${W_TRX_INT_VER}"
1908 1909
    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" ]]
1910 1911
    then
        try_remove_file "${PORT_WINE_TMP_PATH}/winetricks"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1912
        if try_download "${W_TRX_URL}" "${PORT_WINE_TMP_PATH}/winetricks" no_mirror ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1913 1914
            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})"
1915 1916
            chmod u+x "${PORT_WINE_TMP_PATH}/winetricks"
        fi
1917
    fi
1918
    if  [[ -f "${PORT_WINE_TMP_PATH}/winetricks" ]] ; then
1919 1920
        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
1921
        sed -i 's/w_metadata vcrun2019 dlls \\/w_metadata !dont_use_2019! dlls \\/' "${PORT_WINE_TMP_PATH}/winetricks"
1922
        sed -i 's/w_set_winver win2k3/w_set_winver win7/' "${PORT_WINE_TMP_PATH}/winetricks"
1923
    fi
1924
    return 0
1925 1926 1927
}

edit_db_from_gui () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1928
    if [[ "${PW_DISABLED_CREATE_DB}" == "1" ]] ; then
1929 1930 1931
        print_warning "Skipped edit_db_from_gui"
        return 0
    fi
1932
    print_info "edit_db_from_gui PORTWINE_DB_FILE=$PORTWINE_DB_FILE"
1933
    if [[ -n "$PORTWINE_DB_FILE" ]] \
1934 1935
    && [[ -f "$PORTWINE_DB_FILE" ]]
    then
Vladislav's avatar
Vladislav committed
1936 1937 1938
        for mod_db in "$@" ; do
            grep -q "export ${mod_db}=" "${PORTWINE_DB_FILE}" || echo "export ${mod_db}=\"${!mod_db}\"" >> "${PORTWINE_DB_FILE}"
            sed -i "s|^export ${mod_db}=.*|export ${mod_db}=\"${!mod_db}\"|" "${PORTWINE_DB_FILE}"
1939 1940
        done
    fi
1941
    return 0
1942
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1943

1944 1945
edit_user_conf_from_gui () {
    for mod_db in $@ ; do
1946 1947 1948 1949 1950 1951
        if ! grep "export ${mod_db}=" "${USER_CONF}" &>/dev/null
        then echo "export ${mod_db}=\"${!mod_db}\"" >> "${USER_CONF}"
        elif grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#" &>/dev/null
        then
            if [[ "$(grep "export ${mod_db}=" "${USER_CONF}" | grep -v "#")" != "export ${mod_db}=\"${!mod_db}\"" ]]
            then sed -ri "s/^export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/" "${USER_CONF}"
1952
            fi
1953 1954
        elif [[ "$(grep "export ${mod_db}=" "${USER_CONF}")" != "export ${mod_db}=${!mod_db}" ]]
        then sed -ri "s/.*export ${mod_db}=.*/export ${mod_db}=\"${!mod_db}\"/g" "${USER_CONF}"
1955 1956 1957 1958 1959
        fi
    done
    return 0
}

castro-fidel's avatar
castro-fidel committed
1960
pw_create_gui_png () {
1961
    basename_portwine_exe="$(basename "${portwine_exe}")"
Vladislav's avatar
Vladislav committed
1962
    if echo "$basename_portwine_exe" | grep -ie 'setup\|install\|\.msi$' &>/dev/null ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1963
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/setup.png"
1964 1965
        export name_desktop_png="setup"
        return 0
Vladislav's avatar
Vladislav committed
1966
    elif echo "$basename_portwine_exe" | grep -ie '\.reg$' &>/dev/null ; then
1967 1968 1969
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/reg.png"
        export name_desktop_png="reg"
        return 0
Vladislav's avatar
Vladislav committed
1970
    elif echo "$basename_portwine_exe"| grep -ie '\.bat$' &>/dev/null ; then
1971 1972
        export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/bat.png"
        export name_desktop_png="bat"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1973 1974 1975
        return 0
    fi

1976 1977 1978
    if [[ -z "$PORTPROTON_NAME" ]] \
    || [[ "$PW_NO_RESTART_PPDB" == "1" ]]
    then
1979
        if [[ -n "${PORTWINE_CREATE_SHORTCUT_NAME}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
1980
            PORTPROTON_NAME="${PORTWINE_CREATE_SHORTCUT_NAME}"
1981
        else
1982
            if command -v exiftool &>/dev/null ; then
1983 1984
                if ! PW_PRODUCTNAME=$(timeout 3 exiftool -ProductName "${portwine_exe}" 2>/dev/null | sed -n 's/^Product Name\s*:\s*//p') ; then
                    print_error "exiftool - broken!"
1985
                    if [[ -n "$PW_DEBUG" ]] ; then
1986 1987 1988 1989 1990
                        debug_timer --start
                        timeout 5 exiftool -ProductName "${portwine_exe}"
                        debug_timer --end "exiftool"
                    fi
                fi
1991
            else
1992 1993
                print_warning "use portable exiftool"
                PW_PRODUCTNAME=$(env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" -ProductName "${portwine_exe}" | sed -n 's/^Product Name\s*:\s*//p')
1994 1995
            fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
1996 1997 1998 1999 2000 2001
            if [[ "$PW_PRODUCTNAME" =~ "Launcher" ]] \
            || [[ "$PW_PRODUCTNAME" =~ "RU" ]]
            then
                PW_PRODUCTNAME="$(echo "$PW_PRODUCTNAME" | sed 's/Launcher\|RU//g')"
            fi

2002
            if [[ -n "$PW_PRODUCTNAME" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2003
            && [[ "$PW_PRODUCTNAME" != Bootstrap* ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2004 2005 2006
            then
                PORTPROTON_NAME="$PW_PRODUCTNAME"
            else
2007
                PORTPROTON_NAME="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2008
            fi
2009
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2010

2011
        PORTPROTON_NAME="$(echo "${PORTPROTON_NAME}" | sed "s/\`//g" | sed "s/\"//g" | sed "s/'//g" | sed "s/\!//g")"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2012 2013
        export PORTPROTON_NAME
        edit_db_from_gui PORTPROTON_NAME
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2014
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2015

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2016
    resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2017

2018
    PORTPROTON_NAME_PNG="${PORTPROTON_NAME// /_}"
castro-fidel's avatar
castro-fidel committed
2019
    if [[ -z "${PW_ICON_FOR_YAD}" ]] ; then
2020
        if [[ -n "$(file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}")" ]] ; then
2021
            export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png"
2022
        else
castro-fidel's avatar
castro-fidel committed
2023
            export PW_ICON_FOR_YAD="${PW_GUI_ICON_PATH}/port_proton.png"
2024
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2025 2026
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2027 2028 2029 2030

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2034 2035 2036
    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/"

2037
    pw_start_progress_bar_block "${translations[Searching for .exe files... Please wait.]}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2038
    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
2039
    awk -F"/prefixes/" '{print $2}' > "${PW_TMPFS_PATH}/tmp_yad_find_exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2040
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2041 2042 2043

    unset FIND_TO_GUI
    while read line; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2044
        FIND_TO_GUI+="${line}%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2045
    done < "${PW_TMPFS_PATH}/tmp_yad_find_exe"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2046

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2047
    IFS="%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2048
    PW_SET_FIND_EXE="$("${pw_yad}" --height="500" --width="800" --list --text-align=center \
2049 2050 2051 2052 2053
    --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} \
    --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
2054
    YAD_STATUS="$?"
2055 2056
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
        if [[ -z "${PW_SET_FIND_EXE}" ]] ; then
2057
            print_info "Restarting..."
Vladislav's avatar
Vladislav committed
2058
            restart_pp
2059
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2060 2061
        exit 0
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2062
    IFS="$orig_IFS"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2063

2064
    if [[ -n "${PW_SET_FIND_EXE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2065 2066
        portwine_exe="${PW_PATH_FOR_FIND}$(echo "${PW_SET_FIND_EXE}" | awk -F'|' '{print $1}')"
        portwine_create_shortcut silent
Vladislav's avatar
Vladislav committed
2067
        restart_pp
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2068
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2069
}
2070 2071 2072 2073

pw_create_unique_exe () {
    BASEDIR_GAME="$(dirname "$portwine_exe")"
    if [[ -d "$BASEDIR_GAME" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2074
        pushd "$BASEDIR_GAME" || fatal
2075
        BASENAME_GAME_EXE="$(basename "$portwine_exe")"
2076
        if [[ -n "$1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2077
            BASENAME_GAME="$(basename "$1" .exe).exe"
2078 2079
            ln -sf "$BASENAME_GAME_EXE" "$BASENAME_GAME"
            export portwine_exe="$BASEDIR_GAME/$BASENAME_GAME"
2080
        elif [[ -n "$PORTWINE_CREATE_SHORTCUT_NAME" ]] ; then
2081 2082
            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
2083
        else
2084 2085
            print_warning "There are no arguments for creating a symbolic link! Skip it..."
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2086
        popd || fatal
2087 2088
    fi
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2089 2090

start_portwine () {
2091
    if [[ "${PW_LOCALE_SELECT}" != "disabled" ]] && [[ -n "${PW_LOCALE_SELECT}" ]] ; then
2092 2093 2094 2095 2096 2097 2098
        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
2099

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2100 2101
    WINEPREFIX="$(readlink -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}")"
    export WINEPREFIX
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2102

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117
    pw_get_pfx () {
        case "${PW_PREFIX_NAME}" in
            PROGRAMS) local FILE_NAME_PFX="progpfx${PROGPFX_VER}" ;;
              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
2118 2119
        fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137
        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"
                    yad_error_download && exit 1 
                fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2138
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2139
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2140 2141 2142 2143
        return 0
    }

    pw_get_pfx
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2144 2145 2146 2147 2148 2149 2150

    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
2151 2152 2153

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

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2158 2159
    pw_init_runtime

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2160 2161 2162 2163 2164 2165
    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
2166
        export GST_GL_WINDOW="surfaceless"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2167 2168
        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
2169
        export MEDIACONV_AUDIO_DUMP_FILE="${PORT_WINE_TMP_PATH}"/gstreamer_tmp/audiov2.foz
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2170 2171 2172 2173 2174 2175 2176
        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
2177 2178 2179 2180 2181
    check_variables VKD3D_DEBUG none
    check_variables DXVK_LOG_LEVEL none
    check_variables VK_LOADER_DEBUG none
    check_variables VKBASALT_LOG_LEVEL none
    check_variables DXVK_NVAPI_LOG_LEVEL none
2182
    if [[ "${PW_LOG}" == 1 ]] \
2183
    || [[ -n "$PW_DEBUG" ]]
2184
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2185 2186 2187 2188 2189 2190 2191 2192 2193
        export WINEDEBUG="fixme-all,err+loaddll,err+dll,err+file,err+reg"
        export WINE_MONO_TRACE="E:System.NotImplementedException"
        export VKBASALT_LOG_LEVEL="error"
    else
        export WINEDEBUG="-all"
        unset WINE_MONO_TRACE
    fi

    pw_wineboot () {
Vladislav's avatar
Vladislav committed
2194 2195
        LIST_NATIVE_WINE_DLL_LINKS="winevulkan ir50_32 wined3d vulkan-1"
        for change_wine_dll in $LIST_NATIVE_WINE_DLL_LINKS ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2196 2197 2198 2199
            try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${change_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${change_wine_dll}.dll"
            try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${change_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${change_wine_dll}.dll"
        done

Vladislav's avatar
Vladislav committed
2200 2201
        LIST_NATIVE_WINE_DLL_COPY="atl100 ntdll shell32"
        for change_wine_dll in $LIST_NATIVE_WINE_DLL_COPY ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2202 2203
            try_copy_file "${WINEDIR}/lib64/wine/x86_64-windows/${change_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${change_wine_dll}.dll"
            try_copy_file "${WINEDIR}/lib/wine/i386-windows/${change_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${change_wine_dll}.dll"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2204
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2205

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2206
        print_info "Used wineboot $@ for prefix: ${PW_PREFIX_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2207
        ${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
2208
        WINEDEBUG="fixme-all,err+loaddll,err+dll,err+file,err+reg" \
Vladislav's avatar
Vladislav committed
2209
        "${WINELOADER}" wineboot $@ &>>"${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220
        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
2221
        if [[ "${PW_PREFIX_NAME}" == "DEFAULT" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2222
            pw_update_pfx_cover_gui
2223
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2224
            pw_wineboot -r
2225
        elif [[ "${PW_CHECK_AUTOINSTALL}" == 1 ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2226 2227
        && [[ "${DISABLE_CP_DEFPFX}" != 1 ]] ; then
            pw_update_pfx_cover_gui
2228
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2229
            pw_wineboot -r
2230
        elif [[ "${PW_CHECK_AUTOINSTALL}" == 1 ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2231 2232
        && [[ "${DISABLE_CP_DEFPFX}" == 1 ]] ; then
            pw_update_pfx_cover_gui
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2233
            unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2234
            pw_wineboot -i
2235
        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
2236
            pw_update_pfx_cover_gui
2237
            unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2238 2239 2240
            pw_wineboot -r
        else
            pw_update_pfx_cover_gui
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2241
            unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2242 2243 2244 2245 2246
            pw_wineboot -i
        fi
    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
2247
        || [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/windows/system32/shell32.dll" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2248 2249 2250
        || ! grep "${PW_WINE_USE}" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver" &>/dev/null
        then
            pw_update_pfx_cover_gui
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2251 2252 2253 2254
            # # HOTFIX - update prefix for vkPlay
            # if echo "$portwine_exe" | grep -i vkplay &>/dev/null
            # then pw_kill_autostart GameCe 5 please & :
            # fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2255 2256 2257
            pw_wineboot -r
        fi
    fi
2258
    rm -f "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2259

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290
    echo "${PW_WINE_USE}" > "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver"

    if [[ "${PW_NO_ESYNC}" == 1 ]]
    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_FUTEX2="1"
        export WINEFSYNC_SPINCOUNT=100
    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_NO_WRITE_WATCH}" == 1 ]] ; then
        export WINE_DISABLE_WRITE_WATCH="1"
    fi

    if [[ "${PW_VULKAN_NO_ASYNC}" == 1 ]] ; then
2291
        export RADV_DEBUG+="llvm "
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2292 2293 2294 2295 2296
        var_vkd3d_config_update single_queue
    fi

    enabled_fake_nvidia_videocard ()
    {
2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330
        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"
                export DXVK_NVAPI_DRIVER_VERSION="53713"
                export DXVK_NVAPI_ALLOW_OTHER_DRIVERS="1"
                export WINEHAGS="1"
                ;;
                
            *)
                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
2331 2332
    }

2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346
    # NVAPI, DLSS AND FAKE DLSS
    if [[ "${PW_USE_FAKE_DLSS_3}" == "1" ]] ; then
        FAKE_DLSS_3_FILES="amd_fidelityfx_dx12.dll amd_fidelityfx_vk.dll dlss-enabler.dll dlss-enabler-upscaler.dll 
        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
2347 2348 2349 2350
        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
2351 2352 2353
        enabled_fake_nvidia_videocard old
        var_winedlloverride_update "nvapi,nvapi64,nvngx=n;_nvngx=;nvcuda=b"
    elif [[ "${PW_USE_NVAPI_AND_DLSS}" == 1 ]] ; then
2354 2355
        DXVK_ENABLE_NVAPI="1"
        try_remove_file "${WINEPREFIX}/drive_c/windows/system32/nvngx.ini"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2356
        FIND_NVNGX="$(dirname $(find /usr/* -type f -name "nvngx.dll" 2>/dev/null | head -n 1 | awk '{print $1}'))"
2357
        if [[ -n "$FIND_NVNGX" ]] ; then
2358 2359
            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
2360
        else
2361 2362
            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
2363 2364 2365 2366
        fi
        enabled_fake_nvidia_videocard 0
        var_winedlloverride_update "nvngx,_nvngx,nvapi,nvapi64=n;nvcuda=b"
    else
2367
        DXVK_ENABLE_NVAPI="0"
2368 2369 2370
        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
2371 2372 2373
        enabled_fake_nvidia_videocard 0
        var_winedlloverride_update "nvngx,_nvngx="
    fi
2374
    export DXVK_ENABLE_NVAPI
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410

    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

    if [[ "${PW_GPU_USE}" != "disabled" ]] ; then
        export DXVK_FILTER_DEVICE_NAME="${PW_GPU_USE}"
        export VKD3D_FILTER_DEVICE_NAME="${PW_GPU_USE}"
    fi

    case "$PW_FORCE_USE_VSYNC" in  # 0-FORCE_OFF, 1-FORCE_ON, 2-BY_DEFAULT
        0)
2411
            export vblank_mode=0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423
            export __GL_SYNC_TO_VBLANK=0
            ;;
        1)
            export vblank_mode=1
            export __GL_SYNC_TO_VBLANK=1
            ;;
        *)
            unset vblank_mode __GL_SYNC_TO_VBLANK
            ;;
    esac

    export int_xneur=0
2424 2425 2426
    if command -v xneur &>/dev/null \
    && pgrep xneur
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2427 2428 2429 2430 2431 2432
        killall xneur
        export int_xneur=1
    fi

    if check_gamescope_session ; then
        export PW_GAMEMODERUN_SLR=""
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2433
    elif [[ "$PW_USE_GAMEMODE" = "1" ]] \
2434
    && [[ -n "$DBUS_SESSION_BUS_ADDRESS"  ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2435
    then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448
        if command -v gamemoded &>/dev/null ; then
            export GAMEMODERUN=1
            PW_GAMEMODERUN_SLR="gamemoderun"
            systemctl enable --now --user gamemoded &>/dev/null
            print_info "Gamemod will be launched."
        elif check_flatpak ; then
            export GAMEMODERUN=1
            PW_GAMEMODERUN_SLR="gamemoderun"
            print_info "Gamemod will be launched."
        elif [[ "$PW_USE_RUNTIME" == 1 ]] ; then
            export GAMEMODERUN=1
            if ! pidof gamemoded &>/dev/null ; then
                GAMEMODEAUTO_NAME="libgamemodeauto.so.0"
2449
                if [[ -n "${PW_LD_PRELOAD}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470
                then export PW_LD_PRELOAD="${PW_LD_PRELOAD}:${GAMEMODEAUTO_NAME}"
                else export PW_LD_PRELOAD="${GAMEMODEAUTO_NAME}"
                fi

                env LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32" \
                "${PW_PLUGINS_PATH}/portable/bin/gamemoded" &>/dev/null &

                print_info "Gamemod will be launched."
                sleep 0.1
            fi
        else
            export GAMEMODERUN=0
            export PW_GAMEMODERUN_SLR=""
        fi
    else
        export GAMEMODERUN=0
        export PW_GAMEMODERUN_SLR=""
        print_info "Gamemod is not installed or disabled in vars script or db file: PW_USE_GAMEMODE=$PW_USE_GAMEMODE"
    fi
    pw_other_fixes

2471
    # enabled BattleEye_Runtime and EasyAntiCheat_Runtime
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
    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" ]] \
2488
    && ! check_wayland_session \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502
    && 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
2503
        || [[ -z "$(grep d3dx9 "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log")" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2504 2505 2506 2507 2508 2509
        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
2510 2511
            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
2512
            var_winedlloverride_update "${d3d_extras_from_plugins}=n"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2513
            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
2514 2515 2516 2517 2518
                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
2519 2520
            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
2521 2522 2523 2524 2525 2526
        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
2527 2528
        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
2529
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2530 2531
    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
2532

2533
    # 3D API
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2534
    unset CP_VKD3D_FILES CP_DXVK_FILES CP_DGV2_FILES CP_WINE_FILES
2535
    unset CP_GALLIUM_NINE_FILES PATH_TO_DXVK_FILES PATH_TO_VKD3D_FILES
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2536
    case "${PW_VULKAN_USE}" in
2537 2538
        0)
            # WINED3D OPENGL
2539
            print_info "Use WINED3D OpenGL"
2540 2541
            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
2542
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
2543 2544 2545
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
2546
            export PW_VKBASALT="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2547
            ;;
2548 2549
        1)
            # STABLE DXVK AND VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2550 2551
            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
2552 2553
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_STABLE_VER}"
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_STABLE_VER}"
Vladislav's avatar
Vladislav committed
2554
            CP_DXVK_FILES="d3d11 d3d10core d3d10_1 d3d10 d3d9 dxgi" # openvr_api_dxvk
2555
            CP_VKD3D_FILES="d3d12 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
2556
            CP_WINE_FILES="d3d12core d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2557
            ;;
2558 2559
        2)
            # NEWEST DXVK AND VKD3D
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2560 2561
            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
2562 2563
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_GIT_VER}"
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2564
            CP_DXVK_FILES="d3d11 d3d10core d3d9 d3d8 dxgi" # openvr_api_dxvk
2565
            CP_VKD3D_FILES="d3d12 d3d12core libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
2566
            CP_WINE_FILES="d3d10_1 d3d10"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2567
            ;;
2568 2569
        3)
            # GALLIUM NINE
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2570
            print_info "Use GALLIUM-NINE (Native DX9 on MESA drivers)"
2571
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
2572
            CP_GALLIUM_NINE_FILES="d3d9"
2573
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
2574
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d8 dxgi"
2575 2576 2577
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
2578
            export PW_VKBASALT="0"
2579 2580
            export PW_MANGOHUD="0"
            export PW_WINE_FULLSCREEN_FSR="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2581
            ;;
2582 2583
        4)
            # GALLIUM ZINK
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2584
            print_info "Use GALLIUM-ZINK (OpenGL on MESA vulkan drivers)"
2585 2586
            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
2587
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
2588 2589 2590
            export __GL_YIELD="NOTHING"
            export mesa_glthread="true"
            export WINE_D3D_CONFIG="renderer=gl"
2591 2592
            export  __GLX_VENDOR_LIBRARY_NAME="mesa"
            export MESA_LOADER_DRIVER_OVERRIDE="zink"
2593
            export GALLIUM_DRIVER="zink"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2594 2595
            if ! check_wayland_session \
            && ! check_gamescope_session \
2596
            && [[ "${PW_GAMESCOPE}" != "1" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2597
            then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2598 2599 2600
                export LIBGL_KOPPER_DRI2="1"
            fi
            ;;
2601 2602
        5)
            # LEGACY DXVK
2603
            print_info "DXVK v.${DXVK_LEGACY_VER} in use"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2604
            PATH_TO_DXVK_FILES="${PW_VULKAN_DIR}/dxvk-${DXVK_LEGACY_VER}"
2605
            PATH_TO_VKD3D_FILES="${PW_VULKAN_DIR}/vkd3d-proton-${VKD3D_GIT_VER}"
2606
            CP_DXVK_FILES="d3d11 d3d10core d3d10_1 d3d10 d3d9 dxgi"
2607
            CP_VKD3D_FILES="libvkd3d-1 libvkd3d-shader-1"
Vladislav's avatar
Vladislav committed
2608
            CP_WINE_FILES="d3d12 d3d12core d3d8"
2609
            ;;
2610 2611
        6)
            # WINED3D VULKAN (DAMAVAND)
2612
            print_info "Use DAMAVAND (DirectX to wined3d vulkan)"
2613 2614
            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
2615
            CP_WINE_FILES="d3d12 d3d12core d3d11 d3d10core d3d10_1 d3d10 d3d9 d3d8 dxgi"
2616
            export WINE_D3D_CONFIG="renderer=vulkan"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2617 2618
            ;;
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2619

2620
    # DGVOODOO2 enable:
2621
    if [[ "${PW_DGVOODOO2}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2622
        print_info "Try create symlink DGVOODOO2 files..."
2623
        PATH_TO_DGV2_FILES="${PW_VULKAN_DIR}/dgvoodoo2-${DGV2_VER}"
Vladislav's avatar
Vladislav committed
2624
        CP_DGV2_FILES="d3d9 d3d8 d3dimm ddraw glide3x glide2x glide"
2625 2626 2627
        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
2628
            rm_from_var CP_DGV2_FILES "d3d9 d3d8"
2629
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2630
            try_force_link_file "${PATH_TO_DGV2_FILES}/x64/d3d9.dll" "${WINEPREFIX}/drive_c/windows/system32/d3d9.dll"
2631
            try_remove_file "${WINEPREFIX}/drive_c/windows/system32/dgVoodoo.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2632
            try_force_link_file "${DGV2CONF}" "${WINEPREFIX}/drive_c/windows/system32/dgVoodoo.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2633 2634
            case "${PW_VULKAN_USE}" in
                0)
Vladislav's avatar
Vladislav committed
2635
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2636 2637 2638
                    ;;
                1)
                    rm_from_var CP_DXVK_FILES "d3d9"
Vladislav's avatar
Vladislav committed
2639
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2640 2641
                    ;;
                2)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2642
                    rm_from_var CP_DXVK_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2643 2644 2645
                    ;;
                3)
                    rm_from_var CP_GALLIUM_NINE_FILES "d3d9"
Vladislav's avatar
Vladislav committed
2646
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2647 2648
                    ;;
                4)
Vladislav's avatar
Vladislav committed
2649
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2650 2651 2652
                    ;;
                5)
                    rm_from_var CP_DXVK_FILES "d3d9"
Vladislav's avatar
Vladislav committed
2653
                    rm_from_var CP_WINE_FILES "d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2654 2655
                    ;;
                6)
Vladislav's avatar
Vladislav committed
2656
                    rm_from_var CP_WINE_FILES "d3d9 d3d8"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2657 2658
                    ;;
            esac
2659
        fi
2660 2661 2662 2663 2664 2665 2666

        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

2667
        for wine_dgv2_dll in $CP_DGV2_FILES ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2668
            try_force_link_file "${PATH_TO_DGV2_FILES}/x32/${wine_dgv2_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_dgv2_dll}.dll"
2669 2670 2671
            var_winedlloverride_update "${wine_dgv2_dll}=n"
        done
        # DGVOODOO2 settings:
2672
        if [[ "${PW_DGV2_USE_DX12}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2673
            if [[ "${PW_VULKAN_USE}" == "1" ]] || [[ "${PW_VULKAN_USE}" == "2" ]]
2674
            then sed -i "s/OutputAPI = d3d11_fl11_0/OutputAPI = d3d12_fl12_0/" "$DGV2CONF"
2675 2676
            fi
        fi
2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692

        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"
2693
        [[ "${PW_DGV2_FASTMEMORY}" == "1" ]] && sed -i "s/FastVideoMemoryAccess = false/FastVideoMemoryAccess = true/" "$DGV2CONF"
2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710

        if [[ "${PW_DGV2_FORCE_VSYNC}" == "1" ]] ; then
            sed -i "s/ForceVerticalSync = false/ForceVerticalSync = true/" "$DGV2CONF"
        fi

        [[ "${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"

2711
        if [[ "${PW_DGV2_FILTERING}" != "disabled" ]] ; then
2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759
            [[ "${PW_DGV2_FILTERING}" == "Point sampled" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = pointsampled/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Bilinear" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = bilinear/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Linear mip" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = linearmip/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Trilinear" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = trilinear/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Anisotropic 2x" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = 2/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Anisotropic 4x" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = 4/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Anisotropic 8x" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = 8/" "$DGV2CONF"
            [[ "${PW_DGV2_FILTERING}" == "Anisotropic 16x" ]] && sed -i "s/\<Filtering = appdriven\>/Filtering = 16/" "$DGV2CONF"
            case "${PW_DGV2_FILTERING}" in
            "Point sampled")
                sed -i "s/TMUFiltering = appdriven/TMUFiltering = pointsampled/" "$DGV2CONF" ;;
            "Bilinear"|"Linear mip"|"Trilinear"|"Anisotropic 2x"|"Anisotropic 4x"|"Anisotropic 8x"|"Anisotropic 16x")
                sed -i "s/TMUFiltering = appdriven/TMUFiltering = bilinear/" "$DGV2CONF" ;;
            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"
2760
        fi
2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780

        if [[ "${PW_DGV2_RESOLUTION}" != "disabled" ]] ; then
            if [[ "${PW_DGV2_RESOLUTION}" == "2x app resolution" ]] ; then
                sed -i "s/Resolution = unforced/Resolution = 2x/g" "$DGV2CONF"
            elif [[ "${PW_DGV2_RESOLUTION}" == "3x app resolution" ]] ; then
                sed -i "s/Resolution = unforced/Resolution = 3x/g" "$DGV2CONF"
            elif [[ "${PW_DGV2_RESOLUTION}" == "4x app resolution" ]] ; then
                sed -i "s/Resolution = unforced/Resolution = 4x/g" "$DGV2CONF"
            else
                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"
            fi
        fi

        if [[ "${PW_DGV2_DISPLAY_ROI}" != "disabled" ]] ; then
            sed -i "s/DisplayROI =/DisplayROI = ${PW_DGV2_DISPLAY_ROI}, pos:centered/" "$DGV2CONF"
        fi

        [[ "${PW_DGV2_FPS_LIMIT}" != "disabled" ]] && sed -i "s/FPSLimit = 0/FPSLimit = ${PW_DGV2_FPS_LIMIT}/" "$DGV2CONF"
2781 2782
        [[ "${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"
2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 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

        if [[ "${PW_DGV2_RESAMPLING}" != "disabled" ]] ; then
            [[ "${PW_DGV2_RESAMPLING}" == "Point sampled" ]] && sed -i "s/Resampling = bilinear/Resampling = pointsampled/" "$DGV2CONF"
            [[ "${PW_DGV2_RESAMPLING}" == "Lanczos-2" ]] && sed -i "s/Resampling = bilinear/Resampling = lanczos-2" "$DGV2CONF"
            [[ "${PW_DGV2_RESAMPLING}" == "Bicubic" ]] && sed -i "s/Resampling = bilinear/Resampling = bicubic" "$DGV2CONF"
            [[ "${PW_DGV2_RESAMPLING}" == "Lanczos-3" ]] && sed -i "s/Resampling = bilinear/Resampling = lanczos-3" "$DGV2CONF"
        fi

        if [[ "${PW_DGV2_VIDEOCARD}" != "dgVoodoo2 Virtual 3D" ]] ; then
            [[ "${PW_DGV2_VIDEOCARD}" == "dgVoodoo2 SVGA 3D" ]] && sed -i "s/VideoCard = internal3D/VideoCard = svga/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "Geforce 4 Ti 4800" ]] && sed -i "s/VideoCard = internal3D/VideoCard = geforce_ti_4800/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "ATI Radeon 8500" ]] && sed -i "s/VideoCard = internal3D/VideoCard = ati_radeon_8500/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "Matrox Parhelia-512" ]] && sed -i "s/VideoCard = internal3D/VideoCard = matrox_parhelia-512/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "GeForce FX 5700 Ultra" ]] && sed -i "s/VideoCard = internal3D/VideoCard = geforce_fx_5700_ultra/" "$DGV2CONF"
            [[ "${PW_DGV2_VIDEOCARD}" == "GeForce 9800 GT" ]] && sed -i "s/VideoCard = internal3D/VideoCard = geforce_9800_gt/" "$DGV2CONF"
            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"
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]] ; then
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 4/" "$DGV2CONF"
                else
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 2/" "$DGV2CONF"
                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"
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]] ; then
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 4/" "$DGV2CONF"
                else
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 2/" "$DGV2CONF"
                fi
            fi
            if [[ "${PW_DGV2_VIDEOCARD}" == "Voodoo 2" ]] ; then
                if [[ "${PW_DGV2_ONBOARD_RAM}" == "1" ]] ; then
                    sed -i "s/OnboardRAM = 8/OnboardRAM = 12/" "$DGV2CONF"
                fi
            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
2828
        fi
2829 2830 2831 2832

        [[ "${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"
2833 2834 2835 2836
    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
2837
        add_to_var CP_WINE_FILES "ddraw"
2838 2839
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2840 2841 2842 2843 2844
    # 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
2845

Vladislav's avatar
Vladislav committed
2846 2847
    print_info "Try create symlink WINE files..."
    for copy_wine_dll in $CP_WINE_FILES ; do
2848 2849
        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
2850
    done
2851

2852
    if [[ -n "$CP_DXVK_FILES" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2853
        print_info "Try create symlink DXVK files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2854
        for wine_dxvk_dll in $CP_DXVK_FILES ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2855
            if [[ -f "${PATH_TO_DXVK_FILES}/x64/${wine_dxvk_dll}.dll"  ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2856 2857
                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
2858 2859 2860
                var_winedlloverride_update "${wine_dxvk_dll}=n"
            fi
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2861 2862 2863 2864
        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
2865

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2866
    if [[ "$DXVK_ENABLE_NVAPI" == "1" ]] ; then
Vladislav's avatar
Vladislav committed
2867
        print_info "Try create symlink NVAPI files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2868 2869
        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
2870
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2871

2872
    if [[ -n "$CP_VKD3D_FILES" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2873
        print_info "Try create symlink VKD3D files..."
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2874 2875
        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
2876 2877
                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
2878 2879 2880 2881 2882 2883 2884
                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

2885
    if [[ "$CP_GALLIUM_NINE_FILES" == "d3d9" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2886
        print_info "Try create symlink GALLIUM_NINE files..."
2887
        PATH_TO_GALLIUM_NINE_FILES="${PW_PLUGINS_PATH}/gallium_nine_v.${PW_GALLIUM_NINE_VER}"
2888 2889
        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"
2890 2891 2892
        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)
2893
            if [[ -n "$FIND_D3D_MODULE" ]] ; then
2894 2895
                IFS=$'\n'
                for D3D_MP in $FIND_D3D_MODULE ; do
2896
                    if [[ -n "$D3D_MODULE_PATH" ]]
2897 2898 2899 2900
                    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
2901
                IFS="$orig_IFS"
2902 2903 2904
                print_info "D3D_MODULE_PATH=${D3D_MODULE_PATH}"
            else
                pw_stop_progress_bar
2905
                yad_error "${translations[d3dadapter9.so.1.0.0 - Not found in the system.\\nInstall the missing package: <b>d3dadapter9</b>]}"
2906 2907 2908 2909 2910
                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
2911
        fi
2912
        var_winedlloverride_update "d3d9=n"
2913 2914
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2915 2916
    if [[ ! -d "${WINEPREFIX}/drive_c/vrclient/bin" ]] ; then
        create_new_dir "${WINEPREFIX}/drive_c/vrclient/bin"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2917 2918
        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
2919 2920
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2921
    if [[ "${PW_USE_SHADER_CACHE}" == "1" ]] ; then
2922
        create_new_dir "${PW_VULKAN_DIR}/gl_shader_cache"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2923 2924 2925 2926
        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
2927
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2928 2929 2930
        export __GL_SHADER_DISK_CACHE="0"
        export DXVK_STATE_CACHE="disable"
        export VKD3D_SHADER_CACHE_PATH="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2931 2932
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2933
    if [[ "${PW_WINE_FULLSCREEN_FSR}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2934
    && ! check_gamescope_session
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2935 2936 2937 2938
    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
2939
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2940
        export WINE_FULLSCREEN_FSR="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2941 2942 2943 2944 2945 2946 2947
        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

2948 2949 2950 2951
    if [[ "${PW_MESA_GL_VERSION_OVERRIDE}" != "disabled" ]] ; then
        export MESA_GL_VERSION_OVERRIDE="${PW_MESA_GL_VERSION_OVERRIDE}"
    fi

2952 2953 2954 2955
    if [[ "${PW_VKD3D_FEATURE_LEVEL}" != "disabled" ]] ; then
        export VKD3D_FEATURE_LEVEL="${PW_VKD3D_FEATURE_LEVEL}"
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
2956
    #run_winetricks_from_db
2957
    if [[ -n "${PW_MUST_HAVE_DLL}" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2958
    then export 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)} }' )"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2959 2960
    fi

2961
    if [[ -n "${PW_DLL_INSTALL}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2962 2963
        export PW_DLL_NEED_INSTALL=""
        export USE_WT_FROM_DB=0
2964
        if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986
            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
2987 2988
            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
2989
            print_info "Try to install DLL in prefix: ${PW_DLL_NEED_INSTALL}"
2990
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Vladislav's avatar
Vladislav committed
2991
            "${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
2992 2993 2994 2995 2996 2997
            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
2998
    && [[ -z $(grep "Windows $PW_WINDOWS_VER" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg") ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
2999
    then
3000
        if [[ -n "${PW_WINDOWS_VER}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3001 3002
        && [[ $(echo "$PW_WINDOWS_VER" | sed 's/.*/\L&/') == "xp" ]]
        then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3003 3004
            export PW_WINDOWS_VER="xp64"
        fi
3005
        ${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
3006
        "${WINELOADER}" winecfg -v $(echo "win${PW_WINDOWS_VER}" | sed 's/.*/\L&/')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3007 3008 3009 3010 3011 3012 3013 3014 3015
        wait_wineserver
        kill_portwine
        echo "Set to win${PW_WINDOWS_VER}"
    fi

    if [[ "${portwine_exe}" == *-Shipping.exe ]] ; then
        echo "Disable EAC"
        [[ -z "${LAUNCH_PARAMETERS}" ]] && export LAUNCH_PARAMETERS+=" -eac-nop-loaded "
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3016

Llein's avatar
Llein committed
3017 3018
    HIDRAW_VAR="$(grep "DisableHidraw" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg")"
    SDL_VAR="$(grep "Enable SDL" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg")"
Llein's avatar
Llein committed
3019
    if [[ "${PW_DINPUT_PROTOCOL}" == "1" ]] ; then
Llein's avatar
Llein committed
3020
        if [[ "$HIDRAW_VAR" ]] \
Llein's avatar
Llein committed
3021 3022
        && [[ "$SDL_VAR" ]]
        then
Llein's avatar
Llein committed
3023 3024
            if [[ "${HIDRAW_VAR: -1}" != "0" ]] ; then
                sed -i "s/${HIDRAW_VAR}/${HIDRAW_VAR%?}0/" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg"
Llein's avatar
Llein committed
3025 3026
            fi

Llein's avatar
Llein committed
3027 3028
            if [[ "${SDL_VAR: -1}" != "0" ]] ; then
                sed -i "s/${SDL_VAR}/${SDL_VAR%?}0/" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg"
Llein's avatar
Llein committed
3029 3030
            fi
        else
3031
            print_info "Added DisableHidraw = 0 to reg file"
3032
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Llein's avatar
Llein committed
3033
            "${WINELOADER}" reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus" /v "DisableHidraw" /t REG_DWORD /d 0 /f
3034
            print_info "Added Enable SDL = 0 to reg file"
3035
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Llein's avatar
Llein committed
3036
            "${WINELOADER}" reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus" /v "Enable SDL" /t REG_DWORD /d 0 /f
Llein's avatar
Llein committed
3037 3038
        fi
    else
3039
        # var_winedlloverride_update "xinput1_1,xinput1_2,xinput1_3,xinput9_1_0=b"
Llein's avatar
Llein committed
3040

Llein's avatar
Llein committed
3041
        if [[ "$HIDRAW_VAR" ]] \
Llein's avatar
Llein committed
3042 3043
        && [[ "$SDL_VAR" ]]
        then
Llein's avatar
Llein committed
3044 3045
            if [[ "${HIDRAW_VAR: -1}" != "1" ]] ; then
                sed -i "s/${HIDRAW_VAR}/${HIDRAW_VAR%?}1/" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg"
Llein's avatar
Llein committed
3046
            fi
Llein's avatar
Llein committed
3047

Llein's avatar
Llein committed
3048 3049
            if [[ "${SDL_VAR: -1}" != "1" ]] ; then
                sed -i "s/${SDL_VAR}/${SDL_VAR%?}1/" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/system.reg"
Llein's avatar
Llein committed
3050 3051
            fi
        else
3052
            print_info "Added DisableHidraw = 1 to reg file"
3053
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Llein's avatar
Llein committed
3054
            "${WINELOADER}" reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus" /v "DisableHidraw" /t REG_DWORD /d 1 /f
3055
            print_info "Added Enable SDL = 1 to reg file"
3056
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
Llein's avatar
Llein committed
3057
            "${WINELOADER}" reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus" /v "Enable SDL" /t REG_DWORD /d 1 /f
Llein's avatar
Llein committed
3058
        fi
3059 3060
    fi

3061 3062 3063
    WINE_WAYLAND_VAR="$(grep "x11,wayland" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg")"
    if [[ "${PW_USE_NATIVE_WAYLAND}" == "1" ]] ; then
        if [[ ! "$WINE_WAYLAND_VAR" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3064
            print_info "Enable experimental Wayland support"
3065 3066 3067 3068 3069 3070 3071 3072
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
            "${WINELOADER}" reg add "HKEY_CURRENT_USER\Software\Wine\Drivers" /v "Graphics" /t REG_SZ /d "x11,wayland" /f
        fi
        export PW_DISPLAY="env DISPLAY="
        export PW_USE_RUNTIME="0"
    else
        unset PW_DISPLAY
        if [[ "$WINE_WAYLAND_VAR" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3073
            print_info "Disable experimental Wayland support"
3074
            ${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
3075
            "${WINELOADER}" reg delete "HKEY_CURRENT_USER\Software\Wine\Drivers" /v Graphics /f
3076 3077 3078
        fi
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3079 3080 3081 3082
    if [[ "${PW_SOUND_DRIVER_USE}" != "disabled" ]] \
    && grep -v "\"Audio\"=\"$PW_SOUND_DRIVER_USE\"" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg" &>/dev/null
    then
        if grep "\"Audio\"=" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg" &>/dev/null ; then
3083 3084 3085 3086 3087
            sed -i 's/"Audio"=".*"/"Audio"="'${PW_SOUND_DRIVER_USE}'"/' "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg"
        else
            echo -e '\n[Software\\Wine\\Drivers]\n"Audio"="'${PW_SOUND_DRIVER_USE}'"' >> "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg"
        fi
        kill_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3088 3089 3090 3091 3092
    elif [[ "${PW_SOUND_DRIVER_USE}" == "disabled" ]] \
    && grep -v "\"Audio\"=" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg" &>/dev/null
    then
        sed -i '/\[Software\\Wine\\Drivers\]/d' "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg" &>/dev/null
        sed -i "/\"Audio\"=/d" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/user.reg" &>/dev/null
3093 3094
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3095 3096 3097 3098
    pw_stop_progress_bar &&
    if ! check_start_from_steam ; then
        pw_tray_icon
        sleep 0.5
3099
        if [[ "${PW_CHECK_AUTOINSTALL}" != "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3100
            pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3101 3102 3103 3104 3105 3106 3107 3108
        fi
    fi
    add_in_start_portwine

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

3109 3110
    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
3111 3112 3113
            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}"
3114 3115
        fi
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3116

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127
    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
3128 3129
        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
3130 3131 3132
        fi
    fi

3133
    # GAMESCOPE enable:
3134 3135 3136 3137 3138 3139 3140
    if [[ "${PW_GAMESCOPE}" == "1" && "${GAMESCOPE_INSTALLED}" == "1" ]] \
    || check_gamescope_session
    then
        export vk_xwayland_wait_ready="false"
        if [[ -d /sys/bus/pci/drivers/amdgpu ]] ; then
            export RADV_DEBUG+="nodcc "
            export AMD_DEBUG="nodcc"
Vladislav's avatar
Vladislav committed
3141
            if ! grep -q VK_EXT_image_drm_format_modifier "${PW_TMPFS_PATH}/vulkaninfo.tmp" ; then
3142 3143 3144 3145
                export R600_DEBUG="nodcc"
                grep -e '--backend' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null && PW_GS_BACKEND_SDL="1"
            fi
        fi
3146
        if [[ -d /sys/bus/pci/drivers/i915 ]] ; then
3147 3148 3149 3150
            export INTEL_DEBUG="norbc"
        fi
    fi
    if [[ "${PW_GAMESCOPE}" == "1" && "${GAMESCOPE_INSTALLED}" == "1" ]] \
3151 3152 3153
    && ! check_gamescope_session
    then
        if [[ "${PW_GPU_USE}" != "disabled" ]] ; then
3154 3155
            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
3156
            PW_ID_VIDEO=" --prefer-vk-device ${PW_vendorID}:${PW_deviceID}"
3157
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3158
            PW_ID_VIDEO=""
3159
        fi
3160

3161
        #checkbox
3162
        unset PW_GAMESCOPE_ARGS_NEW
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3163 3164
        [[ "${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
3165
        [[ "${PW_GS_BORDERLESS_WINDOW}" == "1" ]] &&  PW_GAMESCOPE_ARGS_NEW+=" -b"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3166
        [[ "${PW_GS_FORCE_GRAB_CURSOR}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" --force-grab-cursor"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3167
        [[ "${PW_GS_FORCE_GRAB_KEYBOARD}" == "1" ]] && PW_GAMESCOPE_ARGS_NEW+=" -g"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3168

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3169
        if [[ "${PW_GS_HDR_ENABLE}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3170
            PW_GAMESCOPE_ARGS_NEW+=" --hdr-enabled"
3171 3172
            export DXVK_HDR="1"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3173

3174 3175
        [[ "${PW_GS_ENABLE_GAMESCOPE_WSI}" == "1" ]] && export ENABLE_GAMESCOPE_WSI="1"

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192
        [[ "${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"

3193 3194 3195 3196 3197 3198
        #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
3199
            PW_GAMESCOPE_ARGS_NEW+=" -W ${PWGSRESSW} -H ${PWGSRESSH}"
3200 3201 3202 3203

            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
3204 3205
                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
3206
                PW_GAMESCOPE_ARGS_NEW+=" -w ${PWGSRESIW} -h ${PWGSRESIH}"
3207 3208
            fi
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3209 3210

        [[ "${PW_GS_FRAME_LIMIT}" != "disabled" ]] && PW_GAMESCOPE_ARGS_NEW+=" -r ${PW_GS_FRAME_LIMIT}"
3211 3212 3213 3214 3215

        if [[ "${PW_GS_MESA_VK_WSI_PRESENT_MODE}" != "disabled" ]] ; then
            export MESA_VK_WSI_PRESENT_MODE=${PW_GS_MESA_VK_WSI_PRESENT_MODE}
        fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3216 3217 3218
        [[ "${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}"

3219 3220 3221
        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
3222
                PW_GAMESCOPE_ARGS_NEW+=" -F ${PW_GS_FILTER_MODE}"
3223 3224
            else
                if [[ "${PW_GS_FILTER_MODE}" == "fsr" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3225
                    PW_GAMESCOPE_ARGS_NEW+=" -U"
3226
                elif [[ "${PW_GS_FILTER_MODE}" == "nis" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3227
                    PW_GAMESCOPE_ARGS_NEW+=" -Y"
3228 3229
                fi
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3230
            PW_GAMESCOPE_ARGS_NEW+=" --sharpness ${PW_GS_UPSCALE_SHARPNESS}"
3231
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3232 3233 3234 3235 3236 3237

        [[ "${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}"

3238
        edit_db_from_gui PW_GAMESCOPE_ARGS_NEW
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3239
        export PW_RUN_GAMESCOPE="gamescope${PW_ID_VIDEO}${PW_GAMESCOPE_ARGS_NEW} --"
3240 3241
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3242 3243 3244 3245 3246 3247
    pw_mangohud_check
    pw_vkbasalt_check
}

pw_run () {
    unset GDK_BACKEND
3248
    if [[ -n "${PATH_TO_GAME}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3249 3250 3251 3252 3253 3254 3255
    && [[ -d "${PATH_TO_GAME}" ]]
    then
        cd "${PATH_TO_GAME}" || fatal
    elif [[ -f "$portwine_exe" ]]
    then
        PATH_TO_GAME="$( cd "$( dirname "${portwine_exe}" )" >/dev/null 2>&1 && pwd )"
        cd "${PATH_TO_GAME}" || fatal
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3256
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3257
        cd "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c" || fatal
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3258
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3259 3260
    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
3261
    print_var "WINEDIR" "WINEPREFIX" "WINEDLLOVERRIDES" "PATH_TO_GAME" "PW_WINE_USE" "PW_VULKAN_USE" "VULKAN_DRIVER_NAME"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3262
    print_var "VKD3D_CONFIG" "PW_LD_LIBRARY_PATH" "PATH" "WINEESYNC" "WINEFSYNC" "WINEFSYNC_FUTEX2"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3263 3264 3265 3266 3267 3268 3269 3270
    print_var "WINEDLLPATH" "WINE_CPU_TOPOLOGY" "PW_RUN_GAMESCOPE" "LD_LIBRARY_PATH"
    kill -s SIGUSR1 "$PW_YAD_PID_PFX_COVER_UI" &>/dev/null
    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
3271
            [[ -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
3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283
            echo "-" >> "${PW_LOG_TO_FILE}"
            echo "Log WINE:" >> "${PW_LOG_TO_FILE}"
            echo ""
            print_info "Log from RUNTIME and WINE:"
            ${PW_RUN_GAMESCOPE} \
            ${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} \
3284
            ${PW_DISPLAY} \
3285
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS[@]} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302
        else
            if [[ "$PW_USE_TERMINAL" == 1 ]] \
            && [[ "$PW_USE_RUNTIME" == 1 ]]
            then
                export PW_ADD_TO_ARGS_IN_RUNTIME="--xterm"
                pw_init_runtime
            fi
            echo ""
            echo "Log WINE:" > "${PW_LOG_TO_FILE}"
            ${PW_RUN_GAMESCOPE} \
            ${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} \
3303
            ${PW_DISPLAY} \
3304
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS[@]} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3305
            print_info "Update prefix log:"
Vladislav's avatar
Vladislav committed
3306
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3307 3308
            echo
            print_info "Log from RUNTIME and WINE:"
3309
            awk '! a[$0]++' "${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3310 3311 3312 3313 3314 3315
            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
3316
            [[ -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
3317 3318 3319 3320 3321
            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
3322 3323 3324 3325
            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}" \
3326
            ${PW_RUN_GAMESCOPE} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3327 3328
            ${PW_GAMEMODERUN_SLR} \
            ${PW_MANGOHUD_SLR} \
3329
            ${PW_DISPLAY} \
3330
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS[@]} &>>"${PW_LOG_TO_FILE}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3331 3332 3333
            wait_wineserver
        else
            print_info "Update prefix log:"
Vladislav's avatar
Vladislav committed
3334
            [[ -f "${PW_TMPFS_PATH}/update_pfx_log" ]] && cat "${PW_TMPFS_PATH}/update_pfx_log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3335 3336 3337 3338
            echo ""
            echo "Log WINE:" > "${PW_LOG_TO_FILE}"
            print_info "Log WINE:"
            env FAKE_VAR= \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3339 3340 3341 3342
            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}" \
3343
            ${PW_RUN_GAMESCOPE} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3344 3345
            ${PW_GAMEMODERUN_SLR} \
            ${PW_MANGOHUD_SLR} \
3346
            ${PW_DISPLAY} \
3347
            "${WINELOADER}" "$@" ${LAUNCH_PARAMETERS[@]}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3348 3349 3350 3351 3352
            wait_wineserver
        fi
    fi
}
export -f pw_run
3353

3354
pw_yad_set_form () {
3355
    if [[ $(<"${PW_TMPFS_PATH}/tmp_yad_form") != "" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3356
        PW_YAD_SET=$(head -n 1 "${PW_TMPFS_PATH}/tmp_yad_form" | awk '{print $1}')
3357 3358 3359 3360 3361
        export PW_YAD_SET
    fi
}

pw_yad_form_vulkan () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3362
    if [[ "$(<"${PW_TMPFS_PATH}/tmp_yad_form_vulkan")" != "" ]] ; then
3363
        if [[ -n "${KEY_START}" ]] ; then
3364 3365 3366 3367 3368 3369 3370 3371 3372 3373
            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
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3374
        if [[ -z "${PW_PREFIX_NAME}" ]] \
3375
        || [[ -n "$(echo "${PW_PREFIX_NAME}" | grep -E '^_.*' )" ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3376
        then
3377 3378 3379 3380 3381 3382 3383 3384
            PW_PREFIX_NAME="DEFAULT"
        else
            PW_PREFIX_NAME="${PW_PREFIX_NAME^^}"
        fi
        export PW_PREFIX_NAME PW_WINE_VER VULKAN_MOD
    fi
}

3385 3386
portwine_launch () {
    start_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3387
    unset PW_VD_TMP
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3388
    if [[ "${PW_VIRTUAL_DESKTOP}" == "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3389
        PW_VD_TMP=(explorer "/desktop=PortProton,${PW_SCREEN_RESOLUTION}")
3390
    fi
3391 3392

    case "$portwine_exe" in
3393
        *.[Ee][Xx][Ee])
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3394 3395
            pw_run ${PW_VD_TMP[@]} ${WINE_WIN_START} "$portwine_exe"
        ;;
3396
        *.[Bb][Aa][Tt])
3397
            PW_USE_TERMINAL=1
3398
            pw_run ${PW_VD_TMP[@]} "$portwine_exe"
3399
        ;;
3400
        *.[Mm][Ss][Ii])
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3401
            pw_run ${PW_VD_TMP[@]} msiexec /i "$portwine_exe"
3402
        ;;
3403
        *.[Rr][Ee][Gg])
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3404
            pw_run ${PW_VD_TMP[@]} regedit "$portwine_exe"
3405 3406
        ;;
        *)
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3407
            pw_run ${PW_VD_TMP[@]} winefile
3408 3409
        ;;
    esac
3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425
}

pw_winecfg () {
    start_portwine
    export GST_PLUGIN_SYSTEM_PATH_1_0=""
    pw_run winecfg
}

pw_winefile () {
    start_portwine
    pw_run winefile
}

pw_winecmd () {
    export PW_USE_TERMINAL=1
    start_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3426
    cd "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c" || fatal
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3427
    pw_run cmd
3428 3429 3430 3431 3432 3433 3434 3435 3436 3437
    stop_portwine
}

pw_winereg () {
    start_portwine
    export GST_PLUGIN_SYSTEM_PATH_1_0=""
    pw_run regedit
}

pw_start_cont_xterm () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3438
    cd "$HOME" || fatal
3439 3440 3441 3442 3443 3444 3445 3446
    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} \
3447
    ${PW_TERM} bash
3448 3449
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3450
# GUI INFO
3451 3452
yad_info () {
    print_info "$@"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3453 3454 3455
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
3456
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3457
    "${pw_yad}" --no-wrap --text "$@" --width=400 --height=150 --borders=15 --title "INFO" \
Vladislav's avatar
Vladislav committed
3458
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3459
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/info.svg" \
3460
    --text-align=center --fixed \
3461
    --button="${translations[OK]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png" 2>/dev/null
3462 3463 3464
}
export -f yad_info

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3465
# GUI ERROR
3466 3467
yad_error () {
    print_error "$@"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3468 3469 3470
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
3471
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3472
    "${pw_yad}" --no-wrap --text "$@" --width=400 --height=150 --borders=15 --title "ERROR" \
Vladislav's avatar
Vladislav committed
3473
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3474
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/error.svg" \
3475
    --text-align=center --fixed \
3476
    --button="${translations[EXIT]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png" 2>/dev/null
3477 3478 3479 3480
}
export -f yad_error

yad_error_download () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3481 3482 3483
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
3484
    fi
3485 3486
    "${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
3487
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3488
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/download.svg" \
3489
    --no-wrap --text-align=center \
3490 3491
    --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
3492 3493 3494
    [[ "$?" != 0 ]] && return 1 || return 0
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3495
# GUI QUESTIONS
3496
yad_question () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3497 3498 3499
    if [[ ! -f "${pw_yad}" ]] ; then
        local pw_yad="yad"
        command -v "${pw_yad}" &>/dev/null || fatal "yad not found"
3500
    fi
3501
    "${pw_yad}" --text "${1}" --width=400 --height=150 --borders=15 --title "${translations[Choices]}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3502
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --image="$PW_GUI_ICON_PATH/question.svg" \
Vladislav's avatar
Vladislav committed
3503
    --gui-type-layout="${YAD_INFO_GUI_TYPE_LAYOUT}" \
3504
    --no-wrap --text-align=center --fixed \
3505 3506
    --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
3507 3508 3509 3510 3511 3512
    [[ "$?" != 0 ]] && return 1 || return 0
}

pw_start_progress_bar_cover () {
    if ! check_start_from_steam ; then
        PW_GIF_FILE="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3513 3514
        PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}')
        PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}')
3515
        "${pw_yad}" --picture --filename="${PW_GIF_FILE}" --close-on-unfocus --no-buttons --undecorated \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3516
        --skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 &
3517 3518 3519 3520 3521 3522 3523
        export PW_YAD_PID_PROGRESS_BAR_COVER="$!"
        return 0
    fi
}

pw_start_progress_bar_cover_block () {
    if ! check_start_from_steam ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3524
        [[ ! -f "${pw_yad}" ]] && local pw_yad="yad"
3525
        PW_GIF_FILE="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3526 3527
        PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}')
        PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}')
3528
        "${pw_yad}" --picture --filename="${PW_GIF_FILE}" --close-on-unfocus --no-buttons --undecorated \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3529
        --skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 &
3530 3531 3532 3533 3534 3535 3536
        export PW_YAD_PID_PROGRESS_BAR_COVER_BLOCK="$!"
        return 0
    fi
}

pw_update_pfx_cover_gui () {
    if [[ "$1" == "winetricks" ]] ; then
3537
        TAB_PLACE="--tab=${translations[TERMINAL]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png --tab=${translations[LOGO]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png"
3538 3539 3540 3541
        TAB_N1=2
        TAB_N2=1
        YAD_UNDECORATED=""
    else
3542
        TAB_PLACE="--tab=${translations[LOGO]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png --tab=${translations[TERMINAL]}!$PW_GUI_ICON_PATH/$TAB_SIZE.png"
3543 3544
        TAB_N1=1
        TAB_N2=2
3545
        YAD_UNDECORATED="--undecorated"
3546
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3547

3548 3549 3550
    if ! check_start_from_steam \
    && ! pgrep -a yad | grep "yad_gui_pp --notebook --key=$PW_KEY_PROGRESS_BAR_UP" &>/dev/null
    then
3551
        PW_KEY_PROGRESS_BAR_UP=$RANDOM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3552
        PW_GIF_FILE="${COVERS_PATH}/update_prefix_${LANGUAGE_GIF}.gif"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3553
        PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 20}')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3554
        PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 65}')
Vladislav's avatar
Vladislav committed
3555
        echo "UPDATE PREFIX..." > "${PW_TMPFS_PATH}/update_pfx_log"
3556
        export PW_TIMER=0
3557
        while read -r line || [[ -n $(pgrep -a yad | grep "yad_gui_pp --notebook --key=$PW_KEY_PROGRESS_BAR_UP" | awk '{print $1}') ]] ; do
3558
                sleep 0.005
3559
                if [[ -n "${line}" ]] && [[ -z "$(echo "${line}" | grep -i "gstreamer")" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3560 3561
                                        && [[ -z "$(echo "${line}" | grep -i "kerberos")" ]] \
                                        && [[ -z "$(echo "${line}" | grep -i "ntlm")" ]]
3562 3563 3564 3565 3566 3567 3568
                then
                    echo "# ${line}"
                fi
                if [[ "${PW_TIMER}" != 1 ]] ; then
                    sleep 3
                    PW_TIMER=1
                fi
Vladislav's avatar
Vladislav committed
3569
        done < "${PW_TMPFS_PATH}/update_pfx_log" | "${pw_yad}" --plug=$PW_KEY_PROGRESS_BAR_UP --tabnum=$TAB_N2 --text-info --tail  2>/dev/null &
3570
        "${pw_yad}" --plug=$PW_KEY_PROGRESS_BAR_UP --tabnum=$TAB_N1 --picture --filename="${PW_GIF_FILE}" 2>/dev/null &
3571

3572
        "${pw_yad}" --notebook --key="$PW_KEY_PROGRESS_BAR_UP" $TAB_PLACE --no-buttons \
3573 3574
        --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 &
3575 3576 3577 3578 3579 3580 3581
        export PW_YAD_PID_PFX_COVER_UI="$!"
        return 0
    fi
}

pw_start_progress_bar_cs () {
    if ! check_start_from_steam ; then
3582 3583
        "${pw_yad}" --progress-old --text="$@
        " --pulsate --hide-text --close-on-unfocus --borders="$PROGRESS_BAR_BORDERS_SIZE" \
3584
        --no-buttons --undecorated --skip-taskbar \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3585 3586
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
3587 3588 3589 3590 3591 3592 3593 3594
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
        export PW_YAD_PID_PROGRESS_BAR_CS="$!"
        return 0
    fi
}

pw_start_progress_bar_block () {
    if ! check_start_from_steam ; then
3595 3596
        "${pw_yad}" --progress-old --text="$@
        " --pulsate --hide-text --borders="$PROGRESS_BAR_BORDERS_SIZE" \
3597
        --no-buttons --undecorated --skip-taskbar \
3598
        --no-escape --text-align="center" --height=90 --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3599 3600
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
3601 3602 3603 3604 3605 3606
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
        export PW_YAD_PID_PROGRESS_BAR_BLOCK="$!"
        return 0
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3607 3608
pw_start_progress_bar_install_game () {
    if ! check_start_from_steam ; then
3609
        "${pw_yad}" --progress-old --text="${translations[Please wait. Installing the]} $@
3610
        " --pulsate --hide-text --borders="$PROGRESS_BAR_BORDERS_SIZE" \
3611
        --no-buttons --undecorated --skip-taskbar \
3612
        --no-escape --text-align="center" --height=90 --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3613 3614 3615 3616 3617 3618 3619 3620
        --width="$PROGRESS_BAR_WIDTH_SIZE" \
        --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
        export PW_YAD_PID_PROGRESS_BAR_BLOCK="$!"
        return 0
    fi
}

3621
pw_stop_progress_bar () {
3622
    sleep 0.1
3623 3624 3625 3626 3627
    for PW_KILL_YAD_PID in "$PW_YAD_PID_PROGRESS_BAR_BLOCK" "$PW_YAD_PID_PROGRESS_BAR_CS" \
                           "$PW_YAD_PID_PFX_COVER_UI" "$PW_YAD_PID_PROGRESS_BAR_COVER"
    do
        kill -s SIGUSR1 "$PW_KILL_YAD_PID" &>/dev/null
    done
3628 3629
    unset PW_YAD_PID_PROGRESS_BAR_BLOCK PW_YAD_PID_PROGRESS_BAR_CS \
    PW_YAD_PID_PFX_COVER_UI PW_YAD_PID_PROGRESS_BAR_COVER
3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646
    return 0
}
export -f pw_stop_progress_bar

pw_stop_progress_bar_cover () {
    kill -s KILL "$PW_YAD_PID_PROGRESS_BAR_COVER" &>/dev/null
    return 0
}
export -f pw_stop_progress_bar_cover

pw_stop_progress_bar_cover_block () {
    kill -s KILL "$PW_YAD_PID_PROGRESS_BAR_COVER_BLOCK" &>/dev/null
    return 0
}
export -f pw_stop_progress_bar_cover_block

open_changelog () {
3647
    [[ "$LANGUAGE" == ru ]] && local PW_CHANGELOG_FILE="changelog_ru" || local PW_CHANGELOG_FILE="changelog_en"
3648
    "${pw_yad}" --title="${translations[CHANGELOG]}" --no-buttons \
3649 3650 3651
    --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
3652
    YAD_STATUS="$?"
Vladislav's avatar
Vladislav committed
3653

Vladislav's avatar
Vladislav committed
3654
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] && [[ -z "$WINEPREFIX" ]] ; then
3655
        print_info "Restarting..."
Vladislav's avatar
Vladislav committed
3656
        restart_pp
Vladislav's avatar
Vladislav committed
3657 3658
    else
        exit 0
3659
    fi
3660 3661 3662 3663
}
export -f open_changelog

pw_tray_icon () {
Vladislav's avatar
Vladislav committed
3664
    if [[ "$XDG_SESSION_TYPE" == "tty" ]] ; then
3665
        if [[ -n "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')" ]] ; then
Vladislav's avatar
Vladislav committed
3666 3667 3668
            kill -s SIGUSR1 "$(pgrep -a yad_gui_pp | grep "\--notification" | awk '{print $1}')"
        fi
    else
3669
        if [[ -n "$(pgrep -a tray_gui_pp)" ]] ; then
Vladislav's avatar
Vladislav committed
3670 3671
            kill -s SIGUSR1 $(pgrep -a tray_gui_pp) 2>/dev/null
        fi
3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689
    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
3690 3691 3692 3693 3694 3695 3696 3697 3698 3699
    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="| \
3700 3701 3702 3703
        ${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
3704 3705 3706 3707
    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
3708 3709 3710 3711

    return 0
}

3712
# GUI GET OTHER WINE
3713
gui_proton_downloader () {
3714
    unset VERSION_WINE_GIT VERSION_INSTALLED_WINE URL_VERSION_PROTON_GIT GIVE_WINE_URL
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3715 3716 3717 3718 3719 3720
    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"
3721

3722
    if [[ "$PW_WINE_USE" == PROTON_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3723
    then PW_WINE_USE="${PW_PROTON_LG_VER}"
3724
    elif [[ "$PW_WINE_USE" == WINE_*_LG ]] || [[ "$PW_WINE_USE" == WINE_LG ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3725
    then PW_WINE_USE="${PW_WINE_LG_VER}"
3726
    elif [[ "$1" == "silent" ]] && [[ -n "$2" ]]
3727
    then PW_WINE_USE="$2"
3728
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3729
    export PW_WINE_USE
3730

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3731 3732
    if [[ "$1" == "silent" ]] \
    && [[ -d "${PORT_WINE_PATH}/data/dist/${PW_WINE_USE}" ]] ; then
3733 3734
        return 0
    fi
3735

3736
    pw_start_progress_bar_block "${translations[Check new version WINE...]}"
3737

3738 3739
    # PROTON_GE
    export 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))
3740
    if [[ -n "${PROTON_GE_GIT}" ]] ; then
3741
        for PGEGIT in ${PROTON_GE_GIT[@]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3742
            echo ${PGEGIT} | awk -F/ '{print $NF}' | sed 's/.tar.gz//' >> "${PW_TMPFS_PATH}/tmp_proton_ge_git"
3743
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3744 3745 3746
        sed -i '/Proton-6.5-GE-2/,$d' "${PW_TMPFS_PATH}/tmp_proton_ge_git"
        sed -i '/github-action/d' "${PW_TMPFS_PATH}/tmp_proton_ge_git"
        sed -i '/^$/d' "${PW_TMPFS_PATH}/tmp_proton_ge_git"
3747 3748 3749 3750
    fi

    # WINE_KRON4EK
    export WINE_KRON4EK=($(curl -s "https://api.github.com/repos/Kron4ek/Wine-Builds/releases" | grep "browser_download_url.*\.tar\.xz" | cut -d \" -f 4))
3751
    if [[ -n "${WINE_KRON4EK}" ]] ; then
3752
        for PGEGIT in ${WINE_KRON4EK[@]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3753
            echo ${PGEGIT} | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
3754
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3755 3756
        sed -i '/6.3/,$d' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
        sed -i '/-x86/d' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
3757
        sed -i '/-wow64/d' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3758
        sed -i '/^$/d' "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
3759 3760 3761 3762
    fi

    # WINE_GE_CUSTOM
    export 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))
3763
    if [[ -n "${WINE_GE_CUSTOM}" ]] ; then
3764
        for PGEGIT in ${WINE_GE_CUSTOM[@]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3765
            echo ${PGEGIT} | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
3766
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3767 3768
        sed -i '/6.23/,$d' "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
        sed -i '/^$/d' "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
3769 3770 3771
    fi

    # PROTON_LG
3772
    export 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))
3773
    if [[ -n "${PROTON_PW_GIT}" ]] ; then
3774
        for PPWGIT in ${PROTON_PW_GIT[@]} ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3775
            echo ${PPWGIT} | awk -F/ '{print $NF}' | sed 's/.tar.xz//' >> "${PW_TMPFS_PATH}/tmp_proton_pw_git"
3776
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3777 3778 3779
        sed -i /${PW_WINE_LG_VER}/d "${PW_TMPFS_PATH}/tmp_proton_pw_git"
        sed -i '/plugins/d' "${PW_TMPFS_PATH}/tmp_proton_pw_git"
        sed -i '/^$/d' "${PW_TMPFS_PATH}/tmp_proton_pw_git"
3780 3781
    fi
    pw_stop_progress_bar
3782

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3783
    if [[ -z "${PROTON_PW_GIT}" ]] ; then
3784
        yad_error "${translations[Error: check wine.]}"
Vladislav's avatar
Vladislav committed
3785
        restart_pp
3786
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3787 3788 3789

    pushd "${PORT_WINE_PATH}/data/dist/" || fatal
    for INSTALLING_VERSION_IN_DIST in * ; do
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3790 3791 3792 3793
        sed -i "/${INSTALLING_VERSION_IN_DIST}$/Id" "${PW_TMPFS_PATH}/tmp_proton_pw_git"
        sed -i "/${INSTALLING_VERSION_IN_DIST}$/Id" "${PW_TMPFS_PATH}/tmp_proton_ge_git"
        sed -i "/${INSTALLING_VERSION_IN_DIST}$/Id" "${PW_TMPFS_PATH}/tmp_wine_kron4ek_git"
        sed -i "/${INSTALLING_VERSION_IN_DIST}$/Id" "${PW_TMPFS_PATH}/tmp_wine_ge_custom_git"
3794
    done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3795
    popd 1>/dev/null || fatal
3796

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3797 3798 3799 3800
    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' ' ')"
3801

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

3805 3806 3807
    if [[ "$1" != "silent" ]] ; then
        # GUI
        export KEY_WINE=$RANDOM
3808 3809

        "${pw_yad}" --plug=$KEY_WINE --tabnum=1 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
3810
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
3811 3812
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
3813
        $TMP_PROTON_PW_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3814
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
3815 3816 3817
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=2 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
3818
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
3819 3820
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
3821
        $TMP_PROTON_KR_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3822
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
3823 3824 3825
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=3 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
3826
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
3827 3828
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
3829
        $TMP_PROTON_GE_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3830
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
3831 3832 3833
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=4 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
3834
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
3835 3836
        --column "${translations[Set]}" \
        --column "${translations[Select WINE for download:]}" \
3837
        $TMP_PROTON_CU_GIT \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3838
        1>> "${PW_TMPFS_PATH}/tmp_set_wine" \
3839 3840 3841
        2>/dev/null &

        "${pw_yad}" --plug=$KEY_WINE --tabnum=5 --list --checklist --separator="" \
Vladislav's avatar
Vladislav committed
3842
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
3843 3844
        --column "${translations[Set]}" \
        --column "${translations[Select installed WINE for delete:]}" \
3845
        $TMP_INSTALLED_WINE \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3846
        1> "${PW_TMPFS_PATH}/tmp_installed_wine_set" \
3847 3848
        2>/dev/null &

Vladislav's avatar
Vladislav committed
3849
        "${pw_yad}" --key=$KEY_WINE --notebook --width=500 --height=600 --text-align=center \
3850
        --gui-type="settings-notebook" \
3851
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[WINE MANAGER]}" --separator="" --expand \
3852
        --tab-pos="top" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3853 3854 3855 3856
        --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"!"" \
3857 3858 3859
        --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
3860 3861
        YAD_WINE_STATUS="$?"
        if [[ "$YAD_WINE_STATUS" == "1" || "$YAD_WINE_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
3862
            restart_pp
3863
        fi
3864
        if [[ -n $(<"${PW_TMPFS_PATH}/tmp_set_wine") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3865
            VERSION_WINE_GIT="$(sed 's/TRUE//' "${PW_TMPFS_PATH}/tmp_set_wine")"
3866
        fi
3867
        if [[ -n $(<"${PW_TMPFS_PATH}/tmp_installed_wine_set") ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3868
            VERSION_INSTALLED_WINE="$(sed 's/TRUE//' "${PW_TMPFS_PATH}/tmp_installed_wine_set")"
3869 3870
        fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3871 3872
        if [[ -z "${VERSION_WINE_GIT}" ]] \
        && [[ -z "${VERSION_INSTALLED_WINE}" ]]
3873
        then
3874
            print_info "Nothing to do."
Vladislav's avatar
Vladislav committed
3875
            restart_pp
3876 3877
        fi

3878
    elif [[ "$1" == "silent" ]] && [[ -n "$2" ]] ; then
3879 3880 3881
        VERSION_WINE_GIT="$2"
    fi

3882 3883 3884 3885 3886 3887
    pw_download_get_wine () {
        print_info "Download and install ${VERSION_WINE_GIT}..."
        FILENAME="$(basename "${URL_VERSION_PROTON_GIT}")"
        if try_download "${URL_VERSION_PROTON_GIT}" "${PORT_WINE_PATH}/data/tmp/$FILENAME" ; then
            if unpack "${PORT_WINE_PATH}/data/tmp/${FILENAME}" "${PORT_WINE_PATH}/data/dist/" ; then
                try_remove_file "${PORT_WINE_PATH}/data/tmp/${FILENAME}"
3888
                if [[ -n "${portwine_exe}" ]] ; then
3889 3890 3891 3892 3893 3894 3895 3896
                    PW_WINE_USE="$(echo "${VERSION_WINE_GIT}" | tr [[:lower:]] [[:upper:]])"
                    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
                then gui_proton_downloader $@
3897
                else
3898 3899
                    export PW_WINE_VER="$PW_WINE_USE"
                    init_wine_ver
3900 3901
                fi
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3902
        else
3903 3904 3905 3906 3907 3908 3909 3910 3911
            if yad_error_download
            then gui_proton_downloader $@
            else
                export PW_WINE_VER="$PW_WINE_USE"
                init_wine_ver
            fi
        fi
    }

3912
    if [[ -n "${VERSION_INSTALLED_WINE}" ]] ; then
3913 3914 3915
        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
3916
        if [[ -z "${VERSION_WINE_GIT}" ]] ; then
Vladislav's avatar
Vladislav committed
3917
            restart_pp
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3918
        fi
3919 3920
    fi

Mikhail Tergoev's avatar
Mikhail Tergoev committed
3921
    VERSION_WINE_GIT=$(echo ${VERSION_WINE_GIT})
3922
    if [[ "$1" != "silent" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3923 3924
        for GIVE_ALL_WINE in ${VERSION_WINE_GIT} ; do
            for GIVE_WINE_URL in ${WINE_GE_CUSTOM[@]} ${PROTON_GE_GIT[@]} ${WINE_KRON4EK[@]} ${PROTON_PW_GIT[@]} ; do
3925
                if [[ -n $(echo ${GIVE_WINE_URL} | grep -i "${GIVE_ALL_WINE}") ]] ; then
3926 3927 3928 3929 3930
                    export URL_VERSION_PROTON_GIT="${GIVE_WINE_URL}"
                fi
            done
            pw_download_get_wine
        done
3931
        edit_db_from_gui
Vladislav's avatar
Vladislav committed
3932
        restart_pp
3933
    else
3934 3935
        # init_wine_ver
        print_error "$PW_WINE_USE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
3936
        for GIVE_WINE_URL in ${WINE_GE_CUSTOM[@]} ${PROTON_GE_GIT[@]} ${WINE_KRON4EK[@]} ${PROTON_PW_GIT[@]} ; do
3937
            if [[ -n $(echo ${GIVE_WINE_URL} | grep -i "${PW_WINE_USE}") ]] ; then
3938 3939 3940 3941
                export URL_VERSION_PROTON_GIT="${GIVE_WINE_URL}"
            fi
        done
        pw_download_get_wine
3942 3943 3944 3945
    fi
}
export -f gui_proton_downloader

3946 3947 3948
# GUI EDIT_DB
gui_edit_db () {
    KEY_EDIT_DB_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
3949
    PW_EDIT_DB_LIST=(PW_MANGOHUD PW_MANGOHUD_USER_CONF PW_VKBASALT PW_VKBASALT_USER_CONF PW_DGVOODOO2 PW_GAMESCOPE
3950 3951 3952 3953 3954
    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
3955
    )
3956
    # PW_USE_FAKE_DLSS_3
3957 3958

    if check_wayland_session ; then
Vladislav's avatar
Vladislav committed
3959
        unset 'PW_EDIT_DB_LIST[20]' # "PW_USE_US_LAYOUT"
Vladislav's avatar
Vladislav committed
3960
    else
Vladislav's avatar
Vladislav committed
3961
        unset 'PW_EDIT_DB_LIST[31]' # "PW_USE_NATIVE_WAYLAND"
3962
    fi
Vladislav's avatar
Vladislav committed
3963

3964
    if check_flatpak ; then
Vladislav's avatar
Vladislav committed
3965
        unset 'PW_EDIT_DB_LIST[29]' # "PW_USE_RUNTIME"
3966 3967 3968 3969
    fi

    # PW_FORCE_USE_VSYNC PW_HEAP_DELAY_FREE

3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008
    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_FORCE_USE_VSYNC_INFO=${translations[Forced activation of vertical sync]}
    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)]}
    PW_USE_GAMEMODE_INFO=${translations[Using automatic system optimization to improve performance in games (provided the gamemode package is installed on the system)]}
    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
4009 4010 4011 4012 4013 4014 4015
<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
4016
<b>Super + C :</b> Update clipboard]}
4017

4018 4019 4020
    case "${PW_VULKAN_USE}" in
        0)
            # WineD3D OpenGL
4021
            VKD3D_CB="DCB"
4022 4023 4024 4025
            DISABLE_EDIT_DB_LIST="PW_VKBASALT PW_VKBASALT_USER_CONF PW_USE_RAY_TRACING PW_USE_OBS_VKCAPTURE
            "
            ;;
        1|2)
4026
            # Stable, Newest
4027
            VKD3D_CB="CB"
4028 4029 4030
            ;;
        3)
            # Gallium Nine
4031
            VKD3D_CB="DCB"
4032 4033 4034 4035 4036 4037
            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
4038
            VKD3D_CB="DCB"
4039 4040 4041 4042 4043
            DISABLE_EDIT_DB_LIST="PW_USE_RAY_TRACING
            "
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4044
    unset ADD_CHK_BOX_EDIT_DB
Vladislav's avatar
Vladislav committed
4045
    for int_to_boole in ${PW_EDIT_DB_LIST[@]} ; do
4046
        if [[ "${!int_to_boole}" == "1" ]]
4047 4048
        then export ${int_to_boole}="TRUE"
        else export ${int_to_boole}="FALSE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4049 4050
        fi
        TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
4051 4052 4053 4054
        int_to_boole_non_pw="${int_to_boole//PW_/}"
        int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
        if [[ ! "${PW_VULKAN_USE}" == [12] ]] \
        && [[ "${DISABLE_EDIT_DB_LIST}" =~ ${int_to_boole} ]]
4055
        then ADD_CHK_BOX_EDIT_DB+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
4056 4057
        else ADD_CHK_BOX_EDIT_DB+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:${THEME_CHKBOX}%${!int_to_boole}%"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4058
    done
4059 4060 4061

    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
4062
    1> "${PW_TMPFS_PATH}/tmp_output_yad_edit_db" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4063
    IFS="$orig_IFS"
4064 4065

    case ${PW_WINDOWS_VER} in
4066 4067 4068 4069
         "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" ;;
4070 4071
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4072 4073 4074
    if [[ "${PW_WINE_CPU_TOPOLOGY}" == *[0-9]:* ]] \
    && [[ "${PW_WINE_CPU_TOPOLOGY}" != "disabled" ]]
    then
Vladislav's avatar
Vladislav committed
4075
        CPU_LIMIT_VAR="${PW_WINE_CPU_TOPOLOGY%%:*}"
4076 4077 4078 4079 4080
    else
        CPU_LIMIT_VAR="disabled"
    fi

    "${pw_yad}" --plug=$KEY_EDIT_DB_GUI --tabnum="2" --form --separator="%" --columns=1 \
4081 4082 4083
    --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)
4084 4085 4086 4087 4088 4089 4090 4091

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>
4092
    * library= - disable the use of this library]} :CBE" "$(combobox_fix --empty "${WINEDLLOVERRIDES}" "libglesv2=!d3dx9_36,d3dx9_42=n,b;mfc120=b,n")" \
4093
    --field=":LBLH" "" \
4094
    --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")" \
4095
    --field=":LBLH" "" \
4096 4097 4098 4099 4100 4101 4102 4103
    --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}")" \
    --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.6!4.5COMPAT!4.5!3.3COMPAT!3.3")" \
    --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")" \
    --field="${translations[Force certain locale for an app:]}!${translations[Fixes encoding issues in legacy software]} :CB" "$(combobox_fix --disabled "${PW_LOCALE_SELECT}" "$LOCALE_LIST")" \
    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 \
    --text "${translations[Change settings in database file for]} <b>${PORTWINE_DB}</b>\n ${translations[<b>NOTE:</b> To display help for each item, simply hover your mouse over the text]}" \
4104
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --separator=" " --expand \
4105
    --gui-type="settings-base" \
Vladislav's avatar
Vladislav committed
4106
    --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" \
4107 4108 4109 4110 4111 4112
    --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
4113 4114 4115
    YAD_STATUS="$?"

    case "$YAD_STATUS" in
4116
        1|252)
Vladislav's avatar
Vladislav committed
4117
            restart_pp
Vladislav's avatar
Vladislav committed
4118 4119 4120
            ;;
        2)
            try_remove_file "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
4121
            restart_pp
Vladislav's avatar
Vladislav committed
4122 4123 4124 4125
            ;;
        150)
            gui_edit_db_file
            ;;
4126 4127
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4128
    output_yad_edit_db=($(<"${PW_TMPFS_PATH}/tmp_output_yad_edit_db"))
Vladislav's avatar
Vladislav committed
4129 4130
    bool_from_yad="0"
    for boole_to_int in ${PW_EDIT_DB_LIST[@]} ; do
4131
        export ${boole_to_int}="${output_yad_edit_db[$bool_from_yad]}"
4132
        if [[ "${!boole_to_int}" == "TRUE" ]]
4133 4134
        then export ${boole_to_int}="1"
        else export ${boole_to_int}="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4135
        fi
Vladislav's avatar
Vladislav committed
4136
        export bool_from_yad=$(( bool_from_yad + 1 ))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4137
    done
4138

Vladislav's avatar
Vladislav committed
4139
    PW_ADD_SETTINGS=$(<"${PW_TMPFS_PATH}/tmp_output_yad_fps_limit")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4140

Vladislav's avatar
Vladislav committed
4141 4142 4143 4144 4145 4146 4147 4148
    PW_WINDOWS_VER="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $1}')"
    PW_DLL_INSTALL="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $2}')"
    WINEDLLOVERRIDES="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $3}')"
    LAUNCH_PARAMETERS="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $5}')"
    CPU_LIMIT="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $7}')"
    PW_MESA_GL_VERSION_OVERRIDE="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $8}')"
    PW_VKD3D_FEATURE_LEVEL="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $9}')"
    PW_LOCALE_SELECT="$(echo "${PW_ADD_SETTINGS}" | awk -F"%" '{print $10}')"
4149 4150

    if [[ "${CPU_LIMIT}" != "disabled" ]] ; then
Vladislav's avatar
Vladislav committed
4151
        PW_WINE_CPU_TOPOLOGY="${CPU_LIMIT}:$(seq -s, 0 $(( CPU_LIMIT - 1 )))"
4152
    else
Vladislav's avatar
Vladislav committed
4153
        PW_WINE_CPU_TOPOLOGY="disabled"
4154
    fi
Vladislav's avatar
Vladislav committed
4155
    export PW_WINE_CPU_TOPOLOGY
4156

Vladislav's avatar
Vladislav committed
4157
    edit_db_from_gui ${PW_EDIT_DB_LIST[@]} LAUNCH_PARAMETERS PW_WINDOWS_VER PW_DLL_INSTALL WINEDLLOVERRIDES PW_WINE_CPU_TOPOLOGY \
4158 4159 4160 4161 4162 4163
    PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PW_LOCALE_SELECT

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

4164
        if [[ -n "$MH_FONT_SIZE" ]]
4165 4166 4167 4168 4169 4170 4171
        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
4172 4173
    if [[ "$YAD_STATUS" == "0" ]] ; then
        print_info "Restarting PP after update ppdb file..."
Vladislav's avatar
Vladislav committed
4174
        restart_pp
Vladislav's avatar
Vladislav committed
4175
    fi
4176 4177
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4178
# GUI VKBASALT
4179
gui_vkbasalt () {
4180 4181
    KEY_FX_GUI=$RANDOM
    FILE_VKBASALT_CONF="${PORT_WINE_PATH}/data/vkBasalt.conf"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4182
    LIST_FX=($(grep -E '.fx$|.fxh$' "${FILE_VKBASALT_CONF}" | awk '{print $1}'))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4183 4184
    GET_FX_IN_FILE=($(echo ${PW_VKBASALT_EFFECTS} | sed s/"cas:"// | sed s/":"/" "/g))

4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239
    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
4240

4241 4242 4243
    unset ADD_GUI_FX GUI_FX_RESULT
    for add_list_fx in ${LIST_FX[@]} ; do
        PW_VKBASALT_GUI_HELP="PW_${add_list_fx}_INFO"
Vladislav's avatar
Vladislav committed
4244
        if [[ ${GET_FX_IN_FILE[*]} =~ ${add_list_fx} ]]; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4245
            ADD_GUI_FX+="--field=${CHKBOX_SPACE}${add_list_fx}!${!PW_VKBASALT_GUI_HELP}:${THEME_CHKBOX}%TRUE%"
4246
        else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4247
            ADD_GUI_FX+="--field=${CHKBOX_SPACE}${add_list_fx}!${!PW_VKBASALT_GUI_HELP}:${THEME_CHKBOX}%FALSE%"
4248 4249
        fi
    done
Vladislav's avatar
Vladislav committed
4250

4251
    if [[ -n "${PW_VKBASALT_FFX_CAS}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4252 4253
        if [[ "$PW_VKBASALT_FFX_CAS" == "0" ]] \
        || [[ "$PW_VKBASALT_FFX_CAS" == "-1" ]]
4254 4255 4256 4257
        then export VKBASALT_FFX_CAS_GUI="0"
        elif [[ "$PW_VKBASALT_FFX_CAS" == "1" ]]
        then export VKBASALT_FFX_CAS_GUI="100"
        elif [[ "$PW_VKBASALT_FFX_CAS" == 0.0* ]]
Vladislav's avatar
Vladislav committed
4258 4259
        then VKBASALT_FFX_CAS_GUI="$(echo "$PW_VKBASALT_FFX_CAS" | awk -F'0.0' '{print $2}')"
        else VKBASALT_FFX_CAS_GUI="$(echo "$PW_VKBASALT_FFX_CAS" | awk -F'0.' '{print $2}')"
4260
        fi
Vladislav's avatar
Vladislav committed
4261
        export VKBASALT_FFX_CAS_GUI
4262 4263 4264
    else
        VKBASALT_FFX_CAS_GUI=66
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4265
    IFS="%"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4266
    "${pw_yad}" --plug=$KEY_FX_GUI --tabnum="1" --form --columns=4 --separator=" " \
4267
    --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
4268
    --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4269
    ${ADD_GUI_FX} 1> "${PW_TMPFS_PATH}/tmp_yad_basalt_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4270
    IFS="$orig_IFS"
4271

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4272
    "${pw_yad}" --plug=$KEY_FX_GUI --tabnum="2" --separator=" " --form \
Vladislav's avatar
Vladislav committed
4273
    --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
4274
    --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
4275
    1> "${PW_TMPFS_PATH}/tmp_yad_cas_set" 2>/dev/null &
4276

4277
    "${pw_yad}" --paned --key="$KEY_FX_GUI" --sensitive --title="vkBasalt" \
4278
    --gui-type="settings-paned" \
4279
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
4280 4281 4282 4283
    --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
4284
    YAD_VKBASALT_STATUS="$?"
4285

4286 4287
    case "${YAD_VKBASALT_STATUS}" in
        1|252)
Vladislav's avatar
Vladislav committed
4288 4289
            restart_pp
            ;;
4290 4291
        178)
            sed -i '/VKBASALT/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
4292 4293
            restart_pp
            ;;
4294
        180)
Vladislav's avatar
Vladislav committed
4295 4296
            export PW_VKBASALT="0"
            ;;
4297
        182)
Vladislav's avatar
Vladislav committed
4298 4299
            export PW_VKBASALT="1"
            ;;
4300
    esac
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4301
    YAD_BASALT_SET=$(<"${PW_TMPFS_PATH}/tmp_yad_basalt_set")
4302
    YAD_CAS_SET=$(sed s/" "//g "${PW_TMPFS_PATH}/tmp_yad_cas_set")
4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314

    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
4315
    then export PW_VKBASALT_FFX_CAS="-1"
4316 4317 4318 4319 4320 4321
    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
4322

4323
    edit_db_from_gui PW_VKBASALT_EFFECTS PW_VKBASALT_FFX_CAS PW_VKBASALT
Vladislav's avatar
Vladislav committed
4324
    restart_pp
4325 4326
}

4327
# GUI MANGOHUD
4328
gui_mangohud () {
4329 4330
    KEY_MH_GUI=$RANDOM
    LIST_MH=(
Vladislav's avatar
Vladislav committed
4331 4332 4333 4334 4335 4336 4337 4338 4339
        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
4340 4341
    )

Vladislav's avatar
Vladislav committed
4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395
    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
4396

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4397
    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
4398 4399
    try_remove_file "${PW_TMPFS_PATH}/tmp_yad_mh_set"
    try_remove_file "${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit"
4400

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

4403
    if [[ -n "$MANGOHUD_CONFIG" ]] ; then
Vladislav's avatar
Vladislav committed
4404
        PW_MANGOHUD_CONFIG=($(echo "$MANGOHUD_CONFIG" | tr ',' '\n' | grep -v '=' | tr [[:lower:]] [[:upper:]]))
4405
    else
Vladislav's avatar
Vladislav committed
4406
        PW_MANGOHUD_CONFIG=($(echo "$DEFAULT_MANGOHUD_CONFIG" | tr ',' '\n' | grep -v '=' | tr [[:lower:]] [[:upper:]]))
4407 4408
    fi

4409
    if [[ -n "$FPS_LIMIT" ]] ; then
Boria138's avatar
Boria138 committed
4410 4411 4412
        PW_FPS_LIMIT_VAR=($(echo "$FPS_LIMIT" | tr '' '\n' | grep -v '='))
    fi

4413 4414
    for add_list_mh in "${LIST_MH[@]}"; do
        PW_MH_GUI_HELP="PW_MH_${add_list_mh}_INFO"
Vladislav's avatar
Vladislav committed
4415 4416
        if [[ ${PW_MANGOHUD_CONFIG[*]} =~ $add_list_mh ]]; then
            ADD_GUI_MH+="--field=${CHKBOX_SPACE}${add_list_mh//"_"/" "}!${!PW_MH_GUI_HELP}:${THEME_CHKBOX}%TRUE%"
4417
        else
Vladislav's avatar
Vladislav committed
4418
            ADD_GUI_MH+="--field=${CHKBOX_SPACE}${add_list_mh//"_"/" "}!${!PW_MH_GUI_HELP}:${THEME_CHKBOX}%FALSE%"
4419 4420 4421
        fi
    done

Boria138's avatar
Boria138 committed
4422
    for add_list_mh_fps in "${GET_REFRESH_RATE[@]}"; do
Vladislav's avatar
Vladislav committed
4423
        if [[ ${PW_FPS_LIMIT_VAR[*]} =~ $add_list_mh_fps ]]; then
Boria138's avatar
Boria138 committed
4424 4425 4426 4427 4428 4429
            ADD_GUI_MH_FPS+="--field=${CHKBOX_SPACE}$add_list_mh_fps:${THEME_CHKBOX}%TRUE%"
        else
            ADD_GUI_MH_FPS+="--field=${CHKBOX_SPACE}$add_list_mh_fps:${THEME_CHKBOX}%FALSE%"
        fi
    done

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4430
    IFS="%"
4431
    "${pw_yad}" --plug=$KEY_MH_GUI --tabnum="1" --form --columns=5 --separator=" " --text-align=center \
4432
        --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
4433
        --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4434
        ${ADD_GUI_MH} 1> "${PW_TMPFS_PATH}/tmp_yad_mh_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4435
    "${pw_yad}" --plug=$KEY_MH_GUI --tabnum="2" --form --columns=10 --separator=" " --text-align=center \
4436
        --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
4437
        --gui-type-text="${PANED_GUI_TYPE_TEXT_DOWN}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4438
        ${ADD_GUI_MH_FPS} 1> "${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4439
    IFS="$orig_IFS"
4440

4441
    "${pw_yad}" --paned --key="$KEY_MH_GUI" --title="MangoHud" \
Vladislav's avatar
Vladislav committed
4442
        --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --sensitive \
4443
        --gui-type="settings-paned" \
4444 4445 4446 4447 4448
        --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
4449
    YAD_MANGOHUD_STATUS="$?"
4450

4451
    case "${YAD_MANGOHUD_STATUS}" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4452
        1|252)
Vladislav's avatar
Vladislav committed
4453
            restart_pp
4454
            ;;
4455 4456 4457
        180)
            sed -i '/FPS_LIMIT/d' "$portwine_exe".ppdb
            sed -i '/MANGOHUD/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
4458 4459
            restart_pp
            ;;
4460 4461
        182)
            export PW_MANGOHUD="0"
4462
            ;;
4463
        186)
4464
            export PW_MANGOHUD="1"
4465 4466 4467
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4468 4469
    YAD_MH_SET=$(<"${PW_TMPFS_PATH}/tmp_yad_mh_set")
    YAD_MH_FPS_LIMIT=$(<"${PW_TMPFS_PATH}/tmp_yad_mh_fps_limit")
4470

Vladislav's avatar
Vladislav committed
4471
    MONITOR_HEIGHT="$(echo "$PW_SCREEN_RESOLUTION" | awk -F'x' '{print $2}')"
4472
    if [[ -n "$MONITOR_HEIGHT" ]]
4473 4474
    then MH_FONT_SIZE="font_size=$(( MONITOR_HEIGHT / 45 ))"
    fi
4475

Vladislav's avatar
Vladislav committed
4476
    INT_COUNT_MH="0"
4477 4478
    for read_list_mh in ${YAD_MH_SET} ; do
        if [[ "$read_list_mh" == "TRUE" ]]
Vladislav's avatar
Vladislav committed
4479
        then GUI_MH_RESULT+="${LIST_MH[$INT_COUNT_MH]},"
4480 4481 4482
        fi
        ((INT_COUNT_MH++))
    done
Vladislav's avatar
Vladislav committed
4483
    GUI_MH_RESULT=$(echo "$GUI_MH_RESULT" | sed 's/ /_/g' | tr '[:upper:]' '[:lower:]')
4484

Vladislav's avatar
Vladislav committed
4485
    INT_COUNT_MH_FPS="0"
Boria138's avatar
Boria138 committed
4486 4487
    for read_list_mh_fps in ${YAD_MH_FPS_LIMIT} ; do
        if [[ "$read_list_mh_fps" == "TRUE" ]]
Vladislav's avatar
Vladislav committed
4488
        then GUI_MH_FPS_RESULT+="${GET_REFRESH_RATE[$INT_COUNT_MH_FPS]}+"
Boria138's avatar
Boria138 committed
4489 4490 4491 4492
        fi
        ((INT_COUNT_MH_FPS++))
    done

4493
    if [[ "$(echo "${GUI_MH_FPS_RESULT}" | awk -F'+' '{print $2}')" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4494
        export FPS_LIMIT="${GUI_MH_FPS_RESULT%+}"
Boria138's avatar
Boria138 committed
4495 4496 4497 4498
        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
4499
        export FPS_LIMIT="${GUI_MH_FPS_RESULT%+}"
Boria138's avatar
Boria138 committed
4500 4501
    fi

4502
    if [[ -n "$MH_FONT_SIZE" ]]
4503 4504 4505 4506
    then GUI_MH_RESULT="${GUI_MH_RESULT}${MH_FONT_SIZE}"
    else GUI_MH_RESULT="${GUI_MH_RESULT%,}"
    fi

4507
    if [[ -n "$FPS_LIMIT" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4508
        GUI_MH_RESULT="${GUI_MH_RESULT},fps_limit=$FPS_LIMIT"
Boria138's avatar
Boria138 committed
4509 4510
    elif [[ "$FPS_LIMIT" == "disabled" ]] ; then
        GUI_MH_RESULT="${GUI_MH_RESULT},fps_limit=0"
4511 4512
    fi

4513
    if [[ "${GUI_MH_RESULT}" =~ "fps_only" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4514
        local GUI_MH_RESULT="fps_only"
4515 4516 4517 4518
        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
4519 4520
    export PW_MANGOHUD FPS_LIMIT
    edit_db_from_gui MANGOHUD_CONFIG PW_MANGOHUD FPS_LIMIT
4521

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4522
    if [[  "${YAD_MANGOHUD_STATUS}" == "184" ]] ; then
4523
        PW_MANGOHUD="1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4524 4525 4526 4527 4528 4529 4530
        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"
4531
        gui_mangohud
4532 4533
    fi

Vladislav's avatar
Vladislav committed
4534
    restart_pp
4535 4536
}

4537
# GUI DGVOODOO2
4538
gui_dgvoodoo2 () {
4539
    KEY_DGV2_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
4540
    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
4541 4542 4543
    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
4544
    )
4545

4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564
    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)]}
4565

4566 4567 4568 4569
    # 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

4570 4571 4572 4573 4574 4575 4576
    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
4577
    unset ADD_CHK_BOX_DGV2
Vladislav's avatar
Vladislav committed
4578
    for int_to_boole in ${PW_DGV2_LIST[@]} ; do
4579
        if [[ "${!int_to_boole}" == "1" ]]
4580 4581
        then export ${int_to_boole}="TRUE"
        else export ${int_to_boole}="FALSE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4582 4583
        fi
        TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
4584 4585 4586 4587
        int_to_boole_non_pw="${int_to_boole//PW_DGV2/}"
        int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
        if [[ ! "${PW_VULKAN_USE}" == [12] ]] \
        && [[ "${DISABLE_DGV2_LIST}" =~ ${int_to_boole} ]]
4588
        then ADD_CHK_BOX_DGV2+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
4589 4590
        else ADD_CHK_BOX_DGV2+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:${THEME_CHKBOX}%${!int_to_boole}%"
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4591
    done
4592

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

4600 4601 4602 4603 4604 4605 4606
    DGVOODOO2_XRANDR="$(grep -e '[0-9]x' "${PW_TMPFS_PATH}/xrandr.tmp" | awk '{print $1}' | sort -rVu | grep "^[0-9]" | tr '\n' ' ')"
    for drop_low in ${DGVOODOO2_XRANDR} ; do
        if (( "${drop_low//x/}" > "1000000" )) ; then
            DGVOODOO2_XRANDR_NEW+="${drop_low}!"
        fi
    done

4607 4608 4609 4610 4611
    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
4612
    --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
4613 4614 4615 4616 4617 4618 4619
    --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)
4620 4621 4622 4623 4624 4625
- 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
4626 4627 4628 4629 4630 4631
- 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)
4632 4633 4634 4635
- Point sampled (unblurred pixels)
- Bilinear (smoothed)
- Lanczos-2 (smoothed but sharper)
- Bicubic (smoothed but sharper)
4636 4637
- 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
4638
    1> "${PW_TMPFS_PATH}/tmp_yad_dgv2_set_cb" 2>/dev/null &
4639

4640
    "${pw_yad}" --paned --key=$KEY_DGV2_GUI --height="350" --title="dgVoodoo2" \
4641
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
4642
    --gui-type="settings-paned" \
4643 4644 4645 4646
    --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 \
4647 4648
    2>/dev/null
    YAD_DGV2_STATUS="$?"
4649

4650 4651
    case "${YAD_DGV2_STATUS}" in
        1|252)
Vladislav's avatar
Vladislav committed
4652
            restart_pp
4653 4654
            ;;
        162)
4655
            sed -i '/PW_DGV2/d' "$portwine_exe".ppdb
4656
            sed -i '/DGVOODOO2/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
4657
            restart_pp
4658 4659
            ;;
        164)
4660
            export PW_DGVOODOO2="0"
4661 4662
            ;;
        166)
4663
            export PW_DGVOODOO2="1"
4664 4665 4666
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4667
    output_yad_dgv2=($(<"${PW_TMPFS_PATH}/tmp_yad_dgv2_set"))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4668
    bool_from_yad=0
Vladislav's avatar
Vladislav committed
4669
    for boole_to_int in ${PW_DGV2_LIST[@]} ; do
4670
        export ${boole_to_int}="${output_yad_dgv2[$bool_from_yad]}"
4671
        if [[ "${!boole_to_int}" == "TRUE" ]]
4672 4673
        then export ${boole_to_int}="1"
        else export ${boole_to_int}="0"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4674
        fi
Vladislav's avatar
Vladislav committed
4675
        export bool_from_yad=$(( bool_from_yad + 1 ))
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4676
    done
4677

Vladislav's avatar
Vladislav committed
4678
    PW_ADD_SETTINGS_DGV2=$(<"${PW_TMPFS_PATH}/tmp_yad_dgv2_set_cb")
4679

Vladislav's avatar
Vladislav committed
4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694
    PW_DGV2_RESOLUTION="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $1}')"
    PW_DGV2_FPS_LIMIT="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $2}')"
    PW_DGV2_FILTERING="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $3}')"
    PW_DGV2_ANTIALIASING="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $4}')"
    PW_DGV2_BIT_DEPTH="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $5}')"
    PW_DGV2_VIDEOCARD="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $6}')"
    PW_DGV2_VRAM="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $7}')"
    PW_DGV2_BRIGHTNESS="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $8}')"
    PW_DGV2_COLOR="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $9}')"
    PW_DGV2_CONTRAST="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $10}')"
    PW_DGV2_DISPLAY_ROI="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $11}')"
    PW_DGV2_RESAMPLING="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $12}')"
    PW_DGV2_CURSOR_SCALE="$(echo "${PW_ADD_SETTINGS_DGV2}" | awk -F"%" '{print $13}')"

    edit_db_from_gui ${PW_DGV2_LIST[@]} PW_DGVOODOO2 PW_DGV2_FILTERING PW_DGV2_ANTIALIASING PW_DGV2_VRAM PW_DGV2_RESOLUTION \
4695 4696
    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
4697

Vladislav's avatar
Vladislav committed
4698
    restart_pp
4699 4700 4701 4702
}

# GUI GAMESCOPE
gui_gamescope () {
4703
    KEY_GS_GUI=$RANDOM
Vladislav's avatar
Vladislav committed
4704
    PW_GS_LIST=(PW_GS_FULLSCREEN PW_GS_FORCE_FULLSCREEN PW_GS_BORDERLESS_WINDOW PW_GS_FORCE_GRAB_CURSOR
4705
    PW_GS_FORCE_GRAB_KEYBOARD PW_GS_HDR_ENABLE PW_GS_ENABLE_GAMESCOPE_WSI PW_GS_HDR_ITM_ENABLE PW_GS_SDR_GAMMUT_WIDENESS
4706
    PW_GS_FORCE_COMPOSITION PW_GS_HDR_FORCE_SUPPORT PW_GS_HDR_FORCE_OUTPUT PW_GS_HDR_FORCE_HEATMAP
4707
    PW_GS_EXPOSE_WAYLAND PW_GS_REALTIME_SCHEDULING
Vladislav's avatar
Vladislav committed
4708
    )
4709

Vladislav's avatar
Vladislav committed
4710
    grep -e '--mangoapp' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null && PW_GS_LIST+=(PW_GS_MANGOAPP)
4711
    grep -e '--backend' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null \
Vladislav's avatar
Vladislav committed
4712
    && PW_GS_LIST+=(PW_GS_BACKEND_SDL) && PW_GS_LIST+=(PW_GS_SDL_VIDEODRIVER_X11)
4713

4714 4715
    GS_FILTER_CB="linear!nearest!fsr!nis!pixel"
    #debian bookworm fix
4716
    if grep -e '-U, --fsr-upscaling' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null ; then
4717 4718
        GS_FILTER_CB="fsr!nis"
        export PW_GS_FILTER_MODE_OLD="true"
Vladislav's avatar
Vladislav committed
4719 4720 4721 4722 4723
        unset PW_GS_LIST[3] # "PW_GS_FORCE_GRAB_CURSOR"
        unset PW_GS_LIST[4] # "PW_GS_FORCE_GRAB_KEYBOARD"
        unset PW_GS_LIST[5] # "PW_GS_HDR_ENABLE"
        unset PW_GS_LIST[10] # "PW_GS_HDR_FORCE_SUPPORT"
        unset PW_GS_LIST[11] # "PW_GS_HDR_FORCE_OUTPUT"
4724 4725
    fi

4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743
    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)]}
4744

4745 4746
    unset ADD_CHK_BOX_GS
    if [[ "${GAMESCOPE_INSTALLED}" == 1 ]] ; then
4747
        GAMESCOPE_NEED_INSTALL="${translations[Change settings gamescope for]} <b>${PORTWINE_DB}</b>\n ${translations[<b>NOTE:</b> To display help for each item, simply hover your mouse over the text]}"
4748
        GS_CB="CB" && GS_CBE="CBE" && GS_NUM="NUM" && GS_NUMN="NUMN"
Vladislav's avatar
Vladislav committed
4749
        for int_to_boole in ${PW_GS_LIST[@]} ; do
4750
            if [[ "${!int_to_boole}" == "1" ]]
4751 4752
            then export ${int_to_boole}="TRUE"
            else export ${int_to_boole}="FALSE"
4753 4754
            fi
            TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
4755 4756
            int_to_boole_non_pw="${int_to_boole//PW_GS/}"
            int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
4757 4758 4759 4760
            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
4761
            GAMESCOPE_VERSION="$(grep 'VERSION_ID=' /etc/os-release)"
Vladislav's avatar
Vladislav committed
4762
            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=/}")
4763
            YAD_TEXT_SELECTION="--selectable-labels"
4764
        else
4765
            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>]}"
4766 4767 4768 4769 4770
        fi
        GS_CB="DCB" && GS_CBE="DCBE" && GS_NUM="DNUM" && GS_NUMN="DNUMN"
        PW_GS_SHOW_RESOLUTION="disabled"
        PW_GS_INTERNAL_RESOLUTION="0.0"
        PW_GS_FRAME_LIMIT="disabled"
4771
        PW_GS_MESA_VK_WSI_PRESENT_MODE="disabled"
4772 4773 4774
        PW_GS_SCALER_MODE="disabled"
        PW_GS_FILTER_MODE="disabled"
        PW_GS_UPSCALE_SHARPNESS="0"
4775
        PW_GS_MAX_SCALE_FACTOR="0.0"
4776 4777 4778 4779
        PW_GS_MOUSE_SENSITIVITY="0.0"
        PW_GS_SDR_CONTENT_NITS="0"
        PW_GS_ITM_SDR_NITS="0"
        PW_GS_ITM_TARGET_NITS="0"
Vladislav's avatar
Vladislav committed
4780
        for int_to_boole in ${PW_GS_LIST[@]} ; do
4781
            if [[ "${!int_to_boole}" == "1" ]]
4782 4783
            then export ${int_to_boole}="TRUE"
            else export ${int_to_boole}="FALSE"
4784 4785
            fi
            TMP_HELP_FOR_GUI="${int_to_boole}_INFO"
Vladislav's avatar
Vladislav committed
4786 4787
            int_to_boole_non_pw="${int_to_boole//PW_GS/}"
            int_to_boole_non_pw="${int_to_boole_non_pw//"_"/" "}"
4788
            ADD_CHK_BOX_GS+="--field=${CHKBOX_SPACE}${int_to_boole_non_pw}!${!TMP_HELP_FOR_GUI}:D${THEME_CHKBOX}%${!int_to_boole}%"
4789 4790 4791
        done
    fi

4792
    IFS="%"
Vladislav's avatar
Vladislav committed
4793
    "${pw_yad}" --plug=$KEY_GS_GUI --tabnum="1" --form --columns=4 --separator=" " --text-align=center --text "$GAMESCOPE_NEED_INSTALL" \
Vladislav's avatar
Vladislav committed
4794
    --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" $YAD_TEXT_SELECTION \
4795
    ${ADD_CHK_BOX_GS} \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4796
    1> "${PW_TMPFS_PATH}/tmp_yad_gs_set" 2>/dev/null &
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4797
    IFS="$orig_IFS"
4798

4799 4800 4801 4802 4803 4804
    GAMESCOPE_XRANDR="$(grep -e '[0-9]x' "${PW_TMPFS_PATH}/xrandr.tmp" | awk '{print $1}' | sort -rVu | grep "^[0-9]" | tr '\n' ' ')"
    for drop_low in ${GAMESCOPE_XRANDR} ; do
        if (( "${drop_low//x/}" > "1000000" )) ; then
            GAMESCOPE_XRANDR_NEW+="${drop_low}!"
        fi
    done
4805

Vladislav's avatar
Vladislav committed
4806
    "${pw_yad}" --plug=$KEY_GS_GUI --tabnum="2" --form --columns=2 --separator="%" --homogeneous-row \
Vladislav's avatar
Vladislav committed
4807
    --gui-type-text="${PANED_GUI_TYPE_TEXT_DOWN}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
4808 4809 4810 4811
    --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[Mesa vulkan WSI]}!${translations[Overrides the WSI present mode:
4812 4813 4814
fifo - First in, first out. Limits the frame rate + no tearing. (VSync)
immediate - Unlimited frame rate + tearing.
mailbox - Triple buffering. Unlimited frame rate + no tearing.
4815 4816 4817 4818 4819 4820 4821 4822 4823
relaxed - Same as fifo but allows tearing when below the monitors refresh rate.]} :${GS_CB}" "$(combobox_fix --disabled "${PW_GS_MESA_VK_WSI_PRESENT_MODE}" "fifo!immediate!mailbox!relaxed")" \
    --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
4824
    1> "${PW_TMPFS_PATH}/tmp_yad_gs_set_cb" 2>/dev/null &
4825

4826
    "${pw_yad}" --paned --key="$KEY_GS_GUI" --title="GameScope" \
4827
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
4828
    --gui-type="settings-paned" \
4829 4830 4831 4832
    --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 \
4833 4834
    2>/dev/null
    YAD_GAMESCOPE_STATUS="$?"
4835

4836
    case "${YAD_GAMESCOPE_STATUS}" in
4837
        1|252)
Vladislav's avatar
Vladislav committed
4838
            restart_pp
4839 4840
            ;;
        162)
4841
            sed -i '/PW_GS/d' "$portwine_exe".ppdb
4842
            sed -i '/GAMESCOPE/d' "$portwine_exe".ppdb
Vladislav's avatar
Vladislav committed
4843
            restart_pp
4844
            ;;
4845
        164)
4846
            export PW_GAMESCOPE="0"
4847
            ;;
4848
        166)
4849
            export PW_GAMESCOPE="1"
4850 4851 4852
            ;;
    esac

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4853
    output_yad_gs=($(<"${PW_TMPFS_PATH}/tmp_yad_gs_set"))
Vladislav's avatar
Vladislav committed
4854 4855
    bool_from_yad="0"
    for boole_to_int in ${PW_GS_LIST[@]} ; do
4856
        export ${boole_to_int}="${output_yad_gs[$bool_from_yad]}"
4857
        if [[ "${!boole_to_int}" == "TRUE" ]]
4858 4859
        then export ${boole_to_int}="1"
        else export ${boole_to_int}="0"
4860
        fi
Vladislav's avatar
Vladislav committed
4861
        export bool_from_yad=$(( bool_from_yad + 1 ))
4862 4863
    done

Vladislav's avatar
Vladislav committed
4864
    PW_ADD_SETTINGS_GS=$(<"${PW_TMPFS_PATH}/tmp_yad_gs_set_cb")
4865

Vladislav's avatar
Vladislav committed
4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879
    PW_GS_SHOW_RESOLUTION="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $1}')"
    PW_GS_INTERNAL_RESOLUTION="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $2}' | tr ',' '.')"
    PW_GS_FRAME_LIMIT="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $3}')"
    PW_GS_MESA_VK_WSI_PRESENT_MODE="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $4}')"
    PW_GS_SCALER_MODE="$(echo "${PW_ADD_SETTINGS_GS}"| awk -F"%" '{print $5}')"
    PW_GS_FILTER_MODE="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $6}')"
    PW_GS_UPSCALE_SHARPNESS="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $7}')"
    PW_GS_MAX_SCALE_FACTOR="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $8}' | tr ',' '.')"
    PW_GS_MOUSE_SENSITIVITY="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $9}' | tr ',' '.')"
    PW_GS_SDR_CONTENT_NITS="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $10}')"
    PW_GS_ITM_SDR_NITS="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $11}')"
    PW_GS_ITM_TARGET_NITS="$(echo "${PW_ADD_SETTINGS_GS}" | awk -F"%" '{print $12}')"

    edit_db_from_gui ${PW_GS_LIST[@]} PW_GAMESCOPE PW_GS_SHOW_RESOLUTION PW_GS_INTERNAL_RESOLUTION \
4880 4881 4882
    PW_GS_FRAME_LIMIT PW_GS_MESA_VK_WSI_PRESENT_MODE PW_GS_SCALER_MODE  PW_GS_FILTER_MODE \
    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
4883

Vladislav's avatar
Vladislav committed
4884
    restart_pp
4885 4886
}

Vladislav's avatar
Vladislav committed
4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904
# 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" ]]
4905 4906
    then NEW_STEAM_BEHAVIOR="${translations[Disable]}"
    else NEW_STEAM_BEHAVIOR="${translations[Enable]}"
Vladislav's avatar
Vladislav committed
4907 4908 4909 4910 4911 4912 4913 4914 4915
    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
4916
    "${pw_yad}" --plug=$KEY_USERCONF_GUI --tabnum="1" --form --columns=2 --separator=" " --text-align=center \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4917
    --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]}" \
4918
    --align-buttons --homogeneous-column --gui-type-text="${PANED_GUI_TYPE_TEXT_UP}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_UP}" \
4919 4920 4921 4922
    --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
4923 4924
    2>/dev/null &

4925
    if [[ -n "${PW_SOUND_DRIVER_USE}" ]] \
Vladislav's avatar
Vladislav committed
4926 4927 4928 4929 4930 4931 4932
    && [[ "${PW_SOUND_DRIVER_USE}" != "disabled" ]]
    then
        SOUND_DRIVER_VAR="${PW_SOUND_DRIVER_USE}"
    else
        SOUND_DRIVER_VAR="disabled"
    fi

4933
    if [[ -n "${PW_GPU_USE}" ]] \
Vladislav's avatar
Vladislav committed
4934 4935 4936 4937 4938 4939 4940 4941
    && [[ "${PW_GPU_USE}" != "disabled" ]]
    then
        GPU_VAR="${PW_GPU_USE}"
    else
        GPU_VAR="disabled"
    fi

    "${pw_yad}" --plug=$KEY_USERCONF_GUI --tabnum="2" --form --columns=1 --separator="%" --homogeneous-row \
Vladislav's avatar
Vladislav committed
4942
    --gui-type-text="${PANED_GUI_TYPE_TEXT_DOWN}" --gui-type-layout="${PANED_GUI_TYPE_LAYOUT_DOWN}" \
4943 4944 4945
    --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}")" \
    --field="${translations[Choice wine audio driver]}!${translations[Fixes sound popling if choice alsa]} :CB" "$(combobox_fix --disabled "${SOUND_DRIVER_VAR}" "alsa!oss!pulse")" \
    --field="${translations[Choice gui themes]}!${translations[Allows you to select a theme for PortProton]} :CB" "$(combobox_fix "${GUI_THEME}" "default!compact!classic")" \
Vladislav's avatar
Vladislav committed
4946 4947
    1> "${PW_TMPFS_PATH}/tmp_yad_userconf_set_cb" 2>/dev/null &

Mikhail Tergoev's avatar
Mikhail Tergoev committed
4948
    "${pw_yad}" --key=$KEY_USERCONF_GUI --paned --sensitive \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
4949
    --title="${translations[GLOBAL SETTINGS (USER.CONF)]}" \
Vladislav's avatar
Vladislav committed
4950 4951
    --separator=" " --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
    --gui-type="settings-paned" \
4952 4953 4954 4955
    --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
4956 4957 4958 4959 4960
    2>/dev/null
    YAD_USERCONF_STATUS="$?"

    case "$YAD_USERCONF_STATUS" in
        1|252)
Vladislav's avatar
Vladislav committed
4961
            restart_pp
Vladislav's avatar
Vladislav committed
4962
            ;;
4963
        2)
4964
            if yad_question "${translations[Do you really want to reset settings for]} <b>user.conf</b>?"
4965 4966 4967 4968 4969 4970 4971
            then
                try_remove_file "$USER_CONF"
                exit 0
            else
                restart_pp --userconf
            fi
            ;;
Vladislav's avatar
Vladislav committed
4972 4973 4974 4975
        164)
            gui_open_user_conf
            ;;
        166)
Vladislav's avatar
Vladislav committed
4976
            PW_ADD_SETTINGS_UC=$(<"${PW_TMPFS_PATH}/tmp_yad_userconf_set_cb")
Vladislav's avatar
Vladislav committed
4977 4978 4979
            PW_GPU_USE="$(echo "${PW_ADD_SETTINGS_UC}" | awk -F"%" '{print $1}')"
            PW_SOUND_DRIVER_USE="$(echo "${PW_ADD_SETTINGS_UC}" | awk -F"%" '{print $2}')"
            GUI_THEME="$(echo "${PW_ADD_SETTINGS_UC}" | awk -F"%" '{print $3}')"
Vladislav's avatar
Vladislav committed
4980
            edit_user_conf_from_gui PW_GPU_USE PW_SOUND_DRIVER_USE GUI_THEME
Vladislav's avatar
Vladislav committed
4981
            restart_pp
Vladislav's avatar
Vladislav committed
4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001
            ;;
    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
5002 5003
# RESIZE PNG FILE
resize_png () {
5004
    if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5005 5006 5007 5008
        print_error "no argument specified for resize_png"
        return 1
    else
        local RESIZE_FILE="$1"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5009
        local RESIZE_NAME_PNG="${2// /_}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5010 5011
        local RESIZE_TO="$3"
    fi
5012

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5013
    [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" ]] && return 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5014 5015 5016 5017 5018

    try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png"
    try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png"

    if check_flatpak ; then
5019
        if ! timeout 3 \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5020
        exe-thumbnailer --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" \
5021
        && [[ "$ALPINE_FP" != "1" ]]
5022 5023
        then
            print_error "exe-thumbnailer - broken!"
5024
            if [[ -n "$PW_DEBUG" ]] ; then
5025 5026 5027 5028 5029
                debug_timer --start
                timeout 5 exe-thumbnailer --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png"
                debug_timer --end "exe-thumbnailer"
            fi
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5030
    else
5031
        print_warning "use portable exe-thumbnailer"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5032 5033 5034 5035 5036 5037 5038 5039
        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
}

5040
# GUI CREATE SHORTCUT
5041
portwine_create_shortcut () {
5042
    export GDK_BACKEND="x11"
5043
    pw_stop_progress_bar
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5044
    pw_exit_tray
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5045
    [[ ! -e ${portwine_exe} ]] && return 1
5046
    unset PORTPROTON_NAME name_desktop_png
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5047
    pw_create_gui_png
5048

5049 5050 5051 5052
    [[ -z "${PW_SHORTCUT_MENU}" ]] && PW_SHORTCUT_MENU="TRUE"
    [[ -z "${PW_SHORTCUT_DESKTOP}" ]] && PW_SHORTCUT_DESKTOP="TRUE"
    [[ -z "${PW_SHORTCUT_STEAM}" ]] && PW_SHORTCUT_STEAM="FALSE"

5053 5054 5055 5056 5057 5058 5059 5060
    if [[ -z "${PORTPROTON_NAME}" ]] ; then
        export name_desktop="$(basename "$portwine_exe")"
    else
        export name_desktop="${PORTPROTON_NAME}"
    fi

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

5061
    if [[ "$1" == "block_name" ]] ; then
5062
        OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \
5063
        --gui-type="settings-shortcut" \
Vladislav's avatar
Vladislav committed
5064 5065
        --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}" \
5066
        --window-icon "$PW_GUI_ICON_PATH/portproton.svg" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5067
        --image "${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" \
5068
        --text-align="center" --text "${translations[The shortcut will be created in the PortProton directory.]}" \
5069
        --field="  ${name_desktop}":LBL "" \
5070 5071 5072 5073 5074
        --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" \
        --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)
5075 5076
        PW_YAD_OUT=$?
    else
5077
        OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \
5078
        --gui-type="settings-shortcut" \
Vladislav's avatar
Vladislav committed
5079 5080
        --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}" \
5081
        --window-icon "$PW_GUI_ICON_PATH/portproton.svg" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5082
        --image "${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" \
5083 5084 5085 5086 5087 5088 5089
        --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" \
        --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)
5090 5091 5092 5093 5094 5095
        PW_YAD_OUT=$?
    fi

    if [[ "$PW_YAD_OUT" == "0" ]] ; then
        if [[ "$1" == "block_name" ]]
        then name_desktop="$PORTWINE_CREATE_SHORTCUT_NAME"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5096
        else name_desktop=$(echo "$OUTPUT" | awk -F'|' '{print $1}')
5097
        fi
5098
        name_desktop="$(echo "${name_desktop}" | sed "s/\`//g" | sed "s/\"//g" | sed "s/'//g" | sed "s/\!//g")"
5099 5100 5101
        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}')
5102 5103 5104

        edit_user_conf_from_gui PW_SHORTCUT_MENU PW_SHORTCUT_DESKTOP PW_SHORTCUT_STEAM

5105 5106 5107 5108 5109
        try_remove_file "${PORT_WINE_PATH}/${name_desktop}.desktop"

        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
5110 5111 5112 5113 5114 5115 5116 5117
        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}/"
5118
            echo "Icon=${PORT_WINE_PATH}/data/img/${name_desktop_png}.png"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5119
        } >> "${PORT_WINE_PATH}/${name_desktop}.desktop"
5120 5121
        chmod u+x "${PORT_WINE_PATH}/${name_desktop}.desktop"

5122
        if [[ "${PW_SHORTCUT_MENU}" == "TRUE" ]] ; then
5123 5124 5125 5126
            try_remove_file "${HOME}/.local/share/applications/${name_desktop}.desktop"
            cp -f "${PORT_WINE_PATH}/${name_desktop}.desktop" "${HOME}/.local/share/applications/"
        fi

5127
        if [[ "${PW_SHORTCUT_DESKTOP}" == "TRUE" ]] ; then
5128 5129 5130 5131 5132 5133 5134 5135 5136
            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

5137
        if [[ "${PW_SHORTCUT_STEAM}" == "TRUE" ]] ; then
5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150
            export STEAM_SCRIPTS="${PORT_WINE_PATH}/steam_scripts"
            create_new_dir "${STEAM_SCRIPTS}"
            echo "#!/usr/bin/env bash" > "${STEAM_SCRIPTS}/${name_desktop}.sh"
            echo "export START_FROM_STEAM=1" >> "${STEAM_SCRIPTS}/${name_desktop}.sh"
            echo "export LD_PRELOAD=" >> "${STEAM_SCRIPTS}/${name_desktop}.sh"
            if check_flatpak
            then echo "flatpak run ru.linux_gaming.PortProton \"${portwine_exe}\" " >> "${STEAM_SCRIPTS}/${name_desktop}.sh"
            else echo "\"${PORT_SCRIPTS_PATH}/start.sh\" \"${portwine_exe}\" " >> "${STEAM_SCRIPTS}/${name_desktop}.sh"
            fi
            chmod u+x "${STEAM_SCRIPTS}/${name_desktop}.sh"
            export SCVDF="shortcuts.vdf"
            for STUIDPATH in "${HOME}"/.local/share/Steam/userdata/*/ ; do
                create_new_dir "${STUIDPATH}/config/"
5151
                create_new_dir "${STUIDPATH}/config/grid"
5152
                export SCPATH="${STUIDPATH}/config/$SCVDF"
5153
                export SGGRIDDIR="${STUIDPATH}/config/grid"
5154 5155 5156
                "${PORT_SCRIPTS_PATH}/add_in_steam.sh"
            done
            if [[ "${PW_SKIP_RESTART_STEAM}" != 1 ]] && pgrep -i steam &>/dev/null ; then
5157 5158
                if yad_question "${translations[For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?]}" ; then
                    pw_start_progress_bar_block "${translations[Restarting STEAM... Please wait.]}"
5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171
                    kill -s SIGTERM $(pgrep -a steam) &>/dev/null
                    while pgrep -i steam &>/dev/null ; do
                        sleep 0.5
                    done
                    steam &
                    sleep 5
                    pw_stop_progress_bar
                    exit 0
                fi
            fi
            unset PW_SKIP_RESTART_STEAM
        fi

5172
        if [[ "$PW_NO_RESTART_PPDB" != "1" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5173
            print_info "Restarting PP..."
5174 5175 5176
            if [[ "${PW_GUI_START}" == "NOTEBOOK" ]] ; then
                unset PW_YAD_FORM_TAB
            fi
Vladislav's avatar
Vladislav committed
5177
            restart_pp
5178
        fi
5179 5180 5181 5182 5183
    elif [[ "$PW_YAD_OUT" == "2" ]] ; then
        print_info "Restarting PP..."
        if [[ "${PW_GUI_START}" == "NOTEBOOK" ]] ; then
            unset PW_YAD_FORM_TAB
        fi
Vladislav's avatar
Vladislav committed
5184
        restart_pp
5185 5186 5187
    fi
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5188
pw_auto_create_shortcut () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5189 5190
    if [[ "${PW_CHECK_AUTOINSTALL}" == "1" ]] \
    || [[ "${PW_NO_AUTO_CREATE_SHORTCUT}" == "1" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5191
    || [[ -z "${portwine_exe}" ]] \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5192
    || echo "${portwine_exe}" | grep -i "gc_api.exe\|vkplay\|pulseonline" &>/dev/null
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5193 5194 5195
    then
        print_warning "Skipping auto create shortcut"
        return 0
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5196
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211

    unset LINKS
    for link_file in "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk
    do
        if ! echo "$link_file" | grep "\*.lnk" &>/dev/null ; then
            link_file=$(readlink -f "${link_file}")
            LINKS+=("${link_file// /@_@}")
        else
            continue
        fi
    done
    [[ -z "$LINKS" ]] && return 0
    SORTED_LINKS=($(echo ${LINKS[@]} | tr ' ' '\n' | sort -u))

    for link_file in "${SORTED_LINKS[@]//@_@/ }" ; do
5212
        if command -v exiftool &>/dev/null ; then
Vladislav's avatar
Vladislav committed
5213
            if timeout 3 exiftool "$link_file" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225
                prefix_name=$(echo "$link_file" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
                if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \
                && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then
                    link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}')
                    link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g')
                else
                    link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}')
                    link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g')
                fi
                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")
            else
5226
                print_error "exiftool - broken!"
5227
                if [[ -n "$PW_DEBUG" ]] ; then
5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243
                    debug_timer --start
                    timeout 5 exiftool "$link_file"
                    debug_timer --end "exiftool"
                fi
            fi
        else
            print_warning "use portable exiftool"
            env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$link_file" &> "${PW_TMPFS_PATH}/exiftool.tmp"
            prefix_name=$(echo "$link_file" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}')
            if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \
            && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then
                link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}')
                link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g')
            else
                link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}')
                link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g')
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5244
            fi
5245 5246
            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")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5247
        fi
5248

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5249 5250 5251 5252 5253 5254
        try_remove_file "$link_file"

        if ! exe_path="$(realpath "${link_path}" 2>/dev/null)" ; then
            print_warning "Removed broken link for: $link_name"
        else
            print_info "Created link for: $link_name"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5255 5256
            PORTPROTON_NAME="$link_name"
            export portwine_exe="$exe_path"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5257
            resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5258 5259
            export PW_NO_RESTART_PPDB=1
            portwine_create_shortcut
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5260 5261 5262 5263 5264
        fi
    done
}
export -f pw_auto_create_shortcut

5265
portwine_delete_shortcut () {
5266 5267 5268 5269 5270 5271
    PW_DELETE_MENU="$(grep -il "${portwine_exe}" "${HOME}/.local/share/applications"/*.desktop 2>/dev/null)"
    PW_DELETE_SHORTCUT+=(${PW_DELETE_MENU// /@_@})

    PW_DELETE_PP="$(grep -il "${portwine_exe}" "${PORT_WINE_PATH}"/*.desktop 2>/dev/null)"
    PW_DELETE_SHORTCUT+=(${PW_DELETE_PP// /@_@})

5272
    if [[ -d "${HOME}/Desktop" ]] ; then
5273 5274 5275 5276 5277 5278
        PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Desktop"/*.desktop 2>/dev/null)"
        PW_DELETE_SHORTCUT+=(${PW_DELETE_DESKTOP// /@_@})
    fi
    if [[ -d "${HOME}/Рабочий стол" ]] ; then
        PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Рабочий стол"/*.desktop 2>/dev/null)"
        PW_DELETE_SHORTCUT+=(${PW_DELETE_DESKTOP// /@_@})
5279
    fi
5280 5281 5282 5283 5284 5285 5286 5287
    if [[ $(xdg-user-dir DESKTOP) ]] ; then
        PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "$(xdg-user-dir DESKTOP)"/*.desktop 2>/dev/null)"
        PW_DELETE_SHORTCUT+=(${PW_DELETE_DESKTOP// /@_@})
    fi

    for delete_shortcut in ${PW_DELETE_SHORTCUT[@]} ; do
        rm -f "${delete_shortcut//@_@/ }"
    done
5288 5289 5290
}

portwine_missing_shortcut () {
5291
    "${pw_yad}" --title="${translations[Error]}" --form \
5292
    --window-icon "$PW_GUI_ICON_PATH/portproton.svg" --fixed \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5293
    --image "$PW_GUI_ICON_PATH/error.svg" \
5294
    --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" \
5295 5296
    --button="${translations[DELETE SHORTCUT]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 \
    --button="${translations[CANCEL]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":1
5297
    if [[ $? -eq "0" ]] ; then
5298 5299
        portwine_delete_shortcut
    fi
5300 5301 5302 5303
    if [[ -n "$TAB_MAIN_MENU" ]]
    then restart_pp
    else exit 0
    fi
5304 5305
}

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5306
# GUI WINETRICKS | GUI PREFIX MANAGER
5307 5308 5309
pw_prefix_manager () {
    update_winetricks
    start_portwine
5310
    if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ]] ; then
5311 5312 5313
        touch "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log"
    fi

5314
    pw_start_progress_bar_block "${translations[Starting prefix manager:]} $PW_PREFIX_NAME"
Vladislav's avatar
Vladislav committed
5315 5316 5317
    "${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"
5318 5319 5320 5321

    gui_prefix_manager () {
        unset SET_FROM_PFX_MANAGER_TMP SET_FROM_PFX_MANAGER
        IFS=$'\n'
Vladislav's avatar
Vladislav committed
5322
        try_remove_file  "${PW_TMPFS_PATH}/dll_list_tmp"
5323
        while read PW_BOOL_IN_DLL_LIST ; do
5324
            if [[ -z $(echo "${PW_BOOL_IN_DLL_LIST}" | grep -E 'd3d|directx9|dont_use|dxvk|vkd3d|galliumnine|faudio1|Foundation') ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5325
                if grep "^$(echo "${PW_BOOL_IN_DLL_LIST}" | awk '{print $1}')$" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" ; then
Vladislav's avatar
Vladislav committed
5326
                    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"
5327
                else
Vladislav's avatar
Vladislav committed
5328
                    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"
5329 5330
                fi
            fi
Vladislav's avatar
Vladislav committed
5331 5332
        done < "${PW_TMPFS_PATH}/dll_list"
        try_remove_file  "${PW_TMPFS_PATH}/fonts_list_tmp"
5333 5334 5335
        while read PW_BOOL_IN_FONTS_LIST ; do
            if [[ -z $(echo "${PW_BOOL_IN_FONTS_LIST}" | grep -E '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
5336
                    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"
5337
                else
Vladislav's avatar
Vladislav committed
5338
                    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"
5339 5340
                fi
            fi
Vladislav's avatar
Vladislav committed
5341 5342
        done < "${PW_TMPFS_PATH}/fonts_list"
        try_remove_file  "${PW_TMPFS_PATH}/settings_list_tmp"
5343 5344 5345
        while read PW_BOOL_IN_FONTS_LIST ; do
            if [[ -z $(echo "${PW_BOOL_IN_FONTS_LIST}" | grep -E '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
5346
                    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"
5347
                else
Vladislav's avatar
Vladislav committed
5348
                    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"
5349 5350
                fi
            fi
Vladislav's avatar
Vladislav committed
5351
        done < "${PW_TMPFS_PATH}/settings_list"
5352 5353 5354
        pw_stop_progress_bar

        KEY_EDIT_MANAGER_GUI=$RANDOM
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5355
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=1 --list --checklist \
Vladislav's avatar
Vladislav committed
5356
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
5357 5358 5359
        --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 &
5360

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5361
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=2 --list --checklist \
Vladislav's avatar
Vladislav committed
5362
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
5363 5364 5365
        --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 &
5366

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5367
        "${pw_yad}" --plug=$KEY_EDIT_MANAGER_GUI --tabnum=3 --list --checklist \
Vladislav's avatar
Vladislav committed
5368
        --gui-type-layout="${NOTEBOOK_GUI_TYPE_LAYOUT}" --gui-type-text="${NOTEBOOK_GUI_TYPE_TEXT}" \
5369 5370 5371
        --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 &
5372

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5373
        "${pw_yad}" --key=$KEY_EDIT_MANAGER_GUI --notebook \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5374
        --width=700 --height=700 --expand \
5375
        --gui-type="settings-notebook" \
5376 5377 5378 5379
        --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[PREFIX MANAGER]}" \
        --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 \
5380
        --tab-pos="top" \
5381 5382 5383
        --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
5384
        YAD_STATUS="$?"
5385

Vladislav's avatar
Vladislav committed
5386 5387 5388
        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"
5389

5390 5391 5392 5393
        case "$YAD_STATUS" in
            1|252)
                print_info "Nothing to do. Restarting PortProton..."
                stop_portwine &
Vladislav's avatar
Vladislav committed
5394
                restart_pp
5395 5396 5397 5398 5399 5400 5401 5402 5403
                ;;
            0)
                WT_FORCE=""
                ;;
            2)
                WT_FORCE="-r -f"
                ;;
        esac

Vladislav's avatar
Vladislav committed
5404
        for STPFXMNG in $(<"${PW_TMPFS_PATH}/to_winetricks") ; do
5405
            grep $(echo ${STPFXMNG} | awk -F'|' '{print $2}') "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" &>/dev/null
5406 5407
            if [[ "$?" == "1" ]] ; then
                [[ -n "${STPFXMNG}" ]] && SET_FROM_PFX_MANAGER+="$(echo "${STPFXMNG}" | awk -F'|' '{print $2}') "
5408 5409
            fi
        done
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5410
        IFS="$orig_IFS"
Vladislav's avatar
Vladislav committed
5411
        try_remove_file "${PW_TMPFS_PATH}/to_winetricks"
5412

5413
        if [[ -n ${SET_FROM_PFX_MANAGER} ]] ; then
5414
            pw_update_pfx_cover_gui "winetricks"
Vladislav's avatar
Vladislav committed
5415 5416
            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"
5417
            print_info "Try to install DLL in prefix: ${SET_FROM_PFX_MANAGER}"
5418
            ${pw_runtime} LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}" GST_PLUGIN_SYSTEM_PATH_1_0="" \
5419
            "${PORT_WINE_TMP_PATH}/winetricks" -q ${WT_FORCE} ${SET_FROM_PFX_MANAGER} | tee -a "${PW_TMPFS_PATH}/update_pfx_log"
5420 5421 5422 5423 5424 5425 5426
            wait_wineserver
            kill_portwine
            pw_stop_progress_bar
            gui_prefix_manager
        else
            print_info "Nothing to do. Restarting PortProton..."
            stop_portwine &
Vladislav's avatar
Vladislav committed
5427
            restart_pp
5428 5429 5430 5431 5432 5433 5434 5435 5436
        fi
    }
    gui_prefix_manager
}

portwine_start_debug () {
    kill_portwine
    export PW_LOG=1
    if [[ -z "$VULKAN_DRIVER_NAME" ]] || [[ "$VULKAN_DRIVER_NAME" == "llvmpipe" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5437
    pw_notify_send -i warning \
5438 5439
    "${translations[Attention working version of vulkan not detected!]}" \
    "${translations[It is recommended to run games in OpenGL (low performance possible)!]}"
5440
    fi
5441 5442
    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"
    echo "${translations[To diagnose the problem, copy ALL of the log to discord server: https://discord.gg/FTaheP99wE]}" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5443 5444 5445 5446 5447 5448 5449 5450
    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"
5451 5452
    if check_flatpak ; then
        echo "FLATPAK in used" >> "${PORT_WINE_PATH}/PortProton.log"
5453
    elif [[ "${PW_USE_RUNTIME}" = 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5454
        echo "RUNTIME is disabled" >> "${PORT_WINE_PATH}/PortProton.log"
5455
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5456
        echo "RUNTIME is enabled" >> "${PORT_WINE_PATH}/PortProton.log"
5457
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5458
    echo "----------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5459
    if [[ -n "${portwine_exe}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5460 5461 5462
        echo "Debug for programm:" >> "${PORT_WINE_PATH}/PortProton.log"
        echo "${portwine_exe}" >> "${PORT_WINE_PATH}/PortProton.log"
        echo "---------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5463
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5464 5465 5466
    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"
5467 5468 5469 5470 5471 5472 5473 5474 5475 5476
    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
5477 5478 5479 5480 5481
    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"
5482
    if [[ $(file "$portwine_exe") =~ x86-64 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5483 5484
        echo "64 bit" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-----------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5485
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5486 5487 5488 5489 5490 5491 5492 5493 5494
        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"
5495 5496
    if check_flatpak ; then
        echo "Flatpak runtime:" >> "${PORT_WINE_PATH}/PortProton.log"
5497
        grep -oP 'PRETTY_NAME="\K[^"]+' /etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
5498
        echo "Operating system:" >> "${PORT_WINE_PATH}/PortProton.log"
5499
        grep -oP 'PRETTY_NAME="\K[^"]+' /run/host/etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
5500 5501
    else
        echo "Operating system:" >> "${PORT_WINE_PATH}/PortProton.log"
5502
        grep -oP 'PRETTY_NAME="\K[^"]+' /etc/os-release  >> "${PORT_WINE_PATH}/PortProton.log"
5503
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5504 5505 5506 5507 5508 5509 5510 5511 5512 5513
    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"
5514 5515 5516
    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
5517 5518 5519
    echo "------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "RAM:" >> "${PORT_WINE_PATH}/PortProton.log"
    free -m >> "${PORT_WINE_PATH}/PortProton.log"
5520
    echo "--------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5521 5522 5523
    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"
5524
    echo "---------------------------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5525 5526
    echo "Graphic cards and drivers:" >> "${PORT_WINE_PATH}/PortProton.log"
    echo 'lspci -k | grep -EA3 VGA|3D|Display :' >> "${PORT_WINE_PATH}/PortProton.log"
5527
    lspci -k | grep -EA3 'VGA|3D|Display' >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5528
    echo "----" >> "${PORT_WINE_PATH}/PortProton.log"
5529
    command -v glxinfo &>/dev/null && glxinfo -B >> "${PORT_WINE_PATH}/PortProton.log"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5530 5531
    echo "-----" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "inxi -G:" >> "${PORT_WINE_PATH}/PortProton.log"
5532 5533
    if ! check_flatpak ; then
        "${PW_PLUGINS_PATH}/portable/bin/inxi" -Gc0 >> "${PORT_WINE_PATH}/PortProton.log"
5534 5535 5536
    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
5537 5538 5539
            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"
5540 5541
        fi
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5542 5543 5544 5545
    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
5546
    grep -E '^GPU|deviceName|driverName' "${PW_TMPFS_PATH}/vulkaninfo.tmp" >> "${PORT_WINE_PATH}/PortProton.log"
5547
    "${PW_PLUGINS_PATH}/portable/bin/vkcube" --c 50
5548
    if [[ $? -eq 0 ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5549
        echo "Vulkan cube test passed successfully" >> "${PORT_WINE_PATH}/PortProton.log"
5550
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5551 5552 5553 5554 5555 5556 5557 5558 5559
        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"
5560
    if [[ "${PW_USE_D3D_EXTRAS}" != 1 ]]
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5561 5562
    then echo "D3D_EXTRAS - disabled" >> "${PORT_WINE_PATH}/PortProton.log"
    else echo "D3D_EXTRAS - enabled" >> "${PORT_WINE_PATH}/PortProton.log"
5563
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5564 5565 5566 5567
    echo "------------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
    echo "winetricks.log:" >> "${PORT_WINE_PATH}/PortProton.log"
    cat "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" | sed -e /"^d3dcomp*"/d -e /"^d3dx*"/d >> "${PORT_WINE_PATH}/PortProton.log"
    echo "-----------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5568
    if [[ -n "${PORTWINE_DB_FILE}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5569 5570
        echo "Use ${PORTWINE_DB_FILE} db file:" >> "${PORT_WINE_PATH}/PortProton.log"
        cat "${PORTWINE_DB_FILE}" | sed '/##/d' >> "${PORT_WINE_PATH}/PortProton.log"
5571
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5572 5573
        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"
5574
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5575
    echo "----------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5576
    if [[ -f "${USER_CONF}" ]] ; then
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5577
        cat "${USER_CONF}" | sed '/bash/d' >> "${PORT_WINE_PATH}/PortProton.log"
5578
    fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5579
    echo "---------------------------------------" >> "${PORT_WINE_PATH}/PortProton.log"
5580 5581 5582 5583 5584 5585 5586

    export DXVK_HUD="full"

    portwine_launch &
    sleep 3
    pw_stop_progress_bar_cover
    unset PW_TIMER
5587
    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
5588
            sleep 0.005
5589
            if [[ -n "${line}" ]] && [[ -z "$(echo "${line}" | grep -i "kerberos")" ]] \
5590 5591 5592 5593 5594 5595 5596 5597
                                    && [[ -z "$(echo "${line}" | grep -i "ntlm")" ]]
            then
                echo "# ${line}"
            fi
            if [[ "${PW_TIMER}" != 1 ]] ; then
                sleep 3
                PW_TIMER=1
            fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5598
    done < "${PORT_WINE_PATH}/PortProton.log" | "${pw_yad}" --text-info --tail --button="STOP"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png":0 --title="DEBUG" \
5599
    --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 &&
5600
    kill_portwine
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5601 5602 5603 5604 5605 5606
    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"
5607
    deb_text=$(awk '! a[$0]++' "${PORT_WINE_PATH}/PortProton.log")
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5608 5609
    echo "$deb_text" > "${PORT_WINE_PATH}/PortProton.log"
    "$pw_yad" --title="PortProton.log" --no-buttons --text-align=center \
5610
    --text-info --show-uri --wrap --width=1200 --height=550  --uri-color=red \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5611
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5612
    --filename="${PORT_WINE_PATH}/PortProton.log"
5613 5614 5615 5616 5617
    stop_portwine
}

pw_create_prefix_backup () {
    cd "$HOME"
5618
    PW_PREFIX_TO_BACKUP=$("${pw_yad}" --file --directory --width=800 --height=500 \
5619 5620 5621
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "${translations[BACKUP PREFIX TO...]}" \
    --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)
5622
    YAD_STATUS="$?"
5623

Vladislav's avatar
Vladislav committed
5624
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
5625
        restart_pp
Vladislav's avatar
Vladislav committed
5626
    fi
5627
    if [[ -n "$(grep "/${PW_PREFIX_NAME}/" "${PORT_WINE_PATH}"/*.desktop )" ]] ; then
5628 5629 5630 5631 5632 5633
        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
5634 5635
    if check_flatpak
    then TMP_ALL_PATH=""
5636
    else TMP_ALL_PATH="LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\""
5637
    fi
5638
    chmod -R u+w "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5639
cat << EOF > "${PORT_WINE_TMP_PATH}"/pp_pfx_backup.sh
5640 5641 5642 5643 5644
    #!/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
5645 5646 5647
    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
5648 5649
    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"
5650
        yad_info "${translations[Backup has been successfully created for prefix:]} $PW_PREFIX_NAME"
5651
        if [[ ! -f "${PORT_WINE_TMP_PATH}/pfx_backup_info" ]] ; then
5652
            yad_info "${translations[Attention! Do not pass the resev copy to third parties, there is a risk of losing accounts!]}"
5653 5654 5655
            echo "1" > "${PORT_WINE_TMP_PATH}/pfx_backup_info"
        fi
    else
5656
        yad_error "${translations[An error occurred while backing up the prefix:]} $PW_PREFIX_NAME"
5657
    fi
Vladislav's avatar
Vladislav committed
5658
    restart_pp
5659 5660 5661 5662 5663 5664
}

pw_autoinstall_from_db () {
    export PW_USER_TEMP="${PORT_WINE_TMP_PATH}"
    export PW_FORCE_LARGE_ADDRESS_AWARE=1
    export PW_USE_GAMEMODE=0
5665
    export PW_CHECK_AUTOINSTALL=1
5666 5667 5668 5669 5670 5671 5672 5673 5674
    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
5675
    export PW_VKBASALT=0
5676 5677
    export PW_USE_D3D_EXTRAS=1
    . "${PORT_SCRIPTS_PATH}/pw_autoinstall/${PW_YAD_SET}"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5678

5679 5680 5681
}

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

5684
    case "$1" in
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5685
        --normal)
5686 5687 5688 5689 5690 5691 5692 5693
            kill -s SIGUSR1 $(pgrep -a yad | grep "\--key=${KEY_MENU}" | awk '{print $1}') > /dev/null 2>&1
            ;;
        --start)
            kill -s SIGUSR1 $(pgrep -a yad | grep "\--key=${KEY_START}" | awk '{print $1}') > /dev/null 2>&1
            ;;
        --userconf)
            kill -s SIGUSR1 $(pgrep -a yad | grep "\--key=${KEY_USERCONF_GUI}" | awk '{print $1}') > /dev/null 2>&1
            ;;
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716
        --desktop)
            kill -s SIGUSR1 $(pgrep -a yad | grep "\--key=${KEY_MENU}" | awk '{print $1}') > /dev/null 2>&1
            PW_YAD_SET="${PORT_WINE_PATH}/${PW_YAD_SET//#@_@#/ }"
            if [[ $PW_DESKTOP_FILES_REGEX == "1" ]] ; then
                PW_YAD_SET="${PW_YAD_SET//#+_1#/\(}"
                PW_YAD_SET="${PW_YAD_SET//#+_2#/\)}"
                PW_YAD_SET="${PW_YAD_SET//#+_3#/\!}"
                PW_YAD_SET="${PW_YAD_SET//#+_4#/\$}"
                PW_YAD_SET="${PW_YAD_SET//#+_5#/\%}"
                PW_YAD_SET="${PW_YAD_SET//#+_6#/\&}"
                PW_YAD_SET="${PW_YAD_SET//#+_7#/\`}"
                PW_YAD_SET="${PW_YAD_SET//#+_8#/\'}"
                PW_YAD_SET="${PW_YAD_SET//#+_9#/\"}"
                PW_YAD_SET="${PW_YAD_SET//#+_10#/\>}"
                PW_YAD_SET="${PW_YAD_SET//#+_11#/\<}"
                PW_YAD_SET="${PW_YAD_SET//#+_12#/\\}"
                PW_YAD_SET="${PW_YAD_SET//#+_13#/\|}"
                PW_YAD_SET="${PW_YAD_SET//#+_14#/\;}"
            fi
            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
5717

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5718 5719 5720 5721 5722 5723
            print_info "Restarting PP after choose desktop file..."
            # stop_portwine
            /usr/bin/env bash -c "${PW_EXEC_FROM_DESKTOP}" &
            exit 0
            ;;
    esac
5724
}
5725
export -f button_click
5726 5727

gui_clear_pfx () {
5728
    if yad_question "${translations[Do you want to clear prefix in PortProton?]}" ; then
5729 5730
        pw_clear_pfx
        print_info "Restarting PP after clearing prefix..."
Vladislav's avatar
Vladislav committed
5731
        restart_pp
5732 5733 5734 5735 5736
    fi
}
export -f gui_clear_pfx

gui_rm_portproton () {
5737
    if yad_question "${translations[Do you really want to remove PortProton?]}" ; then
5738 5739 5740
        rm -fr "${PORT_WINE_PATH}"
        rm -fr "${PORT_WINE_TMP_PATH}"
        rm -fr "${HOME}/PortWINE"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5741
        rm -f "$(grep -il PortProton "${HOME}/.local/share/applications"/*.desktop)"
5742 5743 5744 5745 5746 5747 5748
        update-desktop-database -q "${HOME}/.local/share/applications"
    fi
    exit 0
}
export -f gui_rm_portproton

gui_pw_update () {
5749
    export PW_FORCE_UPDATE="1"
5750 5751
    try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    print_info "Restarting PP for check update..."
5752
    unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
5753
    restart_pp
5754
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5755
export -f gui_pw_update
5756 5757

change_loc () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5758
    try_remove_file "${PORT_WINE_TMP_PATH}/PortProton_loc"
5759
    print_info "Restarting PP for change language..."
Vladislav's avatar
Vladislav committed
5760
    restart_pp
5761
}
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5762 5763 5764
export -f change_loc

change_mirror () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5765 5766
    if [[ "$MIRROR" == "CLOUD" ]] ; then
        sed -i 's/="CLOUD"/="GITHUB"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5767
        pw_notify_send -i info \
5768
        "${translations[Mirror changed to:]}" "<b>https://github.com/Castro-Fidel</b>"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5769
    else
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5770
        sed -i 's/="GITHUB"/="CLOUD"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5771
        pw_notify_send -i info \
5772
        "${translations[Mirror changed to:]}" "<b>https://cloud.linux-gaming.ru</b>"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5773 5774
    fi
    print_info "Restarting PP for change mirror..."
Vladislav's avatar
Vladislav committed
5775
    restart_pp --userconf
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5776 5777
}
export -f change_mirror
5778

Mikhail Tergoev's avatar
Mikhail Tergoev committed
5779 5780
change_branch () {
    if [[ "$BRANCH" == "master" ]] ; then
5781
        if yad_question "${translations[Do you actually want to change the scripts version to:]} <b>DEVEL?</b>" ; then
5782 5783 5784
            sed -i 's/="master"/="devel"/g' "$USER_CONF"
            export MIRROR="GITHUB"
            pw_notify_send -i info \
5785
            "${translations[Branch changed to:]}" "<b>DEVEL</b>"
5786
            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
5787
            export PW_FORCE_UPDATE="1"
5788
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5789
    else
5790
        if yad_question "${translations[Do you actually want to change the scripts version to:]} <b>STABLE?</b>" ; then
5791 5792 5793 5794
            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 \
5795
            "${translations[Branch changed to:]}" "<b>STABLE</b>"
5796
            unset SKIP_CHECK_UPDATES
Vladislav's avatar
Vladislav committed
5797
            export PW_FORCE_UPDATE="1"
5798
        fi
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5799 5800
    fi
    print_info "Restarting PP for change branch..."
Vladislav's avatar
Vladislav committed
5801
    restart_pp --userconf
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5802 5803 5804
}
export -f change_branch

5805 5806 5807 5808
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 \
5809
        "${translations[Cover downloads are disabled]}"
5810 5811 5812
    else
        sed -i 's/DOWNLOAD_STEAM_GRID=.*/DOWNLOAD_STEAM_GRID="1"/' "$USER_CONF"
        pw_notify_send -i info \
5813
        "${translations[Cover downloads are enabled]}"
5814 5815
    fi
    print_info "Restarting PP for change cover download behavior..."
Vladislav's avatar
Vladislav committed
5816
    restart_pp --userconf
5817 5818 5819
}
export -f change_download_grid

Vladislav's avatar
Vladislav committed
5820 5821 5822
open_game_folder () {
    xdg-open "${PATH_TO_GAME}"
    print_info "Restarting PP after open game folder..."
Vladislav's avatar
Vladislav committed
5823
    restart_pp
Vladislav's avatar
Vladislav committed
5824 5825 5826
}
export -f open_game_folder

5827 5828 5829
change_gui_start () {
    if [[ "$PW_GUI_START" == "NOTEBOOK" ]] ; then
        sed -i 's/="NOTEBOOK"/="PANED"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5830
        pw_notify_send -i info \
5831
        "${translations[Gui start changed to:]}" "<b>PANED</b>"
5832 5833
    else
        sed -i 's/="PANED"/="NOTEBOOK"/g' "$USER_CONF"
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5834
        pw_notify_send -i info \
5835
        "${translations[Gui start changed to:]}" "<b>NOTEBOOK</b>"
5836 5837
    fi
    print_info "Restarting PP for change gui start..."
Vladislav's avatar
Vladislav committed
5838
    restart_pp --userconf
5839 5840 5841
}
export -f change_gui_start

5842 5843 5844 5845 5846 5847 5848
gui_wine_uninstaller () {
    start_portwine
    pw_run uninstaller
}
export -f gui_wine_uninstaller

gui_open_user_conf () {
5849
    PW_USERCONF_GUI="$("${pw_yad}" --title="${translations[EDIT USER CONFIG]}" \
5850 5851
    --text-info --editable --width=800 --height=600 \
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
5852 5853
    --button="${translations[BACK]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png"!"":1 \
    --button="${translations[SAVE]}"!"$PW_GUI_ICON_PATH/$BUTTON_SIZE.png"!"":2 \
5854 5855 5856 5857 5858 5859
    --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
5860
                restart_pp --userconf
5861 5862 5863 5864
                ;;
            2)
                echo "${PW_USERCONF_GUI}" > "${PORT_WINE_PATH}/data/user.conf"
                print_info "Restarting..."
Vladislav's avatar
Vladislav committed
5865
                restart_pp --userconf
5866 5867
                ;;
    esac
5868 5869 5870
}
export -f gui_open_user_conf

Vladislav's avatar
Vladislav committed
5871
gui_edit_db_file () {
5872
    GUI_EDIT_DB_FILE="$("${pw_yad}" --title="${translations[EDIT DB]}" \
Vladislav's avatar
Vladislav committed
5873 5874
    --text-info --editable --width=800 --height=600 \
    --window-icon="$PW_GUI_ICON_PATH/portproton.svg" \
5875 5876
    --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
5877 5878 5879 5880 5881
    --filename="${PORTWINE_DB_FILE}" 2>/dev/null)"
    YAD_STATUS="$?"

    case "$YAD_STATUS" in
        1|252)
Vladislav's avatar
Vladislav committed
5882
                restart_pp --edit_db
Vladislav's avatar
Vladislav committed
5883 5884 5885
                ;;
          2)
                echo "${GUI_EDIT_DB_FILE}" > "${PORTWINE_DB_FILE}"
Vladislav's avatar
Vladislav committed
5886
                restart_pp --edit_db
Vladislav's avatar
Vladislav committed
5887 5888 5889 5890
                ;;
    esac
}

5891
gui_open_scripts_from_backup () {
Mikhail Tergoev's avatar
Mikhail Tergoev committed
5892
    cd "${PORT_WINE_TMP_PATH}/scripts_backup/" || fatal
5893
    PW_SCRIPT_FROM_BACKUP=$("${pw_yad}" --file --width=650 --height=500 \
5894 5895
    --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="$?"
5896

Vladislav's avatar
Vladislav committed
5897
    if [[ "$YAD_STATUS" == "1" || "$YAD_STATUS" == "252" ]] ; then
Vladislav's avatar
Vladislav committed
5898
        restart_pp
Vladislav's avatar
Vladislav committed
5899
    fi
5900
    unpack "$PW_SCRIPT_FROM_BACKUP" "${PORT_WINE_PATH}/data/"
5901 5902
    echo "0" > "${PORT_WINE_TMP_PATH}/scripts_update_notifier"
    print_info "Restarting PP after backup..."
Vladislav's avatar
Vladislav committed
5903
    restart_pp
5904 5905
}
export -f gui_open_scripts_from_backup
5906 5907 5908 5909 5910 5911 5912 5913

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

5914 5915
    # shellcheck source=/dev/null
    source "${PORT_WINE_PATH}/data/scripts/thanks"
5916 5917

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

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

5923 5924
${translations[This program comes with absolutely no warranty.
See the License for details.]}" 2>/dev/null &
5925 5926

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

5929 5930
Developer assistants and testers:]}
$(credits_devel)" 2>/dev/null &
5931

Vladislav's avatar
Vladislav committed
5932
    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=3 --text-info --scroll <<< "$(eval_translations "MIT License
5933

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

5936
Permission is hereby granted, free of charge, to any person obtaining a copy
5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951
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
Vladislav's avatar
Vladislav committed
5952
SOFTWARE." "DATE=$(date +%Y)")" 2>/dev/null &
5953 5954 5955

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

5960
${translations[The list will be updated...]}" 2>/dev/null &
5961 5962

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=5 \
5963
    --text="${translations[Do you want to join and help in the development of the project:]}" \
5964
    --image-path="$PW_GUI_ICON_PATH" --image="port_proton" \
5965
    --uri-color=red --show-uri --text-info --scroll <<< "${translations[Website:  http://linux-gaming.ru
5966 5967 5968 5969 5970 5971
Discord:  http://discord.gg/yJSEFjF
VK:       https://vk.com/linuxgamingru
-------------------------------------------
Become a paid subscriber:
boosty:  https://boosty.to/portwine-linux.ru
Yandex wallet:   410012267513818
5972
-------------------------------------------]}" 2>/dev/null &
5973 5974

    "${pw_yad}" --plug="${KEY_CREDITS}" --tabnum=6 --show-uri --title="THIRD PARTY LIBRARIES" \
5975
    --text-info <<< "${translations[                               Third-party libraries that are used in PortProton
5976 5977 5978 5979 5980 5981 5982

            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
5983
DGVOODOO2: https://dege.fw.hu/]}" 2>/dev/null &
5984

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

Vladislav's avatar
Vladislav committed
5990
    restart_pp
5991
}