Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346657
  • 博文数量: 222
  • 博客积分: 9349
  • 博客等级: 中将
  • 技术积分: 2135
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 13:45
文章分类

全部博文(222)

文章存档

2010年(222)

分类: LINUX

2010-08-14 09:50:29


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 让它们生效

阅读(1131) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~