diff --git a/Cargo.lock b/Cargo.lock index 14bd757..a7da0fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -104,6 +104,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + [[package]] name = "apply" version = "0.3.0" @@ -757,6 +763,7 @@ dependencies = [ name = "cosmic-workspaces" version = "0.1.0" dependencies = [ + "anyhow", "calloop", "cosmic-client-toolkit", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 183bf28..61d417e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1.0.75" calloop = "0.12.3" cctk = { package = "cosmic-client-toolkit", git = "https://github.com/pop-os/cosmic-protocols" } env_logger = "0.10.0" diff --git a/src/wayland/buffer.rs b/src/wayland/buffer.rs index 38bacd6..3a50cfe 100644 --- a/src/wayland/buffer.rs +++ b/src/wayland/buffer.rs @@ -60,12 +60,14 @@ impl AppData { &self, buffer_info: &BufferInfo, needs_linear: bool, - ) -> Option<(BufferBacking, wl_buffer::WlBuffer)> { - // TODO Handle errors in some way - let (node, gbm) = self.gbm.as_ref()?; - let feedback = self.dmabuf_feedback.as_ref()?; + ) -> anyhow::Result> { + let (Some((node, gbm)), Some(feedback)) = + (self.gbm.as_ref(), self.dmabuf_feedback.as_ref()) + else { + return Ok(None); + }; let formats = feedback.format_table(); - let format_info = feedback + let Some(format_info) = feedback .tranches() .iter() .flat_map(|x| &x.formats) @@ -73,25 +75,26 @@ impl AppData { .find(|x| { x.format == buffer_info.format && (!needs_linear || x.modifier == u64::from(gbm::Modifier::Linear)) - })?; - let format = gbm::Format::try_from(buffer_info.format).ok()?; - let modifier = gbm::Modifier::try_from(format_info.modifier).ok()?; - let bo = gbm - .create_buffer_object_with_modifiers::<()>( - buffer_info.width, - buffer_info.height, - format, - [modifier].into_iter(), - ) - .ok()?; + }) + else { + return Ok(None); + }; + let format = gbm::Format::try_from(buffer_info.format)?; + let modifier = gbm::Modifier::try_from(format_info.modifier)?; + let bo = gbm.create_buffer_object_with_modifiers::<()>( + buffer_info.width, + buffer_info.height, + format, + [modifier].into_iter(), + )?; - let fd = bo.fd().ok()?; - let stride = bo.stride().ok()?; - let params = self.dmabuf_state.create_params(&self.qh).ok()?; - for i in 0..bo.plane_count().ok()? as i32 { - let plane_fd = bo.fd_for_plane(i).ok()?; - let plane_offset = bo.offset(i).ok()?; - let plane_stride = bo.stride_for_plane(i).ok()?; + let fd = bo.fd()?; + let stride = bo.stride()?; + let params = self.dmabuf_state.create_params(&self.qh)?; + for i in 0..bo.plane_count()? as i32 { + let plane_fd = bo.fd_for_plane(i)?; + let plane_offset = bo.offset(i)?; + let plane_stride = bo.stride_for_plane(i)?; params.add( plane_fd.as_fd(), i as u32, @@ -110,14 +113,14 @@ impl AppData { ) .0; - Some(( + Ok(Some(( BufferBacking::Dmabuf { fd, node: node.clone(), stride, }, buffer, - )) + ))) } pub fn create_buffer(&self, buffer_infos: &[BufferInfo]) -> Buffer { @@ -129,12 +132,16 @@ impl AppData { .iter() .find(|x| x.type_ == WEnum::Value(BufferType::Dmabuf) && x.format == format) { - if let Some((backing, buffer)) = self.create_gbm_backing(buffer_info, true) { - return Buffer { - backing, - buffer, - buffer_info: buffer_info.clone(), - }; + match self.create_gbm_backing(buffer_info, true) { + Ok(Some((backing, buffer))) => { + return Buffer { + backing, + buffer, + buffer_info: buffer_info.clone(), + }; + } + Ok(None) => {} + Err(err) => eprintln!("Failed to create gbm buffer: {}", err), } } */