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>
This commit is contained in:
parent
866d8299ab
commit
c05c4360ee
|
@ -114,6 +114,7 @@ typedef struct _WMInfo {
|
||||||
xcb_atom_t atmWmTakeFocus;
|
xcb_atom_t atmWmTakeFocus;
|
||||||
xcb_atom_t atmPrivMap;
|
xcb_atom_t atmPrivMap;
|
||||||
xcb_atom_t atmUtf8String;
|
xcb_atom_t atmUtf8String;
|
||||||
|
xcb_atom_t atmNetWmName;
|
||||||
xcb_ewmh_connection_t ewmh;
|
xcb_ewmh_connection_t ewmh;
|
||||||
} WMInfoRec, *WMInfoPtr;
|
} WMInfoRec, *WMInfoPtr;
|
||||||
|
|
||||||
|
@ -376,30 +377,51 @@ static void
|
||||||
GetWindowName(WMInfoPtr pWMInfo, xcb_window_t iWin, char **ppWindowName)
|
GetWindowName(WMInfoPtr pWMInfo, xcb_window_t iWin, char **ppWindowName)
|
||||||
{
|
{
|
||||||
xcb_connection_t *conn = pWMInfo->conn;
|
xcb_connection_t *conn = pWMInfo->conn;
|
||||||
xcb_get_property_cookie_t cookie;
|
char *pszWindowName = NULL;
|
||||||
xcb_icccm_get_text_property_reply_t reply;
|
|
||||||
char *pszWindowName;
|
|
||||||
char *pszClientMachine;
|
|
||||||
char hostname[HOST_NAME_MAX + 1];
|
|
||||||
|
|
||||||
#if CYGMULTIWINDOW_DEBUG
|
#if CYGMULTIWINDOW_DEBUG
|
||||||
ErrorF("GetWindowName\n");
|
ErrorF("GetWindowName\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Intialize ppWindowName to NULL */
|
/* Try to get window name from _NET_WM_NAME */
|
||||||
*ppWindowName = NULL;
|
{
|
||||||
|
xcb_get_property_cookie_t cookie;
|
||||||
|
xcb_get_property_reply_t *reply;
|
||||||
|
|
||||||
/* Try to get window name */
|
cookie = xcb_get_property(pWMInfo->conn, FALSE, iWin,
|
||||||
cookie = xcb_icccm_get_wm_name(conn, iWin);
|
pWMInfo->atmNetWmName,
|
||||||
if (!xcb_icccm_get_wm_name_reply(conn, cookie, &reply, NULL)) {
|
XCB_GET_PROPERTY_TYPE_ANY, 0, INT_MAX);
|
||||||
ErrorF("GetWindowName - xcb_icccm_get_wm_name_reply failed. No name.\n");
|
reply = xcb_get_property_reply(pWMInfo->conn, cookie, NULL);
|
||||||
return;
|
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);
|
/* Otherwise, try to get window name from WM_NAME */
|
||||||
xcb_icccm_get_text_property_reply_wipe(&reply);
|
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) {
|
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 */
|
/* Try to get client machine name */
|
||||||
cookie = xcb_icccm_get_wm_client_machine(conn, iWin);
|
cookie = xcb_icccm_get_wm_client_machine(conn, iWin);
|
||||||
if (xcb_icccm_get_wm_client_machine_reply(conn, cookie, &reply, NULL)) {
|
if (xcb_icccm_get_wm_client_machine_reply(conn, cookie, &reply, NULL)) {
|
||||||
|
@ -998,6 +1020,7 @@ winMultiWindowXMsgProc(void *pArg)
|
||||||
char pszDisplay[512];
|
char pszDisplay[512];
|
||||||
int iRetries;
|
int iRetries;
|
||||||
xcb_atom_t atmWmName;
|
xcb_atom_t atmWmName;
|
||||||
|
xcb_atom_t atmNetWmName;
|
||||||
xcb_atom_t atmWmHints;
|
xcb_atom_t atmWmHints;
|
||||||
xcb_atom_t atmWmChange;
|
xcb_atom_t atmWmChange;
|
||||||
xcb_atom_t atmNetWmIcon;
|
xcb_atom_t atmNetWmIcon;
|
||||||
|
@ -1099,6 +1122,7 @@ winMultiWindowXMsgProc(void *pArg)
|
||||||
}
|
}
|
||||||
|
|
||||||
atmWmName = intern_atom(pProcArg->conn, "WM_NAME");
|
atmWmName = intern_atom(pProcArg->conn, "WM_NAME");
|
||||||
|
atmNetWmName = intern_atom(pProcArg->conn, "_NET_WM_NAME");
|
||||||
atmWmHints = intern_atom(pProcArg->conn, "WM_HINTS");
|
atmWmHints = intern_atom(pProcArg->conn, "WM_HINTS");
|
||||||
atmWmChange = intern_atom(pProcArg->conn, "WM_CHANGE_STATE");
|
atmWmChange = intern_atom(pProcArg->conn, "WM_CHANGE_STATE");
|
||||||
atmNetWmIcon = intern_atom(pProcArg->conn, "_NET_WM_ICON");
|
atmNetWmIcon = intern_atom(pProcArg->conn, "_NET_WM_ICON");
|
||||||
|
@ -1240,7 +1264,8 @@ winMultiWindowXMsgProc(void *pArg)
|
||||||
else if (type == XCB_PROPERTY_NOTIFY) {
|
else if (type == XCB_PROPERTY_NOTIFY) {
|
||||||
xcb_property_notify_event_t *notify = (xcb_property_notify_event_t *)event;
|
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));
|
memset(&msg, 0, sizeof(msg));
|
||||||
|
|
||||||
msg.msg = WM_WM_NAME_EVENT;
|
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->atmWmTakeFocus = intern_atom(pWMInfo->conn, "WM_TAKE_FOCUS");
|
||||||
pWMInfo->atmPrivMap = intern_atom(pWMInfo->conn, WINDOWSWM_NATIVE_HWND);
|
pWMInfo->atmPrivMap = intern_atom(pWMInfo->conn, WINDOWSWM_NATIVE_HWND);
|
||||||
pWMInfo->atmUtf8String = intern_atom(pWMInfo->conn, "UTF8_STRING");
|
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 */
|
/* Initialization for the xcb_ewmh and EWMH atoms */
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue