aboutsummaryrefslogtreecommitdiffstats
path: root/cg-base.h
diff options
context:
space:
mode:
Diffstat (limited to 'cg-base.h')
-rw-r--r--cg-base.h237
1 files changed, 237 insertions, 0 deletions
diff --git a/cg-base.h b/cg-base.h
new file mode 100644
index 0000000..a9ef65c
--- /dev/null
+++ b/cg-base.h
@@ -0,0 +1,237 @@
+/* See LICENSE file for copyright and license details. */
+#include <libcoopgamma.h>
+
+#include <inttypes.h>
+
+
+
+/**
+ * Value of `default_priority` that indicates
+ * that there is no default priority
+ */
+#define NO_DEFAULT_PRIORITY INT64_MAX
+
+
+
+/**
+ * X-macro that list all gamma ramp types
+ *
+ * X will be expanded with 4 arguments:
+ * 1) The libcoopgamma constant that identifies the type
+ * 2) The member in `union libcoopgamma_ramps` that
+ * corresponds to the type
+ * 3) The max value for the ramp stops
+ * 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)
+
+
+
+/**
+ * Information (except asynchronous call context)
+ * required to update the gamma ramps on a CRTC.
+ */
+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;
+
+} filter_update_t;
+
+
+
+/**
+ * The process's name
+ */
+extern const char* argv0;
+
+/**
+ * The libcoopgamma context
+ */
+extern libcoopgamma_context_t cg;
+
+/**
+ * The names of the selected CRTC:s
+ */
+extern char** crtcs;
+
+/**
+ * Gamma ramp updates for each CRTC
+ */
+extern filter_update_t* crtc_updates;
+
+/**
+ * CRTC and monitor information about
+ * each selected CRTC and connect monitor
+ */
+extern libcoopgamma_crtc_info_t* crtc_info;
+
+/**
+ * The number of selected CRTC:s
+ */
+extern size_t crtcs_n;
+
+/**
+ * The number of filters
+ */
+extern size_t filters_n;
+
+
+
+/**
+ * The default filter priority for the program
+ */
+extern const int64_t default_priority;
+
+/**
+ * The default class for the program
+ */
+extern char default_class[];
+
+/**
+ * Class suffixes
+ */
+extern const char* const* class_suffixes;
+
+
+
+/**
+ * Make elements in `crtc_updates` slaves where appropriate
+ *
+ * @return Zero on success, -1 on error
+ */
+int make_slaves(void);
+
+/**
+ * Update a filter and synchronise calls
+ *
+ * @param index The index of the CRTC
+ * @param timeout The number of milliseconds a call to `poll` may block,
+ * -1 if it may block forever
+ * @return 1: Success, no pending synchronisations
+ * 0: Success, with still pending synchronisations
+ * -1: Error, `errno` set
+ * -2: Error, `cg.error` set
+ *
+ * @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);
+
+/**
+ * Synchronised calls
+ *
+ * @param timeout The number of milliseconds a call to `poll` may block,
+ * -1 if it may block forever
+ * @return 1: Success, no pending synchronisations
+ * 0: Success, with still pending synchronisations
+ * -1: Error, `errno` set
+ * -2: Error, `cg.error` set
+ *
+ * @throws EINTR Call to `poll` was interrupted by a signal
+ * @throws EAGAIN Call to `poll` timed out
+ */
+int synchronise(int timeout);
+
+
+/**
+ * Print usage information and exit
+ */
+#if defined(__GNUC__)
+__attribute__((__noreturn__))
+#endif
+extern void usage(void);
+
+/**
+ * Handle a command line option
+ *
+ * @param opt The option, it is a NUL-terminate two-character
+ * string starting with either '-' or '+', if the
+ * argument is not recognised, call `usage`. This
+ * string will not be "-M", "-S", "-c", "-p", or "-R".
+ * @param arg The argument associated with `opt`,
+ * `NULL` there is no next argument, if this
+ * parameter is `NULL` but needed, call `usage`
+ * @return 0 if `arg` was not used,
+ * 1 if `arg` was used,
+ * -1 on error
+ */
+#if defined(__GNUC__)
+__attribute__((__nonnull__(1)))
+#endif
+extern int handle_opt(char* opt, char* arg);
+
+/**
+ * This function is called after the last
+ * call to `handle_opt`
+ *
+ * @param argc The number of unparsed arguments
+ * @param argv `NULL` terminated list of unparsed arguments
+ * @param prio The argument associated with the "-p" option
+ * @return Zero on success, -1 on error
+ */
+#if defined(__GNUC__)
+__attribute__((__nonnull__(2)))
+#endif
+extern int handle_args(int argc, char* argv[], char* prio);
+
+/**
+ * The main function for the program-specific code
+ *
+ * @return 0: Success
+ * -1: Error, `errno` set
+ * -2: Error, `cg.error` set
+ * -3: Error, message already printed
+ */
+extern int start(void);