- if (prop_get_all(win, prop, type, 8, &raw, &num)) {
- str = g_string_new_len((gchar*)raw, num);
- g_assert(str->str[num] == '\0'); /* assuming this is always true.. */
-
- g_free(raw);
-
- /* split it into the list */
- for (start = 0, i = 0; i < str->len; ++i) {
- if (str->str[i] == '\0') {
- str2 = g_string_new_len(&str->str[start], i - start);
- g_ptr_array_add(data, g_string_free(str2, FALSE));
- start = i + 1;
- }
- }
- g_string_free(str, TRUE);
-
- if (data->len > 0)
- return TRUE;
+ if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) {
+ str = g_strndup(raw, num); /* grab the first string from the list */
+ g_free(raw);
+ 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, gchar ***ret)
+{
+ GSList *strs = NULL, *it;
+ gchar *raw, *p;
+ guint num, i, count = 0;
+
+ if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) {
+
+ p = raw;
+ while (p < raw + num) {
+ ++count;
+ strs = g_slist_append(strs, p);
+ p += strlen(p) + 1; /* next string */
+ }
+
+ *ret = g_new0(gchar*, 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;