FVWM

来自 ArchWiki

本文或章节是移动到 Fvwm 的候选对象。

注意: 看起来上游更改了大小写。(在 Talk:FVWM 中讨论)

本文或章节已过时。

原因: 在 2017 年初,Fvwm 2.6.x 版本被冻结并仅进行维护开发。Fvwm2 当前版本为 2.7.0。

Fvwm3 被创建为 Fvwm2 的一个分支,用于未来的任何开发,其目的是打破与 Fvwm2 的兼容性,以允许进行重大更改。Fvwm3 版本 1.0.0 于 2020 年 9 月 3 日发布。

此 Wiki 页面(在更新之前)是为 Fvwm2 编写的,需要更新。(在 Talk:FVWM 中讨论)

Fvwm 是一个符合 ICCCM 标准的 X Window 系统的多虚拟桌面窗口管理器。它通过编辑基于文本的配置文件进行配置。虽然使用 FVWM 不需要任何编程语言知识,但可以使用 M4CPerl 预处理来扩展 FVWM。FVWM 还有一个 Perl 库,允许创建 模块。FVWM 代表 F Virtual Window Manager,首选的解释是 F 没有任何特定的含义 [1]

安装

本文或章节已过时。

原因: 与其遵循此 wiki,不如安装 fvwm3AUR 软件包,或者 fvwm3-gitAUR 软件包(用于开发版本)。有关新用户的信息以及 Fvwm3 配置可以在 Fvwm3 首页和手册页上找到。(在 Talk:FVWM 中讨论)

安装 fvwmAUR 软件包。

以下软件包为 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

启动函数

注意: 建议 您仅使用 StartFunction 并利用 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 中可用的桌面数量非常大,最小桌面编号为 -2147483648,最大值为 2147483647。默认情况下,FVWM 从桌面 0 开始。可以使用 pager 模块(如果配置为显示多个桌面)或 GoToDesk 命令导航桌面 - GoToDesk +1 将移动到相对于当前使用桌面的下一个桌面。

键盘和鼠标绑定

可以在配置文件中使用 KeyMouse 命令定义键盘或鼠标绑定。命令的语法采用以下形式: 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(无),或 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

状态可以是 ActiveUpActiveDownInactiveUpInactiveDown 之一。ActiveUpActiveDown 指的是活动窗口的未按下和按下按钮状态。Inactive 状态也是如此。也可以仅使用 ActiveInactive,它们是按下和未按下按钮状态的快捷方式。

样式参数可以是以下之一

  • 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。

标志影响按钮的状态。标志的一些示例包括 RaisedSunkFlat。有关更多信息,请参阅 [死链接 2023-10-29 ⓘ] fvwm(1) 并查找 ButtonStyle 部分。

注意: 要使按钮具有与标题相同的背景,请使用 UseTitleStyle 标志。或者,使用 ButtonStyle 命令指定按钮背景,然后在后面跟一个 AddButtonStyle 命令以指定矢量或 pixmap 图像。AddButtonStyle 采用与 ButtonStyle 相同的语法。

标题和边框样式

可以使用 TitleStyleBorderStyle 命令分别配置窗口标题和边框。

TitleStyle 可以采用以下参数

TitleStyle justify Height height-in-pixels

justify 参数可以是 LeftJustifiedRightJustifiedCentered。TitleStyle 和 BorderStyle 可以采用以下参数

TitleStyle/BorderStyle state style -- flag

有关 statestyleflag 参数,请参阅 #按钮样式

菜单

注意: 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 桌面条目构建应用程序菜单的生成器)并且您希望内容始终保持最新时,这可能很有用。

可以通过使用 DynamicPopUpActionDynamicPopDownAction 关键字在 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 stylenamewindow-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

模块

注意: 自 2.6.7 版本起,已删除许多旧的 FVWM 模块。[3] 那些希望继续使用这些模块的人应使用 fvwm2-stable,这是一个 LTS 版本,代表 2.6.7 之前的版本。

模块是单独的程序,由 FVWM 派生,可以添加额外的功能。可以使用以下语法派生模块: Module ModuleName (identifier) ModuleArgs

有时,可能希望派生同一类型模块的多个实例,每个实例都有自己的单独配置。在这种情况下,应使用标识符派生模块,例如

AddToFunc StartFunction
+ I Module FvwmButtons Panel1
+ I Module FvwmButtons Panel2

其中 Panel1Panel2 是标识符。

大多数模块都有许多模块命令,可用于配置模块的外观或行为。使用以下语法

*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 几何结构。创建 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”参数。在这里,使用了 UseOldNoClose 参数。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 命令关闭。

提示: 要以像素尺寸定义容器,请确保按钮面板中的行数和列数分别等于面板的像素高度和宽度。因此,对于 300x200 面板,设置 300 列和 200 行。

有关完整选项列表,请参阅 [死链接 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 覆盖 HilightForeHilightBack 样式。

字体

对于 Font 等样式,请使用 xorg-xfontsel 确定 X11 字体的正确字体名称 - 有关更多信息,请参阅 X Logical Font Description字体配置。您还可以指定 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(下)。这些参数应该是 IconBox 边缘距离屏幕边缘的像素数。因此,参数 +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-tkperl-x11-protocol。然后使用以下样式命令:Style "*" ClickToFocus。有关其他焦点行为,请参阅 [dead link 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 中单击页面时自动聚焦该页面中的窗口。但是,它会破坏 pager 的右键单击和拖动平移功能。因此,您可能更喜欢从绑定到热键的另一个函数中调用 GoToPageFocus-Previous,而不是使用 FvwmEvent。
  • 如果您不使用 ClickToFocus,则需要在启动桌面切换之前临时将焦点方法设置为 ClickToFocus。如果您不这样做,新桌面中指针下的任何窗口都会立即获得焦点,即使它不是先前聚焦的窗口。请注意,这意味着您不能使用 FvwmEvent 方法。相反,创建一个更改焦点方法的函数,然后调用 GoToDeskFocus-Previous

如果您正在使用 ClickToFocus,您可能希望在切换页面或桌面时自动将键盘焦点转移到该页面或桌面中先前聚焦的窗口。否则,您必须在每次页面或桌面切换时单击您希望与之交互的窗口。这可以通过使用 FvwmEvent 模块将一个函数绑定到 new_pagenew_desk 事件来实现,该函数将焦点设置到当前或先前聚焦的窗口。

以下是这样一个函数的示例

DestroyFunc Focus-Previous
AddToFunc Focus-Previous
+ I All ($0, Focused) FlipFocus $1
+ I TestRc (NoMatch) Prev ($0, AcceptsFocus) FlipFocus $1

$0 参数应为 CurrentPageCurrentDesk$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
提示: 如果您希望将窗口全屏化,此功能已添加到 FVWM 2.6.8 及更高版本的 Maximize 命令中,请使用以下命令:Maximize Fullscreen

故障排除

最大化的应用程序未完全覆盖屏幕

某些应用程序(例如 XTerm)会向窗口管理器提供一个可能小于屏幕尺寸的最大尺寸。这意味着如果最大化此类应用程序,它将不会覆盖整个屏幕。要强制 FVWM 忽略这些提示,请使用以下命令:Style "*" ResizeHintOverride

阻止修饰键干扰鼠标和键盘绑定

NumLock、CapsLock 和 ScrollLock 可能会干扰 ClickToFocus 以及鼠标和键盘绑定。要禁用此行为,请使用以下命令:IgnoreModifiers L25

窗口启动位置在启动时发生变化

您可能会发现,对于某些程序,其窗口的起始位置在每次程序启动时都会发生变化。同样,某些窗口会自动调整自身大小,这也可能会影响它们的位置。

这通常是由于 PPosition(程序位置)或 USPosition(用户指定位置)提示引起的,应用程序可以设置这些提示,并且 FVWM 默认情况下会尊重这些提示。对于有问题的窗口,您可以配置 FVWM 忽略导致问题的提示。第一步是获取有问题的窗口的类名或资源名 - 使用 #FvwmIdent 模块来完成此操作。然后尝试禁用窗口的 PPosition 或 USPosition 提示。例如

Style chromium !UsePPosition

对于位置受调整大小影响的窗口,通常可以通过在窗口上设置 FixedPPosition 样式来修复此问题,这会使 FVWM 忽略窗口更改其位置的尝试。如果需要,可以结合忽略 USPosition 提示来设置此样式,请参见下文

Style VirtualBox !UseUSPosition, FixedPPosition
注意: 属于应用程序的窗口(例如弹出对话框和菜单)通常被声明为 Transient(瞬态)。要忽略瞬态窗口上的 PPosition 或 USPosition 提示,请分别使用 !UseTransientPPosition!UseTransientUSPosition 样式。

另请参阅