-
Notifications
You must be signed in to change notification settings - Fork 55
Add Spec for IsWindowControlsOverlayEnabled.md #4613
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: main
Are you sure you want to change the base?
Changes from 9 commits
5d6debb
5a4eb5f
4bc0b7a
a4026d9
1714578
b89c178
1221980
8ff7c9e
01a2caf
abbe2c2
fa8e6e5
f3c9cf3
ba722a8
964f28b
cfefaae
12b8134
f34e47c
9790a1e
0390596
3d5d006
2397d9f
c880f4a
b7f2a97
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
WebView2 Window Controls | ||
=== | ||
|
||
# Background | ||
This API allows you to enable and configure the Webview2 Window Controls Overlay. | ||
The Overlay is a region on the top right/left of the webview window which contains | ||
the caption buttons (minimize, maximize, restore, close). Enabing the Overlay allows | ||
for custom app title bars rendered completely inside the webview window. | ||
|
||
This API is designed to be used in addition with the other non-client region APIs | ||
and features. These include `app-region: drag`, and `IsNonClientRegionSupportEnabled`. | ||
tochukwuIbeEkeocha marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# Conceptual pages (How To) | ||
Here is a concept doc on the window controls overlay: https://wicg.github.io/window-controls-overlay/#concepts. | ||
This was written for the PWA counterpart for this feature. From the perspective of | ||
HTML & Javascript layers, everything there applies in Webview2 as well. | ||
|
||
# Examples | ||
|
||
## Win32 C++ | ||
```cpp | ||
AppWindow::AppWindow() { | ||
m_mainWindow = CreateWindowExW( | ||
WS_EX_CONTROLPARENT, | ||
GetWindowClass(), | ||
L"" | ||
WS_POPUPWINDOW, | ||
0,0, 800, 800, | ||
nullptr, nullptr, | ||
g_hInstance, nullptr); | ||
} | ||
|
||
void AppWindow::OnCreateWebview2ControllerCompleted(HRESULT hr, ICoreWebview2Controller* controller) | ||
{ | ||
|
||
wil::com_ptr<ICoreWebView2> coreWebView2; | ||
CHECK_FAILURE(m_controller->get_CoreWebView2(&coreWebView2)); | ||
|
||
wil::com_ptr<ICoreWebView2> coreWebView2_28; | ||
CHECK_FAILURE(coreWebView2->QueryInterface(&coreWebView2_28)); | ||
|
||
wil::com_ptr<ICoreWebView2WindowControlsOverlaySettings> windowControlsOverlaySettings; | ||
CHECK_FAILURE(coreWebView2_28->get_WindowControlsOverlaySettings(&wco_config)); | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
CHECK_FAILURE(wco_config->put_IsEnabled(true)); | ||
COREWEBVIEW2_COLOR color {1, 0, 0, 225}; | ||
CHECK_FAILURE(wco_config->put_TitleBarBackgroundColor(color)); | ||
} | ||
``` | ||
## .NET C# | ||
```c# | ||
// WebView2 control is defined in the xaml | ||
// <wv2:WebView2 x:Name="webView" Source="https://www.microsoft.com/"/> | ||
public MainWindow() | ||
{ | ||
InitializeComponent(); | ||
m_AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; | ||
|
||
CoreWebView2WindowControlsOverlaySettings config = Webview2.CoreWebivew2.WindowControlsOverlaySettings; | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
config.IsEnabled = true; | ||
config.color = Color.FromARGB(0, 0, 255); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does the order of setting these properties matter? If I set enabled=true before setting .color might there be a frame rendered of the overlay with the default color? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please update docs to say when does the IsEnabled change take affect - immediate or batched once the UI thread has a chance to work. Prefer: the order shouldn't matter. If order matters we'll follow up.
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
``` | ||
|
||
# API Details | ||
## Win32 C++ | ||
```cpp | ||
/// Controller API used to configure the window controls overlay. | ||
/// To provide your app users with the best experience, it is important to handle webview | ||
/// initialization errors appropriately. Provide your users with a way to close the window | ||
/// or restart the App. | ||
[uuid(101e36ca-7f75-5105-b9be-fea2ba61a2fd), object, pointer_default(unique)] | ||
interface ICoreWebView2_28 : IUnknown { | ||
/// Gets the `WindowControlsOverlaySettings` object. | ||
[propget] HRESULT WindowControlsOverlaySettings([out, retval] ICoreWebView2WindowControlsOverlaySettings** value); | ||
} | ||
|
||
/// This is the ICoreWebView2WindowControlsOverlaySettings | ||
[uuid(c9f7378b-8dbb-5445-bacb-08a3fdf032f0), object, pointer_default(unique)] | ||
interface ICoreWebView2WindowControlsOverlaySettings : IUnknown { | ||
/// Gets the `Height` property. | ||
[propget] HRESULT Height([out, retval] UINT32* value); | ||
|
||
|
||
/// The `Height` property in raw screen pixels, allows you to set the height of the overlay and | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bradp0721 Does it make sense to use raw screen pixels here vs view pixels? Also, we should ensure that different DPI awareness doesn't create bugs with real raw pixels vs virtual DPI scaled raw pixels. |
||
/// title bar area. Defaults to 48px. There is no minimum height restriction for this API, | ||
/// so it is up to the developer to make sure that the height of your window controls overlay | ||
/// is enough that users can see and interact with it. We recommend using GetSystemMetrics(SM_CYCAPTION) | ||
// as you minimum height. | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// | ||
[propput] HRESULT Height([in] UINT32 value); | ||
|
||
|
||
/// Gets the `IsEnabled` property. | ||
[propget] HRESULT IsEnabled([out, retval] BOOL* value); | ||
|
||
|
||
/// The `IsEnabled` property allows you to opt in to using | ||
/// the WebView2 window controls overlay. Defaults to `FALSE`. | ||
/// | ||
/// When this property is `TRUE`, WebView2 will draw its own minimize, maximize, | ||
/// and close buttons on the top right corner of the Webview2. | ||
/// | ||
/// When using this you should configure your app window to not display its default | ||
/// window control buttons. You are responsible for creating a title bar for your app | ||
/// by using the available space to the left of the controls overlay. In doing so, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this right or left conditional on the reading direction of the UI root? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please document what happens for RTL locales - does the controls overlay render on the left instead of right? In the text here say 'before' instead of 'left' There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In RTL locales, the caption buttons still appear on the right side of the window, just like in LTR. The ordering of the buttons themselves is mirrored (Close | Maximize | Minimize), but their position remains on the right side of the window. keeping that in mind 'left' actually fits correctly in the statement? please let me know if you still want it to be 'before' ? |
||
/// you can utilize the [IsNonClientRegionSupportEnabled](https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2settings9?view=webview2-1.0.2739.15) | ||
/// API to enable draggable regions for your custom title bar. | ||
/// | ||
/// The Overlay buttons will sit on top of the HTML content, and will prevent mouse interactions | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// with any elements directly below it, so you should avoid placing content there. | ||
/// To that end, there are four [CSS environment vairables](https://developer.mozilla.org/en-US/docs/Web/API/Window_Controls_Overlay_API#css_environment_variables) | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// titlebar-area-x, titlebar-area-y, titlebar-area-width defined to help you | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// get the dimensions of the available titlebar area to the left of the overlay. | ||
/// Similarly the navigator object wil contain a [WindowControlsOverlay property](https://developer.mozilla.org/en-US/docs/Web/API/WindowControlsOverlay) | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// which can be used to get the titlebar area as a rect, and listen for changes | ||
/// to the size of that area. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please update this text to suggest either using CSS directly or using the event described in here: https://developer.mozilla.org/en-US/docs/Web/API/WindowControlsOverlay#examples Please also consider adding appropriate HTML/CSS to our sample code. |
||
/// | ||
[propput] HRESULT IsEnabled([in] BOOL value); | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
/// Gets the `TitleBarBackgroundColor` property. | ||
[propget] HRESULT TitleBarBackgroundColor([out, retval] COREWEBVIEW2_COLOR* value); | ||
|
||
/// The `TitleBarBackgroundColor` property allows you to set a background color | ||
/// for the overlay. Based on the background color you choose, Webview2 | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
///will automatically calculate a foreground and hover color that will | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is foreground color necessarily black or white? We might be leaving this undocumented to reserve the right to choose colors based on the hosting app? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. They won't be white/black it will be based on the background color. |
||
/// provide you the best contrast while maintaining accessibility. | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// Defaults to #f3f3f3. This API supports transparency. | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Document that it does not support changing the default color or default height for OS theming (dark/light mode and high contrast) and height. |
||
[propput] HRESULT TitleBarBackgroundColor([in] COREWEBVIEW2_COLOR value); | ||
} | ||
``` | ||
|
||
## .NET and WinRT | ||
```c# | ||
namespace Microsoft.Web.WebView2.Core | ||
{ | ||
runtimeclass CoreWebView2 | ||
{ | ||
[interface_name("Microsoft.Web.WebView2.Core.ICoreWebView2_28")] | ||
{ | ||
CoreWebView2WindowControlsOverlaySettings WindowControlsOverlaySettings { get; }; | ||
venky8951 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
} | ||
|
||
runtimeclass CoreWebView2WindowControlsOverlaySettings | ||
{ | ||
[interface_name("Microsoft.Web.WebView2.Core.ICoreWebView2WindowControlsOverlaySettings")] | ||
{ | ||
Boolean IsEnabled { get; set; }; | ||
UInt32 Height { get; set; }; | ||
Windows.UI.Color TitleBarBackgroundColor { get; set; } | ||
} | ||
} | ||
} | ||
``` | ||
|
Uh oh!
There was an error while loading. Please reload this page.