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 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 show() async { render?.resume(); await windowManager.show(); await windowManager.focus(); await windowManager.setSkipTaskbar(false); } Future get isVisible async { final value = await windowManager.isVisible(); commonPrint.log('window visible check: $value'); return value; } Future close() async { exit(0); } Future hide() async { render?.pause(); await windowManager.hide(); await windowManager.setSkipTaskbar(true); } } final window = system.isDesktop ? Window() : null;