菜单(MENUS)
打开菜单前,首先应该使用AddToMenu命令对菜单进行定义,并且与Key,PointerKey,或Mouse命令进行绑定(当然还有很多其它调用菜单的方式)。这些通常都是在配置文件里完成。
Fvwm菜单是可以自己随意定义的,包括菜单字体,背景色,弹出子菜单的延迟时间,动态生成菜单和很多其它特点,即使最细微的差别都可以被改变。更多细节请参考MenuStyle命令。
菜单类型(Types of Menus)
共有四种类型的菜单,它们之间并没有太多的区别:
弹出菜单(Popup menus),它能独立地或作为窗口地一部分出现在屏幕的任何地方。使用Popup命令打开弹出菜单。如果弹出菜单在鼠标按键按下时被调用,按钮释放时它将消失。鼠标按键按下打开弹出菜单时,可以移动指针选择菜单项,位于指针下面的菜单项被激活,关联动作在按钮释放菜单消失后被执行。
Menu命令与Popup命令有点相似,不过它打开的菜单能够保留的更加长久,通过单击鼠标按键操作打开菜单时,它将一直出现在屏幕上,而且不用像Popup命令那样按着鼠标按键来导航菜单项。可以移动鼠标指针选择一个菜单项,然后单击鼠标按键,该菜单项的关联动作将被执行。
Tear off menus 或 Pin up menus是已经脱离了它们原始的上下文(context),并且像普通窗口那样(具有标题栏、边框等窗口的属性)停留在屏幕上的菜单。可以通过某些键盘或鼠标操作直接将已经打开的菜单转化为这种类型的菜单,也可以使用TearMenuOff命令从一个菜单内部创建这种菜单。
子菜单(Sub menus)是包含在菜单内部的菜单。关联Popup命令的菜单项被选择时,它的下级菜单会打开,任何菜单都可以有子菜单。
菜单解析(Menu Anatomy)
菜单包括通常出现在菜单顶端的标题(title),关联一定操作的菜单项,菜单项之间的分隔行(separator line,用于对菜单分组),tear off bars (一条水平虚线),和通过小三角形指出的子菜单项。所有上面的项都是可选的。
另外,如果菜单太长以至于不能在在屏幕上完整的显示,则多余的菜单项会放在附加菜单(continuation menu)和子菜单里。最后,菜单的任意一边(side bar)可以显示一副图片。
菜单导航(Menu Navigation)
键盘或鼠标都可以实现菜单导航。在菜单显示的时候,fvwm 将不能进行其它任何操作。比如,在菜单消失前新窗口不会出现。然而,对于tear off menus情况会有所不同。细节请参看TearOffMenus部分。
鼠标导航(Mouse Navigation)
在菜单上面移动鼠标指针可以选择指针下面的菜单项,通常菜单项周围会出现3d效果的边框来显示这一过程,并不是菜单的所有部分都能够被激活。在菜单打开的时候,选择一个菜单项,然后按下鼠标的任何一个按键都可以激活它。弹出菜单的菜单项在松开鼠标按键的时候也可以被激活。如果一个菜单项含有子菜单,则指针停留在该菜单项上面足够久,或者接近指示子菜单的三角形,子菜单都将显示。
在菜单上滚动鼠标滑轮时的操作依赖于MouseWheel菜单style。
点击激活一个所选择的菜单项产生的操作也依赖于菜单项的类型。
在title,separator,side bar,或者菜单外面单击鼠标都将关闭这个菜单(tear off menus不能通过这种方式关闭)。在菜单标题或tear off bar上点击鼠标按键2会创建一个tear off menu(和当前菜单内容一样,如果是子菜单的tear off bar,则创建的tear off menu和子菜单内容一样)。点击一个普通的菜单项将执行与它关联的操作。点击一个子菜单项会关闭所有打开的菜单并执行该子菜单项的关联操作。
键盘导航(Keyboard Navigation)
像鼠标导航一样,指针下面的菜单项被选择。菜单打开时,所有键盘按键操作都会被菜单截获,其它应用不再能够获得键盘输入(对于tear off menus情况会有所不同)。
可以通过每个菜单项的热键直接选择菜单项,菜单项标签里的下划线指出了它关联的热键。使用AutomaticHotkeys 菜单风格,fvwm可以自动的为所有菜单项分配热键。
导航菜单的最基本按键是光标键(up和down移动指针到一个菜单项,进入或离开一个子菜单),Space(激活菜单项)和Escape(关闭菜单)。也有很多其它键可以用来导航菜单。
Enter, Return, Space activate the current item.
Escape, Delete, Ctrl-G exit the current sequence of menus or destroy a tear off menu.
J, N, Cursor-Down, Tab, Meta-Tab, Ctrl-F, move to the next item.
K, P, Cursor-Up, Shift-Tab, Shift-Meta-Tab, Ctrl-B, move to the prior item.
L, Cursor-Right, F enter a sub menu.
H, Cursor-Left, B return to the prior menu.
Ctrl-Cursor-Up, Ctrl-K Ctrl-P, Shift-Ctrl-Meta-Tab, Page-Up move up five items.
Ctrl-Cursor-Down, Ctrl-J Ctrl-N, Ctrl-Meta-Tab,P, Page-Down move down five items.
Home, Shift-Cursor-Up, Ctrl-A move to the first item.
End, Shift-Cursor-Down, Ctrl-E move to the last item.
Meta-Cursor-Up, Ctrl-Cursor-Left, Shift-Ctrl-Tab move up just below the next separator.
Meta-Cursor-Down, Ctrl-Cursor-Right, Ctrl-Tab move down just below the next separator.
Insert opens the "More..." sub menu if any.
Backspace tears off the menu.
Menu Bindings
Tear Off Menus
一个tear-off 菜单是已经脱离了它们原始的上下文(context),并象普通窗口那样(具有标题栏、边框等窗口的属性)停留在屏幕上的菜单。有三种方式创建tear-off 菜单:在菜单标题上点击鼠标按钮2,在菜单上按Backspace键,或激活菜单的tear off bar。通过TearMenuOff命令为菜单分配tear off bar,使用方式和Nop命令类似。
Backspace按键的操作不能被覆盖,但是在菜单标题上点击鼠标按键2的操作可以。为了删除内置的鼠标按键2操作,可以使用:
Mouse 2 M N -
为了分配其它按键实现tearoff,可以使用:
Mouse 1 M N TearOff
注意,修饰符(Modifier)必须是"N"(none)。
包含了菜单的窗口被当作普通窗口在屏幕上放置,如果你觉得这比较混乱,在你的配置文件里添加下面的语句:
Style fvwm_menu UsePPosition
之后,tear-off 菜单将会出现在它tearoff前的位置。
为了删除tear-off菜单的边框和按钮,但是保留菜单标题,可以使用:
Style fvwm_menu !Button 0, !Button 1
Style fvwm_menu !Button 2, !Button 3
Style fvwm_menu !Button 4, !Button 5
Style fvwm_menu !Button 6, !Button 7
Style fvwm_menu !Button 8, !Button 9
Style fvwm_menu Title, HandleWidth 0
Tear-off菜单是介于窗口和菜单之间的产物。菜单被包含在窗口内部,菜单标题显示在窗口标题栏里。这么做主要的好处是菜单可以因此长久保留,即使在激活一个菜单项之后也不会关闭菜单,菜单可以因此多次使用,不用去反复的打开它。为了关闭tear-off菜单,关闭它的窗口或Escape键即可。
Tear-off菜单和普通的菜单和窗口行为还是稍有些不同的。它们并不截获键盘焦点,但是当指针在菜单项上面的时候,所有的键盘按键操作还是会发送给它。只要指针位于tear-off菜单里面,或者位于它的子菜单里面,其它的 fvwm 按键绑定都会被禁止。指针离开这个区域的时候,所有的子菜单会被立即关闭。注意,包含tear-off菜单的窗口拥有焦点时从不高亮。
Tear-off菜单是原始菜单的复制,并且独立于原始菜单,同样,向原始菜单增加菜单项,或改变原始菜单的风格不能影响tear-off菜单。
如果希望在不打开普通菜单的情况下创建tear-off菜单,可以使用Menu和Popup命令的TearOffImmediately选项。