Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5607482
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: LINUX

2010-07-27 19:47:32

这里是学习fvwm记录的一些资料,
光有理论,还未实践。

学习参考网址:

//20090323
所有FVWM的配置保存在单一配置文件里,通常位于 $HOME/.fvwm2rc 或 $HOME/.fvwm/.fvwm2rc,第一步就是建立 $HOME/.fvwm 和 .fvwm2rc 空文件。



#############20090420####################
配置文件和它的位置
配置文件叫做 ~/.fvwm/.fvwm2rc, 在你的用户目录下。
写配置文件,一个很好的出发点就是随 FVWM 源码发行的 system.fvwm2rc 文件。它的位置现在在源码包的 sample.fvwmrc/system.fvwm2rc。
下载地址:

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

Key F3 A A Module FvwmConsole

启动fvwm, 这样你在任何时候按下 键,就会启动一个叫做 FvwmConsole 的模块,你可以在里面输入Fvwm命令,回车它们就会执行,并且立即生效。(第2个A参考菜单激活,可能是任何控制键的意思20090423)
##################
//20090422

实验一个命令的作用不需要重新启动FVWM,你可以先在 .fvwm2rc 里这样定义:
Key F3 A A Module FvwmConsole
然后启动fvwm, 这样你在任何时候按下 键,就会启动一个叫做 FvwmConsole 的模块.在里面输入Fvwm命令,回车它们就会执行,并且立即生效。

常用命令:

Read file. 插入另外一个文件file的内容。

Exec app. 启动一个shell,并且在里面执行"app"命令。
例如:启动一个X程序最好同时使用 exec, 比如
Exec exec rxvt

Module FvwmXxx. 启动一个叫做 FvwmXxx 的模块。必须从Fvwm fork() 出来,而不能从一个 xterm 独立启动。

ImagePath path. 指定一个路径,在配置文件里要用到的图标等文件就会到这个路径里去寻找。
比如:
ImagePath +:/usr/share/icons:/usr/share/pixmaps:
$HOME/.fvwm/icons
加号是表示以前定义过的那个 ImagePath. FVWM 可以使用 .xbm, .xpm 和 .png 格式的图标.

Move, Raise, Lower, Resize, ... 这些都是常用的操纵窗口的命令。

OpaqueMoveSize x. 如果一个窗口移动时显示内容,那么它必需占屏幕面积的 x%.

MoveToDesk, MoveToPage. 可以把任何窗口移动到指定的桌面和页面。

SnapAttraction. 设定在什么距离以内,满足什么条件的窗口就被吸附在一起。

WarpToWindow x[p] y[p]. 让鼠标移动到窗口范围以内。x,y是在窗口内的坐标,用百分比表示。后面如果有后缀"p", 就用像素来表示。

IgnoreModifiers. 你可以忽略某些键盘控制键。这将影响到你的鼠标和键盘热键定义。

DesktopName desk name. 定义第desk号桌面的名字叫 name.

Scroll. 移动你在桌面上的 viewport, 这样你可以把桌面当成一个整体来浏览。看到很大的范围。

Nop. 不操作,在有些时候需要用它来占位。

PipeRead. 从一个外部命令得到输入。这可以用来根据你的系统构造许多非常高级的控制方式。其中一种叫做“菜单式文件管理器”。

SetEnv. 设置FVWM的环境变量。

------------
键盘操作的定义:

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

鼠标操作的定义:

Mouse Button Context Modifiers Function

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

    * R(Root Window) 根窗口
    * n (n 是0...9 之间的一个数)。第 n 号窗口按钮。按钮是这样编号的:
      1 3 5 7 9     0 8 6 4 2
      左边是奇数右边是偶数, 外面的大中间的小。
    * T(Title)标题栏
    * S(Sidebar)也就是边框. 也可以用 '[', ']', '-' , '_' 分别表示左,右,上,下的边框。
    * F(Frame)就是用来resize的那四个角落. 也可以用 '<', '^', '>' and 'v' 分别表示左上,右上,右下,左下的角落。
    * W(Working Area) 应用程序窗口工作区域
    * I(Icon window) 图标化的窗口。

这些上下文可以组合。比如 "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函数。
-----------------
函数举例:
DestroyFunc CloseOrNot
AddToFunc CloseOrNot
+ C Silent Close
+ M Nop

AddToFunc 把动作附加到函数, 如果函数不存在就先创建这个函数。后面的行都以一个"+"号开头,这说明以下是上一个命令(AddToFunc)的继续。DestroyFunc 是为了消除以前有可能定义过的函数体。
    * 如果是一个鼠标点击(C), 那么关闭这个窗口(Close), 但是如果现在不是在窗口上下文,也就是说,函数调用的时候没有一个确定的目标,那么不进行操作,而不是出现一个"+"字瞄准器让用户选择窗口。 这就是 "Silent" 的含义。
    * 如果鼠标点下去之后移动了,也就是“拖动”(M),那么不进行操作。


启动函数和退出函数
在 FVWM 启动和重新启动时都会调用 StartFunction, 而且在首次启动时会调用 InitFunction, 在重新启动时会调用 RestartFunction, InitFunction 和 RestartFunction 都是在 StartFunction 之后调用。每次重起和完全退出时都要执行 ExitFunction.
如果你有什么程序需要在FVWM启动时启动,那么就把它加到合适的函数里面去。比如加到StartFunction中去(和上面的例子形式一样)。
########20090423
(接上)
每个命令前的 "I" 表示 Imediately, 立即执行,联想上面提到的 "C" 和 "M", 这个操作不等待任何鼠标动作。
--------
窗口样式
Style 语句用于设定窗口的样式。
语法为:
Style stylename options
stylename就姑且当作窗口的名字好了(有 "*" 作为通配符),以后多看看 Xlib 的说明书你就会明白这些东西。
可以用 xwininfo 程序或者 FvwmIdent 模块来查询窗口的名字(FvwmIdent 是模块,不能从 xterm 的命令行运行)。
例如:
Style *term TitleAtLeft
让所有以 "term" 结尾的那些窗口的标题栏都在左边。

options 是你想让满足条件的窗口以什么样的方式存在。
ptions 的种类非常之多。比如:BorderWidth, HandleWidth, FocusFollowsMouse, TileCascadePlacement, ... 它们有的需要参数,比如 BorderWidth 7, 指定边框宽度为7个像素。有些不需要参数,比如 FocusFollowsMouse/ SloppyFocus/ NeverFocus/ ClickToFocus 指明了几种互相排斥的键盘聚焦方式。例如:
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指出了控制窗口的基本样式和政策,而不包括窗口各个部件具体的样式,它包括以下几个方面内容:
    * 窗口聚焦方式。是跟随鼠标(FocusFollowsMouse),还是需要点击才聚焦(ClickToFocus)...
    * 窗口标题栏。是否给窗口加上标题拦?如果加上,是放在左边,上边,还是下边?注意这里也不是设定具体标题样式的地方,参看 TitleStyle.
    * 窗口应该显示哪些按钮。FVWM可以为每个窗口设定最多10个按钮,但是你通常用不到10个,这样你可以设定对于某一个程序那些按钮应该出现。注意这里也不是设定按钮样式的地方,参看 ButtonStyle.
    * 窗口边框样式。边框宽度,handle(就是边框角上那个用来resize的东东)的宽度,边框被鼠标按住的时候是否陷下去?...
    * 窗口图标。用那个图标作为窗口iconify时候的图标?
    * 窗口最大化,移动,改变大小操作时的样式。是显示窗口内容还是只显示一个“橡皮框”?还是让尺寸小于某个值的窗口才在拖动时显示内容?...
    * 窗口放置策略。窗口出现的时候,是层叠放置,最小遮挡放置,还是……?
    * 是否允许程序自己放置自己?这是一个政策问题,有些窗口程序启动时会自己选择一个位置出现,但是你可能会发现你不喜欢它那样做,你可以设定NoPPosition, 不允许那个程序自作聪明。
    * 对瞬时窗口(transient window)的策略。transient window 是指类似弹出菜单,对话框之类的窗口。当它们出现的时候,你是否想给它们也加上标准的边框?
    * 高级特性。还有很多很多选项比如是否允许窗口 backing store,这些如果你还不理解现在暂时不用管它。
以上每项都包含许许多多可以设定的东西。具体还是请参考 fvwm 的manpage。

--------------
菜单
菜单是由AddToMenu命令定义的,比如:
DestroyMenu RootMenu
AddToMenu RootMenu    "Root Menu"    Title
+            "&xterm%mini.display.xpm%"    Exec exec xterm
+            "&Rxvt%mini.monitor.xpm%"    Exec exec rxvt
+            "&Big Rxvt"    Exec exec rxvt -geometry  78x43
+            ""        Nop
+                       "&Programs"      Popup ProgramsMenu
+                       "&Utilities"     Popup Utilities
+            ""        Nop
+                       "Re&fresh Screen"   Refresh
+                       "Re&capture Screen" Recapture
+            ""        Nop
+                       "&Lock"         Exec exec xscreensaver-command -lock
+            "&Exit Fvwm%mini.exit.xpm%"    Popup Quit-Verify

除了第一行,后面的行都以一个+号开头,这说明以下是上一个命令的继续。这样我们定义了一个菜单,它的名字叫 "RootMenu", 它有一个标题叫"Root Menu", 里面有一些程序。当我们选中 "XTerm" 时,会使用FVWM 的 Exec 命令启动一个shell,这个shell马上会执行"exec xterm", 也就是启动一个 xterm。空字串"" 表示在菜单里画一条分隔线。Popup 可以弹出子菜单,子菜单也是用同样的方法定义的。"&"后面的那个字母会变成键盘的热键而被加上下划线,"%"括起来的是图标文件的名字,你需要设置 ImagePath 指向图标文件所在的目录。你还可以在菜单里加入侧面图标,等等等等。
用:
DestroyMenu RootMenu
就可以把刚才那个 "RootMenu" 菜单消灭掉。

---------
菜单的激活
这个菜单在什么情况下出现?这个问题是需要你自己来决定.
例如:
Mouse 1 R       A       Menu RootMenu Nop
意思是:“当鼠标(Mouse)左键(1)在根窗口(R)上点击,同时有任何控制键(A)按下,这个时候显示叫做 RootMenu 的菜单。”
又:
Mouse 3 A       MC      Menu RootMenu Nop
这样,当右键(3) 在任何地方(A)点击, 同时有Alt(M)和Ctrl(C)按下,那么弹出名叫 "RootMenu" 的菜单。
上面的 "Nop" 表示的是鼠标在菜单上进行双击时的操作。我定义为不操作。另外 Menu 还可以随意定义菜单出现的位置,详细请看 fvwm manpage。

---------
菜单的样式

#####################20090424#############################
(接上)
菜单的样式是由 MenuStyle 定义的,例如:

MenuStyle * MWM
MenuStyle * PopupDelayed, PopupDelay 160, Animation, TitleWarp
MenuStyle * Foreground gold, Background gray40
MenuStyle * ActiveFore White
MenuStyle * Font  -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
MenuStyle * MenuFace VGradient 64 darkgray MidnightBlue

这里规定:所有的菜单,使用 mwm 的行为方式,弹出子菜单延时 160 ms,子菜单弹出时如果靠近屏幕边沿放不下,那么菜单整体移动使得子菜单刚好能弹出,前景色gold,背景色 gray40, 活动的项目(就是鼠标正在它上方的时候)前景色变为白色,菜单使用字体 -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*, 背景是垂直的梯度颜色,一共64阶,从 darkgray 变化到 MidnightBlue.

---------
动态菜单定义
用 PipeRead 来构造一个动态菜单。
举例:
AddToMenu HomeDirMenu
    PipeRead 'for i in $HOME/prog/*.c; \
    do echo "+ $i Exec xterm -e vi $i"; done'
解释:激发这个菜单 HomeDirMenu, 就会出现你主目录/prog下的所有C程序文件的列表,当你点击其中一个就会启动vi来编辑这个C程序。
---------
按钮
窗口的标题栏上都有一些按钮,是WM给它们加上的,FVWM 可以给窗口加上最多10个按钮.
标题栏上按钮编号:
13579     08642
左边是奇数右边是偶数, 外面的大中间的小。
---------
按钮功能定义
按钮的功能只不过是把鼠标与按钮号码组合在一起。 例如:

#####################20090425##############################
(接上)
Mouse 1 4       A       Iconify
Mouse 1 6       A       Close
Mouse 3 2       A       Maximize-Func2

其中 Maximize-Func2 是system.fvwm2rc 里一个函数:

DestroyFunc Maximize-Func2    
AddToFunc Maximize-Func2    "M" Maximize     100 0
+                "C" Maximize     80 0
+                "D" Maximize     100 100

如果鼠标右键在“最大化”按钮上点击(C)那么高度增长为屏幕的 80%, 宽度不变。如果按下鼠标右键后有拖动(M), 那么高度增长为屏幕高度(100%), 宽度不变。如果双击(D), 就是一般的最大化。
-----------------
按钮样式
按钮的样式是用ButtonStyle定义的,例如:
ButtonStyle All -- UseTitleStyle
ButtonStyle All ActiveDown VGradient 8 palevioletred black
ButtonStyle 6 16 20x20@1 30x20@1 50x40@1 70x20@1 80x20@1 80x30@0 \
    60x50@0 80x80@0 70x80@0 50x60@0 30x80@0 20x80@0 \
    20x70@0 40x50@1 20x30@0 20x20@1

右边两个按钮的图案是系统缺省的,"X"形按钮是下面第三句话画出来的。这种绘图语句非常简单。ButtonStyle 之后的数字是按钮编号,后面一个数子表示一共有多少笔画。后面的XxY@C都是笔画的内容,XxY是坐标, 坐标都是用百分比表示的。@C 表示颜色, C是一个数字,0 表示阴影色,1 是高亮色,2 是背景色,3 是前景色,4 是移动光标而不画线。
第二个语句 "ActiveDown VGradient 8 palevioletred black" 设定了所有按钮按下去还没有松开鼠标时候的样式,是一个颜色梯度。
------------------
条件命令

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 里的内容,安排窗口大小的时候就可以用这招。

手写操作
########################20090426#############################
(接上)
如果你的FVWM窗口管理器编译进了 libstroke, 你就可以使用鼠标动作操纵程序。你可以在  得到 libstroke. 这里不多说了。

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

......
模块的配置命令都是 "*" 号开始的
......至此吧。

man fvwm快速浏览到1400行。
man fvwm快速浏览到2700行。
man fvwm快速浏览完毕。
阅读(1555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~