Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion samples/Avalonia.Controls.WebView.Samples/MainView.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
16 changes: 16 additions & 0 deletions src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down
6 changes: 0 additions & 6 deletions src/Avalonia.Controls.WebView/NativeWebView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
28 changes: 28 additions & 0 deletions src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ internal class NativeWebViewControlHost(WebViewAdapter.NativeHostAdapterFactory
private TaskCompletionSource<IWebViewAdapter?>? _webViewReadyCompletion;
private ReparentingScope? _reparentingScope;
private IPlatformHandle? _defaultChildHandle;
#if AVALONIA
private PixelSize _adapterSize;
#endif

/// <inheritdoc />
public event EventHandler<IWebViewAdapter>? AdapterCreated;
Expand Down Expand Up @@ -80,6 +83,9 @@ protected override void DestroyNativeControlCore(IPlatformHandle control)

_webViewReadyCompletion?.TrySetCanceled();
_webViewReadyCompletion = null;
#if AVALONIA
_adapterSize = default;
#endif

if (adapter is not null)
{
Expand Down Expand Up @@ -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

/// <inheritdoc />
public IDisposable BeginReparenting(bool yieldOnLayoutBeforeExiting = true)
{
Expand Down
Loading