diff --git a/common/xfpm-brightness.c b/common/xfpm-brightness.c index 066e44c..2cee9b9 100644 --- a/common/xfpm-brightness.c +++ b/common/xfpm-brightness.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -51,15 +52,43 @@ 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 (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) { @@ -212,6 +241,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; } } @@ -242,7 +272,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)); @@ -282,7 +312,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)); @@ -364,6 +394,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; @@ -472,7 +503,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)); @@ -512,7 +543,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)); @@ -554,11 +585,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 @@ -699,6 +732,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 990927d..2573b62 100644 --- a/common/xfpm-brightness.h +++ b/common/xfpm-brightness.h @@ -66,6 +66,10 @@ gboolean xfpm_brightness_get_level (XfpmBrightness *brightness, 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, diff --git a/common/xfpm-config.h b/common/xfpm-config.h index da0ff89..ed4964e 100644 --- a/common/xfpm-config.h +++ b/common/xfpm-config.h @@ -73,6 +73,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 b766920..fe29c3a 100644 --- a/data/interfaces/xfpm-settings.ui +++ b/data/interfaces/xfpm-settings.ui @@ -29,6 +29,12 @@ 1 10 + + 2 + 100 + 10 + 5 + 1 20 @@ -402,6 +408,7 @@ True True end + 1 @@ -422,6 +429,59 @@ 3 + + + True + False + 6 + + + True + True + False + + False + False + brightness-step-count-spin-adjustment + + + + False + False + + + + + Exponential + True + True + False + True + + + + False + True + + + + + 1 + 4 + + + + + True + False + 0 + Brightness step count: + + + 0 + 4 + + True diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index 0d1d04f..0bc540a 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -63,6 +63,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; /* Light Locker Integration */ static GtkWidget *light_locker_tab = NULL; @@ -194,6 +196,14 @@ void on_ac_sleep_mode_changed_cb (GtkWidget *w, 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 (GtkScale *scale, gdouble value, @@ -773,6 +783,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, 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, 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) { XfconfChannel *session_channel = xfconf_channel_get ("xfce4-session"); @@ -1409,6 +1449,33 @@ xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, gtk_widget_hide (sleep_w); gtk_widget_hide (sleep_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, 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, PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(brightness_exponential), val); + + valid = xfconf_channel_get_bool (channel, 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 @@ -2354,6 +2421,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")); 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 3ca25f5..da67e3b 100644 --- a/src/xfpm-backlight.c +++ b/src/xfpm-backlight.c @@ -81,6 +81,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; @@ -223,10 +226,14 @@ xfpm_backlight_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBa gboolean ret = TRUE; 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 ) @@ -237,6 +244,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 @@ -347,6 +357,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 ) @@ -439,6 +451,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), + PROPERTIES_PREFIX BRIGHTNESS_STEP_COUNT, + 10); + backlight->priv->brightness_exponential = + xfconf_channel_get_bool (xfpm_xfconf_get_channel(backlight->priv->conf), + PROPERTIES_PREFIX BRIGHTNESS_EXPONENTIAL, + FALSE); } } diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c index 48ec992..2bd6391 100644 --- a/src/xfpm-xfconf.c +++ b/src/xfpm-xfconf.c @@ -60,6 +60,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, @@ -290,6 +292,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 **/