diff --git a/winehelper b/winehelper index c7d2421..193f109 100755 --- a/winehelper +++ b/winehelper @@ -20,7 +20,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG" LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE" AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT" - THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD_PARTY" + THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY" else # переменные для тестового запуска WineHelper из репозитория USER_WORK_PATH="$HOME/test-$SCRIPT_NAME" diff --git a/winehelper_gui.py b/winehelper_gui.py index ca1fdf3..0aeb7e7 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -2112,10 +2112,17 @@ class WineHelperGUI(QMainWindow): self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.") management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2) - # Добавляем небольшой отступ - spacer_widget = QWidget() - spacer_widget.setFixedHeight(5) - management_layout.addWidget(spacer_widget, 4, 0, 1, 2) + self.esync_button = QPushButton("ESync") + self.esync_button.setCheckable(True) + self.esync_button.setToolTip("Включить/выключить Eventfd-based synchronization.") + self.esync_button.clicked.connect(lambda: self.update_sync_option("WINEESYNC", self.esync_button.isChecked())) + management_layout.addWidget(self.esync_button, 4, 0) + + self.fsync_button = QPushButton("FSync") + self.fsync_button.setCheckable(True) + self.fsync_button.setToolTip("Включить/выключить Futex-based synchronization.") + self.fsync_button.clicked.connect(lambda: self.update_sync_option("WINEFSYNC", self.fsync_button.isChecked())) + management_layout.addWidget(self.fsync_button, 4, 1) self.dxvk_manage_button = QPushButton("Управление DXVK") self.dxvk_manage_button.setMinimumHeight(32) @@ -2133,14 +2140,13 @@ class WineHelperGUI(QMainWindow): self.prefix_info_display = QTextBrowser() self.prefix_info_display.setReadOnly(True) self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) - # Увеличиваем rowspan, чтобы учесть добавленный отступ + # Увеличиваем rowspan, чтобы охватить все строки с кнопками management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1) management_layout.setColumnStretch(0, 1) management_layout.setColumnStretch(1, 1) management_layout.setColumnStretch(2, 2) - # --- Separator and Installer --- separator = QFrame() separator.setFrameShape(QFrame.HLine) separator.setFrameShadow(QFrame.Sunken) @@ -2332,6 +2338,9 @@ class WineHelperGUI(QMainWindow): else: self.prefix_info_display.clear() self.prefix_install_path_edit.clear() + # Сбрасываем состояние кнопок, когда префикс не выбран + self.esync_button.setChecked(False) + self.fsync_button.setChecked(False) self.update_prefix_install_button_state() @@ -2339,12 +2348,16 @@ class WineHelperGUI(QMainWindow): """Обновляет информационный блок для созданного префикса, читая данные из last.conf.""" if not prefix_name: self.prefix_info_display.clear() + self.esync_button.setChecked(False) + self.fsync_button.setChecked(False) return last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf") if not os.path.exists(last_conf_path): self.prefix_info_display.setHtml(f"

Файл конфигурации last.conf не найден для префикса '{prefix_name}'.

") + self.esync_button.setChecked(False) + self.fsync_button.setChecked(False) return # Словарь для хранения всех переменных из файла @@ -2363,6 +2376,17 @@ class WineHelperGUI(QMainWindow): self.prefix_info_display.setHtml(f"

Ошибка чтения last.conf: {e}

") return + # --- Обновить кнопки ESync/FSync --- + # Блокировать сигналы, чтобы предотвратить запуск метода обновления, когда мы устанавливаем состояние + self.esync_button.blockSignals(True) + self.fsync_button.blockSignals(True) + + self.esync_button.setChecked(all_vars.get("WINEESYNC") == "1") + self.fsync_button.setChecked(all_vars.get("WINEFSYNC") == "1") + + self.esync_button.blockSignals(False) + self.fsync_button.blockSignals(False) + # Карта для красивого отображения известных переменных display_map = { "WINEPREFIX": ("Путь", lambda v: v), @@ -2371,8 +2395,10 @@ class WineHelperGUI(QMainWindow): "BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'), "DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"), "VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"), + "WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"), + "WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"), } - display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER"] + display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC"] html_content = f'

' html_content += f"Имя: {html.escape(prefix_name)}
" @@ -3340,6 +3366,43 @@ class WineHelperGUI(QMainWindow): "Будет использована системная версия Wine.") return 'wine' # По умолчанию системный wine + def update_sync_option(self, var_name, is_enabled): + """Обновляет значение WINEESYNC или WINEFSYNC в last.conf.""" + prefix_name = self.current_managed_prefix_name + if not prefix_name: + return + + last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf") + if not os.path.exists(last_conf_path): + QMessageBox.warning(self, "Ошибка", f"Файл last.conf не найден для префикса '{prefix_name}'.") + return + + new_value = "1" if is_enabled else "0" + updated = False + lines = [] + + try: + with open(last_conf_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + for i, line in enumerate(lines): + if line.strip().startswith(f"export {var_name}="): + lines[i] = f'export {var_name}="{new_value}"\n' + updated = True + break + + if not updated: + lines.append(f'export {var_name}="{new_value}"\n') + + with open(last_conf_path, 'w', encoding='utf-8') as f: + f.writelines(lines) + + # Обновляем информационную панель, чтобы отразить изменения + self.update_prefix_info_display(prefix_name) + + except IOError as e: + QMessageBox.critical(self, "Ошибка записи", f"Не удалось обновить файл last.conf:\n{e}") + def _run_wine_util(self, util_name, prefix_name=None): """Запускает стандартную утилиту Wine для выбранного префикса.""" if not prefix_name: