mupanel
This is a desktop panel for X11. Its main strength is the editable
start menu. Here are a few other features:
- No dependencies on any toolkit libraries. Just basic X, freetype
and libpng is sufficient.
- Statically linked.
- Can use GNOME .desktop files to discover installed programs.
- The menu can be edited using a GUI.
- BSD-licensed.
- Has a NETWM based pager which can display icons and window geometry,
similar to xfce4-panel.
- Supports shortcuts on the panel itself.
- Shows the time.
- Its looks can be configured in great detail.
It has been tested in XFCE and FluxBox environments. Here is a screenshot:
Download
Latest 1.5:
1.3:
1.2:
1.1:
1.0:
Installation
After you've gotten the "mupanel" binary either by downloading or by
compiling, you can simply move it to somewhere permanent. No other files
need to be installed and the binary can live anywhere on the file system.
Installing The Static Binary
Just do:
$ bunzip2 mupanel.bz2
$ chmod +x mupanel
$ mv mupanel /usr/bin
The static binary is compiled and linked with the
musl libc. This library
requires an environment variable called "TZ" to work properly. Set this
variable to your time zone in ~/.profile or /etc/profile. I have this:
TZ= GMT-2
export TZ
which corresponds to the winter timezone in Turkey.
Installing from Source
Just untar the package and run build.sh.
This may fail if your system doesn't have the necessary
static libraries. If that is the case, remove the "-static" flag at the
end of build.sh and try again.
Usage
Using mupanel with XFCE
In order to use it with XFCE, I did this:
$ mv mupanel /usr/bin
$ cd /usr/bin
$ mv xfce4-panel xfce4-panel.old
$ ln -s mupanel xfce4-panel
Of course, you need to be root to fiddle with things in /usr/bin.
Using mupanel with other window managers
Some window managers may need special settings to properly position
the panel. If your WM doesn't work with mupanel out of the box, you
can set the override_redirect option to 1. This will let the panel work
properly, but windows may occupy the panel's space when maximized.
mupanel settings are stored in file $XDG_CONFIG_HOME/mupanel/config.
XDG_CONFIG_HOME is usually $HOME/.config. In this file, you need to
have the following:
override_redirect 1
There are other settings as well, but I will document them later.
Configuring mupanel
When you start mupanel for the first time, the menu will contain only one
entry which runs the menu editor. The editor works like a dual pane
file manager in which sub-menus behave like folders and menu items
behave like files. You navigate on the top and manipulate on the
bottom.
At first use, you should scan your system for .desktop files. When
you have the scan screen, you can set the search paths for .desktop
files and associated icons.
When you're done, you should close the dialog using the "Done" button.
Closing it from the window decoration causes it to forget about any
changes you've made.
Other configuration lives in a text file mentioned before: $XDG_CONFIG_HOME/mupanel/config. Most settings stored here affect the looks of the panel, but
there is one behavioral setting: you can turn the clock off by writing:
clock_on 0
Here is a list of all settings:
define page_prop { int root; int window; int window_border; }
define pager_style { page_prop active; page_prop inactive; int border; }
define clock {
int fg; int bg; int pad; string font_name; int font_size;
}
define taskbar
{
int fg; int bg; string font_name; int font_size; int icon_size;
int border;
int max_size;
int active;
int left; int right; int mid;
}
define menu_style
{
int left; int right; int mid; int mid2; int vspc;
int icon_w; int icon_h;
int font_size; string font_name;
int bg; int fg;
int seph; int sepv; int sepcolor; int hilight;
}
define switcher
{
int fg; int bg; int hilight;
int pad_top; int pad_mid; int pad_bot; int pad_horz; int pad_icon;
int width;
int font_size; string font_name;
int enabled;
}
top_level top
{
pager_style pager_style;
taskbar taskbar;
clock clock;
int clock_on;
menu_style menu_style;
switcher switcher;
array string menu_icon_path;
array string menu_shortcut_path;
int height;
int bg; int fg;
int right; int left; int spacing; int button_size;
string left_box_file;
string right_box_file;
int override_redirect;
int retain_desktop_number;
int window_close_shortcut;
}
Let's say that you want to change the font of the menu. You'd write:
menu_style { font_name "/usr/share/fonts/dejavu/DejaVuSans.ttf" }
Some options are nested deeper:
pager_style { active { root 0x0000ff } }
which sets the root window color of the active desktop to blue in the
pager.
Change Log
- 1.5: 09.02.2016
-
retain_desktop_number setting introduced a bug, all clients were
being lumped up in the first desktop. Now it's fixed.
- 1.4: 04.02.2016
-
Alt+F4 and Alt+Tab shortcuts were added. These have to be enabled
using the switcher.enabled and window_close_shortcut settings.
- 1.4: 04.02.2016
-
blackbox doesn't properly minimize windows. When you minimize a window,
blackbox removes it from the virtual desktop and puts it into a 'sentinel'
desktop. To counter that, I now ignore nonsensical desktop numbers if
the window had a sensible one before. Some windows don't have sensical
desktop numbers because they are 'sticky'. The new setting
retain_desktop_number controls this behaviour. If it's set to 1, then
this behaviour is activated.
- 1.3: 26.12.2015
-
Double fork to avoid zombie processes.
- 1.3: 26.12.2015
-
blackbox forks such as fluxbox, openbox etc.
didn't position the panel correctly.
Now I set usposition flag in WM_SIZE_HINTS. This way, I don't need to
use override_redirect and the struts work correctly.
- 1.3: 26.12.2015
-
When looking for client windows, we skip those which have _DOCK type.
Currently, when we find _NORMAL in the window type list, we assume
it's a normal window. However, some windows such as stalonetray set both.
Now, this is done correctly. If a window has the _DOCK type, it gets
ignored by the taskbar and the pager even if it also has the _NORMAL
type.
- 1.3: 26.12.2015
-
If you can't get the name of a window, just print 'window' for its
title. Currently, it's left blank, which looks really funny.
I had observed this with XFig only, which sets WM_ICON_NAME to an empty
string but has a proper WM_NAME property. I used to read these in the
incorrect order, now it's done correctly.
- 1.2: 14.01.2015
-
Modified p-start.c to use the menu button as a graymap.
Now the start menu button is drawn with the foreground
of the taskbar.
Modified the pager, start menu button and the button boxes
to accept only button-1 clicks.
Things to Do
- Make some environment variable point to the configuration file. The
default can still be based on XDG_HOME etc.
- Make the USPosition stuff optional, set by configuration.
- Embed tray functionality into the panel.
- Using XSync seems to work for free'ing images safely. Maybe use that
instead of delayed shmdt etc.
- Convert all image loading to PNG-loading for the setting
windows.