forked from CastroFidel/winehelper
		
	re-launching the program is disabled
This commit is contained in:
		| @@ -15,6 +15,7 @@ from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QH | ||||
|                              QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser) | ||||
| from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve | ||||
| from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter | ||||
| from PyQt5.QtNetwork import QLocalServer, QLocalSocket | ||||
|  | ||||
|  | ||||
| class Var: | ||||
| @@ -1015,6 +1016,17 @@ class WineHelperGUI(QMainWindow): | ||||
|         # Устанавливаем начальное состояние видимости панели | ||||
|         self.on_tab_changed(self.tabs.currentIndex()) | ||||
|  | ||||
|     def activate(self): | ||||
|         """ | ||||
|         Активирует и показывает окно приложения, поднимая его из свернутого состояния | ||||
|         и перемещая на передний план. | ||||
|         """ | ||||
|         # Убеждаемся, что окно не свернуто | ||||
|         self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) | ||||
|         self.show() | ||||
|         self.raise_() | ||||
|         self.activateWindow() | ||||
|  | ||||
|     def _reset_info_panel_to_default(self, tab_name): | ||||
|         """Сбрасывает правую панель в состояние по умолчанию для указанной вкладки.""" | ||||
|         if tab_name == "Автоматическая установка": | ||||
| @@ -2663,13 +2675,59 @@ class WineHelperGUI(QMainWindow): | ||||
|  | ||||
| def main(): | ||||
|     """Основная точка входа в приложение.""" | ||||
|     # QApplication должен быть создан до использования любых других частей Qt | ||||
|     app = QApplication(sys.argv) | ||||
|  | ||||
|     # Создаем уникальное имя для сокета на основе ID пользователя, | ||||
|     # чтобы у каждого пользователя был свой экземпляр. | ||||
|     socket_name = f"winehelper_{os.getuid()}" | ||||
|  | ||||
|     # Пытаемся подключиться к существующему экземпляру | ||||
|     socket = QLocalSocket() | ||||
|     socket.connectToServer(socket_name) | ||||
|  | ||||
|     # Если подключение успешно в течение 500 мс, значит, другой экземпляр уже запущен. | ||||
|     if socket.waitForConnected(500): | ||||
|         # Отправляем сообщение (любое, сам факт подключения - это сигнал) | ||||
|         socket.write(b"activate") | ||||
|         socket.waitForBytesWritten(500) | ||||
|         socket.disconnectFromServer() | ||||
|         # Успешно выходим, не запуская новый экземпляр | ||||
|         return 0 | ||||
|  | ||||
|     # Если подключиться не удалось, это первый экземпляр. | ||||
|     # На всякий случай удаляем старый файл сокета, если он остался от сбоя. | ||||
|     QLocalServer.removeServer(socket_name) | ||||
|  | ||||
|     dependency_manager = DependencyManager() | ||||
|     if dependency_manager.run(): | ||||
|         window = WineHelperGUI() | ||||
|  | ||||
|         # Создаем локальный сервер для приема "сигналов" от последующих запусков | ||||
|         server = QLocalServer(window) | ||||
|  | ||||
|         # Функция для обработки входящих подключений | ||||
|         def handle_new_connection(): | ||||
|             client_socket = server.nextPendingConnection() | ||||
|             if client_socket: | ||||
|                 # Ждем данные (не обязательно, но для надежности) | ||||
|                 client_socket.waitForReadyRead(100) | ||||
|                 client_socket.readAll() # Очищаем буфер | ||||
|                 window.activate() | ||||
|                 client_socket.close() | ||||
|  | ||||
|         server.newConnection.connect(handle_new_connection) | ||||
|  | ||||
|         # Начинаем слушать. Если не удалось, программа все равно будет работать, | ||||
|         # но без функции активации существующего окна. | ||||
|         if not server.listen(socket_name): | ||||
|             print(f"Предупреждение: не удалось запустить сервер {socket_name}: {server.errorString()}") | ||||
|  | ||||
|         # Сохраняем ссылку на сервер, чтобы он не был удален сборщиком мусора | ||||
|         window.server = server | ||||
|         window.show() | ||||
|         return app.exec_() | ||||
|  | ||||
|     return 1 | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|   | ||||
		Reference in New Issue
	
	Block a user