X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fprop.c;h=30d39f0f49d536a3f26532819ea009f815d9a2c9;hb=6923e53751b796d12d37b8f4a3889fb934f0ef6c;hp=8677de07efa4fa873ffc4945b5cd9ded35e3b774;hpb=957ffe9c037f8fe005c93ddc4a7fd309e22c7fba;p=chaz%2Fopenbox diff --git a/openbox/prop.c b/openbox/prop.c index 8677de07..30d39f0f 100644 --- a/openbox/prop.c +++ b/openbox/prop.c @@ -278,27 +278,32 @@ gboolean prop_get_string_locale(Window win, Atom prop, char **ret) gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret) { + GSList *strs = NULL, *it; char *raw, *p; - guint num, i; + guint num, i, count = 0; - if (get_all(win, prop, prop_atoms.string, 8, (guchar**)&raw, &num)){ - *ret = g_new(char*, num + 1); - (*ret)[num] = NULL; /* null terminated list */ + if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) { p = raw; - for (i = 0; i < num; ++i) { - (*ret)[i] = g_convert(p, strlen(p), "UTF-8", "ISO-8859-1", + while (p < raw + num - 1) { + ++count; + strs = g_slist_append(strs, p); + p += strlen(p) + 1; /* next string */ + } + + *ret = g_new0(char*, count + 1); + (*ret)[count] = NULL; /* null terminated list */ + + for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) { + (*ret)[i] = g_convert(it->data, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); /* make sure translation did not fail */ - if (!(*ret)[i]) { - g_strfreev(*ret); /* free what we did so far */ - break; /* the force is not strong with us */ - } - p = strchr(p, '\0'); + if (!(*ret)[i]) + (*ret)[i] = g_strdup(""); } g_free(raw); - if (i == num) - return TRUE; + g_slist_free(strs); + return TRUE; } return FALSE; } @@ -306,31 +311,46 @@ gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret) gboolean prop_get_string_utf8(Window win, Atom prop, char **ret) { char *raw; + char *str; guint num; if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) { - *ret = g_strndup(raw, num); /* grab the first string from the list */ + str = g_strndup(raw, num); /* grab the first string from the list */ g_free(raw); - return TRUE; + if (g_utf8_validate(str, -1, NULL)) { + *ret = str; + return TRUE; + } + g_free(str); } return FALSE; } gboolean prop_get_strings_utf8(Window win, Atom prop, char ***ret) { + GSList *strs = NULL, *it; char *raw, *p; - guint num, i; + guint num, i, count = 0; if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) { - *ret = g_new(char*, num + 1); - (*ret)[num] = NULL; /* null terminated list */ p = raw; - for (i = 0; i < num; ++i) { - (*ret)[i] = g_strdup(p); - p = strchr(p, '\0'); + while (p < raw + num - 1) { + ++count; + strs = g_slist_append(strs, p); + p += strlen(p) + 1; /* next string */ + } + + *ret = g_new0(char*, count + 1); + + for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) { + if (g_utf8_validate(it->data, -1, NULL)) + (*ret)[i] = g_strdup(it->data); + else + (*ret)[i] = g_strdup(""); } g_free(raw); + g_slist_free(strs); return TRUE; } return FALSE;