diff --git a/lib/features/main_screen/querya_window_title_bar.dart b/lib/features/main_screen/querya_window_title_bar.dart index 64f68860..f611ff27 100644 --- a/lib/features/main_screen/querya_window_title_bar.dart +++ b/lib/features/main_screen/querya_window_title_bar.dart @@ -1,3 +1,5 @@ +import 'dart:io' show Platform; + import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/layout/ui_scale.dart'; @@ -57,6 +59,15 @@ class QueryaWindowTitleBar extends StatelessWidget { ); } + @visibleForTesting + static double titleBarLeadingInset({ + required bool isMacOS, + required double Function(double designPx) scale, + }) { + // macOS traffic lights sit in the transparent titlebar (bitsdojo custom frame). + return scale(isMacOS ? 72 : 16); + } + @visibleForTesting static WindowButtonColors closeButtonColors(BuildContext context) { final wb = context.workbench; @@ -85,7 +96,12 @@ class QueryaWindowTitleBar extends StatelessWidget { child: MoveWindow( child: Row( children: [ - const SizedBox(width: 16), + SizedBox( + width: QueryaWindowTitleBar.titleBarLeadingInset( + isMacOS: Platform.isMacOS, + scale: context.scaled, + ), + ), material.Icon( material.Icons.storage_rounded, size: 18, diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 3cc05eb2..b8e380c0 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -1,7 +1,12 @@ import Cocoa import FlutterMacOS +import bitsdojo_window_macos + +class MainFlutterWindow: BitsdojoWindow { + override func bitsdojo_window_configure() -> UInt { + return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP + } -class MainFlutterWindow: NSWindow { override func awakeFromNib() { let flutterViewController = FlutterViewController() let windowFrame = self.frame diff --git a/test/features/main_screen/querya_window_title_bar_test.dart b/test/features/main_screen/querya_window_title_bar_test.dart index 8f1f2674..fbe77a87 100644 --- a/test/features/main_screen/querya_window_title_bar_test.dart +++ b/test/features/main_screen/querya_window_title_bar_test.dart @@ -97,6 +97,24 @@ void main() { expect(background, _customSurface); }); + testWidgets('title bar leading inset reserves macOS traffic-light space', + (tester) async { + expect( + QueryaWindowTitleBar.titleBarLeadingInset( + isMacOS: true, + scale: (v) => v, + ), + 72, + ); + expect( + QueryaWindowTitleBar.titleBarLeadingInset( + isMacOS: false, + scale: (v) => v, + ), + 16, + ); + }); + testWidgets('read-only state is persistently visible in title bar', (tester) async { await tester.pumpWidget(