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(); } 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 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) 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) {