From: Michael Stapelberg Date: Mon, 9 Mar 2009 05:26:32 +0000 (+0100) Subject: Convert window title to UCS-2 when updating it, don’t update it if it didn’t change X-Git-Tag: 3.a~56 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6df039c3b5e63430ac208b9077976128b312e79b;p=i3%2Fi3 Convert window title to UCS-2 when updating it, don’t update it if it didn’t change --- diff --git a/include/data.h b/include/data.h index c5dbf67e..083d7fbd 100644 --- a/include/data.h +++ b/include/data.h @@ -215,6 +215,7 @@ struct Client { /* Name (= window title) */ char *name; + int name_len; /* fullscreen is pretty obvious */ bool fullscreen; diff --git a/src/handlers.c b/src/handlers.c index 714ff211..58e8c068 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -495,8 +495,24 @@ int handle_windowname_change(void *data, xcb_connection_t *conn, uint8_t state, return 1; /* 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; - 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) free(old_name); LOG("rename to \"%s\".\n", client->name); diff --git a/src/layout.c b/src/layout.c index 0aff8665..14120ef0 100644 --- a/src/layout.c +++ b/src/layout.c @@ -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 }; xcb_change_gc(conn, gc, mask, values); - int real_strlen; - char *ucs2_label = convert_utf8_to_ucs2(client->name, &real_strlen); - 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); + xcb_image_text_16(conn, client->name_len, drawable, gc, 3 /* X */, + offset + font->height /* Y = baseline of font */, (xcb_char2b_t*)client->name); } }