2 # adesklets - Shell script frontend for the adesklets interpreter
3 # ------------------------------------------------------------------------------
4 # Copyright (C) 2005 Sylvain Fourmanoit <syfou@users.sourceforge.net>
6 # Permission is hereby granted, free of charge, to any person obtaining a copy
7 # of this software and associated documentation files (the "Software"), to
8 # deal in the Software without restriction, including without limitation the
9 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 # sell copies of the Software, and to permit persons to whom the Software is
11 # furnished to do so, subject to the following conditions:
13 # The above copyright notice and this permission notice shall be included in
14 # all copies of the Software and its documentation and acknowledgment shall be
15 # given in the documentation and software packages that this Software was
18 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 # THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
22 # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 # ------------------------------------------------------------------------------
25 # This is the shell script frontend for the adesklets interpreter, introduced
26 # in adesklets 0.4.11. It serves a couple simple purposes:
28 # - Bring all the fake-root windows detection code out of the binary
29 # interpreter, and detect them from a front-end. It makes it far simpler
30 # and quicker to adapt to new situations, as this code is no longer written
31 # in C, but in a sh-compatible scripting form. Hopefully, in this new format,
32 # people will be able to contribute new detection routines for specific
33 # Window Manager easily.
35 # - Print out a couple of warnings to hopefully prevent some people that
36 # would not read the fourth chapter from the manual from not invoking
39 # - Add a couple of functionalities, such as configuration file cleanup, and
45 # This shell script was made to comply with the POSIX 1003.2 and 1003.2a
46 # specification for the shell, and not use any vendor-specific extension
47 # for any program invoked. It has been tested on both BASH 3.00.16 and NetBSD
48 # ash 1.6.1 on a variety of platforms. It also uses some low-level, fairly
49 # common utilities or builtin, all also described in POSIX, namely:
51 # 1) a Streaming EDitor (sed). It as been tested on GNU sed 4.0.9, and FreeBSD
53 # 2) test, conforming to POSIX 1003.2
59 # The xprop and xwinfinfo programs can also be used, if a given fake-root
60 # window detection routine is explicitely invoked. Both XFree86 and X.org
61 # implementations of these utilities have been tested. Window Manager specific
62 # detection will also potentially need WM specific programs:
64 # kde: need consolde dcop client
66 # ------------------------------------------------------------------------------
67 # Lock/unlock function
68 # Based on the fact that creating a directory is atomic
70 LOCKFILE
=@LOCKFILES_DIR@
/adesklets_frontend_
$UID.lock
74 mkdir
$LOCKFILE > /dev
/null
2> /dev
/null
&& break
80 rmdir $LOCKFILE > /dev
/null
2> /dev
/null
83 # ------------------------------------------------------------------------------
84 # Kill all desklets function
87 LOCK
=`ls @LOCKFILES_DIR@/adesklets_uid$UID_*.lock 2> /dev/null`
88 test "x$LOCK" = "x" ||
{
90 kill $PIDS > /dev
/null
2> /dev
/null
92 kill -9 $PIDS > /dev
/null
2> /dev
/null
96 # ------------------------------------------------------------------------------
97 # Detect potential fake root windows function
100 local GEOM
=`xwininfo -root | sed -n '/geometry/{s/^.*geometry[ \t]*//;p}'`
102 if test $# -eq 0 ; then
108 xwininfo
$ID -tree |
sed -n "/$GEOM/"'{s/^[ \t]*\(0x[0-9a-f]\+\).*/\1/;p}'
111 # ------------------------------------------------------------------------------
112 # Error handling function
115 test $# -gt 0 && echo "Error: $*" && echo
119 # Command line error handling function
122 test $# -gt 0 && echo "Error: $*" && echo
123 if test "x$ADESKLETS_EMBEDDED" = "x" ; then
124 DESC
='Usage: adesklets [OPTION] ... [string_id], where OPTION is in:'
126 DESC
='Possible options are:'
131 Fake root window detection
132 --kde KDE >= 3.4.1 desktop detection
133 --nautilus Nautilus desktop detection
134 --rox ROX-Filer detection (incomplete)
135 --user Interactive detection (by user click)
136 --xfce4 Xfce4 desktop detection (tested on Xfce4 4.2.0)
138 --do-it-once When applicable, do not run the detection for each desklet,
139 but only once for all. Of course, desklets on multiple
140 screens will unlikely detect the right fake root window, but
141 it will speed things up for single screen settings.
143 -h,--help Print out this message and exit
144 -d delay Wait for a given delay (in seconds) before
145 performing any further action
147 if test "x$ADESKLETS_EMBEDDED" = "x" ; then
149 -k,--killall Kill all running, registered desklets
150 -c,--cleanup Remove all dead entries from \$HOME/.adesklets
151 (this implies \`--killall')
152 -f script Execute command set from the \`script' file
154 If no \`string_id' is given, adesklets acts as a launcher (unless
155 the \`-f' switch is involved). Otherwise, adesklets acts as
156 an interpreter, if no \`-k' or \`-c' switch is used.
158 The most usual invokation of adesklets is the bare \`adesklets' command,
159 without arguments: it makes adesklets launch every registered desklets
160 from \$HOME/.adesklets.
166 # ------------------------------------------------------------------------------
169 test -e $HOME/.adesklets
&& {
170 test -f $HOME/.adesklets || \
171 error
"$HOME/.adesklets is not a configuration file; please remove it."
174 # ------------------------------------------------------------------------------
175 # Parse the command line.
181 while test $# -gt 0 ; do
183 --kde|
--nautilus|
--rox|
--user|
--xfce4)
184 MODE
=`echo $1 | sed 's/--//'`
193 test $# -gt 1 || usage
"no delay given after -d switch."
194 sleep $2 > /dev
/null
2> /dev
/null || \
195 usage
"Invalid delay of \`$2' seconds given."
203 # The cleanup routine assumes the file is EXACTLY formatted as
204 # it is output by the binary interpreter.
207 for DESKLET
in `sed -n 's/^\[//;s/]$//;/^\//{=;p}' $HOME/.adesklets`
209 if test "$DESKLET" -gt 0 2> /dev
/null
; then
212 test -x "$DESKLET" || LINE
="$LINE $ID"
215 sed -i "`echo "$LINE" | sed 's/[0-9]\+/&,+1d;/g'`" $HOME/.adesklets
219 test $# -gt 1 || usage
"no file name given after -f switch."
220 test -r $2 || usage
"could not read file \`$2'."
225 usage
"invalid option \`$1'."
228 test "x$OPTS" = "x" || \
229 usage
"invalid combination, \`$OPTS' and \`$1'."
236 # ------------------------------------------------------------------------------
237 # Fake root window detection code
239 test "x$MODE" = "x" || ADESKLETS_MODE
="$MODE"
240 test "x$ADESKLETS_MODE" = "x" ||
{
241 case "$ADESKLETS_MODE" in
243 # Identify the lead desktop window from root property,
244 # then find the last child with the proper dimension
245 # For now on, we take advantage from the "compatibility code"
247 DESKTOP
=`xprop -root | \
248 sed -n '/^NAUTILUS_DESKTOP_WINDOW_ID/{s/.* \(0x[0-9a-f]\+\)/\1/;p}'`
249 for ROOT
in `roots $DESKTOP` ; do : ; done
253 test "x`dcop kdesktop default isIconsEnabled`" = "xtrue" && {
254 # First, we need to sync. the real root pixmap
255 # with the desktop: the fake root window is using a
256 # ParentRelative backgroundPixmap, with the real image
257 # from one of its parent, but the root being empty.
258 # We are very lucky this work... But for how long?
259 test "x$MODE" = "x" ||
{
260 # Just do this at high level
262 dcop kdesktop default setIconsEnabled
$I
265 # Detect the fake root window
266 for ROOT
in `roots` ; do
267 ADESKLETS_ROOT
=`xprop -id $ROOT | \
268 sed -n '/__SWM_VROOT/{s/.*\(0x[0-9a-f]\+\)/\1/;p}'`
269 test "x$ADESKLETS_ROOT" = "x" ||
break
274 # Find first full screen window with a Rox-Filer somewhere in
276 for ROOT
in `roots` ; do
277 test "x`xprop -id $ROOT | sed -n '/ROX-Filer/p'`" = "x" ||
break
282 # In this special mode, the pseudo-root is determined
283 # interactively using xwininfo. Since xwininfo needs to
284 # grab the pointer, just make sure we serialize all calls
287 ADESKLETS_ROOT
=`xwininfo | \
288 sed -n '/Window id/{s/.*Window id: \([^ ]*\) .*/\1/p}'`
292 error
"unknown mode."
295 test "$DO_IT_ONCE" -eq 0 && export ADESKLETS_MODE
296 export ADESKLETS_ROOT
299 # ------------------------------------------------------------------------------
300 # Now, re-invoke the binary
302 export ADESKLETS_FRONTEND
=1