diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-14 21:14:01 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-14 21:14:01 +0400 |
| commit | 8e1d4de0dccdf14cb60d505cd0864a40e56a33d8 (patch) | |
| tree | 4be05ee1b7c08db1ce94dc29bb2fee388915248f /src/backend/tty.rs | |
| parent | 72e3fadb9ac3dd93153f7f6fb46f88cd00ef04c1 (diff) | |
| download | niri-8e1d4de0dccdf14cb60d505cd0864a40e56a33d8.tar.gz niri-8e1d4de0dccdf14cb60d505cd0864a40e56a33d8.tar.bz2 niri-8e1d4de0dccdf14cb60d505cd0864a40e56a33d8.zip | |
tty: Filter out interlaced modes
They don't seem to work. wlroots also filters them:
https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/feb54979c0940655e36119c63e18a9ee72cc03b0/backend/drm/drm.c#L1461
Diffstat (limited to 'src/backend/tty.rs')
| -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); |
