A freedesktop.org system tray as a window maker dock app
wmsystemtray is a system tray using the freedesktop.org system tray protocol designed as a Window Maker dock app. It has the ability to display more than one dock window to make room for more tray icons, and the ability to scroll through the icons if more are present than will fit.
Name of display to use.
Display usage information.
Display the version number and exit.
Print more messages to the console. May be repeated.
Print fewer messages to the console. May be repeated.
Use 16x16 tray icons, instead of 24x24. In other words, fit 9 icons instead of 4 in one dock window.
-w <n>, --windows <n>
Specifies the number of dock windows to open. Each dock window is assigned a unique name (i.e. the first is wmsystemtray.wmsystemtray0, the second wmsystemtray.wmsystemtray1, and so on), so they can be reliably positioned in the dock or clip.
Print the window's index number on the window, to make it easier to dock them in the right order. Note that if there are enough tray icons active, this number may be covered up.
Normally the first dock window is completely filled before any tray icons are placed in the second. This option fills the top row of each dock window before placing any icons in the second row, which may make more sense if you arrange the dock windows horizontally.
Normally, every dock window has both left and right scrolling arrows at the bottom. Specifying --arrows horizontal places the left arrow only on the first window and the right arrow only on the last, which may make more sense if the windows are arranged horizontally. --arrows vertical places the arrows only on the last window, which may make more sense if the windows are arranged vertically.
-c <color>, --fgcolor <color>
Specify a color for the page indicator and --id-windows indicators, instead of black. Colors may be specified in any format recognized by XParseColor In short, that's any color name in X's rgb.txt or an RGB color specified as "rgb:rr/gg/gg".
In non-Window Maker mode, specify the color for the window background. The default is to shape the window to fit the used area and to set ParentRelative, which attempts to copy whatever is behind the window.
Activate non-Window Maker mode. This provides limited support for using the program in window managers that don't do Window Maker-style dockapps; the application still sizes itself as a 64x64 window, however, so you might be better served by a more traditional system tray.
The main portion of the dockapp has room for four 24x24 or nine 16x16 tray icons. At the bottom are left and right arrows for paging when more tray icons are available than can be displayed at once, with an indicator between showing the current "page" of icons and total number of pages currently available.
In addition to left-clicking either scrolling arrows, the mouse's scroll wheel may be used on the bottom section to change pages.
SIGUSR1 and SIGUSR2 may be used to change pages. A program such as xbindkeys may be used to send these signals to wmsystemtray on appropriate key presses.
The balloon message portion of the freedesktop.org protocol is not implemented at this time. I've heard that the official Gnome system tray doesn't implement this either, and most tray apps seem to directly use dbus desktop notifications service.
Most of the Xembed specification is not implemented, as it is not needed here. For example, the only point to redirecting input focus is to allow the outer window to see input events (and then the outer window has to forward those events to the embeds). But since we don't really care, we can just let the icons get events directly. Similarly, we don't take focus or activation, and we don't do accellerators.
freedesktop.org System Tray Protocol Specification
freedesktop.org XEmbed Protocol Specification
When I finally decided to make use of some applications that work via system tray icons, I looked around for a tray for my preferred window manager. Some didn't integrate well (I didn't want a bar at the top or bottom of the screen), some dockapps couldn't handle more than 4 icons at all, some could do 4 icons with paging (and much crashing if any program was killed), some could do more than 4 icons by creating arbitrary numbers of app icons (but undockable, because they were created "as needed"). So I decided to write my own, combining the best features into a stable app.