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)