to X as 8-bit string and therefore will not be rendered correctly. This behaviour is
to support legacy applications which do not set _NET_WM_NAME */
int name_len;
+ /* This will be set to true as soon as the first _NET_WM_NAME comes in. If set to true,
+ legacy window names are ignored. */
+ bool uses_net_wm_name;
/* fullscreen is pretty obvious */
bool fullscreen;
char *old_name = client->name;
client->name = ucs2_name;
client->name_len = new_len;
+ client->uses_net_wm_name = true;
if (old_name != NULL)
free(old_name);
int handle_windowname_change_legacy(void *data, xcb_connection_t *conn, uint8_t state,
xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop) {
LOG("window's name changed (legacy).\n");
- if (prop == NULL) {
+ if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
LOG("prop == NULL\n");
return 1;
}
if (client == NULL)
return 1;
+ if (client->uses_net_wm_name) {
+ LOG("This client is capable of _NET_WM_NAME, ignoring legacy name\n");
+ return 1;
+ }
+
/* Save the old pointer to make the update atomic */
char *new_name;
int new_len;