【发布时间】:2021-11-13 04:13:10
【问题描述】:
我最近发现当 LANG 设置为C.utf8 时,Swing JFrame 中没有设置 X11 原子 WM_NAME,而是设置为 LANG 的其他值。这发生在带有 OpenJDK 11.0.9 的 Linux Redhat 8.2 上。
当 LANG=C.utf8 时xprop | grep -i name 的结果
_NET_WM_ICON_NAME(UTF8_STRING) = "title 123"
_NET_WM_NAME(UTF8_STRING) = "title 123"
当 LANG=en_GB.UTF-8 时xprop | grep -i name 的结果
_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。我只是想完全理解这一点,因为我自己的学术极客兴趣
【问题讨论】: