Compare commits
91 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eea7e11c3a | ||
|
|
94ccf166c4 | ||
|
|
a547e12e1b | ||
|
|
50f2c3181e | ||
|
|
70bee8c760 | ||
|
|
dab4017c44 | ||
|
|
e21db7d2bd | ||
|
|
e2d39484f4 | ||
|
|
01d60271c2 | ||
|
|
0a6994abf3 | ||
|
|
0a4844a9f3 | ||
|
|
e905461567 | ||
|
|
b872b9d165 | ||
|
|
ea6799fbf2 | ||
|
|
7a990ca99c | ||
|
|
96c6c8f059 | ||
|
|
122a77a62c | ||
|
|
3c89777792 | ||
|
|
4afdbaa220 | ||
|
|
81013bfe71 | ||
|
|
caccc333db | ||
|
|
0fc93f4d3c | ||
|
|
5f27bfa97a | ||
|
|
151d0ffc48 | ||
|
|
ad91466475 | ||
|
|
5e4d94bb57 | ||
|
|
5b572ff540 | ||
|
|
c68bcc9abf | ||
|
|
1ad2c6cfa8 | ||
|
|
16a686dc37 | ||
|
|
c9d5619ab9 | ||
|
|
74311e9c04 | ||
|
|
eb9bef83e2 | ||
|
|
c7eddb8b53 | ||
|
|
dfc6c1c836 | ||
|
|
04187e9463 | ||
|
|
5f915ab58d | ||
|
|
0e8ee7788a | ||
|
|
49c1ac6846 | ||
|
|
971bcd0f5a | ||
|
|
5b21015aee | ||
|
|
7dee08bcfb | ||
|
|
633deaf1c1 | ||
|
|
4df9508547 | ||
|
|
989f04cdd8 | ||
|
|
95b189f5a2 | ||
|
|
371553277a | ||
|
|
dabf50103d | ||
|
|
590b37f1a3 | ||
|
|
1f9b4a9146 | ||
|
|
39f21373f1 | ||
|
|
e984ffdb8c | ||
|
|
48834dc078 | ||
|
|
b62d06ed71 | ||
|
|
9a1b78276e | ||
|
|
f788307f05 | ||
|
|
14273f723b | ||
|
|
a8e0fdce0a | ||
|
|
da3d5cd7af | ||
|
|
3ee499c758 | ||
|
|
6286cccbab | ||
|
|
e8d462b665 | ||
|
|
6476a84ce7 | ||
|
|
db7e3f5220 | ||
|
|
a817d1a6f5 | ||
|
|
e1fc25bb72 | ||
|
|
7c90da2088 | ||
|
|
108316148a | ||
|
|
9029f4d0e8 | ||
|
|
cedebe73c1 | ||
|
|
e04811446c | ||
|
|
15712f0a0a | ||
|
|
8eeee56ee1 | ||
|
|
ac4dd4f0bf | ||
|
|
c15d751372 | ||
|
|
78113b92a5 | ||
|
|
9e8e41e812 | ||
|
|
5f4d3a54b1 | ||
|
|
9d16883e6e | ||
|
|
e3cafee4f5 | ||
|
|
e2b2c9568c | ||
|
|
7113d864be | ||
|
|
9a1a88d01b | ||
|
|
ad775e4644 | ||
|
|
36f5c306c5 | ||
|
|
173a7ae41f | ||
|
|
32e56879f7 | ||
|
|
b88ea9f478 | ||
|
|
dd82cee5ea | ||
|
|
a35efc347d | ||
|
|
95a8d370ab |
16
CHANGELOG
@@ -1,5 +1,21 @@
|
|||||||
История изменений:
|
История изменений:
|
||||||
|
|
||||||
|
0.8.0
|
||||||
|
* добавлено автоопределение .reg и .dll файлов для их добавленния в реестр префикса
|
||||||
|
* во вкладку "Справка" добавлены ссылки на старницы с сертификатами
|
||||||
|
* другие небольшие улучшения и оптимизации скриптов и графического интерфейса
|
||||||
|
|
||||||
|
0.7.0
|
||||||
|
* обновлен графический режим Qt5
|
||||||
|
- добавлена кнопка открытия каталога с резервными копиями и логами
|
||||||
|
- добавлена кнопка открытия каталога с префиксом
|
||||||
|
- добавлена блокировка кнопок для установленного приложения, если оно уже запущено
|
||||||
|
- добавлено отображения процесса установки сторонних компонентов с помощью winetricks
|
||||||
|
- добавлена возможность отображения и установки тестовых скриптов (выключено по умолчанию)
|
||||||
|
* добавлены скрипты установки для t-flex версии 18
|
||||||
|
* в CLI добавлен список тестовых скриптов установки ПО
|
||||||
|
* добавлена возможность ассоциации файлов для передачи в приложения запускаемых в WineHelper
|
||||||
|
|
||||||
0.6.0
|
0.6.0
|
||||||
* обновлен графический режим Qt5
|
* обновлен графический режим Qt5
|
||||||
* добавлен иконка в трее для графического режима Qt5
|
* добавлен иконка в трее для графического режима Qt5
|
||||||
|
|||||||
7
GENERAL
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Руководство пользователя
|
||||||
|
Подробное и актуальное руководство по использованию WineHelper смотрите на сайте: https://www.altlinux.org/Winehelper
|
||||||
|
|
||||||
|
# Совместимость ПО и сертификаты
|
||||||
|
С полным списком совместимого ПО и сертификатами можно ознакомиться по следующим ссылкам:
|
||||||
|
Для 10 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P10-view2.html
|
||||||
|
Для 11 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P11-view2.html
|
||||||
@@ -298,6 +298,13 @@ WineHelper предоставляет доступ к основным инст
|
|||||||
<p><em>Выбранное приложение во вкладке "Установленные"</em></p>
|
<p><em>Выбранное приложение во вкладке "Установленные"</em></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Расположения лога запуска программы а также резервной копии префикса можно просмотреть с помощью кнопки **«Открыть папку с логом/резервной копией префикса»** которая появляется автоматически после создания лога или резервной копии.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/folder_log_backup.png">
|
||||||
|
<p><em>Кнопка "Открыть папку с логом/резервной копией префикса"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
### Вкладка «Менеджер префиксов»
|
### Вкладка «Менеджер префиксов»
|
||||||
|
|
||||||
Эта вкладка предоставляет мощные инструменты для управления префиксами Wine.
|
Эта вкладка предоставляет мощные инструменты для управления префиксами Wine.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ _winehelper_completions() {
|
|||||||
COMPREPLY=()
|
COMPREPLY=()
|
||||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine"
|
opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine clear-winetricks-cache"
|
||||||
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run"
|
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run"
|
||||||
|
|
||||||
case "${prev}" in
|
case "${prev}" in
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ _winehelper() {
|
|||||||
'backup-prefix[Создать резерную копию префикса]'
|
'backup-prefix[Создать резерную копию префикса]'
|
||||||
'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]'
|
'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]'
|
||||||
'change-wine[Изменить версию Wine/Proton для префикса]'
|
'change-wine[Изменить версию Wine/Proton для префикса]'
|
||||||
|
'clear-winetricks-cache[Очистить кэш Winetricks]'
|
||||||
)
|
)
|
||||||
|
|
||||||
wine_cmd=(
|
wine_cmd=(
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: Сервис обновления ПО
|
# info_ru: Сервис обновления ПО: "R-Атлас", "R-Инфо" и "R-Тариф".
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://daobit.ru"
|
export PROG_URL="https://daobit.ru"
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_i586" # wine-9.0.9-alt1-i586"
|
export WH_WINE_USE="wine_x_tkg_10-0_i586" # wine-9.0.9-alt1-i586"
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций, с дополнением Apache OpenOffice. Apache OpenOffice - пакет офисного программного обеспечения для обработки текстов, электронных таблиц, презентаций, графики, баз данных и многого другого.
|
|
||||||
########################################################################
|
|
||||||
export PROG_URL="https://scadoffice.ru"
|
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
|
||||||
export WINEPREFIX="scadoffice"
|
|
||||||
export PROG_NAME="SCAD Office"
|
|
||||||
export PROG_ICON="scadoffice"
|
|
||||||
export BASE_PFX="scadaoffice_pfx_x64_v04"
|
|
||||||
export WH_WINDOWS_VER="10"
|
|
||||||
export WINEARCH="win64"
|
|
||||||
export INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6"
|
|
||||||
export WH_XDG_OPEN="rtf"
|
|
||||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
|
||||||
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
|
||||||
|
|
||||||
prepair_wine
|
|
||||||
|
|
||||||
DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
|
|
||||||
|
|
||||||
if [[ -n $2 ]] ; then
|
|
||||||
if [[ ! -d "$DRIVE_C_SCADOFFICE" ]] ; then
|
|
||||||
fatal "Перезапустите скрипт без дополнительных аргументов для установки SCAD Office:
|
|
||||||
winehelper install scadoffice"
|
|
||||||
elif [[ ! -f "$2" ]] ; then
|
|
||||||
fatal "Перезапустите скрипт с правильным путем до файла лицензии SCAD Office:
|
|
||||||
winehelper install scadoffice \"/путь/до/файла.exe\""
|
|
||||||
else
|
|
||||||
print_info "Устанавливаем файл лицензии $2"
|
|
||||||
wine_run "$2"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $BASE_PFX == "none" ]] ; then
|
|
||||||
print_info "Установка дополнительных компонентов..."
|
|
||||||
|
|
||||||
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
|
||||||
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
|
||||||
|
|
||||||
ADDONS_PATH_REG="${ADDONS_PATH}/REG"
|
|
||||||
ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64"
|
|
||||||
ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH"
|
|
||||||
|
|
||||||
if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then
|
|
||||||
create_new_dir "${ADDONS_PATH}"
|
|
||||||
unpack "${ADDONS_PACK}" "${ADDONS_PATH}"
|
|
||||||
wine_run regedit "${ADDONS_PATH_REG}"/*.reg
|
|
||||||
|
|
||||||
# Установка ODBC
|
|
||||||
rm -fR "$DRIVE_C/Program Files (x86)/Common Files/System"
|
|
||||||
cp -r "${ADDONS_PATH_MDAC}/System" "$DRIVE_C/Program Files (x86)/Common Files/System"
|
|
||||||
cp -r "${ADDONS_PATH_MDAC}"/*.* "$DRIVE_C/windows/system32/"
|
|
||||||
wine_run regedit "${ADDONS_PATH_MDAC}"/*.reg
|
|
||||||
|
|
||||||
# Установка SSH
|
|
||||||
cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/"
|
|
||||||
|
|
||||||
try_remove_dir "$ADDONS_PATH"
|
|
||||||
try_remove_file "$ADDONS_PACK"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
|
||||||
create_new_dir "$DRIVE_C/SDATA"
|
|
||||||
create_new_dir "$DRIVE_C/SWORK"
|
|
||||||
wine_run_install "${AUTOINSTALL_EXE}" /auto /hide
|
|
||||||
try_remove_file "$AUTOINSTALL_EXE"
|
|
||||||
|
|
||||||
# Определение всех программ, значков и исполняемых файлов
|
|
||||||
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
|
||||||
|
|
||||||
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
|
||||||
|
|
||||||
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
|
||||||
|
|
||||||
# Цикл создания десктоп файлов для scad office
|
|
||||||
for i in "${!PROG_NAME_All[@]}"; do
|
|
||||||
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: «Справки БК» — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
|
# info_ru: «Справки БК» (Windows версия 2.5.5) от 31.01.2024 — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://spravki-bk.ru"
|
export PROG_URL="https://spravki-bk.ru"
|
||||||
export WH_WINE_USE="wine-9.0.14-alt1-i586-spravkibk"
|
export WH_WINE_USE="wine-9.0.14-alt1-i586-spravkibk"
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="T-FLEX CAD Учебная Версия 17"
|
export PROG_NAME="T-FLEX CAD Учебная Версия 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
@@ -36,5 +36,5 @@ if try_download "https://www.tflexcad.ru/download/t-flex-cad-free/files/TFCAD_ST
|
|||||||
try_remove_dir "${WH_TMP_DIR}/Стандартные элементы 17"
|
try_remove_dir "${WH_TMP_DIR}/Стандартные элементы 17"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD Учебная Версия 17/Program/TFlexCad.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD Учебная Версия 17/Program/TFlexCad.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCadEDU"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCadEDU17"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="T-FLEX CAD 17"
|
export PROG_NAME="T-FLEX CAD 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
@@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20CAD%2017.zip" "${AUTOIN
|
|||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 17/Program/TFlexCad.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 17/Program/TFlexCad.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad17"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="Приложения для T-FLEX CAD 17"
|
export PROG_NAME="Приложения для T-FLEX CAD 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WINEPREFIX="tflex"
|
export WINEPREFIX="tflex"
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="Ресурсы для T-FLEX CAD 17"
|
export PROG_NAME="Ресурсы для T-FLEX CAD 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WINEPREFIX="tflex"
|
export WINEPREFIX="tflex"
|
||||||
|
|||||||
34
autoinstall/t-flex-cad18
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД.
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
|
export PROG_NAME="T-FLEX CAD 18"
|
||||||
|
export PROG_ICON="tflexcad18"
|
||||||
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WINEPREFIX="tflex"
|
||||||
|
export WH_XDG_OPEN="log"
|
||||||
|
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||||
|
|
||||||
|
# используем общий whdb файл для подготовки префикса и сервисов
|
||||||
|
# prepair_wine используется из файла настроек
|
||||||
|
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||||
|
|
||||||
|
# Программа T-FLEX CAD
|
||||||
|
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip"
|
||||||
|
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||||
|
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 18"
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/T-FLEX CAD 18/T-FLEX CAD 18.msi"
|
||||||
|
|
||||||
|
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||||
|
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||||
|
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||||
|
|
||||||
|
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||||
|
try_remove_dir "${AUTOINSTALL_UNPACK}"
|
||||||
|
|
||||||
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe"
|
||||||
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad18"
|
||||||
|
fi
|
||||||
52
autoinstall/t-flex-cad18-applications
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: Приложения для T-FLEX CAD 18 (T-FLEX Анализ 18, T-FLEX Динамика 18, T-FLEX Детали машин 18, T-FLEX Раскрой 18, T-FLEX VR 18, T-FLEX Печатные платы 18)
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
|
export PROG_NAME="Приложения для T-FLEX CAD 18"
|
||||||
|
export PROG_ICON="tflexcad18"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export WINEPREFIX="tflex"
|
||||||
|
export WH_XDG_OPEN="log"
|
||||||
|
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||||
|
|
||||||
|
check_prefix_var
|
||||||
|
if [[ ! -f "$WINEPREFIX/drive_c/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" ]]
|
||||||
|
then fatal "Изначально установите T-FLEX CAD 18."
|
||||||
|
fi
|
||||||
|
|
||||||
|
BASE_URL="https://www.tflex.ru/downloads/V18"
|
||||||
|
FILES=(
|
||||||
|
"T-FLEX Analysis 18.zip"
|
||||||
|
"T-FLEX Dynamics 18.zip"
|
||||||
|
"T-FLEX Machinery 18.zip"
|
||||||
|
"T-FLEX Nesting 18.zip"
|
||||||
|
"T-FLEX VR 18.zip"
|
||||||
|
"T-FLEX Circuits 18.zip"
|
||||||
|
)
|
||||||
|
UNPACK_APP="${WH_TMP_DIR}/unpack_applications"
|
||||||
|
|
||||||
|
prepair_wine
|
||||||
|
|
||||||
|
# Скачивание всех файлов
|
||||||
|
for file_name in "${FILES[@]}" ; do
|
||||||
|
local output="${WH_TMP_DIR}/${file_name// /_}"
|
||||||
|
|
||||||
|
if try_download "$BASE_URL/$file_name" "$output" ; then
|
||||||
|
unpack "$output" "${UNPACK_APP}"
|
||||||
|
fi
|
||||||
|
try_remove_file "$output"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Установка .msi файлов
|
||||||
|
for msi_file in "${UNPACK_APP}"/*/*.msi ; do
|
||||||
|
if [[ -f "$msi_file" ]] ; then
|
||||||
|
wine_run_install "$msi_file" /q
|
||||||
|
else
|
||||||
|
fatal "Нет .msi файлов для установки в ${UNPACK_APP}/*."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
try_remove_dir "${UNPACK_APP}"
|
||||||
49
autoinstall/t-flex-cad18-resources
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: Обучающие материалы, примеры, бесплатные библиотеки для T-FLEX CAD 18 (Учебное пособие 18, Стандартные элементы 18, Примеры 18)
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
|
export PROG_NAME="Ресурсы для T-FLEX CAD 18"
|
||||||
|
export PROG_ICON="tflexcad18"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export WINEPREFIX="tflex"
|
||||||
|
export WH_XDG_OPEN="log"
|
||||||
|
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||||
|
|
||||||
|
check_prefix_var
|
||||||
|
if [[ ! -f "$WINEPREFIX/drive_c/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" ]]
|
||||||
|
then fatal "Изначально установите T-FLEX CAD 18."
|
||||||
|
fi
|
||||||
|
|
||||||
|
BASE_URL="https://www.tflex.ru/downloads/V18"
|
||||||
|
FILES=(
|
||||||
|
"T-FLEX Tutorial 18.zip"
|
||||||
|
"Standard parts 18.zip"
|
||||||
|
"Examples 18.zip"
|
||||||
|
)
|
||||||
|
UNPACK_RESOURCES="${WH_TMP_DIR}/unpack_resources"
|
||||||
|
|
||||||
|
prepair_wine
|
||||||
|
|
||||||
|
# Скачивание всех файлов
|
||||||
|
for file_name in "${FILES[@]}" ; do
|
||||||
|
local output="${WH_TMP_DIR}/${file_name// /_}"
|
||||||
|
|
||||||
|
if try_download "$BASE_URL/$file_name" "$output" ; then
|
||||||
|
unpack "$output" "$UNPACK_RESOURCES"
|
||||||
|
fi
|
||||||
|
try_remove_file "$output"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Установка .msi файлов
|
||||||
|
for msi_file in "${UNPACK_RESOURCES}"/*/*.msi ; do
|
||||||
|
if [[ -f "$msi_file" ]] ; then
|
||||||
|
wine_run_install "$msi_file" /q
|
||||||
|
else
|
||||||
|
fatal "Нет .msi файлов для установки в ${UNPACK_RESOURCES}/unpack_dop/*."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
try_remove_dir "${UNPACK_RESOURCES}"
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="T-FLEX CAD 2D+ 17"
|
export PROG_NAME="T-FLEX CAD 2D+ 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
@@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20CAD%202D+%2017.zip" "${
|
|||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 17/Program/TFlexCad.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 17/Program/TFlexCad.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D17"
|
||||||
fi
|
fi
|
||||||
|
|||||||
34
autoinstall/t-flex-cad2d+18
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД.
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
|
export PROG_NAME="T-FLEX CAD 2D+ 18"
|
||||||
|
export PROG_ICON="tflexcad18"
|
||||||
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WINEPREFIX="tflex"
|
||||||
|
export WH_XDG_OPEN="log"
|
||||||
|
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||||
|
|
||||||
|
# используем общий whdb файл для подготовки префикса и сервисов
|
||||||
|
# prepair_wine используется из файла настроек
|
||||||
|
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||||
|
|
||||||
|
# Программа T-FLEX CAD 2D+ 18
|
||||||
|
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18.zip"
|
||||||
|
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||||
|
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18"
|
||||||
|
AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX CAD 2D+ 18.msi"
|
||||||
|
|
||||||
|
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%202D+%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||||
|
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||||
|
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||||
|
|
||||||
|
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||||
|
try_remove_dir "${AUTOINSTALL_UNPACK}"
|
||||||
|
|
||||||
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 18/Program/TFlexCad.exe"
|
||||||
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D18"
|
||||||
|
fi
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="T-FLEX DOCs 17"
|
export PROG_NAME="T-FLEX DOCs 17"
|
||||||
export PROG_ICON="tflexdoc"
|
export PROG_ICON="tflexdoc17"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
@@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/DOCs/T-FLEX%20DOCs%2017%20Client
|
|||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files (x86)/T-FLEX DOCs 17/Program/TFlex.DOCs.Client.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Program Files (x86)/T-FLEX DOCs 17/Program/TFlex.DOCs.Client.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexDOCs17"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.tflexcad.ru"
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
export PROG_NAME="T-FLEX Viewer 17"
|
export PROG_NAME="T-FLEX Viewer 17"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad17"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
@@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20Viewer%2017.zip" "${AUT
|
|||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 17/Program/TFlexViewer.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 17/Program/TFlexViewer.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexViewer17"
|
||||||
fi
|
fi
|
||||||
|
|||||||
34
autoinstall/t-flex-viewer18
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: Просмотр, печать и аннотирование документов T-FLEX CAD
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://www.tflexcad.ru"
|
||||||
|
export PROG_NAME="T-FLEX Viewer 18"
|
||||||
|
export PROG_ICON="tflexcad18"
|
||||||
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WINEPREFIX="tflex"
|
||||||
|
export WH_XDG_OPEN="log"
|
||||||
|
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||||
|
|
||||||
|
# используем общий whdb файл для подготовки префикса и сервисов
|
||||||
|
# prepair_wine используется из файла настроек
|
||||||
|
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||||
|
|
||||||
|
# Программа T-FLEX Viewer
|
||||||
|
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 18.zip"
|
||||||
|
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||||
|
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX Viewer 18"
|
||||||
|
AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX Viewer 18.msi"
|
||||||
|
|
||||||
|
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20Viewer%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||||
|
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||||
|
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||||
|
|
||||||
|
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||||
|
try_remove_dir "${AUTOINSTALL_UNPACK}"
|
||||||
|
|
||||||
|
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 18/Program/TFlexViewer.exe"
|
||||||
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexViewer18"
|
||||||
|
fi
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18
|
# info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18
|
||||||
########################################################################
|
########################################################################
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WINEPREFIX="tflex"
|
export WINEPREFIX="tflex"
|
||||||
|
|||||||
BIN
image/handbook/folder_log_backup.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
image/ksamu.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
BIN
image/tflexcad18.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: Ручная установка дополнений для T-FLEX DOCS 17 или 18
|
# info_ru: Ручная установка дополнений для T-FLEX CAD 17 или 18
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_NAME="T-FLEX CAD 17/18"
|
export PROG_NAME="T-FLEX CAD 17/18"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: Ручная установка дополнений для T-FLEX CAD 17 или 18
|
# info_ru: Ручная установка дополнений для T-FLEX DOCS 17 или 18
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_NAME="T-FLEX CAD 17/18"
|
export PROG_NAME="T-FLEX DOCS 17/18"
|
||||||
export PROG_ICON="tflexcad"
|
export PROG_ICON="tflexcad"
|
||||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||||
export BASE_PFX="tflex_pfx_x64_v03"
|
export BASE_PFX="tflex_pfx_x64_v03"
|
||||||
export WINEARCH="win64"
|
export WINEARCH="win64"
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
|||||||
@@ -1,57 +1,20 @@
|
|||||||
##### WINE #####
|
##### WINE WOW64 #####
|
||||||
|
e9a8b79dfe12cad1304dca573d73aefe109e3d69b6fff739c8dbb8b2d3c271c6 wine-10.12.1-alt1-wow64.tar.xz
|
||||||
|
a862761c432f8619caf8100589678a1cbb523787259120ccd4388089d81e3b17 wine-10.18.1-tflex-alt2-wow64.tar.xz
|
||||||
|
|
||||||
|
##### WINE AMD64 #####
|
||||||
009c95bfe2df3f9264c9c5092f3e30ea7a168dd7869046058a718a70739602d4 wine_wh_tflex_10-9_amd64.tar.xz
|
009c95bfe2df3f9264c9c5092f3e30ea7a168dd7869046058a718a70739602d4 wine_wh_tflex_10-9_amd64.tar.xz
|
||||||
3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f wine_x_tkg_10-0_i586.tar.xz
|
|
||||||
71d6fdfd23d7988471d345c68e81699b8af931352b03dd216424b398f63c7b12 wine_x_tkg_10-0_amd64.tar.xz
|
71d6fdfd23d7988471d345c68e81699b8af931352b03dd216424b398f63c7b12 wine_x_tkg_10-0_amd64.tar.xz
|
||||||
fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-alt1-i586-spravkibk.tar.xz
|
|
||||||
e0a84bb4908c3927954d7eef6b8ac7212e442b8c107d000c6890fec340f96183 wine-9.0.14-alt1-amd64.tar.xz
|
e0a84bb4908c3927954d7eef6b8ac7212e442b8c107d000c6890fec340f96183 wine-9.0.14-alt1-amd64.tar.xz
|
||||||
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
|
|
||||||
f1bf1261550ca2928cefacdb724926d3d6d103433d0ff6882ee9783a50d8f4e4 wine-8.8-staging-amd64.tar.xz
|
f1bf1261550ca2928cefacdb724926d3d6d103433d0ff6882ee9783a50d8f4e4 wine-8.8-staging-amd64.tar.xz
|
||||||
61bec1230b37b8fcc69fd45f848b44fd88cc41fcdd5dc3080336d7da63660f40 wine-7.16.1-alt1-amd64.tar.xz
|
61bec1230b37b8fcc69fd45f848b44fd88cc41fcdd5dc3080336d7da63660f40 wine-7.16.1-alt1-amd64.tar.xz
|
||||||
|
|
||||||
|
##### WINE I586 #####
|
||||||
|
3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f wine_x_tkg_10-0_i586.tar.xz
|
||||||
|
fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-alt1-i586-spravkibk.tar.xz
|
||||||
|
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
|
||||||
6fea17fd131f57c2ebf7ca4c60d3c5a9e819afe16e5d0b77ecb750da99ae0e38 wine-7.16.1-alt1-i586.tar.xz
|
6fea17fd131f57c2ebf7ca4c60d3c5a9e819afe16e5d0b77ecb750da99ae0e38 wine-7.16.1-alt1-i586.tar.xz
|
||||||
|
|
||||||
##### WINE_LG #####
|
|
||||||
765e52484f06169909b179f4884d04ae4b440ff868e4b5722e64fc7d7a036ad9 WINE_LG_10-10-1.tar.xz
|
|
||||||
7a5128fcebbeed652ba36c5135821fd2c82493e87d715e8bc63e3210ba7ee849 WINE_LG_10-11.tar.xz
|
|
||||||
373beeb85c1c8163e752a32a453dcf575dd7ecf971726cecb3195e330d094925 WINE_LG_10-12.tar.xz
|
|
||||||
92f3c5a47a27644fde3ec1da810afcd5e6c9c5c2bc9c1f5f76a82b55894e745b WINE_LG_10-1.tar.xz
|
|
||||||
ef8a71c269f5a2a7012aec9c16f307ab49ed09fa85a91b42d6c6b954d40401a6 WINE_LG_10-5.tar.xz
|
|
||||||
7aca95bd921a102e0a4464f4a8945095e05587bffbb924fe1603d2deb8283ba5 WINE_LG_10-7.tar.xz
|
|
||||||
503a86e8b9446a4805da524ba5ec2bde591787b354df098135d65f2ed9d66dca WINE_LG_8-18-1.tar.xz
|
|
||||||
2714260a7f1f7d6427736aad2093dc17c1c10df9641b552e5ac4ac3fc73308ee WINE_LG_9-10.tar.xz
|
|
||||||
3c2dbb33da9eaa7f3afcbe366293f6abf601257fb782a06040710ec6f1def1ec WINE_LG_9-11.tar.xz
|
|
||||||
da79f89b1fc3175f113bf5ec35fc2755550159034736cff086f2165480dd6e0f WINE_LG_9-12-2.tar.xz
|
|
||||||
34a31802e50d6d70e1f4d23520c2d0047ae70d0cb4beb3e04046ee781e136a68 WINE_LG_9-12.tar.xz
|
|
||||||
6d6fd31ff71fd43f17182b466b6d499b61652775b7dbf25a18c3eaab7eacea2d WINE_LG_9-2.tar.xz
|
|
||||||
3f0cda10a1019c6a18d832dc547709e612d88297ce332f0835c2bffeae9215c3 WINE_LG_9-5.tar.xz
|
|
||||||
51ff56e435a90eeff13ffbbac543a820d1df14d65f2e3b760ad100bc946e4bfc WINE_LG_9-7.tar.xz
|
|
||||||
09901b17a7aaa13e5c1a1f99ab82c9f0d223aa2f5c9ac94938e5a9a0088bb244 WINE_LG_9-9.tar.xz
|
|
||||||
|
|
||||||
##### PROTON_LG #####
|
|
||||||
d0f5b42096bc5ed379a26e415d99963f849129d5cec1ba9134b1ee50100b049b PROTON_LG_10-10.tar.xz
|
|
||||||
d87eb914ce7e5cab47e6b480aa400f8c7840f39a22d585bf35092a033ac09201 PROTON_LG_10-13.tar.xz
|
|
||||||
05ca56607af7cee30b4797ad6c6a111d38a52c9d5c2184d30eec2650f1585b58 PROTON_LG_10-15.tar.xz
|
|
||||||
f8bfac3029bd79e211a6dc592c0959db239fb7807c410ed2a537c34467875c74 PROTON_LG_10-4.tar.xz
|
|
||||||
83d3cf60bbae6ca9d0508c2fdeaf3887bb72830eb52afc858d4afa009d0faa78 PROTON_LG_10-8.tar.xz
|
|
||||||
f70039931d644898bb0a44daa7e3d44fcafa9dca0881e2277b1062ecd2a5357a PROTON_LG_8-25-2.tar.xz
|
|
||||||
3e9202caf11d517406f82209e9e5385a4b0b1e4e16afa8b6f4fd517401537224 PROTON_LG_9-11.tar.xz
|
|
||||||
0481da38de07c71074c245624404994af164c9a6a584942c6d1f12966db2311a PROTON_LG_9-12.tar.xz
|
|
||||||
786d6415bb884d0ec80617e02004558634ac6bd99474cd63c25e2e5fd339b112 PROTON_LG_9-15.tar.xz
|
|
||||||
8f05ee518e1861a79b1830301c57a8d4422b6a9c24dfeec07fde474d283d4152 PROTON_LG_9-16.tar.xz
|
|
||||||
8bd409e4c56472429042555c1b2102bcd8313a4d40a80fe17a2caac8f4c8d4ed PROTON_LG_9-18.tar.xz
|
|
||||||
e88e7b076ad1d85d625407468515d6f41dcb20b721a6bd699bcd8818647d136c PROTON_LG_9-19.tar.xz
|
|
||||||
bd5dfe3a5187eb3583e5bc2fbc7debe40760802539c1317211415edeeeae851e PROTON_LG_9-27.tar.xz
|
|
||||||
63fde3b768a60cf736dcf3f9922cc2ab606cb7007e4cbe59f10cd038d3bdbee8 PROTON_LG_9-2.tar.xz
|
|
||||||
e09c5da9ddffc5d390de7689df1778f279cc84a946665cc76ce77861010b2604 PROTON_LG_9-4.tar.xz
|
|
||||||
03ccc15aa4adcaa49f3eeb52bf2a9127bacd8d578478f716b390e812dab74e21 PROTON_LG_9-5-1.tar.xz
|
|
||||||
56eae794a48aa7322ce5a636c490974d7f2516528d3153991fb033b0fa5fe3cf PROTON_LG_9-5.tar.xz
|
|
||||||
82263e1d0ab16130f15d419f2661fc5a7baf29193b9eeeb7eec3f01a3e54a1b3 PROTON_LG_9-7.tar.xz
|
|
||||||
|
|
||||||
##### PROTON_STEAM #####
|
|
||||||
09e6e386a87710996d634e08650bbc733365df65d3491a4372f06cf4e815a8b2 PROTON_STEAM_6.3-8.tar.xz
|
|
||||||
2f8bdfeb75e5427886aac7d2a599a1ee8900e50d5873a0e620d5703707bf4271 PROTON_STEAM_7.0-5.tar.xz
|
|
||||||
b33aca95664067c9eff06a2b4380992d43a5d31880ff970fb340e851671be625 PROTON_STEAM_8.0-4.tar.xz
|
|
||||||
9a20af28f4213e4f1c532b79a20e6a95ef872130784fc306510637342c6f58a1 PROTON_STEAM_8.0-5.tar.xz
|
|
||||||
|
|
||||||
##### DXVK #####
|
##### DXVK #####
|
||||||
d1a86ca53ab7e156e1252d3cf7eed3c66fe0651699cfc9c4ba152024261d8258 dxvk-1.10.1-967.tar.xz
|
d1a86ca53ab7e156e1252d3cf7eed3c66fe0651699cfc9c4ba152024261d8258 dxvk-1.10.1-967.tar.xz
|
||||||
98411effbc1b3611b11c4ca3af2ad29400b08e1c8c380791d6351600a06fb3c7 dxvk-1.10.3-28.tar.xz
|
98411effbc1b3611b11c4ca3af2ad29400b08e1c8c380791d6351600a06fb3c7 dxvk-1.10.3-28.tar.xz
|
||||||
@@ -150,6 +113,7 @@ edf16d2b37bc77d121d5d81b06b60d3f694e0060c6606e729ceab30de3d27466 vkd3d-proton-s
|
|||||||
|
|
||||||
##### CPCSP_PROXY #####
|
##### CPCSP_PROXY #####
|
||||||
3153088ff28d6af415c3504a421e5382554dbb305f38d5a87dd84df90d680421 wine-cpcsp_proxy-0.6.1-alt1.tar.xz
|
3153088ff28d6af415c3504a421e5382554dbb305f38d5a87dd84df90d680421 wine-cpcsp_proxy-0.6.1-alt1.tar.xz
|
||||||
|
fbe72bfe3c2c307363782ce2d37589e142b44111f269657b0e516a6b2d6ab8a9 wine-cpcsp_proxy-0.7.3-alt5-wow64.tar.xz
|
||||||
|
|
||||||
##### FONTS #####
|
##### FONTS #####
|
||||||
405bfe3b7c7f80034837c05656535053305727ee4bf1d993521b67b71d08ebc6 extra_fonts_v01.tar.xz
|
405bfe3b7c7f80034837c05656535053305727ee4bf1d993521b67b71d08ebc6 extra_fonts_v01.tar.xz
|
||||||
@@ -171,6 +135,10 @@ d62225f6a23e49355a59a2bd9a495390694bd70d4be6d6527cfb7fb2e2d65f0d defpfx_x64_v01
|
|||||||
# create with wine_x_tkg_10-0_amd64 (universal user: xuser and isolate_home by default)
|
# create with wine_x_tkg_10-0_amd64 (universal user: xuser and isolate_home by default)
|
||||||
# winetricks msxml3 msxml4 msxml6 andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts wsh57 vcrun6 gdiplus lucida tahoma ucrtbase2019 vcrun2019 dotnet40 dotnet48 dotnet20sp2 d3dcompiler_47
|
# winetricks msxml3 msxml4 msxml6 andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts wsh57 vcrun6 gdiplus lucida tahoma ucrtbase2019 vcrun2019 dotnet40 dotnet48 dotnet20sp2 d3dcompiler_47
|
||||||
|
|
||||||
|
eb1fec64eea3d83f2bdce185c7bc0c1a93afb51139f16256c885098a6f7e2242 defpfx_dn48_x64_v03.tar.xz
|
||||||
|
# based on dotpfx48v8 (renamed steamuser to xuser and isolate_home by default)
|
||||||
|
# winetricks dotnet20sp2 dotnet40 dotnet45 dotnet46 dotnet461 dotnet462 dotnet472 dotnet48 andale arial comicsans courier georgia impact times rebuchet verdana webdings corefonts lucida mfc42 msxml3 msxml4 msxml6 vcrun2005 vcrun2010 vcrun2012 vcrun2013 vcrun2022 atmlib gdiplus 7zip
|
||||||
|
|
||||||
68ad589a3e6d8a845c2e3bd4c2672cf97982b3fea0ca4b4f2fb6da126d8b3075 tflex_pfx_x64_v03.tar.xz
|
68ad589a3e6d8a845c2e3bd4c2672cf97982b3fea0ca4b4f2fb6da126d8b3075 tflex_pfx_x64_v03.tar.xz
|
||||||
# create with wine_wh_tflex_10-9_amd64
|
# create with wine_wh_tflex_10-9_amd64
|
||||||
# winetricks isolate_home msxml6 ipamona opensymbol wenquanyi ucrtbase2019 uff unifont droid wenquanyizenhei internal dotnet48 dotnet20 eufonts takao d3dcompiler_47 fontsmooth=rgb vcrun2019 vlgothic andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts liberation sourcehansans baekmuk tahoma lucida t-flex-cad-prepair
|
# winetricks isolate_home msxml6 ipamona opensymbol wenquanyi ucrtbase2019 uff unifont droid wenquanyizenhei internal dotnet48 dotnet20 eufonts takao d3dcompiler_47 fontsmooth=rgb vcrun2019 vlgothic andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts liberation sourcehansans baekmuk tahoma lucida t-flex-cad-prepair
|
||||||
@@ -208,12 +176,18 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
|
|||||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||||
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
|
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
|
||||||
|
|
||||||
4fa93434c5c15440014357323257ddcee7d28b94ad6a56bd6f5a08b33ae4c3cb scadaoffice_pfx_x64_v04.tar.xz
|
8c6312f2e4e846a98ca4a87fc90ee1917eb28d4caaddde040fb4d2dd05f8c0fe scadaoffice_pfx_x64_v05.tar.xz
|
||||||
# create with wine-8.8-staging-amd64
|
# create with wine_x_tkg_10-0_amd64 (universal user: xuser)
|
||||||
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
|
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
|
||||||
# + addons with ODBC, SSH, *.reg
|
|
||||||
|
# addons with ODBC, SSH, *.reg
|
||||||
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
|
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
|
||||||
|
|
||||||
ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client_pfx_x86_v01.tar.xz
|
ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client_pfx_x86_v01.tar.xz
|
||||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||||
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip
|
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip
|
||||||
|
|
||||||
|
f18864014fdb2fead0b45b5e70e95073072b89168df8cd6debba89081ac51a2a ksamu_pfx_x64_v01.tar.xz
|
||||||
|
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||||
|
# winetricks msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
|
||||||
|
# + manuall installed riched32
|
||||||
|
|||||||
@@ -3,37 +3,33 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.nalog.gov.ru"
|
export PROG_URL="https://www.nalog.gov.ru"
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||||
export WINEPREFIX="declaration"
|
export WINEPREFIX="nalog"
|
||||||
export PROG_NAME="Декларация"
|
export PROG_NAME="Декларация"
|
||||||
export PROG_ICON="declarac"
|
export PROG_ICON="declarac"
|
||||||
export BASE_PFX="defpfx_x86_v01"
|
export BASE_PFX="none"
|
||||||
export WINEARCH="win32"
|
export WINEARCH="win32"
|
||||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
|
||||||
|
|
||||||
DECL_FILE="${WH_TMP_DIR}/decl.html"
|
try_get_page "https://www.nalog.gov.ru/rn77/program/5961249/"
|
||||||
curl -o "$DECL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961249/"
|
VER_YEAR=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-2)}' | head -n 1)
|
||||||
|
|
||||||
if [[ ! -f "$DECL_FILE" ]] \
|
|
||||||
|| grep -q "Forbidden" "$DECL_FILE"
|
|
||||||
then
|
|
||||||
fatal "The site page is unavailable or the request limit has been exceeded."
|
|
||||||
fi
|
|
||||||
|
|
||||||
VER_YEAR=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF-2)}' | head -n 1)
|
|
||||||
YEAR="${VER_YEAR//decl/}"
|
YEAR="${VER_YEAR//decl/}"
|
||||||
VER_MSI_SLASH=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF-1)}' | head -n 1)
|
VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
|
||||||
VER_MSI=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF)}' | head -n 1)
|
VER_MSI=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF)}' | head -n 1)
|
||||||
|
|
||||||
AUTOINSTALL_MSI="${WH_TMP_DIR}/${VER_MSI}"
|
AUTOINSTALL_MSI="${WH_TMP_DIR}/${VER_MSI}"
|
||||||
|
|
||||||
prepair_wine
|
prepair_wine
|
||||||
if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/$VER_MSI" "${AUTOINSTALL_MSI}" ; then
|
if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/${VER_MSI}" "${AUTOINSTALL_MSI}" ; then
|
||||||
wine_run_install "${AUTOINSTALL_MSI}" "/q"
|
wine_run_install "${AUTOINSTALL_MSI}" /q
|
||||||
try_remove_file "${AUTOINSTALL_MSI}"
|
try_remove_file "${AUTOINSTALL_MSI}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe"
|
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe"
|
||||||
create_desktop "$PROG_NAME $YEAR" "$WIN_FILE_EXEC" "$PROG_ICON"
|
create_desktop "$PROG_NAME $YEAR" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||||
remove_desktop "Декларация $((YEAR - 1))"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
# Удаляем ярлык предыдущей версии
|
||||||
|
remove_desktop "Декларация $((YEAR - 1))"
|
||||||
|
|
||||||
|
print_info "Программа Декларация $YEAR успешно установлена"
|
||||||
|
else
|
||||||
|
fatal "Не удалось скачать установочный файл"
|
||||||
|
fi
|
||||||
18
testinstall/ksamu
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: “КСАМУ” - Комплексная система автоматизации медицинского учреждения.
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://docs.medicine-it.ru/"
|
||||||
|
export WH_WINE_USE="wine-10.12.1-alt1-wow64"
|
||||||
|
export WINEPREFIX="ksamu"
|
||||||
|
export PROG_NAME="КСАМУ"
|
||||||
|
export PROG_ICON="ksamu"
|
||||||
|
export BASE_PFX="ksamu_pfx_x64_v01"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml4 msxml3 fontsmooth=gray"
|
||||||
|
# riched32
|
||||||
|
export WH_USE_EXTRA_FONTS="1"
|
||||||
|
export WH_WINDOWS_VER="7"
|
||||||
|
export WH_USE_CPCSP_PROXY="1"
|
||||||
|
|
||||||
|
prepair_wine
|
||||||
|
create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON"
|
||||||
@@ -6,32 +6,24 @@ export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
|||||||
export WINEPREFIX="nalog"
|
export WINEPREFIX="nalog"
|
||||||
export PROG_NAME="Налогоплательщик ЮЛ"
|
export PROG_NAME="Налогоплательщик ЮЛ"
|
||||||
export PROG_ICON="npul"
|
export PROG_ICON="npul"
|
||||||
export BASE_PFX="defpfx_x86_v01"
|
export BASE_PFX="none"
|
||||||
export WINEARCH="win32"
|
export WINEARCH="win32"
|
||||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
|
||||||
|
|
||||||
NPUL_FILE="${WH_TMP_DIR}/npul.html"
|
try_get_page "https://data.nalog.ru/rn77/program/5961229/"
|
||||||
curl -o "$NPUL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961229/"
|
VER_MSI=$(read_page | grep -oP 'NalogUL\d+\.msi' | tail -1 | grep -oP '\d+')
|
||||||
|
VER_MSI_URL="${VER_MSI:0:1}.${VER_MSI:1}" # 492 → 4.92
|
||||||
if [[ ! -f "$NPUL_FILE" ]] \
|
VER_EXE=$(read_page | grep -oP 'NalogUL\d+\.exe' | tail -1 | grep -oP '\d+')
|
||||||
|| grep -q "Forbidden" "$NPUL_FILE"
|
VER_EXE_URL="${VER_EXE:0:1}.${VER_EXE:1:2}.${VER_EXE:3}" # 4924 → 4.92.4
|
||||||
then
|
|
||||||
fatal "Страница сайта не доступна, или превышено количество запросов к странице."
|
|
||||||
fi
|
|
||||||
|
|
||||||
VER_MSI=$(grep -oP 'NalogUL\K[0-9.]+(?=\.msi)' "$NPUL_FILE" | tail -n 1)
|
|
||||||
VER_MSI_SLASH=$(grep -oP '[0-9]+\.[0-9]+/NalogUL[0-9]+\.msi' "$NPUL_FILE" | tail -n 1)
|
|
||||||
VER_EXE=$(grep -oP 'NalogUL\K[0-9.]+(?=\.exe)' "$NPUL_FILE" | tail -n 1)
|
|
||||||
VER_EXE_SLASH=$(grep -oP '[0-9]+\.[0-9]+\.[0-9]+/NalogUL[0-9]+\.exe' "$NPUL_FILE" | tail -n 1)
|
|
||||||
|
|
||||||
AUTOINSTALL_MSI="${WH_TMP_DIR}/NalogUL${VER_MSI}.msi"
|
AUTOINSTALL_MSI="${WH_TMP_DIR}/NalogUL${VER_MSI}.msi"
|
||||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/NalogUL${VER_EXE}.exe"
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/NalogUL${VER_EXE}.exe"
|
||||||
|
|
||||||
prepair_wine
|
prepair_wine
|
||||||
if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_SLASH}" "${AUTOINSTALL_MSI}" ; then
|
if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_URL}/NalogUL${VER_MSI}.msi" "${AUTOINSTALL_MSI}" ; then
|
||||||
wine_run_install "${AUTOINSTALL_MSI}" /quiet INSTALLDIR="c:\npul"
|
wine_run_install "${AUTOINSTALL_MSI}" /quiet INSTALLDIR="c:\npul"
|
||||||
try_remove_file "${AUTOINSTALL_MSI}"
|
try_remove_file "${AUTOINSTALL_MSI}"
|
||||||
|
|
||||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")"
|
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")"
|
||||||
wine_run_install "${PRINT_INSTALLER}" "/q"
|
wine_run_install "${PRINT_INSTALLER}" "/q"
|
||||||
@@ -42,7 +34,7 @@ if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_SLASH}" "${AUTOINST
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "$VER_EXE" ]] \
|
if [[ -n "$VER_EXE" ]] \
|
||||||
&& try_download "https://data.nalog.ru/files/nalul/${VER_EXE_SLASH}" "${AUTOINSTALL_EXE}"
|
&& try_download "https://data.nalog.ru/files/nalul/${VER_EXE_URL}/NalogUL${VER_EXE}.exe" "${AUTOINSTALL_EXE}"
|
||||||
then
|
then
|
||||||
wine_run_install "${AUTOINSTALL_EXE}" "/SILENT"
|
wine_run_install "${AUTOINSTALL_EXE}" "/SILENT"
|
||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
@@ -53,4 +45,3 @@ fi
|
|||||||
touch "$DRIVE_C/npul/INPUTDOC/linux.txt"
|
touch "$DRIVE_C/npul/INPUTDOC/linux.txt"
|
||||||
WIN_FILE_EXEC="$DRIVE_C/npul/INPUTDOC/inputdoc.exe"
|
WIN_FILE_EXEC="$DRIVE_C/npul/INPUTDOC/inputdoc.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||||
try_remove_file "$NPUL_FILE"
|
|
||||||
@@ -2,24 +2,26 @@
|
|||||||
# info_ru: Подготовка документов для государственной регистрации (ППДГР)
|
# info_ru: Подготовка документов для государственной регистрации (ППДГР)
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.nalog.gov.ru"
|
export PROG_URL="https://www.nalog.gov.ru"
|
||||||
export AUTOINSTALL_EXE="${WH_TMP_DIR}/SetupPPDGR2.msi"
|
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||||
export WINEPREFIX="ppdgr2"
|
export WINEPREFIX="nalog"
|
||||||
export PROG_NAME="ППДГР-2"
|
export PROG_NAME="ППДГР-2"
|
||||||
# export PROG_VERSION=""
|
|
||||||
export PROG_ICON="ppdgr"
|
export PROG_ICON="ppdgr"
|
||||||
# export ADD_MIME_TYPE=""
|
export BASE_PFX="none"
|
||||||
export BASE_PFX="defpfx_dn48_x86_v01"
|
|
||||||
export WINEARCH="win32"
|
export WINEARCH="win32"
|
||||||
export INSTALL_DLL="dotnet48 msxml3 msxml4 msxml6 corefonts lucida wsh57 vcrun6 jet40 gdiplus"
|
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
var_winedlloverride_update "msxml4=b,wininet=b"
|
var_winedlloverride_update "msxml4=b,wininet=b"
|
||||||
|
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
|
||||||
|
|
||||||
|
try_get_page "https://www.nalog.gov.ru/rn77/program/5961277/"
|
||||||
|
VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/SetupPPDGR2.msi"
|
||||||
|
|
||||||
prepair_wine
|
prepair_wine
|
||||||
if try_download "https://data.nalog.ru/files/ppdgr/2.7.0/SetupPPDGR2.msi" "${AUTOINSTALL_EXE}" ; then
|
if try_download "https://data.nalog.ru/files/ppdgr/${VER_MSI_SLASH}/SetupPPDGR2.msi" "${AUTOINSTALL_EXE}" ; then
|
||||||
wine_run_install "${AUTOINSTALL_EXE}" /q
|
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/ППДГР-2/PPDGR2.exe"
|
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/ППДГР-2/PPDGR2.exe"
|
||||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||||
fi
|
fi
|
||||||
|
https://data.nalog.ru/files/ppdgr/2.7.3/SetupPPDGR2.msi
|
||||||
78
testinstall/scadoffice
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://scadoffice.ru"
|
||||||
|
export WH_WINE_USE="wine-8.8-staging-amd64"
|
||||||
|
export WINEPREFIX="scadoffice"
|
||||||
|
export PROG_NAME="SCAD Office"
|
||||||
|
export PROG_ICON="scadoffice"
|
||||||
|
export BASE_PFX="none"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export INSTALL_DLL="dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6" #dotnet20
|
||||||
|
export WH_XDG_OPEN="rtf"
|
||||||
|
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
||||||
|
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
||||||
|
|
||||||
|
prepair_wine
|
||||||
|
|
||||||
|
DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
|
||||||
|
|
||||||
|
if [[ -n $2 ]] ; then
|
||||||
|
if [[ ! -d "$DRIVE_C_SCADOFFICE" ]] ; then
|
||||||
|
fatal "Перезапустите скрипт без дополнительных аргументов для установки SCAD Office:
|
||||||
|
winehelper install scadoffice"
|
||||||
|
elif [[ ! -f "$2" ]] ; then
|
||||||
|
fatal "Перезапустите скрипт с правильным путем до файла лицензии SCAD Office:
|
||||||
|
winehelper install scadoffice \"/путь/до/файла.exe\""
|
||||||
|
else
|
||||||
|
print_info "Устанавливаем файл лицензии $2"
|
||||||
|
wine_run "$2"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||||
|
create_new_dir "$DRIVE_C/SDATA"
|
||||||
|
create_new_dir "$DRIVE_C/SWORK"
|
||||||
|
wine_run_install "$AUTOINSTALL_EXE"
|
||||||
|
# try_remove_file "$AUTOINSTALL_EXE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "Установка дополнительных компонентов..."
|
||||||
|
|
||||||
|
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
||||||
|
|
||||||
|
if try_download "$SCADOFFICE_ADDONS_URL" "$ADDONS_PACK" ; then
|
||||||
|
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
||||||
|
create_new_dir "$ADDONS_PATH"
|
||||||
|
unpack "$ADDONS_PACK" "$ADDONS_PATH"
|
||||||
|
# try_remove_file "$ADDONS_PACK"
|
||||||
|
|
||||||
|
# Установка ODBC
|
||||||
|
try_remove_dir "${DRIVE_C}/Program Files/Common Files/System"
|
||||||
|
cp -r "${ADDONS_PATH}/mdac64/System" "${DRIVE_C}/Program Files/Common Files/" || fatal
|
||||||
|
cp -r "${ADDONS_PATH}/mdac64"/*.* "${DRIVE_C}/windows/system32/" || fatal
|
||||||
|
|
||||||
|
# Установка SSH
|
||||||
|
cp -r "${ADDONS_PATH}/OpenSSH" "${DRIVE_C}/windows/system32/" || fatal
|
||||||
|
|
||||||
|
# Применение .reg файлов для изменения реестра
|
||||||
|
wine_run "${ADDONS_PATH}/mdac64"/*.reg
|
||||||
|
wine_run "${ADDONS_PATH}/REG"/*.reg
|
||||||
|
|
||||||
|
try_remove_dir "$ADDONS_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Определение всех программ, значков и исполняемых файлов
|
||||||
|
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
||||||
|
|
||||||
|
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
||||||
|
|
||||||
|
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
||||||
|
|
||||||
|
# Цикл создания десктоп файлов для scad office
|
||||||
|
for i in "${!PROG_NAME_All[@]}"; do
|
||||||
|
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
||||||
|
done
|
||||||
@@ -2,20 +2,21 @@
|
|||||||
# info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков
|
# info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.nalog.gov.ru"
|
export PROG_URL="https://www.nalog.gov.ru"
|
||||||
export AUTOINSTALL_EXE="${WH_TMP_DIR}/soun_ins.exe"
|
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||||
export WINEPREFIX="soun"
|
export WINEPREFIX="nalog"
|
||||||
export PROG_NAME="СОУН"
|
export PROG_NAME="СОУН"
|
||||||
# export PROG_VERSION=""
|
|
||||||
export PROG_ICON="soun"
|
export PROG_ICON="soun"
|
||||||
# export ADD_MIME_TYPE=""
|
export BASE_PFX="none"
|
||||||
export BASE_PFX="defpfx_x86_v01"
|
|
||||||
export WINEARCH="win32"
|
export WINEARCH="win32"
|
||||||
export INSTALL_DLL="corefonts"
|
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
|
||||||
|
|
||||||
|
try_get_page "https://www.nalog.gov.ru/rn77/program/5961268/"
|
||||||
|
VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/soun_ins.exe"
|
||||||
|
|
||||||
prepair_wine
|
prepair_wine
|
||||||
if try_download "https://data.nalog.ru/files/Soun/2.6.2/soun_ins.exe" "${AUTOINSTALL_EXE}" ; then
|
if try_download "https://data.nalog.ru/files/Soun/${VER_MSI_SLASH}/soun_ins.exe" "${AUTOINSTALL_EXE}" ; then
|
||||||
# TODO: Тихий режим или предупреждение
|
# TODO: Тихий режим или предупреждение
|
||||||
wine_run_install "${AUTOINSTALL_EXE}"
|
wine_run_install "${AUTOINSTALL_EXE}"
|
||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
@@ -2,22 +2,23 @@
|
|||||||
# info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности.
|
# info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности.
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://www.nalog.gov.ru"
|
export PROG_URL="https://www.nalog.gov.ru"
|
||||||
export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-"
|
|
||||||
export AUTOINSTALL_EXE="${WH_TMP_DIR}/tester2269.exe"
|
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||||
export WINEPREFIX="nalog"
|
export WINEPREFIX="nalog"
|
||||||
export PROG_NAME="Тестер"
|
export PROG_NAME="Тестер"
|
||||||
# export PROG_VERSION=""
|
|
||||||
export PROG_ICON="tester"
|
export PROG_ICON="tester"
|
||||||
# export ADD_MIME_TYPE=""
|
export BASE_PFX="none"
|
||||||
export BASE_PFX="defpfx_x86_v01"
|
|
||||||
export WINEARCH="win32"
|
export WINEARCH="win32"
|
||||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
|
||||||
export WH_WINDOWS_VER="10"
|
export WH_WINDOWS_VER="10"
|
||||||
|
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
|
||||||
|
|
||||||
|
try_get_page "https://www.nalog.gov.ru/rn77/program/5961279/"
|
||||||
|
VER_EXE_SLASH=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF-1)}' | tail -n 1)
|
||||||
|
VER_EXE=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF)}' | tail -n 1)
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/${VER_EXE}"
|
||||||
|
|
||||||
prepair_wine
|
prepair_wine
|
||||||
if try_download "https://data.nalog.ru/files/tester/2.269/tester2269.exe" "${AUTOINSTALL_EXE}" ; then
|
if try_download "https://data.nalog.ru/files/tester/${VER_EXE_SLASH}/${VER_EXE}" "${AUTOINSTALL_EXE}" ; then
|
||||||
wine_run_install "${AUTOINSTALL_EXE}"
|
wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
|
||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_file "${AUTOINSTALL_EXE}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Tester/tester.exe"
|
WIN_FILE_EXEC="$DRIVE_C/Tester/tester.exe"
|
||||||
506
winehelper
@@ -7,7 +7,8 @@ if [[ $(id -u) -eq 0 ]] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
##### DEFAULT PATH #####
|
##### DEFAULT PATH #####
|
||||||
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT THIRD_PARTY_FILE
|
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH \
|
||||||
|
LICENSE_FILE AGREEMENT THIRD_PARTY_FILE WH_ICON_TRAY GENERAL WH_WINETRICKS
|
||||||
|
|
||||||
SCRIPT_NAME="$(basename "$0")"
|
SCRIPT_NAME="$(basename "$0")"
|
||||||
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
||||||
@@ -17,10 +18,13 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
|||||||
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
||||||
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
||||||
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
||||||
|
WH_ICON_TRAY="/usr/share/icons/hicolor/symbolic/apps/winehelper-symbolic.svg"
|
||||||
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
||||||
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
||||||
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
||||||
THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY"
|
THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY"
|
||||||
|
GENERAL="/usr/share/doc/winehelper-$WH_VERSION/GENERAL"
|
||||||
|
WH_WINETRICKS="/usr/bin/winetricks"
|
||||||
else
|
else
|
||||||
# переменные для тестового запуска WineHelper из репозитория
|
# переменные для тестового запуска WineHelper из репозитория
|
||||||
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
||||||
@@ -28,9 +32,14 @@ else
|
|||||||
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
||||||
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
||||||
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
||||||
|
WH_ICON_TRAY="$DATA_PATH/image/gui/winehelper-symbolic.svg"
|
||||||
LICENSE_FILE="$DATA_PATH/LICENSE"
|
LICENSE_FILE="$DATA_PATH/LICENSE"
|
||||||
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
||||||
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
||||||
|
GENERAL="$DATA_PATH/GENERAL"
|
||||||
|
WH_WINETRICKS="/usr/bin/winetricks"
|
||||||
|
WH_DEVEL="1"
|
||||||
|
|
||||||
|
|
||||||
# минимальная проверка синтаксиса скриптов
|
# минимальная проверка синтаксиса скриптов
|
||||||
for self_check_script in "$RUN_SCRIPT" \
|
for self_check_script in "$RUN_SCRIPT" \
|
||||||
@@ -49,21 +58,21 @@ fi
|
|||||||
|
|
||||||
##### MESSAGES FUNCTIONS #####
|
##### MESSAGES FUNCTIONS #####
|
||||||
if [[ $WH_USE_GUI != "1" ]] ; then
|
if [[ $WH_USE_GUI != "1" ]] ; then
|
||||||
print_error () { printf "\E[31m%s Ошибка: $@ %s\e[0m\n" ;}
|
print_error () { printf "\E[31m%s Ошибка: $* %s\e[0m\n" ;}
|
||||||
print_warning () { printf "\E[33m%s Предупреждение: $@ %s\e[0m\n" ;}
|
print_warning () { printf "\E[33m%s Предупреждение: $* %s\e[0m\n" ;}
|
||||||
print_info () { printf "\E[36m%s Информация: \"$@\" %s\e[0m\n" ;}
|
print_info () { printf "\E[36m%s Информация: \"$*\" %s\e[0m\n" ;}
|
||||||
print_ok () { printf "\E[35m%s Успех: $@ %s\e[0m\n" ;}
|
print_ok () { printf "\E[35m%s Успех: $* %s\e[0m\n" ;}
|
||||||
else
|
else
|
||||||
print_error () { echo -e "Ошибка: $@" ;}
|
print_error () { echo -e "Ошибка: $*" ;}
|
||||||
print_warning () { echo -e "Предупреждение: $@" ;}
|
print_warning () { echo -e "Предупреждение: $*" ;}
|
||||||
print_info () { echo -e "Информация: \"$@\"" ;}
|
print_info () { echo -e "Информация: \"$*\"" ;}
|
||||||
print_ok () { echo -e "Успех: $@" ;}
|
print_ok () { echo -e "Успех: $*" ;}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
||||||
|
|
||||||
fatal () {
|
fatal () {
|
||||||
print_error "$@"
|
print_error "$@ Аварийное завершение работы WineHelper!"
|
||||||
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
@@ -83,7 +92,7 @@ check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
|
|||||||
|
|
||||||
##### CHECK DEBUG #####
|
##### CHECK DEBUG #####
|
||||||
if [[ "$1" == "--debug" ]] ; then
|
if [[ "$1" == "--debug" ]] ; then
|
||||||
check_variables WINEDEBUG "+loaddll,+seh"
|
check_variables WINEDEBUG "+loaddll"
|
||||||
export DXVK_LOG_LEVEL="error"
|
export DXVK_LOG_LEVEL="error"
|
||||||
export VKD3D_DEBUG="error"
|
export VKD3D_DEBUG="error"
|
||||||
export WINE_MONO_TRACE="E:System.NotImplementedException"
|
export WINE_MONO_TRACE="E:System.NotImplementedException"
|
||||||
@@ -101,17 +110,6 @@ else
|
|||||||
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $WINEDEBUG != "-all" ]] ; then
|
|
||||||
export LOG_FILE="$HOME/winehelper.log"
|
|
||||||
date > "$LOG_FILE"
|
|
||||||
print_warning "Включен режим логирования работы WINE."
|
|
||||||
print_warning "Лог будет сохранен по пути: $LOG_FILE"
|
|
||||||
sleep 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
##### WINETRICKS VERSION #####
|
|
||||||
WINETRICKS_VERSION="20250102"
|
|
||||||
|
|
||||||
##### DEFAULT VARIABLES #####
|
##### DEFAULT VARIABLES #####
|
||||||
WH_VULKAN_LIBDIR="$USER_WORK_PATH/vulkan"
|
WH_VULKAN_LIBDIR="$USER_WORK_PATH/vulkan"
|
||||||
WH_PREFIXES_DIR="$USER_WORK_PATH/prefixes"
|
WH_PREFIXES_DIR="$USER_WORK_PATH/prefixes"
|
||||||
@@ -123,7 +121,6 @@ WH_DB_DIR="$DATA_PATH/database"
|
|||||||
WH_AUTOINSTALL_DIR="$DATA_PATH/autoinstall"
|
WH_AUTOINSTALL_DIR="$DATA_PATH/autoinstall"
|
||||||
WH_MANUALINSTALL_DIR="$DATA_PATH/manualinstall"
|
WH_MANUALINSTALL_DIR="$DATA_PATH/manualinstall"
|
||||||
WH_TESTINSTALL_DIR="$DATA_PATH/testinstall"
|
WH_TESTINSTALL_DIR="$DATA_PATH/testinstall"
|
||||||
WH_WINETRICKS="$DATA_PATH/winetricks_$WINETRICKS_VERSION"
|
|
||||||
|
|
||||||
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
|
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
|
||||||
|
|
||||||
@@ -145,7 +142,8 @@ check_variables WINEARCH "win64" # or "win32"
|
|||||||
check_variables WH_WINE_USE "wine_x_tkg_10-0_amd64" # or system
|
check_variables WH_WINE_USE "wine_x_tkg_10-0_amd64" # or system
|
||||||
|
|
||||||
check_variables WH_USE_CPCSP_PROXY "0"
|
check_variables WH_USE_CPCSP_PROXY "0"
|
||||||
check_variables CPCSP_PROXY_VER "0.6.1-alt1"
|
check_variables CPCSP_PROXY_X86_64_VER "0.6.1-alt1"
|
||||||
|
check_variables CPCSP_PROXY_WOW64_VER "0.7.3-alt5-wow64"
|
||||||
|
|
||||||
check_variables WH_USE_EXTRA_FONTS "0"
|
check_variables WH_USE_EXTRA_FONTS "0"
|
||||||
check_variables EXTRA_FONTS_VER "01"
|
check_variables EXTRA_FONTS_VER "01"
|
||||||
@@ -161,6 +159,7 @@ check_variables WH_WINDOWS_VER "10"
|
|||||||
# check_variables WH_USE_GSTREAMER "1"
|
# check_variables WH_USE_GSTREAMER "1"
|
||||||
# check_variables WH_USE_D3D_EXTRAS "1"
|
# check_variables WH_USE_D3D_EXTRAS "1"
|
||||||
check_variables WH_USE_SHADER_CACHE "1"
|
check_variables WH_USE_SHADER_CACHE "1"
|
||||||
|
check_variables WH_USE_MESA_GL_OVERRIDE "0"
|
||||||
check_variables WH_USE_WINE_DXGI "0"
|
check_variables WH_USE_WINE_DXGI "0"
|
||||||
check_variables WH_DLL_INSTALL ""
|
check_variables WH_DLL_INSTALL ""
|
||||||
|
|
||||||
@@ -330,6 +329,7 @@ unpack () {
|
|||||||
try_get_page () {
|
try_get_page () {
|
||||||
local url_page="$1"
|
local url_page="$1"
|
||||||
export OUT_PAGE_TMP="${WH_TMP_DIR}/url_page.tmp"
|
export OUT_PAGE_TMP="${WH_TMP_DIR}/url_page.tmp"
|
||||||
|
try_remove_file "$OUT_PAGE_TMP"
|
||||||
print_info "Чтение страницы: $url_page"
|
print_info "Чтение страницы: $url_page"
|
||||||
if ! curl -o "$OUT_PAGE_TMP" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$url_page" \
|
if ! curl -o "$OUT_PAGE_TMP" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$url_page" \
|
||||||
|| grep -q "Forbidden" "$OUT_PAGE_TMP"
|
|| grep -q "Forbidden" "$OUT_PAGE_TMP"
|
||||||
@@ -346,7 +346,6 @@ read_page () {
|
|||||||
&& [[ -f "$OUT_PAGE_TMP" ]]
|
&& [[ -f "$OUT_PAGE_TMP" ]]
|
||||||
then
|
then
|
||||||
cat "$OUT_PAGE_TMP"
|
cat "$OUT_PAGE_TMP"
|
||||||
try_remove_file "$OUT_PAGE_TMP"
|
|
||||||
unset OUT_PAGE_TMP
|
unset OUT_PAGE_TMP
|
||||||
else
|
else
|
||||||
echo "Используй try_get_page перед read_page"
|
echo "Используй try_get_page перед read_page"
|
||||||
@@ -462,9 +461,12 @@ try_copy_wine_dll_to_pfx_64 () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try_copy_wine_dll_to_pfx_32() {
|
try_copy_wine_dll_to_pfx_32() {
|
||||||
if [[ -d "$WINEDIR/lib/wine/i386-windows" ]]
|
if [[ -d "$WINEDIR/lib/wine/i386-windows" ]] ; then
|
||||||
then WINE_BUILD_DLL_32="$WINEDIR/lib/wine/i386-windows"
|
WINE_BUILD_DLL_32="$WINEDIR/lib/wine/i386-windows"
|
||||||
else WINE_BUILD_DLL_32="$WINEDIR/lib/wine"
|
elif [[ -d "$WINEDIR/lib64/wine/i386-windows" ]] ; then
|
||||||
|
WINE_BUILD_DLL_32="$WINEDIR/lib64/wine/i386-windows"
|
||||||
|
else
|
||||||
|
WINE_BUILD_DLL_32="$WINEDIR/lib/wine"
|
||||||
fi
|
fi
|
||||||
if [[ "$WINEARCH" == "win64" ]] ; then
|
if [[ "$WINEARCH" == "win64" ]] ; then
|
||||||
cmp -s "$WINE_BUILD_DLL_32/$1" "${WINEPREFIX}/drive_c/windows/syswow64/$1" && return 0
|
cmp -s "$WINE_BUILD_DLL_32/$1" "${WINEPREFIX}/drive_c/windows/syswow64/$1" && return 0
|
||||||
@@ -482,6 +484,10 @@ var_winedlloverride_update () {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmp_winedlloverride_update () {
|
||||||
|
var_winedlloverride_update "$1"
|
||||||
|
}
|
||||||
|
|
||||||
var_dxvk_config_update () {
|
var_dxvk_config_update () {
|
||||||
if [[ -n "${DXVK_CONFIG}" ]]
|
if [[ -n "${DXVK_CONFIG}" ]]
|
||||||
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
||||||
@@ -520,6 +526,10 @@ var_ld_library_path_update () {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_wayland_session () {
|
||||||
|
[[ $XDG_SESSION_TYPE =~ "wayland" ]] && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
find_prefix () {
|
find_prefix () {
|
||||||
# Автоматическое определение префикса, если он не задан
|
# Автоматическое определение префикса, если он не задан
|
||||||
if [[ -z "$WINEPREFIX" ]] && [[ "$1" == "$WH_PREFIXES_DIR"* ]]; then
|
if [[ -z "$WINEPREFIX" ]] && [[ "$1" == "$WH_PREFIXES_DIR"* ]]; then
|
||||||
@@ -550,8 +560,6 @@ create_desktop () {
|
|||||||
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
|
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
|
||||||
fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]"
|
fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]"
|
||||||
elif [[ ! -f "$exe_file" ]] ; then
|
elif [[ ! -f "$exe_file" ]] ; then
|
||||||
print_warning "Для создания ярлыка не найден исполняемый файл: $exe_file"
|
|
||||||
|
|
||||||
local BASENAME_EXE="$(basename "$exe_file")"
|
local BASENAME_EXE="$(basename "$exe_file")"
|
||||||
print_info "Запускаем поиск $BASENAME_EXE"
|
print_info "Запускаем поиск $BASENAME_EXE"
|
||||||
local FIND_PATH
|
local FIND_PATH
|
||||||
@@ -562,9 +570,11 @@ create_desktop () {
|
|||||||
exe_file="$(find "$FIND_PATH" -type f -not -type l \
|
exe_file="$(find "$FIND_PATH" -type f -not -type l \
|
||||||
-not -path "*/windows/*" -not -path "*/dosdevices/*" \
|
-not -path "*/windows/*" -not -path "*/dosdevices/*" \
|
||||||
-iname "$BASENAME_EXE")"
|
-iname "$BASENAME_EXE")"
|
||||||
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]]
|
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]] ; then
|
||||||
then fatal "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
|
print_error "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
|
||||||
else print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
|
return 1
|
||||||
|
else
|
||||||
|
print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -871,6 +881,10 @@ init_wine_ver () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
[[ ! -f "$WINEDIR/version" ]] && echo "$WH_WINE_USE" > "$WINEDIR/version"
|
[[ ! -f "$WINEDIR/version" ]] && echo "$WH_WINE_USE" > "$WINEDIR/version"
|
||||||
|
if [[ $WH_WINE_USE =~ wow64 ]]
|
||||||
|
then export WH_WINE_WOW64="1"
|
||||||
|
else export WH_WINE_WOW64="0"
|
||||||
|
fi
|
||||||
|
|
||||||
export WINE="$WINEDIR/bin/wine"
|
export WINE="$WINEDIR/bin/wine"
|
||||||
export WINELOADER="$WINEDIR/bin/wine"
|
export WINELOADER="$WINEDIR/bin/wine"
|
||||||
@@ -905,21 +919,32 @@ init_wine_ver () {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $WH_USE_CPCSP_PROXY == "1" ]] \
|
if [[ $WH_USE_CPCSP_PROXY == "1" ]] ; then
|
||||||
&& ! grep -q "$CPCSP_PROXY_VER" "$WINEDIR/cpcsp_proxy.ver"
|
local cpcsp_proxy_ver
|
||||||
then
|
if [[ $WH_WINE_WOW64 == "1" ]]
|
||||||
CPCSP_PROXY_NAME="wine-cpcsp_proxy-$CPCSP_PROXY_VER"
|
then cpcsp_proxy_ver="$CPCSP_PROXY_WOW64_VER"
|
||||||
CPCSP_PROXY_URL="$CLOUD_URL/$CPCSP_PROXY_NAME.tar.xz"
|
else cpcsp_proxy_ver="$CPCSP_PROXY_X86_64_VER"
|
||||||
|
fi
|
||||||
try_download cloud "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum
|
if [[ ! -f "$WINEDIR/cpcsp_proxy.ver" ]] \
|
||||||
unpack "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" "$WH_TMP_DIR"
|
|| ! grep -q "$cpcsp_proxy_ver" "$WINEDIR/cpcsp_proxy.ver"
|
||||||
|
then
|
||||||
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"i386-* "$WINEDIR/lib/wine/"
|
CPCSP_PROXY_NAME="wine-cpcsp_proxy-$cpcsp_proxy_ver"
|
||||||
if [[ -d "$WINEDIR/lib64" ]] ; then
|
CPCSP_PROXY_URL="$CLOUD_URL/$CPCSP_PROXY_NAME.tar.xz"
|
||||||
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"x86_64-* "$WINEDIR/lib64/wine/"
|
|
||||||
|
try_download cloud "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum
|
||||||
|
unpack "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" "$WH_TMP_DIR"
|
||||||
|
|
||||||
|
if [[ $WH_WINE_WOW64 == "1" ]] ; then
|
||||||
|
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"* "$WINEDIR/lib64/wine/"
|
||||||
|
else
|
||||||
|
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"i386-* "$WINEDIR/lib/wine/"
|
||||||
|
if [[ -d "$WINEDIR/lib64" ]] ; then
|
||||||
|
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"x86_64-* "$WINEDIR/lib64/wine/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
try_remove_dir "$WH_TMP_DIR/$CPCSP_PROXY_NAME"
|
||||||
|
echo "$cpcsp_proxy_ver" > "$WINEDIR/cpcsp_proxy.ver"
|
||||||
fi
|
fi
|
||||||
try_remove_dir "$WH_TMP_DIR/$CPCSP_PROXY_NAME"
|
|
||||||
echo "$CPCSP_PROXY_VER" > "$WINEDIR/cpcsp_proxy.ver"
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# use system WINE
|
# use system WINE
|
||||||
@@ -1169,9 +1194,30 @@ init_wineprefix () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $WH_USE_MESA_GL_OVERRIDE == "1" ]] \
|
if [[ $WH_USE_MESA_GL_OVERRIDE == "1" ]] \
|
||||||
&& ! lspci | grep -i nvidia > /dev/null ; then
|
&& ! lspci | grep -i nvidia > /dev/null
|
||||||
|
then
|
||||||
export MESA_GL_VERSION_OVERRIDE="3.3"
|
export MESA_GL_VERSION_OVERRIDE="3.3"
|
||||||
export MESA_GLSL_VERSION_OVERRIDE="330"
|
export MESA_GLSL_VERSION_OVERRIDE="330"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_wayland_session ; then
|
||||||
|
# добаляем возможность запуска в нативном wayland если WH_USE_WAYLAND=1
|
||||||
|
if [[ $WH_USE_WAYLAND == "1" ]] ; then
|
||||||
|
export WINE_WAYLAND_HACKS="1"
|
||||||
|
var_winedlloverride_update "winex11.drv=d;winewayland.drv=b"
|
||||||
|
get_and_set_reg_file --add 'Software\Wine\Drivers' 'Graphics' 'REG_SZ' "x11,wayland" "user"
|
||||||
|
else
|
||||||
|
unset WINE_WAYLAND_HACKS
|
||||||
|
get_and_set_reg_file --delete 'Software\Wine\Drivers' 'Graphics'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# исправляем некорректное отображение выпадающих окон под wayland
|
||||||
|
if [[ $DXVK_VER == "none" ]] \
|
||||||
|
|| [[ $VKD3D_VER == "none" ]]
|
||||||
|
then
|
||||||
|
check_variables WINE_D3D_CONFIG "renderer=vulkan"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# хак для XRDP сессии
|
# хак для XRDP сессии
|
||||||
@@ -1184,6 +1230,21 @@ init_wineprefix () {
|
|||||||
get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXVidMode'
|
get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXVidMode'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# отключаем декоратор для maincontroller.exe
|
||||||
|
# заменяет патч: https://git.altlinux.org/gears/w/wine.git?p=wine.git;a=blob;f=patches/0009-wine.inf.in-disable-decorated-window-for-maincontrol.patch;h=887a5e90e130cddeefdead831ef7a78a32588f11;hb=d097f4e4b64873c82ec31542c6f49f70829ab2b4
|
||||||
|
get_and_set_reg_file --add 'Software\Wine\AppDefaults\maincontroller.exe\X11 Driver' 'Decorated' 'REG_SZ' "N" "user"
|
||||||
|
|
||||||
|
# заменям шрифт Microsoft Sans Serif на Tahoma
|
||||||
|
# заменяет патч: https://git.altlinux.org/gears/w/wine.git?p=wine.git;a=blob;f=patches/0003-wine.inf-Add-the-font-replacement-for-Microsoft-Sans.patch;h=26b8ae2192d94a2b8ddd8565b90b62a2c2b0ed52;hb=d097f4e4b64873c82ec31542c6f49f70829ab2b4
|
||||||
|
get_and_set_reg_file --add 'Software\Wine\Fonts\Replacements' 'Microsoft Sans Serif' 'REG_SZ' "Tahoma" "user"
|
||||||
|
|
||||||
|
# добавляем сглаживание шрифтов
|
||||||
|
# заменяет патч: https://git.altlinux.org/gears/w/wine.git?p=wine.git;a=blob;f=patches/0002-Add-font-smoothing.patch;h=d7c252899499e9ee0e1a93f7c02548cc79025358;hb=d097f4e4b64873c82ec31542c6f49f70829ab2b4
|
||||||
|
get_and_set_reg_file --add 'Control Panel\Desktop' 'FontSmoothing' 'REG_SZ' "2" "user"
|
||||||
|
get_and_set_reg_file --add 'Control Panel\Desktop' 'FontSmoothingGamma' 'REG_DWORD' "0x00000578" "user"
|
||||||
|
get_and_set_reg_file --add 'Control Panel\Desktop' 'FontSmoothingOrientation' 'REG_DWORD' "0x00000001" "user"
|
||||||
|
get_and_set_reg_file --add 'Control Panel\Desktop' 'FontSmoothingType' 'REG_DWORD' "0x00000002" "user"
|
||||||
|
|
||||||
# добавление ассоциаций файлов для запуска нативного приложения из wine
|
# добавление ассоциаций файлов для запуска нативного приложения из wine
|
||||||
# пример переменной: WH_XDG_OPEN="txt doc pdf"
|
# пример переменной: WH_XDG_OPEN="txt doc pdf"
|
||||||
check_variables WH_XDG_OPEN "0"
|
check_variables WH_XDG_OPEN "0"
|
||||||
@@ -1230,38 +1291,70 @@ init_wineprefix () {
|
|||||||
|
|
||||||
# настраиваем префикс для работы с cpcsp_proxy
|
# настраиваем префикс для работы с cpcsp_proxy
|
||||||
if [[ $WH_USE_CPCSP_PROXY == "1" ]] ; then
|
if [[ $WH_USE_CPCSP_PROXY == "1" ]] ; then
|
||||||
for cpcsp_proxy_file in "cpcsp_proxy.dll" "cpcsp_proxy_setup.exe" ; do
|
|
||||||
try_copy_wine_dll_to_pfx_64 "$cpcsp_proxy_file"
|
local cades_ver="release_2_0_14892"
|
||||||
try_copy_wine_dll_to_pfx_32 "$cpcsp_proxy_file"
|
local url_cades_dll="https://cryptopro.ru/sites/default/files/products/cades/$cades_ver"
|
||||||
done
|
|
||||||
|
if [[ ! -d "$DRIVE_C/Program Files (x86)/Common Files/Crypto Pro/Shared/" ]]
|
||||||
|
then
|
||||||
|
local msi_cades32="cades-win32.msi"
|
||||||
|
try_download cloud "$url_cades_dll/$msi_cades32" "$WH_TMP_DIR/$msi_cades32"
|
||||||
|
print_info "Установка КриптоПро ЭЦП Runtime ($msi_cades32)"
|
||||||
|
WINEDLLOVERRIDES="msxml3=b" wine_run "$WH_TMP_DIR/$msi_cades32" /q
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$WINEARCH" == "win64" ]] \
|
||||||
|
&& [[ ! -d "$DRIVE_C/Program Files/Common Files/Crypto Pro/Shared" ]]
|
||||||
|
then
|
||||||
|
local msi_cades64="cades-x64.msi"
|
||||||
|
try_download cloud "$url_cades_dll/$msi_cades64" "$WH_TMP_DIR/$msi_cades64"
|
||||||
|
print_info "Установка КриптоПро ЭЦП Runtime ($msi_cades64)"
|
||||||
|
WINEDLLOVERRIDES="msxml3=b" wine_run "$WH_TMP_DIR/$msi_cades64" /q
|
||||||
|
fi
|
||||||
|
|
||||||
if ! grep -q "cpcsp_proxy.dll" "$WINEPREFIX/system.reg" ; then
|
if ! grep -q "cpcsp_proxy.dll" "$WINEPREFIX/system.reg" ; then
|
||||||
if [[ "$WINEARCH" == "win32" ]]
|
print_info "Запускаем настройку cpcsp_proxy..."
|
||||||
then cpcsp_proxy_cmd=("$WINELOADER" "cpcsp_proxy_setup.exe")
|
CPCSP_PROXY_OK="0"
|
||||||
else cpcsp_proxy_cmd=("${WINELOADER}64" "cpcsp_proxy_setup.exe")
|
|
||||||
|
try_copy_wine_dll_to_pfx_64 "cpcsp_proxy.dll"
|
||||||
|
try_copy_wine_dll_to_pfx_32 "cpcsp_proxy.dll"
|
||||||
|
|
||||||
|
if [[ $WH_WINE_WOW64 == "1" ]] ; then
|
||||||
|
env WINEDEBUG="fixme-all" "$WINE" "C:\\windows\\system32\\regsvr32.exe" \
|
||||||
|
/s /n /i cpcsp_proxy.dll 2>&1 | tee "$WINEPREFIX/cpcsp_setup.log"
|
||||||
|
|
||||||
|
env WINEDEBUG="fixme-all" "$WINE" "C:\\windows\\syswow64\\regsvr32.exe" \
|
||||||
|
/s /n /i cpcsp_proxy.dll 2>&1 | tee -a "$WINEPREFIX/cpcsp_setup.log"
|
||||||
|
else
|
||||||
|
try_copy_wine_dll_to_pfx_64 "cpcsp_proxy_setup.exe"
|
||||||
|
try_copy_wine_dll_to_pfx_32 "cpcsp_proxy_setup.exe"
|
||||||
|
|
||||||
|
if [[ "$WINEARCH" == "win32" ]]
|
||||||
|
then cpcsp_proxy_cmd=("$WINELOADER" "cpcsp_proxy_setup.exe")
|
||||||
|
else cpcsp_proxy_cmd=("${WINELOADER}64" "cpcsp_proxy_setup.exe")
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
for ((i=2; i < 6; i++)) ; do
|
||||||
|
"${cpcsp_proxy_cmd[@]}" | tee "$WINEPREFIX/cpcsp_setup.log"
|
||||||
|
[[ "${PIPESTATUS[0]}" == "0" ]] && break
|
||||||
|
print_warning "Попытка $i из 5..."
|
||||||
|
wait_wineserver
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
print_info "Запускаем настройку cpcsp_proxy..."
|
if grep -q "failed to load /opt/cprocsp/" "$WINEPREFIX/cpcsp_setup.log" ; then
|
||||||
unset CPCSP_PROXY_OK
|
print_error "Проверьте правильность установки КриптоПро в системе.\n Инструкция: https://www.altlinux.org/CryptoPro"
|
||||||
set -o pipefail
|
else
|
||||||
for ((i=2; i < 6; i++)) ; do
|
CPCSP_PROXY_OK="1"
|
||||||
"${cpcsp_proxy_cmd[@]}" | tee "$WINEPREFIX/cpcsp_setup.log"
|
fi
|
||||||
local CPCSP_EXIT_STATUS="${PIPESTATUS[0]}"
|
|
||||||
if grep -q "failed to load /opt/cprocsp/" "$WINEPREFIX/cpcsp_setup.log" ; then
|
|
||||||
fatal "Проверьте правильность установки КриптоПро в системе.\n Инструкция: https://www.altlinux.org/CryptoPro"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $CPCSP_EXIT_STATUS == "0" ]] ; then
|
|
||||||
print_info "Настройка cpcsp_proxy успешно завершена."
|
|
||||||
CPCSP_PROXY_OK="1"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
print_warning "Попытка $i из 5..."
|
|
||||||
wait_wineserver
|
|
||||||
done
|
|
||||||
wait_wineserver
|
|
||||||
try_remove_file "$WINEPREFIX/cpcsp_setup.log"
|
try_remove_file "$WINEPREFIX/cpcsp_setup.log"
|
||||||
[[ $CPCSP_PROXY_OK != "1" ]] && fatal "Ошибка во время настройки cpcsp_proxy."
|
|
||||||
|
wait_wineserver
|
||||||
|
if [[ $CPCSP_PROXY_OK == "1" ]]
|
||||||
|
then print_info "Настройка cpcsp_proxy успешно завершена."
|
||||||
|
else fatal "Ошибка во время настройки cpcsp_proxy."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1284,7 +1377,8 @@ init_wineprefix () {
|
|||||||
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
|
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
|
||||||
for var in WH_WINE_USE BASE_PFX WINEARCH WH_WINDOWS_VER WINEESYNC WINEFSYNC \
|
for var in WH_WINE_USE BASE_PFX WINEARCH WH_WINDOWS_VER WINEESYNC WINEFSYNC \
|
||||||
STAGING_SHARED_MEMORY WINE_LARGE_ADDRESS_AWARE WH_USE_SHADER_CACHE WH_USE_WINE_DXGI \
|
STAGING_SHARED_MEMORY WINE_LARGE_ADDRESS_AWARE WH_USE_SHADER_CACHE WH_USE_WINE_DXGI \
|
||||||
WINE_CPU_TOPOLOGY DXVK_VER VKD3D_VER WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE
|
WINE_CPU_TOPOLOGY DXVK_VER VKD3D_VER WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE \
|
||||||
|
WH_USE_CPCSP_PROXY
|
||||||
do
|
do
|
||||||
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
||||||
done
|
done
|
||||||
@@ -1345,23 +1439,25 @@ kill_wine () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init_database () {
|
init_database () {
|
||||||
WHDB_FILE="0"
|
local whdb_file="0"
|
||||||
if [[ -f "$WIN_FILE_EXEC" ]] ; then
|
if [[ -n "$WIN_FILE_EXEC" ]] \
|
||||||
|
&& [[ -f "$WIN_FILE_EXEC" ]]
|
||||||
|
then
|
||||||
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
|
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
|
||||||
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
|
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
|
||||||
WHDB_FILE="$WIN_FILE_EXEC".whdb
|
whdb_file="$WIN_FILE_EXEC".whdb
|
||||||
else
|
else
|
||||||
orig_IFS="$IFS" && IFS=$'\n'
|
orig_IFS="$IFS" && IFS=$'\n'
|
||||||
if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
|
if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
|
||||||
WHDB_FILE="$WH_FIND_DB_FILE"
|
whdb_file="$WH_FIND_DB_FILE"
|
||||||
fi
|
fi
|
||||||
IFS="$orig_IFS"
|
IFS="$orig_IFS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$WHDB_FILE" != "0" ]] ; then
|
if [[ "$whdb_file" != "0" ]] ; then
|
||||||
print_info "Используется файл настроек: $WHDB_FILE"
|
print_info "Используется файл настроек: $whdb_file"
|
||||||
. "$WHDB_FILE"
|
. "$whdb_file"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
||||||
@@ -1386,40 +1482,89 @@ prepair_wine () {
|
|||||||
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_run () {
|
wine_regfile () {
|
||||||
if [[ $WINEARCH == "win32" ]] \
|
print_info "Запускаем команду: $WINELOADER $@"
|
||||||
&& file "$WIN_FILE_EXEC" | grep -q "x86-64"
|
"$WINELOADER" "$@" && print_ok "Выполнено." || fatal "Не выполнено: $WINELOADER $@"
|
||||||
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")"
|
|
||||||
[[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH"
|
|
||||||
|
|
||||||
if [[ -n $LOG_FILE ]] && [[ -f "$LOG_FILE" ]] ; then
|
|
||||||
echo "##### Основные переменные #####" | tee -a "$LOG_FILE"
|
|
||||||
env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$LOG_FILE"
|
|
||||||
|
|
||||||
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
|
|
||||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
|
|
||||||
else
|
|
||||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
|
||||||
fi
|
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
|
|
||||||
|
if [[ "$WINEARCH" == "win64" ]] \
|
||||||
|
&& [[ -f "${WINELOADER}64" ]]
|
||||||
|
then
|
||||||
|
print_info "Запускаем команду: ${WINELOADER}64 $@"
|
||||||
|
"${WINELOADER}64" "$@" && print_ok "Выполнено." || fatal "Не выполнено: ${WINELOADER}64 $@"
|
||||||
|
wait_wineserver
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
wine_run () {
|
||||||
|
local wh_add_args win_file_exec win_file_path win_file_name
|
||||||
|
|
||||||
|
if [[ $1 =~ (winecfg|regedit|winefile|wineconsole) ]] ; then
|
||||||
|
win_file_exec="$1"
|
||||||
|
win_file_name="$win_file_exec"
|
||||||
|
win_file_path="$DRIVE_C"
|
||||||
|
wh_add_args=""
|
||||||
|
elif [[ $1 =~ \.dll$ ]] ; then
|
||||||
|
wine_regfile regsvr32 /s "$@"
|
||||||
|
return 0
|
||||||
|
elif [[ -f "$1" ]] ; then
|
||||||
|
win_file_exec="$(readlink -f "$1")"
|
||||||
|
win_file_path="$(dirname "$win_file_exec")"
|
||||||
|
win_file_name="$(basename "$win_file_exec")"
|
||||||
|
|
||||||
|
case "${win_file_name,,}" in
|
||||||
|
*.exe) wh_add_args="$WINE_WIN_START" ;;
|
||||||
|
*.msi) wh_add_args="msiexec /i" ;;
|
||||||
|
*.bat|*.cmd) wh_add_args="" ;;
|
||||||
|
*.reg) wine_regfile regedit "$@" ; return 0 ;;
|
||||||
|
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ $WINEARCH == "win32" ]] \
|
||||||
|
&& file "$win_file_exec" | grep -q "x86-64"
|
||||||
|
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
fatal "Команда введена не правильно или не найден исполняемый файл $1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
shift
|
||||||
|
cd "$win_file_path"
|
||||||
|
|
||||||
|
if [[ $WINEDEBUG != "-all" ]] ; then
|
||||||
|
local log_dir log_file
|
||||||
|
log_dir="$HOME/winehelper_backup_log"
|
||||||
|
log_file="$log_dir/${PREFIX_NAME}_${win_file_name%.*}.log"
|
||||||
|
create_new_dir "$log_dir"
|
||||||
|
date > "$log_file"
|
||||||
|
|
||||||
|
print_warning "Включен режим логирования работы WINE."
|
||||||
|
print_warning "Лог будет сохранен по пути: $log_file"
|
||||||
|
|
||||||
|
echo "##### Основные переменные #####" | tee -a "$log_file"
|
||||||
|
env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$log_file"
|
||||||
|
echo "##### Лог WINE #####" | tee -a "$log_file"
|
||||||
|
|
||||||
|
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$log_file"
|
||||||
|
else
|
||||||
|
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS
|
||||||
|
fi
|
||||||
|
|
||||||
|
wait_wineserver
|
||||||
|
cd "$DRIVE_C"
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_run_install () {
|
wine_run_install () {
|
||||||
print_info "Запускаем установку: $1."
|
print_info "Запускаем установку: $1."
|
||||||
if [[ "$INSTALL_MODE" == "manual" ]]
|
case "$WH_INSTALL_MODE" in
|
||||||
then print_warning "Рекомендуется не менять пути для установки приложения!"
|
"manual") print_warning "Рекомендуется не менять пути для установки приложения!" ;;
|
||||||
fi
|
"test") print_warning "Установка приложения из списка экспериментальных скриптов." ;;
|
||||||
[[ ! -f "$1" ]] && fatal "Нет файла для установки: $1"
|
|
||||||
case "${1,,}" in
|
|
||||||
*.exe) wine_run $WINE_WIN_START "$@" ;;
|
|
||||||
*.msi) wine_run msiexec /i "$@" ;;
|
|
||||||
*.bat|*.cmd) wine_run "$@" ;;
|
|
||||||
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
|
||||||
esac
|
esac
|
||||||
wait_wineserver
|
|
||||||
|
if [[ ! -f "$1" ]]
|
||||||
|
then fatal "Нет файла для установки: $1"
|
||||||
|
else wine_run "$@"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
run_autoinstall () {
|
run_autoinstall () {
|
||||||
@@ -1437,46 +1582,49 @@ run_autoinstall () {
|
|||||||
elif [[ -f "$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
elif [[ -f "$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
INSTALL_SCRIPT="$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
INSTALL_SCRIPT="$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
||||||
WH_INSTALL_MODE="manual"
|
WH_INSTALL_MODE="manual"
|
||||||
elif [[ -d "$WH_TESTINSTALL_DIR" ]] \
|
elif [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
&& [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]]
|
|
||||||
then
|
|
||||||
INSTALL_SCRIPT="$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
INSTALL_SCRIPT="$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
||||||
WH_INSTALL_MODE="test"
|
WH_INSTALL_MODE="test"
|
||||||
else
|
else
|
||||||
INSTALL_SCRIPT="0"
|
INSTALL_SCRIPT="0"
|
||||||
fi
|
fi
|
||||||
export INSTALL_SCRIPT INSTALL_MODE
|
export INSTALL_SCRIPT WH_INSTALL_MODE
|
||||||
|
|
||||||
if [[ $INSTALL_SCRIPT_NAME == "list" ]] || [[ -z "$INSTALL_SCRIPT_NAME" ]] ; then
|
if [[ $INSTALL_SCRIPT_NAME == "list" ]] || [[ -z "$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
|
|
||||||
list_install_scripts() {
|
print_install_list () {
|
||||||
local dir="$1"
|
parse_install_scripts() {
|
||||||
local title="$2"
|
local parse_dir="$1"
|
||||||
[[ ! -d "$dir" ]] || [[ -z "$(ls -A "$dir" 2>/dev/null)" ]] && return
|
[[ ! -d "$parse_dir" ]] || [[ -z "$(ls -A "$parse_dir" 2>/dev/null)" ]] && return
|
||||||
|
|
||||||
print_info "$title"
|
awk '
|
||||||
|
FNR==1 {
|
||||||
awk '
|
if (progname) {
|
||||||
FNR==1 {
|
printf "\n%s - %s\n%s\n", filename, progname, info
|
||||||
if (progname) {
|
}
|
||||||
printf "\n%s - %s\n%s\n", filename, progname, info
|
progname=""; info=""; filename=FILENAME
|
||||||
|
sub(".*/", "", filename)
|
||||||
}
|
}
|
||||||
progname=""; info=""; filename=FILENAME
|
/info_ru:/ { sub(/.*info_ru: /, ""); info=$0 }
|
||||||
sub(".*/", "", filename)
|
/PROG_NAME=/ { sub(/.*PROG_NAME=/, ""); progname=$0 }
|
||||||
}
|
END {
|
||||||
/info_ru:/ { sub(/.*info_ru: /, ""); info=$0 }
|
if (progname) {
|
||||||
/PROG_NAME=/ { sub(/.*PROG_NAME=/, ""); progname=$0 }
|
printf "\n%s - %s\n%s\n", filename, progname, info
|
||||||
END {
|
}
|
||||||
if (progname) {
|
|
||||||
printf "\n%s - %s\n%s\n", filename, progname, info
|
|
||||||
}
|
}
|
||||||
}
|
' "$parse_dir"/*
|
||||||
' "$dir"/*
|
echo
|
||||||
|
}
|
||||||
|
print_info "Список программ с возможностью автоматической установки:"
|
||||||
|
parse_install_scripts "$WH_AUTOINSTALL_DIR"
|
||||||
|
print_info "Список программ с возможностью установки из существующего дистрибутива:"
|
||||||
|
parse_install_scripts "$WH_MANUALINSTALL_DIR"
|
||||||
|
print_warning "Программы из списка экспериментальных скриптов:"
|
||||||
|
parse_install_scripts "$WH_TESTINSTALL_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
list_install_scripts "$WH_AUTOINSTALL_DIR" "Список программ с возможностью автоматической установки:"
|
print_install_list | less -R --use-color
|
||||||
echo
|
|
||||||
list_install_scripts "$WH_MANUALINSTALL_DIR" "Список программ с возможностью установки из существующего дистрибутива:"
|
|
||||||
elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then
|
elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then
|
||||||
if [[ $WH_USE_GUI == "1" ]] \
|
if [[ $WH_USE_GUI == "1" ]] \
|
||||||
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
||||||
@@ -1484,6 +1632,7 @@ run_autoinstall () {
|
|||||||
else print_license_agreement
|
else print_license_agreement
|
||||||
fi
|
fi
|
||||||
source "$INSTALL_SCRIPT" "$@"
|
source "$INSTALL_SCRIPT" "$@"
|
||||||
|
[[ -n $OUT_PAGE_TMP ]] && try_remove_file "$OUT_PAGE_TMP"
|
||||||
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
|
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
|
||||||
else
|
else
|
||||||
fatal "Скрипт автоматической установки для $INSTALL_SCRIPT_NAME не найден!"
|
fatal "Скрипт автоматической установки для $INSTALL_SCRIPT_NAME не найден!"
|
||||||
@@ -1773,6 +1922,7 @@ remove_winehelper () {
|
|||||||
echo " - Все настройки WineHelper"
|
echo " - Все настройки WineHelper"
|
||||||
echo " - Все приложения/программы, установленные через WineHelper"
|
echo " - Все приложения/программы, установленные через WineHelper"
|
||||||
echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper"
|
echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper"
|
||||||
|
echo " - Все резервные копии и логи, созданные WineHelper"
|
||||||
echo "======================================================"
|
echo "======================================================"
|
||||||
if print_confirmation "Продолжить?" ; then
|
if print_confirmation "Продолжить?" ; then
|
||||||
echo "----------------------------------------------"
|
echo "----------------------------------------------"
|
||||||
@@ -1788,6 +1938,7 @@ remove_winehelper () {
|
|||||||
|
|
||||||
# Удаление рабочих каталогов
|
# Удаление рабочих каталогов
|
||||||
try_remove_dir "$USER_WORK_PATH"
|
try_remove_dir "$USER_WORK_PATH"
|
||||||
|
try_remove_dir "$HOME/winehelper_backup_log"
|
||||||
|
|
||||||
# Удаление файлов меню
|
# Удаление файлов меню
|
||||||
try_remove_dir "$WH_MENU_DIR"
|
try_remove_dir "$WH_MENU_DIR"
|
||||||
@@ -1820,13 +1971,16 @@ create_base_pfx () {
|
|||||||
users_dir="$drive_c_dir/users"
|
users_dir="$drive_c_dir/users"
|
||||||
archive_path="$WH_TMP_DIR/pfx/new_${PREFIX_NAME}.tar.xz"
|
archive_path="$WH_TMP_DIR/pfx/new_${PREFIX_NAME}.tar.xz"
|
||||||
|
|
||||||
|
# создаем резернвую копию каталога с префиксом
|
||||||
try_copy_dir "$prefix_dir" "${prefix_dir}_bak"
|
try_copy_dir "$prefix_dir" "${prefix_dir}_bak"
|
||||||
create_new_dir "$WH_TMP_DIR/pfx/"
|
create_new_dir "$WH_TMP_DIR/pfx/"
|
||||||
|
|
||||||
|
# удаляем лишнюю информацию из winetricks.log
|
||||||
for wtlog in workaround isolate internal winxp win2 win7 win10
|
for wtlog in workaround isolate internal winxp win2 win7 win10
|
||||||
do sed -i "/$wtlog/d" "$prefix_dir/winetricks.log"
|
do sed -i "/$wtlog/d" "$prefix_dir/winetricks.log"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# переносим пользовательский каталог в общий для всех "xuser"
|
||||||
if [[ -d "$users_dir/$USER" ]] \
|
if [[ -d "$users_dir/$USER" ]] \
|
||||||
&& [[ ! -L "$users_dir/$USER" ]]
|
&& [[ ! -L "$users_dir/$USER" ]]
|
||||||
then
|
then
|
||||||
@@ -1837,6 +1991,7 @@ create_base_pfx () {
|
|||||||
cp -fr "$users_dir/$USER"/* "$users_dir/xuser/"
|
cp -fr "$users_dir/$USER"/* "$users_dir/xuser/"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# удаляем всё ненужное для переноса префикса
|
||||||
try_remove_file "$prefix_dir/.update-timestamp"
|
try_remove_file "$prefix_dir/.update-timestamp"
|
||||||
try_remove_file "$prefix_dir/.firstboot"
|
try_remove_file "$prefix_dir/.firstboot"
|
||||||
try_remove_file "$prefix_dir/last.conf"
|
try_remove_file "$prefix_dir/last.conf"
|
||||||
@@ -1847,9 +2002,14 @@ create_base_pfx () {
|
|||||||
try_remove_dir "$drive_c_dir/windows/temp/"
|
try_remove_dir "$drive_c_dir/windows/temp/"
|
||||||
try_remove_dir "$drive_c_dir/windows/Installer/"
|
try_remove_dir "$drive_c_dir/windows/Installer/"
|
||||||
|
|
||||||
|
# удаляем кэш установщика .net
|
||||||
rm -fr "$drive_c_dir/windows/Microsoft.NET"/*/*/SetupCache/
|
rm -fr "$drive_c_dir/windows/Microsoft.NET"/*/*/SetupCache/
|
||||||
|
|
||||||
|
# удаляем все симлинки внутри каталога windows
|
||||||
|
find "$drive_c_dir/windows/" -type l -delete
|
||||||
|
|
||||||
cd "$prefix_dir"
|
cd "$prefix_dir"
|
||||||
|
# запускаем сжатие префикса
|
||||||
if tar --no-xattrs -c -I 'xz --memlimit=8000MiB -9 -T0' -f "$archive_path" ./* ; then
|
if tar --no-xattrs -c -I 'xz --memlimit=8000MiB -9 -T0' -f "$archive_path" ./* ; then
|
||||||
print_ok "Архив создан по пути: $archive_path"
|
print_ok "Архив создан по пути: $archive_path"
|
||||||
xdg-open "$(dirname "$archive_path")" &
|
xdg-open "$(dirname "$archive_path")" &
|
||||||
@@ -1866,7 +2026,8 @@ backup_prefix() {
|
|||||||
check_prefix_var
|
check_prefix_var
|
||||||
|
|
||||||
local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir
|
local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir
|
||||||
backup_base_dir="$(xdg-user-dir DESKTOP)"
|
backup_base_dir="$HOME/winehelper_backup_log"
|
||||||
|
create_new_dir "$backup_base_dir"
|
||||||
backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack"
|
backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack"
|
||||||
backup_dest_path="$backup_base_dir/$backup_archive_name"
|
backup_dest_path="$backup_base_dir/$backup_archive_name"
|
||||||
temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)"
|
temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)"
|
||||||
@@ -2145,20 +2306,21 @@ select_component_version() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
run_install_to_prefix() {
|
run_install_to_prefix() {
|
||||||
export WINEPREFIX="$1"
|
if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ ! -f "$2" ]] ; then
|
||||||
local WIN_FILE_EXEC="$2"
|
|
||||||
|
|
||||||
if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then
|
|
||||||
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
|
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export WINEPREFIX="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
prepair_wine
|
prepair_wine
|
||||||
wine_run_install "$WIN_FILE_EXEC"
|
wine_run "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
run_install_dxvk() {
|
run_install_dxvk() {
|
||||||
local version="$1"
|
local version="$1"
|
||||||
|
|
||||||
if [[ -z "$version" ]] ; then
|
if [[ -z "$version" ]] ; then
|
||||||
version=$(select_component_version "DXVK")
|
version=$(select_component_version "DXVK")
|
||||||
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
|
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
|
||||||
@@ -2166,21 +2328,27 @@ run_install_dxvk() {
|
|||||||
list_component_versions "DXVK"
|
list_component_versions "DXVK"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
init_database
|
init_database
|
||||||
|
|
||||||
export DXVK_VER="$version"
|
export DXVK_VER="$version"
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
if [[ "$DXVK_VER" == "none" ]]
|
if [[ "$DXVK_VER" == "none" ]]
|
||||||
then print_info "Удаление DXVK..."
|
then print_info "Удаление DXVK..."
|
||||||
else print_info "Установка DXVK: $DXVK_VER"
|
else print_info "Установка DXVK: $DXVK_VER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
init_dxvk "$DXVK_VER"
|
init_dxvk "$DXVK_VER"
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
}
|
}
|
||||||
|
|
||||||
run_install_vkd3d() {
|
run_install_vkd3d() {
|
||||||
local version="$1"
|
local version="$1"
|
||||||
|
|
||||||
if [[ -z "$version" ]] ; then
|
if [[ -z "$version" ]] ; then
|
||||||
version=$(select_component_version "VKD3D")
|
version=$(select_component_version "VKD3D")
|
||||||
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
|
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
|
||||||
@@ -2188,15 +2356,20 @@ run_install_vkd3d() {
|
|||||||
list_component_versions "VKD3D"
|
list_component_versions "VKD3D"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
init_database
|
init_database
|
||||||
|
|
||||||
export VKD3D_VER="$version"
|
export VKD3D_VER="$version"
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
if [[ "$VKD3D_VER" == "none" ]]
|
if [[ "$VKD3D_VER" == "none" ]]
|
||||||
then print_info "Удаление VKD3D..."
|
then print_info "Удаление VKD3D..."
|
||||||
else print_info "Установка VKD3D: $VKD3D_VER"
|
else print_info "Установка VKD3D: $VKD3D_VER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
init_vkd3d "$VKD3D_VER"
|
init_vkd3d "$VKD3D_VER"
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
}
|
}
|
||||||
@@ -2215,13 +2388,35 @@ run_change_wine_version() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
|
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
|
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_winetricks_cache() {
|
||||||
|
local winetricks_cache_dir="$HOME/.cache/winetricks"
|
||||||
|
local winehelper_wt_cache_dir="$HOME/.cache/winehelper/winetricks"
|
||||||
|
|
||||||
|
if [[ ! -d "$winetricks_cache_dir" ]] && [[ ! -d "$winehelper_wt_cache_dir" ]]; then
|
||||||
|
print_info "Кэш Winetricks не найден. Очистка не требуется."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! $1 =~ --force|-y ]] ; then
|
||||||
|
print_warning "Вы собираетесь очистить кэш Winetricks."
|
||||||
|
echo "Будут удалены все скачанные установщики Winetricks и списки компонентов."
|
||||||
|
if ! print_confirmation "Продолжить?"
|
||||||
|
then
|
||||||
|
print_info "Операция отменена."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
print_info "Очистка кэша Winetricks..."
|
||||||
|
try_remove_dir "$winetricks_cache_dir"
|
||||||
|
try_remove_dir "$winehelper_wt_cache_dir"
|
||||||
|
print_ok "Кэш Winetricks успешно очищен."
|
||||||
|
}
|
||||||
|
|
||||||
wh_info () {
|
wh_info () {
|
||||||
echo "Использование: $SCRIPT_NAME [команда]
|
echo "Использование: $SCRIPT_NAME [команда]
|
||||||
|
|
||||||
@@ -2241,6 +2436,7 @@ wh_info () {
|
|||||||
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
||||||
backup-prefix [имя_префикса] создать резервную копию префикса
|
backup-prefix [имя_префикса] создать резервную копию префикса
|
||||||
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
|
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
|
||||||
|
clear-winetricks-cache очистить кэш Winetricks
|
||||||
|
|
||||||
Параметры:
|
Параметры:
|
||||||
--help показать эту справку и выйти
|
--help показать эту справку и выйти
|
||||||
@@ -2257,7 +2453,8 @@ create_new_dir "$WH_DIST_DIR"
|
|||||||
create_new_dir "$WH_PREFIXES_DIR"
|
create_new_dir "$WH_PREFIXES_DIR"
|
||||||
create_new_dir "$WH_VULKAN_LIBDIR"
|
create_new_dir "$WH_VULKAN_LIBDIR"
|
||||||
|
|
||||||
if [[ -d "$HOME/.local/share/$SCRIPT_NAME" ]] \
|
if [[ $WH_DEVEL != "1" ]] \
|
||||||
|
&& [[ -d "$HOME/.local/share/$SCRIPT_NAME" ]] \
|
||||||
&& [[ ! -L "$HOME/.winehelper" ]]
|
&& [[ ! -L "$HOME/.winehelper" ]]
|
||||||
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
|
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
|
||||||
fi
|
fi
|
||||||
@@ -2298,17 +2495,20 @@ case "$arg1" in
|
|||||||
remove-prefix) remove_prefix "$@" ;;
|
remove-prefix) remove_prefix "$@" ;;
|
||||||
create-base-pfx) create_base_pfx "$@" ;;
|
create-base-pfx) create_base_pfx "$@" ;;
|
||||||
init-prefix) prepair_wine ; wait_wineserver ;;
|
init-prefix) prepair_wine ; wait_wineserver ;;
|
||||||
|
clear-winetricks-cache) clear_winetricks_cache "$@" ;;
|
||||||
*)
|
*)
|
||||||
if [[ -f "$arg1" ]] ; then
|
if [[ -f "$arg1" ]] ; then
|
||||||
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
||||||
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
||||||
find_prefix "$WIN_FILE_EXEC"
|
find_prefix "$WIN_FILE_EXEC"
|
||||||
case "${WIN_FILE_NAME,,}" in
|
prepair_wine
|
||||||
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;
|
|
||||||
*.msi) prepair_wine ; wine_run msiexec /i "$WIN_FILE_EXEC" "$@" ;;
|
if [[ -n "$1" ]] && [[ -f "$1" ]] ; then
|
||||||
*.bat|*.cmd) prepair_wine ; wine_run start "$WIN_FILE_EXEC" "$@" ;;
|
WIN_OPEN_FILE="$("$WINELOADER" winepath -w "$1")"
|
||||||
*) fatal "Тип файла не поддерживается." ;;
|
shift
|
||||||
esac
|
fi
|
||||||
|
|
||||||
|
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
|
||||||
else
|
else
|
||||||
print_error "Команды $arg1 не существует."
|
print_error "Команды $arg1 не существует."
|
||||||
wh_info
|
wh_info
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ from functools import partial
|
|||||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
||||||
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
||||||
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
||||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
|
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal, QRect
|
||||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor
|
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor, QTextCharFormat, QColor, QPalette
|
||||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
|
||||||
|
|
||||||
@@ -26,9 +26,12 @@ class Var:
|
|||||||
DATA_PATH = os.environ.get("DATA_PATH")
|
DATA_PATH = os.environ.get("DATA_PATH")
|
||||||
CHANGELOG_FILE = os.environ.get("CHANGELOG_FILE")
|
CHANGELOG_FILE = os.environ.get("CHANGELOG_FILE")
|
||||||
WH_ICON_PATH = os.environ.get("WH_ICON_PATH")
|
WH_ICON_PATH = os.environ.get("WH_ICON_PATH")
|
||||||
|
WH_ICON_TRAY = os.environ.get("WH_ICON_TRAY")
|
||||||
LICENSE_FILE = os.environ.get("LICENSE_FILE")
|
LICENSE_FILE = os.environ.get("LICENSE_FILE")
|
||||||
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
|
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
|
||||||
THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE")
|
THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE")
|
||||||
|
GENERAL = os.environ.get("GENERAL")
|
||||||
|
WH_WINETRICKS = os.environ.get("WH_WINETRICKS")
|
||||||
|
|
||||||
class DependencyManager:
|
class DependencyManager:
|
||||||
"""Класс для управления проверкой и установкой системных зависимостей."""
|
"""Класс для управления проверкой и установкой системных зависимостей."""
|
||||||
@@ -428,6 +431,8 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
"Для переустановки компонента: Выделите его в списке и нажмите кнопку «Переустановить»."
|
"Для переустановки компонента: Выделите его в списке и нажмите кнопку «Переустановить»."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
installation_complete = pyqtSignal()
|
||||||
|
|
||||||
def __init__(self, prefix_path, winetricks_path, parent=None, wine_executable=None):
|
def __init__(self, prefix_path, winetricks_path, parent=None, wine_executable=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.prefix_path = prefix_path
|
self.prefix_path = prefix_path
|
||||||
@@ -442,6 +447,7 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
self.previous_tab_widget = None
|
self.previous_tab_widget = None
|
||||||
self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "winehelper", "winetricks")
|
self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "winehelper", "winetricks")
|
||||||
os.makedirs(self.cache_dir, exist_ok=True)
|
os.makedirs(self.cache_dir, exist_ok=True)
|
||||||
|
self.is_reloading_after_cache_clear = False
|
||||||
|
|
||||||
self.setWindowTitle(f"Менеджер компонентов для префикса: {os.path.basename(prefix_path)}")
|
self.setWindowTitle(f"Менеджер компонентов для префикса: {os.path.basename(prefix_path)}")
|
||||||
self.setMinimumSize(800, 500)
|
self.setMinimumSize(800, 500)
|
||||||
@@ -474,8 +480,14 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
self.log_output.setText(self.INFO_TEXT)
|
self.log_output.setText(self.INFO_TEXT)
|
||||||
main_layout.addWidget(self.log_output)
|
main_layout.addWidget(self.log_output)
|
||||||
|
|
||||||
# Кнопки управления, выровненные по правому краю
|
# Кнопки управления
|
||||||
button_layout = QHBoxLayout()
|
button_layout = QHBoxLayout()
|
||||||
|
|
||||||
|
self.clear_cache_button = QPushButton("Очистить кеш")
|
||||||
|
self.clear_cache_button.setStyleSheet("background-color: red; color: white;")
|
||||||
|
self.clear_cache_button.clicked.connect(self.clear_winetricks_cache)
|
||||||
|
button_layout.addWidget(self.clear_cache_button)
|
||||||
|
|
||||||
button_layout.addStretch(1)
|
button_layout.addStretch(1)
|
||||||
|
|
||||||
self.apply_button = QPushButton("Применить")
|
self.apply_button = QPushButton("Применить")
|
||||||
@@ -617,12 +629,33 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---")
|
self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---")
|
||||||
return installed_verbs
|
return installed_verbs
|
||||||
|
|
||||||
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget):
|
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget, category):
|
||||||
"""Парсит вывод 'winetricks list' и заполняет QListWidget."""
|
"""Парсит вывод 'winetricks list' и заполняет QListWidget."""
|
||||||
# Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него.
|
# Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него.
|
||||||
# 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]').
|
# 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]').
|
||||||
# 2. `([^\s]+)` - имя компонента (без пробелов).
|
# 2. `([^\s]+)` - имя компонента (без пробелов).
|
||||||
# 3. `(.*)` - оставшаяся часть строки (описание).
|
# 3. `(.*)` - оставшаяся часть строки (описание).
|
||||||
|
|
||||||
|
# Определяем шаблоны для фильтрации на основе категории
|
||||||
|
dlls_blacklist_pattern = None
|
||||||
|
fonts_blacklist_pattern = None
|
||||||
|
settings_blacklist_pattern = None
|
||||||
|
|
||||||
|
if category == 'dlls':
|
||||||
|
# Исключаем d3d*, directx9, dont_use, dxvk*, vkd3d*, galliumnine, faudio*, Foundation
|
||||||
|
dlls_blacklist_pattern = re.compile(
|
||||||
|
r'^(d3d|directx9|dont_use|dxvk|vkd3d|galliumnine|faudio|foundation)', re.IGNORECASE
|
||||||
|
)
|
||||||
|
elif category == 'fonts':
|
||||||
|
fonts_blacklist_pattern = re.compile(
|
||||||
|
r'^(dont_use)', re.IGNORECASE
|
||||||
|
)
|
||||||
|
elif category == 'settings':
|
||||||
|
# Исключаем vista*, alldlls, autostart_*, bad*, good*, win*, videomemory*, vd=*, isolate_home
|
||||||
|
settings_blacklist_pattern = re.compile(
|
||||||
|
r'^(vista|alldlls|autostart_|bad|good|win|videomemory|vd=|isolate_home)', re.IGNORECASE
|
||||||
|
)
|
||||||
|
|
||||||
line_re = re.compile(r"^\s*(?:\[(.)]\s+)?([^\s]+)\s*(.*)")
|
line_re = re.compile(r"^\s*(?:\[(.)]\s+)?([^\s]+)\s*(.*)")
|
||||||
found_items = False
|
found_items = False
|
||||||
|
|
||||||
@@ -643,6 +676,14 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
if '/' in name or '\\' in name or name.lower() in ('executing', 'using', 'warning:') or name.endswith(':'):
|
if '/' in name or '\\' in name or name.lower() in ('executing', 'using', 'warning:') or name.endswith(':'):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Применяем фильтры для черных списков
|
||||||
|
if dlls_blacklist_pattern and dlls_blacklist_pattern.search(name):
|
||||||
|
continue
|
||||||
|
if fonts_blacklist_pattern and fonts_blacklist_pattern.search(name):
|
||||||
|
continue
|
||||||
|
if settings_blacklist_pattern and settings_blacklist_pattern.search(name):
|
||||||
|
continue
|
||||||
|
|
||||||
is_checked = name in installed_verbs
|
is_checked = name in installed_verbs
|
||||||
item_text = f"{name.ljust(27)}{description.strip()}"
|
item_text = f"{name.ljust(27)}{description.strip()}"
|
||||||
item = QListWidgetItem(item_text)
|
item = QListWidgetItem(item_text)
|
||||||
@@ -681,7 +722,7 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
self._log("--------------------------------------------------", "red")
|
self._log("--------------------------------------------------", "red")
|
||||||
else:
|
else:
|
||||||
installed_verbs = self._parse_winetricks_log()
|
installed_verbs = self._parse_winetricks_log()
|
||||||
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget)
|
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget, category)
|
||||||
|
|
||||||
if from_cache is None: # Только если мы не читали из кэша
|
if from_cache is None: # Только если мы не читали из кэша
|
||||||
# Сохраняем успешный результат в кэш
|
# Сохраняем успешный результат в кэш
|
||||||
@@ -703,9 +744,18 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
self._log(output)
|
self._log(output)
|
||||||
self._log("--------------------------------------------------")
|
self._log("--------------------------------------------------")
|
||||||
|
|
||||||
|
# Проверяем, были ли ошибки во время загрузки какой-либо из категорий
|
||||||
|
has_errors = any(status == 'error' for status in self.category_statuses.values())
|
||||||
|
|
||||||
self.loading_count -= 1
|
self.loading_count -= 1
|
||||||
if self.loading_count == 0:
|
if self.loading_count == 0:
|
||||||
self._update_ui_state()
|
self._update_ui_state()
|
||||||
|
if self.is_reloading_after_cache_clear:
|
||||||
|
if has_errors:
|
||||||
|
self._log("\n=== Ошибка при обновлении списков. Проверьте лог выше. ===", "red")
|
||||||
|
else:
|
||||||
|
self._log("\n=== Списки успешно обновлены ===")
|
||||||
|
self.is_reloading_after_cache_clear = False # Сбрасываем флаг
|
||||||
|
|
||||||
def _on_item_changed(self, item):
|
def _on_item_changed(self, item):
|
||||||
"""Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных."""
|
"""Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных."""
|
||||||
@@ -839,6 +889,9 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
"Подробности смотрите в логе.",
|
"Подробности смотрите в логе.",
|
||||||
QMessageBox.Warning,
|
QMessageBox.Warning,
|
||||||
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
||||||
|
# Сбрасываем формат символов к значению по умолчанию.
|
||||||
|
# Это гарантирует, что следующий вызов append() не унаследует красный цвет.
|
||||||
|
self.log_output.setCurrentCharFormat(QTextCharFormat())
|
||||||
self.apply_button.setEnabled(True)
|
self.apply_button.setEnabled(True)
|
||||||
self.close_button.setEnabled(True)
|
self.close_button.setEnabled(True)
|
||||||
return
|
return
|
||||||
@@ -856,8 +909,67 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
# Перезагружаем данные, чтобы обновить состояние
|
# Перезагружаем данные, чтобы обновить состояние
|
||||||
self.initial_states.clear()
|
self.initial_states.clear()
|
||||||
self.load_all_categories()
|
self.load_all_categories()
|
||||||
|
self.installation_complete.emit()
|
||||||
self.installation_finished = True
|
self.installation_finished = True
|
||||||
|
|
||||||
|
def clear_winetricks_cache(self):
|
||||||
|
"""Запускает очистку кэша Winetricks."""
|
||||||
|
reply = self._show_message_box(
|
||||||
|
"Очистка кэша Winetricks",
|
||||||
|
"Вы собираетесь удалить все скачанные установщики и списки компонентов Winetricks.\n\n"
|
||||||
|
"Это действие может потребоваться, если у вас возникают проблемы со скачиванием или установкой компонентов.\n\n"
|
||||||
|
"Продолжить?",
|
||||||
|
QMessageBox.Question,
|
||||||
|
{"buttons": {"Да": QMessageBox.YesRole, "Нет": QMessageBox.NoRole}, "default": "Нет"}
|
||||||
|
)
|
||||||
|
|
||||||
|
if reply != "Да":
|
||||||
|
return
|
||||||
|
|
||||||
|
# Блокируем UI на время выполнения
|
||||||
|
self.tabs.setEnabled(False)
|
||||||
|
self.clear_cache_button.setEnabled(False)
|
||||||
|
self.apply_button.setEnabled(False)
|
||||||
|
self.reinstall_button.setEnabled(False)
|
||||||
|
self.close_button.setEnabled(False)
|
||||||
|
|
||||||
|
self.log_output.clear()
|
||||||
|
|
||||||
|
self.cache_clear_process = QProcess(self)
|
||||||
|
self.cache_clear_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||||
|
|
||||||
|
def handle_output():
|
||||||
|
output = self.cache_clear_process.readAll().data().decode('utf-8', 'ignore').strip()
|
||||||
|
if output:
|
||||||
|
self._log(output)
|
||||||
|
|
||||||
|
def handle_finish(exit_code, exit_status):
|
||||||
|
if exit_code == 0:
|
||||||
|
self.is_reloading_after_cache_clear = True # Устанавливаем флаг перед перезагрузкой
|
||||||
|
self.category_statuses.clear() # Очищаем статусы перед новой загрузкой
|
||||||
|
# Воссоздаем директорию кэша, так как скрипт ее полностью удалил
|
||||||
|
os.makedirs(self.cache_dir, exist_ok=True)
|
||||||
|
self._log("Обновление списков...")
|
||||||
|
self.initial_states.clear()
|
||||||
|
self.load_all_categories()
|
||||||
|
else:
|
||||||
|
self._log(f"\n=== Ошибка (код: {exit_code}) ===", "red")
|
||||||
|
|
||||||
|
# Восстанавливаем UI
|
||||||
|
self.tabs.setEnabled(True)
|
||||||
|
self.clear_cache_button.setEnabled(True)
|
||||||
|
self.close_button.setEnabled(True)
|
||||||
|
self._update_ui_state() # Обновляем состояние кнопок Применить/Переустановить
|
||||||
|
|
||||||
|
self.cache_clear_process.readyRead.connect(handle_output)
|
||||||
|
self.cache_clear_process.finished.connect(handle_finish)
|
||||||
|
|
||||||
|
winehelper_path = self.parent().winehelper_path if hasattr(self.parent(), 'winehelper_path') else Var.RUN_SCRIPT
|
||||||
|
args = ["clear-winetricks-cache", "--force"]
|
||||||
|
|
||||||
|
self._log(f"Выполнение: {shlex.quote(winehelper_path)} {' '.join(args)}\n")
|
||||||
|
self.cache_clear_process.start(winehelper_path, args)
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
"""Обрабатывает закрытие окна, чтобы предотвратить выход во время установки."""
|
"""Обрабатывает закрытие окна, чтобы предотвратить выход во время установки."""
|
||||||
# Проверяем, запущен ли процесс установки/переустановки
|
# Проверяем, запущен ли процесс установки/переустановки
|
||||||
@@ -901,6 +1013,8 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
"""Добавляет сообщение в лог с возможностью указания цвета."""
|
"""Добавляет сообщение в лог с возможностью указания цвета."""
|
||||||
if color:
|
if color:
|
||||||
self.log_output.append(f'<span style="color:{color};">{message}</span>')
|
self.log_output.append(f'<span style="color:{color};">{message}</span>')
|
||||||
|
# Сбрасываем формат, чтобы следующий текст не наследовал цвет
|
||||||
|
self.log_output.setCurrentCharFormat(QTextCharFormat())
|
||||||
else:
|
else:
|
||||||
self.log_output.append(message)
|
self.log_output.append(message)
|
||||||
self.log_output.moveCursor(QTextCursor.End)
|
self.log_output.moveCursor(QTextCursor.End)
|
||||||
@@ -1590,10 +1704,34 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"padding-left: 10px;", "padding-left: 15px;"
|
"padding-left: 10px;", "padding-left: 15px;"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Стиль для кнопок тестовых программ
|
||||||
|
self.TEST_BUTTON_LIST_STYLE = """
|
||||||
|
QPushButton {
|
||||||
|
background-color: #ffdc64; /* Более темный желтый фон */
|
||||||
|
color: black; /* Черный цвет текста для контраста */
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
height: 42px; min-height: 42px; max-height: 42px;
|
||||||
|
}
|
||||||
|
QPushButton::icon { padding-left: 10px; }
|
||||||
|
"""
|
||||||
|
|
||||||
# Стили для оберток кнопок (для рамки выделения)
|
# Стили для оберток кнопок (для рамки выделения)
|
||||||
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
||||||
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
||||||
|
|
||||||
|
# Стили для кнопок Запустить/Остановить
|
||||||
|
self.RUN_BUTTON_STYLE = """
|
||||||
|
QPushButton {
|
||||||
|
background-color: #4CAF50; color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
self.STOP_BUTTON_STYLE = """
|
||||||
|
QPushButton { background-color: #d32f2f; color: white; font-weight: bold; }
|
||||||
|
"""
|
||||||
|
|
||||||
# Основные переменные
|
# Основные переменные
|
||||||
self.winehelper_path = Var.RUN_SCRIPT
|
self.winehelper_path = Var.RUN_SCRIPT
|
||||||
self.process = None
|
self.process = None
|
||||||
@@ -1636,8 +1774,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.main_layout.addLayout(content_layout)
|
self.main_layout.addLayout(content_layout)
|
||||||
|
|
||||||
# Фиксируем минимальные размеры
|
# Фиксируем минимальные размеры
|
||||||
self.stacked_widget.setMinimumWidth(520)
|
self.stacked_widget.setMinimumWidth(535)
|
||||||
self.info_panel.setMinimumWidth(415)
|
self.info_panel.setMinimumWidth(395)
|
||||||
|
|
||||||
# Вкладки
|
# Вкладки
|
||||||
self.create_auto_install_tab()
|
self.create_auto_install_tab()
|
||||||
@@ -1678,6 +1816,18 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.raise_()
|
self.raise_()
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
|
|
||||||
|
def create_colorized_icon(self, icon_path, color):
|
||||||
|
"""Загружает иконку (SVG) и применяет к ней указанный цвет."""
|
||||||
|
target_pixmap = QPixmap(icon_path)
|
||||||
|
if target_pixmap.isNull():
|
||||||
|
return QIcon()
|
||||||
|
|
||||||
|
painter = QPainter(target_pixmap)
|
||||||
|
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
|
||||||
|
painter.fillRect(target_pixmap.rect(), QColor(color))
|
||||||
|
painter.end()
|
||||||
|
return QIcon(target_pixmap)
|
||||||
|
|
||||||
def create_tray_icon(self):
|
def create_tray_icon(self):
|
||||||
"""Создает и настраивает иконку в системном трее."""
|
"""Создает и настраивает иконку в системном трее."""
|
||||||
if not QSystemTrayIcon.isSystemTrayAvailable():
|
if not QSystemTrayIcon.isSystemTrayAvailable():
|
||||||
@@ -1686,11 +1836,23 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
self.tray_icon = QSystemTrayIcon(self)
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
|
|
||||||
icon_path = Var.WH_ICON_PATH
|
# --- Определение цвета иконки в зависимости от темы ---
|
||||||
if icon_path and os.path.exists(icon_path):
|
if Var.WH_ICON_TRAY and os.path.exists(Var.WH_ICON_TRAY):
|
||||||
pixmap = QPixmap(icon_path)
|
# Получаем цвет текста окна из палитры приложения.
|
||||||
if not pixmap.isNull():
|
# Это хороший индикатор для определения контрастного цвета.
|
||||||
self.tray_icon.setIcon(QIcon(pixmap))
|
window_text_color = self.palette().color(QPalette.WindowText)
|
||||||
|
|
||||||
|
# Если цвет текста светлый (высокая яркость), значит, тема темная.
|
||||||
|
# И наоборот: если цвет текста темный, тема светлая.
|
||||||
|
# Яркость > 127 обычно указывает на светлый цвет.
|
||||||
|
is_dark_theme = window_text_color.lightness() > 127
|
||||||
|
|
||||||
|
if is_dark_theme:
|
||||||
|
# Для темных тем используем белую иконку
|
||||||
|
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.white))
|
||||||
|
else:
|
||||||
|
# Для светлых тем используем черную иконку
|
||||||
|
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.black))
|
||||||
|
|
||||||
# Создаем и сохраняем меню как атрибут класса, чтобы оно не удалялось
|
# Создаем и сохраняем меню как атрибут класса, чтобы оно не удалялось
|
||||||
self.tray_menu = QMenu(self)
|
self.tray_menu = QMenu(self)
|
||||||
@@ -1732,8 +1894,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if tab_name == "Автоматическая установка":
|
if tab_name == "Автоматическая установка":
|
||||||
title = "Автоматическая установка"
|
title = "Автоматическая установка"
|
||||||
html_content = ("<h3>Автоматическая установка</h3>"
|
html_content = ("<h3>Автоматическая установка</h3>"
|
||||||
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас.</p>"
|
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас. Просто выберите программу и нажмите «Установить».</p>"
|
||||||
"<p>Просто выберите программу и нажмите «Установить».</p>")
|
"<p>Для доступа к экспериментальным скриптам установки отметьте опцию <b>«Показать тестовые версии»</b> внизу списка.</p>")
|
||||||
show_global = False
|
show_global = False
|
||||||
elif tab_name == "Ручная установка":
|
elif tab_name == "Ручная установка":
|
||||||
title = "Ручная установка"
|
title = "Ручная установка"
|
||||||
@@ -1762,6 +1924,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if show_global:
|
if show_global:
|
||||||
self.backup_button.setVisible(False)
|
self.backup_button.setVisible(False)
|
||||||
self.create_log_button.setVisible(False)
|
self.create_log_button.setVisible(False)
|
||||||
|
self.open_log_dir_button.setVisible(False)
|
||||||
self.uninstall_button.setVisible(False)
|
self.uninstall_button.setVisible(False)
|
||||||
self.current_selected_app = None
|
self.current_selected_app = None
|
||||||
|
|
||||||
@@ -1856,6 +2019,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
# --- Верхний ряд кнопок ---
|
# --- Верхний ряд кнопок ---
|
||||||
top_buttons_layout = QHBoxLayout()
|
top_buttons_layout = QHBoxLayout()
|
||||||
self.run_button = QPushButton("Запустить")
|
self.run_button = QPushButton("Запустить")
|
||||||
|
self.run_button.setStyleSheet(self.RUN_BUTTON_STYLE)
|
||||||
self.run_button.clicked.connect(self.toggle_run_stop_app)
|
self.run_button.clicked.connect(self.toggle_run_stop_app)
|
||||||
top_buttons_layout.addWidget(self.run_button)
|
top_buttons_layout.addWidget(self.run_button)
|
||||||
installed_action_layout.addLayout(top_buttons_layout)
|
installed_action_layout.addLayout(top_buttons_layout)
|
||||||
@@ -1877,6 +2041,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.backup_button.clicked.connect(self.backup_prefix_for_app)
|
self.backup_button.clicked.connect(self.backup_prefix_for_app)
|
||||||
installed_global_layout.addWidget(self.backup_button)
|
installed_global_layout.addWidget(self.backup_button)
|
||||||
|
|
||||||
|
self.open_log_dir_button = QPushButton("Открыть папку с логом/резервной копией префикса")
|
||||||
|
self.open_log_dir_button.setIcon(QIcon.fromTheme("folder-open"))
|
||||||
|
self.open_log_dir_button.clicked.connect(self.open_log_directory)
|
||||||
|
self.open_log_dir_button.setVisible(False) # Скрыта по умолчанию
|
||||||
|
installed_global_layout.addWidget(self.open_log_dir_button)
|
||||||
|
|
||||||
self.uninstall_button = QPushButton("Удалить префикс")
|
self.uninstall_button = QPushButton("Удалить префикс")
|
||||||
self.uninstall_button.setIcon(QIcon.fromTheme("user-trash"))
|
self.uninstall_button.setIcon(QIcon.fromTheme("user-trash"))
|
||||||
self.uninstall_button.clicked.connect(self.uninstall_app)
|
self.uninstall_button.clicked.connect(self.uninstall_app)
|
||||||
@@ -2013,14 +2183,14 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
return btn
|
return btn
|
||||||
|
|
||||||
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list):
|
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list, start_index=None):
|
||||||
"""
|
"""
|
||||||
Заполняет QGridLayout кнопками установщиков.
|
Заполняет QGridLayout кнопками установщиков.
|
||||||
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
||||||
|
|
||||||
:param grid_layout: QGridLayout для заполнения.
|
:param grid_layout: QGridLayout для заполнения.
|
||||||
:param scripts_list: Список имен скриптов.
|
:param scripts_list: Список имен скриптов.
|
||||||
:param script_folder: Имя папки со скриптами ('autoinstall' или 'manualinstall').
|
:param script_folder: Имя папки со скриптами ('autoinstall', 'manualinstall' или 'testinstall').
|
||||||
:param button_list: Список для хранения созданных кнопок.
|
:param button_list: Список для хранения созданных кнопок.
|
||||||
"""
|
"""
|
||||||
button_index = 0
|
button_index = 0
|
||||||
@@ -2034,7 +2204,13 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
||||||
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
||||||
btn = self._create_app_button(prog_name, icon_paths, self.BUTTON_LIST_STYLE)
|
|
||||||
|
# Выбираем стиль в зависимости от папки
|
||||||
|
if script_folder == 'testinstall':
|
||||||
|
style_sheet = self.TEST_BUTTON_LIST_STYLE
|
||||||
|
else:
|
||||||
|
style_sheet = self.BUTTON_LIST_STYLE
|
||||||
|
btn = self._create_app_button(prog_name, icon_paths, style_sheet)
|
||||||
|
|
||||||
# Обертка для рамки выделения
|
# Обертка для рамки выделения
|
||||||
frame = QFrame()
|
frame = QFrame()
|
||||||
@@ -2044,12 +2220,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
layout.addWidget(btn)
|
layout.addWidget(btn)
|
||||||
|
|
||||||
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
||||||
row, column = divmod(button_index, 2)
|
row, column = divmod(len(button_list), 2)
|
||||||
grid_layout.addWidget(frame, row, column)
|
grid_layout.addWidget(frame, row, column)
|
||||||
button_list.append(btn)
|
button_list.append(btn)
|
||||||
button_index += 1
|
button_index += 1
|
||||||
|
|
||||||
def _create_searchable_grid_tab(self, placeholder_text, filter_slot):
|
def _create_searchable_grid_tab(self, placeholder_text, filter_slot, add_stretch=True):
|
||||||
"""
|
"""
|
||||||
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
||||||
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
||||||
@@ -2083,11 +2259,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
grid_layout.setColumnStretch(1, 1)
|
grid_layout.setColumnStretch(1, 1)
|
||||||
|
|
||||||
v_scroll_layout.addLayout(grid_layout)
|
v_scroll_layout.addLayout(grid_layout)
|
||||||
v_scroll_layout.addStretch(1)
|
if add_stretch:
|
||||||
|
v_scroll_layout.addStretch(1)
|
||||||
|
|
||||||
return tab_widget, grid_layout, search_edit, scroll_area
|
return tab_widget, grid_layout, search_edit, scroll_area
|
||||||
|
|
||||||
def _create_and_populate_install_tab(self, tab_title, script_folder, search_placeholder, filter_slot):
|
def _create_and_populate_install_tab(self, tab_title, script_folders, search_placeholder, filter_slot):
|
||||||
"""
|
"""
|
||||||
Создает и заполняет вкладку для установки (автоматической или ручной).
|
Создает и заполняет вкладку для установки (автоматической или ручной).
|
||||||
Возвращает кортеж со скриптами, кнопками и виджетами.
|
Возвращает кортеж со скриптами, кнопками и виджетами.
|
||||||
@@ -2097,15 +2274,16 @@ class WineHelperGUI(QMainWindow):
|
|||||||
)
|
)
|
||||||
|
|
||||||
scripts = []
|
scripts = []
|
||||||
script_path = os.path.join(Var.DATA_PATH, script_folder)
|
|
||||||
if os.path.isdir(script_path):
|
|
||||||
try:
|
|
||||||
scripts = sorted(os.listdir(script_path))
|
|
||||||
except OSError as e:
|
|
||||||
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
|
||||||
|
|
||||||
buttons_list = []
|
buttons_list = []
|
||||||
self._populate_install_grid(grid_layout, scripts, script_folder, buttons_list)
|
for folder in script_folders:
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, folder)
|
||||||
|
if os.path.isdir(script_path):
|
||||||
|
try:
|
||||||
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
scripts.extend(folder_scripts)
|
||||||
|
self._populate_install_grid(grid_layout, folder_scripts, folder, buttons_list)
|
||||||
|
except OSError as e:
|
||||||
|
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
||||||
|
|
||||||
self.add_tab(tab_widget, tab_title)
|
self.add_tab(tab_widget, tab_title)
|
||||||
|
|
||||||
@@ -2117,12 +2295,28 @@ class WineHelperGUI(QMainWindow):
|
|||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Автоматическая установка", "autoinstall", "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
"Автоматическая установка", ["autoinstall"], "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
||||||
)
|
)
|
||||||
self.autoinstall_scripts = scripts
|
self.autoinstall_scripts = scripts
|
||||||
self.install_tabs_data['auto'] = {
|
self.install_tabs_data['auto'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
self.install_tabs_data['auto']['test_buttons'] = []
|
||||||
|
|
||||||
|
# Добавляем чекбокс для тестовых версий
|
||||||
|
test_checkbox = QCheckBox("Показать тестовые версии")
|
||||||
|
test_checkbox.setToolTip("Показать/скрыть экспериментальные скрипты установки")
|
||||||
|
|
||||||
|
# Находим layout вкладки, чтобы добавить чекбокс
|
||||||
|
tab_widget = self.stacked_widget.widget(self.stacked_widget.count() - 1)
|
||||||
|
if tab_widget and tab_widget.layout():
|
||||||
|
tab_widget.layout().addWidget(test_checkbox)
|
||||||
|
|
||||||
|
# Подключаем сигнал к слоту обновления
|
||||||
|
test_checkbox.stateChanged.connect(self.update_auto_install_list)
|
||||||
|
|
||||||
|
# Сохраняем чекбокс для доступа в будущем
|
||||||
|
self.install_tabs_data['auto']['test_checkbox'] = test_checkbox
|
||||||
|
|
||||||
def create_manual_install_tab(self):
|
def create_manual_install_tab(self):
|
||||||
"""Создает вкладку для ручной установки программ"""
|
"""Создает вкладку для ручной установки программ"""
|
||||||
@@ -2130,17 +2324,86 @@ class WineHelperGUI(QMainWindow):
|
|||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Ручная установка", "manualinstall", "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
"Ручная установка", ["manualinstall"], "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
||||||
)
|
)
|
||||||
self.manualinstall_scripts = scripts
|
self.manualinstall_scripts = scripts
|
||||||
self.install_tabs_data['manual'] = {
|
self.install_tabs_data['manual'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def update_auto_install_list(self):
|
||||||
|
"""Обновляет список на вкладке 'Автоматическая установка' при изменении чекбокса."""
|
||||||
|
data = self.install_tabs_data.get('auto')
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
|
is_checked = data['test_checkbox'].isChecked()
|
||||||
|
test_buttons = data.get('test_buttons', [])
|
||||||
|
|
||||||
|
# Если нужно показать тестовые версии и они еще не добавлены
|
||||||
|
if is_checked and not test_buttons:
|
||||||
|
test_script_folder = "testinstall"
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, test_script_folder)
|
||||||
|
if os.path.isdir(script_path):
|
||||||
|
try:
|
||||||
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
# Запоминаем, какие кнопки являются тестовыми
|
||||||
|
new_test_buttons = []
|
||||||
|
self._populate_install_grid(data['layout'], folder_scripts, test_script_folder, new_test_buttons)
|
||||||
|
data['test_buttons'] = new_test_buttons
|
||||||
|
data['buttons'].extend(new_test_buttons)
|
||||||
|
self.autoinstall_scripts.extend(folder_scripts)
|
||||||
|
|
||||||
|
# Применяем фильтр и прокручиваем к первому новому элементу
|
||||||
|
self.filter_buttons('auto')
|
||||||
|
if new_test_buttons:
|
||||||
|
first_new_button = new_test_buttons[0]
|
||||||
|
frame = first_new_button.parent()
|
||||||
|
if isinstance(frame, QFrame):
|
||||||
|
# Даем время на отрисовку перед прокруткой
|
||||||
|
QTimer.singleShot(100, lambda: data['scroll_area'].ensureWidgetVisible(frame, 50, 50))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
print(f"Не удалось прочитать директорию {test_script_folder}: {e}")
|
||||||
|
|
||||||
|
# Если нужно скрыть тестовые версии и они были добавлены
|
||||||
|
elif not is_checked and test_buttons:
|
||||||
|
# Если текущая активная кнопка находится среди удаляемых, сбрасываем ее
|
||||||
|
if self.current_active_button in test_buttons:
|
||||||
|
self._reset_info_panel_to_default("Автоматическая установка")
|
||||||
|
self.current_active_button = None
|
||||||
|
|
||||||
|
# Останавливаем анимацию и удаляем виджеты тестовых кнопок
|
||||||
|
for btn in test_buttons:
|
||||||
|
if btn in self.icon_animators:
|
||||||
|
anim_data = self.icon_animators.pop(btn)
|
||||||
|
if 'main_timer' in anim_data:
|
||||||
|
anim_data['main_timer'].stop()
|
||||||
|
if 'animation' in anim_data and anim_data['animation']:
|
||||||
|
anim_data['animation'].stop()
|
||||||
|
|
||||||
|
# Удаляем кнопку из основного списка
|
||||||
|
if btn in data['buttons']:
|
||||||
|
data['buttons'].remove(btn)
|
||||||
|
|
||||||
|
# Удаляем фрейм кнопки из layout
|
||||||
|
frame = btn.parent()
|
||||||
|
if frame:
|
||||||
|
frame.deleteLater()
|
||||||
|
|
||||||
|
# Очищаем список тестовых кнопок
|
||||||
|
data['test_buttons'].clear()
|
||||||
|
# Обновляем список скриптов
|
||||||
|
self.autoinstall_scripts = [s for s in self.autoinstall_scripts if not os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", s))]
|
||||||
|
|
||||||
|
# В любом случае применяем фильтр, чтобы скрыть/показать кнопки в соответствии с поиском
|
||||||
|
if data['test_checkbox'].isChecked():
|
||||||
|
self.filter_buttons('auto')
|
||||||
|
|
||||||
def create_installed_tab(self):
|
def create_installed_tab(self):
|
||||||
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
||||||
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
||||||
"Поиск установленной программы...", self.filter_installed_buttons
|
"Поиск установленной программы...", self.filter_installed_buttons, add_stretch=True
|
||||||
)
|
)
|
||||||
self.add_tab(installed_tab, "Установленные")
|
self.add_tab(installed_tab, "Установленные")
|
||||||
|
|
||||||
@@ -2172,6 +2435,13 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
|
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
|
||||||
selector_layout.addWidget(self.created_prefix_selector, 1)
|
selector_layout.addWidget(self.created_prefix_selector, 1)
|
||||||
|
|
||||||
|
self.open_prefix_folder_button = QPushButton()
|
||||||
|
self.open_prefix_folder_button.setIcon(QIcon.fromTheme("folder-open"))
|
||||||
|
self.open_prefix_folder_button.setToolTip("Открыть папку префикса в файловом менеджере")
|
||||||
|
self.open_prefix_folder_button.setEnabled(False)
|
||||||
|
self.open_prefix_folder_button.clicked.connect(self.open_selected_prefix_folder)
|
||||||
|
selector_layout.addWidget(self.open_prefix_folder_button)
|
||||||
|
|
||||||
self.create_base_pfx_button = QPushButton()
|
self.create_base_pfx_button = QPushButton()
|
||||||
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
|
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
|
||||||
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
|
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
|
||||||
@@ -2316,6 +2586,24 @@ class WineHelperGUI(QMainWindow):
|
|||||||
management_layout.setColumnStretch(2, 2)
|
management_layout.setColumnStretch(2, 2)
|
||||||
|
|
||||||
container_layout.addWidget(self.prefix_management_groupbox)
|
container_layout.addWidget(self.prefix_management_groupbox)
|
||||||
|
|
||||||
|
# --- Кнопка полного удаления ---
|
||||||
|
# Добавляем разделитель и кнопку в основной контейнер управления
|
||||||
|
container_layout.addSpacing(15)
|
||||||
|
self.remove_all_button = QPushButton("Удалить все данные WineHelper")
|
||||||
|
self.remove_all_button.setStyleSheet("""
|
||||||
|
QPushButton:!disabled {
|
||||||
|
background-color: #d32f2f;
|
||||||
|
color: white;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
self.remove_all_button.setMinimumHeight(32)
|
||||||
|
self.remove_all_button.setFont(QFont('Arial', 10, QFont.Bold))
|
||||||
|
self.remove_all_button.setToolTip("ВНИМАНИЕ: Удаляет ВСЕ данные WineHelper, включая все префиксы, настройки и ярлыки.")
|
||||||
|
self.remove_all_button.clicked.connect(self.remove_all_data)
|
||||||
|
container_layout.addWidget(self.remove_all_button)
|
||||||
|
|
||||||
layout.addWidget(self.management_container_groupbox)
|
layout.addWidget(self.management_container_groupbox)
|
||||||
layout.addStretch()
|
layout.addStretch()
|
||||||
self.add_tab(self.prefix_tab, "Менеджер префиксов")
|
self.add_tab(self.prefix_tab, "Менеджер префиксов")
|
||||||
@@ -2357,6 +2645,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
prefix_names = []
|
prefix_names = []
|
||||||
|
|
||||||
self.created_prefix_selector.blockSignals(True)
|
self.created_prefix_selector.blockSignals(True)
|
||||||
|
self.remove_all_button.setEnabled(True)
|
||||||
self.created_prefix_selector.clear()
|
self.created_prefix_selector.clear()
|
||||||
if prefix_names:
|
if prefix_names:
|
||||||
self.created_prefix_selector.addItems(prefix_names)
|
self.created_prefix_selector.addItems(prefix_names)
|
||||||
@@ -2372,7 +2661,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_managed_prefix_name = None
|
self.current_managed_prefix_name = None
|
||||||
self._setup_prefix_management_panel(None)
|
self._setup_prefix_management_panel(None)
|
||||||
self.delete_prefix_button.setEnabled(False)
|
self.delete_prefix_button.setEnabled(False)
|
||||||
|
self.remove_all_button.setEnabled(True)
|
||||||
self.create_base_pfx_button.setEnabled(False)
|
self.create_base_pfx_button.setEnabled(False)
|
||||||
|
self.open_prefix_folder_button.setEnabled(False)
|
||||||
else:
|
else:
|
||||||
# Прокручиваем к выбранному элементу, чтобы он был виден в списке
|
# Прокручиваем к выбранному элементу, чтобы он был виден в списке
|
||||||
self.created_prefix_selector.view().scrollTo(
|
self.created_prefix_selector.view().scrollTo(
|
||||||
@@ -2382,7 +2673,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_managed_prefix_name = prefix_name
|
self.current_managed_prefix_name = prefix_name
|
||||||
self._setup_prefix_management_panel(prefix_name)
|
self._setup_prefix_management_panel(prefix_name)
|
||||||
self.delete_prefix_button.setEnabled(True)
|
self.delete_prefix_button.setEnabled(True)
|
||||||
|
self.remove_all_button.setEnabled(True)
|
||||||
self.create_base_pfx_button.setEnabled(True)
|
self.create_base_pfx_button.setEnabled(True)
|
||||||
|
self.open_prefix_folder_button.setEnabled(True)
|
||||||
|
|
||||||
def delete_selected_prefix(self):
|
def delete_selected_prefix(self):
|
||||||
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
|
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
|
||||||
@@ -2491,6 +2784,21 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self._run_simple_command("create-base-pfx", [prefix_name])
|
self._run_simple_command("create-base-pfx", [prefix_name])
|
||||||
self.command_dialog.exec_()
|
self.command_dialog.exec_()
|
||||||
|
|
||||||
|
def open_selected_prefix_folder(self):
|
||||||
|
"""Открывает папку выбранного префикса в системном файловом менеджере."""
|
||||||
|
prefix_name = self.current_managed_prefix_name
|
||||||
|
if not prefix_name:
|
||||||
|
return
|
||||||
|
|
||||||
|
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
||||||
|
if os.path.isdir(prefix_path):
|
||||||
|
try:
|
||||||
|
subprocess.Popen(['xdg-open', prefix_path])
|
||||||
|
except Exception as e:
|
||||||
|
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{prefix_path}\n\nОшибка: {e}")
|
||||||
|
else:
|
||||||
|
QMessageBox.warning(self, "Ошибка", f"Директория префикса не найдена:\n{prefix_path}")
|
||||||
|
|
||||||
def _setup_prefix_management_panel(self, prefix_name):
|
def _setup_prefix_management_panel(self, prefix_name):
|
||||||
"""Настраивает панель управления префиксом на основе текущего состояния."""
|
"""Настраивает панель управления префиксом на основе текущего состояния."""
|
||||||
is_prefix_selected = bool(prefix_name)
|
is_prefix_selected = bool(prefix_name)
|
||||||
@@ -2549,19 +2857,39 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.esync_button.blockSignals(False)
|
self.esync_button.blockSignals(False)
|
||||||
self.fsync_button.blockSignals(False)
|
self.fsync_button.blockSignals(False)
|
||||||
|
|
||||||
|
# --- Чтение и отображение установленных компонентов Winetricks ---
|
||||||
|
winetricks_log_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "winetricks.log")
|
||||||
|
installed_verbs = []
|
||||||
|
if os.path.exists(winetricks_log_path):
|
||||||
|
try:
|
||||||
|
with open(winetricks_log_path, 'r', encoding='utf-8') as f:
|
||||||
|
for line in f:
|
||||||
|
verb = line.split('#', 1)[0].strip()
|
||||||
|
if verb:
|
||||||
|
installed_verbs.append(verb)
|
||||||
|
except IOError as e:
|
||||||
|
print(f"Ошибка чтения winetricks.log: {e}")
|
||||||
|
|
||||||
|
# Фильтруем служебные компоненты, чтобы не засорять вывод
|
||||||
|
verbs_to_ignore = {
|
||||||
|
'isolate_home', 'winxp', 'win7', 'win10', 'win11',
|
||||||
|
'vista', 'win2k', 'win2k3', 'win2k8', 'win8', 'win81',
|
||||||
|
'workaround', 'internal'
|
||||||
|
}
|
||||||
|
display_verbs = sorted([v for v in installed_verbs if v not in verbs_to_ignore])
|
||||||
|
|
||||||
# Карта для красивого отображения известных переменных
|
# Карта для красивого отображения известных переменных
|
||||||
display_map = {
|
display_map = {
|
||||||
"WINEPREFIX": ("Путь", lambda v: v),
|
"WINEPREFIX": ("Путь", lambda v: v),
|
||||||
"WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"),
|
"WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"),
|
||||||
"WH_WINE_USE": ("Версия Wine", lambda v: "Системная" if v == "system" else v),
|
"WH_WINE_USE": ("Версия Wine", lambda v: "Системная" if v == "system" else v),
|
||||||
"BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'),
|
|
||||||
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
|
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
|
||||||
"VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"),
|
"VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"),
|
||||||
"WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"),
|
"WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"),
|
||||||
"WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"),
|
"WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"),
|
||||||
"WH_XDG_OPEN": ("Ассоциации файлов", lambda v: v if v and v != "0" else "Не заданы"),
|
"WH_XDG_OPEN": ("Ассоциации файлов", lambda v: v if v and v != "0" else "Не заданы"),
|
||||||
}
|
}
|
||||||
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
|
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
|
||||||
|
|
||||||
html_content = f'<p style="line-height: 1.3; font-size: 9pt;">'
|
html_content = f'<p style="line-height: 1.3; font-size: 9pt;">'
|
||||||
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
|
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
|
||||||
@@ -2583,6 +2911,15 @@ class WineHelperGUI(QMainWindow):
|
|||||||
html_content += "<br><b>Дополнительные параметры:</b><br>"
|
html_content += "<br><b>Дополнительные параметры:</b><br>"
|
||||||
html_content += other_vars_html
|
html_content += other_vars_html
|
||||||
|
|
||||||
|
html_content += "<br><b>Компоненты (Winetricks):</b> "
|
||||||
|
if display_verbs:
|
||||||
|
# Используем span вместо div, чтобы избежать лишних отступов
|
||||||
|
html_content += '<span style="max-height: 120px; overflow-y: auto;">'
|
||||||
|
html_content += ", ".join(html.escape(v) for v in display_verbs)
|
||||||
|
html_content += '</span>'
|
||||||
|
else:
|
||||||
|
html_content += "Не установлены"
|
||||||
|
|
||||||
html_content += "</p>"
|
html_content += "</p>"
|
||||||
self.prefix_info_display.setHtml(html_content)
|
self.prefix_info_display.setHtml(html_content)
|
||||||
|
|
||||||
@@ -3023,17 +3360,44 @@ class WineHelperGUI(QMainWindow):
|
|||||||
help_subtabs = QTabWidget()
|
help_subtabs = QTabWidget()
|
||||||
help_layout.addWidget(help_subtabs)
|
help_layout.addWidget(help_subtabs)
|
||||||
|
|
||||||
# Подвкладка "Руководство"
|
# Подвкладка "Общее"
|
||||||
guide_tab = QWidget()
|
general_tab = QWidget()
|
||||||
guide_layout = QVBoxLayout(guide_tab)
|
general_layout = QVBoxLayout(general_tab)
|
||||||
guide_text = QTextBrowser()
|
general_text = QTextBrowser()
|
||||||
guide_text.setOpenExternalLinks(True)
|
general_text.setOpenExternalLinks(True)
|
||||||
guide_text.setHtml("""
|
|
||||||
<h2>Руководство пользователя</h2>
|
try:
|
||||||
<p>Подробное и актуальное руководство по использованию WineHelper смотрите на <a href="https://www.altlinux.org/Winehelper">https://www.altlinux.org/Winehelper</a></p>
|
if not Var.GENERAL or not os.path.exists(Var.GENERAL):
|
||||||
""")
|
raise FileNotFoundError
|
||||||
guide_layout.addWidget(guide_text)
|
|
||||||
help_subtabs.addTab(guide_tab, "Руководство")
|
with open(Var.GENERAL, 'r', encoding='utf-8') as f:
|
||||||
|
general_content = f.read()
|
||||||
|
|
||||||
|
html_content = ""
|
||||||
|
url_re = re.compile(r'(https?://[^\s]+)')
|
||||||
|
|
||||||
|
for line in general_content.splitlines():
|
||||||
|
line = line.strip()
|
||||||
|
if not line:
|
||||||
|
html_content += "<br>"
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = html.escape(line)
|
||||||
|
line = url_re.sub(r'<a href="\1">\1</a>', line)
|
||||||
|
|
||||||
|
if line.startswith('# '):
|
||||||
|
html_content += f'<h2>{line[2:]}</h2>'
|
||||||
|
elif line.startswith('Для '):
|
||||||
|
html_content += f'<p style="margin-left: 10px;">• {line}</p>'
|
||||||
|
else:
|
||||||
|
html_content += f'<p>{line}</p>'
|
||||||
|
|
||||||
|
general_text.setHtml(html_content)
|
||||||
|
except (FileNotFoundError, TypeError):
|
||||||
|
general_text.setHtml(f'<h2>Ошибка</h2><p>Не удалось загрузить файл с общей информацией по пути:<br>{Var.GENERAL}</p>')
|
||||||
|
|
||||||
|
general_layout.addWidget(general_text)
|
||||||
|
help_subtabs.addTab(general_tab, "Общее")
|
||||||
|
|
||||||
# Подвкладка "Авторы"
|
# Подвкладка "Авторы"
|
||||||
authors_tab = QWidget()
|
authors_tab = QWidget()
|
||||||
@@ -3139,9 +3503,6 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"""Открывает диалог создания нового префикса."""
|
"""Открывает диалог создания нового префикса."""
|
||||||
dialog = CreatePrefixDialog(self)
|
dialog = CreatePrefixDialog(self)
|
||||||
if dialog.exec_() == QDialog.Accepted:
|
if dialog.exec_() == QDialog.Accepted:
|
||||||
if not self._show_license_agreement_dialog():
|
|
||||||
return
|
|
||||||
|
|
||||||
self.start_prefix_creation(
|
self.start_prefix_creation(
|
||||||
prefix_name=dialog.prefix_name,
|
prefix_name=dialog.prefix_name,
|
||||||
wine_arch=dialog.wine_arch,
|
wine_arch=dialog.wine_arch,
|
||||||
@@ -3358,11 +3719,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_selected_app['name'] = name
|
self.current_selected_app['name'] = name
|
||||||
self.current_selected_app['exec'] = exec_cmd
|
self.current_selected_app['exec'] = exec_cmd
|
||||||
|
|
||||||
# Состояния кнопки
|
self._set_run_button_state(desktop_path in self.running_apps)
|
||||||
if desktop_path in self.running_apps:
|
|
||||||
self.run_button.setText("Остановить")
|
|
||||||
else:
|
|
||||||
self.run_button.setText("Запустить")
|
|
||||||
|
|
||||||
# Показываем панель информации
|
# Показываем панель информации
|
||||||
self.info_panel.setVisible(True)
|
self.info_panel.setVisible(True)
|
||||||
@@ -3378,6 +3735,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.installed_global_action_widget.setVisible(True)
|
self.installed_global_action_widget.setVisible(True)
|
||||||
self.backup_button.setVisible(True)
|
self.backup_button.setVisible(True)
|
||||||
self.create_log_button.setVisible(True)
|
self.create_log_button.setVisible(True)
|
||||||
|
self.update_open_log_dir_button_visibility()
|
||||||
self.uninstall_button.setVisible(True)
|
self.uninstall_button.setVisible(True)
|
||||||
self.manual_install_path_widget.setVisible(False)
|
self.manual_install_path_widget.setVisible(False)
|
||||||
|
|
||||||
@@ -3386,6 +3744,27 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_selected_app = None
|
self.current_selected_app = None
|
||||||
self.info_panel.setVisible(False)
|
self.info_panel.setVisible(False)
|
||||||
|
|
||||||
|
def update_open_log_dir_button_visibility(self):
|
||||||
|
"""Проверяет наличие лог-файла или бэкапов и обновляет видимость кнопки."""
|
||||||
|
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
|
||||||
|
is_visible = False
|
||||||
|
if os.path.isdir(log_dir_path):
|
||||||
|
# Кнопка должна быть видна, если директория не пуста.
|
||||||
|
if os.listdir(log_dir_path):
|
||||||
|
is_visible = True
|
||||||
|
self.open_log_dir_button.setVisible(is_visible)
|
||||||
|
|
||||||
|
def open_log_directory(self):
|
||||||
|
"""Открывает директорию с лог-файлами."""
|
||||||
|
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
|
||||||
|
if os.path.isdir(log_dir_path):
|
||||||
|
try:
|
||||||
|
subprocess.Popen(['xdg-open', log_dir_path])
|
||||||
|
except Exception as e:
|
||||||
|
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{log_dir_path}\n\nОшибка: {e}")
|
||||||
|
else:
|
||||||
|
QMessageBox.information(self, "Информация", f"Директория с логами не найдена:\n{log_dir_path}")
|
||||||
|
|
||||||
def _get_prefix_name_for_selected_app(self):
|
def _get_prefix_name_for_selected_app(self):
|
||||||
"""Извлекает имя префикса для выбранного приложения."""
|
"""Извлекает имя префикса для выбранного приложения."""
|
||||||
if not self.current_selected_app or 'desktop_path' not in self.current_selected_app:
|
if not self.current_selected_app or 'desktop_path' not in self.current_selected_app:
|
||||||
@@ -3426,8 +3805,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
msg_box = QMessageBox(self)
|
msg_box = QMessageBox(self)
|
||||||
msg_box.setWindowTitle("Создание резервной копии")
|
msg_box.setWindowTitle("Создание резервной копии")
|
||||||
msg_box.setText(
|
msg_box.setText(
|
||||||
f"Будет создана резервная копия префикса '{prefix_name}'.\n"
|
f"Будет создана резервная копия префикса '{prefix_name}'.\n\n"
|
||||||
f"Файл будет сохранен на вашем Рабочем столе в формате .whpack.\n\nПродолжить?"
|
f"Файл будет сохранен в домашней директории в папке winehelper_backup_log/ в формате .whpack.\n\nПродолжить?"
|
||||||
)
|
)
|
||||||
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
||||||
msg_box.addButton(no_button, QMessageBox.NoRole)
|
msg_box.addButton(no_button, QMessageBox.NoRole)
|
||||||
@@ -3460,6 +3839,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||||
self.command_process.finished.connect(self._handle_command_finished)
|
self.command_process.finished.connect(self._handle_command_finished)
|
||||||
|
self.command_process.finished.connect(self.update_open_log_dir_button_visibility)
|
||||||
|
|
||||||
winehelper_path = self.winehelper_path
|
winehelper_path = self.winehelper_path
|
||||||
args = ["backup-prefix", prefix_name]
|
args = ["backup-prefix", prefix_name]
|
||||||
@@ -3525,9 +3905,10 @@ class WineHelperGUI(QMainWindow):
|
|||||||
msg_box = QMessageBox(self)
|
msg_box = QMessageBox(self)
|
||||||
msg_box.setWindowTitle("Создание лога")
|
msg_box.setWindowTitle("Создание лога")
|
||||||
msg_box.setText(
|
msg_box.setText(
|
||||||
"Приложение будет запущено в режиме отладки.\n"
|
"Приложение будет запущено в режиме отладки.\n\n"
|
||||||
"После закрытия приложения лог будет сохранен в вашем домашнем каталоге "
|
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
|
||||||
"под именем 'winehelper.log'."
|
"в вашем домашнем каталоге под именем (пример: prefix_program.log).\n\n"
|
||||||
|
"Продолжить?"
|
||||||
)
|
)
|
||||||
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
||||||
msg_box.addButton(no_button, QMessageBox.NoRole)
|
msg_box.addButton(no_button, QMessageBox.NoRole)
|
||||||
@@ -3551,24 +3932,10 @@ class WineHelperGUI(QMainWindow):
|
|||||||
QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}")
|
QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}")
|
||||||
return
|
return
|
||||||
|
|
||||||
winetricks_search_dir = Var.DATA_PATH
|
winetricks_path = Var.WH_WINETRICKS
|
||||||
winetricks_path = None
|
|
||||||
try:
|
|
||||||
# Ищем файл, который начинается с 'winetricks_'
|
|
||||||
for filename in os.listdir(winetricks_search_dir):
|
|
||||||
if filename.startswith("winetricks_"):
|
|
||||||
winetricks_path = os.path.join(winetricks_search_dir, filename)
|
|
||||||
break # Нашли, выходим из цикла
|
|
||||||
except OSError as e:
|
|
||||||
QMessageBox.critical(self, "Ошибка", f"Не удалось прочитать директорию {winetricks_search_dir}: {e}")
|
|
||||||
return
|
|
||||||
|
|
||||||
if not winetricks_path:
|
|
||||||
QMessageBox.critical(self, "Ошибка", f"Скрипт winetricks не найден в директории:\n{winetricks_search_dir}")
|
|
||||||
return
|
|
||||||
|
|
||||||
wine_executable = self._get_wine_executable_for_prefix(prefix_name)
|
wine_executable = self._get_wine_executable_for_prefix(prefix_name)
|
||||||
dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self, wine_executable=wine_executable)
|
dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self, wine_executable=wine_executable)
|
||||||
|
dialog.installation_complete.connect(lambda: self.update_prefix_info_display(prefix_name))
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
|
|
||||||
def _get_wine_executable_for_prefix(self, prefix_name):
|
def _get_wine_executable_for_prefix(self, prefix_name):
|
||||||
@@ -3731,10 +4098,27 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
# Если текущее выбранное приложение - то, что только что завершилось, обновляем кнопку
|
# Если текущее выбранное приложение - то, что только что завершилось, обновляем кнопку
|
||||||
if self.current_selected_app and self.current_selected_app.get('desktop_path') == desktop_path:
|
if self.current_selected_app and self.current_selected_app.get('desktop_path') == desktop_path:
|
||||||
self.run_button.setText("Запустить")
|
self._set_run_button_state(False)
|
||||||
else:
|
else:
|
||||||
print(f"Предупреждение: получен сигнал finished для неизвестного процесса {desktop_path}")
|
print(f"Предупреждение: получен сигнал finished для неизвестного процесса {desktop_path}")
|
||||||
|
|
||||||
|
def _set_run_button_state(self, is_running):
|
||||||
|
"""Устанавливает текст и стиль для кнопки Запустить/Остановить."""
|
||||||
|
if is_running:
|
||||||
|
self.run_button.setText("Остановить")
|
||||||
|
self.run_button.setStyleSheet(self.STOP_BUTTON_STYLE)
|
||||||
|
self.create_log_button.setEnabled(False)
|
||||||
|
self.backup_button.setEnabled(False)
|
||||||
|
self.uninstall_button.setEnabled(False)
|
||||||
|
self.restore_prefix_button_panel.setEnabled(False)
|
||||||
|
else:
|
||||||
|
self.run_button.setText("Запустить")
|
||||||
|
self.run_button.setStyleSheet(self.RUN_BUTTON_STYLE)
|
||||||
|
self.create_log_button.setEnabled(True)
|
||||||
|
self.backup_button.setEnabled(True)
|
||||||
|
self.uninstall_button.setEnabled(True)
|
||||||
|
self.restore_prefix_button_panel.setEnabled(True)
|
||||||
|
|
||||||
def _run_app_launcher(self, debug=False):
|
def _run_app_launcher(self, debug=False):
|
||||||
"""Внутренний метод для запуска приложения (с отладкой или без) с использованием QProcess."""
|
"""Внутренний метод для запуска приложения (с отладкой или без) с использованием QProcess."""
|
||||||
if not self.current_selected_app or 'exec' not in self.current_selected_app:
|
if not self.current_selected_app or 'exec' not in self.current_selected_app:
|
||||||
@@ -3793,6 +4177,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
# и избегания проблем с замыканием в lambda.
|
# и избегания проблем с замыканием в lambda.
|
||||||
process.finished.connect(partial(self._on_app_process_finished, desktop_path))
|
process.finished.connect(partial(self._on_app_process_finished, desktop_path))
|
||||||
|
|
||||||
|
process.finished.connect(self.update_open_log_dir_button_visibility)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
process.start(program, arguments)
|
process.start(program, arguments)
|
||||||
@@ -3800,7 +4185,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
raise RuntimeError(f"Не удалось запустить процесс: {process.errorString()}")
|
raise RuntimeError(f"Не удалось запустить процесс: {process.errorString()}")
|
||||||
|
|
||||||
self.running_apps[desktop_path] = process
|
self.running_apps[desktop_path] = process
|
||||||
self.run_button.setText("Остановить")
|
self._set_run_button_state(True)
|
||||||
print(f"Запущено: {program} {' '.join(arguments)}")
|
print(f"Запущено: {program} {' '.join(arguments)}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
QMessageBox.critical(self, "Ошибка запуска",
|
QMessageBox.critical(self, "Ошибка запуска",
|
||||||
@@ -3811,6 +4196,55 @@ class WineHelperGUI(QMainWindow):
|
|||||||
QMessageBox.critical(self, "Ошибка",
|
QMessageBox.critical(self, "Ошибка",
|
||||||
f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}")
|
f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}")
|
||||||
|
|
||||||
|
def remove_all_data(self):
|
||||||
|
"""Запускает процесс полного удаления всех данных WineHelper."""
|
||||||
|
# Первое подтверждение
|
||||||
|
msg_box1 = QMessageBox(self)
|
||||||
|
msg_box1.setIcon(QMessageBox.Critical)
|
||||||
|
msg_box1.setWindowTitle('Подтверждение полного удаления')
|
||||||
|
msg_box1.setText(
|
||||||
|
"<h2>ВНИМАНИЕ!</h2>"
|
||||||
|
"<p>Это действие полностью и безвозвратно удалит <b>ВСЕ</b> данные, связанные с WineHelper, включая:</p>"
|
||||||
|
"<ul>"
|
||||||
|
"<li>Все созданные префиксы и установленные в них программы.</li>"
|
||||||
|
"<li>Все ярлыки в меню и на рабочем столе.</li>"
|
||||||
|
"<li>Все настройки, кэш и резервные копии.</li>"
|
||||||
|
"</ul>"
|
||||||
|
"<p>Продолжить?</p>"
|
||||||
|
)
|
||||||
|
msg_box1.setTextFormat(Qt.RichText)
|
||||||
|
yes_button1 = msg_box1.addButton("Да, я понимаю", QMessageBox.YesRole)
|
||||||
|
no_button1 = msg_box1.addButton("Отмена", QMessageBox.NoRole)
|
||||||
|
msg_box1.setDefaultButton(no_button1)
|
||||||
|
msg_box1.exec_()
|
||||||
|
|
||||||
|
if msg_box1.clickedButton() != yes_button1:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Второе, финальное подтверждение
|
||||||
|
msg_box2 = QMessageBox(self)
|
||||||
|
msg_box2.setIcon(QMessageBox.Critical)
|
||||||
|
msg_box2.setWindowTitle('Последнее предупреждение')
|
||||||
|
msg_box2.setText("<h3>Вы уверены, что хотите удалить ВСЁ?</h3><p>Это действие необратимо.</p>")
|
||||||
|
msg_box2.setTextFormat(Qt.RichText)
|
||||||
|
yes_button2 = msg_box2.addButton("Да, удалить всё", QMessageBox.DestructiveRole)
|
||||||
|
no_button2 = msg_box2.addButton("Нет, я передумал", QMessageBox.RejectRole)
|
||||||
|
msg_box2.setDefaultButton(no_button2)
|
||||||
|
msg_box2.exec_()
|
||||||
|
|
||||||
|
if msg_box2.clickedButton() != yes_button2:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Запускаем команду и выходим из приложения
|
||||||
|
try:
|
||||||
|
# Запускаем команду в фоне и не ждем ее завершения
|
||||||
|
subprocess.Popen([self.winehelper_path, "remove-all", "--force"])
|
||||||
|
# Сообщаем пользователю и закрываем GUI
|
||||||
|
QMessageBox.information(self, "Удаление", "Запущена процедура удаления WineHelper. Приложение будет закрыто.")
|
||||||
|
self.quit_application()
|
||||||
|
except Exception as e:
|
||||||
|
QMessageBox.critical(self, "Ошибка", f"Не удалось запустить команду удаления: {e}")
|
||||||
|
|
||||||
def quit_application(self):
|
def quit_application(self):
|
||||||
"""Инициирует процесс выхода из приложения."""
|
"""Инициирует процесс выхода из приложения."""
|
||||||
self.is_quitting = True
|
self.is_quitting = True
|
||||||
@@ -4029,6 +4463,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if script_name in self.autoinstall_scripts:
|
if script_name in self.autoinstall_scripts:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
||||||
tab_type = 'auto'
|
tab_type = 'auto'
|
||||||
|
if not os.path.exists(script_path): # Проверяем в testinstall, если не нашли в autoinstall
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, "testinstall", script_name)
|
||||||
self.manual_install_path_widget.setVisible(False)
|
self.manual_install_path_widget.setVisible(False)
|
||||||
else:
|
else:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
||||||
@@ -4194,7 +4630,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
winehelper_path = self.winehelper_path
|
winehelper_path = self.winehelper_path
|
||||||
script_path = os.path.join(Var.DATA_PATH,
|
script_path = os.path.join(Var.DATA_PATH,
|
||||||
"autoinstall" if self.current_script in self.autoinstall_scripts else "manualinstall",
|
"autoinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "autoinstall", self.current_script))
|
||||||
|
else "testinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", self.current_script))
|
||||||
|
else "manualinstall",
|
||||||
self.current_script)
|
self.current_script)
|
||||||
|
|
||||||
if not os.path.exists(winehelper_path):
|
if not os.path.exists(winehelper_path):
|
||||||
@@ -4511,6 +4949,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.command_process.deleteLater()
|
self.command_process.deleteLater()
|
||||||
self.command_process = None
|
self.command_process = None
|
||||||
self.command_close_button.setEnabled(True)
|
self.command_close_button.setEnabled(True)
|
||||||
|
self.command_log_output.ensureCursorVisible()
|
||||||
|
|
||||||
def _handle_launcher_creation_finished(self, exit_code, exit_status):
|
def _handle_launcher_creation_finished(self, exit_code, exit_status):
|
||||||
"""Обрабатывает завершение создания ярлыка."""
|
"""Обрабатывает завершение создания ярлыка."""
|
||||||
@@ -4602,7 +5041,7 @@ def main():
|
|||||||
window.server = server
|
window.server = server
|
||||||
window.show()
|
window.show()
|
||||||
# Создаем иконку в системном трее после создания окна
|
# Создаем иконку в системном трее после создания окна
|
||||||
window.create_tray_icon()
|
# window.create_tray_icon() # Временно отключено
|
||||||
return app.exec_()
|
return app.exec_()
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|||||||