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