Convert window title to UCS-2 when updating it, don’t update it if it didn’t change
This commit is contained in:
parent
4f8e704017
commit
6df039c3b5
|
@ -215,6 +215,7 @@ struct Client {
|
||||||
|
|
||||||
/* Name (= window title) */
|
/* Name (= window title) */
|
||||||
char *name;
|
char *name;
|
||||||
|
int name_len;
|
||||||
|
|
||||||
/* fullscreen is pretty obvious */
|
/* fullscreen is pretty obvious */
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
|
|
|
@ -495,8 +495,24 @@ int handle_windowname_change(void *data, xcb_connection_t *conn, uint8_t state,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Save the old pointer to make the update atomic */
|
/* Save the old pointer to make the update atomic */
|
||||||
|
char *new_name;
|
||||||
|
int new_len;
|
||||||
|
asprintf(&new_name, "%.*s", xcb_get_property_value_length(prop), (char*)xcb_get_property_value(prop));
|
||||||
|
/* Convert it to UCS-2 here for not having to convert it later every time we want to pass it to X */
|
||||||
|
char *ucs2_name = convert_utf8_to_ucs2(new_name, &new_len);
|
||||||
|
free(new_name);
|
||||||
|
|
||||||
|
/* Check if they are the same and don’t update if so */
|
||||||
|
if (new_len == client->name_len && strcmp(client->name, new_name) == 0) {
|
||||||
|
LOG("Name did not change, not updating\n");
|
||||||
|
free(ucs2_name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char *old_name = client->name;
|
char *old_name = client->name;
|
||||||
asprintf(&(client->name), "%.*s", xcb_get_property_value_length(prop), (char*)xcb_get_property_value(prop));
|
client->name = ucs2_name;
|
||||||
|
client->name_len = new_len;
|
||||||
|
|
||||||
if (old_name != NULL)
|
if (old_name != NULL)
|
||||||
free(old_name);
|
free(old_name);
|
||||||
LOG("rename to \"%s\".\n", client->name);
|
LOG("rename to \"%s\".\n", client->name);
|
||||||
|
|
|
@ -169,11 +169,8 @@ void decorate_window(xcb_connection_t *conn, Client *client, xcb_drawable_t draw
|
||||||
uint32_t values[] = { text_color, background_color, font->id };
|
uint32_t values[] = { text_color, background_color, font->id };
|
||||||
xcb_change_gc(conn, gc, mask, values);
|
xcb_change_gc(conn, gc, mask, values);
|
||||||
|
|
||||||
int real_strlen;
|
xcb_image_text_16(conn, client->name_len, drawable, gc, 3 /* X */,
|
||||||
char *ucs2_label = convert_utf8_to_ucs2(client->name, &real_strlen);
|
offset + font->height /* Y = baseline of font */, (xcb_char2b_t*)client->name);
|
||||||
xcb_image_text_16(conn, real_strlen, drawable, gc, 3 /* X */,
|
|
||||||
offset + font->height /* Y = baseline of font */, (xcb_char2b_t*)ucs2_label);
|
|
||||||
free(ucs2_label);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue