tty: Add hack to make resume from sleep work

This commit is contained in:
Ivan Molodetskikh
2023-08-21 12:45:58 +04:00
parent 07d92e7c41
commit 99484afe52
+39 -14
View File
@@ -217,19 +217,45 @@ impl Tty {
// It hasn't been removed, update its state as usual. // It hasn't been removed, update its state as usual.
output_device.drm.activate(); output_device.drm.activate();
// Refresh the connectors. // HACK: force reset the connectors to make resuming work across
tty.device_changed(output_device_id, niri); // sleep.
// Refresh the state on unchanged connectors.
let output_device = tty.output_device.as_mut().unwrap(); let output_device = tty.output_device.as_mut().unwrap();
for drm_compositor in output_device.surfaces.values_mut() { let crtcs: Vec<_> = output_device
if let Err(err) = drm_compositor.surface().reset_state() { .drm_scanner
warn!("error resetting DRM surface state: {err}"); .crtcs()
} .map(|(conn, crtc)| (conn.clone(), crtc))
drm_compositor.reset_buffers(); .collect();
for (conn, crtc) in crtcs {
tty.connector_disconnected(niri, conn, crtc);
} }
niri.queue_redraw_all(); let output_device = tty.output_device.as_mut().unwrap();
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:?}");
}
}
// // 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 { } else {
// We didn't have an output device, check if it's been added. // 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) { 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; return;
}; };
if device.id != device_id { if device_id != device.id {
// It wasn't the output device, put it back in.
self.output_device = Some(device);
return; return;
} }
@@ -425,6 +449,7 @@ impl Tty {
self.connector_disconnected(niri, connector, crtc); self.connector_disconnected(niri, connector, crtc);
} }
let device = self.output_device.take().unwrap();
niri.event_loop.remove(device.token); niri.event_loop.remove(device.token);
} }