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: