forked from CastroFidel/winehelper
Compare commits
14 Commits
97996fb67b
...
0f8f192634
Author | SHA1 | Date | |
---|---|---|---|
|
0f8f192634 | ||
|
7f64378670 | ||
|
165c4ee110 | ||
|
843b90c1c2 | ||
|
e3ac6dd967 | ||
|
5763749aa0 | ||
|
b1f192b2ff | ||
|
42aa29d208 | ||
|
3ad737e27d | ||
|
151b6d6e30 | ||
|
c8049efd37 | ||
|
8eb5a0aa86 | ||
|
7edc205b66 | ||
|
b36cadd54d |
@@ -6,10 +6,10 @@ export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="scadoffice"
|
||||
export PROG_NAME="SCAD Office"
|
||||
export PROG_ICON="scadoffice"
|
||||
export BASE_PFX="scadaoffice_pfx_x64_v03"
|
||||
export BASE_PFX="scadaoffice_pfx_x64_v04"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEARCH="win64"
|
||||
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 INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6"
|
||||
export WH_XDG_OPEN="rtf"
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
||||
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
||||
|
BIN
image/nettest_client.png
Normal file
BIN
image/nettest_client.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
image/nettest_server.png
Normal file
BIN
image/nettest_server.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
39
manualinstall/nettest
Normal file
39
manualinstall/nettest
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Установщик программного комплекса NetTest (демо-версия)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.kpolyakov.spb.ru/prog/nettest/nettget.htm"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="nettest"
|
||||
export PROG_NAME="NetTest"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL=""
|
||||
export WH_WINDOWS_VER="10"
|
||||
|
||||
ZIP_FILE="$2"
|
||||
|
||||
if [[ -f "$ZIP_FILE" ]] \
|
||||
&& [[ $ZIP_FILE =~ ".zip" ]]
|
||||
then
|
||||
prepair_wine
|
||||
PROG_PATH="$DRIVE_C/nettest"
|
||||
if [[ $ZIP_FILE =~ "tests" ]] ; then
|
||||
unpack "$2" "$PROG_PATH/tests"
|
||||
print_info "Тесты $(basename "$ZIP_FILE") установлены."
|
||||
exit 0
|
||||
else
|
||||
unpack "$2" "$PROG_PATH"
|
||||
fi
|
||||
|
||||
cp -fr "$PROG_PATH/fonts/"* "$DRIVE_C/windows/Fonts/"
|
||||
|
||||
create_desktop "$PROG_NAME (Сервер)" "$PROG_PATH/testser.exe" "nettest_server"
|
||||
create_desktop "$PROG_NAME (Клиент)" "$PROG_PATH/testcli.exe" "nettest_client"
|
||||
else
|
||||
fatal "Не найден файл архива для $PROG_NAME. Перезапустите по примеру:
|
||||
winehelper install $1 \"/путь/до/архива\""
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
@@ -5,6 +5,7 @@
|
||||
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
|
||||
f1bf1261550ca2928cefacdb724926d3d6d103433d0ff6882ee9783a50d8f4e4 wine-8.8-staging-amd64.tar.xz
|
||||
61bec1230b37b8fcc69fd45f848b44fd88cc41fcdd5dc3080336d7da63660f40 wine-7.16.1-alt1-amd64.tar.xz
|
||||
6fea17fd131f57c2ebf7ca4c60d3c5a9e819afe16e5d0b77ecb750da99ae0e38 wine-7.16.1-alt1-i586.tar.xz
|
||||
|
||||
@@ -211,8 +212,8 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
|
||||
|
||||
25e277c7afa4a9afc5f013cb05f872c12a7f381c4f0503a423dcacccca9a14c6 scadaoffice_pfx_x64_v03.tar.xz
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
4fa93434c5c15440014357323257ddcee7d28b94ad6a56bd6f5a08b33ae4c3cb scadaoffice_pfx_x64_v04.tar.xz
|
||||
# create with wine-8.8-staging-amd64
|
||||
# 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
|
||||
|
182
winehelper
182
winehelper
@@ -162,12 +162,10 @@ check_variables WINE_WIN_START "start /wait /high /unix"
|
||||
|
||||
check_variables WINE_CPU_TOPOLOGY "8"
|
||||
|
||||
check_variables USE_RENDERER "opengl" # opengl, damavand, proton
|
||||
|
||||
check_variables DXVK_VER "1.10.3-28"
|
||||
check_variables DXVK_VER "none"
|
||||
# check_variables DXVK_CONFIG_FILE "path/to/dxvk.conf"
|
||||
|
||||
check_variables VKD3D_VER "1.1-2602"
|
||||
check_variables VKD3D_VER "none"
|
||||
# check_variables VKD3D_LIMIT_TESS_FACTORS 64
|
||||
# check_variables VKD3D_FEATURE_LEVEL "12_0"
|
||||
|
||||
@@ -395,10 +393,14 @@ print_license_agreement () {
|
||||
}
|
||||
|
||||
try_download () {
|
||||
if [[ $WH_USE_GUI == "1" ]] \
|
||||
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
||||
then print_ok "Соглашения приняты из графического интерфейса."
|
||||
else print_license_agreement
|
||||
if [[ $1 != "cloud" ]] ; then
|
||||
if [[ $WH_USE_GUI == "1" ]] \
|
||||
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
||||
then print_ok "Соглашения приняты из графического интерфейса."
|
||||
else print_license_agreement
|
||||
fi
|
||||
else
|
||||
shift
|
||||
fi
|
||||
local download_file_url output_file output_file_name
|
||||
download_file_url="${1// /%20}"
|
||||
@@ -694,9 +696,11 @@ EOF
|
||||
echo '#!/usr/bin/env bash'
|
||||
echo "# cmd_name: $INSTALL_SCRIPT_NAME"
|
||||
} > "$exe_file".whdb
|
||||
grep -e "info_" -e "#####" -e "export" -e "var_" "$INSTALL_SCRIPT" \
|
||||
| grep -vE "LAUNCH_PARAMETERS|AUTOINSTALL|WIN_FILE_EXEC|echo" \
|
||||
|
||||
grep -e "info_" -e "#####" -e "PROG_URL=" -e "WINEPREFIX=" -e "INSTALL_DLL=" \
|
||||
-e "PROG_NAME=" -e "PROG_ICON=" -e "var_" "$INSTALL_SCRIPT" \
|
||||
| awk '{$1=$1;print}' >> "$exe_file".whdb
|
||||
|
||||
print_info "Создан файл настроек для $exe_file"
|
||||
fi
|
||||
}
|
||||
@@ -760,31 +764,25 @@ run_installed_programs () {
|
||||
fi
|
||||
}
|
||||
|
||||
init_wined3d () {
|
||||
if [[ "$USE_RENDERER" != "proton" ]] ; then
|
||||
WINED3D_FILES="d3d8 d3d9 d3d10_1 d3d10 d3d10core d3d11 dxgi d3d12 d3d12core"
|
||||
for wined3dfiles in $WINED3D_FILES ; do
|
||||
try_copy_wine_dll_to_pfx_64 "$wined3dfiles.dll"
|
||||
try_copy_wine_dll_to_pfx_32 "$wined3dfiles.dll"
|
||||
done
|
||||
# if [[ "$USE_RENDERER" == "damavand" ]]
|
||||
# then export WINE_D3D_CONFIG="renderer=vulkan"
|
||||
# else export WINE_D3D_CONFIG="renderer=gl"
|
||||
# fi
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
copy_wined3d () {
|
||||
for wined3dfiles in $1 ; do
|
||||
try_copy_wine_dll_to_pfx_64 "$wined3dfiles.dll"
|
||||
try_copy_wine_dll_to_pfx_32 "$wined3dfiles.dll"
|
||||
done
|
||||
}
|
||||
|
||||
init_dxvk () {
|
||||
check_variables USE_DXVK_VER "$1"
|
||||
DXVK_VER="$1"
|
||||
if [[ $DXVK_VER == "none" ]] ; then
|
||||
copy_wined3d "d3d8 d3d9 d3d10_1 d3d10 d3d10core d3d11 dxgi"
|
||||
return 0
|
||||
fi
|
||||
|
||||
get_dxvk() {
|
||||
local DXVK_URL="$1"
|
||||
local DXVK_VAR_VER="$2"
|
||||
local DXVK_PACKAGE="${WH_VULKAN_LIBDIR}/${DXVK_VAR_VER}.tar.$(echo "${DXVK_URL#*.tar.}")"
|
||||
if try_download "$DXVK_URL" "$DXVK_PACKAGE" check256sum \
|
||||
if try_download cloud "$DXVK_URL" "$DXVK_PACKAGE" check256sum \
|
||||
&& unpack "$DXVK_PACKAGE" "$WH_VULKAN_LIBDIR"
|
||||
then
|
||||
try_remove_file "$DXVK_PACKAGE"
|
||||
@@ -793,36 +791,37 @@ init_dxvk () {
|
||||
return 1
|
||||
}
|
||||
|
||||
for DXVK_VAR_VER in "$USE_DXVK_VER" $@ ; do
|
||||
if [[ ! -d "${WH_VULKAN_LIBDIR}/${DXVK_VAR_VER}" ]] ; then
|
||||
get_dxvk "$CLOUD_URL/${DXVK_VAR_VER}.tar.xz" "$DXVK_VAR_VER"
|
||||
fi
|
||||
done
|
||||
if [[ ! -d "${WH_VULKAN_LIBDIR}/${DXVK_VER}" ]] ; then
|
||||
get_dxvk "$CLOUD_URL/${DXVK_VER}.tar.xz" "$DXVK_VER"
|
||||
fi
|
||||
|
||||
if [[ "${WH_USE_WINE_DXGI}" == 1 ]] ; then
|
||||
if [[ $WH_USE_WINE_DXGI == "1" ]] ; then
|
||||
DXVK_FILES="d3d9 d3d10_1 d3d10 d3d11" # dxvk_config openvr_api_dxvk"
|
||||
try_copy_wine_dll_to_pfx_64 "dxgi.dll"
|
||||
try_copy_wine_dll_to_pfx_32 "dxgi.dll"
|
||||
copy_wined3d "dxgi"
|
||||
else
|
||||
DXVK_FILES="d3d9 d3d10_1 d3d10 d3d11 dxgi" # dxvk_config openvr_api_dxvk"
|
||||
fi
|
||||
|
||||
for dxvkfiles in $DXVK_FILES ; do
|
||||
try_copy_other_dll_to_pfx_64 "${WH_VULKAN_LIBDIR}/${USE_DXVK_VER}/x64/$dxvkfiles.dll"
|
||||
if try_copy_other_dll_to_pfx_32 "${WH_VULKAN_LIBDIR}/${USE_DXVK_VER}/x32/$dxvkfiles.dll"
|
||||
try_copy_other_dll_to_pfx_64 "${WH_VULKAN_LIBDIR}/${DXVK_VER}/x64/$dxvkfiles.dll"
|
||||
if try_copy_other_dll_to_pfx_32 "${WH_VULKAN_LIBDIR}/${DXVK_VER}/x32/$dxvkfiles.dll"
|
||||
then var_winedlloverride_update "$dxvkfiles=n"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
init_vkd3d () {
|
||||
check_variables USE_VKD3D_VER "$1"
|
||||
VKD3D_VER="$1"
|
||||
if [[ $VKD3D_VER == "none" ]] ; then
|
||||
copy_wined3d "d3d12 d3d12core"
|
||||
return 0
|
||||
fi
|
||||
|
||||
get_vkd3d() {
|
||||
local VKD3D_URL="$1"
|
||||
local VKD3D_VAR_VER="$2"
|
||||
local VKD3D_PACKAGE="${WH_VULKAN_LIBDIR}/${VKD3D_VAR_VER}.tar.$(echo "${VKD3D_URL#*.tar.}")"
|
||||
if try_download "$VKD3D_URL" "$VKD3D_PACKAGE" check256sum \
|
||||
if try_download cloud "$VKD3D_URL" "$VKD3D_PACKAGE" check256sum \
|
||||
&& unpack "$VKD3D_PACKAGE" "$WH_VULKAN_LIBDIR"
|
||||
then
|
||||
try_remove_file "$VKD3D_PACKAGE"
|
||||
@@ -831,16 +830,14 @@ init_vkd3d () {
|
||||
return 1
|
||||
}
|
||||
|
||||
for VKD3D_VAR_VER in "$USE_VKD3D_VER" $@ ; do
|
||||
if [[ ! -d "${WH_VULKAN_LIBDIR}/${VKD3D_VAR_VER}" ]] ; then
|
||||
get_vkd3d "$CLOUD_URL/${VKD3D_VAR_VER}.tar.xz" "$VKD3D_VAR_VER"
|
||||
fi
|
||||
done
|
||||
if [[ ! -d "${WH_VULKAN_LIBDIR}/${VKD3D_VER}" ]] ; then
|
||||
get_vkd3d "$CLOUD_URL/${VKD3D_VER}.tar.xz" "$VKD3D_VER"
|
||||
fi
|
||||
|
||||
VKD3D_FILES="d3d12 d3d12core libvkd3d-shader-1 libvkd3d-1" # libvkd3d-proton-utils-3
|
||||
for vkd3dfiles in $VKD3D_FILES ; do
|
||||
try_copy_other_dll_to_pfx_64 "${WH_VULKAN_LIBDIR}/${USE_VKD3D_VER}/x64/$vkd3dfiles.dll"
|
||||
if try_copy_other_dll_to_pfx_32 "${WH_VULKAN_LIBDIR}/${USE_VKD3D_VER}/x86/$vkd3dfiles.dll"
|
||||
try_copy_other_dll_to_pfx_64 "${WH_VULKAN_LIBDIR}/${VKD3D_VER}/x64/$vkd3dfiles.dll"
|
||||
if try_copy_other_dll_to_pfx_32 "${WH_VULKAN_LIBDIR}/${VKD3D_VER}/x86/$vkd3dfiles.dll"
|
||||
then var_winedlloverride_update "$vkd3dfiles=n"
|
||||
fi
|
||||
done
|
||||
@@ -855,7 +852,7 @@ init_wine_ver () {
|
||||
download_url="$CLOUD_URL/$WH_WINE_USE.tar.xz"
|
||||
wine_package="$WH_TMP_DIR/$WH_WINE_USE.tar.xz"
|
||||
|
||||
try_download "$download_url" "$wine_package" "check256sum"
|
||||
try_download cloud "$download_url" "$wine_package" "check256sum"
|
||||
unpack "$wine_package" "$WH_DIST_DIR/"
|
||||
try_remove_file "$wine_package"
|
||||
|
||||
@@ -908,7 +905,7 @@ init_wine_ver () {
|
||||
CPCSP_PROXY_NAME="wine-cpcsp_proxy-$CPCSP_PROXY_VER"
|
||||
CPCSP_PROXY_URL="$CLOUD_URL/$CPCSP_PROXY_NAME.tar.xz"
|
||||
|
||||
try_download "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum
|
||||
try_download cloud "$CPCSP_PROXY_URL" "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" check256sum
|
||||
unpack "$WH_TMP_DIR/$CPCSP_PROXY_NAME.tar.xz" "$WH_TMP_DIR"
|
||||
|
||||
cp -fr "$WH_TMP_DIR/$CPCSP_PROXY_NAME/"i386-* "$WINEDIR/lib/wine/"
|
||||
@@ -1111,6 +1108,11 @@ init_wineprefix () {
|
||||
export DRIVE_C="$WINEPREFIX/drive_c"
|
||||
export XUSER_PATH="$DRIVE_C/users/xuser"
|
||||
|
||||
if [[ -d "$XUSER_PATH" ]] \
|
||||
&& [[ ! -d "$DRIVE_C/users/$USER" ]]
|
||||
then try_force_link_dir "$XUSER_PATH" "$DRIVE_C/users/$USER"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$WINEPREFIX/.firstboot" ]] ; then
|
||||
create_new_dir "$WINEPREFIX"
|
||||
if [[ "$CLEAR_PREFIX" == "1" ]]
|
||||
@@ -1179,16 +1181,7 @@ init_wineprefix () {
|
||||
# добавление ассоциаций файлов для запуска нативного приложения из wine
|
||||
# пример переменной: WH_XDG_OPEN="txt doc pdf"
|
||||
check_variables WH_XDG_OPEN "0"
|
||||
# Сохраняем старые ассоциации, чтобы потом удалить те, что больше не нужны
|
||||
local old_xdg_open
|
||||
if [[ -f "$WINEPREFIX/last.conf" ]]; then
|
||||
old_xdg_open=$(grep "WH_XDG_OPEN=" "$WINEPREFIX/last.conf" | sed -e 's/.*WH_XDG_OPEN="//' -e 's/"$//')
|
||||
fi
|
||||
|
||||
# Если переменная WH_XDG_OPEN была установлена извне (например, из GUI),
|
||||
# то мы должны принудительно установить ее значение в "0", если она пуста,
|
||||
# чтобы корректно удалить старые ассоциации.
|
||||
[[ -z "$WH_XDG_OPEN" ]] && 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
|
||||
@@ -1211,14 +1204,8 @@ init_wineprefix () {
|
||||
# добавляем новую команду xdg-open в реестр
|
||||
get_and_set_reg_file --add "$XDG_OPEN_REG" '@=' 'REG_SZ' "$WRAPPER %1" "system"
|
||||
|
||||
# Удаляем старые ассоциации, которых нет в новом списке
|
||||
if [[ -n "$old_xdg_open" ]]; then
|
||||
for old_ext in $old_xdg_open; do
|
||||
if ! echo " $WH_XDG_OPEN " | grep -q " $old_ext "; then
|
||||
get_and_set_reg_file --delete "Software\Classes\.$old_ext" '@='
|
||||
fi
|
||||
done
|
||||
fi
|
||||
# удаляем старые ассоциации, которых нет в новом списке
|
||||
sed -i '/@="xdg-open"/d' "$WINEPREFIX/system.reg"
|
||||
|
||||
# добавляем ассоциации файлов для запуска с помощью xdg-open
|
||||
for ext in $WH_XDG_OPEN ; do
|
||||
@@ -1291,7 +1278,7 @@ init_wineprefix () {
|
||||
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 WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE
|
||||
WINE_CPU_TOPOLOGY DXVK_VER VKD3D_VER WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE
|
||||
do
|
||||
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
||||
done
|
||||
@@ -1368,46 +1355,27 @@ init_database () {
|
||||
if [[ "$WHDB_FILE" != "0" ]] ; then
|
||||
print_info "Используется файл настроек: $WHDB_FILE"
|
||||
. "$WHDB_FILE"
|
||||
elif check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
||||
fi
|
||||
|
||||
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
||||
print_info "Найдены настройки из предыдущего использования префикса: $WINEPREFIX"
|
||||
# Сохраняем значение WH_XDG_OPEN, если оно было установлено извне (например, из GUI).
|
||||
# Это предотвращает его перезапись старым значением из last.conf.
|
||||
# Используем `declare -p` для надежного определения, была ли переменная установлена,
|
||||
# даже если она пустая (что означает "удалить все ассоциации").
|
||||
if declare -p WH_XDG_OPEN &>/dev/null; then
|
||||
wh_xdg_open_from_env="$WH_XDG_OPEN"
|
||||
fi
|
||||
cat "$WINEPREFIX/last.conf"
|
||||
. "$WINEPREFIX/last.conf"
|
||||
else
|
||||
print_warning "Файл настроек не найден. Пропускаем."
|
||||
fi
|
||||
}
|
||||
|
||||
prepair_wine () {
|
||||
# Объявляем переменную здесь, чтобы она была доступна после вызова init_database
|
||||
local wh_xdg_open_from_env
|
||||
|
||||
if [[ -n "$INSTALL_SCRIPT_NAME" ]]
|
||||
then print_info "Используются настройки из скрипта установки: $INSTALL_SCRIPT_NAME"
|
||||
else init_database
|
||||
fi
|
||||
# Восстанавливаем значение WH_XDG_OPEN, если оно было установлено извне.
|
||||
# Проверяем, была ли переменная сохранена, а не ее значение.
|
||||
# Это позволяет корректно передать пустую строку.
|
||||
if declare -p wh_xdg_open_from_env &>/dev/null; then
|
||||
export WH_XDG_OPEN="$wh_xdg_open_from_env"
|
||||
fi
|
||||
|
||||
init_wine_ver
|
||||
init_wineprefix
|
||||
use_winetricks
|
||||
init_dxvk "$DXVK_VER"
|
||||
init_vkd3d "$VKD3D_VER"
|
||||
|
||||
if init_wined3d ; then
|
||||
:
|
||||
else
|
||||
init_dxvk "$DXVK_VER"
|
||||
init_vkd3d "$VKD3D_VER"
|
||||
fi
|
||||
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
||||
}
|
||||
|
||||
@@ -1427,9 +1395,9 @@ wine_run () {
|
||||
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
|
||||
else
|
||||
exec $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
||||
fi
|
||||
# wait_wineserver
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
wine_run_install () {
|
||||
@@ -1851,9 +1819,9 @@ create_base_pfx () {
|
||||
&& [[ ! -L "$users_dir/$USER" ]]
|
||||
then
|
||||
if [[ -L "$users_dir/xuser" ]]
|
||||
then try_remove_dir "$users_dir/xuser/"
|
||||
then try_remove_dir "$users_dir/xuser"
|
||||
fi
|
||||
create_new_dir "$users_dir/xuser/"
|
||||
create_new_dir "$users_dir/xuser"
|
||||
cp -fr "$users_dir/$USER"/* "$users_dir/xuser/"
|
||||
fi
|
||||
|
||||
@@ -2188,16 +2156,14 @@ run_install_dxvk() {
|
||||
fi
|
||||
check_prefix_var
|
||||
init_database
|
||||
export DXVK_VER="$version"
|
||||
init_wine_ver
|
||||
init_wineprefix
|
||||
if [[ "$version" == "none" ]] ; then
|
||||
print_info "Удаление DXVK..."
|
||||
init_wined3d
|
||||
update_last_conf_var "DXVK_VER" ""
|
||||
else
|
||||
init_dxvk "$version"
|
||||
update_last_conf_var "DXVK_VER" "$USE_DXVK_VER"
|
||||
if [[ "$DXVK_VER" == "none" ]]
|
||||
then print_info "Удаление DXVK..."
|
||||
else print_info "Установка DXVK: $DXVK_VER"
|
||||
fi
|
||||
init_dxvk "$DXVK_VER"
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
@@ -2212,16 +2178,14 @@ run_install_vkd3d() {
|
||||
fi
|
||||
check_prefix_var
|
||||
init_database
|
||||
export VKD3D_VER="$version"
|
||||
init_wine_ver
|
||||
init_wineprefix
|
||||
if [[ "$version" == "none" ]] ; then
|
||||
print_info "Удаление VKD3D..."
|
||||
init_wined3d
|
||||
update_last_conf_var "VKD3D_VER" ""
|
||||
else
|
||||
init_vkd3d "$version"
|
||||
update_last_conf_var "VKD3D_VER" "$USE_VKD3D_VER"
|
||||
if [[ "$VKD3D_VER" == "none" ]]
|
||||
then print_info "Удаление VKD3D..."
|
||||
else print_info "Установка VKD3D: $VKD3D_VER"
|
||||
fi
|
||||
init_vkd3d "$VKD3D_VER"
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
|
@@ -2097,6 +2097,13 @@ class WineHelperGUI(QMainWindow):
|
||||
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
|
||||
selector_layout.addWidget(self.created_prefix_selector, 1)
|
||||
|
||||
self.create_base_pfx_button = QPushButton()
|
||||
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
|
||||
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
|
||||
self.create_base_pfx_button.setEnabled(False)
|
||||
self.create_base_pfx_button.clicked.connect(self.create_base_prefix_from_selected)
|
||||
selector_layout.addWidget(self.create_base_pfx_button)
|
||||
|
||||
self.delete_prefix_button = QPushButton()
|
||||
self.delete_prefix_button.setIcon(QIcon.fromTheme("user-trash"))
|
||||
self.delete_prefix_button.setToolTip("Удалить выбранный префикс")
|
||||
@@ -2293,6 +2300,7 @@ class WineHelperGUI(QMainWindow):
|
||||
self.current_managed_prefix_name = None
|
||||
self._setup_prefix_management_panel(None)
|
||||
self.delete_prefix_button.setEnabled(False)
|
||||
self.create_base_pfx_button.setEnabled(False)
|
||||
else:
|
||||
# Прокручиваем к выбранному элементу, чтобы он был виден в списке
|
||||
self.created_prefix_selector.view().scrollTo(
|
||||
@@ -2302,6 +2310,7 @@ class WineHelperGUI(QMainWindow):
|
||||
self.current_managed_prefix_name = prefix_name
|
||||
self._setup_prefix_management_panel(prefix_name)
|
||||
self.delete_prefix_button.setEnabled(True)
|
||||
self.create_base_pfx_button.setEnabled(True)
|
||||
|
||||
def delete_selected_prefix(self):
|
||||
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
|
||||
@@ -2366,6 +2375,50 @@ class WineHelperGUI(QMainWindow):
|
||||
else:
|
||||
QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.")
|
||||
|
||||
def create_base_prefix_from_selected(self):
|
||||
"""Создает шаблон префикса из выбранного в выпадающем списке."""
|
||||
prefix_name = self.current_managed_prefix_name
|
||||
if not prefix_name:
|
||||
return
|
||||
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setIcon(QMessageBox.Question)
|
||||
msg_box.setWindowTitle("Создание шаблона префикса")
|
||||
msg_box.setText(
|
||||
f"Будет создан 'шаблон' из префикса '{prefix_name}'.\n"
|
||||
"Это продвинутая функция для создания базовых архивов префиксов.\n\n"
|
||||
"Продолжить?"
|
||||
)
|
||||
|
||||
yes_button = msg_box.addButton("Да, создать", QMessageBox.YesRole)
|
||||
no_button = msg_box.addButton("Нет", QMessageBox.NoRole)
|
||||
msg_box.setDefaultButton(no_button)
|
||||
|
||||
msg_box.exec_()
|
||||
|
||||
if msg_box.clickedButton() != yes_button:
|
||||
return
|
||||
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle(f"Создание шаблона: {prefix_name}")
|
||||
self.command_dialog.setMinimumSize(750, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
layout.addWidget(self.command_log_output)
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
|
||||
self._run_simple_command("create-base-pfx", [prefix_name])
|
||||
self.command_dialog.exec_()
|
||||
|
||||
def _setup_prefix_management_panel(self, prefix_name):
|
||||
"""Настраивает панель управления префиксом на основе текущего состояния."""
|
||||
is_prefix_selected = bool(prefix_name)
|
||||
@@ -2585,11 +2638,12 @@ class WineHelperGUI(QMainWindow):
|
||||
# Для удаления лицензия не нужна, запускаем сразу.
|
||||
self.run_component_install_command(prefix_name, command, version)
|
||||
else:
|
||||
# Установка: сначала показываем лицензионное соглашение.
|
||||
if not self._show_license_agreement_dialog():
|
||||
return # Пользователь отклонил лицензию
|
||||
# Установка: для DXVK и VKD3D лицензию не показываем.
|
||||
if component not in ['dxvk', 'vkd3d-proton']:
|
||||
if not self._show_license_agreement_dialog():
|
||||
return # Пользователь отклонил лицензию
|
||||
|
||||
# Если лицензия принята, запускаем установку.
|
||||
# Запускаем установку.
|
||||
self.run_component_install_command(prefix_name, command, version)
|
||||
|
||||
def open_wine_version_manager(self):
|
||||
@@ -2620,9 +2674,6 @@ class WineHelperGUI(QMainWindow):
|
||||
new_version = dialog.selected_version
|
||||
new_version_display = dialog.selected_display_text
|
||||
|
||||
if not self._show_license_agreement_dialog():
|
||||
return # Пользователь отклонил лицензию
|
||||
|
||||
self.run_change_wine_version_command(prefix_name, new_version, new_version_display)
|
||||
|
||||
def run_change_wine_version_command(self, prefix_name, new_version, new_version_display):
|
||||
@@ -2743,17 +2794,43 @@ class WineHelperGUI(QMainWindow):
|
||||
QMessageBox.warning(self, "Ошибка", "Сначала выберите префикс.")
|
||||
return
|
||||
|
||||
current_associations = self._get_prefix_component_version(prefix_name, "WH_XDG_OPEN") or ""
|
||||
current_associations = self._get_prefix_component_version(prefix_name, "WH_XDG_OPEN") or "0"
|
||||
|
||||
dialog = FileAssociationsDialog(current_associations, self)
|
||||
dialog = FileAssociationsDialog(current_associations if current_associations != "0" else "", self)
|
||||
if dialog.exec_() == QDialog.Accepted:
|
||||
new_associations = dialog.new_associations
|
||||
|
||||
# Запускаем обновление, только если значение изменилось
|
||||
if new_associations != current_associations:
|
||||
if new_associations != (current_associations if current_associations != "0" else "0"):
|
||||
self.run_update_associations_command(prefix_name, new_associations)
|
||||
|
||||
def run_update_associations_command(self, prefix_name, new_associations):
|
||||
"""Выполняет команду обновления ассоциаций файлов."""
|
||||
# --- Прямое редактирование last.conf, чтобы обойти перезапись переменных в winehelper ---
|
||||
last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf")
|
||||
if not os.path.exists(last_conf_path):
|
||||
QMessageBox.critical(self, "Ошибка", f"Файл конфигурации last.conf не найден для префикса '{prefix_name}'.")
|
||||
return
|
||||
|
||||
try:
|
||||
with open(last_conf_path, 'r', encoding='utf-8') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
updated = False
|
||||
for i, line in enumerate(lines):
|
||||
if line.strip().startswith("export WH_XDG_OPEN="):
|
||||
lines[i] = f'export WH_XDG_OPEN="{new_associations}"\n'
|
||||
updated = True
|
||||
break
|
||||
if not updated:
|
||||
lines.append(f'export WH_XDG_OPEN="{new_associations}"\n')
|
||||
|
||||
with open(last_conf_path, 'w', encoding='utf-8') as f:
|
||||
f.writelines(lines)
|
||||
except IOError as e:
|
||||
QMessageBox.critical(self, "Ошибка записи", f"Не удалось обновить файл last.conf: {e}")
|
||||
return
|
||||
|
||||
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
||||
|
||||
self.command_dialog = QDialog(self)
|
||||
@@ -2779,16 +2856,14 @@ class WineHelperGUI(QMainWindow):
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(
|
||||
lambda exit_code, exit_status: self._handle_component_install_finished(
|
||||
prefix_name, exit_code, exit_status
|
||||
)
|
||||
)
|
||||
prefix_name, exit_code, exit_status))
|
||||
|
||||
env = QProcessEnvironment.systemEnvironment()
|
||||
env.insert("WINEPREFIX", prefix_path)
|
||||
# Устанавливаем новую переменную окружения для скрипта
|
||||
env.insert("WH_XDG_OPEN", new_associations)
|
||||
# Переменная WH_XDG_OPEN теперь читается из измененного last.conf
|
||||
self.command_process.setProcessEnvironment(env)
|
||||
|
||||
# Вызываем init-prefix, который теперь прочитает правильное значение из last.conf
|
||||
args = ["init-prefix"]
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(self.winehelper_path, args)
|
||||
@@ -3683,13 +3758,11 @@ class WineHelperGUI(QMainWindow):
|
||||
msg_box.exec_()
|
||||
|
||||
if msg_box.clickedButton() == yes_button:
|
||||
# Корректно завершаем все дочерние процессы
|
||||
for desktop_path, process in list(self.running_apps.items()):
|
||||
if process.state() == QProcess.Running:
|
||||
print(f"Завершение процесса для {desktop_path}...")
|
||||
process.terminate()
|
||||
if not process.waitForFinished(2000): # Ждем 2 сек
|
||||
process.kill() # Если не закрылся, убиваем
|
||||
# Используем встроенную команду killall для надежного завершения всех процессов wine
|
||||
print("Завершение всех запущенных приложений через 'winehelper killall'...")
|
||||
kill_proc = QProcess()
|
||||
kill_proc.start(self.winehelper_path, ["killall"])
|
||||
kill_proc.waitForFinished(5000) # Даем до 5 секунд на завершение
|
||||
event.accept()
|
||||
else:
|
||||
event.ignore()
|
||||
@@ -4325,13 +4398,22 @@ class WineHelperGUI(QMainWindow):
|
||||
self.install_process.terminate()
|
||||
|
||||
def _handle_command_output(self):
|
||||
"""Обрабатывает вывод для диалога команды"""
|
||||
"""Обрабатывает вывод для общих команд в модальном диалоге."""
|
||||
if hasattr(self, 'command_process') and self.command_process:
|
||||
output = self.command_process.readAllStandardOutput().data().decode('utf-8', errors='ignore').strip()
|
||||
# Используем readAll, чтобы получить и stdout, и stderr
|
||||
output_bytes = self.command_process.readAll()
|
||||
output = output_bytes.data().decode('utf-8', errors='ignore').strip()
|
||||
if output and hasattr(self, 'command_log_output'):
|
||||
self.command_log_output.append(output)
|
||||
QApplication.processEvents()
|
||||
|
||||
def _run_simple_command(self, command, args=None):
|
||||
"""Запускает простую команду winehelper и выводит лог."""
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_command_finished)
|
||||
self.command_process.start(self.winehelper_path, [command] + (args or []))
|
||||
def _handle_command_finished(self, exit_code, exit_status):
|
||||
"""Обрабатывает завершение для диалога команды"""
|
||||
if exit_code == 0:
|
||||
|
Reference in New Issue
Block a user