Hi, here comes the second part of the series for generic keyboard backlight support.
Please find below the userland part which adds a backlight variable to wsconsctl(8). I have chosen to use the percentage format, so it looks like this: $ doas wsconsctl keyboard.backlight=80 keyboard.backlight -> 80.00% Comments, OK? Thanks, Regards, Joerg Index: keyboard.c =================================================================== RCS file: /cvs/src/sbin/wsconsctl/keyboard.c,v retrieving revision 1.12 diff -u -p -r1.12 keyboard.c --- keyboard.c 21 Mar 2013 06:04:05 -0000 1.12 +++ keyboard.c 7 Dec 2015 21:03:22 -0000 @@ -50,6 +50,7 @@ static struct wskbd_keyrepeat_data repea static struct wskbd_keyrepeat_data dfrepeat; static int ledstate; static kbd_t kbdencoding; +static struct field_pc backlight; struct field keyboard_field_tab[] = { { "type", &kbtype, FMT_KBDTYPE, FLG_RDONLY }, @@ -66,12 +67,15 @@ struct field keyboard_field_tab[] = { { "repeat.deln.default", &dfrepeat.delN, FMT_UINT, FLG_MODIFY }, { "ledstate", &ledstate, FMT_UINT, 0 }, { "encoding", &kbdencoding, FMT_KBDENC, FLG_MODIFY }, + { "backlight", &backlight, FMT_PC, FLG_MODIFY|FLG_INIT }, { NULL } }; void keyboard_get_values(int fd) { + struct wskbd_backlight kbl; + if (field_by_value(keyboard_field_tab, &kbtype)->flags & FLG_GET) if (ioctl(fd, WSKBDIO_GTYPE, &kbtype) < 0) warn("WSKBDIO_GTYPE"); @@ -131,11 +135,24 @@ keyboard_get_values(int fd) if (field_by_value(keyboard_field_tab, &kbdencoding)->flags & FLG_GET) if (ioctl(fd, WSKBDIO_GETENCODING, &kbdencoding) < 0) warn("WSKBDIO_GETENCODING"); + + if (field_by_value(keyboard_field_tab, &backlight)->flags & FLG_GET) { + if (ioctl(fd, WSKBDIO_GETBACKLIGHT, &kbl) < 0) + warn("WSKBDIO_GETBACKLIGHT"); + else { + backlight.min = kbl.min; + backlight.cur = kbl.curval; + backlight.max = kbl.max; + } + } + } int keyboard_put_values(int fd) { + struct wskbd_backlight kbl; + bell.which = 0; if (field_by_value(keyboard_field_tab, &bell.pitch)->flags & FLG_SET) bell.which |= WSKBD_BELL_DOPITCH; @@ -200,6 +217,16 @@ keyboard_put_values(int fd) if (field_by_value(keyboard_field_tab, &kbdencoding)->flags & FLG_SET) { if (ioctl(fd, WSKBDIO_SETENCODING, &kbdencoding) < 0) { warn("WSKBDIO_SETENCODING"); + return 1; + } + } + + if (field_by_value(keyboard_field_tab, &backlight)->flags & FLG_SET) { + kbl.min = backlight.min; + kbl.curval = backlight.cur; + kbl.max = backlight.max; + if (ioctl(fd, WSKBDIO_SETBACKLIGHT, &kbl) < 0) { + warn("WSKBDIO_SETBACKLIGHT"); return 1; } }