【问题标题】:Why is WM_NAME atom not set for certain locales为什么没有为某些语言环境设置 WM_NAME atom
【发布时间】: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。我只是想完全理解这一点,因为我自己的学术极客兴趣

【问题讨论】:

    标签: java swing x11


    【解决方案1】:

    进一步跟踪 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 由 Xutils.h 提供,来自https://gitlab.freedesktop.org/xorg/lib/libx11

    似乎 libX11 有自己的 i18n 实现,并且在 libX11 1.7.1 之前它没有“理解”LANG=C.utf8,虽然它确实有 C.UTF-8 的别名,但提交 @987654323 对此进行了更正@ 为 /usr/share/X11/locale/locale.alias 添加了一个别名

    C.utf8:                     en_US.UTF-8
    

    提交信息简明扼要地回答了问题

    正常形式是'C.UTF-8',但在野外见过'C.utf8'。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2015-12-10
      • 2011-11-16
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多