diff --git a/src/fbd-dev-sound.c b/src/fbd-dev-sound.c index c4777e5..fc38da0 100644 --- a/src/fbd-dev-sound.c +++ b/src/fbd-dev-sound.c @@ -14,6 +14,9 @@ #include +#define GNOME_SOUND_SCHEMA_ID "org.gnome.desktop.sound" +#define GNOME_SOUND_KEY_THEME_NAME "theme-name" + /** * SECTION:fbd-dev-sound * @short_description: Sound interface @@ -32,6 +35,7 @@ typedef struct _FbdDevSound { GObject parent; GSoundContext *ctx; + GSettings *sound_settings; } FbdDevSound; static void initable_iface_init (GInitableIface *iface); @@ -39,12 +43,39 @@ static void initable_iface_init (GInitableIface *iface); G_DEFINE_TYPE_WITH_CODE (FbdDevSound, fbd_dev_sound, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init)); +static void +on_sound_theme_name_changed (FbdDevSound *self, + const gchar *key, + GSettings *settings) +{ + gboolean ok; + g_autoptr(GError) error = NULL; + g_autofree gchar *name = NULL; + + g_return_if_fail (FBD_IS_DEV_SOUND (self)); + g_return_if_fail (G_IS_SETTINGS (settings)); + g_return_if_fail (!g_strcmp0 (key, GNOME_SOUND_KEY_THEME_NAME)); + g_return_if_fail (self->ctx); + + name = g_settings_get_string (settings, key); + g_debug ("Setting sound theme to %s", name); + + ok = gsound_context_set_attributes (self->ctx, + &error, + GSOUND_ATTR_CANBERRA_XDG_THEME_NAME, + name, + NULL); + if (!ok) + g_warning ("Failed to set sound theme name to %s: %s", key, error->message); +} + static void fbd_dev_sound_dispose (GObject *object) { FbdDevSound *self = FBD_DEV_SOUND (object); g_clear_object (&self->ctx); + g_clear_object (&self->sound_settings); G_OBJECT_CLASS (fbd_dev_sound_parent_class)->dispose (object); } @@ -55,11 +86,22 @@ initable_init (GInitable *initable, GError **error) { FbdDevSound *self = FBD_DEV_SOUND (initable); + const char *desktop; self->ctx = gsound_context_new(NULL, error); if (!self->ctx) return FALSE; + desktop = g_getenv ("XDG_CURRENT_DESKTOP"); + if (!g_strcmp0 (desktop, "GNOME")) { + self->sound_settings = g_settings_new (GNOME_SOUND_SCHEMA_ID); + + g_signal_connect_object (self->sound_settings, "changed::" GNOME_SOUND_KEY_THEME_NAME, + G_CALLBACK (on_sound_theme_name_changed), self, + G_CONNECT_SWAPPED); + on_sound_theme_name_changed (self, GNOME_SOUND_KEY_THEME_NAME, self->sound_settings); + } + return TRUE; }