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 文件中。
有关详情(例如保留 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 命令。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 实现了工作区 (workspaces,由 Metacity 和 Openbox 等窗口管理器使用) 和视口 (viewports,由 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 将跳转到当前桌面后的下一个桌面。
键盘和鼠标绑定
可以在配置文件中使用 Key 或 Mouse 命令定义键盘或鼠标绑定。命令语法如下:Key/Mouse (window) button/key name context modifiers action。例如,以下示例将在按下 Alt+F2 时启动 XTerm:Key F2 A 1 Exec xterm。注意 (window) 参数是可选的。
Context (上下文) 值定义了绑定应用的位置。以下上下文有效:R (根窗口), W (应用程序窗口), D (桌面管理器窗口 - 例如 PCManFM 桌面管理器), T (标题栏), S (窗口侧边、顶部、底部), [ ] - _ (左侧、右侧、顶部、底部), F (窗口框架边角), < > ^ v (左、右、上、下边角), I (图标窗口), 0-9 (标题栏按钮) 和 A (所有上下文)。这些字母的任意组合也是可接受的。
Modifier (修饰键) 值可以是以下之一:A (任意), C (Control), S (Shift), M (Meta), N (无), 或 1-5 (代表 X 修饰键 - 运行 xmodmap 可查看对应的 X 修饰键)。多个修饰键之间不应有空格。例如,要使用 Control+Alt 修饰键,应提供 C1 作为参数。
Action (操作) 必须是可运行的 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
State (状态) 可以是 ActiveUp, ActiveDown, InactiveUp, InactiveDown 之一。ActiveUp 和 ActiveDown 指活动窗口的未按下和按下状态。非活动状态同理。也可以仅使用 Active 或 Inactive,它们分别是按下和未按下状态的快捷方式。
Style 参数可以是以下之一:
- Simple - 不做任何操作。
- Default - 接受按钮编号作为参数,加载默认样式。
- Solid - 使用纯色填充按钮。
- ColorSet - 使用指定的 ColorSet 填充按钮 - 接受 0 到 100 之间的透明度参数。
- Vector - 绘制线条图案 - 使用关键字 Vector 是可选的,因为这是标准样式。
- ?Gradient - 使用渐变填充按钮 - 语法请参阅 fvwm(1) 的颜色渐变部分。
- Pixmap - 使用给定的像素图填充按钮 - 另请参阅以下变体:AdjustedPixmap, ShrunkPixmap, StretchedPixmap, TiledPixmap。
- MiniIcon - 使用窗口的迷你图标填充按钮。
许多矢量样式记录在此处。您还可以使用此 矢量按钮查看器 创建自己的矢量按钮。最后,请参阅此页面获取一些使用像素图的示例装饰配置,包括仿 Crux(Sawfish 主题)、Mac OS 和 Windows 98 的外观。
Flag (标志) 会影响按钮的状态。一些标志示例包括 Raised, Sunk 和 Flat。有关更多信息,请查看 fvwm(1) 中的 ButtonStyle 部分。
UseTitleStyle 标志。或者,使用 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) 中的条件命令部分)。例如,假设您想要一个函数来关闭当前页面中除聚焦窗口之外的所有窗口,可以定义如下:
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 还可以“吞噬 (swallow)”应用程序窗口。这对于吞噬系统托盘窗口或时钟窗口很有用。面板大小是自动确定的(面板将调整大小以适应所有元素),但也可以使用 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,并为 XClock 分配 100% 的宽度和 80% 的高度。可以定义如下:
*FvwmButtons: Rows 5 *FvwmButtons: Columns 1 *FvwmButtons: (1x4, Container) *FvwmButtons: (Swallow(UseOld, NoClose) "xclock" "Nop") *FvwmButtons: (End)
请注意,容器是通过定义一定数量的列和行,然后使用关键字 container 来创建的。容器内的元素定义在此行下方,容器最后以 End 命令结束。
有关完整选项列表,请参阅 FvwmButtons(1)。
FvwmEvent
FvwmEvent 是一个模块,可用于将函数或音频文件绑定到窗口管理器事件(例如窗口关闭)。如果是音频文件,当绑定的事件发生时将播放音频。可以通过将以下内容添加到您的 StartFunction 来从 Fvwm 内部生成 FvwmEvent:
+ I Module FvwmEvent
FvwmEvent 也可以使用标识符生成 - 参阅 #模块。生成后,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- 接受单个参数,即聚焦窗口标题文字的颜色。
颜色集 (Colorsets)
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 逻辑字体描述 和 字体配置。您也可以指定 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-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 维基.
- FVWM 论坛.
- fvwm(1)
- FVWM 主题 - Box-Look.org。
- FVWM 配置 - FVWM 论坛中的主题帖。
- FVWM 技巧 - FVWM 开发人员 Thomas Adam 的论坛文章。