如何才能让 fcitx5 通过 ibus 的协议在 appimage+qt 程序里能用?

Leap 15.6 已经安装了 fcitx5 并正在日常正常使用中

据说 fcitx5 支持通过 ibus 的协议来使用 fcitx(输入法配置 fcitx5 里的附加组件里显示,已启用 **ibus 前端 **)

这样好像就可以支持一些不支持 fcitx 协议的应用,比如说那些 appimage+qt 应用

但要怎么设置呢才行呢?我试验了几个 appimage+qt5 程序,ctrl+space 是调不出 fcitx5 的

$ zypper se fcitx5|grep -e "^i"
i+ | fcitx5                      | Next generation of fcitx                         | 软件包
i  | fcitx5-chinese-addons       | Pinyin and Table IM support for fcitx5           | 软件包
i  | fcitx5-configtool           | Configuration tool for fcitx5                    | 软件包
i  | fcitx5-gtk2                 | GTK+ 2.0 im module for fcitx5                    | 软件包
i  | fcitx5-gtk3                 | GTK+ 3.0 im module for fcitx5                    | 软件包
i  | fcitx5-lua                  | Lua support for fcitx                            | 软件包
i  | fcitx5-pinyindictmanager    | Fcitx5 Pinyin dictionary manager library         | 软件包
i+ | fcitx5-qt5                  | Qt5 IM module for Fcitx5                         | 软件包
i  | kcm_fcitx5                  | Configuration module for fcitx5                  | 软件包
i+ | libFcitx5Config6            | Configuration library for fcitx5                 | 软件包
i+ | libFcitx5Core7              | Core library for fcitx5                          | 软件包
i  | libFcitx5GClient2           | GClient library for fcitx5                       | 软件包
i+ | libFcitx5Qt5DBusAddons1     | Qt5 DBus Addons library for Fcitx5               | 软件包
i+ | libFcitx5Qt5WidgetsAddons2  | Qt5 Widgets Addons library for Fcitx5            | 软件包
i+ | libFcitx5Utils2             | Utility library for fcitx5                       | 软件包

QT_IM_MODULE=ibus

这个试过了,不行

尝试设置QT_IM_MODULE=ibus后,用 dbus-monitor 监看,根本没有 ibus 相关的请求

用 d-feet 这个 dbus 工具看了下,fcitx5 进程所监听的 ibus 名称的服务是activable: no
Screenshot_20241215_232138
Screenshot_20241215_232157

嗯,我也发现了。好奇怪。我明天再看看吧,现在我访问不到 Qt 源码。

qtbase/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp 里有个检查:要么走 xdg portal,要么你有 ibus-daemon 这个命令:

QIBusPlatformInputContextPrivate::QIBusPlatformInputContextPrivate()
    : usePortal(shouldConnectIbusPortal()),
      valid(false),
      busConnected(false),
      needsSurroundingText(false)
{
    if (usePortal) {
        valid = true;
        if (debug)
            qDebug() << "use IBus portal";
    } else {
        valid = ! QStandardPaths::findExecutable(QString::fromLocal8Bit("ibus-daemon"), QStringList()).isEmpty();
    }
    if (! valid)
        return;
    initBus();

所以你在你的 $PATH 里放个什么都不干的 ibus-daemon 命令就能用了……

哦,usePortal 的检查也挺简单的,你设置个 IBUS_USE_PORTAL=1 就行。

1赞

太好了,使用以上两个环境变量,解决了 qt 的问题!
如果是使用一个 ibus-daemon 空循环脚本似乎不行,不知是否因为脚本实际上是 bash 进程


不过,QT 的虽然解决了,GTK 好像又不能通过GTK_IM_MODULE这个环境变量来搞。

env QT_IM_MODULE=ibus \
env IBUS_USE_PORTAL=1  \
env GTK_IM_MODULE=ibus \
env XMODIFIER=@im=ibus \
leafpad

像这样 ,它仍然走 fcitx 的 dbus 协议

比如有个 appimage 形式发布的 GTK 程序 localsend,就不支持 fcitx。所以,有办法让 GTK 程序走 ibus 协议吗

咦,好像上面说到的 localsend 是 flutter 的,输入法无法用可能是 flutter 的锅

而我们真正的问题是,我们的 Leap 15.6 上,好像 ** 没有提供gtk4-immodule-xim** (有gtk3-的和gtk2-的)

Leap 15.6 的 transmission 似乎已经是 gtk4 的。也肯定还会用到其他 gtk4 的程序

为什么你要用这么多 appimage 这种缺胳膊少腿的打包方式啊……

话说你还在用 X11 的吗?

没有提供 gtk4 模块的话,要不去给 openSUSE 报个 bug,然后你自己编译一个?

像我们这样的菜鸟,appimage 是最方便的。。。。 :sweat_smile:

对我还在用 X11


此外,ibus-gtk4提供了的。fcitx5-gtk就只有 2/3,目前

官方软件仓库里有的才是最方便的吧,依赖关系、系统集成都给你做好了——缺点就是好多软件不在仓库里。