DIY Desktop kalendar

Gledam ovaj trodijelni zidni kalendar i mislim kako bi bilo dobro da se marker sam pomiče na današnji datum. Zaboraviš pomaknuti i evo mogućih problema. Pitam se kako bih mogao napraviti baš takav kalendar na desktopu koji se sam pomiče? Nešto kao Cairo clock za koji sam već radio teme prilagođene mojim idejama. Promijeniti temu sata je jednostavno, svaki dio je poseban SVG fajl koji napraviš po želji, aplikacija to složi i imaš custom sat. Problem je što ja ne znam napraviti takvu aplikaciju, pa kako bih onda mogao oživiti kalendar?

Ideja je staviti sliku kalendara u Media Frame, KDE desktop widget, i onda nekako napraviti da se ona mijenja svaki dan. Prvo ću napraviti pozadinu, sliku tekućeg mjeseca. Prilagodio sam pripremu ovog zidnog kalendara da odgovara pixelima, ukupno 2400x1700px, a veličina svih polja s datumima je 2100x1200px. Svako polje datuma je veličine 300x240px. Marker sam ostavio da izgleda kao pravi, plastični i on je nešto veći – 370x280px. Zašto trebam te podatke? Moram znati za koliko se pixela pomiče marker svakog dana. I za kraj mi treba koordinata početnog mjesta markera. To je ono prvo polje datuma, ishodište, nulta pozicija markera – 175px prema desno i 395px prema dolje, mjesto gdje marker okružuje prvo polje. Kasnije ću iz fore, kad već mogu, dodati i križić preko dana koji su prošli. Dobro, što sad kad imam sve to? Treba mi nešto što će mi pomoću naredbe staviti prozirni marker.png na točno mjesto preko ove sadašnje 2026-7.jpg pozadine i prekrižiti prošle datume. Ono što mi treba, to je onaj grozno neugledni ImageMagick.

ImageMagick sam oduvijek prezirao. Pokažite ga bilo kome tko koristi Photoshop i dobit ćete podsmijeh. Stvarno GUI ImageMagicka izgleda jadno, staro, kao neki program prije 25 godina. Ali, njegova prava moć se ne vidi, njegova moć se poziva iz terminala. Samo sam ga jednom ozbiljno koristio, i to nedavno, kad sam htio stranice Alan Forda nekako masovno obraditi. Trebalo je maknuti margine, malo rezati dolje tako da polovica stranice točno dijeli gornji i donji dio, prerezati to na pola, snimiti svaku sličicu stripa posebno i onda drugim programom sve pretvoriti u PDF tako da je svaka sličica svoja stranica u svom PDF-u. Imam i tu skriptu, možda je i objavim. Samo da se vidi koliko je ImageMagick moćan.

Dakle, što sada imam? Imam pozadine kalendara, do kraja ove godine. Imam marker za oznaku današnjeg dana, križić za prekrižiti prošle dane i skriptu koja će to pokrenuti, sve u skrivenom folderu .desktop_kalendar koji se nalazi u mojem home folderu.

Što radi skripta kalendar_update.sh? Nešto je već napomenuto u skripti, ali ukratko, određuje lokaciju i nazive svih potrebnih slika, koordinate prvog polja datuma i veličinu polja za koju se marker pomiče. Dalje, Date saznaje koji je prvi dan u tekućem mjesecu i tamo stavlja marker na prvi. Znači ne prvo polje, nego 1. u mjesecu. Koordinate markera za prvo polje je pod parametrom START. Na kalendar sam dodao i križiće preko proteklih dana, kao prekriženi datumi, a poslije njih marker na danas. Na kraju skripte je poziv da ImageMagick generira kalendar_danas.jpg koji će pokazivati widget na desktopu.

kalendar_update.sh

#!/bin/bash
sleep 10
MAPA="/home/slim/.desktop_kalendar"
POZADINA="$MAPA/2026-$(date +%-m).jpg"
MARKER="$MAPA/marker.png"
CROSS="$MAPA/cross.png"
IZLAZ="$MAPA/kalendar_danas.jpg"
START_X=175
START_Y=395
RAZMAK_X=300
RAZMAK_Y=240
PRVI_DAN_U_TJEDNU=$(date -d "$(date +%Y-%m-01)" +%u)
POMAK=$((PRVI_DAN_U_TJEDNU - 1))
DAN=$(date +%-d)
INDEKS=$(( (DAN - 1) + POMAK ))
# Pripremamo listu argumenata (koristimo niz umjesto stringa)
CMD_ARGS=("$POZADINA")
# Dodajemo križiće za sve dane prije današnjeg
for i in $(seq $POMAK $((INDEKS - 1))); do
    STUPAC=$(( i % 7 ))
    REDAK=$(( i / 7 ))
    X=$(( START_X + (STUPAC * RAZMAK_X) ))
    Y=$(( START_Y + (REDAK * RAZMAK_Y) ))
    CMD_ARGS+=("$CROSS" -geometry +$X+$Y -composite)
done
# Dodajemo marker za danas
STUPAC=$(( INDEKS % 7 ))
REDAK=$(( INDEKS / 7 ))
POS_X=$(( START_X + (STUPAC * RAZMAK_X) ))
POS_Y=$(( START_Y + (REDAK * RAZMAK_Y) ))
# Sve skupa izvršavamo direktno s convert (magick)
magick "${CMD_ARGS[@]}" "$MARKER" -geometry +$POS_X+$POS_Y -composite "$IZLAZ"
# Postavljanje pozadine
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus gsettings set org.gnome.desktop.background picture-uri "file://$IZLAZ"

Skripta generira sliku kalendar_danas.jpg koju widget odmah pokazuje. Ali tu se pojavljuje novi problem. Što sutra? ImageMagick je generirao sliku i to je to. Skriptu za generiranje slike današnjeg kalendara treba staviti u Autostart sistema da se pokreće s loginom. Znači Settings – Autostart – Add New Login Script i dodajem tamo kalendar_update.sh i prilikom logiranja slika kalendara će se promijeniti na današnji datum.

Ali ni to nije dobro do kraja. Ja ustvari skoro nikad ne gasim komp, samo ga stavim na sleep. To znači da se slika neće mijenjati jer se pokreće samo nakon logiranja. Treba mi dodatno rješenje. Treba mi servis koji radi u pozadini i koji će nakon što komp izađe iz sleep moda pokrenuti refresh kalendara.

sudo nano /etc/systemd/system/kalendar-suspend.service

i unutra ovo:

[Unit]
Description=Osvježi desktop kalendar nakon buđenja iz sleep-a
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
Type=oneshot
User=slim
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/slim/.Xauthority
ExecStart=/home/slim/.desktop_kalendar/kalendar_update.sh
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

Još omogućiti i pokrenuti servis:

sudo systemctl daemon-reload
sudo systemctl enable kalendar-suspend.service

To je ono što sam prvotno zamislio. Tekući mjesec običnog uredskog trodjelnog kalendara je živ. Marker se sam pokreće, zna koji je prvi dan u mjesecu i traži novu pozadinu kad dođe novi mjesec, prošli dani se sami križaju, kalendar uvijek pokazuje točan datum nakon logina ili nakon sleepa, a glavna zvijezda ovdje je ImageMagick koji u pozadini generira sliku kako mu skripta kaže.

Dakle, uspio sam. Malo jadno kad uspoređujem s Cairo Clockom, ali radi. Je li potrebno kad imam jedan klik na sat u trayu koji pokaže kalendar? Nije, ali nije to poanta. Poanta je da je Linux zabavan i da može puno više nego što možemo zamisliti.


Leave a comment

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa * (obavezno)