205 lines
5.2 KiB
Python
Executable File
205 lines
5.2 KiB
Python
Executable File
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":
|
|
# TODO: declare the lambda once and don't repeat the code
|
|
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
|