from datetime import datetime from kitty.boss import get_boss from kitty.fast_data_types import Screen, add_timer, get_options from kitty.tab_bar import ( DrawData, ExtraData, Formatter, TabBarData, as_rgb, draw_attributed_string, draw_title, ) from kitty.utils import color_as_int RIGHT_MARGIN = 1 REFRESH_TIME = 1 ICON = "  " opts = get_options() icon_fg = as_rgb(color_as_int(opts.color16)) icon_bg = as_rgb(color_as_int(opts.color8)) bat_text_color = as_rgb(color_as_int(opts.color15)) clock_color = as_rgb(color_as_int(opts.color15)) date_color = as_rgb(color_as_int(opts.color8)) UNPLUGGED_ICONS = { 10: "", 20: "", 30: "", 40: "", 50: "", 60: "", 70: "", 80: "", 90: "", 100: "", } PLUGGED_ICONS = { 1: "", } UNPLUGGED_COLORS = { 15: as_rgb(color_as_int(opts.color1)), 16: as_rgb(color_as_int(opts.color15)), } PLUGGED_COLORS = { 15: as_rgb(color_as_int(opts.color1)), 16: as_rgb(color_as_int(opts.color6)), 99: as_rgb(color_as_int(opts.color6)), 100: as_rgb(color_as_int(opts.color2)), } 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, ) -> int: if draw_data.leading_spaces: screen.draw(" " * draw_data.leading_spaces) draw_title(draw_data, screen, tab, index) trailing_spaces = min(max_title_length - 1, draw_data.trailing_spaces) max_title_length -= trailing_spaces extra = screen.cursor.x - before - max_title_length if extra > 0: screen.cursor.x -= extra + 1 screen.draw("…") if trailing_spaces: screen.draw(" " * trailing_spaces) end = screen.cursor.x screen.cursor.bold = screen.cursor.italic = False screen.cursor.fg = 0 if not is_last: screen.cursor.bg = as_rgb(color_as_int(draw_data.inactive_bg)) screen.draw(draw_data.sep) screen.cursor.bg = 0 return end def _draw_right_status( screen: Screen, is_last: bool, cells: list ) -> int: if not is_last: return 0 draw_attributed_string(Formatter.reset, screen) right_status_length = RIGHT_MARGIN for i in cells: right_status_length += len(str(i[1])) draw_spaces = screen.columns - screen.cursor.x - right_status_length if draw_spaces > 0: screen.draw(" " * draw_spaces) screen.cursor.fg = 0 for color, status in cells: screen.cursor.fg = color screen.draw(status) screen.cursor.bg = 0 if screen.columns - screen.cursor.x > right_status_length: screen.cursor.x = screen.columns - right_status_length return screen.cursor.x def _redraw_tab_bar(_): tm = get_boss().active_tab_manager if tm is not None: tm.mark_tab_bar_dirty() def get_battery_cells() -> list: try: with open("/sys/class/power_supply/BAT0/status", "r") as f: status = f.read() with open("/sys/class/power_supply/BAT0/capacity", "r") as f: percent = int(f.read()) if status == "Discharging\n": icon_color = UNPLUGGED_COLORS[ min(UNPLUGGED_COLORS.keys(), key=lambda x: abs(x - percent)) ] icon = UNPLUGGED_ICONS[ min(UNPLUGGED_ICONS.keys(), key=lambda x: abs(x - percent)) ] elif status == "Not charging\n": icon_color = UNPLUGGED_COLORS[ min(UNPLUGGED_COLORS.keys(), key=lambda x: abs(x - percent)) ] icon = PLUGGED_ICONS[ min(PLUGGED_ICONS.keys(), key=lambda x: abs(x - percent)) ] else: icon_color = PLUGGED_COLORS[ min(PLUGGED_COLORS.keys(), key=lambda x: abs(x - percent)) ] icon = PLUGGED_ICONS[ min(PLUGGED_ICONS.keys(), key=lambda x: abs(x - percent)) ] percent_cell = (bat_text_color, str(percent) + "% ") icon_cell = (icon_color, icon) return [percent_cell, icon_cell] except FileNotFoundError: return [] timer_id = None def draw_tab( draw_data: DrawData, screen: Screen, tab: TabBarData, before: int, max_title_length: int, index: int, is_last: bool, _: ExtraData, ) -> int: global timer_id if timer_id is None: timer_id = add_timer(_redraw_tab_bar, REFRESH_TIME, True) clock = datetime.now().strftime(" %H:%M") date = datetime.now().strftime(" %d.%m.%Y") cells = get_battery_cells() cells.append((clock_color, clock)) cells.append((date_color, date)) _draw_icon(screen, index) _draw_left_status( draw_data, screen, tab, before, max_title_length, index, is_last, ) _draw_right_status( screen, is_last, cells, ) return screen.cursor.x