我最近发现,在设置LANG为 C.utf8
时,Swing JFrame中的X11原子WM_NAME没有设置,但在其他值的LANG时设置了。这发生在Linux Redhat 8.2上,使用OpenJDK 11.0.9。
在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。我只是想充分理解这个问题,以满足我的学术兴趣。