【问题标题】:How to set icon name in X11 (Ubuntu)如何在 X11 (Ubuntu) 中设置图标名称
【发布时间】:2020-07-11 21:19:48
【问题描述】:

我使用内部工具包(没有 Gnome 或 KDE)用 C++ 编写了一个应用程序。当我在 Ubuntu (18.04) 上运行它并按 alt-tab 时,我可以看到我为应用程序设置的图标,但图标下方没有图标名称。见附图:终端有一个终端图标和下面的“终端”一词,但我自己的应用程序只有“未知”这个词。

大概我需要设置许多可能的 X11 窗口属性之一,但我不知道是哪一个。 xprops 与终端窗口一起使用时,不会显示任何具有“终端”值的属性。我尝试将属性 _NET_WM_ICON_NAME(可能的选择)设置为我选择的名称,但没有帮助。

如何将“未知”一词更改为我选择的内容?再说一遍——这个应用程序使用了一个内部工具包,它既不是 Gnome 也不是 KDE。

【问题讨论】:

    标签: ubuntu x11


    【解决方案1】:

    我遇到了同样的问题。使用 XSetClassHint 解决了这个问题:

    XClassHint *class_hint = XAllocClassHint(); if (class_hint) { class_hint->res_name = class_hint->res_class = (char *)application_name XSetClassHint(display, window, class_hint); XFree(class_hint); }

    【讨论】:

    • 非常感谢!经过这么长时间我已经放弃了对此的希望,但你帮我解决了:-) 请注意,当前的窗口管理器在 alt-tab 框中显示窗口标题,因此效果已经更好,但“未知”是如果您将鼠标悬停在任务栏中的图标上,它仍然存在。设置类提示可以解决这个问题。干得好!
    【解决方案2】:

    有一个函数:XSetWMName。它需要一个 XTextProperty 作为参数:

    void VTXWidget::setName (const std::string &name)
    {
      XTextProperty tp;
      char *props[1];
    
      props[0] = strdup (name.c_str ());
      if (0 == props[0])
      {
        return;
      }
    
      if (!XStringListToTextProperty (props, 1, &tp))
      {
        TR_ERR ("Failed to convert text property");
      }
      else
      {
        XSetWMName (m_display, m_window, &tp);
        XFree (tp.value);
      }
    
      free (props[0]);
    }
    

    【讨论】:

    • 啊,恐怕这不正确。这将设置 WM_NAME,它是窗口标题,但它与用于按 ALT-TAB 时显示的图标的字符串不同。对不起:-)
    • 奇数。为什么您的窗口名称(例如“Firefox”)与 alt-tabbing 时的图标名称不同?
    • 这是一个很好的问题,但遗憾的是我不知道答案...如果我猜的话,可能是因为图标有不同的布局约束?窗口有很多空间可用于标题,但图标是连续显示的,每个名称没有太多可用空间。有些属性暗示了这一点,例如 _NET_WM_ICON_NAME,但这对我也没有任何意义。
    • 我认为 _NET_WM_ICON_NAME 用于最小化窗口。
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多