升级后死(撰写)键在 GTK 应用程序中不起作用

升级后死(撰写)键在 GTK 应用程序中不起作用

我正在运行 Kubuntu,并使用 KDE 作为我的主要桌面环境。

不久前,我设置了死键,这样我就可以输入中文拼音和其他带重音的字母和特殊字符。

顺便说一句,我使用 IBUS 是因为它似乎是最容易设置我的汉字输入法的方法。

在更新之前,死键/组合键在所有应用程序中都可以正常工作。

现在,它们可以在 QT 应用程序中运行,但不能在 GTK 应用程序中运行(例如此浏览器)。这是不幸的,因为这是我大部分打字的地方。我现在的解决方法是在 KDE 的启动器中输入重音符号并复制过去(Alt+F2,使用死键输入,Ctrl+X、Esc、Ctrl+V),这有点麻烦。

我不确定哪些信息对调试有用,因为我设置这一切已经有一段时间了。

有趣的是,环境变量 $QT_IM_MODULE 没有值。 $GTK_IM_MODULE 有 xim。

我安装了 ibus-gtk3,我可以发布任何其他有助于诊断的信息。

我已将安装脚本粘贴到各个位置(例如 en_US、/etc/X11/xinit/xinput.d/ibus 等)。我不确定哪一个优先,并且我不确定是否正在运行任何一个,因为当我回显它时 QT_IM_MODULE 没有值,而这些都表明如果不是 ibus,则默认情况下它应该是“xim”。

我还应该提到,下面提到的库(im-ibus.so 等)我没有,我也找不到如何获取它们或它们在哪里链接它们。事实上,我的 gtk-3.0.0/ 和 qt4/ 目录甚至没有 inputmethod/ 或 plugin/ 目录。这可能是问题的一部分,但同样,它在更新之前就可以工作,所以我不知道。

# start IBus
# vim: set sts=4 expandtab:

# start IBus daemon
#/usr/bin/ibus-daemon --daemonize --xim
XIM=ibus
XIM_PROGRAM=/usr/bin/ibus-daemon
XIM_ARGS="--xim"

# set variables for the plain XIM
XMODIFIERS=@im=ibus

GTK_IM_MODULE=xim
# use immodule only when available for both GTK 2.0 and 3.0
IM_CONFIG_MARKER2=0
for IM_CONFIG_MARKER in /usr/lib/*/gtk-2.0/*/immodules/im-ibus.so \
                        /usr/lib/gtk-2.0/*/immodules/im-ibus.so ; do
    if [ -e $IM_CONFIG_MARKER ]; then
        IM_CONFIG_MARKER2=1
        break
    fi
done

IM_CONFIG_MARKER3=0
for IM_CONFIG_MARKER in /usr/lib/*/gtk-3.0/*/immodules/im-ibus.so \
                        /usr/lib/gtk-3.0/*/immodules/im-ibus.so ; do
    if [ -e $IM_CONFIG_MARKER ]; then
        IM_CONFIG_MARKER3=1
        break
    fi
done
if [ $IM_CONFIG_MARKER2 = 1 ] && [ $IM_CONFIG_MARKER3 = 1 ] ; then
    GTK_IM_MODULE=ibus
fi

QT_IM_MODULE=xim
# use immodule when available for Qt4 (Qt3 has been long dead)
for IM_CONFIG_MARKER in /usr/lib/*/qt4/plugins/inputmethods/libqtim-ibus.so\
                        /usr/lib/qt4/plugins/inputmethods/libqtim-ibus.so ; do
    if [ -e $IM_CONFIG_MARKER ]; then
        QT_IM_MODULE=ibus
        break
    fi
done

CLUTTER_IM_MODULE=xim
# use immodule when available for clutter
for IM_CONFIG_MARKER in /usr/lib/*/clutter-imcontext/immodules/im-ibus.so \
                        /usr/lib/clutter-imcontext/immodules/im-ibus.so; do
    if [ -e $IM_CONFIG_MARKER ]; then
        CLUTTER_IM_MODULE=ibus
        break
    fi
done

DEPENDS="ibus, ibus-gtk|ibus-qt4|ibus-clutter"

答案1

如果您在 X11 级别使用输入模块(例如,由 定义的输入模块XMODIFIERS=…),则 X11 不再处理死键,也不再进行组合,而是由输入模块来完成。

您需要的是一种在XMODIFIERS="@im=ibus"和之间切换的方法XMODIFIERS="@im=none"(让 X11 完成工作)。也许已经有一个 Gtk 配​​置可以做到这一点,并让它出现在输入法的右键菜单中;如果没有,这对 Gtk/Gnome 团队来说是一个很好的建议:)

答案2

X 输入模型非常复杂(有人甚至说地球上只有 5 个人完全理解它:) 我不是其中之一)

a) 所以,一开始,你只有一个读取键盘的 X11 函数,一个键一个符号。

b) 但有些人想要死键,因此另一个函数允许多个键、一个字符串。这还需要一个或多个文件来描述哪些键序列产生哪些字符序列。

c) 还有更复杂的输入方法,它们与另一个类似服务器的程序交互。这通常是为了输入日语或中文。

要使 b) 和 c) 工作,您需要为 b) 正确定义 XMODIFIERS 变量“@im=none”(对于 c),@im=xxxxx 的值取决于所使用的 3d 程序);一切的正确配置,应用程序使用正确的输入函数(一些 X11 程序仍然存在,只使用 a 中的原始函数),那么运气不好:( )

d) 然后,因为所有这些都太复杂了,特别是 c) 的交互非常丑陋;现代工具包,如 Qt 和 Gtk,开始提供自己的输入级别支持,绕过 b)/c)

所以你可以选择使用工具包的输入法(但是 Gtk/Qt/other 之间会有所不同);或使用 b)/c)(b 或 c 主要取决于您要输入的语言)。但要使用 b/c,你必须告诉你的高级工具包不要自己做,而是让 X11 来做。在 Gtk 中,有一个名为“XIM 服务器输入”或类似名称的输入;选择它时,您使用 b/c 方法。

Qt应该也有类似的东西。对于 KDE3 (Qt3),有一个 shell 变量QT_IM_MODULE=xim就足够了。现在,动态(例如通过 GUI 和 dbus)配置可能优先于 shell 变量。

答案3

这可能相关,也可能无关。几个月以来,撰写键在一段时间后停止工作。我定义了一个 .Xmodmap 来定义键,并且在运行 xmodmap 后它可以工作,至少可以完成一个文档左右。但几个小时后(?)它就消失了。

无需注销,无需打开应用程序。我无法查明任何可能导致此问题的事件。也许,这可能与键盘操作有关。我换了键盘,这种情况似乎比以前少了。

相关内容