====== 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 ([[gentoo-portage#emerge_step-by-step_for_modifying_source|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 {{fluxbox.patch|patch}}, copy it in the parent of the ''src'' folder, and enter : patch -p0 < fluxbox.patch