diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index 512d2347..97dd44eb 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -47,6 +47,7 @@ use smithay::{ }, utils::{DeviceFd, Size, Transform}, wayland::{dmabuf::DmabufGlobal, seat::WaylandFocus}, + xwayland::XWaylandClientData, }; use std::{ @@ -790,12 +791,14 @@ fn render_node_for_output( .unwrap_or_else(|| workspace.windows().collect::>()) .into_iter() .flat_map(|w| { - dh.get_client(w.wl_surface()?.id()) - .ok()? - .get_data::() - .unwrap() - .drm_node - .clone() + let client = dh.get_client(w.wl_surface()?.id()).ok()?; + if let Some(normal_client) = client.get_data::() { + return normal_client.drm_node.clone(); + } + if let Some(xwayland_client) = client.get_data::() { + return xwayland_client.user_data().get::().cloned(); + } + None }) .collect::>(); if nodes.contains(&target_node) || nodes.len() < MAX_CPU_COPIES { @@ -1011,9 +1014,17 @@ impl KmsState { ) { let render = render_node_for_output(dh, &output, target, &shell); if let Err(err) = self.api.early_import( - dh.get_client(surface.id()) - .ok() - .and_then(|c| c.get_data::().unwrap().drm_node.clone()), + if let Some(client) = dh.get_client(surface.id()).ok() { + if let Some(normal_client) = client.get_data::() { + normal_client.drm_node.clone() + } else if let Some(xwayland_client) = client.get_data::() { + xwayland_client.user_data().get::().cloned() + } else { + None + } + } else { + None + }, render, surface, ) { diff --git a/src/shell/mod.rs b/src/shell/mod.rs index f1d6835e..a965ed32 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -421,7 +421,7 @@ impl Shell { let xdg_shell_state = XdgShellState::new::(dh, None); let toplevel_info_state = ToplevelInfoState::new( dh, - //|client| client.get_data::().unwrap().privileged, + //|client| client.get_data::().map_or(false, |s| s.privileged), |_| true, ); let toplevel_management_state = ToplevelManagementState::new::( @@ -430,12 +430,12 @@ impl Shell { ManagementCapabilities::Close, ManagementCapabilities::Activate, ], - //|client| client.get_data::().unwrap().privileged, + //|client| client.get_data::().map_or(false, |s| s.privileged), |_| true, ); let mut workspace_state = WorkspaceState::new( dh, - //|client| client.get_data::().unwrap().privileged, + //|client| client.get_data::().map_or(false, |s| s.privileged), |_| true, ); diff --git a/src/wayland/handlers/screencopy.rs b/src/wayland/handlers/screencopy.rs index 92f85f4a..0603da08 100644 --- a/src/wayland/handlers/screencopy.rs +++ b/src/wayland/handlers/screencopy.rs @@ -36,6 +36,7 @@ use smithay::{ seat::WaylandFocus, shm::{with_buffer_contents, with_buffer_contents_mut}, }, + xwayland::XWaylandClientData, }; use crate::{ @@ -172,7 +173,15 @@ impl ScreencopyHandler for State { .display_handle .get_client(surface.id()) .ok() - .and_then(|client| client.get_data::().unwrap().drm_node.clone()) + .and_then(|client| { + if let Some(normal_client) = client.get_data::() { + return normal_client.drm_node.clone(); + } + if let Some(xwayland_client) = client.get_data::() { + return xwayland_client.user_data().get::().cloned(); + } + None + }) .unwrap_or(kms.primary.clone()); _kms_renderer = Some(kms.api.renderer::(&node, &node).unwrap()); _kms_renderer.as_mut().unwrap().as_mut()