From 6df039c3b5e63430ac208b9077976128b312e79b Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 9 Mar 2009 06:26:32 +0100 Subject: [PATCH] =?UTF-8?q?Convert=20window=20title=20to=20UCS-2=20when=20?= =?UTF-8?q?updating=20it,=20don=E2=80=99t=20update=20it=20if=20it=20didn?= =?UTF-8?q?=E2=80=99t=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/data.h | 1 + src/handlers.c | 18 +++++++++++++++++- src/layout.c | 7 ++----- 3 files changed, 20 insertions(+), 6 deletions(-) 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); } }