summaryrefslogtreecommitdiff
path: root/shell/panel.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/panel.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/panel.c')
-rw-r--r--shell/panel.c84
1 files changed, 81 insertions, 3 deletions
diff --git a/shell/panel.c b/shell/panel.c
index 95c287b..4b9605a 100644
--- a/shell/panel.c
+++ b/shell/panel.c
@@ -29,6 +29,7 @@
enum {
APP_MENU_TOGGLED,
+ VOLUME_TOGGLED,
N_SIGNALS
};
static guint signals[N_SIGNALS] = { 0 };
@@ -38,6 +39,10 @@ struct MaynardPanelPrivate {
GtkWidget *revealer_buttons; /* for the top buttons */
GtkWidget *revealer_clock; /* for the vertical clock */
+
+ gboolean volume_showing;
+ GtkWidget *volume_button;
+ gchar *volume_icon_name;
};
G_DEFINE_TYPE(MaynardPanel, maynard_panel, GTK_TYPE_WINDOW)
@@ -48,6 +53,8 @@ maynard_panel_init (MaynardPanel *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
MAYNARD_PANEL_TYPE,
MaynardPanelPrivate);
+
+ self->priv->volume_icon_name = g_strdup ("audio-volume-high-symbolic");
}
static gboolean
@@ -74,6 +81,13 @@ app_menu_button_clicked_cb (GtkButton *button,
}
static void
+volume_button_clicked_cb (GtkButton *button,
+ MaynardPanel *self)
+{
+ g_signal_emit (self, signals[VOLUME_TOGGLED], 0);
+}
+
+static void
maynard_panel_constructed (GObject *object)
{
MaynardPanel *self = MAYNARD_PANEL (object);
@@ -138,11 +152,21 @@ maynard_panel_constructed (GObject *object)
gtk_box_pack_start (GTK_BOX (buttons_box), image, FALSE, FALSE, 0);
/* sound button */
- image = gtk_image_new_from_icon_name ("audio-volume-high-symbolic",
+ ebox = gtk_event_box_new ();
+ gtk_box_pack_end (GTK_BOX (buttons_box), ebox, FALSE, FALSE, 0);
+ button = gtk_button_new_from_icon_name (self->priv->volume_icon_name,
GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_style_context_add_class (gtk_widget_get_style_context (image),
+ gtk_style_context_add_class (gtk_widget_get_style_context (button),
"maynard-audio");
- gtk_box_pack_start (GTK_BOX (buttons_box), image, FALSE, FALSE, 0);
+ gtk_style_context_remove_class (gtk_widget_get_style_context (button),
+ "button");
+ gtk_style_context_remove_class (gtk_widget_get_style_context (button),
+ "image-button");
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (volume_button_clicked_cb), self);
+ gtk_container_add (GTK_CONTAINER (ebox), button);
+ widget_connect_enter_signal (self, ebox);
+ self->priv->volume_button = button;
/* revealer for the vertical clock */
self->priv->revealer_clock = gtk_revealer_new ();
@@ -176,6 +200,18 @@ maynard_panel_constructed (GObject *object)
/* done */
self->priv->hidden = FALSE;
+ self->priv->volume_showing = TRUE;
+}
+
+static void
+maynard_panel_dispose (GObject *object)
+{
+ MaynardPanel *self = MAYNARD_PANEL (object);
+
+ g_free (self->priv->volume_icon_name);
+ self->priv->volume_icon_name = NULL;
+
+ G_OBJECT_CLASS (maynard_panel_parent_class)->dispose (object);
}
static void
@@ -185,11 +221,16 @@ maynard_panel_class_init (MaynardPanelClass *klass)
GParamSpec *param_spec;
object_class->constructed = maynard_panel_constructed;
+ object_class->dispose = maynard_panel_dispose;
signals[APP_MENU_TOGGLED] = g_signal_new ("app-menu-toggled",
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
NULL, G_TYPE_NONE, 0);
+ signals[VOLUME_TOGGLED] = g_signal_new ("volume-toggled",
+ G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ NULL, G_TYPE_NONE, 0);
+
g_type_class_add_private (object_class, sizeof (MaynardPanelPrivate));
}
@@ -207,3 +248,40 @@ maynard_panel_set_expand (MaynardPanel *self,
gtk_revealer_set_reveal_child (GTK_REVEALER (self->priv->revealer_buttons), expand);
gtk_revealer_set_reveal_child (GTK_REVEALER (self->priv->revealer_clock), !expand);
}
+
+static void
+set_volume_icon (MaynardPanel *self,
+ const gchar *icon_name)
+{
+ GtkWidget *image;
+
+ image = gtk_image_new_from_icon_name (icon_name,
+ GTK_ICON_SIZE_LARGE_TOOLBAR);
+ gtk_button_set_image (GTK_BUTTON (self->priv->volume_button),
+ image);
+}
+
+void
+maynard_panel_show_volume_previous (MaynardPanel *self,
+ gboolean status)
+{
+ const gchar *icon_name = self->priv->volume_icon_name;
+
+ if (status)
+ icon_name = "go-previous-symbolic";
+
+ self->priv->volume_showing = !status;
+
+ set_volume_icon (self, icon_name);
+}
+
+void
+maynard_panel_set_volume_icon_name (MaynardPanel *self,
+ const gchar *icon_name)
+{
+ g_free (self->priv->volume_icon_name);
+ self->priv->volume_icon_name = g_strdup (icon_name);
+
+ if (self->priv->volume_showing)
+ set_volume_icon (self, icon_name);
+}