FVWM
Fvwm 是一个符合 ICCCM 标准的、支持多虚拟桌面的 X Window 系统窗口管理器。它通过编辑基于文本的配置文件来配置。虽然使用 FVWM 不需要任何编程语言知识,但可以通过 M4、C 和 Perl 预处理器来扩展 FVWM。FVWM 还有一个 Perl 库,允许用户创建 模块。FVWM 代表 F Virtual Window Manager,但更普遍的解释是 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 中。
有关详细信息,请参阅 xinitrc,例如保留 logind 会话。
自启动
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 网格。可以通过 分页器模块或 GoToPage 命令来导航页面,该命令可以映射到键盘快捷键或菜单项。例如,命令 GoToPage -1p +0p 将视口向左移动 1 页。
FVWM 中可用的桌面数量非常庞大,最小桌面编号为 -2147483648,最大为 2147483647。默认情况下,FVWM 启动于桌面 0。可以使用分页器模块(如果配置为显示多个桌面)或 GoToDesk 命令来导航桌面 - GoToDesk +1 将相对于当前使用的桌面移动到下一个桌面。
键盘和鼠标绑定
可以在配置文件中使用 Key 或 Mouse 命令定义键盘或鼠标绑定。命令语法如下: Key/Mouse (窗口) 按钮/按键名称 上下文 修饰符 操作。例如,以下示例将在按下 Alt+F2 键时启动一个 XTerm: Key F2 A 1 Exec xterm。请注意,(窗口) 参数是可选的。
上下文值定义了绑定将被应用的位置。以下上下文是有效的: R (根窗口), W (应用程序窗口), D (桌面管理器窗口 - 例如 PCManFM 桌面管理器), T (标题栏), S (窗口侧边,顶部,底部), [ ] - _ (分别为左侧,右侧,顶部,底部), F (窗口边框角), < > ^ v (分别为左、右、上、下角), I (图标窗口), 0-9 (标题栏按钮) 和 A (所有上下文)。这些字母的任何组合也是可接受的。
修饰符值可以是以下之一: A (任意), C (Control), S (Shift), M (Meta), N (无),或 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,它们是按下和未按下按钮状态的快捷方式。
style 参数可以是以下之一
- Simple - 无操作。
- Default - 接受按钮编号作为参数,用于加载默认样式。
- Solid - 以纯色填充按钮。
- ColorSet - 使用指定的 ColorSet 填充按钮 - 接受 0 到 100 之间的 alpha 值。
- Vector - 绘制线条图案 - 使用 Vector 关键字是可选的,因为这是一种标准样式。
- ?Gradient - 用渐变填充按钮 - 有关语法,请参阅 fvwm(1) 的颜色渐变部分。
- Pixmap - 用指定的位图填充按钮 - 另请参阅以下变体:AdjustedPixmap、ShrunkPixmap、StretchedPixmap、TiledPixmap。
- MiniIcon - 用窗口的迷你图标填充按钮。
一些矢量样式在此处 文档化。您也可以使用这个 矢量按钮查看器 创建自己的矢量按钮。最后,有关使用位图进行一些示例装饰配置(包括 Crux (Sawfish 主题)、Mac OS 和 Windows 98 的模仿)的页面,请参阅 此页面。
flag 影响按钮的状态。一些 flag 包括 Raised、Sunk 和 Flat。有关更多信息,请参阅 fvwm(1) 并查找 ButtonStyle 部分。
UseTitleStyle flag。或者,使用 ButtonStyle 命令指定按钮背景,然后在其后跟 AddButtonStyle 命令来指定矢量或位图图像。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#Fvwm。
动态菜单
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 参数可以是窗口名称、类、标题名称或资源字符串。使用 * 匹配所有窗口。有关所有可用样式,请参阅 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
您还可以使用条件命令(请参阅 fvwm(1) 并查找 Conditional Commands 部分)。例如,假设您想要一个函数,该函数可以关闭当前页面中的所有窗口,除了具有焦点的那个。该函数可以定义如下
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 *
有关模块命令列表,请参阅 FvwmPager(1)。
FvwmButtons
FvwmButtons 是一个模块,可以创建一个按钮框,按下按钮时可以执行操作。FvwmButtons 还可以“吞没”应用程序窗口。这对于吞没系统托盘窗口或时钟窗口可能很有用。面板的大小是自动确定的(面板会调整大小以容纳所有元素),但也可以使用 Geometry 命令手动设置大小。它采用标准的 X 几何格式。创建 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 并为其分配 100% 的宽度和 80% 的高度。可以这样定义
*FvwmButtons: Rows 5 *FvwmButtons: Columns 1 *FvwmButtons: (1x4, Container) *FvwmButtons: (Swallow(UseOld, NoClose) "xclock" "Nop") *FvwmButtons: (End)
请注意,容器是通过定义一定数量的列和行来创建的,然后使用 keyword container。容器内的元素在此行下方定义,容器由 End 命令关闭。
有关完整的选项列表,请参阅 FvwmButtons(1)。
FvwmEvent
FvwmEvent 是一个模块,可用于将一个 函数 或一个音频文件绑定到窗口管理器事件(例如窗口关闭)。对于音频文件,当绑定的事件发生时,音频将播放。FvwmEvent 可以从 Fvwm 内部启动,方法是将以下内容添加到您的 StartFunction 中
+ I Module FvwmEvent
FvwmEvent 也可以使用标识符启动 - 请参阅 #Modules。启动后,FvwmEvent 将在后台运行,等待它已配置识别的事件。事件的配置形式如下
* FvwmEvent: windowshade Lower
其中 windowshade 是事件,Lower 是在该事件发生时要执行的命令。如果您希望执行带参数的函数,则需要将该函数及其参数加上引号 - 见下文
* FvwmEvent: new_page "Exec xterm"
有关事件的完整列表,请参阅 FvwmEvent(1)。
FvwmIdent
FvwmIdent 是一个模块,它可以显示关于它被调用的特定窗口的许多信息项,例如窗口的类名、资源名、层、几何尺寸等。这些信息显示在一个由模块创建的单独窗口中。FvwmIdent 可以使用 Module FvwmIdent 命令启动。这可以绑定到菜单项或热键。当在窗口的上下文中启动 FvwmIdent 时,将显示该窗口的信息。否则,将提示用户手动选择一个窗口。
颜色
FVWM 颜色样式可以接受多种颜色代码类型,例如十六进制颜色(例如 #ffffff)、rgb 颜色(例如 rgb:ff/ff/ff)以及预定义的 X11 颜色。
以下 样式 可能有用
Color- 它接受两个参数,分别为未聚焦窗口标题文本的颜色和未聚焦窗口框架的颜色,用斜杠分隔,例如 black/lightgrey。HilightBack- 接受单个参数,即已聚焦窗口框架的颜色。HilightFore- 接受单个参数,即已聚焦窗口标题文本的颜色。
颜色集
FVWM 中的颜色集是一组四种颜色(前景色、背景色、阴影色和高亮色)以及可选的背景位图。使用特定颜色集的 FVWM 的任何部分都会在其颜色集更改时受到影响。
所有颜色集都由一个数字标识。可以使用任何编号约定;fvwm-themes 项目记录了一种使用前 40 个颜色集(0-39)的约定。请参阅 [4]。
可以使用 ColorSet 命令创建颜色集 - 语法: ColorSet number options。有关更多信息,请参阅 fvwm(1) - Colorsets 部分。
Style "*" Colorset num 会覆盖 Color 样式,使用 Style "*" HilightColorset num 会覆盖 HilightFore 和 HilightBack 样式。字体
对于 Font 等样式,请使用 xorg-xfontsel 来确定 X11 字体的正确字体名称 - 有关更多信息,请参阅 X Logical Font Description 和 Font configuration。您也可以指定 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 分别代表 left(左)、top(上)、right(右)和 bottom(下)。这些参数应该是图标框边缘距离屏幕边缘的像素数。因此,参数 +0 +0 -0 -0 意味着图标框将填充整个屏幕。
可以定义多个 IconBox 样式,但它们必须定义在同一行上,例如
Style "*" IconBox +0 +800 -100 -0, IconBox -200 +0 -0 -120
当第一个 IconBox 溢出时,图标将随后放置在第二个 IconBox 中。请注意,如果最后一个 IconBox 溢出,将使用默认的 IconBox,该 IconBox 填充整个屏幕,并从上到下 - 从左到右填充。
使用 IconFill 样式来控制图标的填充方式。Style "*" IconFill left bottom 的样式意味着图标将从左到右 - 从下到上填充(Motif Window Manager 行为)。Style "*" IconFill top left 的样式意味着图标将从上到下 - 从左到右填充。请注意,IconFill 样式应与 IconBox 样式在同一行上定义,例如
Style "*" IconBox +0 +0 -0 -0, IconFill left bottom
技巧与提示
MWM 兼容选项
FVWM 提供了一些选项,允许它模仿 MWM (Motif Window Manager) 的外观和行为。
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。有关其他焦点行为,请参阅 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 中的页面时自动将焦点转移到该页面中的窗口。但是,这会破坏 pager 的右键单击和拖动平移功能。因此,您可能更倾向于使用绑定到热键的另一个函数来调用
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 论坛.
- fvwm(1)
- FVWM 主题 - Box-Look.org。
- FVWM 配置 - FVWM 论坛上的帖子。
- FVWM 技巧 - Thomas Adam(FVWM 开发人员)的论坛帖子。