diff --git a/pressure-vessel-test-ui b/pressure-vessel-test-ui index f591d31deb17964cd882bcd5458659b1225481dc..93fc9b39b60bf5f1563259cab2c3d3e58a14b9f0 100755 --- a/pressure-vessel-test-ui +++ b/pressure-vessel-test-ui @@ -37,6 +37,7 @@ else: import gi gi.require_version('Gtk', '3.0') +from gi.repository import GLib from gi.repository import Gtk logger = logging.getLogger('pressure-vessel-test-ui') @@ -46,6 +47,32 @@ class Gui: def __init__(self): # type: (...) -> None + self.home = GLib.get_home_dir() + + self.runtimes = {} # type: typing.Dict[str, str] + + for search in ( + '..', + '../..', + os.path.expanduser( + '~/.steam/root/steamapps/common/Steam Linux Runtime' + ), + ): + source_of_runtimes = os.path.join( + os.path.dirname(sys.argv[0]), + search, + ) + for member in os.listdir(source_of_runtimes): + path = os.path.realpath( + os.path.join(source_of_runtimes, member) + ) + files = os.path.join(path, 'files') + metadata = os.path.join(path, 'metadata') + + if os.path.isdir(files) and os.path.exists(metadata): + description = self._describe_runtime(path) + self.runtimes[path] = description + self.window = Gtk.Window() self.window.set_default_size(600, 300) self.window.connect('delete-event', Gtk.main_quit) @@ -68,9 +95,15 @@ class Gui: self.runtime_combo = Gtk.ComboBoxText.new() self.runtime_combo.append('/', 'None (use host system)') - self.runtime_combo.append('scout', "SteamRT 1 'scout' (./scout)") - self.runtime_combo.append('spy', "SteamRT 2 'spy' (./spy)") - self.runtime_combo.set_active(1) + + for path, description in sorted(self.runtimes.items()): + self.runtime_combo.append(path, description) + + if self.runtimes: + self.runtime_combo.set_active(1) + else: + self.runtime_combo.set_active(0) + self.grid.attach(self.runtime_combo, 1, row, 1, 1) row += 1 @@ -115,6 +148,71 @@ class Gui: row += 1 + def _describe_runtime( + self, + path # type: str + ): + # type: (...) -> str + + description = path + files = os.path.join(path, 'files') + metadata = os.path.join(path, 'metadata') + + if description.startswith(self.home + '/'): + description = '~' + description[len(self.home):] + + name = None # type: typing.Optional[str] + pretty_name = None # type: typing.Optional[str] + build_id = None # type: typing.Optional[str] + + try: + keyfile = GLib.KeyFile.new() + keyfile.load_from_file( + metadata, GLib.KeyFileFlags.NONE) + try: + build_id = keyfile.get_string('Runtime', 'x-flatdeb-build-id') + except GLib.Error: + pass + + try: + name = keyfile.get_string('Runtime', 'runtime') + except GLib.Error: + pass + except GLib.Error: + pass + + try: + with open( + os.path.join(files, 'lib', 'os-release') + ) as reader: + for line in reader: + if line.startswith('PRETTY_NAME='): + pretty_name = line.split('=', 1)[1].strip() + pretty_name = GLib.shell_unquote( + pretty_name + ) + except (GLib.Error, EnvironmentError): + pass + + if pretty_name is None: + pretty_name = name + + if pretty_name is None: + pretty_name = os.path.basename(path) + + if build_id is None: + build_id = '' + else: + build_id = ' build {}'.format(build_id) + + description = '{}{}\n({})'.format( + pretty_name, + build_id, + description, + ) + + return description + def run_cb(self, _ignored=None): # type: (typing.Any) -> None @@ -139,14 +237,8 @@ class Gui: elif id == '/': pass else: - path = os.path.join( - os.path.dirname(sys.argv[0]), - '..', - id, - 'files', - ) argv.append('--runtime') - argv.append(path) + argv.append(os.path.join(id, 'files')) if self.share_home_check.get_active(): argv.append('--share-home')