# -*- python -*- ''' pylibcoopgamma -- Python library for interfacing with cooperative gamma servers Copyright (C) 2016 Mattias Andrée (maandree@kth.se) 1;2802;0c 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 . ''' cimport cython from libc.stddef cimport size_t from libc.stdlib cimport malloc, free from libc.stdint cimport int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t from libc.errno cimport errno ctypedef int libcoopgamma_support_t # Values used to indicate the support for gamma adjustments ctypedef int libcoopgamma_depth_t # Values used to tell which datatype is used for the gamma ramp stops # # The values will always be the number of bits for integral types, and # negative for floating-point types ctypedef int libcoopgamma_lifespan_t # Values used to tell when a filter should be removed ctypedef int libcoopgamma_colourspace_t # Colourspaces cdef extern from "include-libcoopgamma.h": ctypedef struct libcoopgamma_ramps_t: # Gamma ramp structure size_t red_size # The number of stops in the red ramp size_t green_size # The number of stops in the green ramp size_t blue_size # The number of stops in the blue ramp void* red # The red ramp void* green # The green ramp void* blue # The blue ramp ctypedef struct libcoopgamma_filter_t: # Data set to the coopgamma server to apply, update, or remove a filter int64_t priority # The priority of the filter, higher priority is applied first. # The gamma correction should have priority 0. char* crtc # The CRTC for which this filter shall be applied char* fclass # Identifier for the filter # # The syntax must be "${PACKAGE_NAME}::${COMMAND_NAME}::${RULE}" libcoopgamma_lifespan_t lifespan # When shall the filter be removed? # # If this member's value is `LIBCOOPGAMMA_REMOVE`, # only `.crtc` and `.class` need also be defined libcoopgamma_depth_t depth # The data type and bit-depth of the ramp stops libcoopgamma_ramps_t ramps # The gamma ramp adjustments of the filter ctypedef struct libcoopgamma_crtc_info_t: # Gamma ramp meta information for a CRTC int cooperative # Is cooperative gamma server running? libcoopgamma_depth_t depth # The data type and bit-depth of the ramp stops $$ #if INT_MAX != LONG_MAX int padding__ #endif EOF $$> size_t red_size # The number of stops in the red ramp size_t green_size # The number of stops in the green ramp size_t blue_size # The number of stops in the blue ramp libcoopgamma_colourspace_t colourspace # The monitor's colurspace int have_gamut # Whether `.red_x`, `.red_y`, `.green_x`, `.green_y`, `.blue_x`, `.blue_y`, # `.white_x`, and `.white_y` are set. # # If this is true, but the colourspace is not RGB (or sRGB), # there is something wrong. Please also check the colourspace. unsigned red_x # The x-value (CIE xyY) of the monitor's red colour, multiplied by 1024 unsigned red_y # The y-value (CIE xyY) of the monitor's red colour, multiplied by 1024 unsigned green_x # The x-value (CIE xyY) of the monitor's green colour, multiplied by 1024 unsigned green_y # The y-value (CIE xyY) of the monitor's green colour, multiplied by 1024 unsigned blue_x # The x-value (CIE xyY) of the monitor's blue colour, multiplied by 1024 unsigned blue_y # The y-value (CIE xyY) of the monitor's blue colour, multiplied by 1024 unsigned white_x # The x-value (CIE xyY) of the monitor's default white point, multiplied by 1024 unsigned white_y # The y-value (CIE xyY) of the monitor's default white point, multiplied by 1024 ctypedef struct libcoopgamma_filter_query_t: # Data sent to the coopgamma server when requestng the current filter table int64_t high_priority # Do no return filters with higher priority than this value int64_t low_priority # Do no return filters with lower priority than this value char* crtc # The CRTC for which the the current filters shall returned int coalesce # Whether to coalesce all filters into one gamma ramp triplet $$ #if INT_MAX != LONG_MAX int padding__ #endif EOF $$> ctypedef struct libcoopgamma_queried_filter_t: # Stripped down version of `libcoopgamma_filter` which only contains # the information returned in response to "Command: get-gamma" int64_t priority # The filter's priority char* fclass # The filter's class libcoopgamma_ramps_t ramps # The gamma ramp adjustments of the filter ctypedef struct libcoopgamma_filter_table_t: # Response type for "Command: get-gamma": a list of applied filters # and meta-information that was necessary for decoding the response size_t red_size # The number of stops in the red ramp size_t green_size # The number of stops in the green ramp size_t blue_size # The number of stops in the blue ramp size_t filter_count # The number of filters libcoopgamma_queried_filter_t* filters # 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_depth_t depth # The data type and bit-depth of the ramp stops $$ #if INT_MAX != LONG_MAX int padding__ #endif EOF $$> ctypedef struct libcoopgamma_error_t: # Error message from coopgamma server uint64_t number # Error code # # If `.custom` is false, 0 indicates success, otherwise, # 0 indicates that no error code has been assigned int custom # Is this a custom error? int server_side # Did the error occur on the server-side? char* description # Error message, can be `NULL` if `.custom` is false ctypedef struct libcoopgamma_context_t: # Library state # # Use of this structure is not thread-safe create one instance # per thread that uses this structure libcoopgamma_error_t error # The error of the last failed function call # # This member is undefined after successful function call int fd # File descriptor for the socket int have_all_headers # Whether `libcoopgamma_synchronise` have read the empty end-of-headers line int bad_message # Whether `libcoopgamma_synchronise` is reading a corrupt but recoverable message int blocking # Is communication blocking? uint32_t message_id # Message ID of the next message uint32_t in_response_to # The ID of outbound message to which the inbound message being read by # `libcoopgamma_synchronise` is a response char* outbound # Buffer with the outbound message size_t outbound_head # The write head for `outbound` size_t outbound_tail # The read head for `outbound` size_t outbound_size # The allocation size of `outbound` char* inbound # Buffer with the inbound message size_t inbound_head # The write head for `inbound` size_t inbound_tail # The read head for `inbound` size_t inbound_size # The allocation size of `inbound` size_t length # The value of 'Length' header in the inbound message size_t curline # The beginning of the current line that is being read by `libcoopgamma_synchronise` ctypedef struct libcoopgamma_async_context_t: # Information necessary to identify and parse a response from the server uint32_t message_id # The value of the 'In response to' header in the waited message int coalesce # Whether to coalesce all filters into one gamma ramp triplet