summaryrefslogtreecommitdiff
path: root/profiles/audio-profile-choose.c
diff options
context:
space:
mode:
Diffstat (limited to 'profiles/audio-profile-choose.c')
-rw-r--r--profiles/audio-profile-choose.c436
1 files changed, 436 insertions, 0 deletions
diff --git a/profiles/audio-profile-choose.c b/profiles/audio-profile-choose.c
new file mode 100644
index 0000000..c2555ed
--- /dev/null
+++ b/profiles/audio-profile-choose.c
@@ -0,0 +1,436 @@
+/* gm_audio-profile-choose.c: combo box to choose a specific profile */
+
+/*
+ * Copyright (C) 2003 Thomas Vander Stichele
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <gst/gst.h>
+#include <mateconf/mateconf-client.h>
+
+#include "gmp-util.h"
+#include "audio-profile-choose.h"
+
+/* Private structure */
+struct _GMAudioProfileChoosePrivate
+{
+ GtkTreeModel *model;
+ GMAudioProfile *profile;
+};
+
+enum
+{
+ P_0,
+ P_ACTIVE_PROFILE
+};
+
+enum
+{
+ S_PROFILE_CHANGED,
+ LAST_SIGNAL
+};
+
+enum
+{
+ NAME_COLUMN,
+ ID_COLUMN,
+ PROFILE_COLUMN,
+ N_COLUMNS
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+/* GObject methods */
+static void gm_audio_profile_choose_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gm_audio_profile_choose_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void gm_audio_profile_choose_dispose (GObject *object);
+
+/* GtkComboBox methods */
+static void gm_audio_profile_choose_changed (GtkComboBox *combo);
+
+/* Internal routines */
+static void audio_profile_forgotten (GMAudioProfile *profile,
+ GMAudioProfileChoose *choose);
+
+G_DEFINE_TYPE (GMAudioProfileChoose, gm_audio_profile_choose, GTK_TYPE_COMBO_BOX)
+
+/* Initialization */
+static void
+gm_audio_profile_choose_init (GMAudioProfileChoose *choose)
+{
+ GMAudioProfileChoosePrivate *priv;
+ GtkListStore *store;
+ GList *orig,
+ *profiles;
+ GtkCellRenderer *cell;
+
+ priv = G_TYPE_INSTANCE_GET_PRIVATE (choose,
+ GM_AUDIO_TYPE_PROFILE_CHOOSE,
+ GMAudioProfileChoosePrivate);
+
+ /* Create model */
+ store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING,
+ G_TYPE_STRING,
+ GM_AUDIO_TYPE_PROFILE);
+ for (orig = profiles = gm_audio_profile_get_active_list ();
+ profiles;
+ profiles = g_list_next (profiles))
+ {
+ GMAudioProfile *profile = profiles->data;
+ gchar *profile_name,
+ *temp_file_name,
+ *mime_type_description;
+ GtkTreeIter iter;
+
+ temp_file_name = g_strdup_printf (".%s", gm_audio_profile_get_extension (profile));
+ mime_type_description = g_content_type_get_description (temp_file_name);
+ g_free (temp_file_name);
+
+ profile_name = g_strdup_printf (gettext ("%s (%s)"),
+ gm_audio_profile_get_name (profile),
+ mime_type_description);
+ g_free (mime_type_description);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter,
+ NAME_COLUMN, profile_name,
+ ID_COLUMN, gm_audio_profile_get_id (profile),
+ PROFILE_COLUMN, profile,
+ -1);
+
+ g_signal_connect (profile, "forgotten",
+ G_CALLBACK (audio_profile_forgotten), choose);
+
+ g_free (profile_name);
+ }
+ g_list_free (orig);
+
+ /* Display name in the combo */
+ cell = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (choose), cell, TRUE );
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (choose), cell, "text", NAME_COLUMN);
+ gtk_combo_box_set_model (GTK_COMBO_BOX (choose), GTK_TREE_MODEL (store));
+ g_object_unref (store);
+
+ /* Populate private struct */
+ priv->model = GTK_TREE_MODEL (store);
+ priv->profile = NULL;
+
+ /* cache access to private data */
+ choose->priv = priv;
+}
+
+static void
+gm_audio_profile_choose_class_init (GMAudioProfileChooseClass *klass)
+{
+ GObjectClass *g_class = G_OBJECT_CLASS (klass);
+ GtkComboBoxClass *c_class = GTK_COMBO_BOX_CLASS (klass);
+ GParamSpec *pspec;
+
+ g_class->get_property = gm_audio_profile_choose_get_property;
+ g_class->set_property = gm_audio_profile_choose_set_property;
+ g_class->dispose = gm_audio_profile_choose_dispose;
+
+ c_class->changed = gm_audio_profile_choose_changed;
+
+ /* Signals */
+ /**
+ * GMAudioProfileChoose::profile-changed:
+ * @choose: the object which received the signal
+ *
+ * The profile-changed signal is emitted when the active profile is changed.
+ *
+ * Since: 2.32/3.0
+ */
+ signals[S_PROFILE_CHANGED] =
+ g_signal_new (g_intern_static_string ("profile-changed"),
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GMAudioProfileChooseClass, profile_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1, GM_AUDIO_TYPE_PROFILE);
+
+ /* Properties */
+ /**
+ * GMAudioProfileChoose:active-profile:
+ *
+ * Currently shown #GMAudioProfile.
+ *
+ * Since: 2.32/3.0
+ */
+ pspec = g_param_spec_object ("active-profile",
+ "Active profile",
+ "Currently selected GMAudioProfile",
+ GM_AUDIO_TYPE_PROFILE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (g_class, P_ACTIVE_PROFILE, pspec);
+
+ /* Add private data */
+ g_type_class_add_private (g_class, sizeof (GMAudioProfileChoose));
+}
+
+static void
+gm_audio_profile_choose_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gm_audio_profile_choose_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GMAudioProfileChoosePrivate *priv = GM_AUDIO_PROFILE_CHOOSE (object)->priv;
+
+ switch (prop_id)
+ {
+ case P_ACTIVE_PROFILE:
+ g_value_set_object (value, priv->profile);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gm_audio_profile_choose_dispose (GObject *object)
+{
+ GMAudioProfileChoosePrivate *priv = GM_AUDIO_PROFILE_CHOOSE (object)->priv;
+
+ if (priv->profile)
+ {
+ g_object_unref (priv->profile);
+ priv->profile = NULL;
+ }
+
+ G_OBJECT_CLASS (gm_audio_profile_choose_parent_class)->dispose (object);
+}
+
+static void
+gm_audio_profile_choose_changed (GtkComboBox *combo)
+{
+ GMAudioProfileChoosePrivate *priv;
+ GtkTreeIter iter;
+ GMAudioProfile *new_profile = NULL;
+
+ priv = GM_AUDIO_PROFILE_CHOOSE (combo)->priv;
+ if (gtk_combo_box_get_active_iter (combo, &iter))
+ gtk_tree_model_get (priv->model, &iter, PROFILE_COLUMN, &new_profile, -1);
+
+ if (priv->profile != new_profile)
+ {
+ if (priv->profile)
+ g_object_unref (priv->profile);
+ priv->profile = new_profile;
+ g_signal_emit (combo, signals[S_PROFILE_CHANGED], 0, new_profile);
+ g_object_notify (G_OBJECT (combo), "active-profile");
+ }
+ else
+ if (new_profile)
+ g_object_unref (new_profile);
+}
+
+static void
+audio_profile_forgotten (GMAudioProfile *profile,
+ GMAudioProfileChoose *choose)
+{
+ GMAudioProfileChoosePrivate *priv;
+ GtkTreeIter iter;
+ GMAudioProfile *tmp;
+
+ priv = choose->priv;
+
+ if (!gtk_tree_model_get_iter_first (priv->model, &iter))
+ return;
+
+ do
+ {
+ gtk_tree_model_get (priv->model, &iter, PROFILE_COLUMN, &tmp, -1);
+ if (tmp == profile)
+ {
+ gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter);
+ g_object_unref (tmp);
+ return;
+ }
+ g_object_unref (tmp);
+ }
+ while (gtk_tree_model_iter_next (priv->model, &iter));
+}
+
+/* Public API */
+/**
+ * gm_audio_profile_choose_new:
+ *
+ * Creates new #GMAudioProfileChoose, populated with currently active profiles.
+ *
+ * Return value: A new #GMAudioProfileChoose.
+ */
+GtkWidget*
+gm_audio_profile_choose_new (void)
+{
+ return g_object_new (GM_AUDIO_TYPE_PROFILE_CHOOSE, NULL);
+}
+
+/**
+ * gm_audio_profile_choose_get_active_profile:
+ * @choose: #GMAudioProfileChoose widget
+ *
+ * This function retrieves currently selected #GMAudioProfile. Returned object is
+ * owned by #GMAudioProfileChoose and should not be unreferenced.
+ *
+ * Return value: Currently selected #GMAudioProfile or %NULL if none is
+ * selected.
+ *
+ * Since: 2.32/3.0
+ */
+GMAudioProfile *
+gm_audio_profile_choose_get_active_profile (GMAudioProfileChoose *choose)
+{
+ g_return_val_if_fail (GM_AUDIO_IS_PROFILE_CHOOSE (choose), NULL);
+
+ return choose->priv->profile;
+}
+
+/**
+ * gm_audio_profile_choose_set_active_profile:
+ * @choose: #GMAudioProfileChoose widget
+ * @id: A id of #GMAudioProfile that should be selected
+ *
+ * This function sets currently selected #GMAudioProfile. If no profile matches
+ * the @id, first available profile is set as selected and function returns
+ * %FALSE.
+ *
+ * Return value: %TRUE if profile has been successfully set, %FALSE otherwise.
+ *
+ * Since: 2.32/3.0
+ */
+gboolean
+gm_audio_profile_choose_set_active_profile (GMAudioProfileChoose *choose,
+ const gchar *id)
+{
+ GMAudioProfileChoosePrivate *priv;
+ GtkTreeIter iter;
+ gchar *tmp;
+
+ g_return_val_if_fail (GM_AUDIO_IS_PROFILE_CHOOSE (choose), FALSE);
+
+ priv = choose->priv;
+
+ if (!gtk_tree_model_get_iter_first (priv->model, &iter))
+ return FALSE;
+
+ do
+ {
+ gtk_tree_model_get (priv->model, &iter, ID_COLUMN, &tmp, -1);
+ if (!g_strcmp0 (tmp, id))
+ {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (choose), &iter);
+ g_free (tmp);
+ return TRUE;
+ }
+ g_free (tmp);
+ }
+ while (gtk_tree_model_iter_next (priv->model, &iter));
+
+ /* Fallback to first entry */
+ gtk_combo_box_set_active (GTK_COMBO_BOX (choose), 0);
+
+ return FALSE;
+}
+
+/* Deprecated functions */
+/**
+ * gm_audio_profile_choose_get_active:
+ * @choose: A #GMAudioProfileChoose widget
+ *
+ * This function retrieves currently selected #GMAudioProfile. Returned object is
+ * owned by #GMAudioProfileChoose and should not be unreferenced.
+ *
+ * Return value: Currently selected #GMAudioProfile or %NULL if none is
+ * selected.
+ *
+ * Deprecated: 2.32/3.0: Use gm_audio_profile_choose_get_active_profile()
+ * instead.
+ */
+GMAudioProfile*
+gm_audio_profile_choose_get_active (GtkWidget *choose)
+{
+ /* We cannot simply wrap gm_audio_profile_choose_get_active_profile() here,
+ * since this function can be (and in case of sound-juicer is) called from
+ * GtkComboBox::changed signal handler. In this situation, code would return
+ * invalid profile, since we haven't updated the current selection yet. */
+ GMAudioProfileChoosePrivate *priv;
+ GtkTreeIter iter;
+ GMAudioProfile *new_profile = NULL;
+
+ g_return_val_if_fail (GM_AUDIO_IS_PROFILE_CHOOSE (choose), NULL);
+
+ priv = GM_AUDIO_PROFILE_CHOOSE (choose)->priv;
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (choose), &iter))
+ {
+ gtk_tree_model_get (priv->model, &iter, PROFILE_COLUMN, &new_profile, -1);
+ g_object_unref (new_profile);
+ }
+
+ return new_profile;
+}
+
+/**
+ * gm_audio_profile_choose_set_active:
+ * @choose: #GMAudioProfileChoose widget
+ * @id: A id of #GMAudioProfile that should be selected
+ *
+ * This function sets currently selected #GMAudioProfile. If no profile matches
+ * the @id, first available profile is set as selected and function returns
+ * %FALSE.
+ *
+ * Return value: %TRUE if profile has been successfully set, %FALSE otherwise.
+ *
+ * Deprecated: 2.32/3.0: Use gm_audio_profile_choose_set_active_profile()
+ * instead.
+ */
+gboolean
+gm_audio_profile_choose_set_active (GtkWidget *choose,
+ const char *id)
+{
+ return gm_audio_profile_choose_set_active_profile (GM_AUDIO_PROFILE_CHOOSE (choose), id);
+}