Hints and tips

Please add your own hints and tips here!

Desktop environment

How I use ROX

Watching how other people use programs often shows you tips and tricks you didn't know. ROX-Filer has lots of features; some are extremely useful while some I almost never use. Here are my favourite features and settings...

Window management

A good way to find out what the most important settings are is to try using a new system for a bit. Anything you change in the first few minutes is probably important to you!

No matter what system I'm using, the first thing I have to do is turn off click-to-raise (where clicking anywhere inside a window brings it in front of other windows). Without this, it's almost impossible to use multiple programs together. I'd wondered whether people who do use click-to-raise have developed their own way to use the system efficiently with it, but watching over the shoulders of experienced and computer-savvy Windows users, I've come to the conclusion that it's always awkward, no matter how good you are.

Actually, I thought drag-and-drop couldn't be done with overlapping windows on Windows until I watched experienced users. Here's how they drag a link from a web browser to another window:

  1. Start dragging on the link (this causes the web browser to jump to the front of the stack, covering the target window).
  2. Drag to the bottom of the screen and wait for the Start bar to pop up.
  3. Drag over the button for the window that just got covered up.
  4. Wait (still holding down the mouse button) and after a bit the window will re-appear.
  5. Move to the target location in the window and let go.

Ouch. It's not just drag-and-drop that suffers with click-to-raise. Try using a standalone calculator application with a word processor. As soon as you try to paste a result into the document, the calculator disappears! This is why OroboROX (at least, the version in Zero Install) defaults to no click-to-raise. It's also why Metacity is so low on ROX-Session's list of window managers - it provides no way to turn this off.

Tip for Windows users: TX-Mouse will sort you out.

I also use sloppy focus, but I didn't make that the default because I think that's just a personal preference, whereas click-to-raise affects the whole desktop experience (and, if you're a prorgammer, even the way you design applications). Programs designed in click-to-raise environments have to have everything built in, because using multiple applications is too painful. Programs designed in non-click-to-raise environments tend to be smaller and make use of interaction with other programs.

Although clicking inside a window doesn't bring it to the front in OroboROX, clicking or dragging the titlebar with the left mouse button does. To move a window without changing the stacking order, drag with the right mouse button (button-3). This also works in XFWM4, which is very similar to OroboROX (so similar, in fact, that I use OroboROX at home and XFWM4 at work without getting confused).

I generally use six workspaces, with Pager on my panel, giving me plenty of room. I used to have problems nagivating (having to remember which one I was on), but I've found the solution. I use the Windows key + the six letter keys in the top-left of the keyboard (QWE / ASD) to switch to the six desktops, so that the layout on the keyboard is the same as the layout in the pager and I avoid the need to remember where I am!

Pager on my panel

ROX-Filer

For me, ROX-Filer isn't an application that I start, use and quit; it's part of the desktop environment that I invoke without thinking about it. I know I use it all the time because sometimes I break it during development and I think "I'll do something else and fix it later". Typically, within five seconds or so of having this thought I've automatically tried to run ROX-Filer in order to get to the "something else"! Then I think "I must fix it now!", and automatically try to run it again to get to the source code to fix it ;-)

I use ROX-Filer to manage the desktop background and one panel. ROX-Filer starts pretty quickly anyway, but this way it's always loaded, which allows it to keep directories cached and open its windows even faster!

One of the most common operations is opening my home directory from any program. For this, I set up a global short-cut (Ctrl-Tab for some reason), which you can do by dragging your home directory to either the pinboard or the panel, right-clicking, and choosing Edit Item. Short-cuts set this way will work even if some other application has the input focus.

Whatever I want to do, I first use ROX-Filer to navigate to the directory I want to use (usually starting with Ctrl-Tab to open my home). I move around with the keyboard: just press / (forward slash) and start typing. The cursor highlights the first match, and Tab-completion works as any shell user expects. You can use the Up and Down arrows to move between matches, and Return opens the file or directory under the cursor. To enter a hidden directory, just type the initial . (period) and ROX-Filer will display all hidden items.

Pressing Backspace moves to the parent directory when you delete the last slash. This also removes the leaf name, so each further press of Backspace moves you up one directory, even when the path entry minibuffer is open (this was originally a bug, but I liked it so much it's now a feature ;-).

Often, I don't want to keep the filer window open while I'm editing a file, so I click with the middle mouse button to open the file and close the filer window at the same time. I set default run actions for each file type using the menu (Set Run Action...), but I'll want to load almost every kind of file into my text editor (Vim!) eventually: click with Shift held down to do that.

The other program I use all the time is good old xterm (yes, I'm a command-line lover!). I prefer xterm to gnome-terminal because it's faster and because you can adjust the selection using button-3, which is very useful. Press ` (backtick) to open a terminal with the current directory set to the directory ROX-Filer is showing. Again, I often want to close the filer window at the same time, and Shift+` does this (this isn't set by default, but it's on the Window menu and setting menu short-cuts is easy).

The key to effective use of ROX-Filer is being able to open filer windows quickly. We've seen how to close a filer window while starting Vim or xterm... how do we get back to the filer window?

From xterm you can always just type rox of course, but four key-presses it way too slow! Besides, it's annoying if you're in the middle of typing a long command (even with zsh's excellent Esc-Q short-cut). So, I bind it to F12 and then I can open a ROX-Filer window onto whichever directory I'm in with a single key.

For Vim, I use the same F12 short-cut to open the window containing the file being edited. My .vimrc line uses the filer's --show option to make the file itself wink a couple of times in the new window so you can see where you came from, just like when going to the parent directory from another directory.

If you can't get back to a filer window from the application, you can always open your home directory (Ctrl-Tab!) and use the bookmarks button on the toolbar - the directory you want is probably in the handy Recently Visited submenu.

The primary selection

If you've used X for a while, you'll have discovered the middle-button-paste feature. This pastes the currently-selected text (not the clipboard!) to wherever you click. In particular, if you select some files in ROX-Filer then middle clicking into any application will paste the filenames. That includes:

  • Paste into Firefox's address bar (or even just into the main window) to view that file.
  • Paste into an xterm to add a filename to a command.
  • Paste into a file Open dialog box for applications that don't support drag-and-drop.

If you select something else in another window, ROX-Filer loses the primary selection (it shows the selection greyed out). To get it back, just click on any item in the greyed-out selection.

Tip: to select files quickly by glob, use . (period). For example, typing .png will instantly select all files ending in .png. With a bit of editing of the pattern with the cursor keys, you can select on other parts of the name (e.g., all files starting with test-).

Tab and Shift-Tab move forwards and backwards through the selected items. You can also select based on more complex rules by pressing ? and entering an expression (e.g., size > 10 Mb). Click on the help icon that appears next to the entry box for some hints about that, or (gasp!) read the manual.

Conclusion

Turning off click-to-raise makes it easy to use programs together, and this is how ROX is designed to be used. You should make sure you can switch effortlessly between ROX-Filer and your most-used applications (xterm and Vim in my case). ROX provides a good interface for use in scripts (including a more comprehensive set of SOAP calls - see the manual).

Of course, I use many more programs than discussed here. Archive is something I use a lot too (and it's well worth adding it to your SendTo menu for directories), and I use several panel applets like NetStat, Load and Clock... but this article is too long already. Check out the Hints and Tips section of the web-site for more!

Adding a "show desktop" button

OroboROX lets you define a keyboard short-cut for this.

For other window managers, or if you want a clickable button, Andras Mohari suggests this script:

#!/bin/sh
if wmctrl -m | grep -q '"showing the desktop" mode: ON'; then
	exec wmctrl -k off
else
	exec wmctrl -k on
fi

This requires the wmctrl program and was tested using xfwm4 (should work with any other EWMH-compatible window manager that implements the 'show desktop' feature, at least in theory).

Save the script and set its permissions to make it executable (File -> Permissions). You can now drag it to your panel and click on it to show the desktop. You can also bind a keyboard short-cut to it using the panel's Edit Item menu item.

Choosing a window manager

This assumes that you are running ROX-Session.

There are three different methods you can use:

  1. Click on the window manager you want in a ROX-Filer window. For example, you could click on OroboROX to switch to that.
  2. If you don't have a wrapper for your window manager (and you don't want to make one),
    just quit your current window manager and ROX-Session will ask you to type in the name of a window manager to use. If your window manager doesn't have a quit feature, you can kill it using System or a similar process monitor.
  3. This command can be used (either directly, or in a wrapper) to send a message to ROX-Session telling it to change window manager. Replace xfwm4 with the desired window manager (which can also be a full pathname):
    dbus-send --print-reply --type=method_call --dest=net.sf.rox.Session \
      /Settings net.sf.rox.Session.Settings.SetString string:ROX/WindowManager string:xfwm4

Enabling border panels

Side panels can be managed by ROX-Filer, but by default they are not turned on. They allow you to create short-cuts to files, directories and applications. Panels work much like the pinboard (the desktop background), except that they come to the front when the mouse hits the edge of the screen and the layout is more rigid. You can also run small programs called applets inside a panel.

To add a border panel:

$ rox -b Default

Here, Default is the name of the panel to use. You can use different names to switch between different setups.

Note that ROX-Session will automatically turn on the pinboard and one panel when you log in, by running the command rox -S from the RunROX script. The -S flag makes it use the configuration set in ROX-Filer's Options box, under Desktop.

See also the Customization page in the guide-book.

A border panel with some applets

To hide a panel, give the side of the screen on which it is currently displayed but without naming a panel to put there:

$ rox --bottom=

Transparency

To get the semi-transparent panel shown in the screenshot, I used the new XComposite extension provided by the x.org X server. To use it, you need to turn the extension on in /etc/X11/xorg.conf:

Section "Extensions"
	Option  "Composite"     "Enable"
EndSection

You also need to be running xcompmgr. Use the transset command to adjust the opacity of windows.
You can give an argument to set the level, from fully transparent to fully opaque.

Note: this is all experimental (and rather slow!), but it makes for more interesting screenshots!

Putting icons on the desktop background

The desktop background is called the pinboard. To enable turn it on and enable desktop-icons, use this command:

$ rox --pinboard Default

You can now drag files, directories and applications onto the pinboard to create short-cuts to them.

You cannot actually save things to the pinboard; you can only create links to things that exist in directories elsewhere.

If you use ROX-Session, then a pinboard will be set up for you on login automatically.

Drag and drop hints

Saving using drag-and-drop

Each application's savebox contains an icon representing the file to save. You can drag this icon to a ROX-Filer window, a directory on a pinboard or panel, or to another application. For example, if you want to save a compressed text file, drag from Edit's savebox onto Archive, and then drag the compressed data to a filer window to actually save it.

http://rox.sourceforge.net/screens/saving.png

Download Handler

With ROX-Filer, you can select which program you want to use to download resources (images, software, data, etc). This is used when you drag a link from a web browser into a filer window, for example.

To change the download handler program, open the "Options"-dialog of ROX-Filer and select the "Drag and Drop"-tab.

Hint: if you want downloads over SSL (https) to work, you should try curl instead of wget; it is generally a better choice

ROX applications designed to be used as Download Handlers include:

  • ROXget
  • Fetch
  • DownloadManager is a companion program for newer versions of Fetch. It co-ordinates multiple instances of Fetch via DBUS to limit the number of downloads using your net connection at once.

Drag-and-drop saving with Vim

You need something like this in your ~/.vimrc file:

function! Save()
  let tmpname = tempname()
  let fname = expand('%')
  if fname == ''
    let fname = 'TextFile'
  endif
  silent exec 'write !savebox ' . fname . ' > ' . tmpname
  let newname = system('cat ' . tmpname)
  let tmp = system('rm ' . tmpname)
  if tmpname != ''
    exec 'file ' . escape(newname, ' ')
    set nomodified
  endif
endfunction
 
command! Save call Save()
map <F3> :Save<CR>

You'll need the savebox command from httphttp://rox.sourceforge.net/snapshots/gui_utils.tgz.
Extract the archive and run './configure && make install' as root to install savebox.
Once you have the script saved to .vimrc or .gvimrc, you can then hit F3 to
get a savebox from which you may then drag and drop to a ROX-Filer window;
updating the text within this box will change the name under which it is saved.

Keeping save boxes above other windows

Drag and drop saving is great, but can I keep the save box above all other windows while I'm using the filer?

All saveboxes (including the Copy/Rename/Link saveboxes in the filer) are
marked with the 'Savebox' class so your window manager can recognise them.
For example, sawfish users should choose 'Customise->Matched Windows' and
add a new rule. The matcher should be 'Class' and you can use Grab to copy
the value by clicking on any savebox. Set 'Depth' to a high number to keep it
above other windows.
Users of OroboROX, which on its own doesn't have an interface for this, may find httpDevil's Pie to be useful. You'll need to manually create the /.devilspie.xml file and the add something like (I hope):

 <flurb name="Savebox on top">
  <matchers>
   <matcher name="DevilsPieMatcherWindowName">
    <property name="class_name" value="Savebox" />
   </matcher>
 </matchers>
 
  <actions>
   <action name="DevilsPieActionLayer">
    <property name="above" value="TRUE"/>
   </action>
  </actions>
 </flurb>

HAL and ROX (auto-detecting USB sticks, etc)

HAL and ROX

With httpHAL and httpIvman and httppmount,
you can have devices like CD-ROMs and USB flash sticks be automatically mounted and added to your panel. When you unmount it the mountpoint will be removed from your panel.

Setup

The following was tried with Udev 070, HAL 0.5.4, DBus 0.50, Ivman 0.6.4, and pmount 0.9.3.
We are going to set things up so that Ivman is run as root and handles the automounting under /media , with the help of pmount.
Then users can run their own instances of Ivman too, to handle desktop specific stuff (like adding devices to the panel).

dbus-daemon --system
hald --daemon=yes --retain-privileges
ivman

NOTE: If all this works, don't forget to check that dbus, hald and ivman is started as above in your bootscripts...

#!/bin/sh
exec 1>&2
echo -n "Launching volume manager... "
if ps -C ivman -o user | grep -q $USER
then
  echo "Already running."
  exit
else
  echo "OK"
  exec ivman
fi
<!--
    <ivm:Match name="ivm.mountable" value="true">
        <ivm:Option name="mount" value="true" />
    </ivm:Match>

-->

Ivman rules to add devices to your panel

--- hal-0.5.4/hald/linux2/blockdev.c    2005-08-10 06:05:58.000000000 -0300
+++ hal-0.5.4-lijon/hald/linux2/blockdev.c      2005-10-21 19:15:28.000000000 -0200
@@ -202,7 +202,7 @@

        device_property_atomic_update_begin ();
        hal_device_property_set_bool (d, "volume.is_mounted", FALSE);
-       hal_device_property_set_string (d, "volume.mount_point", "");
+//     hal_device_property_set_string (d, "volume.mount_point", "");
        device_property_atomic_update_end ();

        HAL_INFO (("Clearing mount point for %s", device_file));
#!/bin/sh
### Change "Top" below to the panel you want your devices on...
rox --RPC << EOF
<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body xmlns="http://rox.sourceforge.net/SOAP/ROX-Filer">
  <Panel$1>
   <Side>Top</Side>

   <Path>$2</Path>
  </Panel$1>
 </env:Body>
</env:Envelope>
EOF
    <ivm:Match name="ivm.mountable" value="true">
        <ivm:Property name="hal.volume.is_mounted">
          <ivm:Action value="true" exec='rox.panelput Add "$hal.volume.mount_point$"' />
          <ivm:Action value="false" exec='rox.panelput Remove "$hal.volume.mount_point$"' />
        </ivm:Property>
    </ivm:Match>

A nice ~/bin/eject script:

This lets you unmount your media and also FUSE mountpoints with the Eject entry on the ROX-Filer file menu.
Don't forget to make the script executable.

#!/bin/sh
pumount "$1" 2>/dev/null || fusermount -u "$1" 2>/dev/null ||
echo "Could not unmount with pumount or fusermount -u" >&2

More patches

Spaces in mountpoint names

Ivman 0.9.3 has the problem that mountpoints are not enclosed by quotes when passed as arg to pmount. So if a inserted media has spaces in the desired mount point, pmount will fail! look in ivmans src/manager.c:619 and put \" around the $hal.volume.desired_mount_point$ thing...

Better mountpoint names

At least for me, my CD-ROM's got mounted as /media/hde and stuff like that, this patch to /usr/share/hal/fdi/policy/10osvendor/10-storage-policy.fdi fixed it so that media is mounted with the volume label as mountpoint:

--- /System/Links/Shared/hal/fdi/policy/10osvendor/10-storage-policy.fdi        2005-10-21 19:18:07.000000000 -0200
+++ /System/Settings/hal/fdi/policy/10-storage-policy.fdi       2005-10-22 13:12:44.000000000 -0200
@@ -96,8 +96,7 @@
     <match key="block.is_volume" bool="true">
       <match key="volume.fsusage" string="filesystem">
        <!-- skip for drives with the no partitions hint (they are handled above) -->
-       <match key="@block.storage_device:storage.no_partitions_hint" bool="false">
-
+<!--   <match key="@block.storage_device:storage.no_partitions_hint" bool="false"> -->

          <merge key="volume.policy.should_mount" type="bool">true</merge>
          <merge key="volume.policy.mount_filesystem" type="copy_property">volume.fstype</merge>

@@ -173,7 +172,7 @@
              <merge key="volume.policy.should_mount" type="bool">true</merge>
            </match>

          </match>
-       </match>
+<!--   </match> -->
       </match>
     </match>

Good luck!

Making different types of media get different icons

<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->

<deviceinfo version="0.2">
  <device>
    <match key="@block.storage_device:storage.bus" string="usb">
      <match key="info.category" string="volume">
        <merge key="volume.is_usb_storage" type="bool">true</merge>
      </match>

    </match>
  </device>
</deviceinfo>
  • Change your ~/.ivman/IvmConfigProperties.xml rule to this:
   <ivm:Match name="ivm.mountable" value="true">

        <ivm:Property name="hal.volume.is_mounted">
          <ivm:Action value="true" exec='rox.seticon Set "$hal.volume.mount_point$" $HOME/.ivman/other.png' />
          <ivm:Action value="false" exec='rox.seticon Unset "$hal.volume.mount_point$"' />
        </ivm:Property>

        <ivm:Match name="hal.volume.is_usb_storage" value="true">
        <ivm:Property name="hal.volume.is_mounted">

                <ivm:Action value="true" exec='rox.seticon Set "$hal.volume.mount_point$" $HOME/.ivman/usb.png' />
                <ivm:Action value="false" exec='rox.seticon Unset "$hal.volume.mount_point$"' />
        </ivm:Property>
        </ivm:Match>

        <ivm:Match name="hal.volume.is_disc" value="true">
        <ivm:Property name="hal.volume.is_mounted">

                <ivm:Action value="true" exec='rox.seticon Set "$hal.volume.mount_point$" $HOME/.ivman/cdr.png' />
                <ivm:Action value="false" exec='rox.seticon Unset "$hal.volume.mount_point$"' />
        </ivm:Property>
        </ivm:Match>

        <ivm:Property name="hal.volume.is_mounted">
          <ivm:Action value="true" exec='rox.panelput Add "$hal.volume.mount_point$"' />

          <ivm:Action value="false" exec='rox.panelput Remove "$hal.volume.mount_point$"' />
        </ivm:Property>
    </ivm:Match>
  • Create this script in ~/bin/rox.seticon and make it executable:
rox --RPC << EOF

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body xmlns="http://rox.sourceforge.net/SOAP/ROX-Filer">
  <$1Icon>
   <Path>$2</Path>
   <Icon>$3</Icon>

  </$1Icon>
 </env:Body>
</env:Envelope>
EOF
  • And put some icons for other.png, cdr.png and usb.png in ~/.ivman/ and you're done!

How do I...

Keyboard shortcuts inside applications

How do I set up keyboard short-cuts?

To set up global shortcuts (which work whatever you're doing) you need to have a ROX-Filer pinboard or panel active ROX-Session can set these up for you). Any item on a pinboard or panel can have a keyboard shortcut set for it by choosing 'Edit Item' from the popup menu.

You can also set keyboard shortcuts for use in filer windows (and some other applications) like this:

  • Open the menu.
  • Point at a menu item, but don't click on it.
  • Press the key.
  • Close the menu.

Keys are automatically saved when the filer quits.

The GTK developers have decided to disable this feature by default. To turn it on:

  • If you are running ROX-Session it will be on by default. It can use controlled using the Keyboard configuration applet.
  • If you are running GNOME, use gconf-editor to turn on the /desktop/gnome/interface/can_change_accels option.
  • If you are using some other XSettings manager, you will have to find how it lets you configure this (anyone know how to do this with xfce-settings-show?)
  • If you are not running an XSettings manager, you can instead add this line to your ~/.gtkrc-2.0 file:
    gtk-can-change-accels = 1

I use SuSE 9 and it still doesn't work!

You also need to create an empty file called ~/.no-qtrc-to-gtkrc-mapping, then log out and log back in again.

Stop the green error messages from appearing

I tried a KDE application and the screen filled with debug messages!

For some unknown reason, KDE defaults to debug-level logging. To stop it printing
all that stuff, run kdebugdialog and turn all the options off.

I get messages from other programs too

The messages are actually displayed by ROX-Session, but are sent by other applications. Since error messages mean that something has gone wrong, you should report a bug against the program producing them (NOT against ROX-Session!).

You can set how long the messages are displayed for from ROX-Session's Options box, and you can see a log of old messages there too. You can also see the log by right-clicking on the messages as they're shown, which is useful if you need more time to read them, or if you want to copy-and-paste into a bug report.

If you really need to disable messages (because some application is just too noisy), you can do this in its AppRun file:

exec some_app "$@" 2>&1

The extra 2>&1 at the end of the exec line causes errors to be treated as normal (non-error) output, so ROX-Session won't display them.

To hide messages from your window manager, create a script containing:

#!/bin/sh
exec window_manager "$@" 2>&1

Then use the name of that script in the ROX-Session Session Settings box.
Note that we do not provide any way to supress all error messages from all applications (despite frequent requests). Ignoring errors is never the right thing to do, and providing this option to users would be irresponsible. Although you may think that the warnings you see are harmless, the same bug could be causing serious trouble to other users. The developers may spend weeks trying to track down the problem, when the message you saw would have located the problem instantly.

Launching programs

Getting a shell

Getting a shell for the directory shown in a filer window

To get to the shell from a ROX-Filer window, right click to open the menu and choose Terminal Here... from the Window submenu. I usually bind this to the ` key so that I don't have to open the menu.

By default xterm is used for this. Choose Options... from the main menu and go to the Menu section to set a different program.

If you just want to enter one command, choose Shell Command... from the Window menu instead. This allows you to enter a command in a prompt that appears at the bottom of the filer window. I usually bind this to !.

Running a command with the ROX shell minibuffer

Getting a shell for you home directory

Drag your preferred terminal emulator to the pinboard or to a panel and assigned a short-cut key using the Edit Item... menu item. This short-cut will open a terminal window whatever program you are currently using. I usually bind Ctrl-` to this function.

You can probably find some suitable terminal emulators in /usr/share/applications.

To bind keys to menu items, see the keyboard shortcuts page.

Keyboard shortcuts to run applications or open files

How can I set applications or directories to open on a keypress?

Drag an application, directory or file onto the pinboard or a panel. Bring up the menu and choose Edit Item. Set the shortcut there.
These shortcuts can be used whatever else you are doing, so don't use a shortcut that's often used for something else, like F1!

Launching app dirs from the shell

An easy way to launch App Dirs from your shell without patching the shell.

This only works with httpzsh
Add to your /.zshrc:

  alias rehash="rehash; . ~/bin/load-appdir-cache.sh"
  [ "$DISPLAY" ] && . ~/bin/load-appdir-cache.sh

Create this /bin/load-appdir-cache.sh:

  APPDIR_CACHE=${HOME}/.appdir_cache
  if [ -f $APPDIR_CACHE ]; then
    cat $APPDIR_CACHE | while read item; do hash $item; done
  fi

And this /bin/update-appdir-cache:

  #!/bin/sh
  APPDIR_CACHE=${HOME}/.appdir_cache
  echo Updating AppDir cache... >/dev/stderr
  echo -n > $APPDIR_CACHE
  find /ROX-Apps ~/Apps -name AppRun | while read app; do
    echo "$(basename $(dirname $app))=$app" >> $APPDIR_CACHE
  done

Make sure to change /ROX-Apps to where your appdirs live, like /usr/local/apps
Then make this script executable:

  chmod +x ~/bin/update-appdir-cache

And put it in your Auto Start folder:

ln -sf ~/bin/update-appdir-cache ~/Choices/ROX-Session/AutoStart/

Can shells such as bash be made application directory aware?

You can use httpthis patch to add support to bash.

Opening a ROX window quickly from the shell

If you're using the httpzsh shell, add this to your ~/.zshrc:

open-rox-cwd() { rox }
zle -N open-rox-cwd
bindkey '\e[24~' open-rox-cwd

Now, pressing F12 will open a ROX filer window showing the current directory (even in the middle of
editing a line). The actual keycode (the odd string after bindkey) varies by terminal; press <Ctrl-V> <Key> at a shell
prompt to see what it should be (replacing ^[ with \e).

Creating an Open With menu

ROX-Filer has an Open With feature, but it's called Send To instead.

The SendTo menu is easily opened by right-clicking over a file with the Shift key held down. Choosing a program from the menu acts like dragging the file to it. One particularly useful program to add to this menu is Archive (for compressing files and directories).

You can also set certain programs to only appear when you click on files of a particular type (see the help message from the File -> Customise menu item):

Opening an image with the Gimp

ROX-Filer hints

Access FTP sites using the filer

Can I access FTP sites using the filer?

Yes, if you can make them appear as part of the filesystem. Some projects
that allow this include:

Note that AVFS is turned on on a per-process basis. So make sure you turn it on in the script that runs ROX-Filer (eg, ROX-Session/RunROX), not something that starts later (like your .zshrc file, which will only affect things started from the shell).

Can I stop my window manager from covering the panel?

The filer asks the WM to not cover a few pixels at the edge of the screen. When you move the pointer over the edge of the screen, the panel
comes to the front. If this doesn't work, try a different window manager (works fine with XFWM4).
XFWM4 also lets you configure the desktop margins, which you can use to stop windows going too near the edge of the screen.
Some window managers, such as sawfish, also allow you to mark certain windows with the avoid flag to stop them from being covered at all.

Gnome Compatibility

Here is a quick tip (from Guillaume Millet) to synchronize the ROX and Gnome file associations automatically. Just create the following script and save it in ~/.config/rox.sourceforge.net/MIME-types/ as "application", "video", "audio" and "image".

These are the fallback handlers for each of the basic MIME-types. If a more specific handler is defined it will override these, so you can maintain some differences if it is so desired.

#!/bin/sh
app=$(gnomevfs-info -s "$1" | grep "Default app" | sed 's/.*\: //')
if [ -e ~/.local/share/applications/$app ] ; then
	exec $(grep "^Exec" ~/.local/share/applications/$app | sed 's/Exec=//;s/%[a-zA-Z]//') "$@"
fi
if [ -e /usr/share/applications/$app ] ; then
	exec $(grep "^Exec" /usr/share/applications/$app | sed 's/Exec=//;s/%[a-zA-Z]//') "$@"
fi

Don't forget to make the script executable (chmod +x filename).

How do I move icons around on the panels?

Drag them with the middle mouse button.

How do I open a directory in a new window?

Click with the middle mouse button (both buttons at once on two-button mice).

How to browse "Windows Network"

Get following applications...

Make following rox-app.

/usr/apps/Windows Network/AppInfo.xml

&lt;?xml version="1.0"?>
&lt;AppInfo>
  &lt;Summary xml:lang="en">Samba Network Filesystem.&lt;/Summary>
  &lt;About xml:lang="en">
    &lt;Purpose>Open Windows Network Folder&lt;/Purpose>
    &lt;Version>0.1&lt;/Version>
    &lt;Author>Yasuhiro Matsumoto [mattn_jp@hotmail.com]&lt;/Author>
    &lt;License>GNU General Public License&lt;/License>
    &lt;Homepage>http://www.ac.cyberhome.ne.jp/~mattn/&lt;/Homepage>
  &lt;/About>
  &lt;AppMenu>
    &lt;Item option="[umount]">
      &lt;Label>Unmount&lt;/Label>
    &lt;/Item>
  &lt;/AppMenu>
&lt;/AppInfo>

/usr/apps/Windows Network/AppRun

#!/bin/sh
 
SMBDIR=/smb
 
if [ "$1" == "[umount]" ]; then
  fusermount -u $SMBDIR
  exit
fi
 
exec 1>&2
echo -n "Launching Samba Network Filesystem... "
if ps -C smbnetfs -o user | grep -q $USER
then
  echo "Already running."
else
  echo "OK"
  if ! smbnetfs $SMBDIR; then
    exit
  fi
  sleep 5
fi
rox $SMBDIR

Modify "~/.smb/smbnetfs.conf" if you needed.

This rox-app mount windows network to "/smb" directory. and start rox file manager.

If you want to unmount this "Windows Network", right click this app icon and select "Unmount".

Make clicking on an RPM or Deb install it as root

Can I set it up so that clicking on an RPM or Debian package will install it as root (after entering the password)?

Yes. Open the menu over an RPM and choose 'Set Run Action...'. Set the command to:

gnomesu -u root -e -c "rpm -i \"$1\""

You'll need the latest version of httpgnomesu installed.

Opening every file in a selection as if I clicked on them one by one

Drag the selection onto ROX-Filer (that is, open the directory containing 'ROX-Filer' itself and drag to it). You can add ROX-Filer to the Send To menu so that clicking Shift+Menu over the selection will let you do this easily.

Thumbnails of videos and other file types

Thumbnail Helpers

One of the features of ROX-Filer is the ability to provide thumbnail images for of certain files. These are small images based on the content of the file and used to replace the default type icon for that file in ROX-Filer windows. You can see this effect by viewing a directory containing JPEG files and turning on thumbnail mode (Display => Show Thumbnails, normally bound to ctrl-T). ROX-Filer shows "thumbs" in the titlebar when thumbnail mode is on.

By itself ROX-Filer can generate thumbnails for the most common image file types

* JPEG
* PNG
* GIF
* SVG (normally)
* and a few others

However it does not support all image types, nor does it generate thumbnails for other types of file such as video or font files. To do so would increase the size of the program and slow it down. Also the file types that the user would want thumbnailing would vary from user to user.

The solution is to allow ROX-Filer to call external programs which are capable of generating thumbnails for certain types. The user can then enable or disable whichever types they wish to thumbnail.

Available thumbnail helpers include:

* VideoThumbnail: many types of video files
* MagickThumbnail: image types not handled internally

The helper applications are normally implemented as Library Directories.

Known problems

I installed VideoThumbnail/MagickThumbnail but it doesn't work
Did you remember to let it install handlers for its types?
I have a helper for a type but it is never called
If the helper is a Library Directory check that it and the AppRun file inside are owned by the same user.
When I click on "Install handlers" it gives me this error: OSError: [Errno 17]
This is a bug in some recent versions of ROX-Lib, fixed in version 2.0.2.
I upgraded to ROX-Lib version 2.0.2 but I still get the error
You need to clean up the files left behind by previous installation attempts, such as ~/.config/rox.sourceforge.net/MIME-thumb/application_ogg and ~/.config/rox.sourceforge.net/MIME-thumb/application_ogg.tmp (replace ~/.config with your $XDG_CONFIG_HOME if it is different).

Speed hints

Booting

If your computer takes a long time to boot, then it's probably because it's loading a slew of unnecessary programs. Many distributions try to simplify things by having everything you might ever want running by default. Needless to say, this is slow and a security risk.

Note: changing your boot sequence could prevent your computer from booting. Make sure you know how to fix it if that happens! (eg, by typing linux single at the LILO prompt and using the shell)

Here are some good ways to find out what useless stuff you've got running:

Things to get rid of

Of course, any of these might be useful in some particular situation. I'm describing this for a typical single-user desktop machine.

NFS
The Network FileSystem lets other Unix machines access files on your computer.
Netfs
You only need this if you want to mount network filesystems (i.e. from other computers) automatically at boot time.
Samba
Like NFS, but for Windows machines. Also allows people on other machines to use your printers.
FTP (wuftp)
A way to provide files to the public (use ssh instead to provide private files).
Sendmail, exim
Email programs send new emails to sendmail, and sendmail sends them out. Sendmail can do clever things, like sending email to another user on the same machine without going via the Internet, or holding mail in a queue until you connect. For a home machine, it's usually better to get your email client to connect directly to your ISP's mailer.
Telnet, rlogin
Highly insecure ways to let other people run programs on your computer (replaced by ssh).
Apache
Lets other people view a web-site hosted on your computer. Probably only useful if you're a web developer.

Things you might want

ssh
A secure way to access your computer from elsewhere. Ssh can also be used to tunnel through a firewall (to access things normally only available from the machine itself) or to copy files.
xfs
Actually, you don't want this, but disabling it might mess up your X server if you're not careful. Remove lines like FontPath "unix/:7100" from your XF86Config file and see if it still works. XFS provides blocky, ugly fonts to old programs on your machine and others. ROX applications and many others use the new font system instead, and the X server can still provide the old fonts itself (make sure you still have a line like FontPath "/usr/lib/X11/fonts/Type1" in your config, or the X server may refuse to start).
portmapper
Used by FAM (I think) to let nautilus and konqueror update their directory displays automatically when something changes. ROX-Filer can do this without needing the portmapper. You can probably remove this. Some other things use it too, like NFS.
wwwoffled, squid
These programs cache web pages to make web access faster. wwwoffled also allows you to revisit pages even if you're offline.

Things to keep

cron
Runs scheduled tasks at certain times. In particular, it runs logrotate to stop your log files from growing without limit. However, you might want to turn off some of the tasks (see /etc/cron.daily, etc).
lpd
The printer spooler. Print jobs get sent here, and then on to the printer. You need this if you want to print.

Fast booting distros/Unixes

There are some Linux distributions and other Unixes which startup fast and run almost no services by default, for instance CRUX (my CRUX needs 20 seconds until login console is up plus 10 seconds for starting XDM), FreeBSD and NetBSD.

Starting services in parallel

Linux tends to do one thing at a time when booting, to make errors more obvious. If you care more about speed, you can run them in parallel. For example, adding an & to the end of a command will let the boot sequence continue while it executes (ifup brings up interfaces, which may involve slow DHCP negotiations):

  ifup -a &

Here's an excellent (technical) article from IBM, showing how the make command can be used to start services in parallel wherever possible:

Why does my computer suddenly thrash the disk for about 10 minutes soon after I turn it on each day?

It's probably slocate indexing all your files for the locate command.
It's supposed to happen around midnight when noone's around, but most people don't leave their machines on all the time. Use System to find where it's being run from (probably something in /etc/cron.daily) and move it to cron.weekly or cron.never, etc.

Theming

There are several different parts of the desktop that can be themed, as shown in the picture below.

http://rox.sourceforge.net/screens/theme_parts.png

  1. You can set the image for the desktop background. The pinboard FAQ section tells how.
  2. The window titles and borders are controlled by a window manager, such as OroboROX. There are lots of different window managers to choose from, and most have a large selection of themes available.
  3. Buttons, menus and scrollbars within each window are drawn by the toolkit. ROX applications use the GTK toolkit, which has many themes (see below).
  4. The icon displayed for each file type is set by the icon theme (see below).

See also:

Window manager themes

If you use OroboROX, right click on the OroboROX icon in a ROX-Filer window and choose Options to get a list of themes.

If using another window manager, you can find lots of themes at http://themes.freshmeat.net.

GTK themes

All the ROX applications use GTK. Everything inside the window frame of a GTK application is drawn by GTK, while the frame itself (the titlebar and resize frame) is drawn by the window manager.

The basic goal of the theme system is to keep programmers away from graphic design. The programmer says to GTK "display a button". The theme designer says to GTK "draw buttons like this". For more information, see The GTK+ Theme Architecture.

Downloading themes

ROX uses GTK 2, so make sure you get a GTK2 theme if you want to change the style of the menus and other user interface widgets. To install a GTK theme:

  1. Place your downloaded theme into the hidden directory ~/.themes/
  2. Run the LookAndFeel configuration applet and choose the theme from the menu there (this only works if you're using ROX-Session; other session managers will provide their own ways to set the theme).

You can find lots of themes at http://themes.freshmeat.net.

Manual customization

On startup, GTK reads the file ~/.gtkrc-2.0. You can edit this file to customize the appearance of your programs. See the following pages for some examples.

Themes only seem to change the widget colours, not images

Make sure you have the appropriate theme engine installed (eg gtk2-engines-pixbuf).

How can I theme the toolbar icons?

ROX-Filer uses the standard Gtk stock icons system to change the toolbar icons. Put something like this
in your ~/.gtkrc-2.0 file:

pixmap_path "/path/to/icons"
 
style "normal" {
  stock["gtk-close"] = {{"close-icon.png"}}
  stock["gtk-go-up"] = {{"up-icon.png"}}
  stock["gtk-home"] = {{"home-icon.png"}}
  stock["gtk-refresh"] = {{"refresh-icon.png"}}
  stock["gtk-zoom-in"] = {{"zoom-in-icon.png"}}
  stock["gtk-zoom-fit"] = {{"zoom-fit-icon.png"}}
  stock["gtk-jump-to"] = {{"jump-to-icon.png"}}
  stock["gtk-sort-ascending"] = {{"sort-icon.png"}}
  stock["gtk-help"] = {{"help-icon.png"}}
  stock["rox-show-hidden"] = {{"hidden-icon.png"}}
  stock["rox-show-details"] = {{"details-icon.png"}}
  stock["rox-select"] = {{"select-icon.png"}}
}
 
widget "*" style "normal"

See the list of stock icons in the Gtk documentation for details.

Theming panels

How do I set a font, colour or background image for the panels?

Put something like this in your ~/.gtkrc-2.0 file:

style "panel-style" {
  bg[NORMAL] = "#efb47c"
  font_name = "Sans 5"
}
widget "rox-panel.*" style "panel-style"

Theming the background of filer windows

My GTK theme makes my filer background a different color; how do I make it white again?

Put something like the following in your ~/.gtkrc-2.0 file:
Note: to prevent this file from being overridden when changing themes use ~/.gtkrc.mine
instead

style "rox" = "default"
{
  bg[NORMAL] = "#ffffff"
  bg[ACTIVE] = "#ffffff"
}
widget_class "*Collection*" style "rox"

Next, restart ROX-Filer (or you X session). You can just restart ROX by killing the ROX-Filer process : under Linux, use killall ROX-Filer and restart it. Don't use killall under Solaris.

Other widget_class backgrounds you may like to change include:

  • GtkToolbar - the toolbar at the top of the window
  • GtkMenu - menus

but remember that this will affect all GTK applications.

How do I set a background image for ROX filer windows?

This is similar to the previous question. Put something like the following in your ~/.gtkrc-2.0 file:
Note: to prevent this file from being overridden when changing themes use ~/.gtkrc.mine
instead

pixmap_path "/home/yourhome/images"
style "rox" = "default"
{
  bg_pixmap[NORMAL] = "roxbg.png"
}
widget_class "*Collection*" style "rox"

Bu sure that roxbg.png is in the path you use in the pixmap_path directive. The image will be tiled to fill the whole ROX filer window. Next, restart ROX-Filer (or you X session). You can just restart ROX by killing the ROX-Filer process : under Linux, use killall ROX-Filer and restart it.

Further reading

See the GTK Theming Tutorial for more information.

Icon themes

Icon themes provide icons for all the different types of file. The current series of ROX-Filer (2.2.x) supports freedesktop.org icon themes; install new icon themes in your ~/.icons directory, and then select it in your Options dialog's 'Types' panel.

Themes are listed in the Themes block on the left of the page, or you can browse the list of themes.

In The Future, we hope to be able to share icon themes with other desktops.

Does the filer support SVG icons?

The filer uses GTK to load images. As long as you have SVG support in GTK, ROX-Filer will load them fine. To test for SVG support execute:
gdk-pixbuf-query-loaders | grep svg
If you get a line with svg_loader.so in it, you should be ok.

I'm using ROX-Filer 2.1.0, but the theme setting has no effect!

Make sure you don't have any Choices/MIME-icons directories (~/Choices, /usr/local/share/Choices, /usr/share/Choices, etc). These override icons set in the theme.
If you've previously installed ROX-Filer 2.0.0, you probably have one of these directories around.

How do I create an icon theme?

"What's the best/easiest way of creating icons sets for using in ROX-Filer so that they can be shared ?

Do I have to manually drop an icon in the box for every MIME type, or is there some App that does this is a smarter way? I would like to make a bunch of icon sets and put them online for download."

Copy the ROX-Filer/ROX theme directory as ~/.icons/MyTheme and edit the icons there. Use the Options box to select your new theme. Delete/move everything in your Choices/MIME-Icons directories or they will override the theme.

Set As Wallpaper menu item

Call I make a Set As Wallpaper menu item appear for images?

  1. Right-click on an image and choose Customise Menu....
  2. Drag Wallpaper (version 2.1 or later) to it.
  3. Right-clicking on another file of that type will show a Wallpaper menu item which sets that image as the backdrop.
Set as wallpaper menu item

Using SOAP

You can also use the SOAP method (see the manual for ROX). You can make a small script that takes a file argument and call ROX to set that image as background on the pinboard. You can't use the rootwindow for background, the pinboard is actually one big window that covers your desktop!

Example script (untested, but should work):

#!/bin/sh
rox --RPC << EOF
<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body xmlns="http://rox.sourceforge.net/SOAP/ROX-Filer">
  <SetBackdrop>
   <Filename>$1</Filename>
   <Style>Stretch</Style>
  </SetBackdrop>
 </env:Body>
</env:Envelope>

EOF
Change the Style element to your prefered mode (Stretch, Scale, Center, Tile), make the script executable (chmod +x scriptname) and put in in your ~/Choices/SendTo/.image and it should show up when you shift-rightclick on an image. Though it will not show up at the top of the file menu when right click, if you want this you will have to choose Customise Menu from the top of the File menu (ROX-Filer 2.1.0 or later required).

Scripting

Many functions of ROX can be called by external programs using the SOAP interface. See the httpappendix C of the manual for more information on this.
There is a small Python script for calling these SOAP methods from the command line or from Python code. You can find it httphere.

Open a filer window showing a file I'm editing

There are various possibilities:

  • ROX-style applications like Edit should already have an Up button on their toolbar for this.

  • You can get some window managers to provide such a button in the title bar. This code creates a change-to-parent action for sawfish:

    (defun change-to-parent (window)
      "Close window and open the parent directory viewer"
      (interactive "%W")
      (let ((title (caddr (get-x-property window 'WM_NAME))))
        (when (and title (string-match "[~/][^*?]+" title))
          (let ((path (substring title (match-start 0) (match-end 0))))
            (system (concat "rox -s " path))
            (delete-window-safely window)
    ))))
  • You can script other applications. For example, Stephen Watson gives these instructions for Emacs:

    (defun rox-view-file (file)
      "Open ROX-Filer window for named file"
      (interactive "fFile to show: ")
      (call-process "rox" nil 0 nil "-s" file)
      )
    (defun rox-view-current ()
      "Open ROX-Filer window for the current file"
      (interactive)
      (rox-view-file buffer-file-name)
      )
  • For Vim (or GVim), put this in your ~/.vimrc file:

      map <F12> :silent !rox -s %<CR>

Open a filer window with a particular style, size, position

How can I open a filer window with a particular style, size, position, etc?

You can use the OpenDir SOAP method to set the style of the window directly (see the SOAP section of the filer's manual). You can also use use this to set the WM_CLASS, so that your window manager can be set to treat the window
specially.

Matthew Weier O'Phinney writes:

"I now have an XML file entitled appsDir.xml containing the following:

<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
  <env:Body xmlns:ns="http://rox.sourceforge.net/SOAP/ROX-Filer">
    <ns:OpenDir>

      <ns:Filename>/home/matthew/Apps</ns:Filename>
      <ns:Style>Large</ns:Style>
      <ns:Class>AppsDir</ns:Class>
    </ns:OpenDir>

  </env:Body>
</env:Envelope>

In addition, I have installed httpbbappconf.

In addition, I have applied a patch (link is now broken; is the bug fixed now?) that makes the program behave when in an iconic or withdrawn (read: dockapp) state, as well as allowing for certain "geometry" type tags.

I run bbappconf as 'bbappconf -i &' in my .xinitrc file.

bbappconf looks for the WM_CLASS name and class. The Class defined in the SOAP RPC xml file above is the WM_CLASS name; class remains "ROX-Filer". Based on the combination of class and name, it applies the settings specified in a configuration file to the window in question when it appears.

In my ~/.bbtools/bbappconf.bb file, I have a series of applications for which I want to control either geometry, stickiness, starting workspace, or toggling decor. I have the following entry now, corresponding to the
above SOAP RPC xml file:

bbappconf.3.classHint.class:    ROX-Filer
bbappconf.3.classHint.name:     AppsDir
bbappconf.3.positionX:          698
bbappconf.3.positionY:          0
bbappconf.3.width:              324
bbappconf.3.height:             200
bbappconf.3.Stick:              true

This places a window 324x200 in the upper right corner of my desktop and makes it sticky.

bbappconf, while originally developed as a blackbox tool, can be used without blackbox. A file entitled bbappconf.nobb contains settings that should be used if not using blackbox.

Also, the positionX, positionY, width, and height attributes are undocumented. They are a part of the patch to bbappconf detailed above -- this is why I include a sample configuration in here."

Open html file in Firefox

Can I open html file gracefully in httpMozilla Firefox? Even in new tabs everytime?

Sure. One way is to put the script below into (for example) ~/bin. Name it 'Firefox' or something and make it executable. Check if that /opt install path applies to your system.

#!/bin/bash

FIREFOX="/opt/firefox/firefox"

if [ -x "$FIREFOX" ]; then
      "$FIREFOX" "$1" || "$FIREFOX" -remote "OpenURL($1, new-tab)"
fi

Then right click on some HTML file in ROX-Filer and choose Set Run Action. Drag the `Firefox' script you created into the box, and you're set.

Here's another firefox script, make sure to change FIREFOXDIR to the right directory:

#!/bin/sh

FIREFOXDIR=/Programs/FireFox/Current
REMOTE="$FIREFOXDIR/mozilla-xremote-client -a firefox"
if ( $REMOTE "ping()" 2>/dev/null); then
        exec $REMOTE "openurl($1,new-tab)"
else
        exec firefox "$1"
fi

Openbox 3 appdirs menu

Openbox 3 appdirs menu (httpAndrew Stephens)

OB3 uses XML for its configuration files, so I made my own small python script to create XML dynamic menu entries for files, appdirs, and normal directories (in that order). Files are opened/run using the rox filer (so it relies on what run action you've specified for the file type). Application Directories are simply run like usual, and normal directories are turned into their own submenus.
For your menu file, use an entry something like this:

<menu id="roxmenu-menu" label="ROX Menu" execute="/home/andrew/.config/openbox/scripts/roxapps.py /home/andrew/Apps" />

This will give you a menu of all your files, appdirs, and directories in your personal Apps folder. I like to the script to take my ROX-Menu entries so I use '/home/andrew/Choices/ROX-Menu-bin/Menu_Root' as the argument for script. The main thing to note is that the script DOES require a path as an argument.
Here it is... I'm new to Python (n++ doesn't work?) so feel free to make it better - There probably should be some exception handling in it... among other things...

#!/usr/bin/python

import sys
import os.path

print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
print "<openbox_pipe_menu>"

def scan( menu_path ):

        mylist = os.listdir( menu_path )
        mylist.sort()

        filelist = []
        appdirlist = []
        dirlist = []
        for name in mylist:
                fullname = os.path.join( menu_path, name )
                fullappdir = os.path.join( fullname,"AppRun" )
                if os.path.isfile( fullname ):
                        if name <> ".DirIcon":
                                filelist.append( "<item label=\"" + name + "\"><action name=\"Execute\"><execute>rox \"" \
                                + fullname + "\"</execute></action></item>" )
                elif os.path.isdir( fullname ):
                        if os.path.exists( fullappdir ):
                                appdirlist.append( "<item label=\"" + name + "\"><action name=\"Execute\"><execute>" \
                                + fullappdir + "</execute></action></item>" )
                        else:
                                dirlist.append( name )

        for f in filelist:
                print f

        for a in appdirlist:
                print a

        for d in dirlist:
                fullname = os.path.join( menu_path, d )
                print "<menu id=\"" + d + "\" label=\"" + d + "\">"
                scan( fullname )
                print "</menu>"

scan ( sys.argv[1] )

print "</openbox_pipe_menu>"

Script to add ROX and AppDirs to the openbox menu

After I switched from the fluxbox wm to the openbox wm, I noticed in the
docs that for this wm one can generate menu items dynamicly by external
scripts. Below a small perl script that walks through the filesystem
generating menu entries that open a directory with rox. Also, more
interesting, if it encounters AppDirs, program entries are generated.
To use it edit ~/.openbox/menu (or /usr/share/commonbox/menu) to include
for example :

  [pipe] (/)    {/path/to/menu.pl /}
  [pipe] (Apps) {/path/to/menu.pl /usr/local/apps ~/apps}

Thus you can open any dir via the '/' entry and apps are automatically
listed under the 'Apps' entry.
File menu.pl given below.

#!/usr/bin/perl
$no_idx = $#ARGV;
die "$0 needs a directory as argument.\n" unless @ARGV;
for (@ARGV) {
        $dir = $_ || next;
        opendir DIR, $dir || die "Could not open $dir\n";
        print "[exec] (.)  {rox $dir}\n"   unless $no_idx;
        $dir =~ s#/$##;
        print "[pipe] (..) {$0 $dir/..}\n" unless $no_idx;
        push @entries,
                map {   -x "$dir/$_/AppRun"
                        ? [$_, "[exec] ($_) {$dir/$_/AppRun}\n"]
                        : [$_, "[pipe] ($_) {$0 $dir/$_}\n"]
                }
                grep {$_ !~ /^\./ and -d "$dir/$_"}
                readdir DIR;
        closedir DIR;
}
print map {$$_[1]} sort {$$a[0] cmp $$b[0]} @entries;