What would be the most simple way of adding and changing an icon in the Ubuntu (Gnome) Panel? I'm looking for something as simple as shell scripting, but I'm not restricted to that. Will write a program for it if that's a better or simpler approach.
The idea is to create a script/program to monitor some condition (e.g. availability of a mount point, availability of internet connection), and change the state of the icon to reflect the current status.
I found YAD (Yet Another Dialog) to provide the simplest solution. See webupd8's short description. However, integration into Unity appears to be slightly broken at the moment. I mention a work-around below, but if you really care about Unity you should probably look at the other answers.
Note: While I'm led to believe that YAD works in a wide range of environments, I've only tested the instructions below using Lubuntu 15.10 (LXDE desktop) and Ubuntu 14.04 (Unity desktop).
I obtained a working installation with:
sudo apt-add-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
(In fact, I didn't need the first two lines in Lubuntu 15.10, but that may have been a coincidence.)
In LXDE, calling
yad --notification --listen
then brought up a tray icon which I could change by typing (for example): icon:gtk-help
. In Unity, nothing appeared, so I needed the following ...
Work-around for Unity: The following instructions are again taken from webupd8. The problem is that a "system tray" does no longer officially exist in Unity. One possible solution for running programs like YAD that haven't caught up with this change is to install a "system tray emulator":
sudo apt-add-repository ppa:fixnix/indicator-systemtray-unity
sudo apt-get update
sudo apt-get install indicator-systemtray-unity
To obtain icons directly in the Unity panel, I used the following settings:
gsettings set net.launchpad.indicator.systemtray tray-is-static true
gsettings set net.launchpad.indicator.systemtray show-background-static false
Once I'd log out and back in again, yad --notification
worked as expected. (Moreover, the "systemtray" displayed some additional icons that I had previously been searching in vain.) The position of the icons on the panel can be adapted via:
gsettings set net.launchpad.indicator.systemtray static-x 1500
(where 1500 may be replaced by any reasonable value). I do not know how to get the icons to be displayed flush-right. If you ever feel like uninstalling the "system tray emulator" again, webupd8 recommend:
sudo apt-get purge indicator-systemtray-unity
Here's a simplistic demo that might help illustrate how to use YAD in real-world scenarios. I'm assuming YAD itself is already installed as described above. Suppose we would like to watch the output of some program running on the command line and update a tray icon accordingly. For the purposes of this demo, let's just take this "program" to be the following script "dummyprogram.sh":
#! /bin/bash
i=1
while [ $i -ne 3 ]
do
let "i=((i+1)%2)"
echo $i
sleep 1
done
Copying the above lines to a file "dummyprogram.sh", making it executable with "chmod +x dummyprogram.sh" and calling "./dummyprogram.sh" should result in the following output:
0
1
0
1
...
(one line every second). Now for the actual task at hand. To get an "iconified" version of the above output in the tray area, we use the following script "demo.sh":
#! /bin/bash
while read x
do
if [ $x -eq 0 ]
then
echo icon:gtk-home
else
echo icon:gtk-help
fi
done
Again, copy the lines to a file "demo.sh" and make it executable. Calling
./dummyprogram.sh | ./demo.sh | yad --notification --listen
should now lead to the desired result: an icon in the tray area which changes back and forth between two different icons each second.
You can end the demo by typing Ctrl-C in the terminal.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With