diff options
Diffstat (limited to 'cg-sleepmode.c')
-rw-r--r-- | cg-sleepmode.c | 534 |
1 files changed, 274 insertions, 260 deletions
diff --git a/cg-sleepmode.c b/cg-sleepmode.c index 67b5570..df50ffc 100644 --- a/cg-sleepmode.c +++ b/cg-sleepmode.c @@ -30,24 +30,24 @@ char default_class[] = PKGNAME "::cg-sleepmode::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; /** * -r: fade-out time for the red channel */ -static char* rflag; +static char *rflag; /** * -g: fade-out time for the green channel */ -static char* gflag; +static char *gflag; /** * -b: fade-out time for the blue channel */ -static char* bflag; +static char *bflag; /** * The duration, in seconds, of the red channel's fade out @@ -89,14 +89,15 @@ static volatile sig_atomic_t received_int = 0; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] [-p priority] " - "[-r red-fadeout-time] [-g green-fadeout-time] [-b blue-fadeout-time] " - "[red-luminosity [green-luminosity [blue-luminosity]]]\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] [-p priority] " + "[-r red-fadeout-time] [-g green-fadeout-time] [-b blue-fadeout-time] " + "[red-luminosity [green-luminosity [blue-luminosity]]]\n", + argv0); + exit(1); } @@ -106,10 +107,11 @@ void usage(void) * * @param signo The received signal */ -static void sig_int(int signo) +static void +sig_int(int signo) { - received_int = 1; - (void) signo; + received_int = 1; + (void) signo; } @@ -127,29 +129,30 @@ static void sig_int(int signo) * 1 if `arg` was used, * -1 on error */ -int handle_opt(char* opt, char* arg) +int +handle_opt(char *opt, char *arg) { - if (opt[0] == '-') - switch (opt[1]) - { - case 'r': - if (rflag || !(rflag = arg)) - usage(); - return 1; - case 'g': - if (gflag || !(gflag = arg)) - usage(); - return 1; - case 'b': - if (bflag || !(bflag = arg)) - usage(); - return 1; - default: - usage(); - } - else - usage(); - return 0; + if (opt[0] == '-') { + switch (opt[1]) { + case 'r': + if (rflag || !(rflag = arg)) + usage(); + return 1; + case 'g': + if (gflag || !(gflag = arg)) + usage(); + return 1; + case 'b': + if (bflag || !(bflag = arg)) + usage(); + return 1; + default: + usage(); + } + } else { + usage(); + } + return 0; } @@ -160,16 +163,17 @@ int handle_opt(char* opt, char* arg) * @param str The string * @return Zero on success, -1 if the string is invalid */ -static int parse_double(double* restrict out, const char* restrict str) +static int +parse_double(double *restrict out, const char *restrict str) { - char* end; - errno = 0; - *out = strtod(str, &end); - if (errno || (*out < 0) || isinf(*out) || isnan(*out) || *end) - return -1; - if (!*str || !strchr("0123456789.", *str)) - return -1; - return 0; + char *end; + errno = 0; + *out = strtod(str, &end); + if (errno || *out < 0 || isinf(*out) || isnan(*out) || *end) + return -1; + if (!*str || !strchr("0123456789.", *str)) + return -1; + return 0; } @@ -182,37 +186,32 @@ static int parse_double(double* restrict out, const char* restrict str) * @param prio The argument associated with the "-p" option * @return Zero on success, -1 on error */ -int handle_args(int argc, char* argv[], char* prio) +int +handle_args(int argc, char *argv[], char *prio) { - int q = (rflag || gflag || bflag || argc); - if ((q > 1) || (argc > 3)) - usage(); - if (rflag != NULL) - if (parse_double(&red_time, rflag) < 0) - usage(); - if (gflag != NULL) - if (parse_double(&green_time, gflag) < 0) - usage(); - if (bflag != NULL) - if (parse_double(&blue_time, bflag) < 0) - usage(); - if (argc >= 1) - if (parse_double(&red_target, argv[0]) < 0) - usage(); - if (argc >= 2) - if (parse_double(&green_target, argv[1]) < 0) - usage(); - if (argc >= 3) - if (parse_double(&blue_target, argv[2]) < 0) - usage(); - if (red_target >= 1) - red_time = 0; - if (green_target >= 1) - green_time = 0; - if (blue_target >= 1) - blue_time = 0; - return 0; - (void) prio; + int q = (rflag || gflag || bflag || argc); + if (q > 1 || argc > 3) + usage(); + if (rflag && parse_double(&red_time, rflag) < 0) + usage(); + if (gflag && parse_double(&green_time, gflag) < 0) + usage(); + if (bflag && parse_double(&blue_time, bflag) < 0) + usage(); + if (argc >= 1 && parse_double(&red_target, argv[0]) < 0) + usage(); + if (argc >= 2 && parse_double(&green_target, argv[1]) < 0) + usage(); + if (argc >= 3 && parse_double(&blue_target, argv[2]) < 0) + usage(); + if (red_target >= 1) + red_time = 0; + if (green_target >= 1) + green_time = 0; + if (blue_target >= 1) + blue_time = 0; + return 0; + (void) prio; } @@ -224,20 +223,20 @@ int handle_args(int argc, char* argv[], char* prio) * @param green The green brightness * @param blue The blue brightness */ -static void fill_filter(libcoopgamma_filter_t* restrict filter, double red, double green, double blue) +static void +fill_filter(libcoopgamma_filter_t *restrict filter, double red, double green, double blue) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libclut_start_over(&(filter->ramps.MEMBER), MAX, TYPE, 1, 1, 1);\ - libclut_rgb_brightness(&(filter->ramps.MEMBER), MAX, TYPE, red, green, blue);\ - break; -LIST_DEPTHS + case CONST:\ + libclut_start_over(&filter->ramps.MEMBER, MAX, TYPE, 1, 1, 1);\ + libclut_rgb_brightness(&filter->ramps.MEMBER, MAX, TYPE, red, green, blue);\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -247,18 +246,19 @@ LIST_DEPTHS * @param now Output parameter for the current time (monotonic) * @return Zero on success, -1 on error */ -static int double_time(double* restrict now) +static int +double_time(double *restrict now) { #ifndef CLOCK_MONOTONIC_RAW # define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC #endif - struct timespec ts; - if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) < 0) - return -1; - *now = (double)(ts.tv_nsec); - *now /= 1000000000L; - *now += (double)(ts.tv_sec); - return 0; + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) < 0) + return -1; + *now = (double)(ts.tv_nsec); + *now /= 1000000000L; + *now += (double)(ts.tv_sec); + return 0; } @@ -270,174 +270,188 @@ static int double_time(double* restrict now) * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r, fade_red, fade_green, fade_blue; - size_t i, j; - double t, starttime, red, green, blue, redt, greent, bluet; - - redt = (red_target - 1) / red_time; - greent = (green_target - 1) / green_time; - bluet = (blue_target - 1) / blue_time; - fade_red = !isinf(redt) && !isnan(redt); - fade_green = !isinf(greent) && !isnan(greent); - fade_blue = !isinf(bluet) && !isnan(bluet); - - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - - if ((r = make_slaves()) < 0) - return r; - - if ((r = double_time(&starttime)) < 0) - return r; - - red = red_target < 0 ? 0 : red_target > 1 ? 1 : red_target; - green = green_target < 0 ? 0 : green_target > 1 ? 1 : green_target; - blue = blue_target < 0 ? 0 : blue_target > 1 ? 1 : blue_target; - - for (;;) - { - if ((r = double_time(&t)) < 0) - return r; - t -= starttime; - if (fade_red) - {if (red = 1 + t * redt, red > 1) red = 1; else if (red < 0) red = 0;} - if (fade_green) - {if (green = 1 + t * greent, green > 1) green = 1; else if (green < 0) green = 0;} - if (fade_blue) - {if (blue = 1 + t * bluet, blue > 1) blue = 1; else if (blue < 0) blue = 0;} - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - fill_filter(&(crtc_updates[i].filter), red, green, blue); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return r; - if (crtc_updates[i].slaves != NULL) - for (j = 0; crtc_updates[i].slaves[j] != 0; j++) - { - r = update_filter(crtc_updates[i].slaves[j], 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return r; - } - } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return r; - - sched_yield(); - - if ((t >= red_time) && (t >= green_time) && (t >= blue_time)) - break; - } - - if ((signal(SIGINT, sig_int) == SIG_ERR) || - (signal(SIGTERM, sig_int) == SIG_ERR) || - (signal(SIGHUP, sig_int) == SIG_ERR)) - return -1; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - { - if (received_int) - goto fade_in; - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return 1; - } - } - - fade_in: - if (libcoopgamma_set_nonblocking(&cg, 1) < 0) - return -1; - - t = red_time; - t = t > green_time ? t : green_time; - t = t > blue_time ? t : blue_time; - redt = t - red_time; - greent = t - green_time; - bluet = t - blue_time; - t = red_time + green_time + blue_time; - if (red_time > 0) - t = t < red_time ? t : red_time; - if (green_time > 0) - t = t < green_time ? t : green_time; - if (blue_time > 0) - t = t < blue_time ? t : blue_time; - red_time = t + redt; - green_time = t + greent; - blue_time = t + bluet; - - red = green = blue = 1; - - if ((r = double_time(&starttime)) < 0) - return r; - - for (;;) - { - if ((r = double_time(&t)) < 0) - return r; - t -= starttime; - redt = t / red_time; - greent = t / green_time; - bluet = t / blue_time; - if (!isinf(redt) && !isnan(redt)) - { - red = red_target * (1 - redt) + redt; - if (red > 1) red = 1; else if (red < 0) red = 0; - } - if (!isinf(greent) && !isnan(greent)) - { - green = green_target * (1 - greent) + greent; - if (green > 1) green = 1; else if (green < 0) green = 0; + int r, fade_red, fade_green, fade_blue; + size_t i, j; + double t, starttime, red, green, blue, redt, greent, bluet; + + redt = (red_target - 1) / red_time; + greent = (green_target - 1) / green_time; + bluet = (blue_target - 1) / blue_time; + fade_red = !isinf(redt) && !isnan(redt); + fade_green = !isinf(greent) && !isnan(greent); + fade_blue = !isinf(bluet) && !isnan(bluet); + + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + + if ((r = make_slaves()) < 0) + return r; + + if ((r = double_time(&starttime)) < 0) + return r; + + red = red_target < 0 ? 0 : red_target > 1 ? 1 : red_target; + green = green_target < 0 ? 0 : green_target > 1 ? 1 : green_target; + blue = blue_target < 0 ? 0 : blue_target > 1 ? 1 : blue_target; + + for (;;) { + if ((r = double_time(&t)) < 0) + return r; + t -= starttime; + if (fade_red) { + red = 1 + t * redt; + if (red > 1) + red = 1; + else if (red < 0) + red = 0; + } + if (fade_green) { + green = 1 + t * greent; + if (green > 1) + green = 1; + else if (green < 0) + green = 0; + } + if (fade_blue) { + blue = 1 + t * bluet; + if (blue > 1) + blue = 1; + else if (blue < 0) + blue = 0; + } + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + fill_filter(&crtc_updates[i].filter, red, green, blue); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return r; + if (crtc_updates[i].slaves) + for (j = 0; crtc_updates[i].slaves[j]; j++) { + r = update_filter(crtc_updates[i].slaves[j], 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return r; + } + } + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + sched_yield(); + + if (t >= red_time && t >= green_time && t >= blue_time) + break; } - if (!isinf(bluet) && !isnan(bluet)) - { - blue = blue_target * (1 - bluet) + bluet; - if (blue > 1) blue = 1; else if (blue < 0) blue = 0; + + if (signal(SIGINT, sig_int) == SIG_ERR || + signal(SIGTERM, sig_int) == SIG_ERR || + signal(SIGHUP, sig_int) == SIG_ERR) + return -1; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + if (received_int) + goto fade_in; + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return 1; + } + } } - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - fill_filter(&(crtc_updates[i].filter), red, green, blue); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return r; - if (crtc_updates[i].slaves != NULL) - for (j = 0; crtc_updates[i].slaves[j] != 0; j++) - { - r = update_filter(crtc_updates[i].slaves[j], 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return r; - } + +fade_in: + if (libcoopgamma_set_nonblocking(&cg, 1) < 0) + return -1; + + t = red_time; + t = t > green_time ? t : green_time; + t = t > blue_time ? t : blue_time; + redt = t - red_time; + greent = t - green_time; + bluet = t - blue_time; + t = red_time + green_time + blue_time; + if (red_time > 0) + t = t < red_time ? t : red_time; + if (green_time > 0) + t = t < green_time ? t : green_time; + if (blue_time > 0) + t = t < blue_time ? t : blue_time; + red_time = t + redt; + green_time = t + greent; + blue_time = t + bluet; + + red = green = blue = 1; + + if ((r = double_time(&starttime)) < 0) + return r; + + for (;;) { + if ((r = double_time(&t)) < 0) + return r; + t -= starttime; + redt = t / red_time; + greent = t / green_time; + bluet = t / blue_time; + if (!isinf(redt) && !isnan(redt)) { + red = red_target * (1 - redt) + redt; + if (red > 1) + red = 1; + else if (red < 0) + red = 0; + } + if (!isinf(greent) && !isnan(greent)) { + green = green_target * (1 - greent) + greent; + if (green > 1) + green = 1; + else if (green < 0) + green = 0; + } + if (!isinf(bluet) && !isnan(bluet)) { + blue = blue_target * (1 - bluet) + bluet; + if (blue > 1) + blue = 1; + else if (blue < 0) + blue = 0; + } + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + fill_filter(&crtc_updates[i].filter, red, green, blue); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return r; + if (crtc_updates[i].slaves) { + for (j = 0; crtc_updates[i].slaves[j]; j++) { + r = update_filter(crtc_updates[i].slaves[j], 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return r; + } + } + } + + while (r != 1 && (r = synchronise(-1)) < 0) + return r; + + sched_yield(); + + if (t >= red_time && t >= green_time && t >= blue_time) + break; } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return r; - - sched_yield(); - - if ((t >= red_time) && (t >= green_time) && (t >= blue_time)) - break; - } - - return 0; - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + + return 0; +enotrecoverable: + pause(); + return -1; } |