diff --git a/winehelper b/winehelper
index d995b42..78dd9b8 100755
--- a/winehelper
+++ b/winehelper
@@ -1389,9 +1389,9 @@ wine_run () {
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
else
- $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
+ exec $MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
fi
- wait_wineserver
+ # wait_wineserver
}
wine_run_install () {
diff --git a/winehelper_gui.py b/winehelper_gui.py
index 43547ae..e25768d 100644
--- a/winehelper_gui.py
+++ b/winehelper_gui.py
@@ -3491,7 +3491,7 @@ class WineHelperGUI(QMainWindow):
QMessageBox.critical(self, "Ошибка", f"Не удалось модифицировать команду для отладки: {e}")
return
- process = QProcess(self)
+ process = QProcess()
env = QProcessEnvironment.systemEnvironment()
cmd_start_index = 0
@@ -3509,7 +3509,10 @@ class WineHelperGUI(QMainWindow):
arguments = clean_command[cmd_start_index + 1:]
process.setProcessEnvironment(env)
- process.finished.connect(lambda: self._on_app_process_finished(desktop_path))
+ # Используем functools.partial для надежной передачи аргументов
+ # и избегания проблем с замыканием в lambda.
+ process.finished.connect(partial(self._on_app_process_finished, desktop_path))
+
try:
process.start(program, arguments)
@@ -3528,6 +3531,36 @@ class WineHelperGUI(QMainWindow):
QMessageBox.critical(self, "Ошибка",
f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}")
+ def closeEvent(self, event):
+ """Обрабатывает событие закрытия главного окна."""
+ if self.running_apps:
+ msg_box = QMessageBox(self)
+ msg_box.setWindowTitle('Подтверждение выхода')
+ msg_box.setTextFormat(Qt.RichText)
+ msg_box.setText('Все запущенные приложения будут закрыты вместе с WineHelper.
'
+ "Вы уверены, что хотите выйти?")
+ msg_box.setIcon(QMessageBox.Question)
+
+ yes_button = msg_box.addButton("Да", QMessageBox.YesRole)
+ no_button = msg_box.addButton("Нет", QMessageBox.NoRole)
+ msg_box.setDefaultButton(no_button)
+
+ msg_box.exec_()
+
+ if msg_box.clickedButton() == yes_button:
+ # Корректно завершаем все дочерние процессы
+ for desktop_path, process in list(self.running_apps.items()):
+ if process.state() == QProcess.Running:
+ print(f"Завершение процесса для {desktop_path}...")
+ process.terminate()
+ if not process.waitForFinished(2000): # Ждем 2 сек
+ process.kill() # Если не закрылся, убиваем
+ event.accept()
+ else:
+ event.ignore()
+ else:
+ super().closeEvent(event)
+
def uninstall_app(self):
"""Удаляет выбранное установленное приложение и его префикс"""
if not self.current_selected_app or 'desktop_path' not in self.current_selected_app: