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)
|
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser)
|
||||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
|
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
|
||||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter
|
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter
|
||||||
|
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
|
||||||
|
|
||||||
class Var:
|
class Var:
|
||||||
@@ -1015,6 +1016,17 @@ class WineHelperGUI(QMainWindow):
|
|||||||
# Устанавливаем начальное состояние видимости панели
|
# Устанавливаем начальное состояние видимости панели
|
||||||
self.on_tab_changed(self.tabs.currentIndex())
|
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):
|
def _reset_info_panel_to_default(self, tab_name):
|
||||||
"""Сбрасывает правую панель в состояние по умолчанию для указанной вкладки."""
|
"""Сбрасывает правую панель в состояние по умолчанию для указанной вкладки."""
|
||||||
if tab_name == "Автоматическая установка":
|
if tab_name == "Автоматическая установка":
|
||||||
@@ -2663,13 +2675,59 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Основная точка входа в приложение."""
|
"""Основная точка входа в приложение."""
|
||||||
|
# QApplication должен быть создан до использования любых других частей Qt
|
||||||
app = QApplication(sys.argv)
|
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()
|
dependency_manager = DependencyManager()
|
||||||
if dependency_manager.run():
|
if dependency_manager.run():
|
||||||
window = WineHelperGUI()
|
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()
|
window.show()
|
||||||
return app.exec_()
|
return app.exec_()
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Reference in New Issue
Block a user