Ako na analógové hodiny v tint2

Včera | 16:55 | Richard | Richard

V januári tohto roku (2026) som začal používať panel tint2, namiesto originálneho v IceWM. Ten síce obsahuje „widget“ s hodinami, ale len digitálnymi. V tomto príspevku si povieme, ako do tint2 dostať aj klasické, ručičkové. Také, aké boli v KDE 3.x (čo je posledné, ktoré som používal, hoci krátko).

Čo to vlastne je, ten widget

Ak sa pozriete na spomínaný článok, v screenshotoch je na pravej strane zvislý panel s hodinami navrchu. Tint2 používa vlastné tlačidlá a vykonávače skriptov, tzv. executors. A jedným z nich, vstavaným, sú aj hodiny. V nastavenom čase sa vypisuje dátum i čas klasicky vo formáte strftime.

Ale čo ak tam chceme analógové?

Využijeme trik s executors. Teda vlastného skriptu, ktorý dokáže byť volaný v pravidelných intervaloch. Ak je výstup skriptu viacriadkový a v prvom riadku je cesta k obrázku (png, svg,…), tak tint2 tento obrázok zobrazí a za ním ďalšie riadky výstupu.

Takže tu sa zámer odhalil: budeme generovať obrázok, každú minútu, a ten zobrazovať.

Odkiaľ vziať obrázok aktuálneho času?

Najprv som myslel, či klasický xclock nemá prepínač na export do obrázku. No, nemá.

Potom som uvažoval spraviť skript, ktorý zobrazí xclock a potom scrot spraví z neho snímku. Ale to by bolo asi podivné a zrejme by aj samotné hodiny preblikli.

Čo takto premietať conky na plochu a panel spraviť kratší? No to je asi overengeneering na takúto blbosť.

A čo takto Tcl a Tk? Tam existujú funkcie na kreslenie… Ale práca s nimi je trochu… no málo pohodlná.

Tak nakoniec Python. S ním veľa neviem, ale veď LLM pomôže a kód v pythone je zvyčajne dobre čitateľný.

Skript v pythone na nakreslenie hodín

Pôvodne som chcel dať ten skript na git, ale je tak krátky, že sa dá vložiť i tu:

#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFont
import datetime
import math

img = Image.new('RGBA', (300, 300), (0, 0, 0, 0))  
draw = ImageDraw.Draw(img)

center = (150, 150)
radius = 140
draw.ellipse((center[0]-radius, center[1]-radius, center[0]+radius,
              center[1]+radius), outline=(64, 64, 64), width=3)


for i in range(12):
    angle = math.radians(i * 30 - 90)  
    x1 = center[0] + (radius - 15) * math.cos(angle)
    y1 = center[1] + (radius - 15) * math.sin(angle)
    x2 = center[0] + radius * math.cos(angle)
    y2 = center[1] + radius * math.sin(angle)
    draw.line([(x1, y1), (x2, y2)], fill="#404040", width=3)

now = datetime.datetime.now()
hours, minutes = now.hour % 12, now.minute

hour_angle = math.radians((hours * 30) + (minutes * 0.5) - 90)  
hour_length = radius * 0.5
hour_x = center[0] + hour_length * math.cos(hour_angle)
hour_y = center[1] + hour_length * math.sin(hour_angle)
draw.line([center, (hour_x, hour_y)], fill='red', width=18)

minute_angle = math.radians(minutes * 6 - 90)
minute_length = radius * 0.8
minute_x = center[0] + minute_length * math.cos(minute_angle)
minute_y = center[1] + minute_length * math.sin(minute_angle)
draw.line([center, (minute_x, minute_y)], fill='black', width=8)

draw.ellipse((center[0]-5, center[1]-5, center[0]+5, center[1]+5),
             fill="#404040")

img.save("/home/richard/coding/python/aclock/analog_clock.png")
print('/home/richard/coding/python/aclock/analog_clock.png')

No nevravím, s kresliacimi funkciami pomohol LLM Mistral, ktorý mi beží v Emacse. A takisto s výpočtom uhlov ručičiek. Nevravím, keby som si to dal na papier, tak to zvládnem. Ale LLM to dal na 1×. Brain rotting ako vyšitý. (个_个).

Myslím, že je to veľmi jednoduché a opisné.

…že print na konci súboru do stdout vypíše cestu k vytvorenému PNG obrázku. To je dôležité, lebo executor v tint2 vie načítať len cestu k súboru.

To, že cesta by mohla byť v premennej a nie vypísaná 2× je dôkazom nedeľnej lenivosti.

Úprava tint2rc

Do konfiguračné súboru (typicky v ~/.config/tint2/) vložíme tieto definície:

# Executor 1
execp = new
execp_command = /home/richard/coding/python/aclock/aclock.py
execp_interval = 60
execp_has_icon = 1
execp_cache_icon = 0
execp_continuous = 0
execp_markup = 0
execp_monitor = all
execp_tooltip = LMB: app-select
execp_lclick_command = /usr/local/bin/app-select
execp_background_id = 0
execp_centered = 1
execp_icon_w = 75
execp_icon_h = 75 

Ale nevravím, dá sa to aj v grafickom konfigurátore tint2conf.

V ňom je dôležité:

Záver

A to je všetko. Nič viac, nič menej. Ale vidíme, že mohli by sme mať skript i na generovanie napríklad vyťaženia siete alebo kdejakých krajších obrázkov počasia.

Ja som s tým spokojný. Trvalo mi to asi pol hodinu a fungovalo to okamžite.

Výhoda vlastnoručne vytvorenej veci je, že si ju môže človek úplne prispôsobiť podľa svojich potrieb a (ne)vkusu. Plus sa niečo naučí. A je v tom i trochu vzrušenia z vlastnej tvorby! 😊

Niekto by mohol namietať, že sú hotové riešenia (xfce4-panel, polybar, atď.) Áno, to má zmysel, keď potrebujeme funkčnosť ihneď a bez úsilia.

Avšak vlastnoručne vytvorená vec prináša osobitú hodnotu: učí (ma) novým zručnostiam a prináša uspokojenie z vlastnej tvorby. Je to investícia do budúcich zmien.

Prílohy