Sawfish

出自 ArchWiki

Sawfish 是一款高度可自定义的窗口管理器。它曾经是 GNOME 桌面的标准窗口管理器,但由于维护者变更,情况已不再如此。本文将向您展示如何安装和配置它以独立使用(不使用 GNOME)。

安装

安装 sawfishAUR 软件包。

启动

使用 xinit 启动 sawfish

自定义

开箱即用的 Sawfish 提供了一个菜单,可以通过在根窗口上单击鼠标中键(Mouse-2)来访问。从那里,您可以启动自定义应用程序。

如果您更改任何设置,它们将存储在 ~/.sawfish/custom 中。

主题

您可以从自定义应用程序中选择窗口主题。这里有一个小 bug:如果主题是可参数化的,则其配置窗口仅在您重启自定义应用程序后才会出现。

添加新的

创建目录 ~/.sawfish/themes/ 并在其中放入任何主题文件。您无需解压缩它们。在 Sawfish 网站上有 500 多个主题可供选择。

菜单

Arch 没有为 Sawfish 提供自动菜单生成器,但您可以使用 XFCE4 的菜单生成菜单。以下是必要的步骤

创建目录 ~/.sawfish/lisp/。这是存储自定义 Sawfish 脚本的地方;菜单将是其中之一。安装 libxslt,复制 xslt 样式表示例,并将其粘贴到名为 xfce4-menu-to-sawfish.xslt 的文件中。现在您需要一个 XFCE4 菜单。您可能已经有一个,或者您可以使用 menumaker 或 xdg_menu 生成一个。

$ mmaker -c xfce4 | xsltproc xfce4-menu-to-sawfish.xslt - > ~/.sawfish/lisp/arch-menu.jl
$ xdg_menu --format xfce4 --root-menu /etc/xdg/menus/arch-applications.menu | xsltproc xfce4-menu-to-sawfish.xslt - > ~/.sawfish/lisp/arch-menu.jl

现在您有了一个脚本 ~/.sawfish/lisp/arch-menu.jl,它定义了一个变量 arch-menu,其中包含您的应用程序列表。您需要从根菜单链接到它。您需要在 ~/.sawfishrc 中编写代码来实现这一点。因此,启动您最喜欢的编辑器,创建 ~/.sawfishrc,然后输入

;;; 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)

重启 Sawfish 以使更改生效。

菜单示例

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> &"))</xsl:text>
  </xsl:template>
</xsl:stylesheet>

附加资源