Skip to content

Commit 1d11414

Browse files
committed
Add window centering functionality
Introduces a new method to center windows on the primary display in the Dart API, updates native bindings to expose `native_window_center`, and includes necessary C++ implementation files in iOS and macOS builds. This improves window management and user experience by allowing easy window centering.
1 parent 41556ae commit 1d11414

7 files changed

Lines changed: 42 additions & 3 deletions

File tree

packages/cnativeapi/ios/cnativeapi/Sources/cnativeapi/cnativeapi.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,4 @@
4747
#include "../../../../cxx_impl/src/secure_storage.cpp"
4848
#include "../../../../cxx_impl/src/tray_manager.cpp"
4949
#include "../../../../cxx_impl/src/window_manager.cpp"
50+
#include "../../../../cxx_impl/src/window_registry.cpp"

packages/cnativeapi/ios/cnativeapi/Sources/cnativeapi/include/cnativeapi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "../../../../../cxx_impl/src/foundation/geometry.h"
1515
#include "../../../../../cxx_impl/src/foundation/id_allocator.h"
1616
#include "../../../../../cxx_impl/src/foundation/native_object_provider.h"
17+
#include "../../../../../cxx_impl/src/foundation/object_registry.h"
1718
#include "../../../../../cxx_impl/src/image.h"
1819
#include "../../../../../cxx_impl/src/keyboard_event.h"
1920
#include "../../../../../cxx_impl/src/keyboard_monitor.h"
@@ -31,6 +32,7 @@
3132
#include "../../../../../cxx_impl/src/window.h"
3233
#include "../../../../../cxx_impl/src/window_event.h"
3334
#include "../../../../../cxx_impl/src/window_manager.h"
35+
#include "../../../../../cxx_impl/src/window_registry.h"
3436
#endif
3537

3638
// C API headers (available for both C and C++)

packages/cnativeapi/lib/src/bindings_generated.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,17 @@ class CNativeApiBindings {
586586
late final _native_window_get_position = _native_window_get_positionPtr
587587
.asFunction<native_point_t Function(native_window_t)>();
588588

589+
void native_window_center(native_window_t window) {
590+
return _native_window_center(window);
591+
}
592+
593+
late final _native_window_centerPtr =
594+
_lookup<ffi.NativeFunction<ffi.Void Function(native_window_t)>>(
595+
'native_window_center',
596+
);
597+
late final _native_window_center = _native_window_centerPtr
598+
.asFunction<void Function(native_window_t)>();
599+
589600
/// Window properties
590601
void native_window_set_resizable(native_window_t window, bool resizable) {
591602
return _native_window_set_resizable(window, resizable);
@@ -3823,7 +3834,8 @@ class CNativeApiBindings {
38233834
_native_window_manager_shutdownPtr.asFunction<void Function()>();
38243835

38253836
/// Set (or clear) the "will show" hook.
3826-
/// @param callback Function called before window is shown (e.g., makeKeyAndOrderFront: on macOS). NULL to clear.
3837+
/// @param callback Function called before window is shown (e.g., makeKeyAndOrderFront: on macOS).
3838+
/// NULL to clear.
38273839
/// @param user_data Opaque pointer passed back to callback.
38283840
void native_window_manager_set_will_show_hook(
38293841
native_window_will_show_callback_t callback,
@@ -3851,7 +3863,8 @@ class CNativeApiBindings {
38513863
>();
38523864

38533865
/// Set (or clear) the "will hide" hook.
3854-
/// @param callback Function called before window is hidden (e.g., orderOut: on macOS). NULL to clear.
3866+
/// @param callback Function called before window is hidden (e.g., orderOut: on macOS). NULL to
3867+
/// clear.
38553868
/// @param user_data Opaque pointer passed back to callback.
38563869
void native_window_manager_set_will_hide_hook(
38573870
native_window_will_hide_callback_t callback,

packages/cnativeapi/macos/cnativeapi/Sources/cnativeapi/cnativeapi.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@
4646
#include "../../../../cxx_impl/src/secure_storage.cpp"
4747
#include "../../../../cxx_impl/src/tray_manager.cpp"
4848
#include "../../../../cxx_impl/src/window_manager.cpp"
49+
#include "../../../../cxx_impl/src/window_registry.cpp"

packages/cnativeapi/macos/cnativeapi/Sources/cnativeapi/include/cnativeapi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "../../../../../cxx_impl/src/foundation/geometry.h"
1515
#include "../../../../../cxx_impl/src/foundation/id_allocator.h"
1616
#include "../../../../../cxx_impl/src/foundation/native_object_provider.h"
17+
#include "../../../../../cxx_impl/src/foundation/object_registry.h"
1718
#include "../../../../../cxx_impl/src/image.h"
1819
#include "../../../../../cxx_impl/src/keyboard_event.h"
1920
#include "../../../../../cxx_impl/src/keyboard_monitor.h"
@@ -31,6 +32,7 @@
3132
#include "../../../../../cxx_impl/src/window.h"
3233
#include "../../../../../cxx_impl/src/window_event.h"
3334
#include "../../../../../cxx_impl/src/window_manager.h"
35+
#include "../../../../../cxx_impl/src/window_registry.h"
3436
#endif
3537

3638
// C API headers (available for both C and C++)

packages/nativeapi/lib/src/window.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:ffi' hide Size;
22
import 'package:ffi/ffi.dart' as ffi;
3+
import 'package:nativeapi/src/display_manager.dart';
34
import 'package:nativeapi/src/foundation/cnativeapi_bindings_mixin.dart';
45
import 'package:nativeapi/src/foundation/geometry.dart';
56
import 'package:nativeapi/src/foundation/native_handle_wrapper.dart';
@@ -236,6 +237,25 @@ class Window
236237
return Offset(nativePoint.x, nativePoint.y);
237238
}
238239

240+
/// Centers the window on the primary screen.
241+
///
242+
/// This method calculates the center position based on the primary display's
243+
/// size and the window's current size, then sets the window position accordingly.
244+
void center() {
245+
final primaryDisplay = DisplayManager.instance.getPrimary();
246+
if (primaryDisplay == null) {
247+
return;
248+
}
249+
250+
final screenSize = primaryDisplay.size;
251+
final windowSize = size;
252+
253+
final centerX = (screenSize.width - windowSize.width) / 2;
254+
final centerY = (screenSize.height - windowSize.height) / 2;
255+
256+
setPosition(centerX, centerY);
257+
}
258+
239259
// === Window Properties ===
240260

241261
/// Sets whether the window can be resized.

0 commit comments

Comments
 (0)