Compare commits

...

3 Commits

Author SHA1 Message Date
Mikhail Tergoev
20030d43e4 Merge branch 'minergenon-devel' 2025-09-12 12:54:20 +03:00
Sergey Palcheh
b44849661d added esync and fsync control buttons 2025-09-12 12:16:19 +06:00
Mikhail Tergoev
4c39ec3c8e updated doc path 2025-09-11 14:10:24 +03:00
2 changed files with 75 additions and 11 deletions

View File

@@ -12,14 +12,15 @@ export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PA
SCRIPT_NAME="$(basename "$0")"
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
# переменные для установленного WineHelper в систему
WH_VERSION="$(rpm -q winehelper | awk -F'-' '{print $2}')"
USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME"
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
DATA_PATH="/usr/share/$SCRIPT_NAME"
CHANGELOG_FILE="$(realpath "/usr/share/doc/winehelper"-*/CHANGELOG)"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg"
LICENSE_FILE="$(realpath "/usr/share/doc/winehelper"-*/LICENSE)"
AGREEMENT="$(realpath "/usr/share/doc/winehelper"-*/LICENSE_AGREEMENT)"
THIRD_PARTY_FILE="$(realpath "/usr/share/doc/winehelper"-*/THIRD_PARTY)"
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"
else
# переменные для тестового запуска WineHelper из репозитория
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"

View File

@@ -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"<p>Файл конфигурации last.conf не найден для префикса '{prefix_name}'.</p>")
self.esync_button.setChecked(False)
self.fsync_button.setChecked(False)
return
# Словарь для хранения всех переменных из файла
@@ -2363,6 +2376,17 @@ class WineHelperGUI(QMainWindow):
self.prefix_info_display.setHtml(f"<p>Ошибка чтения last.conf: {e}</p>")
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'<p style="line-height: 1.3; font-size: 9pt;">'
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
@@ -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: