xwayland: kms fixes
This commit is contained in:
parent
5b644b59f7
commit
e7be9d6abf
3 changed files with 33 additions and 13 deletions
|
|
@ -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,
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue