Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a changing icon to Ubuntu Panel

Tags:

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.

like image 938
Ilari Kajaste Avatar asked Nov 18 '09 15:11

Ilari Kajaste


1 Answers

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).

Installation

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

Demo

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.

like image 88
Communicative Algebra Avatar answered Oct 11 '22 11:10

Communicative Algebra