LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: lastart

我两年前使用的fvwm配置,给还用fvwm的人做参考,几乎所有常见/不常见的功能都实现了:)

[复制链接]
 楼主| 发表于 2010-7-10 03:34:35 | 显示全部楼层

“运行”对话框

Fvwm华丽不过是虚有其表而已,不管界面怎么变,用起来就能感到它根子里的“老”。FVWM的长处在于,操作性,想实现什么奇怪的功能都有可能,但问题是别的窗口管理器有的普通功能,你也得自己编。

喜欢Alt+F2或(Win+R)出来一个运行对话框,就写了一个,当然记住命令历史是必需的,区分FVWM的内部命令还是普通的程序也是需要的:

  1. DestroyModuleConfig FvwmForm-Run: *
  2. *FvwmForm-Run: Line left
  3. *FvwmForm-Run: Text "Run:"
  4. *FvwmForm-Run: Line left
  5. *FvwmForm-Run: Input Comm 45 ""
  6. *FvwmForm-Run: Button continue "H"
  7. *FvwmForm-Run: Command Menu CommandHistory
  8. *FvwmForm-Run: Line right
  9. *FvwmForm-Run: Selection InOrEx multiple
  10. *FvwmForm-Run: Choice ExtComm Exec on "External command           "
  11. *FvwmForm-Run: Button quit "Run" ^M
  12. *FvwmForm-Run: Command $(InOrEx) $(Comm)
  13. *FvwmForm-Run: Command StoreComm $(InOrEx) $(Comm)
  14. *FvwmForm-Run: Button quit "Cancel" ^[
  15. *FvwmForm-Run: Command Nop

  16. DestroyFunc RunHistory
  17. AddToFunc RunHistory
  18. + I DestroyMenu recreate CommandHistory
  19. + I AddToMenu CommandHistory History Title
  20. + I PipeRead `i=0;tac $HOME/.fvwm/commhistory|while read line;\
  21.         do echo AddToMenu CommandHistory "\"&$i. $line\""\
  22.         "PipeRead \'echo \\'$line\\';echo StoreComm \\'$line\\'; echo KillModule FvwmForm FvwmForm-Run\'";((i++));done`

  23. DestroyFunc StoreComm
  24. AddToFunc   StoreComm
  25. + I SetEnv RunComm $[1]
  26. + I Test (!EnvMatch RunComm calc) PipeRead `file=$[HOME]/.fvwm/commhistory;\
  27.         if ! [ -f \$\file ];\
  28.         then echo -n "">>\$\file;fi;\
  29.         add="$*";add=\$\{add\# };\
  30.         tail -n 50 \$\file|awk -v add="\$\add" '\$\0 != add && \$\0 != "" {print} END{print add}' >\$\{file}.bak;\
  31.         mv \$\{file}.bak \$\file`

复制代码


调用的热键
  1. Key R            A       4       Module FvwmForm FvwmForm-Run
复制代码

主菜单加上运动命令(图标自己找):
  1. +                       "&Run%$[MenuIcon]/run.png%"                  Module FvwmForm FvwmForm-Run
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-10 04:10:54 | 显示全部楼层

窗口按钮

标题栏的按钮功能定义:
  1. Mouse 0 1       A       Bufunc Menu MenuFvwmWindowOps2 Close
  2. Mouse 0 4       A       Bufunc CustomMaximize
  3. Mouse 0 2       A       Bufunc Close
  4. Mouse 0 5       A       Bufunc WindowShade
  5. Mouse 0 3       A       Bufunc PipeRead `echo "Pick (Maximized) DestroyWindowStyle";echo UpdateStyles;echo Resize  65 63`
  6. Mouse 0 6       A       Bufunc cusIconify
复制代码
加了Bufunc的原因是,Fvwm响应按下,如果你按了一个按钮发现按错了,你也只能接受现实了,所以我把命令改成响应点击,发现按错,把鼠标按着拉开就可以了:
  1. DestroyFunc Bufunc
  2. AddtoFunc Bufunc C $*
复制代码
窗口菜单定义:
  1. DestroyFunc FuncFvwmWindowCommon
  2. AddToFunc FuncFvwmWindowCommon
  3. + I AddToMenu $0 "$[gt.&Move]"              cMove
  4. + I AddToMenu $0 "$[gt.S&hade]"                                WindowShade
  5. #+ I AddToMenu $0 "$[gt.&Resize]"            Resize
  6. #+ I AddToMenu $0 "$[gt.R&aise]"             Raise
  7. #+ I AddToMenu $0 "$[gt.&Lower]"             Lower
  8. + I AddToMenu $0 "$[gt.&Iconify]"       IconifyAndRearrange
  9. + I AddToMenu $0 "$[gt.Ma&ximize]"      CustomMaximize
  10. + I AddToMenu $0 ""                 Nop
  11. + I AddToMenu $0 "$[gt.Stays &Top]"      Pick SetWinLev 6
  12. + I AddToMenu $0 "$[gt.Stays B&ottom]"      Pick SetWinLev 2
  13. + I AddToMenu $0 "$[gt.&FullScreen]"        Pick FuncFullScreen
  14. + I AddToMenu $0 "$[gt.Trans&parency]"      Pick Transparency
  15. + I AddToMenu $0 ""                 Nop
  16. + I AddToMenu $0 "$[gt.To Page &1]"      Pick MoveAndGotoPage 0 0
  17. + I AddToMenu $0 "$[gt.To Page &2]"      Pick MoveAndGotoPage 1 0
  18. + I AddToMenu $0 "$[gt.To Page &3]"      Pick MoveAndGotoPage 2 0
  19. + I AddToMenu $0 "$[gt.To Page &4]"      Pick MoveAndGotoPage 3 0
  20. + I AddToMenu $0 "$[gt.&Stick]"         Stick
  21. + I AddToMenu $0 ""                 Nop
  22. #+ I AddToMenu $0 "$[gt.&Delete]"            Delete
  23. + I AddToMenu $0 "$[gt.&Close]"             Close
  24. + I AddToMenu $0 "$[gt.&Destroy]"            Kill
  25. DestroyMenu MenuFvwmWindowOps2
  26. #AddToMenu MenuFvwmWindowOps2     "$[gt.Window Ops]"    Title
  27. FuncFvwmWindowCommon MenuFvwmWindowOps2
复制代码

设置窗口“置顶”,“置底”的函数,目的是实现“置顶-正常”的自动转换:
  1. DestroyFunc SetWinLev
  2. AddToFunc SetWinLev
  3. + I Pick (Layer $0) Layer 0 4
  4. + I TestRc (Match) Current Raise
  5. + I TestRc (Match) Break 1
  6. + I Pick Layer 0 $0
复制代码

将窗口转到别的“页面”(桌面):
  1. DestroyFunc MoveAndGotoPage
  2. AddToFunc MoveAndGotoPage
  3. + I GotoPage $*
  4. + I MoveToPage $*
  5. #用热键转到别的页面时自动在新页面里找窗口给焦点。
  6. #点击页面管理的那个小程序不能让新页面里的窗口获得焦点,
  7. #号称要支持变换页面时定义行为,不过当时还没实现。
  8. DestroyFunc GotoPageAndFocus
  9. AddToFunc GotoPageAndFocus
  10. + I GotoPage $*
  11. + I Current (CurrentPage,!backgroundxterm*) Break
  12. + I Prev (CurrentPage,AcceptsFocus) FlipFocus NoWarp
复制代码

转页面和移窗口到页面的热键Win+
  1. Key 1            A       4       MoveAndGotoPage 0 0
  2. Key 2            A       4       MoveAndGotoPage 1 0
  3. Key 3            A       4       MoveAndGotoPage 2 0
  4. Key 4            A       4       MoveAndGotoPage 3 0
  5. Key F1           A       4       GotoPageAndFocus 0 0
  6. Key F2           A       4       GotoPageAndFocus 1 0
  7. Key F3           A       4       GotoPageAndFocus 2 0
  8. Key F4           A       4       GotoPageAndFocus 3 0
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-7-16 22:31:14 | 显示全部楼层
写得很详细啊,我的配置是能省则省。
发现一个全屏和关机对话框跟你写的很像
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-17 04:42:18 | 显示全部楼层

Debain菜单和程序菜单

我的配置原来也很短,功能是一天天加起来的。就越写越长了,本来是一个文件(是它的默认配置文件),后来就按功能分成好几个文件了。

这个菜单就比较夸张了,呵呵。fvwm最大的毛病是,那些菜单图标大的大小的小,有的没有,有的有,很不整齐,看着很难受。所以就写一些东西来生成菜单。菜单图标大小为22x22,用imagemagic改图标:

上酸菜:呵呵
首先是在主菜单上加两个菜单项:
  1. #读取菜单文件:
  2. Read menudefs.hook Quiet
  3. Read AppMenu
  4. #添加Debian菜单(记得自己找图标配给菜单项):
  5. +                       "&Debian Menu%$[MenuIcon]/debian-logo.png%"             Popup "/Debian"
  6. #添加普通的程序菜单,就是/usr/share/applications/*.desktop里的内容,别的桌面都有的,所以Fvwm也得加一个:
  7. +                       "&Applications%$[MenuIcon]/apps.png%"             Popup "/Applications"
复制代码

FVWM的内置函数调用UpdateMenu,(可以在Run输入框里运行,或者自己定义一个菜单项/热键类):
  1. DestroyFunc UpdateMenu
  2. AddtoFunc UpdateMenu
  3. + I Exec `touch /tmp/updatemenu;update-menus --menumethod ~/.fvwm/fvwm>/dev/null; ~/.fvwm/genmenu>/dev/null;rm /tmp/updatemenu`
  4. + I Schedule Periodic 500 12345 ReadMenu 12345
  5. DestroyFunc ReadMenu
  6. AddtoFunc ReadMenu
  7. + I Test (F /tmp/updatemenu) Break 1
  8. + I Schedule 100 Deschedule $0
  9. + I Read Menu
复制代码


Debian菜单的配置文件~/.fvwm/fvwm,名叫fvwm,保存在~/.fvwm里,这个好像要装menu才有update-menus这个命令。
  1. #!/usr/bin/install-menu
  2. #I need menu-1.4!
  3. # arch-tag: 73ccd6e4-fcf8-4b3f-8672-f61ae101cab5
  4. compat="menu-1"
  5. !include menu.h
  6. !include lang.h
  7. outputencoding="LOCALE"
  8. function start($var,$com)=\
  9.             "+ "" escfirst(esc(title(),"\\""),$hotkey,"&") \
  10.             shell("~/.fvwm/createicon ""icon()"" "$com) "" " $var " " $com "\n"
  11. supported
  12.   fvwmmodule=  start("Module", $command)
  13.   fvwmother=   start("",       $command)
  14.   wm=          start("Restart",$command)
  15.   x11fvwm2=    start("Exec exec",   $command)
  16.   x11fvwm=     start("Exec exec",   $command)
  17.   x11=         start("Exec exec",   $command)
  18.   text=        start("Exec exec",   term())
  19. endsupported
  20. # Usage:
  21. #   Read /etc/X11/fvwm/menudefs.hook
  22. #   Popup /Debian
  23. # Ok, "startmenu" is a little wacky, and comes in 4 parts:
  24. # 1. If this is running for a user, then we do a DestroyMenu to clear
  25. #    out the system one. Furthermore, if we're dealing with the
  26. #    top-level /Debian menu, then add a title for it (normally done in
  27. #    system.fvwm2rc).  Of course, none of this happens if we're
  28. #    running as root to produce the system-wide menudef.hook file.
  29. # 2. We spit out an "AddToMenu /Foo/Bar/Baz" to start this menu.
  30. # 3. We add a trailing newline to the lot.
  31. startmenu=   "DestroyMenu "" replacewith($section," ","_") ""\n" \
  32.              "AddToMenu   "" replacewith($section," ","_") "" "" \
  33.                  title() "" Title Top\n"
  34. endmenu=     "\n"
  35. submenutitle= "+ "" escfirst(title(),$hotkey,"&") \
  36.            shell("~/.fvwm/createicon ""icon()"" folder") "" Popup "" \
  37.            replacewith($section," ","_") ""\n"
  38. genmenu=   "menudefs.hook"
  39. rootprefix="/etc/X11/fvwm/"
  40. #Technical note: For historical reason, userprefix treat path starting
  41. #with 2 / as absolute and with 0 or one / as relative to $HOME. This
  42. #is why I added a / before the $
  43. #userprefix="/.fvwm/"
  44. userprefix=shell("echo -n /${FVWM_USERDIR-.fvwm}")
  45. treewalk="c(m)"
  46. mainmenutitle = "Debian Menu"
复制代码

生成程序菜单有脚本~/.fvwm/genmenu:
  1. #!/bin/bash
  2. menutmp=/tmp/fvwmmenu
  3. tmpitem=$menutmp/item
  4. mkdir -p /tmp/fvwmmenu
  5. echo -n >$HOME/.fvwm/AppMenu
  6. catagories="System Office Network Utility Multimedia Game Graphics Setting Windows Other"
  7. for menu in $catagories
  8. do
  9.         (echo  "DestroyMenu "/Applications/$menu""
  10.         echo "AddToMenu "/Applications/$menu" "$menu" Title Top") >$menutmp/$menu
  11. done
  12. for item in /usr/share/applications/*.desktop /usr/local/share/applications/*.desktop ~/.gnome2/vfolders/applications/*.desktop
  13. do
  14.         if [ -f $item ]
  15.         then
  16.                 grep -q "^NoDisplay=[Tt]rue" $item && continue
  17.                 iconv -f utf-8 -o $tmpitem "$item"
  18.                 exe="`sed -n "s/^Exec=//p" $tmpitem`"
  19.                 [ "$exe" == "" ] && continue
  20.                 exe="${exe#"}"
  21.                 exe="${exe%"}"
  22.                 exe="${exe% \%[uU]}"
  23.                 bexe="${exe#/}"
  24.                 if [ "$bexe" == "$exe" ]
  25.                 then
  26.                         exepath="`find -L ${PATH//:/ } -maxdepth 1 -type f -name ${exe%% *} 2>/dev/null`"
  27.                 elif [ -f ${exe%% *} ]
  28.                 then
  29.                         exepath="${exe%% *}"
  30.                 else
  31.                         echo $item>>missing
  32.                         continue
  33.                 fi
  34.                 [ "$exepath" == "" ] && echo $item>> missing && continue
  35.                 menu=Other
  36.                 for cata in $catagories
  37.                 do
  38.                         [ "$cata" == Multimedia ] && aa=Audio || aa=$cata
  39.                         grep -q "^Categories=.*$aa" $tmpitem&& menu=$cata && break
  40.                 done
  41.                 icon="`sed -n "s/^Icon=//p" $tmpitem`"
  42.                 name="`sed -n "s/^Name=//p" $tmpitem`"
  43.                 echo "+ "&$name`$HOME/.fvwm/createicon "$icon" $exe`" Exec exec $exe" >> $menutmp/$menu
  44.         fi
  45. done
  46. appmenu="DestroyMenu "/Applications"
  47. AddToMenu   "/Applications" "Applications" Title Top
  48. "
  49. for menu in $catagories
  50. do
  51.         if ! tail -n 1 $menutmp/$menu |grep -q "^AddToMenu"
  52.         then
  53.                 cat $menutmp/$menu >> $HOME/.fvwm/AppMenu
  54.                 echo >>$HOME/.fvwm/AppMenu
  55.                 appmenu=$appmenu"+ "&$menu`$HOME/.fvwm/createicon "$menu" "folder"`" Popup "/Applications/$menu"
  56. "
  57.         fi
  58. done
  59. echo "$appmenu" >>$HOME/.fvwm/AppMenu
  60. rm -fr $menutmp
复制代码

查找并统一菜单图标大小的脚本$HOME/.fvwm/createicon:
  1. #!/bin/bash
  2. sysicondir="/usr/share/pixmaps /usr/share/icons /usr/local/share/pixmaps /usr/local/share/icons"
  3. usricondir="$HOME/.icons"
  4. menuicondir="$HOME/.fvwm/icons/22x22/Menu"
  5. com="${2##*/}"
  6. if ! [ -s /tmp/updatemenu ]
  7. then
  8.         find $sysicondir $usricondir -path "*16x16" -prune -o -type f -iname "*.*" -print > /tmp/updatemenu
  9. fi
  10. if [ "$1" == "" ]
  11. then
  12.         icon=$com
  13. else
  14.         icon="${1##*/}"
  15.         icon="${icon%.*}"
  16. fi
  17. if ! [ -f "$menuicondir/$icon.png" ]
  18. then
  19.         if [ -f "$1" ]
  20.         then
  21.                 convert "$1" -resize 22x22 "$menuicondir/$icon.png"
  22.         else
  23.                 file="`grep -F "${icon}." /tmp/updatemenu`"
  24.                 if [ "$file" == "" ]
  25.                 then
  26.                         [ "$com" != folder ] && echo -n %"$menuicondir/unknown.png"% || echo -n %"$menuicondir/folder.png"%
  27.                         exit
  28.                 fi
  29.                 file="${file%%
  30. *}"
  31.                 convert "$file" -resize 22x22 "$menuicondir/$icon.png"
  32.         fi
  33. fi
  34. echo -n %"$menuicondir/$icon.png"%
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-7-17 12:00:38 | 显示全部楼层
楼主还是上两截图看看吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-17 18:59:28 | 显示全部楼层
我一直在讲一些功能的实现,又没讲界面的配置,不知道你为什么一直想看我的截屏呢?
我都已经不用FVWM很久了。
不过为了满足你的要求,还是装了一个FVWM和一些相关的软件,给它拍几张照片。
一个是桌面,
一个是按钮框,鼠标移到屏幕右边缘一会后会升上来,上面有窗口列表、systray等东西,
一个是程序最小化后的图标,鼠标移到屏幕底边缘后会升高,
一个是程序菜单,由脚本自动生成的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2010-7-23 16:53:41 | 显示全部楼层
好像很不错,没有开启透明选项?有时间再慢慢研究,到时候有搞不明白的地方再请教楼主。
另:楼主用的什么字体?感觉有点圆。。。。。。。
FVWM不仅仅要的是功能强大,还要漂亮
回复 支持 反对

使用道具 举报

发表于 2010-7-23 17:03:02 | 显示全部楼层
另:楼主能不能把你这个文章打包附一份?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-31 15:44:02 | 显示全部楼层

配置文件

好象基本上发完了,这里把配置文件放上吧。
需要装的软件:
rox ;SystemTrayN要ROX-Clib才能运行(放在~/ROX/)
imagemagic
menu
xosview
x11-apps
建议的程序:
rox的Weather,
transset-df,(透明),
gdm。
注意事项,
1. 整个配置是针对1024x768设计的,可能在某些地方要做修改。
2. 传上来的时候删除了很多图标,请用WIN+R调出运行对话框,勾掉运行外部程序,然后运行UpadteMenu,重新生成菜单。
3. 如果哪些功能运行有问题请仔细通读、理解整个配置文件。自己做必要的修改。
[color="Red"]注意:以前的FVWM版本允许条件判定分隔为逗号",",或空格" ",但现在的版本只能用逗号做分隔,请做适当的修改。
附件是fvwm的配置文件,整个.fvwm目录,和SystemTrayN.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2010-7-31 23:31:59 | 显示全部楼层
linuxsir里的东西真不少。google了半天,又找回这里了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表