Skip to content

FFI#1: introduce Regular windows on Windows and macOS #39

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 53 commits into
base: windowing-ffi
Choose a base branch
from

Conversation

Saviq
Copy link
Collaborator

@Saviq Saviq commented Apr 2, 2025

No description provided.

@Saviq Saviq changed the base branch from windowing-ffi to master April 7, 2025 15:52
@Saviq Saviq force-pushed the multiwindow_ffi_work branch from 3ae68be to 06b22b4 Compare April 7, 2025 15:57
@Saviq Saviq changed the base branch from master to windowing-ffi April 7, 2025 16:00
@mattkae mattkae mentioned this pull request Apr 9, 2025
Copy link

@mattkae mattkae left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some initial feedback, but looks much better compared to the MethodChannel approach!

Dart_Isolate isolate_;
};

class IsolateScope {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add some docstrings here explaining why this needs to exist and what purpose it is serving?

// Window metadata returned as the result of creating a Flutter window.
struct WindowMetadata {
// The ID of the view used for this window, which is unique to each window.
FlutterViewId view_id = 0;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: I believe that we settled on calling this root_id, as a window can potentially contain many views

Comment on lines 48 to 52
bool flutter_windowing_has_top_level_windows(int64_t engine_id) {
flutter::FlutterWindowsEngine* engine =
flutter::FlutterWindowsEngine::GetEngineForId(engine_id);
return engine->get_host_window_controller()->HasTopLevelWindows();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We only seem to use this on the Windows platform. Why do we need this method? And - if we do - would it not be better for the framework to just have a way to list all of the active windows instead? That way they can do even more generic stuff if need be

Comment on lines 157 to 159
if (request->max_width != 0 && request->max_height != 0) {
settings.max_size = Size(request->max_width, request->max_height);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we have it such that only a single dimension is constrained?

Comment on lines 42 to 44
flutter::FlutterWindowsEngine* engine =
flutter::FlutterWindowsEngine::GetEngineForId(engine_id);
engine->get_host_window_controller()->Initialize(request);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
flutter::FlutterWindowsEngine* engine =
flutter::FlutterWindowsEngine::GetEngineForId(engine_id);
engine->get_host_window_controller()->Initialize(request);
flutter::FlutterWindowsEngine* engine =
flutter::FlutterWindowsEngine::GetEngineForId(engine_id);
if (!engine)
return; // And maybe provide an error code of some sort?
engine->get_host_window_controller()->Initialize(request);

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same goes for all of the requests below

@@ -491,7 +491,7 @@ static void fl_compositor_opengl_wait_for_frame(FlCompositor* compositor,
self->blocking_main_thread = true;
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
if (engine != nullptr) {
fl_task_runner_block_main_thread(fl_engine_get_task_runner(engine));
// fl_task_runner_block_main_thread(fl_engine_get_task_runner(engine));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this intentional?

@@ -66,6 +67,8 @@ struct _FlEngine {
// Implements the flutter/windowing channel.
FlWindowingHandler* windowing_handler;

FlWindowingController* windowing_controller;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you modify the linux platform if you didn't change anything here?

@@ -0,0 +1,2 @@
{
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this intentionally added?

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

// Future<Object?>? Function(MethodCall)? _createWindowMethodCallHandler({
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should all of this remain commented?

@mattkae mattkae requested a review from robert-ancell April 9, 2025 20:32
@@ -450,6 +450,8 @@ @implementation FlutterEngine {
// factories. Lifecycle is tied to the engine.
FlutterPlatformViewController* _platformViewController;

FlutterWindowController* _windowController;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing comment

@@ -481,8 +483,13 @@ @implementation FlutterEngine {

// The text input plugin that handles text editing state for text fields.
FlutterTextInputPlugin* _textInputPlugin;

BOOL _multiviewEnabled;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing comment(s)

@@ -727,6 +740,11 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint {
[engine onVSync:baton];
};

flutterArguments.view_focus_change_request_callback = [](const FlutterViewFocusChangeRequest* req,
void* user_data) {
NSLog(@"Focus calllback %lli %i\n", req->view_id, req->state);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Obviously a WIP, but perhaps a comment noting what it should be doing.

int64_t FlutterGetWindowState(void* window) {
NSWindow* w = (__bridge NSWindow*)window;
if (w.isZoomed) {
return 1;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use an enum for these?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I'll use the values from flutter::WindowState.

@@ -45,6 +45,7 @@ class Size {
bool operator==(const Size& other) const {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably be removed. We're not (or shouldn't) use this in embedders.

@@ -0,0 +1,105 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file should also be obsolete for FFI.

@Saviq Saviq force-pushed the multiwindow_ffi_work branch from 6b64e4e to 78897e7 Compare April 17, 2025 16:36
LinXunFeng and others added 16 commits April 17, 2025 21:35
Feat: Add equality to NoDefaultCupertinoThemeData
fixes: flutter#165455 

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
fixes flutter#137704

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
fixes flutter#162036

This fixes the problem my scaling the render texture by the content
scalar. This means locally you'll probably be generating 2048x1536
images. This matches the rendering that is happening in playgrounds. On
CI the content scalar should be one so there is no change there.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
fixes flutter#144943

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
fixes flutter#137970

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…r#167361)

https://dart.googlesource.com/sdk.git/+log/992221a362ec..2bb85834e77e

2025-04-17 [email protected]
Version 3.9.0-28.0.dev
2025-04-17 [email protected]
Version 3.9.0-27.0.dev
2025-04-17 [email protected]
Version 3.9.0-26.0.dev
2025-04-16 [email protected]
Version 3.9.0-25.0.dev
2025-04-16 [email protected]
Version 3.9.0-24.0.dev
2025-04-16 [email protected]
Version 3.9.0-23.0.dev
2025-04-16 [email protected]
Version 3.9.0-22.0.dev

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/dart-sdk-flutter
Please CC [email protected],[email protected] on the revert to
ensure that a human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…hread (flutter#166918)

If settings.merged_platform_ui_thread is set to kMergeAfterLaunch, then
the engine will be started on the UI thread. After engine setup
completes and the Dart isolate is loaded, the UI task runner will be
merged into the platform thread and all future Dart execution will run
on the platform thread.

This makes it possible for other work to run on the platform thread
while the engine starts.

See flutter#163064
…7347)

https://skia.googlesource.com/skia.git/+log/cc2b57434651..a409d685a711

2025-04-17 [email protected] Revert "[graphite] Update DrawWriter
to minimize binds by using pending base offsets."
2025-04-17 [email protected] [graphite] Use sk_sp<TextureProxy> for
ClipAtlas instead of raw pointer.
2025-04-17 [email protected] Roll
vulkan-deps from 3bc11f8f2d55 to f6ce0375d108 (4 revisions)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/skia-flutter-autoroll
Please CC [email protected],[email protected],[email protected] on the
revert to ensure that a human
is aware of the problem.

To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…... (flutter#167385)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/fuchsia-linux-sdk-flutter
Please CC [email protected],[email protected] on the revert to ensure that
a human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#167387)

https://dart.googlesource.com/sdk.git/+log/2bb85834e77e..b1eb743f97f5

2025-04-18 [email protected]
Version 3.9.0-30.0.dev
2025-04-17 [email protected]
Version 3.9.0-29.0.dev

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/dart-sdk-flutter
Please CC [email protected],[email protected] on the revert to
ensure that a human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…67388)

https://skia.googlesource.com/skia.git/+log/a409d685a711..acc910544da7

2025-04-18 [email protected] Manual roll
Dawn from 33862a3ffc8a to 971cc7345000 (191 revisions)
2025-04-17 [email protected] Roll
vulkan-deps from f6ce0375d108 to da64cc98aa1f (7 revisions)
2025-04-17 [email protected] Fix ChromePrecompileTest for Intel
Macs
2025-04-17 [email protected] [infra] Add P30 jobs
2025-04-17 [email protected] Roll
skottie-base from 868103199143 to f4a4eee934a3
2025-04-17 [email protected] Roll
shaders-base from 64b9cec3c82d to 11837b5a53d7
2025-04-17 [email protected] Roll
jsfiddle-base from 05716f858285 to 05b60ca904d9
2025-04-17 [email protected] Roll
debugger-app-base from 9e80d6bc5f11 to f59c59370426
2025-04-17 [email protected] [graphite] Run precompile tests when
making changes to relevant files
2025-04-17 [email protected] [graphite] Use sk_sp<TextureProxy> for
PathAtlas instead of raw pointer.

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/skia-flutter-autoroll
Please CC [email protected],[email protected],[email protected] on the
revert to ensure that a human
is aware of the problem.

To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
@Saviq Saviq force-pushed the multiwindow_ffi_work branch from 72861c6 to 688b605 Compare April 18, 2025 15:08
Copy link
Collaborator Author

@Saviq Saviq left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@knopp some tweaks / questions inline.

Comment on lines +22 to +32
/// Defines the possible states that a window can be in.
enum WindowState {
/// Window is in its normal state, neither maximized, nor minimized.
restored,

/// Window is maximized, occupying the full screen but still showing the system UI.
maximized,

/// Window is minimized and not visible on the screen.
minimized,
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bearing in mind what we talked about wrt. "rich" states, should we leave this out for now?

Or already go for:

class WindowState {
}

class Restored : WindowState {
}

// ...

Comment on lines +39 to +40
/// Preferred size of the window. This may not be honored by the platform.
final Size? size;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Preferred size of the window. This may not be honored by the platform.
final Size? size;
/// Preferred size of the window content. This may not be honored by the platform.
final Size? preferredSize;

Comment on lines +120 to +121
/// size: const Size(800, 600),
/// sizeConstraints: const BoxConstraints(minWidth: 640, minHeight: 480),
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// size: const Size(800, 600),
/// sizeConstraints: const BoxConstraints(minWidth: 640, minHeight: 480),
/// contentSize: const WindowSizing(
/// size: Size(800, 600),
/// constraints: BoxConstraints(minWidth: 640, minHeight: 480),
/// ),

/// Creates a [RegularWindowController] with the provided properties.
/// Upon construction, the window is created for the platform.
///
/// [contentSize] Initial content size of the window.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// [contentSize] Initial content size of the window.
/// [contentSize] sizing requests for the window. This may not be honored by the platform

Comment on lines +171 to +179
/// Request change for the window content size.
///
/// [contentSize] describes the new requested window size. The properties
/// of this object are applied independently of each other. For example,
/// setting [WindowSizing.size] does not affect the [WindowSizing.constraints]
/// set previously.
///
/// System compositor is free to ignore the request.
void setContentSize(WindowSizing contentSize);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should it be updateContentSize, then?

Or even, make the property WindowSizing sizing;?


/// [WindowingOwner] is responsible for creating and managing window controllers.
///
/// Custom subclass can be provided by subclassing [WidgetsBinding] and
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Custom subclass can be provided by subclassing [WidgetsBinding] and
/// Custom subclass can be provided by subclassing [WidgetsBinding]

Comment on lines +230 to +254
/// The [RegularWindow] widget provides a way to render a regular window in the
/// widget tree. The provided [controller] creates the native window that backs
/// the widget. The [child] widget is rendered into this newly created window.
///
/// While the window is being created, the [RegularWindow] widget will render
/// an empty [ViewCollection] widget. Once the window is created, the [child]
/// widget will be rendered into the window inside of a [View].
///
/// An example usage might look like:
/// ```dart
/// final RegularWindowController controller = RegularWindowController(
/// size: const Size(800, 600),
/// sizeConstraints: const BoxConstraints(minWidth: 640, minHeight: 480),
/// title: "Example Window",
/// );
/// runApp(RegularWindow(
/// controller: controller,
/// child: MaterialApp(home: Container())));
/// ```
///
/// When a [RegularWindow] widget is removed from the tree, the window that was created
/// by the [controller] is automatically destroyed if it has not yet been destroyed.
///
/// Widgets in the same tree as the [child] widget will have access to the
/// [RegularWindowController] via the [WindowControllerContext] widget.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we refer to [RegularWindowController] for details, rather than repeating the same?

Or the other way 'round?

}
}

/// Provides descendents with access to the [WindowController] associated with
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Provides descendents with access to the [WindowController] associated with
/// Provides descendants with access to the [WindowController] associated with

hbatagelo and others added 2 commits April 24, 2025 16:42
## What's new:
- Root view access bug in `RegularWindowControllerWin32` resolved
(previously attempted before initialization).
- Correct view ID now displayed in the reference application's window
table.
- Flutter icon restored in the reference application.
- Remove unused `.vscode` directory.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants