From d5bdad8dcad8442c7b50cf5cf93541e6c0d43cba Mon Sep 17 00:00:00 2001 From: Oscar Grey Date: Sun, 16 Aug 2026 00:20:18 +1200 Subject: [PATCH] Overhauled original method for determining closest res match --- __main__.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/__main__.py b/__main__.py index 4e26957..9f977be 100755 --- a/__main__.py +++ b/__main__.py @@ -18,14 +18,31 @@ from pkg.wayland_display_manager.structs import Modeline def calculate_closest_mode( sunshine_env: SunshineEnvironmentVariables, supported_modes: list[Modeline] ) -> Modeline: - def _distance(mode: Modeline): - return ( - abs(mode.width - sunshine_env.specs.width) * 2 - + abs(mode.height - sunshine_env.specs.height) * 2 - + abs(mode.refresh_rate - sunshine_env.specs.fps) - ) + target_w = sunshine_env.specs.width + target_h = sunshine_env.specs.height + target_fps = sunshine_env.specs.fps - return min(supported_modes, key=_distance) + target_ratio = target_w / target_h + target_pixels = target_w * target_h + + def _sorting_rules(mode: Modeline): + # Shape difference + mode_ratio = mode.width / mode.height + shape_difference = abs(mode_ratio - target_ratio) + + # Is refresh rate too slow? (rules out very low refresh rates) + is_too_slow = mode.refresh_rate < target_fps + + # How off is the refresh rate? + fps_difference = abs(mode.refresh_rate - target_fps) + + # For comparing total pixel quantities + mode_pixels = mode.width * mode.height + pixel_difference = abs(mode_pixels - target_pixels) + + return (shape_difference, is_too_slow, fps_difference, pixel_difference) + + return min(supported_modes, key=_sorting_rules) def main(): @@ -59,6 +76,9 @@ def main(): display_manager.set_mode( modeline=modeline, requested_connector=sys.argv[Arguments.CONNECTOR] ) + + print(modeline) + else: raise ValueError(Errors.CONNECTOR_INVALID) @@ -67,6 +87,8 @@ def main(): display_manager.set_mode(modeline, sys.argv[Arguments.CONNECTOR]) + print(modeline) + case Instructions.CREATE: if len(sys.argv) - 1 < Arguments.TEMPLATE: raise SyntaxError(Errors.INSUFFICIENT_INSTRUCTIONS)