FVWM
Fvwm 是一个符合 ICCCM 标准的、用于 X Window 系统的多虚拟桌面窗口管理器。它通过编辑基于文本的配置文件进行配置。虽然使用 FVWM 不需要任何编程语言知识,但可以使用 M4、C 和 Perl 预处理来扩展 FVWM。FVWM 还有一个 Perl 库,允许创建 模块。FVWM 代表 F 虚拟窗口管理器,首选的解释是 F 没有任何特定含义 [1]。
安装
以下软件包为 FVWM 提供主题和图标:fvwm-crystalAUR、fvwm-iconsAUR、fvwm-themesAUR、fvwm-themes-extraAUR。FVWM Crystal 为类似桌面环境的体验提供了单独的会话。
启动
从您选择的显示管理器的会话菜单中选择FVWM。否则,将 exec fvwm
添加到用户的 .xinitrc
。
对于 FVWM Crystal,从会话菜单中选择 FVWM-Crystal,或将 exec fvwm-crystal
添加到用户的 .xinitrc
。
有关详细信息,例如保留 logind 会话,请参阅 xinitrc。
启动函数
Test
命令 - 如下所述。FVWM 提供了许多函数,用于在初始化、重启或退出窗口管理器时启动模块或应用程序。
- StartFunction - 在首次初始化 FVWM 和重启时执行。
- InitFunction - 仅在首次初始化 FVWM 时执行。
- RestartFunction - 仅在重启 FVWM 时执行。
- ExitFunction - 在退出 FVWM 时执行。
您可以使用 AddToFunc
命令将自己的操作添加到这些函数中的任何一个。例如,如果有人想在启动时启动 network-manager-applet(但不用于窗口管理器的任何后续重启),则可以将 nm-applet 命令添加到 InitFunction
AddToFunc InitFunction + I Exec nm-applet
您也可以仅使用 StartFunction,并在命令前加上 Test 命令,该命令检查窗口管理器是否已启动或重启,并且仅在测试为真时运行该操作。使用此方法,nm-applet 可以按以下方式启动
AddToFunc StartFunction + I Test (Init) Exec nm-applet
配置
支持以下配置文件位置
$HOME/.fvwm/config
/usr/local/share/fvwm/config
版本 2.6.8 起支持以下配置位置,但未来可能不支持
$HOME/.fvwm/.fvwm2rc
$HOME/.fvwm2rc
/usr/local/share/fvwm/.fvwm2rc
/usr/local/share/fvwm/system.fvwm2rc
/etc/system.fvwm2rc
从版本 2.6.7 开始,FVWM 附带了一个新的默认配置,位于 /usr/share/fvwm/default-config
中。因此,不再提供旧的示例配置文件。但是,仍然可以在 GitHub 上查看它们。fvwm-themes 项目也提供了现成的配置,但应注意,这些配置自 2003 年以来未更新,可能需要修改才能与更新的 FVWM 版本正确配合使用。
read
命令从主配置文件中读取这些文件。语法为 read /path/to/file
。虚拟桌面
对于其虚拟桌面,FVWM 实现了工作区(由 Metacity 和 Openbox 等窗口管理器使用)和视口(由 Compiz 等窗口管理器使用)。有关工作区和视口之间差异的描述,请参阅 [2]。FVWM 将工作区称为桌面 (desks),将视口称为页面 (pages)。
FVWM 中的页面以网格形式排列。可以 使用 DesktopSize
命令定义使用的页面数。例如,将 DesktopSize 3x3
添加到配置文件将为您提供 9 个页面,排列成 3x3 网格。可以使用 pager 模块 或 GoToPage
命令导航页面,该命令可以映射到键盘快捷键或菜单项。例如,命令 GoToPage -1p +0p
将视口向当前页面的左侧移动 1 页。
FVWM 中可用的桌面 (desk) 数量非常大,最小桌面编号为 -2147483648,最大值为 2147483647。默认情况下,FVWM 从桌面 0 开始。可以使用 pager 模块(如果配置为显示多个桌面)或 GoToDesk
命令导航桌面 - GoToDesk +1
将移动到相对于当前使用桌面的下一个桌面。
键盘和鼠标绑定
键盘或绑定可以在配置文件中使用 Key
或 Mouse
命令定义。命令的语法采用以下形式:Key/Mouse (window) button/key name context modifiers action
。例如,以下示例将在 Alt+F2
键按下时启动 XTerm:Key F2 A 1 Exec xterm
。请注意,(window)
参数是可选的。
上下文值定义了绑定将应用的位置。以下上下文是有效的:R(根窗口)、W(应用程序窗口)、D(桌面管理器窗口 - 例如 PCManFM 桌面管理器)、T(标题栏)、S(窗口侧面,顶部,底部)、[ ] - _(分别是左侧、右侧、顶部、底部)、F(窗口框架角)、< > ^ v(分别是左上角、右上角、左下角、右下角)、I(图标窗口)、0-9(标题栏按钮)和 A(所有上下文)。这些字母的任何组合也是可以接受的。
修饰符值可以是以下之一:A(任意)、C(control)、S(shift)、M(meta)、N(none)或 1-5,表示 X 修饰符 - 运行 xmodmap
以查看哪个 X 修饰符是什么。多个修饰符不应空格。例如,要使用修饰符 Control+Alt
,您应将 C1
作为修饰符参数提供。
操作必须是 FVWM 函数 来运行,例如 Quit 函数或 Menu 函数。可以使用 Exec 函数执行外部命令,例如 xterm,如上所示。
窗口装饰
标题栏按钮
FVWM 最多可以提供 10 个窗口按钮。这些按钮编号为 0-9。偶数表示位于标题栏右侧的按钮,而奇数表示位于左侧的按钮。布局如下
1 3 5 7 9 0 8 6 4 2
窗口按钮将保持隐藏状态,除非使用指定标题栏按钮作为上下文的 Mouse
命令。例如,要激活最右侧的标题栏按钮并使其在左键单击时关闭窗口,可以使用以下命令
Mouse 1 2 A Close
Mouse 是命令的名称,1 是鼠标按钮,2 是最右侧标题栏按钮的编号,A 是修饰符(任意),Close 是要执行的操作。有关更多信息,请参阅 #键盘和鼠标绑定。
按钮样式
可以使用 ButtonStyle
命令配置标题栏按钮的样式。这采用以下语法
ButtonStyle button-number state style -- flag
状态可以是 ActiveUp、ActiveDown、InactiveUp、InactiveDown。ActiveUp 和 ActiveDown 分别指活动窗口的未按下和按下按钮状态。非活动状态也是如此。也可以仅使用 Active 或 Inactive,它们是按下和未按下按钮状态的快捷方式。
样式参数可以是以下之一
- Simple - 什么都不做。
- Default - 接受按钮编号的参数,以加载默认样式。
- Solid - 用纯色填充按钮。
- ColorSet - 使用指定的 ColorSet 填充按钮 - 接受介于 0 和 100 之间的 alpha 参数。
- Vector - 绘制线条图案 - 使用关键字 Vector 是可选的,因为这是一种标准样式。
- ?Gradient - 使用渐变填充按钮 - 有关语法,请参阅 [死链接 2023-10-29 ⓘ] fvwm(1) 的颜色渐变部分。
- Pixmap - 使用给定的 pixmap 填充按钮 - 另请参阅以下变体:AdjustedPixmap、ShrunkPixmap、StretchedPixmap、TiledPixmap。
- MiniIcon - 使用窗口的迷你图标填充按钮。
此处记录了许多矢量样式。您还可以使用此 矢量按钮查看器 创建自己的矢量按钮。最后,请参阅 此页面,了解一些使用 pixmap 的示例装饰配置,包括模仿 Crux(Sawfish 主题)、Mac OS 和 Windows 98。
标志会影响按钮的状态。标志的一些示例包括 Raised、Sunk 和 Flat。有关更多信息,请参阅 [死链接 2023-10-29 ⓘ] fvwm(1) 并查找 ButtonStyle 部分。
UseTitleStyle
标志。或者,使用 ButtonStyle
命令指定按钮背景,然后按照此命令使用 AddButtonStyle
命令指定矢量或 pixmap 图像。AddButtonStyle
采用与 ButtonStyle
相同的语法。标题和边框样式
可以使用 TitleStyle
和 BorderStyle
命令分别配置窗口标题和边框。
TitleStyle 可以采用以下参数
TitleStyle justify Height height-in-pixels
justify 参数可以是 LeftJustified、RightJustified 或 Centered。TitleStyle 和 BorderStyle 可以采用以下参数
TitleStyle/BorderStyle state style -- flag
有关 state、style 和 flag 参数,请参阅 #按钮样式。
菜单
AddToMenu
命令是累积的,这意味着如果在同一菜单上使用两次,则第二个命令中指定的项目将追加到菜单的当前状态,而不是覆盖之前的菜单配置。因此,除非需要累积行为,否则在调用 AddToMenu
之前最好调用 DestroyMenu menu-name
。可以使用 AddToMenu
命令创建菜单。这采用以下语法
AddToMenu menu-name menu-title Title
删除 menu-title 和 Title 参数以创建没有标题的菜单。菜单中的后续条目采用以下语法
+ entry-name action
请参见以下示例
AddToMenu "Web" "Web Browsers" Title + "Firefox" Exec firefox + "Chromium Exec chromium + "Opera" Exec opera
使用 Popup
命令显示其他菜单。例如,要在另一个菜单中包含上面定义的菜单,可以使用以下语法
+ "Web Browsers" Popup "Web"
FVWM 菜单还支持图标。要为菜单项提供图标,请在条目名称后用 %
符号括起图标的路径 - 见下文
+ "Chromium %/usr/share/icons/hicolor/16x16/apps/chromium.png%" Exec chromium
使用 archlinux-xdg-menu 提供的 xdg_menu 工具自动生成菜单 - 请参阅 Xdg-menu#Fvwm2。
FVWM 中的菜单可以是动态的,这意味着每次打开菜单时都会刷新其内容。当使用菜单生成器(例如,从 XDG 桌面条目构建应用程序菜单的生成器)并且您希望内容始终保持最新时,这可能很有用。
可以通过使用 DynamicPopUpAction 和 DynamicPopDownAction 关键字在 FVWM 中创建动态菜单。前者可用于在打开菜单时创建/重新创建菜单,而后者可用于在关闭菜单时清除菜单。重要的是要注意,为了使子菜单是动态的,它包含在其中的父菜单也必须动态创建,即使它不包含任何动态内容。
考虑一个名为 my-menu 的假设菜单生成器,它生成如下所示的输出。
DestroyMenu recreate Submenu1 AddToMenu Submenu1 "Submenu 1" Title + "Item 1" Nop + "Item 2" Nop DestroyMenu recreate MyMenu AddToMenu MyMenu "My Menu" Title + "Submenu 1" Popup Submenu1
DestroyMenu
命令中使用了 recreate
参数。这必须用于所有动态创建的菜单(包括菜单生成器生成的所有菜单和子菜单),否则它们将无法正确刷新。现在假设我们希望将 my-menu 动态地合并到我们的根菜单中。这意味着根菜单也必须动态创建。要完成此操作,我们需要定义一个构造根菜单的函数和一个使用 PipeRead
命令调用动态菜单生成器的函数。然后在菜单定义本身中,可以使用 DynamicPopUpAction 来调用这些函数。请参见下面的示例。
DestroyMenu RootMenu AddToMenu RootMenu + DynamicPopUpAction Function CreateRootMenu + DynamicPopDownAction DestroyMenu recreate RootMenu DestroyFunc CreateRootMenu AddToFunc CreateRootMenu + I DestroyMenu recreate RootMenu + I AddToMenu RootMenu "Root Menu" Title + I AddToMenu RootMenu "My Menu" PopUp MyMenu + I AddToMenu RootMenu "XTerm" Exec xterm + I AddToMenu RootMenu "Firefox" Exec firefox DestroyMenu MyMenu AddToMenu MyMenu + DynamicPopUpAction Function CreateMyMenu + DynamicPopDownAction DestroyMenu recreate MyMenu DestroyFunc CreateMyMenu AddToFunc CreateMyMenu + I DestroyMenu recreate MyMenu + I PipeRead 'my-menu'
Style 命令
!
取反。例如,样式 Title
强制窗口管理器为窗口提供标题,而 !Title
则具有相反的效果。Style
命令允许配置窗口管理器本身的各个方面,并为某些窗口设置行为。语法为 Style window-name stylename
。window-name 参数可以是窗口名称、类、标题名称或资源字符串。使用 *
匹配所有窗口。有关所有可用样式,请参阅 [死链接 2023-10-29 ⓘ] fvwm(1) - 下面提供了一些示例
Style "*" CascadePlacement
- 使窗口管理器对所有新窗口使用级联放置算法。Style "Chromium" PositionPlacement center
- 确保所有新的 Chromium 窗口都放置在屏幕中央。Style "xterm" StartIconic
- 确保所有新的 XTerm 窗口都以图标化方式启动。Style "*" HilightBack indianred
- 将任何聚焦窗口的框架背景设置为 indianred 颜色。
函数
AddToFunc
命令是累积的,这意味着如果在同一函数上使用两次,则第二个命令中指定的项目将追加到函数的当前状态,而不是覆盖之前的函数配置。因此,除非需要累积行为,否则在调用 AddToFunc
之前最好调用 DestroyFunc func-name
。FVWM 提供了许多内置函数,例如 Close
用于关闭窗口,或 Exec
用于执行外部命令。用户还可以使用 AddToFunc
命令定义自己的函数或添加到现有函数。这使用以下语法:AddToFunc func-name I|M|C|H|D action
。字母代码代表以下含义:I - 立即执行,M - 用户移动鼠标时执行,C - 在鼠标单击时执行,H - 在用户按住鼠标按钮时执行,D - 在用户双击鼠标按钮时执行。下面是一个函数的简单示例
AddToFunc VolumeFunc + I Exec xterm -e alsamixer
还可以使用条件命令(请参阅 [死链接 2023-10-29 ⓘ] fvwm(1) 并查找条件命令部分)。例如,假设有人想要一个函数,该函数将关闭当前页面中除具有焦点的窗口之外的所有窗口。该函数可以定义如下
AddToFunc CloseAllButThis + I All (CurrentPage, !Focused) Close
All
条件匹配所有符合括号中定义的条件的窗口。函数可以执行多个操作,只需为每个操作添加一行,并以加号开头
AddToFunc MyFunc + I action1 + D action2 + I action3
模块
模块是单独的程序,由 FVWM 派生,可以添加额外的功能。可以使用以下语法派生模块:Module ModuleName (identifier) ModuleArgs
。
有时,可能希望派生同一类型模块的多个实例,每个实例都有自己的单独配置。在这种情况下,应使用标识符派生模块,例如
AddToFunc StartFunction + I Module FvwmButtons Panel1 + I Module FvwmButtons Panel2
其中 Panel1 和 Panel2 是标识符。
大多数模块都会有许多模块命令,可用于配置模块的外观或行为。使用以下语法
*ModuleName/Identifier: module-command command-args
例如,如果有人使用标识符 MyPager 派生了 FvwmPager,那么可以按以下方式对其进行配置
*MyPager: Geometry 135x90+0+0 *MyPager: Back midnightblue
FvwmPager
FvwmPager 是一个模块,它提供了窗口管理器提供的桌面和页面的可视化表示。与所有模块一样,它必须由 FVWM 派生。要启动 FvwmPager,请将类似于以下内容添加到您的 StartFunction
+ I Module FvwmPager
在没有参数的情况下,FvwmPager 将仅显示桌面 0 的视口。使用参数 0 9,FvwmPager 将显示来自 0-9 的 10 个桌面。
+ I Module FvwmPager 0 9
使用参数 *,FvwmPager 将仅显示一个桌面,但它将始终是当前正在使用的桌面。
+ I Module FvwmPager *
有关模块命令的列表,请参阅 [死链接 2023-10-29 ⓘ] FvwmPager(1)。
FvwmButtons
FvwmButtons 是一个模块,它可以创建一个按钮框,按下按钮可以执行操作。FvwmButtons 还可以“吞噬”应用程序窗口。这对于吞噬系统托盘窗口或时钟窗口可能很有用。面板的大小是自动确定的(面板将调整大小以容纳所有元素),但是也可以使用 Geometry
命令手动设置大小。这采用标准的 X geometry。创建 FvwmButtons 面板所需的基本命令如下所述。
设置行数和列数
*FvwmButtons: Rows x *FvwmButtons: Columns x
请注意,项目是通过从上到下,从左到右填充每一行来添加的。
BoxSize
选项设置为 fixed
。这确保仅使用指定的行数和列数。指定不可能的布局(例如,向具有 4 列和 1 行的面板添加 5 个按钮)将意味着按钮面板无法启动。更宽松的 BoxSize 算法(例如 smart
)将添加额外的行以尝试容纳所有元素,这可能会使配置错误更难以发现。创建一个按钮(此示例创建一个带有标题和图标的按钮,左键单击时启动 XTerm)
*FvwmButtons: (Title "Xterm", Icon /usr/share/pixmaps/mini.xterm_48x48.xpm, Action (Mouse1) Exec xterm)
您可以选择省略这些参数中的任何一个。
吞噬一个窗口(此示例吞噬一个 stalonetray)
*FvwmButtons: (Swallow(UseOld, NoClose) "stalonetray" "Nop")
Swallow 命令接受许多“hangon”参数。在此处,已使用 UseOld 和 NoClose 参数。UseOld 表示如果现有窗口存在,将被吞噬。NoClose 表示如果 FvwmButtons 进程终止,窗口将不会关闭。stalonetray 参数是我们要吞噬的窗口的类。根据需要替换。最后一个参数是启动要吞噬的应用程序的命令。在此示例中,假定应用程序已启动,因此提供的参数是 Nop,这是一个什么都不做的函数。可以将此替换为 "Exec stalonetray"
以从 FvwmButtons 模块启动应用程序,而不是假定应用程序已在其他地方启动。
容器是定义的空间,可以跨越多行和多列,或将行或列细分为更多行或列。例如,如果想要为元素分配一定百分比的空间,这将非常有用。假设有人想要吞噬 XClock 并为 XClock 分配 100% 的宽度和 80% 的高度。这可以定义为如下
*FvwmButtons: Rows 5 *FvwmButtons: Columns 1 *FvwmButtons: (1x4, Container) *FvwmButtons: (Swallow(UseOld, NoClose) "xclock" "Nop") *FvwmButtons: (End)
请注意,容器是通过定义一定数量的列和行,然后使用关键字 container 创建的。容器内的元素定义在此行下方,然后使用 End 命令关闭容器。
有关完整选项列表,请参阅 [死链接 2023-10-29 ⓘ] FvwmButtons(1)。
FvwmEvent
FvwmEvent 是一个模块,可用于将函数或音频文件绑定到窗口管理器事件(例如窗口的关闭)。在音频文件的情况下,当绑定到的事件发生时,将播放音频。可以通过将以下内容添加到 StartFunction
中,从 Fvwm 中派生 FvwmEvent
+ I Module FvwmEvent
也可以使用标识符派生 FvwmEvent - 请参阅 #模块。派生后,FvwmEvent 将在后台运行,等待它已配置为识别的事件。事件可以按以下形式配置
* FvwmEvent: windowshade Lower
其中 windowshade
是事件,Lower
是在该事件发生时要执行的命令。如果您希望执行带有参数的函数,则需要引用该函数及其参数 - 见下文
* FvwmEvent: new_page "Exec xterm"
有关事件的完整列表,请参阅 [死链接 2023-10-29 ⓘ] FvwmEvent(1)。
FvwmIdent
FvwmIdent 是一个模块,它可以显示有关在其上调用的特定窗口的许多信息项,例如窗口的类名、资源名称、图层、几何形状等等。此信息显示在模块创建的单独窗口中。可以使用 Module FvwmIdent
命令启动 FvwmIdent。这可以绑定到菜单项或热键。当在窗口的上下文中启动 FvwmIdent 时,将显示该窗口的信息。否则,将提示用户手动选择窗口。
颜色
FVWM 颜色样式可以采用多种颜色代码类型,例如十六进制颜色(例如 #ffffff
)、rbg 颜色(例如 rgb:ff/ff/ff
)以及预定义的 X11 颜色。
以下 样式 可能有用
Color
- 这需要两个参数,未聚焦窗口标题文本的颜色和未聚焦窗口框架的颜色,以斜杠分隔,例如 black/lightgrey。HilightBack
- 接受单个参数,聚焦窗口框架的颜色。HilightFore
- 接受单个参数,聚焦窗口标题文本的颜色。
颜色集
FVWM 中的颜色集是一组四种颜色(前景色、背景色、阴影颜色和高亮颜色)以及可选的背景 pixmap。如果更改了某个颜色集,则 FVWM 中使用该颜色集的任何部分都将受到影响。
所有颜色集都由一个数字标识。可以使用任何编号约定;fvwm-themes 项目记录了一种使用前 40 个颜色集 (0-39) 的约定。请参阅 [4]。
可以使用 ColorSet
命令创建颜色集 - 语法:ColorSet number options
。 更多信息请参阅 [死链 2023-10-29 ⓘ] fvwm(1) - 颜色集部分。
Style "*" Colorset num
会覆盖 Color
样式,而使用 Style "*" HilightColorset num
会覆盖 HilightFore
和 HilightBack
样式。字体
对于诸如 Font
之类的样式,请使用 xorg-xfontsel 来确定 X11 字体的正确字体名称 - 有关更多信息,请参阅 X 逻辑字体描述 和 字体配置。 您还可以指定 xft 字体,例如:"xft:DejaVu Sans:size=10"
。
图标
FVWM 中的窗口可以被图标化(最小化)。 这意味着窗口将从视图中消失,并被桌面上的图标替换,类似于 Microsoft Windows 3.1 中的行为。
程序本身将提供图标。 也可以设置一个默认图标以供使用,以防程序没有图标可提供:Style "*" Icon /path/to/default/icon.png
。
要完全禁用图标,请使用以下样式:Style "*" NoIcon
。 这意味着窗口在图标化时将简单地消失。
图标的定位可以使用 IconBox
样式控制 - 请注意,这与 FvwmIconBox 模块不同 - 以及 IconFill
样式。 使用 Style "*" IconBox none
来禁用 IconBox。 这意味着图标将放置在窗口左上角的位置。 否则,使用 Style "*" IconBox l t r b
,其中 l t r b 分别代表左、上、右和下。 这些参数应该是图标框边缘与屏幕边缘的像素距离。 因此,参数 +0 +0 -0 -0
表示 IconBox 将填充整个屏幕。
可以定义多个 IconBox 样式,但它们必须在同一行中定义,例如
Style "*" IconBox +0 +800 -100 -0, IconBox -200 +0 -0 -120
当第一个 IconBox 溢出时,图标将放置在第二个 IconBox 中。 请注意,如果最后一个 IconBox 溢出,则将使用默认的 IconBox,它覆盖整个屏幕并从上到下 - 从左到右填充。
使用 IconFill
样式来控制图标的填充方式。 Style "*" IconFill left bottom
样式表示图标将从左到右 - 从下到上填充(Motif 窗口管理器行为)。 Style "*" IconFill top left
样式表示图标将从上到下 - 从左到右填充。 请注意,IconFill 样式应与 IconBox 样式在同一行中定义,例如
Style "*" IconBox +0 +0 -0 -0, IconFill left bottom
技巧和窍门
MWM 兼容性选项
FVWM 提供了许多选项,使其能够模仿 MWM(Motif 窗口管理器)的外观和行为。
Emulate Mwm
- 此命令将几何反馈窗口放置在屏幕中央。MenuStyle Mwm
- 此命令使菜单具有 Motif 菜单的外观。MwmButtons
- 此样式使最大化按钮在窗口最大化时看起来像被按下。MwmBorder
- 此样式使窗口边框斜面更接近 Mwm 窗口边框的样式MwmDecor
- 此样式使 FVWM 尝试遵守某些应用程序可能设置的 MWM 提示。MwmFunctions
- 此样式使 FVWM 尝试识别和尊重 MWM 将禁止的功能。HintOverride
- 此样式类似于 MwmFunctions,但它会灰显禁止的功能,但允许用户仍然执行它们。
强制图标大小和背景
图标的大小不规则,因为不同的程序提供不同大小的图标。 使用 IconSize
样式强制使用规则大小:例如 Style "*" IconSize 48 48
。 请注意,大于给定大小的图标将被裁剪。
默认情况下,图标也没有背景。 您可以使用 IconBackgroundColorset
样式强制图标具有背景。 请参阅 #颜色集。
移动或调整窗口大小时不使用线框
使用 OpaqueMoveSize unlimited
命令在移动时查看窗口本身。
使用 Style "*" ResizeOpaque
在调整大小时查看窗口本身。
禁用边缘滚动
要禁用将鼠标指针移动到屏幕边缘时滚动到下一个视口,请使用以下命令:EdgeScroll 0 0
。
使用 ClickToFocus
确保已安装 perl-tk 和 perl-x11-protocol。 然后使用以下样式命令:Style "*" ClickToFocus
。 有关其他焦点行为,请参阅 [死链 2023-10-29 ⓘ] fvwm(1)。
窗口平铺
以下函数可以将窗口平铺到屏幕的左半部分、右半部分、上半部分或下半部分,或屏幕的每个角,并在再次调用时将窗口恢复到其原始位置和大小。
DestroyFunc TileLeft AddToFunc TileLeft + I ThisWindow (!Shaded, !Iconic) Maximize 50 100 + I ThisWindow (Maximized, !Shaded, !Iconic) Move +0 +0 DestroyFunc TileRight AddToFunc TileRight + I ThisWindow (!Shaded, !Iconic) Maximize 50 100 + I ThisWindow (Maximized, !Shaded, !Iconic) Move -0 +0 DestroyFunc TileTop AddToFunc TileTop + I ThisWindow (!Shaded, !Iconic) Maximize 100 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move +0 +0 DestroyFunc TileBottom AddToFunc TileBottom + I ThisWindow (!Shaded, !Iconic) Maximize 100 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move +0 -0 DestroyFunc TileTopLeft AddToFunc TileTopLeft + I ThisWindow (!Shaded, !Iconic) Maximize 50 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move +0 +0 DestroyFunc TileTopRight AddToFunc TileTopRight + I ThisWindow (!Shaded, !Iconic) Maximize 50 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move -0 +0 DestroyFunc TileBottomLeft AddToFunc TileBottomLeft + I ThisWindow (!Shaded, !Iconic) Maximize 50 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move +0 -0 DestroyFunc TileBottomRight AddToFunc TileBottomRight + I ThisWindow (!Shaded, !Iconic) Maximize 50 50 + I ThisWindow (Maximized, !Shaded, !Iconic) Move -0 -0
在页面或桌面切换时转移焦点
- 使用 FvwmEvent 允许在 FvwmPager 中单击页面时自动聚焦该页面中的窗口。 但是,它会破坏寻呼机的右键单击和拖动平移功能。 因此,您可能更喜欢从绑定到热键的另一个函数中调用
GoToPage
和Focus-Previous
,而不是使用 FvwmEvent。 - 如果您未使用 ClickToFocus,则需要在启动桌面切换之前临时将焦点方法设置为 ClickToFocus。 如果您不这样做,新桌面中指针下的任何窗口都将立即获得焦点,即使它不是先前聚焦的窗口。 请注意,这意味着您不能使用 FvwmEvent 方法。 相反,创建一个更改焦点方法的函数,然后调用
GoToDesk
和Focus-Previous
。
如果您正在使用 ClickToFocus,您可能希望在切换页面或桌面时自动将键盘焦点转移到该页面或桌面中先前聚焦的窗口。 否则,您必须在每次页面或桌面切换时单击您希望与之交互的窗口。 这可以通过使用 FvwmEvent 模块将一个函数绑定到 new_page
和 new_desk
事件来实现,该函数聚焦当前或先前聚焦的窗口。
以下是此类函数的示例
DestroyFunc Focus-Previous AddToFunc Focus-Previous + I All ($0, Focused) FlipFocus $1 + I TestRc (NoMatch) Prev ($0, AcceptsFocus) FlipFocus $1
$0
参数应为 CurrentPage
或 CurrentDesk
。 $1
参数用于为 FlipFocus
提供 NoWarp
参数 - 默认情况下,FlipFocus 将启动页面切换到包含聚焦窗口的页面。 此行为在切换桌面时很有用,但在切换页面时必须禁用,因为窗口可以跨越多个页面。
正确配置函数后,确保 FvwmEvent 已启动,然后将其绑定到所需的事件,如下所示
* FvwmEvent: new_page "Focus-Previous CurrentPage NoWarp" * FvwmEvent: new_desk "Focus-Previous CurrentDesk"
切换窗口装饰
可以使用下面定义的函数为选定的窗口切换窗口装饰(边框和标题栏)的开或关。
DestroyFunc UndecorateWin AddToFunc UndecorateWin + I ThisWindow (HasHandles) WindowStyle !Title, !Borders + I ThisWindow (!HasHandles) WindowStyle Title, Borders
Maximize Fullscreen
故障排除
最大化的应用程序未完全覆盖屏幕
某些应用程序(例如 XTerm)向窗口管理器提供的最大尺寸可能小于屏幕尺寸。 这意味着如果此类应用程序最大化,它将不会覆盖整个屏幕。 要强制 FVWM 忽略这些提示,请使用以下命令:Style "*" ResizeHintOverride
。
阻止修饰键干扰鼠标和按键绑定
NumLock、CapsLock 和 ScrollLock 可能会干扰 ClickToFocus 以及鼠标和按键绑定。 要禁用此行为,请使用以下命令:IgnoreModifiers L25
。
窗口启动位置在启动时更改
您可能会发现,对于某些程序,每次启动程序时,其窗口的起始位置都会更改。 同样,某些窗口会自动调整自身大小,这也可能影响它们的位置。
这通常是由于应用程序可以设置并且 FVWM 默认情况下会尊重的 PPosition(程序位置)或 USPosition(用户指定位置)提示。 对于有问题的窗口,您可以配置 FVWM 以忽略导致问题的提示。 第一步是获取相关窗口的类名或资源名称 - 为此请使用 #FvwmIdent 模块。 然后尝试禁用窗口的 PPosition 或 USPosition 提示。 例如
Style chromium !UsePPosition
对于位置受调整大小影响的窗口,通常可以通过在窗口上设置 FixedPPosition 样式来修复此问题,这将导致 FVWM 忽略窗口更改其位置的尝试。 如果需要,可以结合忽略 USPosition 提示来设置此样式,请参见下文
Style VirtualBox !UseUSPosition, FixedPPosition
!UseTransientPPosition
或 !UseTransientUSPosition
样式。另请参阅
- GitHub 上的 FVWM.
- FVWM 初学者指南 - 仍然有效,但有些过时。
- FVWM 主页 - 包括文档和常见问题解答。
- FVWM Wiki.
- FVWM 论坛.
- [死链 2023-10-29 ⓘ] fvwm(1)
- FVWM 主题 - Box-Look.org。
- FVWM 配置 - FVWM 论坛中的帖子。
- FVWM 技巧 - Thomas Adam(FVWM 开发人员)的论坛帖子。