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 + + + Limit maximum _volume to 100% + True + True + False + Limits maximum volume to 100% + start + True + True + + + 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);