Skip to content

Commit

Permalink
feat(performance): dispose every widget on window hidden and re-initi…
Browse files Browse the repository at this point in the history
…alize when shown
  • Loading branch information
KRTirtho committed Mar 23, 2023
1 parent 6dd24d3 commit 1ed5452
Show file tree
Hide file tree
Showing 4 changed files with 207 additions and 17 deletions.
8 changes: 7 additions & 1 deletion lib/collections/shortcuts_registry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,28 @@ class ShortcutsRegistry {
final Map<ShortcutAction, VoidCallback> _shortcuts = {
ShortcutAction.openFlemozi: () async {
if (await windowManager.isVisible() && !await windowManager.isFocused()) {
if (kIsLinux) await windowManager.setAlwaysOnTop(true);
if (kIsLinux) {
await windowManager.setAlwaysOnTop(true);
}
await windowManager.focus();
if (kIsLinux) await windowManager.grabKeyboard();
if (kIsLinux) {
Future.delayed(const Duration(milliseconds: 100), () async {
await windowManager.setAlwaysOnTop(false);
await windowManager.focus();
await windowManager.grabKeyboard();
});
}
} else {
if (kIsLinux) await windowManager.setAlwaysOnTop(true);
await windowManager.show();
await windowManager.focus();
if (kIsLinux) await windowManager.grabKeyboard();
if (kIsLinux) {
Future.delayed(const Duration(milliseconds: 100), () async {
await windowManager.setAlwaysOnTop(false);
await windowManager.focus();
await windowManager.grabKeyboard();
});
}
}
Expand Down
164 changes: 164 additions & 0 deletions lib/hooks/use_window_listeners.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:window_manager/window_manager.dart';

void useWindowListeners({
VoidCallback? onWindowClose,
VoidCallback? onWindowFocus,
VoidCallback? onWindowBlur,
VoidCallback? onWindowMaximize,
VoidCallback? onWindowUnmaximize,
VoidCallback? onWindowMinimize,
VoidCallback? onWindowRestore,
VoidCallback? onWindowResize,
VoidCallback? onWindowResized,
VoidCallback? onWindowMove,
VoidCallback? onWindowMoved,
VoidCallback? onWindowEnterFullScreen,
VoidCallback? onWindowLeaveFullScreen,
ValueChanged<String>? onWindowEvent,
}) {
return use(
UseWindowListeners(
onWindowClose: onWindowClose,
onWindowFocus: onWindowFocus,
onWindowBlur: onWindowBlur,
onWindowMaximize: onWindowMaximize,
onWindowUnmaximize: onWindowUnmaximize,
onWindowMinimize: onWindowMinimize,
onWindowRestore: onWindowRestore,
onWindowResize: onWindowResize,
onWindowResized: onWindowResized,
onWindowMove: onWindowMove,
onWindowMoved: onWindowMoved,
onWindowEnterFullScreen: onWindowEnterFullScreen,
onWindowLeaveFullScreen: onWindowLeaveFullScreen,
onWindowEvent: onWindowEvent,
),
);
}

class UseWindowListeners extends Hook {
final VoidCallback? onWindowClose;
final VoidCallback? onWindowFocus;
final VoidCallback? onWindowBlur;
final VoidCallback? onWindowMaximize;
final VoidCallback? onWindowUnmaximize;
final VoidCallback? onWindowMinimize;
final VoidCallback? onWindowRestore;
final VoidCallback? onWindowResize;
final VoidCallback? onWindowResized;
final VoidCallback? onWindowMove;
final VoidCallback? onWindowMoved;
final VoidCallback? onWindowEnterFullScreen;
final VoidCallback? onWindowLeaveFullScreen;
final ValueChanged<String>? onWindowEvent;

const UseWindowListeners({
this.onWindowClose,
this.onWindowFocus,
this.onWindowBlur,
this.onWindowMaximize,
this.onWindowUnmaximize,
this.onWindowMinimize,
this.onWindowRestore,
this.onWindowResize,
this.onWindowResized,
this.onWindowMove,
this.onWindowMoved,
this.onWindowEnterFullScreen,
this.onWindowLeaveFullScreen,
this.onWindowEvent,
});

@override
_UseWindowListenersState createState() => _UseWindowListenersState();
}

class _UseWindowListenersState extends HookState<void, UseWindowListeners>
implements WindowListener {
@override
void initHook() {
super.initHook();
WindowManager.instance.addListener(this);
}

@override
void dispose() {
WindowManager.instance.removeListener(this);
super.dispose();
}

@override
void build(BuildContext context) {}

@override
void onWindowBlur() {
hook.onWindowBlur?.call();
}

@override
void onWindowClose() {
hook.onWindowClose?.call();
}

@override
void onWindowEnterFullScreen() {
hook.onWindowEnterFullScreen?.call();
}

@override
void onWindowEvent(String eventName) {
hook.onWindowEvent?.call(eventName);
}

@override
void onWindowFocus() {
hook.onWindowFocus?.call();
}

@override
void onWindowLeaveFullScreen() {
hook.onWindowLeaveFullScreen?.call();
}

@override
void onWindowMaximize() {
hook.onWindowMaximize?.call();
}

@override
void onWindowMinimize() {
hook.onWindowMinimize?.call();
}

@override
void onWindowMove() {
hook.onWindowMove?.call();
}

@override
void onWindowMoved() {
hook.onWindowMoved?.call();
}

@override
void onWindowResize() {
hook.onWindowResize?.call();
}

@override
void onWindowResized() {
hook.onWindowResized?.call();
}

@override
void onWindowRestore() {
hook.onWindowRestore?.call();
}

@override
void onWindowUnmaximize() {
hook.onWindowUnmaximize?.call();
}
}
2 changes: 2 additions & 0 deletions lib/intents/close_window.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flemozi/utils/platform.dart';
import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';

Expand All @@ -8,6 +9,7 @@ class CloseWindowIntent extends Intent {
class CloseWindowAction extends Action<CloseWindowIntent> {
@override
void invoke(CloseWindowIntent intent) async {
if (kIsLinux) await windowManager.ungrabKeyboard();
await windowManager.hide();
}
}
50 changes: 34 additions & 16 deletions lib/pages/root.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flemozi/components/root/emoji.dart';
import 'package:flemozi/components/root/gif.dart';
import 'package:flemozi/components/ui/top_bar.dart';
import 'package:flemozi/components/ui/vertical_tabs.dart';
import 'package:flemozi/hooks/use_window_listeners.dart';
import 'package:flemozi/intents/close_window.dart';
import 'package:flemozi/pages/settings/settings.dart';
import 'package:flutter/material.dart';
Expand All @@ -13,6 +14,21 @@ class RootPage extends HookWidget {

@override
Widget build(BuildContext context) {
final windowIsShowing = useState(true);

useWindowListeners(onWindowEvent: (String eventName) {
switch (eventName) {
case "hide":
windowIsShowing.value = false;
break;
case "show":
windowIsShowing.value = true;
break;
default:
break;
}
});

return CallbackShortcuts(
bindings: {
LogicalKeySet(
Expand All @@ -28,22 +44,24 @@ class RootPage extends HookWidget {
},
child: Scaffold(
appBar: const TopBar(),
body: VerticalTabs(
tabs: const [
Tooltip(
message: 'Emoji',
child: Icon(Icons.emoji_emotions),
),
Tooltip(
message: 'GIFs',
child: Icon(Icons.gif_rounded),
),
],
children: const [
Emoji(),
Gif(),
],
),
body: windowIsShowing.value
? VerticalTabs(
tabs: const [
Tooltip(
message: 'Emoji',
child: Icon(Icons.emoji_emotions),
),
Tooltip(
message: 'GIFs',
child: Icon(Icons.gif_rounded),
),
],
children: const [
Emoji(),
Gif(),
],
)
: const SizedBox.shrink(),
),
);
}
Expand Down

0 comments on commit 1ed5452

Please sign in to comment.