Ako na analógové hodiny v tint2
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é.
Image.new('RGBA', (300, 300), (0, 0, 0, 0))nám spraví transparentné pozadie.forcyklus nakreslí indikátory po piatich minútach.img.saveuloží obrázok, to je jasné, ale dôležité je,…
…ž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é:
execp_command = /home/richard/coding/python/aclock/aclock.pyspustenie skriptu (musí byť+x),execp_interval = 60v nejakom intervale, v sekundách, 60 sekúnd sa zdá logickou voľbou 😁,execp_has_icon = 1a povieme mu („ťinťovi“), že výstup zo skriptu je cesta k obrázku,execp_cache_icon = 0ale obrázok nekešujeme, lebo sa pravidelne mení, inak by bola funkcionalita zásadne znížená,execp_lclick_command = /usr/local/bin/app-selecta ešte keď klikneme na hodiny, spustí sa nám kvázi „štart menu“ s možnosťou vyhľadávania.execp_centered = 1,execp_icon_w = 75,execp_icon_h = 75definujú polohu (centrovanie) a rozmery v oboch smeroch.
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.

Pre pridávanie komentárov sa musíte prihlásiť.