From 5f440f7be3245ad2d357b49d2d2948bb931f661a Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 16 Jan 2024 15:34:00 +0400 Subject: Add live-reload for output on/off --- src/backend/mod.rs | 7 ++++++ src/backend/tty.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) (limited to 'src/backend') 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)> { -- cgit