簡體   English   中英

如何使用 xcb 正確設置 utf8 window 標題?

[英]How to correctly set an utf8 window title using xcb?

編輯:這是一個錯字,請參閱下面的答案。 無論如何我都會留下這個問題,因為它可能會幫助未來正在尋找標題中所述問題的答案的人(找到它並非易事)。

如果我 go 到一個帶有 UTF8 字符的網站,那么 Chromium 在其 window 中顯示正確的標題(我正在使用通量盒;顯然可以顯示 utf8 標題)。

我嘗試在自己的應用程序中設置相同的標題,但結果看起來完全不同: 兩個窗口標題欄 . 上面的是鉻,下面是我自己的應用程序。

xprop 也顯示出不同:

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

而我的申請給出:

_net_wm_name(utf8_string)= 0x41,0x70,0x70,0x6c,0x65,0x65,0x20,0x28,0xd0,0xa0,0xd0,0xd0,0xbe,0xbe,0xd1,0x81,0x81,0xd1,0xd1,0x81,0x81,0xd0,0xd bers 0xd bers 0xd bers 0x b.0 x b.81,0 x bers 0xb8,0 x b.81,,0 x bers 0xb8,,0 x bers 0xb8,0 x bers 0b.8 x bers 0 x bers 0 x bers 0 x bers 0 x bers 0,0 , 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_32 (UTF8\2\40) \320\276\321\201\321\201\320\270\321\217) \342\200\223 \320\236\321\204\320\270\321\206\320\270\320\ 260\320\273\321\214\320\275\321\213\320\271\321\201\320\260\320\271\321\202-鉻"

因此,盡管 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);

我究竟做錯了什么?

啊-在我發布問題后僅幾秒鍾,我就看到了...

它應該是:

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

我傳遞了 12 作為字符串長度,所以類型不是 UTF8_STRING,而是附加了文字 0 的東西,同時仍然與 xprop 顯示相同...

現在可以了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM