From ArchWiki
Revision as of 15:35, 24 February 2009 by M3tr0g33k (talk | contribs) (Explanation and links)
Jump to: navigation, search


Using openbox, it is as yet impossible to automatically apply transparency to a window as it opens. This is a way of automatically applying tranparency to an opening xterm using transset-df. It uses a trick of running a script as you start the xterm which then runs another script which calls transset-df. The reason that it is so complicated, is that to run transet-df on the new xterm window as it opens, we need the XWINDOWID value for the window.

The three steps which happen to run transset-df on an opening xterm are:

  • Start xterm
  • Run a script which executes a command, then starts a bash shell
    • (This step is necessary because when you open an xterm with 'xterm -e' the command is executed and then the xterm closes. This is not what we want.)
  • Run a script which finds the XWINDOWID of the current xterm and passes it to transset-df to set the transparency

Making it work

Make a script in (for instance) /usr/local/bin called pre-exec. Make sure you have execute permission for everyone. The script is:

exec /bin/bash

Make a script in (for instance) /usr/local/bin called fader. Make sure you have execute permission for everyone. The script is:

transset-df -i `set | grep WINDOWID | awk 'BEGIN { FS = "=" } ; { print $2 }'` $1 >/dev/null 2>&1

When you want an xterm to open with a transparency level of 80%, call:

xterm -e pre-exec fader 0.8 &

I have put this line in my .config/openbox/menu.xml file so I always get a transparent xterm.

Explanation and links

Tried to find the source links for my working on this and they have gone away. Thanks and qudos to all those whose work I've leeched to get this working!

How this doesn't work

There is some discussion on how to get the correct process id for a launched program. When a shell (in this case gnu bash) is running, it's process id (PID) is found by:

echo $$

The last process put into the background (like xterm&) is found by:

echo $!

So, you think - why all this trouble to get the PID of an xterm? Surely you can simply get the PID by doing:

xterm & ; echo $!

And if you do this at the command line, then this works. You get the PID of the xterm and you can then find the XWINDOWID of the xterm to pass to transset-df. All is well. But who is running xterm when you start it from a menu? The answer is not obvious. If you try to use the $! that is valid in the menu scope, you turn the previous xterm transparent, not the one you just started.

How this works

The pre-exec script does two things:

  • run the commands passed to it in a bash shell
  • start a new bash shell