#![allow(unsafe_code)]
use std::error::Error;
use gdk4::prelude::DisplayExtManual;
use gdk4_wayland::{
prelude::WaylandSurfaceExtManual,
wayland_client::{protocol::wl_surface::WlSurface, Connection},
WaylandDisplay, WaylandSurface,
};
use gtk4::{
glib::{object::Cast, translate::ToGlibPtr},
prelude::{NativeExt, RootExt},
ApplicationWindow,
};
use crate::{VulkanSurface, E};
#[derive(Debug, Clone)]
pub struct WaylandConn {
w: ApplicationWindow,
c: Connection,
}
impl WaylandConn {
pub fn new(w: &ApplicationWindow) -> Result<Self, Box<dyn Error>> {
let wd = 获取wd(w)?;
let c = 获取连接(&wd);
println!(" {:?}", c);
Ok(Self { w: w.clone(), c })
}
pub fn surface(&self) -> Result<VulkanSurface, Box<dyn Error>> {
let ws = 获取窗口表面(&self.w)?;
Ok(VulkanSurface::new(self.c.clone(), ws))
}
}
fn 获取wd(w: &ApplicationWindow) -> Result<WaylandDisplay, Box<dyn Error>> {
let gdk_d = w.display();
let 后端 = gdk_d.backend();
println!("gtk4 backend = {:?}", 后端);
let wd = gdk_d
.downcast::<WaylandDisplay>()
.ok()
.ok_or(E("ERROR wayland cast display".into()))?;
println!(" {:?}", wd);
Ok(wd)
}
fn 获取连接(wd: &WaylandDisplay) -> Connection {
use gdk4_wayland::ffi;
unsafe {
let display_ptr = ffi::gdk_wayland_display_get_wl_display(wd.to_glib_none().0);
let backend =
wayland_backend::sys::client::Backend::from_foreign_display(display_ptr as *mut _);
Connection::from_backend(backend)
}
}
fn 获取窗口表面(w: &ApplicationWindow) -> Result<WlSurface, Box<dyn Error>> {
let gdk_s = w.surface().ok_or("ERROR wayland no surface")?;
let ws = gdk_s
.downcast::<WaylandSurface>()
.ok()
.ok_or(E("ERROR wayland cast surface".into()))?;
println!(" {:?}", ws);
let s = ws
.wl_surface()
.ok_or(E("ERROR wayland wl_surface".into()))?;
Ok(s)
}