Clight, demone utente per linux scritto in C

Ciao a tutti, sono /u/nierro, di professione programmatore, fin da quando ho cominciato a programmare ho avuto la fissa per il C e per le utility linux, questo un po’ perché amo linux, e si sa, linux = C, e un po’ perché trovo il C di un’eleganza assoluta e adoro quanto poco tenda a celare facendoti sentire davvero padrone della macchina.
Ma arriviamo al dunque.

Insomma, cos’è Clight?
Clight è, riprendendo il titolo, un leggerissimo demone utente il cui scopo è gestire luminosità e gamma dello schermo del vostro laptop.
Sì, siccome sono povero ho un pc senza sensore di luminosità, perciò, stanco di cambiare continuamente il livello di retroilluminazione, ho deciso di scrivermi un software che lo facesse per me.
Come? Catturando frame dalla webcam e calcolandone la luminosità per capire la luminosità ambientale.
L’idea in realtà non è nata dal nulla: anni fa utilizzavo lo splendido calise (http://calise.sourceforge.net/wordpress/) e funzionava davvero bene.
Ho anche più volte spronato il developer (italiano anche lui) a proseguirne lo sviluppo, ma senza grossi risultati.
Calise aveva però un grosso problema, per me almeno: era scritto al 90% in python.
Non che io abbia qualcosa contro al python eh, ma l’idea di un software che lavora così vicino all’hardware, non scritto in C, un po’ mi lasciava perplesso.
Ve lo dico subito, le analogie con calise sono finite qua.

Cosa offre Clight?
Clight non solo provvederà a settare la retroilluminazione dello schermo in base alla luminosità ambientale, ma gestirà anche la gamma del vostro schermo (qualcosa di simile a redshift), rendendo i colori più caldi di notte e più freddi di giorno.
Si appoggia a geoclue2 per scoprire la posizione dell’utente, utile per calcolare alba e tramonto.
Per evitare di sprecare batteria, le catture dalla webcam si susseguono con una temporizzazione che di default è di 10 minuti di giorno e 45 minuti di notte.
Inoltre, a partire da mezz’ora prima dell’alba/tramonto, fino a mezz’ora dopo, le catture si faranno ancora più frequenti (di default ogni 5 minuti), poiché quello è il periodo in cui la luce ambientale varia in maniera più repentina.
Tutti questi timeout sono configurabili; in realtà ci sono tante altre possibilità di configurazione (ad esempio passare una posizione predefinita invece di appoggiarsi a geoclue2, o personalizzare il numero di frame catturati dalla webcam per calcolare la luminosità ambientale, di default 5), e non posso elencarle tutte qua.

Come fa?
Il come è un po’ complesso ovviamente, ma è comunque interessante.
Ho sviluppato, oltre a Clight, una interfaccia Bus, Clightd.
Clightd è un altro software che permette di settare la luminosità dello schermo, di catturare frame dalla webcam e calcolarne la luminosità, e di modificare la gamma dello schermo.
Ho splittato il software in queste due parti perché mi son reso conto che su internet si trovano una miriade di script/programmini per settare la luminosità dello schermo; script spesso scritti male, che vengono fatti girare da root e che agiscono tramite “fscanf/fprintf” su file di sistema.
Con Clightd si possono creare script molto semplici e probabilmente più sicuri, dato anche che mi appoggio a libudev per fare molte cose (usando quindi la sua astrazione su sysfs).
Per intenderci,
busctl call org.clightd.backlight /org/clightd/backlight org.clightd.backlight getbrightness “s” “”
ritornerà il livello di retroilluminazione corrente.
Il vantaggio è lampante: avere l’interfaccia bus permette integrazioni con software di qualsiasi tipo (script bash, programmini python…) e soprattutto non è un’integrazione limitata a Clight!
In un mondo ideale, un’interfaccia simile sarebbe utilizzata dai vari DE.
In questo mondo invece, ognuno si crea la propria…

Proof?
Non posso ovviamente includere screenshots; includo l’output di un avvio normale di clight (a cui passo una posizione fittizia per ragioni di privacy):

./clight --lat 35.9 --lon 7.16
Signal module started.
Dpms module started.
Bus module started.
Trying to start Brightness module as its Bus dependency was loaded...
Trying to start Location module as its Bus dependency was loaded...
Location module started.
Trying to start Gamma module as its Bus dependency was loaded...
New location received: 35.90, 7.16
Trying to start Gamma module as its Location dependency was loaded...
Gamma module started.
4000 gamma temp setted.
Next gamma alarm due to: Mon Apr 24 06:19:00 2017
Trying to start Brightness module as its Gamma dependency was loaded...
Brightness module started.
Average frames brightness: 0.332216.
Old brightness value: 318
New brightness value: 324

Come si nota dall’output, le varie funzionalità di Clight sono suddivise in moduli. Ho creato un sistema di gestione delle dipendenze tra moduli per facilitare lo sviluppo degli stessi. Ad esempio, avendo gamma una dipendenza sul modulo location (il modulo che prende la posizione dell’utente), verrà sempre avviato dopo di esso. Ed in caso di fail del modulo location (ad esempio se geoclue2 non è installato), fallirà insieme a lui.

Come faccio a…?
Prova prima a dare un’occhiata al README (abbastanza esaustivo) sulle pagine github dei due progetti:

https://github.com/FedeDP/Clight
https://github.com/FedeDP/Clightd

Per ogni release taggata su github, verrà rilasciato un pacchetto deb.
Per chi usa (come me) Archlinux, li potete trovare entrambi su AUR.
Se avete idee o bug, vi prego di aprire una issue su github.

Sviluppi futuri
Al momento ho già per la testa alcune idee e miglioramenti.
Innanzitutto, un setup iniziale che chiederà ad esempio di impostare la retroilluminazione preferita per la luminosità ambientale corrente, in modo da poter adattare al meglio per l’utente la luminosità ambientale con i livelli di retroilluminazione.
Poi ho in mente (in realtà in parte anche già in codice) un modulo weather che controlli il meteo nella posizione dell’utente e aumenti/diminuisca la frequenza delle catture da webcam in base ad esso: ad esempio, durante una giornata nuvolosa, la luce può subire variazioni molto rapidamente, quando magari una nuvola copre il sole, perciò avrebbe senso aumentare la frequenza.
Infine, un modulo Upower, che diminuisca la frequenza delle catture quando il laptop è da batteria, e invece la aumenti quando si è collegati alla corrente.
Infine, chissà, magari qualcuno di voi avrà qualche idea interessante e rientrerà anch’essa negli sviluppi futuri.

Spero che Clight possa tornarvi utile e che vi sia piaciuto scoprirlo 🙂

Scritto da: /u/nierro

Link ai Commenti