Overhauled original method for determining closest res match
This commit is contained in:
+29
-7
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user