diff options
| -rw-r--r-- | src/backend/tty.rs | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs index d9e2ba43..d9c1c7f1 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -1252,34 +1252,47 @@ impl Tty { }) .unwrap_or_else(|| ("Unknown".into(), "Unknown".into())); + let surface = device.surfaces.get(&crtc); + let current_crtc_mode = surface.map(|surface| surface.compositor.pending_mode()); + let mut current_mode = None; + let modes = connector .modes() .iter() - .map(|m| niri_ipc::Mode { - width: m.size().0, - height: m.size().1, - refresh_rate: Mode::from(*m).refresh as u32, + .filter(|m| !m.flags().contains(ModeFlags::INTERLACE)) + .enumerate() + .map(|(idx, m)| { + if Some(*m) == current_crtc_mode { + current_mode = Some(idx); + } + + niri_ipc::Mode { + width: m.size().0, + height: m.size().1, + refresh_rate: Mode::from(*m).refresh as u32, + } }) .collect(); - let mut output = niri_ipc::Output { + if let Some(crtc_mode) = current_crtc_mode { + if current_mode.is_none() { + if crtc_mode.flags().contains(ModeFlags::INTERLACE) { + warn!("connector mode list missing current mode (interlaced)"); + } else { + error!("connector mode list missing current mode"); + } + } + } + + let output = niri_ipc::Output { name: connector_name.clone(), make, model, physical_size, modes, - current_mode: None, + current_mode, }; - if let Some(surface) = device.surfaces.get(&crtc) { - let current = surface.compositor.pending_mode(); - if let Some(current) = connector.modes().iter().position(|m| *m == current) { - output.current_mode = Some(current); - } else { - error!("connector mode list missing current mode"); - } - } - ipc_outputs.insert(connector_name, output); } } @@ -1662,6 +1675,11 @@ fn pick_mode( continue; } + // Interlaced modes don't appear to work. + if m.flags().contains(ModeFlags::INTERLACE) { + continue; + } + if let Some(refresh) = refresh { // If refresh is set, only pick modes with matching refresh. let wl_mode = Mode::from(*m); |
