feat: prefer highest refresh rate at native resolution

populate_modes() now selects the mode with the highest refresh rate at
the preferred (native) resolution instead of blindly using the EDID
PREFERRED flag. This ensures high-refresh panels (120 Hz, 144 Hz, …)
are used out-of-the-box, including in the greeter session.

Also fix libcosmic → libcosmic-yoda package reference.
This commit is contained in:
Lionel DARNIS 2026-07-25 16:15:30 +02:00
parent d1849f639b
commit 7187efd58f
3 changed files with 18 additions and 7 deletions

View file

@ -1269,15 +1269,26 @@ fn populate_modes(
) -> Result<()> {
let conn_info = drm.get_connector(conn, false)?;
let max_bpc = drm_helpers::get_max_bpc(drm, conn)?.map(|(_val, range)| range.end.min(16));
let Some(mode) = conn_info
let preferred = conn_info
.modes()
.iter()
.find(|mode| mode.mode_type().contains(ModeTypeFlags::PREFERRED))
.copied()
.or(conn_info.modes().first().copied())
else {
.or(conn_info.modes().first().copied());
let Some(preferred) = preferred else {
anyhow::bail!("No mode found");
};
// Prefer the highest refresh rate at the native resolution so that
// high-refresh panels (120 Hz, 144 Hz, …) are used out-of-the-box
// without a pre-existing outputs.ron config.
let preferred_size = preferred.size();
let mode = conn_info
.modes()
.iter()
.filter(|m| m.size() == preferred_size)
.max_by_key(|m| drm_helpers::calculate_refresh_rate(**m))
.copied()
.unwrap_or(preferred);
let refresh_rate = drm_helpers::calculate_refresh_rate(mode);
let output_mode = OutputMode {