From dacad47bfff9b6dac9f3b2fa158fdd4b93925f66 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 13 Aug 2026 04:28:12 -0700 Subject: [PATCH 1/4] Call adapter.SizeChanged on actual size changes of NativeWebViewControlHost Fixes #32 --- .../NativeWebViewControlHost.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs b/src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs index ef82bdc..e04ca28 100644 --- a/src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs +++ b/src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs @@ -23,6 +23,9 @@ internal class NativeWebViewControlHost(WebViewAdapter.NativeHostAdapterFactory private TaskCompletionSource? _webViewReadyCompletion; private ReparentingScope? _reparentingScope; private IPlatformHandle? _defaultChildHandle; +#if AVALONIA + private PixelSize _adapterSize; +#endif /// public event EventHandler? AdapterCreated; @@ -80,6 +83,9 @@ protected override void DestroyNativeControlCore(IPlatformHandle control) _webViewReadyCompletion?.TrySetCanceled(); _webViewReadyCompletion = null; +#if AVALONIA + _adapterSize = default; +#endif if (adapter is not null) { @@ -109,6 +115,28 @@ private void WebViewAdapterOnInitialized(IWebViewAdapter adapter) #endif } +#if AVALONIA + protected override void OnSizeChanged(SizeChangedEventArgs e) + { + base.OnSizeChanged(e); + UpdateAdapterSize(e.NewSize); + } + + // Native control host only moves and resizes the native handle, the adapter needs to be notified separately. + private void UpdateAdapterSize(Size size) + { + if (TryGetAdapter() is not { } adapter || TopLevel.GetTopLevel(this) is not { } topLevel) + return; + + var pixelSize = PixelSize.FromSize(size, topLevel.RenderScaling); + if (pixelSize.Width <= 0 || pixelSize.Height <= 0 || pixelSize == _adapterSize) + return; + + _adapterSize = pixelSize; + adapter.SizeChanged(pixelSize); + } +#endif + /// public IDisposable BeginReparenting(bool yieldOnLayoutBeforeExiting = true) { From dac8253598a19dc98601f99cec8f723d1ffd8b3c Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 13 Aug 2026 04:28:33 -0700 Subject: [PATCH 2/4] Re-enable GtkX11WebViewAdapter.SizeChanged, similarly to offscreen one --- .../Gtk/GtkX11WebViewAdapter.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs b/src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs index a6ac807..6971dcb 100644 --- a/src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs +++ b/src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs @@ -16,6 +16,7 @@ internal sealed class GtkX11WebViewAdapter : GtkWebViewAdapter, IPlatformHandle private readonly IntPtr _x11Window; private IntPtr _windowHandle; private IntPtr _currentParent; + private PixelSize _sizeRequest; private GtkX11WebViewAdapter(GtkWebViewEnvironmentRequestedEventArgs environmentArgs) : base(environmentArgs) { @@ -71,6 +72,21 @@ public override void SetParent(IPlatformHandle parent) } } + public override void SizeChanged(PixelSize containerSize) + { + if (containerSize.Width <= 0 || containerSize.Height <= 0) + return; + + _sizeRequest = containerSize; + RunOnGlibThreadAsync(() => + { + if (_windowHandle == IntPtr.Zero) + return; + + gtk_window_resize(_windowHandle, _sizeRequest.Width, _sizeRequest.Height); + }); + } + public override Color DefaultBackground { set From 77f0eff8f448c559a105120eaae0bd260b9b7112 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 13 Aug 2026 04:29:21 -0700 Subject: [PATCH 3/4] Toggle EnableDevTools on sample app dialogs --- samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs b/samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs index eebecb8..8a46da0 100644 --- a/samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs +++ b/samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs @@ -397,7 +397,11 @@ private void GridWebViewDialogButton_OnClick(object? sender, RoutedEventArgs e) Source = Uri.TryCreate(GridWebViewSource.Text, UriKind.Absolute, out var source) ? source : new Uri("about:blank"), - Title = "Avalonia WebView Demo" + Title = "Avalonia WebView Demo" + }; + dialog.EnvironmentRequested += (_, args) => + { + args.EnableDevTools = true; }; dialog.Show(); } From 5c47224a68847cdbf5ed0b28f14c804b9f26163a Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 13 Aug 2026 04:29:57 -0700 Subject: [PATCH 4/4] Remove NativeWebView.OnSizeChanged handling, as it now lives in the native control host wrapper --- src/Avalonia.Controls.WebView/NativeWebView.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Avalonia.Controls.WebView/NativeWebView.cs b/src/Avalonia.Controls.WebView/NativeWebView.cs index c9c43f2..1ad5eca 100644 --- a/src/Avalonia.Controls.WebView/NativeWebView.cs +++ b/src/Avalonia.Controls.WebView/NativeWebView.cs @@ -694,12 +694,6 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang } } - protected override void OnSizeChanged(SizeChangedEventArgs e) - { - base.OnSizeChanged(e); - TryGetAdapter()?.SizeChanged(PixelSize.FromSize(e.NewSize, GetRenderScaling())); - } - private void EnsureBackground(IBrush? background) { if (TryGetAdapter() is { } adapter)