diff --git a/common/xfpm-brightness.c b/common/xfpm-brightness.c index 50e94119..2317c01b 100644 --- a/common/xfpm-brightness.c +++ b/common/xfpm-brightness.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -48,14 +49,42 @@ struct XfpmBrightnessPrivate gint output; gboolean xrandr_has_hw; gboolean helper_has_hw; + gboolean use_exp_step; gint32 max_level; gint32 current_level; gint32 min_level; gint32 step; + gfloat exp_step; }; G_DEFINE_TYPE_WITH_PRIVATE (XfpmBrightness, xfpm_brightness, G_TYPE_OBJECT) + +static gint32 +xfpm_brightness_inc (XfpmBrightness *brightness, gint32 level) +{ + if (brightness->priv->use_exp_step) + { + gint32 new_level = roundf (level * brightness->priv->exp_step); + if (new_level == level) ++new_level; + return new_level; + } + else + return level + brightness->priv->step; +} + +static gint32 +xfpm_brightness_dec (XfpmBrightness *brightness, gint32 level) +{ + if (brightness->priv->use_exp_step) + { + gint32 new_level = roundf (level / brightness->priv->exp_step); + if (new_level == level) --new_level; + return new_level; + } + else + return level - brightness->priv->step; +} static gboolean xfpm_brightness_xrand_get_limit (XfpmBrightness *brightness, RROutput output, gint *min, gint *max) @@ -222,6 +251,7 @@ xfpm_brightness_setup_xrandr (XfpmBrightness *brightness) ret = TRUE; brightness->priv->output = brightness->priv->resource->outputs[i]; brightness->priv->step = max <= 20 ? 1 : max / 10; + brightness->priv->exp_step = 2; } } @@ -252,7 +282,7 @@ xfpm_brightness_xrand_up (XfpmBrightness *brightness, gint32 *new_level) return TRUE; } - set_level = MIN (hw_level + brightness->priv->step, brightness->priv->max_level ); + set_level = MIN (xfpm_brightness_inc (brightness, hw_level), brightness->priv->max_level ); g_warn_if_fail (xfpm_brightness_xrandr_set_level (brightness, brightness->priv->output, set_level)); @@ -292,7 +322,7 @@ xfpm_brightness_xrand_down (XfpmBrightness *brightness, gint32 *new_level) return TRUE; } - set_level = MAX (hw_level - brightness->priv->step, brightness->priv->min_level); + set_level = MAX (xfpm_brightness_dec (brightness, hw_level), brightness->priv->min_level); g_warn_if_fail (xfpm_brightness_xrandr_set_level (brightness, brightness->priv->output, set_level)); @@ -378,6 +408,7 @@ xfpm_brightness_setup_helper (XfpmBrightness *brightness) brightness->priv->min_level = 0; brightness->priv->max_level = ret; brightness->priv->step = ret <= 20 ? 1 : ret / 10; + brightness->priv->exp_step = 2; } return brightness->priv->helper_has_hw; @@ -486,7 +517,7 @@ xfpm_brightness_helper_up (XfpmBrightness *brightness, gint32 *new_level) return TRUE; } - set_level = MIN (hw_level + brightness->priv->step, brightness->priv->max_level ); + set_level = MIN (xfpm_brightness_inc (brightness, hw_level), brightness->priv->max_level ); g_warn_if_fail (xfpm_brightness_helper_set_level (brightness, set_level)); @@ -526,7 +557,7 @@ xfpm_brightness_helper_down (XfpmBrightness *brightness, gint32 *new_level) return TRUE; } - set_level = MAX (hw_level - brightness->priv->step, brightness->priv->min_level); + set_level = MAX (xfpm_brightness_dec (brightness, hw_level), brightness->priv->min_level); g_warn_if_fail (xfpm_brightness_helper_set_level (brightness, set_level)); @@ -566,11 +597,13 @@ xfpm_brightness_init (XfpmBrightness *brightness) brightness->priv->resource = NULL; brightness->priv->xrandr_has_hw = FALSE; brightness->priv->helper_has_hw = FALSE; + brightness->priv->use_exp_step = FALSE; brightness->priv->max_level = 0; brightness->priv->min_level = 0; brightness->priv->current_level = 0; brightness->priv->output = 0; brightness->priv->step = 0; + brightness->priv->exp_step = 1; } static void @@ -711,6 +744,22 @@ gboolean xfpm_brightness_set_level (XfpmBrightness *brightness, gint32 level) return ret; } +gboolean xfpm_brightness_set_step_count (XfpmBrightness *brightness, guint32 count, gboolean exponential) +{ + gboolean ret = FALSE; + + if ( xfpm_brightness_has_hw (brightness) ) { + if ( count < 2 ) count = 2; + gint32 delta = brightness->priv->max_level - brightness->priv->min_level; + brightness->priv->use_exp_step = exponential; + brightness->priv->step = (delta < (count * 2)) ? 1 : (delta / count); + brightness->priv->exp_step = powf (delta, 1.0 / count); + ret = TRUE; + } + + return ret; +} + gboolean xfpm_brightness_dim_down (XfpmBrightness *brightness) { gboolean ret = FALSE; diff --git a/common/xfpm-brightness.h b/common/xfpm-brightness.h index 2e072400..1780d2ec 100644 --- a/common/xfpm-brightness.h +++ b/common/xfpm-brightness.h @@ -57,6 +57,9 @@ gboolean xfpm_brightness_get_level (XfpmBrightness *brightness, gint32 *level); gboolean xfpm_brightness_set_level (XfpmBrightness *brightness, gint32 level); +gboolean xfpm_brightness_set_step_count (XfpmBrightness *brightness, + guint32 count, + gboolean exponential); gboolean xfpm_brightness_dim_down (XfpmBrightness *brightness); gboolean xfpm_brightness_get_switch (XfpmBrightness *brightness, gint *brightness_switch); diff --git a/common/xfpm-config.h b/common/xfpm-config.h index dbbdee52..e4322c7b 100644 --- a/common/xfpm-config.h +++ b/common/xfpm-config.h @@ -76,6 +76,8 @@ G_BEGIN_DECLS #define BRIGHTNESS_LEVEL_ON_AC "brightness-level-on-ac" #define BRIGHTNESS_LEVEL_ON_BATTERY "brightness-level-on-battery" #define BRIGHTNESS_SLIDER_MIN_LEVEL "brightness-slider-min-level" +#define BRIGHTNESS_STEP_COUNT "brightness-step-count" +#define BRIGHTNESS_EXPONENTIAL "brightness-exponential" #define BRIGHTNESS_SWITCH "brightness-switch" #define BRIGHTNESS_SWITCH_SAVE "brightness-switch-restore-on-exit" #define HANDLE_BRIGHTNESS_KEYS "handle-brightness-keys" diff --git a/data/interfaces/xfpm-settings.ui b/data/interfaces/xfpm-settings.ui index b5cc3cfa..89e5c63d 100644 --- a/data/interfaces/xfpm-settings.ui +++ b/data/interfaces/xfpm-settings.ui @@ -31,6 +31,12 @@ 1 10 + + 2 + 100 + 10 + 5 + 1 20 @@ -455,12 +461,66 @@ True True end + 1 4 + + + True + False + 6 + + + True + True + False + + False + False + brightness-step-count-spin-adjustment + + + + False + False + + + + + Exponential + True + True + False + True + + + + False + True + + + + + 1 + 5 + + + + + True + False + 0 + Brightness step count: + + + 0 + 5 + + True diff --git a/panel-plugins/power-manager-plugin/power-manager-button.c b/panel-plugins/power-manager-plugin/power-manager-button.c index c71ce21b..5f661aa8 100644 --- a/panel-plugins/power-manager-plugin/power-manager-button.c +++ b/panel-plugins/power-manager-plugin/power-manager-button.c @@ -1721,6 +1721,19 @@ power_manager_button_show_menu (PowerManagerButton *button) { max_level = xfpm_brightness_get_max_level (button->priv->brightness); + /* Setup brightness steps */ + guint brightness_step_count = + xfconf_channel_get_uint (button->priv->channel, + XFPM_PROPERTIES_PREFIX BRIGHTNESS_STEP_COUNT, + 10); + gboolean brightness_exponential = + xfconf_channel_get_bool (button->priv->channel, + XFPM_PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, + FALSE); + xfpm_brightness_set_step_count(button->priv->brightness, + brightness_step_count, + brightness_exponential); + mi = scale_menu_item_new_with_range (button->priv->brightness_min_level, max_level, 1); scale_menu_item_set_description_label (SCALE_MENU_ITEM (mi), _("Display brightness")); diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index 5e86a934..68046b4a 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -64,6 +64,8 @@ static GtkWidget *on_ac_dpms_sleep = NULL; static GtkWidget *on_ac_dpms_off = NULL; static GtkWidget *sideview = NULL; /* Sidebar tree view - all devices are in the sideview */ static GtkWidget *device_details_notebook = NULL; /* Displays the details of a deivce */ +static GtkWidget* brightness_step_count = NULL; +static GtkWidget* brightness_exponential = NULL; static GtkWidget *label_inactivity_on_ac = NULL; static GtkWidget *label_inactivity_on_battery = NULL; @@ -173,6 +175,13 @@ void on_ac_sleep_mode_changed_cb (GtkWidget *w, XfconfChannel *channel); void on_battery_sleep_mode_changed_cb (GtkWidget *w, XfconfChannel *channel); +void handle_brightness_keys_toggled_cb (GtkWidget *w, + gboolean is_active, + XfconfChannel *channel); +void brightness_step_count_value_changed_cb (GtkSpinButton *w, + XfconfChannel *channel); +void brightness_exponential_toggled_cb (GtkWidget *w, + XfconfChannel *channel); /* Light Locker Integration */ gchar *format_light_locker_value_cb (gint value); void light_locker_late_locking_value_changed_cb (GtkWidget *w, @@ -792,6 +801,36 @@ critical_level_value_changed_cb (GtkSpinButton *w, XfconfChannel *channel) } } +void +handle_brightness_keys_toggled_cb (GtkWidget *w, gboolean is_active, XfconfChannel *channel) +{ + gtk_widget_set_sensitive (brightness_step_count, is_active); + gtk_widget_set_sensitive (brightness_exponential, is_active); + gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (xml, "brightness-step-count-label")), is_active); +} + +void +brightness_step_count_value_changed_cb (GtkSpinButton *w, XfconfChannel *channel) +{ + guint val = (guint) gtk_spin_button_get_value (w); + + if (!xfconf_channel_set_uint (channel, XFPM_PROPERTIES_PREFIX BRIGHTNESS_STEP_COUNT, val) ) + { + g_critical ("Unable to set value %d for property %s\n", val, BRIGHTNESS_STEP_COUNT); + } +} + +void +brightness_exponential_toggled_cb (GtkWidget *w, XfconfChannel *channel) +{ + gboolean val = (gint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w)); + + if ( !xfconf_channel_set_bool (channel, XFPM_PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, val) ) + { + g_critical ("Unable to set value for property %s\n", BRIGHTNESS_EXPONENTIAL); + } +} + void lock_screen_toggled_cb (GtkWidget *w, XfconfChannel *channel) { @@ -1503,6 +1542,33 @@ xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, gtk_widget_hide (battery_w); gtk_widget_hide (battery_label); } + + /* + * Brightness step count + */ + brightness_step_count = GTK_WIDGET (gtk_builder_get_object (xml, "brightness-step-count-spin")); + gtk_widget_set_tooltip_text (brightness_step_count, + _("Number of brightness steps available using keys")); + val = xfconf_channel_get_uint (channel, XFPM_PROPERTIES_PREFIX BRIGHTNESS_STEP_COUNT, 10); + if ( val > 100 || val < 2) + { + g_critical ("Value %d if out of range for property %s\n", val, BRIGHTNESS_STEP_COUNT); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(brightness_step_count), 10); + } + else + gtk_spin_button_set_value (GTK_SPIN_BUTTON(brightness_step_count), val); + + /* + * Exponential brightness + */ + brightness_exponential = GTK_WIDGET (gtk_builder_get_object (xml, "brightness-exponential")); + val = xfconf_channel_get_bool (channel, XFPM_PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(brightness_exponential), val); + + valid = xfconf_channel_get_bool (channel, XFPM_PROPERTIES_PREFIX HANDLE_BRIGHTNESS_KEYS, TRUE); + gtk_widget_set_sensitive (brightness_step_count, valid); + gtk_widget_set_sensitive (brightness_exponential, valid); + gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (xml, "brightness-step-count-label")), valid); } static void @@ -2478,6 +2544,10 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, gtk_widget_hide (frame); frame = GTK_WIDGET (gtk_builder_get_object (xml, "handle-brightness-keys-label")); gtk_widget_hide (frame); + frame = GTK_WIDGET (gtk_builder_get_object (xml, "brightness-step-count")); + gtk_widget_hide (frame); + frame = GTK_WIDGET (gtk_builder_get_object (xml, "brightness-exponential")); + gtk_widget_hide (frame); } if ( id != 0 ) diff --git a/src/xfpm-backlight.c b/src/xfpm-backlight.c index 55a9dc22..2a0ab15a 100644 --- a/src/xfpm-backlight.c +++ b/src/xfpm-backlight.c @@ -79,6 +79,9 @@ struct XfpmBacklightPrivate gint32 last_level; gint32 max_level; + guint brightness_step_count; + gboolean brightness_exponential; + gint brightness_switch; gint brightness_switch_save; gboolean brightness_switch_initialized; @@ -220,9 +223,15 @@ xfpm_backlight_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBa gboolean handle_brightness_keys, show_popup; + guint brightness_step_count; + gboolean brightness_exponential; + + g_object_get (G_OBJECT (backlight->priv->conf), HANDLE_BRIGHTNESS_KEYS, &handle_brightness_keys, SHOW_BRIGHTNESS_POPUP, &show_popup, + BRIGHTNESS_STEP_COUNT, &brightness_step_count, + BRIGHTNESS_EXPONENTIAL, &brightness_exponential, NULL); if ( type != BUTTON_MON_BRIGHTNESS_UP && type != BUTTON_MON_BRIGHTNESS_DOWN ) @@ -233,6 +242,9 @@ xfpm_backlight_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBa ret = xfpm_brightness_get_level (backlight->priv->brightness, &level); else { + xfpm_brightness_set_step_count(backlight->priv->brightness, + brightness_step_count, + brightness_exponential); if ( type == BUTTON_MON_BRIGHTNESS_UP ) ret = xfpm_brightness_up (backlight->priv->brightness, &level); else @@ -341,6 +353,8 @@ xfpm_backlight_init (XfpmBacklight *backlight) backlight->priv->power = NULL; backlight->priv->dimmed = FALSE; backlight->priv->block = FALSE; + backlight->priv->brightness_step_count = 10; + backlight->priv->brightness_exponential = FALSE; backlight->priv->brightness_switch_initialized = FALSE; if ( !backlight->priv->has_hw ) @@ -429,6 +443,16 @@ xfpm_backlight_init (XfpmBacklight *backlight) NULL); xfpm_brightness_get_level (backlight->priv->brightness, &backlight->priv->last_level); xfpm_backlight_set_timeouts (backlight); + + /* setup step count */ + backlight->priv->brightness_step_count = + xfconf_channel_get_int (xfpm_xfconf_get_channel(backlight->priv->conf), + XFPM_PROPERTIES_PREFIX BRIGHTNESS_STEP_COUNT, + 10); + backlight->priv->brightness_exponential = + xfconf_channel_get_bool (xfpm_xfconf_get_channel(backlight->priv->conf), + XFPM_PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, + FALSE); } } diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c index 961911c2..86ab1546 100644 --- a/src/xfpm-xfconf.c +++ b/src/xfpm-xfconf.c @@ -58,6 +58,8 @@ enum PROP_CRITICAL_LEVEL, PROP_SHOW_BRIGHTNESS_POPUP, PROP_HANDLE_BRIGHTNESS_KEYS, + PROP_BRIGHTNESS_STEP_COUNT, + PROP_BRIGHTNESS_EXPONENTIAL, PROP_TRAY_ICON, PROP_CRITICAL_BATTERY_ACTION, PROP_POWER_BUTTON, @@ -289,6 +291,29 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) NULL, NULL, TRUE, G_PARAM_READWRITE)); + + /** + * XfpmXfconf::brightness-step-count + **/ + g_object_class_install_property (object_class, + PROP_BRIGHTNESS_STEP_COUNT, + g_param_spec_uint (BRIGHTNESS_STEP_COUNT, + NULL, NULL, + 2, + 100, + 10, + G_PARAM_READWRITE)); + + /** + * XfpmXfconf::brightness-exponential + **/ + g_object_class_install_property (object_class, + PROP_BRIGHTNESS_EXPONENTIAL, + g_param_spec_boolean (BRIGHTNESS_EXPONENTIAL, + NULL, NULL, + FALSE, + G_PARAM_READWRITE)); + /** * XfpmXfconf::show-tray-icon **/