aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-07-27 13:43:27 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-07-27 13:43:27 +0300
commitaf904d23acc7980fbf3aedf173dc96af1dd580b9 (patch)
treeb21aa1cd2c049be0632f0823a0845304cb514cb1 /src
parentad84fc1479a779faa3d8a893a11b566e7ae22b6c (diff)
downloadniri-af904d23acc7980fbf3aedf173dc96af1dd580b9.tar.gz
niri-af904d23acc7980fbf3aedf173dc96af1dd580b9.tar.bz2
niri-af904d23acc7980fbf3aedf173dc96af1dd580b9.zip
tty: Add check for vblank on idle
Diffstat (limited to 'src')
-rw-r--r--src/backend/tty.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index fa7d4b18..10becafe 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -1178,6 +1178,16 @@ impl Tty {
return;
};
+ // This happened for someone reconnecting 2 monitors with a KVM switch:
+ // https://github.com/YaLTeR/niri/issues/556
+ //
+ // Maybe the vblank didn't get cancelled or got reordered weirdly? Either way, we can avoid
+ // crashing here.
+ if matches!(output_state.redraw_state, RedrawState::Idle) {
+ error!("got vblank for an idle output {name}");
+ return;
+ }
+
// Mark the last frame as submitted.
match surface.compositor.frame_submitted() {
Ok(Some((mut feedback, target_presentation_time))) => {