use gpui::{App, Window};
use raw_window_handle::{
HandleError, HasWindowHandle, RawWindowHandle, WindowHandle, XlibWindowHandle,
};
use std::{os::raw::c_ulong, time::Duration};
const PUMP: Duration = Duration::from_millis(8);
pub(super) fn start(window: &Window, cx: &mut App) {
if gtk::is_initialized() || Parent::of(window).is_none() {
return;
}
gtk::gdk::set_allowed_backends("x11");
if let Err(error) = gtk::init() {
tracing::warn!(%error, "webview: gtk");
return;
}
let timers = cx.background_executor().clone();
cx.foreground_executor()
.spawn(async move {
loop {
timers.timer(PUMP).await;
while gtk::events_pending() {
gtk::main_iteration_do(false);
}
}
})
.detach();
}
pub(super) struct Parent(XlibWindowHandle);
impl Parent {
pub(super) fn of(window: &Window) -> Option<Self> {
match HasWindowHandle::window_handle(window).ok()?.as_raw() {
RawWindowHandle::Xcb(handle) => Some(Self(XlibWindowHandle::new(c_ulong::from(
handle.window.get(),
)))),
_ => None,
}
}
}
impl HasWindowHandle for Parent {
fn window_handle(&self) -> Result<WindowHandle<'_>, HandleError> {
Ok(unsafe { WindowHandle::borrow_raw(RawWindowHandle::Xlib(self.0)) })
}
}