Skip to content

Commit a727b6e

Browse files
committed
Fix webview rendering on _NET_WM_FRAME_DRAWN WMs
1 parent 6809298 commit a727b6e

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

src/Avalonia.Controls.WebView.Core/Gtk/GtkInterop.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,10 @@ internal static partial IntPtr webkit_website_data_manager_new(
339339
[DllImport(LibGdk)]
340340
internal static extern IntPtr gdk_x11_window_get_xid(IntPtr window);
341341

342+
[DllImport(LibGdk)]
343+
internal static extern void gdk_x11_window_set_frame_sync_enabled(IntPtr window,
344+
[MarshalAs(UnmanagedType.Bool)] bool frameSyncEnabled);
345+
342346
[DllImport(LibGdk)]
343347
internal static extern IntPtr gdk_display_get_default();
344348
[DllImport(LibGdk)]

src/Avalonia.Controls.WebView.Core/Gtk/GtkX11WebViewAdapter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ private GtkX11WebViewAdapter(GtkWebViewEnvironmentRequestedEventArgs environment
2323
gtk_container_add(_windowHandle, WebViewHandle);
2424
gtk_widget_show_all(WebViewHandle);
2525
gtk_widget_realize(_windowHandle);
26-
_x11Window = gdk_x11_window_get_xid(gtk_widget_get_window(_windowHandle));
26+
27+
var gdkWindow = gtk_widget_get_window(_windowHandle);
28+
_x11Window = gdk_x11_window_get_xid(gdkWindow);
29+
30+
// Reparenting this window into the Avalonia window takes it away from the window manager,
31+
// so the _NET_WM_FRAME_DRAWN replies GDK throttles drawing on never arrive.
32+
// Without this GTK paints one frame and then waits forever.
33+
gdk_x11_window_set_frame_sync_enabled(gdkWindow, false);
2734
}
2835

2936
public static Task<WebViewAdapter.NativeWebViewAdapterBuilder> CreateBuilder(

0 commit comments

Comments
 (0)