summaryrefslogtreecommitdiff
path: root/shell/clock.c
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2014-03-24 22:22:49 +0100
committerJonny Lamb <jonny.lamb@collabora.co.uk>2014-03-24 22:30:18 +0100
commited5035680eb2d364734463b2a08c4ea45fe2f30c (patch)
treea930245581641c126b5310bd848947d9ae568250 /shell/clock.c
parentd04d8be6be1bff80191e1f2ef9d4b500b8015e7d (diff)
downloadgraynard-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.c132
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);
+}