Improvements to keyboard backlight.
This commit is contained in:
1 parent
c47f7668df
commit
a6905ebe4f
1 file changed
+59
-54
@@ -191,6 +191,7 @@ void update_crtc_infos(Display *dpy)
|
||||
|
||||
void set_screen_on(Display *dpy)
|
||||
{
|
||||
#if !DEBUG
|
||||
if(crtcres) {
|
||||
int i;
|
||||
for(i = 0; i < crtcres->ncrtc; i++) {
|
||||
@@ -206,10 +207,12 @@ void set_screen_on(Display *dpy)
|
||||
info->noutput);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_screen_off(Display *dpy)
|
||||
{
|
||||
#if !DEBUG
|
||||
if(crtcres) {
|
||||
int i;
|
||||
for(i = 0; i < crtcres->ncrtc; i++) {
|
||||
@@ -229,6 +232,7 @@ void set_screen_off(Display *dpy)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -627,43 +631,24 @@ static void dpms_enable(Display *dpy, struct dpms_state *state)
|
||||
}
|
||||
}
|
||||
|
||||
struct keyboard_backlight_state {
|
||||
struct keyboard_backlight {
|
||||
int available;
|
||||
int brightness;
|
||||
int fd;
|
||||
};
|
||||
|
||||
static struct keyboard_backlight_state get_keyboard_backlight_state()
|
||||
static int
|
||||
get_keyboard_backlight_brightness(struct keyboard_backlight *kbl)
|
||||
{
|
||||
|
||||
static char bl_entry[1024];
|
||||
char *leds;
|
||||
DIR *d;
|
||||
|
||||
struct keyboard_backlight_state bl_state;
|
||||
memset(&bl_state, 0, sizeof(bl_state));
|
||||
|
||||
leds = "/sys/class/leds";
|
||||
d = opendir(leds);
|
||||
if(d) {
|
||||
struct dirent *entry;
|
||||
while((entry = readdir(d)) != 0) {
|
||||
if(str_contains(entry->d_name, "kbd_backlight")) {
|
||||
static char read_buf[32];
|
||||
int fd;
|
||||
|
||||
snprintf(bl_entry, 1024,
|
||||
"%s/%s/brightness", leds, entry->d_name);
|
||||
|
||||
fd = open(bl_entry, O_RDWR);
|
||||
if(fd != -1) {
|
||||
if(kbl->available) {
|
||||
int read_amnt, s;
|
||||
char *endptr;
|
||||
long num;
|
||||
|
||||
static char read_buf[32];
|
||||
char *endptr;
|
||||
|
||||
read_amnt = 0;
|
||||
do {
|
||||
s = read(fd, read_buf+read_amnt, 32-read_amnt);
|
||||
s = read(kbl->fd, read_buf+read_amnt, 32-read_amnt);
|
||||
if(s == -1)
|
||||
break;
|
||||
read_amnt += s;
|
||||
@@ -674,12 +659,39 @@ static struct keyboard_backlight_state get_keyboard_backlight_state()
|
||||
|
||||
num = strtol(read_buf, &endptr, 10);
|
||||
if(!(errno == ERANGE || endptr == read_buf)) {
|
||||
bl_state.available = 1;
|
||||
bl_state.fd = fd;
|
||||
bl_state.brightness = num;
|
||||
return (int)num;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct keyboard_backlight init_keyboard_backlight()
|
||||
{
|
||||
|
||||
static char bl_entry[1024];
|
||||
char *leds;
|
||||
DIR *d;
|
||||
|
||||
struct keyboard_backlight kbl;
|
||||
memset(&kbl, 0, sizeof(kbl));
|
||||
|
||||
leds = "/sys/class/leds";
|
||||
d = opendir(leds);
|
||||
if(d) {
|
||||
struct dirent *entry;
|
||||
while((entry = readdir(d)) != 0) {
|
||||
if(str_contains(entry->d_name, "kbd_backlight")) {
|
||||
int fd;
|
||||
|
||||
snprintf(bl_entry, 1024,
|
||||
"%s/%s/brightness", leds, entry->d_name);
|
||||
|
||||
fd = open(bl_entry, O_RDWR);
|
||||
if(fd != -1) {
|
||||
kbl.available = 1;
|
||||
kbl.fd = fd;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -687,27 +699,20 @@ static struct keyboard_backlight_state get_keyboard_backlight_state()
|
||||
closedir(d);
|
||||
}
|
||||
|
||||
return bl_state;
|
||||
return kbl;
|
||||
}
|
||||
|
||||
static void
|
||||
reset_keyboard_backlight(struct keyboard_backlight_state *bl_state)
|
||||
set_keyboard_backlight(struct keyboard_backlight *kbl,
|
||||
int brightness)
|
||||
{
|
||||
#if !DEBUG
|
||||
static char buf[512];
|
||||
if(bl_state->available) {
|
||||
snprintf(buf, sizeof(buf), "%d\n", bl_state->brightness);
|
||||
write(bl_state->fd, buf, str_len(buf));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_keyboard_backlight_off(struct keyboard_backlight_state *bl_state)
|
||||
{
|
||||
if(bl_state->available) {
|
||||
char buf[512];
|
||||
snprintf(buf, sizeof(buf), "%d\n", 0);
|
||||
write(bl_state->fd, buf, str_len(buf));
|
||||
if(kbl->available) {
|
||||
snprintf(buf, sizeof(buf), "%d\n", brightness);
|
||||
write(kbl->fd, buf, str_len(buf));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void update_timerfd(int tfd)
|
||||
@@ -728,9 +733,9 @@ static void update_timerfd(int tfd)
|
||||
}
|
||||
|
||||
static void
|
||||
readpw(struct arena *arena,
|
||||
run_loop(struct arena *arena,
|
||||
Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
|
||||
const char *hash, struct keyboard_backlight_state *bl_state)
|
||||
const char *hash, struct keyboard_backlight *kbl)
|
||||
{
|
||||
XRRScreenChangeNotifyEvent *rre;
|
||||
char buf[32], passwd[256], *inputhash;
|
||||
@@ -743,6 +748,7 @@ readpw(struct arena *arena,
|
||||
unsigned long long rendering_timeout_millis;
|
||||
struct dpms_state dpms_state;
|
||||
struct fonts fonts;
|
||||
int kbl_brightness;
|
||||
int error;
|
||||
|
||||
int needs_rendering;
|
||||
@@ -760,8 +766,8 @@ readpw(struct arena *arena,
|
||||
tfd = timerfd_create(CLOCK_REALTIME, 0);
|
||||
|
||||
update_crtc_infos(dpy);
|
||||
|
||||
dpms_disable(dpy, &dpms_state);
|
||||
kbl_brightness = get_keyboard_backlight_brightness(kbl);
|
||||
|
||||
if(!load_fonts(&fonts))
|
||||
die("slock: load_fonts\n");
|
||||
@@ -910,10 +916,10 @@ readpw(struct arena *arena,
|
||||
|
||||
if(dson_saved != dson) {
|
||||
if(dson) {
|
||||
reset_keyboard_backlight(bl_state);
|
||||
set_keyboard_backlight(kbl, kbl_brightness);
|
||||
set_screen_on(dpy);
|
||||
} else {
|
||||
set_keyboard_backlight_off(bl_state);
|
||||
set_keyboard_backlight(kbl, 0);
|
||||
set_screen_off(dpy);
|
||||
}
|
||||
}
|
||||
@@ -945,7 +951,7 @@ readpw(struct arena *arena,
|
||||
if(ret == 0) {
|
||||
dson = 0;
|
||||
set_screen_off(dpy);
|
||||
set_keyboard_backlight_off(bl_state);
|
||||
set_keyboard_backlight(kbl, 0);
|
||||
} else if(ret > 0 && FD_ISSET(xfd, &fds)) {
|
||||
} else if(ret > 0 && FD_ISSET(tfd, &fds)) {
|
||||
}
|
||||
@@ -1121,8 +1127,7 @@ main(int argc, char **argv) {
|
||||
if (!DPMSQueryExtension(dpy, &event_base, &error_base))
|
||||
die("slock: dpms extension is not supported\n");
|
||||
|
||||
struct keyboard_backlight_state bl_state =
|
||||
get_keyboard_backlight_state();
|
||||
struct keyboard_backlight kbl = init_keyboard_backlight();
|
||||
|
||||
/* drop privileges */
|
||||
if (setgroups(0, NULL) < 0)
|
||||
@@ -1164,7 +1169,7 @@ main(int argc, char **argv) {
|
||||
|
||||
/* everything is now blank. Wait for the correct password */
|
||||
struct arena arena = arena_init(bf, GB(1));
|
||||
readpw(&arena, dpy, &rr, locks, nscreens, hash, &bl_state);
|
||||
run_loop(&arena, dpy, &rr, locks, nscreens, hash, &kbl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user