|

楼主 |
发表于 2007-5-23 13:54:58
|
显示全部楼层
FvwmButtons 可能是 FVWM 中最全面的一个模块了。你可以做出任何形式的 'Dock' 和 'Panel',外加它们都能用上透明模板。Taviso 写了一篇 FvwmButtons 简介,能在 这里 找到。下面的几个配置例子能让你看到使用 FvwmButtons 的精彩要素。
第一个例子,我创建了一个透明的圆角 'Dock',包含了一个脚本用来建立一个简单的小时钟- #####
- # DockButtons
- ###########
- Style "DockButtons" !Title, !Handles, Sticky, WindowListSkip, \
- CirculateSkip, BorderWidth 0, HandleWidth 0
- Colorset 15 RootTransparent, fg rgb:00/00/00, bg average, \
- Tint white 40, bgTint white 40, RootTransparent, \
- Shape dock-mask.xpm
- Colorset 16 RootTransparent, fg rgb:00/00/00, bg average, \
- Tint white 40, bgTint white 40, RootTransparent
- DestroyModuleConfig DockButtons: *
- *DockButtons: Geometry 600x80
- *DockButtons: Colorset 15
- *DcokButtons: Rows 2
- *DockButtons: Columns 30
- *DockButtons: (1x2, Frame 0)
- *DockButtons: (4x2, Frame 0, Icon 64x64/terminal.png, \
- Action(Mouse 1) "FvwmATerm", Action(Mouse 3) "FvwmXTerm")
- *DockButtons: (4x2, Frame 0, Icon 64x64/firefox.png, \
- Action(Mouse 1) "FvwmFireFox")
- *DockButtons: (4x2, Frame 0, Icon 64x64/xmms.png, \
- Action(Mouse 1) "FvwmXmms")
- *DockButtons: (4x2, Frame 0, Icon 64x64/gimp.png, \
- Action(Mouse 1) "FvwmGimp")
- *DockButtons: (4x2, Frame 0, Icon 64x64/editor.png, \
- Action(Mouse 1) "FvwmGVim")
- *DockButtons: (8x1, Frame 0, \
- Swallow FvwmApplet-DigitalClock `FvwmScript $[fvwm_scrpt]/DigitalClock 16`)
- *DockButtons: (2x1, Frame 0, Icon 32x32/cpumon.png)
- *DockButtons: (2x1, Frame 0, Icon 32x32/memmon.png)
- *DockButtons: (2x1, Frame 0, Icon 32x32/diskmon.png)
- *DockButtons: (2x1, Frame 0, Icon 32x32/netmon.png)
- *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 。- Style "UkkostaButtons" !Title, !Handles, Sticky, WindowListSkip, \
- CirculateSkip, BorderWidth 0, HandleWidth 0
- Colorset 15 fg rgb:00/00/00, bg #e6e7d7, Shape ukkostabuttons-mask.xpm
- Colorset 16 fg rgb:00/00/00, bg #e6e7d7
- DestroyModuleConfig UkkostaButtons: *
- *UkkostaButtons: Geometry 110x580-20+20@1
- *UkkostaButtons: Colorset 15
- *UkkostaButtons: Pixmap $[fvwm_img]/buttons-bg.png
- *UkkostaButtons: Rows 40
- *UkkostaButtons: Columns 4
- *UkkostaButtons: Frame 0
- *UkkostaButtons: Font "Shadow=2:xft:Winks:Medium:pixelsize=24:minspace=False:antialias=True"
- *UkkostaButtons: (4x2, Frame 0, \
- Action(Mouse 1) 'All (Sticky Iconifiable) Iconify', \
- Title(Center) "ukkosta")
- *UkkostaButtons: (4x1, Frame 0, \
- Swallow FvwmApplet-DigitalClock `FvwmScript $[fvwm_scrpt]/DigitalClock 16`)
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/firefox.png, \
- Action(Mouse 1) "FvwmFireFox")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/terminal.png, \
- Action(Mouse 1) "FvwmXTerm", \
- Action(Mouse 2) "Exec exec pterm", \
- Action(Mouse 3) "FvwmATerm")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/editor.png, \
- Action(Mouse 1) "FvwmGVim", \
- Action(Mouse 3) "FvwmXEmacs")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/chat.png, \
- Action(Mouse 1) "FvwmTalkbox", \
- Action(Mouse 2) "FvwmIrssi", \
- Action(Mouse 3) "FvwmGaim")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/xmms.png, \
- Action(Mouse 1) "FvwmXmms", \
- Action(Mouse 2) "FvwmMixer")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/tux.png, \
- Action(Mouse 1) "FvwmRox")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/gimp.png, \
- Action(Mouse 1) "FvwmGimp", \
- Action(Mouse 2) "FvwmXpaint", \
- Action(Mouse 3) "FvwmXfig")
- *UkkostaButtons: (2x4, Frame 0, \
- Icon 48x48/x.png, \
- Action(Mouse 1) "FvwmXlock", \
- Action(Mouse 2) "Restart", \
- Action(Mouse 3) "Quit")
- *UkkostaButtons: (4x8, Frame 0, \
- Swallow FvwmPager 'Module FvwmPager')
- *UkkostaButtons: (1x2, Frame 0, \
- Icon menu/cpumon.png, \
- Action(Mouse 1) 'FvwmTop')
- *UkkostaButtons: (3x2, Frame 0, \
- Swallow(UseOld) "cpumon" `Exec exec xosview -title cpumon +cpu`)
- *UkkostaButtons: (1x2, Frame 0, \
- Icon menu/memmon.png)
- *UkkostaButtons: (3x2, Frame 0, \
- Swallow(UseOld) "memmon" `Exec exec xosview -title memmon +mem`)
- *UkkostaButtons: (1x2, Frame 0, \
- Icon menu/diskmon.png)
- *UkkostaButtons: (3x2, Frame 0, \
- Swallow(UseOld) "diskmon" `Exec exec xosview -title diskmon +disk`)
- *UkkostaButtons: (1x2, Frame 0, \
- Icon menu/netmon.png, \
- Action(Mouse 1) "Exec exec xterm -title iptraf -e 'sudo /usr/sbin/iptraf -i all'")
- *UkkostaButtons: (3x2, Frame 0, \
- Swallow(UseOld) "netmon" `Exec exec xosview -title netmon +net`)
- *UkkostaButtons: (4x4, Frame 0, \
- Swallow FvwmApplet-Sensors `FvwmScript $[fvwm_scrpt]/Sensors 11`)
- *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 悬浮于当前按钮之上,而又不受制于原来的按钮位置。如此说来,让我们看一下这组函数。- #####
- # FvwmDock Styles
- ###########
- Style FvwmDock* Sticky, NoTitle, NoHandles, BorderWidth 0, WindowListSkip, \
- CirculateSkip
- Style FvwmDock-* StaysOnBottom, FixedPosition, FixedSize
- Style FvwmDockA* StaysOnTop, FixedSize
- ################
- #
- # ButtonDock Functions. These collection of functions create
- # single icon buttons that cause the button to hover above
- # everything when the mouse is moved atop of it. To get these
- # to work it should only take copying all the five functions
- # CreateDock, EnterHandler, LeaveHandler, RestoreButton
- # and CreateActiveButton. Then call the function 'CreateDock'
- # for each button on the dock bar. The function works as follows:
- #
- # CreateDock '$0' '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'
- # $0 -> ButtonId
- # $1 -> Geometry
- # $2 -> Icon
- # $3 -> LargeIcon
- # $4 -> X offset (from upper left hand corner)
- # $5 -> Y offset (from upper left hand corner)
- # $6 -> action for Mouse 1
- # $7 -> action for Mouse 2
- # $8 -> action for Mouse 3
- # $9 -> Size of LargeIcon
- #
- ###################################
- DestroyFunc CreateDock
- AddToFunc CreateDock
- + I DestroyModuleConfig FvwmDock-$0: *
- + I *FvwmDock-$0: Geometry $1
- + I *FvwmDock-$0: Font none
- + I *FvwmDock-$0: Colorset 9
- + I *FvwmDock-$0: Frame 0
- + I *FvwmDock-$0: Padding 0 0
- + I *FvwmDock-$0: (Id D$0, Icon $2)
- + I Module FvwmButtons FvwmDock-$0
- + I AddToFunc StartFunction I Module FvwmAuto 100 -menter 'EnterHandler $0 "$2" $3 $4 $5 $6 $7 $8 $9' 'LeaveHandler $0 $2'
- DestroyFunc EnterHandler
- AddToFunc EnterHandler
- + I ThisWindow (FvwmDock-$0) ThisWindow (!FvwmDock-*) Deschedule 35
- + I ThisWindow (FvwmDock-$0) WindowId $[last_winid] (FvwmDockA$0) Deschedule 35
- + I ThisWindow (FvwmDockA$0) Deschedule 45
- + I ThisWindow (FvwmDock-$0) SendToModule FvwmDock-$0 ChangeButton D$0 Icon "shadow.png"
- + I ThisWindow (FvwmDock-$0) CreateActiveButton $0 '$1' $2 $3 $4 $5 $6 $7 $8
- # Delay ms should be longer than delay in FvwmAuto
- DestroyFunc LeaveHandler
- AddToFunc LeaveHandler
- + I ThisWindow SetEnv last_winid $[w.id]
- + I ThisWindow (FvwmDockA$0) Schedule 110 35 RestoreButton $0 $1
- + I ThisWindow (FvwmDock-$0) Schedule 110 45 RestoreButton $0 $1
- DestroyFunc RestoreButton
- AddToFunc RestoreButton
- + I SendToModule FvwmDock-$0 ChangeButton D$0 Icon $1
- + I KillModule FvwmButtons FvwmDockA$0
- DestroyFunc CreateActiveButton
- AddToFunc CreateActiveButton
- + I DestroyModuleConfig FvwmDockA$0: *
- + I *FvwmDockA$0: Pixmap none
- + I *FvwmDockA$0: BoxSize fixed
- + I *FvwmDockA$0: Frame 0
- + I *FvwmDockA$0: Font none
- + I *FvwmDockA$0: Padding 0 0
- + I *FvwmDockA$0: Rows 1
- + I *FvwmDockA$0: Columns 1
- + I ThisWindow PipeRead `echo *FvwmDockA$0: Geometry $8+$(($[w.x]$3))+$(($[w.y]$4))`
- + I *FvwmDockA$0: (Icon $2, Action(Mouse 1) '$5', Action(Mouse 2) '$6', Action(Mouse 3) '$7')
- + I Module FvwmButtons FvwmDockA$0
复制代码 你所要做的就是从 StartFunction(或者 fvwm2rc 文件)中为每个你想出现在 dock 中的图标调用 CreateDock 就行了。如你所见,上面的 CreateDock 函数有 10 个参数,它们指定了大小,图标以及你想绑定到按钮的动作。比如说,你想建一个拥有两个图标的 dock,一个在另一个的上方。你要做的就是为两个 dock 分别调用 CreateDock 函数,然后用 geometry 选项使两个恰好叠在一起。如我在 StartFunction 中加了如下两行- + I CreateDock '10' '56x56-74+62@1' '48x48/firefox.png' '64x64/firefox.png' '-20' '-30' 'FvwmFireFox' 'Nop' 'Nop' '64x64'
- + 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 让它们生效
菜单进阶 索引 更多资源 |
|