xwayland: kms fixes

This commit is contained in:
Victoria Brekenfeld 2023-01-24 19:32:57 +01:00
parent 5b644b59f7
commit e7be9d6abf
3 changed files with 33 additions and 13 deletions

View file

@ -47,6 +47,7 @@ use smithay::{
}, },
utils::{DeviceFd, Size, Transform}, utils::{DeviceFd, Size, Transform},
wayland::{dmabuf::DmabufGlobal, seat::WaylandFocus}, wayland::{dmabuf::DmabufGlobal, seat::WaylandFocus},
xwayland::XWaylandClientData,
}; };
use std::{ use std::{
@ -790,12 +791,14 @@ fn render_node_for_output(
.unwrap_or_else(|| workspace.windows().collect::<Vec<_>>()) .unwrap_or_else(|| workspace.windows().collect::<Vec<_>>())
.into_iter() .into_iter()
.flat_map(|w| { .flat_map(|w| {
dh.get_client(w.wl_surface()?.id()) let client = dh.get_client(w.wl_surface()?.id()).ok()?;
.ok()? if let Some(normal_client) = client.get_data::<ClientState>() {
.get_data::<ClientState>() return normal_client.drm_node.clone();
.unwrap() }
.drm_node if let Some(xwayland_client) = client.get_data::<XWaylandClientData>() {
.clone() return xwayland_client.user_data().get::<DrmNode>().cloned();
}
None
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if nodes.contains(&target_node) || nodes.len() < MAX_CPU_COPIES { 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); let render = render_node_for_output(dh, &output, target, &shell);
if let Err(err) = self.api.early_import( if let Err(err) = self.api.early_import(
dh.get_client(surface.id()) if let Some(client) = dh.get_client(surface.id()).ok() {
.ok() if let Some(normal_client) = client.get_data::<ClientState>() {
.and_then(|c| c.get_data::<ClientState>().unwrap().drm_node.clone()), normal_client.drm_node.clone()
} else if let Some(xwayland_client) = client.get_data::<XWaylandClientData>() {
xwayland_client.user_data().get::<DrmNode>().cloned()
} else {
None
}
} else {
None
},
render, render,
surface, surface,
) { ) {

View file

@ -421,7 +421,7 @@ impl Shell {
let xdg_shell_state = XdgShellState::new::<State, _>(dh, None); let xdg_shell_state = XdgShellState::new::<State, _>(dh, None);
let toplevel_info_state = ToplevelInfoState::new( let toplevel_info_state = ToplevelInfoState::new(
dh, dh,
//|client| client.get_data::<ClientState>().unwrap().privileged, //|client| client.get_data::<ClientState>().map_or(false, |s| s.privileged),
|_| true, |_| true,
); );
let toplevel_management_state = ToplevelManagementState::new::<State, _>( let toplevel_management_state = ToplevelManagementState::new::<State, _>(
@ -430,12 +430,12 @@ impl Shell {
ManagementCapabilities::Close, ManagementCapabilities::Close,
ManagementCapabilities::Activate, ManagementCapabilities::Activate,
], ],
//|client| client.get_data::<ClientState>().unwrap().privileged, //|client| client.get_data::<ClientState>().map_or(false, |s| s.privileged),
|_| true, |_| true,
); );
let mut workspace_state = WorkspaceState::new( let mut workspace_state = WorkspaceState::new(
dh, dh,
//|client| client.get_data::<ClientState>().unwrap().privileged, //|client| client.get_data::<ClientState>().map_or(false, |s| s.privileged),
|_| true, |_| true,
); );

View file

@ -36,6 +36,7 @@ use smithay::{
seat::WaylandFocus, seat::WaylandFocus,
shm::{with_buffer_contents, with_buffer_contents_mut}, shm::{with_buffer_contents, with_buffer_contents_mut},
}, },
xwayland::XWaylandClientData,
}; };
use crate::{ use crate::{
@ -172,7 +173,15 @@ impl ScreencopyHandler for State {
.display_handle .display_handle
.get_client(surface.id()) .get_client(surface.id())
.ok() .ok()
.and_then(|client| client.get_data::<ClientState>().unwrap().drm_node.clone()) .and_then(|client| {
if let Some(normal_client) = client.get_data::<ClientState>() {
return normal_client.drm_node.clone();
}
if let Some(xwayland_client) = client.get_data::<XWaylandClientData>() {
return xwayland_client.user_data().get::<DrmNode>().cloned();
}
None
})
.unwrap_or(kms.primary.clone()); .unwrap_or(kms.primary.clone());
_kms_renderer = Some(kms.api.renderer::<Gles2Renderbuffer>(&node, &node).unwrap()); _kms_renderer = Some(kms.api.renderer::<Gles2Renderbuffer>(&node, &node).unwrap());
_kms_renderer.as_mut().unwrap().as_mut() _kms_renderer.as_mut().unwrap().as_mut()