blob: 6f408153d07d28bfa911ce380975f996f5d3deef [file] [log] [blame]
Brad Bishopbec4ebc2022-08-03 09:55:16 -04001import shutil
2import collections
3import pathlib
4import os
5
6from typing import List, Optional
7
8
9def get_config_dir() -> pathlib.Path:
10 value = os.environ.get("XDG_CONFIG_HOME")
11 if value and os.path.isabs(value):
12 return pathlib.Path(value)
13 else:
14 return pathlib.Path.home() / ".config"
15
16class Terminals:
17 Terminal = collections.namedtuple("Terminal", ["priority", "name", "command"])
18
19 def __init__(self):
20 self.terminals = []
21
22 def add_terminal(self, priority, name, command):
23 self.terminals.append(Terminals.Terminal(priority, name, command))
24 # Keep this list sorted by priority
25 self.terminals.sort(reverse=True, key=lambda t: t.priority)
26 self.name_map = {t.name: t for t in self.terminals}
27
28 def configured_terminal(self) -> Optional[str]:
29 import configparser
30
31 config = configparser.ConfigParser()
32 config.read(get_config_dir() / "runfvp.conf")
33 return config.get("RunFVP", "Terminal", fallback=None)
34
35 def preferred_terminal(self) -> str:
36 import shlex
37
38 preferred = self.configured_terminal()
39 if preferred:
40 return preferred
41
42 for t in self.terminals:
43 if t.command and shutil.which(shlex.split(t.command)[0]):
44 return t.name
45 return self.terminals[-1].name
46
47 def all_terminals(self) -> List[str]:
48 return self.name_map.keys()
49
50 def __getitem__(self, name: str):
51 return self.name_map[name]
52
53terminals = Terminals()
54# TODO: option to switch between telnet and netcat
55connect_command = "telnet localhost %port"
56terminals.add_terminal(2, "tmux", f"tmux new-window -n \"%title\" \"{connect_command}\""),
57terminals.add_terminal(2, "gnome-terminal", f"gnome-terminal --window --title \"%title\" --command \"{connect_command}\""),
58terminals.add_terminal(1, "xterm", f"xterm -title \"%title\" -e {connect_command}"),
59terminals.add_terminal(0, "none", None)