diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-21 12:45:58 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-21 12:45:58 +0400 |
| commit | 99484afe526dde4c04050f0ea7c98dc63f444fdf (patch) | |
| tree | ff02e147e990eccd79cf8e2a5fda8cd20ac3d093 /src | |
| parent | 07d92e7c41c430abb1cf7721d80ac4d6da0b139a (diff) | |
| download | niri-99484afe526dde4c04050f0ea7c98dc63f444fdf.tar.gz niri-99484afe526dde4c04050f0ea7c98dc63f444fdf.tar.bz2 niri-99484afe526dde4c04050f0ea7c98dc63f444fdf.zip | |
tty: Add hack to make resume from sleep work
Diffstat (limited to 'src')
| -rw-r--r-- | src/tty.rs | 49 |
1 files changed, 37 insertions, 12 deletions
@@ -217,19 +217,45 @@ impl Tty { // It hasn't been removed, update its state as usual. output_device.drm.activate(); - // Refresh the connectors. - tty.device_changed(output_device_id, niri); + // HACK: force reset the connectors to make resuming work across + // sleep. + let output_device = tty.output_device.as_mut().unwrap(); + let crtcs: Vec<_> = output_device + .drm_scanner + .crtcs() + .map(|(conn, crtc)| (conn.clone(), crtc)) + .collect(); + for (conn, crtc) in crtcs { + tty.connector_disconnected(niri, conn, crtc); + } - // Refresh the state on unchanged connectors. let output_device = tty.output_device.as_mut().unwrap(); - for drm_compositor in output_device.surfaces.values_mut() { - if let Err(err) = drm_compositor.surface().reset_state() { - warn!("error resetting DRM surface state: {err}"); + let _ = output_device + .drm_scanner + .scan_connectors(&output_device.drm); + let crtcs: Vec<_> = output_device + .drm_scanner + .crtcs() + .map(|(conn, crtc)| (conn.clone(), crtc)) + .collect(); + for (conn, crtc) in crtcs { + if let Err(err) = tty.connector_connected(niri, conn, crtc) { + warn!("error connecting connector: {err:?}"); } - drm_compositor.reset_buffers(); } - niri.queue_redraw_all(); + // // Refresh the connectors. + // tty.device_changed(output_device_id, niri); + // + // // Refresh the state on unchanged connectors. + // for drm_compositor in output_device.surfaces.values_mut() { + // if let Err(err) = drm_compositor.surface().reset_state() { + // warn!("error resetting DRM surface state: {err}"); + // } + // drm_compositor.reset_buffers(); + // } + + // niri.queue_redraw_all(); } } else { // We didn't have an output device, check if it's been added. @@ -406,12 +432,10 @@ impl Tty { } fn device_removed(&mut self, device_id: dev_t, niri: &mut Niri) { - let Some(device) = self.output_device.take() else { + let Some(device) = &mut self.output_device else { return; }; - if device.id != device_id { - // It wasn't the output device, put it back in. - self.output_device = Some(device); + if device_id != device.id { return; } @@ -425,6 +449,7 @@ impl Tty { self.connector_disconnected(niri, connector, crtc); } + let device = self.output_device.take().unwrap(); niri.event_loop.remove(device.token); } |
