diff options
Diffstat (limited to '')
-rw-r--r-- | cg-base.c | 1303 | ||||
-rw-r--r-- | cg-base.h | 124 | ||||
-rw-r--r-- | cg-brilliance.c | 332 | ||||
-rw-r--r-- | cg-darkroom.c | 357 | ||||
-rw-r--r-- | cg-gamma.c | 662 | ||||
-rw-r--r-- | cg-icc.c | 1271 | ||||
-rw-r--r-- | cg-limits.c | 896 | ||||
-rw-r--r-- | cg-linear.c | 273 | ||||
-rw-r--r-- | cg-negative.c | 245 | ||||
-rw-r--r-- | cg-query.c | 734 | ||||
-rw-r--r-- | cg-rainbow.c | 251 | ||||
-rw-r--r-- | cg-remove.c | 564 | ||||
-rw-r--r-- | cg-shallow.c | 271 | ||||
-rw-r--r-- | cg-sleepmode.c | 534 | ||||
-rw-r--r-- | config.mk | 4 |
15 files changed, 3887 insertions, 3934 deletions
@@ -17,7 +17,7 @@ /** * The process's name */ -const char* argv0 = NULL; +const char *argv0 = NULL; /** * The libcoopgamma context @@ -27,18 +27,18 @@ libcoopgamma_context_t cg; /** * The names of the selected CRTC:s */ -char** crtcs = NULL; +char **crtcs = NULL; /** * Gamma ramp updates for each CRTC */ -filter_update_t* crtc_updates = NULL; +filter_update_t *crtc_updates = NULL; /** * CRTC and monitor information about * each selected CRTC and connect monitor */ -libcoopgamma_crtc_info_t* crtc_info = NULL; +libcoopgamma_crtc_info_t *crtc_info = NULL; /** * The number of selected CRTC:s @@ -54,7 +54,7 @@ size_t filters_n = 0; /** * Contexts for asynchronous ramp updates */ -static libcoopgamma_async_context_t* asyncs = NULL; +static libcoopgamma_async_context_t *asyncs = NULL; /** * The number of pending receives @@ -73,35 +73,35 @@ static int flush_pending = 0; */ struct crtc_sort_data { - /** - * The gamma ramp type - */ - libcoopgamma_depth_t depth; - - /** - * Should be 0 - */ - int __padding; - - /** - * The size of the red gamma ramp - */ - size_t red_size; - - /** - * The size of the green gamma ramp - */ - size_t green_size; - - /** - * The size of the blue gamma ramp - */ - size_t blue_size; - - /** - * The index of the CRTC - */ - size_t index; + /** + * The gamma ramp type + */ + libcoopgamma_depth_t depth; + + /** + * Should be 0 + */ + int __padding; + + /** + * The size of the red gamma ramp + */ + size_t red_size; + + /** + * The size of the green gamma ramp + */ + size_t green_size; + + /** + * The size of the blue gamma ramp + */ + size_t blue_size; + + /** + * The index of the CRTC + */ + size_t index; }; @@ -113,9 +113,10 @@ struct crtc_sort_data * @param b Return +1 if this string is less than `a` * @return See `a` and `b`, 0 is returned if `a` and `b` are equal */ -static int nulstrcmp(const char *a, const char *b) +static int +nulstrcmp(const char *a, const char *b) { - return (a == NULL) ? -1 : strcmp(a, b); + return !a ? -1 : strcmp(a, b); } @@ -126,12 +127,13 @@ static int nulstrcmp(const char *a, const char *b) * @param b_ Return +1 if this one is higher * @return See `a_` and `b_`, only -1 or +1 can be returned */ -static int crtc_sort_data_cmp(const void* a_, const void* b_) +static int +crtc_sort_data_cmp(const void *a_, const void *b_) { - const struct crtc_sort_data* a = a_; - const struct crtc_sort_data* b = b_; - int cmp = memcmp(a, b, sizeof(*a) - sizeof(a->index)); - return cmp ? cmp : a->index < b->index ? -1 : +1; + const struct crtc_sort_data *a = a_; + const struct crtc_sort_data *b = b_; + int cmp = memcmp(a, b, sizeof(*a) - sizeof(a->index)); + return cmp ? cmp : a->index < b->index ? -1 : +1; } @@ -140,62 +142,58 @@ static int crtc_sort_data_cmp(const void* a_, const void* b_) * * @return Zero on success, -1 on error */ -int make_slaves(void) +int +make_slaves(void) { - struct crtc_sort_data* data; - size_t i, j, n = 0, master = 0, master_i; - - data = alloca(filters_n * sizeof(*data)); - memset(data, 0, filters_n * sizeof(*data)); - for (i = 0; i < filters_n; i++) - { - if (!(crtc_info[crtc_updates[i].crtc].supported)) - continue; - - data[n].depth = crtc_updates[i].filter.depth; - data[n].red_size = crtc_updates[i].filter.ramps.u8.red_size; - data[n].green_size = crtc_updates[i].filter.ramps.u8.green_size; - data[n].blue_size = crtc_updates[i].filter.ramps.u8.blue_size; - data[n].index = i; - n++; - } - - qsort(data, n, sizeof(*data), crtc_sort_data_cmp); - if (n == 0) - return 0; - - master_i = data[0].index; - for (i = 1; i < n; i++) - if (memcmp(data + i, data + master, sizeof(*data) - sizeof(data->index))) - { - if (master + 1 < i) - { - crtc_updates[master_i].slaves = calloc(i - master, sizeof(size_t)); - if (crtc_updates[master_i].slaves == NULL) - return -1; - for (j = 1; master + j < i; j++) - crtc_updates[master_i].slaves[j - 1] = data[master + j].index; - } - master = i; - master_i = data[master].index; - } - else - { - libcoopgamma_ramps_destroy(&(crtc_updates[data[i].index].filter.ramps.u8)); - crtc_updates[data[i].index].master = 0; - crtc_updates[data[i].index].filter.ramps.u8 = crtc_updates[master_i].filter.ramps.u8; - } - - if (master + 1 < i) - { - crtc_updates[master_i].slaves = calloc(i - master, sizeof(size_t)); - if (crtc_updates[master_i].slaves == NULL) - return -1; - for (j = 1; master + j < i; j++) - crtc_updates[master_i].slaves[j - 1] = data[master + j].index; - } - - return 0; + struct crtc_sort_data *data; + size_t i, j, n = 0, master = 0, master_i; + + data = alloca(filters_n * sizeof(*data)); + memset(data, 0, filters_n * sizeof(*data)); + for (i = 0; i < filters_n; i++) { + if (!crtc_info[crtc_updates[i].crtc].supported) + continue; + + data[n].depth = crtc_updates[i].filter.depth; + data[n].red_size = crtc_updates[i].filter.ramps.u8.red_size; + data[n].green_size = crtc_updates[i].filter.ramps.u8.green_size; + data[n].blue_size = crtc_updates[i].filter.ramps.u8.blue_size; + data[n].index = i; + n++; + } + + qsort(data, n, sizeof(*data), crtc_sort_data_cmp); + if (!n) + return 0; + + master_i = data[0].index; + for (i = 1; i < n; i++) { + if (memcmp(data + i, data + master, sizeof(*data) - sizeof(data->index))) { + if (master + 1 < i) { + crtc_updates[master_i].slaves = calloc(i - master, sizeof(size_t)); + if (!crtc_updates[master_i].slaves) + return -1; + for (j = 1; master + j < i; j++) + crtc_updates[master_i].slaves[j - 1] = data[master + j].index; + } + master = i; + master_i = data[master].index; + } else { + libcoopgamma_ramps_destroy(&crtc_updates[data[i].index].filter.ramps.u8); + crtc_updates[data[i].index].master = 0; + crtc_updates[data[i].index].filter.ramps.u8 = crtc_updates[master_i].filter.ramps.u8; + } + } + + if (master + 1 < i) { + crtc_updates[master_i].slaves = calloc(i - master, sizeof(size_t)); + if (!crtc_updates[master_i].slaves) + return -1; + for (j = 1; master + j < i; j++) + crtc_updates[master_i].slaves[j - 1] = data[master + j].index; + } + + return 0; } @@ -213,31 +211,32 @@ int make_slaves(void) * @throws EINTR Call to `poll` was interrupted by a signal * @throws EAGAIN Call to `poll` timed out */ -int update_filter(size_t index, int timeout) +int +update_filter(size_t index, int timeout) { - filter_update_t* filter = crtc_updates + index; - - if (!(filter->synced) || filter->failed) - abort(); - - pending_recvs += 1; - - if (libcoopgamma_set_gamma_send(&(filter->filter), &cg, asyncs + index) < 0) - switch (errno) - { - case EINTR: - case EAGAIN: + filter_update_t *filter = crtc_updates + index; + + if (!filter->synced || filter->failed) + abort(); + + pending_recvs += 1; + + if (libcoopgamma_set_gamma_send(&filter->filter, &cg, asyncs + index) < 0) { + switch (errno) { + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - flush_pending = 1; - break; - default: - return -1; - } + flush_pending = 1; + break; + default: + return -1; + } + } - filter->synced = 0; - return synchronise(timeout); + filter->synced = 0; + return synchronise(timeout); } @@ -254,78 +253,73 @@ int update_filter(size_t index, int timeout) * @throws EINTR Call to `poll` was interrupted by a signal * @throws EAGAIN Call to `poll` timed out */ -int synchronise(int timeout) +int +synchronise(int timeout) { - struct pollfd pollfd; - size_t selected; - - pollfd.fd = cg.fd; - pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; - if (flush_pending > 0) - pollfd.events |= POLLOUT; - - pollfd.revents = 0; - if (poll(&pollfd, (nfds_t)1, timeout) < 0) - return -1; - - if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) - { - if (libcoopgamma_flush(&cg) < 0) - goto sync; - flush_pending = 0; - } - - if ((timeout < 0) && (pending_recvs > 0)) - if (!(pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI))) - { + struct pollfd pollfd; + size_t selected; + + pollfd.fd = cg.fd; + pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; + if (flush_pending > 0) + pollfd.events |= POLLOUT; + pollfd.revents = 0; - if (poll(&pollfd, (nfds_t)1, -1) < 0) - return -1; - } - + if (poll(&pollfd, (nfds_t)1, timeout) < 0) + return -1; + + if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) { + if (libcoopgamma_flush(&cg) < 0) + goto sync; + flush_pending = 0; + } + + if (timeout < 0 && pending_recvs > 0) { + if (!(pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI))) { + pollfd.revents = 0; + if (poll(&pollfd, (nfds_t)1, -1) < 0) + return -1; + } + } + sync: - if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI | POLLERR | POLLHUP | POLLNVAL)) - for (;;) - { - if (libcoopgamma_synchronise(&cg, asyncs, filters_n, &selected) < 0) - { - if (errno == 0) - continue; - else - goto fail; - } - if (crtc_updates[selected].synced) - continue; - crtc_updates[selected].synced = 1; - pending_recvs -= 1; - if (libcoopgamma_set_gamma_recv(&cg, asyncs + selected) < 0) - { - if (cg.error.server_side) - { - crtc_updates[selected].error = cg.error; - crtc_updates[selected].failed = 1; - memset(&(cg.error), 0, sizeof(cg.error)); - } - else - goto cg_fail; - } - } - - return pending_recvs == 0; - cg_fail: - return -2; - fail: - switch (errno) - { - case EINTR: - case EAGAIN: + if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI | POLLERR | POLLHUP | POLLNVAL)) { + for (;;) { + if (libcoopgamma_synchronise(&cg, asyncs, filters_n, &selected) < 0) { + if (!errno) + continue; + goto fail; + } + if (crtc_updates[selected].synced) + continue; + crtc_updates[selected].synced = 1; + pending_recvs -= 1; + if (libcoopgamma_set_gamma_recv(&cg, asyncs + selected) < 0) { + if (cg.error.server_side) { + crtc_updates[selected].error = cg.error; + crtc_updates[selected].failed = 1; + memset(&cg.error, 0, sizeof(cg.error)); + } else { + goto cg_fail; + } + } + } + } + + return !pending_recvs; +cg_fail: + return -2; +fail: + switch (errno) { + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - return pending_recvs == 0; - default: - return -1; - } + return !pending_recvs; + default: + return -1; + } } @@ -335,22 +329,23 @@ int synchronise(int timeout) * * @return Zero on success, -1 on error */ -static int initialise_proc(void) +static int +initialise_proc(void) { - sigset_t sigmask; - int sig; - - for (sig = 1; sig < _NSIG; sig++) - if (signal(sig, SIG_DFL) == SIG_ERR) - if (sig == SIGCHLD) - return -1; - - if (sigemptyset(&sigmask) < 0) - return -1; - if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) - return -1; - - return 0; + sigset_t sigmask; + int sig; + + for (sig = 1; sig < _NSIG; sig++) + if (signal(sig, SIG_DFL) == SIG_ERR) + if (sig == SIGCHLD) + return -1; + + if (sigemptyset(&sigmask) < 0) + return -1; + if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) + return -1; + + return 0; } @@ -360,21 +355,22 @@ static int initialise_proc(void) * * @return Zero on success, -1 on error */ -static int list_methods(void) +static int +list_methods(void) { - char** list; - size_t i; - - list = libcoopgamma_get_methods(); - if (list == NULL) - return -1; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_methods(); + if (!list) + return -1; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -387,21 +383,22 @@ static int list_methods(void) * @return Zero on success, -1 on error, -2 * on libcoopgamma error */ -static int list_crtcs(void) +static int +list_crtcs(void) { - char** list; - size_t i; - - list = libcoopgamma_get_crtcs_sync(&cg); - if (list == NULL) - return -2; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_crtcs_sync(&cg); + if (!list) + return -2; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -411,99 +408,97 @@ static int list_crtcs(void) * @return Zero on success, -1 on error, -2 * on libcoopgamma error */ -static int get_crtc_info(void) +static int +get_crtc_info(void) { - size_t i, unsynced = 0, selected; - char* synced; - int need_flush = 0; - struct pollfd pollfd; - - synced = alloca(crtcs_n * sizeof(*synced)); - memset(synced, 0, crtcs_n * sizeof(*synced)); - - i = 0; - pollfd.fd = cg.fd; - pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; - - while ((unsynced > 0) || (i < crtcs_n)) - { - wait: - if (i < crtcs_n) - pollfd.events |= POLLOUT; - else - pollfd.events &= ~POLLOUT; + size_t i, unsynced = 0, selected; + char *synced; + int need_flush = 0; + struct pollfd pollfd; + + synced = alloca(crtcs_n * sizeof(*synced)); + memset(synced, 0, crtcs_n * sizeof(*synced)); + + i = 0; + pollfd.fd = cg.fd; + pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; + + while (unsynced > 0 || i < crtcs_n) { + wait: + if (i < crtcs_n) + pollfd.events |= POLLOUT; + else + pollfd.events &= ~POLLOUT; - pollfd.revents = 0; - if (poll(&pollfd, (nfds_t)1, -1) < 0) - goto fail; + pollfd.revents = 0; + if (poll(&pollfd, (nfds_t)1, -1) < 0) + goto fail; - if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) - { - if (need_flush && (libcoopgamma_flush(&cg) < 0)) - goto send_fail; - need_flush = 0; - for (; i < crtcs_n; i++) - if (unsynced++, libcoopgamma_get_gamma_info_send(crtcs[i], &cg, asyncs + i) < 0) - goto send_fail; - goto send_done; - send_fail: - switch (errno) - { - case EINTR: - case EAGAIN: + if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) { + if (need_flush && (libcoopgamma_flush(&cg) < 0)) + goto send_fail; + need_flush = 0; + for (; i < crtcs_n; i++) + if (unsynced++, libcoopgamma_get_gamma_info_send(crtcs[i], &cg, asyncs + i) < 0) + goto send_fail; + goto send_done; + send_fail: + switch (errno) { + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - i++; - need_flush = 1; - break; - default: - goto fail; - } - } - send_done: - - if ((unsynced == 0) && (i == crtcs_n)) - break; - - if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)) - while (unsynced > 0) - switch (libcoopgamma_synchronise(&cg, asyncs, i, &selected)) - { - case 0: - if (synced[selected]) - { - libcoopgamma_skip_message(&cg); - break; + i++; + need_flush = 1; + break; + default: + goto fail; + } } - synced[selected] = 1; - unsynced -= 1; - if (libcoopgamma_get_gamma_info_recv(crtc_info + selected, &cg, asyncs + selected) < 0) - goto cg_fail; - break; - case -1: - switch (errno) - { - case 0: - break; - case EINTR: - case EAGAIN: + send_done: + + if (!unsynced && i == crtcs_n) + break; + + if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)) { + while (unsynced > 0) { + switch (libcoopgamma_synchronise(&cg, asyncs, i, &selected)) { + case 0: + if (synced[selected]) { + libcoopgamma_skip_message(&cg); + break; + } + synced[selected] = 1; + unsynced -= 1; + if (libcoopgamma_get_gamma_info_recv(crtc_info + selected, &cg, asyncs + selected) < 0) + goto cg_fail; + break; + case -1: + switch (errno) + { + case 0: + break; + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - goto wait; - default: - goto fail; + goto wait; + default: + goto fail; + } + break; + } + } } - break; - } - } - - return 0; - fail: - return -1; - cg_fail: - return -2; + } + + return 0; +fail: + return -1; +cg_fail: + return -2; } @@ -539,372 +534,342 @@ static int get_crtc_info(void) * @param argv The command line arguments * @return 0 on success, 1 on error */ -int main(int argc, char* argv[]) +int +main(int argc, char *argv[]) { - int stage = 0; - int dealloc_crtcs = 0; - int rc = 0; - char* method = NULL; - char* site = NULL; - size_t crtc_i = 0; - int64_t priority = default_priority; - char* prio = NULL; - char* rule = NULL; - char* class = default_class; - char** classes = NULL; - size_t classes_n = 0; - int explicit_crtcs = 0; - int have_crtc_q = 0; - size_t i, filter_i; - - argv0 = *argv++, argc--; - - if (initialise_proc() < 0) - goto fail; - - crtcs = alloca(argc * sizeof(*crtcs)); - - for (; *argv; argv++, argc--) - { - char* args = *argv; - char opt[3]; - if (!strcmp(args, "--")) - { - argv++, argc--; - break; + int stage = 0; + int dealloc_crtcs = 0; + int rc = 0; + char *method = NULL; + char *site = NULL; + size_t crtc_i = 0; + int64_t priority = default_priority; + char *prio = NULL; + char *rule = NULL; + char *class = default_class; + char **classes = NULL; + size_t classes_n = 0; + int explicit_crtcs = 0; + int have_crtc_q = 0; + size_t i, filter_i; + const char *side, *crtc; + size_t len, n; + char *args, *arg, *end, *p, opt[3]; + int at_end; + + argv0 = *argv++, argc--; + + if (initialise_proc() < 0) + goto fail; + + crtcs = alloca((size_t)argc * sizeof(*crtcs)); + + for (; *argv; argv++, argc--) { + args = *argv; + if (!strcmp(args, "--")) { + argv++, argc--; + break; + } + opt[0] = *args++; + opt[2] = '\0'; + if ((*opt != '-') && (*opt != '+')) + break; + while (*args) { + opt[1] = *args++; + arg = args; + if ((at_end = !*arg)) + arg = argv[1]; + if (!strcmp(opt, "-M")) { + if (method || !(method = arg)) + usage(); + } else if (!strcmp(opt, "-S")) { + if (site || !(site = arg)) + usage(); + } else if (!strcmp(opt, "-c")) { + if (!arg) + usage(); + crtcs[crtc_i++] = arg; + explicit_crtcs = 1; + if (!have_crtc_q && !strcmp(arg, "?")) + have_crtc_q = 1; + } else if (!strcmp(opt, "-p")) { + if (prio || !(prio = arg)) + usage(); + } else if (!strcmp(opt, "-R")) { + if (rule || !(rule = arg)) + usage(); + } else { + switch (handle_opt(opt, arg)) { + case 0: + goto next_opt; + case 1: + break; + default: + goto fail; + } + } + argv += at_end; + argc -= at_end; + break; + next_opt:; + } } - opt[0] = *args++; - opt[2] = '\0'; - if ((*opt != '-') && (*opt != '+')) - break; - while (*args) - { - char* arg; - int at_end; - opt[1] = *args++; - arg = args; - if ((at_end = !*arg)) - arg = argv[1]; - if (!strcmp(opt, "-M")) - { - if ((method != NULL) || ((method = arg) == NULL)) - usage(); - } - else if (!strcmp(opt, "-S")) - { - if ((site != NULL) || ((site = arg) == NULL)) - usage(); - } - else if (!strcmp(opt, "-c")) - { - if (arg == NULL) - usage(); - crtcs[crtc_i++] = arg; - explicit_crtcs = 1; - if (!have_crtc_q && !strcmp(arg, "?")) - have_crtc_q = 1; - } - else if (!strcmp(opt, "-p")) - { - if ((prio != NULL) || ((prio = arg) == NULL)) - usage(); - } - else if (!strcmp(opt, "-R")) - { - if ((rule != NULL) || ((rule = arg) == NULL)) - usage(); - } - else - switch (handle_opt(opt, arg)) - { - case 0: - goto next_opt; - case 1: - break; - default: + + crtcs_n = crtc_i; + crtcs[crtc_i] = NULL; + if (!have_crtc_q && nulstrcmp(method, "?") && + nulstrcmp(rule, "?") && nulstrcmp(rule, "??") && + (default_priority == NO_DEFAULT_PRIORITY || nulstrcmp(prio, "?"))) + if (handle_args(argc, argv, prio) < 0) + goto fail; + + if (default_priority != NO_DEFAULT_PRIORITY) { + if (!nulstrcmp(prio, "?")) { + printf("%" PRIi64 "\n", priority); + return 0; + } else if (prio) { + errno = 0; + priority = (int64_t)strtoll(prio, &end, 10); + if (errno || *end || !*prio) + usage(); + } + } + + if (!nulstrcmp(rule, "??")) { + if (!*class_suffixes) + printf("%s\n", class); + else + for (i = 0; class_suffixes[i]; i++) + printf("%s%s\n", class, class_suffixes[i]); + return 0; + } else if (!nulstrcmp(rule, "?")) { + printf("%s\n", strstr(strstr(class, "::") + 2, "::") + 2); + return 0; + } else if (rule) { + p = strstr(strstr(class, "::") + 2, "::") + 2; + n = (size_t)(p - class); + class = alloca(strlen(rule) + n + (size_t)1); + memcpy(class, default_class, n); + strcpy(class + n, rule); + if (strchr(class, '\n')) { + fprintf(stderr, "%s: LF character is not allowed in the filter's class\n", argv0); + goto custom_fail; + } + } + + if (!nulstrcmp(method, "?")) { + if (list_methods() < 0) + goto fail; + return 0; + } + + if (libcoopgamma_context_initialise(&cg) < 0) goto fail; - } - argv += at_end; - argc -= at_end; - break; - next_opt:; + stage++; + if (libcoopgamma_connect(method, site, &cg) < 0) { + fprintf(stderr, "%s: server failed to initialise\n", argv0); + goto custom_fail; } - } - - crtcs_n = crtc_i; - crtcs[crtc_i] = NULL; - if (!have_crtc_q && nulstrcmp(method, "?") && - nulstrcmp(rule, "?") && nulstrcmp(rule, "??") && - ((default_priority == NO_DEFAULT_PRIORITY) || nulstrcmp(prio, "?"))) - if (handle_args(argc, argv, prio) < 0) - goto fail; - - if (default_priority != NO_DEFAULT_PRIORITY) - { - if (!nulstrcmp(prio, "?")) - { - printf("%" PRIi64 "\n", priority); - return 0; + stage++; + + if (have_crtc_q) { + switch (list_crtcs()) { + case 0: + goto done; + case -1: + goto fail; + default: + goto cg_fail; + } } - else if (prio != NULL) - { - char *end; - errno = 0; - priority = (int64_t)strtoll(prio, &end, 10); - if (errno || *end || !*prio) - usage(); + + if (!crtcs_n) { + crtcs = libcoopgamma_get_crtcs_sync(&cg); + if (!crtcs) + goto cg_fail; + dealloc_crtcs = 1; + for (; crtcs[crtcs_n]; crtcs_n++); } - } - - if (!nulstrcmp(rule, "??")) - { - size_t i; - if (*class_suffixes == NULL) - printf("%s\n", class); - else - for (i = 0; class_suffixes[i] != NULL; i++) - printf("%s%s\n", class, class_suffixes[i]); - return 0; - } - else if (!nulstrcmp(rule, "?")) - { - printf("%s\n", strstr(strstr(class, "::") + 2, "::") + 2); - return 0; - } - else if (rule != NULL) - { - char* p = strstr(strstr(class, "::") + 2, "::") + 2; - size_t n = (size_t)(p - class); - class = alloca(strlen(rule) + n + (size_t)1); - memcpy(class, default_class, n); - strcpy(class + n, rule); - if (strchr(class, '\n')) - { - fprintf(stderr, "%s: LF character is not allowed in the filter's class\n", argv0); - goto custom_fail; + + if (!crtcs_n) { + fprintf(stderr, "%s: no CRTC:s are available\n", argv0); + goto custom_fail; } - } - - if (!nulstrcmp(method, "?")) - { - if (list_methods() < 0) - goto fail; - return 0; - } - - if (libcoopgamma_context_initialise(&cg) < 0) - goto fail; - stage++; - if (libcoopgamma_connect(method, site, &cg) < 0) - { - fprintf(stderr, "%s: server failed to initialise\n", argv0); - goto custom_fail; - } - stage++; - - if (have_crtc_q) - switch (list_crtcs()) - { - case 0: - goto done; - case -1: - goto fail; - default: - goto cg_fail; - } - - if (crtcs_n == 0) - { - crtcs = libcoopgamma_get_crtcs_sync(&cg); - if (crtcs == NULL) - goto cg_fail; - dealloc_crtcs = 1; - for (; crtcs[crtcs_n] != NULL; crtcs_n++); - } - - if (crtcs_n == 0) - { - fprintf(stderr, "%s: no CRTC:s are available\n", argv0); - goto custom_fail; - } - - if (*class_suffixes == NULL) - { - classes = &class; - classes_n = 1; - } - else - { - size_t len = strlen(class); - while (class_suffixes[classes_n]) - classes_n++; - classes = alloca(classes_n * sizeof(*classes)); - for (i = 0; i < classes_n; i++) - { - classes[i] = alloca(len + strlen(class_suffixes[i]) + sizeof(":")); - stpcpy(stpcpy(stpcpy(classes[i], class), ":"), class_suffixes[i]); + + if (!*class_suffixes) { + classes = &class; + classes_n = 1; + } else { + len = strlen(class); + while (class_suffixes[classes_n]) + classes_n++; + classes = alloca(classes_n * sizeof(*classes)); + for (i = 0; i < classes_n; i++) { + classes[i] = alloca(len + strlen(class_suffixes[i]) + sizeof(":")); + stpcpy(stpcpy(stpcpy(classes[i], class), ":"), class_suffixes[i]); + } } - } - filters_n = classes_n * crtcs_n; - - crtc_info = alloca(crtcs_n * sizeof(*crtc_info)); - memset(crtc_info, 0, crtcs_n * sizeof(*crtc_info)); - for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) - if (libcoopgamma_crtc_info_initialise(crtc_info + crtc_i) < 0) - goto cg_fail; - - if (libcoopgamma_set_nonblocking(&cg, 1) < 0) - goto fail; - - asyncs = alloca(filters_n * sizeof(*asyncs)); - memset(asyncs, 0, filters_n * sizeof(*asyncs)); - for (filter_i = 0; filter_i < filters_n; filter_i++) - if (libcoopgamma_async_context_initialise(asyncs + filter_i) < 0) - goto fail; - - switch (get_crtc_info()) - { - case 0: - break; - case -1: - goto fail; - case -2: - goto cg_fail; - } - - for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) - { - if (explicit_crtcs && !(crtc_info[crtc_i].supported)) - fprintf(stderr, "%s: warning: gamma adjustments not supported on CRTC: %s\n", - argv0, crtcs[crtc_i]); - if (crtc_info[crtc_i].cooperative == 0) - fprintf(stderr, "%s: warning: cooperative gamma server not running for CRTC: %s\n", - argv0, crtcs[crtc_i]); - } - - crtc_updates = alloca(filters_n * sizeof(*crtc_updates)); - memset(crtc_updates, 0, filters_n * sizeof(*crtc_updates)); - for (filter_i = i = 0; i < classes_n; i++) - for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++, filter_i++) - { - if (libcoopgamma_filter_initialise(&(crtc_updates[filter_i].filter)) < 0) - goto fail; - if (libcoopgamma_error_initialise(&(crtc_updates[filter_i].error)) < 0) - goto fail; - crtc_updates[filter_i].crtc = crtc_i; - crtc_updates[filter_i].synced = 1; - crtc_updates[filter_i].failed = 0; - crtc_updates[filter_i].master = 1; - crtc_updates[filter_i].slaves = NULL; - crtc_updates[filter_i].filter.crtc = crtcs[crtc_i]; - crtc_updates[filter_i].filter.class = classes[i]; - crtc_updates[filter_i].filter.priority = priority; - crtc_updates[filter_i].filter.depth = crtc_info[crtc_i].depth; - crtc_updates[filter_i].filter.ramps.u8.red_size = crtc_info[crtc_i].red_size; - crtc_updates[filter_i].filter.ramps.u8.green_size = crtc_info[crtc_i].green_size; - crtc_updates[filter_i].filter.ramps.u8.blue_size = crtc_info[crtc_i].blue_size; - switch (crtc_updates[filter_i].filter.depth) - { + filters_n = classes_n * crtcs_n; + + crtc_info = alloca(crtcs_n * sizeof(*crtc_info)); + memset(crtc_info, 0, crtcs_n * sizeof(*crtc_info)); + for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) + if (libcoopgamma_crtc_info_initialise(crtc_info + crtc_i) < 0) + goto cg_fail; + + if (libcoopgamma_set_nonblocking(&cg, 1) < 0) + goto fail; + + asyncs = alloca(filters_n * sizeof(*asyncs)); + memset(asyncs, 0, filters_n * sizeof(*asyncs)); + for (filter_i = 0; filter_i < filters_n; filter_i++) + if (libcoopgamma_async_context_initialise(asyncs + filter_i) < 0) + goto fail; + + switch (get_crtc_info()) { + case 0: + break; + case -1: + goto fail; + case -2: + goto cg_fail; + } + + for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) { + if (explicit_crtcs && !crtc_info[crtc_i].supported) { + fprintf(stderr, "%s: warning: gamma adjustments not supported on CRTC: %s\n", + argv0, crtcs[crtc_i]); + } + if (!crtc_info[crtc_i].cooperative) { + fprintf(stderr, "%s: warning: cooperative gamma server not running for CRTC: %s\n", + argv0, crtcs[crtc_i]); + } + } + + crtc_updates = alloca(filters_n * sizeof(*crtc_updates)); + memset(crtc_updates, 0, filters_n * sizeof(*crtc_updates)); + for (filter_i = i = 0; i < classes_n; i++) { + for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++, filter_i++) { + if (libcoopgamma_filter_initialise(&crtc_updates[filter_i].filter) < 0) + goto fail; + if (libcoopgamma_error_initialise(&crtc_updates[filter_i].error) < 0) + goto fail; + crtc_updates[filter_i].crtc = crtc_i; + crtc_updates[filter_i].synced = 1; + crtc_updates[filter_i].failed = 0; + crtc_updates[filter_i].master = 1; + crtc_updates[filter_i].slaves = NULL; + crtc_updates[filter_i].filter.crtc = crtcs[crtc_i]; + crtc_updates[filter_i].filter.class = classes[i]; + crtc_updates[filter_i].filter.priority = priority; + crtc_updates[filter_i].filter.depth = crtc_info[crtc_i].depth; + crtc_updates[filter_i].filter.ramps.u8.red_size = crtc_info[crtc_i].red_size; + crtc_updates[filter_i].filter.ramps.u8.green_size = crtc_info[crtc_i].green_size; + crtc_updates[filter_i].filter.ramps.u8.blue_size = crtc_info[crtc_i].blue_size; + switch (crtc_updates[filter_i].filter.depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libcoopgamma_ramps_initialise(&(crtc_updates[filter_i].filter.ramps.MEMBER));\ - libclut_start_over(&(crtc_updates[filter_i].filter.ramps.MEMBER), MAX, TYPE, 1, 1, 1);\ - break; -LIST_DEPTHS + case CONST:\ + libcoopgamma_ramps_initialise(&crtc_updates[filter_i].filter.ramps.MEMBER);\ + libclut_start_over(&crtc_updates[filter_i].filter.ramps.MEMBER, MAX, TYPE, 1, 1, 1);\ + break; + LIST_DEPTHS #undef X - default: - fprintf(stderr, "%s: internal error: gamma ramp type is unrecognised: %i\n", - argv0, crtc_updates[filter_i].filter.depth); - goto custom_fail; - } - } - - switch (start()) - { - case 0: - break; - case -1: - goto fail; - case -2: - goto cg_fail; - case -3: - goto custom_fail; - } - - for (filter_i = 0; filter_i < filters_n; filter_i++) - if (crtc_updates[filter_i].failed) - { - const char* side = cg.error.server_side ? "server" : "client"; - const char* crtc = crtc_updates[filter_i].filter.crtc; - if (cg.error.custom) - { - if ((cg.error.number != 0) && (cg.error.description != NULL)) - fprintf(stderr, "%s: %s-side error number %" PRIu64 " for CRTC %s: %s\n", - argv0, side, cg.error.number, crtc, cg.error.description); - else if (cg.error.number != 0) - fprintf(stderr, "%s: %s-side error number %" PRIu64 " for CRTC %s\n", - argv0, side, cg.error.number, crtc); - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", argv0, side, crtc, cg.error.description); - } - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", argv0, side, crtc, cg.error.description); - else - fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", argv0, side, crtc, strerror(cg.error.number)); - } - - done: - if (dealloc_crtcs) - free(crtcs); - if (crtc_info != NULL) - for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) - libcoopgamma_crtc_info_destroy(crtc_info + crtc_i); - if (asyncs != NULL) - for (filter_i = 0; filter_i < filters_n; filter_i++) - libcoopgamma_async_context_destroy(asyncs + filter_i); - if (stage >= 1) - libcoopgamma_context_destroy(&cg, stage >= 2); - if (crtc_updates != NULL) - for (filter_i = 0; filter_i < filters_n; filter_i++) - { - if (crtc_updates[filter_i].master == 0) - memset(&(crtc_updates[filter_i].filter.ramps.u8), 0, sizeof(crtc_updates[filter_i].filter.ramps.u8)); - crtc_updates[filter_i].filter.crtc = NULL; - crtc_updates[filter_i].filter.class = NULL; - libcoopgamma_filter_destroy(&(crtc_updates[filter_i].filter)); - libcoopgamma_error_destroy(&(crtc_updates[filter_i].error)); - free(crtc_updates[filter_i].slaves); - } - return rc; - - custom_fail: - rc = 1; - goto done; - - fail: - rc = 1; - if (errno) - perror(argv0); - goto done; - - cg_fail: - rc = 1; - { - const char* side = cg.error.server_side ? "server" : "client"; - if (cg.error.custom) - { - if ((cg.error.number != 0) && (cg.error.description != NULL)) - fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", - argv0, side, cg.error.number, cg.error.description); - else if (cg.error.number != 0) - fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - } - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - else - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror(cg.error.number)); - } - goto done; + default: + fprintf(stderr, "%s: internal error: gamma ramp type is unrecognised: %i\n", + argv0, crtc_updates[filter_i].filter.depth); + goto custom_fail; + } + } + } + + switch (start()) { + case 0: + break; + case -1: + goto fail; + case -2: + goto cg_fail; + case -3: + goto custom_fail; + } + + for (filter_i = 0; filter_i < filters_n; filter_i++) { + if (crtc_updates[filter_i].failed) { + side = cg.error.server_side ? "server" : "client"; + crtc = crtc_updates[filter_i].filter.crtc; + if (cg.error.custom) { + if (cg.error.number && cg.error.description) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 " for CRTC %s: %s\n", + argv0, side, cg.error.number, crtc, cg.error.description); + } else if (cg.error.number) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 " for CRTC %s\n", + argv0, side, cg.error.number, crtc); + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", + argv0, side, crtc, cg.error.description); + } + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", + argv0, side, crtc, cg.error.description); + } else { + fprintf(stderr, "%s: %s-side error for CRTC %s: %s\n", + argv0, side, crtc, strerror((int)cg.error.number)); + } + } + } + +done: + if (dealloc_crtcs) + free(crtcs); + if (crtc_info) + for (crtc_i = 0; crtc_i < crtcs_n; crtc_i++) + libcoopgamma_crtc_info_destroy(crtc_info + crtc_i); + if (asyncs) + for (filter_i = 0; filter_i < filters_n; filter_i++) + libcoopgamma_async_context_destroy(asyncs + filter_i); + if (stage >= 1) + libcoopgamma_context_destroy(&cg, stage >= 2); + if (crtc_updates) { + for (filter_i = 0; filter_i < filters_n; filter_i++) { + if (!crtc_updates[filter_i].master) { + memset(&crtc_updates[filter_i].filter.ramps.u8, 0, + sizeof(crtc_updates[filter_i].filter.ramps.u8)); + } + crtc_updates[filter_i].filter.crtc = NULL; + crtc_updates[filter_i].filter.class = NULL; + libcoopgamma_filter_destroy(&crtc_updates[filter_i].filter); + libcoopgamma_error_destroy(&crtc_updates[filter_i].error); + free(crtc_updates[filter_i].slaves); + } + } + return rc; + +custom_fail: + rc = 1; + goto done; + +fail: + rc = 1; + if (errno) + perror(argv0); + goto done; + +cg_fail: + rc = 1; + side = cg.error.server_side ? "server" : "client"; + if (cg.error.custom) { + if (cg.error.number && cg.error.description) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", + argv0, side, cg.error.number, cg.error.description); + } else if (cg.error.number) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } else { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror((int)cg.error.number)); + } + goto done; } @@ -9,7 +9,7 @@ * Value of `default_priority` that indicates * that there is no default priority */ -#define NO_DEFAULT_PRIORITY INT64_MAX +#define NO_DEFAULT_PRIORITY INT64_MAX @@ -24,12 +24,12 @@ * 4) The type of the ramp stops */ #define LIST_DEPTHS\ - X(LIBCOOPGAMMA_UINT8, u8, UINT8_MAX, uint8_t)\ - X(LIBCOOPGAMMA_UINT16, u16, UINT16_MAX, uint16_t)\ - X(LIBCOOPGAMMA_UINT32, u32, UINT32_MAX, uint32_t)\ - X(LIBCOOPGAMMA_UINT64, u64, UINT64_MAX, uint64_t)\ - X(LIBCOOPGAMMA_FLOAT, f, ((float)1), float)\ - X(LIBCOOPGAMMA_DOUBLE, d, ((double)1), double) + X(LIBCOOPGAMMA_UINT8, u8, UINT8_MAX, uint8_t)\ + X(LIBCOOPGAMMA_UINT16, u16, UINT16_MAX, uint16_t)\ + X(LIBCOOPGAMMA_UINT32, u32, UINT32_MAX, uint32_t)\ + X(LIBCOOPGAMMA_UINT64, u64, UINT64_MAX, uint64_t)\ + X(LIBCOOPGAMMA_FLOAT, f, ((float)1), float)\ + X(LIBCOOPGAMMA_DOUBLE, d, ((double)1), double) @@ -39,54 +39,54 @@ */ typedef struct filter_update { - /** - * The filter to update - * - * `.filter.crtc`, `.filter.class`, and - * `.filter.priority` (unless `default_priority` - * is `NO_DEFAULT_PRIORITY`), `.filter.depth` - * are preconfigured, and `.filter.ramps` - * is preinitialised and preset to an - * identity ramp - */ - libcoopgamma_filter_t filter; - - /** - * The index of the CRTC - */ - size_t crtc; - - /** - * Has the update been synchronised? - */ - int synced; - - /** - * Did the update fail? - */ - int failed; - - /** - * Error description if `.failed` is true - */ - libcoopgamma_error_t error; - - /** - * If zero, the ramps in `.filter` shall - * neither be modified nor freed - */ - int master; - - /** - * 0-terminated list of elements in - * `.crtc_updates` which shares gamma - * ramps with this instance - * - * This will only be set if `.master` - * is true - */ - size_t* slaves; - + /** + * The filter to update + * + * `.filter.crtc`, `.filter.class`, and + * `.filter.priority` (unless `default_priority` + * is `NO_DEFAULT_PRIORITY`), `.filter.depth` + * are preconfigured, and `.filter.ramps` + * is preinitialised and preset to an + * identity ramp + */ + libcoopgamma_filter_t filter; + + /** + * The index of the CRTC + */ + size_t crtc; + + /** + * Has the update been synchronised? + */ + int synced; + + /** + * Did the update fail? + */ + int failed; + + /** + * Error description if `.failed` is true + */ + libcoopgamma_error_t error; + + /** + * If zero, the ramps in `.filter` shall + * neither be modified nor freed + */ + int master; + + /** + * 0-terminated list of elements in + * `.crtc_updates` which shares gamma + * ramps with this instance + * + * This will only be set if `.master` + * is true + */ + size_t *slaves; + } filter_update_t; @@ -94,7 +94,7 @@ typedef struct filter_update /** * The process's name */ -extern const char* argv0; +extern const char *argv0; /** * The libcoopgamma context @@ -104,18 +104,18 @@ extern libcoopgamma_context_t cg; /** * The names of the selected CRTC:s */ -extern char** crtcs; +extern char **crtcs; /** * Gamma ramp updates for each CRTC */ -extern filter_update_t* crtc_updates; +extern filter_update_t *crtc_updates; /** * CRTC and monitor information about * each selected CRTC and connect monitor */ -extern libcoopgamma_crtc_info_t* crtc_info; +extern libcoopgamma_crtc_info_t *crtc_info; /** * The number of selected CRTC:s @@ -142,7 +142,7 @@ extern char default_class[]; /** * Class suffixes */ -extern const char* const* class_suffixes; +extern const char *const *class_suffixes; @@ -210,7 +210,7 @@ extern void usage(void); #if defined(__GNUC__) __attribute__((__nonnull__(1))) #endif -extern int handle_opt(char* opt, char* arg); +extern int handle_opt(char *opt, char *arg); /** * This function is called after the last @@ -224,7 +224,7 @@ extern int handle_opt(char* opt, char* arg); #if defined(__GNUC__) __attribute__((__nonnull__(2))) #endif -extern int handle_args(int argc, char* argv[], char* prio); +extern int handle_args(int argc, char *argv[], char *prio); /** * The main function for the program-specific code diff --git a/cg-brilliance.c b/cg-brilliance.c index 8ed3124..00ae873 100644 --- a/cg-brilliance.c +++ b/cg-brilliance.c @@ -24,7 +24,7 @@ char default_class[] = PKGNAME "::cg-brilliance::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -58,13 +58,14 @@ static double bvalue = 0; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " - "(-x | [-p priority] [-d] (all | red green blue))\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " + "(-x | [-p priority] [-d] (all | red green blue))\n", + argv0); + exit(1); } @@ -82,28 +83,29 @@ void usage(void) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - else - usage(); - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } else { + usage(); + } + return 0; + (void) arg; } @@ -114,16 +116,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; } @@ -136,34 +139,33 @@ 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) { - char* red = NULL; - char* green = NULL; - char* blue = NULL; - int q = xflag + dflag; - if ((q > 1) || (xflag && (prio != NULL || argc))) - usage(); - if (argc == 1) - red = green = blue = argv[0]; - else if (argc == 3) - { - red = argv[0]; - green = argv[1]; - blue = argv[2]; - } - else if (argc || !xflag) - usage(); - if (argc) - { - if (parse_double(&rvalue, red) < 0) - usage(); - if (parse_double(&gvalue, blue) < 0) - usage(); - if (parse_double(&bvalue, green) < 0) - usage(); - } - return 0; + char *red = NULL; + char *green = NULL; + char *blue = NULL; + int q = xflag + dflag; + if (q > 1 || (xflag && (prio || argc))) + usage(); + if (argc == 1) { + red = green = blue = argv[0]; + } else if (argc == 3) { + red = argv[0]; + green = argv[1]; + blue = argv[2]; + } else if (argc || !xflag) { + usage(); + } + if (argc) { + if (parse_double(&rvalue, red) < 0) + usage(); + if (parse_double(&gvalue, blue) < 0) + usage(); + if (parse_double(&bvalue, green) < 0) + usage(); + } + return 0; } @@ -172,54 +174,45 @@ int handle_args(int argc, char* argv[], char* prio) * * @param filter The filter to fill */ -static void fill_filter(libcoopgamma_filter_t* restrict filter) +static void +fill_filter(libcoopgamma_filter_t *restrict filter) { - size_t i; - switch (filter->depth) - { -#define X(CONST, MAX, TYPE, MEMBER) \ - case CONST: \ - for (i = 0; i < filter->ramps.MEMBER.red_size; i++) \ - { \ - double val = (double)(filter->ramps.MEMBER.red[i]); \ - val *= rvalue; \ - if (val < 0) filter->ramps.MEMBER.red[i] = 0; \ - else if (val > (double)(MAX)) filter->ramps.MEMBER.red[i] = MAX; \ - else filter->ramps.MEMBER.red[i] = (TYPE)val; \ - } \ - for (i = 0; i < filter->ramps.MEMBER.green_size; i++) \ - { \ - double val = (double)(filter->ramps.MEMBER.green[i]); \ - val *= gvalue; \ - if (val < 0) filter->ramps.MEMBER.green[i] = 0; \ - else if (val > (double)(MAX)) filter->ramps.MEMBER.green[i] = MAX; \ - else filter->ramps.MEMBER.green[i] = (TYPE)val; \ - } \ - for (i = 0; i < filter->ramps.MEMBER.blue_size; i++) \ - { \ - double val = (double)(filter->ramps.MEMBER.blue[i]); \ - val *= bvalue; \ - if (val < 0) filter->ramps.MEMBER.blue[i] = 0; \ - else if (val > (double)(MAX)) filter->ramps.MEMBER.blue[i] = MAX; \ - else filter->ramps.MEMBER.blue[i] = (TYPE)val; \ - } \ - break - X(LIBCOOPGAMMA_UINT8, UINT8_MAX, uint8_t, u8); - X(LIBCOOPGAMMA_UINT16, UINT16_MAX, uint16_t, u16); - X(LIBCOOPGAMMA_UINT32, UINT32_MAX, uint32_t, u32); - X(LIBCOOPGAMMA_UINT64, UINT64_MAX, uint64_t, u64); + size_t i; + switch (filter->depth) { +#define X(CONST, MAX, TYPE, MEMBER)\ + case CONST:\ + for (i = 0; i < filter->ramps.MEMBER.red_size; i++) {\ + double val = (double)(filter->ramps.MEMBER.red[i]);\ + val *= rvalue;\ + filter->ramps.MEMBER.red[i] = val < 0 ? 0 : val > (double)(MAX) ? MAX : (TYPE)val;\ + }\ + for (i = 0; i < filter->ramps.MEMBER.green_size; i++) {\ + double val = (double)(filter->ramps.MEMBER.green[i]);\ + val *= gvalue;\ + filter->ramps.MEMBER.green[i] = val < 0 ? 0 : val > (double)(MAX) ? MAX : (TYPE)val;\ + }\ + for (i = 0; i < filter->ramps.MEMBER.blue_size; i++) {\ + double val = (double)(filter->ramps.MEMBER.blue[i]);\ + val *= bvalue;\ + filter->ramps.MEMBER.blue[i] = val < 0 ? 0 : val > (double)(MAX) ? MAX : (TYPE)val;\ + }\ + break + X(LIBCOOPGAMMA_UINT8, UINT8_MAX, uint8_t, u8); + X(LIBCOOPGAMMA_UINT16, UINT16_MAX, uint16_t, u16); + X(LIBCOOPGAMMA_UINT32, UINT32_MAX, uint32_t, u32); + X(LIBCOOPGAMMA_UINT64, UINT64_MAX, uint64_t, u64); #undef X - case LIBCOOPGAMMA_FLOAT: - libclut_rgb_brightness(&(filter->ramps.f), (float)1, float, rvalue, gvalue, bvalue); - libclut_clip(&(filter->ramps.f), (float)1, float, 1, 1, 1); - break; - case LIBCOOPGAMMA_DOUBLE: - libclut_rgb_brightness(&(filter->ramps.d), (double)1, double, rvalue, gvalue, bvalue); - libclut_clip(&(filter->ramps.d), (double)1, double, 1, 1, 1); - break; - default: - abort(); - } + case LIBCOOPGAMMA_FLOAT: + libclut_rgb_brightness(&filter->ramps.f, (float)1, float, rvalue, gvalue, bvalue); + libclut_clip(&filter->ramps.f, (float)1, float, 1, 1, 1); + break; + case LIBCOOPGAMMA_DOUBLE: + libclut_rgb_brightness(&filter->ramps.d, (double)1, double, rvalue, gvalue, bvalue); + libclut_clip(&filter->ramps.d, (double)1, double, 1, 1, 1); + break; + default: + abort(); + } } @@ -231,66 +224,65 @@ static void fill_filter(libcoopgamma_filter_t* restrict filter) * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag) - if ((r = make_slaves()) < 0) - return r; - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - fill_filter(&(crtc_updates[i].filter)); - 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; - - if (!dflag) - return 0; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return -1; + int r; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && (r = make_slaves()) < 0) + return r; + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) + fill_filter(&crtc_updates[i].filter); + 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; + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + if (!dflag) + return 0; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return -1; + } + } + } + +enotrecoverable: + pause(); + return -1; } diff --git a/cg-darkroom.c b/cg-darkroom.c index b9b79f1..8b312c0 100644 --- a/cg-darkroom.c +++ b/cg-darkroom.c @@ -24,7 +24,7 @@ char default_class[] = PKGNAME "::cg-darkroom::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -48,13 +48,14 @@ static double value = 0.25; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " - "(-x | [-p priority] [-d] [brightness])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " + "(-x | [-p priority] [-d] [brightness])\n", + argv0); + exit(1); } @@ -72,28 +73,29 @@ void usage(void) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - else - usage(); - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } else { + usage(); + } + return 0; + (void) arg; } @@ -104,16 +106,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; } @@ -126,19 +129,19 @@ 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 = xflag + dflag; - if ((q > 1) || (xflag && (prio != NULL || argc))) - usage(); - if (argc == 1) - { - if (parse_double(&value, argv[0]) < 0) - usage(); - } - else if (argc) - usage(); - return 0; + int q = xflag + dflag; + if ((q > 1) || (xflag && (prio || argc))) + usage(); + if (argc == 1) { + if (parse_double(&value, argv[0]) < 0) + usage(); + } else if (argc) { + usage(); + } + return 0; } @@ -148,80 +151,78 @@ int handle_args(int argc, char* argv[], char* prio) * @param filter The filter to fill * @return Zero on success, -1 on error */ -static int fill_filter(libcoopgamma_filter_t* restrict filter) +static int +fill_filter(libcoopgamma_filter_t *restrict filter) { - union libcoopgamma_ramps dramps; - size_t size; - - if ((0 <= value) && (value <= 1)) - { - switch (filter->depth) - { + union libcoopgamma_ramps dramps; + size_t size; + + if (0 <= value && value <= 1) { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libclut_negative(&(filter->ramps.MEMBER), MAX, TYPE, 1, 0, 0);\ - libclut_rgb_brightness(&(filter->ramps.MEMBER), MAX, TYPE, 1, 0, 0);\ - libclut_cie_brightness(&(filter->ramps.MEMBER), MAX, TYPE, value, value, value);\ - break; -LIST_DEPTHS + case CONST:\ + libclut_negative(&filter->ramps.MEMBER, MAX, TYPE, 1, 0, 0);\ + libclut_rgb_brightness(&filter->ramps.MEMBER, MAX, TYPE, 1, 0, 0);\ + libclut_cie_brightness(&filter->ramps.MEMBER, MAX, TYPE, value, value, value);\ + break; + LIST_DEPTHS #undef X + default: + abort(); + } + return 0; + } + if (filter->depth == LIBCOOPGAMMA_DOUBLE) { + libclut_negative(&filter->ramps.d, (double)1, double, 1, 0, 0); + libclut_rgb_brightness(&filter->ramps.d, (double)1, double, 1, 0, 0); + libclut_cie_brightness(&filter->ramps.d, (double)1, double, value, value, value); + libclut_clip(&filter->ramps.d, (double)1, double, 1, 0, 0); + return 0; + } + if (filter->depth == LIBCOOPGAMMA_FLOAT) { + libclut_negative(&filter->ramps.f, (float)1, float, 1, 0, 0); + libclut_rgb_brightness(&filter->ramps.f, (float)1, float, 1, 0, 0); + libclut_cie_brightness(&filter->ramps.f, (float)1, float, value, value, value); + libclut_clip(&filter->ramps.f, (float)1, float, 1, 0, 0); + return 0; + } + + size = dramps.d.red_size = filter->ramps.d.red_size; + size += dramps.d.green_size = filter->ramps.d.green_size; + size += dramps.d.blue_size = filter->ramps.d.blue_size; + dramps.d.red = calloc(size, sizeof(double)); + if (!dramps.d.red) + return -1; + dramps.d.green = dramps.d.red + dramps.d.red_size; + dramps.d.blue = dramps.d.green + dramps.d.green_size; + + libclut_start_over(&dramps.d, (double)1, double, 1, 0, 0); + libclut_negative(&dramps.d, (double)1, double, 1, 0, 0); + libclut_rgb_brightness(&dramps.d, (double)1, double, 1, 0, 0); + libclut_cie_brightness(&dramps.d, (double)1, double, value, value, value); + libclut_clip(&dramps.d, (double)1, double, 1, 0, 0); + + switch (filter->depth) { + case LIBCOOPGAMMA_UINT8: + libclut_translate(&filter->ramps.u8, UINT8_MAX, uint8_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT16: + libclut_translate(&filter->ramps.u16, UINT16_MAX, uint16_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT32: + libclut_translate(&filter->ramps.u32, UINT32_MAX, uint32_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT64: + libclut_translate(&filter->ramps.u64, UINT64_MAX, uint64_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_FLOAT: + case LIBCOOPGAMMA_DOUBLE: default: - abort(); + abort(); } - return 0; - } - if (filter->depth == LIBCOOPGAMMA_DOUBLE) - { - libclut_negative(&(filter->ramps.d), (double)1, double, 1, 0, 0); - libclut_rgb_brightness(&(filter->ramps.d), (double)1, double, 1, 0, 0); - libclut_cie_brightness(&(filter->ramps.d), (double)1, double, value, value, value); - libclut_clip(&(filter->ramps.d), (double)1, double, 1, 0, 0); - return 0; - } - if (filter->depth == LIBCOOPGAMMA_FLOAT) - { - libclut_negative(&(filter->ramps.f), (float)1, float, 1, 0, 0); - libclut_rgb_brightness(&(filter->ramps.f), (float)1, float, 1, 0, 0); - libclut_cie_brightness(&(filter->ramps.f), (float)1, float, value, value, value); - libclut_clip(&(filter->ramps.f), (float)1, float, 1, 0, 0); - return 0; - } - - size = dramps.d.red_size = filter->ramps.d.red_size; - size += dramps.d.green_size = filter->ramps.d.green_size; - size += dramps.d.blue_size = filter->ramps.d.blue_size; - dramps.d.red = calloc(size, sizeof(double)); - if (dramps.d.red == NULL) - return -1; - dramps.d.green = dramps.d.red + dramps.d.red_size; - dramps.d.blue = dramps.d.green + dramps.d.green_size; - - libclut_start_over(&(dramps.d), (double)1, double, 1, 0, 0); - libclut_negative(&(dramps.d), (double)1, double, 1, 0, 0); - libclut_rgb_brightness(&(dramps.d), (double)1, double, 1, 0, 0); - libclut_cie_brightness(&(dramps.d), (double)1, double, value, value, value); - libclut_clip(&(dramps.d), (double)1, double, 1, 0, 0); - - switch (filter->depth) - { - case LIBCOOPGAMMA_UINT8: - libclut_translate(&(filter->ramps.u8), UINT8_MAX, uint8_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT16: - libclut_translate(&(filter->ramps.u16), UINT16_MAX, uint16_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT32: - libclut_translate(&(filter->ramps.u32), UINT32_MAX, uint32_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT64: - libclut_translate(&(filter->ramps.u64), UINT64_MAX, uint64_t, &(dramps.d), (double)1, double); - break; - default: - abort(); - } - - free(dramps.d.red); - return 0; + + free(dramps.d.red); + return 0; } @@ -233,67 +234,65 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag) - if ((r = make_slaves()) < 0) - return r; - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - if ((r = fill_filter(&(crtc_updates[i].filter))) < 0) - return r; - 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; - - if (!dflag) - return 0; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return -1; + int r; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && (r = make_slaves()) < 0) + return r; + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag && (r = fill_filter(&crtc_updates[i].filter)) < 0) + return r; + 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; + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + if (!dflag) + return 0; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return -1; + } + } + } + +enotrecoverable: + pause(); + return -1; } @@ -27,7 +27,7 @@ char default_class[] = PKGNAME "::cg-gamma::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -44,7 +44,7 @@ static int xflag = 0; /** * -f: gamma listing file */ -static char* fflag = NULL; +static char *fflag = NULL; /** * The gamma of the red channel @@ -65,38 +65,39 @@ static double bgamma = 1; * `NULL`-terminated list of output * names listed in the configuration file */ -static char** names = NULL; +static char **names = NULL; /** * The gamma of the red channel on monitor * with same index in `names` */ -static double* rgammas = NULL; +static double *rgammas = NULL; /** * The gamma of the green channel on monitor * with same index in `names` */ -static double* ggammas = NULL; +static double *ggammas = NULL; /** * The gamma of the blue channel on monitor * with same index in `names` */ -static double* bgammas = NULL; +static double *bgammas = NULL; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " - "(-x | [-p priority] [-d] [-f file | all | red green blue])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " + "(-x | [-p priority] [-d] [-f file | all | red green blue])\n", + argv0); + exit(1); } @@ -106,21 +107,21 @@ void usage(void) * @param ret The value to return * @return `ret` is returned as is */ -static int cleanup(int ret) +static int +cleanup(int ret) { - int saved_errno = errno; - if (names != NULL) - { - char** p = names; - while (*p) - free(*p++); - } - free(names); - free(rgammas); - free(ggammas); - free(bgammas); - errno = saved_errno; - return ret; + int saved_errno = errno; + if (names) { + char **p = names; + while (*p) + free(*p++); + } + free(names); + free(rgammas); + free(ggammas); + free(bgammas); + errno = saved_errno; + return ret; } @@ -138,29 +139,30 @@ static int cleanup(int ret) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - case 'f': - if (fflag || !(fflag = arg)) - usage(); - return 1; - default: - usage(); - } - return 0; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + case 'f': + if (fflag || !(fflag = arg)) + usage(); + return 1; + default: + usage(); + } + } + return 0; } @@ -170,25 +172,26 @@ int handle_opt(char* opt, char* arg) * @param confname The filename (excluding directory) of the configuration file * @return The full pathname of the configuration file, `NULL` on error */ -static char* get_conf_file(const char* restrict confname) +static char * +get_conf_file(const char *restrict confname) { - struct passwd* pw; - char* path; - - pw = getpwuid(getuid()); - if ((pw == NULL) || (pw->pw_dir == NULL)) - return NULL; - - path = malloc(strlen(pw->pw_dir) + strlen(confname) + sizeof("/.config/")); - if (path == NULL) - return NULL; - - sprintf(path, "%s/.config/%s", pw->pw_dir, confname); - - if (access(path, F_OK) < 0) - sprintf(path, "/etc/%s", confname); - - return path; + struct passwd *pw; + char *path; + + pw = getpwuid(getuid()); + if (!pw || !pw->pw_dir) + return NULL; + + path = malloc(strlen(pw->pw_dir) + strlen(confname) + sizeof("/.config/")); + if (!path) + return NULL; + + sprintf(path, "%s/.config/%s", pw->pw_dir, confname); + + if (access(path, F_OK) < 0) + sprintf(path, "/etc/%s", confname); + + return path; } @@ -199,16 +202,17 @@ static char* get_conf_file(const char* restrict confname) * @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; } @@ -218,142 +222,133 @@ static int parse_double(double* restrict out, const char* restrict str) * @param pathname The pathname of the file * @return Zero on success, -1 on error */ -static int parse_gamma_file(const char* restrict pathname) +static int +parse_gamma_file(const char *restrict pathname) { - int fd, saved_errno; - char* line = NULL; - size_t size = 0, lineno = 0, ptr = 0, alloc = 0; - ssize_t n; - FILE* f = NULL; - char* p; - char* q; - char* r; - char* g; - char* b; - - fd = open(pathname, O_RDONLY); - if (fd == -1) - return -1; - - f = fdopen(fd, "rb"); - if (f == NULL) - goto fail; - - while (n = getline(&line, &size, f), n >= 0) - { - lineno += 1; - - if ((n > 0) && (line[n - 1] == '\n')) - line[n - 1] = '\0'; - p = line; - while ((*p == ' ') || (*p == '\t')) p++; - if ((!*p) || (*p == '#')) - continue; - - r = strpbrk(line, " \t"); - if (r == NULL) - goto bad; - while (r[1] == ' ' || r[1] == '\t') r++; - g = strpbrk(r + 1, " \t"); - if (g == NULL) - goto bad; - while (g[1] == ' ' || g[1] == '\t') g++; - b = strpbrk(g + 1, " \t"); - if (b == NULL) - goto bad; - while (b[1] == ' ' || b[1] == '\t') b++; - - for (;;) - { - q = strpbrk(b + 1, " \t"); - if (q == NULL) - break; - while (q[1] == ' ' || q[1] == '\t') q++; - if (!*q) - break; - r = g, g = b, b = q; + int fd, saved_errno; + char *line = NULL; + size_t size = 0, lineno = 0, ptr = 0, alloc = 0; + ssize_t n; + FILE *f = NULL; + char *p, *q; + char *r, *g, *b; + void *new; + size_t new_size; + + fd = open(pathname, O_RDONLY); + if (fd < 0) + return -1; + + f = fdopen(fd, "rb"); + if (!f) + goto fail; + + while ((n = getline(&line, &size, f)) >= 0) { + lineno += 1; + + if (n > 0 && line[n - 1] == '\n') + line[n - 1] = '\0'; + for (p = line; *p == ' ' || *p == '\t'; p++); + if (!*p || *p == '#') + continue; + + r = strpbrk(line, " \t"); + if (!r) + goto bad; + for (; r[1] == ' ' || r[1] == '\t'; r++); + g = strpbrk(r + 1, " \t"); + if (!g) + goto bad; + for (; g[1] == ' ' || g[1] == '\t'; g++); + b = strpbrk(g + 1, " \t"); + if (!b) + goto bad; + for (; b[1] == ' ' || b[1] == '\t'; b++); + + for (;;) { + q = strpbrk(b + 1, " \t"); + if (!q) + break; + for (; q[1] == ' ' || q[1] == '\t'; q++); + if (!*q) + break; + r = g, g = b, b = q; + } + + *r++ = '\0'; + *g++ = '\0'; + *b++ = '\0'; + + if ((q = strpbrk(r, " \t"))) + *q = '\0'; + if ((q = strpbrk(g, " \t"))) + *q = '\0'; + if ((q = strpbrk(b, " \t"))) + *q = '\0'; + + q = strchr(p, '\0'); + while ((q != p) && ((q[-1] == ' ') || (q[-1] == '\t'))) + q--; + *q = '\0'; + + if (ptr == alloc) { + new_size = alloc ? (alloc << 1) : 4; + + new = realloc(rgammas, new_size * sizeof(*rgammas)); + if (!new) + goto fail; + rgammas = new; + + new = realloc(ggammas, new_size * sizeof(*ggammas)); + if (!new) + goto fail; + ggammas = new; + + new = realloc(bgammas, new_size * sizeof(*bgammas)); + if (!new) + goto fail; + bgammas = new; + + new = realloc(names, (new_size + 1) * sizeof(*names)); + if (!new) + goto fail; + names = new; + memset(names + alloc, 0, (new_size + 1 - alloc) * sizeof(*names)); + + alloc = new_size; + } + + if (parse_double(rgammas + ptr, r) < 0 || + parse_double(ggammas + ptr, g) < 0 || + parse_double(bgammas + ptr, b) < 0) + goto bad; + names[ptr] = malloc(strlen(p) + 1); + if (!names[ptr]) + goto fail; + strcpy(names[ptr], p); + ptr++; + + continue; + bad: + fprintf(stderr, "%s: ignoring malformatted line in %s: %zu\n", argv0, pathname, lineno); } - - *r++ = '\0'; - *g++ = '\0'; - *b++ = '\0'; - - q = strpbrk(r, " \t"); - if (q != NULL) - *q = '\0'; - q = strpbrk(g, " \t"); - if (q != NULL) - *q = '\0'; - q = strpbrk(b, " \t"); - if (q != NULL) - *q = '\0'; - - q = strchr(p, '\0'); - while ((q != p) && ((q[-1] == ' ') || (q[-1] == '\t'))) - q--; - *q = '\0'; - - if (ptr == alloc) - { - void* new; - size_t new_size = alloc ? (alloc << 1) : 4; - - new = realloc(rgammas, new_size * sizeof(*rgammas)); - if (new == NULL) - goto fail; - rgammas = new; - - new = realloc(ggammas, new_size * sizeof(*ggammas)); - if (new == NULL) - goto fail; - ggammas = new; - - new = realloc(bgammas, new_size * sizeof(*bgammas)); - if (new == NULL) - goto fail; - bgammas = new; - - new = realloc(names, (new_size + 1) * sizeof(*names)); - if (new == NULL) - goto fail; - names = new; - memset(names + alloc, 0, (new_size + 1 - alloc) * sizeof(*names)); - - alloc = new_size; + + if (fclose(f) < 0) { + f = NULL; + goto fail; } - - if ((parse_double(rgammas + ptr, r) < 0) || - (parse_double(ggammas + ptr, g) < 0) || - (parse_double(bgammas + ptr, b) < 0)) - goto bad; - names[ptr] = malloc(strlen(p) + 1); - if (names[ptr] == NULL) - goto fail; - strcpy(names[ptr], p); - ptr++; - - continue; - bad: - fprintf(stderr, "%s: ignoring malformatted line in %s: %zu\n", argv0, pathname, lineno); - } - - if (fclose(f) < 0) - { - f = NULL; - goto fail; - } - close(fd); - free(line); - return 0; - fail: - saved_errno = errno; - free(line); - if (f != NULL) - fclose(f); - if (fd >= 0) - close(fd); - errno = saved_errno; - return -1; + close(fd); + free(line); + return 0; +fail: + saved_errno = errno; + free(line); + if (f) + fclose(f); + if (fd >= 0) + close(fd); + errno = saved_errno; + return -1; } @@ -366,48 +361,48 @@ static int parse_gamma_file(const char* restrict pathname) * @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 free_fflag = 0, saved_errno; - int q = xflag + dflag; - if ((q > 1) || (fflag && argc) || (xflag && ((fflag != NULL) || (argc > 0) || (prio != NULL)))) - usage(); - if (argc == 1) - { - if (parse_double(&rgamma, argv[0]) < 0) - usage(); - bgamma = ggamma = rgamma; - } - else if (argc == 3) - { - if (parse_double(&rgamma, argv[0]) < 0) - usage(); - if (parse_double(&ggamma, argv[1]) < 0) - usage(); - if (parse_double(&bgamma, argv[2]) < 0) - usage(); - } - else if (argc) - usage(); - if (!argc && !fflag && !xflag) - { - fflag = get_conf_file("gamma"); - if (fflag == NULL) - return -1; - free_fflag = 1; - } - if (fflag) - if (parse_gamma_file(fflag) < 0) - goto fail; - if (free_fflag) - free(fflag), fflag = NULL; - return 0; - fail: - saved_errno = errno; - if (free_fflag) - free(fflag), fflag = NULL; - errno = saved_errno; - return cleanup(-1); + int free_fflag = 0, saved_errno; + int q = xflag + dflag; + if (q > 1 || (fflag && argc) || (xflag && (fflag || argc > 0 || prio))) + usage(); + if (argc == 1) { + if (parse_double(&rgamma, argv[0]) < 0) + usage(); + bgamma = ggamma = rgamma; + } else if (argc == 3) { + if (parse_double(&rgamma, argv[0]) < 0) + usage(); + if (parse_double(&ggamma, argv[1]) < 0) + usage(); + if (parse_double(&bgamma, argv[2]) < 0) + usage(); + } else if (argc) { + usage(); + } + if (!argc && !fflag && !xflag) { + fflag = get_conf_file("gamma"); + if (!fflag) + return -1; + free_fflag = 1; + } + if (fflag && parse_gamma_file(fflag) < 0) + goto fail; + if (free_fflag) { + free(fflag); + fflag = NULL; + } + return 0; +fail: + saved_errno = errno; + if (free_fflag) { + free(fflag); + fflag = NULL; + } + errno = saved_errno; + return cleanup(-1); } @@ -419,19 +414,19 @@ int handle_args(int argc, char* argv[], char* prio) * @param g The green gamma * @param b The blue gamma */ -static void fill_filter(libcoopgamma_filter_t* restrict filter, double r, double g, double b) +static void +fill_filter(libcoopgamma_filter_t *restrict filter, double r, double g, double b) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libclut_gamma(&(filter->ramps.MEMBER), MAX, TYPE, r, g, b);\ - break; -LIST_DEPTHS + case CONST:\ + libclut_gamma(&filter->ramps.MEMBER, MAX, TYPE, r, g, b);\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -443,82 +438,81 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag && (names != NULL)) - if ((r = make_slaves()) < 0) - return cleanup(r); - - if (names == NULL) - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - fill_filter(&(crtc_updates[i].filter), rgamma, ggamma, bgamma); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return cleanup(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 cleanup(r); - } - } - else - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_info[crtc_updates[i].crtc].supported)) - continue; - for (j = 0; names[j] != NULL; j++) - if (!strcasecmp(crtc_updates[i].filter.crtc, names[j])) - { - fill_filter(&(crtc_updates[i].filter), rgammas[j], ggammas[j], bgammas[j]); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) + int r; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && names && (r = make_slaves()) < 0) return cleanup(r); - break; - } - } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return cleanup(r); - - if (!dflag) - return cleanup(0); - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return cleanup(-1); - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return cleanup(-1); + + if (!names) { + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) + fill_filter(&crtc_updates[i].filter, rgamma, ggamma, bgamma); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return cleanup(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 cleanup(r); + } + } + } + } else { + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_info[crtc_updates[i].crtc].supported) + continue; + for (j = 0; names[j]; j++) { + if (!strcasecmp(crtc_updates[i].filter.crtc, names[j])) { + fill_filter(&crtc_updates[i].filter, rgammas[j], ggammas[j], bgammas[j]); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return cleanup(r); + break; + } + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return cleanup(-1); + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return cleanup(r); + + if (!dflag) + return cleanup(0); + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return cleanup(-1); + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return cleanup(-1); + } + } + } + +enotrecoverable: + pause(); + return cleanup(-1); } @@ -22,18 +22,18 @@ /** * Magic number for dual-byte precision lookup table based profiles */ -#define MLUT_TAG 0x6D4C5554L +#define MLUT_TAG 0x6D4C5554L /** * Magic number for gamma–brightness–contrast based profiles * and for variable precision lookup table profiles */ -#define VCGT_TAG 0x76636774L +#define VCGT_TAG 0x76636774L /** * The filename of the configuration file */ -#define ICCTAB "icctab" +#define ICCTAB "icctab" @@ -50,7 +50,7 @@ char default_class[] = PKGNAME "::cg-icc::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -67,7 +67,7 @@ static int xflag = 0; /** * The panhame of the selected ICC profile */ -static const char* icc_pathname = NULL; +static const char *icc_pathname = NULL; /** * Gamma ramps loaded from `icc_pathname` @@ -82,13 +82,13 @@ static libcoopgamma_depth_t unidepth = 0; /** * Parsed ICC profiles for each CRTC */ -static libcoopgamma_ramps_t* rampses = NULL; +static libcoopgamma_ramps_t *rampses = NULL; /** * The datatype of the stops in the ramps of * corresponding element in `rampses` */ -static libcoopgamma_depth_t* depths = NULL; +static libcoopgamma_depth_t *depths = NULL; /** * File descriptor for configuration directory @@ -98,26 +98,27 @@ static int confdirfd = -1; /** * List of CRTC:s */ -static char** crtc_icc_keys = NULL; +static char **crtc_icc_keys = NULL; /** * List of ICC profile pathnames for corresponding * CRTC in `crtc_icc_keys` */ -static char** crtc_icc_values = NULL; +static char **crtc_icc_values = NULL; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " - "(-x | [-p priority] [-d] [file])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " + "(-x | [-p priority] [-d] [file])\n", + argv0); + exit(1); } @@ -127,28 +128,29 @@ void usage(void) * @param ret The value to return * @return `ret` is returned as is */ -static int cleanup(int ret) +static int +cleanup(int ret) { - int saved_errno = errno; - size_t i; - libcoopgamma_ramps_destroy(&uniramps); - if (confdirfd >= 0) - close(confdirfd); - if (rampses != NULL) - for (i = 0; i < crtcs_n; i++) - libcoopgamma_ramps_destroy(rampses + i); - free(rampses); - free(depths); - if (crtc_icc_keys != NULL) - for (i = 0; crtc_icc_keys[i] != NULL; i++) - free(crtc_icc_keys[i]); - free(crtc_icc_keys); - if (crtc_icc_values != NULL) - for (i = 0; crtc_icc_values[i] != NULL; i++) - free(crtc_icc_values[i]); - free(crtc_icc_values); - errno = saved_errno; - return ret; + int saved_errno = errno; + size_t i; + libcoopgamma_ramps_destroy(&uniramps); + if (confdirfd >= 0) + close(confdirfd); + if (rampses) + for (i = 0; i < crtcs_n; i++) + libcoopgamma_ramps_destroy(rampses + i); + free(rampses); + free(depths); + if (crtc_icc_keys) + for (i = 0; crtc_icc_keys[i]; i++) + free(crtc_icc_keys[i]); + free(crtc_icc_keys); + if (crtc_icc_values) + for (i = 0; crtc_icc_values[i]; i++) + free(crtc_icc_values[i]); + free(crtc_icc_values); + errno = saved_errno; + return ret; } @@ -166,26 +168,27 @@ static int cleanup(int ret) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } + return 0; + (void) arg; } @@ -196,95 +199,93 @@ int handle_opt(char* opt, char* arg) * @path dirname The dirname of the ICC profile table * @return Zero on success, -1 on error */ -static int load_icc_table(int fd, const char *dirname) +static int +load_icc_table(int fd, const char *dirname) { - FILE *fp; - ssize_t len; - size_t lineno = 1, size = 0; - char *p, *q, *line = NULL; - int saved_errno; - size_t ptr = 0, siz = 0; - void *new; - size_t dirname_len = strlen(dirname); - fp = fdopen(fd, "rb"); - if (fp == NULL) - return -1; - for (; len = getline(&line, &size, fp), len >= 0; lineno++) - { - if (len && line[len - 1] == '\n') - line[--len] = '\0'; - p = line + strspn(line, " \t"); - if (!*p || (*p == '#')) - continue; - q = p + strspn(p, "0123456789abcdefABCDEF"); - if ((*q != ' ' && *q != '\t')) - { - fprintf(stderr, "%s: warning: line %zu is malformated in %s/%s\n", - argv0, lineno, dirname, ICCTAB); - continue; - } - *q = '\0'; - if ((size_t)(q - p) != 256) - fprintf(stderr, "%s: warning: EDID on line %zu in %s/%s looks to be of wrong length: %s\n", - argv0, lineno, dirname, ICCTAB, p); - q++; - q += strspn(p, " \t"); - if (!*q) - { - fprintf(stderr, "%s: warning: line %zu is malformated in %s/%s\n", - argv0, lineno, dirname, ICCTAB); - continue; - } - if (strchr(" \t", strchr(q, '\0')[-1])) - fprintf(stderr, "%s: warning: filename on line %zu in %s/%s ends with white space: %s\n", - argv0, lineno, dirname, ICCTAB, q); - if (ptr == siz) - { - new = realloc(crtc_icc_keys, (siz + 5) * sizeof(*crtc_icc_keys)); - if (new == NULL) - goto fail; - crtc_icc_keys = new; - new = realloc(crtc_icc_values, (siz + 5) * sizeof(*crtc_icc_values)); - if (new == NULL) - goto fail; - crtc_icc_values = new; - siz += 4; - } - crtc_icc_values[ptr] = malloc((*q == '/' ? 1 : dirname_len + sizeof("/")) + strlen(q)); - if (crtc_icc_values[ptr] == NULL) - goto fail; - if (*q == '/') - strcpy(crtc_icc_values[ptr], q); - else - stpcpy(stpcpy(stpcpy(crtc_icc_values[ptr], dirname), "/"), q); - crtc_icc_keys[ptr] = malloc(strlen(p) + 1); - if (crtc_icc_keys[ptr] == NULL) - { - ptr++; - goto fail; + FILE *fp; + ssize_t len; + size_t lineno = 1, size = 0; + char *p, *q, *line = NULL; + int saved_errno; + size_t ptr = 0, siz = 0; + void *new; + size_t dirname_len = strlen(dirname); + fp = fdopen(fd, "rb"); + if (!fp) + return -1; + for (; (len = getline(&line, &size, fp)) >= 0; lineno++) { + if (len && line[len - 1] == '\n') + line[--len] = '\0'; + p = line + strspn(line, " \t"); + if (!*p || *p == '#') + continue; + q = p + strspn(p, "0123456789abcdefABCDEF"); + if (*q != ' ' && *q != '\t') { + fprintf(stderr, "%s: warning: line %zu is malformated in %s/%s\n", + argv0, lineno, dirname, ICCTAB); + continue; + } + *q = '\0'; + if ((size_t)(q - p) != 256) { + fprintf(stderr, "%s: warning: EDID on line %zu in %s/%s looks to be of wrong length: %s\n", + argv0, lineno, dirname, ICCTAB, p); + } + q++; + q += strspn(p, " \t"); + if (!*q) { + fprintf(stderr, "%s: warning: line %zu is malformated in %s/%s\n", + argv0, lineno, dirname, ICCTAB); + continue; + } + if (strchr(" \t", strchr(q, '\0')[-1])) { + fprintf(stderr, "%s: warning: filename on line %zu in %s/%s ends with white space: %s\n", + argv0, lineno, dirname, ICCTAB, q); + } + if (ptr == siz) { + new = realloc(crtc_icc_keys, (siz + 5) * sizeof(*crtc_icc_keys)); + if (!new) + goto fail; + crtc_icc_keys = new; + new = realloc(crtc_icc_values, (siz + 5) * sizeof(*crtc_icc_values)); + if (!new) + goto fail; + crtc_icc_values = new; + siz += 4; + } + crtc_icc_values[ptr] = malloc((*q == '/' ? 1 : dirname_len + sizeof("/")) + strlen(q)); + if (!crtc_icc_values[ptr]) + goto fail; + if (*q == '/') + strcpy(crtc_icc_values[ptr], q); + else + stpcpy(stpcpy(stpcpy(crtc_icc_values[ptr], dirname), "/"), q); + crtc_icc_keys[ptr] = malloc(strlen(p) + 1); + if (!crtc_icc_keys[ptr]) { + ptr++; + goto fail; + } + strcpy(crtc_icc_keys[ptr], p); + ptr++; } - strcpy(crtc_icc_keys[ptr], p); - ptr++; - } - if (ferror(fp)) - goto fail; - if (crtc_icc_keys != NULL) - crtc_icc_keys[ptr] = NULL; - if (crtc_icc_values != NULL) - crtc_icc_values[ptr] = NULL; - fclose(fp); - free(line); - return 0; - fail: - saved_errno = errno; - if (crtc_icc_keys != NULL) - crtc_icc_keys[ptr] = NULL; - if (crtc_icc_values != NULL) - crtc_icc_values[ptr] = NULL; - fclose(fp); - free(line); - errno = saved_errno; - return -1; + if (ferror(fp)) + goto fail; + if (crtc_icc_keys) + crtc_icc_keys[ptr] = NULL; + if (crtc_icc_values) + crtc_icc_values[ptr] = NULL; + fclose(fp); + free(line); + return 0; +fail: + saved_errno = errno; + if (crtc_icc_keys) + crtc_icc_keys[ptr] = NULL; + if (crtc_icc_values) + crtc_icc_values[ptr] = NULL; + fclose(fp); + free(line); + errno = saved_errno; + return -1; } @@ -297,53 +298,55 @@ static int load_icc_table(int fd, const char *dirname) * @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) { - struct passwd* pw; - char* path = NULL; - int saved_errno; - int fd = -1, q = xflag + dflag; - if ((q > 1) || (xflag && ((argc > 0) || (prio != NULL))) || (argc > 1)) - usage(); - icc_pathname = *argv; - memset(&uniramps, 0, sizeof(uniramps)); - if (!xflag && (icc_pathname == NULL)) - { - pw = getpwuid(getuid()); - if ((pw == NULL) || (pw->pw_dir == NULL)) - goto fail; - - path = malloc(strlen(pw->pw_dir) + sizeof("/.config")); - if (path == NULL) - goto fail; - - sprintf(path, "%s/.config", pw->pw_dir); - - if (access(path, F_OK) < 0) - sprintf(path, "/etc"); - - confdirfd = open(path, O_DIRECTORY); - if (confdirfd < 0) - goto fail; - - fd = openat(confdirfd, ICCTAB, O_RDONLY); - if (fd < 0) - goto fail; - - if (load_icc_table(fd, path) < 0) - goto fail; - - free(path), path = NULL; - close(fd), fd = -1; - } - return 0; - fail: - saved_errno = errno; - free(path), path = NULL; - if (fd >= 0) - close(fd); - errno = saved_errno; - return cleanup(-1); + struct passwd *pw; + char *path = NULL; + int saved_errno; + int fd = -1, q = xflag + dflag; + if ((q > 1) || (xflag && (argc > 0 || prio)) || argc > 1) + usage(); + icc_pathname = *argv; + memset(&uniramps, 0, sizeof(uniramps)); + if (!xflag && !icc_pathname) { + pw = getpwuid(getuid()); + if (!pw || !pw->pw_dir) + goto fail; + + path = malloc(strlen(pw->pw_dir) + sizeof("/.config")); + if (!path) + goto fail; + + sprintf(path, "%s/.config", pw->pw_dir); + + if (access(path, F_OK) < 0) + sprintf(path, "/etc"); + + confdirfd = open(path, O_DIRECTORY); + if (confdirfd < 0) + goto fail; + + fd = openat(confdirfd, ICCTAB, O_RDONLY); + if (fd < 0) + goto fail; + + if (load_icc_table(fd, path) < 0) + goto fail; + + free(path); + path = NULL; + close(fd), fd = -1; + } + return 0; +fail: + saved_errno = errno; + free(path); + path = NULL; + if (fd >= 0) + close(fd); + errno = saved_errno; + return cleanup(-1); } @@ -353,18 +356,19 @@ int handle_args(int argc, char* argv[], char* prio) * @param content The beginning of the encoded integer * @return The integer, decoded */ -static uint64_t icc_uint64(const char* restrict content) +static uint64_t +icc_uint64(const char *restrict content) { - uint64_t rc; - rc = (uint64_t)(unsigned char)(content[0]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[1]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[2]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[3]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[4]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[5]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[6]), rc <<= 8; - rc |= (uint64_t)(unsigned char)(content[7]); - return rc; + uint64_t rc; + rc = (uint64_t)(unsigned char)(content[0]), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[1])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[2])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[3])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[4])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[5])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[6])), rc = (uint64_t)(rc << 8); + rc = (uint64_t)(rc | (uint64_t)(unsigned char)(content[7])); + return rc; } @@ -374,14 +378,15 @@ static uint64_t icc_uint64(const char* restrict content) * @param content The beginning of the encoded integer * @return The integer, decoded */ -static uint32_t icc_uint32(const char* restrict content) +static uint32_t +icc_uint32(const char *restrict content) { - uint32_t rc; - rc = (uint32_t)(unsigned char)(content[0]), rc <<= 8; - rc |= (uint32_t)(unsigned char)(content[1]), rc <<= 8; - rc |= (uint32_t)(unsigned char)(content[2]), rc <<= 8; - rc |= (uint32_t)(unsigned char)(content[3]); - return rc; + uint32_t rc; + rc = (uint32_t)(unsigned char)(content[0]), rc = (uint32_t)(rc << 8); + rc = (uint32_t)(rc | (uint32_t)(unsigned char)(content[1])), rc = (uint32_t)(rc << 8); + rc = (uint32_t)(rc | (uint32_t)(unsigned char)(content[2])), rc = (uint32_t)(rc << 8); + rc = (uint32_t)(rc | (uint32_t)(unsigned char)(content[3])); + return rc; } @@ -391,12 +396,13 @@ static uint32_t icc_uint32(const char* restrict content) * @param content The beginning of the encoded integer * @return The integer, decoded */ -static uint16_t icc_uint16(const char* restrict content) +static uint16_t +icc_uint16(const char *restrict content) { - uint16_t rc; - rc = (uint16_t)(unsigned char)(content[0]), rc <<= 8; - rc |= (uint16_t)(unsigned char)(content[1]); - return rc; + uint16_t rc; + rc = (uint16_t)(unsigned char)(content[0]), rc = (uint16_t)(rc << 8); + rc = (uint16_t)(rc | (uint16_t)(unsigned char)(content[1])); + return rc; } @@ -406,9 +412,10 @@ static uint16_t icc_uint16(const char* restrict content) * @param content The beginning of the encoded integer * @return The integer, decoded */ -static uint16_t icc_uint8(const char* restrict content) +static uint8_t +icc_uint8(const char *restrict content) { - return (uint8_t)(content[0]); + return (uint8_t)(content[0]); } @@ -419,17 +426,16 @@ static uint16_t icc_uint8(const char* restrict content) * @param width The number of bytes with which the value is encoded * @return The value, decoded */ -static double icc_double(const char* restrict content, size_t width) +static double icc_double(const char *restrict content, size_t width) { - double ret = 0; - size_t i; - for (i = 0; i < width; i++) - { - ret /= 256; - ret += (double)(unsigned char)(content[width - 1 - i]); - } - ret /= 255; - return ret; + double ret = 0; + size_t i; + for (i = 0; i < width; i++) { + ret /= 256; + ret += (double)(unsigned char)(content[width - 1 - i]); + } + ret /= 255; + return ret; } @@ -445,226 +451,217 @@ static double icc_double(const char* restrict content, size_t width) * @return Zero on success, -1 on error, -2 if no usable data is * available in the profile. */ -static int parse_icc(const char* restrict content, size_t n, libcoopgamma_ramps_t* ramps, - libcoopgamma_depth_t* depth) +static int parse_icc(const char *restrict content, size_t n, libcoopgamma_ramps_t *ramps, libcoopgamma_depth_t *depth) { - uint32_t i_tag, n_tags; - size_t i, ptr = 0, xptr; - - /* Skip header */ - if (n - ptr < 128) - return -2; - ptr += 128; - - /* Get the number of tags */ - if (n - ptr < 4) - return -2; - n_tags = icc_uint32(content + ptr), ptr += 4; + uint32_t tag_name, tag_offset, tag_size, gamma_type; + size_t n_channels, n_entries, entry_size; + double r_gamma, r_min, r_max, g_gamma, g_min, g_max, b_gamma, b_min, b_max; + uint32_t i_tag, n_tags; + size_t i, ptr = 0, xptr; - for (i_tag = 0, xptr = ptr; i_tag < n_tags; i_tag++, ptr = xptr) - { - uint32_t tag_name, tag_offset, tag_size, gamma_type; - - /* Get profile encoding type, offset to the profile and the encoding size of its data */ - if (n - ptr < 12) - return -2; - tag_name = icc_uint32(content + ptr), ptr += 4; - tag_offset = icc_uint32(content + ptr), ptr += 4; - tag_size = icc_uint32(content + ptr), ptr += 4; - xptr = ptr; - - /* Jump to the profile data */ - if (tag_offset > INT32_MAX - tag_size) - return -2; - if (tag_offset + tag_size > n) - return -2; - ptr = tag_offset; - - if (tag_name == MLUT_TAG) - { - /* The profile is encododed as an dual-byte precision lookup table */ - - /* Initialise ramps */ - *depth = LIBCOOPGAMMA_UINT16; - ramps->u16.red_size = 256; - ramps->u16.green_size = 256; - ramps->u16.blue_size = 256; - if (libcoopgamma_ramps_initialise(&(ramps->u16)) < 0) - return -1; - - /* Get the lookup table */ - if (n - ptr < 3 * 256 * 2) - continue; - for (i = 0; i < 256; i++) - ramps->u16.red[i] = icc_uint16(content + ptr), ptr += 2; - for (i = 0; i < 256; i++) - ramps->u16.green[i] = icc_uint16(content + ptr), ptr += 2; - for (i = 0; i < 256; i++) - ramps->u16.blue[i] = icc_uint16(content + ptr), ptr += 2; - - return 0; - } - else if (tag_name == VCGT_TAG) - { - /* The profile is encoded as with gamma, brightness and contrast values - * or as a variable precision lookup table profile */ - - /* VCGT profiles starts where their magic number */ - if (n - ptr < 4) - continue; - tag_name = icc_uint32(content + ptr), ptr += 4; - if (tag_name != VCGT_TAG) - continue; - - /* Skip four bytes */ - if (n - ptr < 4) - continue; - ptr += 4; - - /* Get the actual encoding type */ - if (n - ptr < 4) - continue; - gamma_type = icc_uint32(content + ptr), ptr += 4; - - if (gamma_type == 0) - { - /* The profile is encoded as a variable precision lookup table */ - uint16_t n_channels, n_entries, entry_size; - - /* Get metadata */ - if (n - ptr < 3 * 4) - continue; - n_channels = icc_uint16(content + ptr), ptr += 2; - n_entries = icc_uint16(content + ptr), ptr += 2; - entry_size = icc_uint16(content + ptr), ptr += 2; - if (tag_size == 1584) - n_channels = 3, n_entries = 256, entry_size = 2; - if (n_channels != 3) - /* Assuming sRGB, can only be an correct assumption if there are exactly three channels */ - continue; - - /* Check data availability */ - if (n_channels > SIZE_MAX / n_entries) - continue; - if (entry_size > SIZE_MAX / (n_entries * n_channels)) - continue; - if (n - ptr < (size_t)n_channels * (size_t)n_entries * (size_t)entry_size) - continue; - - /* Initialise ramps */ - ramps->u8.red_size = (size_t)n_entries; - ramps->u8.green_size = (size_t)n_entries; - ramps->u8.blue_size = (size_t)n_entries; - switch (entry_size) - { - case 1: - *depth = LIBCOOPGAMMA_UINT8; - if (libcoopgamma_ramps_initialise(&(ramps->u8)) < 0) - return -1; - break; - case 2: - *depth = LIBCOOPGAMMA_UINT16; - if (libcoopgamma_ramps_initialise(&(ramps->u16)) < 0) - return -1; - break; - case 4: - *depth = LIBCOOPGAMMA_UINT32; - if (libcoopgamma_ramps_initialise(&(ramps->u32)) < 0) - return -1; - break; - case 8: - *depth = LIBCOOPGAMMA_UINT64; - if (libcoopgamma_ramps_initialise(&(ramps->u64)) < 0) - return -1; - break; - default: - *depth = LIBCOOPGAMMA_DOUBLE; - if (libcoopgamma_ramps_initialise(&(ramps->d)) < 0) - return -1; - break; + /* Skip header */ + if (n - ptr < 128) + return -2; + ptr += 128; + + /* Get the number of tags */ + if (n - ptr < 4) + return -2; + n_tags = icc_uint32(content + ptr), ptr += 4; + + for (i_tag = 0, xptr = ptr; i_tag < n_tags; i_tag++, ptr = xptr) { + /* Get profile encoding type, offset to the profile and the encoding size of its data */ + if (n - ptr < 12) + return -2; + tag_name = icc_uint32(content + ptr), ptr += 4; + tag_offset = icc_uint32(content + ptr), ptr += 4; + tag_size = icc_uint32(content + ptr), ptr += 4; + xptr = ptr; + + /* Jump to the profile data */ + if (tag_offset > INT32_MAX - tag_size) + return -2; + if (tag_offset + tag_size > n) + return -2; + ptr = tag_offset; + + if (tag_name == MLUT_TAG) { + /* The profile is encododed as an dual-byte precision lookup table */ + + /* Initialise ramps */ + *depth = LIBCOOPGAMMA_UINT16; + ramps->u16.red_size = 256; + ramps->u16.green_size = 256; + ramps->u16.blue_size = 256; + if (libcoopgamma_ramps_initialise(&ramps->u16) < 0) + return -1; + + /* Get the lookup table */ + if (n - ptr < 3 * 256 * 2) + continue; + for (i = 0; i < 256; i++, ptr += 2) + ramps->u16.red[i] = icc_uint16(content + ptr); + for (i = 0; i < 256; i++, ptr += 2) + ramps->u16.green[i] = icc_uint16(content + ptr); + for (i = 0; i < 256; i++, ptr += 2) + ramps->u16.blue[i] = icc_uint16(content + ptr); + + return 0; + } else if (tag_name == VCGT_TAG) { + /* The profile is encoded as with gamma, brightness and contrast values + * or as a variable precision lookup table profile */ + + /* VCGT profiles starts where their magic number */ + if (n - ptr < 4) + continue; + tag_name = icc_uint32(content + ptr), ptr += 4; + if (tag_name != VCGT_TAG) + continue; + + /* Skip four bytes */ + if (n - ptr < 4) + continue; + ptr += 4; + + /* Get the actual encoding type */ + if (n - ptr < 4) + continue; + gamma_type = icc_uint32(content + ptr), ptr += 4; + + if (!gamma_type) { + /* The profile is encoded as a variable precision lookup table */ + + /* Get metadata */ + if (n - ptr < 3 * 4) + continue; + n_channels = (size_t)icc_uint16(content + ptr), ptr += 2; + n_entries = (size_t)icc_uint16(content + ptr), ptr += 2; + entry_size = (size_t)icc_uint16(content + ptr), ptr += 2; + if (tag_size == 1584) + n_channels = 3, n_entries = 256, entry_size = 2; + if (n_channels != 3) + /* Assuming sRGB, can only be an correct assumption if there are exactly three channels */ + continue; + + /* Check data availability */ + if (n_channels > SIZE_MAX / n_entries) + continue; + if (entry_size > SIZE_MAX / (n_entries * n_channels)) + continue; + if (n - ptr < n_channels * n_entries * entry_size) + continue; + + /* Initialise ramps */ + ramps->u8.red_size = n_entries; + ramps->u8.green_size = n_entries; + ramps->u8.blue_size = n_entries; + switch (entry_size) { + case 1: + *depth = LIBCOOPGAMMA_UINT8; + if (libcoopgamma_ramps_initialise(&ramps->u8) < 0) + return -1; + break; + case 2: + *depth = LIBCOOPGAMMA_UINT16; + if (libcoopgamma_ramps_initialise(&ramps->u16) < 0) + return -1; + break; + case 4: + *depth = LIBCOOPGAMMA_UINT32; + if (libcoopgamma_ramps_initialise(&ramps->u32) < 0) + return -1; + break; + case 8: + *depth = LIBCOOPGAMMA_UINT64; + if (libcoopgamma_ramps_initialise(&ramps->u64) < 0) + return -1; + break; + default: + *depth = LIBCOOPGAMMA_DOUBLE; + if (libcoopgamma_ramps_initialise(&ramps->d) < 0) + return -1; + break; + } + + /* Get the lookup table */ + switch (*depth) { + case LIBCOOPGAMMA_UINT8: + for (i = 0; i < ramps->u8.red_size; i++, ptr += 1) + ramps->u8.red[i] = icc_uint8(content + ptr); + for (i = 0; i < ramps->u8.green_size; i++, ptr += 1) + ramps->u8.green[i] = icc_uint8(content + ptr); + for (i = 0; i < ramps->u8.blue_size; i++, ptr += 1) + ramps->u8.blue[i] = icc_uint8(content + ptr); + break; + case LIBCOOPGAMMA_UINT16: + for (i = 0; i < ramps->u16.red_size; i++, ptr += 2) + ramps->u16.red[i] = icc_uint16(content + ptr); + for (i = 0; i < ramps->u16.green_size; i++, ptr += 2) + ramps->u16.green[i] = icc_uint16(content + ptr); + for (i = 0; i < ramps->u16.blue_size; i++, ptr += 2) + ramps->u16.blue[i] = icc_uint16(content + ptr); + break; + case LIBCOOPGAMMA_UINT32: + for (i = 0; i < ramps->u32.red_size; i++, ptr += 4) + ramps->u32.red[i] = icc_uint32(content + ptr); + for (i = 0; i < ramps->u32.green_size; i++, ptr += 4) + ramps->u32.green[i] = icc_uint32(content + ptr); + for (i = 0; i < ramps->u32.blue_size; i++, ptr += 4) + ramps->u32.blue[i] = icc_uint32(content + ptr); + break; + case LIBCOOPGAMMA_UINT64: + for (i = 0; i < ramps->u64.red_size; i++, ptr += 8) + ramps->u64.red[i] = icc_uint64(content + ptr); + for (i = 0; i < ramps->u64.green_size; i++, ptr += 8) + ramps->u64.green[i] = icc_uint64(content + ptr); + for (i = 0; i < ramps->u64.blue_size; i++, ptr += 8) + ramps->u64.blue[i] = icc_uint64(content + ptr); + break; + case LIBCOOPGAMMA_FLOAT: + case LIBCOOPGAMMA_DOUBLE: + default: + for (i = 0; i < ramps->d.red_size; i++, ptr += entry_size) + ramps->d.red[i] = icc_double(content + ptr, entry_size); + for (i = 0; i < ramps->d.green_size; i++, ptr += entry_size) + ramps->d.green[i] = icc_double(content + ptr, entry_size); + for (i = 0; i < ramps->d.blue_size; i++, ptr += entry_size) + ramps->d.blue[i] = icc_double(content + ptr, entry_size); + break; + } + + return 0; + } else if (gamma_type == 1) { + /* The profile is encoded with gamma, brightness and contrast values */ + + /* Get the gamma, brightness and contrast */ + if (n - ptr < 9 * 4) + continue; + r_gamma = icc_uint32(content + ptr), r_gamma /= 65536L, ptr += 4; + r_min = icc_uint32(content + ptr), r_min /= 65536L, ptr += 4; + r_max = icc_uint32(content + ptr), r_max /= 65536L, ptr += 4; + g_gamma = icc_uint32(content + ptr), g_gamma /= 65536L, ptr += 4; + g_min = icc_uint32(content + ptr), g_min /= 65536L, ptr += 4; + g_max = icc_uint32(content + ptr), g_max /= 65536L, ptr += 4; + b_gamma = icc_uint32(content + ptr), b_gamma /= 65536L, ptr += 4; + b_min = icc_uint32(content + ptr), b_min /= 65536L, ptr += 4; + b_max = icc_uint32(content + ptr), b_max /= 65536L, ptr += 4; + + /* Initialise ramps */ + *depth = LIBCOOPGAMMA_DOUBLE; + if (libcoopgamma_ramps_initialise(&ramps->d) < 0) + return -1; + + /* Set ramps */ + libclut_start_over(&ramps->d, (double)1, double, 1, 1, 1); + libclut_gamma(&ramps->d, (double)1, double, r_gamma, g_gamma, b_gamma); + libclut_rgb_limits(&ramps->d, (double)1, double, r_min, r_max, g_min, g_max, b_min, b_max); + + return 0; + } } - - /* Get the lookup table */ - switch (*depth) - { - case LIBCOOPGAMMA_UINT8: - for (i = 0; i < ramps->u8.red_size; i++) - ramps->u8.red[i] = icc_uint8(content + ptr), ptr += 1; - for (i = 0; i < ramps->u8.green_size; i++) - ramps->u8.green[i] = icc_uint8(content + ptr), ptr += 1; - for (i = 0; i < ramps->u8.blue_size; i++) - ramps->u8.blue[i] = icc_uint8(content + ptr), ptr += 1; - break; - case LIBCOOPGAMMA_UINT16: - for (i = 0; i < ramps->u16.red_size; i++) - ramps->u16.red[i] = icc_uint16(content + ptr), ptr += 2; - for (i = 0; i < ramps->u16.green_size; i++) - ramps->u16.green[i] = icc_uint16(content + ptr), ptr += 2; - for (i = 0; i < ramps->u16.blue_size; i++) - ramps->u16.blue[i] = icc_uint16(content + ptr), ptr += 2; - break; - case LIBCOOPGAMMA_UINT32: - for (i = 0; i < ramps->u32.red_size; i++) - ramps->u32.red[i] = icc_uint32(content + ptr), ptr += 4; - for (i = 0; i < ramps->u32.green_size; i++) - ramps->u32.green[i] = icc_uint32(content + ptr), ptr += 4; - for (i = 0; i < ramps->u32.blue_size; i++) - ramps->u32.blue[i] = icc_uint32(content + ptr), ptr += 4; - break; - case LIBCOOPGAMMA_UINT64: - for (i = 0; i < ramps->u64.red_size; i++) - ramps->u64.red[i] = icc_uint64(content + ptr), ptr += 8; - for (i = 0; i < ramps->u64.green_size; i++) - ramps->u64.green[i] = icc_uint64(content + ptr), ptr += 8; - for (i = 0; i < ramps->u64.blue_size; i++) - ramps->u64.blue[i] = icc_uint64(content + ptr), ptr += 8; - break; - default: - for (i = 0; i < ramps->d.red_size; i++) - ramps->d.red[i] = icc_double(content + ptr, entry_size), ptr += entry_size; - for (i = 0; i < ramps->d.green_size; i++) - ramps->d.green[i] = icc_double(content + ptr, entry_size), ptr += entry_size; - for (i = 0; i < ramps->d.blue_size; i++) - ramps->d.blue[i] = icc_double(content + ptr, entry_size), ptr += entry_size; - break; - } - - return 0; - } - else if (gamma_type == 1) - { - /* The profile is encoded with gamma, brightness and contrast values */ - double r_gamma, r_min, r_max, g_gamma, g_min, g_max, b_gamma, b_min, b_max; - - /* Get the gamma, brightness and contrast */ - if (n - ptr < 9 * 4) - continue; - r_gamma = icc_uint32(content + ptr), r_gamma /= 65536L, ptr += 4; - r_min = icc_uint32(content + ptr), r_min /= 65536L, ptr += 4; - r_max = icc_uint32(content + ptr), r_max /= 65536L, ptr += 4; - g_gamma = icc_uint32(content + ptr), g_gamma /= 65536L, ptr += 4; - g_min = icc_uint32(content + ptr), g_min /= 65536L, ptr += 4; - g_max = icc_uint32(content + ptr), g_max /= 65536L, ptr += 4; - b_gamma = icc_uint32(content + ptr), b_gamma /= 65536L, ptr += 4; - b_min = icc_uint32(content + ptr), b_min /= 65536L, ptr += 4; - b_max = icc_uint32(content + ptr), b_max /= 65536L, ptr += 4; - - /* Initialise ramps */ - *depth = LIBCOOPGAMMA_DOUBLE; - if (libcoopgamma_ramps_initialise(&(ramps->d)) < 0) - return -1; - - /* Set ramps */ - libclut_start_over(&(ramps->d), (double)1, double, 1, 1, 1); - libclut_gamma(&(ramps->d), (double)1, double, r_gamma, g_gamma, b_gamma); - libclut_rgb_limits(&(ramps->d), (double)1, double, r_min, r_max, g_min, g_max, b_min, b_max); - - return 0; - } } - } - - return -2; + + return -2; } @@ -679,57 +676,55 @@ static int parse_icc(const char* restrict content, size_t n, libcoopgamma_ramps_ * @return Zero on success, -1 on error, -2 if no usable data is * available in the profile. */ -static int load_icc(const char* file, libcoopgamma_ramps_t* ramps, libcoopgamma_depth_t* depth) +static int +load_icc(const char *file, libcoopgamma_ramps_t *ramps, libcoopgamma_depth_t *depth) { - char* content = NULL; - size_t ptr = 0, size = 0; - ssize_t got; - int fd = -1, r = -1, saved_errno; - - fd = open(file, O_RDONLY); - if (fd < 0) - { - if (errno == ENOENT) - { - fprintf(stderr, "%s: %s: %s\n", argv0, strerror(ENOENT), file); - errno = 0; - } - goto fail; - } - - for (;;) - { - if (ptr == size) - { - size_t new_size = size ? (size << 1) : 4098; - void* new = realloc(content, new_size); - if (new == NULL) - goto fail; - content = new; - size = new_size; + char *content = NULL; + size_t ptr = 0, size = 0; + ssize_t got; + int fd = -1, r = -1, saved_errno; + size_t new_size; + void *new; + + fd = open(file, O_RDONLY); + if (fd < 0) { + if (errno == ENOENT) { + fprintf(stderr, "%s: %s: %s\n", argv0, strerror(ENOENT), file); + errno = 0; + } + goto fail; } - got = read(fd, content + ptr, size - ptr); - if (got < 0) - { - if (errno == EINTR) - continue; - goto fail; + + for (;;) { + if (ptr == size) { + new_size = size ? (size << 1) : 4098; + new = realloc(content, new_size); + if (!new) + goto fail; + content = new; + size = new_size; + } + got = read(fd, content + ptr, size - ptr); + if (got < 0) { + if (errno == EINTR) + continue; + goto fail; + } + if (!got) + break; + ptr += (size_t)got; } - if (got == 0) - break; - ptr += (size_t)got; - } - - close(fd), fd = -1; - - r = parse_icc(content, ptr, ramps, depth); - fail: - saved_errno = errno; - if (fd >= 0) - close(fd); - free(content); - errno = saved_errno; - return r; + + close(fd), fd = -1; + + r = parse_icc(content, ptr, ramps, depth); +fail: + saved_errno = errno; + if (fd >= 0) + close(fd); + free(content); + errno = saved_errno; + return r; } @@ -739,14 +734,15 @@ static int load_icc(const char* file, libcoopgamma_ramps_t* ramps, libcoopgamma_ * @param crtc The CRTC name * @return The ICC profile file */ -static const char* get_icc(const char* crtc) +static const char * +get_icc(const char *crtc) { - size_t i; - if (crtc_icc_keys != NULL) - for (i = 0; crtc_icc_keys[i] != NULL; i++) - if (!strcasecmp(crtc, crtc_icc_keys[i])) - return crtc_icc_values[i]; - return NULL; + size_t i; + if (crtc_icc_keys) + for (i = 0; crtc_icc_keys[i]; i++) + if (!strcasecmp(crtc, crtc_icc_keys[i])) + return crtc_icc_values[i]; + return NULL; } @@ -757,40 +753,38 @@ static const char* get_icc(const char* crtc) * @param ramps The prototype filter * @param depth The prototype filter's stop datatype */ -static void fill_filter(libcoopgamma_filter_t* filter, const libcoopgamma_ramps_t* ramps, - libcoopgamma_depth_t depth) +static void +fill_filter(libcoopgamma_filter_t *filter, const libcoopgamma_ramps_t *ramps, libcoopgamma_depth_t depth) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - switch (depth)\ - {\ - case LIBCOOPGAMMA_UINT8:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->u8), UINT8_MAX, uint8_t);\ - break;\ - case LIBCOOPGAMMA_UINT16:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->u16), UINT16_MAX, uint16_t);\ - break;\ - case LIBCOOPGAMMA_UINT32:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->u32), UINT32_MAX, uint32_t);\ - break;\ - case LIBCOOPGAMMA_UINT64:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->u64), UINT64_MAX, uint64_t);\ - break;\ - case LIBCOOPGAMMA_FLOAT:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->f), (float)1, float);\ - break;\ - case LIBCOOPGAMMA_DOUBLE:\ - libclut_translate(&(filter->ramps.MEMBER), MAX, TYPE, &(ramps->d), (double)1, double);\ - break;\ - }\ - break; -LIST_DEPTHS + case CONST:\ + switch (depth) {\ + case LIBCOOPGAMMA_UINT8:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->u8, UINT8_MAX, uint8_t);\ + break;\ + case LIBCOOPGAMMA_UINT16:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->u16, UINT16_MAX, uint16_t);\ + break;\ + case LIBCOOPGAMMA_UINT32:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->u32, UINT32_MAX, uint32_t);\ + break;\ + case LIBCOOPGAMMA_UINT64:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->u64, UINT64_MAX, uint64_t);\ + break;\ + case LIBCOOPGAMMA_FLOAT:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->f, (float)1, float);\ + break;\ + case LIBCOOPGAMMA_DOUBLE:\ + libclut_translate(&filter->ramps.MEMBER, MAX, TYPE, &ramps->d, (double)1, double);\ + break;\ + }\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -802,127 +796,118 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - const char* path; - - if (xflag) - for (i = 0; i < crtcs_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < crtcs_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < crtcs_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag && (icc_pathname == NULL)) - if ((r = make_slaves()) < 0) - return cleanup(r); - - if (icc_pathname != NULL) - { - uniramps.u8.red_size = uniramps.u8.green_size = uniramps.u8.blue_size = 1; - for (i = 0; i < crtcs_n; i++) - { - if (uniramps.u8.red_size < crtc_updates[i].filter.ramps.u8.red_size) - uniramps. u8.red_size = crtc_updates[i].filter.ramps.u8.red_size; - if (uniramps.u8.green_size < crtc_updates[i].filter.ramps.u8.green_size) - uniramps. u8.green_size = crtc_updates[i].filter.ramps.u8.green_size; - if (uniramps.u8.blue_size < crtc_updates[i].filter.ramps.u8.blue_size) - uniramps. u8.blue_size = crtc_updates[i].filter.ramps.u8.blue_size; + int r; + size_t i, j; + const char *path; + + if (xflag) + for (i = 0; i < crtcs_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < crtcs_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < crtcs_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && !icc_pathname) + if ((r = make_slaves()) < 0) + return cleanup(r); + + if (icc_pathname) { + uniramps.u8.red_size = uniramps.u8.green_size = uniramps.u8.blue_size = 1; + for (i = 0; i < crtcs_n; i++) { + if (uniramps.u8.red_size < crtc_updates[i].filter.ramps.u8.red_size) + uniramps. u8.red_size = crtc_updates[i].filter.ramps.u8.red_size; + if (uniramps.u8.green_size < crtc_updates[i].filter.ramps.u8.green_size) + uniramps. u8.green_size = crtc_updates[i].filter.ramps.u8.green_size; + if (uniramps.u8.blue_size < crtc_updates[i].filter.ramps.u8.blue_size) + uniramps. u8.blue_size = crtc_updates[i].filter.ramps.u8.blue_size; + } + switch (load_icc(icc_pathname, &uniramps, &unidepth)) { + case 0: + break; + case -1: + return cleanup(-1); + case -2: + fprintf(stderr, "%s: unusable ICC profile: %s\n", argv0, icc_pathname); + return cleanup(-3); + } + } else { + rampses = calloc(crtcs_n, sizeof(*rampses)); + if (!rampses) + return cleanup(-1); + depths = malloc(crtcs_n * sizeof(*depths)); + if (!depths) + return cleanup(-1); + for (i = 0; i < crtcs_n; i++) { + rampses[i].u8.red_size = crtc_updates[i].filter.ramps.u8.red_size; + rampses[i].u8.green_size = crtc_updates[i].filter.ramps.u8.green_size; + rampses[i].u8.blue_size = crtc_updates[i].filter.ramps.u8.blue_size; + path = get_icc(crtc_updates[i].filter.crtc); + if (!path) { + /* TODO remove CRTC */ + } else { + switch (load_icc(path, rampses + i, depths + i)) { + case 0: + break; + case -1: + return cleanup(-1); + case -2: + fprintf(stderr, "%s: unusable ICC profile: %s\n", argv0, path); + return cleanup(-3); + } + } + } } - switch (load_icc(icc_pathname, &uniramps, &unidepth)) - { - case 0: - break; - case -1: - return cleanup(-1); - case -2: - fprintf(stderr, "%s: unusable ICC profile: %s\n", argv0, icc_pathname); - return cleanup(-3); + + for (i = 0, r = 1; i < crtcs_n; i++) { + if (!crtc_updates[i].master || !crtc_info[i].supported) + continue; + if (!xflag) { + if (icc_pathname) + fill_filter(&crtc_updates[i].filter, &uniramps, unidepth); + else + fill_filter(&crtc_updates[i].filter, rampses + i, depths[i]); + } + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return cleanup(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 cleanup(r); + } + } } - } - else - { - rampses = calloc(crtcs_n, sizeof(*rampses)); - if (rampses == NULL) - return cleanup(-1); - depths = malloc(crtcs_n * sizeof(*depths)); - if (depths == NULL) - return cleanup(-1); - for (i = 0; i < crtcs_n; i++) - { - rampses[i].u8.red_size = crtc_updates[i].filter.ramps.u8.red_size; - rampses[i].u8.green_size = crtc_updates[i].filter.ramps.u8.green_size; - rampses[i].u8.blue_size = crtc_updates[i].filter.ramps.u8.blue_size; - path = get_icc(crtc_updates[i].filter.crtc); - if (path == NULL) - { - /* TODO remove CRTC */ - } - else - switch (load_icc(path, rampses + i, depths + i)) - { - case 0: - break; - case -1: + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return cleanup(r); + + if (!dflag) + return cleanup(0); + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) return cleanup(-1); - case -2: - fprintf(stderr, "%s: unusable ICC profile: %s\n", argv0, path); - return cleanup(-3); - } - } - } - - for (i = 0, r = 1; i < crtcs_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[i].supported)) - continue; - if (!xflag) - { - if (icc_pathname != NULL) - fill_filter(&(crtc_updates[i].filter), &uniramps, unidepth); - else - fill_filter(&(crtc_updates[i].filter), rampses + i, depths[i]); - } - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return cleanup(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 cleanup(r); - } - } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return cleanup(r); - - if (!dflag) - return cleanup(0); - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return cleanup(-1); - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return cleanup(-1); + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return cleanup(-1); + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return cleanup(-1); + +enotrecoverable: + pause(); + return cleanup(-1); } diff --git a/cg-limits.c b/cg-limits.c index 896505f..242d46b 100644 --- a/cg-limits.c +++ b/cg-limits.c @@ -27,7 +27,7 @@ char default_class[] = PKGNAME "::cg-limits::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -44,12 +44,12 @@ static int xflag = 0; /** * -B: brightness listing file */ -static char* Bflag = NULL; +static char *Bflag = NULL; /** * -C: constrat listing file */ -static char* Cflag = NULL; +static char *Cflag = NULL; /** * The brightness of the red channel @@ -85,63 +85,64 @@ static double bcontrast = 1; * `NULL`-terminated list of output names * listed in the brightness configuration file */ -static char** brightness_names = NULL; +static char **brightness_names = NULL; /** * The brightness of the red channel on monitor * with same index in `brightness_names` */ -static double* rbrightnesses = NULL; +static double *rbrightnesses = NULL; /** * The brightness of the green channel on monitor * with same index in `brightness_names` */ -static double* gbrightnesses = NULL; +static double *gbrightnesses = NULL; /** * The brightness of the blue channel on monitor * with same index in `brightness_names` */ -static double* bbrightnesses = NULL; +static double *bbrightnesses = NULL; /** * `NULL`-terminated list of output names * listed in the contrast configuration file */ -static char** contrast_names = NULL; +static char **contrast_names = NULL; /** * The contrast of the red channel on monitor * with same index in `contrast_names` */ -static double* rcontrasts = NULL; +static double *rcontrasts = NULL; /** * The contrast of the green channel on monitor * with same index in `contrast_names` */ -static double* gcontrasts = NULL; +static double *gcontrasts = NULL; /** * The contrast of the blue channel on monitor * with same index in `contrast_names` */ -static double* bcontrasts = NULL; +static double *bcontrasts = NULL; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] (-x | [-p priority] [-d] " - "([-B brightness-file] [-C contrast-file] | brightness-all:contrast-all | " - "brightness-red:contrast-red brightness-green:contrast-green brightness-blue:contrast-blue))\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] (-x | [-p priority] [-d] " + "([-B brightness-file] [-C contrast-file] | brightness-all:contrast-all | " + "brightness-red:contrast-red brightness-green:contrast-green brightness-blue:contrast-blue))\n", + argv0); + exit(1); } @@ -151,31 +152,27 @@ void usage(void) * @param ret The value to return * @return `ret` is returned as is */ -static int cleanup(int ret) +static int +cleanup(int ret) { - int saved_errno = errno; - if (brightness_names != NULL) - { - char** p = brightness_names; - while (*p) - free(*p++); - } - free(brightness_names); - free(rbrightnesses); - free(gbrightnesses); - free(bbrightnesses); - if (contrast_names != NULL) - { - char** p = contrast_names; - while (*p) - free(*p++); - } - free(contrast_names); - free(rcontrasts); - free(gcontrasts); - free(bcontrasts); - errno = saved_errno; - return ret; + int saved_errno = errno; + char **p; + if (brightness_names) + for (p = brightness_names; *p; p++) + free(*p); + free(brightness_names); + free(rbrightnesses); + free(gbrightnesses); + free(bbrightnesses); + if (contrast_names) + for (p = contrast_names; *p; p++) + free(*p); + free(contrast_names); + free(rcontrasts); + free(gcontrasts); + free(bcontrasts); + errno = saved_errno; + return ret; } @@ -193,33 +190,34 @@ static int cleanup(int ret) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - case 'B': - if (Bflag || !(Bflag = arg)) - usage(); - return 1; - case 'C': - if (Cflag || !(Cflag = arg)) - usage(); - return 1; - default: - usage(); - } - return 0; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + case 'B': + if (Bflag || !(Bflag = arg)) + usage(); + return 1; + case 'C': + if (Cflag || !(Cflag = arg)) + usage(); + return 1; + default: + usage(); + } + } + return 0; } @@ -229,25 +227,26 @@ int handle_opt(char* opt, char* arg) * @param confname The filename (excluding directory) of the configuration file * @return The full pathname of the configuration file, `NULL` on error */ -static char* get_conf_file(const char* restrict confname) +static char * +get_conf_file(const char *restrict confname) { - struct passwd* pw; - char* path; - - pw = getpwuid(getuid()); - if ((pw == NULL) || (pw->pw_dir == NULL)) - return NULL; - - path = malloc(strlen(pw->pw_dir) + strlen(confname) + sizeof("/.config/")); - if (path == NULL) - return NULL; - - sprintf(path, "%s/.config/%s", pw->pw_dir, confname); - - if (access(path, F_OK) < 0) - sprintf(path, "/etc/%s", confname); - - return path; + struct passwd *pw; + char *path; + + pw = getpwuid(getuid()); + if (!pw || !pw->pw_dir) + return NULL; + + path = malloc(strlen(pw->pw_dir) + strlen(confname) + sizeof("/.config/")); + if (!path) + return NULL; + + sprintf(path, "%s/.config/%s", pw->pw_dir, confname); + + if (access(path, F_OK) < 0) + sprintf(path, "/etc/%s", confname); + + return path; } @@ -258,16 +257,17 @@ static char* get_conf_file(const char* restrict confname) * @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 || 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 || isinf(*out) || isnan(*out) || *end) + return -1; + if (!*str || !strchr("-0123456789.", *str)) + return -1; + return 0; } @@ -279,16 +279,17 @@ static int parse_double(double* restrict out, const char* restrict str) * @param str The string * @return Zero on success, -1 if the string is invalid */ -static int parse_twidouble(double* restrict left, double* restrict right, const char* restrict str) +static int +parse_twidouble(double *restrict left, double *restrict right, const char *restrict str) { - char* p = strchr(str, ':'); - int r; - if (p == NULL) - return -1; - *p = '\0'; - r = -((parse_double(left, str) < 0) || (parse_double(right, p + 1) < 0)); - *p = ':'; - return r; + char *p = strchr(str, ':'); + int r; + if (!p) + return -1; + *p = '\0'; + r = -(parse_double(left, str) < 0 || parse_double(right, &p[1]) < 0); + *p = ':'; + return r; } @@ -302,143 +303,137 @@ static int parse_twidouble(double* restrict left, double* restrict right, const * @param bs Reference to the list of blue values * @return Zero on success, -1 on error */ -static int parse_conf_file(const char* restrict pathname, char*** restrict names, - double** restrict rs, double** restrict gs, double** restrict bs) +static int +parse_conf_file(const char *restrict pathname, char ***restrict names, + double **restrict rs, double **restrict gs, double **restrict bs) { - int fd, saved_errno; - char* line = NULL; - size_t size = 0, lineno = 0, ptr = 0, alloc = 0; - ssize_t n; - FILE* f = NULL; - char* p; - char* q; - char* r; - char* g; - char* b; - - fd = open(pathname, O_RDONLY); - if (fd == -1) - return -1; - - f = fdopen(fd, "rb"); - if (f == NULL) - goto fail; - - while (n = getline(&line, &size, f), n >= 0) - { - lineno += 1; - - if ((n > 0) && (line[n - 1] == '\n')) - line[n - 1] = '\0'; - p = line; - while ((*p == ' ') || (*p == '\t')) p++; - if ((!*p) || (*p == '#')) - continue; - - r = strpbrk(line, " \t"); - if (r == NULL) - goto bad; - while (r[1] == ' ' || r[1] == '\t') r++; - g = strpbrk(r + 1, " \t"); - if (g == NULL) - goto bad; - while (g[1] == ' ' || g[1] == '\t') g++; - b = strpbrk(g + 1, " \t"); - if (b == NULL) - goto bad; - while (b[1] == ' ' || b[1] == '\t') b++; - - for (;;) - { - q = strpbrk(b + 1, " \t"); - if (q == NULL) - break; - while (q[1] == ' ' || q[1] == '\t') q++; - if (!*q) - break; - r = g, g = b, b = q; + int fd, saved_errno; + char *line = NULL; + size_t size = 0, lineno = 0, ptr = 0, alloc = 0; + ssize_t n; + FILE *f = NULL; + char *p, *q; + char *r, *g, *b; + void *new; + size_t new_size; + + fd = open(pathname, O_RDONLY); + if (fd < 0) + return -1; + + f = fdopen(fd, "rb"); + if (!f) + goto fail; + + while ((n = getline(&line, &size, f)) >= 0) { + lineno += 1; + + if (n > 0 && line[n - 1] == '\n') + line[n - 1] = '\0'; + for (p = line; *p == ' ' || *p == '\t'; p++); + if (!*p || *p == '#') + continue; + + r = strpbrk(line, " \t"); + if (!r) + goto bad; + for (; r[1] == ' ' || r[1] == '\t'; r++); + g = strpbrk(r + 1, " \t"); + if (!g) + goto bad; + for (; g[1] == ' ' || g[1] == '\t'; g++); + b = strpbrk(g + 1, " \t"); + if (!b) + goto bad; + for (; b[1] == ' ' || b[1] == '\t'; b++); + + for (;;) { + q = strpbrk(b + 1, " \t"); + if (!q) + break; + for (;q[1] == ' ' || q[1] == '\t'; q++); + if (!*q) + break; + r = g, g = b, b = q; + } + + *r++ = '\0'; + *g++ = '\0'; + *b++ = '\0'; + + q = strpbrk(r, " \t"); + if (!q) + *q = '\0'; + q = strpbrk(g, " \t"); + if (!q) + *q = '\0'; + q = strpbrk(b, " \t"); + if (!q) + *q = '\0'; + + q = strchr(p, '\0'); + while (q != p && (q[-1] == ' ' || q[-1] == '\t')) + q--; + *q = '\0'; + + if (ptr == alloc) { + new_size= alloc ? (alloc << 1) : 4; + + new = realloc(*rs, new_size * sizeof(**rs)); + if (!new) + goto fail; + *rs = new; + + new = realloc(*gs, new_size * sizeof(**gs)); + if (!new) + goto fail; + *gs = new; + + new = realloc(*bs, new_size * sizeof(**bs)); + if (!new) + goto fail; + *bs = new; + + new = realloc(*names, (new_size + 1) * sizeof(**names)); + if (!new) + goto fail; + *names = new; + memset(*names + alloc, 0, (new_size + 1 - alloc) * sizeof(**names)); + + alloc = new_size; + } + + if (parse_double((*rs) + ptr, r) < 0 || + parse_double((*gs) + ptr, g) < 0 || + parse_double((*bs) + ptr, b) < 0) + goto bad; + (*names)[ptr] = malloc(strlen(p) + 1); + if (!(*names)[ptr]) + goto fail; + strcpy((*names)[ptr], p); + ptr++; + + continue; + bad: + fprintf(stderr, "%s: ignoring malformatted line in %s: %zu\n", argv0, pathname, lineno); } - - *r++ = '\0'; - *g++ = '\0'; - *b++ = '\0'; - - q = strpbrk(r, " \t"); - if (q != NULL) - *q = '\0'; - q = strpbrk(g, " \t"); - if (q != NULL) - *q = '\0'; - q = strpbrk(b, " \t"); - if (q != NULL) - *q = '\0'; - - q = strchr(p, '\0'); - while ((q != p) && ((q[-1] == ' ') || (q[-1] == '\t'))) - q--; - *q = '\0'; - - if (ptr == alloc) - { - void* new; - size_t new_size = alloc ? (alloc << 1) : 4; - - new = realloc(*rs, new_size * sizeof(**rs)); - if (new == NULL) - goto fail; - *rs = new; - - new = realloc(*gs, new_size * sizeof(**gs)); - if (new == NULL) - goto fail; - *gs = new; - - new = realloc(*bs, new_size * sizeof(**bs)); - if (new == NULL) - goto fail; - *bs = new; - - new = realloc(*names, (new_size + 1) * sizeof(**names)); - if (new == NULL) - goto fail; - *names = new; - memset(*names + alloc, 0, (new_size + 1 - alloc) * sizeof(**names)); - - alloc = new_size; + + if (fclose(f) < 0) { + f = NULL; + goto fail; } - - if ((parse_double((*rs) + ptr, r) < 0) || - (parse_double((*gs) + ptr, g) < 0) || - (parse_double((*bs) + ptr, b) < 0)) - goto bad; - (*names)[ptr] = malloc(strlen(p) + 1); - if ((*names)[ptr] == NULL) - goto fail; - strcpy((*names)[ptr], p); - ptr++; - - continue; - bad: - fprintf(stderr, "%s: ignoring malformatted line in %s: %zu\n", argv0, pathname, lineno); - } - - if (fclose(f) < 0) - { - f = NULL; - goto fail; - } - close(fd); - free(line); - return 0; - fail: - saved_errno = errno; - free(line); - if (f != NULL) - fclose(f); - if (fd >= 0) - close(fd); - errno = saved_errno; - return -1; + close(fd); + free(line); + return 0; +fail: + saved_errno = errno; + free(line); + if (f) + fclose(f); + if (fd >= 0) + close(fd); + errno = saved_errno; + return -1; } @@ -448,9 +443,10 @@ static int parse_conf_file(const char* restrict pathname, char*** restrict names * @param pathname The pathname of the file * @return Zero on success, -1 on error */ -static int parse_brightness_file(const char* restrict pathname) +static int +parse_brightness_file(const char *restrict pathname) { - return parse_conf_file(pathname, &brightness_names, &rbrightnesses, &gbrightnesses, &bbrightnesses); + return parse_conf_file(pathname, &brightness_names, &rbrightnesses, &gbrightnesses, &bbrightnesses); } @@ -460,9 +456,10 @@ static int parse_brightness_file(const char* restrict pathname) * @param pathname The pathname of the file * @return Zero on success, -1 on error */ -static int parse_contrast_file(const char* restrict pathname) +static int +parse_contrast_file(const char *restrict pathname) { - return parse_conf_file(pathname, &contrast_names, &rcontrasts, &gcontrasts, &bcontrasts); + return parse_conf_file(pathname, &contrast_names, &rcontrasts, &gcontrasts, &bcontrasts); } @@ -475,69 +472,71 @@ static int parse_contrast_file(const char* restrict pathname) * @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 free_Bflag = 0, free_Cflag = 0, saved_errno; - int q = xflag + dflag; - if ((q > 1) || (xflag && ((Bflag != NULL) || (Cflag != NULL) || (argc > 0) || (prio != NULL)))) - usage(); - if ((Bflag || Cflag) && argc) - usage(); - - if (argc == 1) - { - if (parse_twidouble(&rbrightness, &rcontrast, argv[0]) < 0) - usage(); - bbrightness = gbrightness = rbrightness; - bcontrast = gcontrast = rcontrast; - } - else if (argc == 3) - { - if (parse_twidouble(&rbrightness, &rcontrast, argv[0]) < 0) - usage(); - if (parse_twidouble(&gbrightness, &gcontrast, argv[1]) < 0) - usage(); - if (parse_twidouble(&bbrightness, &bcontrast, argv[2]) < 0) - usage(); - } - else if (argc) - usage(); - - if (!argc && !Bflag && !xflag) - { - Bflag = get_conf_file("brightness"); - if (Bflag == NULL) - return -1; - free_Bflag = 1; - } - if (Bflag) - if (parse_brightness_file(Bflag) < 0) - goto fail; - if (free_Bflag) - free(Bflag), Bflag = NULL; - - if (!argc && !Cflag && !xflag) - { - Cflag = get_conf_file("contrast"); - if (Cflag == NULL) - return -1; - free_Cflag = 1; - } - if (Cflag) - if (parse_contrast_file(Cflag) < 0) - goto fail; - if (free_Cflag) - free(Cflag), Cflag = NULL; - - return 0; - fail: - saved_errno = errno; - if (free_Bflag) - free(Bflag), Bflag = NULL; - if (free_Cflag) - free(Cflag), Cflag = NULL; - errno = saved_errno; - return cleanup(-1); + int free_Bflag = 0, free_Cflag = 0, saved_errno; + int q = xflag + dflag; + if (q > 1 || (xflag && (Bflag || Cflag || argc > 0 || prio))) + usage(); + if ((Bflag || Cflag) && argc) + usage(); + + if (argc == 1) { + if (parse_twidouble(&rbrightness, &rcontrast, argv[0]) < 0) + usage(); + bbrightness = gbrightness = rbrightness; + bcontrast = gcontrast = rcontrast; + } else if (argc == 3) { + if (parse_twidouble(&rbrightness, &rcontrast, argv[0]) < 0) + usage(); + if (parse_twidouble(&gbrightness, &gcontrast, argv[1]) < 0) + usage(); + if (parse_twidouble(&bbrightness, &bcontrast, argv[2]) < 0) + usage(); + } else if (argc) { + usage(); + } + + if (!argc && !Bflag && !xflag) { + Bflag = get_conf_file("brightness"); + if (!Bflag) + return -1; + free_Bflag = 1; + } + if (Bflag && parse_brightness_file(Bflag) < 0) + goto fail; + if (free_Bflag) { + free(Bflag); + Bflag = NULL; + } + + if (!argc && !Cflag && !xflag) { + Cflag = get_conf_file("contrast"); + if (!Cflag) + return -1; + free_Cflag = 1; + } + if (Cflag && parse_contrast_file(Cflag) < 0) + goto fail; + if (free_Cflag) { + free(Cflag); + Cflag = NULL; + } + + return 0; +fail: + saved_errno = errno; + if (free_Bflag) { + free(Bflag); + Bflag = NULL; + } + if (free_Cflag) { + free(Cflag); + Cflag = NULL; + } + errno = saved_errno; + return cleanup(-1); } @@ -553,58 +552,57 @@ int handle_args(int argc, char* argv[], char* prio) * @param bc The blue contrast * @return Zero on success, -1 on error */ -static int fill_filter(libcoopgamma_filter_t* restrict filter, - double rb, double rc, double gb, double gc, double bb, double bc) +static int +fill_filter(libcoopgamma_filter_t *restrict filter, double rb, double rc, double gb, double gc, double bb, double bc) { - union libcoopgamma_ramps dramps; - size_t size; - - if (filter->depth == LIBCOOPGAMMA_DOUBLE) - { - libclut_rgb_limits(&(filter->ramps.d), (double)1, double, rb, rc, gb, gc, bb, bc); - libclut_clip(&(filter->ramps.d), (double)1, double, 1, 1, 1); - return 0; - } - if (filter->depth == LIBCOOPGAMMA_FLOAT) - { - libclut_rgb_limits(&(filter->ramps.f), (float)1, float, rb, rc, gb, gc, bb, bc); - libclut_clip(&(filter->ramps.f), (float)1, float, 1, 1, 1); - return 0; - } + union libcoopgamma_ramps dramps; + size_t size; - size = dramps.d.red_size = filter->ramps.d.red_size; - size += dramps.d.green_size = filter->ramps.d.green_size; - size += dramps.d.blue_size = filter->ramps.d.blue_size; - dramps.d.red = calloc(size, sizeof(double)); - if (dramps.d.red == NULL) - return -1; - dramps.d.green = dramps.d.red + dramps.d.red_size; - dramps.d.blue = dramps.d.green + dramps.d.green_size; - - libclut_start_over(&(dramps.d), (double)1, double, 1, 1, 1); - libclut_rgb_limits(&(dramps.d), (double)1, double, rb, rc, gb, gc, bb, bc); - libclut_clip(&(dramps.d), (double)1, double, 1, 1, 1); - - switch (filter->depth) - { - case LIBCOOPGAMMA_UINT8: - libclut_translate(&(filter->ramps.u8), UINT8_MAX, uint8_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT16: - libclut_translate(&(filter->ramps.u16), UINT16_MAX, uint16_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT32: - libclut_translate(&(filter->ramps.u32), UINT32_MAX, uint32_t, &(dramps.d), (double)1, double); - break; - case LIBCOOPGAMMA_UINT64: - libclut_translate(&(filter->ramps.u64), UINT64_MAX, uint64_t, &(dramps.d), (double)1, double); - break; - default: - abort(); - } - - free(dramps.d.red); - return 0; + if (filter->depth == LIBCOOPGAMMA_DOUBLE) { + libclut_rgb_limits(&filter->ramps.d, (double)1, double, rb, rc, gb, gc, bb, bc); + libclut_clip(&filter->ramps.d, (double)1, double, 1, 1, 1); + return 0; + } + if (filter->depth == LIBCOOPGAMMA_FLOAT) { + libclut_rgb_limits(&filter->ramps.f, (float)1, float, rb, rc, gb, gc, bb, bc); + libclut_clip(&filter->ramps.f, (float)1, float, 1, 1, 1); + return 0; + } + + size = dramps.d.red_size = filter->ramps.d.red_size; + size += dramps.d.green_size = filter->ramps.d.green_size; + size += dramps.d.blue_size = filter->ramps.d.blue_size; + dramps.d.red = calloc(size, sizeof(double)); + if (!dramps.d.red) + return -1; + dramps.d.green = dramps.d.red + dramps.d.red_size; + dramps.d.blue = dramps.d.green + dramps.d.green_size; + + libclut_start_over(&dramps.d, (double)1, double, 1, 1, 1); + libclut_rgb_limits(&dramps.d, (double)1, double, rb, rc, gb, gc, bb, bc); + libclut_clip(&dramps.d, (double)1, double, 1, 1, 1); + + switch (filter->depth) { + case LIBCOOPGAMMA_UINT8: + libclut_translate(&filter->ramps.u8, UINT8_MAX, uint8_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT16: + libclut_translate(&filter->ramps.u16, UINT16_MAX, uint16_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT32: + libclut_translate(&filter->ramps.u32, UINT32_MAX, uint32_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_UINT64: + libclut_translate(&filter->ramps.u64, UINT64_MAX, uint64_t, &dramps.d, (double)1, double); + break; + case LIBCOOPGAMMA_FLOAT: + case LIBCOOPGAMMA_DOUBLE: + default: + abort(); + } + + free(dramps.d.red); + return 0; } @@ -616,99 +614,105 @@ static int fill_filter(libcoopgamma_filter_t* restrict filter, * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j, k; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag && ((brightness_names != NULL) || (contrast_names != NULL))) - if ((r = make_slaves()) < 0) - return cleanup(r); - - if ((brightness_names == NULL) && (contrast_names == NULL)) - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - if ((r = fill_filter(&(crtc_updates[i].filter), rbrightness, rcontrast, - gbrightness, gcontrast, bbrightness, bcontrast)) < 0) - return cleanup(r); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return cleanup(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 cleanup(r); - } - } - else - { - char* empty = NULL; - char** bnames = brightness_names ? brightness_names : ∅ - char** cnames = contrast_names ? contrast_names : ∅ - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_info[crtc_updates[i].crtc].supported)) - continue; - for (j = 0; bnames[j] != NULL; j++) - if (!strcasecmp(crtc_updates[i].filter.crtc, bnames[j])) - break; - for (k = 0; cnames[k] != NULL; k++) - if (!strcasecmp(crtc_updates[i].filter.crtc, cnames[k])) - break; - if ((bnames[j] != NULL) || (cnames[k] != NULL)) - { - double rb = 0, gb = 0, bb = 0, rc = 1, bc = 1, gc = 1; - if (bnames[j] != NULL) - rb = rbrightnesses[j], gb = gbrightnesses[j], bb = bbrightnesses[j]; - if (cnames[j] != NULL) - rc = rcontrasts[j], gc = gcontrasts[j], bc = bcontrasts[j]; - if ((r = fill_filter(&(crtc_updates[i].filter), rb, rc, gb, gc, bb, bc)) < 0) - return cleanup(r); - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return cleanup(r); - } + int r; + size_t i, j, k; + char *empty = NULL; + char **bnames, **cnames; + double rb, gb, bb, rc, bc, gc; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && (brightness_names || contrast_names)) + if ((r = make_slaves()) < 0) + return cleanup(r); + + if (!brightness_names && !contrast_names) { + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) + if ((r = fill_filter(&crtc_updates[i].filter, rbrightness, rcontrast, + gbrightness, gcontrast, bbrightness, bcontrast)) < 0) + return cleanup(r); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return cleanup(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 cleanup(r); + } + } + } + } else { + bnames = brightness_names ? brightness_names : ∅ + cnames = contrast_names ? contrast_names : ∅ + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_info[crtc_updates[i].crtc].supported) + continue; + for (j = 0; bnames[j]; j++) + if (!strcasecmp(crtc_updates[i].filter.crtc, bnames[j])) + break; + for (k = 0; cnames[k]; k++) + if (!strcasecmp(crtc_updates[i].filter.crtc, cnames[k])) + break; + if (bnames[j] || cnames[k]) { + rb = gb = bb = 0; + rc = bc = gc = 1; + if (bnames[j]) { + rb = rbrightnesses[j]; + gb = gbrightnesses[j]; + bb = bbrightnesses[j]; + } + if (cnames[j]) { + rc = rcontrasts[j]; + gc = gcontrasts[j]; + bc = bcontrasts[j]; + } + if ((r = fill_filter(&crtc_updates[i].filter, rb, rc, gb, gc, bb, bc)) < 0) + return cleanup(r); + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return cleanup(r); + } + } } - } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return cleanup(r); - - if (!dflag) - return cleanup(0); - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return cleanup(-1); - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return cleanup(-1); + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return cleanup(r); + + if (!dflag) + return cleanup(0); + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return cleanup(-1); + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return cleanup(-1); + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return cleanup(-1); + +enotrecoverable: + pause(); + return cleanup(-1); } diff --git a/cg-linear.c b/cg-linear.c index 554478e..872b1e5 100644 --- a/cg-linear.c +++ b/cg-linear.c @@ -24,7 +24,7 @@ char default_class[] = PKGNAME "::cg-linear::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){":start", ":stop", NULL}; +const char *const *class_suffixes = (const char *const[]){":start", ":stop", NULL}; @@ -68,13 +68,14 @@ static int64_t stop_priority; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule-base] " - "(-x | -p start-priority:stop-priority [-d] [+rgb])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule-base] " + "(-x | -p start-priority:stop-priority [-d] [+rgb])\n", + argv0); + exit(1); } @@ -92,47 +93,47 @@ void usage(void) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - else - switch (opt[1]) - { - case 'r': - if (rplus) - usage(); - rplus = 1; - break; - case 'g': - if (gplus) - usage(); - gplus = 1; - break; - case 'b': - if (bplus) - usage(); - bplus = 1; - break; - default: - usage(); - } - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } else { + switch (opt[1]) { + case 'r': + if (rplus) + usage(); + rplus = 1; + break; + case 'g': + if (gplus) + usage(); + gplus = 1; + break; + case 'b': + if (bplus) + usage(); + bplus = 1; + break; + default: + usage(); + } + } + return 0; + (void) arg; } @@ -145,31 +146,31 @@ int handle_opt(char* opt, char* arg) * @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 = xflag + (dflag | rplus | gplus | bplus); - char *p, *end; - if (argc || (q > 1) || (xflag && (prio != NULL))) - usage(); - if (!xflag && (prio == NULL)) - usage(); - if (prio != NULL) - { - p = strchr(prio, ':'); - if (!p) - usage(); - *p++ = '\0'; - errno = 0; - start_priority = (size_t)strtoul(prio, &end, 10); - if (errno || *end || !*prio) - usage(); - stop_priority = (size_t)strtoul(p, &end, 10); - if (errno || *end || !*prio) - usage(); - p[-1] = ':'; - } - return 0; - (void) argv; + int q = xflag + (dflag | rplus | gplus | bplus); + char *p, *end; + if (argc || q > 1 || (xflag && prio)) + usage(); + if (!xflag && !prio) + usage(); + if (prio) { + p = strchr(prio, ':'); + if (!p) + usage(); + *p++ = '\0'; + errno = 0; + start_priority = (int64_t)strtoll(prio, &end, 10); + if (errno || *end || !*prio) + usage(); + stop_priority = (int64_t)strtoll(p, &end, 10); + if (errno || *end || !*prio) + usage(); + p[-1] = ':'; + } + return 0; + (void) argv; } @@ -179,22 +180,22 @@ int handle_args(int argc, char* argv[], char* prio) * @param filter The filter to fill * @param is_start If the fitler is a linearisation filter */ -static void fill_filter(libcoopgamma_filter_t* restrict filter, int is_start) +static void +fill_filter(libcoopgamma_filter_t *restrict filter, int is_start) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - if (is_start)\ - libclut_linearise(&(filter->ramps.MEMBER), MAX, TYPE, !rplus, !gplus, !bplus);\ - else\ - libclut_standardise(&(filter->ramps.MEMBER), MAX, TYPE, !rplus, !gplus, !bplus);\ - break; -LIST_DEPTHS + case CONST:\ + if (is_start)\ + libclut_linearise(&filter->ramps.MEMBER, MAX, TYPE, !rplus, !gplus, !bplus);\ + else\ + libclut_standardise(&filter->ramps.MEMBER, MAX, TYPE, !rplus, !gplus, !bplus);\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -206,58 +207,58 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) { - int is_start = strchr(crtc_updates[i].filter.class, '\0')[-1] == 't'; - fill_filter(&(crtc_updates[i].filter), is_start); - crtc_updates[i].filter.priority = is_start ? start_priority : stop_priority; - } - r = update_filter(i, 0); - if ((r == -2) || ((r == -1) && (errno != EAGAIN))) - return r; - } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return r; - - if (!dflag) - return 0; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return -1; + int r, is_start; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) { + is_start = strchr(crtc_updates[i].filter.class, '\0')[-1] == 't'; + fill_filter(&crtc_updates[i].filter, is_start); + crtc_updates[i].filter.priority = is_start ? start_priority : stop_priority; + } + r = update_filter(i, 0); + if (r == -2 || (r == -1 && errno != EAGAIN)) + return r; + } + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + if (!dflag) + return 0; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return -1; + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + +enotrecoverable: + pause(); + return -1; } diff --git a/cg-negative.c b/cg-negative.c index be5f2a0..32fad71 100644 --- a/cg-negative.c +++ b/cg-negative.c @@ -24,7 +24,7 @@ char default_class[] = PKGNAME "::cg-negative::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -58,12 +58,13 @@ static int bplus = 0; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] (-x | [-p priority] [-d] [+rgb])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] (-x | [-p priority] [-d] [+rgb])\n", + argv0); + exit(1); } @@ -81,47 +82,47 @@ void usage(void) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - else - switch (opt[1]) - { - case 'r': - if (rplus) - usage(); - rplus = 1; - break; - case 'g': - if (gplus) - usage(); - gplus = 1; - break; - case 'b': - if (bplus) - usage(); - bplus = 1; - break; - default: - usage(); - } - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } else { + switch (opt[1]) { + case 'r': + if (rplus) + usage(); + rplus = 1; + break; + case 'g': + if (gplus) + usage(); + gplus = 1; + break; + case 'b': + if (bplus) + usage(); + bplus = 1; + break; + default: + usage(); + } + } + return 0; + (void) arg; } @@ -134,13 +135,14 @@ int handle_opt(char* opt, char* arg) * @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 = xflag + (dflag | rplus | gplus | bplus); - if (argc || (q > 1) || (xflag && (prio != NULL))) - usage(); - return 0; - (void) argv; + int q = xflag + (dflag | rplus | gplus | bplus); + if (argc || q > 1 || (xflag && prio)) + usage(); + return 0; + (void) argv; } @@ -149,19 +151,19 @@ int handle_args(int argc, char* argv[], char* prio) * * @param filter The filter to fill */ -static void fill_filter(libcoopgamma_filter_t* restrict filter) +static void +fill_filter(libcoopgamma_filter_t *restrict filter) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libclut_negative(&(filter->ramps.MEMBER), MAX, TYPE, !rplus, !gplus, !bplus);\ - break; -LIST_DEPTHS + case CONST:\ + libclut_negative(&filter->ramps.MEMBER, MAX, TYPE, !rplus, !gplus, !bplus);\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -173,66 +175,65 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag) - if ((r = make_slaves()) < 0) - return r; - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - fill_filter(&(crtc_updates[i].filter)); - 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; - - if (!dflag) - return 0; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return -1; + int r; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && (r = make_slaves()) < 0) + return r; + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) + fill_filter(&crtc_updates[i].filter); + 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; + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + if (!dflag) + return 0; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return -1; + } + } + } + +enotrecoverable: + pause(); + return -1; } @@ -25,19 +25,20 @@ static libcoopgamma_filter_query_t query; /** * The class of the filter to print */ -static char* class = NULL; +static char *class = NULL; /** * Print usage information and exit */ -static void usage(void) +static void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-h high] [-l low] [-f class] -c crtc\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-h high] [-l low] [-f class] -c crtc\n", + argv0); + exit(1); } @@ -47,22 +48,23 @@ static void usage(void) * * @return Zero on success, -1 on error */ -static int initialise_proc(void) +static int +initialise_proc(void) { - sigset_t sigmask; - int sig; - - for (sig = 1; sig < _NSIG; sig++) - if (signal(sig, SIG_DFL) == SIG_ERR) - if (sig == SIGCHLD) - return -1; - - if (sigemptyset(&sigmask) < 0) - return -1; - if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) - return -1; - - return 0; + sigset_t sigmask; + int sig; + + for (sig = 1; sig < _NSIG; sig++) + if (signal(sig, SIG_DFL) == SIG_ERR) + if (sig == SIGCHLD) + return -1; + + if (sigemptyset(&sigmask) < 0) + return -1; + if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) + return -1; + + return 0; } @@ -72,21 +74,22 @@ static int initialise_proc(void) * * @return Zero on success, -1 on error */ -static int list_methods(void) +static int +list_methods(void) { - char** list; - size_t i; - - list = libcoopgamma_get_methods(); - if (list == NULL) - return -1; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_methods(); + if (!list) + return -1; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -99,21 +102,22 @@ static int list_methods(void) * @return Zero on success, -1 on error, -2 * on libcoopgamma error */ -static int list_crtcs(void) +static int +list_crtcs(void) { - char** list; - size_t i; - - list = libcoopgamma_get_crtcs_sync(&cg); - if (list == NULL) - return -2; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_crtcs_sync(&cg); + if (!list) + return -2; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -125,113 +129,108 @@ static int list_crtcs(void) * on libcoopgamma error, -3 on error * with error message already printed */ -static int print_info(void) +static int +print_info(void) { - libcoopgamma_crtc_info_t info; - libcoopgamma_filter_table_t table; - const char* str; - int saved_errno, ret = 0; - size_t i; - - if (libcoopgamma_crtc_info_initialise(&info) < 0) - return -1; - if (libcoopgamma_filter_table_initialise(&table) < 0) - { - saved_errno = errno; - libcoopgamma_crtc_info_destroy(&info); - errno = saved_errno; - return -1; - } - - if (libcoopgamma_get_gamma_info_sync(query.crtc, &info, &cg) < 0) - goto cg_fail; - - printf("Cooperative gamma server running: %s\n", - info.cooperative ? "yes" : "no"); - - printf("Gamma adjustments supported: %s\n", - info.supported == LIBCOOPGAMMA_MAYBE ? "maybe" : info.supported ? "yes" : "no"); - - printf("Gamma ramps stops (red green blue): %zu %zu %zu\n", - info.red_size, info.green_size, info.blue_size); - - switch (info.depth) - { - case LIBCOOPGAMMA_DOUBLE: str = "double-precision floating-point"; break; - case LIBCOOPGAMMA_FLOAT: str = "single-precision floating-point"; break; - case LIBCOOPGAMMA_UINT8: str = "unsigned 8-bit integer"; break; - case LIBCOOPGAMMA_UINT16: str = "unsigned 16-bit integer"; break; - case LIBCOOPGAMMA_UINT32: str = "unsigned 32-bit integer"; break; - case LIBCOOPGAMMA_UINT64: str = "unsigned 64-bit integer"; break; - default: - errno = EPROTO; - goto fail; - } - printf("Gamma ramps stops value type: %s\n", str); - - if (info.colourspace != LIBCOOPGAMMA_UNKNOWN) - { - switch (info.colourspace) - { - case LIBCOOPGAMMA_SRGB: str = "sRGB"; break; - case LIBCOOPGAMMA_RGB: str = "non-standard RGB"; break; - case LIBCOOPGAMMA_NON_RGB: str = "non-RGB multicolour"; break; - case LIBCOOPGAMMA_GREY: str = "monochrome or singlecolour scale"; break; + libcoopgamma_crtc_info_t info; + libcoopgamma_filter_table_t table; + const char *str; + int saved_errno, ret = 0; + size_t i; + + if (libcoopgamma_crtc_info_initialise(&info) < 0) + return -1; + if (libcoopgamma_filter_table_initialise(&table) < 0) { + saved_errno = errno; + libcoopgamma_crtc_info_destroy(&info); + errno = saved_errno; + return -1; + } + + if (libcoopgamma_get_gamma_info_sync(query.crtc, &info, &cg) < 0) + goto cg_fail; + + printf("Cooperative gamma server running: %s\n", + info.cooperative ? "yes" : "no"); + + printf("Gamma adjustments supported: %s\n", + info.supported == LIBCOOPGAMMA_MAYBE ? "maybe" : info.supported ? "yes" : "no"); + + printf("Gamma ramps stops (red green blue): %zu %zu %zu\n", + info.red_size, info.green_size, info.blue_size); + + switch (info.depth) { + case LIBCOOPGAMMA_DOUBLE: str = "double-precision floating-point"; break; + case LIBCOOPGAMMA_FLOAT: str = "single-precision floating-point"; break; + case LIBCOOPGAMMA_UINT8: str = "unsigned 8-bit integer"; break; + case LIBCOOPGAMMA_UINT16: str = "unsigned 16-bit integer"; break; + case LIBCOOPGAMMA_UINT32: str = "unsigned 32-bit integer"; break; + case LIBCOOPGAMMA_UINT64: str = "unsigned 64-bit integer"; break; default: - errno = EPROTO; - goto fail; + errno = EPROTO; + goto fail; + } + printf("Gamma ramps stops value type: %s\n", str); + + if (info.colourspace != LIBCOOPGAMMA_UNKNOWN) { + switch (info.colourspace) { + case LIBCOOPGAMMA_SRGB: str = "sRGB"; break; + case LIBCOOPGAMMA_RGB: str = "non-standard RGB"; break; + case LIBCOOPGAMMA_NON_RGB: str = "non-RGB multicolour"; break; + case LIBCOOPGAMMA_GREY: str = "monochrome or singlecolour scale"; break; + case LIBCOOPGAMMA_UNKNOWN: + default: + errno = EPROTO; + goto fail; + } + printf("Monitor's colourspace: %s\n", str); + } + + if (info.have_gamut) { + printf("Monitor's red colour (x, y): %lf, %lf\n", + info.red_x / (double)1024, info.red_y / (double)1024); + + printf("Monitor's green colour (x, y): %lf, %lf\n", + info.green_x / (double)1024, info.green_y / (double)1024); + + printf("Monitor's blue colour (x, y): %lf, %lf\n", + info.blue_x / (double)1024, info.blue_y / (double)1024); + + printf("Monitor's white point (x, y): %lf, %lf\n", + info.white_x / (double)1024, info.white_y / (double)1024); + } + + if (libcoopgamma_get_gamma_sync(&query, &table, &cg) < 0) + goto cg_fail; + + if (table.red_size != info.red_size || table.green_size != info.green_size || + table.blue_size != info.blue_size || table.depth != info.depth) { + fprintf(stderr, "%s: gamma ramp structure changed between queries\n", argv0); + goto custom_fail; + } + + printf("Filters: %zu\n", table.filter_count); + for (i = 0; i < table.filter_count; i++) { + printf(" Filter %zu:\n", i); + printf(" Priority: %" PRIi64 "\n", table.filters[i].priority); + printf(" Class: %s\n", table.filters[i].class); } - printf("Monitor's colourspace: %s\n", str); - } - - if (info.have_gamut) - { - printf("Monitor's red colour (x, y): %lf, %lf\n", - info.red_x / (double)1024, info.red_y / (double)1024); - - printf("Monitor's green colour (x, y): %lf, %lf\n", - info.green_x / (double)1024, info.green_y / (double)1024); - - printf("Monitor's blue colour (x, y): %lf, %lf\n", - info.blue_x / (double)1024, info.blue_y / (double)1024); - - printf("Monitor's white point (x, y): %lf, %lf\n", - info.white_x / (double)1024, info.white_y / (double)1024); - } - - if (libcoopgamma_get_gamma_sync(&query, &table, &cg) < 0) - goto cg_fail; - - if ((table.red_size != info.red_size) || (table.green_size != info.green_size) || - (table.blue_size != info.blue_size) || (table.depth != info.depth)) - { - fprintf(stderr, "%s: gamma ramp structure changed between queries\n", argv0); - goto custom_fail; - } - - printf("Filters: %zu\n", table.filter_count); - for (i = 0; i < table.filter_count; i++) - { - printf(" Filter %zu:\n", i); - printf(" Priority: %" PRIi64 "\n", table.filters[i].priority); - printf(" Class: %s\n", table.filters[i].class); - } - - done: - saved_errno = errno; - libcoopgamma_crtc_info_destroy(&info); - libcoopgamma_filter_table_destroy(&table); - errno = saved_errno; - return ret; - fail: - ret = -1; - goto done; - cg_fail: - ret = -2; - goto done; - custom_fail: - ret = -3; - goto done; + +done: + saved_errno = errno; + libcoopgamma_crtc_info_destroy(&info); + libcoopgamma_filter_table_destroy(&table); + errno = saved_errno; + return ret; +fail: + ret = -1; + goto done; +cg_fail: + ret = -2; + goto done; +custom_fail: + ret = -3; + goto done; } @@ -244,84 +243,85 @@ static int print_info(void) * on libcoopgamma error, -3 on error * with error message already printed */ -static int print_filter(void) +static int +print_filter(void) { - libcoopgamma_filter_table_t table; - libcoopgamma_ramps_t* restrict ramps; - int saved_errno, ret = 0; - size_t i, n; - - if (libcoopgamma_filter_table_initialise(&table) < 0) - return -1; - - if (libcoopgamma_get_gamma_sync(&query, &table, &cg) < 0) - goto cg_fail; - - if (query.coalesce) - i = 0; - else - for (i = 0; i < table.filter_count; i++) - if (!strcmp(table.filters[i].class, class)) - break; - if (i == table.filter_count) - { - fprintf(stderr, "%s: selected filter does not exist on selected CRTC\n", argv0); - goto custom_fail; - } - ramps = &(table.filters[i].ramps); - - n = table.red_size; - if (n < table.green_size) - n = table.green_size; - if (n < table.blue_size) - n = table.blue_size; - - switch (table.depth) - { -#define X(CONST, MEMBER, TYPE, FORMAT, DASH) \ - case CONST: \ - for (i = 0; i < n; i++) \ - { \ - if (i < ramps->MEMBER.red_size) \ - printf("%" FORMAT " ", (TYPE)(ramps->MEMBER.red[i])); \ - else \ - printf(DASH " "); \ - if (i < ramps->MEMBER.green_size) \ - printf("%" FORMAT " ", (TYPE)(ramps->MEMBER.green[i])); \ - else \ - printf(DASH " "); \ - if (i < ramps->MEMBER.blue_size) \ - printf("%" FORMAT "\n", (TYPE)(ramps->MEMBER.blue[i])); \ - else \ - printf(DASH "\n"); \ - } \ - break - X(LIBCOOPGAMMA_DOUBLE, d, double, "lf", "----"); - X(LIBCOOPGAMMA_FLOAT, f, double, "lf", "----"); - X(LIBCOOPGAMMA_UINT8, u8, uint8_t, "02" PRIx8, "--"); - X(LIBCOOPGAMMA_UINT16, u16, uint16_t, "04" PRIx16, "----"); - X(LIBCOOPGAMMA_UINT32, u32, uint32_t, "08" PRIx32, "--------"); - X(LIBCOOPGAMMA_UINT64, u64, uint64_t, "016" PRIx64, "----------------"); + libcoopgamma_filter_table_t table; + libcoopgamma_ramps_t *restrict ramps; + int saved_errno, ret = 0; + size_t i, n; + + if (libcoopgamma_filter_table_initialise(&table) < 0) + return -1; + + if (libcoopgamma_get_gamma_sync(&query, &table, &cg) < 0) + goto cg_fail; + + if (query.coalesce) { + i = 0; + } else { + for (i = 0; i < table.filter_count; i++) + if (!strcmp(table.filters[i].class, class)) + break; + } + if (i == table.filter_count) { + fprintf(stderr, "%s: selected filter does not exist on selected CRTC\n", argv0); + goto custom_fail; + } + ramps = &table.filters[i].ramps; + + n = table.red_size; + if (n < table.green_size) + n = table.green_size; + if (n < table.blue_size) + n = table.blue_size; + + switch (table.depth) { +#define X(CONST, MEMBER, TYPE, FORMAT, DASH)\ + case CONST:\ + for (i = 0; i < n; i++) {\ + if (i < ramps->MEMBER.red_size)\ + printf("%" FORMAT " ", (TYPE)(ramps->MEMBER.red[i]));\ + else\ + printf(DASH " ");\ + \ + if (i < ramps->MEMBER.green_size)\ + printf("%" FORMAT " ", (TYPE)(ramps->MEMBER.green[i]));\ + else\ + printf(DASH " ");\ + \ + if (i < ramps->MEMBER.blue_size)\ + printf("%" FORMAT "\n", (TYPE)(ramps->MEMBER.blue[i]));\ + else\ + printf(DASH "\n");\ + } \ + break + X(LIBCOOPGAMMA_DOUBLE, d, double, "lf", "----"); + X(LIBCOOPGAMMA_FLOAT, f, double, "lf", "----"); + X(LIBCOOPGAMMA_UINT8, u8, uint8_t, "02" PRIx8, "--"); + X(LIBCOOPGAMMA_UINT16, u16, uint16_t, "04" PRIx16, "----"); + X(LIBCOOPGAMMA_UINT32, u32, uint32_t, "08" PRIx32, "--------"); + X(LIBCOOPGAMMA_UINT64, u64, uint64_t, "016" PRIx64, "----------------"); #undef X - default: - errno = EPROTO; - goto fail; - } - - done: - saved_errno = errno; - libcoopgamma_filter_table_destroy(&table); - errno = saved_errno; - return ret; - fail: - ret = -1; - goto done; - cg_fail: - ret = -2; - goto done; - custom_fail: - ret = -3; - goto done; + default: + errno = EPROTO; + goto fail; + } + +done: + saved_errno = errno; + libcoopgamma_filter_table_destroy(&table); + errno = saved_errno; + return ret; +fail: + ret = -1; + goto done; +cg_fail: + ret = -2; + goto done; +custom_fail: + ret = -3; + goto done; } @@ -352,146 +352,142 @@ static int print_filter(void) * @param argv The command line arguments * @return 0 on success, 1 on error */ -int main(int argc, char* argv[]) +int +main(int argc, char *argv[]) { - int stage = 0, haveh = 0, havel = 0; - int rc = 0; - char* method = NULL; - char* site = NULL; - - query.high_priority = INT64_MAX; - query.low_priority = INT64_MIN; - query.crtc = NULL; - query.coalesce = 0; - - ARGBEGIN - { - case 'M': - if (method != NULL) - usage(); - method = EARGF(usage()); - break; - case 'S': - if (site != NULL) - usage(); - site = EARGF(usage()); - break; - case 'c': - if (query.crtc != NULL) - usage(); - query.crtc = EARGF(usage()); - break; - case 'h': - if (haveh++) - usage(); - query.high_priority = (int64_t)atoll(EARGF(usage())); - break; - case 'l': - if (havel++) - usage(); - query.low_priority = (int64_t)atoll(EARGF(usage())); - break; - case 'f': - if (class != NULL) - usage(); - class = EARGF(usage()); - if ((class[0] == '*') && (class[1] == '\0')) - query.coalesce = 1; - break; - default: - usage(); - } - ARGEND; - - if (argc) - usage(); - - if (initialise_proc() < 0) - goto fail; - - if ((method != NULL) && !strcmp(method, "?")) - { - if ((site != NULL) || (query.crtc != NULL)) - usage(); - if (list_methods() < 0) - goto fail; - return 0; - } - - if (libcoopgamma_context_initialise(&cg) < 0) - goto fail; - stage++; - if (libcoopgamma_connect(method, site, &cg) < 0) - { - fprintf(stderr, "%s: server failed to initialise\n", argv0); - goto custom_fail; - } - stage++; - - if (!(query.crtc)) - usage(); - - if (!strcmp(query.crtc, "?")) - switch (list_crtcs()) - { - case 0: + int stage = 0, haveh = 0, havel = 0; + int rc = 0; + char *method = NULL; + char *site = NULL; + const char *side; + + query.high_priority = INT64_MAX; + query.low_priority = INT64_MIN; + query.crtc = NULL; + query.coalesce = 0; + + ARGBEGIN { + case 'M': + if (method) + usage(); + method = EARGF(usage()); + break; + case 'S': + if (site) + usage(); + site = EARGF(usage()); + break; + case 'c': + if (query.crtc) + usage(); + query.crtc = EARGF(usage()); + break; + case 'h': + if (haveh++) + usage(); + query.high_priority = (int64_t)atoll(EARGF(usage())); + break; + case 'l': + if (havel++) + usage(); + query.low_priority = (int64_t)atoll(EARGF(usage())); + break; + case 'f': + if (class) + usage(); + class = EARGF(usage()); + if (class[0] == '*' && class[1] == '\0') + query.coalesce = 1; + break; + default: + usage(); + } + ARGEND; + + if (argc) + usage(); + + if (initialise_proc() < 0) + goto fail; + + if (method && !strcmp(method, "?")) { + if (site || query.crtc) + usage(); + if (list_methods() < 0) + goto fail; + return 0; + } + + if (libcoopgamma_context_initialise(&cg) < 0) + goto fail; + stage++; + if (libcoopgamma_connect(method, site, &cg) < 0) { + fprintf(stderr, "%s: server failed to initialise\n", argv0); + goto custom_fail; + } + stage++; + + if (!query.crtc) + usage(); + + if (!strcmp(query.crtc, "?")) { + switch (list_crtcs()) { + case 0: + goto done; + case -1: + goto fail; + default: + goto cg_fail; + } + } + + switch (class ? print_filter() : print_info()) { + case 0: + goto done; + case -1: + goto fail; + case -2: + goto cg_fail; + default: + goto custom_fail; + } + + fflush(stdout); + if (ferror(stdout)) + goto fail; + if (fclose(stdout) < 0) + goto fail; + +done: + if (stage >= 1) + libcoopgamma_context_destroy(&cg, stage >= 2); + return rc; + +custom_fail: + rc = 1; + goto done; + +fail: + rc = 1; + perror(argv0); + goto done; + +cg_fail: + rc = 1; + side = cg.error.server_side ? "server" : "client"; + if (cg.error.custom) { + if (cg.error.number || cg.error.description) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", + argv0, side, cg.error.number, cg.error.description); + } else if (cg.error.number) { + fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } else { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror((int)cg.error.number)); + } goto done; - case -1: - goto fail; - default: - goto cg_fail; - } - - switch (class ? print_filter() : print_info()) - { - case 0: - goto done; - case -1: - goto fail; - case -2: - goto cg_fail; - default: - goto custom_fail; - } - - fflush(stdout); - if (ferror(stdout)) - goto fail; - if (fclose(stdout) < 0) - goto fail; - - done: - if (stage >= 1) - libcoopgamma_context_destroy(&cg, stage >= 2); - return rc; - - custom_fail: - rc = 1; - goto done; - - fail: - rc = 1; - perror(argv0); - goto done; - - cg_fail: - rc = 1; - { - const char* side = cg.error.server_side ? "server" : "client"; - if (cg.error.custom) - { - if ((cg.error.number != 0) || (cg.error.description != NULL)) - fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", - argv0, side, cg.error.number, cg.error.description); - else if (cg.error.number != 0) - fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - } - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - else - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror(cg.error.number)); - } - goto done; } diff --git a/cg-rainbow.c b/cg-rainbow.c index 4cf4797..07ee4a5 100644 --- a/cg-rainbow.c +++ b/cg-rainbow.c @@ -27,19 +27,19 @@ char default_class[] = PKGNAME "::cg-rainbow::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; /** * -s: rainbow-frequency in Hz */ -static char* sflag = NULL; +static char *sflag = NULL; /** * -l: base luminosity */ -static char* lflag = NULL; +static char *lflag = NULL; /** * The rainbow-frequency multiplied by 3 @@ -56,13 +56,14 @@ double luminosity = (double)1 / 3; /** * 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]" - " [-l luminosity] [-s rainbowhz]\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] [-p priority]" + " [-l luminosity] [-s rainbowhz]\n", + argv0); + exit(1); } @@ -80,25 +81,26 @@ void usage(void) * 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 'l': - if (lflag || !(lflag = arg)) - usage(); - return 1; - case 's': - if (sflag || !(sflag = arg)) - usage(); - return 1; - default: - usage(); - } - else - usage(); - return 0; + if (opt[0] == '-') { + switch (opt[1]) { + case 'l': + if (lflag || !(lflag = arg)) + usage(); + return 1; + case 's': + if (sflag || !(sflag = arg)) + usage(); + return 1; + default: + usage(); + } + } else { + usage(); + } + return 0; } @@ -109,16 +111,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; } @@ -131,25 +134,24 @@ 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 = (lflag || sflag); - if ((q > 1) || argc) - usage(); - if (sflag != NULL) - { - if (parse_double(&rainbows_per_third_second, sflag) < 0) - usage(); - rainbows_per_third_second *= 3; - } - if (lflag != NULL) - { - if (parse_double(&luminosity, lflag) < 0) - usage(); - } - return 0; - (void) argv; - (void) prio; + int q = (lflag || sflag); + if (q > 1 || argc) + usage(); + if (sflag) { + if (parse_double(&rainbows_per_third_second, sflag) < 0) + usage(); + rainbows_per_third_second *= 3; + } + if (lflag) { + if (parse_double(&luminosity, lflag) < 0) + usage(); + } + return 0; + (void) argv; + (void) prio; } @@ -161,20 +163,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(); + } } @@ -184,18 +186,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; } @@ -207,56 +210,58 @@ 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; - size_t i, j; - double pal[3]; - double t, starttime; - - 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; - - for (;;) - { - if ((r = double_time(&t)) < 0) - return r; - t -= starttime; - t *= rainbows_per_third_second; - pal[0] = pal[1] = pal[2] = luminosity; - pal[((long)t) % 3] += 1 - fmod(t, 1); - pal[((long)t + 1) % 3] += fmod(t, 1); - if (pal[0] > 1) pal[0] = 1; - if (pal[1] > 1) pal[1] = 1; - if (pal[2] > 1) pal[2] = 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), pal[0], pal[1], pal[2]); - 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; - } + int r; + size_t i, j; + double pal[3]; + double t, starttime; + + 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; + + for (;;) { + if ((r = double_time(&t)) < 0) + return r; + t -= starttime; + t *= rainbows_per_third_second; + pal[0] = pal[1] = pal[2] = luminosity; + pal[((long)t) % 3] += 1 - fmod(t, 1); + pal[((long)t + 1) % 3] += fmod(t, 1); + if (pal[0] > 1) + pal[0] = 1; + if (pal[1] > 1) + pal[1] = 1; + if (pal[2] > 1) + pal[2] = 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, pal[0], pal[1], pal[2]); + 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(); } - - while (r != 1) - if ((r = synchronise(-1)) < 0) - return r; - - sched_yield(); - } } diff --git a/cg-remove.c b/cg-remove.c index 0e81df0..20ca51e 100644 --- a/cg-remove.c +++ b/cg-remove.c @@ -23,12 +23,13 @@ static libcoopgamma_context_t cg; /** * Print usage information and exit */ -static void usage(void) +static void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... class...\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... class...\n", + argv0); + exit(1); } @@ -38,22 +39,23 @@ static void usage(void) * * @return Zero on success, -1 on error */ -static int initialise_proc(void) +static int +initialise_proc(void) { - sigset_t sigmask; - int sig; - - for (sig = 1; sig < _NSIG; sig++) - if (signal(sig, SIG_DFL) == SIG_ERR) - if (sig == SIGCHLD) - return -1; - - if (sigemptyset(&sigmask) < 0) - return -1; - if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) - return -1; - - return 0; + sigset_t sigmask; + int sig; + + for (sig = 1; sig < _NSIG; sig++) + if (signal(sig, SIG_DFL) == SIG_ERR) + if (sig == SIGCHLD) + return -1; + + if (sigemptyset(&sigmask) < 0) + return -1; + if (sigprocmask(SIG_SETMASK, &sigmask, NULL) < 0) + return -1; + + return 0; } @@ -63,21 +65,22 @@ static int initialise_proc(void) * * @return Zero on success, -1 on error */ -static int list_methods(void) +static int +list_methods(void) { - char** list; - size_t i; - - list = libcoopgamma_get_methods(); - if (list == NULL) - return -1; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_methods(); + if (!list) + return -1; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -90,21 +93,22 @@ static int list_methods(void) * @return Zero on success, -1 on error, -2 * on libcoopgamma error */ -static int list_crtcs(void) +static int +list_crtcs(void) { - char** list; - size_t i; - - list = libcoopgamma_get_crtcs_sync(&cg); - if (list == NULL) - return -2; - for (i = 0; list[i]; i++) - printf("%s\n", list[i]); - free(list); - if (fflush(stdout) < 0) - return -1; - - return 0; + char **list; + size_t i; + + list = libcoopgamma_get_crtcs_sync(&cg); + if (!list) + return -2; + for (i = 0; list[i]; i++) + printf("%s\n", list[i]); + free(list); + if (fflush(stdout) < 0) + return -1; + + return 0; } @@ -116,123 +120,119 @@ static int list_crtcs(void) * @return Zero on success, -1 on error, -2 on * libcoopgamma error */ -static int remove_filters(char* const* restrict crtcs, char* const* restrict classes) +static int +remove_filters(char *const *restrict crtcs, char *const *restrict classes) { - size_t n = 0, unsynced = 0, selected, i, j; - char* synced = NULL; - libcoopgamma_async_context_t* asyncs = NULL; - int saved_errno, need_flush = 0, ret = 0; - struct pollfd pollfd; - libcoopgamma_filter_t command; - - for (i = 0; crtcs[i] != NULL; i++); - for (j = 0; classes[j] != NULL; j++); - synced = calloc(i, j * sizeof(*synced)); - if (synced == NULL) - goto fail; - asyncs = calloc(i, j * sizeof(*asyncs)); - if (asyncs == NULL) - goto fail; - - i = j = 0; - command.lifespan = LIBCOOPGAMMA_REMOVE; - pollfd.fd = cg.fd; - pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; - - while ((unsynced > 0) || (crtcs[i] != NULL)) - { - wait: - if (crtcs[i] != NULL) - pollfd.events |= POLLOUT; - else - pollfd.events &= ~POLLOUT; - - pollfd.revents = 0; - if (poll(&pollfd, (nfds_t)1, -1) < 0) - goto fail; - - if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) - { - if (need_flush && (libcoopgamma_flush(&cg) < 0)) - goto send_fail; - need_flush = 0; - for (; crtcs[i] != NULL; i++, j = 0) - { - command.crtc = crtcs[i]; - while (classes[j] != NULL) - { - command.class = classes[j++]; - if (unsynced++, libcoopgamma_set_gamma_send(&command, &cg, asyncs + n++) < 0) - goto send_fail; - } - } - goto send_done; - send_fail: - switch (errno) - { - case EINTR: - case EAGAIN: + size_t n = 0, unsynced = 0, selected, i, j; + char *synced = NULL; + libcoopgamma_async_context_t *asyncs = NULL; + int saved_errno, need_flush = 0, ret = 0; + struct pollfd pollfd; + libcoopgamma_filter_t command; + + for (i = 0; crtcs[i]; i++); + for (j = 0; classes[j]; j++); + synced = calloc(i, j * sizeof(*synced)); + if (!synced) + goto fail; + asyncs = calloc(i, j * sizeof(*asyncs)); + if (!asyncs) + goto fail; + + i = j = 0; + command.lifespan = LIBCOOPGAMMA_REMOVE; + pollfd.fd = cg.fd; + pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; + + while (unsynced > 0 || crtcs[i]) { + wait: + if (crtcs[i]) + pollfd.events |= POLLOUT; + else + pollfd.events &= ~POLLOUT; + + pollfd.revents = 0; + if (poll(&pollfd, (nfds_t)1, -1) < 0) + goto fail; + + if (pollfd.revents & (POLLOUT | POLLERR | POLLHUP | POLLNVAL)) { + if (need_flush && (libcoopgamma_flush(&cg) < 0)) + goto send_fail; + need_flush = 0; + for (; crtcs[i]; i++, j = 0) { + command.crtc = crtcs[i]; + while (classes[j]) { + command.class = classes[j++]; + unsynced++; + if (libcoopgamma_set_gamma_send(&command, &cg, asyncs + n++) < 0) + goto send_fail; + } + } + goto send_done; + send_fail: + switch (errno) { + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - need_flush = 1; - if (classes[j] == NULL) - i++, j = 0; - break; - default: - goto fail; - } - } - send_done: - - if ((unsynced == 0) && (crtcs[i] == NULL)) - break; - - if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)) - while (unsynced > 0) - switch (libcoopgamma_synchronise(&cg, asyncs, n, &selected)) - { - case 0: - if (synced[selected]) - { - libcoopgamma_skip_message(&cg); - break; + need_flush = 1; + if (!classes[j]) + i++, j = 0; + break; + default: + goto fail; + } } - synced[selected] = 1; - unsynced -= 1; - if (libcoopgamma_set_gamma_recv(&cg, asyncs + selected) < 0) - goto cg_fail; - break; - default: - switch (errno) - { - case 0: - break; - case EINTR: - case EAGAIN: + send_done: + + if (!unsynced && !crtcs[i]) + break; + + if (pollfd.revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)) { + while (unsynced > 0) { + switch (libcoopgamma_synchronise(&cg, asyncs, n, &selected)) { + case 0: + if (synced[selected]) { + libcoopgamma_skip_message(&cg); + break; + } + synced[selected] = 1; + unsynced -= 1; + if (libcoopgamma_set_gamma_recv(&cg, asyncs + selected) < 0) + goto cg_fail; + break; + default: + switch (errno) { + case 0: + break; + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - goto wait; - default: - goto fail; + goto wait; + default: + goto fail; + } + break; + } + } } - break; - } - } - - done: - saved_errno = errno; - free(synced); - free(asyncs); - errno = saved_errno; - return ret; - fail: - ret = -1; - goto done; - cg_fail: - ret = -2; - goto done; + } + +done: + saved_errno = errno; + free(synced); + free(asyncs); + errno = saved_errno; + return ret; +fail: + ret = -1; + goto done; +cg_fail: + ret = -2; + goto done; } @@ -255,132 +255,128 @@ static int remove_filters(char* const* restrict crtcs, char* const* restrict cla * @param argv The command line arguments * @return 0 on success, 1 on error */ -int main(int argc, char* argv[]) +int +main(int argc, char *argv[]) { - int stage = 0; - int rc = 0; - char* method = NULL; - char* site = NULL; - char** crtcs_ = NULL; - char** crtcs = alloca(argc * sizeof(char*)); - size_t i, crtcs_n = 0; - - ARGBEGIN - { - case 'M': - if (method != NULL) - usage(); - method = EARGF(usage()); - break; - case 'S': - if (site != NULL) - usage(); - site = EARGF(usage()); - break; - case 'c': - crtcs[crtcs_n++] = EARGF(usage()); - break; - default: - usage(); - } - ARGEND; - - if (initialise_proc() < 0) - goto fail; - - if ((method != NULL) && !strcmp(method, "?")) - { - if ((site != NULL) || (crtcs_n > 0) || (argc > 0)) - usage(); - if (list_methods() < 0) - goto fail; - return 0; - } - - if (libcoopgamma_context_initialise(&cg) < 0) - goto fail; - stage++; - if (libcoopgamma_connect(method, site, &cg) < 0) - { - fprintf(stderr, "%s: server failed to initialise\n", argv0); - goto custom_fail; - } - stage++; - - for (i = 0; i < crtcs_n; i++) - if (!strcmp(crtcs[i], "?")) - { - if (argc > 0) - usage(); - switch (list_crtcs()) - { - case 0: - goto done; - case -1: - goto fail; - default: - goto cg_fail; - } - } - - if (argc == 0) - usage(); - - if (crtcs_n == 0) - { - crtcs = crtcs_ = libcoopgamma_get_crtcs_sync(&cg); - if (crtcs == NULL) - goto cg_fail; - } - else - crtcs[crtcs_n] = NULL; - - if (libcoopgamma_set_nonblocking(&cg, 1) < 0) - goto fail; - - switch (remove_filters(crtcs, argv)) - { - case 0: - break; - case -1: - goto fail; - default: - goto cg_fail; - } - - done: - if (stage >= 1) - libcoopgamma_context_destroy(&cg, stage >= 2); - free(crtcs_); - return rc; - - custom_fail: - rc = 1; - goto done; - - fail: - rc = 1; - perror(argv0); - goto done; + int stage = 0; + int rc = 0; + char *method = NULL; + char *site = NULL; + char **crtcs_ = NULL; + char **crtcs; + size_t i, crtcs_n = 0; + const char *side; + + crtcs = alloca((size_t)argc * sizeof(char *)); + + ARGBEGIN { + case 'M': + if (method) + usage(); + method = EARGF(usage()); + break; + case 'S': + if (site) + usage(); + site = EARGF(usage()); + break; + case 'c': + crtcs[crtcs_n++] = EARGF(usage()); + break; + default: + usage(); + } + ARGEND; + + if (initialise_proc() < 0) + goto fail; + + if (method && !strcmp(method, "?")) { + if (site || crtcs_n > 0 || argc > 0) + usage(); + if (list_methods() < 0) + goto fail; + return 0; + } + + if (libcoopgamma_context_initialise(&cg) < 0) + goto fail; + stage++; + if (libcoopgamma_connect(method, site, &cg) < 0) { + fprintf(stderr, "%s: server failed to initialise\n", argv0); + goto custom_fail; + } + stage++; + + for (i = 0; i < crtcs_n; i++) { + if (!strcmp(crtcs[i], "?")) { + if (argc > 0) + usage(); + switch (list_crtcs()) + { + case 0: + goto done; + case -1: + goto fail; + default: + goto cg_fail; + } + } + } + + if (!argc) + usage(); - cg_fail: - rc = 1; - { - const char* side = cg.error.server_side ? "server" : "client"; - if (cg.error.custom) - { - if ((cg.error.number != 0) || (cg.error.description != NULL)) - fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", - argv0, side, cg.error.number, cg.error.description); - else if (cg.error.number != 0) - fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - } - else if (cg.error.description != NULL) - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); - else - fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror(cg.error.number)); - } - goto done; + if (!crtcs_n) { + crtcs = crtcs_ = libcoopgamma_get_crtcs_sync(&cg); + if (!crtcs) + goto cg_fail; + } else { + crtcs[crtcs_n] = NULL; + } + + if (libcoopgamma_set_nonblocking(&cg, 1) < 0) + goto fail; + + switch (remove_filters(crtcs, argv)) { + case 0: + break; + case -1: + goto fail; + default: + goto cg_fail; + } + +done: + if (stage >= 1) + libcoopgamma_context_destroy(&cg, stage >= 2); + free(crtcs_); + return rc; + +custom_fail: + rc = 1; + goto done; + +fail: + rc = 1; + perror(argv0); + goto done; + +cg_fail: + rc = 1; + side = cg.error.server_side ? "server" : "client"; + if (cg.error.custom) { + if (cg.error.number || cg.error.description) + fprintf(stderr, "%s: %s-side error number %" PRIu64 ": %s\n", + argv0, side, cg.error.number, cg.error.description); + else if (cg.error.number) + fprintf(stderr, "%s: %s-side error number %" PRIu64 "\n", argv0, side, cg.error.number); + else if (cg.error.description) + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } else if (cg.error.description) { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, cg.error.description); + } else { + fprintf(stderr, "%s: %s-side error: %s\n", argv0, side, strerror((int)cg.error.number)); + } + goto done; } diff --git a/cg-shallow.c b/cg-shallow.c index 5b65364..2ddd45d 100644 --- a/cg-shallow.c +++ b/cg-shallow.c @@ -25,7 +25,7 @@ char default_class[] = PKGNAME "::cg-shallow::standard"; /** * Class suffixes */ -const char* const* class_suffixes = (const char* const[]){NULL}; +const char *const *class_suffixes = (const char *const[]){NULL}; @@ -58,13 +58,14 @@ static size_t bres = 2; /** * Print usage information and exit */ -void usage(void) +void +usage(void) { - fprintf(stderr, - "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " - "(-x | [-p priority] [-d] [all | red green blue])\n", - argv0); - exit(1); + fprintf(stderr, + "usage: %s [-M method] [-S site] [-c crtc]... [-R rule] " + "(-x | [-p priority] [-d] [all | red green blue])\n", + argv0); + exit(1); } @@ -82,28 +83,29 @@ void usage(void) * 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 'd': - if (dflag || xflag) - usage(); - dflag = 1; - break; - case 'x': - if (xflag || dflag) - usage(); - xflag = 1; - break; - default: - usage(); - } - else - usage(); - return 0; - (void) arg; + if (opt[0] == '-') { + switch (opt[1]) { + case 'd': + if (dflag || xflag) + usage(); + dflag = 1; + break; + case 'x': + if (xflag || dflag) + usage(); + xflag = 1; + break; + default: + usage(); + } + } else { + usage(); + } + return 0; + (void) arg; } @@ -114,16 +116,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_int(size_t* restrict out, const char* restrict str) +static int +parse_int(size_t *restrict out, const char *restrict str) { - char* end; - errno = 0; - if (!isdigit(*str)) - return -1; - *out = strtoul(str, &end, 10); - if (errno || *end) - return -1; - return 0; + char *end; + errno = 0; + if (!isdigit(*str)) + return -1; + *out = strtoul(str, &end, 10); + if (errno || *end) + return -1; + return 0; } @@ -136,35 +139,34 @@ static int parse_int(size_t* 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) { - char* red = NULL; - char* green = NULL; - char* blue = NULL; - int q = xflag + (dflag | (argc > 0)); - if ((q > 1) || (xflag && (prio != NULL))) - usage(); - if (argc == 1) - red = green = blue = argv[0]; - else if (argc == 3) - { - red = argv[0]; - green = argv[1]; - blue = argv[2]; - } - else if (argc && !xflag) - usage(); - if (argc) - { - if (parse_int(&rres, red) < 0) - usage(); - if (parse_int(&gres, blue) < 0) - usage(); - if (parse_int(&bres, green) < 0) - usage(); - } - return 0; - (void) argv; + char *red = NULL; + char *green = NULL; + char *blue = NULL; + int q = xflag + (dflag | (argc > 0)); + if (q > 1 || (xflag && prio)) + usage(); + if (argc == 1) { + red = green = blue = argv[0]; + } else if (argc == 3) { + red = argv[0]; + green = argv[1]; + blue = argv[2]; + } else if (argc && !xflag) { + usage(); + } + if (argc) { + if (parse_int(&rres, red) < 0) + usage(); + if (parse_int(&gres, blue) < 0) + usage(); + if (parse_int(&bres, green) < 0) + usage(); + } + return 0; + (void) argv; } @@ -173,19 +175,19 @@ int handle_args(int argc, char* argv[], char* prio) * * @param filter The filter to fill */ -static void fill_filter(libcoopgamma_filter_t* restrict filter) +static void +fill_filter(libcoopgamma_filter_t *restrict filter) { - switch (filter->depth) - { + switch (filter->depth) { #define X(CONST, MEMBER, MAX, TYPE)\ - case CONST:\ - libclut_lower_resolution(&(filter->ramps.MEMBER), MAX, TYPE, 0, rres, 0, gres, 0, bres);\ - break; -LIST_DEPTHS + case CONST:\ + libclut_lower_resolution(&filter->ramps.MEMBER, MAX, TYPE, 0, rres, 0, gres, 0, bres);\ + break; + LIST_DEPTHS #undef X - default: - abort(); - } + default: + abort(); + } } @@ -197,66 +199,65 @@ LIST_DEPTHS * -2: Error, `cg.error` set * -3: Error, message already printed */ -int start(void) +int +start(void) { - int r; - size_t i, j; - - if (xflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; - else if (dflag) - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; - else - for (i = 0; i < filters_n; i++) - crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - - if (!xflag) - if ((r = make_slaves()) < 0) - return r; - - for (i = 0, r = 1; i < filters_n; i++) - { - if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported)) - continue; - if (!xflag) - fill_filter(&(crtc_updates[i].filter)); - 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; - - if (!dflag) - return 0; - - if (libcoopgamma_set_nonblocking(&cg, 0) < 0) - return -1; - for (;;) - if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) - switch (errno) - { - case 0: - break; - case ENOTRECOVERABLE: - goto enotrecoverable; - default: - return -1; + int r; + size_t i, j; + + if (xflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; + else if (dflag) + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH; + else + for (i = 0; i < filters_n; i++) + crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + + if (!xflag && (r = make_slaves()) < 0) + return r; + + for (i = 0, r = 1; i < filters_n; i++) { + if (!crtc_updates[i].master || !crtc_info[crtc_updates[i].crtc].supported) + continue; + if (!xflag) + fill_filter(&crtc_updates[i].filter); + 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; + } + } } - - enotrecoverable: - for (;;) - if (pause() < 0) - return -1; + + while (r != 1) + if ((r = synchronise(-1)) < 0) + return r; + + if (!dflag) + return 0; + + if (libcoopgamma_set_nonblocking(&cg, 0) < 0) + return -1; + for (;;) { + if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0) { + switch (errno) { + case 0: + break; + case ENOTRECOVERABLE: + goto enotrecoverable; + default: + return -1; + } + } + } + +enotrecoverable: + pause(); + return -1; } 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; } @@ -4,5 +4,5 @@ MANPREFIX = $(PREFIX)/share/man PKGNAME = cg-tools CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D'PKGNAME="$(PKGNAME)"' -CFLAGS = -std=c99 -Wall -O2 -LDFLAGS = -lcoopgamma -lm -s +CFLAGS = -std=c99 -Wall -Og -g +LDFLAGS = -lcoopgamma -lm |