From b694da31f9e5870e59b35a9a3c71e16bfbe0f146 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 5 Oct 2026 10:10:47 -0400 Subject: [PATCH 1/2] Revert "swap to SystemNavigator.pop from exit" This reverts commit a86748e85fbd071d8831166dfcc19918faba8682, as it was causing issues on Windows. --- lib/controllers/unified_push.dart | 5 ++--- lib/main.dart | 3 +-- lib/widgets/appbar.dart | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/controllers/unified_push.dart b/lib/controllers/unified_push.dart index c4d923c..3edad02 100644 --- a/lib/controllers/unified_push.dart +++ b/lib/controllers/unified_push.dart @@ -3,7 +3,6 @@ import "dart:convert"; import "dart:io"; import "package:flutter/foundation.dart"; -import "package:flutter/services.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:intl/intl.dart"; import "package:nexus/controllers/key.dart"; @@ -78,7 +77,7 @@ class UnifiedPushController extends AsyncNotifier { KeyController.provider(KeyController.roomKey).future, ) == event.roomId)) { - if (isInBackground) SystemNavigator.pop(); + if (isInBackground) exit(0); return; } @@ -104,7 +103,7 @@ class UnifiedPushController extends AsyncNotifier { }, ); - if (isInBackground) SystemNavigator.pop(); + if (isInBackground) exit(0); }, onUnregistered: deregister, ); diff --git a/lib/main.dart b/lib/main.dart index 5ae33c2..8159396 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,6 @@ import "dart:io"; import "package:dynamic_color/dynamic_color.dart"; import "package:flutter/foundation.dart"; -import "package:flutter/services.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:material_emoji_picker/material_emoji_picker.dart"; import "package:media_kit/media_kit.dart"; @@ -80,7 +79,7 @@ void main(List args) async { .timeout(Duration(seconds: 5)); await Future.delayed(Duration(seconds: 10)); - SystemNavigator.pop(); + exit(0); } else { if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { await windowManager.ensureInitialized(); diff --git a/lib/widgets/appbar.dart b/lib/widgets/appbar.dart index c19d01d..33727ac 100644 --- a/lib/widgets/appbar.dart +++ b/lib/widgets/appbar.dart @@ -1,7 +1,6 @@ import "dart:io"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; -import "package:flutter/services.dart"; import "package:material_ui/material_ui.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/settings.dart"; @@ -60,7 +59,7 @@ final class const Appbar({ ), IconButton( tooltip: "Close window", - onPressed: SystemNavigator.pop, + onPressed: () => exit(0), icon: const Icon(Icons.close), ), ], From 02c486e1b3aff37591ae8503df0ca04d927a3af8 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 5 Oct 2026 10:11:16 -0400 Subject: [PATCH 2/2] make it more clear which methods free the buffer --- lib/controllers/client.dart | 2 +- lib/controllers/gomuks_listener.dart | 2 +- lib/helpers/extensions/gomuks_buffer.dart | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 0ba29d5..7d9604b 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -108,7 +108,7 @@ class ClientController extends AsyncNotifier { () => callback(handle, bufferPointer.ref), ); - final json = response.buf.toJson(); + final json = response.buf.toJsonAndFree(); if (response.command.cast().toDartString() == "error") { throw json; diff --git a/lib/controllers/gomuks_listener.dart b/lib/controllers/gomuks_listener.dart index 489af72..2a43676 100644 --- a/lib/controllers/gomuks_listener.dart +++ b/lib/controllers/gomuks_listener.dart @@ -35,7 +35,7 @@ class GomuksListenerController extends AsyncNotifier { try { final muksEventType = command.cast().toDartString(); debugPrint("Handling $muksEventType..."); - final decodedMuksEvent = data.toJson(); + final decodedMuksEvent = data.toJsonAndFree(); switch (muksEventType) { case "client_state": diff --git a/lib/helpers/extensions/gomuks_buffer.dart b/lib/helpers/extensions/gomuks_buffer.dart index cc16b46..10a273a 100644 --- a/lib/helpers/extensions/gomuks_buffer.dart +++ b/lib/helpers/extensions/gomuks_buffer.dart @@ -1,20 +1,21 @@ import "dart:convert"; import "dart:ffi"; import "dart:typed_data"; + import "package:ffi/ffi.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; extension GomuksOwnedBufferToX on GomuksOwnedBuffer { - Uint8List toBytes() { + Uint8List toBytesAndFree() { try { if (base == nullptr || length <= 0) return .new(0); return .fromList(base.asTypedList(length)); } finally { - calloc.free(base); + GomuksFreeBuffer(this); } } - dynamic toJson() => jsonDecode(utf8.decode(toBytes())); + dynamic toJsonAndFree() => jsonDecode(utf8.decode(toBytesAndFree())); } extension JsonToGomuksBuffer on Map {