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'。 用 打开的 dock-mask.xpm
圆角的 DockButtons你应该在 DockButtons 注意到一个东西,'' 小程序。它是用 '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 显示的监视器调用 swallow 。如我的 'cpumon' 就以 "Swallow(UseOld) "cpumon" `Exec exec xosview -title cpumon +cpu`" 运行。以上所做的就是用让 FvwmButtons swallow(并使用,如果存在)这个叫 cpumon 的程序。然后启动 xosview,它被要求以 cpumon 作为标题,并打开 cpu 监控。 这里,我用上了四个监控器 cpu、内存、磁盘、网络。在按钮的最下面,我 swallow 另 一个叫 '' 的 FvwmScript,它能从 lm-sensors 命令中获取输出,并将它写入 UkkostaButtons。 这里 有张样图能让你了解这些按钮看起来会是什么样。 最后一个例子,我会与你分享一组来自 的函数,它们已被提交到 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 上滑动鼠标,它会先 用 代替当前的图标,再生成一个拥有 大图标的临时坞。下面的三张图显示了这样的效果是怎么回事的。取决于你的 cpu 速度, 这可能会有点小小的停顿,但不管怎么说我还是觉得这看起来棒极了! 最后提请注意,要让以上所有这些东西起作用都要通过 StartFunction 来设置。因 此如果你不在 StartFunction 启动时调用这些函数的话,你必须再运行 StartFunction 让它们生效 |
|