Merge branch 'minergenon-devel'
This commit is contained in:
@@ -20,7 +20,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
|||||||
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
||||||
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
||||||
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
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
|
else
|
||||||
# переменные для тестового запуска WineHelper из репозитория
|
# переменные для тестового запуска WineHelper из репозитория
|
||||||
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
||||||
|
@@ -2112,10 +2112,17 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.")
|
self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.")
|
||||||
management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2)
|
management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2)
|
||||||
|
|
||||||
# Добавляем небольшой отступ
|
self.esync_button = QPushButton("ESync")
|
||||||
spacer_widget = QWidget()
|
self.esync_button.setCheckable(True)
|
||||||
spacer_widget.setFixedHeight(5)
|
self.esync_button.setToolTip("Включить/выключить Eventfd-based synchronization.")
|
||||||
management_layout.addWidget(spacer_widget, 4, 0, 1, 2)
|
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 = QPushButton("Управление DXVK")
|
||||||
self.dxvk_manage_button.setMinimumHeight(32)
|
self.dxvk_manage_button.setMinimumHeight(32)
|
||||||
@@ -2133,14 +2140,13 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.prefix_info_display = QTextBrowser()
|
self.prefix_info_display = QTextBrowser()
|
||||||
self.prefix_info_display.setReadOnly(True)
|
self.prefix_info_display.setReadOnly(True)
|
||||||
self.prefix_info_display.setFrameStyle(QFrame.StyledPanel)
|
self.prefix_info_display.setFrameStyle(QFrame.StyledPanel)
|
||||||
# Увеличиваем rowspan, чтобы учесть добавленный отступ
|
# Увеличиваем rowspan, чтобы охватить все строки с кнопками
|
||||||
management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1)
|
management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1)
|
||||||
|
|
||||||
management_layout.setColumnStretch(0, 1)
|
management_layout.setColumnStretch(0, 1)
|
||||||
management_layout.setColumnStretch(1, 1)
|
management_layout.setColumnStretch(1, 1)
|
||||||
management_layout.setColumnStretch(2, 2)
|
management_layout.setColumnStretch(2, 2)
|
||||||
|
|
||||||
# --- Separator and Installer ---
|
|
||||||
separator = QFrame()
|
separator = QFrame()
|
||||||
separator.setFrameShape(QFrame.HLine)
|
separator.setFrameShape(QFrame.HLine)
|
||||||
separator.setFrameShadow(QFrame.Sunken)
|
separator.setFrameShadow(QFrame.Sunken)
|
||||||
@@ -2332,6 +2338,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
else:
|
else:
|
||||||
self.prefix_info_display.clear()
|
self.prefix_info_display.clear()
|
||||||
self.prefix_install_path_edit.clear()
|
self.prefix_install_path_edit.clear()
|
||||||
|
# Сбрасываем состояние кнопок, когда префикс не выбран
|
||||||
|
self.esync_button.setChecked(False)
|
||||||
|
self.fsync_button.setChecked(False)
|
||||||
|
|
||||||
self.update_prefix_install_button_state()
|
self.update_prefix_install_button_state()
|
||||||
|
|
||||||
@@ -2339,12 +2348,16 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"""Обновляет информационный блок для созданного префикса, читая данные из last.conf."""
|
"""Обновляет информационный блок для созданного префикса, читая данные из last.conf."""
|
||||||
if not prefix_name:
|
if not prefix_name:
|
||||||
self.prefix_info_display.clear()
|
self.prefix_info_display.clear()
|
||||||
|
self.esync_button.setChecked(False)
|
||||||
|
self.fsync_button.setChecked(False)
|
||||||
return
|
return
|
||||||
|
|
||||||
last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf")
|
last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf")
|
||||||
|
|
||||||
if not os.path.exists(last_conf_path):
|
if not os.path.exists(last_conf_path):
|
||||||
self.prefix_info_display.setHtml(f"<p>Файл конфигурации last.conf не найден для префикса '{prefix_name}'.</p>")
|
self.prefix_info_display.setHtml(f"<p>Файл конфигурации last.conf не найден для префикса '{prefix_name}'.</p>")
|
||||||
|
self.esync_button.setChecked(False)
|
||||||
|
self.fsync_button.setChecked(False)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Словарь для хранения всех переменных из файла
|
# Словарь для хранения всех переменных из файла
|
||||||
@@ -2363,6 +2376,17 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.prefix_info_display.setHtml(f"<p>Ошибка чтения last.conf: {e}</p>")
|
self.prefix_info_display.setHtml(f"<p>Ошибка чтения last.conf: {e}</p>")
|
||||||
return
|
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 = {
|
display_map = {
|
||||||
"WINEPREFIX": ("Путь", lambda v: v),
|
"WINEPREFIX": ("Путь", lambda v: v),
|
||||||
@@ -2371,8 +2395,10 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'),
|
"BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'),
|
||||||
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
|
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
|
||||||
"VKD3D_VER": ("Версия VKD3D", 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'<p style="line-height: 1.3; font-size: 9pt;">'
|
||||||
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
|
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
|
||||||
@@ -3340,6 +3366,43 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"Будет использована системная версия Wine.")
|
"Будет использована системная версия Wine.")
|
||||||
return 'wine' # По умолчанию системный 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):
|
def _run_wine_util(self, util_name, prefix_name=None):
|
||||||
"""Запускает стандартную утилиту Wine для выбранного префикса."""
|
"""Запускает стандартную утилиту Wine для выбранного префикса."""
|
||||||
if not prefix_name:
|
if not prefix_name:
|
||||||
|
Reference in New Issue
Block a user