diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/indicator-sound.c | 82 | ||||
-rw-r--r-- | src/indicator-sound.h | 4 |
2 files changed, 82 insertions, 4 deletions
diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 3c65a90..29a9f91 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -27,6 +27,8 @@ 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" @@ -47,6 +49,7 @@ struct _IndicatorSoundPrivate GList* transport_widgets_list; GDBusProxy *dbus_proxy; SoundStateManager* state_manager; + NotifyNotification* notification; }; #define INDICATOR_SOUND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_SOUND_TYPE, IndicatorSoundPrivate)) @@ -70,6 +73,11 @@ 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); @@ -130,7 +138,10 @@ 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; + + indicator_sound_notification_init (self); + g_signal_connect ( G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connection_changed), self ); @@ -149,6 +160,10 @@ indicator_sound_dispose (GObject *object) g_list_free ( priv->transport_widgets_list ); + if (priv->notification) { + notify_uninit(); + } + G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object); return; } @@ -198,6 +213,33 @@ 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) @@ -388,7 +430,11 @@ new_volume_slider_widget(DbusmenuMenuitem * newitem, newitem, menu_volume_item, parent); - return TRUE; + + if (priv->notification) + notify_notification_attach_to_widget(priv->notification, volume_widget); + + return TRUE; } /*******************************************************************/ @@ -549,6 +595,34 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) return digested; } +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, @@ -575,5 +649,7 @@ indicator_sound_scroll (IndicatorObject *io, gint delta, value -= adj->step_increment; } //g_debug("indicator-sound-scroll - update slider with value %f", value); - volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value); + volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value); + + indicator_sound_notification_show(INDICATOR_SOUND (io), current_state, value); } diff --git a/src/indicator-sound.h b/src/indicator-sound.h index ecc38fb..a7468fb 100644 --- a/src/indicator-sound.h +++ b/src/indicator-sound.h @@ -23,6 +23,8 @@ PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "config.h" + #include <libindicator/indicator.h> #include <libindicator/indicator-object.h> #include <libindicator/indicator-service-manager.h> @@ -52,7 +54,7 @@ struct _IndicatorSound { GType indicator_sound_get_type (void); void prepare_state_machine(); -extern void determine_state_from_volume(gdouble volume_percent); +extern void update_state_from_volume(gdouble volume_percent); gint get_state(); gchar* get_state_image_name(gint state); void prepare_for_tests(IndicatorObject * io); |