dotfiles/talon/user/community/core/screens/screens.py

64 lines
2 KiB
Python

from talon import Module, cron, ui
from talon.canvas import Canvas
mod = Module()
@mod.action_class
class Actions:
def screens_show_numbering():
"""Show screen number on each screen"""
screens = ui.screens()
number = 1
for screen in screens:
show_screen_number(screen, number)
number += 1
def screens_get_by_number(screen_number: int) -> ui.Screen:
"""Get screen by number"""
screens = ui.screens()
length = len(screens)
if screen_number < 1 or screen_number > length:
raise Exception(
f"Non-existing screen {screen_number} in range [1, {length}]"
)
return screens[screen_number - 1]
def screens_get_previous(screen: ui.Screen) -> ui.Screen:
"""Get the screen before this one"""
return get_screen_by_offset(screen, -1)
def screens_get_next(screen: ui.Screen) -> ui.Screen:
"""Get the screen after this one"""
return get_screen_by_offset(screen, 1)
def get_screen_by_offset(screen: ui.Screen, offset: int) -> ui.Screen:
screens = ui.screens()
index = (screens.index(screen) + offset) % len(screens)
return screens[index]
def show_screen_number(screen: ui.Screen, number: int):
def on_draw(c):
c.paint.typeface = "arial"
# The min(width, height) is to not get gigantic size on portrait screens
c.paint.textsize = round(min(c.width, c.height) / 2)
text = f"{number}"
rect = c.paint.measure_text(text)[1]
x = c.x + c.width / 2 - rect.x - rect.width / 2
y = c.y + c.height / 2 + rect.height / 2
c.paint.style = c.paint.Style.FILL
c.paint.color = "eeeeee"
c.draw_text(text, x, y)
c.paint.style = c.paint.Style.STROKE
c.paint.color = "000000"
c.draw_text(text, x, y)
cron.after("3s", canvas.close)
canvas = Canvas.from_rect(screen.rect)
canvas.register("draw", on_draw)
canvas.freeze()