+ // Return IconTheme*
+
+ IconTheme *theme;
+ char *file_name;
+ FILE *f;
+ char *line = NULL;
+ size_t line_size;
+
+ if (name == NULL)
+ return NULL;
+
+ file_name = g_build_filename(g_get_home_dir(), ".icons", name, "index.theme", NULL);
+ if (!g_file_test(file_name, G_FILE_TEST_EXISTS)) {
+ g_free (file_name);
+ file_name = g_build_filename("/usr/share/icons", name, "index.theme", NULL);
+ if (!g_file_test(file_name, G_FILE_TEST_EXISTS)) {
+ g_free (file_name);
+ file_name = g_build_filename("/usr/share/pixmaps", name, "index.theme", NULL);
+ if (!g_file_test(file_name, G_FILE_TEST_EXISTS)) {
+ g_free (file_name);
+ file_name = NULL;
+ }
+ }
+ }
+
+ if (!file_name) {
+ return NULL;
+ }
+
+ if ((f = fopen(file_name, "rt")) == NULL) {
+ fprintf(stderr, "Could not open theme '%s'\n", file_name);
+ return NULL;
+ }
+
+ g_free (file_name);
+
+ theme = calloc(1, sizeof(IconTheme));
+ theme->name = strdup(name);
+ theme->list_inherits = NULL;
+ theme->list_directories = NULL;
+
+ IconThemeDir *current_dir = NULL;
+ int inside_header = 1;
+ while (getline(&line, &line_size, f) >= 0) {
+ char *key, *value;
+
+ int line_len = strlen(line);
+ if (line_len >= 1) {
+ if (line[line_len - 1] == '\n') {
+ line[line_len - 1] = '\0';
+ line_len--;
+ }
+ }
+
+ if (line_len == 0)
+ continue;
+
+ if (inside_header) {
+ if (parse_theme_line(line, &key, &value)) {
+ if (strcmp(key, "Inherits") == 0) {
+ // value is like oxygen,wood,default
+ char *token;
+ token = strtok(value, ",\n");
+ while (token != NULL)
+ {
+ theme->list_inherits = g_slist_append(theme->list_inherits, strdup(token));
+ token = strtok(NULL, ",\n");
+ }
+ } else if (strcmp(key, "Directories") == 0) {
+ // value is like 48x48/apps,48x48/mimetypes,32x32/apps,scalable/apps,scalable/mimetypes
+ char *token;
+ token = strtok(value, ",\n");
+ while (token != NULL)
+ {
+ IconThemeDir *dir = calloc(1, sizeof(IconThemeDir));
+ dir->name = strdup(token);
+ dir->max_size = dir->min_size = dir->size = -1;
+ dir->type = ICON_DIR_TYPE_THRESHOLD;
+ dir->threshold = 2;
+ theme->list_directories = g_slist_append(theme->list_directories, dir);
+ token = strtok(NULL, ",\n");
+ }
+ }
+ }
+ } else if (current_dir != NULL) {
+ if (parse_theme_line(line, &key, &value)) {
+ if (strcmp(key, "Size") == 0) {
+ // value is like 24
+ sscanf(value, "%d", ¤t_dir->size);
+ if (current_dir->max_size == -1)
+ current_dir->max_size = current_dir->size;
+ if (current_dir->min_size == -1)
+ current_dir->min_size = current_dir->size;
+ } else if (strcmp(key, "MaxSize") == 0) {
+ // value is like 24
+ sscanf(value, "%d", ¤t_dir->max_size);
+ } else if (strcmp(key, "MinSize") == 0) {
+ // value is like 24
+ sscanf(value, "%d", ¤t_dir->min_size);
+ } else if (strcmp(key, "Threshold") == 0) {
+ // value is like 2
+ sscanf(value, "%d", ¤t_dir->threshold);
+ } else if (strcmp(key, "Type") == 0) {
+ // value is Fixed, Scalable or Threshold : default to scalable for unknown Type.
+ if (strcmp(value, "Fixed") == 0) {
+ current_dir->type = ICON_DIR_TYPE_FIXED;
+ } else if (strcmp(value, "Threshold") == 0) {
+ current_dir->type = ICON_DIR_TYPE_THRESHOLD;
+ } else {
+ current_dir->type = ICON_DIR_TYPE_SCALABLE;
+ }
+ } else if (strcmp(key, "Context") == 0) {
+ // usual values: Actions, Applications, Devices, FileSystems, MimeTypes
+ current_dir->context = strdup(value);
+ }
+ }
+ }
+
+ if (line[0] == '[' && line[line_len - 1] == ']' && strcmp(line, "[Icon Theme]") != 0) {
+ inside_header = 0;
+ current_dir = NULL;
+ line[line_len - 1] = '\0';
+ char *dir_name = line + 1;
+ GSList* dir_item = theme->list_directories;
+ while (dir_item != NULL)
+ {
+ IconThemeDir *dir = dir_item->data;
+ if (strcmp(dir->name, dir_name) == 0) {
+ current_dir = dir;
+ break;
+ }
+ dir_item = g_slist_next(dir_item);
+ }
+ }
+ }
+ fclose(f);
+
+ free(line);
+
+ return theme;