Compare commits

...

62 Commits

Author SHA1 Message Date
Mikhail Tergoev
70bee8c760 Merge branch 'minergenon-devel' 2025-11-13 22:51:08 +03:00
Mikhail Tergoev
dab4017c44 ksamu: updated wine and wine-cpcsp_proxy 2025-11-13 22:48:19 +03:00
Mikhail Tergoev
e21db7d2bd updated sha256sum.list and added wow64 wine and wine-cpcsp_proxy 2025-11-13 22:46:46 +03:00
Mikhail Tergoev
e2d39484f4 added support wine-cpcsp_proxy wow64 2025-11-13 22:44:28 +03:00
Mikhail Tergoev
01d60271c2 create_base_pfx: added rm symlink from windows 2025-11-11 14:34:44 +03:00
Sergey Palcheh
0a6994abf3 fix: winetricks path handling 2025-11-07 10:50:01 +06:00
Mikhail Tergoev
0a4844a9f3 added url for last comments 2025-11-06 15:01:56 +03:00
Mikhail Tergoev
e905461567 added font smoothing 2025-11-06 14:54:33 +03:00
Mikhail Tergoev
b872b9d165 replaced font: Microsoft Sans Serif to Tahoma 2025-11-06 14:46:11 +03:00
Mikhail Tergoev
ea6799fbf2 disabled Decorated for maincontroller.exe 2025-11-06 14:38:02 +03:00
Mikhail Tergoev
7a990ca99c used system winetricks 2025-11-05 14:05:09 +03:00
Mikhail Tergoev
96c6c8f059 rename TFlex.DOCs17 to TFlexDOCs17 2025-11-05 11:59:02 +03:00
Mikhail Tergoev
122a77a62c Merge branch 'minergenon-devel' 2025-11-05 11:48:15 +03:00
Sergey Palcheh
3c89777792 tflex: correcting the display of the icon and name for a desktop file 2025-10-30 20:08:22 +06:00
Sergey Palcheh
4afdbaa220 added the winetricks cache deletion feature 2025-10-25 15:16:09 +06:00
Sergey Palcheh
81013bfe71 fix: reset active button if it's being removed 2025-10-25 12:31:16 +06:00
Sergey Palcheh
caccc333db updating tax program scripts 2025-10-25 12:26:42 +06:00
Mikhail Tergoev
0fc93f4d3c updated changelog to 0.8.0 2025-10-24 14:35:22 +03:00
Mikhail Tergoev
5f27bfa97a updated scadoffice script 2025-10-24 14:34:27 +03:00
Mikhail Tergoev
151d0ffc48 Merge branch 'minergenon-devel' 2025-10-23 11:11:50 +03:00
Mikhail Tergoev
ad91466475 updated print message functions 2025-10-23 11:11:18 +03:00
Sergey Palcheh
5e4d94bb57 temporarily disable the display of the tray icon 2025-10-23 14:02:50 +06:00
Sergey Palcheh
5b572ff540 added a change in the color of the tray icon depending on the theme 2025-10-23 14:00:20 +06:00
Sergey Palcheh
c68bcc9abf added a method to change the color of the tray icon 2025-10-23 12:38:10 +06:00
Sergey Palcheh
1ad2c6cfa8 The Manual sub-tab has been renamed to General 2025-10-23 11:31:43 +06:00
Sergey Palcheh
16a686dc37 added a new file with general information 2025-10-23 11:30:37 +06:00
Mikhail Tergoev
c9d5619ab9 used simply wine_run for .reg files 2025-10-22 15:16:22 +03:00
Mikhail Tergoev
74311e9c04 fixed: remove OUT_PAGE_TMP after use install scripts 2025-10-22 15:14:57 +03:00
Sergey Palcheh
eb9bef83e2 improved display of test versions 2025-10-22 11:13:55 +06:00
Sergey Palcheh
c7eddb8b53 tray icon changed to winehelper-symbolic.svg 2025-10-22 09:25:19 +06:00
Mikhail Tergoev
dfc6c1c836 added var WH_ICON_TRAY path to winehelper-symbolic.svg 2025-10-21 15:09:46 +03:00
Mikhail Tergoev
04187e9463 GUI: updated compatibility links and certificates 2025-10-21 15:00:53 +03:00
Mikhail Tergoev
5f915ab58d Merge branch 'minergenon-devel' 2025-10-21 14:11:22 +03:00
Sergey Palcheh
0e8ee7788a fixed: the Delete all WineHelper data button is active by default 2025-10-21 14:45:27 +06:00
Sergey Palcheh
49c1ac6846 fixed the text color change after an error in the log 2025-10-21 14:36:47 +06:00
Mikhail Tergoev
971bcd0f5a wine_run: added automatic detection of .reg and .dll 2025-10-21 11:30:48 +03:00
Sergey Palcheh
5b21015aee added compatibility links and certificates 2025-10-21 12:25:53 +06:00
Mikhail Tergoev
7dee08bcfb updated changelog to 0.7.0 2025-10-20 15:30:47 +03:00
Mikhail Tergoev
633deaf1c1 hided abc-*, ais and commfort-* scripts 2025-10-20 15:28:21 +03:00
Mikhail Tergoev
4df9508547 Merge branch 'minergenon-devel' 2025-10-20 15:07:30 +03:00
Sergey Palcheh
989f04cdd8 added a test list to the auto-installation 2025-10-20 17:59:40 +06:00
Mikhail Tergoev
95b189f5a2 less in used for print install list 2025-10-20 14:16:54 +03:00
Mikhail Tergoev
371553277a added WH_TESTINSTALL_DIR to scripts list 2025-10-20 13:09:42 +03:00
Mikhail Tergoev
dabf50103d hided unverifed install scripts 2025-10-20 12:45:39 +03:00
Mikhail Tergoev
590b37f1a3 rename var: INSTALL_MODE -> WH_INSTALL_MODE 2025-10-20 12:43:52 +03:00
Mikhail Tergoev
1f9b4a9146 added more info for daobit-cservice 2025-10-20 12:40:31 +03:00
Mikhail Tergoev
39f21373f1 added version for spravki-bk 2025-10-20 12:39:48 +03:00
Mikhail Tergoev
e984ffdb8c fixed: always return to DRIVE_C 2025-10-20 11:43:19 +03:00
Mikhail Tergoev
48834dc078 Merge branch 'minergenon-devel' 2025-10-20 11:35:11 +03:00
Sergey Palcheh
b62d06ed71 fixed typos 2025-10-19 15:39:43 +06:00
Sergey Palcheh
9a1b78276e added button lock in the Installed tab when the Run button is pressed 2025-10-18 16:52:22 +06:00
Sergey Palcheh
f788307f05 added color for the Run button/Stop it 2025-10-18 16:39:22 +06:00
Sergey Palcheh
14273f723b the error of determining the current directory has been fixed 2025-10-18 16:24:06 +06:00
Mikhail Tergoev
a8e0fdce0a added var: WH_DEVEL 2025-10-17 15:34:29 +03:00
Mikhail Tergoev
da3d5cd7af refactored master func: wine_run 2025-10-17 13:55:55 +03:00
Mikhail Tergoev
3ee499c758 Merge branch 'minergenon-devel' 2025-10-17 11:41:20 +03:00
Mikhail Tergoev
6286cccbab fixed typos 2025-10-17 11:39:44 +03:00
Mikhail Tergoev
e8d462b665 Merge branch 'minergenon-tflex18' 2025-10-17 11:38:57 +03:00
Mikhail Tergoev
a817d1a6f5 added UNIX path conversion 2025-10-16 21:25:58 +03:00
Mikhail Tergoev
e1fc25bb72 used tmp_winedlloverride_update in scadoffice script 2025-10-16 11:14:48 +03:00
Mikhail Tergoev
7c90da2088 added func: tmp_winedlloverride_update 2025-10-16 11:13:58 +03:00
Sergey Palcheh
108316148a added a unique name for the application startup log being created 2025-10-16 12:54:21 +06:00
47 changed files with 835 additions and 19593 deletions

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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=(

View File

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

View File

@@ -1,81 +0,0 @@
#!/usr/bin/env bash
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
########################################################################
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_v05"
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
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
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
create_new_dir "$DRIVE_C/SDATA"
create_new_dir "$DRIVE_C/SWORK"
export WINE_WIN_START=""
var_winedlloverride_update "hasplms.exe,hasplmv.exe=d"
wine_run_install "$AUTOINSTALL_EXE"
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

View File

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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
export PROG_URL="https://www.tflexcad.ru" export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 18" export PROG_NAME="T-FLEX CAD 18"
export PROG_ICON="tflexcad" export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AU
try_remove_dir "${AUTOINSTALL_UNPACK}" try_remove_dir "${AUTOINSTALL_UNPACK}"
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad18"
fi fi

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
export PROG_URL="https://www.tflexcad.ru" export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Приложения для T-FLEX CAD 18" export PROG_NAME="Приложения для T-FLEX CAD 18"
export PROG_ICON="tflexcad" export PROG_ICON="tflexcad18"
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"

View File

@@ -1,9 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# info_ru: Обучающие материалы, примеры, бесплатные библиотеки для T-FLEX CAD 18 (Учебное пособие 18, Стандартные элементы 18, Примеры 17) # info_ru: Обучающие материалы, примеры, бесплатные библиотеки для T-FLEX CAD 18 (Учебное пособие 18, Стандартные элементы 18, Примеры 18)
######################################################################## ########################################################################
export PROG_URL="https://www.tflexcad.ru" export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Ресурсы для T-FLEX CAD 18" export PROG_NAME="Ресурсы для T-FLEX CAD 18"
export PROG_ICON="tflexcad" export PROG_ICON="tflexcad18"
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
export PROG_URL="https://www.tflexcad.ru" export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 2D+ 18" export PROG_NAME="T-FLEX CAD 2D+ 18"
export PROG_ICON="tflexcad" export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%202D+%2018.zip"
try_remove_dir "${AUTOINSTALL_UNPACK}" try_remove_dir "${AUTOINSTALL_UNPACK}"
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 18/Program/TFlexCad.exe" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 18/Program/TFlexCad.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D18"
fi fi

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
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_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -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

View File

@@ -3,7 +3,7 @@
######################################################################## ########################################################################
export PROG_URL="https://www.tflexcad.ru" export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX Viewer 18" export PROG_NAME="T-FLEX Viewer 18"
export PROG_ICON="tflexcad" export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03" export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64" export WINEARCH="win64"
@@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20Viewer%2018.zip" "$
try_remove_dir "${AUTOINSTALL_UNPACK}" try_remove_dir "${AUTOINSTALL_UNPACK}"
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 18/Program/TFlexViewer.exe" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 18/Program/TFlexViewer.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexViewer18"
fi fi

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
image/tflexcad18.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,12 +1,17 @@
##### WINE ##### ##### WINE WOW64 #####
e9a8b79dfe12cad1304dca573d73aefe109e3d69b6fff739c8dbb8b2d3c271c6 wine-10.12.1-alt1-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 ##### ##### WINE_LG #####
@@ -150,6 +155,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 +177,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

View File

@@ -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

View File

@@ -1,17 +1,18 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# info_ru: Программа “КСАМУ”. # info_ru: “КСАМУ” - Комплексная система автоматизации медицинского учреждения.
######################################################################## ########################################################################
export PROG_URL="https://docs.medicine-it.ru/" export PROG_URL="https://docs.medicine-it.ru/"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine-10.12.1-alt1-wow64"
export WINEPREFIX="ksamu" export WINEPREFIX="ksamu"
export PROG_NAME="КСАМУ" export PROG_NAME="КСАМУ"
export PROG_ICON="ksamu" export PROG_ICON="ksamu"
export BASE_PFX="ksamu_pfx_x64_v01" export BASE_PFX="ksamu_pfx_x64_v01"
export WINEARCH="win64" export WINEARCH="win64"
export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml3 msxml4 fontsmooth=gray" #riched32 export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml4 msxml3 fontsmooth=gray"
# riched32
export WH_USE_EXTRA_FONTS="1" export WH_USE_EXTRA_FONTS="1"
export WH_WINDOWS_VER="7" export WH_WINDOWS_VER="7"
export WH_USE_CPCSP_PROXY="1"
prepair_wine prepair_wine
create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON" create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON"

View File

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

View 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
View 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

View File

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

View File

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

View File

@@ -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,19 +110,6 @@ else
check_variables DXVK_NVAPI_LOG_LEVEL "none" check_variables DXVK_NVAPI_LOG_LEVEL "none"
fi fi
if [[ $WINEDEBUG != "-all" ]] ; then
log_dir="$HOME/winehelper_backup_log"
mkdir -p "$log_dir"
export LOG_FILE="$log_dir/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"
@@ -125,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"
@@ -147,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"
@@ -333,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"
@@ -349,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"
@@ -465,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
@@ -485,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}"
@@ -874,6 +877,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"
@@ -908,21 +915,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
@@ -1187,6 +1205,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"
@@ -1233,38 +1266,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
@@ -1287,7 +1352,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
@@ -1348,23 +1414,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
@@ -1389,40 +1457,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 () {
@@ -1440,46 +1557,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" ]]
@@ -1487,6 +1607,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 не найден!"
@@ -1825,13 +1946,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
@@ -1842,6 +1966,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"
@@ -1852,9 +1977,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")" &
@@ -2151,20 +2281,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
@@ -2172,21 +2303,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
@@ -2194,15 +2331,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
} }
@@ -2221,13 +2363,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 [команда]
@@ -2247,6 +2411,7 @@ wh_info () {
remove-prefix [имя_префикса] удалить префикс и все связанные данные remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резервную копию префикса backup-prefix [имя_префикса] создать резервную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
clear-winetricks-cache очистить кэш Winetricks
Параметры: Параметры:
--help показать эту справку и выйти --help показать эту справку и выйти
@@ -2263,7 +2428,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
@@ -2304,17 +2470,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

View File

@@ -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, pyqtSignal 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:
"""Класс для управления проверкой и установкой системных зависимостей.""" """Класс для управления проверкой и установкой системных зависимостей."""
@@ -444,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)
@@ -476,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("Применить")
@@ -734,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):
"""Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных.""" """Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных."""
@@ -870,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
@@ -890,6 +912,64 @@ class WinetricksManagerDialog(QDialog):
self.installation_complete.emit() 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):
"""Обрабатывает закрытие окна, чтобы предотвратить выход во время установки.""" """Обрабатывает закрытие окна, чтобы предотвратить выход во время установки."""
# Проверяем, запущен ли процесс установки/переустановки # Проверяем, запущен ли процесс установки/переустановки
@@ -933,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)
@@ -1622,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
@@ -1710,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():
@@ -1718,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)
@@ -1764,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 = "Ручная установка"
@@ -1889,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)
@@ -2052,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
@@ -2073,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()
@@ -2083,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):
""" """
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой. Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки). Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
@@ -2122,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):
""" """
Создает и заполняет вкладку для установки (автоматической или ручной). Создает и заполняет вкладку для установки (автоматической или ручной).
Возвращает кортеж со скриптами, кнопками и виджетами. Возвращает кортеж со скриптами, кнопками и виджетами.
@@ -2136,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)
@@ -2156,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):
"""Создает вкладку для ручной установки программ""" """Создает вкладку для ручной установки программ"""
@@ -2169,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, "Установленные")
@@ -2421,7 +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(bool(prefix_names)) 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)
@@ -2437,7 +2661,7 @@ 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(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) self.open_prefix_folder_button.setEnabled(False)
else: else:
@@ -3136,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;">&bull; {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()
@@ -3468,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)
@@ -3660,7 +3907,8 @@ class WineHelperGUI(QMainWindow):
msg_box.setText( msg_box.setText(
"Приложение будет запущено в режиме отладки.\n\n" "Приложение будет запущено в режиме отладки.\n\n"
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' " "После закрытия приложения лог будет сохранен в папке '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)
@@ -3684,22 +3932,7 @@ 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.installation_complete.connect(lambda: self.update_prefix_info_display(prefix_name))
@@ -3865,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:
@@ -3935,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, "Ошибка запуска",
@@ -4213,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)
@@ -4378,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):
@@ -4787,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

File diff suppressed because it is too large Load Diff