diff options
| author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2014-03-24 22:22:49 +0100 |
|---|---|---|
| committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2014-03-24 22:30:18 +0100 |
| commit | ed5035680eb2d364734463b2a08c4ea45fe2f30c (patch) | |
| tree | a930245581641c126b5310bd848947d9ae568250 /shell/clock.c | |
| parent | d04d8be6be1bff80191e1f2ef9d4b500b8015e7d (diff) | |
| download | graynard-ed5035680eb2d364734463b2a08c4ea45fe2f30c.tar.gz graynard-ed5035680eb2d364734463b2a08c4ea45fe2f30c.zip | |
panel,clock: implement setting volume by showing a scale over the clock
Diffstat (limited to 'shell/clock.c')
| -rw-r--r-- | shell/clock.c | 132 |
1 files changed, 128 insertions, 4 deletions
diff --git a/shell/clock.c b/shell/clock.c index 8f75451..c649931 100644 --- a/shell/clock.c +++ b/shell/clock.c @@ -26,9 +26,21 @@ #define GNOME_DESKTOP_USE_UNSTABLE_API #include <libgnome-desktop/gnome-wall-clock.h> +enum { + VOLUME_CHANGED, + N_SIGNALS +}; +static guint signals[N_SIGNALS] = { 0 }; + struct MaynardClockPrivate { + GtkWidget *revealer_clock; + GtkWidget *revealer_volume; + GtkWidget *label; + GtkWidget *volume_scale; + GtkWidget *volume_image; + GnomeWallClock *wall_clock; }; @@ -43,6 +55,76 @@ maynard_clock_init (MaynardClock *self) } static void +volume_changed_cb (GtkRange *range, + MaynardClock *self) +{ + GError *error = NULL; + gdouble value; + gchar *cmd; + const gchar *icon_name; + GtkWidget *box; + + value = gtk_range_get_value (range); + + cmd = g_strdup_printf ("amixer set PCM %d%%", (int) value); + + g_spawn_command_line_async (cmd, &error); + + if (error) + { + g_print ("failed to set volume: %s\n", error->message); + g_clear_error (&error); + } + + g_free (cmd); + + /* update the icon */ + if (value > 75) + icon_name = "audio-volume-high-symbolic"; + else if (value > 50) + icon_name = "audio-volume-medium-symbolic"; + else if (value > 25) + icon_name = "audio-volume-low-symbolic"; + else if (value == 0) + icon_name = "audio-volume-muted-symbolic"; + + box = gtk_widget_get_parent (self->priv->volume_image); + gtk_widget_destroy (self->priv->volume_image); + self->priv->volume_image = gtk_image_new_from_icon_name ( + icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_box_pack_start (GTK_BOX (box), self->priv->volume_image, + FALSE, FALSE, 0); + gtk_widget_show (self->priv->volume_image); + + g_signal_emit (self, signals[VOLUME_CHANGED], 0, value, icon_name); +} + +static GtkWidget * +create_volume_box (MaynardClock *self) +{ + GtkWidget *box; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + + self->priv->volume_image = gtk_image_new_from_icon_name ( + "audio-volume-high-symbolic", + GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_box_pack_start (GTK_BOX (box), self->priv->volume_image, + FALSE, FALSE, 0); + + self->priv->volume_scale = gtk_scale_new_with_range ( + GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); + gtk_scale_set_draw_value (GTK_SCALE (self->priv->volume_scale), FALSE); + gtk_widget_set_size_request (self->priv->volume_scale, 100, -1); + gtk_box_pack_end (GTK_BOX (box), self->priv->volume_scale, TRUE, TRUE, 0); + + g_signal_connect (self->priv->volume_scale, "value-changed", + G_CALLBACK (volume_changed_cb), self); + + return box; +} + +static void wall_clock_notify_cb (GnomeWallClock *wall_clock, GParamSpec *pspec, MaynardClock *self) @@ -65,6 +147,7 @@ static void maynard_clock_constructed (GObject *object) { MaynardClock *self = MAYNARD_CLOCK (object); + GtkWidget *box, *volume_box; G_OBJECT_CLASS (maynard_clock_parent_class)->constructed (object); @@ -80,9 +163,38 @@ maynard_clock_constructed (GObject *object) gtk_widget_get_style_context (GTK_WIDGET (self)), "maynard-clock"); + /* the box for the revealers */ + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_container_add (GTK_CONTAINER (self), box); + + /* volume */ + self->priv->revealer_volume = gtk_revealer_new (); + gtk_revealer_set_transition_type ( + GTK_REVEALER (self->priv->revealer_volume), + GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT); + gtk_revealer_set_reveal_child ( + GTK_REVEALER (self->priv->revealer_volume), FALSE); + gtk_box_pack_start (GTK_BOX (box), self->priv->revealer_volume, + TRUE, TRUE, 0); + + volume_box = create_volume_box (self); + gtk_container_add (GTK_CONTAINER (self->priv->revealer_volume), + volume_box); + + /* clock */ + self->priv->revealer_clock = gtk_revealer_new (); + gtk_revealer_set_transition_type ( + GTK_REVEALER (self->priv->revealer_clock), + GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT); + gtk_revealer_set_reveal_child ( + GTK_REVEALER (self->priv->revealer_clock), TRUE); + gtk_box_pack_start (GTK_BOX (box), self->priv->revealer_clock, + TRUE, TRUE, 0); + self->priv->label = gtk_label_new (""); gtk_label_set_justify (GTK_LABEL (self->priv->label), GTK_JUSTIFY_CENTER); - gtk_container_add (GTK_CONTAINER (self), self->priv->label); + gtk_container_add (GTK_CONTAINER (self->priv->revealer_clock), + self->priv->label); wall_clock_notify_cb (self->priv->wall_clock, NULL, self); } @@ -92,9 +204,7 @@ maynard_clock_dispose (GObject *object) { MaynardClock *self = MAYNARD_CLOCK (object); - if (self->priv->wall_clock) - g_object_unref (self->priv->wall_clock); - self->priv->wall_clock = NULL; + g_clear_object (&self->priv->wall_clock); G_OBJECT_CLASS (maynard_clock_parent_class)->dispose (object); } @@ -107,6 +217,10 @@ maynard_clock_class_init (MaynardClockClass *klass) object_class->constructed = maynard_clock_constructed; object_class->dispose = maynard_clock_dispose; + signals[VOLUME_CHANGED] = g_signal_new ("volume-changed", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, + NULL, G_TYPE_NONE, 2, G_TYPE_DOUBLE, G_TYPE_STRING); + g_type_class_add_private (object_class, sizeof (MaynardClockPrivate)); } @@ -116,3 +230,13 @@ maynard_clock_new (void) return g_object_new (MAYNARD_CLOCK_TYPE, NULL); } + +void +maynard_clock_show_volume (MaynardClock *self, + gboolean value) +{ + gtk_revealer_set_reveal_child ( + GTK_REVEALER (self->priv->revealer_volume), value); + gtk_revealer_set_reveal_child ( + GTK_REVEALER (self->priv->revealer_clock), !value); +} |
