aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-14 21:14:01 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-14 21:14:01 +0400
commit8e1d4de0dccdf14cb60d505cd0864a40e56a33d8 (patch)
tree4be05ee1b7c08db1ce94dc29bb2fee388915248f /src/backend
parent72e3fadb9ac3dd93153f7f6fb46f88cd00ef04c1 (diff)
downloadniri-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')
-rw-r--r--src/backend/tty.rs48
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);