diff options
| author | Lennart Poettering <lennart@poettering.net> | 2008-08-14 21:46:12 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2008-08-14 21:46:12 +0200 | 
| commit | 7b629d3fb6d1c25dac246b699196634db5e1dc1c (patch) | |
| tree | 9a3f7465ea1735bc1c1b83af870e4ad2aa57ef30 /src | |
| parent | f059c857b202a2428b1b4757de2d3d9f23fdf9a3 (diff) | |
look into all themes for sounds
Diffstat (limited to 'src')
| -rw-r--r-- | src/common.c | 2 | ||||
| -rw-r--r-- | src/sound-theme-spec.c | 95 | 
2 files changed, 55 insertions, 42 deletions
diff --git a/src/common.c b/src/common.c index 78e6c81..78cf921 100644 --- a/src/common.c +++ b/src/common.c @@ -691,7 +691,7 @@ const char *ca_strerror(int code) {          [-CA_ERROR_ACCESS] = "Access forbidden",          [-CA_ERROR_IO] = "IO error",          [-CA_ERROR_INTERNAL] = "Internal error", -        [-CA_ERROR_DISABLED] = "Sounds disabled" +        [-CA_ERROR_DISABLED] = "Sound disabled"      };      ca_return_val_if_fail(code <= 0, NULL); diff --git a/src/sound-theme-spec.c b/src/sound-theme-spec.c index 65aaba9..f375622 100644 --- a/src/sound-theme-spec.c +++ b/src/sound-theme-spec.c @@ -41,7 +41,8 @@ typedef struct ca_data_dir ca_data_dir;  struct ca_data_dir {      CA_LLIST_FIELDS(ca_data_dir); -    char *name; +    char *theme_name; +    char *dir_name;      char *output_profile;  }; @@ -90,32 +91,41 @@ static ca_bool_t data_dir_matches(ca_data_dir *d, const char*output_profile) {      return ca_streq(d->output_profile, output_profile);  } -static ca_data_dir* find_data_dir(ca_theme_data *t, const char *name) { +static ca_data_dir* find_data_dir(ca_theme_data *t, const char *theme_name, const char *dir_name) {      ca_data_dir *d;      ca_assert(t); -    ca_assert(name); +    ca_assert(theme_name); +    ca_assert(dir_name);      for (d = t->data_dirs; d; d = d->next) -        if (ca_streq(d->name, name)) +        if (ca_streq(d->theme_name, theme_name) && +            ca_streq(d->dir_name, dir_name))              return d;      return NULL;  } -static int add_data_dir(ca_theme_data *t, const char *name) { +static int add_data_dir(ca_theme_data *t, const char *theme_name, const char *dir_name) {      ca_data_dir *d;      ca_return_val_if_fail(t, CA_ERROR_INVALID); -    ca_return_val_if_fail(name, CA_ERROR_INVALID); +    ca_return_val_if_fail(theme_name, CA_ERROR_INVALID); +    ca_return_val_if_fail(dir_name, CA_ERROR_INVALID); -    if (find_data_dir(t, name)) +    if (find_data_dir(t, theme_name, dir_name))          return CA_SUCCESS;      if (!(d = ca_new0(ca_data_dir, 1)))          return CA_ERROR_OOM; -    if (!(d->name = ca_strdup(name))) { +    if (!(d->theme_name = ca_strdup(theme_name))) { +        ca_free(d); +        return CA_ERROR_OOM; +    } + +    if (!(d->dir_name = ca_strdup(dir_name))) { +        ca_free(d->theme_name);          ca_free(d);          return CA_ERROR_OOM;      } @@ -185,7 +195,7 @@ static int load_theme_path(ca_theme_data *t, const char *prefix, const char *nam                  goto fail;              } -            current_data_dir = find_data_dir(t, d); +            current_data_dir = find_data_dir(t, name, d);              ca_free(d);              in_sound_theme_section = FALSE; @@ -227,7 +237,7 @@ static int load_theme_path(ca_theme_data *t, const char *prefix, const char *nam                              goto fail;                          } -                        ret = add_data_dir(t, p); +                        ret = add_data_dir(t, name, p);                          ca_free(p);                          if (ret != CA_SUCCESS) @@ -248,13 +258,15 @@ static int load_theme_path(ca_theme_data *t, const char *prefix, const char *nam              if (!strncmp(ln, "OutputProfile=", 14)) { -                if (current_data_dir->output_profile && !ca_streq(current_data_dir->output_profile, ln+14)) { -                    ret = CA_ERROR_CORRUPT; -                    goto fail; -                } +                if (!current_data_dir->output_profile) { -                if (!(current_data_dir->output_profile = ca_strdup(ln+14))) { -                    ret = CA_ERROR_OOM; +                    if (!(current_data_dir->output_profile = ca_strdup(ln+14))) { +                        ret = CA_ERROR_OOM; +                        goto fail; +                    } + +                } else if (!ca_streq(current_data_dir->output_profile, ln+14)) { +                    ret = CA_ERROR_CORRUPT;                      goto fail;                  } @@ -311,12 +323,12 @@ static int load_theme_dir(ca_theme_data *t, const char *name) {      ca_return_val_if_fail(name, CA_ERROR_INVALID);      ca_return_val_if_fail(t->n_theme_dir < N_THEME_DIR_MAX, CA_ERROR_CORRUPT); -    if ((ret = get_data_home(&e)) < 0) -        return ret; -      if (ca_streq(name, FALLBACK_THEME))          t->loaded_fallback_theme = TRUE; +    if ((ret = get_data_home(&e)) < 0) +        return ret; +      if (e) {          ret = load_theme_path(t, e, name);          ca_free(e); @@ -398,7 +410,7 @@ fail:  static int find_sound_for_suffix(          ca_sound_file **f, -        ca_theme_data *t, +        const char *theme_name,          const char *name,          const char *path,          const char *suffix, @@ -415,8 +427,8 @@ static int find_sound_for_suffix(      if (!(fn = ca_sprintf_malloc("%s%s%s%s%s%s%s/%s%s",                                   path, -                                 t ? "/" : "", -                                 t ? t->name : "", +                                 theme_name ? "/" : "", +                                 theme_name ? theme_name : "",                                   subdir ? "/" : "",                                   subdir ? subdir : "",                                   locale ? "/" : "", @@ -441,7 +453,7 @@ static int find_sound_for_suffix(  static int find_sound_in_locale(          ca_sound_file **f, -        ca_theme_data *t, +        const char *theme_name,          const char *name,          const char *path,          const char *locale, @@ -460,9 +472,9 @@ static int find_sound_in_locale(      sprintf(p, "%s/sounds", path); -    if ((ret = find_sound_for_suffix(f, t, name, p, ".disabled", locale, subdir)) == CA_ERROR_NOTFOUND) -        if ((ret = find_sound_for_suffix(f, t, name, p, ".ogg", locale, subdir)) == CA_ERROR_NOTFOUND) -            ret = find_sound_for_suffix(f, t, name, p, ".wav", locale, subdir); +    if ((ret = find_sound_for_suffix(f, theme_name, name, p, ".disabled", locale, subdir)) == CA_ERROR_NOTFOUND) +        if ((ret = find_sound_for_suffix(f, theme_name, name, p, ".ogg", locale, subdir)) == CA_ERROR_NOTFOUND) +            ret = find_sound_for_suffix(f, theme_name, name, p, ".wav", locale, subdir);      ca_free(p); @@ -471,7 +483,7 @@ static int find_sound_in_locale(  static int find_sound_for_locale(          ca_sound_file **f, -        ca_theme_data *theme, +        const char *theme_name,          const char *name,          const char *path,          const char *locale, @@ -486,7 +498,7 @@ static int find_sound_for_locale(      ca_return_val_if_fail(locale, CA_ERROR_INVALID);      /* First, try the locale def itself */ -    if ((ret = find_sound_in_locale(f, theme, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) +    if ((ret = find_sound_in_locale(f, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND)          return ret;      /* Then, try to truncate at the @ */ @@ -496,7 +508,7 @@ static int find_sound_for_locale(          if (!(t = ca_strndup(locale, (size_t) (e - locale))))              return CA_ERROR_OOM; -        ret = find_sound_in_locale(f, theme, name, path, t, subdir); +        ret = find_sound_in_locale(f, theme_name, name, path, t, subdir);          ca_free(t);          if (ret != CA_ERROR_NOTFOUND) @@ -510,7 +522,7 @@ static int find_sound_for_locale(          if (!(t = ca_strndup(locale, (size_t) (e - locale))))              return CA_ERROR_OOM; -        ret = find_sound_in_locale(f, theme, name, path, t, subdir); +        ret = find_sound_in_locale(f, theme_name, name, path, t, subdir);          ca_free(t);          if (ret != CA_ERROR_NOTFOUND) @@ -519,16 +531,16 @@ static int find_sound_for_locale(      /* Then, try "C" as fallback locale */      if (strcmp(locale, "C")) -        if ((ret = find_sound_in_locale(f, theme, name, path, "C", subdir)) != CA_ERROR_NOTFOUND) +        if ((ret = find_sound_in_locale(f, theme_name, name, path, "C", subdir)) != CA_ERROR_NOTFOUND)              return ret;      /* Try without locale */ -    return find_sound_in_locale(f, theme, name, path, NULL, subdir); +    return find_sound_in_locale(f, theme_name, name, path, NULL, subdir);  }  static int find_sound_for_name(          ca_sound_file **f, -        ca_theme_data *t, +        const char *theme_name,          const char *name,          const char *path,          const char *locale, @@ -540,7 +552,7 @@ static int find_sound_for_name(      ca_return_val_if_fail(f, CA_ERROR_INVALID);      ca_return_val_if_fail(name && *name, CA_ERROR_INVALID); -    if ((ret = find_sound_for_locale(f, t, name, path, locale, subdir)) != CA_ERROR_NOTFOUND) +    if ((ret = find_sound_for_locale(f, theme_name, name, path, locale, subdir)) != CA_ERROR_NOTFOUND)          return ret;      k = strchr(name, 0); @@ -558,7 +570,7 @@ static int find_sound_for_name(          if (!(n = ca_strndup(name, (size_t) (k-name))))              return CA_ERROR_OOM; -        if ((ret = find_sound_for_locale(f, t, n, path, locale, subdir)) != CA_ERROR_NOTFOUND) { +        if ((ret = find_sound_for_locale(f, theme_name, n, path, locale, subdir)) != CA_ERROR_NOTFOUND) {              ca_free(n);              return ret;          } @@ -569,7 +581,7 @@ static int find_sound_for_name(  static int find_sound_in_subdir(          ca_sound_file **f, -        ca_theme_data *t, +        const char *theme_name,          const char *name,          const char *locale,          const char *subdir) { @@ -585,7 +597,7 @@ static int find_sound_in_subdir(          return ret;      if (e) { -        ret = find_sound_for_name(f, t, name, e, locale, subdir); +        ret = find_sound_for_name(f, theme_name, name, e, locale, subdir);          ca_free(e);          if (ret != CA_ERROR_NOTFOUND) @@ -606,7 +618,7 @@ static int find_sound_in_subdir(              if (!(p = ca_strndup(g, k)))                  return CA_ERROR_OOM; -            ret = find_sound_for_name(f, t, name, p, locale, subdir); +            ret = find_sound_for_name(f, theme_name, name, p, locale, subdir);              ca_free(p);              if (ret != CA_ERROR_NOTFOUND) @@ -639,7 +651,7 @@ static int find_sound_in_profile(          if (data_dir_matches(d, profile)) {              int ret; -            if ((ret = find_sound_in_subdir(f, t, name, locale, d->name)) != CA_ERROR_NOTFOUND) +            if ((ret = find_sound_in_subdir(f, d->theme_name, name, locale, d->dir_name)) != CA_ERROR_NOTFOUND)                  return ret;          } @@ -671,7 +683,7 @@ static int find_sound_in_theme(      }      /* And fall back to no profile */ -    return find_sound_in_subdir(f, t, name, locale, NULL); +    return find_sound_in_subdir(f, t ? t->name : NULL, name, locale, NULL);  }  static int find_sound_for_theme( @@ -756,7 +768,8 @@ void ca_theme_data_free(ca_theme_data *t) {          CA_LLIST_REMOVE(ca_data_dir, t->data_dirs, d); -        ca_free(d->name); +        ca_free(d->theme_name); +        ca_free(d->dir_name);          ca_free(d->output_profile);          ca_free(d);      }  | 
