简明使用指南

Fvwm is a window manager for X11. It is designed to minimize memory consumption, provide a 3D look to window frames, and a virtual desktop.

--- The FVWM(F? Virtual Window Manager) manual

    在看这个文档之前你最好对 Xwindow 的工作机制有一定了解。知道 X server 跟 WM 有什么关系。我以后或许会增加这些内容,但是现在暂时还没有时间写这些。

  1. FVWM 是什么样子?

    这个问题是永远不会有答案的。问这个问题就像在问:“Xwindow 是什么样子的?”也许勉强可以接受的回答是:“你想让它是什么样子,它就会成为什么样子。”

    FVWM 是一个完全可定制的窗口管理器。这是FVWM不同于很多WM的一个特点,它的一切行为方式都是由一个配置文件: .fvwm2rc 决定的。没有了这个配置文件,FVWM 就成了一个废物: 鼠标和键盘几乎不起任何作用,没有菜单,没有窗口边框,没有按钮,甚至你根本不知道它其实正在运行!

    但是一旦有了配置文件,FVWM就会变得威力无比,简单的配置文件可以实现基本的功能,复杂的配置文件甚至可以模拟很多其它WM甚至 Windows XP。下面就是一个模拟 Windows XP 的例子,点击可以放大。很漂亮吧?什么时候 Windows XP 也能这么漂亮就好了 :)

    下面是一个模拟 CDE 的 dtwm 的例子:

    以后如果有人告诉你:“FVWM是那个样子。”你就可以对他说:“FVWM不一定是那个样子。” :)

    你可以在http://www.fvwm.org/screenshots/看到很多漂亮的配置。

  2. 配置文件和它的位置

    配置文件叫做 ~/.fvwm/.fvwm2rc, 在你的用户目录下。

    配置文件有点像一个脚本语言。不要怕,这种脚本语言比起 Perl, awk 简单多了。你不需要学会编程。

    写配置文件,一个很好的出发点就是随 FVWM 源码发行的 system.fvwm2rc 文件。它的位置现在在源码包的 sample.fvwmrc/system.fvwm2rc。你也可以在这里下载一份 2.5.4 的system.fvwm2rc. 把它拷贝到你的 ~/.fvwm/ 目录下面, 改名为 .fvwm2rc. 作为我们的起始点。

    注意sample.fvwmrc/ 这个目录下还有system.fvwm2rc-sample-95这样的配置文件,它们可以模拟 Windows 95 的操作方式,但是这个配置文件太大了,不适合用来修改成为自己的配置文件,你有兴趣可以自己看看,然后把里面某些你觉得很cool的东西贴到你的配置文件里。

    现在我们就来分析一下这个简单的配置文件里到底在说些什么。

  3. 什么是FVWM命令

    一个配置文件里基本上是一些命令,与其它WM不同的是,FVWM并不区分样式命令和动作命令,你可以几乎在任何情况下使用任何命令。比如命令:

    Mouse 1 A CSM Style gvim TitleAtBottom
    

    让你在任何时候按住 Ctrl-Shift-Alt 再点击鼠标左键(编号1),名叫gvim的窗口的标题栏就会跑到下面去。是不是很好玩?呵呵。这里 "Style" 是一个样式命令。

    Mouse 2 A CSM All (rxvt) MoveToDesk 0
    

    按住 Ctrl-Shift-Alt 再点击鼠标左键中键(编号2),所有的 rxvt 都会被移动到当前的桌面. 这里的 "All" 是一个可以附加条件和操作的条件动作命令。

  4. 怎样实验新的FVWM命令

    实验一个命令的作用不需要重新启动FVWM,你可以先在 .fvwm2rc 里这样定义:

    Key F3 A A Module FvwmConsole 
    

    然后启动fvwm, 这样你在任何时候按下 <F3> 键,就会启动一个叫做 FvwmConsole 的模块,你可以在里面输入Fvwm命令,回车它们就会执行,并且立即生效。这是直接与FVWM对话的方法。当然如果你想得到下面这么漂亮的 FvwmConsole, 还需要对 xterm/rxvt 的参数作一些设定。其实我的定义是:

    Key F3 A A Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 \
    	-bg gold -fg midnightblue \
    	-fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"
    

  5. DeskTopSize 2x2 以及其它常用的命令

    FVWM 可以有很多个虚拟桌面(desk)(几乎无穷多!),每个虚拟桌面可以被分成很多个页("page")。这些page相当于把你的屏幕扩大了很多倍。这一行就是设定每个desk包含多少page.

    DeskTopSize 这类语句指定了整个FVWM的某种行为方式,类似的语句还有很多。比如:

    就举这些吧……我只是举出了我有时会用到的,其实还有很多很多,你看看 FVWM 的manpage就知道了。

  6. 窗口上下文

    Move, Close, WarpToWindow ...这些命令如何知道作用于那个窗口呢?如果你因为点击了窗口上的按钮,边框,……而激发了这些命令,那么这些命令就会作用于这个窗口。或者你也可以用条件选择命令确定一个或者一批窗口进行操作,见条件命令。否则,这些命令不知道应该作用于哪个窗口,比如你在 FvwmConsole 里键入 "Close", Close 命令就没有窗口上下文,它缺省会出现一个“+”状的选择器让你选择一个窗口。如果你不希望命令在没有窗口上下文的时候自动让你选择一个窗口,那么你可以在命令前面加上 "Silent".

  7. 鼠标和键盘

    FVWM几乎可以以无穷的方式组合,来进行鼠标和键盘的操作。你还可以加入窗口上下文来进行更方便的动作。

    键盘操作的定义:

    Key Keyname Context Modifiers Function
    

    它表示:在名叫 Keyname 的键在 Context 上下文按下时,如果控制键 Modifiers 组合按下,那么执行 Function. 键盘操作后面的部分跟鼠标一样的含义,我们下面只用鼠标操作来一起说明这些命令的用途。

    鼠标操作的定义:

    Mouse Button Context Modifiers Function
    

    它表示:在鼠标编号为 Button 的键在 Context 上下文按下时,如果键盘控制键 Modifiers 组合按下,那么执行 Function.

    鼠标键编号的方法是:1 左键,2 中键,3 右键。如果你的鼠标有轮子,那么一般4表示往上滚动,5表示往下滚动。

    Context是鼠标按下的位置,它可以是:

    这些上下文可以组合。比如 "FST" 表示在frame, sidebar, 或者 title.

    Modifiers 是鼠标操作时同时的键盘控制键。M 表示 "Meta",在PC上就是Alt,S: shift, C: ctrl. 还有 A: any, N: none. 也可以组合,比如"MS" 表示同时按下Alt-Shift.

    Function 就是任意的FVWM操作了,可以是一个直接的命令,也可以是一个 FVWM 函数。

    现在我们分析一下下面这个定义:

    Mouse 3 W       SC      CloseOrNot
    
    这个定义是说,在窗口上点击鼠标右键,并且先按下 Shift-Ctrl,那么调用 CloseOrNot 这个FVWM函数。这个函数会作用与当前鼠标所在的上下文,也就是一个窗口。函数是这样定义的:
  8. 函数
    DestroyFunc CloseOrNot
    AddToFunc CloseOrNot
    + C Silent Close
    + M Nop
    

    你可以把一系列的操作有条件的加入到一个叫做“函数”的结构里,以后这个函数就可以像命令一样被使用了。

    AddToFunc 把动作附加到函数, 如果函数不存在就先创建这个函数。除了第一行,后面的行都以一个"+"号开头,这说明以下是上一个命令(AddToFunc)的继续。DestroyFunc 是为了消除以前有可能定义过的函数体。这个函数 CloseOrNot 表示:

  9. 启动函数和退出函数

    在 FVWM 启动和重新启动时都会调用 StartFunction, 而且在首次启动时会调用 InitFunction, 在重新启动时会调用 RestartFunction, InitFunction 和 RestartFunction 都是在 StartFunction 之后调用。每次重起和完全退出时都要执行 ExitFunction.

    如果你有什么程序需要在FVWM启动时启动,那么就把它加到合适的函数里面去。比如,我的配置文件有这些内容:

    DestroyFunc StartFunction
    AddToFunc StartFunction         
    + I Module FvwmButtons MainPanel
    + I Module FvwmAuto 500 Raise Nop
    + I Module FvwmAnimate
    + I Module FvwmTaskBar
    + I Exec exec xdaliclock 
    + I Exec exec xloadimage -onroot -fullscreen ~/pic/cat_20.jpg
    + I Exec exec xsim
    
    DestroyFunc InitFunction
    AddToFunc InitFunction    
    + I Exec exec xscreensaver -no-splash
    
    DestroyFunc ExitFunction
    AddToFunc ExitFunction
    + I All (xdaliclock) Close
    + I All (xscreensaver) Close
    + I All (xsim) Close
    

    可见,我在第一次启动时会启动 xscreensaver 屏幕保护程序。-no-splash 是 xscreensaver 的参数。在每次重新启动和第一次启动时都要运行 FvwmButtons, FvwmAuto, FvwmAnimate, FvwmTaskBar 几个模块和 xdaliclock,一种 morph 数字的时钟,然后用 xloadimage 放一张漂亮的图片作为桌面背景,最后启动 xsim 中文输入法。

    退出和重起时,我特意关闭了那几个启动时打开的程序,因为如果不关闭他们,像 xwin32, Exceed 这样的 Windows X server 不会 Reset.

    每个命令前的 "I" 表示 Imediately, 立即执行,联想上面提到的 "C" 和 "M", 这个操作不等待任何鼠标动作。

  10. 窗口样式

    Style 语句用于设定窗口的样式。你可以随心所欲的让不同的窗口有不同的样式。语法为:

    Style stylename options
    

    其中 stylename 是你的窗口的名字,窗口的class名字,或者窗口的resource名字。如果你不知道这些 X window 的术语,那现在就姑且当作窗口的名字好了,以后多看看 Xlib 的说明书你就会明白这些东西。窗口的名字有可能不同于程序的名字,你不知道它叫什么名字可以用 xwininfo 程序或者 FvwmIdent 模块来查询。再次说明,FvwmIdent 是模块,不能从 xterm 的命令行运行。

    stylename 里可以有 "*" 作为通配符。比如你可以说

    Style *term TitleAtLeft
    让所有以 "term" 结尾的那些窗口的标题拦都在左边。比如 "xterm", "cxterm", "qterm", ... 都会采用这种样式。

    options 是你想让满足条件的窗口以什么样的方式存在。options 的种类非常之多。比如:BorderWidth, HandleWidth, FocusFollowsMouse, TileCascadePlacement, ... 它们有的需要参数,比如 BorderWidth 7, 指定边框宽度为7个像素。有些不需要参数,比如 FocusFollowsMouse/ SloppyFocus/ NeverFocus/ ClickToFocus 指明了几种互相排斥的键盘聚焦方式。 先举几个例子,这些都是 system.fvwm2rc 里的内容:

    Style *           FocusFollowsMouse
    Style *           TileCascadePlacement
    Style "Fvwm*"       NoTitle,  Sticky, WindowListSkip
    Style "Fvwm*"       BorderWidth 2, CirculateSkipIcon, CirculateSkip
    Style "FvwmPager"   StaysOnTop
    Style "FvwmBanner"  StaysOnTop
    Style "FvwmButtons" Icon toolbox.xpm, ClickToFocus
    

    开头的两行说明所有窗口,都是鼠标移进去的时候得到键盘聚焦,鼠标移出来就失去聚焦(FocusFollowsMouse),窗口出现的时候,先试图找一个可以放下它而不挡住其它窗口的地方,如果不行再采用层叠放置的方式(TileCascadePlacement)。

    下面是说明所有名字以 "Fvwm" 开头的窗口(在这里一般都是 FVWM 内部的模块),它们都没有标题栏(NoTitle),而且是sticky,也就是说即使桌面切换,它们也一直显示在屏幕上,边框宽度为 2, CirculateSkip 说明当FVWM要求轮询窗口进行批量操作时,这些窗口不被计算在内。第3,4行说明 FvwmPager, FvwmBanner 这两个模块一直显示在最上面。最后一行说明 FvwmButtons 模块使用 toolbox.xpm 的图标,需要鼠标点击才能得到键盘聚焦(ClickToFocus)。

    总的说来,options指出了控制窗口的基本样式和政策,而不包括窗口各个部件具体的样式,它包括以下几个方面内容:

    以上每项都包含许许多多可以设定的东西。具体还是请参考 fvwm 的manpage。

  11. 菜单

    一个窗口管理器怎么能没有菜单?FVWM的菜单是可以随意自己定义的,它在任何时候出现在你想让它出现的任何地方。一个菜单首先有一个定义,然后有一个激发这个菜单的条件,菜单的样式也可以随意定制。如果使用 PipeRead 命令和一些 shell 命令组合,你就可以用菜单的方式遍历你的文件目录树,成为一个“菜单式file manager”。

  12. 按钮

    窗口的标题栏上都有一些按钮。那不是窗口程序自己的,而是WM给它们加上的。

    FVWM 可以给窗口加上最多10个按钮,它们不光可以实现基本的最大化,最小化,关闭,等功能。FVWM的灵活性允许你赋予按钮几乎任意的功能!

  13. 其它样式

    我们已经知道 Style 可以决定窗口的样式,MenuStyle 可以决定菜单的样式,ButtonStyle 按钮的样式。其实还有 CursorStyle, TitleStyle, BorderStyle. 他们决定了光标,标题栏,边框的样式。他们都有多样的语法,详细的就看 magpage 吧。这里就不照抄了。

  14. 条件命令

    All, Any, Cond, Current, Direction, Next, None, Pick, WindowId, ... 这些命令是条件选择窗口的办法,它们让你可以用非常多样的方法,来确定你的操作需要对哪一个或者哪些窗口进行。比如:

    All (Iconic) MoveToPage -1 -1
    
    把所有图标化的窗口都移动到桌面右下角的那一页。
    Key F5 A A Direction North Maximize True 0 growdown
    

    以后按 F5 就可以让当前聚焦窗口上面(North)那个窗口往下长大,直到被当前窗口挡住去路。你有时候想在VIM里抄 Acrobat Reader 里的内容,安排窗口大小的时候就可以用这招。

  15. 手写操作 (Stroke)

    你用过 EDA 软件吗?用过的话,你就可以知道鼠标动作(stroke)是多么的方便!你是否想在你的窗口管理器里也使用鼠标动作?

  16. 模块

    模块是FVWM可以扩展的奥秘。模块是通过管道跟FVWM通信的程序,它们必须由FVWM启动(fork). 也就是说,你可以从 FvwmConsole 来启动这些模块,也可以用菜单,鼠标,热键……来启动。但是就是不能从 xterm 或者 rxvt 敲入命令来启动它们。

    模块的功能可能很复杂,它们都有自己分别的 manpage. 下面几节我们介绍一些常用的模块。
  17. FvwmPager

    既然 fvwm 有很多工作区。能不能有一个东西可以方便的看到那些工作区上有哪些程序,而且可以方便的切换工作区呢?FvwmPager就是为这个目的设计的。 我的Pager是这个样子:

    FvwmPager有很多可以设定的参数,现在你可以试试这个简单的配置,这就是上面这个 pager 的配置。

    *FvwmPager: Rows 4
    *FvwmPager: Columns 1
    *FvwmPagerBack #908090
    *FvwmPagerFore #484048
    *FvwmPager:Font  -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
    *FvwmPagerHilight #cab3ca
    *FvwmPagerLabel 0 Main
    *FvwmPagerLabel 1 Internet
    *FvwmPagerLabel 2 Program
    *FvwmPagerLabel 3 Amusement
    *FvwmPager:SmallFont  -*-simsun-medium-r-*-*-12-*-*-*-*-*-*-*
    *FvwmPagerBalloons            All
    *FvwmPagerBalloonBack         Yellow
    *FvwmPagerBalloonFore         Black
    *FvwmPager:BalloonFont         -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
    *FvwmPagerBalloonYOffset      +2
    *FvwmPagerBalloonBorderWidth  1
    *FvwmPagerBalloonBorderColor  Black
    
    这些行是对 FvwmPager 的配置,模块的配置命令都是 "*" 号开始的。 在 FVWM 里启动它:
    Module FvwmPager 0 3
    
  18. FvwmButtons

    上面的Pager不错吧?不过它总是在屏幕上占那么一块位置,有没有办法让它可以在需要的时候才伸出来呢?你可以用 FvwmButtons 把FvwmPager包装起来实现这个功能。

    这里是我的一个简单的配置:

    *FvwmButtonsBack bisque3
    *MainPanel: Geometry 80x18+40+4
    *MainPanel: Back SeaGreen
    *MainPanel: (Panel(down, indicator, delay 0, steps 1) \
    		PagerPanel "Module FvwmButtons PagerPanel")
    *MainPanel: Font  -*-simsun-medium-r-*-*-16-*-*-*-*-*-*-*
    *PagerPanel: Geometry 80x352
    *PagerPanel: (Swallow FvwmPager "Module FvwmPager 0 3")
    *PagerPanel: Font  -*-simsun-medium-r-*-*-16-*-*-*-*-*-*-*
    
    这个FvwmButtons设置了一个 button 叫做 "MainPanel". 你可以用:
    Module FvwmButtons MainPanel
    
    来启动它. 它启动时是这个样子:

    挂在屏幕左上偏右一点的地方,既没有挡住左边的按钮,又不会挡住窗口的下拉菜单。点一下就会展开,展开以后就是这个样子:

    再点就会缩回去。

    FvwmButtons 可以提供的功能远远不止这些。FvwmButtons 是一个非常强大的模块。你有兴趣可以看看它的 manpage.

  19. FAQ

    这一节来看看我遇到过的一些问题。

    1. 为什么 FVWM 不能用图片作为背景?

      不熟悉Xwindow的人经常问这种问题。答案是FVWM确实不能设置复杂的高清晰图片作为背景,但是你却可以用图片作为背景。原因是:设置背景根本不是WM的职责,你需要用其它程序,比如 xloadimage, xv, ... 在根窗口上放置一幅图片,那就是所谓的“桌面背景”。你可以把它加入你的启动函数,一个 xloadimage 的例子可以在上面看到

    2. FVWM怎么锁定屏幕呢?

      你又问到一个容易混淆的问题。锁定屏幕也不是WM必须有的功能。几乎所有WM都是调用另外一个程序,比如 xscreensaver 来锁定屏幕和提供屏幕保护,然后在它们的菜单里加入对 xscreensaver 配置程序 xscreensaver-demo 的调用。看起来好像是WM提供了屏幕保护功能,让很多用户模糊了WM的职责。

      你可以把 xsreensaver 加入到FVWM的启动函数里。参看启动函数和退出函数.

    3. 为什么 FVWM 的窗口标题不能显示汉字?

      FVWM当然能显示汉字了,它是一个国际化的程序。原因在于你没有设置好汉字字体。你可以在配置文件里加入汉字字体的设定:

      Style * Font  -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
      
      simsun 是我机器上一种同时可以支持汉字和英语编码的字体,如果你的字体只有汉字编码,那么你的英文全部都会“乱码”,这时你需要在后面再加一个英文字体。比如:
      Style * Font  -cjacker-magicsong-medium-r-*-*-14-*-*-*-*-*-gb2312.1980-0,*-r-*
      

      类似的,pager,windowlist 都有自己的字体设定,你需要把它们都设置为你喜欢的中文字体。

    4. FVWM 有工具条吗?

      有。启动 FvwmTaskBar 模块就行了。你还可以把它配置的非常漂亮。这里给出一个我的简陋的配置方案。

      Style FvwmTaskBar HandleWidth 0, BorderWidth 0
      *FvwmTaskBar: UseSkipList
      *FvwmTaskBar: AutoStick
      *FvwmTaskBar: DeskOnly
      *FvwmTaskBar: Action Click1 DeiconifyRaiseAndFocus
      *FvwmTaskBar: Action Click2 Iconify On
      *FvwmTaskBar: Action Click3 Lower
      *FvwmTaskBar: MailCommand Exec exec rxvt -e mutt
      *FvwmTaskBar: 3DFvwm
      *FvwmTaskBar: StartName FVWM
      *FvwmTaskBar: StartMenu RootMenu
      *FvwmTaskBar: Font  -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
      *FvwmTaskBar: SelFont  -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
      *FvwmTaskBar: ShowTips
      *FvwmTaskBar: ClockFormat 
      *FvwmTaskBar: WindowButtonsRightMargin 20 
      
      *FvwmTaskBar: Back seagreen
      *FvwmTaskBar: Fore gold2
      *FvwmTaskBar: FocusFore cornsilk
      *FvwmTaskBar: IconBack darkgreen
      *FvwmTaskBar: IconFore white
      

      另外,FvwmButtons 模块提供了更加复杂的功能。你可以把很多小程序(xclock,biff...)和模块(FvwmIconMan)嵌入到它里面。形成一个复杂的工具条。详情请 man FvwmButtons.

    5. FVWM 能不能像 Windows 那样用 Alt-Tab 切换窗口?

      能。把这行加入 .fvwm2rc:

      Key Tab A M WindowList Root c c NoDeskSort
      
      这个绑定不知道什么时候好像成了 FVWM 缺省的。如果你不喜欢,那么加入:
      Key Tab A M -
      
      取消这个定义。
    6. FVWM 能和KDE, Gnome 一起工作吗?

      KDE 和 Gnome 都是完整的桌面系统,包括了WM和其它很多东西。FVWM 只是一个WM。FVWM可以替代 KDE 缺省的 kwin,或者 Gnome 缺省的 sawfish 成为它们的WM。

      • 只用KDE和Gnome的工具条

        很多时候 Gnome 和 KDE 的程序是跟他们的桌面系统可以分开使用的。其实你有可能只需要它们漂亮的panel。

        Gnome 的工具条叫做 gnome-panel, 在 xterm 启动一个就行了。

        KDE 的工具条叫做 kicker. 注意 KDE 有些程序需要 dcopserver, 你可以先启动 dcopserver。

        KDE 和 gnome 的panel上的pager和fvwm的FvwmPager都是相通的,所以你可以用它们任何一个来切换桌面 :)

        如果你在kde的任务条用右键选择“总在最前”可能不起作用,因为现在它们得完全听fvwm的话不过你可以给它们额外的权力,请参考fvwm manpage 的有关EWMH 的部分

      • 完全启动Gnome和KDE与FVWM一起工作

        还有些kde程序不知道用了什么通信方式,启动后就dump了。你可以用 startkde 来启动整个 KDE 系统。一般来说它们都可以与fvwm一起很好的工作。

        Gnome 的启动命令叫做 gnome-session. 它也可以完全与 fvwm 一起工作。

        这样你就可以用 fvwm 的方式来控制所有桌面系统的窗口了。嘿嘿

      看看下面这幅图,KDE 正和 fvwm 在一起。嘿嘿。点击可以放大。

      你甚至可以让 Gnome 和 KDE 同时出现。不过估计除了耍酷,没人会像这样做: