Table of Contents
Fluxbox
Fluxbox is a very light window manager, highly customizable (look, shortcuts, etc).
Links
Installation guide for Gentoo :
[EN] http://www.gentoo.org/doc/en/fluxbox-config.xml
[FR] http://www.gentoo.org/doc/fr/fluxbox-config.xml
Control your sound card with the keyboard and xosd
amixer
enables you to control your sound card, and the xosd
package with osd_cat
command enables you to print some stuff to the screen, even with a bar graph for the volume :
# mute Master and PCM Mod4 m :MacroCmd {ExecCommand amixer sset Master toggle} {ExecCommand amixer sset PCM toggle} {Exec sleep .1s} {Exec echo "Sound `amixer sget Master volume | grep Left: | cut -f 8 -d " "`" | osd_cat -d 1 -p middle -A center -s 1 -u blue -O5} Mod4 Shift m :MacroCmd {ExecCommand amixer sset PCM toggle} {Exec sleep .1s} {Exec echo "Sound PCM `amixer sget Master volume | grep Left: | cut -f 8 -d " "`" | osd_cat -d 1 -p middle -A center -s 1 -u blue -O5} #volume Master Mod4 o :MacroCmd {ExecCommand amixer sset Master 1+} {Exec sleep .1s} {Exec osd_cat -d 1 -p middle -A center -s 1 -u blue -O 6 -b percentage -P `amixer sget Master volume | grep Left: | cut -f 7 -d " " | cut -c 2-4` -T "Master: `amixer sget Master volume | grep Left: | cut -c 24-50`"} Mod4 i :MacroCmd {ExecCommand amixer sset Master 1-} {Exec sleep .1s} {Exec osd_cat -d 1 -p middle -A center -s 1 -u blue -O 6 -b percentage -P `amixer sget Master volume | grep Left: | cut -f 7 -d " " | cut -c 2-4` -T "Master: `amixer sget Master volume | grep Left: | cut -c 24-50`"} #volume PCM Mod4 Shift o :MacroCmd {ExecCommand amixer sset PCM 1+} {Exec sleep .1s} {Exec osd_cat -d 1 -p middle -A center -s 1 -u blue -O 6 -b percentage -P `amixer sget PCM volume | grep Left: | cut -f 7 -d " " | cut -c 2-4` -T "PCM: `amixer sget PCM volume | grep Left: | cut -c 24-50`"} Mod4 Shift i :MacroCmd {ExecCommand amixer sset PCM 1-} {Exec sleep .1s} {Exec osd_cat -d 1 -p middle -A center -s 1 -u blue -O 6 -b percentage -P `amixer sget PCM volume | grep Left: | cut -f 7 -d " " | cut -c 2-4` -T "PCM: `amixer sget PCM volume | grep Left: | cut -c 24-50`"} Mod4 p :ExecCommand xmms -t
The sleep
command is just used to print the new value after the change. cut
is used to extract the value of the volume for the bar graph.
Configure TwinView/Xinerama/DualScreen
First, emerge fluxbox with the xinerama
USE flag (and you should compile everything with this flag, so set it in /etc/make.conf
).
It will work fine, except that your toolbar could be spread on both screens, then change in ~/.fluxbox/init
:
screen0.toolbar.onhead : 2
If you want to have different settings for the two screens, you can copy all screen0
properties to have screen1
properties too.
Apps
xprop
Make double-click titlebar maximize the window
Instead of shading the window.
For that, you have to modify the source code of fluxbox. Of course, it is easier if you use a source distribution such as Gentoo (here is explained how to emerge a package and modify sources).
But you just have to modify two lines in Window.cc
:
Window.cc:3954 + CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeFull)); CommandRef shade_cmd(new WindowCmd(*this, &FluxboxWindow::shade)); Window.cc:4021 - frame().setOnClickTitlebar(shade_cmd, 1, true); // doubleclick with button 1 + frame().setOnClickTitlebar(maximize_cmd, 1, true); // doubleclick with button 1
Make Meta-Tab switch between all windows
NOTE: This is fixed in Fluxbox 1.0, this tip is useless now.
Instead of only switching between visible windows (not minimized).
One more time, you have to modify the source code, this time there are two lines :
FocusControl.cc:71 - (opts & FocusControl::CYCLESKIPSHADED) != 0 && win->isShaded() || - win->isFocusHidden() + (opts & FocusControl::CYCLESKIPSHADED) != 0 && win->isShaded() //|| + //win->isFocusHidden() FocusControl.cc:122 - if (fbwin && !fbwin->isIconic() && + if (fbwin && /*!fbwin->isIconic() &&*/
Reduce flickering
… during workspace switch.
Fluxbox deals with workspaces in a quite simple manner: when switching workspace, it hides all windows of the old workspace, and then draw all windows of the new workspace.
Most of the time when we switch workspace, we can see the background image, and then all new workspace windows displayed one after the other, what is very nasty.
First thing, show new workspace's windows before hiding old workspace's ones:
Screen.cc:1208 - currentWorkspace()->hideAll(false); Screen.cc:1223 currentWorkspace()->showAll(); + wksp->hideAll(false);
Second thing, draw windows in their focusing order, in order to draw the front window first:
void Workspace::showAll() { - Windows::iterator it = m_windowlist.begin(); - Windows::iterator it_end = m_windowlist.end(); - for (; it != it_end; ++it) - (*it)->unwithdraw(); + FocusControl::FocusedWindows::iterator it = m_screen.focusControl().focusedOrderList().begin(); + FocusControl::FocusedWindows::iterator it_end = m_screen.focusControl().focusedOrderList().end(); + int workspace = m_screen.currentWorkspaceID(); + + for (; it != it_end; ++it) { + if ((*it)->fbwindow() && !(*it)->fbwindow()->isIconic() && + (int)(*it)->fbwindow()->workspaceNumber() == workspace) + (*it)->fbwindow()->unwithdraw(); + } }
Third thing, only redraw what is necessary (seems to be faster, but I'm not completely sure, and I hope it doesn't break anything) by replacing the deiconify function by a unwithdraw function which does only a fraction of what deiconify does:
Workspace.cc:228 - (*it)->deiconify(false, false); + (*it)->unwithdraw(); Window.hh:201 void deiconify(bool reassoc = true, bool do_raise = true); + void unwithdraw(); Window.cc:1522 +void FluxboxWindow::unwithdraw() { + if (numClients() == 0) + return; + + if (oplock) return; + oplock = true; + + bool was_iconic = iconic; + + m_blackbox_attrib.flags &= ~ATTRIB_HIDDEN; + + setState(NormalState, false); + + show(); + + oplock = false; +}
I have also tried to draw and clear windows in their general order of focusing, in replacement of the 2 first enhancements, but surprisingly it's less convincing:
Screen.cc:1211 - currentWorkspace()->hideAll(false); + int workspace = currentWorkspaceID(); // set new workspace m_current_workspace = getWorkspace(id); + FocusControl::FocusedWindows::iterator it2 = focusControl().focusedOrderList().begin(); + FocusControl::FocusedWindows::iterator it2_end = focusControl().focusedOrderList().end(); + + for (; it2 != it2_end; ++it2) { + if ((*it2)->fbwindow() && !(*it2)->fbwindow()->isIconic() && !(*it2)->fbwindow()->isStuck()) + { + if ((int)(*it2)->fbwindow()->workspaceNumber() == id) + (*it2)->fbwindow()->unwithdraw(); + if ((int)(*it2)->fbwindow()->workspaceNumber() == workspace) + (*it2)->fbwindow()->withdraw(false); + } + } - currentWorkspace()->showAll(win->fbwindow());
Full patch for previous tips
ie double click maximizes and reducing flickering.
To apply the patch, copy it in the parent of the src
folder, and enter :
patch -p0 < fluxbox.patch