在Wayland上使用Fcitx5
Wayland是下一代显示服务器协议。虽然该协议的初始版本是在2008 年,但对输入法的支持并不是很理想。
此外,在基于Wayland的合成器上使用输入法可能需要不同的设置才能使其工作,并且 Wayland 尚不支持在 X11 下工作的 fcitx 的某些功能。
本页将尝试涵盖所有当前信息以及一些基本细节,并且设置Fcitx5页提及的配置仍然有用。
应用程序
TL;DR 我们还需要 XMODIFIERS, GTK_IM_MODULE 和 QT_IM_MODULE?
XMODIFIERS
对于 XMODIFIERS来说我们仍需要。 在 X11 和 XWayland 下运行的 X11 应用程序几乎没有区别。
GTK_IM_MODULE
在理想的设置中,您应该使用在 X11 下运行的 fcitx im 模块 Gtk 应用程序,以及用于 wayland 的 Gtk 的 text-input-v3。执行此操作的方法是:
-
不要设置GTK_IM_MODULE环境变量。
-
对于 Gtk2,在 ~/.gtkrc-2.0 中添加以下内容
gtk-im-module="fcitx"
- 对于 Gtk 3,请在
~/.config/gtk-3.0/settings.ini
中添加以下内容
[Settings]
gtk-im-module=fcitx
- 对于 Gtk 4,请在
~/.config/gtk-4.0/settings.ini
中添加以下内容
[Settings]
gtk-im-module=fcitx
- 如果您使用的是 GNOME 3+,请同时运行以下命令。
gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/IMModule':<'fcitx'>}"
GTK_IM_MODULE,就目前而言,现代 Gtk 3/4 应用程序应该能够使用 text-input-v3,几乎所有合成器都支持它,除了 weston。在设置 GTK_IM_MODULE 的值方面,有几种不同的选项。当它被取消设置时,Gtk 内置的 Wayland im 模块将用于 Gtk3 和 Gtk4。虽然你也可以通过执行 GTK_IM_MODULE=wayland 来强制执行它,但请记住它也会被 Gtk2 接收。设置 GTK_IM_MODULE=fcitx 仍然可以工作,如果你的合成器不支持 Wayland 输入法前端,这是必要的。
使用 Gtk 配置文件可以强制使用某个 im 模块,因此无需设置 GTK_IM_MODULE,它仍然可以使用不同的 im 模块。
根据 Gtk 实现(在 3.24.41 中仍然有效),首选项的顺序是:
- X11
- 环境中的GTK_IM_MODULE
- 来自 XSettings 的 Gtk/IMModule 的值
- 配置文件中的值
- 基于区域设置的自动选择
- Wayland
- 环境中的GTK_IM_MODULE
- “wayland”
QT_IM_MODULE
QT_IM_MODULE,目前 QT 只能使用自己的 text-input-v{2,4},只有 KWin 支持。这意味着,在 KDE 下你应该取消设置它,但在其他桌面下,你需要把它设置为 QT_IM_MODULE=fcitx。此外,在野外的专有 Qt 应用程序使情况复杂化。有些不能在 Wayland 上运行,有些不捆绑/提供 Qt wayland。他们中的大多数不捆绑 fcitx im 模块,因为 fcitx 只是 Qt 的第三方应用程序,但我也注意到有些人捆绑但没有捆绑所有需要的库。虽然 fcitx 5 支持 ibus 协议,但其中一些应用程序甚至没有捆绑 ibus im 模块。对于那些专有的 Qt 应用程序(WPS、Anki、DaVinci Resolve、Mathematica 等),您可以尝试几种不同的环境变量。
QT_IM_MODULE=fcitx # 对于那些捆绑 qt im 模块的应用,例如 WPS、Anki,你应该找到一个文件名中带有 fcitx 的 .so 文件
QT_IM_MODULE=ibus # 对于那些捆绑了 Qt 附带的 ibus im 模块的应用,您应该在包中找到 libibusplatforminputcontextplugin.so。
QT_QPA_PLATFORM=xcb QT_IM_MODULE=ibus # 强制它在 X11/XWayland 上运行并使用 ibus im 模块
在 Qt 6.7 中,有一个名为 “QT_IM_MODULES” 的新环境变量,它允许您在 im 模块上指定回退顺序。您可以将其设置为
QT_IM_MODULES="wayland;fcitx;ibus"
因此,即使对于没有捆绑 fcitx/wayland 的应用程序,它也将能够选择最有用的一个。请记住,您可能仍然需要设置(或取消设置)QT_IM_MODULE(而不是“QT_IM_MODULES”)来处理 Qt 4/5 应用程序。
在 XWayland 下运行的旧版 X11 应用程序
总之,XWayland 对输入法的支持与普通的 X11 显示服务器一样好。只要你设置了相同的环境变量,使用 Xwayland 应该不是问题。此类别包括:
- Xlib-based (以及其他基于 Xlib 的工具包,例如 tk、SDL1 等),例如 xterm、rxvt。确保 XMODIFIERS 设置正确。
- Gtk2-based 应用程序,类似于 Xlib,但可以使用 fcitx im 模块。将 GTK_IM_MODULE 设置为 fcitx 将为其提供最佳体验。
- SDL2-based 不默认为 Wayland 的应用程序。将 SDL_IM_MODULE 设置为 fcitx
- electron, chromium, 这些仍然是 X11 的默认版本,类似于 Gtk2 的情况。
- 对于 Qt4 应用程序,Qt 4 只能使用 X11。您需要QT_IM_MODULE fcitx。使用 XCB 的 Qt5+ 也是如此(可以用 QT_QPA_PLATFORM=xcb 覆盖)。
Gtk3 / Gtk4
Gtk3 和 Gtk4 原生支持 text-input-v3。同时,也可以使用 wayland 下的 fcitx im 模块。所以,GTK_IM_MODULE=wayland 或 GTK_IM_MODULE=fcitx 都可以。它有一些不同于 text-input-v3
Qt5 / Qt6
如果你的 Qt 应用程序原生运行在 Wayland 下,你可以取消设置 QT_IM_MODULE 使其使用 text-input-v2,或者设置 QT_IM_MODULE=fcitx 使其使用 fcitx im 模块。
text-input-v2 没有上游到 wayland-protocols,这可能就是为什么只有 Kwin 支持它的原因。这意味着在非 kwin 环境中,您需要使用 QT_IM_MODULE=fcitx 来使 Qt 应用程序正常工作。
在 Qt6 上,如果您的 Qt 版本包含这些内容,您还可以使用 QT_IM_MODULE=(空)或 QT_IM_MODULE=wayland .
原生wayland应用程序 (winit)
很可能正在使用 text-input-v3。
Chromium / Electron
警告: 本节中的信息可能不是最新的,无法反映上游的更改,尤其是未更改任何选项时的默认行为。
TL;DR 版本,如果你使用 XWayland 运行 Chromium 或 Electron 应用程序,只需像 X11 一样安装 Gtk im module 和 GTK_IM_MODULE=fcitx 即可。
如果您选择在 Wayland 下本地运行它,对于 chromium,您需要使用
# 如果您的合成器支持 text-input-v1 协议。检查下面的合成器部分。
chromium --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime
或者
# 除非你使用 GNOME shell + kimpanel 扩展,否则输入法弹出窗口的位置会出错。
chromium --enable-features=UseOzonePlatform --ozone-platform=wayland --gtk-version=4
对于 electron,只有第一个选项可用(electron 不支持使用 gtk4 运行内部 chromium),例如对于 vscode
# 如果您的合成器支持 text-input-v1 协议。检查下面的合成器部分。
code --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime
默认情况下,它应该在 Xwayland 下运行(截至 2023 年 2 月 25 日在 Archlinux/Chromium 110.0.5481.177 上),但一些用户也报告说它正在使用 wayland,即使“首选臭氧平台”是“默认”。所以要检查它是否真的用 wayland 运行,你可以使用 xeyes 或 xwininfo。使用 xeyes,如果是 X11 窗口,“眼睛”会随着鼠标移动,否则就是 wayland。使用 xwininfo,如果鼠标光标变为 “+” 形状,点击窗口显示窗口信息,则为 X11 窗口。
您可以强制它与 Wayland 一起运行,或者使用标志 –ozone-platform=wayland 和 –ozone-platform=x11 的 X11 运行。您可以通过更改 chrome://flags 中的“首选臭氧平台”选项来保留此功能。它有四个值,“Default”、“X11”、“Wayland”、“Auto”。
如果它与 Gtk4 一起运行(目前仅支持 chromium/chrome,不支持 electron),则可以通过传递 –gtk-version=4 来使其使用 GTK_IM_MODULE。
除了上面的标志之外,还可以通过传递 –enable-wayland-ime 来使其使用 text-input-v1。
Chromium 对 text-input-v1 的支持不是很稳定,您可能会遇到一些随机崩溃。例如,在过去,版本 112 有一个崩溃错误,该错误已在版本 115 中修复。在错误评论中,Chromium 开发人员声称此 text-input-v1 只应该在内部使用,没有得到很好的支持,因此使用它的风险由您自己承担,尽管它是目前唯一的开箱即用选项。
你应该只使用 –enable-wayland-ime 或 –gtk-version=4 中的一个,这取决于你想使用 text-input-v1 或 gtk4 im 模块。text-input-v1 适用于 Kwin 5.27 和 Weston。Gtk4 im 模块适用于所有环境,但只有带有 Kimpanel 扩展的 GNOME 才能在正确的位置显示弹出窗口。
支持Wayland合成器
即使你只使用原生 wayland 应用程序,也建议启用 Xwayland,原因如下。如果 im 模块中的客户端输入面板不工作,fcitx 将回退到 X11 窗口,而不是 wayland 窗口。这样做的原因是 wayland 窗口不能在屏幕上自由放置。相反,即使 im 模块只能将相对于应用程序窗口的坐标传递给 fcitx,这使得坐标位置没有多大意义,如果你的应用程序窗口大小是“最大化”的,那么如果将其视为全局坐标,该坐标可能只是“正确”。这使得 X11 窗口成为比随机放置的 wayland 窗口更好的选择。
KDE Plasma
最佳设置:
-
KDE Plasma 5.27
-
环境变量:
- 为XWayland应用设置XMODIFIERS=@im=fcitx
- 开启fcitx5, “系统设置” -> “虚拟键盘” -> 选择Fcitx5
- 不要设置 GTK_IM_MODULE & QT_IM_MODULE & SDL_IM_MODULE 。你可以通过运行
im-config
来取消设置GTK_IM_MODULE
和QT_IM_MODULE
,然后在im-config
中选择“不设置任何输入法”,并使用桌面默认设置。 - 使用
–enable-features=UseOzonePlatform –ozone-platform=wayland –enable-wayland-ime
来运行 Chromium/electron 应用程序。
-
注意事项:
- 某些仅在 X11 环境下才能正常运行的 GTK/Qt 应用程序可能仍需要分别为它们设置
GTK_IM_MODULE
或QT_IM_MODULE
。 - 如果你全局设置了
GTK_IM_MODULE/QT_IM_MODULE
,你将会遇到问题。
- 某些仅在 X11 环境下才能正常运行的 GTK/Qt 应用程序可能仍需要分别为它们设置
支持信息:
- 应用程序/合成器支持
text-input-v2
和text-input-v3
。 - 合成器/应用程序使用
zwp_input_method_v1
。 - 5.27 此外还支持
text-input-v1
- 5.24版本可与fcitx5配合使用
zwp_input_method_v1
。在5.24版本之前存在很多问题,那时应始终改用fcitx输入法模块。 - 使用“虚拟键盘”的 KDE 控制模块(KCM)来启动 fcitx5。这是使用文本输入协议所必需的。如果你以这种方式启动 fcitx,请确保不要在系统托盘菜单中使用“重启”选项,因为从 KWin 传递过来的套接字无法在新重启的 fcitx 中重复使用。
GNOME
最佳设置:
- 环境变量:
- 为XWayland应用程序设置
XMODIFIERS=@im=fcitx
。 - 为 Qt 设置
QT_IM_MODULE=fcitx
,因为 Qt5 默认会使用 XWayland。 - 使用 XWayland 并设置
GTK_IM_MODULE=fcitx
来运行 Chrome。
- 为XWayland应用程序设置
支持信息:
- 应用程序/合成器使用
text-input-v3
- 合成器/输入法使用了ibus的DBus协议,所以需要使用ibus前端。
- 将 Fcitx 5 添加到自动启动项中,它会在启动时替换任何现有的 ibus-daemon,这样它就能直接正常使用了。
- 候选词弹出窗口无法显示在
gnome-shell
用户界面之上。唯一的解决办法是使用 扩展 - 由于不支持
text-input-v2
,Qt 需要使用QT_IM_MODULE=fcitx
。
Sway
- 应用程序/合成器使用
text-input-v3
- 合成器/应用程序使用了
zwp_input_method_v2
,但它只是部分实现了该功能。你需要这个拉取请求,以便让使用text-input-v3
的客户端显示弹出的候选词窗口。 - fcitx输入法模块也能正常工作。
- 由于不支持
text-input-v2
,Qt需要使用QT_IM_MODULE=fcitx
Weston
- 应用程序/合成器使用
text-input-v1
- 合成器/应用程序使用
zwp_input_method_v1
- 由于它没有
text-input-v3
,输入法模块是针对Gtk/Qt的唯一解决方案,需要设置GTK_IM_MODULE=fcitx
以及QT_IM_MODULE=fcitx
- 将以下内容添加到
~/.config/weston.ini
文件中,以便让它启动 Fcitx 5。(建议添加 xwayland 部分,这样即使是在 Wayland 环境下,也能让 Fcitx 达到最佳工作状态。)
[core]
xwayland=true
[input-method]
path=/usr/bin/fcitx5
其他合成器
请查看它们的上游资源以获取更多信息。对于基于wlroots
的合成器,它们有可能像 Sway
那样以相同的方式提供支持,或者也有可能不支持 zwp_input_method
。
已知问题
由Fcitx管理的XKB布局
与X11不同,没有通用的方法可以将XKB布局设置到合成器上,这意味着只能针对每个单独的桌面环境来实现该设置。目前,由Fcitx管理的布局仅适用于KDE Plasma和GNOME桌面环境。
至于其他桌面环境,为了让semi
功能能够起作用,你需要确保以下几点:
- 输入法组的XKB布局应该与你为合成器配置的实际XKB布局相同。Fcitx会“认为”布局是一样的,从而跳过按键转换逻辑。
- 如果你在文本输入时需要其他布局(例如阿拉伯语布局),只需将它们添加到Fcitx中即可。只要按键能被转发到Fcitx,它就应该能正常工作。
候选词弹出窗口
Wayland没有为常规客户端提供全局坐标系,所以对于原生的Wayland客户端而言,Fcitx不可能将一个Wayland表面放置在特定的位置上。为了使弹出窗口能被放置在正确的位置,存在以下几种情况:
- Xwayland没有问题,并且它应该能像在X11中那样良好运行。
- 如果可以使用
zwp_input_method
协议,它有一个表面角色,允许合成器为输入法放置弹出窗口。这只有在客户端使用文本输入协议时才会起作用。 - 对于GNOME来说,kimpanel扩展程序能够读取窗口坐标,因为它是在合成器内部运行的。只要输入法模块能够报告相对坐标,kimpanel扩展程序就能够将弹出窗口显示在正确的位置。对于KDE Plasma的kimpanel,也计划采用类似的方法,但目前尚未实现。
- 对于Gtk和Qt,Fcitx的输入法模块实现了一种在客户端进程中渲染弹出窗口的方法。这存在一些局限性,因为Gtk3和Qt5中对xdg_popup的实现不支持重新定位窗口。所以会采用显示/隐藏的技巧来缓解这个问题,但这可能会导致窗口闪烁。Fcitx会尽可能不移动窗口。如果你使用的是KWin,也可以禁用弹出窗口动画,以帮助减少闪烁现象。
每窗口输入法状态
当使用zwp_input_method
协议时,本质上对于Fcitx而言只有一个可见的输入上下文,并且Fcitx无法区分正在使用的是哪个应用程序。这意味着输入法的“激活”/“未激活”状态现在变成了“全局”状态。
现在,Fcitx支持两种协议来确定获得焦点的窗口以及相应的应用程序名称,其中包括wlr-foreign-toplevel-management
(基于wlroots的合成器所使用)和plasma-window-management
(KWin所使用)。