@@ -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 :