|
楼主 |
发表于 2005-4-4 10:02:06
|
显示全部楼层
=====================================================================
7 - 开发者的一些提示和示例
======================================================================
7.1 测试新配置的简单方法。
你知道吗,对于大部分配置命令要看它们做了什么,并不需要重启X或者fvwm。有一些模块可以让你在任何时候向fvwm发送命令,其中有FvwmCommand,"FvwmForm-Tolk"和FvwmConsole.我个人比较喜欢FvwmCommand和FvwmConsole。
当打开FvwmConsole时,你看到一个shell,通过它你可以向fvwm发送配置命令。如下配置,就可以在菜单里加一个启动FvwmConsole的选项:
AddToMenu main_menu
+ "FvwmConsole" Module FvwmConsole
更巧妙的方法是使用FvwmCommand。在配置文件里添加下面一句启动FvwmCommand服务器:
Module FvwmCommandS
确保FvwmCommand模块在你的搜索路径里。服务器启动后,就可以在你喜欢的shell输入命令了:
FvwmCommand "MenuStyle * Font 6x9"
注意要把命令放在引号里。FvwmCommand的优点是可以使用你喜欢的shell,利用shell的特性(如命令行补全和历史),缺点是有点慢,因为FvwmCommand每次只能启动一条命令。
其它相关的模块和命令是FvwmScript和PipeRead。
----------------------------------------------------------------------
7.2 在配置里使用shell命令
有时侯你也许想在配置文件config里使用shell命令或脚本的输出,比如你想要一个菜单,菜单的各项是某个目录下的所有文件名。这种效果可以使用PipeRead和FvwmCommand得到。我推荐使用PipeRead,因为使用FvwmCommand创建20个菜单项就需要相当的时间。
例:
# make the background menu
AddToFunc MakeBackgroundMenu
+ "I" DestroyMenu BackgroundMenu
+ "I" AddToMenu BackgroundMenu Backgrounds Title
+ "I" PipeRead 'for i in `/bin/ls $HOME/.fvwm/backgrounds/*.bg.*`; \
do echo -e AddToMenu BackgroundMenu `basename $i | sed -e \
"s/\.bg\..*$//"` Function SetDefaultBackground $i; done'
# set the default background
AddToFunc SetDefaultBackground
+ "I" Exec echo -e $0 > $HOME/.fvwm/background
+ "I" Function SetBackground
# set a new background
AddToFunc SetBackground
+ "I" Exec test -r $HOME/.fvwm/background && xv -root -quit -viewonly \
`cat $HOME/.fvwm/background|tr -d "\n"`
# activate setting from last session and build the menu
AddToFunc InitFunction
+ "I" Function SetBackground
+ "I" Function MakeBackgroundMenu
MakeBackgroundMenu函数创建一个菜单,各菜单项是在目录$HOME/.fvwm/backgrounds下的且匹配"*.bg.*"模式的文件名,后缀.bg.*被删除。当我们选择其中一项时,使用xv把对应的文件设置为桌面背景,并把该文件名和路径存到文件$HOME/.fvwm/background中,当我们开始下一个fvwm会话时,就可以把桌面设为和上次会话同样的背景。
我还有一个更加复杂的关于调色版的设置。
----------------------------------------------------------------------
7.3如何在非当前desk或page启动程序。
使用'StartsOnDesk'或'StartsOnPage' style:
Style Netscape* StartsOnPage 0 1
or
Style Netscape* StartsOnDesk 1
这样标题以'Netscape'开始的窗口都会被放在page 0 1(desk 1).你可能希望使用下面的选项:
Style * RecaptureHonorsStartsOnPage, CaptureHonorsStartsOnPage
如果你想在其它的page启动程序,但是并不切换到那个page,这需要使用'SkipMapping' style:
Style Netscape* StartsOnPage 0 1, SkipMapping
----------------------------------------------------------------------
7.4如何在非当前desk或page打开一个应用程序,且不切换观察口(viewport)到打开程序的page或desk。
使用SkipMapping style:
Style Netscape* StartsOnPage 0 1, SkipMapping
----------------------------------------------------------------------
7.5 更高效的MWM菜单
可能你已经注意到,对于MWM菜单,只要指针移到菜单项子菜单就会弹出,即使你只想移动到下面。这种情况可以使用MenuStyle的 'PopupDelay' 和 'PopupDelayed'选项:
MenuStyle mwm
MenuStyle PopupDelayed, PopupDelay 80
这样,子菜单会在指针移动到菜单项的80毫秒后打开。你很难感觉到这个延迟。注意只是在我的机器上,80毫秒足够指针经过菜单了,你可能需要实验一下找到一个合适的值。
----------------------------------------------------------------------
7.6 关于在屏幕上放置菜单
你有过想打开主菜单但却找不到地方的时候吗?还得关闭窗口或者满屏幕的移动鼠标?
如果是的话,你可以使用下面的快捷键:
Key space A M Menu root c c main_menu
这样设置后,当你按下Alt-space就会在屏幕的中心弹出名为main_menu的菜单。或者你想给window menu设置一个快捷键:
Key space A SM Menu root c c WindowMenu
你可以把菜单放到任何地方,不仅是鼠标指针所在的位置。细节请看man page中的Menu命令。
----------------------------------------------------------------------
7.7当鼠标接近屏幕边缘,有时候会发生flipping pages,你遇到过吗?
可以使用EdgeScroll命令禁止flipping pages:
EdgeScroll 0 0
----------------------------------------------------------------------
7.8给你的窗口和图标排队
SnapAttraction和SnapGrid命令可以用来保持桌面的整洁。使用SnapAttraction可以使窗口(或者图标)互相紧贴在一起。当拖动窗口(图标)临近另一个窗口(图标)的时候,就紧贴到那个窗口(图标)上,边缘之间没有任何间隙。把下面的命令放到配置文件里:
SnapAttraction 8 SameType
这个命令的意思是如果窗口间的距离小于8个象素时,就互相贴在一起,图标和图标间也是如此。或者你只想应用到窗口/图标上,可以使用:
SnapAttraction 8 Windows
or
SnapAttraction 8 Icons
或者你想窗口与图标之间也可以相互紧贴:
SnapAttraction 8 All
SnapGrid命令也很有用:
SnapGrid 8
这个命令告诉fvwm使用8个象素大小的格子放置窗口和图标。试一下看看你喜不喜欢。
提示:SnapGrid的参数最好选用桌面的宽和高的约数.
----------------------------------------------------------------------
7.9使用键盘移动鼠标/聚焦/page.
移动鼠标的键绑定:
# shift-<direction> to move a few pixels
Key Left A S CursorMove -1 0
Key Right A S CursorMove +1 +0
Key Up A S CursorMove +0 -1
Key Down A S CursorMove +0 +1
# shift-meta-<direction> to move 1/4 page
Key Left A SM Scroll -25 +0
Key Right A SM Scroll +25 +0
Key Up A SM Scroll +0 -25
Key Down A SM Scroll +0 +25
移动pages的键绑定:
# shift-control-<direction> to move a full page
Key Left A SC CursorMove -10 +0
Key Right A SC CursorMove +10 +0
Key Up A SC CursorMove +0 -10
Key Down A SC CursorMove +0 +10
# Alt-Fn to go to a specific page (like on the Linux console)
Key F1 A M GotoPage 0 0
Key F2 A M GotoPage 1 0
Key F3 A M GotoPage 0 1
Key F4 A M GotoPage 1 1
按指定方向改变focus到一个窗口:
# number keys on keypad to move the focus
Key KP_1 A C Direction SouthWest Focus
Key KP_2 A C Direction South Focus
Key KP_3 A C Direction SouthEast Focus
Key KP_4 A C Direction West Focus
Key KP_6 A C Direction East Focus
Key KP_7 A C Direction NorthWest Focus
Key KP_8 A C Direction North Focus
Key KP_9 A C Direction NorthEast Focus
----------------------------------------------------------------------
7.10 防猫安全桌面^_^
如果你的猫总是趁你煮咖啡的时候爬上键盘,下面的某个设置可能会帮上忙:
使用'Style * MouseFocus',在你离开的时候把鼠标指针放到桌面背景上(根窗口)。
如果你不想改变‘SloppyFocus’的设置,那就把鼠标指针移动到一个永远不会得到键盘输入的窗口,使它成为focused的窗口。更狂热的想法是用猫的图片做一个窗口^_^
----------------------------------------------------------------------
7.11下降并移动窗口。
在一些配置里,使用鼠标中键移动窗口后,窗口会下降。如果是先下降,然后移动窗口会有很好的视觉效果:
Mouse 2 T A Function MoveOrLower
AddToFunc MoveOrLower
+ "Click" Lower
+ "Motion" Lower
+ "Motion" Move
+ "DoubleClick" Lower
----------------------------------------------------------------------
7.12 Toggling windows on and off.
固定、解除固定窗口
如果有一个按钮或菜单项,第一次使用时它打开程序,第二次使用时它关闭程序,那将是令人期待的。如何实现这个效果好像不太容易想到,但确实是可以的。假设你需要一个菜单项用来打开和关闭FvwmConsole.
把下面的内容放到配置文件里(fvwm-2.5.11及后续版本):
AddToFunc ToggleFvwmConsole
+ I ToggleWindow FvwmConsole "Module FvwmConsole"
# Application toggling function
# 第一个参数是窗口名,第二个是启动程序的命令
AddToFunc ToggleWindow
+ I None ($$0, CirculateHit) $$1
+ I TestRc (Match) Break
+ I Next (currentpage, visible, !iconic, $$0, CirculateHit) Close
+ I TestRc (Match) Break
+ I Next ($$0, CirculateHit) Function MakeVisible
# Helper function
AddToFunc MakeVisible
+ I MoveToDesk
+ I MoveToPage
+ I MoveToScreen
+ I Raise
+ I Iconify off
+ I WindowShade off
要使用这个函数,把它放到菜单里:
AddToMenu <some menu>
+ "toggle FvwmConsole" Function ToggleFvwmConsole
如果你更喜欢按钮,就放到FvwmButtons里:
*FvwmButtons: (Action ToggleFvwmConsole)
对于不可见的窗口,并不关闭它们,而是由包含MoveToDesk, MoveToPage和Raise的行把它带到当前page的顶层。
如果你只想针对特定的窗口,比如某个xterm,但是其它的xterm还保持原来的样子,那么你必须给这个窗口一个唯一的名字:
AddToFunc RunXMessages
+ I Exec exec xterm -T XMessages -n XMessages \
-e tail -f /var/adm/?* ~/.X.err
AddToFunc ToggleXMessages
+ I ToggleWindow XMessages "Function RunXMessages"
值的注意的是,这个函数只是简单的查找是否有指定名字的窗口存在。所以该函数可能关闭手动打开的窗口,或者因为程序启动太慢而多次启动同一个程序(像netscape)。
在fvwm-2.5.10及早些的版本中,下面的函数也可以实现这个功能:
AddToFunc ToggleFvwmConsole
+ I None (FvwmConsole, CirculateHit) Module FvwmConsole
+ I Next (FvwmConsole, CirculateHit, CurrentPage, Visible) Close
+ I Next (FvwmConsole, CirculateHit) MoveToDesk
+ I Next (FvwmConsole, CirculateHit) MoveToPage
+ I Next (FvwmConsole, CirculateHit) Raise
AddToFunc ToggleXMessages
+ I None (XMessages, CirculateHit) Exec exec \
xterm -T XMessages -n XMessages -e tail -f /var/adm/?* ~/.X.err
+ I Next (XMessages, CirculateHit) Close
----------------------------------------------------------------------
7.13通过点击打开程序(称为docking程序)
通常一个图标代表一个最小化的程序。但是如果你想通过点击图标来启动程序,也是可以的。使用FvwmButtons实现:
# FvwmButtons icon launcher:
DestroyFunc Launcher
AddToFunc Launcher
+ I DestroyModuleConfig $0Launch: *
+ I *$0Launch: Geometry 64x68
+ I *$0Launch: Columns 1
+ I *$0Launch: Rows 4
+ I *$0Launch: Frame 0
+ I *$0Launch: (1x3+0+0, Icon $1, Action (Mouse 1) `Exec $2`)
+ I *$0Launch: Pixmap none
+ I *$0Launch: (1x1+0+3, Font 9x15, Fore White, Back DarkBlue, \
Title $0, Action (Mouse 1) `Exec $2`)
+ I Style $0Launch HandleWidth 0, NoTitle
+ I Module FvwmButtons $3 $0Launch
# Examples:
Launcher RXVT xterm.xpm "rxvt -bg black" "-g +0+0"
Launcher XV xv.xpm "xv" "-g +0+100"
GNOME和KDE也有实现同样功能的程序gmc和kfm。这些程序同样可以在fvwm中运行。在fvwm-2.5.1及后续版本中可以使用Nautilus(版本>=2)和kdesktop。
----------------------------------------------------------------------
7.14精确定位窗口
这个例子演示了如何把窗口放到屏幕中心。注意这里是如何使用PipeRead的,以及如何使用$(())进行算数计算的。
DestroyFunc CenterWindow
AddToFunc CenterWindow
+ I ThisWindow Piperead "echo Move \
$(( $[vp.width]/2-$[w.width]/2 ))p \
$(( $[vp.height]/2-$[w.height]/2 ))p"
如果你有一个名为"MyWindow"的窗口,使用下面的命令把它放到屏幕中心
Next (MyWindow) CenterWindow
去掉ThisWindow,可以在没有窗口上下文而调用CenterWindow时避免一些错误。
在fvwm-2.5.11中,可以使用“Style X CenterPlacement”把窗口放到屏幕中心。
----------------------------------------------------------------------
7.15 隐藏鼠标指针
有些用户不喜欢鼠标总是挡在前面。你可以安装unclutter程序,它会在鼠标不移动时隐藏鼠标。
----------------------------------------------------------------------
7.16 寻找鼠标指针
有的时候怎么也找不到鼠标指针,下面给出一个找到它的方法:
Key Super_L A A Exec xmessage -name "SmallBlob" -bg red \
-fg white -nearmouse -timeout 1 'I am here!'
Style SmallBlob UsePPosition, NoTitle, NoHandles, BorderWidth 10
----------------------------------------------------------------------
7.17 自动隐藏FvwmButtons或其它窗口
有些应用程序有自动隐藏的特性,就是把窗口放到一个特定区域而不占用宝贵的桌面空间。在fvwm中可以通过写一些小的函数来隐藏任何窗口。
fvwm-2.5.11或后续版本:
# 自动隐藏函数
AddToFunc autohide
+ I ThisWindow ($0) Deschedule $[w.id]
+ I ThisWindow ($0) KeepRc ThisWindow (shaded) WindowShade off
+ I TestRc (!Match) All ($0, !shaded) autohide_hide $1 $2
AddToFunc autohide_hide
+ I Schedule $0 $[w.id] WindowShade $1
+ I Schedule $0 $[w.id] Deschedule $[w.id]
# 打开FvwmAuto
AddToFunc StartFunction
+ I Module FvwmAuto FvwmAutohide -menter enter_handler
# 添加你想自动隐藏的窗口
AddToFunc enter_handler
+ I autohide FvwmButtons 500 S
# ^ ^ ^
# | | |___ Shade direction (可选的)
# | |_______ 隐藏延迟 (毫秒)
# |___________________ 唯一的窗口名/资源
照着上面的例子,添加你想自动隐藏的窗口到enter_handler函数。autohide函数需要两个或三个参数。第一个是窗口或者类的名字,必须是唯一的名字。第二个是隐藏延迟,从指针离开窗口算起到窗口隐藏的时间,以毫秒为单位。最后一个参数是可选的,表示窗口隐藏的方向(N, S, E, W, NW, NE, SW or SE)。
下面是一个稍复杂一点的版本。和上面的不同在于不是立即显示窗口,而是有一点延迟。
fvwm-2.5.11及后续版本:
AddToFunc autohide
+ I ThisWindow ($0) Deschedule $[w.id]
+ I TestRc (!Match) Deschedule -$[w.id]
+ I ThisWindow ($0) KeepRc ThisWindow (shaded) \
autohide_show $1 $3
+ I TestRc (!Match) All ($0, !shaded) autohide_hide $2 $3
AddToFunc autohide_show
+ I Schedule $0 -$[w.id] WindowShade $1 off
+ I Schedule $0 -$[w.id] Deschedule $[w.id]
+ I Schedule $0 -$[w.id] Deschedule -$[w.id]
AddToFunc autohide_hide
+ I Schedule $0 $[w.id] WindowShade $1 on
+ I Schedule $0 $[w.id] Deschedule $[w.id]
+ I Schedule $0 $[w.id] Deschedule -$[w.id]
AddToFunc StartFunction
+ I Module FvwmAuto FvwmAutohide -menter enter_handler
AddToFunc enter_handler
+ I autohide FvwmButtons 250 500 S
# ^ ^ ^ ^
# | | | |__ Shade direction (optional)
# | | |______ Hide delay
# | |__________ Show delay
# |______________________ Unique window name/resource
从2.5.8到2.5.10这些函数都可以使用,但是你不得不从autohide函数中删除KeepRc命令。
----------------------------------------------------------------------
7.18 Using application screenshots as icon or mini icon
thumbnails.
使用程序的截图作为图标或缩略图?
通过脚本,fvwm可以在窗口最小化和改变大小时取得程序窗口的截图,并把它作为程序的图标。有一些程序本身就有这个能力,我们建议使用程序本身的功能。
对于xterm,可以在启动时加上 +ai(表示active icon)选项:
$ xterm +ai
对于XEmacs,有一个live-icon elisp包可以使用。安装后把下面几行放到XEmacs配置文件里
(load-library "live-icon")
; Control size, same as max icon size, uncomment if you want
; this feature.
;(setq live-icon-max-height 4
;(setq live-icon-max-width 4
确保你没有对这些程序使用style IconOverride,这个选项禁止使用动态图标。除此外,可能还有许多其它程序有这类特性。
如果你想利用fvwm来使用程序的缩略图作为图标,那么fvwm的版本不能低于2.5.8,这是因为要使用WindowStyle命令。此外还需要ImageMagick工具集(注:一些处理图像的工具),设置好环境变量$PATH,让fvwm可以找到它。<URL:http://www.imagemagick.org/>
下面的函数Thumbnail用来代替Iconify,可以在键绑定里使用它提升窗口,获取窗口截图并设置截图为窗口的图标。获取窗口截图可能需要几秒钟。窗口会立即最小化,但新的缩略图只有截图准备好了才能显示出来。
注意,截图只能从窗口的可视部分获得。如果窗口有一部分在屏幕外,在另外一个桌面或被其它窗口挡住了,缩略图可能比预期的小,或者挡住的部分显示不出来。这个没什么办法可以解决。
相同的办法也可以用于mini icon,只要把下面出现的icon都换成miniicon就可以了。
DestroyFunc Thumbnail
AddToFunc Thumbnail
+ I Raise
+ I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead \
"xwd -silent -id $[w.id] | convert -scale 64 -frame 1x1 \
-mattecolor black -quality 0 xwd:- \
png:$[FVWM_USERDIR]/icon.tmp.$[w.id].png \
&& echo WindowStyle IconOverride, \
Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png \
|| echo Nop"
+ I Iconify
窗口返回到通常状态时,可以使用模块FvwmEvent删除Thumbnail产生的图标。
DestroyFunc DeThumbnail
AddToFunc DeThumbnail
+ I Exec rm -f $[FVWM_USERDIR]/icon.tmp.$[w.id].png
+ I DestroyWindowStyle
*FvwmEvent: deiconify DeThumbnail
AddToFunc StartFunction I Module FvwmEvent
如果你想把DestroyWindowStyle用作其它目的而不能使用它时,可以先把窗口的当前图标保存起来,一会需要的时候再恢复它。这种方法只能用在fvwm2.5.9及后续版本。
下面是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 64 -frame 1x1 \
-mattecolor black -quality 0 xwd:- \
png:$[FVWM_USERDIR]/icon.tmp.$[w.id].png \
&& echo WindowStyle IconOverride, \
Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png \
|| echo Nop"
+ I Iconify
DeThumbnail函数用来恢复存的图标:
DestroyFunc DeThumbnail
AddToFunc DeThumbnail
+ I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
+ I UnsetEnv Icon-$[w.id]
+ I Exec rm -f $[FVWM_USERDIR]/icon.tmp.$[w.id].png
要想在重启fvwm后还能使用这些缩略图标,可以在StartFunction里加入下面的几行
AddToFunc StartFunction I Test (Restart) All (Iconic) \
Test (f $[FVWM_USERDIR]/icon.tmp.$[w.id].png) WindowStyle \
IconOverride, Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png
你也可以检查一下忘了删除的缩略图,并在ExitFunction函数里删除它们。
AddToFunc ExitFunction I Test (!ToRestart) \
Exec rm -f $[FVWM_USERDIR]/icon.tmp.*
相同的办法也可以用于mini icon,只要把出现的icon都换成miniicon就可以了。 |
|