Desktop fixes for 0.25.0 (#24)

* Deep linking settings

* Update web template

* Fix template

* Fix web template again

* Bump dev_dependencies

* Add flutter_bootstrap.js

* Use project_name_slug variable

* web mobile-web-app-capable

* externalNativeBuild

* Remove externalNativeBuild

* serious_python: 0.8.2

* Added sys.argv support

* Pass argv

* pwa_background_color and pwa_theme_color options

* Fix pwa_background_color in template

* Fix pwa_background_color again

* Set default pwa_background_color

* pwa white background

* Use pid for sockets

* Move setupDesktop()

* Update MainFlutterWindow.swift

* Rewrite setupDesktop

* Use windowManager.setSkipTaskbar

* Hide Linux window

* Prevent quit on close

* FLET_HIDE_APP_ON_START
This commit is contained in:
Feodor Fitsner 2024-11-05 11:29:21 -08:00 committed by GitHub
parent 287ee5350f
commit 893e7d9fd5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 44 additions and 7 deletions

View File

@ -10,6 +10,7 @@ import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as path_provider; import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:serious_python/serious_python.dart'; import 'package:serious_python/serious_python.dart';
import 'package:url_strategy/url_strategy.dart'; import 'package:url_strategy/url_strategy.dart';
import 'package:window_manager/window_manager.dart';
{% for dep in cookiecutter.flutter.dependencies %} {% for dep in cookiecutter.flutter.dependencies %}
import 'package:{{ dep }}/{{ dep }}.dart' as {{ dep }}; import 'package:{{ dep }}/{{ dep }}.dart' as {{ dep }};
@ -99,6 +100,8 @@ void main(List<String> args) async {
debugPrint = (String? message, {int? wrapWidth}) => null; debugPrint = (String? message, {int? wrapWidth}) => null;
} }
await setupDesktop();
{% for dep in cookiecutter.flutter.dependencies %} {% for dep in cookiecutter.flutter.dependencies %}
{{ dep }}.ensureInitialized(); {{ dep }}.ensureInitialized();
{% endfor %} {% endfor %}
@ -156,8 +159,6 @@ Future prepareApp() async {
setPathUrlStrategy(); setPathUrlStrategy();
} }
} else { } else {
await setupDesktop();
// extract app from asset // extract app from asset
appDir = await extractAssetZip(assetPath, checkHash: true); appDir = await extractAssetZip(assetPath, checkHash: true);
@ -198,7 +199,7 @@ Future prepareApp() async {
environmentVariables["FLET_SERVER_PORT"] = tcpPort.toString(); environmentVariables["FLET_SERVER_PORT"] = tcpPort.toString();
} else { } else {
// use UDS on other platforms // use UDS on other platforms
pageUrl = "flet.sock"; pageUrl = "flet_$pid.sock";
environmentVariables["FLET_SERVER_UDS_PATH"] = pageUrl; environmentVariables["FLET_SERVER_UDS_PATH"] = pageUrl;
} }
} }
@ -227,7 +228,7 @@ Future<String?> runPythonApp(List<String> args) async {
'Python output TCP Server is listening on port ${outSocketServer.port}'); 'Python output TCP Server is listening on port ${outSocketServer.port}');
socketAddr = "$tcpAddr:${outSocketServer.port}"; socketAddr = "$tcpAddr:${outSocketServer.port}";
} else { } else {
socketAddr = "stdout.sock"; socketAddr = "stdout_$pid.sock";
if (await File(socketAddr).exists()) { if (await File(socketAddr).exists()) {
await File(socketAddr).delete(); await File(socketAddr).delete();
} }
@ -345,4 +346,33 @@ Future<int> getUnusedPort() {
socket.close(); socket.close();
return port; return port;
}); });
} }
bool isDesktop() {
return !kIsWeb &&
(defaultTargetPlatform == TargetPlatform.windows ||
defaultTargetPlatform == TargetPlatform.macOS ||
defaultTargetPlatform == TargetPlatform.linux);
}
Future setupDesktop() async {
if (isDesktop()) {
WidgetsFlutterBinding.ensureInitialized();
await windowManager.ensureInitialized();
Map<String, String> env = Platform.environment;
var hideWindowOnStart = env["FLET_HIDE_WINDOW_ON_START"];
var hideAppOnStart = env["FLET_HIDE_APP_ON_START"];
debugPrint("hideWindowOnStart: $hideWindowOnStart");
debugPrint("hideAppOnStart: $hideAppOnStart");
await windowManager.waitUntilReadyToShow(null, () async {
if (hideWindowOnStart == null && hideAppOnStart == null) {
await windowManager.show();
await windowManager.focus();
} else if (hideAppOnStart != null) {
await windowManager.setSkipTaskbar(true);
}
});
}
}

View File

@ -48,7 +48,7 @@ static void my_application_activate(GApplication* application) {
} }
gtk_window_set_default_size(window, 1280, 720); gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window)); gtk_widget_realize(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new(); g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);

View File

@ -4,6 +4,6 @@ import FlutterMacOS
@NSApplicationMain @NSApplicationMain
class AppDelegate: FlutterAppDelegate { class AppDelegate: FlutterAppDelegate {
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true return false
} }
} }

View File

@ -1,5 +1,6 @@
import Cocoa import Cocoa
import FlutterMacOS import FlutterMacOS
import window_manager
class MainFlutterWindow: NSWindow { class MainFlutterWindow: NSWindow {
override func awakeFromNib() { override func awakeFromNib() {
@ -12,4 +13,9 @@ class MainFlutterWindow: NSWindow {
super.awakeFromNib() super.awakeFromNib()
} }
override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {
super.order(place, relativeTo: otherWin)
hiddenWindowAtLaunch()
}
} }

View File

@ -23,6 +23,7 @@ dependencies:
dependency_overrides: dependency_overrides:
wakelock_plus: ^1.2.5 wakelock_plus: ^1.2.5
web: ^1.0.0 web: ^1.0.0
window_manager: ^0.4.3
# {% if 'flet_audio_recorder' in cookiecutter.flutter.dependencies %} # {% if 'flet_audio_recorder' in cookiecutter.flutter.dependencies %}
record: ^5.1.1 record: ^5.1.1