aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tty.rs
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/backend/tty.rs
parent6644cc16fffb26893c3bf33ab26b2aa625bf75dc (diff)
downloadniri-5f440f7be3245ad2d357b49d2d2948bb931f661a.tar.gz
niri-5f440f7be3245ad2d357b49d2d2948bb931f661a.tar.bz2
niri-5f440f7be3245ad2d357b49d2d2948bb931f661a.zip
Add live-reload for output on/off
Diffstat (limited to 'src/backend/tty.rs')
-rw-r--r--src/backend/tty.rs65
1 files changed, 65 insertions, 0 deletions
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)> {