From 475b3df2b5bd660f9137cf28b6de571d4dad90e6 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 19 Jan 2024 09:13:32 +0400 Subject: Don't crash when failing to render a cursor I only hit this when the renderer was completely busted, but nevertheless. --- src/cursor.rs | 17 ++++++++++++----- src/niri.rs | 23 +++++++++++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/cursor.rs b/src/cursor.rs index 6bf92cd1..bdaba542 100644 --- a/src/cursor.rs +++ b/src/cursor.rs @@ -224,7 +224,7 @@ pub enum RenderCursor { }, } -type TextureCache = HashMap<(CursorIcon, i32), Vec>>; +type TextureCache = HashMap<(CursorIcon, i32), Vec>>>; #[derive(Default)] pub struct CursorTextureCache { @@ -243,7 +243,7 @@ impl CursorTextureCache { scale: i32, cursor: &XCursor, idx: usize, - ) -> TextureBuffer { + ) -> Option> { self.cache .borrow_mut() .entry((icon, scale)) @@ -254,7 +254,7 @@ impl CursorTextureCache { .map(|frame| { let _span = tracy_client::span!("create TextureBuffer"); - TextureBuffer::from_memory( + let buffer = TextureBuffer::from_memory( renderer, &frame.pixels_rgba, Fourcc::Abgr8888, @@ -263,8 +263,15 @@ impl CursorTextureCache { scale, Transform::Normal, None, - ) - .unwrap() + ); + + match buffer { + Ok(x) => Some(x), + Err(err) => { + warn!("error creating a cursor texture: {err:?}"); + None + } + } }) .collect() })[idx] diff --git a/src/niri.rs b/src/niri.rs index 94a2056f..dc1efd87 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -1660,16 +1660,19 @@ impl Niri { idx, ); - let pointer_elements = vec![OutputRenderElements::NamedPointer( - PrimaryGpuTextureRenderElement(TextureRenderElement::from_texture_buffer( - pointer_pos.to_f64(), - &texture, - None, - None, - None, - Kind::Cursor, - )), - )]; + let mut pointer_elements = vec![]; + if let Some(texture) = texture { + pointer_elements.push(OutputRenderElements::NamedPointer( + PrimaryGpuTextureRenderElement(TextureRenderElement::from_texture_buffer( + pointer_pos.to_f64(), + &texture, + None, + None, + None, + Kind::Cursor, + )), + )); + } (pointer_elements, pointer_pos) } -- cgit