Sawfish

Related articles
Window manager
Sawfish is a highly customizable
window manager
. Formerly it has been the standard Window manager of the GNOME desktop, but because of a change of maintainership this is no longer true. This article will show you how to install and configure it for standalone use (without GNOME).
Installation
Install
the
sawfish
AUR
package.
Starting
Start
sawfish
with
xinit
.
Customization
Out-of-the box Sawfish provides a menu accessible by clicking Mouse-2 (middle button) on the root window. From there, you can launch the customization app.
If you change any settings, they are stored in
~/.sawfish/custom
.
Themes
You can select a window theme from the customization app. There is a small bug: if the theme is parametrizable, its configuration window will only appear after you restart the customization app.
Adding new
Create the directory
~/.sawfish/themes/
and drop there any theme files. You do not need to uncompress them. There are 500+ themes to choose from in the
Sawfish site
.
Menus
Arch does not provide an automatic menu generator for Sawfish, but you can generate the menus using the XFCE4 ones. Here are the necessary steps:
Create the directory
~/.sawfish/lisp/
. This is where custom Sawfish scripts are stored; the menu will be one of them.
Install
libxslt
, copy the
xslt stylesheet example
, paste it into a file named
xfce4-menu-to-sawfish.xslt
.
Now you need a XFCE4 menu. You may have one already or you can generate one with menumaker or xdg_menu.
If want to use
menumaker
:
$ mmaker -c xfce4 | xsltproc xfce4-menu-to-sawfish.xslt - > ~/.sawfish/lisp/arch-menu.jl
If you want to use
archlinux-xdg-menu
:
$ xdg_menu --format xfce4 --root-menu /etc/xdg/menus/arch-applications.menu | xsltproc xfce4-menu-to-sawfish.xslt - > ~/.sawfish/lisp/arch-menu.jl
Now you have a script
~/.sawfish/lisp/arch-menu.jl
that defines a variable
arch-menu
with a list of your applications. You need to link to it from the root menu. You need to write the code for that to happen in
~/.sawfishrc
. So, start your favorite editor, create
~/.sawfishrc
, and type:
;;; sawfish configuration file
; 1. Load defaults
(require 'sawfish-defaults)
; 2. Load autogenerated arch-menu
(require 'arch-menu)
; 3. Replace Sawfish's apps-menu with ours
(setq apps-menu arch-menu)
Restart Sawfish to effect the changes.
Menu example
xfce4-menu-to-sawfish.xslt
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <xsl:param name="terminal">urxvt</xsl:param>
  <xsl:template name="indent">
    <xsl:text>
</xsl:text>
    <xsl:for-each select="ancestor-or-self::*">
      <xsl:text>  </xsl:text>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="/">
    <xsl:text>;;; Arch applications menu for Sawfish, generated from xfce4 menu
(defvar arch-menu nil)
(setq arch-menu '(</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>))
</xsl:text>
  </xsl:template>
  <xsl:template match="menu[.//app]">
    <xsl:call-template name="indent"/>
    <xsl:text>("</xsl:text>
    <xsl:value-of select="@name"/>
    <xsl:text>"</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>)</xsl:text>
  </xsl:template>
  <xsl:template match="app">
    <xsl:call-template name="indent"/>
    <xsl:text>("</xsl:text>
    <xsl:value-of select="@name"/>
    <xsl:text>" (system "</xsl:text>
    <xsl:if test="@term='true'">
      <xsl:copy-of select="$terminal"/>
      <xsl:text> -e </xsl:text>
    </xsl:if>
    <xsl:value-of select="@cmd"/>    
    <xsl:text> &amp;"))</xsl:text>
  </xsl:template>
</xsl:stylesheet>
Additional resources
Sawfish wiki
- Official website