LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 8082|回复: 65

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

[复制链接]
发表于 2010-7-1 03:43:30 | 显示全部楼层 |阅读模式
原来用了大约三年的fvwm, 后来因为毕业,更换电脑,再加上fvwm实在不现代,而且有一个超级基本的功能它都实现不了,所以就决定不用了。
这里主要给出我定义的函数,几乎所有功能的实现都在里面,当然因为时间久远,有些可能已经不工作了:
1,全屏显示,
2,覆盖系统函数的默认行为,
3,显示桌面
6,临时升起某些窗口,会自动降低,用于按钮之类的东西,
9,运行fvwm,注销/关机定义,
11,“运行” 对话框,
12,窗口按钮,
14,Debain菜单和程序菜单,
[color="Red"]注意:以前的FVWM版本允许条件判定分隔为逗号",",或空格" ",但现在的版本只能用逗号做分隔,请做适当的修改。
1,全屏显示:
  1. DestroyFunc FuncFullScreen
  2. AddtoFunc FuncFullScreen
  3. + I Current (State 0) Fullscreen-Stop
  4. + I TestRc Current (Maximizable) Fullscreen-Start
  5. DestroyFunc Fullscreen-Start
  6. AddtoFunc Fullscreen-Start
  7. + I WindowStyle NoTitle,HandleWidth 0,FixedSize,FixedPosition
  8. + I Current (!Maximized) Maximize
  9. + I ResizeMaximize 100 100
  10. + I State 0 true
  11. DestroyFunc Fullscreen-Stop
  12. AddtoFunc Fullscreen-Stop
  13. + I DestroyWindowStyle
  14. + I State 0 false
  15. + I Maximize
复制代码
结合下面热键实现,按win键+f当前窗口全屏显示,再按一下取消全屏:
  1. Key F            A       4       FuncFullScreen
复制代码
 楼主| 发表于 2010-7-1 04:00:24 | 显示全部楼层

改变窗口管理的默认行为

2,改变窗口管理的默认行为
这是一个大工程,有些可能因为版本的升级已经不再工作。
这些函数要由别的事件触发才会起作用。
  1. #自定义移动窗口,如果窗口最大化则先正常化再移动
  2. DestroyFunc cMove
  3. AddtoFunc cMove
  4. + I Pick (FixedPosition) Break
  5. + I Pick (Maximized) CustomMaximize
  6. + I TestRc (Break) WarpToWindow 50 12p
  7. + I Move
  8. #自定义最大化,尝试记录窗口的正常状态时的大小和位置,
  9. #以期窗口退出再次运行时可以恢复窗口的最大化状态和普通状态。
  10. DestroyFunc CustomMaximize
  11. AddToFunc   CustomMaximize
  12. + I ThisWindow (Iconic) IconifyAndRearrange
  13. + I ThisWindow (Shaded) WindowShade
  14. + I TestRc (Match) Break 1
  15. + I ThisWindow (Maximized) PipeRead\
  16.         "echo DestroyWindowStyle;\
  17.         echo UpdateStyles;\
  18.         echo ResizeMove frame \\$\\[w-$[w.id]\\]p \\$\\[h-$[w.id]\\]p\
  19.                                          \\$\\[x-$[w.id]\\]p \\$\\[y-$[w.id]\\]p"
  20. + I TestRc (Match) Break 1
  21. + I ThisWindow SetPos
  22. + I Maximize $*
  23. + I WindowStyle FixedSize
  24. DestroyFunc SetPos
  25. AddToFunc SetPos
  26. + I SetEnv w-$[w.id] $[w.width]
  27. + I SetEnv h-$[w.id] $[w.height]
  28. + I SetEnv x-$[w.id] $[w.x]
  29. + I SetEnv y-$[w.id] $[w.y]
  30. #自定义的获取焦点函数,获取焦点的同时把窗口移到当前的桌面(页面)
  31. DestroyFunc cFlipFocus
  32. AddToFunc cFlipFocus
  33. + I FlipFocus $*
  34. + I MoveToPage $[page.nx] $[page.ny]
  35. #自定义图标化窗口,记住窗口当前所处的高度(底部/正常/置顶),
  36. #因为我的默认是把图标化的窗口置底,鼠标碰桌面底边是所有图标升起,
  37. #这就改变了原因的高度,所有有必要记录原来的状态。
  38. #前两行可以实现用缩略图代替图标,不过因为是convert处理出来的有点慢。
  39. DestroyFunc cusIconify
  40. AddToFunc   cusIconify
  41. #+ I Test (EnvIsSet Icon-$[w.id]) DeThumbnail
  42. #+ I TestRc ThisWindow (!Iconic) Thumbnail
  43. + I Pick (!Iconic) SetEnv layer-$[w.id] $[w.layer]
  44. + I Iconify $*
  45. + I Pick (Iconic) Layer 0 2
  46. + I TestRc PipeRead `echo Layer 0 \$[layer-$[w.id]];echo UnsetEnv layer-$[w.id]`
  47. DestroyFunc Thumbnail
  48. AddToFunc   Thumbnail
  49. + I Raise
  50. + I SetEnv Icon-$[w.id] $[w.iconfile]
  51. + I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead \
  52.     "import -resize 128x96 -window $[w.id] -silent /tmp/.fvwm_thumbnails/icon.tmp.$[w.id].png \
  53.     && echo WindowStyle IconOverride, \
  54.     Icon /tmp/.fvwm_thumbnails/icon.tmp.$[w.id].png \
  55.     || echo Nop"
  56. DestroyFunc DeThumbnail
  57. AddToFunc DeThumbnail
  58. + I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
  59. + I UnsetEnv Icon-$[w.id]
  60. + I Exec rm -f /tmp/.fvwm_thumbnails/icon.tmp.$[w.id].png
  61. #改变默认WindowListFunc,实现切换窗口不改变鼠标位置,取消窗口图标化,取消窗口卷起状态。
  62. #FVWM最让我不能忍受的地方就是这里,
  63. #Alt-Tab实现切换窗口,鼠标居然一直要跟着那个菜单走,真是超级蠢
  64. DestroyFunc WindowListFunc
  65. AddToFunc WindowListFunc
  66. + I cusIconify off
  67. + I cFlipFocus NoWarp
  68. + I WindowShade False
  69. + I Raise
  70. #自定义kill,因为有时候窗口死掉,用它默认的杀死函数的时候只是窗口没有,进程还在运行。
  71. DestroyFunc Kill
  72. AddtoFunc Kill
  73. + I Pick Piperead "id="`xprop -id $[w.id]|sed -n '/_NET_WM_PID/s/.*\ //p;/WM_CLIENT_MACHINE/s/.*\ //p'`";\
  74. [ "$${id%\\"$$HOSTNAME\\"}" != "$${id}" ]\
  75. && [ "$${id%\\"$$HOSTNAME\\"}" != "" ]\
  76. && info=`ps -p $${id%%\\"*} -o pid,cmd|tail -n 1`\
  77. && kill $${id%%\\"*}\
  78. && echo $${info} $[w.id] killed>&2\
  79. ||(echo Destroy && echo No PID found $[w.id] Destroyed >&2)"
  80. #重新定义图标化(最小化)窗口的行为,每次都要重排图标。
  81. DestroyFunc IconifyAndRearrange
  82. AddToFunc IconifyAndRearrange
  83. + I All (Iconic) Layer 0 4
  84. + I cusIconify
  85. + I Pick (Iconic) Break
  86. + I WindowShade False
  87. + I All (CurrentPage, Iconic) PlaceAgain Icon
  88. DestroyFunc IconifyOff
  89. AddToFunc IconifyOff
  90. + I Pick (Iconic) IconifyAndRearrange
  91. + I Pick cFlipFocus NoWarp
  92. + I Pick Raise
  93. + I WindowShade False
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-1 04:07:39 | 显示全部楼层

显示桌面

这里显示桌面的函数,因为在图标化窗口前要记住窗口当前的状态和窗口列表的顺序,以便恢复所以比较麻烦。
  1. DestroyFunc ShowDesktop
  2. AddToFunc   ShowDesktop
  3. + I All (CurrentPage, !Iconic,Iconifiable) ThisWindow State 1 True
  4. + I TestRc (Match) All (CurrentPage, Iconic) ThisWindow State 1 False
  5. + I All (CurrentPage, !Iconic, State 1) cusIconify
  6. + I TestRc (Match) Break
  7. + I All (CurrentPage, Iconic, State 1) RestoreDesktop
  8. DestroyFunc UnIconify
  9. AddToFunc   UnIconify
  10. + I Next (CurrentPage, Iconic, State 1) cusIconify off
  11. + I TestRc (!Match) Break
  12. + I UnIconify
  13. DestroyFunc RestoreDesktop
  14. AddToFunc   RestoreDesktop
  15. + I UnIconify
  16. + I All (CurrentPage, Iconic) PlaceAgain Icon
  17. + I All (CurrentPage, State 1) ThisWindow State 1 False
复制代码
结合下面热键,实现win+d显示桌面,再按一次恢复所有窗口。
  1. Key D            A       4       ShowDesktop
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-7-1 11:18:04 | 显示全部楼层
认真的说:比较感兴趣“而且有一个超级基本的功能它都实现不了”具体是什么功能。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-1 16:57:28 | 显示全部楼层
Post by poet;2100729
认真的说:比较感兴趣“而且有一个超级基本的功能它都实现不了”具体是什么功能。

我想要实现跟其他的窗口管理器一样的alt-tab功能,可是用fvwm虽然用windowlist可以实现类似的,已经非常接近的功能了,但是如同我的配置文件里评价的一样:
#Alt-Tab实现切换窗口,鼠标居然一直要跟着那个菜单走,真是超级蠢
虽然选完窗口后鼠标会回到原位,但这也不是我能容忍的,因为偶尔在切窗口的时候会动到鼠标。而且除非不用windowlist,这个问题不可能解决。而不用windowlist想实现这个功能的成本恐怕太高了。

这些配置文件,在我电脑里说实话有点鸡肋,我基本上不会再用它们了,删了吧又觉得可惜,所以就发上来,相信对想用fvwm的人会有帮助。后面的内容还会陆续跟上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-2 03:20:53 | 显示全部楼层

临时升起窗口

这是我最满意的一个功能,当时很多同学都很喜欢,用我的电脑一小会之后,用别的电脑也会习惯性的把鼠标移到屏幕右边:flash:
将鼠标移到屏幕右边缘一小会后,会将我放在屏幕右边的按键框(按键框里放了普通的启动按键,还有窗口列表、时钟等等所有东西)升起来,鼠标离开按键框之后按键框才会沉下去。
下面是代码:
1,函数定义:

  1. DestroyFunc TempRaise
  2. AddToFunc TempRaise
  3. + I All ($0) Layer 0 6
  4. + I Next ($0) Schedule Periodic 1000 $[w.id] LowerTemp $0 $[w.id]

  5. DestroyFunc LowerTemp
  6. AddToFunc LowerTemp
  7. + I Any (HasPointer, $0) Break 1
  8. + I All ($0) Layer 0 2
  9. + I Schedule 100 Deschedule $1
复制代码

2,桌面边缘行为定义:
  1. EdgeResistance -1
  2. Style * EdgeMoveDelay 25000
  3. Style * EdgeMoveResistance 20
  4. EdgeScroll 0 0
复制代码

3,鼠标触边时的函数定义,右边缘升起按键框,下边缘升起图标化的窗口:
  1. EdgeCommand Right Schedule 500 Test (EdgeHasPointer Right) TempRaise FvwmButtons
  2. EdgeCommand Bottom Schedule 500 Test (EdgeHasPointer Bottom) TempRaise Iconic
复制代码

4,图标化窗口的排布,即Iconbox和默认图标:

  1. Style *           IconBox 880x150+0-0, IconFill l b
  2. Style *           IconSize 48 48
  3. #这一行是默认图标,图标路径得改。
  4. Style *           Icon 48x48/apps/tux.png, Color lightgrey/dimgrey
  5. #自定义图标目录路径:
  6. ImagePath $[HOME]/.fvwm/icons:+
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-7-2 11:52:50 | 显示全部楼层
Post by lastart;2100801
这些配置文件,在我电脑里说实话有点鸡肋,我基本上不会再用它们了,删了吧又觉得可惜,所以就发上来,相信对想用fvwm的人会有帮助。后面的内容还会陆续跟上。


对于这些东西,比较可靠的办法是在 googlecode 上面申请一个项目,用 mercurial 作为版本管理,传上去。(当然,sourceforge, bitbucket, github 也可以)

有需要的人自然会去 clone 之。
回复 支持 反对

使用道具 举报

发表于 2010-7-3 10:44:25 | 显示全部楼层
楼主是要退出FVWM阵营了?现在用FVWM的人越来越少了,我还是感觉FVWM好用,简单快捷,没有乱七八糟的问题
回复 支持 反对

使用道具 举报

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

注销/关机/重启

已经很久不用fvwm了,因为现在只有小笔记本,装fvwm有时候拿到外面有点丢linux的脸。

因为默认的注销/关机的时候,fvwm非常暴力,直接自己退出了,导致程序非法关闭,这点我实在不喜欢,再加上用gdm可以不用超级权限就能重启,所以就用了下面的内容实现注销/关机。
sudo关机要设置不用密码关机权限。

首先是函数:

  1. #QuitAction 定义退出的类型:注销/关机/重启
  2. DestroyFunc Shutdown
  3. AddToFunc Shutdown
  4. + I SetEnv QuitAction HALT
  5. + I FuncExit

  6. #给程序送ctrl+q
  7. DestroyFunc FuncExit
  8. AddToFunc FuncExit
  9. + I Any (gdesklets-daemon) Exec gdesklets stop>/dev/null
  10. + I All (qterm) FakeKeypress modifiers 1 press f press e
  11. + I Schedule 500 All (!qterm,!Fvwm*) FakeKeypress modifiers 8 press q
  12. + I Schedule 3000 All (!qterm,!Fvwm*) Close
  13. + I Schedule Periodic 500 1001 QuitFunc

  14. #测试是否有Gdm没有的话用sudo关机。
  15. PipeRead "gdmflexiserver --authenticate --command=QUERY_LOGOUT_ACTION 2>&1|grep -q ERROR && echo UnsetEnv GDM|| echo SetEnv GDM"

  16. Test (!EnvIsSet GDM) read Quit-sudo
  17. Test (EnvIsSet GDM) read Quit-gdm
  18. UnsetEnv GDM

  19. #可以设置热键取消关机命令:
  20. DestroyFunc CancelQuit
  21. AddToFunc CancelQuit I Deschedule 1001

复制代码


Quit-sudo文件:
  1. DestroyFunc QuitFunc
  2. AddToFunc QuitFunc
  3. + I None (!Fvwm*) DoQuitAction

  4. DestroyFunc DoQuitAction
  5. AddToFunc DoQuitAction
  6. + I Test (EnvMatch QuitAction HALT) Exec sudo shutdown -h now
  7. + I Test (EnvMatch QuitAction REBOOT) Exec sudo shutdown -r now
  8. + I Piperead "rm $[LOCKFILE]>&2; echo Quit"
复制代码

Quit-gdm文件
  1. DestroyFunc QuitFunc
  2. AddToFunc QuitFunc
  3. + I None (!Fvwm*) PipeRead 'gdmflexiserver --authenticate --command="SET_LOGOUT_ACTION $[QuitAction]" >/dev/null 2 >/dev/null'
  4. + I None (!Fvwm*) Piperead "rm $[LOCKFILE]>&2; echo Quit"
复制代码


因为如果直接调用窗口管理命令fvwm保持登录的话,如果有程序导致Fvwm崩溃,则就会直接注销当前登录,这是不希望发生的,所以自己建了fvwm-session,用LOCKFILE判断是否正常退出,
~/.xsession里直接调用fvwm-session启动fvwm。
fvwm-session内容:

  1. #!/bin/bash
  2. a=0
  3. touch /tmp/.fvwmsession$DISPLAY.lock
  4. export LOCKFILE="/tmp/.fvwmsession$DISPLAY.lock"
  5. while [ $((`date +%s`-$a)) -gt 5 ] && [ -f "$LOCKFILE" ]
  6. do
  7.         a=`date +%s`
  8.         fvwm "$@"
  9. done
  10. rm "$LOCKFILE"
复制代码


建一个退出对话框,我不喜欢用菜单选退出项:
  1. DestroyModuleConfig FvwmForm-Quit: *
  2. *FvwmForm-Quit: GrabServer
  3. *FvwmForm-Quit: WarpPointer
  4. *FvwmForm-Quit: Line center
  5. *FvwmForm-Quit: Text "What do you want to do?"
  6. *FvwmForm-Quit: Line center
  7. *FvwmForm-Quit: Line center
  8. *FvwmForm-Quit: Button quit "Quit" ^M
  9. *FvwmForm-Quit: Command SetEnv QuitAction NONE
  10. *FvwmForm-Quit: Command FuncExit
  11. *FvwmForm-Quit: Button quit "Shutdown" ^S
  12. *FvwmForm-Quit: Command SetEnv QuitAction HALT
  13. *FvwmForm-Quit: Command FuncExit
  14. *FvwmForm-Quit: Button quit "Reboot" ^B
  15. *FvwmForm-Quit: Command SetEnv QuitAction REBOOT
  16. *FvwmForm-Quit: Command FuncExit
  17. *FvwmForm-Quit: Line center
  18. *FvwmForm-Quit: Line center
  19. *FvwmForm-Quit: Button quit "Restart" ^R
  20. *FvwmForm-Quit: Command Restart
  21. *FvwmForm-Quit: Button quit "Cancel" ^[
  22. *FvwmForm-Quit: Command CancelQuit

复制代码


在主菜单里加上一项运行退出对话框:
  1. +                       "E&xit Fvwm%$[MenuIcon]/exit.png%" Module FvwmForm FvwmForm-Quit
复制代码


定义关机/取消关机热键:

  1. 桌面上Alt-F4,或者Alt_shift_F4关机,Ctrl_Alt_C取消关机
  2. Key F4           R       M       Module FvwmForm FvwmForm-Quit
  3. Key F4           A       SM      Module FvwmForm FvwmForm-Quit
  4. #Key XF86PowerOff A       N       Module FvwmForm FvwmForm-Quit
  5. Key C            A       CM      CancelQuit
复制代码

设置FvwmForm的特性/窗口样式:
  1. Style Fvwm*       NoTitle,  Sticky, BorderWidth 0, CirculateSkipIcon, CirculateSkip
  2. Style FvwmForm  StaysOnTop
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-7-9 10:55:55 | 显示全部楼层
楼主贴几个效果图来会更好,另,FVWM也可以搞得非常华丽啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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