Compare commits
	
		
			30 Commits
		
	
	
		
			0.3.7
			...
			0ee9b42d1f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 0ee9b42d1f | ||
|  | 98902bd8f2 | ||
|  | 17afd90e93 | ||
|  | 19af68332b | ||
|  | a2a63cf1ff | ||
|  | 858507fc8d | ||
|  | 68870f8307 | ||
|  | 8f6300c6b8 | ||
|  | ed8d28c81f | ||
|  | bd482ea757 | ||
|  | 8cc9cb17bb | ||
|  | b29e586137 | ||
|  | ace00616ca | ||
|  | 5b6a05a09e | ||
|  | 3be6b8c4a1 | ||
|  | b684afe1ad | ||
|  | bda5a31205 | ||
|  | e55bc209c1 | ||
|  | 33f12d5287 | ||
|  | bb0ec33202 | ||
|  | a4998d2f26 | ||
|  | ca9e1d7f75 | ||
|  | b4d36b15e8 | ||
|  | 717e6c0e7d | ||
|  | 3ea9462025 | ||
|  | 8774a8b34d | ||
|  | 052a07a42b | ||
|  | 112933c7b1 | ||
|  | de34f84e04 | ||
|  | 4310fe1e8c | 
							
								
								
									
										19
									
								
								CHANGELOG
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								CHANGELOG
									
									
									
									
									
								
							| @@ -1,5 +1,24 @@ | ||||
| История изменений: | ||||
|  | ||||
| 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 | ||||
|   | ||||
| @@ -20,3 +20,6 @@ https://github.com/HansKristian-Work/vkd3d-proton | ||||
|  | ||||
| WINETRICKS: | ||||
| https://github.com/Winetricks/winetricks | ||||
|  | ||||
| WINE-CPCSP_PROXY: | ||||
| https://github.com/Etersoft/wine-cpcsp_proxy | ||||
|   | ||||
							
								
								
									
										27
									
								
								autoinstall/easymnemo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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,13 +3,16 @@ | ||||
| ######################################################################## | ||||
| export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||
| export WINEPREFIX="scadoffice" | ||||
| export BASE_PFX="scadaoffice_pfx_x64_v01" | ||||
| export BASE_PFX="scadaoffice_pfx_x64_v03" | ||||
| 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 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" | ||||
| 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 | ||||
| @@ -29,21 +32,16 @@ fi | ||||
| if [[ $BASE_PFX == "none" ]] ; then | ||||
|     print_info "Установка дополнительных компонентов..." | ||||
|  | ||||
|     ADDONS_PACK="${WH_TMP_DIR}/scadoffice_addons_v01.tar.xz" | ||||
|     ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")" | ||||
|     ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons" | ||||
|     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" | ||||
|  | ||||
|     if try_download "https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v01.tar.xz" "${ADDONS_PACK}" ; then | ||||
|     if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then | ||||
|         create_new_dir "${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 | ||||
|  | ||||
|         # Установка ODBC | ||||
| @@ -73,12 +71,8 @@ if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; t | ||||
|  | ||||
|     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 в каталог SCADOFFICE на рабочемм столе | ||||
|     # Цикл создания десктоп файлов для scad office | ||||
|     for i in "${!PROG_NAME[@]}"; do | ||||
|         create_desktop "${PROG_NAME[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON[i]}" "nocopy" | ||||
|     done | ||||
|  | ||||
|     # Cоздание десктоп файла для openoffice | ||||
|     WIN_FILE_EXEC1="$DRIVE_C/Program Files (x86)/OpenOffice 4/program/soffice.exe" | ||||
|     create_desktop "OpenOffice" "$WIN_FILE_EXEC1" "openoffice" "nocopy" | ||||
| fi | ||||
|   | ||||
| @@ -22,7 +22,7 @@ windows приложения. Подробнее по ссылке: https://www. | ||||
| apt-get install {i586-,}{glibc-core,libstdc++6,glibc-pthread,glibc-nss,\ | ||||
| libOSMesa,libnss-mdns,libunixODBC2,ocl-icd,libfreetype,libfontconfig1,\ | ||||
| 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 | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								image/easymnemo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								image/easymnemo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.1 KiB | 
| @@ -3,6 +3,7 @@ | ||||
| 3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f  wine_x_tkg_10-0_i586.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 | ||||
| 6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79  wine-9.0.9-alt1-i586.tar.xz | ||||
|  | ||||
| ##### DXVK ##### | ||||
| @@ -13,6 +14,9 @@ fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193  wine-9.0.14-al | ||||
|  | ||||
| df1a940d2e072a884524f66a16e0f0ef74048bc6a6642b96eb257528a522109f  vkd3d-proton-1.1-2602.tar.xz | ||||
|  | ||||
| ##### CPCSP_PROXY ##### | ||||
| 3153088ff28d6af415c3504a421e5382554dbb305f38d5a87dd84df90d680421  wine-cpcsp_proxy-0.6.1-alt1.tar.xz | ||||
|  | ||||
| ##### PREFIX ##### | ||||
|  | ||||
| 0e86cd9958d1bd1bfac99e23165a091a4ea2fa3e693c551f69aabeed5f681fea  defpfx_x86_v01.tar.xz | ||||
| @@ -64,7 +68,8 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e  audiorecstatio | ||||
| # create with wine_x_tkg_10-0_i586 (universal user: xuser) | ||||
| # winetricks arial dotnet7 dotnetdesktop7 renderer=gdi | ||||
|  | ||||
| daaaef625f8f44688faf12f9ef4360ad1d35b377b23be634b45c1b8d43239686  scadaoffice_pfx_x64_v01.tar.xz | ||||
| 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 openoffice, ODBC, SSH, *.reg | ||||
| # + addons with ODBC, SSH, *.reg | ||||
| 0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb  scadoffice_addons_v02.tar.xz | ||||
|   | ||||
							
								
								
									
										516
									
								
								winehelper
									
									
									
									
									
								
							
							
						
						
									
										516
									
								
								winehelper
									
									
									
									
									
								
							| @@ -12,23 +12,46 @@ print_warning () { printf "\E[33m%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_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 () { [[ -z ${!1} ]] && export $1="$2" ;} | ||||
|  | ||||
| ##### CHECK DEBUG ##### | ||||
| if [[ "$1" == "--debug" ]] ; then | ||||
|     export DEBUG="full" | ||||
|     export LOG_FILE="$HOME/winehelper.log" | ||||
|     check_variables WINEDEBUG "+loaddll,+seh" | ||||
|     export DXVK_LOG_LEVEL="error" | ||||
|     export VKD3D_DEBUG "error" | ||||
|     export WINE_MONO_TRACE "E:System.NotImplementedException" | ||||
|     export VK_LOADER_DEBUG "error" | ||||
|     export VKBASALT_LOG_LEVEL "error" | ||||
|     export DXVK_NVAPI_LOG_LEVEL "error" | ||||
|     shift | ||||
|     print_warning "Включен режим подробного логирования работы WINE." | ||||
| else | ||||
|     check_variables WINEDEBUG "-all" | ||||
|     check_variables DXVK_LOG_LEVEL "none" | ||||
|     check_variables VKD3D_SHADER_DEBUG "none" | ||||
|     check_variables VKD3D_DEBUG "none" | ||||
|     check_variables DXVK_LOG_PATH "none" | ||||
|     check_variables VKBASALT_LOG_LEVEL "none" | ||||
|     check_variables DXVK_NVAPI_LOG_LEVEL "none" | ||||
| fi | ||||
|  | ||||
| if [[ $WINEDEBUG != "-all" ]] ; then | ||||
|     export LOG_FILE="$HOME/winehelper.log" | ||||
|     date > "$LOG_FILE" | ||||
|     print_warning "Включен режим логирования работы WINE." | ||||
|     print_warning "Лог будет сохранен по пути: $LOG_FILE" | ||||
|     sleep 3 | ||||
| else | ||||
|     check_variables DEBUG "0" | ||||
| fi | ||||
|  | ||||
| ##### WINETRICKS VERSION ##### | ||||
| WINETRICKS_VERSION="20250102" | ||||
|  | ||||
| ##### DEFAULT VARIABLES ##### | ||||
| SCRIPT_NAME="$(basename "$0")" | ||||
| if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then | ||||
| @@ -50,6 +73,7 @@ WH_IMAGE_PATH="$DATA_PATH/image" | ||||
| WH_DB_DIR="$DATA_PATH/database" | ||||
| WH_AUTOINSTALL_DIR="$DATA_PATH/autoinstall" | ||||
| 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" | ||||
| @@ -63,6 +87,9 @@ check_variables WINEFSYNC "0" | ||||
| check_variables WINEARCH "win64" # or "win32" | ||||
| 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 WINE_LARGE_ADDRESS_AWARE "1" | ||||
| check_variables WINE_FULLSCREEN_FSR "1" | ||||
| @@ -93,25 +120,21 @@ check_variables VKD3D_VER "1.1-2602" | ||||
| export CLOUD_URL="https://cloud.linux-gaming.ru/portproton" | ||||
|  | ||||
| ##### CHECK NOEXEC FOR /HOME ##### | ||||
| if grep -E "/home[[:space:]]" /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 не возможен из домашнего каталога." | ||||
| fi | ||||
|  | ||||
| ##### ROOT ##### | ||||
| su_run () { | ||||
|     print_info "Для продолжения установки зависимостей введите root пароль..." | ||||
|     print_info "Для продолжения установки введите root пароль..." | ||||
|     su - -c "$@" | ||||
| } | ||||
|  | ||||
| ##### 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,\ | ||||
| libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} \ | ||||
| winetricks ca-certificates cups-pdf 1>/dev/null | ||||
| then : # Зависимости установлены. Пропускаем... | ||||
| else | ||||
| libEGL,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon,libvulkan1,libcups} 1>/dev/null | ||||
| then | ||||
|     if su_run "$DATA_PATH/dependencies.sh" | ||||
|     then print_info "Зависимости успешно установлены. Продолжаем работу $SCRIPT_NAME" | ||||
|     else fatal "Не удалось установить зависимости. Работа $SCRIPT_NAME прервана." | ||||
| @@ -119,15 +142,6 @@ else | ||||
| fi | ||||
|  | ||||
| ##### 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 () { | ||||
|     if ! echo ${!1} | grep "$2" &>/dev/null | ||||
|     then export $1="${!1} $2" | ||||
| @@ -155,9 +169,9 @@ try_remove_dir () { | ||||
| } | ||||
|  | ||||
| try_copy_file () { | ||||
|     if [[ ! -f "$1" ]] ; then print_info "file $1 not found for copy" && return 1 | ||||
|     elif [[ -z "$2" ]] ; then print_error "no way to copy file $1" && return 1 | ||||
|     elif [[ -L "$2" ]] ; then print_warning "$2 is a file with a symbolic link" | ||||
|     if [[ ! -f "$1" ]] ; then print_info "файла $1 не существует для копирования" && return 1 | ||||
|     elif [[ -z "$2" ]] ; then fatal "нет пути для копирования файла $1" | ||||
|     elif [[ -L "$2" ]] ; then | ||||
|         try_remove_file "$2" | ||||
|         cp -f "$1" "$2" && return 0 || return 1 | ||||
|     else | ||||
| @@ -167,24 +181,24 @@ try_copy_file () { | ||||
| } | ||||
|  | ||||
| try_copy_dir () { | ||||
|     if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for copy" | ||||
|     elif [[ -z "$2" ]] ; then print_error "no way to copy directory $1" | ||||
|     if [[ ! -d "$1" ]] ; then print_info "каталога $1 не существует для копирования" | ||||
|     elif [[ -z "$2" ]] ; then fatal "нет пути для копирования каталога $1" | ||||
|     else | ||||
|         cp -fr "$1" "$2" | ||||
|         [[ "$?" != 0 ]] && print_error "failed to copy directory $1 to $2" || return 0 | ||||
|         [[ "$?" != 0 ]] && print_error "не удалось скопировать каталог $1 в $2" || return 0 | ||||
|     fi | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| try_force_link_file () { | ||||
|     if [[ ! -f "$1" ]] ; then | ||||
|         print_warning "file not found for link: $1" | ||||
|         print_warning "нет файла для создания символьной ссылки: $1" | ||||
|         if [[ -f "$2" ]] ; then | ||||
|             try_remove_file "$2" | ||||
|             print_warning "removed old link: $2" | ||||
|             print_warning "удаляем символьную ссылку: $2" | ||||
|         fi | ||||
|         return 1 | ||||
|     elif [[ -z "$2" ]] ; then print_error "no way to link file $1" && return 1 | ||||
|     elif [[ -z "$2" ]] ; then fatal "нет пути для создания символьной ссылки на файл $1" | ||||
|     else | ||||
|         try_remove_file "$2" | ||||
|         ln -s -f -r "$1" "$2" | ||||
| @@ -193,25 +207,12 @@ try_force_link_file () { | ||||
|     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 () { | ||||
|     if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for link" | ||||
|     elif [[ -z "$2" ]] ; then print_error "no way to link directory $1" | ||||
|     if [[ ! -d "$1" ]] ; then print_info "каталога $1 не существует для создания символьной сссылки" | ||||
|     elif [[ -z "$2" ]] ; then fatal "не указан путь для создания символьной ссылки на каталог $1" | ||||
|     else | ||||
|         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 | ||||
|     return 1 | ||||
| } | ||||
| @@ -311,7 +312,6 @@ try_copy_wine_dll_to_pfx_32() { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| ##### OVERRIDE VARIABLES FUNCTIONS ##### | ||||
| var_winedlloverride_update () { | ||||
|     if [[ -n "${WINEDLLOVERRIDES}" ]] | ||||
|     then export WINEDLLOVERRIDES="${1};${WINEDLLOVERRIDES}" | ||||
| @@ -319,9 +319,9 @@ var_winedlloverride_update () { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| var_vkd3d_config_update () { | ||||
| var_dxvk_config_update () { | ||||
|     if [[ -n "${DXVK_CONFIG}" ]] | ||||
|     then export DXVK_CONFIG="${1}; ${DXVK_CONFIG}" | ||||
|     then export DXVK_CONFIG="${1};${DXVK_CONFIG}" | ||||
|     else export DXVK_CONFIG="${1}" | ||||
|     fi | ||||
| } | ||||
| @@ -357,7 +357,6 @@ var_ld_library_path_update () { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| ##### CREATE DESKTOP FILE ##### | ||||
| create_desktop () { | ||||
|     local name_desktop="$1" | ||||
|     local exe_file="$2" | ||||
| @@ -384,11 +383,9 @@ create_desktop () { | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # создаем .desktop файл | ||||
|     create_new_dir "$WH_MENU_DIR" | ||||
|  | ||||
|     [[ ! -f "$icon_file" ]] && icon_file=wine | ||||
|  | ||||
|     # Создаем .desktop файл | ||||
|     { | ||||
|         echo "[Desktop Entry]" | ||||
|         echo "Name=$name_desktop" | ||||
| @@ -403,7 +400,16 @@ create_desktop () { | ||||
|  | ||||
|     cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/" | ||||
|  | ||||
|     # Создаем файл категории для меню | ||||
|     # добавляем информацию о приложении в "$WINEPREFIX/desktop.list" | ||||
|     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 | ||||
| @@ -431,16 +437,10 @@ EOF | ||||
|   </Menu> | ||||
| </Menu> | ||||
| EOF | ||||
|         # Обновляем меню | ||||
|         if check_command update-menus ; then | ||||
|             update-menus | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # Обновляем кэш desktop файлов | ||||
|     if check_command update-desktop-database ; then | ||||
|     update-desktop-database "$HOME/.local/share/applications" | ||||
|     fi | ||||
|  | ||||
|     if [[ $4 != "nocopy" ]] ; then | ||||
|         if [[ -n $4 ]] ; then | ||||
| @@ -470,7 +470,6 @@ EOF | ||||
|     fi | ||||
| } | ||||
|  | ||||
| ##### REMOVE DESKTOP FILE ##### | ||||
| remove_desktop () { | ||||
|     if [[ -n "$1" ]] ; then | ||||
|         try_remove_file "$USER_WORK_PATH/$1.desktop" | ||||
| @@ -484,19 +483,13 @@ remove_desktop () { | ||||
|         try_remove_dir "$WH_MENU_DIR" | ||||
|         try_remove_file "$WH_MENU_CATEGORY" | ||||
|         try_remove_file "$WH_MENU_CONFIG" | ||||
|         # Обновляем меню | ||||
|         if check_command update-menus ; then | ||||
|             update-menus | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # Обновляем кэш desktop файлов | ||||
|     if check_command update-desktop-database ; then | ||||
|     update-desktop-database "$HOME/.local/share/applications" | ||||
|     fi | ||||
|  | ||||
| } | ||||
|  | ||||
| ##### INSTALLED PROGRAMS ##### | ||||
| check_installed_programs () { | ||||
|     for desktop_file in "$USER_WORK_PATH"/*.desktop ; do | ||||
|         if [[ ! -f "$desktop_file" ]] ; then | ||||
| @@ -535,7 +528,6 @@ run_installed_programs () { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| ##### USED WINED3D LIBRARY ##### | ||||
| init_wined3d () { | ||||
|     if [[ "$USE_RENDERER" != "proton" ]] ; then | ||||
|         WINED3D_FILES="d3d8 d3d9 d3d10_1 d3d10 d3d10core d3d11 dxgi d3d12 d3d12core" | ||||
| @@ -553,7 +545,6 @@ init_wined3d () { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| ##### CHECK VULKAN LIBRARY ##### | ||||
| init_dxvk () { | ||||
|     check_variables USE_DXVK_VER "$1" | ||||
|  | ||||
| @@ -621,9 +612,11 @@ init_vkd3d () { | ||||
|     done | ||||
| } | ||||
|  | ||||
| ##### DOWNLOAD WINE ##### | ||||
| download_wine () { | ||||
|     if [[ ! -d "$WH_DIST_DIR/$WH_WINE_USE" ]] ; then | ||||
| init_wine_ver () { | ||||
|     if [[ "$WH_WINE_USE" != system* ]] ; then | ||||
|         export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE" | ||||
|  | ||||
|         if [[ ! -d "$WINEDIR" ]] ; then | ||||
|             WINE_URL="$CLOUD_URL/$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 | ||||
| @@ -633,16 +626,6 @@ download_wine () { | ||||
|                 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 WINELOADER="${WINEDIR}/bin/wine" | ||||
| @@ -664,7 +647,14 @@ init_wine_ver () { | ||||
|             export GST_PLUGIN_SYSTEM_PATH_1_0="${WINEDIR}/lib/gstreamer-1.0" | ||||
|         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 WINEDLLPATH+=":${WINEDIR}/lib64/wine" | ||||
|             if [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] ; then | ||||
| @@ -672,12 +662,28 @@ init_wine_ver () { | ||||
|             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 | ||||
|             create_new_dir "${WINEDIR}/lib64/wine" | ||||
|             mv -f "${WINEDIR}/lib/wine/x86_64-unix" "${WINEDIR}/lib64/wine/" | ||||
|             mv -f "${WINEDIR}/lib/wine/x86_64-windows" "${WINEDIR}/lib64/wine/" | ||||
|             if [[ ! -f "$WH_TMP_DIR/$CPCSP_PROXY_NAME" ]] ; then | ||||
|                 print_info "Загрузка $CPCSP_PROXY_NAME.tar.xz" | ||||
|                 if try_download "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum | ||||
|                 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 | ||||
|     else | ||||
|         # use system WINE | ||||
| @@ -689,31 +695,9 @@ init_wine_ver () { | ||||
|         export WINESERVER="wineserver" | ||||
|     fi | ||||
|  | ||||
|     check_variables DXVK_LOG_LEVEL "none" | ||||
|     check_variables VKD3D_SHADER_DEBUG "none" | ||||
|     check_variables VKD3D_DEBUG "none" | ||||
|     check_variables DXVK_LOG_PATH "none" | ||||
|     check_variables VKBASALT_LOG_LEVEL "none" | ||||
|     check_variables DXVK_NVAPI_LOG_LEVEL "none" | ||||
|  | ||||
|     if [[ $DEBUG == "0" ]] ; then | ||||
|         check_variables WINEDEBUG "-all" | ||||
|     elif [[ $DEBUG == "full" ]] ; then | ||||
|         check_variables WINEDEBUG "+loaddll,+seh" | ||||
|         export DXVK_LOG_LEVEL="error" | ||||
|         export VKD3D_DEBUG "error" | ||||
|         export WINE_MONO_TRACE "E:System.NotImplementedException" | ||||
|         export VK_LOADER_DEBUG "error" | ||||
|         export VKBASALT_LOG_LEVEL "error" | ||||
|         export DXVK_NVAPI_LOG_LEVEL "error" | ||||
|     else | ||||
|         check_variables WINEDEBUG "err+all" | ||||
|     fi | ||||
|  | ||||
|     print_info "Используется версия wine: $WH_WINE_USE" | ||||
| } | ||||
|  | ||||
| ##### INITIAL WINEPREFIX SETTINGS ##### | ||||
| get_and_set_reg_file () { | ||||
|  | ||||
|     convert_dec_and_hex () { | ||||
| @@ -745,14 +729,23 @@ get_and_set_reg_file () { | ||||
|  | ||||
|     case $name_type_reg in | ||||
|         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") ;; | ||||
|         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\"" ;; | ||||
|         *) | ||||
|             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 | ||||
|                 print_error "не задан тип ветки реестра: $name_fatal" | ||||
|                 return 1 | ||||
| @@ -800,24 +793,20 @@ get_and_set_reg_file () { | ||||
|             fi | ||||
|         fi | ||||
|         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" | ||||
|         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" | ||||
|         fi | ||||
|     elif [[ $name_add_or_del == --delete ]] ; then | ||||
|         [[ $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" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| 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 | ||||
| } | ||||
|  | ||||
| @@ -841,18 +830,46 @@ get_base_pfx () { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| init_wineprefix () { | ||||
| check_prefix_var () { | ||||
|     if [[ -z "$WINEPREFIX" ]] ; then | ||||
|         print_warning "Префикс не выбран, используйте пееременную: WINEPREFIX=имя_префикса" | ||||
|         print_info "Список существующих префиксов:" | ||||
|         ls -1 "$WH_PREFIXES_DIR" | ||||
|         echo | ||||
|         exit 1 | ||||
|         print_warning "Префикс не выбран." | ||||
|  | ||||
|         local prefixes=() | ||||
|         local count=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 | ||||
|         if echo "$WINEPREFIX" | grep -v '/' ; then | ||||
|             fatal "Неверный выбор." | ||||
|         fi | ||||
|  | ||||
|         print_info "Выбран префикс: $WINEPREFIX" | ||||
|     fi | ||||
|  | ||||
|     if echo "$WINEPREFIX" | grep -qv '/' ; then | ||||
|         export WINEPREFIX="$WH_PREFIXES_DIR/$WINEPREFIX" | ||||
|     fi | ||||
|     fi | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| init_wineprefix () { | ||||
|     check_prefix_var | ||||
|  | ||||
|     if [[ "$WINEARCH" == "win32" ]] | ||||
|     then check_variables BASE_PFX "defpfx_x86_v01" | ||||
| @@ -870,8 +887,8 @@ init_wineprefix () { | ||||
|         fi | ||||
|         print_info "Обновление префикса $WINEPREFIX." | ||||
|         if [[ -d "$WINEPREFIX/drive_c/windows" ]] | ||||
|         then env WINEDLLOVERRIDES="winegstreamer=" "$WINELOADER" wineboot -u | ||||
|         else env WINEDLLOVERRIDES="winegstreamer=" "$WINELOADER" wineboot -i | ||||
|         then "$WINELOADER" wineboot -u | ||||
|         else "$WINELOADER" wineboot -i | ||||
|         fi | ||||
|         touch "$WINEPREFIX/.firstboot" | ||||
|         wait_wineserver | ||||
| @@ -884,7 +901,7 @@ init_wineprefix () { | ||||
|         && [[ "$WINEARCH" != "win32" ]] | ||||
|         then export WH_WINDOWS_VER="xp64" | ||||
|         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 | ||||
|         print_info "Windows версия изменена на win${WH_WINDOWS_VER}" | ||||
|     fi | ||||
| @@ -910,9 +927,90 @@ init_wineprefix () { | ||||
|         get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXRandR' | ||||
|         get_and_set_reg_file --delete 'Software\Wine\X11 Driver' 'UseXVidMode' | ||||
|     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 () { | ||||
|     [[ -z "${1}" ]] && fatal "Нет аргумента для функции kill_autostart." | ||||
|     [[ -z "${2}" ]] && SWAIT=3 || SWAIT="${2}" | ||||
| @@ -929,25 +1027,6 @@ kill_autostart () { | ||||
|     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 () { | ||||
|     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)} }' )" | ||||
| @@ -957,10 +1036,6 @@ use_winetricks () { | ||||
|         USE_WT_FROM_DB=0 | ||||
|         [[ ! -f "$WINEPREFIX/winetricks.log" ]] && touch "$WINEPREFIX/winetricks.log" | ||||
|         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 [[ -z "$WH_DLL_NEED_INSTALL" ]] | ||||
|                 then WH_DLL_NEED_INSTALL="$need_install_dll_to_pfx" | ||||
| @@ -970,15 +1045,13 @@ use_winetricks () { | ||||
|             fi | ||||
|         done | ||||
|         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..." | ||||
|             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 | ||||
|         fi | ||||
|     fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| kill_wine () { | ||||
| @@ -992,29 +1065,30 @@ kill_wine () { | ||||
| } | ||||
|  | ||||
| init_database () { | ||||
|     WHDB_FILE="0" | ||||
|     if [[ -f "$WIN_FILE_EXEC" ]] ; then | ||||
|         WHDB="$(basename "$WIN_FILE_EXEC" .exe)" | ||||
|         if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then | ||||
|             WHDB_FILE="$WIN_FILE_EXEC".whdb | ||||
|         else | ||||
|             orig_IFS="$IFS" | ||||
|             IFS=$'\n' | ||||
|             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 | ||||
|             orig_IFS="$IFS" && IFS=$'\n' | ||||
|             if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then | ||||
|                 WHDB_FILE="$WH_FIND_DB_FILE" | ||||
|             fi | ||||
|             IFS="$orig_IFS" | ||||
|         fi | ||||
|         if [[ "$WHDB_FILE" ]] ; then | ||||
|     fi | ||||
|  | ||||
|     if [[ "$WHDB_FILE" != "0" ]] ; then | ||||
|         print_info "Используется файл настроек: $WHDB_FILE" | ||||
|         . "$WHDB_FILE" | ||||
|     elif check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then | ||||
|         print_info "Найдены настройки из предыдущего использования префикса: $WINEPREFIX" | ||||
|         cat "$WINEPREFIX/last.conf" | ||||
|         . "$WINEPREFIX/last.conf" | ||||
|     else | ||||
|         print_warning "Файл настроек не найден. Пропускаем." | ||||
|     fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| prepair_wine () { | ||||
| @@ -1039,7 +1113,10 @@ prepair_wine () { | ||||
|  | ||||
|     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_wineprefix | ||||
|     use_winetricks | ||||
| @@ -1057,13 +1134,15 @@ wine_run () { | ||||
|     WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")" | ||||
|     [[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH" | ||||
|  | ||||
|     if [[ $DEBUG == "0" ]] ; then | ||||
|         $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS | ||||
|     else | ||||
|         print_var WH_WINE_USE WINEARCH WINEPREFIX WINEDLLOVERRIDES WH_WINDOWS_VER | tee "$LOG_FILE" | ||||
|         $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE" | ||||
|     fi | ||||
|     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 | ||||
| } | ||||
|  | ||||
| @@ -1127,10 +1206,62 @@ run_autoinstall () { | ||||
|     echo | ||||
| } | ||||
|  | ||||
| ##### REMOVE WINEHELPER ##### | ||||
| 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 " Это удалит:" | ||||
| @@ -1141,16 +1272,20 @@ remove_winehelper () { | ||||
|         echo "Продолжить? (y/N)" | ||||
|         read -r answer | ||||
|  | ||||
|     if [[ "$answer" =~ ^[YyДд]$ ]]; then | ||||
|         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 | ||||
|  | ||||
|     if [[ "$answer" =~ ^[YyДд]$ ]] ; then | ||||
|         # Удаление рабочих каталогов | ||||
|         try_remove_dir "$USER_WORK_PATH" | ||||
|  | ||||
| @@ -1167,9 +1302,7 @@ remove_winehelper () { | ||||
|         done | ||||
|  | ||||
|         # Обновление кэша desktop-файлов | ||||
|             if check_command update-desktop-database; then | ||||
|         update-desktop-database "$HOME/.local/share/applications" | ||||
|             fi | ||||
|  | ||||
|         # Удаление символических ссылок | ||||
|         try_remove_file "$HOME/.winehelper" | ||||
| @@ -1178,9 +1311,6 @@ remove_winehelper () { | ||||
|     else | ||||
|         print_info "Удаление отменено." | ||||
|     fi | ||||
|     else | ||||
|         print_info "Удаление отменено." | ||||
|     fi | ||||
| } | ||||
|  | ||||
| wh_info () { | ||||
| @@ -1193,7 +1323,8 @@ wh_info () { | ||||
|  | ||||
|     installed                     список установленных программ | ||||
|     run [программа.exe]           запуск программы (отладка) | ||||
|     remove                        удалить WineHelper и все связанные данные | ||||
|     remove-all                    удалить WineHelper и все связанные данные | ||||
|     remove-prefix [имя_префикса]  удалить префикс и все связанные данные | ||||
|  | ||||
| Параметры: | ||||
|     --help                        показать эту справку и выйти | ||||
| @@ -1222,12 +1353,13 @@ case "${1,,}" in | ||||
|     winereg|regedit) prepair_wine ; wine_run "regedit" ;; | ||||
|     winefile|explorer) prepair_wine ; wine_run "winefile" ;; | ||||
|     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 ;; | ||||
|     install|-i) shift ; run_autoinstall "$@" ;; | ||||
|     installed) shift ; check_installed_programs "$1" ;; | ||||
|     run|-r) shift ; run_installed_programs "$1" ;; | ||||
|     remove|--remove) remove_winehelper ;; | ||||
|     remove-all) shift ; remove_winehelper "$@" ;; | ||||
|     remove-prefix) shift ; remove_prefix "$@" ;; | ||||
|     *) | ||||
|         if [[ -f "$1" ]] ; then | ||||
|             WIN_FILE_EXEC="$(readlink -f "$1")" | ||||
|   | ||||
							
								
								
									
										19204
									
								
								winetricks_20250102
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19204
									
								
								winetricks_20250102
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user