diff --git a/tests/features/test_resolution.py b/tests/features/test_resolution.py index 6a22c28..8d9c03f 100644 --- a/tests/features/test_resolution.py +++ b/tests/features/test_resolution.py @@ -12,6 +12,29 @@ def test_enumerate_modes_empty(): assert modes == [] +def test_enumerate_modes_fractional_refresh_rates(): + """QDC 报告的 59.94 应与 EnumDisplaySettings 的 60 匹配。""" + from ctypes import sizeof + + from winrandr.features.resolution import enumerate_modes + from winrandr.win32.structures import DEVMODE + + def fake_enum(_name, _i, dm_ptr): + dm_ptr._obj.dmSize = sizeof(DEVMODE) + if _i == 0: + dm_ptr._obj.dmPelsWidth = 1920 + dm_ptr._obj.dmPelsHeight = 1080 + dm_ptr._obj.dmDisplayFrequency = 60 + return 1 + return 0 # 无更多模式 + + with patch("winrandr.features.resolution._EnumDisplaySettings", side_effect=fake_enum): + # cur_refresh=59.94 模拟 QDC 报告分数刷新率 + modes = enumerate_modes("DISPLAY1", 1920, 1080, 59.94) + assert len(modes) == 1 + assert modes[0].is_current is True + + def test_enumerate_modes_skips_invalid(): """无效尺寸(frequency=0)的 mode 应跳过(覆盖 33->44 分支)。""" from ctypes import sizeof diff --git a/winrandr/features/resolution.py b/winrandr/features/resolution.py index 138e1ab..b79114f 100644 --- a/winrandr/features/resolution.py +++ b/winrandr/features/resolution.py @@ -39,7 +39,7 @@ def enumerate_modes(gdi_name: str, cur_width: int, cur_height: int, cur_refresh: break if dm.dmPelsWidth > 0 and dm.dmPelsHeight > 0 and dm.dmDisplayFrequency > 0: rr = float(dm.dmDisplayFrequency) - is_cur = dm.dmPelsWidth == cur_width and dm.dmPelsHeight == cur_height and abs(rr - cur_refresh) < 0.01 + is_cur = dm.dmPelsWidth == cur_width and dm.dmPelsHeight == cur_height and abs(rr - cur_refresh) < 0.5 is_pref = bool(has_reg and dm.dmPelsWidth == reg_dm.dmPelsWidth and dm.dmPelsHeight == reg_dm.dmPelsHeight) modes.append( DisplayMode(