Alternative root-tail on your desktop
[ Thursday, 24 April 2008, michalrz ]
Sometimes, while working with a computer one may find it useful to view the content of a certain file, like a system log, or a report of a longer process. Sometimes, however, one might wish to be spared the constant switching to the console and typing cat; it would be best if the content of a necessary file could be integrated into the desktop.
A solution to this problem came a couple of years ago with the application root-tail. With an exemplary command:
root-tail -g 620x200+0+520 -wordwrap -color grey \
/var/log/daemon.log &
the application checked the content of the particular file in real time and printed its final lines in the specified area of X “root-window”, available independently of the running window manager. For KDE it might be necessary to turn on “Allow programs in desktop window” in the tab Desktop>Behavior in KDE’s control center.
Unfortunately, in some cases (depending on X and KDE versions) root-tail may run incorrectly: the text may disappear once in a while and reappear only after refreshing the desktop (e.g. after moving a window). Moving desktop icons in KDE may also interfere with root-tail.
It is a good excuse to get a grip on the DCOP interface in KDE and other popular free tools and create a simple script, which could go further than root-tail and set a new wallpaper at regular time intervals. This wallpaper would contain the desired text as an image. Let’s see what it takes to accomplish the above task.
DCOP
DCOP stands for Desktop Communication Protocol — a protocol allowing communication between processes and program components. It allows one to control various applications as if with a remote control, running procedures predefined by the programmers. Running bare dcop in the console will list programs with defined DCOP interfaces. We’ll use this trick to get the path to the currently set wallpaper and to set the image with text superimposed as the new wallpaper.
Imagemagick package
This set of programs for manipulating images will be necessary to superimpose the content of a text file on the image wallpaper. The result of our work may be placed somewhere in the /tmp directory. The use of the components of this package — convert and mogrify — has already been described in one of the previous issues of Dragonia Magazine. So it’s enough to remind you that superimposing text on an image can be accomplished by running:
convert -font helvetica -pointsize 15 -draw "text 10, 10 'Any text'" photo.jpg photo-2.jpg
The text to be superimposed we will obtain by running tail, which will return the last N lines of a file passed as an argument. We will also need…
Some bash tricks
… in particular, obtaining the font size of the taskbar (to use it for the desired text) with grep and cut. In this particular example this will be:
FONT_SIZE='grep -i taskbarfont ~/.kderc | cut -d ',' -f 2'
Generally, the script shown here will do the following:
- Setting variables — position of the displayed text, font size, filename of the current wallpaper…
- Infinite while loop, executing the following:
- running
converton the current wallpaper, drawing the output of:
tail -n 20 $FILE
Convert might not like obtaining too many lines, in which case we should decrease the value of “n”. - Setting the newly created file as a wallpaper.
- Waiting a fixed amount of time before refreshing.
…and a simple script
Below is an example script, displaying on the wallpaper the last 20 lines of kernel.log every 30 seconds:
#!/bin/bash
# how many pixels to leave from the left and from the top,
# before we start to write
OFSET_X=100
OFSET_Y=300
# here select the file to be observed
FILE=/var/log/kernel.log
# obtaining font size,
# here you can put a fixed value, like 14
FONT_SIZE='grep -i taskbarfont ~/.kderc | cut -d ',' -f 2'
#running dcop to get the path of the current wallpaper
WALLPAPER='dcop kdesktop KBackgroundIface currentWallpaper 1'
# infinite while loop (we terminate it by killing the process)
while [ 1~]; do
# wallpaper conversion -- adding on top the
# last 20 lines of the observed file
convert -font helvetica -pointsize $FONT_SIZE \
-draw "text $OFSET_X,$OFSET_Y ''tail -n 20 $FILE''" \
$WALLPAPER /tmp/wallpaper.png
# we must copy the newly created wallpaper to another file
# to avoid trouble while switching virtual desktops
# during the conversion (to prevent KDE from setting
# the improper file as wallpaper)
cp /tmp/wallpaper.png /tmp/wallpaper2.png
# setting the prepared image as wallpaper
dcop kdesktop KBackgroundIface setWallpaper "/tmp/wallpaper2.png" 1
# wait 30 seconds
sleep 30
done
Before running the program again it’s good to set the “clean” wallpaper, or else the script will display the text on an already modified image.
It should be mentioned that it’s not the most CPU-efficient solution. Frequent launching of convert consumes much CPU time (on the author’s system each call took about 6 seconds) and may not be the best solution for machines already loaded with work or equipped with an aging CPU (testing on a 2.4 GHz Athlon 64 went smooth).
In case we don’t want our machine involved too much in drawing the wallpaper, we might try to run the script with a lower priority:
nice script.sh 10
The script with execution bit set may be placed, for instance, in the autostart directory of KDE (/home/user/.kde/Autostart).
![]()
Figure 1. Our solution in action, viewing events from kernel.log
Resources
http://www.goof.com/pcg/marc/root-tail.html- home page of one of the “true” root-tail versions.
1 Comment
- A hyperlink: <a href="polishlinux.org">GNU/Linux for everyone!</a>,
- Strong text: <strong>Strong text</strong>,
- Italic text: <em>italic text</em>,
- Strike: <strike>
strike</strike>, - Code: <code>
printf("hello world");</code>, - Block quote: <blockquote>Block quote</blockquote>















You might also give “inotail” (tail version using Linux inotify ability to detect changes on files) together with “xosd”, which does the same as root-tail.