Table of Contents

Fluxbox

Fluxbox is a very light window manager, highly customizable (look, shortcuts, etc).

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