Overhauled original method for determining closest res match

This commit is contained in:
2026-08-16 00:20:18 +12:00
parent 19b7b89453
commit d5bdad8dca
+29 -7
View File
@@ -18,14 +18,31 @@ from pkg.wayland_display_manager.structs import Modeline
def calculate_closest_mode( def calculate_closest_mode(
sunshine_env: SunshineEnvironmentVariables, supported_modes: list[Modeline] sunshine_env: SunshineEnvironmentVariables, supported_modes: list[Modeline]
) -> Modeline: ) -> Modeline:
def _distance(mode: Modeline): target_w = sunshine_env.specs.width
return ( target_h = sunshine_env.specs.height
abs(mode.width - sunshine_env.specs.width) * 2 target_fps = sunshine_env.specs.fps
+ abs(mode.height - sunshine_env.specs.height) * 2
+ abs(mode.refresh_rate - 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(): def main():
@@ -59,6 +76,9 @@ def main():
display_manager.set_mode( display_manager.set_mode(
modeline=modeline, requested_connector=sys.argv[Arguments.CONNECTOR] modeline=modeline, requested_connector=sys.argv[Arguments.CONNECTOR]
) )
print(modeline)
else: else:
raise ValueError(Errors.CONNECTOR_INVALID) raise ValueError(Errors.CONNECTOR_INVALID)
@@ -67,6 +87,8 @@ def main():
display_manager.set_mode(modeline, sys.argv[Arguments.CONNECTOR]) display_manager.set_mode(modeline, sys.argv[Arguments.CONNECTOR])
print(modeline)
case Instructions.CREATE: case Instructions.CREATE:
if len(sys.argv) - 1 < Arguments.TEMPLATE: if len(sys.argv) - 1 < Arguments.TEMPLATE:
raise SyntaxError(Errors.INSUFFICIENT_INSTRUCTIONS) raise SyntaxError(Errors.INSUFFICIENT_INSTRUCTIONS)