diff --git a/lib/components/components.dart b/lib/components/components.dart index 6d04529..90c7d93 100644 --- a/lib/components/components.dart +++ b/lib/components/components.dart @@ -21,7 +21,6 @@ import 'package:venera/foundation/history.dart'; import 'package:venera/foundation/image_provider/cached_image.dart'; import 'package:venera/foundation/local.dart'; import 'package:venera/foundation/res.dart'; -import 'package:venera/foundation/state_controller.dart'; import 'package:venera/network/cloudflare.dart'; import 'package:venera/pages/comic_page.dart'; import 'package:venera/pages/favorites/favorites_page.dart'; @@ -45,4 +44,5 @@ part 'scroll.dart'; part 'select.dart'; part 'side_bar.dart'; part 'comic.dart'; -part 'effects.dart'; \ No newline at end of file +part 'effects.dart'; +part 'gesture.dart'; \ No newline at end of file diff --git a/lib/components/gesture.dart b/lib/components/gesture.dart new file mode 100644 index 0000000..6db2d40 --- /dev/null +++ b/lib/components/gesture.dart @@ -0,0 +1,61 @@ +part of 'components.dart'; + +class MouseBackRecognizer extends BaseTapGestureRecognizer { + GestureTapDownCallback? onTapDown; + + MouseBackRecognizer({ + super.debugOwner, + super.supportedDevices, + super.allowedButtonsFilter, + }); + + @override + void handleTapCancel({ + required PointerDownEvent down, + PointerCancelEvent? cancel, + required String reason, + }) {} + + @override + void handleTapDown({required PointerDownEvent down}) { + final TapDownDetails details = TapDownDetails( + globalPosition: down.position, + localPosition: down.localPosition, + kind: getKindForPointer(down.pointer), + ); + + if (down.buttons == kBackMouseButton && onTapDown != null) { + invokeCallback('onTapDown', () => onTapDown!(details)); + } + } + + @override + void handleTapUp({ + required PointerDownEvent down, + required PointerUpEvent up, + }) {} +} + +class MouseBackDetector extends StatelessWidget { + const MouseBackDetector({super.key, required this.onTapDown, required this.child}); + + final Widget child; + + final GestureTapDownCallback onTapDown; + + @override + Widget build(BuildContext context) { + return RawGestureDetector( + gestures: { + MouseBackRecognizer: GestureRecognizerFactoryWithHandlers( + () => MouseBackRecognizer(), + (MouseBackRecognizer instance) { + instance.onTapDown = onTapDown; + }, + ), + }, + behavior: HitTestBehavior.translucent, + child: child, + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 858b97e..4f5d96a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,7 +20,7 @@ void main(List args) { runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); await init(); - if(App.isAndroid) { + if (App.isAndroid) { handleLinks(); } FlutterError.onError = (details) { @@ -73,6 +73,7 @@ class _MyAppState extends State { el.markNeedsBuild(); el.visitChildren(rebuild); } + (context as Element).visitChildren(rebuild); setState(() {}); } @@ -114,10 +115,10 @@ class _MyAppState extends State { ], locale: () { var lang = appdata.settings['language']; - if(lang == 'system') { + if (lang == 'system') { return null; } - return switch(lang) { + return switch (lang) { 'zh-CN' => const Locale('zh', 'CN'), 'zh-TW' => const Locale('zh', 'TW'), 'en-US' => const Locale('en'), @@ -148,7 +149,12 @@ class _MyAppState extends State { App.pop, ), }, - child: WindowFrame(widget), + child: MouseBackDetector( + onTapDown: (event) { + App.pop(); + }, + child: WindowFrame(widget), + ), ); } return _SystemUiProvider(Material(