aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arg.h78
-rw-r--r--src/macros.h57
-rw-r--r--src/radharc.c50
-rw-r--r--src/settings.c294
-rw-r--r--src/settings.h162
-rw-r--r--src/state.c352
-rw-r--r--src/state.h74
7 files changed, 0 insertions, 1067 deletions
diff --git a/src/arg.h b/src/arg.h
deleted file mode 100644
index 77a519d..0000000
--- a/src/arg.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-
-/**
- * The name of the process.
- */
-extern char *argv0;
-
-
-
-/**
- * Start command line parsing.
- *
- * `argv` and `argc` must be available as given to `main`.
- * The global variable `argv0` must be declare (not necessary
- * the the same file) and will be set to `argv[0]`.
- *
- * Only short options and "--" are supported. Short options
- * may start with a '+', in which case `plus` will be 1.
- *
- * @example
- * ARGBEGIN {
- * case 'a': printf("%s\n", plus ? "+a" : "-a"); break;
- * case 'b': if (plus) usage(1); printf("-b\n"); break;
- * case 'c': if (plus) printf("+c\n"); else printf("-c %s\n", ARGF()); break;
- * default: usage(1); break;
- * } ARGEND;
- */
-#define ARGBEGIN \
-do { \
- for (argv0 = *argv++, argc -= !!argv0; *argv; argv++, argc--) { \
- int plus = argv[0][0] == '+', next__ = 0; \
- if (((argv[0][0] != '-') && !plus) || (argv[0][1] == (plus ? '+' : '-'))) { \
- if ((argv[0][0] == argv[0][1]) && (argv[0][1] == '-') && (argv[0][2] == '\0')) \
- argc--, argv++; \
- break; \
- } \
- for (argv[0]++; argv[0][0] && !next__;) { \
- switch (*(argv[0])++)
-
-/**
- * End of command line parsing,
- */
-#define ARGEND \
- } \
- } \
-} while (0)
-
-/**
- * Get the argument of the current option.
- * Do not use more once per option.
- *
- * The function `noreturn void usage(int)` must be available.
- * `usage` shall exit if its argument is `1`.
- *
- * @return The argument of the current option.
- */
-#define ARGF() \
- (next__ = 1, argv[0][0] ? (argv[0]) \
- : (argv++, (argv[0] ? (argc--, argv[0]) \
- : (usage(1), NULL))))
-
diff --git a/src/macros.h b/src/macros.h
deleted file mode 100644
index 298a41a..0000000
--- a/src/macros.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-
-
-#define try(...) do { if (!(__VA_ARGS__)) goto fail; } while (0)
-#define t(...) do { if (__VA_ARGS__) goto fail; } while (0)
-#define CLEANUP(...) do { int cleanup__ = errno; __VA_ARGS__; errno = cleanup__; } while (0)
-
-#define xstrdup(outp, ...) \
-do { \
- const char *xstrdup__ = (__VA_ARGS__); \
- if (xstrdup__) \
- try (*(outp) = strdup(xstrdup__)); \
- else \
- *(outp) = NULL; \
-} while (0)
-
-#define xpread(fd, buf, len, off) t (pread(fd, buf, len, off) < (ssize_t)(len))
-#define xpwrite(fd, buf, len, off) t (pwrite(fd, buf, len, off) < (ssize_t)(len))
-#define xread(fd, buf, len) t (read(fd, buf, len) < (ssize_t)(len))
-#define xwrite(fd, buf, len) t (write(fd, buf, len) < (ssize_t)(len))
-
-#define xcalloc(outp, num) try (*(outp) = calloc(num, sizeof(**(outp))))
-#define xmalloc(outp, num) try (*(outp) = malloc((num) * sizeof(**(outp))))
-#define xrealloc(outp, num) \
-do { \
- size_t n__ = (num); \
- void *new__ = realloc(*(outp), n__ * sizeof(**(outp))); \
- t (n__ && !new__); \
- *(outp) = new__; \
-} while (0)
-
-#define SHRINK(outp, num) \
-do { \
- void *new__ = realloc(*(outp), (num) * sizeof(**(outp))); \
- if (new__) *(outp) = new__; \
-} while (0)
-
diff --git a/src/radharc.c b/src/radharc.c
deleted file mode 100644
index a0b1344..0000000
--- a/src/radharc.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include "state.h"
-#include "macros.h"
-
-#include <libred.h>
-#include <libhaiku.h>
-
-
-
-/**
- * The name of the process.
- */
-char *argv0 = "radharc";
-
-
-
-int
-main(int argc, char *argv[])
-{
- struct settings settings;
-
- t (libred_check_timetravel());
- parse_command_line(argc, argv, &settings);
- argv0 = argv0 ? argv0 : "radharc";
- t (get_state_pathname(&settings));
- t (libred_init_colour());
-
- return 0;
-
-fail:
- libhaiku_perror(argv0);
- libred_term_colour();
- return 1;
-}
-
diff --git a/src/settings.c b/src/settings.c
deleted file mode 100644
index 1c32a2f..0000000
--- a/src/settings.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include "settings.h"
-#include "arg.h"
-#include "macros.h"
-#include <ctype.h>
-#include <errno.h>
-#include <math.h>
-#include <limits.h>
-
-#include <libhaiku.h>
-
-
-
-/**
- * Print usage information and exit if a condition is met.
- *
- * @param condition Do no do anything iff this is zero.
- */
-static void
-usage(int condition)
-{
- if (!condition) return;
- fprintf(stderr,
- "Usage: %s [OPTIONS]...\n"
- "See `man 1 radharc` for more information.\n",
- !argv0 ? "radharc" : argv0), exit(2);
-}
-
-
-/**
- * Parse a temperature string.
- *
- * @param str The temperature string.
- * @param temp Output parameter for the temperature.
- * Overflow is truncated.
- * @param direction Unless `NULL`, will be set to +1 if `str`
- * starts with a '+', `-1` if `str` starts
- * with a '-', 0 otherwise. If `NULL` and
- * `str` starts with a '-' or a '+', the
- * function will fail.
- * @param lower The function shall fail if the evaluated
- * temperature is below this.
- * @return 0 on success, -1 on error.
- */
-static int
-parse_temperature(const char *str, long int *temp, int *direction, int lower)
-{
- char *end;
- int dir = *str == '-' ? -1 : *str == '+' ? +1 : 0;
- str += !!dir;
- t (dir && !direction);
- if (dir) *direction = dir;
- t (!isdigit(*str));
- *temp = (errno = 0, strtol)(str, &end, 10);
- t ((errno && !((errno == ERANGE) && (*temp == LONG_MAX))) || *end || (*temp < lower));
- return 0;
-fail:
- return -1;
-}
-
-
-/**
- * Parse a string as a positively valued `struct timespec`.
- *
- * @param str The string.
- * @param ts Output parameter for the value.
- * @return 0 on success, -1 on error.
- */
-static int
-parse_timespec(const char *str, struct timespec *ts)
-{
-#define DIGIT(var, c) var += (var) * 10 + ((c) & 15);
-#define ALL_DIGITS(cond, var) while ((cond) && isdigit(*str)) DIGIT(var, *str++)
-
- int points = 0;
- memset(ts, 0, sizeof(*ts));
-
- /* Parse seconds. */
- t (!isdigit(*str));
- ALL_DIGITS(1, ts->tv_sec);
-
- /* End? */
- if (!*str) return 0;
- t (*str != '.');
-
- /* Parse nanoseconds.*/
- ALL_DIGITS(points++ < 9, ts->tv_nsec);
- if ((points == 9) && isdigit(*str) && (*str++ >= '5') && (++(ts->tv_nsec) == 1000000000L))
- ts->tv_sec += 1, ts->tv_nsec = 0;
- while (isdigit(*str)) str++;
- t (*str);
-
- /* End! */
- return 0;
-fail:
- return -1;
-}
-
-
-/**
- * Parse a latitude or a longitude value.
- *
- * @param str The string.
- * @param loc Output parameter for the value.
- * @param limit The limit of the absolute value.
- * @return 0 on success, -1 on error.
- */
-static int
-parse_location(char *str, double *loc, double limit)
-{
- char* end;
- if (strstr(str, "−") == str) /* Support proper minus. */
- *(str += strlen("−") - 1) = '-';
- if ((*str != '-') && (*str != '+') && (*str != '.') && !isdigit(*str))
- return -1;
- *loc = (errno = 0, strtod)(str, &end);
- return -(errno || *loc || (fabs(*loc) > limit));
-}
-
-
-/**
- * Parse the command line.
- *
- * @param argc The number of elements in `argv`.
- * @param argv The commnad line arguments including the zeroth elemenet.
- * @param settings Output parameter for the settings.
- */
-void
-parse_command_line(int argc, char *argv[], struct settings *s)
-{
- int location_set = 0;
- char *p;
- char *arg;
- int c = 0;
-
- memset(s, 0, sizeof(*s));
- s->natural_temp = 6500;
- s->day_temp = 5500;
- s->night_temp = 3500;
- s->trans_speed = 50;
-
-#define BOOLEAN(var) var = !plus; break
-#define PLUS(...) (plus ? (__VA_ARGS__) : 0)
- ARGBEGIN {
- case 'l':
- PLUS(location_set = 0);
- usage(!(p = strchr(arg = ARGF(), ':')));
- *p++ = '\0', location_set = 1;
- usage(parse_location(arg, &(s->latitude), 90.0));
- usage(parse_location(p, &(s->longitude), 180.0));
- break;
- case 't':
- PLUS(s->day_temp = 5500, s->night_temp = 3500);
- s->temp = s->day_temp = s->night_temp = 0, s->temp_direction = 0;
- if ((p = strchr(arg = ARGF(), ':'))) {
- *p++ = '\0';
- usage(parse_temperature(arg, &(s->day_temp), NULL, 1000));
- usage(parse_temperature(p, &(s->night_temp), NULL, 1000));
- } else {
- usage(parse_temperature(arg, &(s->temp), &(s->temp_direction), 1000));
- }
- break;
- case 'T':
- PLUS(s->natural_temp = 6500);
- usage(parse_temperature(ARGF(), &(s->natural_temp), NULL, 1000));
- break;
- case 's':
- PLUS(s->trans_speed = 50);
- s->trans_speed = 0;
- usage(parse_timespec(ARGF(), &(s->transition)));
- break;
- case 'S':
- PLUS(s->trans_speed = 0);
- usage(parse_temperature(ARGF(), &(s->trans_speed), NULL, 1));
- break;
- case 'h':
- s->hookpath = (plus ? NULL : ARGF());
- break;
- case 'd': c++; /* Fall though. */
- case 'e': c++; /* Fall though. */
- case 'm': c++;
- PLUS(s->monitors_n = 0, free(s->monitors_id), free(s->monitors_arg));
- xrealloc(&(s->monitors_id), s->monitors_n + 1);
- xrealloc(&(s->monitors_arg), s->monitors_n + 1);
- s->monitors_id[s->monitors_n] = ARGF();
- s->monitors_arg[s->monitors_n++] = (c == 3 ? 'm' : c == 2 ? 'e' : 'd'), c = 0;
- break;
- case 'p': BOOLEAN(s->print_status);
- case 'n': BOOLEAN(s->panic_start);
- case 'N': BOOLEAN(s->panic_else);
- case 'o': BOOLEAN(s->set_and_exit);
- case 'x': BOOLEAN(s->ignore_calib);
- case 'i': BOOLEAN(s->negative);
- case 'b': BOOLEAN(s->use_bus);
- default: usage(1); break;
- } ARGEND;
- usage(argc);
-
- if (!location_set && !(s->temp))
- fprintf(stderr,
- "%s: The -l option is mandatory, unless single value -t is used. "
- "See `man 1 radharc` for more information.\n",
- !argv0 ? "radharc" : argv0), exit(2);
-
- return;
-fail:
- libhaiku_perror(argv0 ? argv0 : "radharc");
- exit(1);
-}
-
-
-/**
- * Marshal settings into a buffer.
- *
- * @param buffer The buffer, `NULL` if you want to know the required size.
- * @param settings The settings to marshal.
- * @return The size of the output.
- */
-size_t
-marshal_settings(char *buffer, const struct settings *settings)
-{
-#define MARSHAL(N, DATUMP) (n += aux = (N), (buf ? (memcpy(buf, DATUMP, aux), buf += aux, 0) : 0))
-
- size_t aux, n = 0, i = 0;
- char *buf = buffer;
-
- if (buffer) i = marshal_settings(NULL, settings);
- MARSHAL(sizeof(i), &i);
-
- MARSHAL(sizeof(*settings), settings);
- if (settings->hookpath) MARSHAL(strlen(settings->hookpath) + 1, settings->hookpath);
- if (settings->monitors_arg) MARSHAL(settings->monitors_n, settings->monitors_arg);
- for (i = 0; i < settings->monitors_n; i++)
- MARSHAL(strlen(settings->monitors_id[i]) + 1, settings->monitors_id[i]);
-
- return n;
-}
-
-
-/**
- * Unmarshal settings from a buffer.
- *
- * @param buffer The buffer.
- * @param settings Output parameter for the settings, will be allocated.
- * @return The number of unmarshalled bytes, 0 on error.
- */
-size_t
-unmarshal_settings(char *buffer, struct settings **settings)
-{
-#define UNMARSHAL(N, DATUMP) (aux = (N), memcpy((DATUMP), buf, aux), buf += aux)
-
- size_t n, aux, i;
- struct settings s_, *s = NULL;
- char *buf = buffer;
-
- UNMARSHAL(sizeof(n), &n);
- if (!(s = *settings = malloc(n - sizeof(n)))) return 0;
- s->monitors_id = NULL, s->monitors_arg = NULL;
-
- UNMARSHAL(sizeof(s_), &s_);
- if (s_.monitors_n) {
- *s = s_;
- xmalloc(&(s->monitors_id), s_.monitors_n);
- xmalloc(&(s->monitors_arg), s_.monitors_n);
- }
-
- buf = strchr(s->hookpath = buf, '\0') + 1;
-
- UNMARSHAL(s_.monitors_n, s->monitors_arg);
- for (i = 0; i < s_.monitors_n; i++)
- UNMARSHAL(strlen(buf + 1), s->monitors_id[i]);
-
- return n;
-
-fail:
- CLEANUP(free(s->monitors_id), free(s->monitors_arg), free(s), *settings = NULL);
- return 0;
-}
-
diff --git a/src/settings.h b/src/settings.h
deleted file mode 100644
index 492e4b0..0000000
--- a/src/settings.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include <time.h>
-
-
-
-/**
- * Settings from the command line.
- */
-struct settings {
- /**
- * Print current status and exit?
- */
- int print_status : 1;
-
- /**
- * Start without transition?
- */
- int panic_start : 1;
-
- /**
- * Never transition, apart from at start?
- */
- int panic_else : 1;
-
- /**
- * Set temperature, possibly with transition, and exit?
- */
- int set_and_exit : 1;
-
- /**
- * Ignore calibrations?
- */
- int ignore_calib : 1;
-
- /**
- * Apply negative image filter?
- */
- int negative : 1;
-
- /**
- * Broadcast event with bus?
- */
- int use_bus : 1;
-
- /**
- * -1 to decrease temperature,
- * +1 to increase temperature,
- * 0 to set temperature.
- */
- int temp_direction;
-
- /**
- * The temperature, if use, the program will exit when it is done.
- */
- long int temp;
-
- /**
- * The temperature at full daytime.
- */
- long int day_temp;
-
- /**
- * The temperature at full night.
- */
- long int night_temp;
-
- /**
- * The temperature when disabled.
- */
- long int natural_temp;
-
- /**
- * Pathname to the hook script.
- * Do not free this.
- */
- char *hookpath;
-
- /**
- * The number of seconds the transition takes.
- */
- struct timespec transition;
-
- /**
- * The number of kelvins per seconds the
- * temperature is adjusted during transition.
- */
- long int trans_speed;
-
- /**
- * The user's latitudinal position.
- */
- double latitude;
-
- /**
- * The user's longitudinal position.
- */
- double longitude;
-
- /**
- * The number of elements in `monitors_id` and in `monitors_arg`.
- */
- size_t monitors_n;
-
- /**
- * Values for -d, -e, and -m, in order.
- * Do not free its elements.
- */
- char **monitors_id;
-
- /**
- * The option (the character after the dash)
- * the option used in correspnding element
- * in `monitors_id`.
- */
- char *monitors_arg;
-};
-
-
-
-/**
- * Parse the command line.
- *
- * @param argc The number of elements in `argv`.
- * @param argv The commnad line arguments including the zeroth elemenet.
- * @param s Output parameter for the settings.
- */
-void parse_command_line(int argc, char *argv[], struct settings *s);
-
-
-/**
- * Marshal settings into a buffer.
- *
- * @param param The buffer, `NULL` if you want to know the required size.
- * @param settings The settings to marshal.
- * @return The size of the output.
- */
-size_t marshal_settings(char *buffer, const struct settings *settings);
-
-/**
- * Unmarshal settings from a buffer.
- *
- * @param buffer The buffer.
- * @param settings Output parameter for the settings, will be allocated.
- * @return The number of unmarshalled bytes, 0 on error.
- */
-size_t unmarshal_settings(char *buffer, struct settings **settings);
-
diff --git a/src/state.c b/src/state.c
deleted file mode 100644
index e5c2a42..0000000
--- a/src/state.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include "state.h"
-#include "macros.h"
-#include <errno.h>
-#include <limits.h>
-#include <stdarg.h>
-
-#include <libred.h>
-#include <libgamma.h>
-
-
-
-/**
- * The name of the process.
- */
-extern char *argv0;
-
-
-
-/**
- * All sites.
- */
-static libgamma_site_state_t *sites = NULL;
-
-/**
- * The number of sites stored in `sites`.
- */
-static size_t sites_n = 0;
-
-/**
- * All partitions.
- */
-static libgamma_partition_state_t *parts = NULL;
-
-/**
- * The number of partitions stored in `parts`.
- */
-static size_t parts_n = 0;
-
-
-
-/**
- * Is it daytime, night, perhaps some kind of twilight?
- *
- * @param elevation The Sun's apparent elevation.
- * @return The time of the day.
- */
-enum darkness
-get_darkness(double elevation)
-{
- if (elevation > LIBRED_SOLAR_ELEVATION_SUNSET_SUNRISE) return DAYTIME;
- if (elevation > LIBRED_SOLAR_ELEVATION_CIVIL_DUSK_DAWN) return CIVIL_TWILIGHT;
- if (elevation > LIBRED_SOLAR_ELEVATION_NAUTICAL_DUSK_DAWN) return NAUTICAL_TWILIGHT;
- if (elevation > LIBRED_SOLAR_ELEVATION_ASTRONOMICAL_DUSK_DAWN) return ASTRONOMICAL_TWILIGHT;
- return NIGHT;
-}
-
-
-/**
- * Remove the screen number for a display server instance identifier.
- *
- * @param s Display server instance identifier.
- * @return Set the value to which this pointer points to '.'. Do nothing if it is `NULL`.
- */
-static char *
-strip_screen(char *s)
-{
-#define S(V, CD) ((V = ((CD)[1] == 'r' ? strrchr : strchr)(V, (CD)[0])))
- char *p = strchr(s, '=');
- if ((p++) && (*p != '/') && S(p, ":r") && S(p, ".l")) *p = '\0'; else p = NULL;
- return p;
-#undef S
-}
-
-
-/**
- * `stpmulcpy(o, a, b, c, NULL)` is equivalent to
- * `stpcpy(stpcpy(stpcpy(o, a), b), c)`
- */
-#ifdef __GNUC__
-__attribute__((__sentinel__))
-#endif
-static char *
-stpmulcpy(char *out, ... /*, NULL */)
-{
- va_list args;
- char *p = out;
- const char *s;
- va_start(args, out);
- while ((s = va_arg(args, const char *))) p = stpcpy(p, s);
- va_end(args);
- return p;
-}
-
-
-/**
- * Compare two display server environment strings.
- *
- * @param a_ One of the string.
- * @param b_ The other string.
- * @return -1, 0, or +1.
- */
-static int
-displayenvcmp(const void *a_, const void *b_)
-{
-#ifdef __GNUC__
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
-#endif
- char *a = a_;
- char *b = b_;
-#ifdef __GNUC__
-# pragma GCC diagnostic pop
-#endif
- char *p = strip_screen(a);
- char *q = strip_screen(b);
- int rc;
-
- rc = strcmp(a, b);
- if (p) *p = '.';
- if (q) *q = '.';
- return rc;
-}
-
-
-/**
- * Make an display string safe for a pathname.
- *
- * @param str The string.
- * @return A safe version of the string, `NULL` on error.
- */
-static char *
-escape_display(const char* str)
-{
- char *r, *w, *rc = NULL;
- int s = 0;
- xmalloc(&rc, 2 * strlen(str) + 1); strcpy(rc, str);
- for (r = w = strchr(rc, '=') + 1; *r; r++) {
- if (!s || (*r != '/')) {
- if (strchr("@=/", *r)) *w++ = '@';
- *w++ = ((s = (*r == '/')) ? 's' : *r);
- }
- }
- w[s ? -2 : 0] = '\0';
-fail:
- return rc;
-}
-
-
-/**
- * The string of display servers.
- *
- * @param settings The settings.
- * @return The string, `NULL` on error.
- */
-static char *
-get_display_string(const struct settings *settings)
-{
-#define DISPLAY(VAR, D) p = strip_screen(D); try (VAR = escape_display(D)); if (p) *p = '.', p = NULL
-
- const char *var, *val;
- char *r, *p = NULL, *d = NULL, *rc = NULL, **displays;
- size_t i, n = 0, len = 0;
- int method;
-
- xmalloc(&displays, settings->monitors_n);
- for (i = 0; i < settings->monitors_n; i++)
- if ((settings->monitors_arg[i] == 'd') && strchr(settings->monitors_id[i], '='))
- len += 1 + strlen(displays[n++] = settings->monitors_id[i]);
- if (n) goto custom;
- free(displays), displays = NULL;
-
- if (!libgamma_list_methods(&method, 1, 0)) {
- fprintf(stderr, "No display was found.\n"
- "DRM support missing.\n"
- "Can you even see?\n");
- return errno = 0, NULL;
- }
-
- var = libgamma_method_default_site_variable(method);
- val = libgamma_method_default_site(method);
- if (!val || !*val) return strdup("");
- xmalloc(&d, 3 + strlen(var) + strlen(val));
- stpmulcpy(d, ".", var, "=", val, NULL);
- DISPLAY(rc, d);
- return free(d), rc;
-
-custom:
- qsort(displays, n, sizeof(*displays), displayenvcmp);
- xmalloc(&rc, 2 * len + 1);
- for (r = rc, i = 0; i < n; i++) {
- DISPLAY(d, displays[i]);
- r = stpmulcpy(r, ".", d, NULL), free(d), d = NULL;
- }
- free(displays);
- return rc;
-
-fail:
- if (p) *p = '.';
- CLEANUP(free(rc), free(d), free(displays));
- return NULL;
-}
-
-
-/**
- * Set $RADHARC_STATE.
- *
- * @param settings The settings.
- * @return 0 on success, -1 on error.
- */
-int
-get_state_pathname(const struct settings *settings)
-{
- const char *dir = getenv("XGD_RUNTIME_DIR");
- char *display = NULL;
- char *env = NULL;
- int rc = -1;
- try (display = get_display_string(settings));
- if (!dir || !*dir) dir = "/run";
- xmalloc(&env, strlen(dir) + sizeof("/radharc/") + strlen(display));
- stpmulcpy(env, dir, "/radharc/", display, NULL);
- rc = setenv("RADHARC_STATE", env, 1);
-fail:
- CLEANUP(free(env), free(display));
- return rc;
-}
-
-
-/**
- * Parse a value for the -d option, or select preferred adjustment method.
- *
- * @param display The argument for the -d option. `NULL` for the preferred adjustment method.
- * @return The adjustment method. -1 if not found.
- */
-static int
-get_clut_method(const char *display)
-{
-#define HAIKU(TEXT) t ((msg = (TEXT)))
-#define TEST(STR, ID) if (!strcasecmp(display, STR)) return ID
-
- const char *env, *msg;
- int method;
-
- /* Default? */
- if (!display) {
- if (!libgamma_list_methods(&method, 1, 0))
- HAIKU("No display was found.\n"
- "DRM support missing.\n"
- "Can you even see?\n");
- return method;
- }
-
- /* Single-sited? */
- TEST("none", INT_MAX);
- TEST("drm", LIBGAMMA_METHOD_LINUX_DRM);
-
- /* Unrecognised single-sited? */
- if (!strchr(display, '='))
- HAIKU("Specified display\n"
- "cannot be recognised.\n"
- "Try something else.\n");
-
- /* Multi-sited? */
- for (method = 0; method < LIBGAMMA_METHOD_COUNT; method++) {
- env = libgamma_method_default_site_variable(method);
- if (env && (strstr(display, env) == display) && (display[strlen(env)] == '='))
- return method;
- }
-
- /* Unrecognised multi-sited. */
- HAIKU("Specified display\n"
- "cannot be recognised.\n"
- "Try to recompile.\n");
-
-fail:
- fprintf(stderr, "%s", msg);
- return errno = 0, -1;
-}
-
-
-/**
- * Initialise the CLUT support.
- *
- * @param settings The settings.
- * @return 0 on success, -1 on error.
- */
-int
-initialise_clut(const struct settings *settings)
-{
-#define NONE_METHOD (method == INT_MAX)
-
- int method = 0, error = 0;
- const char *sitename_;
- char *sitename = NULL;
- size_t i, j, parts_off = 0;
- libgamma_site_state_t site;
-
- xcalloc(&sites, settings->monitors_n + 1);
-
- for (i = 0; i < settings->monitors_n; i++) {
- switch (settings->monitors_arg[i]) {
- case 'd':
- parts_off = parts_n;
- t ((method = get_clut_method(sitename_ = settings->monitors_id[i])) < 0);
- if (NONE_METHOD) break;
- sitename_ = strchr(sitename_, '=');
- xstrdup(&sitename, sitename_ ? sitename_ + 1 : NULL);
- t ((error = libgamma_site_initialise(sites + sites_n, method, sitename)));
- sitename = NULL, site = sites[sites_n++];
- xrealloc(&parts, parts_n + site.partitions_available);
- for (j = 0; j < site.partitions_available; j++) {
- t ((error = libgamma_partition_initialise(parts + parts_n, &site, j)));
- parts_n++;
- }
- break;
-
- case 'm':
- if (NONE_METHOD) break;
- /* TODO -m */
- break;
-
- case 'e':
- if (NONE_METHOD) break;
- /* TODO -e */
- break;
- }
- }
-
- SHRINK(&sites, sites_n + 1);
-
- return 0;
-fail:
- if (error) libgamma_perror(argv0, error), errno = 0;
- CLEANUP(free(sitename));
- return -1;
-}
-
diff --git a/src/state.h b/src/state.h
deleted file mode 100644
index f2c6b11..0000000
--- a/src/state.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include "settings.h"
-
-
-
-/**
- * The times of the day, by degree of darkness.
- */
-enum darkness {
- /**
- * Not calculated yet.
- */
- UNKNOWN = -1,
-
- /**
- * Hopefully, it is bright outside.
- */
- DAYTIME = 0,
-
- /**
- * The sky is golden. The golden "hour".
- * Also known as BMCT (dawn) or EECT (dusk).
- */
- CIVIL_TWILIGHT = 1,
-
- /**
- * The sky is pink and blue.
- */
- NAUTICAL_TWILIGHT = 2,
-
- /**
- * The sky is medium dark blue.
- */
- ASTRONOMICAL_TWILIGHT = 3,
-
- /**
- * The sky is really dark blue.
- */
- NIGHT = 4
-};
-
-
-
-/**
- * Is it daytime, night, perhaps some kind of twilight?
- *
- * @param elevation The Sun's apparent elevation.
- * @return The time of the day.
- */
-enum darkness get_darkness(double elevation);
-
-/**
- * Set $RADHARC_STATE.
- *
- * @param settings The settings.
- * @return 0 on success, -1 on error.
- */
-int get_state_pathname(const struct settings *settings);
-