Example #1
0
    def __init__(self, name: str, config) -> None:
        self.name = name
        cache_dir = Misc.i3path() + '/cache'
        Misc.create_dir(cache_dir)

        tmux_socket_dir = expanduser(f'{cache_dir}/tmux_sockets')
        dtach_session_dir = expanduser(f'{cache_dir}/dtach_sessions')
        self.alacritty_cfg_dir = expanduser(f'{cache_dir}/alacritty_cfg')
        self.alacritty_cfg = expanduser(os.environ.get("XDG_CONFIG_HOME") + \
            "/alacritty/alacritty.yml")

        Misc.create_dir(tmux_socket_dir)
        Misc.create_dir(self.alacritty_cfg_dir)
        Misc.create_dir(dtach_session_dir)

        self.sockpath = expanduser(f'{tmux_socket_dir}/{name}.socket')

        for sh in ['dash', 'zsh', 'bash', 'sh']:
            if shutil.which(sh):
                self.default_shell = sh
                break

        cfg_block = config.get(name, {})
        if not cfg_block:
            return

        # get terminal from config, use Alacritty by default
        self.term = cfg_block.get("term", "alacritty").lower()

        if os.path.exists(self.alacritty_cfg):
            if os.stat(self.alacritty_cfg).st_size == 0:
                print('Alacritty cfg {self.alacritty_cfg} is empty')
                self.term = env.terminal_fallback_detect()
        else:
            print('Alacritty cfg {self.alacritty_cfg} not exists, put it here')
            self.term = env.terminal_fallback_detect()

        self.wclass = cfg_block.get("class", self.term)
        self.title = cfg_block.get("title", self.wclass)
        self.font = config.get("default_font", "")
        if not self.font:
            self.font = cfg_block.get("font", "Iosevka Term")
        self.font_size = config.get("default_font_size", "")
        if not self.font_size:
            self.font_size = cfg_block.get("font_size", "14")
        use_one_fontstyle = config.get("use_one_fontstyle", False)
        self.font_style = config.get("default_font_style", "")
        if not self.font_style:
            self.font_style = cfg_block.get("font_style", "Regular")
        if use_one_fontstyle:
            self.font_normal = cfg_block.get("font_normal", self.font_style)
            self.font_bold = cfg_block.get("font_bold", self.font_style)
            self.font_italic = cfg_block.get("font_italic", self.font_style)
        else:
            self.font_normal = cfg_block.get("font_normal", 'Regular')
            self.font_bold = cfg_block.get("font_bold", 'Bold')
            self.font_italic = cfg_block.get("font_italic", 'Italic')

        self.tmux_session_attach = f"tmux -S {self.sockpath} a -t {name}"
        self.tmux_new_session = f"tmux -S {self.sockpath} new-session -s {name}"
        self.exec = cfg_block.get("exec", '')
        env_list = cfg_block.get("env", '')
        self.env_dict = {**os.environ}
        for env_str in env_list:
            env_data = env_str.split('=')
            if len(env_data) > 1:
                self.env_dict.update({env_data[0]: ' '.join(env_data[1:])})
        self.exec_tmux = cfg_block.get("exec_tmux", [])
        self.with_tmux = bool(self.exec_tmux)
        if not self.with_tmux:
            exec_dtach = cfg_block.get('exec_dtach', '')
            if not exec_dtach:
                self.prog = cfg_block.get('exec', 'true')
            else:
                self.prog = f'dtach -A {dtach_session_dir}' \
                            f'/{name}.session {exec_dtach}'

        self.padding = cfg_block.get('padding', [2, 2])
        self.opacity = cfg_block.get('opacity', 0.88)
        self.statusline = cfg_block.get('statusline', 1)

        self.create_term_params(config, name)

        def join_processes():
            for prc in multiprocessing.active_children():
                prc.join()

        threading.Thread(target=join_processes, args=(), daemon=True).start()