diff options
author | Jon Turney <jon.turney@dronecode.org.uk> | 2014-09-22 14:40:41 +0100 |
---|---|---|
committer | Jon Turney <jon.turney@dronecode.org.uk> | 2016-06-23 14:15:27 +0100 |
commit | c05c4360eea245b3ef5f3a355b95dcd63244ef70 (patch) | |
tree | b0b40bf9ffaa201ddd84eb237916b043c2e8a7be | |
parent | 866d8299abc4315d4836292aeac4abe0b686fc10 (diff) |
hw/xwin: Use _NET_WM_NAME for window titles in multiwindow mode
Use _NET_WM_NAME in preference to WM_NAME for window title
Update window title when _NET_WM_NAME property changes
We should always have been doing this, but some qt5 examples only set
_NET_WM_NAME, so now it's become more important...
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
-rw-r--r-- | hw/xwin/winmultiwindowwm.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c index 09ec82692..36d8ed7e7 100644 --- a/hw/xwin/winmultiwindowwm.c +++ b/hw/xwin/winmultiwindowwm.c @@ -114,6 +114,7 @@ typedef struct _WMInfo { xcb_atom_t atmWmTakeFocus; xcb_atom_t atmPrivMap; xcb_atom_t atmUtf8String; + xcb_atom_t atmNetWmName; xcb_ewmh_connection_t ewmh; } WMInfoRec, *WMInfoPtr; @@ -376,30 +377,51 @@ static void GetWindowName(WMInfoPtr pWMInfo, xcb_window_t iWin, char **ppWindowName) { xcb_connection_t *conn = pWMInfo->conn; - xcb_get_property_cookie_t cookie; - xcb_icccm_get_text_property_reply_t reply; - char *pszWindowName; - char *pszClientMachine; - char hostname[HOST_NAME_MAX + 1]; + char *pszWindowName = NULL; #if CYGMULTIWINDOW_DEBUG ErrorF("GetWindowName\n"); #endif - /* Intialize ppWindowName to NULL */ - *ppWindowName = NULL; - - /* Try to get window name */ - cookie = xcb_icccm_get_wm_name(conn, iWin); - if (!xcb_icccm_get_wm_name_reply(conn, cookie, &reply, NULL)) { - ErrorF("GetWindowName - xcb_icccm_get_wm_name_reply failed. No name.\n"); - return; + /* Try to get window name from _NET_WM_NAME */ + { + xcb_get_property_cookie_t cookie; + xcb_get_property_reply_t *reply; + + cookie = xcb_get_property(pWMInfo->conn, FALSE, iWin, + pWMInfo->atmNetWmName, + XCB_GET_PROPERTY_TYPE_ANY, 0, INT_MAX); + reply = xcb_get_property_reply(pWMInfo->conn, cookie, NULL); + if (reply && (reply->type != XCB_NONE)) { + pszWindowName = strndup(xcb_get_property_value(reply), + xcb_get_property_value_length(reply)); + free(reply); + } } - pszWindowName = Xutf8TextPropertyToString(pWMInfo, &reply); - xcb_icccm_get_text_property_reply_wipe(&reply); + /* Otherwise, try to get window name from WM_NAME */ + if (!pszWindowName) + { + xcb_get_property_cookie_t cookie; + xcb_icccm_get_text_property_reply_t reply; + + cookie = xcb_icccm_get_wm_name(conn, iWin); + if (!xcb_icccm_get_wm_name_reply(conn, cookie, &reply, NULL)) { + ErrorF("GetWindowName - xcb_icccm_get_wm_name_reply failed. No name.\n"); + *ppWindowName = NULL; + return; + } + + pszWindowName = Xutf8TextPropertyToString(pWMInfo, &reply); + xcb_icccm_get_text_property_reply_wipe(&reply); + } if (g_fHostInTitle) { + char *pszClientMachine; + char hostname[HOST_NAME_MAX + 1]; + xcb_get_property_cookie_t cookie; + xcb_icccm_get_text_property_reply_t reply; + /* Try to get client machine name */ cookie = xcb_icccm_get_wm_client_machine(conn, iWin); if (xcb_icccm_get_wm_client_machine_reply(conn, cookie, &reply, NULL)) { @@ -998,6 +1020,7 @@ winMultiWindowXMsgProc(void *pArg) char pszDisplay[512]; int iRetries; xcb_atom_t atmWmName; + xcb_atom_t atmNetWmName; xcb_atom_t atmWmHints; xcb_atom_t atmWmChange; xcb_atom_t atmNetWmIcon; @@ -1099,6 +1122,7 @@ winMultiWindowXMsgProc(void *pArg) } atmWmName = intern_atom(pProcArg->conn, "WM_NAME"); + atmNetWmName = intern_atom(pProcArg->conn, "_NET_WM_NAME"); atmWmHints = intern_atom(pProcArg->conn, "WM_HINTS"); atmWmChange = intern_atom(pProcArg->conn, "WM_CHANGE_STATE"); atmNetWmIcon = intern_atom(pProcArg->conn, "_NET_WM_ICON"); @@ -1240,7 +1264,8 @@ winMultiWindowXMsgProc(void *pArg) else if (type == XCB_PROPERTY_NOTIFY) { xcb_property_notify_event_t *notify = (xcb_property_notify_event_t *)event; - if (notify->atom == atmWmName) { + if ((notify->atom == atmWmName) || + (notify->atom == atmNetWmName)) { memset(&msg, 0, sizeof(msg)); msg.msg = WM_WM_NAME_EVENT; @@ -1453,6 +1478,7 @@ winInitMultiWindowWM(WMInfoPtr pWMInfo, WMProcArgPtr pProcArg) pWMInfo->atmWmTakeFocus = intern_atom(pWMInfo->conn, "WM_TAKE_FOCUS"); pWMInfo->atmPrivMap = intern_atom(pWMInfo->conn, WINDOWSWM_NATIVE_HWND); pWMInfo->atmUtf8String = intern_atom(pWMInfo->conn, "UTF8_STRING"); + pWMInfo->atmNetWmName = intern_atom(pWMInfo->conn, "_NET_WM_NAME"); /* Initialization for the xcb_ewmh and EWMH atoms */ { |