I was looking for a way to display an icon on a xfce desktop panel on some event. One possible solution is to use the xfce4-messenger-plugin. The plugin listens to messages on the D-Bus and displays them in a pop-up window or in the panel. Additionally it can display an icon if the message sent is prefixed with a identifier.
Icons to display are added using Icons tab of the messenger's properties dialog:
In this example I've added an icon to be shown when there is a new mail in my mailbox.
To send messages to the plugin one can use dbus-send command with the following syntax:
dbus-send --dest=org.xfce.Panel.Plugin.Messenger \
/org/xfce/panel/plugin/messenger \
org.xfce.Panel.Plugin.Messenger.Message \
string:"$MESSAGE"
To display an icon D-Bus messages shall be prefixed with a identifier. It wasn't documented anywhere that a colon shall be added
after the identifier to make it work but I've found it in the code.
All messages sent to the plugin are collected in a plugin's queue and are shown sequentially with a configured time out period. This wasn't exactly what I needed because my new mail icon would disappear after defined time out period and there is no possibility to set an infinite one. The solution is to add a cron job that would send a message each minute if there's a new mail whereas plugin's time out period is set to 60 seconds. This ensures that the new mail icon is always shown.
Here is a simple script that is called by cron each minute:
All messages sent to the plugin are collected in a plugin's queue and are shown sequentially with a configured time out period. This wasn't exactly what I needed because my new mail icon would disappear after defined time out period and there is no possibility to set an infinite one. The solution is to add a cron job that would send a message each minute if there's a new mail whereas plugin's time out period is set to 60 seconds. This ensures that the new mail icon is always shown.
Here is a simple script that is called by cron each minute:
flux@xubuntu:~$ cat ./mailnotif.sh
#!/bin/bash
/sbin/ifconfig wlan0 | /bin/grep 192.168.1. &>/dev/null && {
[ "0" != "$(/usr/bin/ssh root@192.168.1.1 'cat /tmp/newMail')" ] && {
dbus_session_file="${HOME}/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0"
. "$dbus_session_file"
export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
/usr/bin/dbus-send --dest=org.xfce.Panel.Plugin.Messenger /org/xfce/panel/plugin/messenger org.xfce.Panel.Plugin.Messenger.Message string:"newmail:"
}
}
My router is configured to check for new mail to show an icon on a DPF display. It saves a number of new mail in a file /tmp/newMail. The script checks first if I'm connected to the router and reads this file using ssh (ssh uses public key authentication and doesn't ask for a password). Additionally some D-Bus specific variables shall be exported from a D-Bus session file. Otherwise dbus-send will not work if started by the cron daemon.
![[Image]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-Cj0ddFdcBfYVOw_hDKn439yl0LGJUFS0YUVaFpNvBdSgkP5bKBkg2vNKYeAXk8qwNEvnb5ucxwN19lS-rBBTzPZMhpL6ygtmso5DN7y6H7tz28Y_wXrxahBOtsAx1ZzoJZ2WxuuU0nM/s1600/xfce-messenger-dialog.png)
2 comments:
Thanks for the great tip. By the way, in the text you mention the use of a semi-colon appended to the identifier, but - as in your code example - it uses a colon (not semi...). Just mentioning it for the benefit of anyone else who gets thrown by that.
thanks for pointing that out. I've corrected the typo.
Post a Comment