aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/mod.rs19
-rw-r--r--src/backend/tty.rs24
-rw-r--r--src/backend/winit.rs13
3 files changed, 53 insertions, 3 deletions
diff --git a/src/backend/mod.rs b/src/backend/mod.rs
index 8a59e6f3..8473ccc2 100644
--- a/src/backend/mod.rs
+++ b/src/backend/mod.rs
@@ -1,3 +1,8 @@
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex};
+
+use smithay::backend::allocator::gbm::GbmDevice;
+use smithay::backend::drm::DrmDeviceFd;
use smithay::backend::renderer::gles::GlesRenderer;
use smithay::output::Output;
use smithay::wayland::dmabuf::DmabufFeedback;
@@ -79,6 +84,20 @@ impl Backend {
}
}
+ pub fn connectors(&self) -> Arc<Mutex<HashMap<String, Output>>> {
+ match self {
+ Backend::Tty(tty) => tty.connectors(),
+ Backend::Winit(winit) => winit.connectors(),
+ }
+ }
+
+ pub fn gbm_device(&self) -> Option<GbmDevice<DrmDeviceFd>> {
+ match self {
+ Backend::Tty(tty) => tty.gbm_device(),
+ Backend::Winit(_) => None,
+ }
+ }
+
pub fn tty(&mut self) -> &mut Tty {
if let Self::Tty(v) = self {
v
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index a3298655..343da54e 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -1,6 +1,7 @@
use std::collections::{HashMap, HashSet};
use std::os::fd::FromRawFd;
use std::path::{Path, PathBuf};
+use std::sync::{Mutex, Arc};
use std::time::Duration;
use anyhow::{anyhow, Context};
@@ -44,6 +45,7 @@ pub struct Tty {
udev_dispatcher: Dispatcher<'static, UdevBackend, LoopData>,
primary_gpu_path: PathBuf,
output_device: Option<OutputDevice>,
+ connectors: Arc<Mutex<HashMap<String, Output>>>,
}
type GbmDrmCompositor = DrmCompositor<
@@ -236,6 +238,7 @@ impl Tty {
udev_dispatcher,
primary_gpu_path,
output_device: None,
+ connectors: Arc::new(Mutex::new(HashMap::new())),
}
}
@@ -549,6 +552,11 @@ impl Tty {
tracy_client::internal::create_frame_name(format!("vblank on {output_name}\0").leak())
};
+ self.connectors
+ .lock()
+ .unwrap()
+ .insert(output_name.clone(), output.clone());
+
let surface = Surface {
name: output_name,
compositor,
@@ -574,10 +582,10 @@ impl Tty {
debug!("disconnecting connector: {connector:?}");
let device = self.output_device.as_mut().unwrap();
- if device.surfaces.remove(&crtc).is_none() {
- debug!("crts wasn't enabled");
+ let Some(surface) = device.surfaces.remove(&crtc) else {
+ debug!("crtc wasn't enabled");
return;
- }
+ };
let output = niri
.global_space
@@ -590,6 +598,8 @@ impl Tty {
.clone();
niri.remove_output(&output);
+
+ self.connectors.lock().unwrap().remove(&surface.name);
}
pub fn seat_name(&self) -> String {
@@ -680,6 +690,14 @@ impl Tty {
pub fn dmabuf_state(&mut self) -> &mut DmabufState {
&mut self.output_device.as_mut().unwrap().dmabuf_state
}
+
+ pub fn connectors(&self) -> Arc<Mutex<HashMap<String, Output>>> {
+ self.connectors.clone()
+ }
+
+ pub fn gbm_device(&self) -> Option<GbmDevice<DrmDeviceFd>> {
+ self.output_device.as_ref().map(|d| d.gbm.clone())
+ }
}
fn refresh_interval(mode: DrmMode) -> Duration {
diff --git a/src/backend/winit.rs b/src/backend/winit.rs
index be8ec29a..e7a50ac7 100644
--- a/src/backend/winit.rs
+++ b/src/backend/winit.rs
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex};
use std::time::Duration;
use smithay::backend::renderer::damage::OutputDamageTracker;
@@ -21,6 +23,7 @@ pub struct Winit {
output: Output,
backend: WinitGraphicsBackend<GlesRenderer>,
damage_tracker: OutputDamageTracker,
+ connectors: Arc<Mutex<HashMap<String, Output>>>,
}
impl Winit {
@@ -53,6 +56,11 @@ impl Winit {
);
output.set_preferred(mode);
+ let connectors = Arc::new(Mutex::new(HashMap::from([(
+ "winit".to_owned(),
+ output.clone(),
+ )])));
+
let damage_tracker = OutputDamageTracker::from_output(&output);
let timer = Timer::immediate();
@@ -99,6 +107,7 @@ impl Winit {
output,
backend,
damage_tracker,
+ connectors,
}
}
@@ -162,4 +171,8 @@ impl Winit {
let renderer = self.backend.renderer();
renderer.set_debug_flags(renderer.debug_flags() ^ DebugFlags::TINT);
}
+
+ pub fn connectors(&self) -> Arc<Mutex<HashMap<String, Output>>> {
+ self.connectors.clone()
+ }
}