LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: nico65

FVWM Beginner Guide [翻译]

[复制链接]
 楼主| 发表于 2007-5-23 13:54:58 | 显示全部楼层
FvwmButtons 可能是 FVWM 中最全面的一个模块了。你可以做出任何形式的 'Dock' 和 'Panel',外加它们都能用上透明模板。Taviso 写了一篇 FvwmButtons 简介,能在 这里 找到。下面的几个配置例子能让你看到使用 FvwmButtons 的精彩要素。

第一个例子,我创建了一个透明的圆角 'Dock',包含了一个脚本用来建立一个简单的小时钟
  1. #####
  2. # DockButtons
  3. ###########
  4. Style "DockButtons" !Title, !Handles, Sticky, WindowListSkip, \
  5.         CirculateSkip, BorderWidth 0, HandleWidth 0
  6. Colorset 15 RootTransparent, fg rgb:00/00/00, bg average, \
  7.   Tint white 40, bgTint white 40, RootTransparent, \
  8.   Shape dock-mask.xpm
  9. Colorset 16 RootTransparent, fg rgb:00/00/00, bg average, \
  10.   Tint white 40, bgTint white 40, RootTransparent
  11. DestroyModuleConfig DockButtons: *
  12. *DockButtons: Geometry 600x80
  13. *DockButtons: Colorset 15
  14. *DcokButtons: Rows 2
  15. *DockButtons: Columns 30
  16. *DockButtons: (1x2, Frame 0)
  17. *DockButtons: (4x2, Frame 0, Icon 64x64/terminal.png, \
  18.   Action(Mouse 1) "FvwmATerm", Action(Mouse 3) "FvwmXTerm")
  19. *DockButtons: (4x2, Frame 0, Icon 64x64/firefox.png, \
  20.   Action(Mouse 1) "FvwmFireFox")
  21. *DockButtons: (4x2, Frame 0, Icon 64x64/xmms.png, \
  22.   Action(Mouse 1) "FvwmXmms")
  23. *DockButtons: (4x2, Frame 0, Icon 64x64/gimp.png, \
  24.   Action(Mouse 1) "FvwmGimp")
  25. *DockButtons: (4x2, Frame 0, Icon 64x64/editor.png, \
  26.   Action(Mouse 1) "FvwmGVim")
  27. *DockButtons: (8x1, Frame 0, \
  28.   Swallow FvwmApplet-DigitalClock `FvwmScript $[fvwm_scrpt]/DigitalClock 16`)
  29. *DockButtons: (2x1, Frame 0, Icon 32x32/cpumon.png)
  30. *DockButtons: (2x1, Frame 0, Icon 32x32/memmon.png)
  31. *DockButtons: (2x1, Frame 0, Icon 32x32/diskmon.png)
  32. *DockButtons: (2x1, Frame 0, Icon 32x32/netmon.png)
  33. *DockButtons: (1x2, Frame 0)
复制代码
开始我先为 DockButtons 设置一个默认样式,并建了两个色彩模板。不同于其它色彩模板的地方在于我用了 'Shape' 选项,用该选项后它会以一张 xpm 图像的形状来描绘 button 的外观。为做到这一点,我建了个透明的 xpm 文件(如下所示),用图像的透明部分来描绘窗口(按钮)的外观。要想了解更多的内容,请看 FvwmThemes 手册页,以及查找 'Shape', 'TitleShape' 还有 'AspectShape'。

用 gimp 打开的 dock-mask.xpm


圆角的 DockButtons

你应该在 DockButtons 注意到一个东西,'Digital Clock' 小程序。它是用 'FvwmScript' 模块来实现的,这个模块可用于建立图形界面。 DigitalClock 脚本所做的仅是把 'date "+%b %e, %R"' 的输出显示到窗口上。这个脚本能接受一个参数,告诉脚本用哪个色彩模板。然后,我将这个窗口吞入(Swallow) DockButtons。这真是个好功能,因为你可以让 FvwmButtons 吞入许多程序,甚至是那些不可入坞的程序。在这里,我 swallow DigitalClock 脚本的输出,包括日期和时间,用到了发给脚本的色彩模板。

下面是我自己的 FvwmButtons,涵盖了时间,几个我最喜欢的程序的快速启动按钮,一个被吞入的 FvwmPager, xosview 系统监视器,一个从 lm-senors 获取输出的 Fvwm Script 。
  1. Style "UkkostaButtons" !Title, !Handles, Sticky, WindowListSkip, \
  2.         CirculateSkip, BorderWidth 0, HandleWidth 0
  3. Colorset 15 fg rgb:00/00/00, bg #e6e7d7, Shape ukkostabuttons-mask.xpm
  4. Colorset 16 fg rgb:00/00/00, bg #e6e7d7
  5. DestroyModuleConfig UkkostaButtons: *
  6. *UkkostaButtons: Geometry 110x580-20+20@1
  7. *UkkostaButtons: Colorset 15
  8. *UkkostaButtons: Pixmap $[fvwm_img]/buttons-bg.png
  9. *UkkostaButtons: Rows 40
  10. *UkkostaButtons: Columns 4
  11. *UkkostaButtons: Frame 0
  12. *UkkostaButtons: Font "Shadow=2:xft:Winks:Medium:pixelsize=24:minspace=False:antialias=True"
  13. *UkkostaButtons: (4x2, Frame 0, \
  14.         Action(Mouse 1) 'All (Sticky Iconifiable) Iconify', \
  15.         Title(Center) "ukkosta")
  16. *UkkostaButtons: (4x1, Frame 0, \
  17.         Swallow FvwmApplet-DigitalClock `FvwmScript $[fvwm_scrpt]/DigitalClock 16`)
  18. *UkkostaButtons: (2x4, Frame 0, \
  19.         Icon 48x48/firefox.png, \
  20.         Action(Mouse 1) "FvwmFireFox")
  21. *UkkostaButtons: (2x4, Frame 0, \
  22.         Icon 48x48/terminal.png, \
  23.         Action(Mouse 1) "FvwmXTerm", \
  24.         Action(Mouse 2) "Exec exec pterm", \
  25.         Action(Mouse 3) "FvwmATerm")
  26. *UkkostaButtons: (2x4, Frame 0, \
  27.         Icon 48x48/editor.png, \
  28.         Action(Mouse 1) "FvwmGVim", \
  29.         Action(Mouse 3) "FvwmXEmacs")
  30. *UkkostaButtons: (2x4, Frame 0, \
  31.         Icon 48x48/chat.png, \
  32.         Action(Mouse 1) "FvwmTalkbox", \
  33.         Action(Mouse 2) "FvwmIrssi", \
  34.         Action(Mouse 3) "FvwmGaim")
  35. *UkkostaButtons: (2x4, Frame 0, \
  36.         Icon 48x48/xmms.png, \
  37.         Action(Mouse 1) "FvwmXmms", \
  38.         Action(Mouse 2) "FvwmMixer")
  39. *UkkostaButtons: (2x4, Frame 0, \
  40.         Icon 48x48/tux.png, \
  41.         Action(Mouse 1) "FvwmRox")
  42. *UkkostaButtons: (2x4, Frame 0, \
  43.         Icon 48x48/gimp.png, \
  44.         Action(Mouse 1) "FvwmGimp", \
  45.         Action(Mouse 2) "FvwmXpaint", \
  46.         Action(Mouse 3) "FvwmXfig")
  47. *UkkostaButtons: (2x4, Frame 0, \
  48.         Icon 48x48/x.png, \
  49.         Action(Mouse 1) "FvwmXlock", \
  50.         Action(Mouse 2) "Restart", \
  51.         Action(Mouse 3) "Quit")
  52. *UkkostaButtons: (4x8, Frame 0, \
  53.         Swallow FvwmPager 'Module FvwmPager')
  54. *UkkostaButtons: (1x2, Frame 0, \
  55.         Icon menu/cpumon.png, \
  56.         Action(Mouse 1) 'FvwmTop')
  57. *UkkostaButtons: (3x2, Frame 0, \
  58.         Swallow(UseOld) "cpumon" `Exec exec xosview -title cpumon +cpu`)
  59. *UkkostaButtons: (1x2, Frame 0, \
  60.         Icon menu/memmon.png)
  61. *UkkostaButtons: (3x2, Frame 0, \
  62.         Swallow(UseOld) "memmon" `Exec exec xosview -title memmon +mem`)
  63. *UkkostaButtons: (1x2, Frame 0, \
  64.         Icon menu/diskmon.png)
  65. *UkkostaButtons: (3x2, Frame 0, \
  66.         Swallow(UseOld) "diskmon" `Exec exec xosview -title diskmon +disk`)
  67. *UkkostaButtons: (1x2, Frame 0, \
  68.         Icon menu/netmon.png, \
  69.         Action(Mouse 1) "Exec exec xterm -title iptraf -e 'sudo /usr/sbin/iptraf -i all'")
  70. *UkkostaButtons: (3x2, Frame 0, \
  71.         Swallow(UseOld) "netmon" `Exec exec xosview -title netmon +net`)
  72. *UkkostaButtons: (4x4, Frame 0, \
  73.         Swallow FvwmApplet-Sensors `FvwmScript $[fvwm_scrpt]/Sensors 11`)
  74. *UkkostaButtons: (4x1, Frame 0)
复制代码
这些按钮拥有了我想在桌面显示的每样东西。在最上方,我显示了电脑名和时间,跟着一组快速启动按钮。下面 swallow 一个 FvwmPager,以便我看到当前打开的是哪个窗口。在 pager 后面是一组用到xosview的监视器。Xosview 是一组能以图形条的方式显示当前状态的系统监视器。为设置它们,我首先关闭了 .Xdefaults 文件中默认的监视器。然后为每个我想要 xosview 显示的监视器调用 swallow 。如我的 'cpumon' 就以 "Swallow(UseOld) "cpumon" `Exec exec xosview -title cpumon +cpu`" 运行。以上所做的就是用让 FvwmButtons swallow(并使用,如果存在)这个叫 cpumon 的程序。然后启动 xosview,它被要求以 cpumon 作为标题,并打开 cpu 监控。这里,我用上了四个监控器 cpu、内存、磁盘、网络。在按钮的最下面,我 swallow 另一个叫 'Sensors' 的 FvwmScript,它能从 lm-sensors 命令中获取输出,并将它写入 UkkostaButtons。 这里 有张样图能让你了解这些按钮看起来会是什么样。

最后一个例子,我会与你分享一组来自 Liusd 的函数,它们已被提交到 fvwm 邮件列表,而且我已进行过改动。这些函数在 2.5.10 中工作得非常出色,尽管有点小停顿。请注意,由于这些函数已被提交过了,因此 FVWM CVS 树中的一个新补丁已经有 FvwmButtons 的 HoverIcon 和 PressIcon 支持了。我比较喜欢这个视觉效果,而不是只在鼠标滑过或点击时切换图标。原因在于,这样做实际上生成一个新的透明 FvwmButton 悬浮于当前按钮之上,而又不受制于原来的按钮位置。如此说来,让我们看一下这组函数。
  1. #####
  2. # FvwmDock Styles
  3. ###########
  4. Style FvwmDock* Sticky, NoTitle, NoHandles, BorderWidth 0, WindowListSkip, \
  5.         CirculateSkip
  6. Style FvwmDock-* StaysOnBottom, FixedPosition, FixedSize
  7. Style FvwmDockA* StaysOnTop, FixedSize
  8. ################
  9. #
  10. # ButtonDock Functions. These collection of functions create
  11. #   single icon buttons that cause the button to hover above
  12. #   everything when the mouse is moved atop of it.  To get these
  13. #   to work it should only take copying all the five functions
  14. #   CreateDock, EnterHandler, LeaveHandler, RestoreButton
  15. #   and CreateActiveButton.  Then call the function 'CreateDock'
  16. #   for each button on the dock bar. The function works as follows:
  17. #
  18. # CreateDock '$0' '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'
  19. #   $0 -> ButtonId
  20. #   $1 -> Geometry
  21. #   $2 -> Icon
  22. #   $3 -> LargeIcon
  23. #   $4 -> X offset (from upper left hand corner)
  24. #   $5 -> Y offset (from upper left hand corner)
  25. #   $6 -> action for Mouse 1
  26. #   $7 -> action for Mouse 2
  27. #   $8 -> action for Mouse 3
  28. #   $9 -> Size of LargeIcon
  29. #
  30. ###################################
  31. DestroyFunc CreateDock
  32. AddToFunc CreateDock
  33. + I DestroyModuleConfig FvwmDock-$0: *
  34. + I *FvwmDock-$0: Geometry $1
  35. + I *FvwmDock-$0: Font none
  36. + I *FvwmDock-$0: Colorset 9
  37. + I *FvwmDock-$0: Frame 0
  38. + I *FvwmDock-$0: Padding 0 0
  39. + I *FvwmDock-$0: (Id D$0, Icon $2)
  40. + I Module FvwmButtons FvwmDock-$0
  41. + I AddToFunc StartFunction I Module FvwmAuto 100 -menter 'EnterHandler $0 "$2" $3 $4 $5 $6 $7 $8 $9' 'LeaveHandler $0 $2'
  42. DestroyFunc EnterHandler
  43. AddToFunc EnterHandler
  44. + I ThisWindow (FvwmDock-$0) ThisWindow (!FvwmDock-*) Deschedule 35
  45. + I ThisWindow (FvwmDock-$0) WindowId $[last_winid] (FvwmDockA$0) Deschedule 35
  46. + I ThisWindow (FvwmDockA$0) Deschedule 45
  47. + I ThisWindow (FvwmDock-$0) SendToModule FvwmDock-$0 ChangeButton D$0 Icon "shadow.png"
  48. + I ThisWindow (FvwmDock-$0) CreateActiveButton $0 '$1' $2 $3 $4 $5 $6 $7 $8
  49. # Delay ms should be longer than delay in FvwmAuto
  50. DestroyFunc LeaveHandler
  51. AddToFunc LeaveHandler
  52. + I ThisWindow SetEnv last_winid $[w.id]
  53. + I ThisWindow (FvwmDockA$0) Schedule 110 35 RestoreButton $0 $1
  54. + I ThisWindow (FvwmDock-$0) Schedule 110 45 RestoreButton $0 $1
  55. DestroyFunc RestoreButton
  56. AddToFunc RestoreButton
  57. + I SendToModule FvwmDock-$0 ChangeButton D$0 Icon $1
  58. + I KillModule FvwmButtons FvwmDockA$0
  59. DestroyFunc CreateActiveButton
  60. AddToFunc CreateActiveButton
  61. + I DestroyModuleConfig FvwmDockA$0: *
  62. + I *FvwmDockA$0: Pixmap none
  63. + I *FvwmDockA$0: BoxSize fixed
  64. + I *FvwmDockA$0: Frame 0
  65. + I *FvwmDockA$0: Font none
  66. + I *FvwmDockA$0: Padding 0 0
  67. + I *FvwmDockA$0: Rows 1
  68. + I *FvwmDockA$0: Columns 1
  69. + I ThisWindow PipeRead `echo *FvwmDockA$0: Geometry $8+$(($[w.x]$3))+$(($[w.y]$4))`
  70. + I *FvwmDockA$0: (Icon $2, Action(Mouse 1) '$5', Action(Mouse 2) '$6', Action(Mouse 3) '$7')
  71. + I Module FvwmButtons FvwmDockA$0
复制代码
你所要做的就是从 StartFunction(或者 fvwm2rc 文件)中为每个你想出现在 dock 中的图标调用 CreateDock 就行了。如你所见,上面的 CreateDock 函数有 10 个参数,它们指定了大小,图标以及你想绑定到按钮的动作。比如说,你想建一个拥有两个图标的 dock,一个在另一个的上方。你要做的就是为两个 dock 分别调用 CreateDock 函数,然后用 geometry 选项使两个恰好叠在一起。如我在 StartFunction 中加了如下两行
  1. + I CreateDock '10' '56x56-74+62@1' '48x48/firefox.png' '64x64/firefox.png' '-20' '-30' 'FvwmFireFox' 'Nop' 'Nop' '64x64'
  2. + I CreateDock '11' '56x56-74+116@1' '48x48/xmms.png' '64x64/xmms.png' '+20' '-30' 'FvwmXmms' 'Nop' 'FvwmMixer' '64x64'
复制代码
这创建了两个 Dock,编号 10 和 11。然后我在其中一个 Dock 上滑动鼠标,它会先用 shadow.png 代替当前的图标,再生成一个拥有大图标的临时坞。下面的三张图显示了这样的效果是怎么回事的。取决于你的 cpu 速度,这可能会有点小小的停顿,但不管怎么说我还是觉得这看起来棒极了!
              



最后提请注意,要让以上所有这些东西起作用都要通过 StartFunction 来设置。因此如果你不在 StartFunction 启动时调用这些函数的话,你必须再运行 StartFunction 让它们生效
菜单进阶         索引         更多资源
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-23 13:59:19 | 显示全部楼层
最后的还有两篇没必要放在这里了。一份是有关 fvwm 的更多资源的链接,这可以从英文版的 other resources 找到,最后一篇是 GNU 自由文件协议,我没有翻译。
[size=+2]完工了
回复 支持 反对

使用道具 举报

发表于 2007-5-23 15:06:02 | 显示全部楼层
非常非常感谢nico65很不错的东西.
回复 支持 反对

使用道具 举报

发表于 2007-5-23 15:37:15 | 显示全部楼层
Post by nico65
TO diony
东西我已经发给你了, 压缩包里有我外加的 Readme-first 和 dict.txt,其实我已经把这份东西放在了我的博客上 http://cobalt65.cublog.cn,但那上面好像下载不了,也不支持直接上传 html 文件等东西。所以才想到用这种方式发在这里。不过这样做很浪费版面的,看着也不舒服。


呵呵,放在fvwm.dlike.net了。擅自改了一点儿css,加了个tarball下载链接。

过段日子可能会整理一些手里的文档,到时候会把所有linux相关的放在一起,可能链接就变了,不过到时候会先告诉你。
回复 支持 反对

使用道具 举报

发表于 2007-5-23 17:56:26 | 显示全部楼层
fvwm.dlike.net乱码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-5-23 18:14:16 | 显示全部楼层
编码是utf8的,文档里没有指明使用utf8。firefox按说会自动判断啊。
回复 支持 反对

使用道具 举报

发表于 2007-5-24 01:28:13 | 显示全部楼层
不好意思,可能我没说清楚,就首页乱码,浏览器改成utf-8也是一样。不过里面链接的内容都是现实正常的,如图,
奇怪的是浏览http://fvwm.dlike.net/index.html 的时候却又显示正常-_-!!
也可能是我系统自身的关系。感谢两位的辛勤劳动:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-5-24 05:08:20 | 显示全部楼层
顺便问个问题,关于程序缩小到桌面,显示成缩略图.
http://fvwm.dlike.net/advanced_functions.html

首先我设置了以下2个环境,并且安装了ImageMagick
  1. SetEnv fvwm_icon  /home/pics/icon
  2. SetEnv fvwm_tmp   /tmp/
复制代码


然后复制了以下内容到我的.fvwm2rc

  1. DestroyFunc Thumbnail
  2. AddToFunc Thumbnail
  3. + I Raise
  4. + I SetEnv Icon-$[w.id] $[w.iconfile]
  5. + I ThisWindow (!Shaded Iconifiable !Iconic) PipeRead \
  6.     "xwd -silent -id $[w.id] | convert -scale $$(($[w.width]/5)) -frame 1x1 \
  7.     -mattecolor black -quality 0 xwd:- png:$[fvwm_tmp]/icon.tmp.$[w.id].png \
  8.     && echo Nop"
  9. + I TestRc (Match) Test (f $[fvwm_icon]/$[w.iconfile], f $[fvwm_tmp]/icon.tmp.$[w.id].png) \
  10.     PipeRead "composite -geometry +2+4 \
  11.     $[fvwm_icon]/$[w.iconfile] $[fvwm_tmp]/icon.tmp.$[w.id].png \
  12.     $[fvwm_tmp]/icon.tmp.$[w.id].png && \
  13.     echo WindowStyle IconOverride, Icon $[fvwm_tmp]/icon.tmp.$[w.id].png || echo Nop"
  14. + I TestRc (NoMatch) WindowStyle IconOverride, Icon $[fvwm_tmp]/icon.tmp.$[w.id].png
  15. + I Iconify

  16. DestroyFunc DeThumbnail
  17. AddToFunc DeThumbnail
  18. + I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
  19. + I UnsetEnv Icon-$[w.id]
  20. + I Exec rm -f $[fvwm_tmp]/icon.tmp.$[w.id].png
复制代码

重启fvwm后没有效果,还需要设置什么地方?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-24 15:39:58 | 显示全部楼层
重启fvwm后没有效果,还需要设置什么地方
To: xinyoo
几点注意:
1. 请先看看你的机器上有没有装 imagemagick 包,这份指南中很多地方要用到的
2. 请再次完整阅读 http://fvwm.dlike.net/advanced_functions.html 全文,你会找到答案的。
3. 最好能从头看起,你就会全面了解这份东西说了些什么。
回复 支持 反对

使用道具 举报

发表于 2007-7-29 12:43:38 | 显示全部楼层
感谢楼主和diony

diony, 文档里这个链接有错误 http://fvwm.dlike.net/[color="Red"]intsall.html

应该是 http://fvwm.dlike.net/[color="Red"]install.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表