Optimize logs, requests, connection pages Optimize windows tray auto hide Optimize some details Update core
101 lines
2.9 KiB
Dart
Executable File
101 lines
2.9 KiB
Dart
Executable File
import 'dart:io';
|
|
|
|
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/state.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_acrylic/flutter_acrylic.dart' as acrylic;
|
|
import 'package:screen_retriever/screen_retriever.dart';
|
|
import 'package:window_manager/window_manager.dart';
|
|
|
|
class Window {
|
|
Future<void> init(int version) async {
|
|
final props = globalState.config.windowProps;
|
|
final acquire = await singleInstanceLock.acquire();
|
|
if (!acquire) {
|
|
exit(0);
|
|
}
|
|
if (system.isWindows) {
|
|
protocol.register('clash');
|
|
protocol.register('clashmeta');
|
|
protocol.register('flclash');
|
|
}
|
|
if ((version > 10 && system.isMacOS)) {
|
|
await acrylic.Window.initialize();
|
|
}
|
|
await windowManager.ensureInitialized();
|
|
WindowOptions windowOptions = WindowOptions(
|
|
size: Size(props.width, props.height),
|
|
minimumSize: const Size(380, 400),
|
|
);
|
|
if (!system.isMacOS || version > 10) {
|
|
await windowManager.setTitleBarStyle(TitleBarStyle.hidden);
|
|
}
|
|
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,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
await windowManager.waitUntilReadyToShow(windowOptions, () async {
|
|
await windowManager.setPreventClose(true);
|
|
});
|
|
}
|
|
|
|
void updateMacOSBrightness(Brightness brightness) {
|
|
if (!system.isMacOS) {
|
|
return;
|
|
}
|
|
acrylic.Window.overrideMacOSBrightness(dark: brightness == Brightness.dark);
|
|
}
|
|
|
|
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 {
|
|
exit(0);
|
|
}
|
|
|
|
Future<void> hide() async {
|
|
render?.pause();
|
|
await windowManager.hide();
|
|
await windowManager.setSkipTaskbar(true);
|
|
}
|
|
}
|
|
|
|
final window = system.isDesktop ? Window() : null;
|