jqx / 在Wayland上使用Fcitx5

Created Fri, 13 Sep 2024 15:11:32 +0800 Modified Tue, 04 Mar 2025 14:48:11 +0000

在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。执行此操作的方法是:

  1. 不要设置GTK_IM_MODULE环境变量。

  2. 对于 Gtk2,在 ~/.gtkrc-2.0 中添加以下内容

gtk-im-module="fcitx"
  1. 对于 Gtk 3,请在 ~/.config/gtk-3.0/settings.ini中添加以下内容
[Settings]
gtk-im-module=fcitx
  1. 对于 Gtk 4,请在~/.config/gtk-4.0/settings.ini中添加以下内容
[Settings]
gtk-im-module=fcitx
  1. 如果您使用的是 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_MODULEQT_IM_MODULE,然后在im-config中选择“不设置任何输入法”,并使用桌面默认设置。
    • 使用 –enable-features=UseOzonePlatform –ozone-platform=wayland –enable-wayland-ime 来运行 Chromium/electron 应用程序。
  • 注意事项:

    • 某些仅在 X11 环境下才能正常运行的 GTK/Qt 应用程序可能仍需要分别为它们设置 GTK_IM_MODULEQT_IM_MODULE
    • 如果你全局设置了GTK_IM_MODULE/QT_IM_MODULE,你将会遇到问题。

支持信息:

  • 应用程序/合成器支持text-input-v2text-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。

支持信息:

  • 应用程序/合成器使用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功能能够起作用,你需要确保以下几点:

  1. 输入法组的XKB布局应该与你为合成器配置的实际XKB布局相同。Fcitx会“认为”布局是一样的,从而跳过按键转换逻辑。
  2. 如果你在文本输入时需要其他布局(例如阿拉伯语布局),只需将它们添加到Fcitx中即可。只要按键能被转发到Fcitx,它就应该能正常工作。

候选词弹出窗口

Wayland没有为常规客户端提供全局坐标系,所以对于原生的Wayland客户端而言,Fcitx不可能将一个Wayland表面放置在特定的位置上。为了使弹出窗口能被放置在正确的位置,存在以下几种情况:

  1. Xwayland没有问题,并且它应该能像在X11中那样良好运行。
  2. 如果可以使用zwp_input_method协议,它有一个表面角色,允许合成器为输入法放置弹出窗口。这只有在客户端使用文本输入协议时才会起作用。
  3. 对于GNOME来说,kimpanel扩展程序能够读取窗口坐标,因为它是在合成器内部运行的。只要输入法模块能够报告相对坐标,kimpanel扩展程序就能够将弹出窗口显示在正确的位置。对于KDE Plasma的kimpanel,也计划采用类似的方法,但目前尚未实现。
  4. 对于Gtk和Qt,Fcitx的输入法模块实现了一种在客户端进程中渲染弹出窗口的方法。这存在一些局限性,因为Gtk3和Qt5中对xdg_popup的实现不支持重新定位窗口。所以会采用显示/隐藏的技巧来缓解这个问题,但这可能会导致窗口闪烁。Fcitx会尽可能不移动窗口。如果你使用的是KWin,也可以禁用弹出窗口动画,以帮助减少闪烁现象。

每窗口输入法状态

当使用zwp_input_method协议时,本质上对于Fcitx而言只有一个可见的输入上下文,并且Fcitx无法区分正在使用的是哪个应用程序。这意味着输入法的“激活”/“未激活”状态现在变成了“全局”状态。

现在,Fcitx支持两种协议来确定获得焦点的窗口以及相应的应用程序名称,其中包括wlr-foreign-toplevel-management(基于wlroots的合成器所使用)和plasma-window-management(KWin所使用)。

https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland