Skip to content

Instantly share code, notes, and snippets.

@seahawk1986
Created January 7, 2020 09:00
Show Gist options
  • Save seahawk1986/a83c6fea2d68ca861913e2813e29702a to your computer and use it in GitHub Desktop.
Save seahawk1986/a83c6fea2d68ca861913e2813e29702a to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
from collections import namedtuple
import pprint
import subprocess
import sys
pp = pprint.PrettyPrinter(indent=4)
def call_modetest():
try:
result = subprocess.run(['modetest', '-c'], check=True, capture_output=True, text=True, errors='replace')
except subprocess.CalledProcessError as e:
print(e, file=sys.stderr)
else:
return result.stdout
Mode = namedtuple('Mode', ['connection', 'resolution', 'refreshrate'])
def sort_modes(mode: Mode):
preferred_rrates = [50, 60, 30, 24]
preferred_resolutions = ['3840x2160', '1920x1080', '1280x720']
preferred_outputs = ['HDMI', 'DP', 'DVI', 'VGA']
connection_score = 0
rrate_score = 0
resolution_score = 0
if mode.resolution.endswith('i'):
resolution_score -= 1
resolution = mode.resolution[:-1]
else:
resolution = mode.resolution
if mode.refreshrate in preferred_rrates:
rrate_score = len(preferred_rrates) - preferred_rrates.index(mode.refreshrate)
if mode.resolution in preferred_resolutions:
resolution_score = len(preferred_resolutions) - preferred_resolutions.index(mode.resolution)
x_resolution, y_resolution = (int(n) for n in resolution.split('x'))
connection = mode.connection.split('-')[0]
if connection in preferred_outputs:
connection_score = len(preferred_outputs) - preferred_outputs.index(connection)
return (rrate_score, resolution_score, x_resolution, y_resolution, connection_score)
def parse_modetest(data):
connectors = {}
mode_list = []
for line in data:
if "connected" in line:
conn_id, encoder, status, name, size, modes, encoders = line.split()
if status == 'disconnected':
connectors[name] = {'connected': False, 'modes': set()}
else:
connectors[name] = {'connected': True, 'modes': set()}
if "modes:" in next(data):
next(data)
while True:
l = next(data)
if "props:" in l:
break
mode, refresh, *_ = l.split()
connectors[name]['modes'].add((mode, int(refresh)))
mode_list.append(Mode(name, mode, int(refresh)))
return connectors, mode_list
if __name__ == '__main__':
data = call_modetest()
connectors, modes = parse_modetest(iter(data.splitlines()))
best_modes = sorted(modes, key=sort_modes)
pp.pprint(best_modes)
print("Best Mode:", best_modes[-1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment