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

全部博文(222)

文章存档

2010年(222)

分类: LINUX

2010-08-14 09:49:43


在 FVWM 中菜单是个有用的工具,可以动态生成。上一页中的 FvwmExpose 函数就是 个榜样。能从脚本中生成 FVWM 菜单是件很美妙的事情,之所以这么说是因为你能基于 目录中的墙纸创建一个菜单,如上面演示过的。或者你可以创建一个菜单列出目录及其 子目录中的所有内容。想看更多有关这一内容的信息可以找随 FVWM 一起发行的 fvwm-menu-directory 和 fvwm-menu-headlines 脚本的手册页来看。也可以在 FVWM 手册页中 查找 MissingSubmenuFunction, DynamicPopupAction 和 DynamicPopdownAction。

我选择的发行版是 。随 debian 一同发行的 有个好东西 'menu' 包,这个包用于生成菜单。FVWM 的 debian 包附带了一个脚本, 它能利用这个工具生成你在 debian 上已安装的程序的菜单。我搞到这个脚本并进 行了修改,使之符合我的喜好,用它在我的桌面上生成一个 DebainMenu 菜单。如 果你有 debian 且对此也有兴趣,你需要抓得以下三个文件: , 以及 。然后,你必须将这些文 件放入 $[fvwm_scrpt] 目录。接下来,你还要把以下函数添加至 fvwm2rc 文件

#####
# DebianMenu
###########
DestroyFunc BuildDebianMenu
AddToFunc BuildDebianMenu
+ I Exec if [ -f "$[fvwm_home]/DebianMenu" ] then rm $[fvwm_home]/DebianMenu fi
+ I PipeRead 'update-menus --menumethod $[fvwm_scrpt]/fvwm_menu; \
cat $[fvwm_home]/DebianMenu'

利用 menu 包这个函数创建了一个文件叫 $HOME/.fvwm/DebianMenu,但如果你 用了其它路径作为 $[fvwm_home],你必须对 fvwm_menu 脚本做些小改动。然后函 数 cat 文件并用这个文件创建 DebianMenu。我就做了这些,而当菜单需要更新 时,你得随时运行 BuildDebianMenu。但更好的方法是,你只要在启动时用 'Read $[fvwm_home]/DebianMenu' 包含这个菜单就行了。要显示菜单的话,只要用它加入 FvwmRootMenu 并加上 'Popup DebianMenu' 就可以了。

下一个例子,我修改了 fvwm-menu-directory 用于创建我自己的 MediaMenu 菜 单显示我的音乐列表。我建议你先看看 fvwm-menu-directory 和 fvwm-menu-headl ines 的手册页。下面是一个改动过的  版本。我给脚本加入了两条重要特性。第一条,它会为任意 目录找一个叫 [directory_name].png 的文件,如果找到了就会把它作为目录在菜 单中的图标,以及目录生成的子菜单的标题。伴随这一特性,我还设置了这个东西, 你可以忽略所有 .png 文件并不在菜单中列出它们。我添加的第二条特性是,仅列 出目录的部分内容,这样菜单不会变得太大。在我详细解释它的实现方法前,先看 下 FuncFvwmMenuDirectory,它被用于生成这些函数以及用于保存它们的 'MediaMe nu'

DestroyFunc FuncFvwmMenuDirectory
AddToFunc FuncFvwmMenuDirectory
+ I PipeRead '$[fvwm_scrpt]/fvwm-menu-directory --title "%d" --dir "$0" \
--links --command-file "exec xmms \\"%f\\"" \
--command-title "exec xmms \\"%d\\"" \
--icon-title "$0.png" --icon-file "menu/notes.png" \
--exclude ".png"'

#####
# MediaMenu
###########
DestroyMenu MusicMenu
AddToMenu MusicMenu "Music" Title
AddToMenu MusicMenu MissingSubmenuFunction FuncFvwmMenuDirectory
+ "Artists A-B%menu/music.xpm%" Popup /home/music/albums/artists|[14AB]
+ "Artists C-G%menu/music.xpm%" Popup /home/music/albums/artists|[CDEFG]
+ "Artists H-K%menu/music.xpm%" Popup /home/music/albums/artists|[HIJK]
+ "Artists L-O%menu/music.xpm%" Popup /home/music/albums/artists|[LMNO]
+ "Artists P-S%menu/music.xpm%" Popup /home/music/albums/artists|[PQRS]
+ "Artists T-Z%menu/music.xpm%" Popup /home/music/albums/artists|[TUVWXYZ]
+ "Unsorted%menu/music.xpm%" Popup /home/music/albums/unsorted
+ "Assorted Music%menu/music.xpm%" Popup /home/music/assorted
+ "Collections%menu/music.xpm%" Popup /home/music/albums/collections
+ "Soundtracks%menu/music.xpm%" Popup /home/music/albums/soundtracks

MediaMenu 的实现方法是,先把 FuncFvwmMenuDirectory 设为 MissingSubmenu Function。这样做了以后,当你想弹出一个不存在的子菜单时,它会发送子菜单名 到 FuncFvwmMenuDirectory。然后函数会生成那个子菜单使之弹出。FuncFvwmMenuD irectory 的实现方法是,它会显示带有项目首字母的目录名。如,'Popup /home/music/albums/artists|[CDEFG]' 只会列出在 /home/music/albums/artists 中以 C, D, E, F 或者 G 打头的文件或目录。 有张样图


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