Gentoo Linux Sway fcitx中文输入(通过X11支持)

Gentoo Linux Sway fcitx中文输入 中,最終實際上是採用了Xwayland來實現中文輸入:

在上次 Gentoo Linux Sway fcitx中文输入 实践中,实际上最终是启用了X支持来实现中文候选字的。我在最近的一次实践中,尝试 Gentoo Linux Sway(純wayland) fcitx中文输入 ,不过很不幸没有成功。所以我再次整理和总结通过启用X11支持来完成sway环境下的fcitx5中文输入。本文是最新的一次实践总结,相对较为精简和完整,请参考。

  • /etc/portage/package.use/fcitx5 :

配置fcitx5的 /etc/portage/package.use/fcitx5
# 候選詞需要X支持
app-i18n/fcitx X

# fcitx啓用X之後,需要以下軟件包啓用參數
# required by x11-libs/pango-1.51.0::gentoo
# required by app-i18n/fcitx-4.2.9.8::gentoo[cairo,pango]
# required by @selected
# required by @world (argument)
#>=x11-libs/cairo-1.18.0 X
x11-libs/cairo X
dev-cpp/cairomm X
# required by app-i18n/fcitx-4.2.9.8::gentoo[cairo,pango]
# required by @selected
# required by @world (argument)
#>=x11-libs/pango-1.51.0 X
x11-libs/pango X
# required by app-i18n/fcitx-4.2.9.8::gentoo
# required by @selected
# required by @world (argument)
#>=x11-libs/libxkbcommon-1.6.0 X
x11-libs/libxkbcommon X

# 安装了 fcitx-gtk 之后发现依然没有能够显示候选字,看起来gtk+也需要X支持
# 候选字可能是采用gtk3绘制的,之前实践gtk+启用X use flags成功firefox显示候选字,但是我这次采用gtk启用X use flags无效
app-i18n/fcitx-gtk gtk3 gtk4

# gtk 实际上就是gtk4
# gtk+ 实际上就是gtk3
# 经过验证绘制候选字应该启用gtk3的X支持,所以我这里关闭了gtk4的X支持
#gui-libs/gtk X

# gtk+ 启用X支持,会有 dev-cpp/gtkmm 要求启用X的依赖
x11-libs/gtk+ X
dev-cpp/gtkmm X
  • /etc/portage/package.use/sway :

配置sway的 /etc/portage/package.use/sway
# waybar replace swaybar
gui-apps/waybar ray

# foot终端支持cjk多字节语言(中文,日文,韩文)
dev-libs/libutf8proc cjk

# 当fcitx尝试wayland绘制窗口失败时,会自动回退到Xwayland,所以建议保留Xwayland支持
# fcitx和sway都需要启用X
gui-wm/sway X
# 以下是因为sway启用X之后对应依赖也需要启用X
# required by gui-wm/sway-1.8.1::gentoo
# required by @selected
# required by @world (argument)
#=gui-libs/wlroots-0.16.2-r2 X
gui-libs/wlroots X
# required by x11-base/xwayland-23.2.4::gentoo
# required by gui-libs/wlroots-0.16.2-r2::gentoo[X]
# required by gui-wm/sway-1.8.1::gentoo
# required by @selected
# required by @world (argument)
#>=media-libs/libepoxy-1.5.10-r2 X
media-libs/libepoxy X
# required by media-libs/mesa-23.3.5::gentoo
# required by media-libs/libepoxy-1.5.10-r2::gentoo[egl]
# required by x11-base/xwayland-23.2.4::gentoo
# required by gui-libs/wlroots-0.16.2-r2::gentoo[X]
# required by gui-wm/sway-1.8.1::gentoo
# required by @selected
# required by @world (argument)
#>=media-libs/libglvnd-1.7.0 X
media-libs/libglvnd X
# required by x11-base/xwayland-23.2.4::gentoo
# required by gui-libs/wlroots-0.16.2-r2::gentoo[X]
# required by gui-wm/sway-1.8.1::gentoo
# required by @selected
# required by @world (argument)
#>=media-libs/mesa-23.3.5 X
media-libs/mesa X

然后重新 emerge world 来更新USE flags:

在修改了全局 USE flag 之后对整个系统进行更新
emerge --ask --changed-use --deep @world

经过反复尝试(主要以firefox为输入对象),需要以下配套use flags:

  • app-i18n/fcitxgui-wm/sway 启用了 X

    • 在纯粹 wayland 环境的 sway 中,输入中文其实不需要X支持,fcitx5能够输入中文,但是无法绘制候选字匡(完全盲打)

    • 参考 gentoo+sway无法在WPS、foot、dingtalk应用中显示输入法候选窗口 #455 fcitx开发者wengxt的答复,提示需要在开启fcitx5的X支持

    • 根据找到的资料,fcitx5如果不能使用wayland绘制候选字匡,就会回退到Xwayland绘制,所以开发者wengxt建议fcitx5启用X支持(其实还提示了需要在gtk2和gtk3开启X11,不过我最初没有理解,后来才想到原来绘制是通过gtk3实现的)

  • app-i18n/fcitx-gtk 同时启用了 gtk3 gtk4 (可能只需要gtk3)

    • 我最初编译 fcitx-gtk 启用了 gtk4 支持,并且我尝试了在 gui-libs/gtk 启用X支持(我的想法是尝试纯GTK 4。但是发现依然无法显示候选字

    • 这说明fcitx5绘制候选字不是采用 gtk4 而是采用 gtk3

  • x11-libs/gtk+ 启用了 X

    • 这步非常重要,我最初只激活了 fcitxswayX ,发现依然无法弹出候选字(而我上一次实践是成功的,所以我对比了两次系统的use flags)

    • firefox并非gtk程序,所以理论上其实并不需要 fcitx-gtk ,但是我发现我这次仅启用 X 并不能显示候选字,对比了上次实践的use flags,发现上次是启用了 gtk+ (也就是GTK3) 的 X

    • 我修订了 x11-libs/gtk+ 启用 X 的 use flag之后,就能够正常浮现候选字了

综上:

  • 如果sway不能在纯wayland环境提供 text-inut-v3 绘制输入法popups(需要等待已经合入代码主干的sway发布下一个扳本),那么就需要启用sway和fcitx5的X11支持

  • fcitx5的候选字绘制是采用GTK3来实现的,所以 x11-libs/gtk+ 也需要激活 X11 支持