-
Notifications
You must be signed in to change notification settings - Fork 1
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
base: windowing-ffi
Are you sure you want to change the base?
Conversation
3ae68be
to
06b22b4
Compare
There was a problem hiding this 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 { |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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
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(); | ||
} |
There was a problem hiding this comment.
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
if (request->max_width != 0 && request->max_height != 0) { | ||
settings.max_size = Size(request->max_width, request->max_height); | ||
} |
There was a problem hiding this comment.
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?
flutter::FlutterWindowsEngine* engine = | ||
flutter::FlutterWindowsEngine::GetEngineForId(engine_id); | ||
engine->get_host_window_controller()->Initialize(request); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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 @@ | |||
{ |
There was a problem hiding this comment.
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({ |
There was a problem hiding this comment.
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?
@@ -450,6 +450,8 @@ @implementation FlutterEngine { | |||
// factories. Lifecycle is tied to the engine. | |||
FlutterPlatformViewController* _platformViewController; | |||
|
|||
FlutterWindowController* _windowController; |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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.
6b64e4e
to
78897e7
Compare
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
It will crash, but that's actually ok for now.
72861c6
to
688b605
Compare
There was a problem hiding this 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.
/// 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, | ||
} |
There was a problem hiding this comment.
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 {
}
// ...
/// Preferred size of the window. This may not be honored by the platform. | ||
final Size? size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// 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; |
/// size: const Size(800, 600), | ||
/// sizeConstraints: const BoxConstraints(minWidth: 640, minHeight: 480), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// 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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// [contentSize] Initial content size of the window. | |
/// [contentSize] sizing requests for the window. This may not be honored by the platform |
/// 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); |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Custom subclass can be provided by subclassing [WidgetsBinding] and | |
/// Custom subclass can be provided by subclassing [WidgetsBinding] |
/// 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. |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Provides descendents with access to the [WindowController] associated with | |
/// Provides descendants with access to the [WindowController] associated with |
## 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.
No description provided.