gpt4 book ai didi

java - 为什么没有为某些语言环境设置 WM_NAME 原子

转载 作者:行者123 更新时间:2023-12-04 13:24:46 26 4
gpt4 key购买 nike

我最近发现当 LANG 设置为 C.utf8 时,X11 原子 WM_NAME 未在 Swing JFrame 中设置。但为 LANG 的其他值设置。这发生在带有 OpenJDK 11.0.9 的 Linux Redhat 8.2 上。
结果与 xprop | grep -i name当 LANG=C.utf8

_NET_WM_ICON_NAME(UTF8_STRING) = "title 123"
_NET_WM_NAME(UTF8_STRING) = "title 123"
结果与 xprop | grep -i name当 LANG=en_GB.UTF-8
_NET_WM_ICON_NAME(UTF8_STRING) = "title 123"
WM_ICON_NAME(STRING) = "title 123"
_NET_WM_NAME(UTF8_STRING) = "title 123"
WM_NAME(STRING) = "title 123
使用标题的简单 JFrame
public class Example {
public static void main(String[] args) {
new javax.swing.JFrame("title 123").setVisible(true);
}
}
我已经将其追溯到 sun.awt.X11.XBaseWindow.updateWMName()无条件更新 VM_NAME 和 _NET_WM_NAME
XAtom nameAtom = XAtom.get(XAtom.XA_WM_NAME);
nameAtom.setProperty(getWindow(), name);
XAtom netNameAtom = XAtom.get("_NET_WM_NAME");
netNameAtom.setPropertyUTF8(getWindow(), name);
所以我猜测在 X11 库中较低的某个地方,原子要么没有被设置,要么被拒绝,可能与字符编码有关。
我知道 WM_NAME 是传统的和可选的,而 _NET_WM_NAME 是现代的替代品。这对我来说很重要的原因是我维护了一些仅查找 WM_NAME 的传统定制窗口管理器样式代码。我将很快增强它以查找 _NET_WM_NAME。我只是为了我自己的学术极客兴趣而完全理解这一点

最佳答案

进一步追踪 sun.awt.X11.XAtom.setProperty(long, String)调用本地方法 sun.awt.X11.XlibWrapper.SetProperty(long, long, long, String)这是由 https://github.com/openjdk/jdk/blob/master/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c 实现的

#ifdef X_HAVE_UTF8_STRING
status = Xutf8TextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
XStdICCTextStyle, &tp);
#else
status = XmbTextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
XStdICCTextStyle, &tp);
#endif

if (status == Success || status > 0) {
XChangeProperty((Display *)jlong_to_ptr(display), window, atom, tp.encoding, tp.format, PropModeReplace, tp.value, tp.nitems);
if (tp.value != NULL) {
XFree(tp.value);
}
}
这意味着如果 Xutf8TextListToTextProperty 不成功,则不会报告任何错误。
Xutf8TextListToTextProperty 由来自 https://gitlab.freedesktop.org/xorg/lib/libx11 的 Xutils.h 提供
看起来 libX11 有自己的 i18n 实现,直到 libX11 1.7.1 它才“理解” LANG=C.utf8,尽管它确实有 C.UTF-8 的别名,但提交 https://github.com/mirror/libX11/commit/cc9f8878f2cbe17c7b4035b4ff4352b52ece38e0 更正了这一点。其中添加了一个别名/usr/share/X11/locale/locale.alias
C.utf8:                     en_US.UTF-8
提交消息简洁地回答了这个问题

The normal form is 'C.UTF-8', but 'C.utf8' has been seen in the wild.


如果我手动更改/usr/share/X11/locale/locale.alias 并使用 LANG=C.utf8 运行我的示例,则 WM_NAME 和其他原子设置正确。

关于java - 为什么没有为某些语言环境设置 WM_NAME 原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69237722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com