When responding to hardware keys to increment or decrement screen
brightness, don't just adjust by 1 BCL level as there may be 100
levels. Find the next brightness level that is at least 5% up or
down, and use that.
Index: dev/acpi/acpivout.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpivout.c,v
retrieving revision 1.13
diff -u -p -u -p -r1.13 acpivout.c
--- dev/acpi/acpivout.c 13 Oct 2019 10:56:31 -0000 1.13
+++ dev/acpi/acpivout.c 14 Oct 2019 02:26:12 -0000
@@ -47,6 +47,8 @@ int acpivout_notify(struct aml_node *, i
#define NOTIFY_BRIGHTNESS_ZERO 0x88
#define NOTIFY_DISPLAY_OFF 0x89
+#define BRIGHTNESS_STEP 5
+
struct acpivout_softc {
struct device sc_dev;
@@ -61,8 +63,7 @@ struct acpivout_softc {
};
void acpivout_brightness_cycle(struct acpivout_softc *);
-void acpivout_brightness_up(struct acpivout_softc *);
-void acpivout_brightness_down(struct acpivout_softc *);
+void acpivout_brightness_step(struct acpivout_softc *, int);
void acpivout_brightness_zero(struct acpivout_softc *);
int acpivout_get_brightness(struct acpivout_softc *);
int acpivout_find_brightness(struct acpivout_softc *, int);
@@ -128,10 +129,10 @@ acpivout_notify(struct aml_node *node, i
acpivout_brightness_cycle(sc);
break;
case NOTIFY_BRIGHTNESS_UP:
- acpivout_brightness_up(sc);
+ acpivout_brightness_step(sc, 1);
break;
case NOTIFY_BRIGHTNESS_DOWN:
- acpivout_brightness_down(sc);
+ acpivout_brightness_step(sc, -1);
break;
case NOTIFY_BRIGHTNESS_ZERO:
acpivout_brightness_zero(sc);
@@ -158,45 +159,31 @@ acpivout_brightness_cycle(struct acpivou
if (cur_level == sc->sc_bcl[sc->sc_bcl_len - 1])
acpivout_brightness_zero(sc);
else
- acpivout_brightness_up(sc);
-}
-
-void
-acpivout_brightness_up(struct acpivout_softc *sc)
-{
- int i, cur_level;
-
- if (sc->sc_bcl_len == 0)
- return;
- cur_level = acpivout_get_brightness(sc);
- if (cur_level == -1)
- return;
-
- /* check for max brightness level */
- if (cur_level == sc->sc_bcl[sc->sc_bcl_len - 1])
- return;
-
- for (i = 0; i < sc->sc_bcl_len && cur_level != sc->sc_bcl[i]; i++);
- acpivout_set_brightness(sc, sc->sc_bcl[i + 1]);
+ acpivout_brightness_step(sc, 1);
}
void
-acpivout_brightness_down(struct acpivout_softc *sc)
+acpivout_brightness_step(struct acpivout_softc *sc, int dir)
{
- int i, cur_level;
+ int level, nlevel;
if (sc->sc_bcl_len == 0)
return;
- cur_level = acpivout_get_brightness(sc);
- if (cur_level == -1)
+ level = acpivout_get_brightness(sc);
+ if (level == -1)
return;
- /* check for min brightness level */
- if (cur_level == sc->sc_bcl[0])
+ nlevel = acpivout_find_brightness(sc, level + (dir * BRIGHTNESS_STEP));
+ if (nlevel == level) {
+ if (dir == 1 && (nlevel + 1 < sc->sc_bcl_len))
+ nlevel++;
+ else if (dir == -1 && (nlevel - 1 >= 0))
+ nlevel--;
+ }
+ if (nlevel == level)
return;
- for (i = 0; i < sc->sc_bcl_len && cur_level != sc->sc_bcl[i]; i++);
- acpivout_set_brightness(sc, sc->sc_bcl[i - 1]);
+ acpivout_set_brightness(sc, nlevel);
}
void