summaryrefslogtreecommitdiff
path: root/libmatemixer/matemixer-switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmatemixer/matemixer-switch.c')
-rw-r--r--libmatemixer/matemixer-switch.c283
1 files changed, 283 insertions, 0 deletions
diff --git a/libmatemixer/matemixer-switch.c b/libmatemixer/matemixer-switch.c
new file mode 100644
index 0000000..b30e405
--- /dev/null
+++ b/libmatemixer/matemixer-switch.c
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2014 Michal Ratajsky <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the licence, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#include "matemixer-enums.h"
+#include "matemixer-enum-types.h"
+#include "matemixer-switch.h"
+#include "matemixer-switch-private.h"
+#include "matemixer-switch-option.h"
+
+/**
+ * SECTION:matemixer-switch
+ * @include: libmatemixer/matemixer.h
+ */
+
+struct _MateMixerSwitchPrivate
+{
+ gchar *name;
+ gchar *label;
+ GList *options;
+ MateMixerSwitchOption *active;
+};
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_LABEL,
+ PROP_ACTIVE_OPTION,
+ N_PROPERTIES
+};
+
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+
+static void mate_mixer_switch_class_init (MateMixerSwitchClass *klass);
+
+static void mate_mixer_switch_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void mate_mixer_switch_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void mate_mixer_switch_init (MateMixerSwitch *swtch);
+static void mate_mixer_switch_finalize (GObject *object);
+
+G_DEFINE_ABSTRACT_TYPE (MateMixerSwitch, mate_mixer_switch, G_TYPE_OBJECT)
+
+static MateMixerSwitchOption *mate_mixer_switch_real_get_option (MateMixerSwitch *swtch,
+ const gchar *name);
+
+static void
+mate_mixer_switch_class_init (MateMixerSwitchClass *klass)
+{
+ GObjectClass *object_class;
+
+ klass->get_option = mate_mixer_switch_real_get_option;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = mate_mixer_switch_finalize;
+ object_class->get_property = mate_mixer_switch_get_property;
+ object_class->set_property = mate_mixer_switch_set_property;
+
+ properties[PROP_NAME] =
+ g_param_spec_string ("name",
+ "Name",
+ "Name of the switch",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ properties[PROP_LABEL] =
+ g_param_spec_string ("label",
+ "Label",
+ "Label of the switch",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ properties[PROP_ACTIVE_OPTION] =
+ g_param_spec_object ("active-option",
+ "Active option",
+ "Active option of the switch",
+ MATE_MIXER_TYPE_SWITCH_OPTION,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+
+ g_type_class_add_private (object_class, sizeof (MateMixerSwitchPrivate));
+}
+
+static void
+mate_mixer_switch_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MateMixerSwitch *swtch;
+
+ swtch = MATE_MIXER_SWITCH (object);
+
+ switch (param_id) {
+ case PROP_NAME:
+ g_value_set_string (value, swtch->priv->name);
+ break;
+ case PROP_LABEL:
+ g_value_set_string (value, swtch->priv->label);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+mate_mixer_switch_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MateMixerSwitch *swtch;
+
+ swtch = MATE_MIXER_SWITCH (object);
+
+ switch (param_id) {
+ case PROP_NAME:
+ /* Construct-only string */
+ swtch->priv->name = g_value_dup_string (value);
+ break;
+ case PROP_LABEL:
+ /* Construct-only string */
+ swtch->priv->label = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+mate_mixer_switch_init (MateMixerSwitch *swtch)
+{
+ swtch->priv = G_TYPE_INSTANCE_GET_PRIVATE (swtch,
+ MATE_MIXER_TYPE_SWITCH,
+ MateMixerSwitchPrivate);
+}
+
+static void
+mate_mixer_switch_finalize (GObject *object)
+{
+ MateMixerSwitch *swtch;
+
+ swtch = MATE_MIXER_SWITCH (object);
+
+ g_free (swtch->priv->name);
+ g_free (swtch->priv->label);
+
+ G_OBJECT_CLASS (mate_mixer_switch_parent_class)->finalize (object);
+}
+
+const gchar *
+mate_mixer_switch_get_name (MateMixerSwitch *swtch)
+{
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+
+ return swtch->priv->name;
+}
+
+const gchar *
+mate_mixer_switch_get_label (MateMixerSwitch *swtch)
+{
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+
+ return swtch->priv->label;
+}
+
+MateMixerSwitchOption *
+mate_mixer_switch_get_option (MateMixerSwitch *swtch, const gchar *name)
+{
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+
+ return MATE_MIXER_SWITCH_GET_CLASS (swtch)->get_option (swtch, name);
+}
+
+MateMixerSwitchOption *
+mate_mixer_switch_get_active_option (MateMixerSwitch *swtch)
+{
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+
+ return swtch->priv->active;
+}
+
+gboolean
+mate_mixer_switch_set_active_option (MateMixerSwitch *swtch,
+ MateMixerSwitchOption *option)
+{
+ MateMixerSwitchClass *klass;
+
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), FALSE);
+
+ klass = MATE_MIXER_SWITCH_GET_CLASS (swtch);
+ if (klass->set_active_option != NULL) {
+ if (klass->set_active_option (swtch, option) == FALSE)
+ return FALSE;
+
+ _mate_mixer_switch_set_active_option (swtch, option);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+const GList *
+mate_mixer_switch_list_options (MateMixerSwitch *swtch)
+{
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+
+ if (swtch->priv->options == NULL) {
+ MateMixerSwitchClass *klass = MATE_MIXER_SWITCH_GET_CLASS (swtch);
+
+ if (klass->list_options != NULL)
+ swtch->priv->options = klass->list_options (swtch);
+ }
+ return (const GList *) swtch->priv->options;
+}
+
+void
+_mate_mixer_switch_set_active_option (MateMixerSwitch *swtch,
+ MateMixerSwitchOption *option)
+{
+ g_return_if_fail (MATE_MIXER_IS_SWITCH (swtch));
+ g_return_if_fail (MATE_MIXER_IS_SWITCH_OPTION (option));
+
+ if (swtch->priv->active == option)
+ return;
+
+ if (swtch->priv->active != NULL)
+ g_object_unref (swtch->priv->active);
+
+ swtch->priv->active = g_object_ref (option);
+
+ g_object_notify_by_pspec (G_OBJECT (swtch), properties[PROP_ACTIVE_OPTION]);
+}
+
+static MateMixerSwitchOption *
+mate_mixer_switch_real_get_option (MateMixerSwitch *swtch, const gchar *name)
+{
+ const GList *list;
+
+ g_return_val_if_fail (MATE_MIXER_IS_SWITCH (swtch), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ list = mate_mixer_switch_list_options (swtch);
+ while (list != NULL) {
+ MateMixerSwitchOption *option = MATE_MIXER_SWITCH_OPTION (list->data);
+
+ if (strcmp (name, mate_mixer_switch_option_get_name (option)) == 0)
+ return option;
+
+ list = list->next;
+ }
+ return NULL;
+}