* This file contains the implementation of the Hildon Volumebar.
* It is a base class for Hildon Vertical Volumebar and for
* Hildon Horizontal Volumebar classes.
+ *
*/
+
+#include <gtk/gtkwindow.h>
#include <gtk/gtksignal.h>
#include <gdk/gdkkeysyms.h>
GValue * value,
GParamSpec * pspec);
-static void mute_toggled (HildonVolumebar *self, gpointer data);
+static void mute_toggled (HildonVolumebar *self);
static gboolean
hildon_volumebar_key_press(GtkWidget * widget,
- GdkEventKey * event,
- gpointer data);
+ GdkEventKey * event);
enum
enum {
PROP_NONE = 0,
PROP_HILDON_HAS_MUTE,
- PROP_HILDON_FOCUSABLE
+ PROP_HILDON_FOCUSABLE,
+ PROP_HILDON_LEVEL,
+ PROP_HILDON_MUTE
};
static guint signals[LAST_SIGNAL] = { 0 };
/* Because we derived our widget from GtkContainer, we should also
override forall method */
+ volumebar_class->mute_toggled = mute_toggled;
container_class->forall = hildon_child_forall;
+ GTK_WIDGET_CLASS(volumebar_class)->key_press_event = hildon_volumebar_key_press;
GTK_OBJECT_CLASS(volumebar_class)->destroy = hildon_volumebar_destroy;
signals[MUTE_TOGGLED_SIGNAL] = g_signal_new("mute_toggled",
TRUE,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
+ g_object_class_install_property(object_class,
+ PROP_HILDON_LEVEL,
+ g_param_spec_double("level",
+ "Level",
+ "Current volume level",
+ 0.0,
+ 100.0,
+ 50.0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(object_class,
+ PROP_HILDON_MUTE,
+ g_param_spec_boolean("mute",
+ "Mute",
+ "Whether volume is muted",
+ FALSE,
+ G_PARAM_READWRITE));
+
+
}
static void
priv->tbutton = GTK_TOGGLE_BUTTON(gtk_toggle_button_new());
g_object_set (G_OBJECT (priv->tbutton), "can-focus", FALSE, NULL);
- g_signal_connect (G_OBJECT (volumebar), "mute_toggled",
- G_CALLBACK (mute_toggled), NULL);
-
- /* set keypress handler (select hardkey) */
- g_signal_connect(G_OBJECT(volumebar), "key-press-event",
- G_CALLBACK(hildon_volumebar_key_press),
- NULL);
-
}
static void
{
HildonVolumebar *vbar = HILDON_VOLUMEBAR(object);
HildonVolumebarPrivate *priv;
- gboolean has_mute = TRUE;
priv = HILDON_VOLUMEBAR_GET_PRIVATE(vbar)
switch (prop_id) {
case PROP_HILDON_HAS_MUTE:
- has_mute = g_value_get_boolean(value);
-
- if (has_mute)
- {
+ if (g_value_get_boolean(value))
gtk_widget_show(GTK_WIDGET(priv->tbutton));
-
- }
else
- {
gtk_widget_hide(GTK_WIDGET(priv->tbutton));
- }
-
break;
case PROP_HILDON_FOCUSABLE:
g_object_set( G_OBJECT(priv->volumebar), "can-focus",
g_value_get_boolean(value), NULL );
break;
+ case PROP_HILDON_LEVEL:
+ hildon_volumebar_set_level(HILDON_VOLUMEBAR(priv->volumebar),
+ g_value_get_double(value));
+ break;
+ case PROP_HILDON_MUTE:
+ hildon_volumebar_set_mute(HILDON_VOLUMEBAR(priv->volumebar),
+ g_value_get_boolean(value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
guint prop_id, GValue * value,
GParamSpec * pspec)
{
- HildonVolumebarPrivate *priv;
- priv = HILDON_VOLUMEBAR_GET_PRIVATE(object)
+ HildonVolumebar *vb = HILDON_VOLUMEBAR(object);
+ HildonVolumebarPrivate *priv = HILDON_VOLUMEBAR_GET_PRIVATE(vb);
+
switch (prop_id) {
case PROP_HILDON_HAS_MUTE:
- g_value_set_boolean(value, g_value_get_boolean(value));
+ g_value_set_boolean(value, GTK_WIDGET_VISIBLE(priv->tbutton));
break;
- case PROP_HILDON_FOCUSABLE:
- g_value_set_boolean(value, g_value_get_boolean(value));
- g_object_set( G_OBJECT(priv->volumebar), "can-focus",
- g_value_get_boolean(value), NULL );
+ case PROP_HILDON_FOCUSABLE:
+ g_value_set_boolean(value, GTK_WIDGET_CAN_FOCUS(priv->volumebar));
+ break;
+ case PROP_HILDON_LEVEL:
+ g_value_set_double(value, hildon_volumebar_get_level(vb));
+ break;
+ case PROP_HILDON_MUTE:
+ g_value_set_boolean(value, hildon_volumebar_get_mute(vb));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
hildon_volumebar_set_mute(HildonVolumebar * self, gboolean mute)
{
HildonVolumebarPrivate *priv;
-
+ gboolean focusable = TRUE;
+
g_return_if_fail(self);
priv = HILDON_VOLUMEBAR_GET_PRIVATE(self);
gtk_widget_set_sensitive(GTK_WIDGET(priv->volumebar), !mute);
+ focusable = GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (priv->volumebar));
+
if (mute){
- g_object_set (G_OBJECT (priv->tbutton), "can-focus", TRUE, NULL);
- gtk_widget_grab_focus (GTK_WIDGET(priv->tbutton));
+ if (focusable){
+
+ g_object_set (G_OBJECT (priv->tbutton), "can-focus", TRUE, NULL);
+ gtk_widget_grab_focus (GTK_WIDGET(priv->tbutton));
+ }
}
else
{
g_object_set (G_OBJECT (priv->tbutton), "can-focus", FALSE, NULL);
- gtk_widget_grab_focus (GTK_WIDGET (self));
+
+ if (focusable){
+ gtk_widget_grab_focus (GTK_WIDGET (self));
+ }
+ else{
+ GtkWidget *win = gtk_widget_get_ancestor (GTK_WIDGET (self),
+ GTK_TYPE_WINDOW);
+ gtk_window_set_focus (GTK_WINDOW (win), NULL);
+ }
}
+
+ gtk_toggle_button_set_active(priv->tbutton, mute);
}
/**
}
static void
-mute_toggled (HildonVolumebar *self, gpointer data)
+mute_toggled (HildonVolumebar *self)
{
/* only call hildon_volumebar_set_mute. everything is done there */
hildon_volumebar_set_mute (self, hildon_volumebar_get_mute(self));
static gboolean
hildon_volumebar_key_press (GtkWidget * widget,
- GdkEventKey * event,
- gpointer data)
+ GdkEventKey * event)
{
HildonVolumebarPrivate *priv;
priv = HILDON_VOLUMEBAR_GET_PRIVATE(widget);
- if (event->keyval == GDK_Return) {
+ if (event->keyval == GDK_Return && GTK_WIDGET_VISIBLE(priv->tbutton)) {
gtk_toggle_button_set_active(priv->tbutton,
!hildon_volumebar_get_mute(HILDON_VOLUMEBAR(widget)));
return TRUE;
}
- return FALSE;
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
}