re-launching the program is disabled

This commit is contained in:
Sergey Palcheh
2025-08-14 16:00:58 +06:00
parent 95dd7ae598
commit 3e13cdf8f0

View File

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