import 'dart:io'; import 'dart:ui'; import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; part 'window_notifier.g.dart'; const minimumWindowSize = Size(368, 568); const defaultWindowSize = Size(868, 668); @Riverpod(keepAlive: true) class WindowNotifier extends _$WindowNotifier with AppLogger { @override Future build() async { if (!PlatformUtils.isDesktop) return; // if (Platform.isWindows) { // loggy.debug("ensuring single instance"); // await WindowsSingleInstance.ensureSingleInstance([], "Hiddify"); // } await windowManager.ensureInitialized(); await windowManager.setMinimumSize(minimumWindowSize); await windowManager.setSize(defaultWindowSize); } Future open({bool focus = true}) async { await windowManager.show(); if (focus) await windowManager.focus(); if (Platform.isMacOS) { await windowManager.setSkipTaskbar(false); } } // TODO add option to quit or minimize to tray Future close() async { await windowManager.hide(); if (Platform.isMacOS) { await windowManager.setSkipTaskbar(true); } } Future quit() async { await ref .read(connectionNotifierProvider.notifier) .abortConnection() .timeout(const Duration(seconds: 2)) .catchError( (e) { loggy.warning("error aborting connection on quit", e); }, ); await trayManager.destroy(); await windowManager.destroy(); } }