diff --git a/src/webview.rs b/src/webview.rs index e526b4a..dc6086e 100644 --- a/src/webview.rs +++ b/src/webview.rs @@ -17,9 +17,9 @@ use tao::event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy}; #[cfg(target_os = "linux")] use tao::platform::unix::WindowExtUnix; use tao::window::{Icon, Window, WindowBuilder}; -#[cfg(target_os = "linux")] -use wry::WebViewBuilderExtUnix; use wry::{PageLoadEvent, Rect, WebContext, WebView, WebViewBuilder}; +#[cfg(target_os = "linux")] +use wry::{WebViewBuilderExtUnix, WebViewExtUnix}; const DEFAULT_HOME: &str = "https://duckduckgo.com"; const NEW_TAB_URL: &str = "https://duckduckgo.com"; @@ -2311,6 +2311,34 @@ fn apply_visibility(state: &BrowserState) { let _ = webview.set_visible(i == state.active); } } + #[cfg(target_os = "linux")] + nudge_active_repaint(state); +} + +/// WebKitGTK with accelerated compositing can leave a freshly shown webview +/// unpainted (blank page until something forces a redraw). Re-queue layout +/// and drawing on the active view so every tab switch lands on a live frame. +#[cfg(target_os = "linux")] +fn nudge_active_repaint(state: &BrowserState) { + let Some(tab) = state.tabs.get(state.active) else { + return; + }; + let Some(webview) = tab.webview.as_ref() else { + return; + }; + if let Some(container) = state.gtk_content_container.as_ref() { + container.queue_resize(); + } + let widget = webview.webview(); + widget.queue_resize(); + widget.queue_draw(); + let widget = widget.clone(); + gtk::glib::idle_add_local_once(move || { + if widget.is_realized() { + widget.queue_resize(); + widget.queue_draw(); + } + }); } fn push_tabs(state: &BrowserState) {