Linux Fu : Widgets faciles | Hackaday

Voici un scénario. Vous avez un microcontrôleur qui lit un certain nombre d’éléments – températures, pressions, peu importe – et vous voulez avoir un écran pour votre bureau Linux qui se trouve sur le panneau et vous montre l’état. Si vous cliquez dessus, vous obtenez un statut étendu et pouvez même émettre certaines commandes. La plupart des ordinateurs de bureau prennent en charge la notion de widgets, mais les développer est une vraie galère, n’est-ce pas ? Et même si vous en développez un pour KDE, qu’en est-il des personnes qui utilisent Gnome ?

Il s’avère qu’il existe une réponse facile et qu’elle a apparemment été inspirée par un outil du monde Mac. Cet outil s’appelait BitBar (maintenant XBar). Ce programme place un widget sur votre barre de menu qui peut afficher tout ce que vous voulez. Vous pouvez écrire n’importe quel type de programme que vous aimez – script shell, C, peu importe. La sortie imprimée à partir du programme contrôle ce qui apparaît sur le widget à l’aide d’un simple langage de type balisage.

C’est bien pour le Mac, mais qu’en est-il de Linux ? Si vous utilisez Gnome, il existe un projet très similaire appelé Argos. Il est largement compatible avec XBar, bien qu’il y ait quelques éléments qui lui sont spécifiques. Si vous utilisez KDE (comme moi), vous aurez besoin de Kargos, qui est plus ou moins un portage d’Argos et ajoute quelques éléments qui lui sont propres.

Bonne nouvelle, mauvaise nouvelle

La bonne nouvelle est qu’en théorie, vous pourriez écrire un script qui fonctionnerait sous les trois systèmes. La mauvaise nouvelle est que chacun a ses propres différences et bizarreries. Évidemment aussi, si vous utilisez un programme conforme cela pourrait poser un problème sur le Mac à moins que vous ne le recompiliez.

Pour aggraver ce problème, la documentation de Kargos semble erronée. C’est en partie parce que la version dans les référentiels KDE est obsolète et même si vous récupérez la dernière version de GitHub, elle est toujours obsolète avec la documentation. Vous voulez vraiment installer à partir d’un clone du GitHub, pas à partir du package de version ou à partir du référentiel KDE pour plasmoid. Une partie du problème est également que la documentation est laconique et que vous avez parfois des choses qui fonctionnent, mais pas dans tous les cas. Il n’est pas clair s’il s’agit d’une conception ou d’une interaction avec le bureau KDE qui change constamment.

Puisque j’utilise KDE, je vais me concentrer sur Kargos, et je soulignerai quelques points sur Argos au fur et à mesure. Mais vous pouvez vous attendre à faire des expériences de toute façon.

Bases

Lorsque vous installez le widget, vous devez le pointer vers un script. En général, le script s’exécutera périodiquement. Pour Kargos, vous pouvez définir cet intervalle de deux manières différentes dont nous parlerons plus tard.

Dans le cas le plus simple, le script produirait une ligne de texte qui apparaîtra sur le panneau, un séparateur, puis une ou plusieurs lignes de texte qui apparaîtront lorsque vous cliquerez sur le widget. Considère ceci:

#!/bin/bash
echo Hello Hackaday
echo ---
echo Test
echo 1
echo 2
echo 3
echo 4

Si vous placez le widget Kargos sur un panneau et que vous le configurez pour lire votre script, vous vous retrouverez avec uniquement le texte Hello Hackaday sur votre panneau. Lorsque vous cliquez, vous voyez quelque chose comme ceci :

Excitation

Un peu plus chic

En l’état, ce n’est pas très excitant. Cependant, chaque ligne de texte peut avoir un caractère pipe et certains attributs pour embellir les choses et ajouter une fonction. Remplacez la ligne qui dit Hello Hackaday par ceci :

ICON=$( curl -s "https://hackaday.com/favicon.ico | base64 -w 0 )
echo "Hello Hackaday | image="$ICON" href=http://www.hackaday.com"

Maintenant, le panneau sera un peu plus élégant et si vous cliquez sur la petite icône de maillon de chaîne, vous visiterez votre site Web préféré. Bien sûr, la vraie chose intéressante, c’est quand vous pouvez faire changer des objets. Si vous définissez un intervalle d’actualisation sur l’écran de configuration, le script s’exécutera souvent. Vous pouvez également nommer le script avec un intervalle de répétition. Par exemple, un script de haddemo.10s.sh s’exécutera toutes les 10 secondes mais haddemo.2m.sh fonctionnera toutes les deux minutes.

Vous pouvez également ajouter arefresh=true attribut à une ligne de texte pour que cliquer dessus exécute à nouveau le script. Supposons que vous souhaitiez envoyer un ping à Google à la demande. Vous pouvez régler la minuterie sur 0 et faire ceci :

#!/bin/bash
OUTPUT=$( ping -c 1 -q google.com | grep ^rtt | cut -d ' ' -f 4 | cut -d '/' -f 1 )
if [ -z "$OUTPUT" ]
then
   echo "Error click to refresh | refresh=true color=orange" bash="'/usr/bin/systemsettings kcm_networkmanagement'" terminal=false
fi
# get an integer to compare (bash doesn't like floats)
IOUT=$( echo $OUTPUT | sed s/\.// )
COLOR=green
if [ $IOUT -gt 90000 ] # 900000 is 90 ms
then
   COLOR=red
fi 
echo "Google.com: $OUTPUT ms | refresh=true color=$COLOR" bash="'/usr/bin/systemsettings kcm_networkmanagement'" terminal=false
echo ---

Maintenant, vous obtiendrez un temps de ping de Google sur votre barre. Il changera de couleur s’il est lent ou incapable de cingler. Un petit bouton vous permettra d’ouvrir la gestion du réseau.

Cependant…

Les couleurs ne semblent pas fonctionner dans les menus déroulants, ce qui peut être le gestionnaire de bureau forçant les couleurs de thème, de sorte que votre kilométrage peut varier. Il y a aussi quelques différences par rapport à Argos. Par exemple, Argos a une variable d’environnement qui vous indique si le widget est ouvert ou non. Cela vous permet de ne pas exécuter de parties inutiles de votre script pour de meilleures performances.

Il existe également d’autres différences, mais si vous vous en tenez aux principes de base, tout devrait bien se passer. Même là où les choses sont différentes, c’est toujours plus facile que d’écrire deux widgets complètement différents pour les différents systèmes.

Il semble également y avoir un comportement étrange. Par exemple, l’attribut onclick ne fonctionne pas non plus dans les éléments déroulants. Bien sûr, c’est open source, donc si vous le détestez à ce point, n’hésitez pas à aller le réparer !

Grand exemple

Comme j’aime suivre les gros titres sur Hackday, j’ai décidé de profiter d’une fonctionnalité de Kargos. Dans les exemples précédents, je n’avais qu’une seule ligne avant le séparateur déroulant (« — »). Mais si vous avez plus d’une ligne, le widget les parcourira avec un délai que vous pouvez définir dans les paramètres du widget.

Utilisant awk il est facile de lire le flux RSS Hackaday et d’extraire des titres et des liens. Quelques images et vous vous retrouvez avec un joli affichage RSS. L’analyse peut ne pas fonctionner pour un flux RSS arbitraire car il est assez simple d’esprit, mais – en théorie – vous devriez pouvoir l’adapter à d’autres flux.

Voici le code :

</pre>
#!/bin/bash
curl "https://hackaday.com/feed/" 2>/dev/null |
  awk '
   BEGIN { n=-1; }  # skip first item
/<title>/ {
# read titles
    if (n==-1) next;
    gsub("[[:space:]]*</?title>[[:space:]]*",""); item[n]=$0; next;
   }
/<link>/ {
# read links
   if (n==-1) { n=0; next; }
   gsub("[[:space:]]*</?link>[[:space:]]*", ""); link[n++]=$0; next
   }
END {
# output widget text
   for (i=0;i<n;i++) {
   printf("%s | href="%s" imageURL=https://hackaday.com/wp-content/themes/hackaday-2/img/logo.pngn",item[i],link[i]);
   }

print "---"
# output dropdown lines
for (i=0;i<n;i++) {
   printf("%s | href="%s"n",item[i],link[i]);
   }
}
'
<pre>

Ce n’est pas beaucoup de code pour un lecteur RSS complet. Vous pouvez voir les histoires dans le panneau et cliquer dessus ou ouvrir le widget pour voir une liste en même temps.

Prochaines étapes

Étant donné que les données ne sont que du texte, il est simple de créer de petits widgets à l’aide de ce système. Par exemple, voici un widget d’état de la mémoire assez pratique :

#!/bin/bash
cat /proc/meminfo
echo ---
echo "<b>Tools</b>"
echo "--System status | bash=/usr/bin/ksysguard onclick=bash"
echo "--Htop | bash=/usr/bin/htop" terminal=true
cat /proc/meminfo

Évidemment, avoir un script qui lit les données d’un ESP32 ou d’un Arduino serait trivial. Étant donné que beaucoup de ce que vous voulez faire avec quelque chose comme ça est indépendant du système d’exploitation, parcourir certains des plugins pour xbar peut vous donner une idée.

Si vous voulez quelque chose de plus sophistiqué pour KDE, jetez un œil à Scriptinator. Vous pouvez le personnaliser davantage, mais il est un peu plus complexe à gérer.

Pour une raison quelconque, je suis obsédé par le flux Hackaday. Je l’ai transformé en système de fichiers. Il me salue également lorsque je me connecte. Certains des plugins que vous trouverez sont en bash et d’autres en Python. N’oubliez pas que vous pouvez aussi les mélanger.