# pyright: reportMissingImports=false # from pprint import pprint # from kitty.window import CwdRequest from kitty.boss import get_boss from kitty.fast_data_types import Screen, add_timer, get_options from kitty.utils import color_as_int from kitty.tab_bar import ( DrawData, ExtraData, Formatter, TabBarData, as_rgb, draw_attributed_string, draw_title, ) opts = get_options() text_fg = as_rgb(color_as_int(opts.color15)) icon_fg = as_rgb(color_as_int(opts.color16)) icon_bg = as_rgb(color_as_int(opts.color8)) SEPARATOR_SYMBOL, SOFT_SEPARATOR_SYMBOL = ("", "") RIGHT_MARGIN = 0 REFRESH_TIME = 1 ICON = "  " def _draw_icon(screen: Screen, index: int) -> int: if index != 1: return 0 fg, bg = screen.cursor.fg, screen.cursor.bg screen.cursor.fg = icon_fg screen.cursor.bg = icon_bg screen.draw(ICON) screen.cursor.fg, screen.cursor.bg = fg, bg screen.cursor.x = len(ICON) return screen.cursor.x def _draw_left_status( draw_data: DrawData, screen: Screen, tab: TabBarData, before: int, max_title_length: int, index: int, is_last: bool, extra_data: ExtraData, ) -> int: if screen.cursor.x >= screen.columns - right_status_length: return screen.cursor.x tab_bg = screen.cursor.bg tab_fg = screen.cursor.fg default_bg = as_rgb(int(draw_data.default_bg)) if extra_data.next_tab: next_tab_bg = as_rgb(draw_data.tab_bg(extra_data.next_tab)) needs_soft_separator = next_tab_bg == tab_bg else: next_tab_bg = default_bg needs_soft_separator = False if screen.cursor.x <= len(ICON): screen.cursor.x = len(ICON) screen.draw(" ") screen.cursor.bg = tab_bg # if tab.title.rindex(tab.title[-1]) + 1 > 15: # title = f'{os.path.splitext(tab.title)[0][:14-len(os.path.splitext(tab.title))]}…{os.path.splitext(tab.title)[1]}' # tab = TabBarData(title, tab.is_active, tab.needs_attention, tab.num_windows, tab.num_window_groups, tab.layout_name, tab.has_activity_since_last_focus, tab.active_fg, tab.active_bg, tab.inactive_fg, tab.inactive_bg) draw_title(draw_data, screen, tab, index) if not needs_soft_separator: screen.draw(" ") screen.cursor.fg = tab_bg screen.cursor.bg = next_tab_bg screen.draw(SEPARATOR_SYMBOL) else: prev_fg = screen.cursor.fg if tab_bg == tab_fg: screen.cursor.fg = default_bg elif tab_bg != default_bg: c1 = draw_data.inactive_bg.contrast(draw_data.default_bg) c2 = draw_data.inactive_bg.contrast(draw_data.inactive_fg) if c1 < c2: screen.cursor.fg = default_bg screen.draw(" " + SOFT_SEPARATOR_SYMBOL) screen.cursor.fg = prev_fg return screen.cursor.x def _draw_right_status(screen: Screen, is_last: bool, cells: list) -> int: if not is_last: return 0 draw_attributed_string(Formatter.reset, screen) screen.cursor.x = screen.columns - right_status_length screen.cursor.fg = 0 for color, status in cells: screen.cursor.fg = color screen.draw(status) screen.cursor.bg = 0 return screen.cursor.x def _redraw_tab_bar(_): tm = get_boss().active_tab_manager if tm is not None: tm.mark_tab_bar_dirty() timer_id = None right_status_length = -1 def draw_tab( draw_data: DrawData, screen: Screen, tab: TabBarData, before: int, max_title_length: int, index: int, is_last: bool, extra_data: ExtraData, ) -> int: global timer_id global right_status_length if timer_id is None: timer_id = add_timer(_redraw_tab_bar, REFRESH_TIME, True) active_window = get_boss().active_window_for_cwd # active_dir = CwdRequest(active_window) active_pid = active_window.child.pid try: with open(f"/tmp/current_venv-{active_pid}", "r") as f: env = f.read() if env != "": env = f" {env}" except FileNotFoundError: env = "" cells = [(text_fg, env)] right_status_length = RIGHT_MARGIN for cell in cells: right_status_length += len(str(cell[1])) _draw_icon(screen, index) _draw_left_status( draw_data, screen, tab, before, max_title_length, index, is_last, extra_data, ) _draw_right_status( screen, is_last, cells, ) return screen.cursor.x