Files
umbrix/lib/main.dart
2026-01-18 05:31:59 +03:00

58 lines
1.7 KiB
Dart

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 - try to focus existing window
try {
await Process.run('xdotool', ['search', '--name', 'Umbrix', 'windowactivate']);
} catch (_) {
// xdotool not available, just exit
}
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);
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
systemNavigationBarColor: Colors.transparent,
),
);
return lazyBootstrap(widgetsBinding, Environment.dev);
}