wayland/kms: Add drm_lease implementation
This commit is contained in:
parent
6a92030341
commit
7ecc970a5b
3 changed files with 243 additions and 35 deletions
79
src/wayland/handlers/drm_lease.rs
Normal file
79
src/wayland/handlers/drm_lease.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::state::State;
|
||||
use smithay::{
|
||||
backend::drm::DrmNode,
|
||||
delegate_drm_lease,
|
||||
wayland::drm_lease::{
|
||||
DrmLease, DrmLeaseBuilder, DrmLeaseHandler, DrmLeaseRequest, DrmLeaseState, LeaseRejected,
|
||||
},
|
||||
};
|
||||
|
||||
impl DrmLeaseHandler for State {
|
||||
fn drm_lease_state(&mut self, node: DrmNode) -> &mut DrmLeaseState {
|
||||
self.backend
|
||||
.kms()
|
||||
.devices
|
||||
.get_mut(&node)
|
||||
.unwrap()
|
||||
.leasing_global
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn lease_request(
|
||||
&mut self,
|
||||
node: DrmNode,
|
||||
request: DrmLeaseRequest,
|
||||
) -> Result<DrmLeaseBuilder, LeaseRejected> {
|
||||
let backend = self
|
||||
.backend
|
||||
.kms()
|
||||
.devices
|
||||
.get_mut(&node)
|
||||
.ok_or(LeaseRejected::default())?;
|
||||
|
||||
let mut builder = DrmLeaseBuilder::new(&backend.drm);
|
||||
for conn in request.connectors {
|
||||
if let Some((_, crtc)) = backend
|
||||
.non_desktop_connectors
|
||||
.iter()
|
||||
.find(|(handle, _)| *handle == conn)
|
||||
{
|
||||
builder.add_connector(conn);
|
||||
builder.add_crtc(*crtc);
|
||||
let planes = backend
|
||||
.drm
|
||||
.planes(crtc)
|
||||
.map_err(LeaseRejected::with_cause)?;
|
||||
builder.add_plane(planes.primary.handle);
|
||||
if let Some(cursor) = planes.cursor {
|
||||
builder.add_plane(cursor.handle);
|
||||
}
|
||||
} else {
|
||||
tracing::warn!(
|
||||
?conn,
|
||||
"Lease requested for desktop connector, denying request"
|
||||
);
|
||||
return Err(LeaseRejected::default());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(builder)
|
||||
}
|
||||
|
||||
fn new_active_lease(&mut self, node: DrmNode, lease: DrmLease) {
|
||||
if let Some(backend) = self.backend.kms().devices.get_mut(&node) {
|
||||
backend.active_leases.push(lease);
|
||||
}
|
||||
// else the backend is gone, drop the lease
|
||||
}
|
||||
|
||||
fn lease_destroyed(&mut self, node: DrmNode, lease: u32) {
|
||||
if let Some(backend) = self.backend.kms().devices.get_mut(&node) {
|
||||
backend.active_leases.retain(|l| l.id() != lease);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delegate_drm_lease!(State);
|
||||
|
|
@ -5,6 +5,7 @@ pub mod compositor;
|
|||
pub mod data_device;
|
||||
pub mod decoration;
|
||||
pub mod dmabuf;
|
||||
pub mod drm_lease;
|
||||
pub mod fractional_scale;
|
||||
pub mod keyboard_shortcuts_inhibit;
|
||||
pub mod layer_shell;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue