如何使用xcb正确设置utf8窗口标题?

问题描述 投票:0回答:2

编辑:这是一个错字,请参阅下面的答案。 无论如何,我都会保留这个问题,因为它可能会帮助将来正在寻找标题中所述问题的答案的人(找到它并不简单)。

如果我访问一个带有 UTF8 字符的网站,那么 Chromium 会在其窗口中显示正确的标题(我使用的是 Fluxbox;所以显然可以显示 utf8 标题)。

我尝试在自己的应用程序中设置相同的标题,但结果看起来完全不同: two window title bars。上面的那个是 Chromium,下面那个是我自己的应用程序。

xprop 也显示出差异:

WM_NAME(UTF8_STRING) = "Apple (Россия) – Официальный сайт - Chromium" _NET_WM_NAME(UTF8_STRING) = "Apple (Россия) – Официальный сайт - Chromium"

而我的申请给出:

_NET_WM_NAME(UTF8_STRING) = 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x28, 0xd0, 0xa0, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xb8、0xd1、0x8f、0x29、0x20、0xe2、0x80、0x93、0x20、0xd0、0x9e、0xd1、0x84、0xd0、0xb8、0xd1、0x86、0xd0、0xb8、 0xd0、0xb0、0xd0、0xbb、0xd1、0x8c、0xd0、0xbd、0xd1、0x8b、0xd0、0xb9、0x20、0xd1、0x81、0xd0、0xb0、0xd0、0xb9、 0xd1、0x82、0x20、0x2d、0x20、0x43、0x68、0x72、0x6f、0x6d、0x69、0x75、0x6d WM_NAME(UTF8_STRING) = "Apple (Россия) – Официальный сайт - Chromium"

因此,尽管 xprop 在这两种情况下都表示类型为“UTF8_STRING”,但在我的情况下,它不会将值显示为 utf8 字符串。

我使用的(C++20)代码如下所示:

xcb_connection_t* m_connection = ...;
xcb_window_t handle = ...;
xcb_atom_t m_utf8_string_atom;
xcb_atom_t m_net_wm_name_atom;

...

xcb_intern_atom_cookie_t  utf8_string_cookie = xcb_intern_atom(m_connection, 0, 12, "UTF8_STRING");
xcb_intern_atom_reply_t*  utf8_string_reply  = xcb_intern_atom_reply(m_connection, utf8_string_cookie, 0);
m_utf8_string_atom = utf8_string_reply->atom;
free(utf8_string_reply);

xcb_intern_atom_cookie_t  net_wm_name_cookie = xcb_intern_atom(m_connection, 0, 12, "_NET_WM_NAME");
xcb_intern_atom_reply_t*  net_wm_name_reply  = xcb_intern_atom_reply(m_connection, net_wm_name_cookie, 0);
m_net_wm_name_atom = net_wm_name_reply->atom;
free(net_wm_name_reply);

...

xcb_void_cookie_t ret = xcb_create_window(m_connection, XCB_COPY_FROM_PARENT, handle,
  parent_handle ? parent_handle : m_screen->root, x, y, width, height,
  border_width, _class, m_screen->root_visual, value_mask, value_list.data());

std::u8string t = u8"Apple (Россия) – Официальный сайт - Chromium";
// Set window name.
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, handle,
  XCB_ATOM_WM_NAME, m_utf8_string_atom, 8,
  t.size(), t.data());
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, handle,
  m_net_wm_name_atom, m_utf8_string_atom, 8,
  t.size(), t.data());

...

// Display window.
xcb_map_window(m_connection, handle);
xcb_flush(m_connection);

我做错了什么?

c++ linux c++20 xcb
2个回答
2
投票

Argh - 在我发布问题几秒钟后我就看到了......

应该是:

xcb_intern_atom_cookie_t  utf8_string_cookie = xcb_intern_atom(m_connection, 0, 11, "UTF8_STRING");

我传递了 12 作为字符串长度,因此类型不是 UTF8_STRING,而是附加了文字 0 的内容,同时仍然与 xprop 显示相同...

现在可以使用了!


0
投票

它适用于天然气!感谢您的回答!

© www.soinside.com 2019 - 2024. All rights reserved.