diff --git a/panel-plugin/pulseaudio-config.c b/panel-plugin/pulseaudio-config.c
index 5b54df5..ea8685d 100644
--- a/panel-plugin/pulseaudio-config.c
+++ b/panel-plugin/pulseaudio-config.c
@@ -45,6 +45,7 @@
#define DEFAULT_ENABLE_KEYBOARD_SHORTCUTS TRUE
#define DEFAULT_SHOW_NOTIFICATIONS TRUE
+#define DEFAULT_LIMIT_MAXVOLUME FALSE
#define DEFAULT_VOLUME_STEP 5
#define DEFAULT_VOLUME_MAX 150
@@ -85,6 +86,7 @@ struct _PulseaudioConfig
gboolean enable_keyboard_shortcuts;
gboolean enable_multimedia_keys;
gboolean show_notifications;
+ gboolean limit_maxvolume;
guint volume_step;
guint volume_max;
gchar *mixer_command;
@@ -101,6 +103,7 @@ enum
PROP_ENABLE_KEYBOARD_SHORTCUTS,
PROP_ENABLE_MULTIMEDIA_KEYS,
PROP_SHOW_NOTIFICATIONS,
+ PROP_LIMIT_MAXVOLUME,
PROP_VOLUME_STEP,
PROP_VOLUME_MAX,
PROP_MIXER_COMMAND,
@@ -161,6 +164,15 @@ pulseaudio_config_class_init (PulseaudioConfigClass *klass)
+ g_object_class_install_property (gobject_class,
+ PROP_LIMIT_MAXVOLUME,
+ g_param_spec_boolean ("limit-maxvolume", NULL, NULL,
+ DEFAULT_LIMIT_MAXVOLUME,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+
+
g_object_class_install_property (gobject_class,
PROP_VOLUME_STEP,
g_param_spec_uint ("volume-step", NULL, NULL,
@@ -234,6 +246,7 @@ pulseaudio_config_init (PulseaudioConfig *config)
config->enable_keyboard_shortcuts = DEFAULT_ENABLE_KEYBOARD_SHORTCUTS;
config->enable_multimedia_keys = DEFAULT_ENABLE_MULTIMEDIA_KEYS;
config->show_notifications = DEFAULT_SHOW_NOTIFICATIONS;
+ config->limit_maxvolume = DEFAULT_LIMIT_MAXVOLUME;
config->volume_step = DEFAULT_VOLUME_STEP;
config->volume_max = DEFAULT_VOLUME_MAX;
config->mixer_command = g_strdup (DEFAULT_MIXER_COMMAND);
@@ -279,6 +292,10 @@ pulseaudio_config_get_property (GObject *object,
g_value_set_boolean (value, config->show_notifications);
break;
+ case PROP_LIMIT_MAXVOLUME:
+ g_value_set_boolean (value, config->limit_maxvolume);
+ break;
+
case PROP_VOLUME_STEP:
g_value_set_uint (value, config->volume_step);
break;
@@ -353,6 +370,16 @@ pulseaudio_config_set_property (GObject *object,
}
break;
+ case PROP_LIMIT_MAXVOLUME:
+ val_bool = g_value_get_boolean (value);
+ if (config->limit_maxvolume != val_bool)
+ {
+ config->limit_maxvolume = val_bool;
+ g_object_notify (G_OBJECT (config), "limit-maxvolume");
+ g_signal_emit (G_OBJECT (config), pulseaudio_config_signals [CONFIGURATION_CHANGED], 0);
+ }
+ break;
+
case PROP_VOLUME_STEP:
val_uint = g_value_get_uint (value);
if (config->volume_step != val_uint)
@@ -453,6 +480,16 @@ pulseaudio_config_get_show_notifications (PulseaudioConfig *config)
+gboolean
+pulseaudio_config_get_limit_maxvolume (PulseaudioConfig *config)
+{
+ g_return_val_if_fail (IS_PULSEAUDIO_CONFIG (config), DEFAULT_LIMIT_MAXVOLUME);
+
+ return config->limit_maxvolume;
+}
+
+
+
guint
pulseaudio_config_get_volume_step (PulseaudioConfig *config)
{
@@ -634,6 +671,9 @@ pulseaudio_config_new (const gchar *property_base)
xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "show-notifications");
g_free (property);
+ property = g_strconcat (property_base, "/limit-maxvolume", NULL);
+ xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, config, "limit-maxvolume");
+
property = g_strconcat (property_base, "/volume-step", NULL);
xfconf_g_property_bind (channel, property, G_TYPE_UINT, config, "volume-step");
g_free (property);
diff --git a/panel-plugin/pulseaudio-config.h b/panel-plugin/pulseaudio-config.h
index 24715f9..db2623d 100644
--- a/panel-plugin/pulseaudio-config.h
+++ b/panel-plugin/pulseaudio-config.h
@@ -41,6 +41,7 @@ PulseaudioConfig *pulseaudio_config_new (const gchar
gboolean pulseaudio_config_get_enable_keyboard_shortcuts (PulseaudioConfig *config);
gboolean pulseaudio_config_get_enable_multimedia_keys (PulseaudioConfig *config);
gboolean pulseaudio_config_get_show_notifications (PulseaudioConfig *config);
+gboolean pulseaudio_config_get_limit_maxvolume (PulseaudioConfig *config);
guint pulseaudio_config_get_volume_step (PulseaudioConfig *config);
guint pulseaudio_config_get_volume_max (PulseaudioConfig *config);
const gchar *pulseaudio_config_get_mixer_command (PulseaudioConfig *config);
diff --git a/panel-plugin/pulseaudio-dialog.c b/panel-plugin/pulseaudio-dialog.c
index a5bc5cc..95aae7b 100644
--- a/panel-plugin/pulseaudio-dialog.c
+++ b/panel-plugin/pulseaudio-dialog.c
@@ -190,6 +190,12 @@ pulseaudio_dialog_build (PulseaudioDialog *dialog)
gtk_widget_set_visible (GTK_WIDGET (object), FALSE);
#endif
+ object = gtk_builder_get_object (builder, "checkbutton-limit-maxvolume");
+ g_return_if_fail (GTK_IS_CHECK_BUTTON (object));
+ g_object_bind_property (G_OBJECT (dialog->config), "limit-maxvolume",
+ G_OBJECT (object), "active",
+ G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
object = gtk_builder_get_object (builder, "entry-mixer-command");
g_return_if_fail (GTK_IS_ENTRY (object));
g_object_bind_property (G_OBJECT (dialog->config), "mixer-command",
diff --git a/panel-plugin/pulseaudio-dialog.glade b/panel-plugin/pulseaudio-dialog.glade
index 4e50e28..396c546 100644
--- a/panel-plugin/pulseaudio-dialog.glade
+++ b/panel-plugin/pulseaudio-dialog.glade
@@ -123,6 +123,23 @@
1
+
+
+
+ True
+ True
+ 2
+
+
diff --git a/panel-plugin/pulseaudio-menu.c b/panel-plugin/pulseaudio-menu.c
index b32a54d..15ba746 100644
--- a/panel-plugin/pulseaudio-menu.c
+++ b/panel-plugin/pulseaudio-menu.c
@@ -143,6 +143,8 @@ pulseaudio_menu_output_range_scroll (GtkWidget *widget,
scroll_event = (GdkEventScroll*)event;
new_volume = volume + (1.0 - 2.0 * scroll_event->direction) * volume_step;
+ if (pulseaudio_config_get_limit_maxvolume (menu->config))
+ new_volume = MIN(new_volume, 1.0);
pulseaudio_volume_set_volume (menu->volume, new_volume);
}
@@ -157,6 +159,8 @@ pulseaudio_menu_output_range_value_changed (PulseaudioMenu *menu,
g_return_if_fail (IS_PULSEAUDIO_MENU (menu));
new_volume = scale_menu_item_get_value (SCALE_MENU_ITEM (menu->output_scale)) / 100.0;
+ if (pulseaudio_config_get_limit_maxvolume (menu->config))
+ new_volume = MIN(new_volume, 1.0);
pulseaudio_volume_set_volume (menu->volume, new_volume);
}
@@ -214,6 +218,8 @@ pulseaudio_menu_input_range_scroll (GtkWidget *widget,
scroll_event = (GdkEventScroll*)event;
new_volume_mic = volume_mic + (1.0 - 2.0 * scroll_event->direction) * volume_step;
+ if (pulseaudio_config_get_limit_maxvolume (menu->config))
+ new_volume_mic = MIN(new_volume_mic, 1.0);
pulseaudio_volume_set_volume_mic (menu->volume, new_volume_mic);
}
@@ -228,6 +234,8 @@ pulseaudio_menu_input_range_value_changed (PulseaudioMenu *menu,
g_return_if_fail (IS_PULSEAUDIO_MENU (menu));
new_volume_mic = scale_menu_item_get_value (SCALE_MENU_ITEM (menu->input_scale)) / 100.0;
+ if (pulseaudio_config_get_limit_maxvolume (menu->config))
+ new_volume_mic = MIN(new_volume_mic, 1.0);
pulseaudio_volume_set_volume_mic (menu->volume, new_volume_mic);
}
@@ -479,6 +487,8 @@ pulseaudio_menu_new (PulseaudioVolume *volume,
G_CALLBACK (pulseaudio_menu_volume_changed), menu);
volume_max = pulseaudio_config_get_volume_max (menu->config);
+ if (pulseaudio_config_get_limit_maxvolume (menu->config))
+ volume_max = MIN (volume_max, 100);
/* Output Devices */
sources = pulseaudio_volume_get_output_list (menu->volume);