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

全部博文(222)

文章存档

2010年(222)

分类: LINUX

2010-08-14 09:49:01


函数是我最喜欢用的东西,正如你所看见的那样,我甚至为一件简单的事情而写个函数。而且还真是如此,几乎你想要程序拥有的任何功能,关键都在于是否能写出漂亮 的函数。几乎所有的高级主题部分都包含函数,因此这部分充斥着各种不同的函数。

这头两个函数来自 taviso 的 fvwm2rc 配置文件。 它们用 ImageMagick 中的工具来为 打开的窗口抓图,然后以它作为图标。第一个函数 Thumbnail 会用当前窗口的抓图 来做这个窗口的图标。

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

DestroyFunc DeThumbnail
AddToFunc DeThumbnail
+ I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
+ I UnsetEnv Icon-$[w.id]
+ I Exec rm -f $[fvwm_tmp]/icon.tmp.$[w.id].png

这些函数可用于代替 'Iconify'。Thumbnail 函数首先抓取当前窗口的图像,把 它写入一个临时文件,这个文件放在 $[fvwm_tmp] 下,因此你必须设置过这个环境 变量。然后 'Test (f $[fvwm_home]/icons/$[w.iconfile])' 会试着看看你是不是 已经为窗口设定了图标文件。仅当你用 style 命令设置时 $[w.iconfile] 才会有内 容,如 'Style "Firefox-bin" Icon 48x48/firefox.png' 会把 $[w.iconfile] 的 内容设为 48x48/firefox.png,注意我将所有的图标都放在了 $[fvwm_icon] 目录 内。如果存在这个文件,一方面函数会将两张图叠加为一张;另一方面,它会将程 序图标设置为我们刚刚创建的图标,然后图标化这个窗口。DeThumbnail 函数清除 所有东西,它会将图标变回原来的那个样子,然后删除刚才的临时图标,这样下一 次再用 Thumbnail 时就会跟第一次运行时完全一样。当窗口非图标化时,有两种方 法可以确保函数运行成功。其中之一是将 '+ I Iconify' 添加至这个函数并绑定, 这样当你非图标化一个窗口时它就会运行了。或者,我更欣赏这样,在非图标化窗 时让 FvwmEvent 模块来完成这个任务。这非常完美,因为无所谓如何实现非图标化, 这个函数总会运行一下。想这么做的话,就要像下面这样设置 FvwmEvent,然后在 StarFunction 函数中调用这个模块。

#####
# FvwmEvent
###########
DestroyModuleConfig FvwmEvent: *
*FvwmEvent: deiconify DeThumbnail

最后要提请注意的是,当你重启 FVWM 时所有图标都会回到原来的样子,而你将 不得不先来一个 deiconify 再来一次 iconify,重新让它们再变成你想要的样子。 有个方法可以避免出现这种情况,把 '+I All (Iconic) ReThumbnail' 加到 Resta rtFunction 函数中去,ReThumbnail 函数如下所示

DestroyFunc ReThumbnail
AddToFunc ReThumbnail
+ I Iconify
+ I Thumbnail

如果每样东西都设置正确,那么你的图标化窗口应该看起来像下面这两幅图那样 样图为 firefox 和 gvim

taviso 写的另一个函数是 FvwmExpose,这个函数很像 WindowList 函数。它的 作用是,用 ImageMagick 截取所有当前打开窗口的图像,然后将它们放入一个菜单, 以截取的图像作为图标。这里是份拷贝

#####
# FvwmExpose
###########
DestroyFunc FvwmExpose
AddToFunc FvwmExpose
+ I AddToMenu FvwmExposeMenu "e x p o s e" Title
+ I + DynamicPopDownAction DestroyMenu FvwmExposeMenu
+ I All (!Iconic !Shaded AcceptsFocus)\
PipeRead "echo Raise; \
xwd -silent -id $[w.id] | convert -scale $$(($[w.width]/10)) -quality 0 xwd:- \
png:$[fvwm_home]/tmp/icon.exp.$[w.id].png \
&& echo AddToMenu FvwmExposeMenu \
%$[fvwm_home]/tmp/icon.exp.$[w.id].png%\\\'\"$[w.name]\"\\\' WindowID $[w.id] WarpToWindow 50 50 \
&& echo AddToMenu FvwmExposeMenu \\\"\\\" Nop \
|| Nop"
+ I Popup FvwmExposeMenu
+ I Exec exec rm -f $[fvwm_home]/tmp/icon.exp.*

我用 alt+鼠标中键 来调用这个函数,它会弹出 FvwmExposeMenu。有张样图能让你看到菜单看起来会是什么样子


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