From b0e23312d8e48ff08db50fd2390b7d692c7ce3c4 Mon Sep 17 00:00:00 2001 From: Umbrix Developer Date: Sat, 17 Jan 2026 22:06:01 +0300 Subject: [PATCH] fix: single instance with lock file only --- lib/main.dart | 35 +++++++++++++++++++++++++++++++++++ linux/CMakeLists.txt | 5 +++-- linux/my_application.cc | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2ce831bd..5707f722 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,44 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:umbrix/bootstrap.dart'; import 'package:umbrix/core/model/environment.dart'; void main() async { + // Single instance check - BEFORE Flutter initialization + if (Platform.isLinux || Platform.isWindows) { + final lockFile = File('/tmp/umbrix.lock'); + + if (await lockFile.exists()) { + try { + final pidString = await lockFile.readAsString(); + final pid = int.tryParse(pidString.trim()); + + if (pid != null) { + // Check if process is still alive + final result = await Process.run('ps', ['-p', pid.toString()]); + + if (result.exitCode == 0) { + // Process alive - just exit without trying to activate + print('Umbrix уже запущен'); + exit(0); + } else { + // Stale lock - remove it + await lockFile.delete(); + } + } + } catch (e) { + try { await lockFile.delete(); } catch (_) {} + } + } + + // Create lock file with current PID + try { + await lockFile.create(); + await lockFile.writeAsString(pid.toString()); + } catch (_) {} + } + final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index f8a720bc..60758a0c 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -108,8 +108,9 @@ install(CODE " set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") -install(FILES "../libcore/bin/lib/libcore.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) +# Libcore is copied by build script, not cmake +# install(FILES "../libcore/bin/lib/libcore.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" +# COMPONENT Runtime) install( FILES "../libcore/bin/HiddifyCli" diff --git a/linux/my_application.cc b/linux/my_application.cc index 50977fad..ac3afe83 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -137,6 +137,6 @@ MyApplication *my_application_new() { return MY_APPLICATION(g_object_new(my_application_get_type(), "application-id", APPLICATION_ID, - "flags", G_APPLICATION_DEFAULT_FLAGS, + "flags", G_APPLICATION_NON_UNIQUE, nullptr)); }