/** * libcoopgamma -- Library for interfacing with cooperative gamma servers * Copyright (C) 2016 Mattias Andrée (maandree@kth.se) * * This library 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 library 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 library. If not, see . */ #ifndef LIBCOOPGAMMA_H #define LIBCOOPGAMMA_H #include #include /** * Values used to indicate the support * for gamma adjustments */ typedef enum libcoopgamma_support { /** * Gamma adjustments are not supported */ LIBCOOPGAMMA_NO = 0, /** * Don't know whether gamma ' adjustments are supported */ LIBCOOPGAMMA_MAYBE = 1, /** * Gamma adjustments are supported */ LIBCOOPGAMMA_YES = 2 } libcoopgamma_support_t; /** * Values used to tell which datatype * is used for the gamma ramp stops */ typedef enum libcoopgamma_depth { /** * `uint8_t` */ LIBCOOPGAMMA_UINT8 = 8, /** * `uint16_t` */ LIBCOOPGAMMA_UINT16 = 16, /** * `uint32_t` */ LIBCOOPGAMMA_UINT32 = 32, /** * `uint64_t` */ LIBCOOPGAMMA_UINT64 = 64, /** * `float` */ LIBCOOPGAMMA_FLOAT = -1, /** * `double` */ LIBCOOPGAMMA_DOUBLE = -2 } libcoopgamma_depth_t; /** * Values used to tell when a filter * should be removed */ typedef enum libcoopgamma_lifespan { /** * Remove the filter now */ LIBCOOPGAMMA_REMOVE = 0, /** * Remove the filter when disconnecting * from the coopgamma server */ LIBCOOPGAMMA_UNTIL_DEATH = 1, /** * Only remove the filter when it * is explicitly requested */ LIBCOOPGAMMA_UNTIL_REMOVAL = 2 } libcoopgamma_lifespan_t; /** * Define a gamma ramp structure * * @param suffix:identifier The end of the name of the `struct` * @param type:scalar-type The datatype of the stops */ #define LIBCOOPGAMMA_RAMPS__(suffix, type) \ typedef struct libcoopgamma_ramps##suffix \ { \ /** * The number of stops in the red ramp */ \ size_t red_size; \ \ /** * The number of stops in the green ramp */ \ size_t green_size; \ \ /** * The number of stops in the blue ramp */ \ size_t blue_size; \ \ /** * The red ramp */ \ type* red; \ \ /** * The green ramp */ \ type* green; \ \ /** * The blue ramp */ \ type* blue; \ \ } libcoopgamma_ramps##suffix##_t; /** * `typedef struct libcoopgamma_ramps8 libcoopgamma_ramps8_t` * * Gamma ramp structure with `uint8_t` stops */ LIBCOOPGAMMA_RAMPS__(8, uint8_t); /** * `typedef struct libcoopgamma_ramps16 libcoopgamma_ramps16_t` * * Gamma ramp structure with `uint16_t` stops */ LIBCOOPGAMMA_RAMPS__(16, uint16_t); /** * `typedef struct libcoopgamma_ramps32 libcoopgamma_ramps32_t` * * Gamma ramp structure with `uint32_t` stops */ LIBCOOPGAMMA_RAMPS__(32, uint32_t); /** * `typedef struct libcoopgamma_ramps64 libcoopgamma_ramps64_t` * * Gamma ramp structure with `uint64_t` stops */ LIBCOOPGAMMA_RAMPS__(64, uint64_t); /** * `typedef struct libcoopgamma_rampsf libcoopgamma_rampsf_t` * * Gamma ramp structure with `float` stops */ LIBCOOPGAMMA_RAMPS__(f, float); /** * `typedef struct libcoopgamma_rampsd libcoopgamma_rampsd_t` * * Gamma ramp structure with `double` stops */ LIBCOOPGAMMA_RAMPS__(d, double); /** * Data set to the coopgamma server to apply, * update, or remove a filter. */ typedef struct libcoopgamma_filter { /** * The data type and bit-depth of the ramp stops */ libcoopgamma_depth_t depth; /** * The priority of the filter, higher priority * is applied first. The gamma correction should * have priority 0. */ int64_t priority; /** * The CRTC for which this filter shall be applied */ char* crtc; /** * Identifier for the filter * * The syntax must be "${PACKAGE_NAME}::${COMMAND_NAME}::${RULE}" */ char* class; /** * When shall the filter be removed? * * If this member's value is `LIBCOOPGAMMA_REMOVE`, * only `.crtc` and `.class` need also be defined */ libcoopgamma_lifespan_t lifespan; /** * The gamma ramp adjustments of the filter */ union { /** * 8-bit version */ libcoopgamma_ramps8_t u8; /** * 16-bit version */ libcoopgamma_ramps16_t u16; /** * 32-bit version */ libcoopgamma_ramps32_t u32; /** * 64-bit version */ libcoopgamma_ramps64_t u64; /** * Single precision floating-point version */ libcoopgamma_rampsf_t f; /** * Double precision floating-point version */ libcoopgamma_rampsd_t d; } ramps; } libcoopgamma_filter_t; /** * Gamma ramp meta information for a CRTC */ typedef struct libcoopgamma_crtc_info { /** * Cooperative gamma server is running */ int cooperative; /** * The data type and bit-depth of the ramp stops */ libcoopgamma_depth_t depth; /** * The number of stops in the red ramp */ size_t red_size; /** * The number of stops in the green ramp */ size_t green_size; /** * The number of stops in the blue ramp */ size_t blue_size; /** * Is gamma adjustments supported on the CRTC? * If not, `.depth`, `.red_size`, `.green_size`, * and `.blue_size` are undefined */ libcoopgamma_support_t supported; } libcoopgamma_crtc_info_t; /** * Data sent to the coopgamma server * when requestng the current filter * table */ typedef struct libcoopgamma_filter_query { /** * The CRTC for which the the current * filters shall returned */ char* crtc; /** * Whether to coalesce all filters * into one gamma ramp triplet */ int coalesce; /** * Do no return filters with higher * priority than this value */ int64_t high_priority; /** * Do no return filters with lower * priority than this value */ int64_t low_priority; } libcoopgamma_filter_query_t; /** * Stripped down version of `libcoopgamma_filter` * which only contains the information returned * in response to "Command: get-gamma" */ typedef struct libcoopgamma_queried_filter { /** * The filter's priority */ int64_t priority; /** * The filter's class */ char* class; /** * The gamma ramp adjustments of the filter */ union { /** * 8-bit version */ libcoopgamma_ramps8_t u8; /** * 16-bit version */ libcoopgamma_ramps16_t u16; /** * 32-bit version */ libcoopgamma_ramps32_t u32; /** * 64-bit version */ libcoopgamma_ramps64_t u64; /** * Single precision floating-point version */ libcoopgamma_rampsf_t f; /** * Double precision floating-point version */ libcoopgamma_rampsd_t d; } ramps; } libcoopgamma_queried_filter_t; /** * Response type for "Command: get-gamma": a * list of applied filters and meta-information * that was necessary for decoding the response */ typedef struct libcoopgamma_filter_table { /** * The data type and bit-depth of the ramp stops */ libcoopgamma_depth_t depth; /** * The number of stops in the red ramp */ size_t red_size; /** * The number of stops in the green ramp */ size_t green_size; /** * The number of stops in the blue ramp */ size_t blue_size; /** * The number of filters */ size_t filter_count; /** * The filters, should be ordered by priority * in descending order, lest there is something * wrong with the coopgamma server * * If filter coalition was requested, there will * be exactly one filter (`.filter_count == 1`) * and `.filters->class == NULL` and * `.filters->priority` is undefined. */ libcoopgamma_queried_filter_t* filters; } libcoopgamma_filter_table_t; /** * Error message from coopgamma server */ typedef struct libcoopgamma_error { /** * Error code number * * If `.custom` is false, 0 indicates * success, otherwise, 0 indicates that * no error number has been assigned */ uint64_t number; /** * Is this a custom error? */ int custom; /** * Error message, can be `NULL` if * `.custom` is false */ char* description; } libcoopgamma_error_t; /** * Library state */ typedef struct libcoopgamma_context { /** * File descriptor for the socket */ int fd; } libcoopgamma_context_t; #endif