Files
umbrix/lib/features/window/notifier/window_notifier.dart
2026-01-15 12:28:40 +03:00

58 lines
1.7 KiB
Dart

import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
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<void> 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<void> 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<void> close() async {
await windowManager.hide();
if (Platform.isMacOS) {
await windowManager.setSkipTaskbar(true);
}
}
Future<void> 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();
}
}