From da3d5cd7afd7b759a22f407f9b1e7b146c83de3a Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Fri, 17 Oct 2025 13:55:55 +0300 Subject: [PATCH] refactored master func: wine_run --- winehelper | 138 +++++++++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 62 deletions(-) diff --git a/winehelper b/winehelper index dc8fdb74..6bd8adf4 100755 --- a/winehelper +++ b/winehelper @@ -101,25 +101,6 @@ else check_variables DXVK_NVAPI_LOG_LEVEL "none" fi -if [[ $WINEDEBUG != "-all" ]] ; then - init_log_file() { - local executable_name - executable_name=$(basename "${@: -1}" 2>/dev/null) - - if [[ -n "$executable_name" ]]; then - local log_dir="$HOME/winehelper_backup_log" - mkdir -p "$log_dir" - export LOG_FILE="$log_dir/${executable_name%.*}.log" - date > "$LOG_FILE" - print_warning "Включен режим логирования работы WINE." - print_warning "Лог будет сохранен по пути: $LOG_FILE" - else - print_warning "Не удалось определить имя программы для создания лога." - print_warning "Логирование будет отключено." - fi - } -fi - ##### WINETRICKS VERSION ##### WINETRICKS_VERSION="20250102" @@ -1361,23 +1342,25 @@ kill_wine () { } init_database () { - WHDB_FILE="0" - if [[ -f "$WIN_FILE_EXEC" ]] ; then + local whdb_file="0" + if [[ -n "$WIN_FILE_EXEC" ]] \ + && [[ -f "$WIN_FILE_EXEC" ]] + then WHDB="$(basename "$WIN_FILE_EXEC" .exe)" if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then - WHDB_FILE="$WIN_FILE_EXEC".whdb + whdb_file="$WIN_FILE_EXEC".whdb 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" + whdb_file="$WH_FIND_DB_FILE" fi IFS="$orig_IFS" fi fi - if [[ "$WHDB_FILE" != "0" ]] ; then - print_info "Используется файл настроек: $WHDB_FILE" - . "$WHDB_FILE" + if [[ "$whdb_file" != "0" ]] ; then + print_info "Используется файл настроек: $whdb_file" + . "$whdb_file" fi if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then @@ -1403,26 +1386,56 @@ prepair_wine () { } wine_run () { - if [[ $WINEARCH == "win32" ]] \ - && [[ -f "$WIN_FILE_EXEC" ]] \ - && file "$WIN_FILE_EXEC" | grep -q "x86-64" - then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!" - fi + local wh_add_args win_file_exec - WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")" - [[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH" + if [[ $1 =~ (winecfg|regedit|winefile|wineconsole) ]] ; then + win_file_exec="$1" + win_file_name="$win_file_exec" + wh_add_args="" + elif [[ -f "$1" ]] ; then + local win_file_path win_file_name + win_file_exec="$(readlink -f "$1")" + win_file_path="$(dirname "$win_file_exec")" + win_file_name="$(basename "$win_file_exec")" - [[ $WINEDEBUG != "-all" ]] && init_log_file "$@" + case "${win_file_name,,}" in + *.exe) wh_add_args="$WINE_WIN_START" ;; + *.msi) wh_add_args="msiexec /i" ;; + *.bat|*.cmd) wh_add_args="" ;; + *) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;; + esac - 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" + if [[ $WINEARCH == "win32" ]] \ + && file "$win_file_exec" | grep -q "x86-64" + then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!" + fi - echo "##### Лог WINE #####" | tee -a "$LOG_FILE" - $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE" + cd "$win_file_path" else - $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS + fatal "Команда введена не правильно или не найден исполняемый файл $1" fi + + shift + + if [[ $WINEDEBUG != "-all" ]] ; then + local log_dir log_file + log_dir="$HOME/winehelper_backup_log" + log_file="$log_dir/${PREFIX_NAME}_${win_file_name%.*}.log" + create_new_dir "$log_dir" + date > "$log_file" + + print_warning "Включен режим логирования работы WINE." + print_warning "Лог будет сохранен по пути: $log_file" + + echo "##### Основные переменные #####" | tee -a "$log_file" + env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$log_file" + + echo "##### Лог WINE #####" | tee -a "$log_file" + $MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$log_file" + else + $MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS + fi + wait_wineserver } @@ -1431,14 +1444,11 @@ wine_run_install () { if [[ "$INSTALL_MODE" == "manual" ]] then print_warning "Рекомендуется не менять пути для установки приложения!" fi - [[ ! -f "$1" ]] && fatal "Нет файла для установки: $1" - case "${1,,}" in - *.exe) wine_run $WINE_WIN_START "$@" ;; - *.msi) wine_run msiexec /i "$@" ;; - *.bat|*.cmd) wine_run "$@" ;; - *) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;; - esac - wait_wineserver + + if [[ ! -f "$1" ]] ; + then fatal "Нет файла для установки: $1" + else wine_run "$@" + fi } run_autoinstall () { @@ -2167,20 +2177,21 @@ select_component_version() { } run_install_to_prefix() { - export WINEPREFIX="$1" - local WIN_FILE_EXEC="$2" - - if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then + if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -f "$2" ]]; then fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>" fi + export WINEPREFIX="$1" + shift + check_prefix_var prepair_wine - wine_run_install "$WIN_FILE_EXEC" + wine_run "$@" } run_install_dxvk() { local version="$1" + if [[ -z "$version" ]] ; then version=$(select_component_version "DXVK") [[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return @@ -2188,21 +2199,27 @@ run_install_dxvk() { list_component_versions "DXVK" return fi + check_prefix_var init_database + export DXVK_VER="$version" + init_wine_ver init_wineprefix + if [[ "$DXVK_VER" == "none" ]] then print_info "Удаление DXVK..." else print_info "Установка DXVK: $DXVK_VER" fi + init_dxvk "$DXVK_VER" wait_wineserver } run_install_vkd3d() { local version="$1" + if [[ -z "$version" ]] ; then version=$(select_component_version "VKD3D") [[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return @@ -2210,15 +2227,20 @@ run_install_vkd3d() { list_component_versions "VKD3D" return fi + check_prefix_var init_database + export VKD3D_VER="$version" + init_wine_ver init_wineprefix + if [[ "$VKD3D_VER" == "none" ]] then print_info "Удаление VKD3D..." else print_info "Установка VKD3D: $VKD3D_VER" fi + init_vkd3d "$VKD3D_VER" wait_wineserver } @@ -2237,9 +2259,7 @@ run_change_wine_version() { fi init_wine_ver - init_wineprefix - wait_wineserver print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE." } @@ -2325,7 +2345,6 @@ case "$arg1" in WIN_FILE_EXEC="$(readlink -f "$arg1")" WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")" find_prefix "$WIN_FILE_EXEC" - prepair_wine if [[ -n "$1" ]] && [[ -f "$1" ]] ; then @@ -2333,12 +2352,7 @@ case "$arg1" in shift fi - case "${WIN_FILE_NAME,,}" in - *.exe) wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE" ;; - *.msi) wine_run msiexec /i "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE" ;; - *.bat|*.cmd) wine_run start "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE" ;; - *) fatal "Тип файла не поддерживается." ;; - esac + wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE" else print_error "Команды $arg1 не существует." wh_info