Files
MWClash/lib/common/window.dart
chen08209 443970aaaa Add sqlite store
Optimize android quick action

Optimize backup and restore

Optimize more details
2026-01-26 16:53:09 +08:00

98 lines
2.7 KiB
Dart
Executable File

import 'dart:io';
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/models/config.dart';
import 'package:flutter/material.dart';
import 'package:screen_retriever/screen_retriever.dart';
import 'package:window_manager/window_manager.dart';
class Window {
static Window? _instance;
Window._internal();
factory Window() {
_instance ??= Window._internal();
return _instance!;
}
Future<void> init(int version, WindowProps props) async {
final acquire = await singleInstanceLock.acquire();
if (!acquire) {
exit(0);
}
if (system.isWindows) {
protocol.register('clash');
protocol.register('clashmeta');
protocol.register('flclash');
}
await windowManager.ensureInitialized();
// kDebugMode ? Size(680, 580) :
WindowOptions windowOptions = WindowOptions(
size: props.size,
minimumSize: const Size(380, 400),
);
if (!system.isMacOS || version > 10) {
await windowManager.setTitleBarStyle(TitleBarStyle.hidden);
}
await windowManager.setMaximizable(false);
await _windowPosition(props);
await windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.setPreventClose(true);
});
}
Future<void> _windowPosition(WindowProps props) async {
if (!system.isMacOS) {
final left = props.left ?? 0;
final top = props.top ?? 0;
final right = left + props.width;
final bottom = top + props.height;
if (left == 0 && top == 0) {
await windowManager.setAlignment(Alignment.center);
} else {
final displays = await screenRetriever.getAllDisplays();
final isPositionValid = displays.any((display) {
final displayBounds = Rect.fromLTWH(
display.visiblePosition!.dx,
display.visiblePosition!.dy,
display.size.width,
display.size.height,
);
return displayBounds.contains(Offset(left, top)) ||
displayBounds.contains(Offset(right, bottom));
});
if (isPositionValid) {
await windowManager.setPosition(Offset(left, top));
}
}
}
}
Future<void> show() async {
render?.resume();
await windowManager.show();
await windowManager.focus();
await windowManager.setSkipTaskbar(false);
}
Future<bool> get isVisible async {
final value = await windowManager.isVisible();
commonPrint.log('window visible check: $value');
return value;
}
Future<void> close() async {
await windowManager.close();
exit(0);
}
Future<void> hide() async {
render?.pause();
await windowManager.hide();
await windowManager.setSkipTaskbar(true);
}
}
final window = system.isDesktop ? Window() : null;