Skip to content

Commit 2b67700

Browse files
authored
fix: macos titlebar with recent macos and move window size code (#1376)
1 parent 76baeb7 commit 2b67700

File tree

5 files changed

+90
-69
lines changed

5 files changed

+90
-69
lines changed

lib/app/app_model.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class AppModel extends SafeChangeNotifier {
110110
_updateAvailable == null;
111111
notifyListeners();
112112

113-
if (!_allowManualUpdates || !isOnline) {
113+
if (!isOnline) {
114114
_updateAvailable = false;
115115
notifyListeners();
116116
return Future.value();
@@ -122,7 +122,7 @@ class AppModel extends SafeChangeNotifier {
122122
final onlineVersion = getExtendedVersionNumber(_onlineVersion) ?? 0;
123123
final currentVersion = getExtendedVersionNumber(version) ?? 0;
124124
if (onlineVersion > currentVersion) {
125-
_updateAvailable = true;
125+
_updateAvailable = _allowManualUpdates && true;
126126
} else {
127127
_updateAvailable = false;
128128
}
Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,45 @@
11
import 'dart:async';
22
import 'dart:ui';
33

4+
import 'package:shared_preferences/shared_preferences.dart';
45
import 'package:window_manager/window_manager.dart';
56

7+
import '../extensions/shared_preferences_x.dart';
68
import '../extensions/taget_platform_x.dart';
79

810
class WindowSizeToSettingsListener implements WindowListener {
9-
WindowSizeToSettingsListener({
10-
required Future<void> Function(Size value) onResize,
11-
required Future<void> Function(bool value) onMaximize,
12-
required Future<void> Function(bool value) onFullscreen,
13-
}) : _onResize = onResize,
14-
_onMaximize = onMaximize,
15-
_onFullscreen = onFullscreen;
16-
17-
final Future<void> Function(Size value) _onResize;
18-
final Future<void> Function(bool value) _onMaximize;
19-
final Future<void> Function(bool value) _onFullscreen;
11+
WindowSizeToSettingsListener({required SharedPreferences sharedPreferences})
12+
: _sp = sharedPreferences;
13+
14+
final SharedPreferences _sp;
15+
16+
static Future<WindowSizeToSettingsListener> register({
17+
required SharedPreferences sharedPreferences,
18+
required WindowManager windowManager,
19+
}) async {
20+
final wm = windowManager;
21+
final sp = sharedPreferences;
22+
if (sp.getBool(SPKeys.saveWindowSize) == null) {
23+
await sp.setBool(SPKeys.saveWindowSize, true);
24+
}
2025

21-
Timer? _debounce;
26+
if (sp.getBool(SPKeys.windowFullscreen) ?? false) {
27+
await wm.setFullScreen(true);
28+
} else if (sp.getBool(SPKeys.windowMaximized) ?? false) {
29+
await wm.maximize();
30+
} else {
31+
final height = sp.getInt(SPKeys.windowHeight) ?? 820;
32+
final width = sp.getInt(SPKeys.windowWidth) ?? 950;
33+
await wm.setSize(Size(width.toDouble(), height.toDouble()));
34+
}
35+
36+
final windowSizeToSettingsListener = WindowSizeToSettingsListener(
37+
sharedPreferences: sp,
38+
);
39+
wm.addListener(windowSizeToSettingsListener);
40+
41+
return windowSizeToSettingsListener;
42+
}
2243

2344
@override
2445
void onWindowBlur() {}
@@ -30,7 +51,7 @@ class WindowSizeToSettingsListener implements WindowListener {
3051
void onWindowDocked() {}
3152

3253
@override
33-
void onWindowEnterFullScreen() => _onFullscreen(true);
54+
void onWindowEnterFullScreen() => _sp.setBool(SPKeys.windowFullscreen, true);
3455

3556
@override
3657
void onWindowEvent(String eventName) {}
@@ -39,10 +60,10 @@ class WindowSizeToSettingsListener implements WindowListener {
3960
void onWindowFocus() {}
4061

4162
@override
42-
void onWindowLeaveFullScreen() => _onFullscreen(false);
63+
void onWindowLeaveFullScreen() => _sp.setBool(SPKeys.windowFullscreen, false);
4364

4465
@override
45-
void onWindowMaximize() => _onMaximize(true);
66+
void onWindowMaximize() => _sp.setBool(SPKeys.windowMaximized, true);
4667

4768
@override
4869
void onWindowMinimize() {}
@@ -55,20 +76,34 @@ class WindowSizeToSettingsListener implements WindowListener {
5576

5677
// Note: linux does not have window resized, so we need to use window resize
5778
// and debounce it
79+
Timer? _debounce;
80+
void dispose() => _debounce?.cancel();
5881
@override
5982
void onWindowResize() {
6083
if (isLinux) {
6184
if (_debounce?.isActive ?? false) _debounce?.cancel();
6285
_debounce = Timer(const Duration(seconds: 5), () {
63-
WindowManager.instance.getSize().then(_onResize);
86+
WindowManager.instance.getSize().then((v) async {
87+
if (_sp.getBool(SPKeys.saveWindowSize) ?? false) {
88+
_sp
89+
.setInt(SPKeys.windowHeight, v.height.toInt())
90+
.then((_) => _sp.setInt(SPKeys.windowWidth, v.width.toInt()));
91+
}
92+
});
6493
});
6594
}
6695
}
6796

6897
@override
6998
void onWindowResized() {
7099
if (isMacOS || isWindows) {
71-
WindowManager.instance.getSize().then(_onResize);
100+
WindowManager.instance.getSize().then((v) async {
101+
if (_sp.getBool(SPKeys.saveWindowSize) ?? false) {
102+
_sp
103+
.setInt(SPKeys.windowHeight, v.height.toInt())
104+
.then((_) => _sp.setInt(SPKeys.windowWidth, v.width.toInt()));
105+
}
106+
});
72107
}
73108
}
74109

@@ -79,5 +114,5 @@ class WindowSizeToSettingsListener implements WindowListener {
79114
void onWindowUndocked() {}
80115

81116
@override
82-
void onWindowUnmaximize() => _onMaximize(false);
117+
void onWindowUnmaximize() => _sp.setBool(SPKeys.windowMaximized, false);
83118
}

lib/register.dart

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:connectivity_plus/connectivity_plus.dart';
22
import 'package:dio/dio.dart';
3+
import 'package:flutter/material.dart';
34
import 'package:flutter_discord_rpc/flutter_discord_rpc.dart';
45
import 'package:github/github.dart';
56
import 'package:local_notifier/local_notifier.dart';
@@ -14,6 +15,7 @@ import 'package:window_manager/window_manager.dart';
1415
import 'app/app_model.dart';
1516
import 'app/connectivity_model.dart';
1617
import 'app/view/routing_manager.dart';
18+
import 'app/window_size_to_settings_listener.dart';
1719
import 'app_config.dart';
1820
import 'custom_content/custom_content_model.dart';
1921
import 'expose/expose_service.dart';
@@ -64,6 +66,19 @@ void registerDependencies() {
6466
di.registerSingletonAsync<WindowManager>(() async {
6567
final wm = WindowManager.instance;
6668
await wm.ensureInitialized();
69+
await wm.waitUntilReadyToShow(
70+
const WindowOptions(
71+
backgroundColor: Colors.transparent,
72+
minimumSize: Size(500, 700),
73+
skipTaskbar: false,
74+
titleBarStyle: TitleBarStyle.hidden,
75+
),
76+
() async {
77+
await windowManager.show();
78+
await windowManager.focus();
79+
},
80+
);
81+
6782
return wm;
6883
});
6984
}
@@ -84,20 +99,27 @@ void registerDependencies() {
8499
defaultValue: '2.11.0',
85100
);
86101
return SettingsService(
87-
windowManager: AppConfig.windowManagerImplemented
88-
? di<WindowManager>()
89-
: null,
90102
forcedUpdateThreshold: forcedUpdateThreshold,
91103
sharedPreferences: di<SharedPreferences>(),
92104
downloadsDefaultDir: downloadsDefaultDir,
93105
);
94106
},
95-
dependsOn: [
96-
SharedPreferences,
97-
if (AppConfig.windowManagerImplemented) WindowManager,
98-
],
107+
dependsOn: [SharedPreferences],
99108
dispose: (s) async => s.dispose(),
100-
)
109+
);
110+
111+
if (AppConfig.windowManagerImplemented) {
112+
di.registerSingletonAsync<WindowSizeToSettingsListener>(
113+
() async => WindowSizeToSettingsListener.register(
114+
sharedPreferences: di<SharedPreferences>(),
115+
windowManager: di<WindowManager>(),
116+
),
117+
dispose: (s) => s.dispose(),
118+
dependsOn: [SharedPreferences, WindowManager],
119+
);
120+
}
121+
122+
di
101123
..registerSingletonWithDependencies(
102124
() => LastfmService(settingsService: di<SettingsService>()),
103125
dependsOn: [SettingsService],

lib/settings/settings_service.dart

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import 'dart:async';
22
import 'dart:io';
3-
import 'dart:ui';
43

54
import 'package:shared_preferences/shared_preferences.dart';
6-
import 'package:window_manager/window_manager.dart';
75

8-
import '../app/window_size_to_settings_listener.dart';
96
import '../app_config.dart';
107
import '../common/data/close_btn_action.dart';
118
import '../common/file_names.dart';
@@ -20,41 +17,9 @@ class SettingsService {
2017
required String? downloadsDefaultDir,
2118
required SharedPreferences sharedPreferences,
2219
required String forcedUpdateThreshold,
23-
required WindowManager? windowManager,
2420
}) : _preferences = sharedPreferences,
2521
_downloadsDefaultDir = downloadsDefaultDir,
26-
_forcedUpdateThreshold = forcedUpdateThreshold {
27-
if (windowManager != null) {
28-
final wm = windowManager;
29-
final ps = _preferences;
30-
wm
31-
..setMinimumSize(const Size(500, 700))
32-
..setSize(const Size(950, 820));
33-
wm.addListener(
34-
WindowSizeToSettingsListener(
35-
onFullscreen: (v) => ps.setBool(SPKeys.windowFullscreen, v),
36-
onMaximize: (v) => ps.setBool(SPKeys.windowMaximized, v),
37-
onResize: (v) async {
38-
if (ps.getBool(SPKeys.saveWindowSize) ?? false) {
39-
ps
40-
.setInt(SPKeys.windowHeight, v.height.toInt())
41-
.then((_) => ps.setInt(SPKeys.windowWidth, v.width.toInt()));
42-
}
43-
},
44-
),
45-
);
46-
47-
if (ps.getBool(SPKeys.windowFullscreen) ?? false) {
48-
wm.setFullScreen(true);
49-
} else if (ps.getBool(SPKeys.windowMaximized) ?? false) {
50-
wm.maximize();
51-
} else {
52-
final height = ps.getInt(SPKeys.windowHeight) ?? 820;
53-
final width = ps.getInt(SPKeys.windowWidth) ?? 950;
54-
wm.setSize(Size(width.toDouble(), height.toDouble()));
55-
}
56-
}
57-
}
22+
_forcedUpdateThreshold = forcedUpdateThreshold;
5823

5924
final String? _downloadsDefaultDir;
6025
final SharedPreferences _preferences;
@@ -156,8 +121,7 @@ class SettingsService {
156121
_preferences.setBool(SPKeys.blurredPlayerBackground, value).then(notify);
157122

158123
bool get saveWindowSize =>
159-
_preferences.getBool(SPKeys.saveWindowSize) ??
160-
AppConfig.windowManagerImplemented;
124+
_preferences.getBool(SPKeys.saveWindowSize) ?? false;
161125
void setSaveWindowSize(bool value) =>
162126
_preferences.setBool(SPKeys.saveWindowSize, value).then(notify);
163127

lib/settings/view/about_section.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ class _AboutTileState extends State<_AboutTile> {
6868
);
6969

7070
return YaruTile(
71-
subtitle: Text(
72-
context.l10n.downloadsOfLatestRelease(downloads.toString()),
73-
),
71+
subtitle: downloads == null
72+
? null
73+
: Text(context.l10n.downloadsOfLatestRelease(downloads.toString())),
7474
title:
7575
!di<ConnectivityModel>().isOnline == true ||
7676
!appModel.allowManualUpdate

0 commit comments

Comments
 (0)