Compare commits

..

37 Commits

Author SHA1 Message Date
2a94a94a2d Scripts version 2369 2024-10-31 19:17:31 +03:00
bab3977af0 Merge branch 'Boria138-telegram-readme' into devel 2024-10-31 18:47:34 +03:00
2f25298ad1 Merge branch 'telegram-readme' of github.com:Boria138/PortWINE into Boria138-telegram-readme 2024-10-31 18:47:23 +03:00
af62974fdb fix download no-mirror and drop progpfx 2024-10-31 18:46:55 +03:00
d4c0104fcc Replace discord in readme to telegram 2024-10-31 18:24:39 +05:00
67c419d7a4 fixed cover_gui 2024-10-31 15:17:45 +03:00
4a3d9a6d6f added arg: --block to pw_start_progress_bar_cover 2024-10-31 14:14:57 +03:00
100d5f49a6 Merge branch 'Htylol-array-for-block' into devel 2024-10-31 13:59:58 +03:00
235a267d43 Merge branch 'array-for-block' of github.com:Htylol/PortWINE into Htylol-array-for-block 2024-10-31 13:59:52 +03:00
a43b415d4b fixed name pfx before unpacking 2024-10-31 13:51:37 +03:00
fc0aa3a3f8 Merge branch 'Htylol-cli-func1' into devel 2024-10-31 13:24:18 +03:00
4580894721 Merge branch 'cli-func1' of github.com:Htylol/PortWINE into Htylol-cli-func1 2024-10-31 13:24:11 +03:00
7036f06b6f updated func: check_selinux 2024-10-31 13:23:16 +03:00
36e3163edf Merge branch 'Htylol-fix-selinux-1' into devel 2024-10-31 13:19:56 +03:00
576155e0df Merge branch 'fix-selinux-1' of github.com:Htylol/PortWINE into Htylol-fix-selinux-1 2024-10-31 13:19:48 +03:00
6e5cee5ccc Merge branch 'minergenon-4games' into devel 2024-10-31 13:18:22 +03:00
8faed4e910 Merge branch '3games' of github.com:minergenon/PortWINE into minergenon-4games 2024-10-31 13:18:11 +03:00
c85b706fee added print_error for check exit_code in create_name_desktop 2024-10-31 13:15:52 +03:00
732a00183f used 2024-10-31 13:10:14 +03:00
4906e8cc3a Merge branch 'Htylol-repair-stat' into devel 2024-10-31 13:06:06 +03:00
51cc3610b8 Added --pulsate for --progress 2024-10-31 01:22:44 +05:00
3d6c08b319 Use pw_stop_progress_bar with array 2024-10-29 16:36:00 +05:00
0e0ec3028d minor edition 2024-10-29 01:57:12 +05:00
92d86fb496 Added --launch and --edit-db for cli 2024-10-28 23:22:22 +05:00
8b223bed38 Added check_selinux 2024-10-28 17:05:17 +05:00
fe1ff111fa added game THE_WORLD_NIFTY_CRAFT 2024-10-28 13:15:45 +06:00
3e67394c91 added game PW_ELDEVIN 2024-10-28 13:14:32 +06:00
e3be4858b0 added game TORIBASH 2024-10-28 13:12:09 +06:00
a81a8d8fe0 added games CHICKEN_INVADERS_UNIVERSE 2024-10-28 13:10:50 +06:00
ae17cd8b01 Fixed for ai and autoshortcuts 2024-10-28 09:36:54 +05:00
00fed7a134 Fixed for PORTWINE_DB_DESKTOP 2024-10-28 08:29:59 +05:00
e89dae4f23 Replace search_desktop_file on return 2024-10-28 08:08:24 +05:00
068d148eab optimization 2024-10-28 06:17:05 +05:00
c15ec0102f Added COUNT_STARTS 2024-10-28 05:56:56 +05:00
4ee7af0997 Added disabled stat func 2024-10-28 04:00:05 +05:00
629f50e097 Fixed bugs 2024-10-28 02:30:24 +05:00
0c97d2c003 Repair stat func and dropped entry point 2024-10-28 01:14:30 +05:00
15 changed files with 405 additions and 124 deletions

View File

@ -7,8 +7,8 @@
<a href="https://flathub.org/ru/apps/ru.linux_gaming.PortProton"> <a href="https://flathub.org/ru/apps/ru.linux_gaming.PortProton">
<img src="https://img.shields.io/flathub/downloads/ru.linux_gaming.PortProton?style=flat&logo=flathub" alt="Flathub Downloads"> <img src="https://img.shields.io/flathub/downloads/ru.linux_gaming.PortProton?style=flat&logo=flathub" alt="Flathub Downloads">
</a> </a>
<a href="https://discord.gg/FTaheP99wE"> <a href="https://t.me/linux_gaming_ru">
<img src="https://img.shields.io/discord/378683352946835456?logo=discord" alt="Discord"> <img src="https://img.shields.io/endpoint?&style=flat&url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Flinux_gaming_ru" alt="Telegram">
</a> </a>
<a href="https://www.youtube.com/@linux-gaming5986"> <a href="https://www.youtube.com/@linux-gaming5986">
<img src="https://img.shields.io/youtube/channel/subscribers/UCbI8OJx2D3q-4QKt4LffXTw?style=flat&logo=youtube" alt="YouTube Channel Subscribers"> <img src="https://img.shields.io/youtube/channel/subscribers/UCbI8OJx2D3q-4QKt4LffXTw?style=flat&logo=youtube" alt="YouTube Channel Subscribers">

View File

@ -7,8 +7,8 @@
<a href="https://flathub.org/apps/ru.linux_gaming.PortProton"> <a href="https://flathub.org/apps/ru.linux_gaming.PortProton">
<img src="https://img.shields.io/flathub/downloads/ru.linux_gaming.PortProton?style=flat&logo=flathub" alt="Flathub Downloads"> <img src="https://img.shields.io/flathub/downloads/ru.linux_gaming.PortProton?style=flat&logo=flathub" alt="Flathub Downloads">
</a> </a>
<a href="https://discord.gg/FTaheP99wE"> <a href="https://t.me/linux_gaming_ru">
<img src="https://img.shields.io/discord/378683352946835456?logo=discord" alt="Discord"> <img src="https://img.shields.io/endpoint?&style=flat&url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Flinux_gaming_ru" alt="Telegram">
</a> </a>
<a href="https://www.youtube.com/@linux-gaming5986"> <a href="https://www.youtube.com/@linux-gaming5986">
<img src="https://img.shields.io/youtube/channel/subscribers/UCbI8OJx2D3q-4QKt4LffXTw?style=flat&logo=youtube" alt="YouTube Channel Subscribers"> <img src="https://img.shields.io/youtube/channel/subscribers/UCbI8OJx2D3q-4QKt4LffXTw?style=flat&logo=youtube" alt="YouTube Channel Subscribers">

View File

@ -2,6 +2,17 @@ You can help us in the development of the project on the website: https://linux-
---------------------------------------- ----------------------------------------
Changelog: Changelog:
###Scripts version 2369### / Date: 31.10.2024 / Download update size: 4 megabytes
* added automatic installation of games (thanks to Chal55rus):
* Chicken Invaders Universe
* Eldevin
* The World of Nifty Craft
* Toribash
* improved performance of the time spent in the game counter (thanks to Htylol)
* fixed prefix backups for systems with SELinux (thanks to Htylol and Alek)
* updated CLI and added arguments: --launch, --edit-db (thanks to Htylol)
* many other improvements and script optimizations
###Scripts version 2368### / Date: 27.10.2024 / Download update size: 4 megabytes ###Scripts version 2368### / Date: 27.10.2024 / Download update size: 4 megabytes
* added automatic installation of games (thanks to Chal55rus): * added automatic installation of games (thanks to Chal55rus):
* Goose Goose Duck * Goose Goose Duck

View File

@ -2,6 +2,17 @@
----------------------------------------- -----------------------------------------
История изменений: История изменений:
###Scripts version 2369### / Дата: 31.10.2024 / Размер скачиваемого обновления: 4 мегабайта
* добавлены автоустановки игр (спасибо Chal55rus):
* Chicken Invaders Universe
* Eldevin
* The World of Nifty Craft
* Toribash
* улучшена работа счетчика времени проведенного в игре (спасибо Htylol)
* исправлены бэкапы префиксов для систем с SELinux (спасибо Htylol и Alek)
* обновлен CLI и добавлены аргументы: --launch, --edit-db (спасибо Htylol)
* множество других улучшений и оптимизаций скриптов
###Scripts version 2368### / Дата: 27.10.2024 / Размер скачиваемого обновления: 4 мегабайта ###Scripts version 2368### / Дата: 27.10.2024 / Размер скачиваемого обновления: 4 мегабайта
* добавлены автоустановки игр (спасибо Chal55rus): * добавлены автоустановки игр (спасибо Chal55rus):
* Goose Goose Duck * Goose Goose Duck

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -63,6 +63,21 @@ export -f make_abbreviation
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;} check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
# Эксортирует несколько переменных за один раз (одной командой)
# и создаёт список этих переменных в $keys_all
# К примеру set_several_variables PW_MANGOHUD=1 PW_VKBASALT=0
set_several_variables () {
local key value
unset keys_all
while (( $# > 0 )) ; do
key=${1//=*/}
value=${1//*=/}
keys_all+="$key "
export "$key"="$value"
shift
done
}
add_to_var () { add_to_var () {
if ! echo ${!1} | grep "$2" &>/dev/null if ! echo ${!1} | grep "$2" &>/dev/null
then export $1="${!1} $2" then export $1="${!1} $2"
@ -526,7 +541,7 @@ try_download () {
if [[ -n "${PW_AUTOINSTALL_EXE}" ]] \ if [[ -n "${PW_AUTOINSTALL_EXE}" ]] \
&& [[ "$no_mirror" == "true" ]] && [[ "$no_mirror" == "true" ]]
then then
filename="$(basename "${PW_AUTOINSTALL_EXE}")" filename="${PW_AUTOINSTALL_EXE//*\//}"
else else
filename="$(basename "$1")" filename="$(basename "$1")"
fi fi
@ -560,7 +575,7 @@ try_download () {
else else
curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \ curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
-H 'Pragma: no-cache' -L ${FIRST_URL[@]} -o "$dest" 2>&1 | \ -H 'Pragma: no-cache' -L ${FIRST_URL[@]} -o "$dest" 2>&1 | \
tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \ tr '\r' '\n' | sed -ur 's|[# ]+||g;s|100||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
"$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \ "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
--auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \ --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
--window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
@ -571,7 +586,7 @@ try_download () {
print_warning "Failed download $filename from ${FIRST_URL[0]}, trying mirror: ${SECOND_URL[0]}" print_warning "Failed download $filename from ${FIRST_URL[0]}, trying mirror: ${SECOND_URL[0]}"
curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \ curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' \
-H 'Pragma: no-cache' -L ${SECOND_URL[@]} -o "$dest" 2>&1 | \ -H 'Pragma: no-cache' -L ${SECOND_URL[@]} -o "$dest" 2>&1 | \
tr '\r' '\n' | sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \ tr '\r' '\n' | sed -ur 's|[# ]+||g;s|100||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g' | \
"$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \ "$pw_yad" --progress --text="${translations[Downloading]} $filename" --auto-close --no-escape \
--auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \ --auto-kill --text-align="center" --fixed --no-buttons --title "PortProton" --width=500 --height=90 \
--window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --borders="$PROGRESS_BAR_BORDERS_SIZE"
@ -748,6 +763,26 @@ check_flatpak () {
} }
export -f check_flatpak export -f check_flatpak
check_selinux () {
if [[ -n "$SELINUX_IN_USE" ]]
then [[ "$SELINUX_IN_USE" == 1 ]] && return 0 || return 1
fi
if check_flatpak ; then
if grep -i ^"SELINUX=enforcing" /run/host/etc/selinux/config &>/dev/null ; then
export SELINUX_IN_USE=1
return 0
fi
else
if grep -i ^"SELINUX=enforcing" /etc/selinux/config &>/dev/null ; then
export SELINUX_IN_USE=1
return 0
fi
fi
export SELINUX_IN_USE=0
return 1
}
export -f check_selinux
background_pid () { background_pid () {
local arg1=$1 # --start или --end local arg1=$1 # --start или --end
local arg2=$2 # Название команды local arg2=$2 # Название команды
@ -796,9 +831,9 @@ unpack () {
[[ "$?" != 0 ]] && return 1 || return 0 [[ "$?" != 0 ]] && return 1 || return 0
elif [[ "$silent" != "true" ]] ; then elif [[ "$silent" != "true" ]] ; then
set -o pipefail set -o pipefail
pw_start_progress_bar_cover_block "${COVERS_PATH}/unpacking_${LANGUAGE_GIF}.gif" pw_start_progress_bar_cover "${COVERS_PATH}/unpacking_${LANGUAGE_GIF}.gif" --block
$command "$1" -C "$2" 2>/dev/null $command "$1" -C "$2" 2>/dev/null
pw_stop_progress_bar_cover_block pw_stop_progress_bar
[[ "${PIPESTATUS[0]}" != 0 ]] && print_error "File $1 unpacking error." && return 1 || return 0 [[ "${PIPESTATUS[0]}" != 0 ]] && print_error "File $1 unpacking error." && return 1 || return 0
else else
$command "$1" -C "$2" && return 0 || return 1 $command "$1" -C "$2" && return 0 || return 1
@ -849,7 +884,12 @@ debug_timer () {
# Поиск нужного .desktop файла по $portwine_exe (для показа в комментариях нужного времени) # Поиск нужного .desktop файла по $portwine_exe (для показа в комментариях нужного времени)
# Параллельное создание базы по времени после завершения приложения # Параллельное создание базы по времени после завершения приложения
search_desktop_file () { search_desktop_file () {
local desktop_file desktop_file_new EXEC_DESKTOP line1 line2 TIME_TOTAL local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND
if [[ -z $FILE_SHA256SUM ]] ; then
read -r -a FILE_SHA256SUM_ARRAY < <(sha256sum "$portwine_exe")
FILE_SHA256SUM=${FILE_SHA256SUM_ARRAY[0]}
edit_db_from_gui FILE_SHA256SUM
fi
for desktop_file in "$PORT_WINE_PATH"/* ; do for desktop_file in "$PORT_WINE_PATH"/* ; do
desktop_file_new="${desktop_file//"$PORT_WINE_PATH/"/}" desktop_file_new="${desktop_file//"$PORT_WINE_PATH/"/}"
if [[ $desktop_file_new =~ .desktop$ ]] ; then if [[ $desktop_file_new =~ .desktop$ ]] ; then
@ -863,62 +903,174 @@ search_desktop_file () {
fi fi
fi fi
done < "$desktop_file" done < "$desktop_file"
while IFS=" " read -r -a line2 ; do
if [[ ${line2[1]} == "$ENTRY_POINT" ]] ; then
break
fi
done < "$PORT_WINE_TMP_PATH/statistics"
if [[ $portwine_exe == "${EXEC_DESKTOP//\"/}" ]] ; then if [[ $portwine_exe == "${EXEC_DESKTOP//\"/}" ]] ; then
DESKTOP_CORRECT_FILE="$desktop_file" DESKTOP_CORRECT_FILE="$desktop_file"
break
fi fi
fi fi
fi fi
done done
if [[ $DESKTOP_WITH_TIME == enabled ]] || [[ $SORT_WITH_TIME == enabled ]] ; then
while IFS=" " read -r -a line2 ; do
if [[ -z ${line2[0]} ]] \
|| [[ ! ${line2[0],,} =~ (.bat$|.exe$|.msi$|.reg$) ]] ; then
BROKEN_LINE=1
break
fi
if [[ ${line2[1]} == "$FILE_SHA256SUM" ]] ; then
FILE_SHA256SUM_FOUND=1
break
fi
if [[ ${line2[1]} != "$FILE_SHA256SUM" ]] \
&& [[ ${line2[0]} == "${portwine_exe// /#@_@#}" ]] ; then
FILE_SHA256SUM_NOT_FOUND=1
break
fi
done < "$PORT_WINE_TMP_PATH/statistics"
fi
IFS="$orig_IFS" IFS="$orig_IFS"
if [[ -n ${line2[2]} ]] if [[ $DESKTOP_WITH_TIME == enabled ]] || [[ $SORT_WITH_TIME == enabled ]] ; then
then TIME_CURRENT=${line2[2]} local line3 line4 count_line i TIME_TOTAL SKIP_REPAIR
else TIME_CURRENT=0 ## Ремонты:
fi # Ремонт, проверяет чтобы длинна хеш суммы была равна 64 символам, в ином случае удалит битые
export TIME_CURRENT if [[ $FILE_SHA256SUM_NOT_FOUND == 1 ]] && [[ ${#line2[1]} != "64" ]] ; then
# Проверка новых десктоп файлов, чтобы их можно было сортировать первыми при первом создании в главном меню while IFS=" " read -r -a line3 ; do
if [[ $PW_NEW_DESKTOP == 1 ]] && [[ ${line2[3]} != NEW_DESKTOP ]] ; then if [[ ${#line3[1]} == "64" ]]
if [[ -n ${line2[1]} ]] ; then then echo "${line3[*]}"
sed -i "s|$ENTRY_POINT $TIME_CURRENT OLD_DESKTOP|$ENTRY_POINT $TIME_CURRENT NEW_DESKTOP|" "$PORT_WINE_TMP_PATH/statistics" fi
else done < "$PORT_WINE_TMP_PATH/statistics" > "$PORT_WINE_TMP_PATH/statistics_repair"
echo "${portwine_exe// /#@_@#} $ENTRY_POINT $TIME_CURRENT NEW_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics" IFS="$orig_IFS"
try_remove_file "$PORT_WINE_TMP_PATH/statistics"
mv -f "$PORT_WINE_TMP_PATH/statistics_repair" "$PORT_WINE_TMP_PATH/statistics"
return 1
fi
# Ремонт, если есть пустые строки и непонятные строки без .exe, .bat, .msi, .reg
if [[ $BROKEN_LINE == 1 ]] ; then
while IFS=" " read -r -a line4 ; do
if [[ -n ${line4[0]} ]] && [[ ${line4[0]} =~ (.[Bb][Aa][Tt]$|.[Ee][Xx][Ee]$|.[Mm][Ss][Ii]$|.[Rr][Ee][Gg]$) ]]
then echo "${line4[*]}"
fi
done < "$PORT_WINE_TMP_PATH/statistics" > "$PORT_WINE_TMP_PATH/statistics_repair"
IFS="$orig_IFS"
try_remove_file "$PORT_WINE_TMP_PATH/statistics"
mv -f "$PORT_WINE_TMP_PATH/statistics_repair" "$PORT_WINE_TMP_PATH/statistics"
return 1
fi
# Ремонтирует путь на новый, если вдруг путь до .exe файла битый или изменился, но .exe файл он опознал
if [[ $FILE_SHA256SUM_FOUND == 1 ]] && [[ ${line2[0]} != "${portwine_exe// /#@_@#}" ]] ; then
sed -i "s|${line2[0]} ${line2[1]}|${portwine_exe// /#@_@#} ${line2[1]}|" "$PORT_WINE_TMP_PATH/statistics"
line2[0]=${portwine_exe// /#@_@#}
fi
# Ремонт, если sha256sum изменилась, но путь до .exe тот же
if [[ $FILE_SHA256SUM_NOT_FOUND == 1 ]] ; then
sed -i "s|${line2[0]} ${line2[1]}|${line2[0]} $FILE_SHA256SUM|" "$PORT_WINE_TMP_PATH/statistics"
line2[1]=$FILE_SHA256SUM
fi
# Когда приложения ещё нет в статистике
[[ -z ${line2[2]} ]] && line2[2]=0
# Ремонт, если сломалось время
if (( line2[2] >= 999999999 )) ; then
sed -i "s|${line2[1]} ${line2[2]}|${line2[1]} 0|" "$PORT_WINE_TMP_PATH/statistics"
line2[2]=0
fi
# Ремонт, если кто-то сломал время
if [[ ! ${line2[2]} =~ ^[0-9]+$ ]] ; then
sed -i "/${line2[1]}/d" "$PORT_WINE_TMP_PATH/statistics"
return 1
fi
###############################
# Общее проведённое время в секундах
export TIME_CURRENT=${line2[2]}
# количество запусков приложения
export COUNT_STARTS=${line2[4]//L4-/}
###############################
# Проверка новых десктоп файлов, чтобы их можно было сортировать первыми при первом создании в главном меню + ремонт
if [[ $PW_NEW_DESKTOP == 1 ]] && [[ ${line2[3]} != NEW_DESKTOP ]] ; then
if [[ $FILE_SHA256SUM_FOUND == 1 ]] ; then
sed -i "s|${line2[1]} \(.*\) ${line2[3]}|${line2[1]} \1 NEW_DESKTOP|" "$PORT_WINE_TMP_PATH/statistics"
else
echo "${portwine_exe// /#@_@#} $FILE_SHA256SUM $TIME_CURRENT NEW_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics"
fi
fi
unset PW_NEW_DESKTOP
# Когда приложение было запущено и завершено
if [[ -n $PW_TIME_IN_GAME ]] ; then
TIME_TOTAL=$(( TIME_CURRENT + PW_TIME_IN_GAME ))
if [[ $FILE_SHA256SUM_FOUND == 1 ]] ; then
# Когда есть предыдущее время
sed -i "s|$FILE_SHA256SUM $TIME_CURRENT|$FILE_SHA256SUM $TIME_TOTAL|" "$PORT_WINE_TMP_PATH/statistics"
else
# Когда только запустили приложение первый раз
echo "${portwine_exe// /#@_@#} $FILE_SHA256SUM $TIME_TOTAL OLD_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics"
fi
count_line=4
# Здесь добавляются новые линии для статистики (L4-) важен
if [[ -z ${line2[4]} ]] ; then
SKIP_REPAIR=1
sed -i "s|$FILE_SHA256SUM \(.*\)|$FILE_SHA256SUM \1 L4-1|" "$PORT_WINE_TMP_PATH/statistics"
else
# ремонт, если L4 по каким-то причинам сломался
if [[ ${line2[4]} =~ ^L4 ]] ; then
local NUMBER_OF_STARTS=$(( ${line2[4]//L4-/} + 1 ))
else
SKIP_REPAIR=1
sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[4]}|$FILE_SHA256SUM \1 L4-1|" "$PORT_WINE_TMP_PATH/statistics"
fi
fi
(( count_line ++ ))
# Пример для L5
# if [[ -z ${line2[5]} ]] ; then
# SKIP_REPAIR=1
# sed -i "s|$FILE_SHA256SUM \(.*\)|$FILE_SHA256SUM \1 L5-1|" "$PORT_WINE_TMP_PATH/statistics"
# else
# if [[ ${line2[5]} =~ ^L5 ]] ; then
# local ЗДЕСЬ_НОВАЯ_ПЕРЕМЕННАЯ=$(( ${line2[5]//L5-/} + 1 ))
# else
# SKIP_REPAIR=1
# sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[5]}|$FILE_SHA256SUM \1 L5-1|" "$PORT_WINE_TMP_PATH/statistics"
# fi
# fi
# (( count_line ++ ))
if [[ $SKIP_REPAIR != 1 ]] ; then
# Ремонт, если количество элементов массива по каким-то причина больше, чем должно быть
if [[ -n ${line2["$count_line"]} ]] ; then
for i in $(seq $count_line ${#line2[@]}) ; do
unset 'line2[$i]'
done
sed -i "s|${portwine_exe// /#@_@#} $FILE_SHA256SUM \(.*\)|${line2[*]}|" "$PORT_WINE_TMP_PATH/statistics"
fi
# Сюда все sedы от L4, L5 и т.д. (после всех ремонтов)
sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[4]}|$FILE_SHA256SUM \1 L4-$NUMBER_OF_STARTS|" "$PORT_WINE_TMP_PATH/statistics"
# sed -i "s|$FILE_SHA256SUM \(.*\) ${line2[5]}|$FILE_SHA256SUM \1 L5-$NUMBER_OF_STARTS|" "$PORT_WINE_TMP_PATH/statistics"
fi
fi fi
fi fi
unset PW_NEW_DESKTOP if [[ -n $PW_TIME_IN_GAME ]]
# Когда приложение было запущено и завершено then return 2
if [[ -n $PW_TIME_IN_GAME ]] ; then else return 0
TIME_TOTAL=$(( TIME_CURRENT + PW_TIME_IN_GAME ))
if [[ -n ${line2[1]} ]] ; then
# Когда есть предыдущее время
sed -i "s|$ENTRY_POINT $TIME_CURRENT|$ENTRY_POINT $TIME_TOTAL|" "$PORT_WINE_TMP_PATH/statistics"
else
# Когда только запустили приложение первый раз
echo "${portwine_exe// /#@_@#} $ENTRY_POINT $TIME_TOTAL OLD_DESKTOP" >> "$PORT_WINE_TMP_PATH/statistics"
fi
# Здесь добавляются новые линии для статистики по аналогии, к примеру ${line2[4]}
# L4 важен, чтобы не было путаницы из-за sed, то что используется \(.*\), для ${line2[5]} это будет L5 и т.д.
if [[ -z ${line2[4]} ]] ; then
line2[4]=1
sed -i "s|$ENTRY_POINT \(.*\)|$ENTRY_POINT \1 L4-${line2[4]}|" "$PORT_WINE_TMP_PATH/statistics"
else
line2[4]=${line2[4]//L4-/}
NUMBER_OF_STARTS=$(( line2[4] + 1 ))
sed -i "s|$ENTRY_POINT \(.*\) L4-${line2[4]}|$ENTRY_POINT \1 L4-$NUMBER_OF_STARTS|" "$PORT_WINE_TMP_PATH/statistics"
fi
fi
# Ремонтирует путь на новый, если вдруг путь до .exe файла битый или изменился, но .exe файл он опознал
if [[ -n ${line2[1]} ]] && [[ ${line2[0]} != "${portwine_exe// /#@_@#}" ]] ; then
[[ -z $TIME_TOTAL ]] && TIME_TOTAL=$TIME_CURRENT
sed -i "s|${line2[0]} $ENTRY_POINT $TIME_CURRENT|${portwine_exe// /#@_@#} $ENTRY_POINT $TIME_TOTAL|" "$PORT_WINE_TMP_PATH/statistics"
fi fi
} }
create_name_desktop () { create_name_desktop () {
search_desktop_file while true ; do
search_desktop_file
local exit_code=$?
case $exit_code in
0) break ;;
1) continue ;;
2) return 0 ;;
*) print_error "Broken search_desktop_file func. No exit_code." ;;
esac
done
if [[ -n $DESKTOP_NAME_FILE ]] ; then if [[ -n $DESKTOP_NAME_FILE ]] ; then
DESKTOP_NAME_FILE_OLD=$DESKTOP_NAME_FILE DESKTOP_NAME_FILE_OLD=$DESKTOP_NAME_FILE
unset DESKTOP_NAME_FILE unset DESKTOP_NAME_FILE
@ -935,11 +1087,8 @@ create_name_desktop () {
DESKTOP_NAME_FILE="${DESKTOP_NAME_FILE//.desktop/}" DESKTOP_NAME_FILE="${DESKTOP_NAME_FILE//.desktop/}"
fi fi
if [[ -z $PORTWINE_DB ]] ; then PORTWINE_DB_DESKTOP="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
PORTWINE_DB_DESKTOP="$(basename "${portwine_exe%.[Ee][Xx][Ee]}")"
else
PORTWINE_DB_DESKTOP="$PORTWINE_DB"
fi
if [[ -n $PORTPROTON_NAME ]] ; then if [[ -n $PORTPROTON_NAME ]] ; then
PORTPROTON_NAME_ABBR=$(make_abbreviation "$PORTPROTON_NAME") PORTPROTON_NAME_ABBR=$(make_abbreviation "$PORTPROTON_NAME")
PORTPROTON_NAME_ACRO=$(make_acronym "$PORTPROTON_NAME") PORTPROTON_NAME_ACRO=$(make_acronym "$PORTPROTON_NAME")
@ -949,7 +1098,9 @@ create_name_desktop () {
FILE_DESCRIPTION_ACRO=$(make_acronym "$FILE_DESCRIPTION") FILE_DESCRIPTION_ACRO=$(make_acronym "$FILE_DESCRIPTION")
fi fi
if [[ -n $DESKTOP_NAME_FILE ]] ; then if [[ -n $PORTWINE_CREATE_SHORTCUT_NAME ]] ; then
PW_NAME_DESKTOP_PROXY="$PORTWINE_CREATE_SHORTCUT_NAME"
elif [[ -n $DESKTOP_NAME_FILE ]] ; then
PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE" PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE"
elif [[ -n $DESKTOP_NAME_FILE_OLD && ${PORTWINE_DB_DESKTOP^^} =~ ${DESKTOP_NAME_FILE_OLD^^} ]] ; then elif [[ -n $DESKTOP_NAME_FILE_OLD && ${PORTWINE_DB_DESKTOP^^} =~ ${DESKTOP_NAME_FILE_OLD^^} ]] ; then
PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE_OLD" PW_NAME_DESKTOP_PROXY="$DESKTOP_NAME_FILE_OLD"
@ -1283,12 +1434,12 @@ init_wine_ver () {
if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then if check_symlink "${WINEDIR}/share/wine/${mono_gecko_chk}" ; then
print_info "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK." print_info "${WINEDIR}/share/wine/${mono_gecko_chk} is symlink. OK."
elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then elif [[ -d "${WINEDIR}/share/wine/${mono_gecko_chk}" ]] ; then
pw_start_progress_bar_cover_block "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif" pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif" --block
try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}" try_copy_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" "${PORT_WINE_TMP_PATH}"
try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine/ 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." 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 pw_stop_progress_bar
else else
try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}" try_remove_dir "${WINEDIR}/share/wine/${mono_gecko_chk}"
try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine try_force_link_dir "${PORT_WINE_TMP_PATH}/${mono_gecko_chk}" "${WINEDIR}"/share/wine
@ -1613,10 +1764,10 @@ stop_portwine () {
pw_auto_create_shortcut pw_auto_create_shortcut
add_in_stop_portwine add_in_stop_portwine
if [[ $PW_LOG != 1 ]] ; then if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then
debug_timer --end -s "PW_TIME_IN_GAME" debug_timer --end -s "PW_TIME_IN_GAME"
PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) # в секундах PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) # в секундах
search_desktop_file create_name_desktop
fi fi
case "$1" in case "$1" in
@ -2474,7 +2625,6 @@ pw_create_gui_png () {
fi fi
if [[ -z "$PORTPROTON_NAME" ]] \ if [[ -z "$PORTPROTON_NAME" ]] \
|| [[ -z "$FILE_DESCRIPTION" ]] \ || [[ -z "$FILE_DESCRIPTION" ]] \
|| [[ -z "$ENTRY_POINT" ]] \
|| [[ "$PW_NO_RESTART_PPDB" == "1" ]] || [[ "$PW_NO_RESTART_PPDB" == "1" ]]
then then
if [[ -n "${PORTWINE_CREATE_SHORTCUT_NAME}" ]] ; then if [[ -n "${PORTWINE_CREATE_SHORTCUT_NAME}" ]] ; then
@ -2484,7 +2634,6 @@ pw_create_gui_png () {
if timeout 3 exiftool "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then if timeout 3 exiftool "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then
PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
ENTRY_POINT=$(sed -n 's/^Entry Point\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
else else
print_error "exiftool - broken!" print_error "exiftool - broken!"
fi fi
@ -2493,7 +2642,6 @@ pw_create_gui_png () {
env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp" env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$portwine_exe" &> "${PW_TMPFS_PATH}/exiftool.tmp"
PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") PW_PRODUCTNAME=$(sed -n 's/^Product Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") FILE_DESCRIPTION=$(sed -n 's/^File Description\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
ENTRY_POINT=$(sed -n 's/^Entry Point\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
fi fi
if [[ "$PW_PRODUCTNAME" =~ (Launcher|RU) ]] if [[ "$PW_PRODUCTNAME" =~ (Launcher|RU) ]]
@ -2512,7 +2660,7 @@ pw_create_gui_png () {
PORTPROTON_NAME="$(echo "${PORTPROTON_NAME}" | sed "s/\`//g" | sed "s/\"//g" | sed "s/'//g" | sed "s/\!//g")" PORTPROTON_NAME="$(echo "${PORTPROTON_NAME}" | sed "s/\`//g" | sed "s/\"//g" | sed "s/'//g" | sed "s/\!//g")"
export PORTPROTON_NAME export PORTPROTON_NAME
edit_db_from_gui PORTPROTON_NAME FILE_DESCRIPTION ENTRY_POINT edit_db_from_gui PORTPROTON_NAME FILE_DESCRIPTION
fi fi
resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128" resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128"
@ -2602,7 +2750,6 @@ start_portwine () {
pw_get_pfx () { pw_get_pfx () {
case "${PW_PREFIX_NAME}" in case "${PW_PREFIX_NAME}" in
PROGRAMS) local FILE_NAME_PFX="progpfx${PROGPFX_VER}" ;;
DOTNET) local FILE_NAME_PFX="dotpfx${DOTPFX_VER}" ;; DOTNET) local FILE_NAME_PFX="dotpfx${DOTPFX_VER}" ;;
*) return 0 ;; *) return 0 ;;
esac esac
@ -2741,6 +2888,7 @@ start_portwine () {
unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent unpack "${PW_PLUGINS_PATH}/blank_pfx.tar.xz" "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent
pw_wineboot -i pw_wineboot -i
fi fi
pw_stop_progress_bar
else else
check_dirs_and_files_in_pfx check_dirs_and_files_in_pfx
if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver" ]] \ if [[ ! -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/.wine_ver" ]] \
@ -2749,6 +2897,7 @@ start_portwine () {
then then
pw_update_pfx_cover_gui pw_update_pfx_cover_gui
pw_wineboot -r pw_wineboot -r
pw_stop_progress_bar
fi fi
fi fi
rm -f "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk rm -f "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk
@ -3615,14 +3764,14 @@ start_portwine () {
sed -i "/\"Audio\"=/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
fi fi
pw_stop_progress_bar && pw_stop_progress_bar
if ! check_start_from_steam ; then if ! check_start_from_steam ; then
pw_tray_icon pw_tray_icon
sleep 0.5 sleep 0.5
fi fi
if [[ "${PW_CHECK_AUTOINSTALL}" != "1" ]] ; then if [[ "${PW_CHECK_AUTOINSTALL}" != "1" ]] ; then
pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif" pw_start_progress_bar_cover "${COVERS_PATH}/loading_${LANGUAGE_GIF}.gif"
fi fi
add_in_start_portwine add_in_start_portwine
@ -3780,7 +3929,6 @@ pw_run () {
print_var "WINEDIR" "WINEPREFIX" "WINEDLLOVERRIDES" "PATH_TO_GAME" "PW_WINE_USE" "PW_VULKAN_USE" "VULKAN_DRIVER_NAME" print_var "WINEDIR" "WINEPREFIX" "WINEDLLOVERRIDES" "PATH_TO_GAME" "PW_WINE_USE" "PW_VULKAN_USE" "VULKAN_DRIVER_NAME"
print_var "VKD3D_CONFIG" "PW_LD_LIBRARY_PATH" "PATH" "WINEESYNC" "WINEFSYNC" "WINEFSYNC_FUTEX2" print_var "VKD3D_CONFIG" "PW_LD_LIBRARY_PATH" "PATH" "WINEESYNC" "WINEFSYNC" "WINEFSYNC_FUTEX2"
print_var "WINEDLLPATH" "WINE_CPU_TOPOLOGY" "PW_RUN_GAMESCOPE" "LD_LIBRARY_PATH" 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 ]] \ if [[ "$PW_USE_RUNTIME" == 1 ]] \
&& [[ "$PW_WINE_USE" != "USE_SYSTEM_WINE" ]] && [[ "$PW_WINE_USE" != "USE_SYSTEM_WINE" ]]
then then
@ -3916,18 +4064,18 @@ portwine_launch () {
fi fi
[[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME"
case "$portwine_exe" in case "${portwine_exe,,}" in
*.[Ee][Xx][Ee]) *.exe)
pw_run ${PW_VD_TMP[@]} ${WINE_WIN_START} "$portwine_exe" pw_run ${PW_VD_TMP[@]} ${WINE_WIN_START} "$portwine_exe"
;; ;;
*.[Bb][Aa][Tt]) *.bat)
PW_USE_TERMINAL=1 PW_USE_TERMINAL=1
pw_run ${PW_VD_TMP[@]} "$portwine_exe" pw_run ${PW_VD_TMP[@]} "$portwine_exe"
;; ;;
*.[Mm][Ss][Ii]) *.msi)
pw_run ${PW_VD_TMP[@]} msiexec /i "$portwine_exe" pw_run ${PW_VD_TMP[@]} msiexec /i "$portwine_exe"
;; ;;
*.[Rr][Ee][Gg]) *.reg)
pw_run ${PW_VD_TMP[@]} regedit "$portwine_exe" pw_run ${PW_VD_TMP[@]} regedit "$portwine_exe"
;; ;;
*) *)
@ -4043,34 +4191,22 @@ yad_question () {
} }
pw_start_progress_bar_cover () { pw_start_progress_bar_cover () {
[[ "$2" != "--block" ]] && local AUTOCLOUSE="--close-on-unfocus"
if check_gamescope_session ; then if check_gamescope_session ; then
PW_GIF_FILE="${COVERS_PATH}/loading_deck.gif" PW_GIF_FILE="${COVERS_PATH}/loading_deck.gif"
"${pw_yad}" --picture --filename="${PW_GIF_FILE}" --close-on-unfocus --no-buttons --undecorated --fullscreen --skip-taskbar > /dev/null 2>&1 & "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --no-buttons --undecorated --fullscreen --skip-taskbar > /dev/null 2>&1 &
export PW_YAD_PID_PROGRESS_BAR_COVER="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
elif ! check_start_from_steam ; then elif ! check_start_from_steam ; then
PW_GIF_FILE="$1" PW_GIF_FILE="$1"
PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}') PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}')
PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}') PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}')
"${pw_yad}" --picture --filename="${PW_GIF_FILE}" --close-on-unfocus --no-buttons --undecorated \ "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --no-buttons --undecorated \
--skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 & --skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 &
export PW_YAD_PID_PROGRESS_BAR_COVER="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
fi fi
return 0 return 0
} }
pw_start_progress_bar_cover_block () {
if ! check_start_from_steam ; then
[[ ! -f "${pw_yad}" ]] && local pw_yad="yad"
PW_GIF_FILE="$1"
PW_GIF_SIZE_X=$(file "${PW_GIF_FILE}" | awk '{print $7 + 8}')
PW_GIF_SIZE_Y=$(file "${PW_GIF_FILE}" | awk '{print $9 + 15}')
"${pw_yad}" --picture --filename="${PW_GIF_FILE}" --close-on-unfocus --no-buttons --undecorated \
--skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" --window-icon="$PW_GUI_ICON_PATH/portproton.svg" > /dev/null 2>&1 &
export PW_YAD_PID_PROGRESS_BAR_COVER_BLOCK="$!"
return 0
fi
}
pw_update_pfx_cover_gui () { pw_update_pfx_cover_gui () {
if check_gamescope_session ; then if check_gamescope_session ; then
pw_start_progress_bar_cover pw_start_progress_bar_cover
@ -4111,7 +4247,7 @@ pw_update_pfx_cover_gui () {
"${pw_yad}" --notebook --key="$PW_KEY_PROGRESS_BAR_UP" $TAB_PLACE --no-buttons \ "${pw_yad}" --notebook --key="$PW_KEY_PROGRESS_BAR_UP" $TAB_PLACE --no-buttons \
--skip-taskbar --width="$PW_GIF_SIZE_X" --height="$PW_GIF_SIZE_Y" $YAD_UNDECORATED \ --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 & --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "PortProton" --tab-pos="bottom" --expand 2>/dev/null &
export PW_YAD_PID_PFX_COVER_UI="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
return 0 return 0
fi fi
} }
@ -4124,7 +4260,7 @@ pw_start_progress_bar_cs () {
--width="$PROGRESS_BAR_WIDTH_SIZE" \ --width="$PROGRESS_BAR_WIDTH_SIZE" \
--wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \ --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
--window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null & --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
export PW_YAD_PID_PROGRESS_BAR_CS="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
return 0 return 0
fi fi
} }
@ -4138,7 +4274,7 @@ pw_start_progress_bar_block () {
--width="$PROGRESS_BAR_WIDTH_SIZE" \ --width="$PROGRESS_BAR_WIDTH_SIZE" \
--wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \ --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
--window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null & --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
export PW_YAD_PID_PROGRESS_BAR_BLOCK="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
return 0 return 0
fi fi
} }
@ -4152,26 +4288,26 @@ pw_start_progress_bar_install_game () {
--width="$PROGRESS_BAR_WIDTH_SIZE" \ --width="$PROGRESS_BAR_WIDTH_SIZE" \
--wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \ --wrap-width="$PROGRESS_BAR_WIDTH_SIZE" \
--window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null & --window-icon="$PW_GUI_ICON_PATH/portproton.svg" &>/dev/null &
export PW_YAD_PID_PROGRESS_BAR_BLOCK="$!" PW_YAD_PID_PROGRESS_BAR+=($!)
return 0 return 0
fi fi
} }
pw_stop_progress_bar () { pw_stop_progress_bar () {
[[ -n $PW_YAD_PID_PROGRESS_BAR_BLOCK ]] && kill -s SIGUSR1 "$PW_YAD_PID_PROGRESS_BAR_BLOCK" &>/dev/null if [[ -n ${PW_YAD_PID_PROGRESS_BAR[0]} ]] ; then
[[ -n $PW_YAD_PID_PROGRESS_BAR_CS ]] && kill -s SIGUSR1 "$PW_YAD_PID_PROGRESS_BAR_CS" &>/dev/null local pid
[[ -n $PW_YAD_PID_PFX_COVER_UI ]] && kill -s SIGUSR1 "$PW_YAD_PID_PFX_COVER_UI" &>/dev/null for pid in ${PW_YAD_PID_PROGRESS_BAR[@]} ; do
[[ -n $PW_YAD_PID_PROGRESS_BAR_COVER ]] && kill -s SIGUSR1 "$PW_YAD_PID_PROGRESS_BAR_COVER" &>/dev/null # Здесь sleep нужен, потому что pid может уже быть, но kill его не убьет
unset PW_YAD_PID_PROGRESS_BAR_BLOCK PW_YAD_PID_PROGRESS_BAR_CS # со sleep 0.01 он делает 2 kill, c 0.02 нормально один
unset PW_YAD_PID_PFX_COVER_UI PW_YAD_PID_PROGRESS_BAR_COVER while $(sleep 0.02) && [[ -f /proc/$pid/exe ]] ; do
kill -s SIGUSR1 "$pid" &>/dev/null
done
done
unset PW_YAD_PID_PROGRESS_BAR
fi
} }
export -f pw_stop_progress_bar export -f pw_stop_progress_bar
pw_stop_progress_bar_cover_block () {
kill -s KILL "$PW_YAD_PID_PROGRESS_BAR_COVER_BLOCK" &>/dev/null
}
export -f pw_stop_progress_bar_cover_block
open_changelog () { open_changelog () {
[[ "$LANGUAGE" == ru ]] && local PW_CHANGELOG_FILE="changelog_ru" || local PW_CHANGELOG_FILE="changelog_en" [[ "$LANGUAGE" == ru ]] && local PW_CHANGELOG_FILE="changelog_ru" || local PW_CHANGELOG_FILE="changelog_en"
"${pw_yad}" --title="${translations[CHANGELOG]}" --no-buttons \ "${pw_yad}" --title="${translations[CHANGELOG]}" --no-buttons \
@ -4681,7 +4817,7 @@ relaxed - Same as fifo but allows tearing when below the monitors refresh rate.]
PW_LOCALE_SELECT="${PW_ADD_SETTINGS[9]}" PW_LOCALE_SELECT="${PW_ADD_SETTINGS[9]}"
PW_MESA_VK_WSI_PRESENT_MODE="${PW_ADD_SETTINGS[10]}" PW_MESA_VK_WSI_PRESENT_MODE="${PW_ADD_SETTINGS[10]}"
if [[ "${CPU_LIMIT}" =~ [0-9]+ ]] ; then if [[ "${CPU_LIMIT}" =~ ^[0-9]+$ ]] ; then
PW_WINE_CPU_TOPOLOGY="${CPU_LIMIT}:$(seq -s, 0 $(( CPU_LIMIT - 1 )))" PW_WINE_CPU_TOPOLOGY="${CPU_LIMIT}:$(seq -s, 0 $(( CPU_LIMIT - 1 )))"
else else
PW_WINE_CPU_TOPOLOGY="disabled" PW_WINE_CPU_TOPOLOGY="disabled"
@ -5684,7 +5820,8 @@ portwine_output_yad_shortcut () {
export PW_NEW_DESKTOP="1" export PW_NEW_DESKTOP="1"
if [[ "$PW_NO_RESTART_PPDB" != "1" ]] ; then if [[ "$PW_NO_RESTART_PPDB" != "1" ]] \
|| [[ -z ${LINKS[1]} ]] ; then
print_info "Restarting PP..." print_info "Restarting PP..."
[[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB
restart_pp restart_pp
@ -5693,7 +5830,7 @@ portwine_output_yad_shortcut () {
print_info "Restarting PP..." print_info "Restarting PP..."
[[ -n $KEY_MENU ]] && unset portwine_exe [[ -n $KEY_MENU ]] && unset portwine_exe
[[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB
[[ -z $LINKS ]] && restart_pp [[ -z ${LINKS[0]} ]] && restart_pp
fi fi
} }

View File

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Author: chal55rus
# type: games
# name: Chicken Invaders Universe
# image: chickeninvadersuniverse
# info_en:
# info_ru:
########################################################################
export PW_PREFIX_NAME="CHICKEN_INVADERS_UNIVERSE"
export LAUNCH_PARAMETERS=("/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-")
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/ChickenInvadersUniverseInstaller.exe"
export PORTWINE_CREATE_SHORTCUT_NAME="Chicken Invaders Universe"
start_portwine
if try_download "https://universe.chickeninvaders.com/files/ChickenInvadersUniverseInstaller.exe" "${PW_AUTOINSTALL_EXE}" no_mirror
then
pw_start_progress_bar_install_game "Chicken Invaders Universe."
pw_run "${PW_AUTOINSTALL_EXE}"
portwine_exe="$WINEPREFIX/drive_c/Program Files (x86)/ChickenInvadersUniverse/CIU.exe"
try_remove_file "${PW_AUTOINSTALL_EXE}"
try_remove_file "${portwine_exe}.ppdb"
kill_portwine
pw_stop_progress_bar
portwine_create_shortcut
fi
stop_portwine

View File

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Author: chal55rus
# type: games
# name: Eldevin (ENG)
# image: eldevin
# info_en:
# info_ru:
########################################################################
export PW_PREFIX_NAME="ELDEVIN"
export LAUNCH_PARAMETERS=("/S")
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/eldevin_win64.exe"
export PORTWINE_CREATE_SHORTCUT_NAME="Eldevin"
start_portwine
if try_download "https://www.eldevin.com/cdn/files/eldevin_win64.exe" "${PW_AUTOINSTALL_EXE}" no_mirror
then
pw_start_progress_bar_install_game "Eldevin."
pw_run "${PW_AUTOINSTALL_EXE}"
portwine_exe="$WINEPREFIX/drive_c/Program Files/Eldevin/Eldevin.exe"
try_remove_file "${PW_AUTOINSTALL_EXE}"
try_remove_file "${portwine_exe}.ppdb"
kill_portwine
pw_stop_progress_bar
portwine_create_shortcut
fi
stop_portwine

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Author: chal55rus
# type: games
# name: The World of Nifty Craft (ENG)
# image: theworldofniftycraft
# info_en:
# info_ru:
########################################################################
export PW_PREFIX_NAME="THE_WORLD_NIFTY_CRAFT"
export LAUNCH_PARAMETERS=("/S")
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/web_installer.exe"
export PORTWINE_CREATE_SHORTCUT_NAME="The World of Nifty Craft"
start_portwine
if try_download "https://installer.launcher.xsolla.com/xlauncher-builds/xsolla-launcher-update/9969/bin/web_installer.exe" "${PW_AUTOINSTALL_EXE}" no_mirror
then
pw_start_progress_bar_install_game "The World of Nifty Craft."
pw_run "${PW_AUTOINSTALL_EXE}"
portwine_exe="$WINEPREFIX/drive_c/users/steamuser/AppData/Local/The World of Nifty Craft/launcher.exe"
pw_create_unique_exe "Nifty_Craft_launcher"
try_remove_file "${PW_AUTOINSTALL_EXE}"
try_remove_file "${portwine_exe}.ppdb"
kill_portwine
pw_stop_progress_bar
portwine_create_shortcut
fi
stop_portwine

View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
# Author: chal55rus
# type: games
# name: Toribash
# image: toribash
# info_en:
# info_ru:
########################################################################
URL_VER=$(curl https://www.toribash.com/downloads.php \
| awk -F"https://cache.toribash.com/Toribash-" '{print $2}' \
| awk -F"-Setup.exe" '{print $1}' | grep "5" | head -n1)
export PW_PREFIX_NAME="TORIBASH"
export LAUNCH_PARAMETERS=("/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-")
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Toribash-${URL_VER}-Setup.exe"
export PORTWINE_CREATE_SHORTCUT_NAME="Toribash"
start_portwine
if try_download "https://cache.toribash.com/Toribash-${URL_VER}-Setup.exe" "${PW_AUTOINSTALL_EXE}" no_mirror
then
pw_start_progress_bar_install_game "Toribash."
pw_run "${PW_AUTOINSTALL_EXE}"
portwine_exe="$WINEPREFIX/drive_c/Games/Toribash/toribash.exe"
try_remove_file "${PW_AUTOINSTALL_EXE}"
try_remove_file "${portwine_exe}.ppdb"
kill_portwine
pw_stop_progress_bar
portwine_create_shortcut
fi
stop_portwine

View File

@ -49,26 +49,26 @@ MISSING_DESKTOP_FILE="0"
unset PW_NO_RESTART_PPDB PW_DISABLED_CREATE_DB unset PW_NO_RESTART_PPDB PW_DISABLED_CREATE_DB
if [[ "$1" == *.[Pp][Pp][Aa][Cc][Kk] ]] ; then if [[ "${1,,}" =~ .ppack$ ]] ; then
export PW_NO_RESTART_PPDB="1" export PW_NO_RESTART_PPDB="1"
export PW_DISABLED_CREATE_DB="1" export PW_DISABLED_CREATE_DB="1"
portwine_exe="$1" portwine_exe="$1"
elif [[ -f "$1" ]] ; then elif [[ -f "$1" ]] ; then
portwine_exe="$(realpath -s "$1")" portwine_exe="$(realpath -s "$1")"
elif [[ -f "$OLDPWD/$1" ]] \ elif [[ -f "$OLDPWD/$1" ]] \
&& [[ "$1" == *.[Ee][Xx][Ee] || "$1" == *.[Bb][Aa][Tt] || "$1" == *.[Rr][Ee][Gg] || "$1" == *.[Mm][Ss][Ii] ]] && [[ "${1,,}" =~ (.exe$|.bat$|.msi$|.reg$) ]]
then then
portwine_exe="$(realpath -s "$OLDPWD/$1")" portwine_exe="$(realpath -s "$OLDPWD/$1")"
elif [[ "$1" == "--debug" ]] \ elif [[ "$1" =~ (^--debug$|^--launch$|^--edit-db$) ]] \
&& [[ -f "$2" ]] && [[ -f "$2" ]]
then then
portwine_exe="$(realpath -s "$2")" portwine_exe="$(realpath -s "$2")"
elif [[ "$1" == "--debug" ]] \ elif [[ "$1" =~ (^--debug$|^--launch$|^--edit-db$) ]] \
&& [[ -f "$OLDPWD/$2" ]] \ && [[ -f "$OLDPWD/$2" ]] \
&& [[ "$2" == *.[Ee][Xx][Ee] || "$2" == *.[Bb][Aa][Tt] || "$2" == *.[Rr][Ee][Gg] || "$2" == *.[Mm][Ss][Ii] ]] && [[ "${2,,}" =~ (.exe$|.bat$|.msi$|.reg$) ]]
then then
portwine_exe="$(realpath -s "$OLDPWD/$2")" portwine_exe="$(realpath -s "$OLDPWD/$2")"
elif [[ "$1" == *.[Ee][Xx][Ee] || "$1" == *.[Bb][Aa][Tt] || "$1" == *.[Mm][Ss][Ii] || "$1" == *.[Rr][Ee][Gg] ]] elif [[ "${1,,}" =~ (.exe$|.bat$|.msi$|.reg$) ]]
then then
portwine_exe="$1" portwine_exe="$1"
MISSING_DESKTOP_FILE="1" MISSING_DESKTOP_FILE="1"
@ -128,7 +128,6 @@ popd 1>/dev/null || fatal
create_new_dir "${PORT_WINE_PATH}/data/prefixes/DEFAULT" create_new_dir "${PORT_WINE_PATH}/data/prefixes/DEFAULT"
create_new_dir "${PORT_WINE_PATH}/data/prefixes/DOTNET" create_new_dir "${PORT_WINE_PATH}/data/prefixes/DOTNET"
create_new_dir "${PORT_WINE_PATH}/data/prefixes/PROGRAMS"
try_force_link_dir "${PORT_WINE_PATH}/data/prefixes" "${PORT_WINE_PATH}" try_force_link_dir "${PORT_WINE_PATH}/data/prefixes" "${PORT_WINE_PATH}"
pushd "${PORT_WINE_PATH}/data/prefixes/" 1>/dev/null || fatal pushd "${PORT_WINE_PATH}/data/prefixes/" 1>/dev/null || fatal
@ -324,17 +323,23 @@ export SKIP_CHECK_UPDATES="1"
[[ "$MISSING_DESKTOP_FILE" == "1" ]] && portwine_missing_shortcut [[ "$MISSING_DESKTOP_FILE" == "1" ]] && portwine_missing_shortcut
if [[ $(basename "${portwine_exe}") =~ .[Pp][Pp][Aa][Cc][Kk]$ ]] ; then if [[ $(basename "${portwine_exe,,}") =~ .ppack$ ]] ; then
unset PW_SANDBOX_HOME_PATH unset PW_SANDBOX_HOME_PATH
pw_init_runtime pw_init_runtime
if check_flatpak if check_flatpak
then TMP_ALL_PATH="" then TMP_ALL_PATH=""
else TMP_ALL_PATH="LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\"" else TMP_ALL_PATH="LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\""
fi fi
PW_PREFIX_NAME=$(basename "$1" | awk -F'.' '{print $1}') if check_selinux
then NO_XATTRS_NEED="-no-xattrs"
else NO_XATTRS_NEED=""
fi
PW_PREFIX_NAME=$(basename "${1,,}" .ppack)
PW_PREFIX_NAME="${PW_PREFIX_NAME^^}"
cat << EOF > "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack.sh cat << EOF > "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack.sh
#!/usr/bin/env bash #!/usr/bin/env bash
${TMP_ALL_PATH} unsquashfs -f -d "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}" "$1" \ ${TMP_ALL_PATH} unsquashfs -f -d "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}" "$1" \
${TMP_ALL_PATH} unsquashfs $NO_XATTRS_NEED -f -d "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}" "$1" \
|| echo "ERROR" > "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack_error || echo "ERROR" > "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack_error
EOF EOF
chmod u+x "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack.sh chmod u+x "${PORT_WINE_TMP_PATH}"/pp_pfx_unpack.sh
@ -360,7 +365,7 @@ fi
### CLI ### ### CLI ###
case "${1}" in case "$1" in
'--help' ) '--help' )
files_from_autoinstall=$(ls "${PORT_SCRIPTS_PATH}/pw_autoinstall") files_from_autoinstall=$(ls "${PORT_SCRIPTS_PATH}/pw_autoinstall")
echo -e " echo -e "
@ -413,6 +418,16 @@ use: [--repair] [--reinstall] [--autoinstall]
'--update' ) '--update' )
gui_pw_update ;; gui_pw_update ;;
'--launch' )
portwine_launch
stop_portwine ;;
'--edit-db' )
# --edit-db /полный/путь/до/файла.exe PW_MANGOHUD=1 PW_VKBASALT=0 (и т.д) для примера
set_several_variables ${@:3}
edit_db_from_gui $keys_all
exit 0 ;;
esac esac
### GUI ### ### GUI ###

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#Author: Castro-Fidel (linux-gaming.ru) #Author: Castro-Fidel (linux-gaming.ru)
#SCRIPTS_NEXT_VERSION=2368 #SCRIPTS_NEXT_VERSION=2369
#SCRIPTS_STABLE_VERSION=2360 #SCRIPTS_STABLE_VERSION=2360
######################################################################## ########################################################################
export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT"
@ -134,7 +134,6 @@ export PW_GS_MANGOAPP="0"
###PREFIX_VERSION### ###PREFIX_VERSION###
export DOTPFX_VER="48v7" export DOTPFX_VER="48v7"
export DEFPFX_VER="v1" export DEFPFX_VER="v1"
export PROGPFX_VER="v1"
export PW_MUST_WINEDLLOVERRIDES="steam_api,steam_api64,steamclient,steamclient64=n;dotnetfx35.exe,dotnetfx35setup.exe=b;winemenubuilder.exe=" export PW_MUST_WINEDLLOVERRIDES="steam_api,steam_api64,steamclient,steamclient64=n;dotnetfx35.exe,dotnetfx35setup.exe=b;winemenubuilder.exe="
################################################################# #################################################################
# Get our APi on https://www.steamgriddb.com/profile/preferences/api/ # Get our APi on https://www.steamgriddb.com/profile/preferences/api/
@ -148,7 +147,6 @@ pw_list_install_dll_in_prefix ()
case $PW_PREFIX_NAME in case $PW_PREFIX_NAME in
DEFAULT) export PW_MUST_HAVE_DLL="$STANDART_DLL" ;; DEFAULT) export PW_MUST_HAVE_DLL="$STANDART_DLL" ;;
DOTNET) export PW_MUST_HAVE_DLL="dotnet48" ;; DOTNET) export PW_MUST_HAVE_DLL="dotnet48" ;;
PROGRAMS) export PW_MUST_HAVE_DLL="riched20 msxml3 msxml4 msxml6" ;;
*) export PW_MUST_HAVE_DLL="sandbox" ;; *) export PW_MUST_HAVE_DLL="sandbox" ;;
esac esac
} }