aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tty.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/tty.rs')
-rw-r--r--src/backend/tty.rs83
1 files changed, 72 insertions, 11 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index dc08bbe5..f6a40500 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -434,20 +434,81 @@ impl Tty {
.as_mut()
.context("missing output device")?;
- let mut mode = connector.modes().get(0);
- connector.modes().iter().for_each(|m| {
- trace!("mode: {m:?}");
-
- if m.mode_type().contains(ModeTypeFlags::PREFERRED) {
- // Pick the highest refresh rate.
- if mode
- .map(|curr| curr.vrefresh() < m.vrefresh())
- .unwrap_or(true)
- {
+ // FIXME: print modes here until we have a better way to list all modes.
+ for m in connector.modes() {
+ let wl_mode = Mode::from(*m);
+ debug!(
+ "mode: {}x{}@{:.3}",
+ m.size().0,
+ m.size().1,
+ wl_mode.refresh as f64 / 1000.,
+ );
+
+ trace!("{m:?}");
+ }
+
+ let mut mode = None;
+
+ if let Some(target) = &config.mode {
+ let refresh = target.refresh.map(|r| (r * 1000.).round() as i32);
+
+ for m in connector.modes() {
+ if m.size() != (target.width, target.height) {
+ continue;
+ }
+
+ if let Some(refresh) = refresh {
+ // If refresh is set, only pick modes with matching refresh.
+ let wl_mode = Mode::from(*m);
+ if wl_mode.refresh == refresh {
+ mode = Some(m);
+ }
+ } else if let Some(curr) = mode {
+ // If refresh isn't set, pick the mode with the highest refresh.
+ if curr.vrefresh() < m.vrefresh() {
+ mode = Some(m);
+ }
+ } else {
mode = Some(m);
}
}
- });
+
+ if mode.is_none() {
+ warn!(
+ "configured mode {}x{}{} could not be found, falling back to preferred",
+ target.width,
+ target.height,
+ if let Some(refresh) = target.refresh {
+ format!("@{refresh}")
+ } else {
+ String::new()
+ },
+ );
+ }
+ }
+
+ if mode.is_none() {
+ // Pick a preferred mode.
+ for m in connector.modes() {
+ if !m.mode_type().contains(ModeTypeFlags::PREFERRED) {
+ continue;
+ }
+
+ if let Some(curr) = mode {
+ if curr.vrefresh() < m.vrefresh() {
+ mode = Some(m);
+ }
+ } else {
+ mode = Some(m);
+ }
+ }
+ }
+
+ if mode.is_none() {
+ // Last attempt.
+ mode = connector.modes().get(0);
+ }
+
let mode = mode.ok_or_else(|| anyhow!("no mode"))?;
debug!("picking mode: {mode:?}");