aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-01-16 15:34:00 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-01-16 15:34:00 +0400
commit5f440f7be3245ad2d357b49d2d2948bb931f661a (patch)
tree807a2f442a2dd506c7ea05aace268d2af6b2b1b3 /src
parent6644cc16fffb26893c3bf33ab26b2aa625bf75dc (diff)
downloadniri-5f440f7be3245ad2d357b49d2d2948bb931f661a.tar.gz
niri-5f440f7be3245ad2d357b49d2d2948bb931f661a.tar.bz2
niri-5f440f7be3245ad2d357b49d2d2948bb931f661a.zip
Add live-reload for output on/off
Diffstat (limited to 'src')
-rw-r--r--src/backend/mod.rs7
-rw-r--r--src/backend/tty.rs65
-rw-r--r--src/niri.rs2
3 files changed, 74 insertions, 0 deletions
diff --git a/src/backend/mod.rs b/src/backend/mod.rs
index 66b05f77..9ee64f82 100644
--- a/src/backend/mod.rs
+++ b/src/backend/mod.rs
@@ -136,6 +136,13 @@ impl Backend {
}
}
+ pub fn on_output_config_changed(&mut self, niri: &mut Niri) {
+ match self {
+ Backend::Tty(tty) => tty.on_output_config_changed(niri),
+ Backend::Winit(_) => (),
+ }
+ }
+
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 4311ee07..a568e625 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -1220,6 +1220,71 @@ impl Tty {
}
}
}
+
+ pub fn on_output_config_changed(&mut self, niri: &mut Niri) {
+ let mut to_disconnect = vec![];
+ let mut to_connect = vec![];
+
+ for (node, device) in &self.devices {
+ for surface in device.surfaces.values() {
+ let config = self
+ .config
+ .borrow()
+ .outputs
+ .iter()
+ .find(|o| o.name == surface.name)
+ .cloned()
+ .unwrap_or_default();
+
+ if config.off {
+ let crtc = surface.compositor.crtc();
+ to_disconnect.push((*node, crtc));
+ }
+ }
+
+ // Check if any disabled connectors need to be enabled.
+ for (connector, crtc) in device.drm_scanner.crtcs() {
+ // Check if connected.
+ if connector.state() != connector::State::Connected {
+ continue;
+ }
+
+ // Check if already enabled.
+ if device.surfaces.contains_key(&crtc) {
+ continue;
+ }
+
+ let output_name = format!(
+ "{}-{}",
+ connector.interface().as_str(),
+ connector.interface_id(),
+ );
+
+ let config = self
+ .config
+ .borrow()
+ .outputs
+ .iter()
+ .find(|o| o.name == output_name)
+ .cloned()
+ .unwrap_or_default();
+
+ if !config.off {
+ to_connect.push((*node, connector.clone(), crtc));
+ }
+ }
+ }
+
+ for (node, crtc) in to_disconnect {
+ self.connector_disconnected(niri, node, crtc);
+ }
+
+ for (node, connector, crtc) in to_connect {
+ if let Err(err) = self.connector_connected(niri, node, connector, crtc) {
+ warn!("error connecting connector: {err:?}");
+ }
+ }
+ }
}
fn primary_node_from_config(config: &Config) -> Option<(DrmNode, DrmNode)> {
diff --git a/src/niri.rs b/src/niri.rs
index 1772160f..2a4cc089 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -615,6 +615,8 @@ impl State {
}
self.niri.reposition_outputs(None);
+
+ self.backend.on_output_config_changed(&mut self.niri);
}
self.niri.queue_redraw_all();