[Xfce4-commits] [xfce/xfce4-power-manager] 01/01: Make brightness steps configurable (Bug #12062)
noreply at xfce.org
noreply at xfce.org
Mon Jan 6 00:45:54 CET 2020
This is an automated email from the git hooks/post-receive script.
o c h o s i p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository xfce/xfce4-power-manager.
commit c866cf9faec6333e60f6b55a56b92ec9494747f3
Author: Timothy Lee <timothy.ty.lee at gmail.com>
Date: Mon Jan 6 00:43:14 2020 +0100
Make brightness steps configurable (Bug #12062)
This commit introduces two new options:
1) Configuring the amount of brightness steps
2) Whether to distribute the steps in a linear or exponential way
Both options are presented in the settings dialog and affect the
brightness keys and the panel plugin.
---
common/xfpm-brightness.c | 60 +++++++++++++++++--
common/xfpm-brightness.h | 3 +
common/xfpm-config.h | 2 +
data/interfaces/xfpm-settings.ui | 60 +++++++++++++++++++
.../power-manager-plugin/power-manager-button.c | 13 ++++
settings/xfpm-settings.c | 70 ++++++++++++++++++++++
src/xfpm-backlight.c | 25 +++++++-
src/xfpm-xfconf.c | 25 ++++++++
8 files changed, 252 insertions(+), 6 deletions(-)
diff --git a/common/xfpm-brightness.c b/common/xfpm-brightness.c
index 59cb4ac..9fb5b9c 100644
--- a/common/xfpm-brightness.c
+++ b/common/xfpm-brightness.c
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <math.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
@@ -48,15 +49,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_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,25 @@ 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) ) {
+ gint32 delta;
+
+ if ( count < 2 )
+ count = 2;
+ 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 2e07240..1780d2e 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 dbbdee5..e4322c7 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 b5cc3cf..89e5c63 100644
--- a/data/interfaces/xfpm-settings.ui
+++ b/data/interfaces/xfpm-settings.ui
@@ -31,6 +31,12 @@
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
+ <object class="GtkAdjustment" id="brightness-step-count-spin-adjustment">
+ <property name="lower">2</property>
+ <property name="upper">100</property>
+ <property name="value">10</property>
+ <property name="step_increment">5</property>
+ </object>
<object class="GtkAdjustment" id="critical-power-level-spin-adjustment">
<property name="lower">1</property>
<property name="upper">20</property>
@@ -455,6 +461,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
+ <signal name="state-set" handler="handle_brightness_keys_toggled_cb" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -462,6 +469,59 @@
</packing>
</child>
<child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkSpinButton" id="brightness-step-count-spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">False</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">brightness-step-count-spin-adjustment</property>
+ <signal name="value-changed" handler="brightness_step_count_value_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="brightness-exponential">
+ <property name="label" translatable="yes">Exponential</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="brightness_exponential_toggled_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="brightness-step-count-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Brightness step count:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkLabel" id="handle-brightness-keys-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
diff --git a/panel-plugins/power-manager-plugin/power-manager-button.c b/panel-plugins/power-manager-plugin/power-manager-button.c
index c71ce21..5e4dac0 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), _("<b>Display brightness</b>"));
diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c
index 5e86a93..f56ecf9 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,
@@ -793,6 +802,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)
{
XfconfChannel *session_channel = xfconf_channel_get ("xfce4-session");
@@ -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 55a9dc2..1c49562 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;
@@ -215,14 +218,17 @@ xfpm_backlight_reset_cb (EggIdletime *idle, XfpmBacklight *backlight)
static void
xfpm_backlight_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBacklight *backlight)
{
- gint32 level;
+ gint32 level;
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 )
@@ -233,6 +239,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 +350,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 +440,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 961911c..86ab154 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
**/
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list