diff options
Diffstat (limited to 'src/gpm-kbd-backlight.c')
-rw-r--r-- | src/gpm-kbd-backlight.c | 162 |
1 files changed, 84 insertions, 78 deletions
diff --git a/src/gpm-kbd-backlight.c b/src/gpm-kbd-backlight.c index a4353fe..7adf0a8 100644 --- a/src/gpm-kbd-backlight.c +++ b/src/gpm-kbd-backlight.c @@ -43,7 +43,6 @@ struct GpmKbdBacklightPrivate gboolean system_is_idle; GTimer *idle_timer; guint idle_dim_timeout; - guint master_percentage; guint brightness; guint max_brightness; guint brightness_percent; @@ -105,7 +104,8 @@ gpm_kbd_backlight_get_brightness (GpmKbdBacklight *backlight, static gboolean gpm_kbd_backlight_set (GpmKbdBacklight *backlight, - guint percentage) + guint percentage, + gboolean save) { gint scale; guint goal; @@ -139,6 +139,34 @@ gpm_kbd_backlight_set (GpmKbdBacklight *backlight, NULL, NULL); } + + /* On user interaction, save the target brightness in the only setting we + * have, to be able to restore it next time. */ + if (save) { + gint ac_value = backlight->priv->brightness_percent; + + /* If on battery, try and scale the saved value up so applying it with + * the scaling would yield the current value. It's however not possible + * to make it accurate as any value that is higher than the dim percentage + * cannot be saved (as the saved value is 0-100). */ + if (g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_KBD_BACKLIGHT_BATT_REDUCE) && + up_client_get_on_battery (backlight->priv->client)) { + gint dim_pct; + + dim_pct = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_DIM_BY_ON_BATT); + + if (dim_pct > 100) { + g_warning ("Cannot scale brightness down by more than 100%%. Scaling by 50%%"); + dim_pct = 50; + } + + ac_value = (gint) (((gdouble) ac_value) / ((100 - dim_pct) / 100.0)); + ac_value = CLAMP (ac_value, 0, 100); + } + + g_settings_set_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_ON_AC, ac_value); + } + g_debug("Set brightness to %u", backlight->priv->brightness); return TRUE; } @@ -240,7 +268,7 @@ gpm_kbd_backlight_brightness_up (GpmKbdBacklight *backlight) guint new; new = MIN (backlight->priv->brightness_percent + GPM_KBD_BACKLIGHT_STEP, 100u); - return gpm_kbd_backlight_set (backlight, new); + return gpm_kbd_backlight_set (backlight, new, TRUE); } /** @@ -253,7 +281,7 @@ gpm_kbd_backlight_brightness_down (GpmKbdBacklight *backlight) // we can possibly go below 0 here, so by converting to a gint we avoid underflow errors. new = MAX ((gint) backlight->priv->brightness_percent - GPM_KBD_BACKLIGHT_STEP, 0); - return gpm_kbd_backlight_set (backlight, new); + return gpm_kbd_backlight_set (backlight, new, TRUE); } /** @@ -281,9 +309,7 @@ gpm_kbd_backlight_set_brightness (GpmKbdBacklight *backlight, return FALSE; } - backlight->priv->master_percentage = percentage; - - ret = gpm_kbd_backlight_set (backlight, percentage); + ret = gpm_kbd_backlight_set (backlight, percentage, TRUE); if (!ret) { g_set_error_literal (error, gpm_kbd_backlight_error_quark (), GPM_KBD_BACKLIGHT_ERROR_GENERAL, @@ -299,7 +325,6 @@ gpm_kbd_backlight_on_brightness_changed (GpmKbdBacklight *backlight, { backlight->priv->brightness = value; backlight->priv->brightness_percent = gpm_discrete_to_percent (value, backlight->priv->max_brightness); - backlight->priv->master_percentage = backlight->priv->brightness_percent; g_signal_emit (backlight, signals [BRIGHTNESS_CHANGED], 0, backlight->priv->brightness_percent); } @@ -325,50 +350,47 @@ gpm_kbd_backlight_on_dbus_signal (GDBusProxy *proxy, g_debug ("signal '%s' not handled!", signal_name); } -static gboolean -gpm_kbd_backlight_evaluate_power_source_and_set (GpmKbdBacklight *backlight) +static guint +gpm_kbd_backlight_get_ac_percentage_dimmed (GpmKbdBacklight *backlight, + guint dim_by) { - gfloat brightness; - gfloat scale; - gboolean on_battery; - gboolean battery_reduce; guint value; - gboolean ret; - - brightness = backlight->priv->master_percentage; - g_object_get (backlight->priv->client, - "on-battery", - &on_battery, - NULL); + value = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_ON_AC); + if (value > 100) { + value = 100; + } - battery_reduce = g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_KBD_BACKLIGHT_BATT_REDUCE); + if (dim_by) { + gfloat scale; - if (on_battery) { - if (battery_reduce) { - value = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_DIM_BY_ON_BATT); + if (dim_by > 100) { + g_warning ("Cannot scale brightness down by more than 100%%. Scaling by 50%%"); + dim_by = 50; + } - if (value > 100) { - g_warning ("Cannot scale brightness down by more than 100%%. Scaling by 50%%"); - value = 50; - } + scale = (100 - dim_by) / 100.0f; - scale = (100 - value) / 100.0f; - brightness *= scale; + value = (guint) ((gfloat) value * scale); + } - value = (guint) brightness; + return value; +} - } else { - // do not change keyboard backlight - return TRUE; - } +static gboolean +gpm_kbd_backlight_evaluate_power_source_and_set (GpmKbdBacklight *backlight) +{ + guint value; + guint dim_by = 0; - } else { - value = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_ON_AC); + if (up_client_get_on_battery (backlight->priv->client) && + g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_KBD_BACKLIGHT_BATT_REDUCE)) { + dim_by = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_DIM_BY_ON_BATT); } - ret = gpm_kbd_backlight_set (backlight, value); - return ret; + value = gpm_kbd_backlight_get_ac_percentage_dimmed (backlight, dim_by); + + return gpm_kbd_backlight_set (backlight, value, FALSE); } /** @@ -402,7 +424,9 @@ gpm_kbd_backlight_client_changed_cb (UpClient *client, GParamSpec *pspec, GpmKbdBacklight *backlight) { - gpm_kbd_backlight_evaluate_power_source_and_set (backlight); + if (g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_KBD_BACKLIGHT_BATT_REDUCE)) { + gpm_kbd_backlight_evaluate_power_source_and_set (backlight); + } } /** @@ -416,10 +440,18 @@ gpm_kbd_backlight_button_pressed_cb (GpmButton *button, const gchar *type, GpmKbdBacklight *backlight) { - static guint saved_brightness; + static guint saved_brightness = ~0u; gboolean ret; - saved_brightness = backlight->priv->master_percentage; + if (saved_brightness == ~0u) { + saved_brightness = backlight->priv->brightness_percent; + /* If the initial value is 0, which probably means we saved on_ac=0, we + * try and restore some arbitrary value for the toggle not to seem + * broken */ + if (saved_brightness == 0) { + saved_brightness = 100u; + } + } if (g_strcmp0 (type, GPM_BUTTON_KBD_BRIGHT_UP) == 0) { ret = gpm_kbd_backlight_brightness_up (backlight); @@ -442,13 +474,13 @@ gpm_kbd_backlight_button_pressed_cb (GpmButton *button, } } else if (g_strcmp0 (type, GPM_BUTTON_KBD_BRIGHT_TOGGLE) == 0) { - if (backlight->priv->master_percentage == 0) { + if (backlight->priv->brightness_percent == 0) { /* backlight is off turn it back on */ - gpm_kbd_backlight_set (backlight, saved_brightness); + gpm_kbd_backlight_set (backlight, saved_brightness, TRUE); } else { /* backlight is on, turn it off and save current value */ - saved_brightness = backlight->priv->master_percentage; - gpm_kbd_backlight_set (backlight, 0); + saved_brightness = backlight->priv->brightness_percent; + gpm_kbd_backlight_set (backlight, 0, TRUE); } } } @@ -469,28 +501,16 @@ gpm_kbd_backlight_idle_changed_cb (GpmIdle *idle, GpmIdleMode mode, GpmKbdBacklight *backlight) { - gfloat brightness; - gfloat scale; guint value; - gboolean lid_closed; - gboolean on_battery; gboolean enable_action; g_debug("Idle changed"); - lid_closed = gpm_button_is_lid_closed (backlight->priv->button); - - if (lid_closed) + if (gpm_button_is_lid_closed (backlight->priv->button)) return; - g_object_get (backlight->priv->client, - "on-battery", - &on_battery, - NULL); - - enable_action = on_battery + enable_action = up_client_get_on_battery (backlight->priv->client) ? g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_IDLE_DIM_BATT) - && g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_KBD_BACKLIGHT_BATT_REDUCE) : g_settings_get_boolean (backlight->priv->settings, GPM_SETTINGS_IDLE_DIM_AC); if (!enable_action) @@ -498,25 +518,14 @@ gpm_kbd_backlight_idle_changed_cb (GpmIdle *idle, if (mode == GPM_IDLE_MODE_NORMAL) { g_debug ("GPM_IDLE_MODE_NORMAL"); - backlight->priv->master_percentage = 100; gpm_kbd_backlight_evaluate_power_source_and_set (backlight); } else if (mode == GPM_IDLE_MODE_DIM) { g_debug ("GPM_IDLE_MODE_DIM"); - brightness = backlight->priv->master_percentage; value = g_settings_get_int (backlight->priv->settings, GPM_SETTINGS_KBD_BRIGHTNESS_DIM_BY_ON_IDLE); - - if (value > 100) { - g_warning ("Cannot scale brightness down by more than 100%%. Scaling by 50%%"); - value = 50; - } - - scale = (100 - value) / 100.0f; - brightness *= scale; - - value = (guint) brightness; - gpm_kbd_backlight_set (backlight, value); + value = gpm_kbd_backlight_get_ac_percentage_dimmed (backlight, value); + gpm_kbd_backlight_set (backlight, value, FALSE); } else if (mode == GPM_IDLE_MODE_BLANK) { - gpm_kbd_backlight_set (backlight, 0u); + gpm_kbd_backlight_set (backlight, 0u, FALSE); } } @@ -657,9 +666,6 @@ err: backlight->priv->max_brightness = 0; noerr: - /* Initialize the master to full power. It will get scaled if needed */ - backlight->priv->master_percentage = 100u; - backlight->priv->idle_timer = g_timer_new (); backlight->priv->can_dim = backlight->priv->max_brightness > 1; |