diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-16 15:34:00 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-16 15:34:00 +0400 |
| commit | 5f440f7be3245ad2d357b49d2d2948bb931f661a (patch) | |
| tree | 807a2f442a2dd506c7ea05aace268d2af6b2b1b3 /src/backend/tty.rs | |
| parent | 6644cc16fffb26893c3bf33ab26b2aa625bf75dc (diff) | |
| download | niri-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.rs | 65 |
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)> { |
