fix: surface not mapping

This commit is contained in:
Nova
2023-07-19 06:04:08 -07:00
parent 1923b71985
commit eb2ace5d29
5 changed files with 69 additions and 27 deletions

View File

@@ -72,7 +72,7 @@ pub struct Wayland {
impl Wayland { impl Wayland {
pub fn new() -> Result<Self> { pub fn new() -> Result<Self> {
let egl_raw_handles = get_sk_egl()?; let egl_raw_handles = get_sk_egl()?;
let mut renderer = unsafe { let renderer = unsafe {
GlesRenderer::new(EGLContext::from_raw( GlesRenderer::new(EGLContext::from_raw(
egl_raw_handles.display, egl_raw_handles.display,
egl_raw_handles.config, egl_raw_handles.config,

View File

@@ -470,7 +470,18 @@ impl PanelItem {
xdg_toplevel.configure_bounds(bounds.x as i32, bounds.y as i32); xdg_toplevel.configure_bounds(bounds.x as i32, bounds.y as i32);
} }
} }
let size = info.size.unwrap_or(Vector2::from([0; 2])); let zero_size = Vector2::from([0; 2]);
let size = info.size.unwrap_or(zero_size);
// if size == zero_size && (info.states.contains(1) || info.states.contains(2)) {
// xdg_toplevel.configure(
// size.x as i32,
// size.y as i32,
// info.states
// .into_iter()
// .flat_map(|state| state.to_ne_bytes())
// .collect::<Vec<_>>(),
// );
// }
xdg_toplevel.configure( xdg_toplevel.configure(
size.x as i32, size.x as i32,
size.y as i32, size.y as i32,

View File

@@ -446,7 +446,7 @@ impl Dispatch<WlPointer, Arc<SeatData>, WaylandState> for WaylandState {
hotspot_y, hotspot_y,
} => { } => {
if let Some(surface) = surface.as_ref() { if let Some(surface) = surface.as_ref() {
CoreSurface::add_to(&state.display, dh.clone(), surface, |_| ()); CoreSurface::add_to(&state.display, dh.clone(), surface, || (), |_| ());
compositor::with_states(surface, |data| { compositor::with_states(surface, |data| {
data.data_map.insert_if_missing_threadsafe(|| { data.data_map.insert_if_missing_threadsafe(|| {
Arc::new(Mutex::new(Cursor { Arc::new(Mutex::new(Cursor {

View File

@@ -50,6 +50,7 @@ pub struct CoreSurface {
sk_tex: OnceCell<SendWrapper<Tex>>, sk_tex: OnceCell<SendWrapper<Tex>>,
sk_mat: OnceCell<Arc<SendWrapper<Material>>>, sk_mat: OnceCell<Arc<SendWrapper<Material>>>,
material_offset: Mutex<Delta<u32>>, material_offset: Mutex<Delta<u32>>,
on_mapped: Box<dyn Fn() + Send + Sync>,
on_commit: Box<dyn Fn(u32) + Send + Sync>, on_commit: Box<dyn Fn(u32) + Send + Sync>,
pub pending_material_applications: Registry<ModelPart>, pub pending_material_applications: Registry<ModelPart>,
} }
@@ -59,6 +60,7 @@ impl CoreSurface {
display: &Arc<Mutex<Display<WaylandState>>>, display: &Arc<Mutex<Display<WaylandState>>>,
dh: DisplayHandle, dh: DisplayHandle,
surface: &WlSurface, surface: &WlSurface,
on_mapped: impl Fn() + Send + Sync + 'static,
on_commit: impl Fn(u32) + Send + Sync + 'static, on_commit: impl Fn(u32) + Send + Sync + 'static,
) { ) {
compositor::with_states(surface, |data| { compositor::with_states(surface, |data| {
@@ -71,6 +73,7 @@ impl CoreSurface {
sk_tex: OnceCell::new(), sk_tex: OnceCell::new(),
sk_mat: OnceCell::new(), sk_mat: OnceCell::new(),
material_offset: Mutex::new(Delta::new(0)), material_offset: Mutex::new(Delta::new(0)),
on_mapped: Box::new(on_mapped) as Box<dyn Fn() + Send + Sync>,
on_commit: Box::new(on_commit) as Box<dyn Fn(u32) + Send + Sync>, on_commit: Box::new(on_commit) as Box<dyn Fn(u32) + Send + Sync>,
pending_material_applications: Registry::new(), pending_material_applications: Registry::new(),
}) })
@@ -125,9 +128,8 @@ impl CoreSurface {
} }
let mut mapped_data = self.mapped_data.lock(); let mut mapped_data = self.mapped_data.lock();
let just_mapped = mapped_data.is_none();
self.with_states(|data| { self.with_states(|data| {
// let just_mapped = mapped_data.is_none();
// if just_mapped {
let renderer_surface_state = data let renderer_surface_state = data
.data_map .data_map
.get::<RendererSurfaceStateUserData>() .get::<RendererSurfaceStateUserData>()
@@ -165,6 +167,10 @@ impl CoreSurface {
}; };
*mapped_data = Some(new_mapped_data); *mapped_data = Some(new_mapped_data);
}); });
drop(mapped_data);
if just_mapped {
(self.on_mapped)();
}
self.apply_surface_materials(); self.apply_surface_materials();
} }

View File

@@ -253,21 +253,29 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
debug!(?toplevel, ?xdg_surface, "Create XDG toplevel"); debug!(?toplevel, ?xdg_surface, "Create XDG toplevel");
if toplevel.version() >= EVT_WM_CAPABILITIES_SINCE { if toplevel.version() >= EVT_WM_CAPABILITIES_SINCE {
toplevel.wm_capabilities(vec![]); toplevel.wm_capabilities(vec![2, 3, 4]);
} }
toplevel.configure(0, 0, vec![]); toplevel.configure(
0,
0,
if toplevel.version() >= 2 {
vec![5, 6, 7, 8]
} else {
vec![]
},
);
xdg_surface.configure(SERIAL_COUNTER.inc()); xdg_surface.configure(SERIAL_COUNTER.inc());
let client_credentials = client.get_credentials(&state.display_handle).ok(); let client_credentials = client.get_credentials(&state.display_handle).ok();
let seat_data = state.seats.get(&client.id()).unwrap().clone(); let seat_data = state.seats.get(&client.id()).unwrap().clone();
let toplevel_weak = toplevel.downgrade();
CoreSurface::add_to( CoreSurface::add_to(
&state.display, &state.display,
state.display_handle.clone(), state.display_handle.clone(),
&xdg_surface_data.lock().wl_surface(), &xdg_surface_data.lock().wl_surface(),
move |c| match c { {
0 => { let toplevel = toplevel.downgrade();
let toplevel = toplevel_weak.upgrade().unwrap(); move || {
let toplevel = toplevel.upgrade().unwrap();
let toplevel_data = ToplevelData::get(&toplevel); let toplevel_data = ToplevelData::get(&toplevel);
let xdg_surface = toplevel_data.lock().xdg_surface(); let xdg_surface = toplevel_data.lock().xdg_surface();
let xdg_surface_data = XdgSurfaceData::get(&xdg_surface); let xdg_surface_data = XdgSurfaceData::get(&xdg_surface);
@@ -283,10 +291,27 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
toplevel_data.lock().panel_item_node.replace(node); toplevel_data.lock().panel_item_node.replace(node);
xdg_surface_data.lock().panel_item = Arc::downgrade(&panel_item); xdg_surface_data.lock().panel_item = Arc::downgrade(&panel_item);
} }
_ => { },
let toplevel = toplevel_weak.upgrade().unwrap(); {
let toplevel = toplevel.downgrade();
move |_| {
let toplevel = toplevel.upgrade().unwrap();
let toplevel_data = ToplevelData::get(&toplevel); let toplevel_data = ToplevelData::get(&toplevel);
let panel_item = toplevel_data.lock().panel_item().unwrap(); let Some(panel_item) = toplevel_data.lock().panel_item() else {
// if the wayland toplevel isn't mapped, hammer it again with a configure until it cooperates
toplevel.configure(
0,
0,
if toplevel.version() >= 2 {
vec![5, 6, 7, 8]
} else {
vec![]
},
);
let xdg_surface = toplevel_data.lock().xdg_surface();
xdg_surface.configure(SERIAL_COUNTER.inc());
return
};
panel_item.commit_toplevel(); panel_item.commit_toplevel();
} }
}, },
@@ -335,19 +360,19 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
&state.display, &state.display,
state.display_handle.clone(), state.display_handle.clone(),
&xdg_surface_data.lock().wl_surface.upgrade().unwrap(), &xdg_surface_data.lock().wl_surface.upgrade().unwrap(),
move |commit_count| match commit_count { move || {
0 => xdg_surface let xdg_popup = xdg_popup.upgrade().unwrap();
.upgrade() let popup_data = PopupData::get(&xdg_popup);
.unwrap() let popup_data = popup_data.lock();
.configure(SERIAL_COUNTER.inc()), // panel_item.commit_popup(popup_data);
c => { panel_item.new_popup(&xdg_popup, &*popup_data);
let xdg_popup = xdg_popup.upgrade().unwrap(); },
let popup_data = PopupData::get(&xdg_popup); move |commit_count| {
let popup_data = popup_data.lock(); if commit_count == 0 {
// panel_item.commit_popup(popup_data); xdg_surface
if c == 1 { .upgrade()
panel_item.new_popup(&xdg_popup, &*popup_data); .unwrap()
} .configure(SERIAL_COUNTER.inc())
} }
}, },
); );