aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/indicator-sound.c85
-rw-r--r--src/indicator-sound.h7
-rw-r--r--src/sound-state-manager.c106
-rw-r--r--src/sound-state-manager.h5
4 files changed, 107 insertions, 96 deletions
diff --git a/src/indicator-sound.c b/src/indicator-sound.c
index 6678750..7e5ebc7 100644
--- a/src/indicator-sound.c
+++ b/src/indicator-sound.c
@@ -27,8 +27,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <gio/gio.h>
-#include <libnotify/notify.h>
-
#include "indicator-sound.h"
#include "transport-widget.h"
#include "metadata-widget.h"
@@ -49,8 +47,6 @@ struct _IndicatorSoundPrivate
GList* transport_widgets_list;
GDBusProxy *dbus_proxy;
SoundStateManager* state_manager;
- GSettings *settings_manager;
- NotifyNotification* notification;
};
#define INDICATOR_SOUND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_SOUND_TYPE, IndicatorSoundPrivate))
@@ -74,11 +70,6 @@ static void indicator_sound_scroll (IndicatorObject* io,
gint delta,
IndicatorScrollDirection direction);
-//Notification
-static void indicator_sound_notification_init (IndicatorSound *self);
-static void indicator_sound_notification_show (IndicatorSound *self,
- SoundState state, double value);
-
//key/moust event handlers
static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data);
static gboolean key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data);
@@ -142,10 +133,6 @@ indicator_sound_init (IndicatorSound *self)
GList* t_list = NULL;
priv->transport_widgets_list = t_list;
priv->state_manager = g_object_new (SOUND_TYPE_STATE_MANAGER, NULL);
- priv->notification = NULL;
-
- priv->settings_manager = g_settings_new("com.canonical.indicators.sound");
- indicator_sound_notification_init (self);
g_signal_connect ( G_OBJECT(self->service),
INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE,
@@ -162,15 +149,8 @@ indicator_sound_dispose (GObject *object)
g_object_unref(G_OBJECT(self->service));
self->service = NULL;
}
-
g_list_free ( priv->transport_widgets_list );
- g_object_unref(priv->settings_manager);
-
- if (priv->notification) {
- notify_uninit();
- }
-
G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object);
return;
}
@@ -228,33 +208,6 @@ get_menu (IndicatorObject * io)
}
static void
-indicator_sound_notification_init (IndicatorSound *self)
-{
- IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(self);
-
- if (!notify_init(PACKAGE_NAME))
- return;
-
- GList* caps = notify_get_server_caps();
- gboolean has_notify_osd = FALSE;
-
- if (caps) {
- if (g_list_find_custom(caps, "x-canonical-private-synchronous",
- (GCompareFunc) g_strcmp0)) {
- has_notify_osd = TRUE;
- }
- g_list_foreach(caps, (GFunc) g_free, NULL);
- g_list_free(caps);
- }
-
- if (has_notify_osd) {
- priv->notification = notify_notification_new(PACKAGE_NAME, NULL, NULL, NULL);
- notify_notification_set_hint_string(priv->notification,
- "x-canonical-private-synchronous", "");
- }
-}
-
-static void
connection_changed (IndicatorServiceManager * sm,
gboolean connected,
gpointer user_data)
@@ -448,10 +401,8 @@ new_volume_slider_widget(DbusmenuMenuitem * newitem,
newitem,
menu_volume_item,
parent);
-
- if (priv->notification)
- notify_notification_attach_to_widget(priv->notification, volume_widget);
-
+ sound_state_manager_attach_notification_to_volume_widget (priv->state_manager,
+ volume_widget);
return TRUE;
}
@@ -614,35 +565,6 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
}
static void
-indicator_sound_notification_show(IndicatorSound *self, SoundState state, double value)
-{
- IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(self);
-
- if (priv->notification == NULL)
- return;
-
- char *icon;
- const int notify_value = CLAMP((int)value, -1, 101);
-
- if (state == ZERO_LEVEL) {
- // Not available for all the themes
- icon = "audio-volume-off";
- } else if (state == LOW_LEVEL) {
- icon = "audio-volume-low";
- } else if (state == MEDIUM_LEVEL) {
- icon = "audio-volume-medium";
- } else if (state == HIGH_LEVEL) {
- icon = "audio-volume-high";
- } else {
- icon = "audio-volume-muted";
- }
-
- notify_notification_update(priv->notification, PACKAGE_NAME, NULL, icon);
- notify_notification_set_hint_int32(priv->notification, "value", notify_value);
- notify_notification_show(priv->notification, NULL);
-}
-
-static void
indicator_sound_scroll (IndicatorObject *io, gint delta,
IndicatorScrollDirection direction)
{
@@ -669,6 +591,5 @@ indicator_sound_scroll (IndicatorObject *io, gint delta,
//g_debug("indicator-sound-scroll - update slider with value %f", value);
volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value);
- if (g_settings_get_boolean(priv->settings_manager, "show-notify-osd-on-scroll"))
- indicator_sound_notification_show(INDICATOR_SOUND (io), current_state, value);
+ sound_state_manager_show_notification (priv->state_manager, value);
}
diff --git a/src/indicator-sound.h b/src/indicator-sound.h
index c52a62a..40a3e6f 100644
--- a/src/indicator-sound.h
+++ b/src/indicator-sound.h
@@ -53,11 +53,4 @@ struct _IndicatorSound {
// GObject Boiler plate
GType indicator_sound_get_type (void);
-void prepare_state_machine();
-extern void determine_state_from_volume(gdouble volume_percent);
-gint get_state();
-gchar* get_state_image_name(gint state);
-void prepare_for_tests(IndicatorObject * io);
-void tidy_up_hash();
-
#endif
diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c
index e8865d8..a592711 100644
--- a/src/sound-state-manager.c
+++ b/src/sound-state-manager.c
@@ -18,6 +18,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libindicator/indicator-image-helper.h>
+#include <libnotify/notify.h>
+
+#include "config.h"
+
#include "sound-state-manager.h"
#include "dbus-shared-names.h"
@@ -30,6 +34,8 @@ struct _SoundStateManagerPrivate
GList* blocked_animation_list;
SoundState current_state;
GtkImage* speaker_image;
+ NotifyNotification* notification;
+ GSettings *settings_manager;
};
#define SOUND_STATE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUND_TYPE_STATE_MANAGER, SoundStateManagerPrivate))
@@ -41,7 +47,11 @@ static gint animation_id;
static GList* blocked_iter = NULL;
static gboolean can_animate = FALSE;
-static void sound_state_manager_prepare_blocked_animation(SoundStateManager* self);
+//Notifications
+static void sound_state_manager_notification_init (SoundStateManager* self);
+
+//Animation/State related
+static void sound_state_manager_prepare_blocked_animation (SoundStateManager* self);
static gboolean sound_state_manager_start_animation (gpointer user_data);
static gboolean sound_state_manager_fade_back_to_mute_image (gpointer user_data);
static void sound_state_manager_reset_mute_blocking_animation (SoundStateManager* self);
@@ -54,6 +64,7 @@ static void sound_state_signal_cb ( GDBusProxy* proxy,
gpointer user_data );
static gboolean sound_state_manager_can_proceed_with_blocking_animation (SoundStateManager* self);
+
static void
sound_state_manager_init (SoundStateManager* self)
{
@@ -63,6 +74,12 @@ sound_state_manager_init (SoundStateManager* self)
priv->volume_states = NULL;
priv->speaker_image = NULL;
priv->blocked_animation_list = NULL;
+ priv->notification = NULL;
+ priv->settings_manager = NULL;
+
+ priv->settings_manager = g_settings_new("com.canonical.indicators.sound");
+
+ sound_state_manager_notification_init (self);
sound_state_manager_prepare_state_image_names (self);
sound_state_manager_prepare_blocked_animation (self);
@@ -89,9 +106,16 @@ sound_state_manager_dispose (GObject *object)
g_hash_table_destroy (priv->volume_states);
sound_state_manager_free_the_animation_list (self);
+
+ if (priv->notification) {
+ notify_uninit();
+ }
+
+ g_object_unref(priv->settings_manager);
+
G_OBJECT_CLASS (sound_state_manager_parent_class)->dispose (object);
}
-
+
static void
sound_state_manager_class_init (SoundStateManagerClass *klass)
@@ -106,6 +130,77 @@ sound_state_manager_class_init (SoundStateManagerClass *klass)
design_team_size = gtk_icon_size_register("design-team-size", 22, 22);
}
+static void
+sound_state_manager_notification_init (SoundStateManager* self)
+{
+ SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self);
+
+ if (!notify_init(PACKAGE_NAME))
+ return;
+
+ GList* caps = notify_get_server_caps();
+ gboolean has_notify_osd = FALSE;
+
+ if (caps) {
+ if (g_list_find_custom(caps, "x-canonical-private-synchronous",
+ (GCompareFunc) g_strcmp0)) {
+ has_notify_osd = TRUE;
+ }
+ g_list_foreach(caps, (GFunc) g_free, NULL);
+ g_list_free(caps);
+ }
+
+ if (has_notify_osd) {
+ priv->notification = notify_notification_new(PACKAGE_NAME, NULL, NULL, NULL);
+ notify_notification_set_hint_string(priv->notification,
+ "x-canonical-private-synchronous", "");
+ }
+}
+
+void
+sound_state_manager_attach_notification_to_volume_widget (SoundStateManager *self,
+ GtkWidget* volume_widget)
+{
+ SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self);
+ if (priv->notification)
+ notify_notification_attach_to_widget(priv->notification, volume_widget);
+}
+
+
+void
+sound_state_manager_show_notification (SoundStateManager *self,
+ double value)
+{
+ SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self);
+
+ if (priv->notification == NULL ||
+ g_settings_get_boolean (priv->settings_manager, "show-notify-osd-on-scroll") == FALSE){
+ return;
+ }
+
+ char *icon;
+ const int notify_value = CLAMP((int)value, -1, 101);
+ SoundState state = sound_state_manager_get_current_state (self);
+
+ if (state == ZERO_LEVEL) {
+ // Not available for all the themes
+ icon = "audio-volume-off";
+ } else if (state == LOW_LEVEL) {
+ icon = "audio-volume-low";
+ } else if (state == MEDIUM_LEVEL) {
+ icon = "audio-volume-medium";
+ } else if (state == HIGH_LEVEL) {
+ icon = "audio-volume-high";
+ } else {
+ icon = "audio-volume-muted";
+ }
+
+ notify_notification_update(priv->notification, PACKAGE_NAME, NULL, icon);
+ notify_notification_set_hint_int32(priv->notification, "value", notify_value);
+ notify_notification_show(priv->notification, NULL);
+}
+
+
/*
Prepare states versus images names hash.
*/
@@ -113,7 +208,8 @@ static void
sound_state_manager_prepare_state_image_names (SoundStateManager* self)
{
SoundStateManagerPrivate* priv = SOUND_STATE_MANAGER_GET_PRIVATE(self);
- priv->volume_states = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+ priv->volume_states = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+
g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(MUTED), g_strdup("audio-volume-muted-panel"));
g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(ZERO_LEVEL), g_strdup("audio-volume-low-zero-panel"));
g_hash_table_insert (priv->volume_states, GINT_TO_POINTER(LOW_LEVEL), g_strdup("audio-volume-low-panel"));
@@ -281,8 +377,7 @@ sound_state_signal_cb ( GDBusProxy* proxy,
blocked_id = g_timeout_add_seconds (4,
sound_state_manager_start_animation,
self);
- indicator_image_helper_update (priv->speaker_image, image_name);
-
+ indicator_image_helper_update (priv->speaker_image, image_name);
}
else{
indicator_image_helper_update (priv->speaker_image, image_name);
@@ -291,7 +386,6 @@ sound_state_signal_cb ( GDBusProxy* proxy,
else {
g_warning ("sorry don't know what signal this is - %s", signal_name);
}
-
}
void
diff --git a/src/sound-state-manager.h b/src/sound-state-manager.h
index d73d5d9..0b919cb 100644
--- a/src/sound-state-manager.h
+++ b/src/sound-state-manager.h
@@ -58,8 +58,11 @@ void sound_state_manager_deal_with_disconnect (SoundStateManager* self);
void sound_state_manager_get_state_cb (GObject *object,
GAsyncResult *res,
gpointer user_data);
+void sound_state_manager_show_notification (SoundStateManager *self,
+ double value);
-
+void sound_state_manager_attach_notification_to_volume_widget (SoundStateManager *self,
+ GtkWidget* volume_widget);
G_END_DECLS