summaryrefslogtreecommitdiff
path: root/mate-volume-control/src/gvc-combo-box.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-volume-control/src/gvc-combo-box.c')
-rw-r--r--mate-volume-control/src/gvc-combo-box.c327
1 files changed, 179 insertions, 148 deletions
diff --git a/mate-volume-control/src/gvc-combo-box.c b/mate-volume-control/src/gvc-combo-box.c
index 6004632..524e1b0 100644
--- a/mate-volume-control/src/gvc-combo-box.c
+++ b/mate-volume-control/src/gvc-combo-box.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2009 Bastien Nocera
+ * Copyright (C) 2014 Michal Ratajsky <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,20 +19,18 @@
*
*/
-#include "config.h"
-
#include <glib.h>
#include <glib/gi18n.h>
+#include <glib-object.h>
#include <gtk/gtk.h>
-#include <canberra-gtk.h>
#include <libmatemixer/matemixer.h>
#include "gvc-combo-box.h"
#define GVC_COMBO_BOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_COMBO_BOX, GvcComboBoxPrivate))
-struct GvcComboBoxPrivate
+struct _GvcComboBoxPrivate
{
GtkWidget *drop_box;
GtkWidget *start_box;
@@ -57,18 +56,21 @@ enum {
LAST_SIGNAL
};
+static guint signals[LAST_SIGNAL] = { 0, };
+
enum {
PROP_0,
PROP_LABEL,
PROP_SHOW_BUTTON,
- PROP_BUTTON_LABEL
+ PROP_BUTTON_LABEL,
+ N_PROPERTIES
};
-static guint signals [LAST_SIGNAL] = { 0, };
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
-static void gvc_combo_box_class_init (GvcComboBoxClass *klass);
-static void gvc_combo_box_init (GvcComboBox *combo_box);
-static void gvc_combo_box_finalize (GObject *object);
+static void gvc_combo_box_class_init (GvcComboBoxClass *klass);
+static void gvc_combo_box_init (GvcComboBox *combo);
+static void gvc_combo_box_dispose (GObject *object);
#if GTK_CHECK_VERSION (3, 0, 0)
G_DEFINE_TYPE (GvcComboBox, gvc_combo_box, GTK_TYPE_BOX)
@@ -77,25 +79,25 @@ G_DEFINE_TYPE (GvcComboBox, gvc_combo_box, GTK_TYPE_HBOX)
#endif
void
-gvc_combo_box_set_size_group (GvcComboBox *combo_box,
- GtkSizeGroup *group,
- gboolean symmetric)
+gvc_combo_box_set_size_group (GvcComboBox *combobox,
+ GtkSizeGroup *group,
+ gboolean symmetric)
{
- g_return_if_fail (GVC_IS_COMBO_BOX (combo_box));
+ g_return_if_fail (GVC_IS_COMBO_BOX (combobox));
+ g_return_if_fail (GTK_IS_SIZE_GROUP (group));
- combo_box->priv->size_group = group;
- combo_box->priv->symmetric = symmetric;
+ combobox->priv->size_group = group;
+ combobox->priv->symmetric = symmetric;
- if (combo_box->priv->size_group != NULL) {
- gtk_size_group_add_widget (combo_box->priv->size_group,
- combo_box->priv->start_box);
+ if (combobox->priv->size_group != NULL) {
+ gtk_size_group_add_widget (combobox->priv->size_group,
+ combobox->priv->start_box);
- if (combo_box->priv->symmetric) {
- gtk_size_group_add_widget (combo_box->priv->size_group,
- combo_box->priv->end_box);
- }
+ if (combobox->priv->symmetric)
+ gtk_size_group_add_widget (combobox->priv->size_group,
+ combobox->priv->end_box);
}
- gtk_widget_queue_draw (GTK_WIDGET (combo_box));
+ gtk_widget_queue_draw (GTK_WIDGET (combobox));
}
static void
@@ -132,16 +134,13 @@ gvc_combo_box_get_property (GObject *object,
switch (prop_id) {
case PROP_LABEL:
- g_value_set_string (value,
- gtk_label_get_text (GTK_LABEL (self->priv->label)));
+ g_value_set_string (value, gtk_label_get_text (GTK_LABEL (self->priv->label)));
break;
case PROP_BUTTON_LABEL:
- g_value_set_string (value,
- gtk_button_get_label (GTK_BUTTON (self->priv->button)));
+ g_value_set_string (value, gtk_button_get_label (GTK_BUTTON (self->priv->button)));
break;
case PROP_SHOW_BUTTON:
- g_value_set_boolean (value,
- gtk_widget_get_visible (self->priv->button));
+ g_value_set_boolean (value, gtk_widget_get_visible (self->priv->button));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -154,32 +153,34 @@ gvc_combo_box_class_init (GvcComboBoxClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = gvc_combo_box_finalize;
+ object_class->dispose = gvc_combo_box_dispose;
object_class->set_property = gvc_combo_box_set_property;
object_class->get_property = gvc_combo_box_get_property;
- g_object_class_install_property (object_class,
- PROP_LABEL,
- g_param_spec_string ("label",
- "label",
- "The combo box label",
- _("_Profile:"),
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class,
- PROP_SHOW_BUTTON,
- g_param_spec_boolean ("show-button",
- "show-button",
- "Whether to show the button",
- FALSE,
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class,
- PROP_BUTTON_LABEL,
- g_param_spec_string ("button-label",
- "button-label",
- "The button's label",
- "APPLICATION BUG",
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
- signals [CHANGED] =
+ properties[PROP_LABEL] =
+ g_param_spec_string ("label",
+ "label",
+ "The combo box label",
+ _("_Profile:"),
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+ properties[PROP_SHOW_BUTTON] =
+ g_param_spec_boolean ("show-button",
+ "show-button",
+ "Whether to show the button",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+ properties[PROP_BUTTON_LABEL] =
+ g_param_spec_string ("button-label",
+ "button-label",
+ "The button's label",
+ "",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+ g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+
+ signals[CHANGED] =
g_signal_new ("changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -187,7 +188,8 @@ gvc_combo_box_class_init (GvcComboBoxClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
- signals [BUTTON_CLICKED] =
+
+ signals[BUTTON_CLICKED] =
g_signal_new ("button-clicked",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -200,190 +202,219 @@ gvc_combo_box_class_init (GvcComboBoxClass *klass)
}
void
-gvc_combo_box_set_profiles (GvcComboBox *combo_box,
- const GList *profiles)
+gvc_combo_box_set_profiles (GvcComboBox *combobox, const GList *profiles)
{
const GList *l;
- g_return_if_fail (GVC_IS_COMBO_BOX (combo_box));
- g_return_if_fail (combo_box->priv->set_called == FALSE);
+ g_return_if_fail (GVC_IS_COMBO_BOX (combobox));
+ g_return_if_fail (combobox->priv->set_called == FALSE);
for (l = profiles; l != NULL; l = l->next) {
MateMixerDeviceProfile *p = MATE_MIXER_DEVICE_PROFILE (l->data);
- gtk_list_store_insert_with_values (GTK_LIST_STORE (combo_box->priv->model),
+ gtk_list_store_insert_with_values (GTK_LIST_STORE (combobox->priv->model),
NULL,
G_MAXINT,
- COL_NAME, mate_mixer_device_profile_get_name (p),
- COL_HUMAN_NAME, mate_mixer_device_profile_get_description (p),
+ COL_NAME,
+ mate_mixer_device_profile_get_name (p),
+ COL_HUMAN_NAME,
+ mate_mixer_device_profile_get_description (p),
-1);
}
- combo_box->priv->set_called = TRUE;
+ combobox->priv->set_called = TRUE;
}
void
-gvc_combo_box_set_ports (GvcComboBox *combo_box, const GList *ports)
+gvc_combo_box_set_ports (GvcComboBox *combobox, const GList *ports)
{
const GList *l;
- g_return_if_fail (GVC_IS_COMBO_BOX (combo_box));
- g_return_if_fail (combo_box->priv->set_called == FALSE);
+ g_return_if_fail (GVC_IS_COMBO_BOX (combobox));
+ g_return_if_fail (combobox->priv->set_called == FALSE);
for (l = ports; l != NULL; l = l->next) {
MateMixerPort *p = MATE_MIXER_PORT (l->data);
- gtk_list_store_insert_with_values (GTK_LIST_STORE (combo_box->priv->model),
+ gtk_list_store_insert_with_values (GTK_LIST_STORE (combobox->priv->model),
NULL,
G_MAXINT,
- COL_NAME, mate_mixer_port_get_name (p),
- COL_HUMAN_NAME, mate_mixer_port_get_description (p),
+ COL_NAME,
+ mate_mixer_port_get_name (p),
+ COL_HUMAN_NAME,
+ mate_mixer_port_get_description (p),
-1);
}
- combo_box->priv->set_called = TRUE;
+ combobox->priv->set_called = TRUE;
}
void
-gvc_combo_box_set_active (GvcComboBox *combo_box,
- const char *id)
+gvc_combo_box_set_active (GvcComboBox *combobox, const gchar *id)
{
GtkTreeIter iter;
- gboolean cont;
+ gboolean cont;
- cont = gtk_tree_model_get_iter_first (combo_box->priv->model, &iter);
+ g_return_if_fail (GVC_IS_COMBO_BOX (combobox));
+ g_return_if_fail (id != NULL);
+
+ cont = gtk_tree_model_get_iter_first (combobox->priv->model, &iter);
while (cont != FALSE) {
- char *name;
+ gchar *name;
- gtk_tree_model_get (combo_box->priv->model, &iter,
+ gtk_tree_model_get (combobox->priv->model, &iter,
COL_NAME, &name,
-1);
if (g_strcmp0 (name, id) == 0) {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo_box->priv->combobox), &iter);
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox->priv->combobox), &iter);
+ g_free (name);
return;
}
- gtk_tree_model_iter_next (combo_box->priv->model, &iter);
+ g_free (name);
+
+ gtk_tree_model_iter_next (combobox->priv->model, &iter);
}
g_warning ("Could not find id '%s' in combo box", id);
}
static void
-on_combo_box_changed (GtkComboBox *widget,
- GvcComboBox *combo_box)
+on_combo_box_changed (GtkComboBox *widget, GvcComboBox *combobox)
{
- GtkTreeIter iter;
- char *profile;
+ GtkTreeIter iter;
+ gchar *profile;
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter) == FALSE) {
g_warning ("Could not find an active profile or port");
return;
}
- gtk_tree_model_get (combo_box->priv->model, &iter,
+ gtk_tree_model_get (combobox->priv->model, &iter,
COL_NAME, &profile,
-1);
- g_signal_emit (combo_box, signals[CHANGED], 0, profile);
+
+ g_signal_emit (combobox, signals[CHANGED], 0, profile);
g_free (profile);
}
static void
-on_combo_box_button_clicked (GtkButton *button,
- GvcComboBox *combo_box)
+on_combo_box_button_clicked (GtkButton *button, GvcComboBox *combobox)
{
- g_signal_emit (combo_box, signals[BUTTON_CLICKED], 0);
+ g_signal_emit (combobox, signals[BUTTON_CLICKED], 0);
}
static void
-gvc_combo_box_init (GvcComboBox *combo_box)
+gvc_combo_box_init (GvcComboBox *combobox)
{
- GtkWidget *frame;
- GtkWidget *box;
- GtkWidget *sbox;
- GtkWidget *ebox;
- GtkCellRenderer *renderer;
+ GtkWidget *frame;
+ GtkCellRenderer *renderer;
- combo_box->priv = GVC_COMBO_BOX_GET_PRIVATE (combo_box);
+ combobox->priv = GVC_COMBO_BOX_GET_PRIVATE (combobox);
- combo_box->priv->model = GTK_TREE_MODEL (gtk_list_store_new (NUM_COLS,
- G_TYPE_STRING,
- G_TYPE_STRING));
+ combobox->priv->model = GTK_TREE_MODEL (gtk_list_store_new (NUM_COLS,
+ G_TYPE_STRING,
+ G_TYPE_STRING));
+ combobox->priv->label = gtk_label_new (NULL);
- combo_box->priv->label = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (combo_box->priv->label),
- 0.0,
- 0.5);
+ gtk_misc_set_alignment (GTK_MISC (combobox->priv->label), 0.0, 0.5);
- /* frame */
+ /* Frame */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
- gtk_container_add (GTK_CONTAINER (combo_box), frame);
+ gtk_box_pack_start (GTK_BOX (combobox), frame, TRUE, TRUE, 0);
+
+#if GTK_CHECK_VERSION (3, 0, 0)
+ combobox->priv->drop_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ combobox->priv->start_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ combobox->priv->end_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+#else
+ combobox->priv->drop_box = gtk_hbox_new (FALSE, 6);
+ combobox->priv->start_box = gtk_hbox_new (FALSE, 6);
+ combobox->priv->end_box = gtk_hbox_new (FALSE, 6);
+#endif
+ combobox->priv->combobox = gtk_combo_box_new_with_model (combobox->priv->model);
- combo_box->priv->drop_box = box = gtk_hbox_new (FALSE, 6);
- combo_box->priv->combobox = gtk_combo_box_new_with_model (combo_box->priv->model);
renderer = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box->priv->combobox),
- renderer, FALSE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo_box->priv->combobox),
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox->priv->combobox),
+ renderer,
+ FALSE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combobox->priv->combobox),
renderer,
- "text", COL_HUMAN_NAME);
-
-/* gtk_widget_set_size_request (combo_box->priv->combobox, 128, -1); */
-
- combo_box->priv->start_box = sbox = gtk_hbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (box), sbox, FALSE, FALSE, 0);
+ "text",
+ COL_HUMAN_NAME);
- gtk_box_pack_start (GTK_BOX (sbox), combo_box->priv->label, FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (box), combo_box->priv->combobox, TRUE, TRUE, 0);
-
- combo_box->priv->button = gtk_button_new_with_label ("APPLICATION BUG");
- gtk_widget_set_no_show_all (combo_box->priv->button, TRUE);
- gtk_box_pack_start (GTK_BOX (box), combo_box->priv->button, FALSE, FALSE, 0);
-
-
- combo_box->priv->end_box = ebox = gtk_hbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (box), ebox, FALSE, FALSE, 0);
+#if GTK_CHECK_VERSION (3, 0, 0)
+ /* Make sure the combo box does not get too long on long profile names */
+ g_object_set (G_OBJECT (renderer),
+ "ellipsize",
+ PANGO_ELLIPSIZE_END,
+ NULL);
- if (combo_box->priv->size_group != NULL) {
- gtk_size_group_add_widget (combo_box->priv->size_group, sbox);
+ gtk_combo_box_set_popup_fixed_width (GTK_COMBO_BOX (combobox->priv->combobox), FALSE);
+#endif
- if (combo_box->priv->symmetric) {
- gtk_size_group_add_widget (combo_box->priv->size_group, ebox);
- }
+ gtk_box_pack_start (GTK_BOX (combobox->priv->drop_box),
+ combobox->priv->start_box,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (combobox->priv->start_box),
+ combobox->priv->label,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (combobox->priv->drop_box),
+ combobox->priv->combobox,
+ TRUE, TRUE, 0);
+
+ combobox->priv->button = gtk_button_new_with_label ("");
+
+ gtk_box_pack_start (GTK_BOX (combobox->priv->drop_box),
+ combobox->priv->button,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (combobox->priv->drop_box),
+ combobox->priv->end_box,
+ FALSE, FALSE, 0);
+
+ gtk_widget_set_no_show_all (combobox->priv->button, TRUE);
+
+ if (combobox->priv->size_group != NULL) {
+ gtk_size_group_add_widget (combobox->priv->size_group,
+ combobox->priv->start_box);
+
+ if (combobox->priv->symmetric)
+ gtk_size_group_add_widget (combobox->priv->size_group,
+ combobox->priv->end_box);
}
- gtk_container_add (GTK_CONTAINER (frame), combo_box->priv->drop_box);
- gtk_widget_show_all (frame);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (combobox->priv->label),
+ combobox->priv->combobox);
- gtk_label_set_mnemonic_widget (GTK_LABEL (combo_box->priv->label),
- combo_box->priv->combobox);
+ gtk_container_add (GTK_CONTAINER (frame), combobox->priv->drop_box);
+ gtk_widget_show_all (frame);
- g_signal_connect (G_OBJECT (combo_box->priv->combobox), "changed",
- G_CALLBACK (on_combo_box_changed), combo_box);
- g_signal_connect (G_OBJECT (combo_box->priv->button), "clicked",
- G_CALLBACK (on_combo_box_button_clicked), combo_box);
+ g_signal_connect (G_OBJECT (combobox->priv->combobox),
+ "changed",
+ G_CALLBACK (on_combo_box_changed),
+ combobox);
+ g_signal_connect (G_OBJECT (combobox->priv->button),
+ "clicked",
+ G_CALLBACK (on_combo_box_button_clicked),
+ combobox);
}
static void
-gvc_combo_box_finalize (GObject *object)
+gvc_combo_box_dispose (GObject *object)
{
- GvcComboBox *combo_box;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GVC_IS_COMBO_BOX (object));
+ GvcComboBox *combobox;
- combo_box = GVC_COMBO_BOX (object);
+ combobox = GVC_COMBO_BOX (object);
- g_return_if_fail (combo_box->priv != NULL);
+ g_clear_object (&combobox->priv->model);
- g_object_unref (combo_box->priv->model);
- combo_box->priv->model = NULL;
-
- G_OBJECT_CLASS (gvc_combo_box_parent_class)->finalize (object);
+ G_OBJECT_CLASS (gvc_combo_box_parent_class)->dispose (object);
}
GtkWidget *
-gvc_combo_box_new (const char *label)
+gvc_combo_box_new (const gchar *label)
{
return g_object_new (GVC_TYPE_COMBO_BOX,
"label", label,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ "orientation", GTK_ORIENTATION_HORIZONTAL,
+#endif
NULL);
}