Compare commits

...

38 Commits
dop ... master

Author SHA1 Message Date
Mikhail Tergoev
98902bd8f2 updated changelog to 0.4.0 2025-05-30 12:30:59 +03:00
Mikhail Tergoev
17afd90e93 disabled winetricks force install vcrun2022 2025-05-29 15:34:05 +03:00
Mikhail Tergoev
19af68332b added icons to prefix and desktop.list 2025-05-29 14:28:10 +03:00
Mikhail Tergoev
a2a63cf1ff added hack for cpcsp_proxy_setup 2025-05-29 14:03:05 +03:00
Mikhail Tergoev
858507fc8d added wine-9.0.14-alt1-amd64 2025-05-29 13:00:01 +03:00
Mikhail Tergoev
68870f8307 fixed function: var_dxvk_config_update 2025-05-29 10:34:14 +03:00
Mikhail Tergoev
8f6300c6b8 cleaning and translations 2025-05-29 00:20:39 +03:00
Mikhail Tergoev
ed8d28c81f fixed function: init_database 2025-05-28 22:55:05 +03:00
Mikhail Tergoev
bd482ea757 dropped function: check_command 2025-05-28 22:29:16 +03:00
Mikhail Tergoev
8cc9cb17bb added support wine-cpcsp_proxy 2025-05-28 22:15:32 +03:00
Mikhail Tergoev
b29e586137 updated changelog to 0.3.9 2025-05-27 16:45:59 +03:00
Mikhail Tergoev
ace00616ca updated autoinstall: scadoffice 2025-05-27 16:29:13 +03:00
Mikhail Tergoev
5b6a05a09e bundled winetricks in use 2025-05-27 16:25:02 +03:00
Mikhail Tergoev
3be6b8c4a1 added winetricks 20250102 2025-05-27 16:24:44 +03:00
Mikhail Tergoev
b684afe1ad added arg for force remove all WH data 2025-05-27 15:06:48 +03:00
Mikhail Tergoev
bda5a31205 added arg for force remove prefix 2025-05-27 14:16:33 +03:00
Mikhail Tergoev
e55bc209c1 Merge branch 'minergenon-remove-prefix' 2025-05-27 13:53:30 +03:00
Mikhail Tergoev
33f12d5287 Merge branch 'minergenon-easymnemo' 2025-05-27 13:47:12 +03:00
Mikhail Tergoev
bb0ec33202 updated sha256sum for scadaoffice_pfx 2025-05-27 13:46:20 +03:00
Sergey Palcheh
a4998d2f26 autoinstall: added easymnemo 2025-05-27 13:01:11 +06:00
Sergey Palcheh
ca9e1d7f75 added prefix removal 2025-05-27 12:18:01 +06:00
Mikhail Tergoev
b4d36b15e8 added check file desktop.list before grep 2025-05-26 15:59:49 +03:00
Mikhail Tergoev
717e6c0e7d updated changelog to 0.3.8 2025-05-26 14:40:42 +03:00
Mikhail Tergoev
3ea9462025 added launch of files in the native application (fnx @minergenon) 2025-05-26 14:02:07 +03:00
Mikhail Tergoev
8774a8b34d noexec check for /home expanded (thx Alexander Kovalev) 2025-05-26 10:28:29 +03:00
Mikhail Tergoev
052a07a42b dropped command: update-menus 2025-05-26 10:19:24 +03:00
Mikhail Tergoev
112933c7b1 added choise if WINEPREFIX is not set (fnx @minergenon) 2025-05-26 10:07:13 +03:00
Mikhail Tergoev
de34f84e04 added desktop.list for programms in prefix 2025-05-23 18:32:29 +03:00
Mikhail Tergoev
4310fe1e8c added preservation of the latest use of prefix 2025-05-23 17:27:57 +03:00
Mikhail Tergoev
cd619bb9cc updated changelog to 0.3.7 2025-05-06 13:12:06 +03:00
Mikhail Tergoev
b319f4146c updated check: noexec only for /home (ALT bug: 54095) 2025-05-06 12:25:50 +03:00
Mikhail Tergoev
70b577dce5 Merge branch 'minergenon-zulugis' 2025-05-05 21:48:55 +03:00
Sergey Palcheh
997612c98d remove winehelper 2025-05-05 13:29:04 +06:00
Mikhail Tergoev
8892f29a33 updated script: scadoffice 2025-04-30 13:25:10 +03:00
Mikhail Tergoev
5c0a62ff02 updated create menu and desktop files 2025-04-30 13:19:46 +03:00
Mikhail Tergoev
20f2f6d112 updated changelog to 0.3.6 2025-04-25 18:14:25 +03:00
Mikhail Tergoev
0d4faa3224 added desktop categories 2025-04-25 18:11:03 +03:00
Sergey Palcheh
388293e929 added autoinstall/zulugis 2025-04-24 13:01:34 +06:00
11 changed files with 19770 additions and 197 deletions

@ -1,5 +1,35 @@
История изменений: История изменений:
0.4.0:
* добавлена автоматическая установка и настройка wine-cpcsp_proxy при
использовании переменной WH_USE_CPCSP_PROXY=1
* подготовка функций для создания бэкапов префикса
0.3.9:
* обновлен скрипт установки scadoffice
* добавлена автоустановка:
winehelper easymnemo - "Easymnemo"
* winetricks поставляется с пакетом WineHelper, а не скачивается из GitHub
* добавлена возможность удаления префикса
0.3.8:
* добавлена возможность ассоциации и запуска файлов из WINE в нативном Linux
приложении с помощью перемененной. Пример: WH_XDG_OPEN="rtf txt doc"
* добавлен выбор префикса, если переменная WINEPREFIX не объявлена
* добавлено сохранение последней конфигурации использования префикса
* добавлено сохранение скписка создаваемых ярлыков для приложений
0.3.7:
* обновлены функции создания desktop файлов (ярлыков) и категория WineHelper в меню
* обновлен скрипт установки scadoffice
* добавлена автоустановка:
winehelper install zulugis - ZuluGIS 2021 Инженерные расчёты
* добавлена функция полного удаления WineHelper
* обновлена проверка на наличие noexec для /home (ALT bug: 54095)
0.3.6:
* добавлена категория WineHelper для desktop файлов (ярлыков) в меню
0.3.5: 0.3.5:
* обновлены скрипты установок daobit * обновлены скрипты установок daobit
* добавлен вывод списка программ с возможностью установки из существующего дистрибутива * добавлен вывод списка программ с возможностью установки из существующего дистрибутива

@ -20,3 +20,6 @@ https://github.com/HansKristian-Work/vkd3d-proton
WINETRICKS: WINETRICKS:
https://github.com/Winetricks/winetricks https://github.com/Winetricks/winetricks
WINE-CPCSP_PROXY:
https://github.com/Etersoft/wine-cpcsp_proxy

27
autoinstall/easymnemo Normal file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# info_ru: Удобная программа для создания двухмерных схем и чертежей. Основной акцент сделан на проектировании систем тепло-, водо- и газоснабжения, водоочистки, автоматизированных систем управления технологическими процессами (АСУТП), а также планов эвакуации при пожаре и авариях.
########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_i586"
export WINEPREFIX="easymnemo"
export PROG_NAME="Easymnemo"
export PROG_ICON="easymnemo"
export BASE_PFX="none"
export WH_WINDOWS_VER="10"
export WINEARCH="win32"
export INSTALL_DLL="dotnet35 mdac28 jet40"
AUTOINSTALL_EXE="${WH_TMP_DIR}/Easymnemo.zip"
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/Easymnemo"
AUTOINSTALL_SETUP="${WH_TMP_DIR}/Easymnemo/EasyMnemo.msi"
prepair_wine
if try_download "https://s.siteapi.org/c6e311629e736a8.ru/docs/j3pdl4vxv5wkg0sg0ksks40k8ss0sc" "${AUTOINSTALL_EXE}" ; then
7z x -y "${AUTOINSTALL_EXE}" -o"${AUTOINSTALL_UNPACK}"
try_remove_file "$AUTOINSTALL_EXE"
wine_run_install "${AUTOINSTALL_SETUP}" /q
try_remove_dir "$AUTOINSTALL_UNPACK"
WIN_FILE_EXEC="$DRIVE_C/Program Files/Easymnemo/Easymnemo.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
fi

@ -3,49 +3,45 @@
######################################################################## ########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="scadoffice" export WINEPREFIX="scadoffice"
export BASE_PFX="none" export BASE_PFX="scadaoffice_pfx_x64_v03"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
export WINEARCH="win64" 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" export INSTALL_DLL="dotnet20 dotnet472 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"
ADDONS_PACK="${WH_TMP_DIR}/scadoffice_addons_v01.tar.xz" AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons" SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
OFFICE_EXE="${ADDONS_PATH}/OpenOffice.exe"
OFFICE_PACK="${ADDONS_PATH}/OpenOffice"
AUTOINSTALL_SETUP="${ADDONS_PATH}/OpenOffice/setup.exe"
ADDONS_PATH_REG="${ADDONS_PATH}/REG"
ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64"
ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH"
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_11.exe"
DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
prepair_wine prepair_wine
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
create_new_dir "$DRIVE_C/SDATA"
create_new_dir "$DRIVE_C/SWORK"
wine_run_install "${AUTOINSTALL_EXE}" /auto /hide
# Определение всех программ, значков и исполняемых файлов DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
declare -a PROG_NAME=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
declare -a PROG_ICON=("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") if [[ -n $2 ]] ; then
if [[ ! -d "$DRIVE_C_SCADOFFICE" ]] ; then
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") fatal "Перезапустите скрипт без дополнительных аргументов для установки SCAD Office:
winehelper install scadoffice"
# Цикл для создания десктопных файлов elif [[ ! -f "$2" ]] ; then
for i in "${!PROG_NAME[@]}"; do fatal "Перезапустите скрипт с правильным путем до файла лицензии SCAD Office:
create_desktop "${PROG_NAME[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON[i]}" winehelper install scadoffice \"/путь/до/файла.exe\""
done else
print_info "Устанавливаем файл лицензии $2"
wine_run "$2"
exit 0
fi
fi fi
print_info "Установка дополнительных компонентов..." if [[ $BASE_PFX == "none" ]] ; then
print_info "Установка дополнительных компонентов..."
if try_download "https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v01.tar.xz" "${ADDONS_PACK}" ; then 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}" create_new_dir "${ADDONS_PATH}"
unpack "${ADDONS_PACK}" "${ADDONS_PATH}" unpack "${ADDONS_PACK}" "${ADDONS_PATH}"
7z x -y "${OFFICE_EXE}" -o"${OFFICE_PACK}"
wine_run_install "${AUTOINSTALL_SETUP}" /qn
wine_run regedit "${ADDONS_PATH_REG}"/*.reg wine_run regedit "${ADDONS_PATH_REG}"/*.reg
# Установка ODBC # Установка ODBC
@ -57,12 +53,26 @@ if try_download "https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v01.
# Установка SSH # Установка SSH
cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/" cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/"
export PROG_NAME1="OpenOffice"
export PROG_ICON1="openoffice"
WIN_FILE_EXEC1="$DRIVE_C/Program Files (x86)/OpenOffice 4/program/soffice.exe"
create_desktop "$PROG_NAME1" "$WIN_FILE_EXEC1" "$PROG_ICON1"
try_remove_dir "$ADDONS_PATH" try_remove_dir "$ADDONS_PATH"
try_remove_file "$ADDONS_PACK" try_remove_file "$ADDONS_PACK"
try_remove_file "$AUTOINSTALL_EXE" fi
fi
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
create_new_dir "$DRIVE_C/SDATA"
create_new_dir "$DRIVE_C/SWORK"
wine_run_install "${AUTOINSTALL_EXE}" /auto /hide
try_remove_file "$AUTOINSTALL_EXE"
# Определение всех программ, значков и исполняемых файлов
declare -a PROG_NAME=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
declare -a PROG_ICON=("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[@]}"; do
create_desktop "${PROG_NAME[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON[i]}" "nocopy"
done
fi fi

21
autoinstall/zulugis Normal file

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# info_ru: ZuluGIS 2021 Инженерные расчёты (Полный) 64-бит. Включает ZuluGIS, пакеты расчетов ZuluThermo, ZuluHydro, ZuluDrain, ZuluGaz, ZuluSteam, библиотеки ZuluXTools и ZuluNetTools. Дополнительно в состав пакета входит Microsoft SQL Server Express LocalDB 2012.
########################################################################
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export PROG_NAME="ZuluGIS 2021"
export WINEPREFIX="zulugis"
export PROG_ICON="zulugis"
export WH_WINDOWS_VER="10"
export BASE_PFX="none"
export WINEARCH="win64"
# export INSTALL_DLL="gdiplus"
export AUTOINSTALL_EXE="${WH_TMP_DIR}/Zulu2021_x64_ru.exe"
prepair_wine
if try_download "https://www.politerm.com/download/zulu/Zulu2021_x64_ru.exe" "${AUTOINSTALL_EXE}" ; then
wine_run_install "${AUTOINSTALL_EXE}" /quiet /norestart
try_remove_file "${AUTOINSTALL_EXE}"
WIN_FILE_EXEC="$DRIVE_C/Program Files/ZuluGIS/Zulu.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
fi

@ -22,7 +22,7 @@ windows приложения. Подробнее по ссылке: https://www.
apt-get install {i586-,}{glibc-core,libstdc++6,glibc-pthread,glibc-nss,\ apt-get install {i586-,}{glibc-core,libstdc++6,glibc-pthread,glibc-nss,\
libOSMesa,libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\ libOSMesa,libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\
libgnutls30,libGL,libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,\ libgnutls30,libGL,libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,\
libvulkan1,libcups} winetricks ca-certificates cups-pdf || fatal "Не удалось установить зависимости." libvulkan1,libcups} || fatal "Не удалось установить зависимости."
apt-get install {i586-,}wine apt-get install {i586-,}wine

BIN
image/easymnemo.png Normal file

Binary file not shown.

After

(image error) Size: 6.1 KiB

BIN
image/zulugis.png Normal file

Binary file not shown.

After

(image error) Size: 27 KiB

@ -3,6 +3,7 @@
3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f wine_x_tkg_10-0_i586.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 fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-alt1-i586-spravkibk.tar.xz
e0a84bb4908c3927954d7eef6b8ac7212e442b8c107d000c6890fec340f96183 wine-9.0.14-alt1-amd64.tar.xz
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz 6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
##### DXVK ##### ##### DXVK #####
@ -13,6 +14,9 @@ fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-al
df1a940d2e072a884524f66a16e0f0ef74048bc6a6642b96eb257528a522109f vkd3d-proton-1.1-2602.tar.xz df1a940d2e072a884524f66a16e0f0ef74048bc6a6642b96eb257528a522109f vkd3d-proton-1.1-2602.tar.xz
##### CPCSP_PROXY #####
3153088ff28d6af415c3504a421e5382554dbb305f38d5a87dd84df90d680421 wine-cpcsp_proxy-0.6.1-alt1.tar.xz
##### PREFIX ##### ##### PREFIX #####
0e86cd9958d1bd1bfac99e23165a091a4ea2fa3e693c551f69aabeed5f681fea defpfx_x86_v01.tar.xz 0e86cd9958d1bd1bfac99e23165a091a4ea2fa3e693c551f69aabeed5f681fea defpfx_x86_v01.tar.xz
@ -63,3 +67,9 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
00516ef51079d68ad0f9621c8270e0f86318539b63ebf1085d0faba36896e4ac daobit_pfx_x86_v01.tar.xz 00516ef51079d68ad0f9621c8270e0f86318539b63ebf1085d0faba36896e4ac daobit_pfx_x86_v01.tar.xz
# create with wine_x_tkg_10-0_i586 (universal user: xuser) # create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi # winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
25e277c7afa4a9afc5f013cb05f872c12a7f381c4f0503a423dcacccca9a14c6 scadaoffice_pfx_x64_v03.tar.xz
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
# + addons with ODBC, SSH, *.reg
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz

@ -12,7 +12,11 @@ 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" ;}
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;} print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
fatal () { print_error "$@" ; exit 1 ;} fatal () {
print_error "$@"
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
exit 1
}
##### CHECK VARIABLES ##### ##### CHECK VARIABLES #####
check_variables () { [[ -z ${!1} ]] && export $1="$2" ;} check_variables () { [[ -z ${!1} ]] && export $1="$2" ;}
@ -29,6 +33,9 @@ else
check_variables DEBUG "0" check_variables DEBUG "0"
fi fi
##### WINETRICKS VERSION #####
WINETRICKS_VERSION="20250102"
##### DEFAULT VARIABLES ##### ##### DEFAULT VARIABLES #####
SCRIPT_NAME="$(basename "$0")" SCRIPT_NAME="$(basename "$0")"
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
@ -50,6 +57,11 @@ WH_IMAGE_PATH="$DATA_PATH/image"
WH_DB_DIR="$DATA_PATH/database" 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_WINETRICKS="$DATA_PATH/winetricks_$WINETRICKS_VERSION"
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
WH_MENU_CATEGORY="$HOME/.local/share/desktop-directories/WineHelper.directory"
WH_MENU_CONFIG="$HOME/.config/menus/applications-merged/WineHelper.menu"
# export WINEDLLOVERRIDES=mshtml,mscoree=" # export WINEDLLOVERRIDES=mshtml,mscoree="
@ -59,6 +71,9 @@ check_variables WINEFSYNC "0"
check_variables WINEARCH "win64" # or "win32" 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 CPCSP_PROXY_VER "0.6.1-alt1"
check_variables STAGING_SHARED_MEMORY "1" check_variables STAGING_SHARED_MEMORY "1"
check_variables WINE_LARGE_ADDRESS_AWARE "1" check_variables WINE_LARGE_ADDRESS_AWARE "1"
check_variables WINE_FULLSCREEN_FSR "1" check_variables WINE_FULLSCREEN_FSR "1"
@ -89,25 +104,21 @@ check_variables VKD3D_VER "1.1-2602"
export CLOUD_URL="https://cloud.linux-gaming.ru/portproton" export CLOUD_URL="https://cloud.linux-gaming.ru/portproton"
##### CHECK NOEXEC FOR /HOME ##### ##### CHECK NOEXEC FOR /HOME #####
if grep "/home" /etc/fstab | grep -q "noexec" ; then if mount -l | grep -E "[[:space:]]/home[[:space:]]" | grep -q "noexec" ; then
fatal "/home примонтирован в /etc/fstab с аргументом noexec.\nЗапуск портативной версии wine не возможен из домашнего каталога." fatal "/home примонтирован в /etc/fstab с аргументом noexec.\nЗапуск портативной версии wine не возможен из домашнего каталога."
fi fi
##### ROOT ##### ##### ROOT #####
su_run () { su_run () {
print_info "Для продолжения установки зависимостей введите root пароль..." print_info "Для продолжения установки введите root пароль..."
su - -c "$@" su - -c "$@"
} }
##### CHECK DEPENDENCIES ##### ##### CHECK DEPENDENCIES #####
# yad zenity cups-pdf if ! rpm -q {i586-,}{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,libOSMesa,\
if rpm -q {i586-,}{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,libOSMesa,\
libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,libgnutls30,libGL,\ libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,libgnutls30,libGL,\
libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} \ libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} 1>/dev/null
winetricks ca-certificates cups-pdf 1>/dev/null then
then : # Зависимости установлены. Пропускаем...
else
if su_run "$DATA_PATH/dependencies.sh" if su_run "$DATA_PATH/dependencies.sh"
then print_info "Зависимости успешно установлены. Продолжаем работу $SCRIPT_NAME" then print_info "Зависимости успешно установлены. Продолжаем работу $SCRIPT_NAME"
else fatal "Не удалось установить зависимости. Работа $SCRIPT_NAME прервана." else fatal "Не удалось установить зависимости. Работа $SCRIPT_NAME прервана."
@ -115,15 +126,6 @@ else
fi fi
##### HELPER FUNCTIONS ##### ##### HELPER FUNCTIONS #####
check_command () {
if command -v "$1" &>/dev/null ; then
return 0
else
print_warning "command: $1 - not found!"
return 1
fi
}
add_to_var () { add_to_var () {
if ! echo ${!1} | grep "$2" &>/dev/null if ! echo ${!1} | grep "$2" &>/dev/null
then export $1="${!1} $2" then export $1="${!1} $2"
@ -151,9 +153,9 @@ try_remove_dir () {
} }
try_copy_file () { try_copy_file () {
if [[ ! -f "$1" ]] ; then print_info "file $1 not found for copy" && return 1 if [[ ! -f "$1" ]] ; then print_info "файла $1 не существует для копирования" && return 1
elif [[ -z "$2" ]] ; then print_error "no way to copy file $1" && return 1 elif [[ -z "$2" ]] ; then fatal "нет пути для копирования файла $1"
elif [[ -L "$2" ]] ; then print_warning "$2 is a file with a symbolic link" elif [[ -L "$2" ]] ; then
try_remove_file "$2" try_remove_file "$2"
cp -f "$1" "$2" && return 0 || return 1 cp -f "$1" "$2" && return 0 || return 1
else else
@ -163,24 +165,24 @@ try_copy_file () {
} }
try_copy_dir () { try_copy_dir () {
if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for copy" if [[ ! -d "$1" ]] ; then print_info "каталога $1 не существует для копирования"
elif [[ -z "$2" ]] ; then print_error "no way to copy directory $1" elif [[ -z "$2" ]] ; then fatal "нет пути для копирования каталога $1"
else else
cp -fr "$1" "$2" cp -fr "$1" "$2"
[[ "$?" != 0 ]] && print_error "failed to copy directory $1 to $2" || return 0 [[ "$?" != 0 ]] && print_error "не удалось скопировать каталог $1 в $2" || return 0
fi fi
return 1 return 1
} }
try_force_link_file () { try_force_link_file () {
if [[ ! -f "$1" ]] ; then if [[ ! -f "$1" ]] ; then
print_warning "file not found for link: $1" print_warning "нет файла для создания символьной ссылки: $1"
if [[ -f "$2" ]] ; then if [[ -f "$2" ]] ; then
try_remove_file "$2" try_remove_file "$2"
print_warning "removed old link: $2" print_warning "удаляем символьную ссылку: $2"
fi fi
return 1 return 1
elif [[ -z "$2" ]] ; then print_error "no way to link file $1" && return 1 elif [[ -z "$2" ]] ; then fatal "нет пути для создания символьной ссылки на файл $1"
else else
try_remove_file "$2" try_remove_file "$2"
ln -s -f -r "$1" "$2" ln -s -f -r "$1" "$2"
@ -189,25 +191,12 @@ try_force_link_file () {
return 1 return 1
} }
check_symlink () {
local CHK_SYMLINK_FILE="$(file "$1")"
if [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep -v "broken" | grep "symbolic link to" | awk '{print $1}')" ]] ; then
return 0
elif [[ -n "$(echo "$CHK_SYMLINK_FILE" | grep "broken symbolic link to" | awk '{print $1}')" ]] ; then
print_error "remove broken symlink: $CHK_SYMLINK_FILE"
rm -fr "$CHK_SYMLINK_FILE"
return 1
else
return 1
fi
}
try_force_link_dir () { try_force_link_dir () {
if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for link" if [[ ! -d "$1" ]] ; then print_info "каталога $1 не существует для создания символьной сссылки"
elif [[ -z "$2" ]] ; then print_error "no way to link directory $1" elif [[ -z "$2" ]] ; then fatal "не указан путь для создания символьной ссылки на каталог $1"
else else
ln -s -f -r "$1" "$2" ln -s -f -r "$1" "$2"
[[ "$?" != 0 ]] && print_error "failed to link directory $1 to $2" || return 0 [[ "$?" != 0 ]] && print_error "не удалось сделать символьную ссылку на каталог $1 по пути $2" || return 0
fi fi
return 1 return 1
} }
@ -307,7 +296,6 @@ try_copy_wine_dll_to_pfx_32() {
fi fi
} }
##### OVERRIDE VARIABLES FUNCTIONS #####
var_winedlloverride_update () { var_winedlloverride_update () {
if [[ -n "${WINEDLLOVERRIDES}" ]] if [[ -n "${WINEDLLOVERRIDES}" ]]
then export WINEDLLOVERRIDES="${1};${WINEDLLOVERRIDES}" then export WINEDLLOVERRIDES="${1};${WINEDLLOVERRIDES}"
@ -315,9 +303,9 @@ var_winedlloverride_update () {
fi fi
} }
var_vkd3d_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}"
else export DXVK_CONFIG="${1}" else export DXVK_CONFIG="${1}"
fi fi
} }
@ -353,10 +341,10 @@ var_ld_library_path_update () {
return 0 return 0
} }
##### CREATE DESKTOP FILE #####
create_desktop () { create_desktop () {
local name_desktop="$1" local name_desktop="$1"
local exe_file="$2" local exe_file="$2"
local desktop_filename="$(basename "$exe_file" .exe | sed "s| |_|")"
local icon_file="$WH_IMAGE_PATH/$3.png" local icon_file="$WH_IMAGE_PATH/$3.png"
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
@ -379,24 +367,78 @@ create_desktop () {
fi fi
fi fi
# создаем .desktop файл
create_new_dir "$WH_MENU_DIR"
[[ ! -f "$icon_file" ]] && icon_file=wine [[ ! -f "$icon_file" ]] && icon_file=wine
{ {
echo "[Desktop Entry]" echo "[Desktop Entry]"
echo "Name=$name_desktop" echo "Name=$name_desktop"
echo "Exec=env \"$RUN_SCRIPT\" \"$exe_file\" %F" echo "Exec=env \"$RUN_SCRIPT\" \"$exe_file\" %F"
echo "Type=Application" echo "Type=Application"
echo "Categories=Other;" echo "Categories=WineHelper;"
echo "StartupNotify=true" echo "StartupNotify=true"
echo "Path=$DATA_PATH" echo "Path=$DATA_PATH"
echo "Icon=$icon_file" echo "Icon=$icon_file"
} > "$USER_WORK_PATH/$name_desktop.desktop" } > "$USER_WORK_PATH/$desktop_filename.desktop"
chmod +x "$USER_WORK_PATH/$name_desktop.desktop" chmod +x "$USER_WORK_PATH/$desktop_filename.desktop"
create_new_dir "$HOME/.local/share/applications/" cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/"
# cp -f "$USER_WORK_PATH/$name_desktop.desktop" "$HOME/.local/share/applications/"
cp -f "$USER_WORK_PATH/$name_desktop.desktop" "$(xdg-user-dir DESKTOP)" # добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
print_info "На рабочем столе создан $name_desktop.desktop" if [[ -f "$WINEPREFIX/desktop.list" ]] \
&& grep -qe "^${name_desktop}=" "$WINEPREFIX/desktop.list"
then sed -i "/^$name_desktop=/d" "$WINEPREFIX/desktop.list"
fi
create_new_dir "$WINEPREFIX/icons"
try_copy_file "$icon_file" "$WINEPREFIX/icons/"
echo "$name_desktop=${exe_file//$WINEPREFIX/}=$(basename "$icon_file")" >> "$WINEPREFIX/desktop.list"
# создаем файл категории для меню
create_new_dir "$HOME/.local/share/desktop-directories"
if [[ ! -f "$WH_MENU_CATEGORY" ]] ; then
cat > "$WH_MENU_CATEGORY" <<EOF
[Desktop Entry]
Type=Directory
Name=WineHelper
Icon=wine
EOF
fi
# Создаем файл меню для всех приложений
create_new_dir "$HOME/.config/menus/applications-merged"
if [[ ! -f "$WH_MENU_CONFIG" ]] ; then
cat > "$WH_MENU_CONFIG" <<EOF
<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
<Menu>
<Name>Applications</Name>
<Menu>
<Name>WineHelper</Name>
<Directory>WineHelper.directory</Directory>
<Include>
<Category>WineHelper</Category>
</Include>
</Menu>
</Menu>
EOF
fi
# Обновляем кэш desktop файлов
update-desktop-database "$HOME/.local/share/applications"
if [[ $4 != "nocopy" ]] ; then
if [[ -n $4 ]] ; then
local desktop_path="$(xdg-user-dir DESKTOP)/$4"
create_new_dir "$desktop_path"
print_info "В меню создан $desktop_filename.desktop и скопирован на рабочий стол в каталог $4"
else
local desktop_path="$(xdg-user-dir DESKTOP)"
print_info "В меню и на рабочем столе создан $desktop_filename.desktop"
fi
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$desktop_path"
else
print_info "В меню создан $desktop_filename.desktop"
fi
if [[ -n "$INSTALL_SCRIPT_NAME" ]] \ if [[ -n "$INSTALL_SCRIPT_NAME" ]] \
&& [[ -f "$exe_file" ]] && [[ -f "$exe_file" ]]
@ -412,16 +454,26 @@ create_desktop () {
fi fi
} }
##### REMOVE DESKTOP FILE #####
remove_desktop () { remove_desktop () {
if [[ -n "$1" ]] ; then if [[ -n "$1" ]] ; then
try_remove_file "$USER_WORK_PATH/$1.desktop" try_remove_file "$USER_WORK_PATH/$1.desktop"
try_remove_file "$WH_MENU_DIR/$1.desktop"
try_remove_file "$HOME/.local/share/applications/$1.desktop" try_remove_file "$HOME/.local/share/applications/$1.desktop"
try_remove_file "$(xdg-user-dir DESKTOP)/$1.desktop" try_remove_file "$(xdg-user-dir DESKTOP)/$1.desktop"
fi fi
# Удаляем категорию если она пуста
if [[ -d "$WH_MENU_DIR" ]] && [[ -z "$(ls -A "$WH_MENU_DIR")" ]]; then
try_remove_dir "$WH_MENU_DIR"
try_remove_file "$WH_MENU_CATEGORY"
try_remove_file "$WH_MENU_CONFIG"
fi
# Обновляем кэш desktop файлов
update-desktop-database "$HOME/.local/share/applications"
} }
##### INSTALLED PROGRAMS #####
check_installed_programs () { check_installed_programs () {
for desktop_file in "$USER_WORK_PATH"/*.desktop ; do for desktop_file in "$USER_WORK_PATH"/*.desktop ; do
if [[ ! -f "$desktop_file" ]] ; then if [[ ! -f "$desktop_file" ]] ; then
@ -460,7 +512,6 @@ run_installed_programs () {
fi fi
} }
##### USED WINED3D LIBRARY #####
init_wined3d () { init_wined3d () {
if [[ "$USE_RENDERER" != "proton" ]] ; then if [[ "$USE_RENDERER" != "proton" ]] ; then
WINED3D_FILES="d3d8 d3d9 d3d10_1 d3d10 d3d10core d3d11 dxgi d3d12 d3d12core" WINED3D_FILES="d3d8 d3d9 d3d10_1 d3d10 d3d10core d3d11 dxgi d3d12 d3d12core"
@ -478,7 +529,6 @@ init_wined3d () {
fi fi
} }
##### CHECK VULKAN LIBRARY #####
init_dxvk () { init_dxvk () {
check_variables USE_DXVK_VER "$1" check_variables USE_DXVK_VER "$1"
@ -546,9 +596,11 @@ init_vkd3d () {
done done
} }
##### DOWNLOAD WINE ##### init_wine_ver () {
download_wine () { if [[ "$WH_WINE_USE" != system* ]] ; then
if [[ ! -d "$WH_DIST_DIR/$WH_WINE_USE" ]] ; then export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE"
if [[ ! -d "$WINEDIR" ]] ; then
WINE_URL="$CLOUD_URL/$WH_WINE_USE.tar.xz" WINE_URL="$CLOUD_URL/$WH_WINE_USE.tar.xz"
local WINE_PACKAGE="$WH_TMP_DIR/${WH_WINE_USE}.tar.xz" local WINE_PACKAGE="$WH_TMP_DIR/${WH_WINE_USE}.tar.xz"
if try_download "$WINE_URL" "$WINE_PACKAGE" check256sum ; then if try_download "$WINE_URL" "$WINE_PACKAGE" check256sum ; then
@ -558,16 +610,6 @@ download_wine () {
fi fi
fi fi
fi fi
}
##### INITIAL WINE SETTINGS #####
init_wine_ver () {
if [[ "$WH_WINE_USE" != system* ]] ; then
export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE"
if [[ ! -d "$WINEDIR" ]] ; then
download_wine
fi
export WINE="${WINEDIR}/bin/wine" export WINE="${WINEDIR}/bin/wine"
export WINELOADER="${WINEDIR}/bin/wine" export WINELOADER="${WINEDIR}/bin/wine"
@ -589,7 +631,14 @@ init_wine_ver () {
export GST_PLUGIN_SYSTEM_PATH_1_0="${WINEDIR}/lib/gstreamer-1.0" export GST_PLUGIN_SYSTEM_PATH_1_0="${WINEDIR}/lib/gstreamer-1.0"
fi fi
if [[ "${WINEARCH}" == "win64" ]] ; then [[ ! -f "${WINEDIR}/version" ]] && echo "${WH_WINE_USE}" > "${WINEDIR}/version"
if [[ ! -d "${WINEDIR}/lib64/wine" ]] && [[ -d "${WINEDIR}/lib/wine/x86_64-unix" ]] ; then
create_new_dir "${WINEDIR}/lib64/"
try_force_link_dir "${WINEDIR}/lib/wine/" "${WINEDIR}/lib64/"
fi
if [[ -d "${WINEDIR}/lib64" ]] ; then
export LD_LIBRARY_PATH+=":${WINEDIR}/lib64" export LD_LIBRARY_PATH+=":${WINEDIR}/lib64"
export WINEDLLPATH+=":${WINEDIR}/lib64/wine" export WINEDLLPATH+=":${WINEDIR}/lib64/wine"
if [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] ; then if [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] ; then
@ -597,12 +646,28 @@ init_wine_ver () {
fi fi
fi fi
[[ ! -f "${WINEDIR}/version" ]] && echo "${WH_WINE_USE}" > "${WINEDIR}/version" if [[ $WH_USE_CPCSP_PROXY == "1" ]] \
&& ! grep -q "$CPCSP_PROXY_VER" "${WINEDIR}/cpcsp_proxy.ver"
then
CPCSP_PROXY_NAME="wine-cpcsp_proxy-$CPCSP_PROXY_VER"
CPCSP_PROXY_URL="$CLOUD_URL/$CPCSP_PROXY_NAME.tar.xz"
if [[ ! -d "${WINEDIR}/lib64/" ]] && [[ -d "${WINEDIR}/lib/wine/x86_64-unix" ]] ; then if [[ ! -f "$WH_TMP_DIR/$CPCSP_PROXY_NAME" ]] ; then
create_new_dir "${WINEDIR}/lib64/wine" print_info "Загрузка $CPCSP_PROXY_NAME.tar.xz"
mv -f "${WINEDIR}/lib/wine/x86_64-unix" "${WINEDIR}/lib64/wine/" if try_download "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum
mv -f "${WINEDIR}/lib/wine/x86_64-windows" "${WINEDIR}/lib64/wine/" then unpack "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" "$WH_TMP_DIR"
else try_remove_file "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz"
fi
else
unpack "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" "$WH_TMP_DIR"
fi
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
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
@ -638,7 +703,6 @@ init_wine_ver () {
print_info "Используется версия wine: $WH_WINE_USE" print_info "Используется версия wine: $WH_WINE_USE"
} }
##### INITIAL WINEPREFIX SETTINGS #####
get_and_set_reg_file () { get_and_set_reg_file () {
convert_dec_and_hex () { convert_dec_and_hex () {
@ -670,14 +734,23 @@ get_and_set_reg_file () {
case $name_type_reg in case $name_type_reg in
REG_DWORD) REG_DWORD)
name_for_find="\"$name_for_find\"=dword:" if [[ $name_for_find != '@=' ]]
then name_for_find="\"$name_for_find\"=dword:"
else name_for_find="@=dword:"
fi
name_for_set=$(convert_dec_and_hex --dec "$name_for_set") ;; name_for_set=$(convert_dec_and_hex --dec "$name_for_set") ;;
REG_SZ) REG_SZ)
name_for_find="\"$name_for_find\"=" if [[ $name_for_find != '@=' ]]
then name_for_find="\"$name_for_find\"="
else name_for_find="@="
fi
name_for_set="\"$name_for_set\"" ;; name_for_set="\"$name_for_set\"" ;;
*) *)
if [[ $name_add_or_del == --delete ]] ; then if [[ $name_add_or_del == --delete ]] ; then
name_for_find="\"$name_for_find\"" if [[ $name_for_find != '@=' ]]
then name_for_find="\"$name_for_find\""
else name_for_find="@="
fi
else else
print_error "не задан тип ветки реестра: $name_fatal" print_error "не задан тип ветки реестра: $name_fatal"
return 1 return 1
@ -725,24 +798,20 @@ get_and_set_reg_file () {
fi fi
fi fi
if [[ $find_check_file == 1 ]] ; then if [[ $find_check_file == 1 ]] ; then
print_info "Меняем $name_for_find_old в файле реестра" print_info "Меняем $name_for_find_old в ветке реестра: $name_block"
sed -i "${find_number_line}s|$name_for_find.*|$name_for_find$name_for_set|" "$find_file" sed -i "${find_number_line}s|$name_for_find.*|$name_for_find$name_for_set|" "$find_file"
else else
print_info "Добавляем $name_for_find_old в файл реестра" print_info "Добавляем $name_for_find_old в ветку реестра: $name_block"
sed -i "$(( find_line + 1 ))a$name_for_find$name_for_set" "$find_file" sed -i "$(( find_line + 1 ))a$name_for_find$name_for_set" "$find_file"
fi fi
elif [[ $name_add_or_del == --delete ]] ; then elif [[ $name_add_or_del == --delete ]] ; then
[[ $find_check_file != 1 ]] && return 0 [[ $find_check_file != 1 ]] && return 0
print_info "Удаляем $name_for_find_old из файла реестра" print_info "Удаляем $name_for_find_old из ветки реестра: $name_block"
sed -i "${find_number_line}d" "$find_file" sed -i "${find_number_line}d" "$find_file"
fi fi
} }
wait_wineserver () { wait_wineserver () {
# while [[ -n "$(ls -l /proc/*/exe 2>/dev/null | grep -ie portproton | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}')" ]] ; do
# sleep 1
# done
"$WINESERVER" -w "$WINESERVER" -w
} }
@ -766,18 +835,46 @@ get_base_pfx () {
fi fi
} }
init_wineprefix () { check_prefix_var () {
if [[ -z "$WINEPREFIX" ]] ; then if [[ -z "$WINEPREFIX" ]] ; then
print_warning "Префикс не выбран, используйте пееременную: WINEPREFIX=имя_префикса" print_warning "Префикс не выбран."
print_info "Список существующих префиксов:"
ls -1 "$WH_PREFIXES_DIR" local prefixes=()
echo local count=1
exit 1 print_info "Доступные префиксы WineHelper:"
for prefix in "$WH_PREFIXES_DIR"/*; do
if [[ -d "$prefix" ]]; then
prefixes+=("$prefix")
echo "$count. $(basename "$prefix")"
((count++))
fi
done
if [[ ${#prefixes[@]} -eq 0 ]]; then
fatal "Не найдено ни одного префикса!"
fi
local max_choice=${#prefixes[@]}
read -p "Выберите префикс (1-$max_choice): " choice
if [[ "$choice" -ge 1 && "$choice" -le "$max_choice" ]]; then
export WINEPREFIX="${prefixes[$choice-1]}"
else else
if echo "$WINEPREFIX" | grep -v '/' ; then fatal "Неверный выбор."
fi
print_info "Выбран префикс: $WINEPREFIX"
fi
if echo "$WINEPREFIX" | grep -qv '/' ; then
export WINEPREFIX="$WH_PREFIXES_DIR/$WINEPREFIX" export WINEPREFIX="$WH_PREFIXES_DIR/$WINEPREFIX"
fi fi
fi
return 0
}
init_wineprefix () {
check_prefix_var
if [[ "$WINEARCH" == "win32" ]] if [[ "$WINEARCH" == "win32" ]]
then check_variables BASE_PFX "defpfx_x86_v01" then check_variables BASE_PFX "defpfx_x86_v01"
@ -795,8 +892,8 @@ init_wineprefix () {
fi fi
print_info "Обновление префикса $WINEPREFIX." print_info "Обновление префикса $WINEPREFIX."
if [[ -d "$WINEPREFIX/drive_c/windows" ]] if [[ -d "$WINEPREFIX/drive_c/windows" ]]
then env WINEDLLOVERRIDES="winegstreamer=" "$WINELOADER" wineboot -u then "$WINELOADER" wineboot -u
else env WINEDLLOVERRIDES="winegstreamer=" "$WINELOADER" wineboot -i else "$WINELOADER" wineboot -i
fi fi
touch "$WINEPREFIX/.firstboot" touch "$WINEPREFIX/.firstboot"
wait_wineserver wait_wineserver
@ -809,7 +906,7 @@ init_wineprefix () {
&& [[ "$WINEARCH" != "win32" ]] && [[ "$WINEARCH" != "win32" ]]
then export WH_WINDOWS_VER="xp64" then export WH_WINDOWS_VER="xp64"
fi fi
env WINEDLLOVERRIDES="winegstreamer=" "$WINELOADER" winecfg -v $(echo "win${WH_WINDOWS_VER}" | sed 's/.*/\L&/') "$WINELOADER" winecfg -v $(echo "win${WH_WINDOWS_VER}" | sed 's/.*/\L&/')
wait_wineserver wait_wineserver
print_info "Windows версия изменена на win${WH_WINDOWS_VER}" print_info "Windows версия изменена на win${WH_WINDOWS_VER}"
fi fi
@ -835,9 +932,90 @@ init_wineprefix () {
get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXRandR' get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXRandR'
get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXVidMode' get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXVidMode'
fi fi
# добавление ассоциаций файлов для запуска нативного приложения из wine
# пример переменной: WH_XDG_OPEN="txt doc pdf"
check_variables WH_XDG_OPEN "0"
local WRAPPER="${WH_TMP_DIR}/wh-xdg-open.sh"
local XDG_OPEN_REG="Software\Classes\xdg-open\shell\open\command"
if [[ $WH_XDG_OPEN != "0" ]] ; then
# проверяем на наличие запрещённых расширений
local forbidden_extensions="cpl dll exe lnk msi"
for ext in $WH_XDG_OPEN; do
if [[ "$forbidden_extensions" =~ $ext ]] ; then
fatal "Расширение .$ext запрещено для добавления!"
fi
done
# создаем скрипт-обёртку
{
echo "#!/usr/bin/env bash"
echo "unix_path=\$(\"$WINELOADER\" winepath -u \"\$*\")"
echo "xdg-open \"\$unix_path\""
} > "$WRAPPER"
chmod +x "$WRAPPER"
# добавляем новую команду xdg-open в реестр
get_and_set_reg_file --add "$XDG_OPEN_REG" '@=' 'REG_SZ' "$WRAPPER %1" "system"
# добавляем ассоциации файлов для запуска с помощью xdg-open
for ext in $WH_XDG_OPEN ; do
get_and_set_reg_file --add "Software\Classes\.$ext" '@=' 'REG_SZ' "xdg-open" "system"
done
print_info "Используется ассоциации с нативными приложениями для файлов: \"$WH_XDG_OPEN\""
else
# удаление команды xdg-open из реестра
get_and_set_reg_file --delete "$XDG_OPEN_REG" '@='
# удаяем скрипт-обёртку
try_remove_file "$WRAPPER"
fi
# настраиваем префикс для работы с cpcsp_proxy
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"
try_copy_wine_dll_to_pfx_32 "$cpcsp_proxy_file"
done
if ! grep -q "cpcsp_proxy.dll" "$WINEPREFIX/system.reg" ; then
if [[ "$WINEARCH" == "win32" ]]
then cpcsp_proxy_cmd=("$WINELOADER" "cpcsp_proxy_setup.exe")
else cpcsp_proxy_cmd=("${WINELOADER}64" "cpcsp_proxy_setup.exe")
fi
print_info "Запускаем настройку cpcsp_proxy..."
unset CPCSP_PROXY_OK
set -o pipefail
for ((i=2; i < 6; i++)) ; do
"${cpcsp_proxy_cmd[@]}" | tee "$WINEPREFIX/cpcsp_setup.log"
local CPCSP_EXIT_STATUS="${PIPESTATUS[0]}"
if grep -q "failed to load /opt/cprocsp/" "$WINEPREFIX/cpcsp_setup.log" ; then
fatal "Проверьте правильность установки CryptoPro в системе.\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"
[[ $CPCSP_PROXY_OK != "1" ]] && fatal "Ошибка во время настройки cpcsp_proxy."
fi
fi
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
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 \
WINE_CPU_TOPOLOGY USE_RENDERER DXVK_VER VKD3D_VER
do
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
done
} }
##### KILL AUTOSTART AFTER INSTALLING #####
kill_autostart () { kill_autostart () {
[[ -z "${1}" ]] && fatal "Нет аргумента для функции kill_autostart." [[ -z "${1}" ]] && fatal "Нет аргумента для функции kill_autostart."
[[ -z "${2}" ]] && SWAIT=3 || SWAIT="${2}" [[ -z "${2}" ]] && SWAIT=3 || SWAIT="${2}"
@ -854,25 +1032,6 @@ kill_autostart () {
done done
} }
update_winetricks () {
W_TRX_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"
W_TRX_EXT_VER="$(curl -s --list-only "$W_TRX_URL" | grep -i 'WINETRICKS_VERSION=' | sed 's/WINETRICKS_VERSION=//')"
print_info "Актуальная версия winetricks: $W_TRX_EXT_VER"
if [[ -f "$WH_TMP_DIR/winetricks" ]] ; then
W_TRX_INT_VER="$(cat "$WH_TMP_DIR/winetricks" | grep -i 'WINETRICKS_VERSION=' | sed 's/WINETRICKS_VERSION=//')"
print_info "Установленная портативная версия winetricks: $W_TRX_INT_VER"
fi
if [[ -n "$W_TRX_EXT_VER" ]] && [[ "$W_TRX_INT_VER" != "$W_TRX_EXT_VER" ]] ; then
if try_download "$W_TRX_URL" "$WH_TMP_DIR/winetricks_new" ; then
mv -f "$WH_TMP_DIR/winetricks_new" "$WH_TMP_DIR/winetricks"
W_TRX_INT_VER="$(cat "$WH_TMP_DIR/winetricks" | grep -i 'WINETRICKS_VERSION=' | sed 's/_VERSION=//')"
print_info "Портативная версия winetricks обновлена до (${W_TRX_INT_VER})"
chmod u+x "$WH_TMP_DIR/winetricks"
fi
fi
export WINETRICKS="$WH_TMP_DIR/winetricks"
}
use_winetricks () { use_winetricks () {
if [[ -n "$INSTALL_DLL" ]] ; then if [[ -n "$INSTALL_DLL" ]] ; then
WH_DLL_INSTALL="$(echo "$INSTALL_DLL $WH_DLL_INSTALL" | awk '{ for(i=1;i<=NF;i++){a[$i]++} }END{ for(i in a){printf("%s ",i)} }' )" WH_DLL_INSTALL="$(echo "$INSTALL_DLL $WH_DLL_INSTALL" | awk '{ for(i=1;i<=NF;i++){a[$i]++} }END{ for(i in a){printf("%s ",i)} }' )"
@ -882,10 +1041,6 @@ use_winetricks () {
USE_WT_FROM_DB=0 USE_WT_FROM_DB=0
[[ ! -f "$WINEPREFIX/winetricks.log" ]] && touch "$WINEPREFIX/winetricks.log" [[ ! -f "$WINEPREFIX/winetricks.log" ]] && touch "$WINEPREFIX/winetricks.log"
for need_install_dll_to_pfx in $WH_DLL_INSTALL "isolate_home" ; do for need_install_dll_to_pfx in $WH_DLL_INSTALL "isolate_home" ; do
if [[ "$need_install_dll_to_pfx" == vcrun201[5-9] ]] ; then
sed -i "/${need_install_dll_to_pfx}/d" "$WINEPREFIX/winetricks.log"
need_install_dll_to_pfx="vcrun2022"
fi
if ! grep "$need_install_dll_to_pfx" "$WINEPREFIX/winetricks.log" &>/dev/null ; then if ! grep "$need_install_dll_to_pfx" "$WINEPREFIX/winetricks.log" &>/dev/null ; then
if [[ -z "$WH_DLL_NEED_INSTALL" ]] if [[ -z "$WH_DLL_NEED_INSTALL" ]]
then WH_DLL_NEED_INSTALL="$need_install_dll_to_pfx" then WH_DLL_NEED_INSTALL="$need_install_dll_to_pfx"
@ -895,15 +1050,13 @@ use_winetricks () {
fi fi
done done
if [[ "$USE_WT_FROM_DB" == "1" ]] ; then if [[ "$USE_WT_FROM_DB" == "1" ]] ; then
if update_winetricks ; then print_info "Пробуем установить компоненты: ${WH_DLL_NEED_INSTALL}"
print_info "Пробуем установить библиотеки: ${WH_DLL_NEED_INSTALL}"
print_info "Запускаем WINETRICKS..." print_info "Запускаем WINETRICKS..."
export WINETRICKS_DOWNLOADER="curl" export WINETRICKS_DOWNLOADER="curl"
env WINEDLLOVERRIDES="winegstreamer=" "$WH_TMP_DIR/winetricks" -q ${WH_DLL_NEED_INSTALL} "$WH_WINETRICKS" -q ${WH_DLL_NEED_INSTALL}
wait_wineserver wait_wineserver
fi fi
fi fi
fi
} }
kill_wine () { kill_wine () {
@ -917,29 +1070,30 @@ kill_wine () {
} }
init_database () { init_database () {
WHDB_FILE="0"
if [[ -f "$WIN_FILE_EXEC" ]] ; then if [[ -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" orig_IFS="$IFS" && IFS=$'\n'
IFS=$'\n' if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )"
if [[ $(echo "$WH_FIND_DB_FILE" | wc -l) -gt 1 ]] ; then
print_error "Найдено более одного файла настроек: $WHDB.exe"
WHDB_FILE="$(echo "$WH_FIND_DB_FILE" | head -n1)"
else
WHDB_FILE="$WH_FIND_DB_FILE" WHDB_FILE="$WH_FIND_DB_FILE"
fi fi
IFS="$orig_IFS" IFS="$orig_IFS"
fi fi
if [[ "$WHDB_FILE" ]] ; then fi
if [[ "$WHDB_FILE" != "0" ]] ; then
print_info "Используется файл настроек: $WHDB_FILE" print_info "Используется файл настроек: $WHDB_FILE"
. "$WHDB_FILE" . "$WHDB_FILE"
elif check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
print_info "Найдены настройки из предыдущего использования префикса: $WINEPREFIX"
cat "$WINEPREFIX/last.conf"
. "$WINEPREFIX/last.conf"
else else
print_warning "Файл настроек не найден. Пропускаем." print_warning "Файл настроек не найден. Пропускаем."
fi fi
fi
} }
prepair_wine () { prepair_wine () {
@ -964,7 +1118,10 @@ prepair_wine () {
var_winedlloverride_update "winemenubuilder.exe=d" var_winedlloverride_update "winemenubuilder.exe=d"
init_database if [[ -n "$INSTALL_SCRIPT_NAME" ]]
then print_info "Используются настройки из скрипта установки: $INSTALL_SCRIPT_NAME"
else init_database
fi
init_wine_ver init_wine_ver
init_wineprefix init_wineprefix
use_winetricks use_winetricks
@ -1052,6 +1209,113 @@ run_autoinstall () {
echo echo
} }
remove_prefix() {
local prefix_name="$1"
local prefix_path="$WH_PREFIXES_DIR/$prefix_name"
if [[ -z "$prefix_name" ]]; then
print_error "Не указано имя префикса для удаления."
echo "Использование: $SCRIPT_NAME remove-prefix [имя_префикса]"
echo "Доступные префиксы:"
ls -1 "$WH_PREFIXES_DIR"
return 1
fi
if [[ ! -d "$prefix_path" ]]; then
print_error "Префикс "$prefix_name" не найден."
return 1
fi
if [[ ! $2 =~ --force|-y ]] ; then
echo "======================================================"
print_warning "Вы собираетесь удалить префикс "$prefix_name"."
echo "Это приведёт к:"
echo " - Полному удалению всех данных префикса"
echo " - Удалению всех программ, установленных в этом префиксе"
echo " - Удалению связанных ярлыков из меню и рабочего стола"
echo "======================================================"
read -p "Продолжить удаление? (y/N): " answer
if [[ ! "$answer" =~ ^[YyДд]$ ]]; then
print_info "Удаление префикса отменено."
return 0
fi
fi
try_remove_dir "$prefix_path"
if [[ $? -eq 0 ]]; then
print_ok "Префикс "$prefix_name" успешно удален."
for desktop_file in "$WH_MENU_DIR"/*.desktop; do
if grep -q "$prefix_path" "$desktop_file"; then
desktop_name=$(basename "$desktop_file")
remove_desktop "${desktop_name%.*}"
fi
done
return 0
else
print_error "Не удалось удалить префикс "$prefix_name"."
return 1
fi
}
remove_winehelper () {
local answer
if [[ $1 =~ --force|-y ]] ; then
answer="y"
else
echo "======================================================"
print_warning "Вы собираетесь удалить WineHelper и все связанные с ним данные."
echo " Это удалит:"
echo " - Все настройки WineHelper"
echo " - Все приложения/программы, установленные через WineHelper"
echo " - Все ярлыки из меню и с рабочего стола созданные с помощью WineHelper"
echo "======================================================"
echo "Продолжить? (y/N)"
read -r answer
if [[ "$answer" =~ ^[YyДд]$ ]] ; then
# Второе подтверждение
echo "----------------------------------------------"
print_warning " ВЫ ТОЧНО УВЕРЕНЫ?"
echo "----------------------------------------------"
echo "Продолжить? (y/N)"
read -r answer
else
print_info "Удаление отменено."
return 1
fi
fi
if [[ "$answer" =~ ^[YyДд]$ ]] ; then
# Удаление рабочих каталогов
try_remove_dir "$USER_WORK_PATH"
# Удаление файлов меню
try_remove_dir "$WH_MENU_DIR"
try_remove_file "$WH_MENU_CATEGORY"
try_remove_file "$WH_MENU_CONFIG"
# Удаление desktop-файлов
for desktop_file in "$(xdg-user-dir DESKTOP)"/*.desktop; do
if grep -q "Exec=env \"$RUN_SCRIPT\"" "$desktop_file"; then
try_remove_file "$desktop_file"
fi
done
# Обновление кэша desktop-файлов
update-desktop-database "$HOME/.local/share/applications"
# Удаление символических ссылок
try_remove_file "$HOME/.winehelper"
print_info "WineHelper и все связанные данные успешно удалены."
else
print_info "Удаление отменено."
fi
}
wh_info () { wh_info () {
echo "Использование: $SCRIPT_NAME [команда] echo "Использование: $SCRIPT_NAME [команда]
@ -1062,6 +1326,8 @@ wh_info () {
installed список установленных программ installed список установленных программ
run [программа.exe] запуск программы (отладка) run [программа.exe] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
remove-prefix [имя_префикса] удалить префикс и все связанные данные
Параметры: Параметры:
--help показать эту справку и выйти --help показать эту справку и выйти
@ -1090,11 +1356,13 @@ case "${1,,}" in
winereg|regedit) prepair_wine ; wine_run "regedit" ;; winereg|regedit) prepair_wine ; wine_run "regedit" ;;
winefile|explorer) prepair_wine ; wine_run "winefile" ;; winefile|explorer) prepair_wine ; wine_run "winefile" ;;
wineconsole|cmd) prepair_wine ; wine_run "wineconsole" ;; wineconsole|cmd) prepair_wine ; wine_run "wineconsole" ;;
winetricks) shift ; update_winetricks ; prepair_wine ; "$WINETRICKS" -q "$@" ;; winetricks) shift ; prepair_wine ; "$WINETRICKS" -q "$@" ;;
desktop) shift ; create_desktop "$@" ; exit 0 ;; desktop) shift ; create_desktop "$@" ; exit 0 ;;
install|-i) shift ; run_autoinstall "$@" ;; install|-i) shift ; run_autoinstall "$@" ;;
installed) shift ; check_installed_programs "$1" ;; installed) shift ; check_installed_programs "$1" ;;
run|-r) shift ; run_installed_programs "$1" ;; run|-r) shift ; run_installed_programs "$1" ;;
remove-all) shift ; remove_winehelper "$@" ;;
remove-prefix) shift ; remove_prefix "$@" ;;
*) *)
if [[ -f "$1" ]] ; then if [[ -f "$1" ]] ; then
WIN_FILE_EXEC="$(readlink -f "$1")" WIN_FILE_EXEC="$(readlink -f "$1")"

19204
winetricks_20250102 Executable file

File diff suppressed because it is too large Load Diff