diff options
| author | Mattias Andrée <maandree@kth.se> | 2021-03-02 18:11:58 +0100 | 
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2021-03-02 18:11:58 +0100 | 
| commit | d615f10762649507aebee9419147246bb1dc2a93 (patch) | |
| tree | 4b3196b0bb70b6be4dd720c4be533517634b7f7e /src/lib | |
| parent | X RAndR: Fix connection failure detection (diff) | |
| download | libgamma-d615f10762649507aebee9419147246bb1dc2a93.tar.gz libgamma-d615f10762649507aebee9419147246bb1dc2a93.tar.bz2 libgamma-d615f10762649507aebee9419147246bb1dc2a93.tar.xz  | |
Change license + change style + misc
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/lib')
27 files changed, 6398 insertions, 6839 deletions
diff --git a/src/lib/edid.c b/src/lib/edid.c index 2a9f3f9..fc7b498 100644 --- a/src/lib/edid.c +++ b/src/lib/edid.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #include "edid.h"  #include "libgamma-method.h" @@ -33,88 +17,89 @@  /** - * Parse the EDID of a monitor. + * Parse the EDID of a monitor   *  - * @param   this    Instance of a data structure to fill with the information about the EDID. - *                  It must contain the EDID and its length. - * @param   feilds  OR:ed identifiers for the information about the EDID that should be parsed. - *                  Fields that do not have to do with EDID are ignored. - * @return          Non-zero on error. + * @param   this    Instance of a data structure to fill with the information about the EDID; + *                  it must contain the EDID and its length + * @param   fields  OR:ed identifiers for the information about the EDID that should be parsed; + *                  fields that do not have to do with EDID are ignored + * @return          Non-zero on error   */ -int libgamma_parse_edid(libgamma_crtc_information_t* restrict this, int32_t fields) +int +libgamma_parse_edid(libgamma_crtc_information_t *restrict this, int32_t fields)  { -#define __test_version(edid, major, minor_min, minor_max)  \ -  (((edid)[18] == major) && (minor_min <= (edid)[19]) && ((edid)[19] <= minor_max)) -#define __m(value)  (this->edid[index++] != value) -   -  int error = 0; -  int checksum = 0; -  size_t i, index = 0; -   -  /* If the length of the EDID is not 128 bytes, we know that it is not of EDID -     structure revision 1.0–1.3, and thus we do not support it. Additionally -     this make sure we do not do segmentation violation on the next test. */ -  if (this->edid_length != 128) -    error = LIBGAMMA_EDID_LENGTH_UNSUPPORTED; -  /* Check that the magic number of that of the EDID structure. */ -  else if (__m(0x00) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0x00)) -    error = LIBGAMMA_EDID_WRONG_MAGIC_NUMBER; -  /* Check that EDID structure revision 1.1–1.3 is used, those are the only -     version we support. EDID structure revision 1.3 is also by far the most -     commonly use revision and it is currently the newest revision. We know -     that parsing works for both revision 1.1 and revision 1.3, because of -     this we assume it is also correct for revision 1.2. However, we are not -     assuming this for revision 1.0 which appeared in August 1994 and was -     replaced by revision 1.1 in April 1996. */ -  else if (__test_version(this->edid, 1, 1, 3) == 0) -    error = LIBGAMMA_EDID_REVISION_UNSUPPORTED; -   -  /* If we have encountered an error, report it for the fields that require -     the EDID to be parsed. Note that it is not stored for the EDID field -     itself because it is not considered an error just because we do not -     support the used version. */ -  this->width_mm_edid_error = this->height_mm_edid_error = this->gamma_error = error; -   -  /* Retrieve the size of the viewport. This is done even if it is not -     requested because it is not worth it branch. */ -  this->width_mm_edid = (size_t)(this->edid[21]) * 10; -  this->height_mm_edid = (size_t)(this->edid[22]) * 10; -   -  /* Retrieve the monitor's gamma characteristics. */ -  if ((fields & LIBGAMMA_CRTC_INFO_GAMMA) && (error == 0)) -    { -      if (this->edid[23] == 0xFF) -	/* If the gamma charactistics is FFh (3,55) it should be interpreted as not specified. */ -	this->gamma_error = LIBGAMMA_GAMMA_NOT_SPECIFIED; -      else -	this->gamma_red = this->gamma_green = this->gamma_blue = (float)((int)(this->edid[23]) + 100) / 100.f; -    } -   -  /* If not error has occurred, calculate and test the checksum. -     It is not considered an error that the gamma characteristics -     is left unspecified in the EDID. */ -  if (error == 0) -    for (i = 0; i < this->edid_length; i++) -      checksum += (int)(this->edid[i]); -  /* The checksum should be zero. */ -  if ((checksum & 255)) -    { -      /* Store the error in all fields that require the EDID to be parsed, -         as well as the EDID field itself. */ -      error = LIBGAMMA_EDID_CHECKSUM_ERROR; -      this->edid_error = this->width_mm_edid_error = this->height_mm_edid_error = error; -      /* If the gamma characteristics is not specified, that is kept, -         and the checksum error is augmented. */ -      this->gamma_error = this->gamma_error == LIBGAMMA_GAMMA_NOT_SPECIFIED -	? LIBGAMMA_GAMMA_NOT_SPECIFIED_AND_EDID_CHECKSUM_ERROR : error; -    } -   -  /* Return whether or not we encountered an error or if -     the gamma characteristics was requested but is not -     specified in the monitor's EDID. */ -  return error | this->gamma_error; -   +#define __test_version(edid, major, minor_min, minor_max)\ +	((edid)[18] == (major) && (minor_min) <= (edid)[19] && (edid)[19] <= (minor_max)) +#define __m(value)\ +	(this->edid[index++] != (value)) + +	int error = 0, checksum = 0; +	size_t i, index = 0; + +	/* If the length of the EDID is not 128 bytes, we know that it is not of EDID +	   structure revision 1.0–1.3, and thus we do not support it. Additionally +	   this make sure we do not do segmentation violation on the next test. */ +	if (this->edid_length != 128) +		error = LIBGAMMA_EDID_LENGTH_UNSUPPORTED; +	/* Check that the magic number of that of the EDID structure. */ +	else if (__m(0x00) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0xFF) || __m(0x00)) +		error = LIBGAMMA_EDID_WRONG_MAGIC_NUMBER; +	/* Check that EDID structure revision 1.1–1.3 is used, those are the only +	   version we support. EDID structure revision 1.3 is also by far the most +	   commonly use revision and it is currently the newest revision. We know +	   that parsing works for both revision 1.1 and revision 1.3, because of +	   this we assume it is also correct for revision 1.2. However, we are not +	   assuming this for revision 1.0 which appeared in August 1994 and was +	   replaced by revision 1.1 in April 1996. */ +	else if (!__test_version(this->edid, 1, 1, 3)) +		error = LIBGAMMA_EDID_REVISION_UNSUPPORTED; + +	/* If we have encountered an error, report it for the fields that require +	   the EDID to be parsed. Note that it is not stored for the EDID field +	   itself because it is not considered an error just because we do not +	   support the used version. */ +	this->width_mm_edid_error = this->height_mm_edid_error = this->gamma_error = error; + +	/* Retrieve the size of the viewport. This is done even if it is not +	   requested because it is not worth it branch. */ +	this->width_mm_edid  = (size_t)this->edid[21] * 10; +	this->height_mm_edid = (size_t)this->edid[22] * 10; + +	/* Retrieve the monitor's gamma characteristics. */ +	if ((fields & LIBGAMMA_CRTC_INFO_GAMMA) && !error) { +		if (this->edid[23] == 0xFF) { +			/* If the gamma charactistics is FFh (3,55) it should be interpreted as not specified. */ +			this->gamma_error = LIBGAMMA_GAMMA_NOT_SPECIFIED; +		} else { +			this->gamma_blue = (float)((int)this->edid[23] + 100) / 100.f; +			this->gamma_red = this->gamma_green = this->gamma_blue; +		} +	} + +	/* If not error has occurred, calculate and test the checksum. +	   It is not considered an error that the gamma characteristics +	   is left unspecified in the EDID. */ +	if (!error) { +		for (i = 0; i < this->edid_length; i++) +			checksum += (int)this->edid[i]; +	} +	/* The checksum should be zero. */ +	if (checksum & 255) { +		/* Store the error in all fields that require the EDID to be parsed, +		   as well as the EDID field itself. */ +		error = LIBGAMMA_EDID_CHECKSUM_ERROR; +		this->edid_error = this->width_mm_edid_error = this->height_mm_edid_error = error; +		/* If the gamma characteristics is not specified, that is kept, +		   and the checksum error is augmented. */ +		this->gamma_error = this->gamma_error == LIBGAMMA_GAMMA_NOT_SPECIFIED +				? LIBGAMMA_GAMMA_NOT_SPECIFIED_AND_EDID_CHECKSUM_ERROR : error; +	} + +	/* Return whether or not we encountered an error or if +	   the gamma characteristics was requested but is not +	   specified in the monitor's EDID. */ +	return error | this->gamma_error; +  #undef __m  #undef __test_version  } - diff --git a/src/lib/edid.h b/src/lib/edid.h index f065a98..51529ae 100644 --- a/src/lib/edid.h +++ b/src/lib/edid.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_EDID_H  #define LIBGAMMA_EDID_H @@ -24,16 +8,15 @@  /** - * Parse the EDID of a monitor. + * Parse the EDID of a monitor   *  - * @param   this    Instance of a data structure to fill with the information about the EDID. - *                  It must contain the EDID and its length. - * @param   feilds  OR:ed identifiers for the information about the EDID that should be parsed. - *                  Fields that do not have to do with EDID are ignored. - * @return          Non-zero on error. + * @param   this    Instance of a data structure to fill with the information about the EDID; + *                  it must contain the EDID and its length + * @param   fields  OR:ed identifiers for the information about the EDID that should be parsed; + *                  fields that do not have to do with EDID are ignored + * @return          Non-zero on error   */ -int libgamma_parse_edid(libgamma_crtc_information_t* restrict out, int32_t fields); +int libgamma_parse_edid(libgamma_crtc_information_t *restrict, int32_t);  #endif - diff --git a/src/lib/fake-quartz-cg.c b/src/lib/fake-quartz-cg.c index e7cbbc9..75f1fb2 100644 --- a/src/lib/fake-quartz-cg.c +++ b/src/lib/fake-quartz-cg.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef FAKE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS  # error Compiling fake-quartz-cg.c without FAKE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS  #endif @@ -34,129 +18,132 @@  #ifndef HAVE_LIBGAMMA_METHOD_X_RANDR -/* Use dummy translation. */ +/* Use dummy translation */  /** - * Get a list of all online displays on the system. + * Get a list of all online displays on the system   *  - * @param   max_size      The number of elements allocated for `displays_out`. - * @param   displays_out  List ot fill with the ID for each online display on the system. - * @param   count_out     Output parameter for the number of elements stored in `displays_out`. + * @param   max_size      The number of elements allocated for `displays_out` + * @param   displays_out  List ot fill with the ID for each online display on the system + * @param   count_out     Output parameter for the number of elements stored in `displays_out`   *                        if `displays_out` is too small to fit all display ID:s, - *                        `*count_out` will be `max_size`. - * @return                `kCGErrorSuccess` on success, and error number of failure. + *                        `*count_out` will be `max_size` + * @return                `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetOnlineDisplayList(uint32_t max_size, -			       CGDirectDisplayID* restrict displays_out, uint32_t* restrict count_out) +CGError +CGGetOnlineDisplayList(uint32_t max_size, CGDirectDisplayID *restrict displays_out, uint32_t *restrict count_out)  { -  /* Pretend that we have 2 CRTC:s */ -  uint32_t i; -  for (i = 0; (i < max_size) && (i < 2); i++) -    displays_out[i] = (CGDirectDisplayID)i; -  *count_out = i; -  return kCGErrorSuccess; +	/* Pretend that we have 2 CRTC:s */ +	uint32_t i; +	for (i = 0; i < max_size && i < 2; i++) +		displays_out[i] = (CGDirectDisplayID)i; +	*count_out = i; +	return kCGErrorSuccess;  }  /** - * Set the gamma ramps for a display. + * Set the gamma ramps for a display   *  - * @param   display     The ID of the display. - * @param   gamma_size  The number of stops in gamma ramps. - * @param   red         The gamma ramp for the red channel. - * @param   green       The gamma ramp for the green channel. - * @param   blue        The gamma ramp for the blue channel. - * @return              `kCGErrorSuccess` on success, and error number of failure. + * @param   display     The ID of the display + * @param   gamma_size  The number of stops in gamma ramps + * @param   red         The gamma ramp for the red channel + * @param   green       The gamma ramp for the green channel + * @param   blue        The gamma ramp for the blue channel + * @return              `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGSetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, const CGGammaValue* red, -				    const CGGammaValue* green, const CGGammaValue* blue) +CGError +CGSetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, const CGGammaValue *red, +                            const CGGammaValue *green, const CGGammaValue *blue)  { -  (void) display; -  (void) red; -  (void) green; -  (void) blue; -   -  /* We pretend that our gamma ramps are of size 256. */ -  if (gamma_size != 256) -    { -      fprintf(stderr, "Gamma size should be 256.\n"); -      abort(); -    } -  return kCGErrorSuccess; +	(void) display; +	(void) red; +	(void) green; +	(void) blue; + +	/* We pretend that our gamma ramps are of size 256 */ +	if (gamma_size != 256) { +		fprintf(stderr, "Gamma size should be 256\n"); +		abort(); +	} +	return kCGErrorSuccess;  }  /** - * Get the current gamma ramps for a display. + * Get the current gamma ramps for a display   *  - * @param   display         The ID of the display. - * @param   gamma_size      The number of stops you have allocated for the gamma ramps. - * @param   red             Table allocated for the gamma ramp for the red channel. - * @param   green           Table allocated for the gamma ramp for the green channel. - * @param   blue            Table allocated for the gamma ramp for the blue channel. - * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps. - * @return                  `kCGErrorSuccess` on success, and error number of failure. + * @param   display         The ID of the display + * @param   gamma_size      The number of stops you have allocated for the gamma ramps + * @param   red             Table allocated for the gamma ramp for the red channel + * @param   green           Table allocated for the gamma ramp for the green channel + * @param   blue            Table allocated for the gamma ramp for the blue channel + * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps + * @return                  `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, -				    CGGammaValue* restrict red, CGGammaValue* restrict green, -				    CGGammaValue* restrict blue, uint32_t* restrict gamma_size_out) +CGError +CGGetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, CGGammaValue *restrict red, +                            CGGammaValue *restrict green, CGGammaValue *restrict blue, uint32_t *restrict gamma_size_out)  { -  long i; -  (void) display; -   -  /* We pretend that our gamma ramps are of size 256. */ -  if (gamma_size != 256) -    { -      fprintf(stderr, "Gamma size should be 256.\n"); -      abort(); -    } -   -  /* We pretend that our gamma ramps are of size 256. */ -  *gamma_size_out = 256; -   -  /* Pretend that our gamma ramps are identity mappings. */ -  for (i = 0; i < 256; i++) -    red[i] = green[i] = blue[i] = (CGGammaValue)i / 255; -   -  return kCGErrorSuccess; +	long i; + +	(void) display; + +	/* We pretend that our gamma ramps are of size 256 */ +	if (gamma_size != 256) { +		fprintf(stderr, "Gamma size should be 256\n"); +		abort(); +	} + +	/* We pretend that our gamma ramps are of size 256 */ +	*gamma_size_out = 256; + +	/* Pretend that our gamma ramps are identity mappings */ +	for (i = 0; i < 256; i++) +		red[i] = green[i] = blue[i] = (CGGammaValue)i / 255; + +	return kCGErrorSuccess;  }  /** - * Restore each display's gamma ramps to the settings in ColorSync. + * Restore each display's gamma ramps to the settings in ColorSync   */ -void CGDisplayRestoreColorSyncSettings(void) +void +CGDisplayRestoreColorSyncSettings(void)  { -  /* Do nothing. */ +	/* Do nothing */  }  /** - * Get the number of stops in the gamma ramps for a display. + * Get the number of stops in the gamma ramps for a display   *  - * @param   display  The ID of the display. - * @return           The number of stops in the gamma ramps. + * @param   display  The ID of the display + * @return           The number of stops in the gamma ramps   */ -uint32_t CGDisplayGammaTableCapacity(CGDirectDisplayID display) +uint32_t +CGDisplayGammaTableCapacity(CGDirectDisplayID display)  { -  /* We pretend that our gamma ramps are of size 256. */ -  (void) display; -  return 256; +	/* We pretend that our gamma ramps are of size 256 */ +	(void) display; +	return 256;  }  /** - * Release resources used by the backend. + * Release resources used by the backend   */ -void close_fake_quartz(void) +void +close_fake_quartz(void)  { -  /* Do nothing. */ +	/* Do nothing */  }  #else -/* Use translation to X RandR. */ +/* Use translation to X RandR */  #include <xcb/xcb.h> @@ -165,306 +152,296 @@ void close_fake_quartz(void)  /** - * Connection to the X RandR display. + * Connection to the X RandR display   */ -static xcb_connection_t* restrict connection = NULL; +static xcb_connection_t *restrict connection = NULL;  /** - * Resouces for the screen. - * We only have one screen, again this is a very sloppy compatibility layer. + * Resouces for the screen + *  + * We only have one screen, again this + * is a very sloppy compatibility layer   */ -static xcb_randr_get_screen_resources_current_reply_t* restrict res_reply = NULL; +static xcb_randr_get_screen_resources_current_reply_t *restrict res_reply = NULL;  /** - * The number of available CRTC:s. + * The number of available CRTC:s   */  static uint32_t crtc_count = 0;  /** - * List of X RandR CRTC:s. + * List of X RandR CRTC:s   */ -static xcb_randr_crtc_t* restrict crtcs = NULL; +static xcb_randr_crtc_t *restrict crtcs = NULL;  /** - * The original gamma ramps, used to emulate gamma ramp restoration to system settings. + * The original gamma ramps, used to emulate gamma ramp restoration to system settings   */ -static uint16_t* restrict original_ramps = NULL; +static uint16_t *restrict original_ramps = NULL; -/* xcb violates the rule to never return struct:s. */ -#ifdef __GCC__ +/* xcb violates the rule to never return struct:s */ +#ifdef __GNUC__  # pragma GCC diagnostic push  # pragma GCC diagnostic ignored "-Waggregate-return"  #endif  /** - * Get a list of all online displays on the system. + * Get a list of all online displays on the system   *  - * @param   max_size      The number of elements allocated for `displays_out`. - * @param   displays_out  List ot fill with the ID for each online display on the system. - * @param   count_out     Output parameter for the number of elements stored in `displays_out`. + * @param   max_size      The number of elements allocated for `displays_out` + * @param   displays_out  List ot fill with the ID for each online display on the system + * @param   count_out     Output parameter for the number of elements stored in `displays_out`,   *                        if `displays_out` is too small to fit all display ID:s, - *                        `*count_out` will be `max_size`. - * @return                `kCGErrorSuccess` on success, and error number of failure. + *                        `*count_out` will be `max_size` + * @return                `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetOnlineDisplayList(uint32_t max_size, -			       CGDirectDisplayID* restrict displays_out, uint32_t* restrict count_out) +CGError +CGGetOnlineDisplayList(uint32_t max_size, CGDirectDisplayID *restrict displays_out, uint32_t *restrict count_out)  { -  uint32_t i; -   -  /* Connect to the display and get screen data if not already done so. */ -  if (connection == NULL) -    { -      xcb_generic_error_t* error; -      xcb_screen_iterator_t iter; -      xcb_randr_get_screen_resources_current_cookie_t res_cookie; -      xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; -      xcb_randr_get_crtc_gamma_reply_t* restrict gamma_reply; -       -      /* Connect to the display. */ -      connection = xcb_connect(NULL, NULL); -      /* Get the first screen. */ -      iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); -      /* Get the resources of the screen. */ -      res_cookie = xcb_randr_get_screen_resources_current(connection, iter.data->root); -      res_reply = xcb_randr_get_screen_resources_current_reply(connection, res_cookie, &error); -      if (error) -	{ -	  fprintf(stderr, "Failed to open X connection.\n"); -	  xcb_disconnect(connection); -	  crtc_count = 0; -	  return ~kCGErrorSuccess; -	} -       -      /* Get the number of CRTC:s. */ -      crtc_count = (uint32_t)(res_reply->num_crtcs); -      /* Get the CRTC ID:s. */ -      crtcs = xcb_randr_get_screen_resources_current_crtcs(res_reply); -       -      /* Allocate memory where we store the -	 gamma ramps as they looked when this -	 adjustment method was first used. -	 This is used to emulate the functionality -	 of `CGDisplayRestoreColorSyncSettings` -	 which restore the all gamma ramps on -	 the system to the system settnigs. -      */ -      original_ramps = malloc(crtc_count * 3 * 256 * sizeof(uint16_t)); -      if (original_ramps == NULL) -	{ -	  perror("malloc"); -	  xcb_disconnect(connection); -	  crtc_count = 0; -	  return ~kCGErrorSuccess; -	} -       -      /* Fill the gamma ramps we just allocated. */ -      for (i = 0; i < crtc_count; i++) -	{ -	  /* Read current gamma ramps. */ -	  gamma_cookie = xcb_randr_get_crtc_gamma(connection, crtcs[i]); -	  gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); -	  if (error) -	    { -	      fprintf(stderr, "Failed to read gamma ramps.\n"); -	      xcb_disconnect(connection); -	      crtc_count = 0; -	      return ~kCGErrorSuccess; -	    } -	   -	  /* Copy over the gamma ramps to the memory area we have allocated. */ +	xcb_generic_error_t *error; +	xcb_screen_iterator_t iter; +	xcb_randr_get_screen_resources_current_cookie_t res_cookie; +	xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; +	xcb_randr_get_crtc_gamma_reply_t *restrict gamma_reply; +	uint32_t i; + +	/* Connect to the display and get screen data if not already done so */ +	if (!connection) { +		/* Connect to the display */ +		connection = xcb_connect(NULL, NULL); +		/* Get the first screen */ +		iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); +		/* Get the resources of the screen */ +		res_cookie = xcb_randr_get_screen_resources_current(connection, iter.data->root); +		res_reply = xcb_randr_get_screen_resources_current_reply(connection, res_cookie, &error); +		if (error) { +			fprintf(stderr, "Failed to open X connection\n"); +			xcb_disconnect(connection); +			crtc_count = 0; +			return ~kCGErrorSuccess; +		} + +		/* Get the number of CRTC:s */ +		crtc_count = (uint32_t)(res_reply->num_crtcs); +		/* Get the CRTC ID:s */ +		crtcs = xcb_randr_get_screen_resources_current_crtcs(res_reply); + +		/* Allocate memory where we store the gamma ramps as +		 * they looked when this adjustment method was first +		 * used. This is used to emulate the functionality of +		 * `CGDisplayRestoreColorSyncSettings` which restore the +		 * all gamma ramps on the system to the system settnigs. +		 */ +		original_ramps = malloc(crtc_count * 3 * 256 * sizeof(uint16_t)); +		if (!original_ramps) { +			perror("malloc"); +			xcb_disconnect(connection); +			crtc_count = 0; +			return ~kCGErrorSuccess; +		} + +		/* Fill the gamma ramps we just allocated */ +		for (i = 0; i < crtc_count; i++) { +			/* Read current gamma ramps */ +			gamma_cookie = xcb_randr_get_crtc_gamma(connection, crtcs[i]); +			gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); +			if (error) { +				fprintf(stderr, "Failed to read gamma ramps.\n"); +				xcb_disconnect(connection); +				crtc_count = 0; +				return ~kCGErrorSuccess; +			} + +			/* Copy over the gamma ramps to the memory area we have allocated */  #define __DEST(C)  original_ramps + (C + 3 * i) * 256  #define __SRC(C)  xcb_randr_get_crtc_gamma_##C(gamma_reply) -	  memcpy(__DEST(0), __SRC(red),   256 * sizeof(uint16_t)); -	  memcpy(__DEST(1), __SRC(green), 256 * sizeof(uint16_t)); -	  memcpy(__DEST(2), __SRC(blue),  256 * sizeof(uint16_t)); +			memcpy(__DEST(0), __SRC(red),   256 * sizeof(uint16_t)); +			memcpy(__DEST(1), __SRC(green), 256 * sizeof(uint16_t)); +			memcpy(__DEST(2), __SRC(blue),  256 * sizeof(uint16_t));  #undef __SRC  #undef __DEST -	   -	  /* Release resouces. */ -	  free(gamma_reply); + +			/* Release resouces */ +			free(gamma_reply); +		}  	} -    } -   -  /* Return CRTC ID:s. */ -  for (i = 0; (i < max_size) && (i < crtc_count); i++) -    *(displays_out + i) = (CGDirectDisplayID)i; -   -  /* Return the number of CRTC ID:s we returned. */ -  *count_out = i; -  return kCGErrorSuccess; + +	/* Return CRTC ID:s */ +	for (i = 0; i < max_size && i < crtc_count; i++) +		displays_out[i] = (CGDirectDisplayID)i; + +	/* Return the number of CRTC ID:s we returned */ +	*count_out = i; +	return kCGErrorSuccess;  }  /** - * Set the gamma ramps for a display. + * Set the gamma ramps for a display   *  - * @param   display     The ID of the display. - * @param   gamma_size  The number of stops in gamma ramps. - * @param   red         The gamma ramp for the red channel. - * @param   green       The gamma ramp for the green channel. - * @param   blue        The gamma ramp for the blue channel. - * @return              `kCGErrorSuccess` on success, and error number of failure. + * @param   display     The ID of the display + * @param   gamma_size  The number of stops in gamma ramps + * @param   red         The gamma ramp for the red channel + * @param   green       The gamma ramp for the green channel + * @param   blue        The gamma ramp for the blue channel + * @return              `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGSetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, const CGGammaValue* red, -				    const CGGammaValue* green, const CGGammaValue* blue) +CGError +CGSetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, const CGGammaValue *red, +                            const CGGammaValue *green, const CGGammaValue *blue)  { -  xcb_void_cookie_t gamma_cookie; -  uint16_t r_int[256]; -  uint16_t g_int[256]; -  uint16_t b_int[256]; -  long i; -  int32_t v; -   -  /* This is a sloppy compatibility layer that assumes the gamma ramp size is 256. */ -  if (gamma_size != 256) -    { -      fprintf(stderr, "Gamma size should be 256.\n"); -      abort(); -    } -   -  /* Translate the gamma ramps from float (CoreGraphics) to 16-bit unsigned integer (X RandR). */ -  for (i = 0; i < 256; i++) -    { -      /* Red channel. */ -      v = (int32_t)(red[i] * UINT16_MAX); -      r_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); -       -      /* Green channel. */ -      v = (int32_t)(green[i] * UINT16_MAX); -      g_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); -       -      /* Blue channel. */ -      v = (int32_t)(blue[i] * UINT16_MAX); -      b_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); -    } -   -  /* Apply gamma ramps. */ -  gamma_cookie = xcb_randr_set_crtc_gamma_checked(connection, crtcs[display], -						  (uint16_t)gamma_size, r_int, g_int, b_int); -  /* Check for errors. */ -  return xcb_request_check(connection, gamma_cookie) == NULL ? kCGErrorSuccess : ~kCGErrorSuccess; +	xcb_void_cookie_t gamma_cookie; +	uint16_t r_int[256], g_int[256], b_int[256]; +	int32_t v; +	long i; + +	/* This is a sloppy compatibility layer that assumes the gamma ramp size is 256 */ +	if (gamma_size != 256) { +		fprintf(stderr, "Gamma size should be 256.\n"); +		abort(); +	} + +	/* Translate the gamma ramps from float (CoreGraphics) to 16-bit unsigned integer (X RandR) */ +	for (i = 0; i < 256; i++) { +		/* Red channel */ +		v = (int32_t)(red[i] * UINT16_MAX); +		r_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); + +		/* Green channel */ +		v = (int32_t)(green[i] * UINT16_MAX); +		g_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); + +		/* Blue channel */ +		v = (int32_t)(blue[i] * UINT16_MAX); +		b_int[i] = (uint16_t)(v < 0 ? 0 : v > UINT16_MAX ? UINT16_MAX : v); +	} + +	/* Apply gamma ramps */ +	gamma_cookie = xcb_randr_set_crtc_gamma_checked(connection, crtcs[display], (uint16_t)gamma_size, r_int, g_int, b_int); +	/* Check for errors */ +	return !xcb_request_check(connection, gamma_cookie) ? kCGErrorSuccess : ~kCGErrorSuccess;  }  /** - * Get the current gamma ramps for a display. + * Get the current gamma ramps for a display   *  - * @param   display         The ID of the display. - * @param   gamma_size      The number of stops you have allocated for the gamma ramps. - * @param   red             Table allocated for the gamma ramp for the red channel. - * @param   green           Table allocated for the gamma ramp for the green channel. - * @param   blue            Table allocated for the gamma ramp for the blue channel. - * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps. - * @return                  `kCGErrorSuccess` on success, and error number of failure. + * @param   display         The ID of the display + * @param   gamma_size      The number of stops you have allocated for the gamma ramps + * @param   red             Table allocated for the gamma ramp for the red channel + * @param   green           Table allocated for the gamma ramp for the green channel + * @param   blue            Table allocated for the gamma ramp for the blue channel + * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps + * @return                  `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, -				    CGGammaValue* restrict red, CGGammaValue* restrict green, -				    CGGammaValue* restrict blue, uint32_t* restrict gamma_size_out) +CGError +CGGetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, CGGammaValue *restrict red, +                            CGGammaValue *restrict green, CGGammaValue *restrict blue, uint32_t *restrict gamma_size_out)  { -  xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; -  xcb_randr_get_crtc_gamma_reply_t* restrict gamma_reply; -  xcb_generic_error_t* error; -  uint16_t* restrict r_int; -  uint16_t* restrict g_int; -  uint16_t* restrict b_int; -  long i; -   -  /* This is a sloppy compatibility layer that assumes the gamma ramp size is 256. */ -  if (gamma_size != 256) -    { -      fprintf(stderr, "Gamma size should be 256.\n"); -      abort(); -    } -   -  /* The gamma ramp size should be returned to the caller. */ -  *gamma_size_out = 256; -   -  /* Read current gamma ramps. */ -  gamma_cookie = xcb_randr_get_crtc_gamma(connection, crtcs[display]); -  gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); -  if (error) -    { -      fprintf(stderr, "Failed to write gamma ramps.\n"); -      return ~kCGErrorSuccess; -    } -   -  /* Get gamma ramp values. */ -  r_int = xcb_randr_get_crtc_gamma_red(gamma_reply); -  g_int = xcb_randr_get_crtc_gamma_green(gamma_reply); -  b_int = xcb_randr_get_crtc_gamma_blue(gamma_reply); -   -  /* Translate gamma ramps to float format, -     that is what CoreGraphics uses. */ -  for (i = 0; i < 256; i++) -    { -      red[i]   = (CGGammaValue)(r_int[i]) / UINT16_MAX; -      green[i] = (CGGammaValue)(g_int[i]) / UINT16_MAX; -      blue[i]  = (CGGammaValue)(b_int[i]) / UINT16_MAX; -    } -   -  free(gamma_reply); -  return kCGErrorSuccess; +	xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; +	xcb_randr_get_crtc_gamma_reply_t *restrict gamma_reply; +	xcb_generic_error_t *error; +	uint16_t *restrict r_int; +	uint16_t *restrict g_int; +	uint16_t *restrict b_int; +	long i; + +	/* This is a sloppy compatibility layer that assumes the gamma ramp size is 256 */ +	if (gamma_size != 256) { +		fprintf(stderr, "Gamma size should be 256\n"); +		abort(); +	} + +	/* The gamma ramp size should be returned to the caller */ +	*gamma_size_out = 256; + +	/* Read current gamma ramps */ +	gamma_cookie = xcb_randr_get_crtc_gamma(connection, crtcs[display]); +	gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); +	if (error) { +		fprintf(stderr, "Failed to write gamma ramps\n"); +		return ~kCGErrorSuccess; +	} + +	/* Get gamma ramp values */ +	r_int = xcb_randr_get_crtc_gamma_red(gamma_reply); +	g_int = xcb_randr_get_crtc_gamma_green(gamma_reply); +	b_int = xcb_randr_get_crtc_gamma_blue(gamma_reply); + +	/* Translate gamma ramps to float format, that is what CoreGraphics uses */ +	for (i = 0; i < 256; i++) { +		red[i]   = (CGGammaValue)r_int[i] / UINT16_MAX; +		green[i] = (CGGammaValue)g_int[i] / UINT16_MAX; +		blue[i]  = (CGGammaValue)b_int[i] / UINT16_MAX; +	} + +	free(gamma_reply); +	return kCGErrorSuccess;  }  /** - * Restore each display's gamma ramps to the settings in ColorSync. + * Restore each display's gamma ramps to the settings in ColorSync   */ -void CGDisplayRestoreColorSyncSettings(void) +void +CGDisplayRestoreColorSyncSettings(void)  { -  xcb_generic_error_t* error; -  xcb_void_cookie_t gamma_cookie; -  uint32_t i; -   -  /* Restore the gamma ramps on each monitor to -     the ramps that we used when we started. */ -  for (i = 0; i < crtc_count; i++) -    { -      /* We assume that our gamma ramps are of the size -	 256 (this is a sloppy compatibility layer.) */ -      gamma_cookie = xcb_randr_set_crtc_gamma_checked(connection, crtcs[i], 256, -						      original_ramps + (0 + 3 * i) * 256, -						      original_ramps + (1 + 3 * i) * 256, -						      original_ramps + (2 + 3 * i) * 256); -      if ((error = xcb_request_check(connection, gamma_cookie))) -	fprintf(stderr, "Quartz gamma reset emulation with RandR returned %i\n", error->error_code); -    } +	xcb_generic_error_t *error; +	xcb_void_cookie_t gamma_cookie; +	uint32_t i; + +	/* Restore the gamma ramps on each monitor to +	 * the ramps that we used when we started */ +	for (i = 0; i < crtc_count; i++) { +		/* We assume that our gamma ramps are of the size +		 * 256 (this is a sloppy compatibility layer) */ +		gamma_cookie = xcb_randr_set_crtc_gamma_checked(connection, crtcs[i], 256, +		                                                &original_ramps[(0 + 3 * i) * 256], +		                                                &original_ramps[(1 + 3 * i) * 256], +		                                                &original_ramps[(2 + 3 * i) * 256]); +		if ((error = xcb_request_check(connection, gamma_cookie))) +			fprintf(stderr, "Quartz gamma reset emulation with RandR returned %i\n", error->error_code); +	}  }  /** - * Get the number of stops in the gamma ramps for a display. + * Get the number of stops in the gamma ramps for a display   *  - * @param   display  The ID of the display. - * @return           The number of stops in the gamma ramps. + * @param   display  The ID of the display + * @return           The number of stops in the gamma ramps   */ -uint32_t CGDisplayGammaTableCapacity(CGDirectDisplayID display) +uint32_t +CGDisplayGammaTableCapacity(CGDirectDisplayID display)  { -  /* We assume that our gamma ramps are of the size -     256 (this is a sloppy compatibility layer.) */ -  (void) display; -  return 256; +	/* We assume that our gamma ramps are of the size +	 * 256 (this is a sloppy compatibility layer) */ +	(void) display; +	return 256;  } -#ifdef __GCC__ +#ifdef __GNUC__  # pragma GCC diagnostic pop  #endif  /** - * Release resources used by the backend. + * Release resources used by the backend   */  void close_fake_quartz_cg(void)  { -  free(res_reply), res_reply = NULL; -  if (connection != NULL) -    xcb_disconnect(connection), connection = NULL; -  free(original_ramps), original_ramps = NULL; +	free(res_reply); +	res_reply = NULL; +	if (connection) { +		xcb_disconnect(connection); +		connection = NULL; +	} +	free(original_ramps); +	original_ramps = NULL;  }  #endif - diff --git a/src/lib/fake-quartz-cg.h b/src/lib/fake-quartz-cg.h index a77ccc6..361a73c 100644 --- a/src/lib/fake-quartz-cg.h +++ b/src/lib/fake-quartz-cg.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_FAKE_QUARTZ_CG_H  #define LIBGAMMA_FAKE_QUARTZ_CG_H @@ -23,7 +7,7 @@  #endif -#ifndef __GCC__ +#ifndef __GNUC__  # define __attribute__(x)  #endif @@ -44,79 +28,76 @@  /** - * Numerical `typedef` for errors that occur in CoreGraphics calls. + * Numerical `typedef` for errors that occur in CoreGraphics calls   */  typedef int32_t CGError;  /** - * The call was successful. + * The call was successful   */  #define kCGErrorSuccess 0  /** - * The data type that is used for the values in the gamma ramps. + * The data type that is used for the values in the gamma ramps   */  typedef float CGGammaValue;  /** - * The data type for display ID:s. + * The data type for display ID:s   */  typedef uint32_t CGDirectDisplayID;  /** - * Get a list of all online displays on the system. + * Get a list of all online displays on the system   *  - * @param   max_size      The number of elements allocated for `displays_out`. - * @param   displays_out  List ot fill with the ID for each online display on the system. - * @param   count_out     Output parameter for the number of elements stored in `displays_out`. + * @param   max_size      The number of elements allocated for `displays_out` + * @param   displays_out  List ot fill with the ID for each online display on the system + * @param   count_out     Output parameter for the number of elements stored in `displays_out`   *                        if `displays_out` is too small to fit all display ID:s, - *                        `*count_out` will be `max_size`. - * @return                `kCGErrorSuccess` on success, and error number of failure. + *                        `*count_out` will be `max_size` + * @return                `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetOnlineDisplayList(uint32_t max_size, -			       CGDirectDisplayID* restrict displays_out, uint32_t* restrict count_out); +CGError CGGetOnlineDisplayList(uint32_t, CGDirectDisplayID *restrict, uint32_t *restrict);  /** - * Set the gamma ramps for a display. + * Set the gamma ramps for a display   *  - * @param   display     The ID of the display. - * @param   gamma_size  The number of stops in gamma ramps. - * @param   red         The gamma ramp for the red channel. - * @param   green       The gamma ramp for the green channel. - * @param   blue        The gamma ramp for the blue channel. - * @return              `kCGErrorSuccess` on success, and error number of failure. + * @param   display     The ID of the display + * @param   gamma_size  The number of stops in gamma ramps + * @param   red         The gamma ramp for the red channel + * @param   green       The gamma ramp for the green channel + * @param   blue        The gamma ramp for the blue channel + * @return              `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGSetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, const CGGammaValue* red, -				    const CGGammaValue* green, const CGGammaValue* blue); +CGError CGSetDisplayTransferByTable(CGDirectDisplayID, uint32_t, const CGGammaValue *, const CGGammaValue *, const CGGammaValue *);  /** - * Get the current gamma ramps for a display. + * Get the current gamma ramps for a display   *  - * @param   display         The ID of the display. - * @param   gamma_size      The number of stops you have allocated for the gamma ramps. - * @param   red             Table allocated for the gamma ramp for the red channel. - * @param   green           Table allocated for the gamma ramp for the green channel. - * @param   blue            Table allocated for the gamma ramp for the blue channel. - * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps. - * @return                  `kCGErrorSuccess` on success, and error number of failure. + * @param   display         The ID of the display + * @param   gamma_size      The number of stops you have allocated for the gamma ramps + * @param   red             Table allocated for the gamma ramp for the red channel + * @param   green           Table allocated for the gamma ramp for the green channel + * @param   blue            Table allocated for the gamma ramp for the blue channel + * @param   gamma_size_out  Output parameter for the actual number of stops in the gamma ramps + * @return                  `kCGErrorSuccess` on success, and error number of failure   */ -CGError CGGetDisplayTransferByTable(CGDirectDisplayID display, uint32_t gamma_size, -				    CGGammaValue* restrict red, CGGammaValue* restrict green, -				    CGGammaValue* restrict blue, uint32_t* restrict gamma_size_out); +CGError CGGetDisplayTransferByTable(CGDirectDisplayID, uint32_t, CGGammaValue *restrict, +                                    CGGammaValue *restrict, CGGammaValue *restrict, uint32_t *restrict);  /** - * Restore each display's gamma ramps to the settings in ColorSync. + * Restore each display's gamma ramps to the settings in ColorSync   */  void CGDisplayRestoreColorSyncSettings(void);  /** - * Get the number of stops in the gamma ramps for a display. + * Get the number of stops in the gamma ramps for a display   *  - * @param   display  The ID of the display. - * @return           The number of stops in the gamma ramps. + * @param   display  The ID of the display + * @return           The number of stops in the gamma ramps   */ -uint32_t CGDisplayGammaTableCapacity(CGDirectDisplayID display) __attribute__((const)); +uint32_t CGDisplayGammaTableCapacity(CGDirectDisplayID) __attribute__((const));  /* The follow part most only be used when this module is used, @@ -126,15 +107,14 @@ uint32_t CGDisplayGammaTableCapacity(CGDirectDisplayID display) __attribute__((c   * and free resources needed by this module. */  /** - * Release resources used by the backend. + * Release resources used by the backend   */  void close_fake_quartz_cg(void); -#ifndef __GCC__ +#ifndef __GNUC__  # undef __attribute__  #endif  #endif - diff --git a/src/lib/fake-w32-gdi.c b/src/lib/fake-w32-gdi.c index 1489073..68847ca 100644 --- a/src/lib/fake-w32-gdi.c +++ b/src/lib/fake-w32-gdi.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_W32_GDI  # error Compiling fake-w32-gdi.c without FAKE_LIBGAMMA_METHOD_W32_GDI  #endif @@ -34,93 +18,98 @@  #ifndef HAVE_LIBGAMMA_METHOD_X_RANDR -/* Use dummy translation. */ +/* Use dummy translation */  /** - * Get the device context for a window or the entire screen. + * Get the device context for a window or the entire screen   *  - * @param   hWnd  The windows, `NULL` for the entire screen. - * @return        The device context. + * @param   hWnd  The windows, `NULL` for the entire screen + * @return        The device context   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx   */ -HDC GetDC(HWND hWnd) +HDC +GetDC(HWND hWnd)  { -  /* Just a non-NULL value. */ -  (void) hWnd; -  return (HDC*)16; +	/* Just a non-NULL value */ +	(void) hWnd; +	return (HDC *)16;  }  /** - * Free a device context. + * Free a device context   *  - * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen. - * @param   hDC   The device context to free. - * @return        Whether the call was successful. + * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen + * @param   hDC   The device context to free + * @return        Whether the call was successful   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920(v=vs.85).aspx   */ -int ReleaseDC(HWND hWnd, HDC hDC) +int +ReleaseDC(HWND hWnd, HDC hDC)  { -  /* Always successful. */ -  (void) hWnd; -  (void) hDC; -  return 1; +	/* Always successful */ +	(void) hWnd; +	(void) hDC; +	return 1;  }  /** - * Get information (capabilities) for a device context. + * Get information (capabilities) for a device context   *  - * @param   hDC     The device context. - * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`. + * @param   hDC     The device context + * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`   * @return          The details of the queried information, can return `CM_GAMMA_RAMP` - *                  if `nIndex` is `COLORMGMTCAPS`. + *                  if `nIndex` is `COLORMGMTCAPS`   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx   */ -int GetDeviceCaps(HDC hDC, int nIndex) +int +GetDeviceCaps(HDC hDC, int nIndex)  { -  /* We have gamma ramps if the user asks for colour management capabilities. */ -  (void) hDC; -  return CM_GAMMA_RAMP + nIndex - COLORMGMTCAPS; +	/* We have gamma ramps if the user asks for colour management capabilities */ +	(void) hDC; +	return CM_GAMMA_RAMP + nIndex - COLORMGMTCAPS;  }  /** - * Set the gamma ramps for a device. + * Set the gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The gamma ramps joined in the order: red, green, blue + *                  This is a `WORD*` casted to `void*` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd372194(v=vs.85).aspx   */ -BOOL SetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp) +BOOL +SetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  { -  /* Always successful. */ -  (void) hDC; -  (void) lpRamp; -  return TRUE; +	/* Always successful */ +	(void) hDC; +	(void) lpRamp; +	return TRUE;  }  /** - * Get the current gamma ramps for a device. + * Get the current gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue + *                  This is a `WORD *` casted to `void *` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd316946(v=vs.85).aspx   */ -BOOL GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp) +BOOL +GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  { -  /* Always successful. */ -  (void) hDC; -  (void) lpRamp; -  return TRUE; +	/* Always successful */ +	(void) hDC; +	(void) lpRamp; +	return TRUE;  } @@ -128,68 +117,66 @@ BOOL GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  /**   * Get the context for a device   *  - * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display. + * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display   * @param   lpszDevice  The name of the device. If you want a display use can use the member   *                      name `DeviceName` in the third parameter, an output parameter, of - *                      `EnumDisplayDevices`. - * @param   lpszOutput  We will always use `NULL` here. - * @param   lpInitData  We will always use `NULL` here. This should actually by a `const DEVMODE*`. - * @return  - - * @see     http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx + *                      `EnumDisplayDevices` + * @param   lpszOutput  We will always use `NULL` here + * @param   lpInitData  We will always use `NULL` here; this should actually by a `const DEVMODE *` + * @return              The context for the device + * @see                 http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx   */ -HDC CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice, -	     LPCTSTR restrict lpszOutput, const void* restrict lpInitData) +HDC +CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice, LPCTSTR restrict lpszOutput, const void *restrict lpInitData)  { -  /* `NULL` if not asking for a CRTC, otherwise a non-NULL value. */ -  (void) lpszOutput; -  (void) lpInitData; -  (void) lpszDevice; -  return strcmp(lpszDriver, "DISPLAY") ? NULL : (HDC*)16; +	/* `NULL` if not asking for a CRTC, otherwise a non-NULL value */ +	(void) lpszOutput; +	(void) lpInitData; +	(void) lpszDevice; +	return !strcmp(lpszDriver, "DISPLAY") ? (HDC *)16 : NULL;  }  /** - * Get a display device by its name or index. + * Get a display device by its name or index   *  - * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead. - * @param   iDevNum          The index of the device. - * @param   lpDisplayDevice  Output for the found device. - * @param   dwFlags          Flags, we will always use zero. - * @return                   Whether the call was successful. Zero is also returned if `iDevNum` - *                           is greater than the largest device index on the system. + * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead + * @param   iDevNum          The index of the device + * @param   lpDisplayDevice  Output for the found device + * @param   dwFlags          Flags, we will always use zero + * @return                   Whether the call was successful; zero is also returned if `iDevNum` + *                           is greater than the largest device index on the system   * @see                      http://msdn.microsoft.com/en-us/library/windows/desktop/dd162609(v=vs.85).aspx   */ -BOOL EnumDisplayDevices(LPCTSTR lpDevice, restrict DWORD iDevNum, -			PDISPLAY_DEVICE restrict lpDisplayDevice, DWORD dwFlags) +BOOL +EnumDisplayDevices(LPCTSTR lpDevice, restrict DWORD iDevNum, PDISPLAY_DEVICE restrict lpDisplayDevice, DWORD dwFlags)  { -  (void) dwFlags; -  /* Check correctness of `lpDevice`. */ -  if (lpDevice != NULL) -    { -      fprintf(stderr, "lpDevice (argument 1) for EnumDisplayDevices should be NULL\n"); -      abort(); -      return FALSE; -    } -  /* Pretend that we have two CRTC:s. */ -  if (iDevNum >= 2) -    return FALSE; -  /* Check correctness of `lpDisplayDevice`. */ -  if (lpDisplayDevice->cb != sizeof(DISPLAY_DEVICE)) -    { -      fprintf(stderr, "lpDisplayDevice->cb for EnumDisplayDevices is not sizeof(DISPLAY_DEVICE)\n"); -      abort(); -      return FALSE; -    } -  /* Store an arbitrary name for the monitor. */ -  strcmp(lpDisplayDevice->DeviceName, "some monitor"); -  /* The connector is always enabled. */ -  lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ACTIVE; -  return TRUE; +	(void) dwFlags; +	/* Check correctness of `lpDevice` */ +	if (lpDevice) { +		fprintf(stderr, "lpDevice (argument 1) for EnumDisplayDevices should be NULL\n"); +		abort(); +		return FALSE; +	} +	/* Pretend that we have two CRTC:s */ +	if (iDevNum >= 2) +		return FALSE; +	/* Check correctness of `lpDisplayDevice` */ +	if (lpDisplayDevice->cb != sizeof(DISPLAY_DEVICE)) { +		fprintf(stderr, "lpDisplayDevice->cb for EnumDisplayDevices is not sizeof(DISPLAY_DEVICE)\n"); +		abort(); +		return FALSE; +	} +	/* Store an arbitrary name for the monitor */ +	strcmp(lpDisplayDevice->DeviceName, "some monitor"); +	/* The connector is always enabled */ +	lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ACTIVE; +	return TRUE;  }  #else -/* Use translation to X RandR. */ +/* Use translation to X RandR */  #include <xcb/xcb.h> @@ -198,162 +185,168 @@ BOOL EnumDisplayDevices(LPCTSTR lpDevice, restrict DWORD iDevNum,  /**   * The gamma ramp size that devices will - * always have in Windows GDI. + * always have in Windows GDI   */ -#define GAMMA_RAMP_SIZE  256 +#define GAMMA_RAMP_SIZE 256  /** - * Connection to the X RandR display. + * Connection to the X RandR display   */ -static xcb_connection_t* restrict connection = NULL; +static xcb_connection_t *restrict connection = NULL;  /** - * Resouces for the screen. - * We only have one screen, again this is a very sloppy compatibility layer. + * Resouces for the screen + *  + * We only have one screen, again this + * is a very sloppy compatibility layer   */ -static xcb_randr_get_screen_resources_current_reply_t* restrict res_reply = NULL; +static xcb_randr_get_screen_resources_current_reply_t *restrict res_reply = NULL;  /** - * The number of available CRTC:s, -1 if not known yet. + * The number of available CRTC:s, -1 if not known yet   */  static ssize_t crtc_count = -1;  /** - * List of X RandR CRTC:s. + * List of X RandR CRTC:s   */ -static xcb_randr_crtc_t* restrict crtcs = NULL; +static xcb_randr_crtc_t *restrict crtcs = NULL;  /** - * The number of opened CRTC:s. + * The number of opened CRTC:s   */  static size_t dc_count = 0;  /** - * Get the device context for a window or the entire screen. + * Get the device context for a window or the entire screen   *  - * @param   hWnd  The windows, `NULL` for the entire screen. - * @return        The device context. + * @param   hWnd  The windows, `NULL` for the entire screen + * @return        The device context   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx   */ -HDC GetDC(HWND hWnd) +HDC +GetDC(HWND hWnd)  { -  /* Return the primary CRTC. */ -  (void) hWnd; -  return CreateDC(TEXT("DISPLAY"), "0", NULL, NULL); +	/* Return the primary CRTC */ +	(void) hWnd; +	return CreateDC(TEXT("DISPLAY"), "0", NULL, NULL);  }  /** - * Free a device context. + * Free a device context   *  - * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen. - * @param   hDC   The device context to free. - * @return        Whether the call was successful. + * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen + * @param   hDC   The device context to free + * @return        Whether the call was successful   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920(v=vs.85).aspx   */ -int ReleaseDC(HWND hWnd, HDC hDC) +int +ReleaseDC(HWND hWnd, HDC hDC)  { -  /* Disconnect from the RandR display when all monitors have been closed. */ -  (void) hWnd; -  (void) hDC; -  dc_count--; -  if (dc_count == 0) -    { -      if (connection != NULL) -	xcb_disconnect(connection); -      connection = NULL; -      free(res_reply); -      res_reply = NULL; -    } -  return 1; +	/* Disconnect from the RandR display when all monitors have been closed */ +	(void) hWnd; +	(void) hDC; +	if (!dc_count--) { +		if (connection) { +			xcb_disconnect(connection); +			connection = NULL; +		} +		free(res_reply); +		res_reply = NULL; +	} +	return 1;  }  /** - * Get information (capabilities) for a device context. + * Get information (capabilities) for a device context   *  - * @param   hDC     The device context. - * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`. + * @param   hDC     The device context + * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`   * @return          The details of the queried information, can return `CM_GAMMA_RAMP` - *                  if `nIndex` is `COLORMGMTCAPS`. + *                  if `nIndex` is `COLORMGMTCAPS`   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx   */ -int GetDeviceCaps(HDC hDC, int nIndex) +int +GetDeviceCaps(HDC hDC, int nIndex)  { -  /* We have gamma ramps if the user asks for colour management capabilities. */ -  (void) hDC; -  return CM_GAMMA_RAMP + nIndex - COLORMGMTCAPS; +	/* We have gamma ramps if the user asks for colour management capabilities */ +	(void) hDC; +	return CM_GAMMA_RAMP + nIndex - COLORMGMTCAPS;  } -/* xcb violates the rule to never return `struct`:s. */ -#ifdef __GCC__ +/* xcb violates the rule to never return `struct`:s */ +#ifdef __GNUC__  # pragma GCC diagnostic push  # pragma GCC diagnostic ignored "-Waggregate-return"  #endif  /** - * Set the gamma ramps for a device. + * Set the gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The gamma ramps joined in the order: red, green, blue + *                  This is a `WORD *` casted to `void *` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd372194(v=vs.85).aspx   */ -BOOL SetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp) +BOOL +SetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  { -  /* We assume that our gamma ramps are of the same size -     as used by Windows GDI (we are so sloppy.) */ -  xcb_void_cookie_t gamma_cookie = -    xcb_randr_set_crtc_gamma_checked(connection, *(xcb_randr_crtc_t*)hDC, GAMMA_RAMP_SIZE, -				     ((uint16_t*)lpRamp) + 0 * GAMMA_RAMP_SIZE, -				     ((uint16_t*)lpRamp) + 1 * GAMMA_RAMP_SIZE, -				     ((uint16_t*)lpRamp) + 2 * GAMMA_RAMP_SIZE); -  xcb_generic_error_t* error = xcb_request_check(connection, gamma_cookie); -  return error == NULL ? TRUE : FALSE; +	/* We assume that our gamma ramps are of the same size +	 * as used by Windows GDI (we are so sloppy) */ +	xcb_void_cookie_t gamma_cookie = +		xcb_randr_set_crtc_gamma_checked(connection, *(xcb_randr_crtc_t *)hDC, GAMMA_RAMP_SIZE, +		                                 &((uint16_t *)lpRamp)[0 * GAMMA_RAMP_SIZE], +		                                 &((uint16_t *)lpRamp)[1 * GAMMA_RAMP_SIZE], +		                                 &((uint16_t *)lpRamp)[2 * GAMMA_RAMP_SIZE)]; +	xcb_generic_error_t *error = xcb_request_check(connection, gamma_cookie); +	return !error ? TRUE : FALSE;  }  /** - * Get the current gamma ramps for a device. + * Get the current gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue + *                  This is a `WORD *` casted to `void *` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd316946(v=vs.85).aspx   */ -BOOL GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp) +BOOL +GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  { -  xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; -  xcb_randr_get_crtc_gamma_reply_t* restrict gamma_reply; -  xcb_generic_error_t* error; -   -  /* Read current gamma ramps. */ -  gamma_cookie = xcb_randr_get_crtc_gamma(connection, *(xcb_randr_crtc_t*)hDC); -  gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); -  if (error) -    return FALSE; -   -#define DEST_RAMP(I)  (((uint16_t*)lpRamp) + (I) * GAMMA_RAMP_SIZE) +	xcb_randr_get_crtc_gamma_cookie_t gamma_cookie; +	xcb_randr_get_crtc_gamma_reply_t *restrict gamma_reply; +	xcb_generic_error_t *error; + +	/* Read current gamma ramps */ +	gamma_cookie = xcb_randr_get_crtc_gamma(connection, *(xcb_randr_crtc_t *)hDC); +	gamma_reply = xcb_randr_get_crtc_gamma_reply(connection, gamma_cookie, &error); +	if (error) +		return FALSE; + +#define DEST_RAMP(I) (&((uint16_t *)lpRamp)[(I) * GAMMA_RAMP_SIZE])  #define SRC_RAMP(C)  (xcb_randr_get_crtc_gamma_##C(gamma_reply)) -   -  /* Copy the ramps into the output parameter. (coalesced) */ -  memcpy(DEST_RAMP(0), SRC_RAMP(red),   GAMMA_RAMP_SIZE * sizeof(uint16_t)); -  memcpy(DEST_RAMP(1), SRC_RAMP(green), GAMMA_RAMP_SIZE * sizeof(uint16_t)); -  memcpy(DEST_RAMP(2), SRC_RAMP(blue),  GAMMA_RAMP_SIZE * sizeof(uint16_t)); -   + +	/* Copy the ramps into the output parameter (coalesced) */ +	memcpy(DEST_RAMP(0), SRC_RAMP(red),   GAMMA_RAMP_SIZE * sizeof(uint16_t)); +	memcpy(DEST_RAMP(1), SRC_RAMP(green), GAMMA_RAMP_SIZE * sizeof(uint16_t)); +	memcpy(DEST_RAMP(2), SRC_RAMP(blue),  GAMMA_RAMP_SIZE * sizeof(uint16_t)); +  #undef SRC_RAMP  #undef DEST_RAMP -   -  free(gamma_reply); -  return TRUE; + +	free(gamma_reply); +	return TRUE;  } @@ -361,134 +354,126 @@ BOOL GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp)  /**   * Get the context for a device   *  - * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display. + * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display   * @param   lpszDevice  The name of the device. If you want a display use can use the member   *                      name `DeviceName` in the third parameter, an output parameter, of - *                      `EnumDisplayDevices`. - * @param   lpszOutput  We will always use `NULL` here. - * @param   lpInitData  We will always use `NULL` here. This should actually by a `const DEVMODE*`. - * @return  - - * @see     http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx + *                      `EnumDisplayDevices` + * @param   lpszOutput  We will always use `NULL` here + * @param   lpInitData  We will always use `NULL` here; this should actually by a `const DEVMODE *` + * @return              The context for the device + * @see                 http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx   */ -HDC CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice, -	     LPCTSTR restrict lpszOutput, const void* restrict lpInitData) +HDC +CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice, LPCTSTR restrict lpszOutput, const void *restrict lpInitData)  { -  int crtc_index = atoi(lpszDevice); -   -  (void) lpszOutput; -  (void) lpInitData; -   -  /* Check correctness of input. */ -  if (strcmp(lpszDriver, "DISPLAY")) -    return NULL; -   -  /* Connect to the display and get screen data if not already done so. */ -  if (dc_count == 0) -    { -      xcb_generic_error_t* error; -      xcb_screen_iterator_t iter; -      xcb_randr_get_screen_resources_current_cookie_t res_cookie; -       -      /* Connect to the display. */ -      connection = xcb_connect(NULL, NULL); -      /* Get the first screen. */ -      iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); -      /* Get the resources of the screen. */ -      res_cookie = xcb_randr_get_screen_resources_current(connection, iter.data->root); -      res_reply = xcb_randr_get_screen_resources_current_reply(connection, res_cookie, &error); -      if (error) -	{ -	  fprintf(stderr, "Failed to open X connection.\n"); -	  xcb_disconnect(connection); -	  crtc_count = -1; -	  return NULL; +	int crtc_index = atoi(lpszDevice); +	xcb_generic_error_t *error; +	xcb_screen_iterator_t iter; +	xcb_randr_get_screen_resources_current_cookie_t res_cookie; + +	(void) lpszOutput; +	(void) lpInitData; + +	/* Check correctness of input */ +	if (strcmp(lpszDriver, "DISPLAY")) +		return NULL; + +	/* Connect to the display and get screen data if not already done so */ +	if (!dc_count) { +		/* Connect to the display */ +		connection = xcb_connect(NULL, NULL); +		/* Get the first screen */ +		iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); +		/* Get the resources of the screen */ +		res_cookie = xcb_randr_get_screen_resources_current(connection, iter.data->root); +		res_reply = xcb_randr_get_screen_resources_current_reply(connection, res_cookie, &error); +		if (error) { +			fprintf(stderr, "Failed to open X connection\n"); +			xcb_disconnect(connection); +			crtc_count = -1; +			return NULL; +		} + +		/* Get the number of CRTC:s */ +		crtc_count = res_reply->num_crtcs; +		/* Get the CRTC ID:s */ +		crtcs = xcb_randr_get_screen_resources_current_crtcs(res_reply);  	} -       -      /* Get the number of CRTC:s. */ -      crtc_count = res_reply->num_crtcs; -      /* Get the CRTC ID:s. */ -      crtcs = xcb_randr_get_screen_resources_current_crtcs(res_reply); -    } -   -  /* Was the index too high. */ -  if (crtc_index >= crtc_count) -    { -      /* Disconnect and release resouces and -	 mark that we do not know the number of -	 available CRTC:s if we have not opened -	 any monitors yet. */ -      if (dc_count == 0) -	{ -	  xcb_disconnect(connection); -	  free(res_reply); -	  res_reply = NULL; -	  crtc_count = -1; + +	/* Was the index too high */ +	if (crtc_index >= crtc_count) { +		/* Disconnect and release resouces and mark that +		   we do not know the number of available CRTC:s +		   if we have not opened any monitors yet */ +		if (!dc_count) { +			xcb_disconnect(connection); +			free(res_reply); +			res_reply = NULL; +			crtc_count = -1; +		} +		return NULL;  	} -      return NULL; -    } -   -  /* We have opened a new CRTC. */ -  dc_count++; -  /* Return the ID of the CRTC. */ -  return crtcs + crtc_index; + +	/* We have opened a new CRTC */ +	dc_count++; +	/* Return the ID of the CRTC */ +	return &crtcs[crtc_index];  } -#ifdef __GCC__ +#ifdef __GNUC__  # pragma GCC diagnostic pop  #endif  /** - * Get a display device by its name or index. + * Get a display device by its name or index   *  - * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead. - * @param   iDevNum          The index of the device. - * @param   lpDisplayDevice  Output for the found device. - * @param   dwFlags          Flags, we will always use zero. - * @return                   Whether the call was successful. Zero is also returned if `iDevNum` - *                           is greater than the largest device index on the system. + * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead + * @param   iDevNum          The index of the device + * @param   lpDisplayDevice  Output for the found device + * @param   dwFlags          Flags, we will always use zero + * @return                   Whether the call was successful; zero is also returned if `iDevNum` + *                           is greater than the largest device index on the system   * @see                      http://msdn.microsoft.com/en-us/library/windows/desktop/dd162609(v=vs.85).aspx   */ -BOOL EnumDisplayDevices(LPCTSTR restrict lpDevice, DWORD iDevNum, -			PDISPLAY_DEVICE restrict lpDisplayDevice, DWORD dwFlags) +BOOL +EnumDisplayDevices(LPCTSTR restrict lpDevice, DWORD iDevNum, PDISPLAY_DEVICE restrict lpDisplayDevice, DWORD dwFlags)  { -  size_t count = (size_t)crtc_count; -  (void) dwFlags; -  /* Check the correctness of the input. */ -  if (lpDevice != NULL) -    { -      fprintf(stderr, "lpDevice (argument 1) for EnumDisplayDevices should be NULL\n"); -      abort(); -      return FALSE; -    } -  /* Do we know how many CRTC:s are available? */ -  if (crtc_count < 0) -    { -      /* If not open the first CRTC so that will be figured out. */ -      if (GetDC(NULL) == NULL) -	return FALSE; -      count = (size_t)crtc_count; -      /* Close the primary monitor that we just closed. */ -      ReleaseDC(NULL, NULL); -    } -  /* Check that the request CRTC exists. */ -  if (iDevNum >= count) -    return FALSE; -  /* Check the correctness of the input. */ -  if (lpDisplayDevice->cb != sizeof(DISPLAY_DEVICE)) -    { -      fprintf(stderr, "lpDisplayDevice->cb for EnumDisplayDevices is not sizeof(DISPLAY_DEVICE)\n"); -      abort(); -      return FALSE; -    } -  /* Store name for the CRTC. */ -  sprintf(lpDisplayDevice->DeviceName, "%i", iDevNum); -  /* The connector that the CRTC belongs to is enabled. */ -  lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ACTIVE; -  return TRUE; +	size_t count = (size_t)crtc_count; + +	(void) dwFlags; + +	/* Check the correctness of the input */ +	if (lpDevice) { +		fprintf(stderr, "lpDevice (argument 1) for EnumDisplayDevices should be NULL\n"); +		abort(); +		return FALSE; +	} +	/* Do we know how many CRTC:s are available? */ +	if (crtc_count < 0) { +		/* If not open the first CRTC so that will be figured out */ +		if (!GetDC(NULL)) +			return FALSE; +		count = (size_t)crtc_count; +		/* Close the primary monitor that we just closed */ +		ReleaseDC(NULL, NULL); +	} +	/* Check that the request CRTC exists */ +	if (iDevNum >= count) +		return FALSE; +	/* Check the correctness of the input */ +	if (lpDisplayDevice->cb != sizeof(DISPLAY_DEVICE)) { +		fprintf(stderr, "lpDisplayDevice->cb for EnumDisplayDevices is not sizeof(DISPLAY_DEVICE)\n"); +		abort(); +		return FALSE; +	} +	/* Store name for the CRTC */ +	sprintf(lpDisplayDevice->DeviceName, "%i", iDevNum); +	/* The connector that the CRTC belongs to is enabled */ +	lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ACTIVE; +	return TRUE;  }  #endif - diff --git a/src/lib/fake-w32-gdi.h b/src/lib/fake-w32-gdi.h index 9462afe..bcc2fa9 100644 --- a/src/lib/fake-w32-gdi.h +++ b/src/lib/fake-w32-gdi.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_FAKE_W32_GDI_H  #define LIBGAMMA_FAKE_W32_GDI_H @@ -23,7 +7,7 @@  #endif -#ifndef __GCC__ +#ifndef __GNUC__  # define __attribute__(x)  #endif @@ -31,64 +15,64 @@  /** - * One of the Windows `typedef`:s for unsigned 16-bit integer. - * This is the one used in these functions. + * One of the Windows `typedef`:s for unsigned 16-bit integer + * This is the one used in these functions   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#WORD   */  typedef uint16_t WORD;  /** - * One of the Windows `typedef`:s for unsigned 32-bit integer. - * This is the one used in these functions. + * One of the Windows `typedef`:s for unsigned 32-bit integer + * This is the one used in these functions   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#DWORD   */ -typedef uint32_t DWORD ; -/* XXX Documented to be 32-bit but defined as `typedef unsigned long DWORD`, which is it? */ +typedef uint32_t DWORD;  /** - * One of the Windows `typedef` for booleanic values, the `int` variant. + * One of the Windows `typedef` for booleanic values, the `int` variant   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#BOOL   */  typedef int BOOL;  /** - * Windows `typedef` for a device context (the 'h' stands for 'handle'.) + * Windows `typedef` for a device context (the 'h' stands for 'handle')   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#HDC   */ -typedef void* HDC; +typedef void *HDC;  /** - * Windows `typedef` for a window (the 'h' stands for 'handle'.) + * Windows `typedef` for a window (the 'h' stands for 'handle')   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#HWND   */ -typedef void* HWND; +typedef void *HWND;  /** - * One of the Windows `typedef`:s for `void*`, a generic pointer. + * One of the Windows `typedef`:s for `void *`, a generic pointer   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPVOID   */ -typedef void* LPVOID; +typedef void *LPVOID;  /** - * A silly Windows `typedef` for a `const char*`, a constant string. + * A silly Windows `typedef` for a `const char *`, a constant string + *    * It is also defined as NUL-terminated, but so are all C-strings   * and it makes no difference. However if `UNICODE` were to be defined - * it would be `const wchar_t*`. + * it would be `const wchar_t *`.   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPCTSTR   */ -typedef const char* LPCTSTR; +typedef const char *LPCTSTR;  /**   * Even more silly. A Windows `typedef` for either `wchar_t` or - * `char`, depending on whether `UNICODE` is defined. We will - * assume `UNICODE` is not definied because that is just silly. + * `char`, depending on whether `UNICODE` is defined (we will + * assume `UNICODE` is not definied because that is just silly)   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#TCHAR   */ @@ -100,7 +84,7 @@ typedef char TCHAR;   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#BOOL   */ -#define TRUE  1 +#define TRUE 1  /**   * Apperently we need `FALSE` to be defined to understand code, @@ -113,35 +97,35 @@ typedef char TCHAR;  /** - * Get the device context for a window or the entire screen. + * Get the device context for a window or the entire screen   *  - * @param   hWnd  The window, `NULL` for the entire screen. - * @return        The device context. + * @param   hWnd  The window, `NULL` for the entire screen + * @return        The device context   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx   */ -HDC GetDC(HWND hWnd); +HDC GetDC(HWND);  /** - * Free a device context. + * Free a device context   *  - * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen. - * @param   hDC   The device context to free. - * @return        Whether the call was successful. + * @param   hWnd  The window whose device context is `hDC`, `NULL` for the entire screen + * @param   hDC   The device context to free + * @return        Whether the call was successful   * @see           http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920(v=vs.85).aspx   */ -int ReleaseDC(HWND hWnd, HDC hDC); +int ReleaseDC(HWND, HDC);  /** - * Get information (capabilities) for a device context. + * Get information (capabilities) for a device context   *  - * @param   hDC     The device context. - * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`. + * @param   hDC     The device context + * @param   nIndex  The information to retrieve, may be `COLORMGMTCAPS`   * @return          The details of the queried information, can return `CM_GAMMA_RAMP` - *                  if `nIndex` is `COLORMGMTCAPS`. + *                  if `nIndex` is `COLORMGMTCAPS`   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx   */ -int GetDeviceCaps(HDC hDC, int nIndex) __attribute__((const)); +int GetDeviceCaps(HDC, int) __attribute__((const));  /**   * Colour management capabilities @@ -159,45 +143,45 @@ int GetDeviceCaps(HDC hDC, int nIndex) __attribute__((const));  /** - * Set the gamma ramps for a device. + * Set the gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The gamma ramps joined in the order: red, green, blue; + *                  this is a `WORD *` casted to `void *` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd372194(v=vs.85).aspx   */ -BOOL SetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp); +BOOL SetDeviceGammaRamp(HDC, LPVOID restrict);  /** - * Get the current gamma ramps for a device. + * Get the current gamma ramps for a device   *  - * @param   hDC     The device context. - * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue. - *                  This is a `WORD*` casted to `void*`. - * @return          Whether the call was successful. + * @param   hDC     The device context + * @param   lpRamp  The output for the gamma ramps joined in the order: red, green, blue + *                  This is a `WORD *` casted to `void *` + * @return          Whether the call was successful   * @see             http://msdn.microsoft.com/en-us/library/windows/desktop/dd316946(v=vs.85).aspx   */ -BOOL GetDeviceGammaRamp(HDC hDC, LPVOID restrict lpRamp); +BOOL GetDeviceGammaRamp(HDC, LPVOID restrict);  /**   * Get the context for a device   *  - * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display. + * @param   lpszDriver  The driver or a display device, use "DISPLAY" if you want a display   * @param   lpszDevice  The name of the device. If you want a display use can use the member   *                      name `DeviceName` in the third parameter, an output parameter, of   *                      `EnumDisplayDevices`. - * @param   lpszOutput  We will always use `NULL` here. - * @param   lpInitData  We will always use `NULL` here. This should actually by a `const DEVMODE*`. - * @return              The context for the device. + * @param   lpszOutput  We will always use `NULL` here + * @param   lpInitData  We will always use `NULL` here; this should actually by a `const DEVMODE *` + * @return              The context for the device   * @see                 http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx   */ -HDC CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice, -	     LPCTSTR restrict lpszOutput, const void* restrict lpInitData); +HDC CreateDC(LPCTSTR restrict, LPCTSTR restrict, LPCTSTR restrict, const void *restrict);  /** - * This macro does not seem to have an official documentation that is correct. + * This macro does not seem to have an official documentation that is correct + *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx   * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd374074(v=vs.85).aspx   */ @@ -205,63 +189,60 @@ HDC CreateDC(LPCTSTR restrict lpszDriver, LPCTSTR restrict lpszDevice,  /** - * Information about a display device. + * Information about a display device   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx   */ -typedef struct -{ -  /** -   * Set this to `sizeof(DISPLAY_DEVICE)`. -   */ -  DWORD cb; -   -  /** -   * The name of the device. -   */ -  TCHAR DeviceName[32]; -   -  /** -   * The status of the device, can include `DISPLAY_DEVICE_ACTIVE`. -   */ -  DWORD StateFlags; -   +typedef struct { +	/** +	 * Set this to `sizeof(DISPLAY_DEVICE)` +	 */ +	DWORD cb; + +	/** +	 * The name of the device +	 */ +	TCHAR DeviceName[32]; + +	/** +	 * The status of the device, can include `DISPLAY_DEVICE_ACTIVE` +	 */ +	DWORD StateFlags; +  } DISPLAY_DEVICE;  /**   * Appearently we are incapable of putting asterisks at the - * end of types names, so istead we preprend them with 'P'. + * end of types names, so istead we preprend them with 'P'   *  - * @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx + * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx   */ -typedef DISPLAY_DEVICE* PDISPLAY_DEVICE; +typedef DISPLAY_DEVICE *PDISPLAY_DEVICE;  /** - * The monitor is "on". + * The monitor is "on"   *  - * @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx + * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx   */  #define DISPLAY_DEVICE_ACTIVE 1  /** - * Get a display device by its name or index. + * Get a display device by its name or index   *  - * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead. - * @param   iDevNum          The index of the device. - * @param   lpDisplayDevice  Output for the found device. - * @param   dwFlags          Flags, we will always use zero. - * @return                   Whether the call was successful. Zero is also returned if `iDevNum` - *                           is greater than the largest device index on the system. + * @param   lpDevice         The name of the device, use `NULL` to base the call on `iDevNum` instead + * @param   iDevNum          The index of the device + * @param   lpDisplayDevice  Output for the found device + * @param   dwFlags          Flags, we will always use zero + * @return                   Whether the call was successful; zero is also returned if `iDevNum` + *                           is greater than the largest device index on the system   * @see                      http://msdn.microsoft.com/en-us/library/windows/desktop/dd162609(v=vs.85).aspx   */ -BOOL EnumDisplayDevices(LPCTSTR restrict lpDevice, DWORD iDevNum, -			PDISPLAY_DEVICE restrict lpDisplayDevice, DWORD dwFlags); +BOOL EnumDisplayDevices(LPCTSTR restrict, DWORD, PDISPLAY_DEVICE restrict, DWORD) -#ifndef __GCC__ +#ifndef __GNUC__  # undef __attribute__  #endif  #endif - diff --git a/src/lib/gamma-dummy.c.gpp b/src/lib/gamma-dummy.c.gpp index ef0ae44..a9aa724 100644 --- a/src/lib/gamma-dummy.c.gpp +++ b/src/lib/gamma-dummy.c.gpp @@ -1,21 +1,5 @@  /* -*- c -*- */ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_DUMMY  # error Compiling gamma-dummy.c without HAVE_LIBGAMMA_METHOD_DUMMY  #endif @@ -36,277 +20,271 @@  /** - * Configuration set for the dummy adjustment method. + * Configuration set for the dummy adjustment method   */ -typedef struct libgamma_dummy_configurations -{ -  /** -   * The method's capabilities. -   *  -   * Some fields are ignored: -   * - real -   * - fake -   */ -  libgamma_method_capabilities_t capabilities; -   -  /** -   * Template for CRTC:s information. -   *  -   * Some fields are ignored: -   * - width_mm_edid -   * - width_mm_edid_error -   * - height_mm_edid -   * - height_mm_edid_error -   * - gamma_red -   * - gamma_green -   * - gamma_blue -   * - gamma_error -   */ -  libgamma_crtc_information_t crtc_info_template; -   -  /** -   * The adjustment method to use. -   */ -  int real_method; -   -  /** -   * The number of sites on the system. -   */ -  size_t site_count; -   -  /** -   * The number of paritions on a site before it has been configured. -   */ -  size_t default_partition_count; -   -  /** -   * The number of CRTC:s on a paritions before it has been configured. -   */ -  size_t default_crtc_count; -   -  /** -   * Whether the sites should be inherited from the real method. -   */ -  unsigned inherit_sites : 1; -   -  /** -   * Whether the partitions should be inherited from the real method. -   */ -  unsigned inherit_partition_count : 1; -   -  /** -   * Whether the CRTC:s should be inherited from the real method. -   */ -  unsigned inherit_crtc_count : 1; -   -  /** -   * When a site has been created, stall until the partition count has -   * been configured. -   */ -  unsigned stall_for_partition_count : 1; -   -  /** -   * When a parition has been created, stall until the CRTC count has -   * been configured. -   */ -  unsigned stall_for_crtc_count : 1; -   -  /** -   * Methods should stall until the system has been configured -   * unless $LIBGAMMA_DUMMY_STALL is not true. -   */ -  unsigned stalled_start : 1; -   -  /** -   * Whether to print what is going on in the phony system. -   */ -  unsigned verbose : 1; -   +typedef struct libgamma_dummy_configurations { +	/** +	 * The method's capabilities +	 *  +	 * Some fields are ignored: +	 * - real +	 * - fake +	 */ +	libgamma_method_capabilities_t capabilities; + +	/** +	 * Template for CRTC:s information +	 *  +	 * Some fields are ignored: +	 * - width_mm_edid +	 * - width_mm_edid_error +	 * - height_mm_edid +	 * - height_mm_edid_error +	 * - gamma_red +	 * - gamma_green +	 * - gamma_blue +	 * - gamma_error +	 */ +	libgamma_crtc_information_t crtc_info_template; + +	/** +	 * The adjustment method to use +	 */ +	int real_method; + +	/** +	 * The number of sites on the system +	 */ +	size_t site_count; + +	/** +	 * The number of paritions on a site before it has been configured +	 */ +	size_t default_partition_count; + +	/** +	 * The number of CRTC:s on a paritions before it has been configured +	 */ +	size_t default_crtc_count; + +	/** +	 * Whether the sites should be inherited from the real method +	 */ +	unsigned inherit_sites : 1; + +	/** +	 * Whether the partitions should be inherited from the real method +	 */ +	unsigned inherit_partition_count : 1; + +	/** +	 * Whether the CRTC:s should be inherited from the real method +	 */ +	unsigned inherit_crtc_count : 1; + +	/** +	 * When a site has been created, stall until the partition count has +	 * been configured +	 */ +	unsigned stall_for_partition_count : 1; + +	/** +	 * When a parition has been created, stall until the CRTC count has +	 * been configured +	 */ +	unsigned stall_for_crtc_count : 1; + +	/** +	 * Methods should stall until the system has been configured +	 * unless $LIBGAMMA_DUMMY_STALL is not true +	 */ +	unsigned stalled_start : 1; + +	/** +	 * Whether to print what is going on in the phony system +	 */ +	unsigned verbose : 1; +  } libgamma_dummy_configurations_t;  /** - * Dummy adjustment method internal data for a CRTC. + * Dummy adjustment method internal data for a CRTC   */ -typedef struct libgamma_dummy_crtc -{ -  /** -   * The gamma ramp for the red channel. -   */ -  void* restrict gamma_red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  void* restrict gamma_green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  void* restrict gamma_blue; -   -  /** -   * Information about the CRTC and monitor. -   *  -   * Some fields are ignored: -   * - width_mm_edid -   * - width_mm_edid_error -   * - height_mm_edid -   * - height_mm_edid_error -   * - gamma_red -   * - gamma_green -   * - gamma_blue -   * - gamma_error -   */ -  libgamma_crtc_information_t info; -   -  /** -   * Partition state that contains this information. -   */ -  libgamma_crtc_state_t* state; -   +typedef struct libgamma_dummy_crtc { +	/** +	 * The gamma ramp for the red channel +	 */ +	void *restrict gamma_red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	void *restrict gamma_green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	void *restrict gamma_blue; + +	/** +	 * Information about the CRTC and monitor +	 *  +	 * Some fields are ignored: +	 * - width_mm_edid +	 * - width_mm_edid_error +	 * - height_mm_edid +	 * - height_mm_edid_error +	 * - gamma_red +	 * - gamma_green +	 * - gamma_blue +	 * - gamma_error +	 */ +	libgamma_crtc_information_t info; + +	/** +	 * Partition state that contains this information +	 */ +	libgamma_crtc_state_t *state; +  } libgamma_dummy_crtc_t;  /** - * Dummy adjustment method internal data for a partition. + * Dummy adjustment method internal data for a partition   */ -typedef struct libgamma_dummy_partition -{ -  /** -   * The CRTC:s on the system. -   */ -  libgamma_dummy_crtc_t* crtcs; -   -  /** -   * The number of CRTC:s on the system. -   */ -  size_t crtc_count; -   -  /** -   * Partition state that contains this information. -   */ -  libgamma_partition_state_t* state; -   +typedef struct libgamma_dummy_partition { +	/** +	 * The CRTC:s on the system +	 */ +	libgamma_dummy_crtc_t *crtcs; + +	/** +	 * The number of CRTC:s on the system +	 */ +	size_t crtc_count; + +	/** +	 * Partition state that contains this information +	 */ +	libgamma_partition_state_t *state; +  } libgamma_dummy_partition_t;  /** - * Dummy adjustment method internal data for a site. + * Dummy adjustment method internal data for a site   */ -typedef struct libgamma_dummy_site -{ -  /** -   * The partitions on the system. -   */ -  libgamma_dummy_partition_t* partitions; -   -  /** -   * The number of partitions on the system. -   */ -  size_t partition_count; -   -  /** -   * Site state that contains this information. -   */ -  libgamma_site_state_t* state; -   +typedef struct libgamma_dummy_site { +	/** +	 * The partitions on the system +	 */ +	libgamma_dummy_partition_t *partitions; + +	/** +	 * The number of partitions on the system +	 */ +	size_t partition_count; + +	/** +	 * Site state that contains this information +	 */ +	libgamma_site_state_t *state; +  } libgamma_dummy_site_t;  /**   * Restore the gamma ramps for a CRTC to the system settings for that CRTC - * and ignore the method's capabilities. + * and ignore the method's capabilities   *    * @param   this  The CRTC data   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -static int libgamma_dummy_crtc_restore_forced(libgamma_dummy_crtc_t* restrict data); +static int libgamma_dummy_crtc_restore_forced(libgamma_dummy_crtc_t *restrict data);  /**   * Configurations for the dummy adjustment method.   */ -static libgamma_dummy_configurations_t libgamma_dummy_configurations = -  { -    .capabilities = -      { -	.crtc_information = (1 << LIBGAMMA_CRTC_INFO_COUNT) - 1, -	.default_site_known = 1, -	.multiple_sites = 1, -	.multiple_partitions = 1, -	.multiple_crtcs = 1, -	.partitions_are_graphics_cards = 1, -	.site_restore = 1, -	.partition_restore = 1, -	.crtc_restore = 1, -	.identical_gamma_sizes = 0, -	.fixed_gamma_size = 0, -	.fixed_gamma_depth = 0 -      }, -    .crtc_info_template = -      { -	.edid = NULL, -	.edid_length = 0, -	.edid_error = LIBGAMMA_EDID_NOT_FOUND, -	.width_mm = 400, -	.width_mm_error = 0, -	.height_mm = 300, -	.height_mm_error = 0, -	.red_gamma_size = 1024, -	.green_gamma_size = 2048, -	.blue_gamma_size = 512, -	.gamma_size_error = 0, -	.gamma_depth = 64, -	.gamma_depth_error = 0, -	.gamma_support = 1, -	.gamma_support_error = 0, -	.subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_RGB, -	.subpixel_order_error = 0, -	.active = 1, -	.active_error = 0, -	.connector_name = NULL, -	.connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED, -	.connector_type = LIBGAMMA_CONNECTOR_TYPE_Unknown, -	.connector_type_error = 0 -      }, -    .real_method = LIBGAMMA_METHOD_DUMMY, -    .site_count = 2, -    .default_partition_count = 2, -    .default_crtc_count = 2, -    .inherit_sites = 1, -    .inherit_partition_count = 1, -    .inherit_crtc_count = 1, -    .stall_for_partition_count = 0, -    .stall_for_crtc_count = 0, -    .stalled_start = 1, -    .verbose = 0 -  }; +static libgamma_dummy_configurations_t libgamma_dummy_configurations = { +	.capabilities = { +		.crtc_information = (1 << LIBGAMMA_CRTC_INFO_COUNT) - 1, +		.default_site_known = 1, +		.multiple_sites = 1, +		.multiple_partitions = 1, +		.multiple_crtcs = 1, +		.partitions_are_graphics_cards = 1, +		.site_restore = 1, +		.partition_restore = 1, +		.crtc_restore = 1, +		.identical_gamma_sizes = 0, +		.fixed_gamma_size = 0, +		.fixed_gamma_depth = 0 +	}, +	.crtc_info_template = { +		.edid = NULL, +		.edid_length = 0, +		.edid_error = LIBGAMMA_EDID_NOT_FOUND, +		.width_mm = 400, +		.width_mm_error = 0, +		.height_mm = 300, +		.height_mm_error = 0, +		.red_gamma_size = 1024, +		.green_gamma_size = 2048, +		.blue_gamma_size = 512, +		.gamma_size_error = 0, +		.gamma_depth = 64, +		.gamma_depth_error = 0, +		.gamma_support = 1, +		.gamma_support_error = 0, +		.subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_RGB, +		.subpixel_order_error = 0, +		.active = 1, +		.active_error = 0, +		.connector_name = NULL, +		.connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED, +		.connector_type = LIBGAMMA_CONNECTOR_TYPE_Unknown, +		.connector_type_error = 0 +	}, +	.real_method = LIBGAMMA_METHOD_DUMMY, +	.site_count = 2, +	.default_partition_count = 2, +	.default_crtc_count = 2, +	.inherit_sites = 1, +	.inherit_partition_count = 1, +	.inherit_crtc_count = 1, +	.stall_for_partition_count = 0, +	.stall_for_crtc_count = 0, +	.stalled_start = 1, +	.verbose = 0 +};  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_dummy_method_capabilities(libgamma_method_capabilities_t* restrict this) +void +libgamma_dummy_method_capabilities(libgamma_method_capabilities_t *restrict this)  { -  int real_method = libgamma_dummy_configurations.real_method; -  *this = libgamma_dummy_configurations.capabilities; -  this->real = real_method != LIBGAMMA_METHOD_DUMMY; -  this->fake = this->real; -  this->auto_restore = real_method == LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS; +	int real_method = libgamma_dummy_configurations.real_method; +	*this = libgamma_dummy_configurations.capabilities; +	this->real = real_method != LIBGAMMA_METHOD_DUMMY; +	this->fake = this->real; +	this->auto_restore = real_method == LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS;  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -314,712 +292,702 @@ void libgamma_dummy_method_capabilities(libgamma_method_capabilities_t* restrict   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_dummy_site_initialise(libgamma_site_state_t* restrict this, -				   char* restrict site) +int +libgamma_dummy_site_initialise(libgamma_site_state_t *restrict this, char *restrict site)  { -  libgamma_dummy_site_t* data = NULL; -  size_t i, sites, crtcs; -   -  sites = libgamma_dummy_configurations.site_count; -  if (libgamma_dummy_configurations.capabilities.multiple_sites == 0) -    sites = sites == 0 ? 0 : 1; -  this->data = NULL; -   -  if ((site != NULL) && (*site) && ((atoll(site) < 0) || (sites <= (unsigned long long)atoll(site)))) -    return LIBGAMMA_NO_SUCH_SITE; -   -  data = malloc(sizeof(libgamma_dummy_site_t)); -  if (data == NULL) -    goto fail; -   -  this->data = data; -  data->state = this; -   -  data->partition_count = libgamma_dummy_configurations.default_partition_count; -  if (libgamma_dummy_configurations.capabilities.multiple_partitions == 0) -    data->partition_count = data->partition_count == 0 ? 0 : 1; -   -  crtcs = libgamma_dummy_configurations.default_crtc_count; -  if (libgamma_dummy_configurations.capabilities.multiple_crtcs == 0) -    crtcs = crtcs == 0 ? 0 : 1; -   -  data->partitions = malloc(data->partition_count * sizeof(libgamma_dummy_partition_t)); -  if (data->partitions == NULL) -    goto fail; -   -  for (i = 0; i < data->partition_count; i++) -    data->partitions[i].crtc_count = crtcs; -   -  this->partitions_available = data->partition_count; -   -  return 0; -   - fail: -  free(data); -  this->data = NULL; -  return LIBGAMMA_ERRNO_SET; +	libgamma_dummy_site_t *data = NULL; +	size_t i, sites, crtcs; + +	sites = libgamma_dummy_configurations.site_count; +	if (!libgamma_dummy_configurations.capabilities.multiple_sites) +		sites = !!sites; +	this->data = NULL; + +	if (site && *site && (atoll(site) < 0 || sites <= (unsigned long long)atoll(site))) +		return LIBGAMMA_NO_SUCH_SITE; + +	data = malloc(sizeof(libgamma_dummy_site_t)); +	if (!data) +		goto fail; + +	this->data = data; +	data->state = this; + +	data->partition_count = libgamma_dummy_configurations.default_partition_count; +	if (!libgamma_dummy_configurations.capabilities.multiple_partitions) +		data->partition_count = !!data->partition_count; + +	crtcs = libgamma_dummy_configurations.default_crtc_count; +	if (!libgamma_dummy_configurations.capabilities.multiple_crtcs) +		crtcs = !!crtcs; + +	data->partitions = malloc(data->partition_count * sizeof(libgamma_dummy_partition_t)); +	if (!data->partitions) +		goto fail; + +	for (i = 0; i < data->partition_count; i++) +		data->partitions[i].crtc_count = crtcs; + +	this->partitions_available = data->partition_count; + +	return 0; + +fail: +	free(data); +	this->data = NULL; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_dummy_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_dummy_site_destroy(libgamma_site_state_t *restrict this)  { -  libgamma_dummy_site_t* data = this->data; -  if (data == NULL) -    return; -   -  free(data->partitions); -  free(data); +	libgamma_dummy_site_t *data = this->data; +	if (!data) +		return; + +	free(data->partitions); +	free(data);  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_dummy_site_restore(libgamma_site_state_t *restrict this)  { -  libgamma_dummy_site_t* data = this->data; -  size_t i, j; -   -  if (libgamma_dummy_configurations.capabilities.site_restore == 0) -    return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; -   -  for (j = 0; j < data->partition_count; j++) -    for (i = 0; i < data->partitions[j].crtc_count; i++) -      if (libgamma_dummy_crtc_restore_forced(data->partitions[j].crtcs + i) < 0) -	return -1; -   -  return 0; +	libgamma_dummy_site_t *data = this->data; +	size_t i, j; + +	if (!libgamma_dummy_configurations.capabilities.site_restore) { +		errno = ENOTSUP; +		return LIBGAMMA_ERRNO_SET; +	} + +	for (j = 0; j < data->partition_count; j++) +		for (i = 0; i < data->partitions[j].crtc_count; i++) +			if (libgamma_dummy_crtc_restore_forced(data->partitions[j].crtcs + i) < 0) +				return -1; + +	return 0;  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. + * @param   this       The partition state to initialise   * @param   site       The site state for the site that the partition belongs to - * @param   partition  The the index of the partition within the site. + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_dummy_partition_initialise(libgamma_partition_state_t* restrict this, -					libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_dummy_partition_initialise(libgamma_partition_state_t *restrict this, +                                    libgamma_site_state_t *restrict site, size_t partition)  { -  libgamma_crtc_information_t template = libgamma_dummy_configurations.crtc_info_template; -  libgamma_dummy_site_t* site_data = site->data; -  libgamma_dummy_partition_t* data = site_data->partitions + partition; -  libgamma_dummy_crtc_t* crtc_data; -  size_t i; -   -  this->data = NULL; -   -  if (partition >= site_data->partition_count) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -  this->data = data; -  data->state = this; -   -  data->crtcs = calloc(data->crtc_count, sizeof(libgamma_dummy_crtc_t)); -  if (data->crtcs == NULL) -    goto fail; -  for (i = 0; i < data->crtc_count; i++) -    { -      crtc_data = data->crtcs + i; -      crtc_data->info = template; -       -      /* Duplicate strings. */ -      if (crtc_data->info.edid != NULL) -	{ -	  crtc_data->info.edid = malloc(crtc_data->info.edid_length * sizeof(char)); -	  if (crtc_data->info.edid == NULL) -	    goto fail; -	  memcpy(crtc_data->info.edid, template.edid, crtc_data->info.edid_length * sizeof(char)); +	libgamma_crtc_information_t template = libgamma_dummy_configurations.crtc_info_template; +	libgamma_dummy_site_t *site_data = site->data; +	libgamma_dummy_partition_t *data = &site_data->partitions[partition]; +	libgamma_dummy_crtc_t *crtc_data; +	size_t i, n; + +	this->data = NULL; + +	if (partition >= site_data->partition_count) +		return LIBGAMMA_NO_SUCH_PARTITION; + +	this->data = data; +	data->state = this; + +	data->crtcs = calloc(data->crtc_count, sizeof(libgamma_dummy_crtc_t)); +	if (!data->crtcs) +		goto fail; +	for (i = 0; i < data->crtc_count; i++) { +		crtc_data = data->crtcs + i; +		crtc_data->info = template; + +		/* Duplicate strings */ +		if (crtc_data->info.edid) { +			crtc_data->info.edid = malloc(crtc_data->info.edid_length * sizeof(char)); +			if (!crtc_data->info.edid) +				goto fail; +			memcpy(crtc_data->info.edid, template.edid, crtc_data->info.edid_length * sizeof(char)); +		} +		if (crtc_data->info.connector_name) { +			n = strlen(crtc_data->info.connector_name); +			crtc_data->info.connector_name = malloc((n + 1) * sizeof(char)); +			if (crtc_data->info.connector_name == NULL) +				goto fail; +			memcpy(crtc_data->info.connector_name, template.connector_name, (n + 1) * sizeof(char)); +		}  	} -      if (crtc_data->info.connector_name != NULL) -	{ -	  size_t n = strlen(crtc_data->info.connector_name); -	  crtc_data->info.connector_name = malloc((n + 1) * sizeof(char)); -	  if (crtc_data->info.connector_name == NULL) -	    goto fail; -	  memcpy(crtc_data->info.connector_name, template.connector_name, (n + 1) * sizeof(char)); + +	this->crtcs_available = data->crtc_count; + +	return 0; + +fail: +	for (i = 0; i < data->crtc_count; i++) { +		free(data->crtcs[i].info.edid); +		free(data->crtcs[i].info.connector_name);  	} -    } -   -  this->crtcs_available = data->crtc_count; -   -  return 0; -   - fail: -  for (i = 0; i < data->crtc_count; i++) -    { -      free(data->crtcs[i].info.edid); -      free(data->crtcs[i].info.connector_name); -    } -  free(data->crtcs); -  data->crtcs = NULL; -  return LIBGAMMA_ERRNO_SET; +	free(data->crtcs); +	data->crtcs = NULL; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_dummy_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_dummy_partition_destroy(libgamma_partition_state_t *restrict this)  { -  libgamma_dummy_partition_t* data = this->data; -  size_t i; -   -  if (data == NULL) -    return; -   -  for (i = 0; i < data->crtc_count; i++) -    { -      free(data->crtcs[i].info.edid); -      free(data->crtcs[i].info.connector_name); -    } -  free(data->crtcs); -  data->crtcs = NULL; +	libgamma_dummy_partition_t *data = this->data; +	size_t i; + +	if (data) { +		for (i = 0; i < data->crtc_count; i++) { +			free(data->crtcs[i].info.edid); +			free(data->crtcs[i].info.connector_name); +		} +		free(data->crtcs); +		data->crtcs = NULL; +	}  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_dummy_partition_restore(libgamma_partition_state_t *restrict this)  { -  libgamma_dummy_partition_t* data = this->data; -  size_t i; -   -  if (libgamma_dummy_configurations.capabilities.partition_restore == 0) -    return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; -   -  for (i = 0; i < data->crtc_count; i++) -    if (libgamma_dummy_crtc_restore_forced(data->crtcs + i) < 0) -      return -1; -   -  return 0; +	libgamma_dummy_partition_t *data = this->data; +	size_t i; + +	if (!libgamma_dummy_configurations.capabilities.partition_restore) { +		errno = ENOTSUP; +		return LIBGAMMA_ERRNO_SET; +	} + +	for (i = 0; i < data->crtc_count; i++) +		if (libgamma_dummy_crtc_restore_forced(data->crtcs + i) < 0) +			return -1; + +	return 0;  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_dummy_crtc_initialise(libgamma_crtc_state_t* restrict this, -				   libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_dummy_crtc_initialise(libgamma_crtc_state_t *restrict this, +                               libgamma_partition_state_t *restrict partition, size_t crtc)  { -  libgamma_dummy_partition_t* partition_data = partition->data; -  libgamma_dummy_crtc_t* data = partition_data->crtcs + crtc; -  size_t stop_size; -   -  this->data = NULL; -   -  if (crtc >= partition_data->crtc_count) -    return LIBGAMMA_NO_SUCH_CRTC; -   -  this->data = data; -  data->state = this; -   -  if (data->info.gamma_depth == -1) -    stop_size = sizeof(float); -  else if (data->info.gamma_depth == -2) -    stop_size = sizeof(double); -  else -    stop_size = (size_t)(data->info.gamma_depth) / 8; -   -  if ((data->gamma_red   = malloc(data->info.red_gamma_size   * stop_size)) == NULL) -    goto fail; -  if ((data->gamma_green = malloc(data->info.green_gamma_size * stop_size)) == NULL) -    goto fail; -  if ((data->gamma_blue  = malloc(data->info.blue_gamma_size  * stop_size)) == NULL) -    goto fail; -   -  return libgamma_dummy_crtc_restore_forced(data); -   - fail: -  free(data->gamma_red),   data->gamma_red   = NULL; -  free(data->gamma_green), data->gamma_green = NULL; -  free(data->gamma_blue),  data->gamma_blue  = NULL; -  return LIBGAMMA_ERRNO_SET; +	libgamma_dummy_partition_t *partition_data = partition->data; +	libgamma_dummy_crtc_t *data = &partition_data->crtcs[crtc]; +	size_t stop_size; + +	this->data = NULL; + +	if (crtc >= partition_data->crtc_count) +		return LIBGAMMA_NO_SUCH_CRTC; + +	this->data = data; +	data->state = this; + +	if (data->info.gamma_depth == -1) +		stop_size = sizeof(float); +	else if (data->info.gamma_depth == -2) +		stop_size = sizeof(double); +	else +		stop_size = (size_t)data->info.gamma_depth / 8; + +	data->gamma_red = malloc(data->info.red_gamma_size * stop_size); +	if (!data->gamma_red) +		goto fail; +	data->gamma_green = malloc(data->info.green_gamma_size * stop_size); +	if (!data->gamma_green) +		goto fail; +	data->gamma_blue = malloc(data->info.blue_gamma_size * stop_size); +	if (!data->gamma_blue) +		goto fail; + +	return libgamma_dummy_crtc_restore_forced(data); + +fail: +	free(data->gamma_red),   data->gamma_red   = NULL; +	free(data->gamma_green), data->gamma_green = NULL; +	free(data->gamma_blue),  data->gamma_blue  = NULL; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_dummy_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_dummy_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  libgamma_dummy_crtc_t* data = this->data; -  if (data == NULL) -    return; -   -  free(data->gamma_red),   data->gamma_red   = NULL; -  free(data->gamma_green), data->gamma_green = NULL; -  free(data->gamma_blue),  data->gamma_blue  = NULL; +	libgamma_dummy_crtc_t *data = this->data; +	if (data) { +		free(data->gamma_red),   data->gamma_red   = NULL; +		free(data->gamma_green), data->gamma_green = NULL; +		free(data->gamma_blue),  data->gamma_blue  = NULL; +	}  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_dummy_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  if (libgamma_dummy_configurations.capabilities.crtc_restore == 0) -    return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; -   -  return libgamma_dummy_crtc_restore_forced(this->data); +	if (!libgamma_dummy_configurations.capabilities.crtc_restore) { +		errno = ENOTSUP; +		return LIBGAMMA_ERRNO_SET; +	} +	return libgamma_dummy_crtc_restore_forced(this->data);  }  /**   * Restore the gamma ramps for a CRTC to the system settings for that CRTC - * and ignore the method's capabilities. + * and ignore the method's capabilities   *    * @param   this  The CRTC data   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -static int libgamma_dummy_crtc_restore_forced(libgamma_dummy_crtc_t* restrict data) +static int +libgamma_dummy_crtc_restore_forced(libgamma_dummy_crtc_t *restrict data)  { -  size_t rn = data->info.red_gamma_size; -  size_t gn = data->info.green_gamma_size; -  size_t bn = data->info.blue_gamma_size; -  size_t i; -  if (data->gamma_red == NULL) -    return 0; -   -#define __reset_ramps(BITS)							\ -  int ## BITS ## _t* red   = data->gamma_red;					\ -  int ## BITS ## _t* green = data->gamma_green;					\ -  int ## BITS ## _t* blue  = data->gamma_blue;					\ -  double max = (double)INT ## BITS ## _MAX;					\ -  for (i = 0; i < rn; i++)							\ -    red[i]   = (int ## BITS ## _t)(max * ((double)i / (double)(rn - 1)));	\ -  for (i = 0; i < gn; i++)							\ -    green[i] = (int ## BITS ## _t)(max * ((double)i / (double)(gn - 1)));	\ -  for (i = 0; i < bn; i++)							\ -    blue[i]  = (int ## BITS ## _t)(max * ((double)i / (double)(bn - 1))) -   -  if      (data->info.gamma_depth ==  8)  { __reset_ramps(8);  } -  else if (data->info.gamma_depth == 16)  { __reset_ramps(16); } -  else if (data->info.gamma_depth == 32)  { __reset_ramps(32); } -  else if (data->info.gamma_depth == 64)  { __reset_ramps(64); } -  else if (data->info.gamma_depth == -1) -    { -      float* red   = data->gamma_red; -      float* green = data->gamma_green; -      float* blue  = data->gamma_blue; -      for (i = 0; i < rn; i++) -	red[i]   = (float)((double)i / (double)(rn - 1)); -      for (i = 0; i < gn; i++) -	green[i] = (float)((double)i / (double)(gn - 1)); -      for (i = 0; i < bn; i++) -	blue[i]  = (float)((double)i / (double)(bn - 1)); -    } -  else -    { -      double* red   = data->gamma_red; -      double* green = data->gamma_green; -      double* blue  = data->gamma_blue; -      for (i = 0; i < rn; i++) -	red[i]   = (double)i / (double)(rn - 1); -      for (i = 0; i < gn; i++) -	green[i] = (double)i / (double)(gn - 1); -      for (i = 0; i < bn; i++) -	blue[i]  = (double)i / (double)(bn - 1); -    } -   +	size_t rn = data->info.  red_gamma_size; +	size_t gn = data->info.green_gamma_size; +	size_t bn = data->info. blue_gamma_size; +	size_t i; + +	if (!data->gamma_red) +		return 0; + +#define __reset_ramps(TYPE, MAX)\ +	do {\ +		TYPE *red   = data->gamma_red;\ +		TYPE *green = data->gamma_green;\ +		TYPE *blue  = data->gamma_blue;\ +		for (i = 0; i < rn; i++) red  [i] = (TYPE)((double)(MAX) * ((double)i / (double)(rn - 1)));\ +		for (i = 0; i < gn; i++) green[i] = (TYPE)((double)(MAX) * ((double)i / (double)(gn - 1)));\ +		for (i = 0; i < bn; i++) blue [i] = (TYPE)((double)(MAX) * ((double)i / (double)(bn - 1)));\ +	} while (0) + +	if      (data->info.gamma_depth ==  8) __reset_ramps(uint8_t,  INT8_MAX); +	else if (data->info.gamma_depth == 16) __reset_ramps(uint16_t, INT16_MAX); +	else if (data->info.gamma_depth == 32) __reset_ramps(uint32_t, INT32_MAX); +	else if (data->info.gamma_depth == 64) __reset_ramps(uint64_t, INT64_MAX); +	else if (data->info.gamma_depth == -1) __reset_ramps(float,    1); +	else                                   __reset_ramps(double,   1); +  #undef __reset_ramps -   -  return 0; + +	return 0;  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error. On error refer to the error reports in `this`   */ -int libgamma_dummy_get_crtc_information(libgamma_crtc_information_t* restrict this, -					libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_dummy_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                    libgamma_crtc_state_t *restrict crtc, int32_t fields)  { -  libgamma_dummy_crtc_t* restrict data = crtc->data; -  int supported = libgamma_dummy_configurations.capabilities.crtc_information; -  int e = 0; -   -  /* Copy over information. */ -  *this = data->info; -   -  /* Duplicate strings. */ -  if (this->edid != NULL) -    { -      this->edid = malloc(this->edid_length * sizeof(char)); -      if (this->edid == NULL) -	this->edid_error = errno; -      memcpy(this->edid, data->info.edid, this->edid_length * sizeof(char)); -    } -  if (this->connector_name != NULL) -    { -      size_t n = strlen(this->connector_name); -      this->connector_name = malloc((n + 1) * sizeof(char)); -      if (this->connector_name == NULL) -	this->connector_name_error = errno; -      memcpy(this->connector_name, data->info.connector_name, (n + 1) * sizeof(char)); -    } -   -  /* Parse EDID. */ -  if (this->edid_error) -    this->width_mm_edid_error = this->height_mm_edid_error = this->gamma_error = this->edid_error; -  else if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID))) -    e |= libgamma_parse_edid(this, fields); -   -  /* Test errors. */ -#define _E(FIELD, VAR)  \ -  ((fields & FIELD) ? ((supported & FIELD) ? VAR : (VAR = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED)) : 0) -  e |= _E(LIBGAMMA_CRTC_INFO_EDID,           this->edid_error); -  e |= _E(LIBGAMMA_CRTC_INFO_WIDTH_MM,       this->width_mm_error); -  e |= _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM,      this->height_mm_error); -  e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_SIZE,     this->gamma_size_error); -  e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_DEPTH,    this->gamma_depth_error); -  e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT,  this->gamma_support_error); -  e |= _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER, this->subpixel_order_error); -  e |= _E(LIBGAMMA_CRTC_INFO_ACTIVE,         this->active_error); -  e |= _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME, this->connector_name_error); -  e |= _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE, this->connector_type_error); -   -  if ((fields & LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID) && !(supported & LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID)) -    e |= this->width_mm_edid_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED; -  if ((fields & LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID) && !(supported & LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID)) -    e |= this->height_mm_edid_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED; -  if ((fields & LIBGAMMA_CRTC_INFO_GAMMA) && !(supported & LIBGAMMA_CRTC_INFO_GAMMA)) -    e |= this->gamma_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED; +	libgamma_dummy_crtc_t *restrict data = crtc->data; +	int supported = libgamma_dummy_configurations.capabilities.crtc_information; +	int e = 0; +	size_t n; + +	/* Copy over information */ +	*this = data->info; + +	/* Duplicate strings */ +	if (this->edid) { +		this->edid = malloc(this->edid_length * sizeof(char)); +		if (!this->edid) +			this->edid_error = errno; +		memcpy(this->edid, data->info.edid, this->edid_length * sizeof(char)); +	} +	if (this->connector_name) { +		n = strlen(this->connector_name); +		this->connector_name = malloc((n + 1) * sizeof(char)); +		if (!this->connector_name) +			this->connector_name_error = errno; +		memcpy(this->connector_name, data->info.connector_name, (n + 1) * sizeof(char)); +	} + +	/* Parse EDID */ +	if (this->edid_error) +		this->width_mm_edid_error = this->height_mm_edid_error = this->gamma_error = this->edid_error; +	else if (fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID)) +		e |= libgamma_parse_edid(this, fields); + +	/* Test errors */ +#define _E(FIELD, VAR)\ +	((fields & FIELD) ? ((supported & FIELD) ? VAR : (VAR = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED)) : 0) +	e |= _E(LIBGAMMA_CRTC_INFO_EDID,           this->edid_error); +	e |= _E(LIBGAMMA_CRTC_INFO_WIDTH_MM,       this->width_mm_error); +	e |= _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM,      this->height_mm_error); +	e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_SIZE,     this->gamma_size_error); +	e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_DEPTH,    this->gamma_depth_error); +	e |= _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT,  this->gamma_support_error); +	e |= _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER, this->subpixel_order_error); +	e |= _E(LIBGAMMA_CRTC_INFO_ACTIVE,         this->active_error); +	e |= _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME, this->connector_name_error); +	e |= _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE, this->connector_type_error); + +	if ((fields & LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID) && !(supported & LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID)) +		e |= this->width_mm_edid_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED; +	if ((fields & LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID) && !(supported & LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID)) +		e |= this->height_mm_edid_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED; +	if ((fields & LIBGAMMA_CRTC_INFO_GAMMA) && !(supported & LIBGAMMA_CRTC_INFO_GAMMA)) +		e |= this->gamma_error = LIBGAMMA_CRTC_INFO_NOT_SUPPORTED;  #undef _E -   -  return e ? -1 : 0; + +	return e ? -1 : 0;  }  /** - * Get the current gamma ramps for a CRTC. + * Get the current gamma ramps for a CRTC   *  - * @param   1      The data type for the ramp stop elements. + * @param   1      The data type for the ramp stop elements   * @param   2      The `ramp*` pattern for the ramp structure and function to call.   * @param   3      Either of `bit8`, `bit16`, `bit32`, `bit64`, `float_single`, `float_double`; - *                 rather self-explanatory. + *                 rather self-explanatory   * @param   4      The number of bits in the gamma depth, -1 for single precision float, - *                 (`float`) and -2 for double percition float (`double`). - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + *                 (`float`) and -2 for double percition float (`double`) + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps ()  $>{ -int libgamma_dummy_crtc_get_gamma_${2}(libgamma_crtc_state_t* restrict this, -				       libgamma_gamma_${2}_t* restrict ramps) +int +libgamma_dummy_crtc_get_gamma_${2}(libgamma_crtc_state_t *restrict this, libgamma_gamma_${2}_t *restrict ramps)  { -  libgamma_dummy_crtc_t* data = this->data; -  libgamma_gamma_ramps_any_t ramps_; -  ${1}* r_ramp = data->gamma_red; -  ${1}* g_ramp = data->gamma_green; -  ${1}* b_ramp = data->gamma_blue; -  size_t rn = data->info.red_gamma_size; -  size_t gn = data->info.green_gamma_size; -  size_t bn = data->info.blue_gamma_size; -  size_t i; -   +	libgamma_dummy_crtc_t *data = this->data; +	libgamma_gamma_ramps_any_t ramps_; +	${1}* r_ramp = data->gamma_red; +	${1}* g_ramp = data->gamma_green; +	${1}* b_ramp = data->gamma_blue; +	size_t rn = data->info.red_gamma_size; +	size_t gn = data->info.green_gamma_size; +	size_t bn = data->info.blue_gamma_size; +	size_t i; +  #ifdef DEBUG -  /* Check gamma ramp sizes. */ -  if (libgamma_dummy_configurations.capabilities.identical_gamma_sizes) -    if ((ramps->red_size != ramps->green_size) || -	(ramps->red_size != ramps->blue_size)) -      return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; -  if ((ramps->red_size   != rn) || -      (ramps->green_size != gn) || -      (ramps->blue_size  != bn)) -    return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE; +	/* Check gamma ramp sizes */ +	if (libgamma_dummy_configurations.capabilities.identical_gamma_sizes) +		if (ramps->red_size != ramps->green_size || ramps->red_size != ramps->blue_size) +			return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	if (ramps->red_size != rn || ramps->green_size != gn || ramps->blue_size != bn) +		return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE;  #endif -   -  if (data->info.gamma_support == 0) -    return LIBGAMMA_GAMMA_RAMP_READ_FAILED; -   -#define __trans(DEPTH, SUFFIX)			\ -  if (data->info.gamma_depth == DEPTH)		\ -    return ramps_.${3} = *ramps,		\ -           libgamma_translated_ramp_get(this, &ramps_, ${4}, DEPTH, libgamma_crtc_get_gamma_ramps ## SUFFIX) + +	if (!data->info.gamma_support) +		return LIBGAMMA_GAMMA_RAMP_READ_FAILED; + +#define __trans(DEPTH, SUFFIX)\ +	do {\ +		if (data->info.gamma_depth == DEPTH) {\ +			ramps_.${3} = *ramps;\ +			return libgamma_translated_ramp_get(this, &ramps_, ${4}, DEPTH, libgamma_crtc_get_gamma_ramps ## SUFFIX);\ +		}\ +	} while (0) +  $>if [ ! ${4} = 8 ]; then -  __trans(8, 8); +	__trans(8, 8);  $>fi  $>if [ ! ${4} = 16 ]; then -  __trans(16, 16); +	__trans(16, 16);  $>fi  $>if [ ! ${4} = 32 ]; then -  __trans(32, 32); +	__trans(32, 32);  $>fi  $>if [ ! ${4} = 64 ]; then -  __trans(64, 64); +	__trans(64, 64);  $>fi  $>if [ ! ${4} = -1 ]; then -  __trans(-1, f); +	__trans(-1, f);  $>fi  $>if [ ! ${4} = -2 ]; then -  __trans(-2, d); +	__trans(-2, d);  $>fi +  #undef __trans -   -  for (i = 0; i < rn; i++)  ramps->red[i]   = r_ramp[i]; -  for (i = 0; i < gn; i++)  ramps->green[i] = g_ramp[i]; -  for (i = 0; i < bn; i++)  ramps->blue[i]  = b_ramp[i]; -   -  return 0; + +	for (i = 0; i < rn; i++) ramps->red[i]   = r_ramp[i]; +	for (i = 0; i < gn; i++) ramps->green[i] = g_ramp[i]; +	for (i = 0; i < bn; i++) ramps->blue[i]  = b_ramp[i]; + +	return 0;  }  $>}  /** - * Set the gamma ramps for a CRTC. + * Set the gamma ramps for a CRTC   *  - * @param   1      The data type for the ramp stop elements. + * @param   1      The data type for the ramp stop elements   * @param   2      The `ramp*` pattern for the ramp structure and function to call.   * @param   3      Either of `bit8`, `bit16`, `bit32`, `bit64`, `float_single`, `float_double`; - *                 rather self-explanatory. + *                 rather self-explanatory   * @param   4      The number of bits in the gamma depth, -1 for single precision float, - *                 (`float`) and -2 for double percition float (`double`). - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + *                 (`float`) and -2 for double percition float (`double`) + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps ()  $>{ -int libgamma_dummy_crtc_set_gamma_${2}(libgamma_crtc_state_t* restrict this, -				       libgamma_gamma_${2}_t ramps) +int +libgamma_dummy_crtc_set_gamma_${2}(libgamma_crtc_state_t *restrict this, libgamma_gamma_${2}_t ramps)  { -  libgamma_dummy_crtc_t* data = this->data; -  libgamma_gamma_ramps_any_t ramps_; -  ${1}* r_ramp = data->gamma_red; -  ${1}* g_ramp = data->gamma_green; -  ${1}* b_ramp = data->gamma_blue; -  size_t rn = data->info.red_gamma_size; -  size_t gn = data->info.green_gamma_size; -  size_t bn = data->info.blue_gamma_size; -  size_t i; -   +	libgamma_dummy_crtc_t *data = this->data; +	libgamma_gamma_ramps_any_t ramps_; +	${1} *r_ramp = data->gamma_red; +	${1} *g_ramp = data->gamma_green; +	${1} *b_ramp = data->gamma_blue; +	size_t rn = data->info.red_gamma_size; +	size_t gn = data->info.green_gamma_size; +	size_t bn = data->info.blue_gamma_size; +	size_t i; +  #ifdef DEBUG -  /* Check gamma ramp sizes. */ -  if (libgamma_dummy_configurations.capabilities.identical_gamma_sizes) -    if ((ramps.red_size != ramps.green_size) || -	(ramps.red_size != ramps.blue_size)) -      return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; -  if ((ramps.red_size   != rn) || -      (ramps.green_size != gn) || -      (ramps.blue_size  != bn)) -    return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE; +	/* Check gamma ramp sizes */ +	if (libgamma_dummy_configurations.capabilities.identical_gamma_sizes) +		if (ramps.red_size != ramps.green_size || ramps.red_size != ramps.blue_size) +			return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	if (ramps.red_size != rn || ramps.green_size != gn || ramps.blue_size != bn) +		return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE;  #endif -   -  if (data->info.gamma_support == 0) -    return LIBGAMMA_GAMMA_RAMP_READ_FAILED; -   -#define __trans(DEPTH, SUFFIX)			\ -  if (data->info.gamma_depth == DEPTH)		\ -    return ramps_.${3} = ramps,			\ -           libgamma_translated_ramp_set(this, ramps_, ${4}, DEPTH, libgamma_crtc_set_gamma_ramps ## SUFFIX) + +	if (!data->info.gamma_support) +		return LIBGAMMA_GAMMA_RAMP_READ_FAILED; + +#define __trans(DEPTH, SUFFIX)\ +	do {\ +		if (data->info.gamma_depth == DEPTH) {\ +			ramps_.${3} = ramps;\ +			return libgamma_translated_ramp_set(this, ramps_, ${4}, DEPTH, libgamma_crtc_set_gamma_ramps ## SUFFIX);\ +		}\ +	} while (0) +  $>if [ ! ${4} = 8 ]; then -  __trans(8, 8); +	__trans(8, 8);  $>fi  $>if [ ! ${4} = 16 ]; then -  __trans(16, 16); +	__trans(16, 16);  $>fi  $>if [ ! ${4} = 32 ]; then -  __trans(32, 32); +	__trans(32, 32);  $>fi  $>if [ ! ${4} = 64 ]; then -  __trans(64, 64); +	__trans(64, 64);  $>fi  $>if [ ! ${4} = -1 ]; then -  __trans(-1, f); +	__trans(-1, f);  $>fi  $>if [ ! ${4} = -2 ]; then -  __trans(-2, d); +	__trans(-2, d);  $>fi +  #undef __trans -   -  for (i = 0; i < rn; i++)  r_ramp[i] = ramps.red[i]; -  for (i = 0; i < gn; i++)  g_ramp[i] = ramps.green[i]; -  for (i = 0; i < bn; i++)  b_ramp[i] = ramps.blue[i]; -   -  return 0; + +	for (i = 0; i < rn; i++) r_ramp[i] = ramps.red[i]; +	for (i = 0; i < gn; i++) g_ramp[i] = ramps.green[i]; +	for (i = 0; i < bn; i++) b_ramp[i] = ramps.blue[i]; + +	return 0;  }  $>}  /** - * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps uint8_t ramps8 bits8 8  /** - * Set the gamma ramps for a CRTC, 8-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps uint8_t ramps8 bits8 8  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps uint16_t ramps16 bits16 16  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps uint16_t ramps16 bits16 16  /** - * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps uint32_t ramps32 bits32 32  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps uint32_t ramps32 bits32 32  /** - * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps uint64_t ramps64 bits64 64  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps uint64_t ramps64 bits64 64  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps float rampsf float_single -1  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps float rampsf float_single -1  /** - * Get the current gamma ramps for a CRTC, `double` version. + * Get the current gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_get_gamma_ramps double rampsd float_double -2  /** - * Set the gamma ramps for a CRTC, `double` version. + * Set the gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>libgamma_dummy_crtc_set_gamma_ramps double rampsd float_double -2 - diff --git a/src/lib/gamma-dummy.h b/src/lib/gamma-dummy.h index c7d8e12..a52b087 100644 --- a/src/lib/gamma-dummy.h +++ b/src/lib/gamma-dummy.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_DUMMY_H  #define LIBGAMMA_GAMMA_DUMMY_H @@ -27,250 +11,233 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_dummy_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_dummy_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. - * @param   site    The site identifier, unless it is `NULL` it must a - *                  `free`:able. Once the state is destroyed the library - *                  will attempt to free it. There you should not free - *                  it yourself, and it must not be a string constant - *                  or allocate on the stack. Note however that it will - *                  not be free:d if this function fails. - * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + * @param   this  The site state to initialise + * @param   site  The site identifier, unless it is `NULL` it must a + *                `free`:able. Once the state is destroyed the library + *                will attempt to free it. There you should not free + *                it yourself, and it must not be a string constant + *                or allocate on the stack. Note however that it will + *                not be free:d if this function fails. + * @return        Zero on success, otherwise (negative) the value of an + *                error identifier provided by this library   */ -int libgamma_dummy_site_initialise(libgamma_site_state_t* restrict this, -				   char* restrict site); +int libgamma_dummy_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_dummy_site_destroy(libgamma_site_state_t* restrict this); +void libgamma_dummy_site_destroy(libgamma_site_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_site_restore(libgamma_site_state_t* restrict this); +int libgamma_dummy_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to   * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_dummy_partition_initialise(libgamma_partition_state_t* restrict this, -					libgamma_site_state_t* restrict site, size_t partition); +int libgamma_dummy_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_dummy_partition_destroy(libgamma_partition_state_t* restrict this); +void libgamma_dummy_partition_destroy(libgamma_partition_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_dummy_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_dummy_crtc_initialise(libgamma_crtc_state_t* restrict this, -				   libgamma_partition_state_t* restrict partition, size_t crtc); +int libgamma_dummy_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_dummy_crtc_destroy(libgamma_crtc_state_t* restrict this); +void libgamma_dummy_crtc_destroy(libgamma_crtc_state_t *restrict);  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_dummy_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_dummy_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_dummy_get_crtc_information(libgamma_crtc_information_t* restrict this, -					libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_dummy_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_ramps8(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_ramps8_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_ramps8(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps8_t *restrict);  /** - * Set the gamma ramps for a CRTC, 8-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_ramps8(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_ramps8_t ramps); +int libgamma_dummy_crtc_set_gamma_ramps8(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps8_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps16_t ramps); +int libgamma_dummy_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t);  /** - * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_ramps32(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps32_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_ramps32(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps32_t *restrict);  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_ramps32(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps32_t ramps); +int libgamma_dummy_crtc_set_gamma_ramps32(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps32_t);  /** - * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_ramps64(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps64_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_ramps64(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps64_t *restrict);  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_ramps64(libgamma_crtc_state_t* restrict this, -					  libgamma_gamma_ramps64_t ramps); +int libgamma_dummy_crtc_set_gamma_ramps64(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps64_t);  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_rampsf_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t *restrict);  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_rampsf_t ramps); +int libgamma_dummy_crtc_set_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t);  /** - * Get the current gamma ramps for a CRTC, `double` version. + * Get the current gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_get_gamma_rampsd(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_rampsd_t* restrict ramps); +int libgamma_dummy_crtc_get_gamma_rampsd(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsd_t *restrict);  /** - * Set the gamma ramps for a CRTC, `double` version. + * Set the gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_dummy_crtc_set_gamma_rampsd(libgamma_crtc_state_t* restrict this, -					 libgamma_gamma_rampsd_t ramps); +int libgamma_dummy_crtc_set_gamma_rampsd(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsd_t);  #endif - diff --git a/src/lib/gamma-helper.c b/src/lib/gamma-helper.c index 3aafbb3..f67e107 100644 --- a/src/lib/gamma-helper.c +++ b/src/lib/gamma-helper.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #include "gamma-helper.h"  #include "libgamma-method.h" @@ -26,85 +10,86 @@  /** - * Just an arbitrary version. + * Just an arbitrary version   */ -#define ANY  bits64 +#define ANY bits64  /** - * Concatenation of all ramps. + * Concatenation of all ramps   */  #define ALL red  /**   * Preform installation in an `for (i = 0; i < n; i++)` - * loop and do a `break` afterwords. + * loop and do a `break` afterwords   */ -#define __translate(instruction)  for (i = 0; i < n; i++)  instruction;  break +#define __translate(instruction)  for (i = 0; i < n; i++) instruction;  break  /**   * Convert a [0, 1] `float` to a full range `uint64_t`   * and mark sure rounding errors does not cause the - * value be 0 instead of ~0 and vice versa. + * value be 0 instead of ~0 and vice versa   *  - * @param   value  To `float` to convert. - * @return         The value as an `uint64_t`. + * @param   value  To `float` to convert + * @return         The value as an `uint64_t`   */ -static inline uint64_t float_to_64(float value) +static inline uint64_t +float_to_64(float value)  { -  /* XXX Which is faster? */ +	/* TODO Which is faster? */  #if defined(HAVE_INT128) && __WORDSIZE == 64 -  /* `__int128` is a GNU C extension, which -     (because it is not ISO C) emits a warning -     under -pedantic. */ +	/* `__int128` is a GNU C extension, which +	   (because it is not ISO C) emits a warning +	   under -pedantic */  # pragma GCC diagnostic push  # pragma GCC diagnostic ignored "-Wpedantic" -   -  /* In GCC we can use `__int128`, this is -     a signed 128-bit integer. It fits all -     uint64_t values but also native values, -     which is a nice because it eleminates -     some overflow condition tests. It is -     also more readable. */ -   -  /* Convert to integer. */ -  __int128 product = (__int128)(value * (float)UINT64_MAX); -  /* Negative overflow. */ -  if (product > UINT64_MAX) -    return UINT64_MAX; -  /* Positive overflow. */ -  if (product < 0) -    return 0; -  /* Did not overflow. */ -  return (uint64_t)product; -   + +	/* In GCC we can use `__int128`, this is +	   a signed 128-bit integer. It fits all +	   uint64_t values but also native values, +	   which is a nice because it eleminates +	   some overflow condition tests. It is +	   also more readable. */ + +	/* Convert to integer */ +	__int128 product = (__int128)(value * (float)UINT64_MAX); +	/* Negative overflow */ +	if (product > UINT64_MAX) +		return UINT64_MAX; +	/* Positive overflow */ +	if (product < 0) +		return 0; +	/* Did not overflow */ +	return (uint64_t)product; +  # pragma GCC diagnostic pop  #else + +	/* If we are not using GCC we cannot be +	   sure that we have `__int128` so we have +	   to use `uint64_t` and perform overflow +	   checkes based on the input value */ -  /* If we are not using GCC we cannot be -     sure that we have `__int128` so we have -     to use `uint64_t` and perform overflow -     checkes based on the input value. */ -   -  /* Convert to integer. */ -  uint64_t product = (uint64_t)(value * (float)UINT64_MAX); -  /* Negative overflow, -     if the input is less than 0,5 but -     the output is greater then we got -     -1 when we should have gotten 0. */ -  if ((value < 0.1f) && (product > 0xF000000000000000ULL)) -    return 0; -  /* Positive overflow, -     if the input is greater than 0,5 -     but the output is less then we got -     0 when we should have gotten ~0. */ -  else if ((value > 0.9f) && (product < 0x1000000000000000ULL)) -    return (uint64_t)~0; -  /* Did not overflow. */ -  return product; -   +	/* Convert to integer. */ +	uint64_t product = (uint64_t)(value * (float)UINT64_MAX); +	/* Negative overflow, +	   if the input is less than 0.5 but +	   the output is greater then we got +	   -1 when we should have gotten 0 */ +	if (value < 0.1f && product > 0xF000000000000000ULL) +		return 0; +	/* Positive overflow, +	   if the input is greater than 0.5 +	   but the output is less then we got +	   0 when we should have gotten ~0 */ +	else if (value > 0.9f && product < 0x1000000000000000ULL) +		return (uint64_t)~0; +	/* Did not overflow */ +	return product; +  #endif  } @@ -112,272 +97,276 @@ static inline uint64_t float_to_64(float value)  /**   * Convert a [0, 1] `double` to a full range `uint64_t`   * and mark sure rounding errors does not cause the - * value be 0 instead of ~0 and vice versa. + * value be 0 instead of ~0 and vice versa   *  - * @param   value  To `double` to convert. - * @return         The value as an `uint64_t`. + * @param   value  To `double` to convert + * @return         The value as an `uint64_t`   */ -static inline uint64_t double_to_64(double value) +static inline uint64_t +double_to_64(double value)  { -  /* XXX Which is faster? */ -   +	/* XXX Which is faster? */ +  #if defined(HAVE_INT128) && __WORDSIZE == 64 -  /* `__int128` is a GNU C extension, which -     (because it is not ISO C) emits a warning -     under -pedantic. */ +	/* `__int128` is a GNU C extension, which +	   (because it is not ISO C) emits a warning +	   under -pedantic */  # pragma GCC diagnostic push  # pragma GCC diagnostic ignored "-Wpedantic" -   -  /* In GCC we can use `__int128`, this is -     a signed 128-bit integer. It fits all -     uint64_t values but also native values, -     which is a nice because it eleminates -     some overflow condition tests. It is -     also more readable. */ -   -  /* Convert to integer. */ -  __int128 product = (__int128)(value * (double)UINT64_MAX); -  /* Negative overflow. */ -  if (product > UINT64_MAX) -    return UINT64_MAX; -  /* Positive overflow. */ -  if (product < 0) -    return 0; -  /* Did not overflow. */ -  return (uint64_t)product; -   + +	/* In GCC we can use `__int128`, this is +	   a signed 128-bit integer. It fits all +	   uint64_t values but also native values, +	   which is a nice because it eleminates +	   some overflow condition tests. It is +	   also more readable. */ + +	/* Convert to integer */ +	__int128 product = (__int128)(value * (double)UINT64_MAX); +	/* Negative overflow */ +	if (product > UINT64_MAX) +		return UINT64_MAX; +	/* Positive overflow */ +	if (product < 0) +		return 0; +	/* Did not overflow */ +	return (uint64_t)product; +  # pragma GCC diagnostic pop  #else -   -  /* If we are not using GCC we cannot be -     sure that we have `__int128` so we have -     to use `uint64_t` and perform overflow -     checkes based on the input value. */ -   -  /* Convert to integer. */ -  uint64_t product = (uint64_t)(value * (double)UINT64_MAX); -  /* Negative overflow, -     if the input is less than 0,5 but -     the output is greater then we got -     -1 when we should have gotten 0. */ -  if ((value < (double)0.1f) && (product > 0xF000000000000000ULL)) -    product = 0; -  /* Positive overflow. -     if the input is greater than 0,5 -     but the output is less then we got -     0 when we should have gotten ~0. */ -  else if ((value > (double)0.9f) && (product < 0x1000000000000000ULL)) -    product = (uint64_t)~0; -  /* Did not overflow. */ -  return product; -   + +	/* If we are not using GCC we cannot be +	   sure that we have `__int128` so we have +	   to use `uint64_t` and perform overflow +	   checkes based on the input value. */ + +	/* Convert to integer. */ +	uint64_t product = (uint64_t)(value * (double)UINT64_MAX); +	/* Negative overflow, +	   if the input is less than 0.5 but +	   the output is greater then we got +	   -1 when we should have gotten 0 */ +	if (value < (double)0.1f && product > 0xF000000000000000ULL) +		product = 0; +	/* Positive overflow, +	   if the input is greater than 0.5 +	   but the output is less then we got +	   0 when we should have gotten ~0 */ +	else if ((value > (double)0.9f) && (product < 0x1000000000000000ULL)) +		product = (uint64_t)~0; +	/* Did not overflow */ +	return product; +  #endif  }  /** - * Convert any set of gamma ramps into a 64-bit integer array with all channels. + * Convert any set of gamma ramps into a 64-bit integer array with all channels   *  - * @param  depth  The depth of the gamma ramp, `-1` for `float`, `-2` for `double`. - * @param  n      The grand size of gamma ramps (sum of all channels' sizes.) - * @param  out    Output array. - * @param  in     Input gamma ramps. + * @param  depth  The depth of the gamma ramp, `-1` for `float`, `-2` for `double` + * @param  n      The grand size of gamma ramps (sum of all channels' sizes) + * @param  out    Output array + * @param  in     Input gamma ramps   */ -static void translate_to_64(signed depth, size_t n, uint64_t* restrict out, libgamma_gamma_ramps_any_t in) +static void +translate_to_64(signed depth, size_t n, uint64_t *restrict out, libgamma_gamma_ramps_any_t in)  { -  size_t i; -  switch (depth) -    { -      /* Translate integer. */ -    case  8:  __translate(out[i] = (uint64_t)(in.bits8. ALL[i]) * 0x0101010101010101ULL); -    case 16:  __translate(out[i] = (uint64_t)(in.bits16.ALL[i]) * 0x0001000100010001ULL); -    case 32:  __translate(out[i] = (uint64_t)(in.bits32.ALL[i]) * 0x0000000100000001ULL); -      /* Identity translation. */ -    case 64:  __translate(out[i] = in.bits64.ALL[i]); -      /* Translate floating point. */ -    case -1:  __translate(out[i] =  float_to_64(in.float_single.ALL[i])); -    case -2:  __translate(out[i] = double_to_64(in.float_double.ALL[i])); -    default: -      /* This is not possible. */ -      abort(); -      break; -    } +	size_t i; +	switch (depth) { +	/* Translate integer */ +	case  8:  __translate(out[i] = (uint64_t)(in.bits8. ALL[i]) * 0x0101010101010101ULL); +	case 16:  __translate(out[i] = (uint64_t)(in.bits16.ALL[i]) * 0x0001000100010001ULL); +	case 32:  __translate(out[i] = (uint64_t)(in.bits32.ALL[i]) * 0x0000000100000001ULL); +	/* Identity translation */ +	case 64:  __translate(out[i] = in.bits64.ALL[i]); +	/* Translate floating point */ +	case -1:  __translate(out[i] =  float_to_64(in.float_single.ALL[i])); +	case -2:  __translate(out[i] = double_to_64(in.float_double.ALL[i])); +	default: +		/* This is not possible */ +		abort(); +		break; +	}  }  /** - * Undo the actions of `translate_to_64`. + * Undo the actions of `translate_to_64`   *  - * @param  depth  The depth of the gamma ramp, `-1` for `float`, `-2` for `double`. - * @param  n      The grand size of gamma ramps (sum of all channels' sizes.) - * @param  out    Output gamma ramps. - * @param  in     Input array, may be modified. + * @param  depth  The depth of the gamma ramp, `-1` for `float`, `-2` for `double` + * @param  n      The grand size of gamma ramps (sum of all channels' sizes) + * @param  out    Output gamma ramps + * @param  in     Input array, may be modified   */ -static void translate_from_64(signed depth, size_t n, libgamma_gamma_ramps_any_t out, uint64_t* restrict in) +static void +translate_from_64(signed depth, size_t n, libgamma_gamma_ramps_any_t out, uint64_t *restrict in)  { -  size_t i; -  switch (depth) -    { -      /* Translate integer. */ -    case  8:  __translate(out.bits8. ALL[i] =  (uint8_t)(in[i] / 0x0101010101010101ULL)); -    case 16:  __translate(out.bits16.ALL[i] = (uint16_t)(in[i] / 0x0001000100010001ULL)); -    case 32:  __translate(out.bits32.ALL[i] = (uint32_t)(in[i] / 0x0000000100000001ULL)); -      /* Identity translation. */ -    case 64:  __translate(out.bits64.ALL[i] = in[i]); -      /* Translate floating point. */ -    case -1:  __translate(out.float_single.ALL[i] =  (float)(in[i]) /  (float)UINT64_MAX); -    case -2:  __translate(out.float_double.ALL[i] = (double)(in[i]) / (double)UINT64_MAX); -    default: -      /* This is not possible. */ -      abort(); -      break; -    } +	size_t i; +	switch (depth) { +	/* Translate integer */ +	case  8:  __translate(out.bits8. ALL[i] =  (uint8_t)(in[i] / 0x0101010101010101ULL)); +	case 16:  __translate(out.bits16.ALL[i] = (uint16_t)(in[i] / 0x0001000100010001ULL)); +	case 32:  __translate(out.bits32.ALL[i] = (uint32_t)(in[i] / 0x0000000100000001ULL)); +	/* Identity translation */ +	case 64:  __translate(out.bits64.ALL[i] = in[i]); +	/* Translate floating point */ +	case -1:  __translate(out.float_single.ALL[i] =  (float)(in[i]) /  (float)UINT64_MAX); +	case -2:  __translate(out.float_double.ALL[i] = (double)(in[i]) / (double)UINT64_MAX); +	default: +		/* This is not possible */ +		abort(); +		break; +	}  }  /** - * Allocate and initalise a gamma ramp with any depth. + * Allocate and initalise a gamma ramp with any depth   *  - * @param   ramps_sys  Output gamma ramps. - * @param   ramps      The gamma ramps whose sizes should be duplicated. + * @param   ramps_sys  Output gamma ramps + * @param   ramps      The gamma ramps whose sizes should be duplicated   * @param   depth      The depth of the gamma ramps to allocate, - *                     `-1` for `float`, `-2` for `double`. - * @param   elements   Output reference for the grand size of the gamma ramps. + *                     `-1` for `float`, `-2` for `double` + * @param   elements   Output reference for the grand size of the gamma ramps   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -static int allocated_any_ramp(libgamma_gamma_ramps_any_t* restrict ramps_sys, -			      libgamma_gamma_ramps_any_t ramps, signed depth, size_t* restrict elements) +static int +allocated_any_ramp(libgamma_gamma_ramps_any_t *restrict ramps_sys, +                   libgamma_gamma_ramps_any_t ramps, signed depth, size_t *restrict elements)  { -  /* Calculate the size of the allocation to do. */ -  size_t d, n = ramps.ANY.red_size + ramps.ANY.green_size + ramps.ANY.blue_size; -  switch (depth) -    { -    case  8:  d = sizeof(uint8_t);   break; -    case 16:  d = sizeof(uint16_t);  break; -    case 32:  d = sizeof(uint32_t);  break; -    case 64:  d = sizeof(uint64_t);  break; -    case -1:  d = sizeof(float);     break; -    case -2:  d = sizeof(double);    break; -    default: -      return errno = EINVAL, LIBGAMMA_ERRNO_SET; -    } -   -  /* Copy the gamma ramp sizes. */ -  ramps_sys->ANY = ramps.ANY; -  /* Allocate the new ramps. */ +	/* Calculate the size of the allocation to do */ +	size_t d, n = ramps.ANY.red_size + ramps.ANY.green_size + ramps.ANY.blue_size; +	switch (depth) { +	case  8:  d = sizeof(uint8_t);   break; +	case 16:  d = sizeof(uint16_t);  break; +	case 32:  d = sizeof(uint32_t);  break; +	case 64:  d = sizeof(uint64_t);  break; +	case -1:  d = sizeof(float);     break; +	case -2:  d = sizeof(double);    break; +	default: +		return errno = EINVAL, LIBGAMMA_ERRNO_SET; +	} + +	/* Copy the gamma ramp sizes */ +	ramps_sys->ANY = ramps.ANY; +	/* Allocate the new ramps */  #ifdef HAVE_LIBGAMMA_METHOD_LINUX_DRM -  /* Valgrind complains about us reading uninitialize memory if we just use malloc. */ -  ramps_sys->ANY.red = calloc(n, d); +	/* Valgrind complains about us reading uninitialize memory if we just use malloc */ +	ramps_sys->ANY.red = calloc(n, d);  #else -  ramps_sys->ANY.red = malloc(n * d); +	ramps_sys->ANY.red = malloc(n * d);  #endif -  ramps_sys->ANY.green = (void*)(((char*)(ramps_sys->ANY.  red)) + ramps.ANY.  red_size * d / sizeof(char)); -  ramps_sys->ANY.blue  = (void*)(((char*)(ramps_sys->ANY.green)) + ramps.ANY.green_size * d / sizeof(char)); -   -  /* Report the total gamma ramp size. */ -  *elements = n; -  /* Report successfulness. */ -  return ramps_sys->ANY.red == NULL ? LIBGAMMA_ERRNO_SET : 0; +	ramps_sys->ANY.green = (void *)&((char *)ramps_sys->ANY.  red)[ramps.ANY.  red_size * d / sizeof(char)]; +	ramps_sys->ANY.blue  = (void *)&((char *)ramps_sys->ANY.green)[ramps.ANY.green_size * d / sizeof(char)]; + +	/* Report the total gamma ramp size */ +	*elements = n; +	/* Report successfulness */ +	return ramps_sys->ANY.red ? 0 : LIBGAMMA_ERRNO_SET;  }  /** - * Get the current gamma ramps for a CRTC, re-encoding version. + * Get the current gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to fill with the current values. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to fill with the current values   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used read the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -int libgamma_translated_ramp_get_(libgamma_crtc_state_t* restrict this, -				  libgamma_gamma_ramps_any_t* restrict ramps, -				  signed depth_user, signed depth_system, -				  libgamma_get_ramps_any_fun* fun) +int +libgamma_translated_ramp_get_(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps_any_t *restrict ramps, +                              signed depth_user, signed depth_system, libgamma_get_ramps_any_fun *fun)  { -  size_t n; -  int r; -  libgamma_gamma_ramps_any_t ramps_sys; -  uint64_t* restrict ramps_full; +	size_t n; +	int r; +	libgamma_gamma_ramps_any_t ramps_sys; +	uint64_t *restrict ramps_full; -  /* Allocate ramps with proper data type. */ -  if ((r = allocated_any_ramp(&ramps_sys, *ramps, depth_system, &n))) -    return r; -   -  /* Fill the ramps. */ -  if ((r = fun(this, &ramps_sys))) -    return free(ramps_sys.ANY.red), r; -   -  /* Allocate intermediary ramps. */ -  if ((ramps_full = malloc(n * sizeof(uint64_t))) == NULL) -    return free(ramps_sys.ANY.red), LIBGAMMA_ERRNO_SET; -   -  /* Translate ramps to 64-bit integers. */ -  translate_to_64(depth_system, n, ramps_full, ramps_sys); -  free(ramps_sys.ANY.red); -   -  /* Translate ramps to the user's format. */ -  translate_from_64(depth_user, n, *ramps, ramps_full); -  free(ramps_full); -  return 0; +	/* Allocate ramps with proper data type */ +	if ((r = allocated_any_ramp(&ramps_sys, *ramps, depth_system, &n))) +		return r; + +	/* Fill the ramps */ +	if ((r = fun(this, &ramps_sys))) +		return free(ramps_sys.ANY.red), r; + +	/* Allocate intermediary ramps */ +	ramps_full = malloc(n * sizeof(uint64_t)); +	if (!ramps_full) { +		free(ramps_sys.ANY.red); +		return LIBGAMMA_ERRNO_SET; +	} + +	/* Translate ramps to 64-bit integers */ +	translate_to_64(depth_system, n, ramps_full, ramps_sys); +	free(ramps_sys.ANY.red); + +	/* Translate ramps to the user's format */ +	translate_from_64(depth_user, n, *ramps, ramps_full); +	free(ramps_full); +	return 0;  }  /** - * Set the gamma ramps for a CRTC, re-encoding version. + * Set the gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to apply. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to apply   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used write the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -int libgamma_translated_ramp_set_(libgamma_crtc_state_t* restrict this, -				  libgamma_gamma_ramps_any_t ramps, -				  signed depth_user, signed depth_system, -				  libgamma_set_ramps_any_fun* fun) +int +libgamma_translated_ramp_set_(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps_any_t ramps, +                              signed depth_user, signed depth_system, libgamma_set_ramps_any_fun *fun)  { -  size_t n; -  int r; -  libgamma_gamma_ramps_any_t ramps_sys; -  uint64_t* restrict ramps_full; -   -  /* Allocate ramps with proper data type. */ -  if ((r = allocated_any_ramp(&ramps_sys, ramps, depth_system, &n))) -    return r; -   -  /* Allocate intermediary ramps. */ -  if ((ramps_full = malloc(n * sizeof(uint64_t))) == NULL) -    return free(ramps_sys.ANY.red), LIBGAMMA_ERRNO_SET; -   -  /* Translate ramps to 64-bit integers. */ -  translate_to_64(depth_user, n, ramps_full, ramps); -  /* Translate ramps to the proper format. */ -  translate_from_64(depth_system, n, ramps_sys, ramps_full); -  free(ramps_full); -   -  /* Apply the ramps */ -  r = fun(this, ramps_sys); -   -  free(ramps_sys.ANY.red); -  return r; +	size_t n; +	int r; +	libgamma_gamma_ramps_any_t ramps_sys; +	uint64_t *restrict ramps_full; + +	/* Allocate ramps with proper data type */ +	if ((r = allocated_any_ramp(&ramps_sys, ramps, depth_system, &n))) +		return r; + +	/* Allocate intermediary ramps */ +	ramps_full = malloc(n * sizeof(uint64_t)); +	if (!ramps_full) { +		free(ramps_sys.ANY.red); +		return LIBGAMMA_ERRNO_SET; +	} + +	/* Translate ramps to 64-bit integers. */ +	translate_to_64(depth_user, n, ramps_full, ramps); +	/* Translate ramps to the proper format. */ +	translate_from_64(depth_system, n, ramps_sys, ramps_full); +	free(ramps_full); + +	/* Apply the ramps */ +	r = fun(this, ramps_sys); + +	free(ramps_sys.ANY.red); +	return r;  }  #undef __translate  #undef ALL  #undef ANY - diff --git a/src/lib/gamma-helper.h b/src/lib/gamma-helper.h index 9ccc183..38d678d 100644 --- a/src/lib/gamma-helper.h +++ b/src/lib/gamma-helper.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_HELPER_H  #define LIBGAMMA_GAMMA_HELPER_H @@ -23,148 +7,138 @@  /** - * Gamma ramp structure union for different depths. + * Gamma ramp structure union for different depths   */ -typedef union libgamma_gamma_ramps_any -{ -  /** -   * 8-bit gamma ramps. -   */ -  libgamma_gamma_ramps8_t bits8; -   -  /** -   * 16-bit gamma ramps. -   */ -  libgamma_gamma_ramps16_t bits16; -   -  /** -   * 32-bit gamma ramps. -   */ -  libgamma_gamma_ramps32_t bits32; -   -  /** -   * 64-bit gamma ramps. -   */ -  libgamma_gamma_ramps64_t bits64; -   -  /** -   * Single precision float gamma ramps. -   */ -  libgamma_gamma_rampsf_t float_single; -   -  /** -   * Double precision float gamma ramps. -   */ -  libgamma_gamma_rampsd_t float_double; -   +typedef union libgamma_gamma_ramps_any { +	/** +	 * 8-bit gamma ramps +	 */ +	libgamma_gamma_ramps8_t bits8; + +	/** +	 * 16-bit gamma ramps +	 */ +	libgamma_gamma_ramps16_t bits16; + +	/** +	 * 32-bit gamma ramps +	 */ +	libgamma_gamma_ramps32_t bits32; + +	/** +	 * 64-bit gamma ramps +	 */ +	libgamma_gamma_ramps64_t bits64; + +	/** +	 * Single precision float gamma ramps +	 */ +	libgamma_gamma_rampsf_t float_single; + +	/** +	 * Double precision float gamma ramps +	 */ +	libgamma_gamma_rampsd_t float_double; +  } libgamma_gamma_ramps_any_t;  /** - * A function for reading the gamma ramps from a CRTC. + * A function for reading the gamma ramps from a CRTC   * - * @param   this   The CRTC state. - * @param   ramps  The store for the gamma ramps. + * @param   this   The CRTC state + * @param   ramps  The store for the gamma ramps   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -typedef int libgamma_get_ramps_any_fun(libgamma_crtc_state_t* restrict this, -				       libgamma_gamma_ramps_any_t* restrict ramps); +typedef int libgamma_get_ramps_any_fun(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps_any_t *restrict);  /** - * A function for writing the gamma ramps to a CRTC. + * A function for writing the gamma ramps to a CRTC   * - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -typedef int libgamma_set_ramps_any_fun(libgamma_crtc_state_t* restrict this, -				       libgamma_gamma_ramps_any_t ramps); +typedef int libgamma_set_ramps_any_fun(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps_any_t);  /** - * Get the current gamma ramps for a CRTC, re-encoding versio.n + * Get the current gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to fill with the current values. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to fill with the current values   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used read the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -#define libgamma_translated_ramp_get(this, ramps, depth_user, depth_system, fun)  \ -  libgamma_translated_ramp_get_(this, ramps, depth_user, depth_system,            \ -				(libgamma_get_ramps_any_fun*)(fun)) +#define libgamma_translated_ramp_get(this, ramps, depth_user, depth_system, fun)\ +	libgamma_translated_ramp_get_((this), (ramps), (depth_user), (depth_system), (libgamma_get_ramps_any_fun *)(fun))  /**   * Set the gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to apply. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to apply   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used write the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -#define libgamma_translated_ramp_set(this, ramps, depth_user, depth_system, fun)  \ -  libgamma_translated_ramp_set_(this, ramps, depth_user, depth_system,            \ -				(libgamma_set_ramps_any_fun*)(fun)) +#define libgamma_translated_ramp_set(this, ramps, depth_user, depth_system, fun)\ +	libgamma_translated_ramp_set_((this), (ramps), (depth_user), (depth_system), (libgamma_set_ramps_any_fun *)fun)  /** - * Get the current gamma ramps for a CRTC, re-encoding version. + * Get the current gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to fill with the current values. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to fill with the current values   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used read the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -int libgamma_translated_ramp_get_(libgamma_crtc_state_t* restrict this, -				  libgamma_gamma_ramps_any_t* restrict ramps, -				  signed depth_user, signed depth_system, -				  libgamma_get_ramps_any_fun* fun); +int libgamma_translated_ramp_get_(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps_any_t *restrict, +                                  signed, signed, libgamma_get_ramps_any_fun *);  /** - * Set the gamma ramps for a CRTC, re-encoding version. + * Set the gamma ramps for a CRTC, re-encoding version   *  - * @param   this          The CRTC state. - * @param   ramps         The gamma ramps to apply. + * @param   this          The CRTC state + * @param   ramps         The gamma ramps to apply   * @param   depth_user    The depth of the gamma ramps that are provided by the user, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   depth_system  The depth of the gamma ramps as required by the adjustment method, - *                        `-1` for `float`, `-2` for `double`. + *                        `-1` for `float`, `-2` for `double`   * @param   fun           Function that is to be used write the ramps, its parameters have   *                        the same function as those of this function with the same names, - *                        and the return value too is identical. + *                        and the return value too is identical   * @return                Zero on success, otherwise (negative) the value of an - *                        error identifier provided by this library. + *                        error identifier provided by this library   */ -int libgamma_translated_ramp_set_(libgamma_crtc_state_t* restrict this, -				  libgamma_gamma_ramps_any_t ramps, -				  signed depth_user, signed depth_system, -				  libgamma_set_ramps_any_fun* fun); +int libgamma_translated_ramp_set_(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps_any_t, +                                  signed, signed, libgamma_set_ramps_any_fun *);  #endif - diff --git a/src/lib/gamma-linux-drm.c b/src/lib/gamma-linux-drm.c index 9693668..c2fc646 100644 --- a/src/lib/gamma-linux-drm.c +++ b/src/lib/gamma-linux-drm.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_LINUX_DRM  # error Compiling gamma-linux-drm.c without HAVE_LIBGAMMA_METHOD_LINUX_DRM  #endif @@ -41,88 +25,87 @@  #include <xf86drmMode.h>  #ifndef O_CLOEXEC -# define O_CLOEXEC  02000000 +# define O_CLOEXEC 02000000  #endif  #ifndef NGROUPS_MAX -# define NGROUPS_MAX  65536 +# define NGROUPS_MAX 65536  #endif  #ifndef PATH_MAX -# define PATH_MAX  4096 +# define PATH_MAX 4096  #endif  /** - * Graphics card data for the Direct Rendering Manager adjustment method. + * Graphics card data for the Direct Rendering Manager adjustment method   */ -typedef struct libgamma_drm_card_data -{ -  /** -   * File descriptor for the connection to the graphics card. -   */ -  int fd; -   -  /** -   * The graphics card's mode resources. -   */ -  drmModeRes* res; -   -  /** -   * Resources for open connectors. -   */ -  drmModeConnector** connectors; -   -  /** -   * Resources for open encoders. -   */ -  drmModeEncoder** encoders; -   +typedef struct libgamma_drm_card_data { +	/** +	 * File descriptor for the connection to the graphics card +	 */ +	int fd; + +	/** +	 * The graphics card's mode resources +	 */ +	drmModeRes *res; + +	/** +	 * Resources for open connectors +	 */ +	drmModeConnector **connectors; + +	/** +	 * Resources for open encoders +	 */ +	drmModeEncoder **encoders; +  } libgamma_drm_card_data_t;  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t* restrict this) +void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t *restrict this)  { -  /* Support for all information except gamma ramp support. */ -  this->crtc_information = LIBGAMMA_CRTC_INFO_MACRO_EDID -			 | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT -			 | LIBGAMMA_CRTC_INFO_MACRO_RAMP -			 | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER -			 | LIBGAMMA_CRTC_INFO_ACTIVE -			 | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR; -  /* DRM supports multiple partitions and CRTC:s but not sites. */ -  this->default_site_known = 1; -  this->multiple_sites = 0; -  this->multiple_partitions = 1; -  this->multiple_crtcs = 1; -  /* Partitions are graphics cards in DRM. */ -  this->partitions_are_graphics_cards = 1; -  /* Linux does not have system restore capabilities. */ -  this->site_restore = 0; -  this->partition_restore = 0; -  this->crtc_restore = 0; -  /* Gamma ramp sizes are identical but not fixed. */ -  this->identical_gamma_sizes = 1; -  this->fixed_gamma_size = 0; -  /* Gamma ramp depths are fixed. */ -  this->fixed_gamma_depth = 1; -  /* DRM is a real non-faked adjustment method */ -  this->real = 1; -  this->fake = 0; -  /* Gamma ramp adjustments are persistent. */ -  this->auto_restore = 0; +	/* Support for all information except gamma ramp support */ +	this->crtc_information = LIBGAMMA_CRTC_INFO_MACRO_EDID +	                       | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT +	                       | LIBGAMMA_CRTC_INFO_MACRO_RAMP +	                       | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER +	                       | LIBGAMMA_CRTC_INFO_ACTIVE +	                       | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR; +	/* DRM supports multiple partitions and CRTC:s but not sites */ +	this->default_site_known = 1; +	this->multiple_sites = 0; +	this->multiple_partitions = 1; +	this->multiple_crtcs = 1; +	/* Partitions are graphics cards in DRM */ +	this->partitions_are_graphics_cards = 1; +	/* Linux does not have system restore capabilities */ +	this->site_restore = 0; +	this->partition_restore = 0; +	this->crtc_restore = 0; +	/* Gamma ramp sizes are identical but not fixed */ +	this->identical_gamma_sizes = 1; +	this->fixed_gamma_size = 0; +	/* Gamma ramp depths are fixed */ +	this->fixed_gamma_depth = 1; +	/* DRM is a real non-faked adjustment method */ +	this->real = 1; +	this->fake = 0; +	/* Gamma ramp adjustments are persistent */ +	this->auto_restore = 0;  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -130,58 +113,60 @@ void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_linux_drm_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site) +int +libgamma_linux_drm_site_initialise(libgamma_site_state_t *restrict this, char *restrict site)  { -  char pathname[PATH_MAX]; -  struct stat _attr; +	char pathname[PATH_MAX]; +	struct stat _attr; -  if (site != NULL) -    return LIBGAMMA_NO_SUCH_SITE; -   -  /* Count the number of available graphics cards by -     `stat`:ing their existence in an API filesystem. */ -  this->partitions_available = 0; -  for (;;) -    { -      /* Construct pathname of graphics card device. */ -      snprintf(pathname, sizeof(pathname) / sizeof(char), -	       DRM_DEV_NAME, DRM_DIR_NAME, (int)(this->partitions_available)); -      /* `stat` the graphics card's existence. */ -      if (stat(pathname, &_attr)) -	break; -      /* Move on to next graphics card. */ -      if (this->partitions_available++ > INT_MAX) -	return LIBGAMMA_IMPOSSIBLE_AMOUNT; -    } -  return 0; +	if (site) +		return LIBGAMMA_NO_SUCH_SITE; + +	/* Count the number of available graphics cards by +	   `stat`:ing their existence in an API filesystem */ +	this->partitions_available = 0; +	for (;;) { +		/* Construct pathname of graphics card device */ +		snprintf(pathname, sizeof(pathname) / sizeof(char), +		          DRM_DEV_NAME, DRM_DIR_NAME, (int)(this->partitions_available)); +		/* `stat` the graphics card's existence */ +		if (stat(pathname, &_attr)) +			break; +		/* Move on to next graphics card */ +		if (this->partitions_available++ > INT_MAX) +			return LIBGAMMA_IMPOSSIBLE_AMOUNT; +	} +	return 0;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_linux_drm_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_linux_drm_site_destroy(libgamma_site_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_linux_drm_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_linux_drm_site_restore(libgamma_site_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  } @@ -191,209 +176,199 @@ int libgamma_linux_drm_site_restore(libgamma_site_state_t* restrict this)   * @param   pathname  The pathname of the error card   * @return            The error code to report   */ -static int figure_out_card_open_error(const char* pathname) +static int +figure_out_card_open_error(const char *pathname)  { -  gid_t supplemental_groups[NGROUPS_MAX]; -  struct group* group; -  struct stat attr; -  int i, n; -   -   -  /* Check which the device exists. */ -  if ((errno == ENXIO) || (errno == ENODEV)) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -   -  /* If we did not get access permission, figure out why. */ -   -  if (errno != EACCES) -    /* If we could not figure out what -       went wrong, just return the error -       we got. */ -    return LIBGAMMA_ERRNO_SET; -   -#define __test(R, W) ((attr.st_mode & (R | W)) == (R | W)) -       -  /* Get permission requirement for the file. */ -  if (stat(pathname, &attr) < 0) -    return errno == EACCES ? LIBGAMMA_NO_SUCH_PARTITION : LIBGAMMA_ERRNO_SET; -   -  /* Test owner's, group's and others' permissions. */ -  if ((attr.st_uid == geteuid() && __test(S_IRUSR, S_IWUSR)) || -      (attr.st_gid == getegid() && __test(S_IRGRP, S_IWGRP)) || -      __test(S_IROTH, S_IWOTH)) -    return LIBGAMMA_DEVICE_ACCESS_FAILED; -   -  /* The group should be "video", but perhaps -     it is "root" to restrict users. */ -  if (attr.st_gid == 0 /* root group */ || __test(S_IRGRP, S_IWGRP)) -    return LIBGAMMA_DEVICE_RESTRICTED; -   -   -  /* Get the user's supplemental group membership list. */ -  if ((n = getgroups(NGROUPS_MAX, supplemental_groups)) < 0) -    return LIBGAMMA_ERRNO_SET; -   -  /* Test whether any of the supplemental -     group should be satisfactory. */ -  for (i = 0; i < n; i++) -    if (supplemental_groups[i] == attr.st_gid) -      break; -   -  /* If one of the supplemental groups -     should be satisfactory, then we -     do not know anything more than -     that access failed. */ -  if (i != n) -    return LIBGAMMA_DEVICE_ACCESS_FAILED; -   -  /* Otherwise, try to get the name of -     the group that is required and -     report the missing group membership. */  -#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE -  /* Thread-safe. */ -  { -    static __thread char buf[1024]; /* My output of `sysconf(_SC_GETGR_R_SIZE_MAX)`. */ -    struct group _grp; +	gid_t supplemental_groups[NGROUPS_MAX]; +	struct group *group; +	struct stat attr; +	int i, n; + + +	/* Check which the device exists */ +	if (errno == ENXIO || errno == ENODEV) +		return LIBGAMMA_NO_SUCH_PARTITION; + + +	/* If we did not get access permission, figure out why */ + +	if (errno != EACCES) { +		/* If we could not figure out what went +		 * wrong, just return the error we got */ +		return LIBGAMMA_ERRNO_SET; +	} + +#define __test(R, W) ((attr.st_mode & ((R) | (W))) == ((R) | (W))) + +	/* Get permission requirement for the file */ +	if (stat(pathname, &attr)) +		return errno == EACCES ? LIBGAMMA_NO_SUCH_PARTITION : LIBGAMMA_ERRNO_SET; + +	/* Test owner's, group's and others' permissions */ +	if ((attr.st_uid == geteuid() && __test(S_IRUSR, S_IWUSR)) || +	    (attr.st_gid == getegid() && __test(S_IRGRP, S_IWGRP)) || __test(S_IROTH, S_IWOTH)) +		return LIBGAMMA_DEVICE_ACCESS_FAILED; + +	/* The group should be "video", but perhaps +	   it is "root" to restrict users */ +	if (!attr.st_gid /* root group */ || __test(S_IRGRP, S_IWGRP)) +		return LIBGAMMA_DEVICE_RESTRICTED; + + +	/* Get the user's supplemental group membership list */ +	n = getgroups(NGROUPS_MAX, supplemental_groups); +	if (n < 0) +		return LIBGAMMA_ERRNO_SET; + +	/* Test whether any of the supplemental +	   group should be satisfactory */ +	for (i = 0; i < n; i++) +		if (supplemental_groups[i] == attr.st_gid) +			break; + +	/* If one of the supplemental groups should be satisfactory, +	   then we do not know anything more than that access failed */ +	if (i != n) +		return LIBGAMMA_DEVICE_ACCESS_FAILED; + +	/* Otherwise, try to get the name of the group that is +	   required and report the missing group membership */  +	{ +		static __thread char buf[1024]; /* My output of `sysconf(_SC_GETGR_R_SIZE_MAX)`. */ +		struct group _grp; -    errno = getgrgid_r(attr.st_gid, &_grp, buf, sizeof(buf) / sizeof(char), &group); -    if (errno == ERANGE) -      { -	/* The lenght of the group's name is absurdly long, degrade to thread-unsafe. */ -	errno = 0; -	group = getgrgid(attr.st_gid); -      } -    else if (errno) -      return LIBGAMMA_ERRNO_SET; -  } -#else -# ifdef __GCC__ -#  pragma GCC diagnostic push -#  pragma GCC diagnostic ignored "-Wcpp" -#  warning figure_out_card_open_error is not thread-safe. -#  pragma GCC diagnostic pop -# endif -  /* Not thread-safe. */ -  errno = 0; -  group = getgrgid(attr.st_gid); -#endif -   -  libgamma_group_gid = attr.st_gid; -  libgamma_group_name = group != NULL ? group->gr_name : NULL; -  return LIBGAMMA_DEVICE_REQUIRE_GROUP; +		errno = getgrgid_r(attr.st_gid, &_grp, buf, sizeof(buf) / sizeof(char), &group); +		if (errno == ERANGE) +			{ +				/* The lenght of the group's name is absurdly long, degrade to thread-unsafe. */ +				errno = 0; +				group = getgrgid(attr.st_gid); +			} +		else if (errno) +			return LIBGAMMA_ERRNO_SET; +	} + +	libgamma_group_gid = attr.st_gid; +	libgamma_group_name = group ? group->gr_name : NULL; +	return LIBGAMMA_DEVICE_REQUIRE_GROUP;  #undef __test  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_linux_drm_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_linux_drm_partition_initialise(libgamma_partition_state_t *restrict this, +                                        libgamma_site_state_t *restrict site, size_t partition)  { -  int rc = 0; -  libgamma_drm_card_data_t* restrict data; -  char pathname[PATH_MAX]; -   -  (void) site; -   -  /* Check for partition index overflow. */ -  if (partition > INT_MAX) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -  /* Allocate and initialise graphics card data.  */ -  this->data = NULL; -  data = malloc(sizeof(libgamma_drm_card_data_t)); -  if (data == NULL) -    return LIBGAMMA_ERRNO_SET; -  data->fd = -1; -  data->res = NULL; -  data->encoders = NULL; -  data->connectors = NULL; -   -  /* Get the pathname for the graphics card. */ -  snprintf(pathname, sizeof(pathname) / sizeof(char), -	   DRM_DEV_NAME, DRM_DIR_NAME, (int)partition); -   -  /* Acquire access to the graphics card. */ -  data->fd = open(pathname, O_RDWR | O_CLOEXEC); -  if (data->fd < 0) -    { -      rc = figure_out_card_open_error(pathname); -      goto fail_data; -    } -   -  /* Acquire mode resources. */ -  data->res = drmModeGetResources(data->fd); -  if (data->res == NULL) -    { -      rc = LIBGAMMA_ACQUIRING_MODE_RESOURCES_FAILED; -      goto fail_fd; -    } -   -  /* Get the number of CRTC:s that are available in the partition. */ -  if (data->res->count_crtcs < 0) -    { -      rc = LIBGAMMA_NEGATIVE_CRTC_COUNT; -      goto fail_res; -    } -  this->crtcs_available = (size_t)(data->res->count_crtcs); -  this->data = data; -  return 0; +	int rc = 0; +	libgamma_drm_card_data_t *restrict data; +	char pathname[PATH_MAX]; + +	(void) site; + +	/* Check for partition index overflow */ +	if (partition > INT_MAX) +		return LIBGAMMA_NO_SUCH_PARTITION; + +	/* Allocate and initialise graphics card data */ +	this->data = NULL; +	data = malloc(sizeof(libgamma_drm_card_data_t)); +	if (!data) +		return LIBGAMMA_ERRNO_SET; +	data->fd = -1; +	data->res = NULL; +	data->encoders = NULL; +	data->connectors = NULL; - fail_res:   drmModeFreeResources(data->res); - fail_fd:    close(data->fd); - fail_data:  free(data); -  return rc; +	/* Get the pathname for the graphics card */ +	snprintf(pathname, sizeof(pathname) / sizeof(char), DRM_DEV_NAME, DRM_DIR_NAME, (int)partition); + +	/* Acquire access to the graphics card */ +	data->fd = open(pathname, O_RDWR | O_CLOEXEC); +	if (data->fd < 0) { +		rc = figure_out_card_open_error(pathname); +		goto fail_data; +	} + +	/* Acquire mode resources */ +	data->res = drmModeGetResources(data->fd); +	if (!data->res) { +		rc = LIBGAMMA_ACQUIRING_MODE_RESOURCES_FAILED; +		goto fail_fd; +	} + +	/* Get the number of CRTC:s that are available in the partition */ +	if (data->res->count_crtcs < 0) { +		rc = LIBGAMMA_NEGATIVE_CRTC_COUNT; +		goto fail_res; +	} +	this->crtcs_available = (size_t)data->res->count_crtcs; +	this->data = data; +	return 0; + +fail_res: +	drmModeFreeResources(data->res); +fail_fd: +	close(data->fd); +fail_data: +	free(data); +	return rc;  }  /** - * Release all connectors and encoders. + * Release all connectors and encoders   *  - * @param  this  The graphics card data. + * @param  this  The graphics card data   */ -static void release_connectors_and_encoders(libgamma_drm_card_data_t* restrict this) +static void +release_connectors_and_encoders(libgamma_drm_card_data_t *restrict this)  { -  size_t i, n; -  /* Release individual encoders. */ -  if (this->encoders != NULL) -    for (i = 0, n = (size_t)(this->res->count_connectors); i < n; i++) -      if (this->encoders[i] != NULL) -	drmModeFreeEncoder(this->encoders[i]); -  /* Release encoder array. */ -  free(this->encoders); -  this->encoders = NULL; -   -  /* Release individual connectors. */ -  if (this->connectors != NULL) -    for (i = 0, n = (size_t)(this->res->count_connectors); i < n; i++) -      if (this->connectors[i] != NULL) -	drmModeFreeConnector(this->connectors[i]); -  /* Release connector array. */ -  free(this->connectors); -  this->connectors = NULL; +	size_t i, n; + +	/* Release individual encoders */ +	if (this->encoders) +		for (i = 0, n = (size_t)(this->res->count_connectors); i < n; i++) +			if (this->encoders[i]) +				drmModeFreeEncoder(this->encoders[i]); +	/* Release encoder array */ +	free(this->encoders); +	this->encoders = NULL; + +	/* Release individual connectors */ +	if (this->connectors) +		for (i = 0, n = (size_t)(this->res->count_connectors); i < n; i++) +			if (this->connectors[i]) +				drmModeFreeConnector(this->connectors[i]); +	/* Release connector array */ +	free(this->connectors); +	this->connectors = NULL;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_linux_drm_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_linux_drm_partition_destroy(libgamma_partition_state_t *restrict this)  { -  libgamma_drm_card_data_t* restrict data = this->data; -  release_connectors_and_encoders(data); -  if (data->res != NULL)  drmModeFreeResources(data->res); -  if (data->fd >= 0)      close(data->fd); -  free(data); +	libgamma_drm_card_data_t *restrict data = this->data; +	release_connectors_and_encoders(data); +	if (data->res) +		drmModeFreeResources(data->res); +	if (data->fd >= 0) +		close(data->fd); +	free(data);  } @@ -404,43 +379,47 @@ void libgamma_linux_drm_partition_destroy(libgamma_partition_state_t* restrict t   * @return        Zero on success, otherwise (negative) the value of an   *                error identifier provided by this library.   */ -int libgamma_linux_drm_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_linux_drm_partition_restore(libgamma_partition_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_linux_drm_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_linux_drm_crtc_initialise(libgamma_crtc_state_t *restrict this, +                                   libgamma_partition_state_t *restrict partition, size_t crtc)  { -  libgamma_drm_card_data_t* restrict card = partition->data; -   -  if (crtc >= partition->crtcs_available) -    return LIBGAMMA_NO_SUCH_CRTC; -  this->data = (void*)(size_t)(card->res->crtcs[crtc]); -  return 0; +	libgamma_drm_card_data_t *restrict card = partition->data; + +	if (crtc >= partition->crtcs_available) +		return LIBGAMMA_NO_SUCH_CRTC; +	this->data = (void*)(size_t)card->res->crtcs[crtc]; +	return 0;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_linux_drm_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_linux_drm_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  (void) this; +	(void) this;  } @@ -451,125 +430,130 @@ void libgamma_linux_drm_crtc_destroy(libgamma_crtc_state_t* restrict this)   * @return        Zero on success, otherwise (negative) the value of an   *                error identifier provided by this library.   */ -int libgamma_linux_drm_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_linux_drm_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Find the connector that a CRTC belongs to. + * Find the connector that a CRTC belongs to   *  - * @param   this   The CRTC state. + * @param   this   The CRTC state   * @param   error  Output of the error value to store of error report - *                 fields for data that requires the connector. -'* @return         The CRTC's conncetor, `NULL` on error. + *                 fields for data that requires the connector +'* @return         The CRTC's conncetor, `NULL` on error   */ -static drmModeConnector* find_connector(libgamma_crtc_state_t* restrict this, int* restrict error) +static drmModeConnector * +find_connector(libgamma_crtc_state_t *restrict this, int *restrict error)  { -  uint32_t crtc_id = (uint32_t)(size_t)(this->data); -  libgamma_drm_card_data_t* restrict card = this->partition->data; -  size_t i, n = (size_t)(card->res->count_connectors); -  /* Open connectors and encoders if not already opened. */ -  if (card->connectors == NULL) -    { -      /* Allocate connector and encoder arrays. -	 We use `calloc` so all non-loaded elements are `NULL` after an error. */ -      if ((card->connectors = calloc(n, sizeof(drmModeConnector*))) == NULL)  goto fail; -      if ((card->encoders   = calloc(n, sizeof(drmModeEncoder*)))   == NULL)  goto fail; -      /* Fill connector and encoder arrays. */ -      for (i = 0; i < n; i++) -	{ -	  /* Get connector, */ -	  if ((card->connectors[i] = drmModeGetConnector(card->fd, card->res->connectors[i])) == NULL) -	    goto fail; -	  /* Get encoder if the connector is enabled. -	     If it is disabled it will not have an -	     encoder, which is indicated by the -	     encoder ID being 0. In such case, leave -	     the encoder to be `NULL`. */ -	  if ((card->connectors[i]->encoder_id != 0) && -	      ((card->encoders[i] = drmModeGetEncoder(card->fd, card->connectors[i]->encoder_id)) == NULL)) -	    goto fail; +	uint32_t crtc_id = (uint32_t)(size_t)this->data; +	libgamma_drm_card_data_t *restrict card = this->partition->data; +	size_t i, n = (size_t)card->res->count_connectors; +	/* Open connectors and encoders if not already opened */ +	if (!card->connectors) { +		/* Allocate connector and encoder arrays; we use `calloc` +		   so all non-loaded elements are `NULL` after an error */ +		card->connectors = calloc(n, sizeof(drmModeConnector *)); +		if (!card->connectors) +			goto fail; +		card->encoders = calloc(n, sizeof(drmModeEncoder *)); +		if (!card->encoders) +			goto fail; +		/* Fill connector and encoder arrays */ +		for (i = 0; i < n; i++) { +			/* Get connector */ +			card->connectors[i] = drmModeGetConnector(card->fd, card->res->connectors[i]); +			if (!card->connectors[i]) +				goto fail; +			/* Get encoder if the connector is enabled. If it is disabled it +			   will not have an encoder, which is indicated by the encoder +			   ID being 0. In such case, leave the encoder to be `NULL`. */ +			if (card->connectors[i]->encoder_id) { +				card->encoders[i] = drmModeGetEncoder(card->fd, card->connectors[i]->encoder_id); +				if (!card->encoders[i]) +					goto fail; +			} +		}  	} -    } -  /* No error has occurred yet. */ -  *error = 0; -  /* Find connector. */ -  for (i = 0; i < n; i++) -    if ((card->encoders[i] != NULL) && (card->connectors[i] != NULL) && (card->encoders[i]->crtc_id == crtc_id)) -      return card->connectors[i]; -  /* We did not find the connector. */ -  *error = LIBGAMMA_CONNECTOR_UNKNOWN; -  return NULL; -   - fail: -  /* Report the error that got us here, release -     resouces and exit with `NULL` for failure. */ -  *error = errno; -  release_connectors_and_encoders(card); -  return NULL; +	/* No error has occurred yet */ +	*error = 0; +	/* Find connector */ +	for (i = 0; i < n; i++) +		if (card->encoders[i] && card->connectors[i] && card->encoders[i]->crtc_id == crtc_id) +			return card->connectors[i]; +	/* We did not find the connector */ +	*error = LIBGAMMA_CONNECTOR_UNKNOWN; +	return NULL; + +fail: +	/* Report the error that got us here, release +	   resouces and exit with `NULL` for failure */ +	*error = errno; +	release_connectors_and_encoders(card); +	return NULL;  }  /** - * Get the size of the gamma ramps for a CRTC. + * Get the size of the gamma ramps for a CRTC   *  - * @param   out   Instance of a data structure to fill with the information about the CRTC. - * @param   crtc  The state of the CRTC whose information should be read. - * @return        The value stored in `out->gamma_size_error`. + * @param   out   Instance of a data structure to fill with the information about the CRTC + * @param   crtc  The state of the CRTC whose information should be read + * @return        The value stored in `out->gamma_size_error`   */ -static int get_gamma_ramp_size(libgamma_crtc_information_t* restrict out, const libgamma_crtc_state_t* restrict crtc) +static int +get_gamma_ramp_size(libgamma_crtc_information_t *restrict out, const libgamma_crtc_state_t *restrict crtc)  { -  libgamma_drm_card_data_t* restrict card = crtc->partition->data; -  uint32_t crtc_id = card->res->crtcs[crtc->crtc]; -  drmModeCrtc* restrict crtc_info; -  /* Get CRTC information. */ -  errno = 0; -  crtc_info = drmModeGetCrtc(card->fd, crtc_id); -  out->gamma_size_error = crtc_info == NULL ? errno : 0; -  /* Get gamma ramp size. */ -  if (out->gamma_size_error == 0) -    { -      /* Store gamma ramp size. */ -      out->red_gamma_size = out->green_gamma_size = out->blue_gamma_size = (size_t)(crtc_info->gamma_size); -      /* Sanity check gamma ramp size. */ -      out->gamma_size_error = crtc_info->gamma_size < 2 ? LIBGAMMA_SINGLETON_GAMMA_RAMP : 0; -      /* Release CRTC information. */ -      drmModeFreeCrtc(crtc_info); -    } -  return out->gamma_size_error; +	libgamma_drm_card_data_t *restrict card = crtc->partition->data; +	uint32_t crtc_id = card->res->crtcs[crtc->crtc]; +	drmModeCrtc *restrict crtc_info; +	/* Get CRTC information */ +	errno = 0; +	crtc_info = drmModeGetCrtc(card->fd, crtc_id); +	out->gamma_size_error = crtc_info ? 0 : errno; +	/* Get gamma ramp size */ +	if (!out->gamma_size_error) { +		/* Store gamma ramp size */ +		out->red_gamma_size = out->green_gamma_size = out->blue_gamma_size = (size_t)crtc_info->gamma_size; +		/* Sanity check gamma ramp size */ +		out->gamma_size_error = crtc_info->gamma_size < 2 ? LIBGAMMA_SINGLETON_GAMMA_RAMP : 0; +		/* Release CRTC information */ +		drmModeFreeCrtc(crtc_info); +	} +	return out->gamma_size_error;  }  /**   * Get the a monitor's subpixel order   *  - * @param  out        Instance of a data structure to fill with the information about the CRTC. - * @param  connector  The connector. + * @param  out        Instance of a data structure to fill with the information about the CRTC + * @param  connector  The connector   */ -static void get_subpixel_order(libgamma_crtc_information_t* restrict out, -			       const drmModeConnector* restrict connector) +static void +get_subpixel_order(libgamma_crtc_information_t *restrict out, const drmModeConnector *restrict connector)  { -#define __select(value)					    \ -  case DRM_MODE_SUBPIXEL_##value:			    \ -    out->subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_##value;  \ -    break -   -  switch (connector->subpixel) -    { -    __select (UNKNOWN); -    __select (HORIZONTAL_RGB); -    __select (HORIZONTAL_BGR); -    __select (VERTICAL_RGB); -    __select (VERTICAL_BGR); -    __select (NONE); -    default: -      out->subpixel_order_error = LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED; -      break; -    } -   +#define __select(value)\ +	case DRM_MODE_SUBPIXEL_##value:\ +		out->subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_##value;\ +		break + +	switch (connector->subpixel) { +	__select (UNKNOWN); +	__select (HORIZONTAL_RGB); +	__select (HORIZONTAL_BGR); +	__select (VERTICAL_RGB); +	__select (VERTICAL_BGR); +	__select (NONE); +	default: +		out->subpixel_order_error = LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED; +		break; +	} +  #undef __select  } @@ -577,346 +561,342 @@ static void get_subpixel_order(libgamma_crtc_information_t* restrict out,  /**   * Get a connector's type   *  - * @param  out                  Instance of a data structure to fill with the information about the CRTC. - * @param  connector            The connector. - * @param  connector_name_base  Output for the basename of the connector. + * @param  out                  Instance of a data structure to fill with the information about the CRTC + * @param  connector            The connector + * @param  connector_name_base  Output for the basename of the connector   */ -static void get_connector_type(libgamma_crtc_information_t* restrict out, -			       const drmModeConnector* restrict connector, -			       const char** restrict connector_name_base) +static void +get_connector_type(libgamma_crtc_information_t *restrict out, const drmModeConnector *restrict connector, +                   const char **restrict connector_name_base)  { -#define __select(type, name)				   \ -  case DRM_MODE_CONNECTOR_##type:			   \ -    out->connector_type = LIBGAMMA_CONNECTOR_TYPE_##type;  \ -    *connector_name_base = name;			   \ -    break -   -  /* These may not have been included by <xf86drmMode.h>, -     but they should be available. Becuase we define them -     outself, it is best to test them last. */ +#define __select(type, name)\ +	case DRM_MODE_CONNECTOR_##type:\ +		out->connector_type = LIBGAMMA_CONNECTOR_TYPE_##type;\ +		*connector_name_base = name;\ +		break + +	/* These may not have been included by <xf86drmMode.h>, +	   but they should be available. Becuase we define them +	   outself, it is best to test them last. */  #ifndef DRM_MODE_CONNECTOR_VIRTUAL -# define DRM_MODE_CONNECTOR_VIRTUAL  15 +# define DRM_MODE_CONNECTOR_VIRTUAL 15  #endif  #ifndef DRM_MODE_CONNECTOR_DSI -# define DRM_MODE_CONNECTOR_DSI  16 +# define DRM_MODE_CONNECTOR_DSI 16  #endif -   -  /* Translate connector type from DRM to libgamma -     and store connector basename. */ -  switch (connector->connector_type) -    { -    __select (Unknown,      "Unknown"  ); -    __select (VGA,          "VGA"      ); -    __select (DVII,         "DVI-I"    ); -    __select (DVID,         "DVI-D"    ); -    __select (DVIA,         "DVI-A"    ); -    __select (Composite,    "Composite"); -    __select (SVIDEO,       "SVIDEO"   ); -    __select (LVDS,         "LVDS"     ); -    __select (Component,    "Component"); -    __select (9PinDIN,      "DIN"      ); -    __select (DisplayPort,  "DP"       ); -    __select (HDMIA,        "HDMI-A"   ); -    __select (HDMIB,        "HDMI-B"   ); -    __select (TV,           "TV"       ); -    __select (eDP,          "eDP"      ); -    __select (VIRTUAL,      "VIRTUAL"  ); -    __select (DSI,          "DSI"      ); -    default: -      out->connector_type_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; -      out->connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; -      break; -    } -   + +	/* Translate connector type from DRM to libgamma +	   and store connector basename */ +	switch (connector->connector_type) { +	__select (Unknown,      "Unknown"  ); +	__select (VGA,          "VGA"      ); +	__select (DVII,         "DVI-I"    ); +	__select (DVID,         "DVI-D"    ); +	__select (DVIA,         "DVI-A"    ); +	__select (Composite,    "Composite"); +	__select (SVIDEO,       "SVIDEO"   ); +	__select (LVDS,         "LVDS"     ); +	__select (Component,    "Component"); +	__select (9PinDIN,      "DIN"      ); +	__select (DisplayPort,  "DP"       ); +	__select (HDMIA,        "HDMI-A"   ); +	__select (HDMIB,        "HDMI-B"   ); +	__select (TV,           "TV"       ); +	__select (eDP,          "eDP"      ); +	__select (VIRTUAL,      "VIRTUAL"  ); +	__select (DSI,          "DSI"      ); +	default: +		out->connector_type_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; +		out->connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; +		break; +	} +  #undef __select  }  /** - * Read information from the CRTC's conncetor. + * Read information from the CRTC's conncetor   *  - * @param   crtc       The state of the CRTC whose information should be read. - * @param   out        Instance of a data structure to fill with the information about the CRTC. - * @param   connector  The CRTC's connector. - * @param   fields     OR:ed identifiers for the information about the CRTC that should be read. - * @return             Non-zero if at least on error occured. + * @param   crtc       The state of the CRTC whose information should be read + * @param   out        Instance of a data structure to fill with the information about the CRTC + * @param   connector  The CRTC's connector + * @param   fields     OR:ed identifiers for the information about the CRTC that should be read + * @return             Non-zero if at least on error occured   */ -static int read_connector_data(libgamma_crtc_state_t* restrict crtc, libgamma_crtc_information_t* restrict out, -			       const drmModeConnector* restrict connector, int32_t fields) +static int +read_connector_data(libgamma_crtc_state_t *restrict crtc, libgamma_crtc_information_t *restrict out, +                    const drmModeConnector *restrict connector, int32_t fields)  { -  const char* connector_name_base = NULL; -   -  /* Get some information that does not require too much work. */ -  if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR))) -    { -      /* Get whether or not a monitor is plugged in. */ -      out->active = connector->connection == DRM_MODE_CONNECTED; -      out->active_error = connector->connection == DRM_MODE_UNKNOWNCONNECTION ? LIBGAMMA_STATE_UNKNOWN : 0; -      if (out->active == 0) -	{ -	  if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER))) -	    out->width_mm_error = out->height_mm_error = out->subpixel_order_error = LIBGAMMA_NOT_CONNECTED; -	  goto not_connected; +	const char *connector_name_base = NULL; +	libgamma_drm_card_data_t *restrict card; +	uint32_t type; +	size_t i, n, c; + +	/* Get some information that does not require too much work */ +	if (fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR)) { +		/* Get whether or not a monitor is plugged in */ +		out->active = connector->connection == DRM_MODE_CONNECTED; +		out->active_error = connector->connection == DRM_MODE_UNKNOWNCONNECTION ? LIBGAMMA_STATE_UNKNOWN : 0; +		if (!out->active) { +			if (fields & (LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER)) +				out->width_mm_error = out->height_mm_error = out->subpixel_order_error = LIBGAMMA_NOT_CONNECTED; +			goto not_connected; +		} + +		/* Get viewport dimension */ +		out->width_mm = connector->mmWidth; +		out->height_mm = connector->mmHeight; + +		/* Get subpixel order */ +		get_subpixel_order(out, connector); + +	not_connected: + +		/* Get connector type */ +		get_connector_type(out, connector, &connector_name_base);  	} -       -      /* Get viewport dimension. */ -      out->width_mm = connector->mmWidth; -      out->height_mm = connector->mmHeight; -       -      /* Get subpixel order. */ -      get_subpixel_order(out, connector); -       -    not_connected: -       -      /* Get connector type. */ -      get_connector_type(out, connector, &connector_name_base); -    } -   -  /* Get the connector's name. */ -  if ((fields & LIBGAMMA_CRTC_INFO_CONNECTOR_NAME) && (out->connector_name_error == 0)) -    { -      libgamma_drm_card_data_t* restrict card = crtc->partition->data; -      uint32_t type = connector->connector_type; -      size_t i, n = (size_t)(card->res->count_connectors), c = 0; -       -      /* Allocate memory for the name of the connector. */ -      out->connector_name = malloc((strlen(connector_name_base) + 12) * sizeof(char)); -      if (out->connector_name == NULL) -	return out->connector_name_error = errno; -       -      /* Get the number of connectors with the same type on the same graphics card. */ -      for (i = 0; (i < n) && (card->connectors[i] != connector); i++) -	if (card->connectors[i]->connector_type == type) -	  c++; -       -      /* Construct and store connect name that is unique to the graphics card. */ -      sprintf(out->connector_name, "%s-%" PRIu32, connector_name_base, (uint32_t)(c + 1)); -    } -   -  /* Did something go wrong? */ -  return out->subpixel_order_error | out->active_error | out->connector_name_error; + +	/* Get the connector's name */ +	if ((fields & LIBGAMMA_CRTC_INFO_CONNECTOR_NAME) && !out->connector_name_error) { +		card = crtc->partition->data; +		type = connector->connector_type; +		n = (size_t)card->res->count_connectors; + +		/* Allocate memory for the name of the connector */ +		out->connector_name = malloc((strlen(connector_name_base) + 12) * sizeof(char)); +		if (!out->connector_name) +			return (out->connector_name_error = errno); + +		/* Get the number of connectors with the same type on the same graphics card */ +		for (i = c = 0; i < n && card->connectors[i] != connector; i++) +			if (card->connectors[i]->connector_type == type) +				c++; + +		/* Construct and store connect name that is unique to the graphics card */ +		sprintf(out->connector_name, "%s-%" PRIu32, connector_name_base, (uint32_t)(c + 1)); +	} + +	/* Did something go wrong? */ +	return out->subpixel_order_error | out->active_error | out->connector_name_error;  }  /** - * Get the extended display identification data for a monitor. + * Get the extended display identification data for a monitor   *  - * @param   crtc       The CRTC state. - * @param   out        Instance of a data structure to fill with the information about the CRTC. - * @param   connector  The CRTC's connector. - * @reutnr             Non-zero on error. + * @param   crtc       The CRTC state + * @param   out        Instance of a data structure to fill with the information about the CRTC + * @param   connector  The CRTC's connector + * @reutnr             Non-zero on error   */ -static int get_edid(libgamma_crtc_state_t* restrict crtc, -		    libgamma_crtc_information_t* restrict out, drmModeConnector* connector) +static int +get_edid(libgamma_crtc_state_t *restrict crtc, libgamma_crtc_information_t *restrict out, drmModeConnector *connector)  { -  libgamma_drm_card_data_t* restrict card = crtc->partition->data; -  int prop_n = connector->count_props; -  int prop_i; -  drmModePropertyRes* restrict prop; -  drmModePropertyBlobRes* restrict blob; -   -  /* Test all properies on the connector. */ -  for (prop_i = 0; prop_i < prop_n; prop_i++) -    { -      /* Get output property, */ -      if ((prop = drmModeGetProperty(card->fd, connector->props[prop_i])) == NULL) -	continue; -      /* Is this property the EDID? */ -      if (!strcmp(prop->name, "EDID")) -	{ -	  /* Get the property value. */ -	  if ((blob = drmModeGetPropertyBlob(card->fd, (uint32_t)(connector->prop_values[prop_i]))) == NULL) -	    return drmModeFreeProperty(prop), out->edid_error = LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED; -	  if (blob->data != NULL) -	    { -	      /* Get and store the length of the EDID. */ -	      out->edid_length = blob->length; -	      /* Allocate memory for a copy of the EDID that is under our memory control. */ -	      if ((out->edid = malloc(out->edid_length * sizeof(unsigned char))) == NULL) -		out->edid_error = errno; -	      else -		/* Copy the EDID so we can free resources that got us here. */ -		memcpy(out->edid, blob->data, (size_t)(out->edid_length) * sizeof(char)); -	      /* Free the propriety value and the propery. */ -	      drmModeFreePropertyBlob(blob); -	      drmModeFreeProperty(prop); -	      /* Were we successful? */ -	      return out->edid == NULL; -	    } -	  /* Free the propriety value. */ -	  drmModeFreePropertyBlob(blob); +	libgamma_drm_card_data_t *restrict card = crtc->partition->data; +	int prop_n = connector->count_props; +	int prop_i; +	drmModePropertyRes *restrict prop; +	drmModePropertyBlobRes *restrict blob; + +	/* Test all properies on the connector */ +	for (prop_i = 0; prop_i < prop_n; prop_i++) { +		/* Get output property */ +		prop = drmModeGetProperty(card->fd, connector->props[prop_i]); +		if (!prop) +			continue; +		/* Is this property the EDID? */ +		if (!strcmp(prop->name, "EDID")) { +			/* Get the property value */ +			blob = drmModeGetPropertyBlob(card->fd, (uint32_t)connector->prop_values[prop_i]); +			if (!blob) { +				drmModeFreeProperty(prop); +				return (out->edid_error = LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED); +			} +			if (blob->data) { +				/* Get and store the length of the EDID */ +				out->edid_length = blob->length; +				/* Allocate memory for a copy of the EDID that is under our memory control */ +				out->edid = malloc(out->edid_length * sizeof(unsigned char)); +				if (!out->edid) { +					out->edid_error = errno; +				} else { +					/* Copy the EDID so we can free resources that got us here */ +					memcpy(out->edid, blob->data, (size_t)out->edid_length * sizeof(char)); +				} +				/* Free the propriety value and the propery */ +				drmModeFreePropertyBlob(blob); +				drmModeFreeProperty(prop); +				/* Were we successful? */ +				return !out->edid; +			} +			/* Free the propriety value */ +			drmModeFreePropertyBlob(blob); +		} +		/* Free the propriety */ +		drmModeFreeProperty(prop);  	} -      /* Free the propriety. */ -      drmModeFreeProperty(prop); -    } -  /* If we get here, we did not find a EDID. */ -  return out->edid_error = LIBGAMMA_EDID_NOT_FOUND; +	/* If we get here, we did not find a EDID */ +	return (out->edid_error = LIBGAMMA_EDID_NOT_FOUND);  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_linux_drm_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_linux_drm_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                        libgamma_crtc_state_t *restrict crtc, int32_t fields)  { -#define _E(FIELD)  ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) -  int e = 0; -  drmModeConnector* restrict connector; -  int require_connector; -  int free_edid; -  int error; -   -   -  /* Wipe all error indicators. */ -  memset(this, 0, sizeof(libgamma_crtc_information_t)); -   -  /* We need to free the EDID after us if it is not explicitly requested.  */ -  free_edid = (fields & LIBGAMMA_CRTC_INFO_EDID) == 0; -   -  /* Figure out whether we require the connector to get all information we want. */ -  require_connector = fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR); -   -  /* If we are not interested in the connector or monitor, jump. */ -  if (require_connector == 0) -    goto cont; -  /* Find connector. */ -  if ((connector = find_connector(crtc, &error)) == NULL) -    { -      /* Store reported error in affected fields. */ -      e |= this->width_mm_error       = this->height_mm_error -	 = this->connector_type_error = this->subpixel_order_error -	 = this->active_error         = this->connector_name_error -	 = this->edid_error           = this->gamma_error -	 = this->width_mm_edid_error  = this->height_mm_edid_error = error; -      goto cont; -    } -   -  /* Read connector data and monitor data, excluding EDID.. */ -  e |= read_connector_data(crtc, this, connector, fields); -   -  /* If we do not want any EDID information, jump. */ -  if ((fields & LIBGAMMA_CRTC_INFO_MACRO_EDID) == 0) -    goto cont; -  /* If there is not monitor that report error in EDID related fields. */ -  if (this->active_error || (this->active == 0)) -    { -      e |= this->edid_error = this->gamma_error -	 = this->width_mm_edid_error = this->height_mm_edid_error -	 = LIBGAMMA_NOT_CONNECTED; -      goto cont; -    } -  /* Get EDID. */ -  e |= get_edid(crtc, this, connector); -  if (this->edid == NULL) -    { -      this->gamma_error = this->width_mm_edid_error = this->height_mm_edid_error = this->edid_error; -      goto cont; -    } -  /* Parse EDID. */ -  if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID))) -    e |= libgamma_parse_edid(this, fields); -   - cont: -  /* Get gamma ramp size. */ -  e |= (fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE) ? get_gamma_ramp_size(this, crtc) : 0; -  /* Store gamma ramp depth. */ -  this->gamma_depth = 16; -  /* DRM does not support quering gamma ramp support. */ -  e |= this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); -   -  /* Free the EDID after us. */ -  if (free_edid) -    { -      free(this->edid); -      this->edid = NULL; -    } -   -  return e ? -1 : 0; +#define _E(FIELD) ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) + +	int e = 0, require_connector, free_edid, error; +	drmModeConnector *restrict connector; + +	/* Wipe all error indicators */ +	memset(this, 0, sizeof(libgamma_crtc_information_t)); + +	/* We need to free the EDID after us if it is not explicitly requested */ +	free_edid = !(fields & LIBGAMMA_CRTC_INFO_EDID); + +	/* Figure out whether we require the connector to get all information we want */ +	require_connector = fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR); + +	/* If we are not interested in the connector or monitor, jump */ +	if (!require_connector) +		goto cont; +	/* Find connector. */ +	connector = find_connector(crtc, &error); +	if (!connector) { +		/* Store reported error in affected fields */ +		e |= this->width_mm_error       = this->height_mm_error +		   = this->connector_type_error = this->subpixel_order_error +		   = this->active_error         = this->connector_name_error +		   = this->edid_error           = this->gamma_error +		   = this->width_mm_edid_error  = this->height_mm_edid_error = error; +		goto cont; +	} + +	/* Read connector data and monitor data, excluding EDID */ +	e |= read_connector_data(crtc, this, connector, fields); + +	/* If we do not want any EDID information, jump */ +	if (!(fields & LIBGAMMA_CRTC_INFO_MACRO_EDID)) +		goto cont; +	/* If there is not monitor that report error in EDID related fields */ +	if (this->active_error || !this->active) { +		e |= this->edid_error = this->gamma_error +		   = this->width_mm_edid_error = this->height_mm_edid_error +		   = LIBGAMMA_NOT_CONNECTED; +		goto cont; +	} +	/* Get EDID */ +	e |= get_edid(crtc, this, connector); +	if (!this->edid) { +		this->gamma_error = this->width_mm_edid_error = this->height_mm_edid_error = this->edid_error; +		goto cont; +	} +	/* Parse EDID */ +	if (fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID)) +		e |= libgamma_parse_edid(this, fields); + +cont: +	/* Get gamma ramp size */ +	e |= (fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE) ? get_gamma_ramp_size(this, crtc) : 0; +	/* Store gamma ramp depth */ +	this->gamma_depth = 16; +	/* DRM does not support quering gamma ramp support */ +	e |= this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); + +	/* Free the EDID after us */ +	if (free_edid) { +		free(this->edid); +		this->edid = NULL; +	} + +	return e ? -1 : 0; +  #undef _E  }  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_linux_drm_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t* restrict ramps) +int +libgamma_linux_drm_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t *restrict ramps)  { -  libgamma_drm_card_data_t* restrict card = this->partition->data; -  int r; +	libgamma_drm_card_data_t *restrict card = this->partition->data; +	int r;  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps->red_size != ramps->green_size) || -      (ramps->red_size != ramps->blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps->red_size != ramps->green_size || ramps->red_size != ramps->blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -  /* Read current gamma ramps. */ -  r = drmModeCrtcGetGamma(card->fd, (uint32_t)(size_t)(this->data), (uint32_t)(ramps->red_size), -			  ramps->red, ramps->green, ramps->blue); -  return r ? LIBGAMMA_GAMMA_RAMP_READ_FAILED : 0; +	/* Read current gamma ramps */ +	r = drmModeCrtcGetGamma(card->fd, (uint32_t)(size_t)this->data, (uint32_t)ramps->red_size, +				ramps->red, ramps->green, ramps->blue); +	return r ? LIBGAMMA_GAMMA_RAMP_READ_FAILED : 0;  }  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_linux_drm_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t ramps) +int +libgamma_linux_drm_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t ramps)  { -  libgamma_drm_card_data_t* restrict card = this->partition->data; -  int r; +	libgamma_drm_card_data_t *restrict card = this->partition->data; +	int r;  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps.red_size != ramps.green_size) || -      (ramps.red_size != ramps.blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps.red_size != ramps.green_size || ramps.red_size != ramps.blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -   -  /* Apply gamma ramps. */ -  r = drmModeCrtcSetGamma(card->fd, (uint32_t)(size_t)(this->data), -			  (uint32_t)(ramps.red_size), ramps.red, ramps.green, ramps.blue); -  /* Check for errors. */ -  if (r) -    switch (errno) -      { -      case EACCES: -      case EAGAIN: -      case EIO: -	/* Permission denied errors must be ignored, because we do not -	 * have permission to do this while a display server is active. -	 * We are also checking for some other error codes just in case. */ -      case EBUSY: -      case EINPROGRESS: -	/* It is hard to find documentation for DRM (in fact all of this is -	 * just based on the functions names and some testing,) perhaps we -	 * could get this if we are updating to fast. */ -	break; -      case EBADF: -      case ENODEV: -      case ENXIO: -	/* XXX: I have not actually tested removing my graphics card or, -	 *      monitor but I imagine either of these is what would happen. */ -	return LIBGAMMA_GRAPHICS_CARD_REMOVED; -      default: -	return LIBGAMMA_ERRNO_SET; -      } -  return 0; -} +	/* Apply gamma ramps */ +	r = drmModeCrtcSetGamma(card->fd, (uint32_t)(size_t)this->data, +	                        (uint32_t)ramps.red_size, ramps.red, ramps.green, ramps.blue); +  /* Check for errors */ +	if (r) { +		switch (errno) { +		case EACCES: +		case EAGAIN: +		case EIO: +			/* Permission denied errors must be ignored, because we do not +			 * have permission to do this while a display server is active. +			 * We are also checking for some other error codes just in case. */ +		case EBUSY: +		case EINPROGRESS: +			/* It is hard to find documentation for DRM (in fact all of this is +			 * just based on the functions names and some testing,) perhaps we +			 * could get this if we are updating to fast. */ +			break; +		case EBADF: +		case ENODEV: +		case ENXIO: +			/* XXX: I have not actually tested removing my graphics card or, +			 *      monitor but I imagine either of these is what would happen. */ +			return LIBGAMMA_GRAPHICS_CARD_REMOVED; +		default: +			return LIBGAMMA_ERRNO_SET; +		} +	} +	return 0; +} diff --git a/src/lib/gamma-linux-drm.h b/src/lib/gamma-linux-drm.h index ee037bc..41a654d 100644 --- a/src/lib/gamma-linux-drm.h +++ b/src/lib/gamma-linux-drm.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_LINUX_DRM_H  #define LIBGAMMA_GAMMA_LINUX_DRM_H @@ -27,16 +11,16 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -44,119 +28,112 @@ void libgamma_linux_drm_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_linux_drm_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site); +int libgamma_linux_drm_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_linux_drm_site_destroy(libgamma_site_state_t* restrict this) __attribute__((const)); +void libgamma_linux_drm_site_destroy(libgamma_site_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_linux_drm_site_restore(libgamma_site_state_t* restrict this); +int libgamma_linux_drm_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_linux_drm_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition); +int libgamma_linux_drm_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_linux_drm_partition_destroy(libgamma_partition_state_t* restrict this); +void libgamma_linux_drm_partition_destroy(libgamma_partition_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_linux_drm_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_linux_drm_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. + * @param   this       The CRTC state to initialise   * @param   partition  The partition state for the partition that the CRTC belongs to - * @param   crtc       The the index of the CRTC within the site. + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_linux_drm_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc); +int libgamma_linux_drm_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_linux_drm_crtc_destroy(libgamma_crtc_state_t* restrict this) __attribute__((const)); +void libgamma_linux_drm_crtc_destroy(libgamma_crtc_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_linux_drm_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_linux_drm_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_linux_drm_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_linux_drm_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_linux_drm_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_linux_drm_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_linux_drm_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t ramps); +int libgamma_linux_drm_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t);  #endif - diff --git a/src/lib/gamma-quartz-cg.c b/src/lib/gamma-quartz-cg.c index d2ceebc..b0e3a29 100644 --- a/src/lib/gamma-quartz-cg.c +++ b/src/lib/gamma-quartz-cg.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS  # error Compiling gamma-quartz-cg.c without HAVE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS  #endif @@ -28,7 +12,7 @@  #else  # include <ApplicationServices/ApplicationServices.h>  # include <CoreGraphics/CGDirectDisplay.h> -# define close_fake_quartz_cg() /* For compatibility with "fake-quartz-cg.h". */ +# define close_fake_quartz_cg() /* For compatibility with "fake-quartz-cg.h" */  #endif  #include <stdlib.h> @@ -36,56 +20,56 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t* restrict this) +void +libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t* restrict this)  { -  /* Gamma ramps size and depth can be queried. */ -  this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE -			 | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; -  /* Quartz/CoreGraphics does not support sites or partitions. */ -  this->default_site_known = 1; -  this->multiple_sites = 0; -  this->multiple_partitions = 0; -  /* Quartz/CoreGraphics does support CRTC:s. */ -  this->multiple_crtcs = 1; -  /* Partitions are not support... */ -  this->partitions_are_graphics_cards = 0; -  /* CoreGraphics have support for system restore. */ -  this->site_restore = 1; -  this->partition_restore = 1; -  /* But not for individual CRTC:s. */ -  this->crtc_restore = 0; -  /* Gamma ramp sizes are identifical but not fixed. */ -  this->identical_gamma_sizes = 1; -  this->fixed_gamma_size = 0; -  /* Gamma ramp depths are fixed. */ -  this->fixed_gamma_depth = 1; -  /* Quartz/CoreGraphics is a real adjustment method that can be faked. */ +	/* Gamma ramps size and depth can be queried */ +	this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; +	/* Quartz/CoreGraphics does not support sites or partitions */ +	this->default_site_known = 1; +	this->multiple_sites = 0; +	this->multiple_partitions = 0; +	/* Quartz/CoreGraphics does support CRTC:s */ +	this->multiple_crtcs = 1; +	/* Partitions are not supported... */ +	this->partitions_are_graphics_cards = 0; +	/* CoreGraphics have support for system restore */ +	this->site_restore = 1; +	this->partition_restore = 1; +	/* But not for individual CRTC:s */ +	this->crtc_restore = 0; +	/* Gamma ramp sizes are identifical but not fixed */ +	this->identical_gamma_sizes = 1; +	this->fixed_gamma_size = 0; +	/* Gamma ramp depths are fixed */ +	this->fixed_gamma_depth = 1; +	/* Quartz/CoreGraphics is a real adjustment method that can be faked */  #ifdef FAKE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS -  /* It is considered real but fake if it is translated to X RandR. */ -  this->fake = 1; +	/* It is considered real but fake if it is translated to X RandR */ +	this->fake = 1;  # ifdef HAVE_LIBGAMMA_METHOD_X_RANDR -  this->real = 1; +	this->real = 1;  # else -  this->real = 0; +	this->real = 0;  # endif  #else -  /* It is real and not fake if we are running on Mac OS X. */ -  this->fake = 0; -  this->real = 1; +	/* It is real and not fake if we are running on Mac OS X */ +	this->fake = 0; +	this->real = 1;  #endif -  /* Gamma ramp adjustments are non-persistent. */ -  this->auto_restore = 1; +	/* Gamma ramp adjustments are non-persistent */ +	this->auto_restore = 1;  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -93,274 +77,283 @@ void libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_quartz_cg_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site) +int +libgamma_quartz_cg_site_initialise(libgamma_site_state_t *restrict this, char *restrict site)  { -  this->partitions_available = 1; -  return site != NULL ? LIBGAMMA_NO_SUCH_SITE : 0; +	this->partitions_available = 1; +	return site ? 0 : LIBGAMMA_NO_SUCH_SITE;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_quartz_cg_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_quartz_cg_site_destroy(libgamma_site_state_t *restrict this)  { -  (void) this; -  close_fake_quartz_cg(); +	(void) this; +	close_fake_quartz_cg();  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_quartz_cg_site_restore(libgamma_site_state_t *restrict this)  { -  (void) this; -  CGDisplayRestoreColorSyncSettings(); -  return 0; +	(void) this; +	CGDisplayRestoreColorSyncSettings(); +	return 0;  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_quartz_cg_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_quartz_cg_partition_initialise(libgamma_partition_state_t *restrict this, +                                       libgamma_site_state_t *restrict site, size_t partition)  { -  uint32_t cap = 4, n; -  CGDirectDisplayID* crtcs; -  CGDirectDisplayID* crtcs_old; -   -  (void) site; -   -  this->data = NULL; -   -  if (partition != 0) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -  /* Allocate array of CRTC ID:s. */ -  if ((crtcs = malloc((size_t)cap * sizeof(CGDirectDisplayID))) == NULL) -    return LIBGAMMA_ERRNO_SET; -   -  /* It is not possible to ask CoreGraphics how many CRTC:s -     are available. We have to ask it to give us a ID:s of -     a number of CRTC:s and ask for more if we got as many -     as we asked for. */ -  for (;;) -    { -      /* Ask for CRTC ID:s */ -      if (CGGetOnlineDisplayList(cap, crtcs, &n) != kCGErrorSuccess) -	return free(crtcs), LIBGAMMA_LIST_CRTCS_FAILED; -      /* If we did not get as many as we asked for then we have all. */ -      if (n < cap) -	break; -      /* Increase the number CRTC ID:s to ask for. */ -      if ((cap <<= 1) == 0) /* We could also test ~0, but it is still too many. */ -	return free(crtcs), LIBGAMMA_IMPOSSIBLE_AMOUNT; -      /* Grow the array of CRTC ID:s so that it can fit all we are asking for. */ -      if ((crtcs = realloc(crtcs_old = crtcs, (size_t)cap * sizeof(CGDirectDisplayID))) == NULL) -	return free(crtcs_old), LIBGAMMA_ERRNO_SET; -    } -   -  /* Store CRTC ID:s and CRTC count. */ -  this->data = crtcs; -  this->crtcs_available = (size_t)n; -  return 0; +	CGDirectDisplayID *crtcs, *crtcs_old; +	uint32_t cap = 4, n; + +	(void) site; + +	this->data = NULL; + +	if (partition) +		return LIBGAMMA_NO_SUCH_PARTITION; + +	/* Allocate array of CRTC ID:s */ +	crtcs = malloc((size_t)cap * sizeof(CGDirectDisplayID)); +	if (!crtcs) +		return LIBGAMMA_ERRNO_SET; + +	/* It is not possible to ask CoreGraphics how many CRTC:s are +	 * available. We have to ask it to give us a ID:s of a number +	 * of CRTC:s and ask for more if we got as many as we asked for. */ +	for (;;) { +		/* Ask for CRTC ID:s */ +		if (CGGetOnlineDisplayList(cap, crtcs, &n) != kCGErrorSuccess) +			return free(crtcs), LIBGAMMA_LIST_CRTCS_FAILED; +		/* If we did not get as many as we asked for then we have all */ +		if (n < cap) +			break; +		/* Increase the number CRTC ID:s to ask for */ +		if (cap > SIZE_MAX / 2) /* We could also test ~0, but it is still too many */ +			return free(crtcs), LIBGAMMA_IMPOSSIBLE_AMOUNT; +		cap <<= 1; +		/* Grow the array of CRTC ID:s so that it can fit all we are asking for */ +		crtcs = realloc(crtcs_old = crtcs, (size_t)cap * sizeof(CGDirectDisplayID)); +		if (!crtcs) { +			free(crtcs_old); +			return LIBGAMMA_ERRNO_SET; +		} +	} + +	/* Store CRTC ID:s and CRTC count */ +	this->data = crtcs; +	this->crtcs_available = (size_t)n; +	return 0;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_quartz_cg_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_quartz_cg_partition_destroy(libgamma_partition_state_t *restrict this)  { -  free(this->data); +	free(this->data);  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_quartz_cg_partition_restore(libgamma_partition_state_t *restrict this)  { -  return libgamma_quartz_cg_site_restore(this->site); +	return libgamma_quartz_cg_site_restore(this->site);  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_quartz_cg_crtc_initialise(libgamma_crtc_state_t *restrict this, +                                   libgamma_partition_state_t *restrict partition, size_t crtc)  { -  (void) this; -  return crtc >= partition->crtcs_available ? LIBGAMMA_NO_SUCH_CRTC : 0; +	(void) this; +	return crtc < partition->crtcs_available ? 0 : LIBGAMMA_NO_SUCH_CRTC;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_quartz_cg_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_quartz_cg_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_quartz_cg_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read   * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @return          Zero on success, -1 on error. On error refer to the error reports in `this`   */ -int libgamma_quartz_cg_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_quartz_cg_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                        libgamma_crtc_state_t *restrict crtc, int32_t fields)  { -#define SUPPORTED_FIELDS  (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH) -#define _E(FIELD)  ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) -   -  /* Quartz/CoreGraphics does not support EDID or monitor dimensions. */ -  this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); -  this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); -  this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); -  this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); -  this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); -  /* Quartz/CoreGraphics does support gamma ramp size query. -     The gamma ramps are identical but not fixed, and the query can fail. */ -  this->gamma_size_error = 0; -  if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) -    { -      CGDirectDisplayID* restrict crtcs = crtc->partition->data; -      size_t gamma_size = CGDisplayGammaTableCapacity(crtcs[crtc->crtc]); -      this->red_gamma_size = this->green_gamma_size = this->blue_gamma_size = (size_t)gamma_size; -      this->gamma_size_error = gamma_size < 2 ? LIBGAMMA_SINGLETON_GAMMA_RAMP : 0; -    } -  /* Quartz/CoreGraphics uses `float` ramps. */ -  this->gamma_depth = -1; -  this->gamma_depth_error = 0; -  /* Quartz/CoreGraphics does not support gamma ramp support queries. */ -  this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); -  /* Quartz/CoreGraphics does not support EDID or connector information. */ -  this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); -  this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); -  this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); -  this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); -  this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); -   -  /* We failed if gamma ramp size query failed or if an unsupport field was queried. */ -  return this->gamma_size_error || (fields & ~SUPPORTED_FIELDS) ? -1 : 0; -   +#define SUPPORTED_FIELDS (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH) +#define _E(FIELD)        ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) + +	CGDirectDisplayID *restrict crtcs; +	size_t gamma_size; + +	/* Quartz/CoreGraphics does not support EDID or monitor dimensions */ +	this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); +	this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); +	this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); +	this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); +	this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); +	/* Quartz/CoreGraphics does support gamma ramp size query +	   The gamma ramps are identical but not fixed, and the query can fail */ +	this->gamma_size_error = 0; +	if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) { +		crtcs = crtc->partition->data; +		gamma_size = CGDisplayGammaTableCapacity(crtcs[crtc->crtc]); +		this->red_gamma_size = this->green_gamma_size = this->blue_gamma_size = (size_t)gamma_size; +		this->gamma_size_error = gamma_size < 2 ? LIBGAMMA_SINGLETON_GAMMA_RAMP : 0; +	} +	/* Quartz/CoreGraphics uses `float` ramps */ +	this->gamma_depth = -1; +	this->gamma_depth_error = 0; +	/* Quartz/CoreGraphics does not support gamma ramp support queries */ +	this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); +	/* Quartz/CoreGraphics does not support EDID or connector information */ +	this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); +	this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); +	this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); +	this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); +	this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); + +	/* We failed if gamma ramp size query failed or if an unsupport field was queried */ +	return (this->gamma_size_error || (fields & ~SUPPORTED_FIELDS)) ? -1 : 0; +  #undef _E  #undef SUPPORTED_FIELDS  }  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_get_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					     libgamma_gamma_rampsf_t* restrict ramps) +int +libgamma_quartz_cg_crtc_get_gamma_rampsf(libgamma_crtc_state_t *restrict this, libgamma_gamma_rampsf_t *restrict ramps)  { -  CGDirectDisplayID* restrict crtcs = this->partition->data; -  CGDirectDisplayID crtc_id = crtcs[this->crtc]; -  uint32_t gamma_size_out; -  CGError r; +	CGDirectDisplayID *restrict crtcs = this->partition->data; +	CGDirectDisplayID crtc_id = crtcs[this->crtc]; +	uint32_t gamma_size_out; +	CGError r;  #ifdef DEBUG -  /* Gamma ramps sizes are identical but not fixed. */ -  if ((ramps->red_size != ramps->green_size) || -      (ramps->red_size != ramps->blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramps sizes are identical but not fixed */ +	if (ramps->red_size != ramps->green_size || ramps->red_size != ramps->blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -  /* Read current gamma ramps. */ -  r = CGGetDisplayTransferByTable(crtc_id, (uint32_t)(ramps->red_size), -				  ramps->red, ramps->green, ramps->blue, &gamma_size_out); -  if (r != kCGErrorSuccess) -    return LIBGAMMA_GAMMA_RAMP_READ_FAILED; -  /* I hope that it will not actually ever change, -     but it does return the the gamma ramp size despite -     that it can be queried without querying for more. */ -  if (gamma_size_out != ramps->red_size) -    return LIBGAMMA_GAMMA_RAMP_SIZE_CHANGED; -  return 0; +	/* Read current gamma ramps */ +	r = CGGetDisplayTransferByTable(crtc_id, (uint32_t)ramps->red_size, ramps->red, ramps->green, ramps->blue, &gamma_size_out); +	if (r != kCGErrorSuccess) +		return LIBGAMMA_GAMMA_RAMP_READ_FAILED; +	/* I hope that it will not actually ever change, +	   but it does return the the gamma ramp size despite +	   that it can be queried without querying for more */ +	if (gamma_size_out != ramps->red_size) +		return LIBGAMMA_GAMMA_RAMP_SIZE_CHANGED; +	return 0;  }  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_set_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					     libgamma_gamma_rampsf_t ramps) +int +libgamma_quartz_cg_crtc_set_gamma_rampsf(libgamma_crtc_state_t *restrict this, libgamma_gamma_rampsf_t ramps)  { -  CGDirectDisplayID* restrict crtcs = this->partition->data; -  CGDirectDisplayID crtc_id = crtcs[this->crtc]; -  CGError r; +	CGDirectDisplayID *restrict crtcs = this->partition->data; +	CGDirectDisplayID crtc_id = crtcs[this->crtc]; +	CGError r;  #ifdef DEBUG -  /* Gamma ramps sizes are identical but not fixed. */ -  if ((ramps.red_size != ramps.green_size) || -      (ramps.red_size != ramps.blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramps sizes are identical but not fixed */ +	if (ramps.red_size != ramps.green_size || ramps.red_size != ramps.blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -  /* Apply gamma ramps. */ -  r = CGSetDisplayTransferByTable(crtc_id, (uint32_t)(ramps.red_size), -				  ramps.red, ramps.green, ramps.blue); -  return r == kCGErrorSuccess ? 0 : LIBGAMMA_GAMMA_RAMP_WRITE_FAILED; +	/* Apply gamma ramps */ +	r = CGSetDisplayTransferByTable(crtc_id, (uint32_t)ramps.red_size, ramps.red, ramps.green, ramps.blue); +	return r == kCGErrorSuccess ? 0 : LIBGAMMA_GAMMA_RAMP_WRITE_FAILED;  } - diff --git a/src/lib/gamma-quartz-cg.h b/src/lib/gamma-quartz-cg.h index 43b9bb3..211e055 100644 --- a/src/lib/gamma-quartz-cg.h +++ b/src/lib/gamma-quartz-cg.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_QUARTZ_CG_H  #define LIBGAMMA_GAMMA_QUARTZ_CG_H @@ -27,16 +11,16 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -44,119 +28,113 @@ void libgamma_quartz_cg_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_quartz_cg_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site); +int libgamma_quartz_cg_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_quartz_cg_site_destroy(libgamma_site_state_t* restrict this); +void libgamma_quartz_cg_site_destroy(libgamma_site_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_site_restore(libgamma_site_state_t* restrict this); +int libgamma_quartz_cg_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to   * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_quartz_cg_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition); +int libgamma_quartz_cg_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_quartz_cg_partition_destroy(libgamma_partition_state_t* restrict this); +void libgamma_quartz_cg_partition_destroy(libgamma_partition_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_quartz_cg_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc) __attribute__((pure)); +__attribute__((pure)) +int libgamma_quartz_cg_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_quartz_cg_crtc_destroy(libgamma_crtc_state_t* restrict this) __attribute__((const)); +void libgamma_quartz_cg_crtc_destroy(libgamma_crtc_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_quartz_cg_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error. On error refer to the error reports in `this`   */ -int libgamma_quartz_cg_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_quartz_cg_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_get_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					     libgamma_gamma_rampsf_t* restrict ramps); +int libgamma_quartz_cg_crtc_get_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t *restrict);  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_quartz_cg_crtc_set_gamma_rampsf(libgamma_crtc_state_t* restrict this, -					     libgamma_gamma_rampsf_t ramps); +int libgamma_quartz_cg_crtc_set_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t);  #endif - diff --git a/src/lib/gamma-w32-gdi.c b/src/lib/gamma-w32-gdi.c index f9c8094..e93b53d 100644 --- a/src/lib/gamma-w32-gdi.c +++ b/src/lib/gamma-w32-gdi.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_W32_GDI  # error Compiling gamma-w32-gdi.c without HAVE_LIBGAMMA_METHOD_W32_GDI  #endif @@ -24,7 +8,7 @@  #include "libgamma-error.h"  #ifndef WINVER -# define WINVER  0x0500 +# define WINVER 0x0500  #endif  #ifdef FAKE_LIBGAMMA_METHOD_W32_GDI  # include "fake-w32-gdi.h" @@ -37,62 +21,62 @@  /** - * The gamma ramp size that devices will always have in Windows GDI. + * The gamma ramp size that devices will always have in Windows GDI   *    * @see  http://msdn.microsoft.com/en-us/library/windows/desktop/dd372194(v=vs.85).aspx   */ -#define GAMMA_RAMP_SIZE  256 +#define GAMMA_RAMP_SIZE 256  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t* restrict this) +void +libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t *restrict this)  { -  /* Gamma ramps size, depth and support can be queried. */ -  this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE -			 | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; -  /* Windows GDI does not support sites or partitions. */ -  this->default_site_known = 1; -  this->multiple_sites = 0; -  this->multiple_partitions = 0; -  /* Windows GDI does support CRTC:s. */ -  this->multiple_crtcs = 1; -  /* Partitions are not support... */ -  this->partitions_are_graphics_cards = 0; -  /* Windows GDI does not have system restore capabilities. */ -  this->site_restore = 0; -  this->partition_restore = 0; -  this->crtc_restore = 0; -  /* Ramps sizes are fixed and identical and ramp depth is too. */ -  this->identical_gamma_sizes = 1; -  this->fixed_gamma_size = 1; -  this->fixed_gamma_depth = 1; -  /* Windows GDI is a real adjustment method that can be faked. */ +	/* Gamma ramps size, depth and support can be queried */ +	this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; +	/* Windows GDI does not support sites or partitions */ +	this->default_site_known = 1; +	this->multiple_sites = 0; +	this->multiple_partitions = 0; +	/* Windows GDI does support CRTC:s */ +	this->multiple_crtcs = 1; +	/* Partitions are not supported... */ +	this->partitions_are_graphics_cards = 0; +	/* Windows GDI does not have system restore capabilities */ +	this->site_restore = 0; +	this->partition_restore = 0; +	this->crtc_restore = 0; +	/* Ramps sizes are fixed and identical and ramp depth is too */ +	this->identical_gamma_sizes = 1; +	this->fixed_gamma_size = 1; +	this->fixed_gamma_depth = 1; +	/* Windows GDI is a real adjustment method that can be faked */  #ifdef FAKE_LIBGAMMA_METHOD_W32_GDI -  /* It is considered real but fake if it is translated to X RandR. */ -  this->fake = 1; +	/* It is considered real but fake if it is translated to X RandR */ +	this->fake = 1;  # ifdef HAVE_LIBGAMMA_METHOD_X_RANDR -  this->real = 1; +	this->real = 1;  # else -  this->real = 0; +	this->real = 0;  # endif  #else -  /* It is real and not fake if we are running on Windows. */ -  this->fake = 0; -  this->real = 1; +	/* It is real and not fake if we are running on Windows */ +	this->fake = 0; +	this->real = 1;  #endif -  /* Gamma ramp adjustments are persistent. */ -  this->auto_restore = 0; +	/* Gamma ramp adjustments are persistent */ +	this->auto_restore = 0;  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -100,266 +84,277 @@ void libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t* restri   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_w32_gdi_site_initialise(libgamma_site_state_t* restrict this, -				     char* restrict site) +int +libgamma_w32_gdi_site_initialise(libgamma_site_state_t *restrict this, char* restrict site)  { -  this->partitions_available = 1; -  return site != NULL ? LIBGAMMA_NO_SUCH_SITE : 0; +	this->partitions_available = 1; +	return !site ? 0 : LIBGAMMA_NO_SUCH_SITE;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_w32_gdi_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_w32_gdi_site_destroy(libgamma_site_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_w32_gdi_site_restore(libgamma_site_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_w32_gdi_partition_initialise(libgamma_partition_state_t* restrict this, -					  libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_w32_gdi_partition_initialise(libgamma_partition_state_t *restrict this, +                                      libgamma_site_state_t *restrict site, size_t partition)  { -  DWORD n = 0; -  DISPLAY_DEVICE display; -   -  (void) site; -   -  if (partition != 0) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -  /* Count CRTC:s by iteration over all possible identifiers -     until we reach on that does not exist. */ -  display.cb = sizeof(DISPLAY_DEVICE); -  while (EnumDisplayDevices(NULL, n, &display, 0)) -    if (n++, n == 0) -      return LIBGAMMA_IMPOSSIBLE_AMOUNT; -  this->crtcs_available = (size_t)n; -  return 0; +	DWORD n = 0; +	DISPLAY_DEVICE display; + +	(void) site; + +	if (partition) +		return LIBGAMMA_NO_SUCH_PARTITION; + +	/* Count CRTC:s by iteration over all possible identifiers +	   until we reach on that does not exist */ +	display.cb = sizeof(DISPLAY_DEVICE); +	while (EnumDisplayDevices(NULL, n, &display, 0)) +		if (n++ == UINT32_MAX) +			return LIBGAMMA_IMPOSSIBLE_AMOUNT; +	this->crtcs_available = (size_t)n; +	return 0;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_w32_gdi_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_w32_gdi_partition_destroy(libgamma_partition_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_w32_gdi_partition_restore(libgamma_partition_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_initialise(libgamma_crtc_state_t* restrict this, -				     libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_w32_gdi_crtc_initialise(libgamma_crtc_state_t *restrict this, +                                 libgamma_partition_state_t *restrict partition, size_t crtc)  { -  DISPLAY_DEVICE display; -  HDC context; -   -  (void) partition; -   -  this->data = NULL; -   -  /* Windows's API mandates this... */ -  display.cb = sizeof(DISPLAY_DEVICE); -  /* Get identifier for selected CRTC. */ -  if (!EnumDisplayDevices(NULL, (DWORD)crtc, &display, 0)) -    return LIBGAMMA_NO_SUCH_CRTC; -  /* Check that the connector is enabled, -   * newer versions of Windows will always pass. -   * (According to w32's documentation, but that -   * that is a load of crap.)*/ -  if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE)) -    return LIBGAMMA_CONNECTOR_DISABLED; -  /* Acquire CRTC connection. */ -  context = CreateDC(TEXT("DISPLAY"), display.DeviceName, NULL, NULL); -  if (context == NULL) -    return LIBGAMMA_OPEN_CRTC_FAILED; -  this->data = context; -  return 0; +	DISPLAY_DEVICE display; +	HDC context; + +	(void) partition; + +	this->data = NULL; + +	/* Windows's API mandates this... */ +	display.cb = sizeof(DISPLAY_DEVICE); +	/* Get identifier for selected CRTC */ +	if (!EnumDisplayDevices(NULL, (DWORD)crtc, &display, 0)) +		return LIBGAMMA_NO_SUCH_CRTC; +	/* Check that the connector is enabled, +	 * newer versions of Windows will always pass. +	 * (According to w32's documentation, but that +	 * that is a load of crap) */ +	if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE)) +		return LIBGAMMA_CONNECTOR_DISABLED; +	/* Acquire CRTC connection. */ +	context = CreateDC(TEXT("DISPLAY"), display.DeviceName, NULL, NULL); +	if (!context) +		return LIBGAMMA_OPEN_CRTC_FAILED; +	this->data = context; +	return 0;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_w32_gdi_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_w32_gdi_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  if (this->data) -    ReleaseDC(NULL, this->data); +	if (this->data) +		ReleaseDC(NULL, this->data);  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_w32_gdi_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read   * @param   fields  OR:ed identifiers for the information about the CRTC that should be read - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @return          Zero on success, -1 on error. On error refer to the error reports in `this`   */ -int libgamma_w32_gdi_get_crtc_information(libgamma_crtc_information_t* restrict this, -					  libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_w32_gdi_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                      libgamma_crtc_state_t *restrict crtc, int32_t fields)  { -#define KNOWN_FIELDS  (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH) -#define _E(FIELD)  ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) -   -  (void) crtc; -   -  /* Windows GDI does not support EDID or monitor dimensions. */ -  this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); -  this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); -  this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); -  this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); -  this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); -  /* Windows GDI have fixed gamma ramp sizes. */ -  this->red_gamma_size = GAMMA_RAMP_SIZE; -  this->green_gamma_size = GAMMA_RAMP_SIZE; -  this->blue_gamma_size = GAMMA_RAMP_SIZE; -  this->gamma_size_error = 0; -  /* Windows GDI have fixed gamma ramp depth. */ -  this->gamma_depth = 16; -  this->gamma_depth_error = 0; -  /* It is possible to query Windows GDI whether the device -     have gamma ramp support. It cannot fail. However, I think -     the result is incorrect if multiple monitors are active, -     so we cannot include this. */ -  /* -  if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT)) -    this->gamma_support = GetDeviceCaps(crtc->data, COLORMGMTCAPS) == CM_GAMMA_RAMP; -  this->gamma_support_error = 0; -  */ -  this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); -  /* Windows GDI does not support EDID or connector information. */ -  this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); -  this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); -  this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); -  this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); -  this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); -   -  /* There was a failure if and only if unsupport field was requested. */ -  return (fields & ~KNOWN_FIELDS) ? -1 : 0; -   +#define KNOWN_FIELDS (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH) +#define _E(FIELD)    ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) + +	(void) crtc; + +	/* Windows GDI does not support EDID or monitor dimensions */ +	this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); +	this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); +	this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); +	this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); +	this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); +	/* Windows GDI have fixed gamma ramp sizes */ +	this->red_gamma_size = GAMMA_RAMP_SIZE; +	this->green_gamma_size = GAMMA_RAMP_SIZE; +	this->blue_gamma_size = GAMMA_RAMP_SIZE; +	this->gamma_size_error = 0; +	/* Windows GDI have fixed gamma ramp depth */ +	this->gamma_depth = 16; +	this->gamma_depth_error = 0; +	/* It is possible to query Windows GDI whether the device +	   have gamma ramp support. It cannot fail. However, I think +	   the result is incorrect if multiple monitors are active, +	   so we cannot include this. */ +	/* +	if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT)) +		this->gamma_support = GetDeviceCaps(crtc->data, COLORMGMTCAPS) == CM_GAMMA_RAMP; +	this->gamma_support_error = 0; +	*/ +	this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); +	/* Windows GDI does not support EDID or connector information */ +	this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); +	this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); +	this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); +	this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); +	this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); + +	/* There was a failure if and only if unsupport field was requested. */ +	return (fields & ~KNOWN_FIELDS) ? -1 : 0; +  #undef _E -#undef  KNOWN_FIELDS +#undef KNOWN_FIELDS  }  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t* restrict ramps) +int +libgamma_w32_gdi_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t *restrict ramps)  {  #ifdef DEBUG -  /* Windows GDI have fixed gamma ramp sizes. */ -  if ((ramps->  red_size != GAMMA_RAMP_SIZE) || -      (ramps->green_size != GAMMA_RAMP_SIZE) || -      (ramps-> blue_size != GAMMA_RAMP_SIZE)) -    return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE; +	/* Windows GDI have fixed gamma ramp sizes */ +	if (ramps->  red_size != GAMMA_RAMP_SIZE || +	    ramps->green_size != GAMMA_RAMP_SIZE || +	    ramps-> blue_size != GAMMA_RAMP_SIZE) +		return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE;  #endif -  /* Read current gamma ramps. */ -  if (!GetDeviceGammaRamp(this->data, ramps->red)) -    return LIBGAMMA_GAMMA_RAMP_READ_FAILED; -  return 0; +	/* Read current gamma ramps */ +	if (!GetDeviceGammaRamp(this->data, ramps->red)) +		return LIBGAMMA_GAMMA_RAMP_READ_FAILED; +	return 0;  }  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t ramps) +int +libgamma_w32_gdi_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t ramps)  {  #ifdef DEBUG -  /* Windows GDI have fixed gamma ramp sizes. */ -  if ((ramps.  red_size != GAMMA_RAMP_SIZE) || -      (ramps.green_size != GAMMA_RAMP_SIZE) || -      (ramps. blue_size != GAMMA_RAMP_SIZE)) -    return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE; +	/* Windows GDI have fixed gamma ramp sizes */ +	if (ramps.  red_size != GAMMA_RAMP_SIZE || +	    ramps.green_size != GAMMA_RAMP_SIZE || +	    ramps. blue_size != GAMMA_RAMP_SIZE) +		return LIBGAMMA_WRONG_GAMMA_RAMP_SIZE;  #endif -  /* Apply gamma ramps. */ -  if (!SetDeviceGammaRamp(this->data, ramps.red)) -    return LIBGAMMA_GAMMA_RAMP_WRITE_FAILED; -  return 0; +	/* Apply gamma ramps */ +	if (!SetDeviceGammaRamp(this->data, ramps.red)) +		return LIBGAMMA_GAMMA_RAMP_WRITE_FAILED; +	return 0;  } - diff --git a/src/lib/gamma-w32-gdi.h b/src/lib/gamma-w32-gdi.h index 3efe691..d139f16 100644 --- a/src/lib/gamma-w32-gdi.h +++ b/src/lib/gamma-w32-gdi.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_W32_GDI_H  #define LIBGAMMA_GAMMA_W32_GDI_H @@ -27,16 +11,16 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -44,119 +28,112 @@ void libgamma_w32_gdi_method_capabilities(libgamma_method_capabilities_t* restri   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_w32_gdi_site_initialise(libgamma_site_state_t* restrict this, -				     char* restrict site); +int libgamma_w32_gdi_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_w32_gdi_site_destroy(libgamma_site_state_t* restrict this) __attribute__((const)); +void libgamma_w32_gdi_site_destroy(libgamma_site_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_site_restore(libgamma_site_state_t* restrict this); +int libgamma_w32_gdi_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_w32_gdi_partition_initialise(libgamma_partition_state_t* restrict this, -					  libgamma_site_state_t* restrict site, size_t partition); +int libgamma_w32_gdi_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_w32_gdi_partition_destroy(libgamma_partition_state_t* restrict this) __attribute__((const)); +void libgamma_w32_gdi_partition_destroy(libgamma_partition_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_w32_gdi_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_initialise(libgamma_crtc_state_t* restrict this, -				     libgamma_partition_state_t* restrict partition, size_t crtc); +int libgamma_w32_gdi_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_w32_gdi_crtc_destroy(libgamma_crtc_state_t* restrict this); +void libgamma_w32_gdi_crtc_destroy(libgamma_crtc_state_t *restrict);  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_w32_gdi_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error. On error refer to the error reports in `this`   */ -int libgamma_w32_gdi_get_crtc_information(libgamma_crtc_information_t* restrict this, -					  libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_w32_gdi_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_w32_gdi_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_w32_gdi_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t ramps); +int libgamma_w32_gdi_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t);  #endif - diff --git a/src/lib/gamma-x-randr.c b/src/lib/gamma-x-randr.c index fb002fc..fce65d1 100644 --- a/src/lib/gamma-x-randr.c +++ b/src/lib/gamma-x-randr.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_X_RANDR  # error Compiling gamma-x-randr.c without HAVE_LIBGAMMA_METHOD_X_RANDR  #endif @@ -37,143 +21,144 @@  /** - * The major version of RandR the library expects. + * The major version of RandR the library expects   */  #define RANDR_VERSION_MAJOR  1  /** - * The minor version of RandR the library expects. + * The minor version of RandR the library expects   */  #define RANDR_VERSION_MINOR  3  /** - * Data structure for partition data. + * Data structure for partition data   */ -typedef struct libgamma_x_randr_partition_data -{ -  /** -   * Mapping from CRTC indices to CRTC identifiers. -   */ -  xcb_randr_crtc_t* crtcs; -   -  /** -   * Mapping from output indices to output identifiers. -   */ -  xcb_randr_output_t* outputs; -   -  /** -   * The number of outputs available. -   */ -  size_t outputs_count; -   -  /** -   * Mapping from CRTC indices to output indices. -   * CRTC's without an output (should be impossible) -   * have the value `SIZE_MAX` which is impossible -   * for an existing mapping. -   */ -  size_t* crtc_to_output; -   -  /** -   * Screen configuration timestamp. -   */ -  xcb_timestamp_t config_timestamp; -   +typedef struct libgamma_x_randr_partition_data { +	/** +	 * Mapping from CRTC indices to CRTC identifiers +	 */ +	xcb_randr_crtc_t *crtcs; + +	/** +	 * Mapping from output indices to output identifiers +	 */ +	xcb_randr_output_t *outputs; + +	/** +	 * The number of outputs available +	 */ +	size_t outputs_count; + +	/** +	 * Mapping from CRTC indices to output indices. +	 * CRTC's without an output (should be impossible) +	 * have the value `SIZE_MAX` which is impossible +	 * for an existing mapping +	 */ +	size_t *crtc_to_output; + +	/** +	 * Screen configuration timestamp +	 */ +	xcb_timestamp_t config_timestamp; +  } libgamma_x_randr_partition_data_t;  /** - * Translate an xcb error into a libgamma error. + * Translate an xcb error into a libgamma error   *  - * @param   error_code     The xcb error. - * @param   default_error  The libgamma error to use if the xcb error is not recognised. - * @return                 The libgamma error. + * @param   error_code     The xcb error + * @param   default_error  The libgamma error to use if the xcb error is not recognised + * @return                 The libgamma error   */ -static int translate_error_(int error_code, int default_error) +static int +translate_error_(int error_code, int default_error)  { -  switch (error_code) -    { -    case XCB_CONN_ERROR:                    return errno = ECONNABORTED, LIBGAMMA_ERRNO_SET; -    case XCB_CONN_CLOSED_EXT_NOTSUPPORTED:  return errno = ENOPROTOOPT, LIBGAMMA_ERRNO_SET; -    case XCB_CONN_CLOSED_MEM_INSUFFICIENT:  return errno = ENOMEM, LIBGAMMA_ERRNO_SET; -    case XCB_CONN_CLOSED_REQ_LEN_EXCEED:    return errno = EMSGSIZE, LIBGAMMA_ERRNO_SET; -    case XCB_CONN_CLOSED_PARSE_ERR:         return LIBGAMMA_NO_SUCH_SITE; -    case XCB_CONN_CLOSED_INVALID_SCREEN:    return LIBGAMMA_NO_SUCH_PARTITION; -    case XCB_CONN_CLOSED_FDPASSING_FAILED:  return errno = EIO, LIBGAMMA_ERRNO_SET; -    default: -      return default_error; -    } +	switch (error_code) { +	case XCB_CONN_ERROR:                    return errno = ECONNABORTED, LIBGAMMA_ERRNO_SET; +	case XCB_CONN_CLOSED_EXT_NOTSUPPORTED:  return errno = ENOPROTOOPT, LIBGAMMA_ERRNO_SET; +	case XCB_CONN_CLOSED_MEM_INSUFFICIENT:  return errno = ENOMEM, LIBGAMMA_ERRNO_SET; +	case XCB_CONN_CLOSED_REQ_LEN_EXCEED:    return errno = EMSGSIZE, LIBGAMMA_ERRNO_SET; +	case XCB_CONN_CLOSED_PARSE_ERR:         return LIBGAMMA_NO_SUCH_SITE; +	case XCB_CONN_CLOSED_INVALID_SCREEN:    return LIBGAMMA_NO_SUCH_PARTITION; +	case XCB_CONN_CLOSED_FDPASSING_FAILED:  return errno = EIO, LIBGAMMA_ERRNO_SET; +	default: +		return default_error; +	}  }  /** - * Translate an xcb error into a libgamma error. + * Translate an xcb error into a libgamma error   *  - * @param   error_code     The xcb error. - * @param   default_error  The libgamma error to use if the xcb error is not recognised. - * @param   return_errno   Whether an `errno` value may be returned. - * @return                 The libgamma error. + * @param   error_code     The xcb error + * @param   default_error  The libgamma error to use if the xcb error is not recognised + * @param   return_errno   Whether an `errno` value may be returned + * @return                 The libgamma error   */ -static int translate_error(int error_code, int default_error, int return_errno) +static int +translate_error(int error_code, int default_error, int return_errno)  { -  int r = translate_error_(error_code, default_error); -  return return_errno ? (r > 0 ? errno : r) : r; +	int r = translate_error_(error_code, default_error); +	return (return_errno && r > 0) ? errno : r;  }  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_x_randr_method_capabilities(libgamma_method_capabilities_t* restrict this) +void +libgamma_x_randr_method_capabilities(libgamma_method_capabilities_t *restrict this)  { -  char* display = getenv("DISPLAY"); -  /* Support for all information except active status and gamma ramp support. -     Active status can be queried but it is not guaranteed produces an up to date result. */ -  this->crtc_information = LIBGAMMA_CRTC_INFO_MACRO_EDID -			 | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT -			 | LIBGAMMA_CRTC_INFO_MACRO_RAMP -			 | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER -			 | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR; -  /* X RandR supports multiple sites, partitions and CRTC:s. */ -  this->default_site_known = (display && *display) ? 1 : 0; -  this->multiple_sites = 1; -  this->multiple_partitions = 1; -  this->multiple_crtcs = 1; -  /* Partitions are screens and not graphics cards in X. */ -  this->partitions_are_graphics_cards = 0; -  /* X does not have system restore capabilities. */ -  this->site_restore = 0; -  this->partition_restore = 0; -  this->crtc_restore = 0; -  /* Gamma ramp sizes are identical but not fixed. */ -  this->identical_gamma_sizes = 1; -  this->fixed_gamma_size = 0; -  /* Gamma ramp depths are fixed. */ -  this->fixed_gamma_depth = 1; -  /* X RandR is a real non-faked adjustment method. */ -  this->real = 1; -  this->fake = 0; -  /* Gamma ramp adjustments are persistent. */ -  this->auto_restore = 0; +	char *display = getenv("DISPLAY"); +	/* Support for all information except active status and gamma ramp support. +	   Active status can be queried but it is not guaranteed produces an up to date result. */ +	this->crtc_information = LIBGAMMA_CRTC_INFO_MACRO_EDID +	                       | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT +	                       | LIBGAMMA_CRTC_INFO_MACRO_RAMP +	                       | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER +	                       | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR; +	/* X RandR supports multiple sites, partitions and CRTC:s */ +	this->default_site_known = display && *display; +	this->multiple_sites = 1; +	this->multiple_partitions = 1; +	this->multiple_crtcs = 1; +	/* Partitions are screens and not graphics cards in X */ +	this->partitions_are_graphics_cards = 0; +	/* X does not have system restore capabilities */ +	this->site_restore = 0; +	this->partition_restore = 0; +	this->crtc_restore = 0; +	/* Gamma ramp sizes are identical but not fixed */ +	this->identical_gamma_sizes = 1; +	this->fixed_gamma_size = 0; +	/* Gamma ramp depths are fixed */ +	this->fixed_gamma_depth = 1; +	/* X RandR is a real non-faked adjustment method */ +	this->real = 1; +	this->fake = 0; +	/* Gamma ramp adjustments are persistent */ +	this->auto_restore = 0;  } -/* xcb violates the rule to never return struct:s. */ -#ifdef __GCC__ +/* xcb violates the rule to never return struct:s */ +#ifdef __GNUC__  # pragma GCC diagnostic push  # pragma GCC diagnostic ignored "-Waggregate-return"  #endif  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -181,802 +166,820 @@ void libgamma_x_randr_method_capabilities(libgamma_method_capabilities_t* restri   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_x_randr_site_initialise(libgamma_site_state_t* restrict this, -				     char* restrict site) +int +libgamma_x_randr_site_initialise(libgamma_site_state_t *restrict this, char *restrict site)  { -  xcb_generic_error_t* error = NULL; -  xcb_connection_t* restrict connection; -  xcb_randr_query_version_cookie_t cookie; -  xcb_randr_query_version_reply_t* restrict reply; -  const xcb_setup_t* restrict setup; -  xcb_screen_iterator_t iter; -   -  /* Connect to the display server. */ -  this->data = connection = xcb_connect(site, NULL); -  if (connection == NULL || xcb_connection_has_error(connection)) -    return LIBGAMMA_OPEN_SITE_FAILED; -   -  /* Query the version of the X RandR extension protocol. */ -  cookie = xcb_randr_query_version(connection, RANDR_VERSION_MAJOR, RANDR_VERSION_MINOR); -  reply = xcb_randr_query_version_reply(connection, cookie, &error); -   -  /* Check for version query failure. */ -  if ((error != NULL) || (reply == NULL)) -    { -      /* Release resources. */ -      free(reply); -      /* If `xcb_connect` failed, both `error` and `reply` will be `NULL`. -	 XXX: Can both be `NULL` for any other reason? */ -      if ((error == NULL) && (reply == NULL)) -	return LIBGAMMA_OPEN_SITE_FAILED; -      xcb_disconnect(connection); -      /* Translate and report error. */ -      if (error != NULL) -	return translate_error(error->error_code, LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED, 0); -      return LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED; -    } -   -  /* Check protocol compatibility, -     we require 1.3 but 2.x may not be backwards compatible. */ -  if ((reply->major_version != RANDR_VERSION_MAJOR) || -      (reply->minor_version < RANDR_VERSION_MINOR)) -    { +	xcb_generic_error_t *error = NULL; +	xcb_connection_t *restrict connection; +	xcb_randr_query_version_cookie_t cookie; +	xcb_randr_query_version_reply_t *restrict reply; +	const xcb_setup_t *restrict setup; +	xcb_screen_iterator_t iter; + +	/* Connect to the display server */ +	this->data = connection = xcb_connect(site, NULL); +	if (!connection || xcb_connection_has_error(connection)) +		return LIBGAMMA_OPEN_SITE_FAILED; + +	/* Query the version of the X RandR extension protocol */ +	cookie = xcb_randr_query_version(connection, RANDR_VERSION_MAJOR, RANDR_VERSION_MINOR); +	reply = xcb_randr_query_version_reply(connection, cookie, &error); + +	/* Check for version query failure */ +	if (error || !reply) { +		/* Release resources */ +		free(reply); +		/* If `xcb_connect` failed, both `error` and `reply` will be `NULL`. +		   XXX: Can both be `NULL` for any other reason? */ +		if (!error && !reply) +			return LIBGAMMA_OPEN_SITE_FAILED; +		xcb_disconnect(connection); +		/* Translate and report error. */ +		if (error != NULL) +			return translate_error(error->error_code, LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED, 0); +		return LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED; +	} + +	/* Check protocol compatibility, +	   we require 1.3 but 2.x may not be backwards compatible */ +	if (reply->major_version != RANDR_VERSION_MAJOR || reply->minor_version < RANDR_VERSION_MINOR) {  #ifdef DEBUG -      /* Print used protocol. */ -      fprintf(stderr, "libgamma: RandR protocol version: %u.%u", reply->major_version, reply->minor_version); +		/* Print used protocol */ +		fprintf(stderr, "libgamma: RandR protocol version: %u.%u", reply->major_version, reply->minor_version);  #endif -      /* Release resources. */ -      free(reply); -      xcb_disconnect(connection); -      /* Report error. */ -      return LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED; -    } -   -  /* We do not longer need to know the version of the protocol. */ -  free(reply); -   -  /* Get available screens. */ -  if ((setup = xcb_get_setup(connection)) == NULL) -    return xcb_disconnect(connection), LIBGAMMA_LIST_PARTITIONS_FAILED; -  iter = xcb_setup_roots_iterator(setup); -  /* Get the number of available screens. */ -  this->partitions_available = (size_t)(iter.rem); -   -  /* Sanity check the number of available screens. */ -  return iter.rem < 0 ? LIBGAMMA_NEGATIVE_PARTITION_COUNT : 0; +		/* Release resources */ +		free(reply); +		xcb_disconnect(connection); +		/* Report error */ +		return LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED; +	} + +	/* We do not longer need to know the version of the protocol */ +	free(reply); + +	/* Get available screens */ +	setup = xcb_get_setup(connection); +	if (!setup) { +		xcb_disconnect(connection); +		return LIBGAMMA_LIST_PARTITIONS_FAILED; +	} +	iter = xcb_setup_roots_iterator(setup); +	/* Get the number of available screens */ +	this->partitions_available = (size_t)iter.rem; + +	/* Sanity check the number of available screens. */ +	return iter.rem >= ? 0 : LIBGAMMA_NEGATIVE_PARTITION_COUNT;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_x_randr_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_x_randr_site_destroy(libgamma_site_state_t *restrict this)  { -  xcb_disconnect((xcb_connection_t*)(this->data)); +	xcb_disconnect((xcb_connection_t *)this->data);  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_x_randr_site_restore(libgamma_site_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Duplicate a memory area. + * Duplicate a memory area   *  - * @param   ptr    The memory aree. - * @param   bytes  The size, in bytes, of the memory area. - * @return         A duplication of the memory, `NULL` if zero-length or on error. + * @param   ptr    The memory area + * @param   bytes  The size, in bytes, of the memory area + * @return         A duplication of the memory, `NULL` if zero-length or on error   */ -static inline void* memdup(void* restrict ptr, size_t bytes) +static inline void * +memdup(void *restrict ptr, size_t bytes)  { -  char* restrict rc; -  if ((bytes == 0) || ((rc = malloc(bytes)) == NULL)) -    return NULL; -  memcpy(rc, ptr, bytes); -  return rc; +	char *restrict rc; +	if (!bytes) +		return NULL; +	rc = malloc(bytes); +	if (!rc) +		return NULL; +	memcpy(rc, ptr, bytes); +	return rc;  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. + * @param   this       The partition state to initialise   * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_randr_partition_initialise(libgamma_partition_state_t* restrict this, -					  libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_x_randr_partition_initialise(libgamma_partition_state_t *restrict this, +                                      libgamma_site_state_t *restrict site, size_t partition)  { -  int fail_rc = LIBGAMMA_ERRNO_SET; -  xcb_connection_t* restrict connection = site->data; -  xcb_screen_t* restrict screen = NULL; -  xcb_generic_error_t* error = NULL; -  const xcb_setup_t* restrict setup; -  xcb_screen_iterator_t iter; -  xcb_randr_get_screen_resources_current_cookie_t cookie; -  xcb_randr_get_screen_resources_current_reply_t* restrict reply; -  xcb_randr_crtc_t* restrict crtcs; -  xcb_randr_output_t* restrict outputs; -  libgamma_x_randr_partition_data_t* restrict data; -  size_t i; -   -  /* Get screen list. */ -  if ((setup = xcb_get_setup(connection)) == NULL) -    return LIBGAMMA_LIST_PARTITIONS_FAILED; -  iter = xcb_setup_roots_iterator(setup); -   -  /* Get the screen. */ -  for (i = 0; iter.rem > 0; i++, xcb_screen_next(&iter)) -    if (i == partition) -      { -	screen = iter.data; -	break; -      } -  /* Report failure if we did not find the screen. */ -  if (iter.rem == 0) -    return LIBGAMMA_NO_SUCH_PARTITION; -   -  /* Check that the screen is not `NULL`. (Do not think this can happen, but why not.) */ -  if (screen == NULL) -    return LIBGAMMA_NULL_PARTITION; -   -  /* Get the current resources of the screen. */ -  cookie = xcb_randr_get_screen_resources_current(connection, screen->root); -  reply = xcb_randr_get_screen_resources_current_reply(connection, cookie, &error); -  if (error != NULL) -    return translate_error(error->error_code, LIBGAMMA_LIST_CRTCS_FAILED, 0); -   -  /* Get the number of available CRTC:s. */ -  this->crtcs_available = reply->num_crtcs; -  /* Get the CRTC and output lists. */ -  crtcs = xcb_randr_get_screen_resources_current_crtcs(reply); -  outputs = xcb_randr_get_screen_resources_current_outputs(reply); -  if ((crtcs == NULL) || (outputs == NULL)) -    return free(reply), LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; -   -  /* Allocate adjustment method dependent data memory area. -     We use `calloc` because we want `data`'s pointers to be `NULL` if not allocated at `fail`. */ -  if ((data = calloc(1, sizeof(libgamma_x_randr_partition_data_t))) == NULL) -    goto fail; -   -  /* Copy the CRTC:s, just so we do not have to keep the reply in memory. */ -  data->crtcs = memdup(crtcs, (size_t)(reply->num_crtcs) * sizeof(xcb_randr_crtc_t)); -  if ((data->crtcs == NULL) && (reply->num_crtcs > 0)) -    goto fail; -   -  /* Copy the outputs as well. */ -  data->outputs = memdup(outputs, (size_t)(reply->num_outputs) * sizeof(xcb_randr_output_t)); -  if ((data->outputs == NULL) && (reply->num_outputs > 0)) -    goto fail; -   -  /* Get the number of available outputs. */ -  data->outputs_count = (size_t)(reply->num_outputs); -   -  /* Create mapping table from CRTC indices to output indicies. (injection) */ -  if ((data->crtc_to_output = malloc((size_t)(reply->num_crtcs) * sizeof(size_t))) == NULL) -    goto fail; -  /* All CRTC:s should be mapped, but incase they are not, all unmapped CRTC:s should have -     an invalid target, namely `SIZE_MAX`, which is 1 more than the theoretical limit. */ -  for (i = 0; i < (size_t)(reply->num_crtcs); i++) -    data->crtc_to_output[i] = SIZE_MAX; -  /* Fill the table. */ -  for (i = 0; i < (size_t)(reply->num_outputs); i++) -    { -      xcb_randr_get_output_info_cookie_t out_cookie; -      xcb_randr_get_output_info_reply_t* out_reply; -      uint16_t j; -       -      /* Query output (target) information. */ -      out_cookie = xcb_randr_get_output_info(connection, outputs[i], reply->config_timestamp); -      out_reply = xcb_randr_get_output_info_reply(connection, out_cookie, &error); -      if (error != NULL) -	{ -	  fail_rc = translate_error(error->error_code, LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED, 0); -	  goto fail; +	int fail_rc = LIBGAMMA_ERRNO_SET; +	xcb_connection_t *restrict connection = site->data; +	xcb_screen_t *restrict screen = NULL; +	xcb_generic_error_t *error = NULL; +	const xcb_setup_t *restrict setup; +	xcb_screen_iterator_t iter; +	xcb_randr_get_screen_resources_current_cookie_t cookie; +	xcb_randr_get_screen_resources_current_reply_t *restrict reply; +	xcb_randr_crtc_t *restrict crtcs; +	xcb_randr_output_t *restrict outputs; +	libgamma_x_randr_partition_data_t *restrict data; +	xcb_randr_get_output_info_cookie_t out_cookie; +	xcb_randr_get_output_info_reply_t *out_reply; +	size_t i; +	uint16_t j; + +	/* Get screen list */ +	setup = xcb_get_setup(connection); +	if (!setup) +		return LIBGAMMA_LIST_PARTITIONS_FAILED; +	iter = xcb_setup_roots_iterator(setup); + +	/* Get the screen */ +	for (i = 0; iter.rem > 0; i++, xcb_screen_next(&iter)) +		if (i == partition) { +			screen = iter.data; +			break; +		} +	/* Report failure if we did not find the screen */ +	if (!iter.rem) +		return LIBGAMMA_NO_SUCH_PARTITION; + +	/* Check that the screen is not `NULL`. +	 * (Do not think this can happen, but why not.) */ +	if (!screen) +		return LIBGAMMA_NULL_PARTITION; + +	/* Get the current resources of the screen */ +	cookie = xcb_randr_get_screen_resources_current(connection, screen->root); +	reply = xcb_randr_get_screen_resources_current_reply(connection, cookie, &error); +	if (error) +		return translate_error(error->error_code, LIBGAMMA_LIST_CRTCS_FAILED, 0); + +	/* Get the number of available CRTC:s */ +	this->crtcs_available = reply->num_crtcs; +	/* Get the CRTC and output lists */ +	crtcs = xcb_randr_get_screen_resources_current_crtcs(reply); +	outputs = xcb_randr_get_screen_resources_current_outputs(reply); +	if (!crtcs || !outputs) { +		free(reply); +		return LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED;  	} -       -      /* Find CRTC (source). */ -      for (j = 0; j < reply->num_crtcs; j++) -	if (crtcs[j] == out_reply->crtc) -	  { -	    data->crtc_to_output[j] = i; -	    break; -	  } -       -      /* Release output information. */ -      free(out_reply); -    } -   -  /* Store the configuration timestamp. */ -  data->config_timestamp = reply->config_timestamp; -  /* Store the adjustment method dependent data. */ -  this->data = data; -  /* Release resources and return successfully. */ -  free(reply); -  return 0; -   - fail: -  /* Release resources and return with an error. */ -  if (data != NULL) -    { -      free(data->crtcs); -      free(data->outputs); -      free(data->crtc_to_output); -      free(data); -    } -  free(reply); -  return fail_rc; + +	/* Allocate adjustment method dependent data memory area. +	   We use `calloc` because we want `data`'s pointers to be `NULL` if not allocated at `fail`. */ +	data = calloc(1, sizeof(libgamma_x_randr_partition_data_t)); +	if (!data) +		goto fail; + +	/* Copy the CRTC:s, just so we do not have to keep the reply in memory */ +	data->crtcs = memdup(crtcs, (size_t)(reply->num_crtcs) * sizeof(xcb_randr_crtc_t)); +	if (!data->crtcs && reply->num_crtcs > 0) +		goto fail; + +	/* Copy the outputs as well */ +	data->outputs = memdup(outputs, (size_t)reply->num_outputs * sizeof(xcb_randr_output_t)); +	if (!data->outputs && reply->num_outputs > 0) +		goto fail; + +	/* Get the number of available outputs */ +	data->outputs_count = (size_t)reply->num_outputs; + +	/* Create mapping table from CRTC indices to output indicies. (injection) */ +	data->crtc_to_output = malloc((size_t)reply->num_crtcs * sizeof(size_t)); +	if (!data->crtc) +		goto fail; +	/* All CRTC:s should be mapped, but incase they are not, all unmapped CRTC:s should have +	   an invalid target, namely `SIZE_MAX`, which is 1 more than the theoretical limit */ +	for (i = 0; i < (size_t)reply->num_crtcs; i++) +		data->crtc_to_output[i] = SIZE_MAX; +	/* Fill the table */ +	for (i = 0; i < (size_t)reply->num_outputs; i++) { +		/* Query output (target) information */ +		out_cookie = xcb_randr_get_output_info(connection, outputs[i], reply->config_timestamp); +		out_reply = xcb_randr_get_output_info_reply(connection, out_cookie, &error); +		if (error) { +			fail_rc = translate_error(error->error_code, LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED, 0); +			goto fail; +		} + +		/* Find CRTC (source) */ +		for (j = 0; j < reply->num_crtcs; j++) { +			if (crtcs[j] == out_reply->crtc) { +				data->crtc_to_output[j] = i; +				break; +			} +		} + +		/* Release output information */ +		free(out_reply); +	} + +	/* Store the configuration timestamp */ +	data->config_timestamp = reply->config_timestamp; +	/* Store the adjustment method dependent data */ +	this->data = data; +	/* Release resources and return successfully */ +	free(reply); +	return 0; + +fail: +	/* Release resources and return with an error */ +	if (data) { +		free(data->crtcs); +		free(data->outputs); +		free(data->crtc_to_output); +		free(data); +	} +	free(reply); +	return fail_rc;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_x_randr_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_x_randr_partition_destroy(libgamma_partition_state_t *restrict this)  { -  libgamma_x_randr_partition_data_t* restrict data = this->data; -  free(data->crtcs); -  free(data->outputs); -  free(data->crtc_to_output); -  free(data); +	libgamma_x_randr_partition_data_t *restrict data = this->data; +	free(data->crtcs); +	free(data->outputs); +	free(data->crtc_to_output); +	free(data);  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_x_randr_partition_restore(libgamma_partition_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. + * @param   this       The CRTC state to initialise   * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_randr_crtc_initialise(libgamma_crtc_state_t* restrict this, -				     libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_x_randr_crtc_initialise(libgamma_crtc_state_t *restrict this, +                                 libgamma_partition_state_t *restrict partition, size_t crtc)  { -  libgamma_x_randr_partition_data_t* restrict screen_data = partition->data; -  xcb_randr_crtc_t* restrict crtc_ids = screen_data->crtcs; -  this->data = crtc_ids + crtc; -  return crtc >= partition->crtcs_available ? LIBGAMMA_NO_SUCH_CRTC : 0; +	libgamma_x_randr_partition_data_t *restrict screen_data = partition->data; +	xcb_randr_crtc_t *restrict crtc_ids = screen_data->crtcs; +	this->data = crtc_ids + crtc; +	return crtc < partition->crtcs_available ? 0 : LIBGAMMA_NO_SUCH_CRTC;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_x_randr_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_x_randr_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_x_randr_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Get the gamma ramp size of a CRTC. + * Get the gamma ramp size of a CRTC   *  - * @param   this  Instance of a data structure to fill with the information about the CRTC. - * @param   crtc  The state of the CRTC whose information should be read. - * @return        Non-zero on error. + * @param   this  Instance of a data structure to fill with the information about the CRTC + * @param   crtc  The state of the CRTC whose information should be read + * @return        Non-zero on error   */ -static int get_gamma_ramp_size(libgamma_crtc_information_t* restrict out, libgamma_crtc_state_t* restrict crtc) +static int +get_gamma_ramp_size(libgamma_crtc_information_t *restrict out, libgamma_crtc_state_t *restrict crtc)  { -  xcb_connection_t* restrict connection = crtc->partition->site->data; -  xcb_randr_crtc_t* restrict crtc_id = crtc->data; -  xcb_randr_get_crtc_gamma_size_cookie_t cookie; -  xcb_randr_get_crtc_gamma_size_reply_t* restrict reply; -  xcb_generic_error_t* error; -   -  /* Query gamma ramp size. */ -  out->gamma_size_error = 0; -  cookie = xcb_randr_get_crtc_gamma_size(connection, *crtc_id); -  reply = xcb_randr_get_crtc_gamma_size_reply(connection, cookie, &error); -  if (error != NULL) -    return out->gamma_size_error = translate_error(error->error_code, LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED, 1); -  /* Sanity check gamma ramp size. */ -  if (reply->size < 2) -    out->gamma_size_error = LIBGAMMA_SINGLETON_GAMMA_RAMP; -  /* Store gamma ramp size. */ -  out->red_gamma_size = out->green_gamma_size = out->blue_gamma_size = reply->size; -  /* Release resources and return successfulnes. */ -  free(reply); -  return out->gamma_size_error; +	xcb_connection_t *restrict connection = crtc->partition->site->data; +	xcb_randr_crtc_t *restrict crtc_id = crtc->data; +	xcb_randr_get_crtc_gamma_size_cookie_t cookie; +	xcb_randr_get_crtc_gamma_size_reply_t *restrict reply; +	xcb_generic_error_t *error; + +	/* Query gamma ramp size */ +	out->gamma_size_error = 0; +	cookie = xcb_randr_get_crtc_gamma_size(connection, *crtc_id); +	reply = xcb_randr_get_crtc_gamma_size_reply(connection, cookie, &error); +	if (error) { +		out->gamma_size_error = translate_error(error->error_code, LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED, 1); +		return out->gamma_size_error; +	} +	/* Sanity check gamma ramp size */ +	if (reply->size < 2) +		out->gamma_size_error = LIBGAMMA_SINGLETON_GAMMA_RAMP; +	/* Store gamma ramp size */ +	out->red_gamma_size = out->green_gamma_size = out->blue_gamma_size = reply->size; +	/* Release resources and return successfulnes */ +	free(reply); +	return out->gamma_size_error;  }  /** - * Read information from the CRTC's output. + * Read information from the CRTC's output   *  - * @param   out     Instance of a data structure to fill with the information about the CRTC. - * @param   output  The CRTC's output information. - * @return          Non-zero if at least on error occured. + * @param   out     Instance of a data structure to fill with the information about the CRTC + * @param   output  The CRTC's output information + * @return          Non-zero if at least on error occured   */ -static int read_output_data(libgamma_crtc_information_t* restrict out, xcb_randr_get_output_info_reply_t* restrict output) +static int +read_output_data(libgamma_crtc_information_t *restrict out, xcb_randr_get_output_info_reply_t *restrict output)  { -#define __select(value)  \ -  case XCB_RENDER_SUB_PIXEL_##value:  out->subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_##value;  break -   -  switch (output->connection) -    { -    case XCB_RANDR_CONNECTION_CONNECTED: -      /* We have a monitor connected, report that and store information that is provided to us. */ -      out->active = 1; -      out->width_mm = output->mm_width; -      out->height_mm = output->mm_height; -      switch (output->subpixel_order) -	{ -	__select (UNKNOWN); -	__select (HORIZONTAL_RGB); -	__select (HORIZONTAL_BGR); -	__select (VERTICAL_RGB); -	__select (VERTICAL_BGR); -	__select (NONE); +#define __select(value)\ +	case XCB_RENDER_SUB_PIXEL_##value:  out->subpixel_order = LIBGAMMA_SUBPIXEL_ORDER_##value;  break + +	switch (output->connection) { +	case XCB_RANDR_CONNECTION_CONNECTED: +		/* We have a monitor connected, report that and store information that is provided to us */ +		out->active = 1; +		out->width_mm = output->mm_width; +		out->height_mm = output->mm_height; +		switch (output->subpixel_order) { +		__select (UNKNOWN); +		__select (HORIZONTAL_RGB); +		__select (HORIZONTAL_BGR); +		__select (VERTICAL_RGB); +		__select (VERTICAL_BGR); +		__select (NONE); +		default: +			out->subpixel_order_error = LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED; +			break; +		} +		return 0; + +	case XCB_RANDR_CONNECTION_UNKNOWN: +		/* If we do know whether a monitor is connected report that and assume it is not */ +		out->active_error = LIBGAMMA_STATE_UNKNOWN; +		/* fall through */  	default: -	  out->subpixel_order_error = LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED; -	  break; +		/* If no monitor is connected, report that on fails that require it */ +		out->width_mm_error       = LIBGAMMA_NOT_CONNECTED; +		out->height_mm_error      = LIBGAMMA_NOT_CONNECTED; +		out->subpixel_order_error = LIBGAMMA_NOT_CONNECTED; +		/* And store that we are not connected */ +		out->active = 0; +		/* This fuction only failed if we could not figure out whether a monitor is connected */ +		return output->connection != XCB_RANDR_CONNECTION_UNKNOWN ? 0 : -1;  	} -      return 0; -       -    case XCB_RANDR_CONNECTION_UNKNOWN: -      /* If we do know whether a monitor is connected report that and assume it is not. */ -      out->active_error = LIBGAMMA_STATE_UNKNOWN; -      /* Fall through. */ -    default: -      /* If no monitor is connected, report that on fails that require it. */ -      out->width_mm_error       = LIBGAMMA_NOT_CONNECTED; -      out->height_mm_error      = LIBGAMMA_NOT_CONNECTED; -      out->subpixel_order_error = LIBGAMMA_NOT_CONNECTED; -      /* And store that we are not connected. */ -      out->active = 0; -      /* This fuction only failed if we could not figure out whether a monitor is connected. */ -      return (output->connection == XCB_RANDR_CONNECTION_UNKNOWN) ? -1 : 0; -    } -   +  #undef __select  }  /** - * Determine the connector type from the connector name. + * Determine the connector type from the connector name   *  - * @param  this  The CRTC information to use and extend. - * @param        Non-zero on error. + * @param  this  The CRTC information to use and extend + * @param        Non-zero on error   */ -static int get_connector_type(libgamma_crtc_information_t* restrict this) +static int +get_connector_type(libgamma_crtc_information_t *restrict this)  { -  /* Since we require the name of the output of get the type of the connected, -     copy any reported error on the output's name to the connector's type, -     and report failure if there was an error. */ -  if ((this->connector_type_error = this->connector_name_error)) -    return -1; -   -#define __select(name, type)                                           \ -  if (strstr(this->connector_name, name "-") == this->connector_name)  \ -    return this->connector_type = LIBGAMMA_CONNECTOR_TYPE_##type, 0 -   -  /* Check begin on the name of the output to find out what type the connector is of. */ -  __select ("None",         Unknown); -  __select ("VGA",          VGA); -  __select ("DVI-I",        DVII); -  __select ("DVI-D",        DVID); -  __select ("DVI-A",        DVIA); -  __select ("DVI",          DVI); -  __select ("Composite",    Composite); -  __select ("S-Video",      SVIDEO); -  __select ("Component",    Component); -  __select ("LFP",          LFP); -  __select ("Proprietary",  Unknown); -  __select ("HDMI",         HDMI); -  __select ("DisplayPort",  DisplayPort); -   +	/* Since we require the name of the output of get the type of the connected, +	   copy any reported error on the output's name to the connector's type, +	   and report failure if there was an error */ +	if ((this->connector_type_error = this->connector_name_error)) +		return -1; + +#define __select(name, type)\ +	do {\ +		if (strstr(this->connector_name, name "-") == this->connector_name) {\ +			this->connector_type = LIBGAMMA_CONNECTOR_TYPE_##type\ +			return 0;\ +		}\ +	} while (0) + +	/* Check begin on the name of the output to find out what type the connector is of */ +	__select ("None",        Unknown); +	__select ("VGA",         VGA); +	__select ("DVI-I",       DVII); +	__select ("DVI-D",       DVID); +	__select ("DVI-A",       DVIA); +	__select ("DVI",         DVI); +	__select ("Composite",   Composite); +	__select ("S-Video",     SVIDEO); +	__select ("Component",   Component); +	__select ("LFP",         LFP); +	__select ("Proprietary", Unknown); +	__select ("HDMI",        HDMI); +	__select ("DisplayPort", DisplayPort); +  #undef __select -   -  /* If there was no matching output name pattern report that and exit with an error. */ -  this->connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; -  return -1; + +	/* If there was no matching output name pattern report that and exit with an error */ +	this->connector_name_error = LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED; +	return -1;  }  /** - * Get the output name of a CRTC. + * Get the output name of a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   output  The CRTC's output's information. - * @return          Non-zero on error. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   output  The CRTC's output's information + * @return          Non-zero on error   */ -static int get_output_name(libgamma_crtc_information_t* restrict out, xcb_randr_get_output_info_reply_t* restrict output) +static int +get_output_name(libgamma_crtc_information_t *restrict out, xcb_randr_get_output_info_reply_t *restrict output)  { -  char* restrict store; -  uint8_t* restrict name; -  uint16_t length; -  size_t i; -   -  /* Get the name of the output and the length of that name. */ -  name = xcb_randr_get_output_info_name(output); -  length = output->name_len; /* There is no NUL-termination. */ -  if (name == NULL) -    return out->connector_name_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; -   -  /* Allocate a memory area for a NUL-terminated copy of the name. */ -  store = out->connector_name = malloc(((size_t)length + 1) * sizeof(char)); -  if (store == NULL) -    return out->connector_name_error = errno, -1; -   -  /* char is guaranteed to be (u)int_least8_t, but it is only guaranteed to be (u)int8_t -   * on POSIX, so to be truly portable we will not assume that char is (u)int8_t. */ -  for (i = 0; i < (size_t)length; i++) -    store[i] = (char)(name[i]); -  store[length] = '\0'; -   -  return 0; +	char *restrict store; +	uint8_t *restrict name; +	uint16_t length; +	size_t i; + +	/* Get the name of the output and the length of that name */ +	name = xcb_randr_get_output_info_name(output); +	length = output->name_len; /* There is no NUL-termination */ +	if (!name) +		return out->connector_name_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; + +	/* Allocate a memory area for a NUL-terminated copy of the name */ +	store = out->connector_name = malloc(((size_t)length + 1) * sizeof(char)); +	if (!store) { +		out->connector_name_error = errno; +		return -1; +	} + +	/* char is guaranteed to be (u)int_least8_t, but it is only guaranteed to be (u)int8_t +	 * on POSIX, so to be truly portable we will not assume that char is (u)int8_t */ +	for (i = 0; i < (size_t)length; i++) +		store[i] = (char)name[i]; +	store[length] = '\0'; + +	return 0;  }  /** - * Get the Extended Display Information Data of the monitor connected to the connector of a CRTC. + * Get the Extended Display Information Data of the monitor connected to the connector of a CRTC   *  - * @param   out     Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   output  The CRTC's output. - * @return          Non-zero on error. + * @param   out     Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   output  The CRTC's output + * @return          Non-zero on error   */ -static int get_edid(libgamma_crtc_information_t* restrict out, -		    libgamma_crtc_state_t* restrict crtc, xcb_randr_output_t output) +static int +get_edid(libgamma_crtc_information_t *restrict out, libgamma_crtc_state_t *restrict crtc, xcb_randr_output_t output)  { -  xcb_connection_t* restrict connection = crtc->partition->site->data; -  xcb_randr_list_output_properties_cookie_t prop_cookie; -  xcb_randr_list_output_properties_reply_t* restrict prop_reply; -  xcb_atom_t* atoms; -  xcb_atom_t* atoms_end; -  xcb_generic_error_t* error; -   -  /* Acquire a list of all properties of the output. */ -  prop_cookie = xcb_randr_list_output_properties(connection, output); -  prop_reply = xcb_randr_list_output_properties_reply(connection, prop_cookie, &error); -  if (error != NULL) -    return out->edid_error = translate_error(error->error_code, LIBGAMMA_LIST_PROPERTIES_FAILED, 1); -   -  /* Extract the properties form the data structure that holds them, */ -  atoms = xcb_randr_list_output_properties_atoms(prop_reply); -  /* and get the last one so that we can iterate over them nicely. */ -  atoms_end = atoms + xcb_randr_list_output_properties_atoms_length(prop_reply); -   -  if (atoms == NULL) -    return free(prop_reply), out->edid_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; +	xcb_connection_t *restrict connection = crtc->partition->site->data; +	xcb_randr_list_output_properties_cookie_t prop_cookie; +	xcb_randr_list_output_properties_reply_t *restrict prop_reply; +	xcb_atom_t *atoms; +	xcb_atom_t *atoms_end; +	xcb_generic_error_t *error; +	xcb_get_atom_name_cookie_t atom_name_cookie; +	xcb_get_atom_name_reply_t *restrict atom_name_reply; +	char *restrict atom_name; +	int atom_name_len; +	xcb_randr_get_output_property_cookie_t atom_cookie; +	xcb_randr_get_output_property_reply_t *restrict atom_reply; +	unsigned char* restrict atom_data; +	int length; + +	/* Acquire a list of all properties of the output */ +	prop_cookie = xcb_randr_list_output_properties(connection, output); +	prop_reply = xcb_randr_list_output_properties_reply(connection, prop_cookie, &error); +	if (error) +		return out->edid_error = translate_error(error->error_code, LIBGAMMA_LIST_PROPERTIES_FAILED, 1); -  /* For each property */ -  for (; atoms != atoms_end; atoms++) -    { -      xcb_get_atom_name_cookie_t atom_name_cookie; -      xcb_get_atom_name_reply_t* restrict atom_name_reply; -      char* restrict atom_name; -      int atom_name_len; -      xcb_randr_get_output_property_cookie_t atom_cookie; -      xcb_randr_get_output_property_reply_t* restrict atom_reply; -      unsigned char* restrict atom_data; -      int length; -       -      /* Acquire the atom name. */ -      atom_name_cookie = xcb_get_atom_name(connection, *atoms); -      atom_name_reply = xcb_get_atom_name_reply(connection, atom_name_cookie, &error); -      if (error) -	continue; -       -      /* Extract the atom name from the data structure that holds it. */ -      atom_name = xcb_get_atom_name_name(atom_name_reply); -      /* As well as the length of the name; it is not NUL-termianted.*/ -      atom_name_len = xcb_get_atom_name_name_length(atom_name_reply); -       -      if (/* Check for errors. */ -	  (atom_name == NULL) || /* (atom_name_len < 1) || */ -	  /* Check that the length is the expected length for the EDID property. */ -	  (atom_name_len != 4) || -	  /* Check that the property is the EDID property. */ -	  (atom_name[0] != 'E') || (atom_name[1] != 'D') || (atom_name[2] != 'I') || (atom_name[3] != 'D')) -	{ -	  free(atom_name_reply); -	  continue; -	} -       -      /* Acquire the property's value, we know that it is either 128 or 256 byte long. */ -      atom_cookie = xcb_randr_get_output_property(connection, output, *atoms, -						  XCB_GET_PROPERTY_TYPE_ANY, 0, 256, 0, 0); -      atom_reply = xcb_randr_get_output_property_reply(connection, atom_cookie, &error); -      /* (*) EDID version 1.0 through 1.4 define it as 128 bytes long, -       * but version 2.0 define it as 256 bytes long. However, -       * version 2.0 is rare(?) and has been deprecated and replaced -       * by version 1.3 (I guess that is with a new version epoch, -       * but I do not know.) */ -      if (error) -	{ -	  free(atom_name_reply); -	  free(prop_reply); -	  return out->edid_error = LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED; +	/* Extract the properties form the data structure that holds them, */ +	atoms = xcb_randr_list_output_properties_atoms(prop_reply); +	/* and get the last one so that we can iterate over them nicely */ +	atoms_end = atoms + xcb_randr_list_output_properties_atoms_length(prop_reply); + +	if (!atoms) { +		free(prop_reply); +		return out->edid_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED;  	} -       -      /* Extract the property's value, */ -      atom_data = xcb_randr_get_output_property_data(atom_reply); -      /* and its actual length. */ -      length = xcb_randr_get_output_property_data_length(atom_reply); -      if ((atom_data == NULL) || (length < 1)) -	{ -	  free(atom_reply); -	  free(atom_name_reply); -	  free(prop_reply); -	  return out->edid_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; + +	/* For each property */ +	for (; atoms != atoms_end; atoms++) { +		/* Acquire the atom name */ +		atom_name_cookie = xcb_get_atom_name(connection, *atoms); +		atom_name_reply = xcb_get_atom_name_reply(connection, atom_name_cookie, &error); +		if (error) +			continue; + +		/* Extract the atom name from the data structure that holds it */ +		atom_name = xcb_get_atom_name_name(atom_name_reply); +		/* As well as the length of the name; it is not NUL-termianted */ +		atom_name_len = xcb_get_atom_name_name_length(atom_name_reply); + +		if (/* Check for errors */ +		    !atom_name || /* atom_name_len < 1 || */ +		    /* Check that the length is the expected length for the EDID property */ +		    atom_name_len != 4 || +		    /* Check that the property is the EDID property */ +		    atom_name[0] != 'E' || atom_name[1] != 'D' || atom_name[2] != 'I' || atom_name[3] != 'D') { +			free(atom_name_reply); +			continue; +		} + +		/* Acquire the property's value, we know that it is either 128 or 256 byte long */ +		atom_cookie = xcb_randr_get_output_property(connection, output, *atoms, XCB_GET_PROPERTY_TYPE_ANY, 0, 256, 0, 0); +		atom_reply = xcb_randr_get_output_property_reply(connection, atom_cookie, &error); +		/* (*) EDID version 1.0 through 1.4 define it as 128 bytes long, +		 * but version 2.0 define it as 256 bytes long. However, +		 * version 2.0 is rare(?) and has been deprecated and replaced +		 * by version 1.3 (I guess that is with a new version epoch, +		 * but I do not know.) */ +		if (error) { +			free(atom_name_reply); +			free(prop_reply); +			return out->edid_error = LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED; +		} + +		/* Extract the property's value */ +		atom_data = xcb_randr_get_output_property_data(atom_reply); +		/* and its actual length */ +		length = xcb_randr_get_output_property_data_length(atom_reply); +		if (!atom_data || length < 1) { +			free(atom_reply); +			free(atom_name_reply); +			free(prop_reply); +			return out->edid_error = LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED; +		} + +		/* Store the EDID */ +		out->edid_length = (size_t)length; +		out->edid = malloc((size_t)length * sizeof(unsigned char)); +		if (!out->edid) +			out->edid_error = errno; +		else +			memcpy(out->edid, atom_data, (size_t)length * sizeof(unsigned char)); + +		/* Release resouces */ +		free(atom_reply); +		free(atom_name_reply); +		free(prop_reply); + +		return out->edid_error;  	} -       -      /* Store the EDID. */ -      out->edid_length = (size_t)length; -      out->edid = malloc((size_t)length * sizeof(unsigned char)); -      if (out->edid == NULL) -	out->edid_error = errno; -      else -	memcpy(out->edid, atom_data, (size_t)length * sizeof(unsigned char)); -       -      /* Release resouces. */ -      free(atom_reply); -      free(atom_name_reply); -      free(prop_reply); -       -      return out->edid_error; -    } -   -  return out->edid_error = LIBGAMMA_EDID_NOT_FOUND; + +	return out->edid_error = LIBGAMMA_EDID_NOT_FOUND;  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`.. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_x_randr_get_crtc_information(libgamma_crtc_information_t* restrict this, -					  libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_x_randr_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                      libgamma_crtc_state_t *restrict crtc, int32_t fields)  { -#define _E(FIELD)  ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) -  int e = 0; -  xcb_randr_get_output_info_reply_t* restrict output_info = NULL; -  xcb_randr_output_t output; -  int free_edid, free_name; -   -  /* Wipe all error indicators. */ -  memset(this, 0, sizeof(libgamma_crtc_information_t)); -   -  /* We need to free the EDID after us if it is not explicitly requested.  */ -  free_edid = (fields & LIBGAMMA_CRTC_INFO_EDID) == 0; -   -  /* We need to free the output's name after us if it is not explicitly requested.  */ -  free_name = (fields & LIBGAMMA_CRTC_INFO_CONNECTOR_NAME) == 0; -   -  /* Jump if the output information is not required. */ -  if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR)) == 0) -    goto cont; -   -  /* Get connector and connector information. */ -  { -    xcb_connection_t* restrict connection = crtc->partition->site->data; -    libgamma_x_randr_partition_data_t* restrict screen_data = crtc->partition->data; -    size_t output_index = screen_data->crtc_to_output[crtc->crtc]; -    xcb_randr_get_output_info_cookie_t cookie; -    xcb_generic_error_t* error; -    /* `SIZE_MAX` is used for CRTC:s that misses mapping to its output (should not happen), -       because `SIZE_MAX - 1` is the highest theoretical possible value. */ -    if (output_index == SIZE_MAX) -      { -	e |= this->edid_error = this->gamma_error = this->width_mm_edid_error -	   = this->height_mm_edid_error = this->connector_type_error -	   = this->connector_name_error = this->subpixel_order_error -	   = this->width_mm_error = this->height_mm_error -	   = this->active_error = LIBGAMMA_CONNECTOR_UNKNOWN; -	goto cont; -      } -    /* Get the output. */ -    output = screen_data->outputs[output_index]; -    /* Query output information. */ -    cookie = xcb_randr_get_output_info(connection, output, screen_data->config_timestamp); -    output_info = xcb_randr_get_output_info_reply(connection, cookie, &error); -    if (error != NULL) -      { -	e |= this->edid_error = this->gamma_error = this->width_mm_edid_error -	   = this->height_mm_edid_error = this->connector_type_error -	   = this->connector_name_error = this->subpixel_order_error -	   = this->width_mm_error = this->height_mm_error -	   = this->active_error = LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED; -	goto cont; -      } -  } -   -  /* Get connector name. */ -  e |= get_output_name(this, output_info); -  /* Get connector type. */ -  if ((fields & LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE)) -    e |= get_connector_type(this); -  /* Get additional output data, excluding EDID. */ -  e |= read_output_data(this, output_info); -  if ((fields & LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT)) -    e |= this->width_mm_error | this->height_mm_error; -  e |= (fields & LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER) ? this->subpixel_order_error : 0; -   -  /* If we do not want any EDID information, jump. */ -  if ((fields & LIBGAMMA_CRTC_INFO_MACRO_EDID) == 0) -    goto cont; -  /* If there is not monitor that report error in EDID related fields. */ -  if (this->active == 0) -    { -      e |= this->edid_error = this->gamma_error = this->width_mm_edid_error -	 = this->height_mm_edid_error = LIBGAMMA_NOT_CONNECTED; -      goto cont; -    } -  /* Get EDID. */ -  e |= get_edid(this, crtc, output); -  if (this->edid == NULL) -    { -      this->gamma_error = this->width_mm_edid_error = this->height_mm_edid_error = this->edid_error; -      goto cont; -    } -  /* Parse EDID. */ -  if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID))) -    e |= libgamma_parse_edid(this, fields); -   - cont: -  /* Get gamma ramp size. */ -  e |= (fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE) ? get_gamma_ramp_size(this, crtc) : 0; -  /* Store gamma ramp depth. */ -  this->gamma_depth = 16; -  /* X RandR does not support quering gamma ramp support. */ -  e |= this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); -   -  /* Free the EDID after us. */ -  if (free_edid) -    { -      free(this->edid); -      this->edid = NULL; -    } -  /* Free the output name after us. */ -  if (free_name) -    { -      free(this->connector_name); -      this->connector_name = NULL; -    } -   -  free(output_info); -  return e ? -1 : 0; +#define _E(FIELD) ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) + +	int e = 0; +	xcb_randr_get_output_info_reply_t *restrict output_info = NULL; +	xcb_randr_output_t output; +	int free_edid, free_name; +	xcb_connection_t *restrict connection; +	libgamma_x_randr_partition_data_t *restrict screen_data; +	size_t output_index; +	xcb_randr_get_output_info_cookie_t cookie; +	xcb_generic_error_t *error; + +	/* Wipe all error indicators */ +	memset(this, 0, sizeof(libgamma_crtc_information_t)); + +	/* We need to free the EDID after us if it is not explicitly requested */ +	free_edid = !(fields & LIBGAMMA_CRTC_INFO_EDID); + +	/* We need to free the output's name after us if it is not explicitly requested */ +	free_name = !(fields & LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); + +	/* Jump if the output information is not required */ +	if (!(fields & (LIBGAMMA_CRTC_INFO_MACRO_ACTIVE | LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR))) +		goto cont; + +	/* Get connector and connector information */ +	connection = crtc->partition->site->data; +	screen_data = crtc->partition->data; +	output_index = screen_data->crtc_to_output[crtc->crtc]; +	/* `SIZE_MAX` is used for CRTC:s that misses mapping to its output (should not happen), +	 * because `SIZE_MAX - 1` is the highest theoretical possible value */ +	if (output_index == SIZE_MAX) { +		e |= this->edid_error = this->gamma_error = this->width_mm_edid_error +		   = this->height_mm_edid_error = this->connector_type_error +		   = this->connector_name_error = this->subpixel_order_error +		   = this->width_mm_error = this->height_mm_error +		   = this->active_error = LIBGAMMA_CONNECTOR_UNKNOWN; +		goto cont; +	} +	/* Get the output */ +	output = screen_data->outputs[output_index]; +	/* Query output information */ +	cookie = xcb_randr_get_output_info(connection, output, screen_data->config_timestamp); +	output_info = xcb_randr_get_output_info_reply(connection, cookie, &error); +	if (error) { +		e |= this->edid_error = this->gamma_error = this->width_mm_edid_error +		   = this->height_mm_edid_error = this->connector_type_error +		   = this->connector_name_error = this->subpixel_order_error +		   = this->width_mm_error = this->height_mm_error +		   = this->active_error = LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED; +		goto cont; +	} + +	/* Get connector name */ +	e |= get_output_name(this, output_info); +	/* Get connector type */ +	if (fields & LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE) +		e |= get_connector_type(this); +	/* Get additional output data, excluding EDID */ +	e |= read_output_data(this, output_info); +	if (fields & LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT) +		e |= this->width_mm_error | this->height_mm_error; +	e |= (fields & LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER) ? this->subpixel_order_error : 0; + +	/* If we do not want any EDID information, jump */ +	if (!(fields & LIBGAMMA_CRTC_INFO_MACRO_EDID)) +		goto cont; +	/* If there is not monitor that report error in EDID related fields */ +	if (!this->active) { +		e |= this->edid_error = this->gamma_error = this->width_mm_edid_error +		   = this->height_mm_edid_error = LIBGAMMA_NOT_CONNECTED; +		goto cont; +	} +	/* Get EDID */ +	e |= get_edid(this, crtc, output); +	if (!this->edid) { +		this->gamma_error = this->width_mm_edid_error = this->height_mm_edid_error = this->edid_error; +		goto cont; +	} +	/* Parse EDID */ +	if ((fields & (LIBGAMMA_CRTC_INFO_MACRO_EDID ^ LIBGAMMA_CRTC_INFO_EDID))) +		e |= libgamma_parse_edid(this, fields); + +cont: +	/* Get gamma ramp size */ +	e |= (fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE) ? get_gamma_ramp_size(this, crtc) : 0; +	/* Store gamma ramp depth. */ +	this->gamma_depth = 16; +	/* X RandR does not support quering gamma ramp support. */ +	e |= this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); + +	/* Free the EDID after us */ +	if (free_edid) { +		free(this->edid); +		this->edid = NULL; +	} +	/* Free the output name after us */ +	if (free_name) { +		free(this->connector_name); +		this->connector_name = NULL; +	} + +	free(output_info); +	return e ? -1 : 0; +  #undef _E  }  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_randr_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t* restrict ramps) +int +libgamma_x_randr_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t *restrict ramps)  { -  xcb_connection_t* restrict connection = this->partition->site->data; -  xcb_randr_get_crtc_gamma_cookie_t cookie; -  xcb_randr_get_crtc_gamma_reply_t* restrict reply; -  xcb_generic_error_t* error; -  uint16_t* restrict red; -  uint16_t* restrict green; -  uint16_t* restrict blue; +	xcb_connection_t *restrict connection = this->partition->site->data; +	xcb_randr_get_crtc_gamma_cookie_t cookie; +	xcb_randr_get_crtc_gamma_reply_t *restrict reply; +	xcb_generic_error_t *error; +	uint16_t *restrict red; +	uint16_t *restrict green; +	uint16_t *restrict blue;  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps->red_size != ramps->green_size) || -      (ramps->red_size != ramps->blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps->red_size != ramps->green_size || ramps->red_size != ramps->blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -   -  /* Read current gamma ramps. */ -  cookie = xcb_randr_get_crtc_gamma(connection, *(xcb_randr_crtc_t*)(this->data)); -  reply = xcb_randr_get_crtc_gamma_reply(connection, cookie, &error); -   -  /* Check for errors. */ -  if (error != NULL) -    return translate_error(error->error_code, LIBGAMMA_GAMMA_RAMP_READ_FAILED, 0); -   -  /* Get current gamma ramps from response. */ -  red   = xcb_randr_get_crtc_gamma_red(reply); -  green = xcb_randr_get_crtc_gamma_green(reply); -  blue  = xcb_randr_get_crtc_gamma_blue(reply); -  /* Copy over the gamma ramps to our memory. */ -  memcpy(ramps->red,   red,   ramps->red_size   * sizeof(uint16_t)); -  memcpy(ramps->green, green, ramps->green_size * sizeof(uint16_t)); -  memcpy(ramps->blue,  blue,  ramps->blue_size  * sizeof(uint16_t)); -   -  free(reply); -  return 0; + +	/* Read current gamma ramps */ +	cookie = xcb_randr_get_crtc_gamma(connection, *(xcb_randr_crtc_t *)this->data); +	reply = xcb_randr_get_crtc_gamma_reply(connection, cookie, &error); + +	/* Check for errors */ +	if (error) +		return translate_error(error->error_code, LIBGAMMA_GAMMA_RAMP_READ_FAILED, 0); + +	/* Get current gamma ramps from response */ +	red   = xcb_randr_get_crtc_gamma_red(reply); +	green = xcb_randr_get_crtc_gamma_green(reply); +	blue  = xcb_randr_get_crtc_gamma_blue(reply); +	/* Copy over the gamma ramps to our memory */ +	memcpy(ramps->red,   red,   ramps->red_size   * sizeof(uint16_t)); +	memcpy(ramps->green, green, ramps->green_size * sizeof(uint16_t)); +	memcpy(ramps->blue,  blue,  ramps->blue_size  * sizeof(uint16_t)); + +	free(reply); +	return 0;  }  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_randr_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t ramps) +int +libgamma_x_randr_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t ramps)  { -  xcb_connection_t* restrict connection = this->partition->site->data; -  xcb_void_cookie_t cookie; -  xcb_generic_error_t* restrict error; +	xcb_connection_t *restrict connection = this->partition->site->data; +	xcb_void_cookie_t cookie; +	xcb_generic_error_t *restrict error;  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps.red_size != ramps.green_size) || -      (ramps.red_size != ramps.blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps.red_size != ramps.green_size || ramps.red_size != ramps.blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -   -  /* Apply gamma ramps. */ -  cookie = xcb_randr_set_crtc_gamma_checked(connection, *(xcb_randr_crtc_t*)(this->data), -					    (uint16_t)(ramps.red_size), ramps.red, ramps.green, ramps.blue); -  /* Check for errors. */ -  if ((error = xcb_request_check(connection, cookie)) != NULL) -    return translate_error(error->error_code, LIBGAMMA_GAMMA_RAMP_WRITE_FAILED, 0); -  return 0; + +	/* Apply gamma ramps */ +	cookie = xcb_randr_set_crtc_gamma_checked(connection, *(xcb_randr_crtc_t*)this->data, +	                                          (uint16_t)ramps.red_size, ramps.red, ramps.green, ramps.blue); +	/* Check for errors */ +	error = xcb_request_check(connection, cookie); +	if (error) +		return translate_error(error->error_code, LIBGAMMA_GAMMA_RAMP_WRITE_FAILED, 0); +	return 0;  } -#ifdef __GCC__ +#ifdef __GNUC__  # pragma GCC diagnostic pop  #endif - diff --git a/src/lib/gamma-x-randr.h b/src/lib/gamma-x-randr.h index 7d03436..59c64bc 100644 --- a/src/lib/gamma-x-randr.h +++ b/src/lib/gamma-x-randr.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_X_RANDR_H  #define LIBGAMMA_GAMMA_X_RANDR_H @@ -27,136 +11,129 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_x_randr_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_x_randr_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free   *                  it yourself, and it must not be a string constant   *                  or allocate on the stack. Note however that it will - *                  not be free:d if this function fails. + *                  not be free:d if this function fails   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_x_randr_site_initialise(libgamma_site_state_t* restrict this, -				     char* restrict site); +int libgamma_x_randr_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /**   * Release all resources held by a site state.   *    * @param  this  The site state.   */ -void libgamma_x_randr_site_destroy(libgamma_site_state_t* restrict this); +void libgamma_x_randr_site_destroy(libgamma_site_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_site_restore(libgamma_site_state_t* restrict this); +int libgamma_x_randr_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_randr_partition_initialise(libgamma_partition_state_t* restrict this, -					  libgamma_site_state_t* restrict site, size_t partition); +int libgamma_x_randr_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_x_randr_partition_destroy(libgamma_partition_state_t* restrict this); +void libgamma_x_randr_partition_destroy(libgamma_partition_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_x_randr_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_randr_crtc_initialise(libgamma_crtc_state_t* restrict this, -				     libgamma_partition_state_t* restrict partition, size_t crtc); +int libgamma_x_randr_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_x_randr_crtc_destroy(libgamma_crtc_state_t* restrict this) __attribute__((const)); +void libgamma_x_randr_crtc_destroy(libgamma_crtc_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_randr_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_x_randr_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_x_randr_get_crtc_information(libgamma_crtc_information_t* restrict this, -					  libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_x_randr_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_randr_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_x_randr_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_randr_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					    libgamma_gamma_ramps16_t ramps); +int libgamma_x_randr_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t);  #endif - diff --git a/src/lib/gamma-x-vidmode.c b/src/lib/gamma-x-vidmode.c index 13cc740..bae9d31 100644 --- a/src/lib/gamma-x-vidmode.c +++ b/src/lib/gamma-x-vidmode.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef HAVE_LIBGAMMA_METHOD_X_VIDMODE  # error Compiling gamma-x-vidmode.c without HAVE_LIBGAMMA_METHOD_X_VIDMODE  #endif @@ -31,44 +15,44 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t* restrict this) +void +libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t *restrict this)  { -  char* restrict display = getenv("DISPLAY"); -  /* Gamma ramps size and depth can be queried. */ -  this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE -			 | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; -  /* X VidMode supports multiple sites and partitions but not CRTC:s. */ -  this->default_site_known = (display && *display) ? 1 : 0; -  this->multiple_sites = 1; -  this->multiple_partitions = 1; -  this->multiple_crtcs = 0; -  /* Partitions are screens and not graphics cards in X. */ -  this->partitions_are_graphics_cards = 0; -  /* X does not have system restore capabilities. */ -  this->site_restore = 0; -  this->partition_restore = 0; -  this->crtc_restore = 0; -  /* Gamma ramp sizes are identical but not fixed. */ -  this->identical_gamma_sizes = 1; -  this->fixed_gamma_size = 0; -  /* Gamma ramp depths are fixed. */ -  this->fixed_gamma_depth = 1; -  /* X VidMode is a real non-faked adjustment method */ -  this->real = 1; -  this->fake = 0; -  /* Gamma ramp adjustments are persistent. */ -  this->auto_restore = 0; +	char *restrict display = getenv("DISPLAY"); +	/* Gamma ramps size and depth can be queried */ +	this->crtc_information = LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH; +	/* X VidMode supports multiple sites and partitions but not CRTC:s */ +	this->default_site_known = (display && *display) ? 1 : 0; +	this->multiple_sites = 1; +	this->multiple_partitions = 1; +	this->multiple_crtcs = 0; +	/* Partitions are screens and not graphics cards in X */ +	this->partitions_are_graphics_cards = 0; +	/* X does not have system restore capabilities */ +	this->site_restore = 0; +	this->partition_restore = 0; +	this->crtc_restore = 0; +	/* Gamma ramp sizes are identical but not fixed */ +	this->identical_gamma_sizes = 1; +	this->fixed_gamma_size = 0; +	/* Gamma ramp depths are fixed */ +	this->fixed_gamma_depth = 1; +	/* X VidMode is a real non-faked adjustment method */ +	this->real = 1; +	this->fake = 0; +	/* Gamma ramp adjustments are persistent */ +	this->auto_restore = 0;  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -76,237 +60,253 @@ void libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_x_vidmode_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site) +int +libgamma_x_vidmode_site_initialise(libgamma_site_state_t *restrict this, char *restrict site)  { -  /* Connect to the display. */ -  Display* restrict connection = XOpenDisplay(site); -  int _major, _minor, screens; -  if ((this->data = connection) == NULL) -    return LIBGAMMA_OPEN_SITE_FAILED; -  /* Query X VidMode extension protocol version. */ -  if (!XF86VidModeQueryVersion(connection, &_major, &_minor)) -    return XCloseDisplay(connection), LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED; -  /* Query the number of available screens. */ -  if ((screens = ScreenCount(connection)) < 0) -    return XCloseDisplay(connection), LIBGAMMA_NEGATIVE_PARTITION_COUNT; -  this->partitions_available = (size_t)screens; -  return 0; +	/* Connect to the display */ +	Display *restrict connection; +	int _major, _minor, screens; +	this->data = connection = XOpenDisplay(site); +	if (!this->data) +		return LIBGAMMA_OPEN_SITE_FAILED; +	/* Query X VidMode extension protocol version */ +	if (!XF86VidModeQueryVersion(connection, &_major, &_minor)) { +		XCloseDisplay(connection); +		return LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED; +	} +	/* Query the number of available screens */ +	screens = ScreenCount(connection); +	if (screens < 0) { +		XCloseDisplay(connection); +		return LIBGAMMA_NEGATIVE_PARTITION_COUNT; +	} +	this->partitions_available = (size_t)screens; +	return 0;  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_x_vidmode_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_x_vidmode_site_destroy(libgamma_site_state_t *restrict this)  { -  XCloseDisplay((Display*)(this->data)); +	XCloseDisplay((Display *)this->data);  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_x_vidmode_site_restore(libgamma_site_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_vidmode_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_x_vidmode_partition_initialise(libgamma_partition_state_t *restrict this, +                                        libgamma_site_state_t *restrict site, size_t partition)  { -  this->crtcs_available = 1; -  return partition >= site->partitions_available ? LIBGAMMA_NO_SUCH_PARTITION : 0; +	this->crtcs_available = 1; +	return partition < site->partitions_available ? 0 : LIBGAMMA_NO_SUCH_PARTITION;  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_x_vidmode_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_x_vidmode_partition_destroy(libgamma_partition_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_x_vidmode_partition_restore(libgamma_partition_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_x_vidmode_crtc_initialise(libgamma_crtc_state_t *restrict this, +                                   libgamma_partition_state_t *restrict partition, size_t crtc)  { -  (void) this; -  (void) partition; -  return crtc == 0 ? 0 : LIBGAMMA_NO_SUCH_CRTC; +	(void) this; +	(void) partition; +	return !crtc ? 0 : LIBGAMMA_NO_SUCH_CRTC;  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_x_vidmode_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_x_vidmode_crtc_destroy(libgamma_crtc_state_t *restrict this)  { -  (void) this; +	(void) this;  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_x_vidmode_crtc_restore(libgamma_crtc_state_t *restrict this)  { -  (void) this; -  return errno = ENOTSUP, LIBGAMMA_ERRNO_SET; +	(void) this; +	errno = ENOTSUP; +	return LIBGAMMA_ERRNO_SET;  }  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read   * @param   fields  OR:ed identifiers for the information about the CRTC that should be read - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @return          Zero on success, -1 on error; oOn error refer to the error reports in `this`   */ -int libgamma_x_vidmode_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_x_vidmode_get_crtc_information(libgamma_crtc_information_t *restrict this, +                                        libgamma_crtc_state_t *restrict crtc, int32_t fields)  {  #define _E(FIELD)  ((fields & FIELD) ? LIBGAMMA_CRTC_INFO_NOT_SUPPORTED : 0) -   -  /* X VidMode does not support EDID or monitor dimensions. */ -  this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); -  this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); -  this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); -  this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); -  this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); -  this->gamma_size_error = 0; -  /* X VidMode does support gamma ramp size query. The gamma -     ramps are identical but not fixed, and the query can fail. */ -  if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) -    { -      Display* restrict connection = crtc->partition->site->data; -      int stops = 0; -      if (!XF86VidModeGetGammaRampSize(connection, (int)(crtc->partition->partition), &stops)) -	this->gamma_size_error = LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED; -      else if (stops < 2) -	this->gamma_size_error = LIBGAMMA_SINGLETON_GAMMA_RAMP; -      this->red_gamma_size = this->green_gamma_size = this->blue_gamma_size = (size_t)stops; -    } -  /* X VidMode uses 16-bit integer ramps. */ -  this->gamma_depth = 16; -  this->gamma_depth_error = 0; -  /* X VidMode does not support gamma ramp support queries. */ -  this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); -  /* X VidMode does not support EDID or connector information. */ -  this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); -  this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); -  this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); -  this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); -  this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); -   -  /* We failed if gamma ramp size query failed or if an unsupport field was queried. */ -  return this->gamma_size_error || (fields & ~(LIBGAMMA_CRTC_INFO_GAMMA_DEPTH | LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) ? -1 : 0; -   + +	Display *restrict connection; +	int stops = 0; + +	/* X VidMode does not support EDID or monitor dimensions */ +	this->edid_error = _E(LIBGAMMA_CRTC_INFO_EDID); +	this->width_mm_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM); +	this->height_mm_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM); +	this->width_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID); +	this->height_mm_edid_error = _E(LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID); +	this->gamma_size_error = 0; +	/* X VidMode does support gamma ramp size query. The gamma +	   ramps are identical but not fixed, and the query can fail. */ +	if ((fields & LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) { +		connection = crtc->partition->site->data; +		if (!XF86VidModeGetGammaRampSize(connection, (int)crtc->partition->partition, &stops)) +			this->gamma_size_error = LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED; +		else if (stops < 2) +			this->gamma_size_error = LIBGAMMA_SINGLETON_GAMMA_RAMP; +		this->red_gamma_size = this->green_gamma_size = this->blue_gamma_size = (size_t)stops; +	} +	/* X VidMode uses 16-bit integer ramps */ +	this->gamma_depth = 16; +	this->gamma_depth_error = 0; +	/* X VidMode does not support gamma ramp support queries */ +	this->gamma_support_error = _E(LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT); +	/* X VidMode does not support EDID or connector information */ +	this->subpixel_order_error = _E(LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER); +	this->active_error = _E(LIBGAMMA_CRTC_INFO_ACTIVE); +	this->connector_name_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_NAME); +	this->connector_type_error = _E(LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE); +	this->gamma_error = _E(LIBGAMMA_CRTC_INFO_GAMMA); + +	/* We failed if gamma ramp size query failed or if an unsupport field was queried. */ +	return (this->gamma_size_error || (fields & ~(LIBGAMMA_CRTC_INFO_GAMMA_DEPTH | LIBGAMMA_CRTC_INFO_GAMMA_SIZE))) ? -1 : 0; +  #undef _E  }  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t* restrict ramps) +int +libgamma_x_vidmode_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t *restrict ramps)  {  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps->red_size != ramps->green_size) || -      (ramps->red_size != ramps->blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps->red_size != ramps->green_size || ramps->red_size != ramps->blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -  /* Read current gamma ramps. */ -  if (!XF86VidModeGetGammaRamp((Display*)(this->partition->site->data), (int)(this->partition->partition), -			       (int)(ramps->red_size), ramps->red, ramps->green, ramps->blue)) -    return LIBGAMMA_GAMMA_RAMP_READ_FAILED; -  return 0; +	/* Read current gamma ramps */ +	if (!XF86VidModeGetGammaRamp((Display *)this->partition->site->data, (int)this->partition->partition, +	                             (int)ramps->red_size, ramps->red, ramps->green, ramps->blue)) +		return LIBGAMMA_GAMMA_RAMP_READ_FAILED; +	return 0;  }  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t ramps) +int +libgamma_x_vidmode_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t ramps)  {  #ifdef DEBUG -  /* Gamma ramp sizes are identical but not fixed. */ -  if ((ramps.red_size != ramps.green_size) || -      (ramps.red_size != ramps.blue_size)) -    return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE; +	/* Gamma ramp sizes are identical but not fixed */ +	if (ramps.red_size != ramps.green_size || ramps.red_size != ramps.blue_size) +		return LIBGAMMA_MIXED_GAMMA_RAMP_SIZE;  #endif -  /* Apply gamma ramps. */ -  if (!XF86VidModeSetGammaRamp((Display*)(this->partition->site->data), (int)(this->partition->partition), -			       (int)(ramps.red_size), ramps.red, ramps.green, ramps.blue)) -    return LIBGAMMA_GAMMA_RAMP_WRITE_FAILED; -  return 0; +	/* Apply gamma ramps */ +	if (!XF86VidModeSetGammaRamp((Display *)this->partition->site->data, (int)this->partition->partition, +	                             (int)ramps.red_size, ramps.red, ramps.green, ramps.blue)) +		return LIBGAMMA_GAMMA_RAMP_WRITE_FAILED; +	return 0;  } - diff --git a/src/lib/gamma-x-vidmode.h b/src/lib/gamma-x-vidmode.h index 510f03b..618d5c4 100644 --- a/src/lib/gamma-x-vidmode.h +++ b/src/lib/gamma-x-vidmode.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_GAMMA_X_VIDMODE_H  #define LIBGAMMA_GAMMA_X_VIDMODE_H @@ -27,16 +11,16 @@  /** - * Return the capabilities of the adjustment method. + * Return the capabilities of the adjustment method   *  - * @param  this  The data structure to fill with the method's capabilities. + * @param  this  The data structure to fill with the method's capabilities   */ -void libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t* restrict this); +void libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t *restrict);  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. + * @param   this    The site state to initialise   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -44,119 +28,113 @@ void libgamma_x_vidmode_method_capabilities(libgamma_method_capabilities_t* rest   *                  or allocate on the stack. Note however that it will   *                  not be free:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_x_vidmode_site_initialise(libgamma_site_state_t* restrict this, -				       char* restrict site); +int libgamma_x_vidmode_site_initialise(libgamma_site_state_t *restrict, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_x_vidmode_site_destroy(libgamma_site_state_t* restrict this); +void libgamma_x_vidmode_site_destroy(libgamma_site_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_site_restore(libgamma_site_state_t* restrict this); +int libgamma_x_vidmode_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The the index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The the index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_vidmode_partition_initialise(libgamma_partition_state_t* restrict this, -					    libgamma_site_state_t* restrict site, size_t partition); +int libgamma_x_vidmode_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_x_vidmode_partition_destroy(libgamma_partition_state_t* restrict this) __attribute__((const)); +void libgamma_x_vidmode_partition_destroy(libgamma_partition_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_x_vidmode_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The the index of the CRTC within the site. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The the index of the CRTC within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_initialise(libgamma_crtc_state_t* restrict this, -				       libgamma_partition_state_t* restrict partition, size_t crtc) __attribute__((const)); +__attribute__((const)) +int libgamma_x_vidmode_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_x_vidmode_crtc_destroy(libgamma_crtc_state_t* restrict this) __attribute__((const)); +void libgamma_x_vidmode_crtc_destroy(libgamma_crtc_state_t *restrict) __attribute__((const));  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_x_vidmode_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_x_vidmode_get_crtc_information(libgamma_crtc_information_t* restrict this, -					    libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_x_vidmode_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_x_vidmode_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_x_vidmode_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -					      libgamma_gamma_ramps16_t ramps); +int libgamma_x_vidmode_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t);  #endif - diff --git a/src/lib/libgamma-error.c.gpp b/src/lib/libgamma-error.c.gpp index a606dd7..d43f336 100644 --- a/src/lib/libgamma-error.c.gpp +++ b/src/lib/libgamma-error.c.gpp @@ -1,21 +1,5 @@  /* -*- c -*- */ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #include "libgamma-error.h" @@ -35,17 +19,19 @@ $>export PATH=".:${PATH}"  /**   * Group that the user needs to be a member of if - * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned. + * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned   */  #ifndef __WIN32__  __thread gid_t libgamma_group_gid = 0; -gid_t libgamma_group_gid_get(void) +gid_t +libgamma_group_gid_get(void)  { -  return libgamma_group_gid; +	return libgamma_group_gid;  } -void libgamma_group_gid_set(gid_t value) +void +libgamma_group_gid_set(gid_t value)  { -  libgamma_group_gid = value; +	libgamma_group_gid = value;  }  #else  short libgamma_group_gid = 0; @@ -55,20 +41,21 @@ short libgamma_group_gid = 0;   * Group that the user needs to be a member of if   * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned,   * `NULL` if the name of the group `libgamma_group_gid` - * cannot be determined. + * cannot be determined   */  #ifndef __WIN32__ -__thread const char* libgamma_group_name = NULL; -const char* libgamma_group_name_get(void) -{ -  return libgamma_group_name; +__thread const char *libgamma_group_name = NULL; +const char * +libgamma_group_name_get(void) { +	return libgamma_group_name;  } -void libgamma_group_name_set(const char* value) +void +libgamma_group_name_set(const char *value)  { -  libgamma_group_name = value; +	libgamma_group_name = value;  }  #else -const char* libgamma_group_name = NULL; +const char *libgamma_group_name = NULL;  #endif @@ -87,102 +74,105 @@ const char* libgamma_group_name = NULL;   * required group will be printed with its numerical value   * and, if known, its name.   *  - * @param  name   The text to add at the beginning. - * @param  value  The error code, may be an `errno` value. + * @param  name   The text to add at the beginning + * @param  value  The error code, may be an `errno` value   */ -void libgamma_perror(const char* name, int error_code) +void +libgamma_perror(const char *name, int error_code)  { -  if (error_code >= 0) -    { -      /* Print the stored errno value. */ -      errno = error_code; -      perror(name); -    } -  else if (error_code == LIBGAMMA_ERRNO_SET) -    /* Print errno. */ -    perror(name); -  else if (error_code == LIBGAMMA_DEVICE_REQUIRE_GROUP) -    { -      /* Print the error name and the required group membership. */ -      const char* error = libgamma_name_of_error(error_code); -      long int gid = (long int)libgamma_group_gid; -      if (libgamma_group_name == NULL) -	/* Group name unknown. */ -	if (name && *name) -	  fprintf(stderr, "%s: %s: %ld\n", name, error, gid); -	else -	  fprintf(stderr, "%s: %ld\n", error, gid); -      else -	/* Group name known, ID is second class. */ -	if (name && *name) -	  fprintf(stderr, "%s: %s: %s (%ld)\n", name, error, libgamma_group_name, gid); -	else -	  fprintf(stderr, "%s: %s (%ld)\n", error, libgamma_group_name, gid); -    } -  else if (error_code < LIBGAMMA_ERROR_MIN) -    /* If the error code does not exist, print "(?)" */ -    if (name && *name) -      fprintf(stderr, "%s: (?)\n", name); -    else -      fprintf(stderr, "(?)\n"); -  else -    /* Print the name of the error. */ -    if (name && *name) -      fprintf(stderr, "%s: %s\n", name, libgamma_name_of_error(error_code)); -    else -      fprintf(stderr, "%s\n", libgamma_name_of_error(error_code)); +	const char *error; +	long int gid; + +	if (error_code >= 0) { +		/* Print the stored errno value */ +		errno = error_code; +		perror(name); +	} else if (error_code == LIBGAMMA_ERRNO_SET) { +		/* Print errno */ +		perror(name); +	} else if (error_code == LIBGAMMA_DEVICE_REQUIRE_GROUP) { +		/* Print the error name and the required group membership */ +		error = libgamma_name_of_error(error_code); +		gid = (long int)libgamma_group_gid; +		if (!libgamma_group_name) { +			/* Group name unknown */ +			if (name && *name) +				fprintf(stderr, "%s: %s: %ld\n", name, error, gid); +			else +				fprintf(stderr, "%s: %ld\n", error, gid); +		} else { +			/* Group name known, ID is second class */ +			if (name && *name) +				fprintf(stderr, "%s: %s: %s (%ld)\n", name, error, libgamma_group_name, gid); +			else +				fprintf(stderr, "%s: %s (%ld)\n", error, libgamma_group_name, gid); +		} +	} else if (error_code < LIBGAMMA_ERROR_MIN) { +		/* If the error code does not exist, print "(?)" */ +		if (name && *name) +			fprintf(stderr, "%s: (?)\n", name); +		else +			fprintf(stderr, "(?)\n"); +	} else { +		/* Print the name of the error */ +		if (name && *name) +			fprintf(stderr, "%s: %s\n", name, libgamma_name_of_error(error_code)); +		else +			fprintf(stderr, "%s\n", libgamma_name_of_error(error_code)); +	}  }  /** - * Returns the name of the definition associated with a `libgamma` error code. + * Returns the name of the definition associated with a `libgamma` error code   *  - * @param   value  The error code. + * @param   value  The error code   * @return         The name of the definition associated with the error code, - *                 `NULL` if the error code does not exist. The return string - *                 should not be `free`:d. + *                 `NULL` if the error code does not exist; the return string + *                 should not be `free`:d   */ -const char* libgamma_name_of_error(int value) +const char * +libgamma_name_of_error(int value)  { -  /* Map from error codes to error names. -     The output of $(libgamma-error-extract --list) -     is sorted by error code in decreasing order. */ -  static const char* error_names[] = -    { +	/* Map from error codes to error names. +	   The output of $(libgamma-error-extract --list) +	   is sorted by error code in decreasing order */ +	static const char* error_names[] = {  $>for error in $(libgamma-error-extract --list); do -      "${error}", +		"${error}",  $>done -    }; -   -  /* Return `NULL` if the error code is invalid. */ -  if ((value < LIBGAMMA_ERROR_MIN) || (value >= 0)) -    return NULL; -   -  /* Convert error code from {-1, -2, -3, ...} to {0, 1, 2, ...} -     and look up the error's name and return it. */ -  return error_names[-value - 1]; +	}; + +	/* Return `NULL` if the error code is invalid */ +	if (value < LIBGAMMA_ERROR_MIN || value >= 0) +		return NULL; + +	/* Convert error code from {-1, -2, -3, ...} to {0, 1, 2, ...} +	 * and look up the error's name and return it */ +	return error_names[-value - 1];  }  /** - * Return the value of a `libgamma` error definition refered to by name. + * Return the value of a `libgamma` error definition refered to by name   *  - * @param   name  The name of the definition associated with the error code. + * @param   name  The name of the definition associated with the error code   * @return        The error code, zero if the name does is `NULL` - *                or does not refer to a `libgamma` error. + *                or does not refer to a `libgamma` error   */ -int libgamma_value_of_error(const char* name) +int +libgamma_value_of_error(const char *name)  { -  /* Return 0 (not a valid error code) if the error name is `NULL`. */ -  if (name == NULL) -    return 0; -   -  /* Test error names against `name` and return the value of the match error. */ +	/* Return 0 (not a valid error code) if the error name is `NULL` */ +	if (!name) +		return 0; + +	/* Test error names against `name` and return the value of the match error */  $>for error in $(libgamma-error-extract --list); do -  if (!strcmp(name, "${error}"))  return ${error}; +	if (!strcmp(name, "${error}")) +		return ${error};  $>done -   -  /* Return 0 (not a valid error code) if the error name is unknown. */ -  return 0; -} +	/* Return 0 (not a valid error code) if the error name is unknown */ +	return 0; +} diff --git a/src/lib/libgamma-error.h b/src/lib/libgamma-error.h index 3a562ee..a026e79 100644 --- a/src/lib/libgamma-error.h +++ b/src/lib/libgamma-error.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_ERROR_H  #define LIBGAMMA_ERROR_H @@ -25,14 +9,14 @@  #include <sys/types.h> -#ifndef __GCC__ +#ifndef __GNUC__  # define __attribute__(x)  #endif  /**   * Group that the user needs to be a member of if - * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned. + * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned   */  #ifndef __WIN32__  extern __thread gid_t libgamma_group_gid; @@ -46,292 +30,295 @@ extern short libgamma_group_gid;   * Group that the user needs to be a member of if   * `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned,   * `NULL` if the name of the group `libgamma_group_gid` - * cannot be determined. + * cannot be determined   */  #ifndef __WIN32__ -extern __thread const char* libgamma_group_name; -const char* libgamma_group_name_get(void) __attribute__((pure)); -void libgamma_group_name_set(const char* value); +extern __thread const char *libgamma_group_name; +const char *libgamma_group_name_get(void) __attribute__((pure)); +void libgamma_group_name_set(const char *value);  #else -extern const char* libgamma_group_name; +extern const char *libgamma_group_name;  #endif  /**   * `errno` has be set with a standard error number - * to indicate the what has gone wrong. + * to indicate the what has gone wrong   */ -#define LIBGAMMA_ERRNO_SET  (-1) +#define LIBGAMMA_ERRNO_SET (-1)  /**   * The selected adjustment method does not exist - * or has been excluded at compile-time. + * or has been excluded at compile-time   */ -#define LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD  (-2) +#define LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD (-2)  /** - * The selected site does not exist. + * The selected site does not exist   */ -#define LIBGAMMA_NO_SUCH_SITE  (-3) +#define LIBGAMMA_NO_SUCH_SITE (-3)  /** - * The selected partition does not exist. + * The selected partition does not exist   */ -#define LIBGAMMA_NO_SUCH_PARTITION  (-4) +#define LIBGAMMA_NO_SUCH_PARTITION (-4)  /** - * The selected CRTC does not exist. + * The selected CRTC does not exist   */ -#define LIBGAMMA_NO_SUCH_CRTC  (-5) +#define LIBGAMMA_NO_SUCH_CRTC (-5)  /**   * Counter overflowed when counting the number - * of available items. + * of available items   */ -#define LIBGAMMA_IMPOSSIBLE_AMOUNT  (-6) +#define LIBGAMMA_IMPOSSIBLE_AMOUNT (-6)  /**   * The selected connector is disabled, it does - * not have a CRTC. + * not have a CRTC   */ -#define LIBGAMMA_CONNECTOR_DISABLED  (-7) +#define LIBGAMMA_CONNECTOR_DISABLED (-7)  /**   * The selected CRTC could not be opened, - * reason unknown. + * reason unknown   */ -#define LIBGAMMA_OPEN_CRTC_FAILED  (-8) +#define LIBGAMMA_OPEN_CRTC_FAILED (-8)  /**   * The CRTC information field is not supported - * by the adjustment method. + * by the adjustment method   */ -#define LIBGAMMA_CRTC_INFO_NOT_SUPPORTED  (-9) +#define LIBGAMMA_CRTC_INFO_NOT_SUPPORTED (-9)  /**   * Failed to read the current gamma ramps for - * the selected CRTC, reason unknown. + * the selected CRTC, reason unknown   */ -#define LIBGAMMA_GAMMA_RAMP_READ_FAILED  (-10) +#define LIBGAMMA_GAMMA_RAMP_READ_FAILED (-10)  /**   * Failed to write the current gamma ramps for - * the selected CRTC, reason unknown. + * the selected CRTC, reason unknown   */ -#define LIBGAMMA_GAMMA_RAMP_WRITE_FAILED  (-11) +#define LIBGAMMA_GAMMA_RAMP_WRITE_FAILED (-11)  /**   * The specified ramp sizes does not match the   * ramps sizes returned by the adjustment methods - * in response to the query/command. + * in response to the query/command   */ -#define LIBGAMMA_GAMMA_RAMP_SIZE_CHANGED  (-12) +#define LIBGAMMA_GAMMA_RAMP_SIZE_CHANGED (-12)  /**   * The specified ramp sizes are not identical - * which is required by the adjustment method. - * (Only returned in debug mode.) + * which is required by the adjustment method + *  + * (Only returned in debug mode)   */ -#define LIBGAMMA_MIXED_GAMMA_RAMP_SIZE  (-13) +#define LIBGAMMA_MIXED_GAMMA_RAMP_SIZE (-13)  /**   * The specified ramp sizes are not supported - * by the adjustment method. - * (Only returned in debug mode.) + * by the adjustment method + *  + * (Only returned in debug mode)   */ -#define LIBGAMMA_WRONG_GAMMA_RAMP_SIZE  (-14) +#define LIBGAMMA_WRONG_GAMMA_RAMP_SIZE (-14)  /**   * The adjustment method reported that the gamma - * ramps size is 1, or perhaps even zero or negative. + * ramps size is 1, or perhaps even zero or negative   */ -#define LIBGAMMA_SINGLETON_GAMMA_RAMP  (-15) +#define LIBGAMMA_SINGLETON_GAMMA_RAMP (-15)  /**   * The adjustment method failed to list - * available CRTC:s, reason unknown. + * available CRTC:s, reason unknown   */ -#define LIBGAMMA_LIST_CRTCS_FAILED  (-16) +#define LIBGAMMA_LIST_CRTCS_FAILED (-16)  /**   * Failed to acquire mode resources from the - * adjustment method. + * adjustment method   */ -#define LIBGAMMA_ACQUIRING_MODE_RESOURCES_FAILED  (-17) +#define LIBGAMMA_ACQUIRING_MODE_RESOURCES_FAILED (-17)  /**   * The adjustment method reported that a negative - * number of partitions exists in the site. + * number of partitions exists in the site   */ -#define LIBGAMMA_NEGATIVE_PARTITION_COUNT  (-18) +#define LIBGAMMA_NEGATIVE_PARTITION_COUNT (-18)  /**   * The adjustment method reported that a negative - * number of CRTC:s exists in the partition. + * number of CRTC:s exists in the partition   */ -#define LIBGAMMA_NEGATIVE_CRTC_COUNT  (-19) +#define LIBGAMMA_NEGATIVE_CRTC_COUNT (-19)  /**   * Device cannot be access becauses of - * insufficient permissions. + * insufficient permissions   */ -#define LIBGAMMA_DEVICE_RESTRICTED  (-20) +#define LIBGAMMA_DEVICE_RESTRICTED (-20)  /** - * Device cannot be access, reason unknown. + * Device cannot be access, reason unknown   */ -#define LIBGAMMA_DEVICE_ACCESS_FAILED  (-21) +#define LIBGAMMA_DEVICE_ACCESS_FAILED (-21)  /**   * Device cannot be access, membership of the   * `libgamma_group_gid` (named by `libgamma_group_name`   * (can be `NULL`, if so `errno` may have been set - * to tell why)) is required. + * to tell why)) is required   */ -#define LIBGAMMA_DEVICE_REQUIRE_GROUP  (-22) +#define LIBGAMMA_DEVICE_REQUIRE_GROUP (-22)  /** - * The graphics card appear to have been removed. + * The graphics card appear to have been removed   */ -#define LIBGAMMA_GRAPHICS_CARD_REMOVED  (-23) +#define LIBGAMMA_GRAPHICS_CARD_REMOVED (-23)  /** - * The state of the requested information is unknown. + * The state of the requested information is unknown   */ -#define LIBGAMMA_STATE_UNKNOWN  (-24) +#define LIBGAMMA_STATE_UNKNOWN (-24)  /**   * Failed to determine which connector the - * CRTC belongs to. + * CRTC belongs to   */ -#define LIBGAMMA_CONNECTOR_UNKNOWN  (-25) +#define LIBGAMMA_CONNECTOR_UNKNOWN (-25)  /**   * The detected connector type is not listed - * in this library and has to be updated. + * in this library and has to be updated   */ -#define LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED  (-26) +#define LIBGAMMA_CONNECTOR_TYPE_NOT_RECOGNISED (-26)  /**   * The detected subpixel order is not listed - * in this library and has to be updated. + * in this library and has to be updated   */ -#define LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED  (-27) +#define LIBGAMMA_SUBPIXEL_ORDER_NOT_RECOGNISED (-27)  /**   * The length of the EDID does not match that - * of any supported EDID structure revision. + * of any supported EDID structure revision   */ -#define LIBGAMMA_EDID_LENGTH_UNSUPPORTED  (-28) +#define LIBGAMMA_EDID_LENGTH_UNSUPPORTED (-28)  /**   * The magic number in the EDID does not match - * that of any supported EDID structure revision. + * that of any supported EDID structure revision   */ -#define LIBGAMMA_EDID_WRONG_MAGIC_NUMBER  (-29) +#define LIBGAMMA_EDID_WRONG_MAGIC_NUMBER (-29)  /**   * The EDID structure revision used by the - * monitor is not supported. + * monitor is not supported   */ -#define LIBGAMMA_EDID_REVISION_UNSUPPORTED  (-30) +#define LIBGAMMA_EDID_REVISION_UNSUPPORTED (-30)  /**   * The gamma characteristics field in the EDID - * is left unspecified. - * (This could be considered a non-error.) + * is left unspecified + *  + * (This could be considered a non-error)   */ -#define LIBGAMMA_GAMMA_NOT_SPECIFIED  (-31) +#define LIBGAMMA_GAMMA_NOT_SPECIFIED (-31)  /**   * The checksum in the EDID is incorrect, all   * request information has been provided - * by you cannot count on it. + * by you cannot count on it   */ -#define LIBGAMMA_EDID_CHECKSUM_ERROR  (-32) +#define LIBGAMMA_EDID_CHECKSUM_ERROR (-32)  /**   * Both of the errors `LIBGAMMA_GAMMA_NOT_SPECIFIED` - * and `LIBGAMMA_EDID_CHECKSUM_ERROR` have occurred. + * and `LIBGAMMA_EDID_CHECKSUM_ERROR` have occurred   */ -#define LIBGAMMA_GAMMA_NOT_SPECIFIED_AND_EDID_CHECKSUM_ERROR  (-33) +#define LIBGAMMA_GAMMA_NOT_SPECIFIED_AND_EDID_CHECKSUM_ERROR (-33)  /**   * Failed to query the gamma ramps size from the - * adjustment method, reason unknown. + * adjustment method, reason unknown   */ -#define LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED  (-34) +#define LIBGAMMA_GAMMA_RAMPS_SIZE_QUERY_FAILED (-34)  /**   * The selected partition could not be opened, - * reason unknown. + * reason unknown   */ -#define LIBGAMMA_OPEN_PARTITION_FAILED  (-35) +#define LIBGAMMA_OPEN_PARTITION_FAILED (-35)  /**   * The selected site could not be opened, - * reason unknown. + * reason unknown   */ -#define LIBGAMMA_OPEN_SITE_FAILED  (-36) +#define LIBGAMMA_OPEN_SITE_FAILED (-36)  /**   * Failed to query the adjustment method for - * its protocol version, reason unknown. + * its protocol version, reason unknown   */ -#define LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED  (-37) +#define LIBGAMMA_PROTOCOL_VERSION_QUERY_FAILED (-37)  /**   * The adjustment method's version of its - * protocol is not supported. + * protocol is not supported   */ -#define LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED  (-38) +#define LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED (-38)  /**   * The adjustment method failed to list - * available partitions, reason unknown. + * available partitions, reason unknown   */ -#define LIBGAMMA_LIST_PARTITIONS_FAILED  (-39) +#define LIBGAMMA_LIST_PARTITIONS_FAILED (-39)  /**   * Partition exists by index, but the partition - * at that index does not exist. + * at that index does not exist   */ -#define LIBGAMMA_NULL_PARTITION  (-40) +#define LIBGAMMA_NULL_PARTITION (-40)  /**   * There is not monitor connected to the - * connector of the selected CRTC. + * connector of the selected CRTC   */ -#define LIBGAMMA_NOT_CONNECTED  (-41) +#define LIBGAMMA_NOT_CONNECTED (-41)  /**   * Data extraction from a reply from the - * adjustment method failed, reason unknown. + * adjustment method failed, reason unknown   */ -#define LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED  (-42) +#define LIBGAMMA_REPLY_VALUE_EXTRACTION_FAILED (-42)  /** - * No EDID property was found on the output. + * No EDID property was found on the output   */ -#define LIBGAMMA_EDID_NOT_FOUND  (-43) +#define LIBGAMMA_EDID_NOT_FOUND (-43)  /**   * Failed to list properties on the output, - * reason unknown. + * reason unknown   */ -#define LIBGAMMA_LIST_PROPERTIES_FAILED  (-44) +#define LIBGAMMA_LIST_PROPERTIES_FAILED (-44)  /**   * Failed to query a property's value from - * the output, reason unknown. + * the output, reason unknown   */ -#define LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED  (-45) +#define LIBGAMMA_PROPERTY_VALUE_QUERY_FAILED (-45)  /**   * A request for information on an output - * failed, reason unknown. + * failed, reason unknown   */ -#define LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED  (-46) +#define LIBGAMMA_OUTPUT_INFORMATION_QUERY_FAILED (-46) @@ -341,7 +328,7 @@ extern const char* libgamma_group_name;   * number your program thinks it should be sould   * update your program for new errors.   */ -#define LIBGAMMA_ERROR_MIN  (-46) +#define LIBGAMMA_ERROR_MIN (-46) @@ -359,35 +346,34 @@ extern const char* libgamma_group_name;   * required group will be printed with its numerical value   * and, if known, its name.   *  - * @param  name   The text to add at the beginning. - * @param  value  The error code, may be an `errno` value. + * @param  name        The text to add at the beginning + * @param  error_code  The error code, may be an `errno` value   */ -void libgamma_perror(const char* name, int error_code); +void libgamma_perror(const char *, int);  /** - * Returns the name of the definition associated with a `libgamma` error code. + * Returns the name of the definition associated with a `libgamma` error code   *  - * @param   value  The error code. + * @param   value  The error code   * @return         The name of the definition associated with the error code,   *                 `NULL` if the error code does not exist. The return string   *                 should not be `free`:d.   */ -const char* libgamma_name_of_error(int value) __attribute__((const)); +const char *libgamma_name_of_error(int) __attribute__((const));  /** - * Return the value of a `libgamma` error definition refered to by name. + * Return the value of a `libgamma` error definition refered to by name   *  - * @param   name  The name of the definition associated with the error code. + * @param   name  The name of the definition associated with the error code   * @return        The error code, zero if the name is `NULL` - *                or does not refer to a `libgamma` error. + *                or does not refer to a `libgamma` error   */ -int libgamma_value_of_error(const char* name) __attribute__((const)); +int libgamma_value_of_error(const char *) __attribute__((const)); -#ifndef __GCC__ +#ifndef __GNUC__  # undef __attribute__  #endif  #endif - diff --git a/src/lib/libgamma-facade.c.gpp b/src/lib/libgamma-facade.c.gpp index 1dfa99b..9f90ed6 100644 --- a/src/lib/libgamma-facade.c.gpp +++ b/src/lib/libgamma-facade.c.gpp @@ -1,21 +1,5 @@  /* -*- c -*- */ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #include "libgamma-facade.h"  #include "libgamma-error.h" @@ -23,22 +7,23 @@  #include "gamma-helper.h" -/* Initialise the general preprocessor. */ +/* Initialise the general preprocessor */  $>cd src/extract  $>export PATH=".:${PATH}" -/* Some general preprocessor we will use frequently. */ +/* Some general preprocessor we will use frequently */  $<  get-methods () -{ ./libgamma-method-extract --list --method | cut -d _ -f 1,2 --complement +{ +	./libgamma-method-extract --list --method | cut -d _ -f 1,2 --complement  }  lowercase () -{ echo "$*" | sed -e y/QWERTYUIOPASDFGHJKLZXCVBNM/qwertyuiopasdfghjklzxcvbnm/ | sed -e s:core_graphics:cg:g +{ +	echo "$*" | sed -e y/QWERTYUIOPASDFGHJKLZXCVBNM/qwertyuiopasdfghjklzxcvbnm/ | sed -e s:core_graphics:cg:g  }  $> -/* Include all adjustment methods that -   are enabled at compile-time. */ +/* Include all adjustment methods that are enabled at compile-time. */  $>for method in $(get-methods); do  #ifdef HAVE_LIBGAMMA_METHOD_${method}  # include "gamma-$(lowercase $method | sed -e s:_:-:g).h" @@ -57,10 +42,10 @@ $>done  /* Some things to reduce warnings when we do -   not have any adjustment methods enabled. */ + * not have any adjustment methods enabled */  #ifndef HAVE_LIBGAMMA_METHODS  # define HAVE_NO_LIBGAMMA_METHODS -# ifdef __GCC__ +# ifdef __GNUC__  #  pragma GCC diagnostic push  #  pragma GCC diagnostic ignored "-Wsuggest-attribute=const"  # endif @@ -71,282 +56,286 @@ $>done  #ifdef HAVE_LIBGAMMA_METHODS  # ifdef HAVE_LIBGAMMA_METHOD_LINUX_DRM  /** - * Test whether a file descriptor refers to a VT. + * Test whether a file descriptor refers to a VT   *  - * @param   fd  The file descriptor. - * @return      Whether the file descriptor refers to a VT. + * @param   fd  The file descriptor + * @return      Whether the file descriptor refers to a VT   */ -static int libgamma_is_vt_proper(int fd) +static int +libgamma_is_vt_proper(int fd)  { -  char buf[32]; -  char digit0; -   -  /* Get TTY. */ -  if (ttyname_r(fd, buf, sizeof(buf) / sizeof(char))) -    return 0; -   -  /* Validate TTY path. */ -  if (!strcmp(buf, "/dev/console")) -    return 1; -  if (strstr(buf, "/dev/tty") != buf) -    return 0; -   -  /* Validate TTY name. */ -  digit0 = buf[strlen("/dev/tty")]; -  return ('1' <= digit0) && (digit0 <= '9'); +	char buf[32], digit0; + +	/* Get TTY */ +	if (ttyname_r(fd, buf, sizeof(buf) / sizeof(char))) +		return 0; + +	/* Validate TTY path */ +	if (!strcmp(buf, "/dev/console")) +		return 1; +	if (strstr(buf, "/dev/tty") != buf) +		return 0; + +	/* Validate TTY name */ +	digit0 = buf[strlen("/dev/tty")]; +	return '1' <= digit0 && digit0 <= '9';  }  # endif  /** - * Test the availability of an adjustment method. + * Test the availability of an adjustment method   *  - * @param  method     The adjustment method. + * @param  method     The adjustment method   * @param  operation  Allowed values: - *                      0: Pass if the environment suggests it will work but is not fake. - *                      1: Pass if the environment suggests it will work. - *                      2: Pass if real and not fake. - *                      3: Pass if real. - *                      4: Always pass. - *                    Other values invoke undefined behaviour. - * @return            Whether the test passed. + *                      0: Pass if the environment suggests it will work but is not fake + *                      1: Pass if the environment suggests it will work + *                      2: Pass if real and not fake + *                      3: Pass if real + *                      4: Always pass + *                    Other values invoke undefined behaviour + * @return            Whether the test passed   */ -static int libgamma_list_method_test(int method, int operation) +static int +libgamma_list_method_test(int method, int operation)  { -  libgamma_method_capabilities_t caps; -  libgamma_method_capabilities(&caps, method); -   -  switch (operation) -    { -    case 0: -      /* Methods that the environment suggests will work, excluding fake. */ -      if (caps.fake) -	return 0; -      /* Fall through. */ -       -    case 1: -      /* Methods that the environment suggests will work, including fake. */ -      if (caps.real == 0) -	return 0; +	libgamma_method_capabilities_t caps; +	libgamma_method_capabilities(&caps, method); + +	switch (operation) { +	case 0: +		/* Methods that the environment suggests will work, excluding fake */ +		if (caps.fake) +			return 0; +		/* fall through */ + +	case 1: +		/* Methods that the environment suggests will work, including fake */ +		if (!caps.real) +			return 0;  #ifdef HAVE_LIBGAMMA_METHOD_LINUX_DRM -      if (method == LIBGAMMA_METHOD_LINUX_DRM) -	return libgamma_is_vt_proper(STDIN_FILENO) || -	       libgamma_is_vt_proper(STDOUT_FILENO) || -	       libgamma_is_vt_proper(STDERR_FILENO); +		if (method == LIBGAMMA_METHOD_LINUX_DRM) { +			return libgamma_is_vt_proper(STDIN_FILENO) || +			       libgamma_is_vt_proper(STDOUT_FILENO) || +			       libgamma_is_vt_proper(STDERR_FILENO); +		}  #endif  #ifdef HAVE_LIBGAMMA_METHOD_DUMMY -      if (method == LIBGAMMA_METHOD_DUMMY) -	return 0; +		if (method == LIBGAMMA_METHOD_DUMMY) +			return 0;  #endif -      return caps.default_site_known; -       -    case 2: -      /* All real non-fake methods. */ -      return caps.real && (caps.fake == 0); -       -    case 3: -      /* All real methods. */ -      return caps.real; -       -    default: -      /* All methods. */ -      return 1; -    } +		return caps.default_site_known; + +	case 2: +		/* All real non-fake methods */ +		return caps.real && !caps.fake; + +	case 3: +		/* All real methods */ +		return caps.real; + +	default: +		/* All methods */ +		return 1; +	}  }  #endif  /** - * List available adjustment methods by their order of preference based on the environment. + * List available adjustment methods by their order of preference based on the environment   *  - * @param  methods    Output array of methods, should be able to hold `LIBGAMMA_METHOD_COUNT` elements. + * @param  methods    Output array of methods, should be able to hold `LIBGAMMA_METHOD_COUNT` elements   * @param  buf_size   The number of elements that fits in `methods`, it should be `LIBGAMMA_METHOD_COUNT`,   *                    This is used to avoid writing outside the output buffer if this library adds new - *                    adjustment methods without the users of the library recompiling. + *                    adjustment methods without the users of the library recompiling   * @param  operation  Allowed values: - *                      0: Methods that the environment suggests will work, excluding fake. - *                      1: Methods that the environment suggests will work, including fake. - *                      2: All real non-fake methods. - *                      3: All real methods. - *                      4: All methods. - *                    Other values invoke undefined behaviour. + *                      0: Methods that the environment suggests will work, excluding fake + *                      1: Methods that the environment suggests will work, including fake + *                      2: All real non-fake methods + *                      3: All real methods + *                      4: All methods + *                    Other values invoke undefined behaviour   * @return            The number of element that have been stored in `methods`, or should   *                    have been stored if the buffer was large enough.   */ -size_t libgamma_list_methods(int* restrict methods, size_t buf_size, int operation) +size_t +libgamma_list_methods(int *restrict methods, size_t buf_size, int operation)  {  #ifdef HAVE_NO_LIBGAMMA_METHODS -  (void) methods; -  (void) buf_size; -  (void) operation; -  return 0; +	(void) methods; +	(void) buf_size; +	(void) operation; +	return 0;  #else -  size_t n = 0; -   +	size_t n = 0; +  $>for method in $(get-methods); do  #ifdef HAVE_LIBGAMMA_METHOD_${method} -  if (libgamma_list_method_test(LIBGAMMA_METHOD_${method}, operation) && (n++ < buf_size)) -    methods[n - 1] = LIBGAMMA_METHOD_${method}; +	if (libgamma_list_method_test(LIBGAMMA_METHOD_${method}, operation) && n++ < buf_size) +		methods[n - 1] = LIBGAMMA_METHOD_${method};  #endif  $>done -   -  return n; + +	return n;  #endif  }  /**   * Check whether an adjustment method is available, non-existing (invalid) methods will be - * identified as not available under the rationale that the library may be out of date. + * identified as not available under the rationale that the library may be out of date   *  - * @param   method  The adjustment method. - * @return          Whether the adjustment method is available. + * @param   method  The adjustment method + * @return          Whether the adjustment method is available   */ -int libgamma_is_method_available(int method) +int +libgamma_is_method_available(int method)  {  #ifdef HAVE_NO_LIBGAMMA_METHODS -  (void) method; -  return 0; +	(void) method; +	return 0;  #else -  switch (method) -    { +	switch (method) {  $>for method in $(get-methods); do  #ifdef HAVE_LIBGAMMA_METHOD_${method} -    case LIBGAMMA_METHOD_${method}: +	case LIBGAMMA_METHOD_${method}:  #endif  $>done -      return 1; -       -    default: -      return 0; -    } +	return 1; + +	default: +		return 0; +	}  #endif  }  /** - * Call the adjustment method's implementation of the called function. + * Call the adjustment method's implementation of the called function   *  - * @param  1  The adjustment method, you may use `.` instead of `->` when resolving it. - * @param  2  `return` if the function returns a value, `break` otherwise. + * @param  1  The adjustment method, you may use `.` instead of `->` when resolving it + * @param  2  `return` if the function returns a value, `break` otherwise   * @param  3  The base name of the function to call, that is, the name of the function - *            this is expended into without the libgamma namespace prefix. - * @param  *  The function's parameters. + *            this is expended into without the libgamma namespace prefix + * @param  *  The function's parameters   */  $<switch ()  $>{ -  /* Read out macro's parameters. */ +  /* Read out macro's parameters */  $<method="${1//./->}"    ctrl=$2    fun=$3    shift 3    params="$*"  $>params="${params// /, }" -   -  switch (${method}) -    { + +	switch (${method}) {  $>for adjmethod in $(get-methods); do  #ifdef HAVE_LIBGAMMA_METHOD_${adjmethod} -    case LIBGAMMA_METHOD_${adjmethod}: -      /* Call the adjustment method's implementation, either -	 return or break after it depending on macro parameter's. */ -$>[ $ctrl = return ] && +	case LIBGAMMA_METHOD_${adjmethod}: +	/* Call the adjustment method's implementation, either +	 * return or break after it depending on macro parameter's */ +$> if [ $ctrl = return ]; then        return        libgamma_$(lowercase $adjmethod)_${fun}(${params}); -$>[ ! $ctrl = return ] && +$> elif [ ! $ctrl = return ]; then        break; +$> fi  #endif  $>done -    default: -      /* If the adjustment method does not exists, either return -	 that error, or do nothing because the function this is -	 expanded into does return errors. */ +	default: +		/* If the adjustment method does not exists, either return +		 * that error, or do nothing because the function this is +		 * expanded into does return errors */  $>if [ $ctrl = return ]; then -      return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD; +		return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD;  $>else -      /* Method does not exists/excluded at compile-time. -	 We will assume that this is not done... */ -      break; +		/* Method does not exists/excluded at compile-time. +		 * We will assume that this is not done... */ +		break;  $>fi -    } +	}  $>}  /** - * Return the capabilities of an adjustment method. + * Return the capabilities of an adjustment method   *  - * @param  this    The data structure to fill with the method's capabilities. - * @param  method  The adjustment method (display server and protocol.) + * @param  this    The data structure to fill with the method's capabilities + * @param  method  The adjustment method (display server and protocol)   */ -void libgamma_method_capabilities(libgamma_method_capabilities_t* restrict this, int method) +void +libgamma_method_capabilities(libgamma_method_capabilities_t *restrict this, int method)  { -  memset(this, 0, sizeof(libgamma_method_capabilities_t)); +	memset(this, 0, sizeof(libgamma_method_capabilities_t));  $>switch method break method_capabilities this  }  /** - * Return the default site for an adjustment method. + * Return the default site for an adjustment method   *  - * @param   method  The adjustment method (display server and protocol.) + * @param   method  The adjustment method (display server and protocol)   * @return          The default site, `NULL` if it cannot be determined or   *                  if multiple sites are not supported by the adjustment - *                  method. This value should not be `free`:d. + *                  method; this value should not be `free`:d   */ -char* libgamma_method_default_site(int method) +char * +libgamma_method_default_site(int method)  { -  const char* restrict var = libgamma_method_default_site_variable(method); -  char* restrict env; -   -  /* Return `NULL` there is not variable to read. */ -  if (var == NULL) -    return NULL; -   -  /* Read the variable. */ -  env = getenv(var); -  /* Return `NULL` if it does not exist (or is empty). */ -  if ((env == NULL) || (*env == '\0')) -    return NULL; -   -  /* Return the variable's value. */ -  return env; +	const char *restrict var = libgamma_method_default_site_variable(method); +	char *restrict env; + +	/* Return `NULL` there is not variable to read */ +	if (!var) +		return NULL; + +	/* Read the variable */ +	env = getenv(var); +	/* Return `NULL` if it does not exist (or is empty) */ +	if (!env || !*env) +		return NULL; + +	/* Return the variable's value */ +	return env;  }  /**   * Return the default variable that determines - * the default site for an adjustment method. + * the default site for an adjustment method   *  - * @param   method  The adjustment method (display server and protocol.) + * @param   method  The adjustment method (display server and protocol)   * @return          The environ variables that is used to determine the   *                  default site. `NULL` if there is none, that is, if   *                  the method does not support multiple sites.   *                  This value should not be `free`:d.   */ -const char* libgamma_method_default_site_variable(int method) +const char * +libgamma_method_default_site_variable(int method)  { -  switch (method) -    { +	switch (method) {  #ifdef HAVE_LIBGAMMA_METHOD_X_RANDR -    case LIBGAMMA_METHOD_X_RANDR: -      return "DISPLAY"; +	case LIBGAMMA_METHOD_X_RANDR: +		return "DISPLAY";  #endif  #ifdef HAVE_LIBGAMMA_METHOD_X_VIDMODE -    case LIBGAMMA_METHOD_X_VIDMODE: -      return "DISPLAY"; +	case LIBGAMMA_METHOD_X_VIDMODE: +		return "DISPLAY";  #endif -    default: -      return NULL; -    } +	default: +		return NULL; +	}  }  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. - * @param   method  The adjustment method (display server and protocol.) + * @param   this    The site state to initialise + * @param   method  The adjustment method (display server and protocol)   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -354,50 +343,53 @@ const char* libgamma_method_default_site_variable(int method)   *                  or allocated on the stack. Note however that it will   *                  not be `free`:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_site_initialise(libgamma_site_state_t* restrict this, -			     int method, char* restrict site) +int +libgamma_site_initialise(libgamma_site_state_t *restrict this, int method, char *restrict site)  { -  this->method = method; -  this->site = site; +	this->method = method; +	this->site = site;  $>switch method return site_initialise this site  }  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_site_destroy(libgamma_site_state_t* restrict this) +void +libgamma_site_destroy(libgamma_site_state_t *restrict this)  {  $>switch this.method break site_destroy this -  free(this->site); +	free(this->site);  }  /**   * Release all resources held by a site state - * and free the site state pointer. + * and free the site state pointer   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_site_free(libgamma_site_state_t* restrict this) +void +libgamma_site_free(libgamma_site_state_t *restrict this)  { -  libgamma_site_destroy(this); -  free(this); +	libgamma_site_destroy(this); +	free(this);  }  /** - * Restore the gamma ramps all CRTC:s with a site to the system settings. + * Restore the gamma ramps all CRTC:s with a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_site_restore(libgamma_site_state_t* restrict this) +int +libgamma_site_restore(libgamma_site_state_t *restrict this)  {  $>switch this.method return site_restore this  } @@ -405,29 +397,30 @@ $>switch this.method return site_restore this  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_partition_initialise(libgamma_partition_state_t* restrict this, -				  libgamma_site_state_t* restrict site, size_t partition) +int +libgamma_partition_initialise(libgamma_partition_state_t *restrict this, libgamma_site_state_t *restrict site, size_t partition)  { -  this->site = site; -  this->partition = partition; +	this->site = site; +	this->partition = partition;  $>switch site.method return partition_initialise this site partition  }  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_partition_destroy(libgamma_partition_state_t* restrict this) +void +libgamma_partition_destroy(libgamma_partition_state_t *restrict this)  {  $>switch this.site.method break partition_destroy this  } @@ -435,25 +428,27 @@ $>switch this.site.method break partition_destroy this  /**   * Release all resources held by a partition state - * and free the partition state pointer. + * and free the partition state pointer   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_partition_free(libgamma_partition_state_t* restrict this) +void +libgamma_partition_free(libgamma_partition_state_t *restrict this)  { -  libgamma_partition_destroy(this); -  free(this); +	libgamma_partition_destroy(this); +	free(this);  }  /** - * Restore the gamma ramps all CRTC:s with a partition to the system settings. + * Restore the gamma ramps all CRTC:s with a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_partition_restore(libgamma_partition_state_t* restrict this) +int +libgamma_partition_restore(libgamma_partition_state_t *restrict this)  {  $>switch this.site.method return partition_restore this  } @@ -461,29 +456,30 @@ $>switch this.site.method return partition_restore this  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The index of the CRTC within the partition. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The index of the CRTC within the partition   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_crtc_initialise(libgamma_crtc_state_t* restrict this, -			     libgamma_partition_state_t* restrict partition, size_t crtc) +int +libgamma_crtc_initialise(libgamma_crtc_state_t *restrict this, libgamma_partition_state_t *restrict partition, size_t crtc)  { -  this->partition = partition; -  this->crtc = crtc; +	this->partition = partition; +	this->crtc = crtc;  $>switch partition.site.method return crtc_initialise this partition crtc  }  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_crtc_destroy(libgamma_crtc_state_t* restrict this) +void +libgamma_crtc_destroy(libgamma_crtc_state_t *restrict this)  {  $>switch this.partition.site.method break crtc_destroy this  } @@ -491,25 +487,27 @@ $>switch this.partition.site.method break crtc_destroy this  /**   * Release all resources held by a CRTC state - * and free the CRTC state pointer. + * and free the CRTC state pointer   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_crtc_free(libgamma_crtc_state_t* restrict this) +void +libgamma_crtc_free(libgamma_crtc_state_t *restrict this)  { -  libgamma_crtc_destroy(this); -  free(this); +	libgamma_crtc_destroy(this); +	free(this);  }  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_crtc_restore(libgamma_crtc_state_t* restrict this) +int +libgamma_crtc_restore(libgamma_crtc_state_t *restrict this)  {  $>switch this.partition.site.method return crtc_restore this  } @@ -517,585 +515,583 @@ $>switch this.partition.site.method return crtc_restore this  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_get_crtc_information(libgamma_crtc_information_t* restrict this, -				  libgamma_crtc_state_t* restrict crtc, int32_t fields) +int +libgamma_get_crtc_information(libgamma_crtc_information_t *restrict this, libgamma_crtc_state_t *restrict crtc, int32_t fields)  {  #ifdef HAVE_NO_LIBGAMMA_METHODS -  (void) fields; +	(void) fields;  #endif -  this->edid = NULL; -  this->connector_name = NULL; +	this->edid = NULL; +	this->connector_name = NULL;  $>switch crtc.partition.site.method return get_crtc_information this crtc fields  }  /** - * Release all resources in an information data structure for a CRTC. + * Release all resources in an information data structure for a CRTC   *  - * @param  this  The CRTC information. + * @param  this  The CRTC information   */ -void libgamma_crtc_information_destroy(libgamma_crtc_information_t* restrict this) +void +libgamma_crtc_information_destroy(libgamma_crtc_information_t *restrict this)  { -  free(this->edid); -  free(this->connector_name); +	free(this->edid); +	free(this->connector_name);  }  /**   * Release all resources in an information data structure for a CRTC - * and free the data structure pointer. + * and free the data structure pointer   *  - * @param  this  The CRTC information. + * @param  this  The CRTC information   */ -void libgamma_crtc_information_free(libgamma_crtc_information_t* restrict this) +void +libgamma_crtc_information_free(libgamma_crtc_information_t *restrict this)  { -  libgamma_crtc_information_destroy(this); -  free(this); +	libgamma_crtc_information_destroy(this); +	free(this);  }  /** - * Convert a raw representation of an EDID to a hexadecimal representation. + * Convert a raw representation of an EDID to a hexadecimal representation   *  - * @param   1       Casing name. - * @param   2       The hexadecimal alphabet. - * @param   edid    The EDID in raw representation. - * @param   length  The length of `edid`. - * @return          The EDID in hexadecimal representation, - *                  `NULL` on allocation error, `errno` will be set accordingly. + * @param   1       Casing name + * @param   2       The hexadecimal alphabet + * @param   edid    The EDID in raw representation + * @param   length  The length of `edid` + * @return          The EDID in hexadecimal representation + *                  `NULL` on allocation error, `errno` will be set accordingly   */  $>behex_edid ()  $>{ -char* libgamma_behex_edid_${1}(const unsigned char* restrict edid, size_t length) +char * +libgamma_behex_edid_${1}(const unsigned char *restrict edid, size_t length)  { -  char* restrict out; -  size_t i; -   -  /* Allocate memory area for the output string. */ -  if ((out = malloc((length * 2 + 1) * sizeof(char))) == NULL) -    return NULL; -   -  /* Translate from raw octets to hexadecimal. */ -  for (i = 0; i < length; i++) -    { -      out[i * 2 + 0] = "${2}"[(edid[i] >> 4) & 15]; -      out[i * 2 + 1] = "${2}"[(edid[i] >> 0) & 15]; -    } -  /* NUL-terminate the output string. */ -  out[length * 2] = '\0'; -   -  return out; +	char *restrict out; +	size_t i; + +	/* Allocate memory area for the output string */ +	out = malloc((length * 2 + 1) * sizeof(char)); +	if (!out) +		return NULL; + +	/* Translate from raw octets to hexadecimal */ +	for (i = 0; i < length; i++) { +		out[i * 2 + 0] = "${2}"[(edid[i] >> 4) & 15]; +		out[i * 2 + 1] = "${2}"[(edid[i] >> 0) & 15]; +	} +	/* NUL-terminate the output string */ +	out[length * 2] = '\0'; + +	return out;  }  $>}  /** - * Convert a raw representation of an EDID to a lowercase hexadecimal representation. + * Convert a raw representation of an EDID to a lowercase hexadecimal representation   *  - * @param   edid    The EDID in raw representation. - * @param   length  The length of `edid`. + * @param   edid    The EDID in raw representation + * @param   length  The length of `edid`   * @return          The EDID in lowercase hexadecimal representation, - *                  `NULL` on allocation error, `errno` will be set accordingly. + *                  `NULL` on allocation error, `errno` will be set accordingly   */  $>behex_edid lowercase 0123456789abcdef  /** - * Convert a raw representation of an EDID to an uppercase hexadecimal representation. + * Convert a raw representation of an EDID to an uppercase hexadecimal representation   *  - * @param   edid    The EDID in raw representation. - * @param   length  The length of `edid`. + * @param   edid    The EDID in raw representation + * @param   length  The length of `edid`   * @return          The EDID in uppercase hexadecimal representation, - *                  NULL` on allocation error, `errno` will be set accordingly. + *                  NULL` on allocation error, `errno` will be set accordingly   */  $>behex_edid uppercase 0123456789ABCDEF  /** - * Convert an hexadecimal representation of an EDID to a raw representation. + * Convert an hexadecimal representation of an EDID to a raw representation   *  - * @param   edid  The EDID in hexadecimal representation. + * @param   edid  The EDID in hexadecimal representation   * @return        The EDID in raw representation, it will be half the length - *                of `edid` (the input value). `NULL` on allocation error or - *                if the EDID is malformated, `errno` will be set accordingly. + *                of `edid` (the input value); `NULL` on allocation error or + *                if the EDID is malformated, `errno` will be set accordingly   */ -unsigned char* libgamma_unhex_edid(const char* restrict edid) +unsigned char * +libgamma_unhex_edid(const char *restrict edid)  { -#define not_range(lower, V, upper)  ((V < lower) || (upper < V)) -#define is_not_hex(V)  (not_range('0', V, '9') && not_range('a', V, 'f') && not_range('A', V, 'F')) -   -  unsigned char* restrict out; -  size_t n = strlen(edid); -  size_t i; -   -  /* Check that the length of the strings is even, -     otherwise it cannot represent bytes. */ -  if ((n & 1)) -    return errno = EINVAL, NULL; -   -  /* Allocate memory area for output octet array. */ -  if ((out = malloc(n /= 2 * sizeof(unsigned char))) == NULL) -    return NULL; -   -  /* Convert to raw octet array. */ -  for (i = 0; i < n; i++) -    { -      /* Get the next character pair that, it represents an octet.o */ -      char a = edid[i * 2 + 0]; -      char b = edid[i * 2 + 1]; -       -      /* Verify that the input is in hexadecimal. */ -      if (is_not_hex(a) || is_not_hex(b)) -	{ -	  free(out); -	  return errno = EINVAL, NULL; +#define not_range(lower, V, upper) (V < lower || upper < V) +#define is_not_hex(V)              (not_range('0', V, '9') && not_range('a', V, 'f') && not_range('A', V, 'F')) + +	unsigned char *restrict out; +	size_t i, n = strlen(edid); +	char a, b; + +	/* Check that the length of the strings is even, +	 * otherwise it cannot represent bytes */ +	if (n & 1) { +		errno = EINVAL; +		return NULL;  	} -       -      /* Convert each chararacter to raw format. */ -      a = (char)((a & 15) + (a > '9' ? 9 : 0)); -      b = (char)((b & 15) + (b > '9' ? 9 : 0)); -       -      /* Combine the two characters into one octet. */ -      out[i] = (unsigned char)((a << 4) | b); -    } -   -  return out; -   + +	/* Allocate memory area for output octet array */ +	n /= 2 * sizeof(unsigned char); +	out = malloc(n); +	if (!out) +		return NULL; + +	/* Convert to raw octet array */ +	for (i = 0; i < n; i++) { +		/* Get the next character pair that, it represents an octet. */ +		a = edid[i * 2 + 0]; +		b = edid[i * 2 + 1]; + +		/* Verify that the input is in hexadecimal */ +		if (is_not_hex(a) || is_not_hex(b)) { +			free(out); +			errno = EINVAL; +			return NULL; +		} + +		/* Convert each chararacter to raw format */ +		a = (char)((a & 15) + (a > '9' ? 9 : 0)); +		b = (char)((b & 15) + (b > '9' ? 9 : 0)); + +		/* Combine the two characters into one octet */ +		out[i] = (unsigned char)((a << 4) | b); +	} + +	return out; +  #undef is_hex  #undef not_range  }  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps16_t* restrict ramps) +int +libgamma_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t *restrict ramps)  { +	libgamma_gamma_ramps_any_t ramps_; +  #ifdef HAVE_NO_LIBGAMMA_METHODS -  (void) ramps; +	(void) ramps;  #endif -   -  switch (this->partition->site->method) -    { -      /* Methods other than Quartz/CoreGraphics uses 16-bit integers. */ + +	switch (this->partition->site->method) { +	/* Methods other than Quartz/CoreGraphics uses 16-bit integers */  $>for method in $(get-methods | grep -v QUARTZ_CORE_GRAPHICS); do  #ifdef HAVE_LIBGAMMA_METHOD_${method} -    case LIBGAMMA_METHOD_${method}: -      return libgamma_$(lowercase $method)_crtc_get_gamma_ramps16(this, ramps); +	case LIBGAMMA_METHOD_${method}: +		return libgamma_$(lowercase $method)_crtc_get_gamma_ramps16(this, ramps);  #endif -      -     /* The Quartz/CoreGraphics method uses single precision float. */ + +	/* The Quartz/CoreGraphics method uses single precision float */  $>done  #ifdef HAVE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS -    case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS: -      { -	libgamma_gamma_ramps_any_t ramps_; -	ramps_.bits16 = *ramps; -	return libgamma_translated_ramp_get(this, &ramps_, 16, -1, -					    libgamma_crtc_get_gamma_rampsf); -      } +	case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS: +		ramps_.bits16 = *ramps; +		return libgamma_translated_ramp_get(this, &ramps_, 16, -1, libgamma_crtc_get_gamma_rampsf);  #endif -       -      /* The selected method does not exist. */ -    default: -      return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD; -    } + +	/* The selected method does not exist */ +	default: +		return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD; +	}  }  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps16_t ramps) +int +libgamma_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict this, libgamma_gamma_ramps16_t ramps)  { +	libgamma_gamma_ramps_any_t ramps_; +  #ifdef HAVE_NO_LIBGAMMA_METHODS -  (void) ramps; +	(void) ramps;  #endif -  switch (this->partition->site->method) -    { -      /* Methods other than Quartz/CoreGraphics uses 16-bit integers. */ +	switch (this->partition->site->method) { +	/* Methods other than Quartz/CoreGraphics uses 16-bit integers */  $>for method in $(get-methods | grep -v QUARTZ_CORE_GRAPHICS); do  #ifdef HAVE_LIBGAMMA_METHOD_${method} -    case LIBGAMMA_METHOD_${method}: -      return libgamma_$(lowercase $method)_crtc_set_gamma_ramps16(this, ramps); +	case LIBGAMMA_METHOD_${method}: +		return libgamma_$(lowercase $method)_crtc_set_gamma_ramps16(this, ramps);  #endif  $>done -     /* The Quartz/CoreGraphics method uses single precision float. */ +	/* The Quartz/CoreGraphics method uses single precision float */  #ifdef HAVE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS -    case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS: -      { -	libgamma_gamma_ramps_any_t ramps_; -	ramps_.bits16 = ramps; -	return libgamma_translated_ramp_set(this, ramps_, 16, -1, -					    libgamma_crtc_set_gamma_rampsf); -      } +	case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS: +		ramps_.bits16 = ramps; +		return libgamma_translated_ramp_set(this, ramps_, 16, -1, libgamma_crtc_set_gamma_rampsf);  #endif -       -      /* The selected method does not exist. */ -    default: -      return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD; -    } + +	/* The selected method does not exist. */ +	default: +		return LIBGAMMA_NO_SUCH_ADJUSTMENT_METHOD; +	}  }  /** - * Set or get the gamma ramps for a CRTC, non-16-bit gamma-depth version. + * Set or get the gamma ramps for a CRTC, non-16-bit gamma-depth version   *  - * @param   1      Either `get` or `set`, for the action that the name of value implies. - * @param   2      The `ramp*` pattern for the ramp structure and function to call. + * @param   1      Either `get` or `set`, for the action that the name of value implies + * @param   2      The `ramp*` pattern for the ramp structure and function to call   * @param   3      Either of `bit8`, `bit16`, `bit32`, `bit64`, `float_single`, `float_double`; - *                 rather self-explanatory. + *                 rather self-explanatory   * @param   4      The number of bits in the gamma depth, -1 for single precision float, - *                 (`float`) and -2 for double percition float (`double`). - * @param   this   The CRTC state. + *                 (`float`) and -2 for double percition float (`double`) + * @param   this   The CRTC state   * @param   ramps  The gamma ramps to apply, or - *                 the gamma ramps to fill with the current values. + *                 the gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps ()  $>{ -$< -  action=$1 +$<action=$1    ramps=$2    type=$3    bits=$4    p= -  [ $action = get ] && p='*' +  if [ $action = get ]; then +    p='*' +  fi  $> -int libgamma_crtc_${action}_gamma_${ramps}(libgamma_crtc_state_t* restrict this, -					   libgamma_gamma_${ramps}_t${p:+* restrict} ramps) +int +libgamma_crtc_${action}_gamma_${ramps}(libgamma_crtc_state_t *restrict this, libgamma_gamma_${ramps}_t${p:+* restrict} ramps)  { -  libgamma_gamma_ramps_any_t ramps_; -  switch (this->partition->site->method) -    { -      /* The dummy method supports all ramp depths. */ +	libgamma_gamma_ramps_any_t ramps_; +	switch (this->partition->site->method) { +	/* The dummy method supports all ramp depths */  #ifdef HAVE_LIBGAMMA_METHOD_DUMMY -    case LIBGAMMA_METHOD_DUMMY: -      return libgamma_dummy_crtc_${action}_gamma_${ramps}(this, ramps); +	case LIBGAMMA_METHOD_DUMMY: +		return libgamma_dummy_crtc_${action}_gamma_${ramps}(this, ramps);  #endif -       -      /* The Quartz/CoreGraphics method uses single precision float. */ + +	/* The Quartz/CoreGraphics method uses single precision float */  #ifdef HAVE_LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS -    case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS: +	case LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS:  $>if [ $bits = -1 ]; then -      /* Single precision float is used. */ -      return libgamma_quartz_cg_crtc_${action}_gamma_${ramps}(this, ramps); +		/* Single precision float is used */ +		return libgamma_quartz_cg_crtc_${action}_gamma_${ramps}(this, ramps);  $>else -      /* Something else is used and we convert to Single precision float. */ -      ramps_.${type} = ${p}ramps; -      return libgamma_translated_ramp_${action}(this, ${p:+&}ramps_, ${bits}, -1, -						libgamma_crtc_${action}_gamma_rampsf); +		/* Something else is used and we convert to Single precision float */ +		ramps_.${type} = ${p}ramps; +		return libgamma_translated_ramp_${action}(this, ${p:+&}ramps_, ${bits}, -1, libgamma_crtc_${action}_gamma_rampsf);  $>fi  #endif -       -      /* Other methods use 16-bit integers. */ -    default: -      ramps_.${type} = ${p}ramps; -      return libgamma_translated_ramp_${action}(this, ${p:+&}ramps_, ${bits}, 16, -						libgamma_crtc_${action}_gamma_ramps16); -    } + +	/* Other methods use 16-bit integers. */ +	default: +		ramps_.${type} = ${p}ramps; +		return libgamma_translated_ramp_${action}(this, ${p:+&}ramps_, ${bits}, 16, libgamma_crtc_${action}_gamma_ramps16); +	}  }  $>}  /** - * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps get ramps8 bits8 8  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps set ramps8 bits8 8  /** - * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps get ramps32 bits32 32  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps set ramps32 bits32 32  /** - * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps get ramps64 bits64 64  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps set ramps64 bits64 64  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps get rampsf float_single -1  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps set rampsf float_single -1  /** - * Get the current gamma ramps for a CRTC, `double` version. + * Get the current gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps get rampsd float_double -2  /** - * Set the gamma ramps for a CRTC, `double` version. + * Set the gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */  $>crtc_set_get_gamma_ramps set rampsd float_double -2  /** - * Set the gamma ramps for a CRTC. + * Set the gamma ramps for a CRTC   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   1               The data type for the ramp stop elements. - * @param   2               The `ramp*` pattern for the ramp structure and function to call. - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   1               The data type for the ramp stop elements + * @param   2               The `ramp*` pattern for the ramp structure and function to call + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f ()  $>{ -int libgamma_crtc_set_gamma_${2}_f(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_${2}_fun* red_function, -				   libgamma_gamma_${2}_fun* green_function, -				   libgamma_gamma_${2}_fun* blue_function) +int +libgamma_crtc_set_gamma_${2}_f(libgamma_crtc_state_t *restrict this, libgamma_gamma_${2}_fun *red_function, +                               libgamma_gamma_${2}_fun *green_function, libgamma_gamma_${2}_fun *blue_function)  { -  libgamma_crtc_information_t info; -  libgamma_gamma_${2}_t ramps; -  size_t i, n; -  int e; -   -  /* Get the size of the gamma ramps. */ -  if (libgamma_get_crtc_information(&info, this, LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) -    { -      if ((e = info.gamma_size_error) < 0) +	libgamma_crtc_information_t info; +	libgamma_gamma_${2}_t ramps; +	size_t i, n; +	int e; + +	/* Get the size of the gamma ramps */ +	if (libgamma_get_crtc_information(&info, this, LIBGAMMA_CRTC_INFO_GAMMA_SIZE)) { +		e = info.gamma_size_error; +		if (e < 0) +			return e; +		errno = e; +		return LIBGAMMA_ERRNO_SET; +	} + +	/* Copy the size of the gamma ramps and calculte the grand size */ +	n  = ramps.  red_size = info.  red_gamma_size; +	n += ramps.green_size = info.green_gamma_size; +	n += ramps. blue_size = info. blue_gamma_size; + +	/* Allocate gamma ramps */ +	ramps.  red = malloc(n * sizeof(${1})); +	ramps.green = &ramps.  red[ramps.  red_size]; +	ramps. blue = &ramps.green[ramps.green_size]; +	if (!ramps.red) +		return LIBGAMMA_ERRNO_SET; + +	/* Generate the gamma ramp for the red chennel */ +	for (i = 0, n = ramps.red_size; i < n; i++) +		ramps.red[i] = red_function((float)i / (float)(n - 1)); + +	/* Generate the gamma ramp for the green chennel */ +	for (i = 0, n = ramps.green_size; i < n; i++) +		ramps.green[i] = green_function((float)i / (float)(n - 1)); + +	/* Generate the gamma ramp for the blue chennel */ +	for (i = 0, n = ramps.blue_size; i < n; i++) +		ramps.blue[i] = blue_function((float)i / (float)(n - 1)); + +	/* Apply the gamma ramps */ +	e = libgamma_crtc_set_gamma_${2}(this, ramps); +	free(ramps.red);  	return e; -      return errno = e, LIBGAMMA_ERRNO_SET; -    } -   -  /* Copy the size of the gamma ramps and calculte the grand size. */ -  n  = ramps.  red_size = info.  red_gamma_size; -  n += ramps.green_size = info.green_gamma_size; -  n += ramps. blue_size = info. blue_gamma_size; -   -  /* Allocate gamma ramps. */ -  ramps.  red = malloc(n * sizeof(${1})); -  ramps.green = ramps.  red + ramps.  red_size; -  ramps. blue = ramps.green + ramps.green_size; -  if (ramps.red == NULL) -    return LIBGAMMA_ERRNO_SET; -   -  /* Generate the gamma ramp for the red chennel. */ -  for (i = 0, n = ramps.red_size; i < n; i++) -    ramps.red[i] = red_function((float)i / (float)(n - 1)); -   -  /* Generate the gamma ramp for the green chennel. */ -  for (i = 0, n = ramps.green_size; i < n; i++) -    ramps.green[i] = green_function((float)i / (float)(n - 1)); -   -  /* Generate the gamma ramp for the blue chennel. */ -  for (i = 0, n = ramps.blue_size; i < n; i++) -    ramps.blue[i] = blue_function((float)i / (float)(n - 1)); -   -  /* Apply the gamma ramps. */ -  e = libgamma_crtc_set_gamma_${2}(this, ramps); -  free(ramps.red); -  return e;  }  $>}  /** - * Set the gamma ramps for a CRTC, 8-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 8-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f uint8_t ramps8  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f uint16_t ramps16  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f uint32_t ramps32  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f uint64_t ramps64  /** - * Set the gamma ramps for a CRTC, `float` function version. + * Set the gamma ramps for a CRTC, `float` function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f float rampsf  /** - * Set the gamma ramps for a CRTC, `double` function version. + * Set the gamma ramps for a CRTC, `double` function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */  $>crtc_set_gamma_ramps_f double rampsd  #ifdef HAVE_NO_LIBGAMMA_METHODS -# ifdef __GCC__ +# ifdef __GNUC__  #  pragma GCC diagnostic pop  # endif  #endif - diff --git a/src/lib/libgamma-facade.h b/src/lib/libgamma-facade.h index a24c0e0..596094c 100644 --- a/src/lib/libgamma-facade.h +++ b/src/lib/libgamma-facade.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_FACADE_H  #define LIBGAMMA_FACADE_H @@ -28,127 +12,127 @@  #include <stddef.h>  #include <stdint.h> -#ifndef __GCC__ +#ifndef __GNUC__  # define __attribute__(x)  #endif  /** - * Mapping function from [0, 1] float encoding value to [0, 2⁸ − 1] integer output value. + * Mapping function from [0, 1] float encoding value to [0, 2⁸ − 1] integer output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 2⁸ − 1] integer output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 2⁸ − 1] integer output value   */ -typedef uint8_t libgamma_gamma_ramps8_fun(float encoding); +typedef uint8_t libgamma_gamma_ramps8_fun(float);  /** - * Mapping function from [0, 1] float encoding value to [0, 2¹⁶ − 1] integer output value. + * Mapping function from [0, 1] float encoding value to [0, 2¹⁶ − 1] integer output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 2¹⁶ − 1] integer output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 2¹⁶ − 1] integer output value   */ -typedef uint16_t libgamma_gamma_ramps16_fun(float encoding); +typedef uint16_t libgamma_gamma_ramps16_fun(float);  /** - * Mapping function from [0, 1] float encoding value to [0, 2³² − 1] integer output value. + * Mapping function from [0, 1] float encoding value to [0, 2³² − 1] integer output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 2³² − 1] integer output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 2³² − 1] integer output value   */ -typedef uint32_t libgamma_gamma_ramps32_fun(float encoding); +typedef uint32_t libgamma_gamma_ramps32_fun(float);  /** - * Mapping function from [0, 1] float encoding value to [0, 2⁶⁴ − 1] integer output value. + * Mapping function from [0, 1] float encoding value to [0, 2⁶⁴ − 1] integer output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 2⁶⁴ − 1] integer output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 2⁶⁴ − 1] integer output value   */ -typedef uint64_t libgamma_gamma_ramps64_fun(float encoding); +typedef uint64_t libgamma_gamma_ramps64_fun(float);  /** - * Mapping function from [0, 1] float encoding value to [0, 1] float output value. + * Mapping function from [0, 1] float encoding value to [0, 1] float output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 1] float output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 1] float output value   */ -typedef float libgamma_gamma_rampsf_fun(float encoding); +typedef float libgamma_gamma_rampsf_fun(float);  /**   * Mapping function from [0, 1] double precision float encoding - * value to [0, 1] double precision float output value. + * value to [0, 1] double precision float output value   *  - * @param   encoding  [0, 1] float encoding value. - * @return            [0, 1] float output value. + * @param   encoding  [0, 1] float encoding value + * @return            [0, 1] float output value   */ -typedef double libgamma_gamma_rampsd_fun(double encoding); +typedef double libgamma_gamma_rampsd_fun(double);  /** - * List available adjustment methods by their order of preference based on the environment. + * List available adjustment methods by their order of preference based on the environment   *  - * @param  methods    Output array of methods, should be able to hold `LIBGAMMA_METHOD_COUNT` elements. + * @param  methods    Output array of methods, should be able to hold `LIBGAMMA_METHOD_COUNT` elements   * @param  buf_size   The number of elements that fits in `methods`, it should be `LIBGAMMA_METHOD_COUNT`,   *                    This is used to avoid writing outside the output buffer if this library adds new - *                    adjustment methods without the users of the library recompiling. + *                    adjustment methods without the users of the library recompiling   * @param  operation  Allowed values: - *                      0: Methods that the environment suggests will work, excluding fake. - *                      1: Methods that the environment suggests will work, including fake. - *                      2: All real non-fake methods. - *                      3: All real methods. - *                      4: All methods. - *                    Other values invoke undefined behaviour. + *                      0: Methods that the environment suggests will work, excluding fake + *                      1: Methods that the environment suggests will work, including fake + *                      2: All real non-fake methods + *                      3: All real methods + *                      4: All methods + *                    Other values invoke undefined behaviour   * @return            The number of element that have been stored in `methods`, or should - *                    have been stored if the buffer was large enough. + *                    have been stored if the buffer was large enough   */ -size_t libgamma_list_methods(int* restrict methods, size_t buf_size, int operation); +size_t libgamma_list_methods(int *restrict, size_t, int);  /**   * Check whether an adjustment method is available, non-existing (invalid) methods will be - * identified as not available under the rationale that the library may be out of date. + * identified as not available under the rationale that the library may be out of date   *  - * @param   method  The adjustment method. - * @return          Whether the adjustment method is available. + * @param   method  The adjustment method + * @return          Whether the adjustment method is available   */ -int libgamma_is_method_available(int method) __attribute__((const)); +int libgamma_is_method_available(int) __attribute__((const));  /** - * Return the capabilities of an adjustment method. + * Return the capabilities of an adjustment method   *    * @param  this    The data structure to fill with the method's capabilities - * @param  method  The adjustment method (display server and protocol). + * @param  method  The adjustment method (display server and protocol)   */ -void libgamma_method_capabilities(libgamma_method_capabilities_t* restrict this, int method); +void libgamma_method_capabilities(libgamma_method_capabilities_t *restrict, int);  /** - * Return the default site for an adjustment method. + * Return the default site for an adjustment method   *  - * @param   method  The adjustment method (display server and protocol.) + * @param   method  The adjustment method (display server and protocol)   * @return          The default site, `NULL` if it cannot be determined or   *                  if multiple sites are not supported by the adjustment - *                  method. This value should not be `free`:d. + *                  method; this value should not be `free`:d   */ -char* libgamma_method_default_site(int method); +char *libgamma_method_default_site(int);  /**   * Return the default variable that determines - * the default site for an adjustment method. + * the default site for an adjustment method   *  - * @param   method  The adjustment method (display server and protocol.) + * @param   method  The adjustment method (display server and protocol)   * @return          The environ variables that is used to determine the - *                  default site. `NULL` if there is none, that is, if - *                  the method does not support multiple sites. - *                  This value should not be `free`:d. + *                  default site, `NULL` if there is none, that is, if + *                  the method does not support multiple sites; this + *                  value should not be `free`:d   */ -const char* libgamma_method_default_site_variable(int method) __attribute__((const)); +const char *libgamma_method_default_site_variable(int) __attribute__((const));  /** - * Initialise an allocated site state. + * Initialise an allocated site state   *  - * @param   this    The site state to initialise. - * @param   method  The adjustment method (display server and protocol.) + * @param   this    The site state to initialise + * @param   method  The adjustment method (display server and protocol)   * @param   site    The site identifier, unless it is `NULL` it must a   *                  `free`:able. Once the state is destroyed the library   *                  will attempt to free it. There you should not free @@ -156,422 +140,398 @@ const char* libgamma_method_default_site_variable(int method) __attribute__((con   *                  or allocate on the stack. Note however that it will   *                  not be `free`:d if this function fails.   * @return          Zero on success, otherwise (negative) the value of an - *                  error identifier provided by this library. + *                  error identifier provided by this library   */ -int libgamma_site_initialise(libgamma_site_state_t* restrict this, -			     int method, char* restrict site); +int libgamma_site_initialise(libgamma_site_state_t *restrict, int, char *restrict);  /** - * Release all resources held by a site state. + * Release all resources held by a site state   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_site_destroy(libgamma_site_state_t* restrict this); +void libgamma_site_destroy(libgamma_site_state_t *restrict);  /**   * Release all resources held by a site state - * and free the site state pointer. + * and free the site state pointer   *  - * @param  this  The site state. + * @param  this  The site state   */ -void libgamma_site_free(libgamma_site_state_t* restrict this); +void libgamma_site_free(libgamma_site_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s within a site to the system settings. + * Restore the gamma ramps all CRTC:s within a site to the system settings   *  - * @param   this  The site state. + * @param   this  The site state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_site_restore(libgamma_site_state_t* restrict this); +int libgamma_site_restore(libgamma_site_state_t *restrict);  /** - * Initialise an allocated partition state. + * Initialise an allocated partition state   *  - * @param   this       The partition state to initialise. - * @param   site       The site state for the site that the partition belongs to. - * @param   partition  The index of the partition within the site. + * @param   this       The partition state to initialise + * @param   site       The site state for the site that the partition belongs to + * @param   partition  The index of the partition within the site   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_partition_initialise(libgamma_partition_state_t* restrict this, -				  libgamma_site_state_t* restrict site, size_t partition); +int libgamma_partition_initialise(libgamma_partition_state_t *restrict, libgamma_site_state_t *restrict, size_t);  /** - * Release all resources held by a partition state. + * Release all resources held by a partition state   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_partition_destroy(libgamma_partition_state_t* restrict this); +void libgamma_partition_destroy(libgamma_partition_state_t *restrict);  /**   * Release all resources held by a partition state - * and free the partition state pointer. + * and free the partition state pointer   *  - * @param  this  The partition state. + * @param  this  The partition state   */ -void libgamma_partition_free(libgamma_partition_state_t* restrict this); +void libgamma_partition_free(libgamma_partition_state_t *restrict);  /** - * Restore the gamma ramps all CRTC:s within a partition to the system settings. + * Restore the gamma ramps all CRTC:s within a partition to the system settings   *  - * @param   this  The partition state. + * @param   this  The partition state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_partition_restore(libgamma_partition_state_t* restrict this); +int libgamma_partition_restore(libgamma_partition_state_t *restrict);  /** - * Initialise an allocated CRTC state. + * Initialise an allocated CRTC state   *  - * @param   this       The CRTC state to initialise. - * @param   partition  The partition state for the partition that the CRTC belongs to. - * @param   crtc       The index of the CRTC within the partition. + * @param   this       The CRTC state to initialise + * @param   partition  The partition state for the partition that the CRTC belongs to + * @param   crtc       The index of the CRTC within the partition   * @return             Zero on success, otherwise (negative) the value of an - *                     error identifier provided by this library. + *                     error identifier provided by this library   */ -int libgamma_crtc_initialise(libgamma_crtc_state_t* restrict this, -			     libgamma_partition_state_t* restrict partition, size_t crtc); +int libgamma_crtc_initialise(libgamma_crtc_state_t *restrict, libgamma_partition_state_t *restrict, size_t);  /** - * Release all resources held by a CRTC state. + * Release all resources held by a CRTC state   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_crtc_destroy(libgamma_crtc_state_t* restrict this); +void libgamma_crtc_destroy(libgamma_crtc_state_t *restrict);  /**   * Release all resources held by a CRTC state - * and free the CRTC state pointer. + * and free the CRTC state pointer   *  - * @param  this  The CRTC state. + * @param  this  The CRTC state   */ -void libgamma_crtc_free(libgamma_crtc_state_t* restrict this); +void libgamma_crtc_free(libgamma_crtc_state_t *restrict);  /** - * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * Restore the gamma ramps for a CRTC to the system settings for that CRTC   *  - * @param   this  The CRTC state. + * @param   this  The CRTC state   * @return        Zero on success, otherwise (negative) the value of an - *                error identifier provided by this library. + *                error identifier provided by this library   */ -int libgamma_crtc_restore(libgamma_crtc_state_t* restrict this); +int libgamma_crtc_restore(libgamma_crtc_state_t *restrict);  /** - * Read information about a CRTC. + * Read information about a CRTC   *  - * @param   this    Instance of a data structure to fill with the information about the CRTC. - * @param   crtc    The state of the CRTC whose information should be read. - * @param   fields  OR:ed identifiers for the information about the CRTC that should be read. - * @return          Zero on success, -1 on error. On error refer to the error reports in `this`. + * @param   this    Instance of a data structure to fill with the information about the CRTC + * @param   crtc    The state of the CRTC whose information should be read + * @param   fields  OR:ed identifiers for the information about the CRTC that should be read + * @return          Zero on success, -1 on error; on error refer to the error reports in `this`   */ -int libgamma_get_crtc_information(libgamma_crtc_information_t* restrict this, -				  libgamma_crtc_state_t* restrict crtc, int32_t fields); +int libgamma_get_crtc_information(libgamma_crtc_information_t *restrict, libgamma_crtc_state_t *restrict, int32_t);  /** - * Release all resources in an information data structure for a CRTC. + * Release all resources in an information data structure for a CRTC   *  - * @param  this  The CRTC information. + * @param  this  The CRTC information   */ -void libgamma_crtc_information_destroy(libgamma_crtc_information_t* restrict this); +void libgamma_crtc_information_destroy(libgamma_crtc_information_t *restrict);  /**   * Release all resources in an information data structure for a CRTC - * and free the data structure pointer. + * and free the data structure pointer   *  - * @param  this  The CRTC information. + * @param  this  The CRTC information   */ -void libgamma_crtc_information_free(libgamma_crtc_information_t* restrict this); +void libgamma_crtc_information_free(libgamma_crtc_information_t *restrict);  /** - * Convert a raw representation of an EDID to a lowercase hexadecimal representation. + * Convert a raw representation of an EDID to a lowercase hexadecimal representation   *  - * @param   edid:const unsigned char*  The EDID in raw representation. - * @param   length:size_t              The length of `edid`. + * @param   edid:const unsigned char*  The EDID in raw representation + * @param   length:size_t              The length of `edid`   * @return  :char*                     The EDID in lowercase hexadecimal representation, - *                                     `NULL` on allocation error, `errno` will be set accordingly. + *                                     `NULL` on allocation error, `errno` will be set accordingly   */ -#define libgamma_behex_edid(edid, length)  \ -  libgamma_behex_edid_lowercase(edid, length) +#define libgamma_behex_edid(edid, length) libgamma_behex_edid_lowercase((edid), (length))  /** - * Convert a raw representation of an EDID to a lowercase hexadecimal representation. + * Convert a raw representation of an EDID to a lowercase hexadecimal representation   *  - * @param   edid    The EDID in raw representation. - * @param   length  The length of `edid`. - * @return          The EDID in lowercase hexadecimal representation, - *                  `NULL` on allocation error, `errno` will be set accordingly. + * @param   edid    The EDID in raw representation + * @param   length  The length of `edid` + * @return          The EDID in lowercase hexadecimal representation + *                  `NULL` on allocation error, `errno` will be set accordingly   */ -char* libgamma_behex_edid_lowercase(const unsigned char* restrict edid, size_t length); +char *libgamma_behex_edid_lowercase(const unsigned char *restrict, size_t);  /** - * Convert a raw representation of an EDID to an uppercase hexadecimal representation. + * Convert a raw representation of an EDID to an uppercase hexadecimal representation   *  - * @param   edid    The EDID in raw representation. - * @param   length  The length of `edid`. + * @param   edid    The EDID in raw representation + * @param   length  The length of `edid`   * @return          The EDID in uppercase hexadecimal representation, - *                  NULL` on allocation error, `errno` will be set accordingly. + *                  NULL` on allocation error, `errno` will be set accordingly   */ -char* libgamma_behex_edid_uppercase(const unsigned char* restrict edid, size_t length); +char *libgamma_behex_edid_uppercase(const unsigned char *restrict, size_t);  /** - * Convert an hexadecimal representation of an EDID to a raw representation. + * Convert an hexadecimal representation of an EDID to a raw representation   *  - * @param   edid  The EDID in hexadecimal representation. + * @param   edid  The EDID in hexadecimal representation   * @return        The EDID in raw representation, it will be half the length - *                of `edid` (the input value). `NULL` on allocation error or - *                if the EDID is malformated, `errno` will be set accordingly. + *                of `edid` (the input value); `NULL` on allocation error or + *                if the EDID is malformated, `errno` will be set accordingly   */ -unsigned char* libgamma_unhex_edid(const char* restrict edid); +unsigned char *libgamma_unhex_edid(const char *restrict);  /** - * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 8-bit gamma-depth version   *  - * @param   this   The CRTC state. + * @param   this   The CRTC state   * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_ramps8(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_ramps8_t* restrict ramps); +int libgamma_crtc_get_gamma_ramps8(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps8_t *restrict);  /**   * Set the gamma ramps for a CRTC, 8-bit gamma-depth version.   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps8(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_ramps8_t ramps); +int libgamma_crtc_set_gamma_ramps8(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps8_t);  /** - * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. + * @param   this   The CRTC state   * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_ramps16(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps16_t* restrict ramps); +int libgamma_crtc_get_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t *restrict);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps16(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps16_t ramps) __attribute__((hot)); +int libgamma_crtc_set_gamma_ramps16(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_t) __attribute__((hot));  /** - * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_ramps32(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps32_t* restrict ramps); +int libgamma_crtc_get_gamma_ramps32(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps32_t *restrict);  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps32(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps32_t ramps); +int libgamma_crtc_set_gamma_ramps32(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps32_t);  /** - * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version. + * Get the current gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_ramps64(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps64_t* restrict ramps); +int libgamma_crtc_get_gamma_ramps64(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps64_t *restrict);  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps64(libgamma_crtc_state_t* restrict this, -				    libgamma_gamma_ramps64_t ramps); +int libgamma_crtc_set_gamma_ramps64(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps64_t);  /** - * Set the gamma ramps for a CRTC, `float` version. + * Set the gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_rampsf(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_rampsf_t ramps); +int libgamma_crtc_set_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t);  /** - * Get the current gamma ramps for a CRTC, `float` version. + * Get the current gamma ramps for a CRTC, `float` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_rampsf(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_rampsf_t* restrict ramps); +int libgamma_crtc_get_gamma_rampsf(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_t *restrict);  /** - * Get the current gamma ramps for a CRTC, `double` version. + * Get the current gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to fill with the current values. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to fill with the current values   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_get_gamma_rampsd(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_rampsd_t* restrict ramps); +int libgamma_crtc_get_gamma_rampsd(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsd_t *restrict);  /** - * Set the gamma ramps for a CRTC, `double` version. + * Set the gamma ramps for a CRTC, `double` version   *  - * @param   this   The CRTC state. - * @param   ramps  The gamma ramps to apply. + * @param   this   The CRTC state + * @param   ramps  The gamma ramps to apply   * @return         Zero on success, otherwise (negative) the value of an - *                 error identifier provided by this library. + *                 error identifier provided by this library   */ -int libgamma_crtc_set_gamma_rampsd(libgamma_crtc_state_t* restrict this, -				   libgamma_gamma_rampsd_t ramps); +int libgamma_crtc_set_gamma_rampsd(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsd_t);  /** - * Set the gamma ramps for a CRTC, 8-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 8-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps8_f(libgamma_crtc_state_t* restrict this, -				     libgamma_gamma_ramps8_fun* red_function, -				     libgamma_gamma_ramps8_fun* green_function, -				     libgamma_gamma_ramps8_fun* blue_function) __attribute__((cold)); +__attribute__((cold)) +int libgamma_crtc_set_gamma_ramps8_f(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps8_fun *, +                                     libgamma_gamma_ramps8_fun *, libgamma_gamma_ramps8_fun *);  /** - * Set the gamma ramps for a CRTC, 16-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 16-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps16_f(libgamma_crtc_state_t* restrict this, -				      libgamma_gamma_ramps16_fun* red_function, -				      libgamma_gamma_ramps16_fun* green_function, -				      libgamma_gamma_ramps16_fun* blue_function) __attribute__((cold)); +__attribute__((cold)) +int libgamma_crtc_set_gamma_ramps16_f(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps16_fun *, +                                      libgamma_gamma_ramps16_fun *, libgamma_gamma_ramps16_fun *);  /** - * Set the gamma ramps for a CRTC, 32-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 32-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps32_f(libgamma_crtc_state_t* restrict this, -				      libgamma_gamma_ramps32_fun* red_function, -				      libgamma_gamma_ramps32_fun* green_function, -				      libgamma_gamma_ramps32_fun* blue_function) __attribute__((cold)); +__attribute__((cold)) +int libgamma_crtc_set_gamma_ramps32_f(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps32_fun *, +                                      libgamma_gamma_ramps32_fun *, libgamma_gamma_ramps32_fun *);  /** - * Set the gamma ramps for a CRTC, 64-bit gamma-depth function version. + * Set the gamma ramps for a CRTC, 64-bit gamma-depth function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_ramps64_f(libgamma_crtc_state_t* restrict this, -				      libgamma_gamma_ramps64_fun* red_function, -				      libgamma_gamma_ramps64_fun* green_function, -				      libgamma_gamma_ramps64_fun* blue_function) __attribute__((cold)); +__attribute__((cold)); +int libgamma_crtc_set_gamma_ramps64_f(libgamma_crtc_state_t *restrict, libgamma_gamma_ramps64_fun *, +                                      libgamma_gamma_ramps64_fun *, libgamma_gamma_ramps64_fun *);  /** - * Set the gamma ramps for a CRTC, `float` function version. + * Set the gamma ramps for a CRTC, `float` function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_rampsf_f(libgamma_crtc_state_t* restrict this, -				     libgamma_gamma_rampsf_fun* red_function, -				     libgamma_gamma_rampsf_fun* green_function, -				     libgamma_gamma_rampsf_fun* blue_function) __attribute__((cold)); +__attribute__((cold)) +int libgamma_crtc_set_gamma_rampsf_f(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsf_fun *, +                                     libgamma_gamma_rampsf_fun *, libgamma_gamma_rampsf_fun *);  /** - * Set the gamma ramps for a CRTC, `double` function version. + * Set the gamma ramps for a CRTC, `double` function version   *  - * Note that this will probably involve the library allocating temporary data. + * Note that this will probably involve the library allocating temporary data   *  - * @param   this            The CRTC state. - * @param   red_function    The function that generates the gamma ramp for the red channel. - * @param   green_function  The function that generates the gamma ramp for the green channel. - * @param   blue_function   The function that generates the gamma ramp for the blue channel. + * @param   this            The CRTC state + * @param   red_function    The function that generates the gamma ramp for the red channel + * @param   green_function  The function that generates the gamma ramp for the green channel + * @param   blue_function   The function that generates the gamma ramp for the blue channel   * @return                  Zero on success, otherwise (negative) the value of an - *                          error identifier provided by this library. + *                          error identifier provided by this library   */ -int libgamma_crtc_set_gamma_rampsd_f(libgamma_crtc_state_t* restrict this, -				     libgamma_gamma_rampsd_fun* red_function, -				     libgamma_gamma_rampsd_fun* green_function, -				     libgamma_gamma_rampsd_fun* blue_function) __attribute__((cold)); +__attribute__((cold)) +int libgamma_crtc_set_gamma_rampsd_f(libgamma_crtc_state_t *restrict, libgamma_gamma_rampsd_fun *, +                                     libgamma_gamma_rampsd_fun *, libgamma_gamma_rampsd_fun *); -#ifndef __GCC__ +#ifndef __GNUC__  # undef __attribute__  #endif  #endif - diff --git a/src/lib/libgamma-method.c b/src/lib/libgamma-method.c index 40b4013..cf9a23b 100644 --- a/src/lib/libgamma-method.c +++ b/src/lib/libgamma-method.c @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #include "libgamma-method.h" @@ -26,34 +10,36 @@  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps8_initialise(libgamma_gamma_ramps8_t* restrict this) +int +libgamma_gamma_ramps8_initialise(libgamma_gamma_ramps8_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; -  this->red   = malloc(n * sizeof(uint8_t)); -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	size_t n = this->red_size + this->green_size + this->blue_size; +	this->red   = malloc(n * sizeof(uint8_t)); +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps8_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps8_destroy(libgamma_gamma_ramps8_t* restrict this) +void +libgamma_gamma_ramps8_destroy(libgamma_gamma_ramps8_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -61,53 +47,56 @@ void libgamma_gamma_ramps8_destroy(libgamma_gamma_ramps8_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps8_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps8_free(libgamma_gamma_ramps8_t* restrict this) +void +libgamma_gamma_ramps8_free(libgamma_gamma_ramps8_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  }  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps16_initialise(libgamma_gamma_ramps16_t* restrict this) +int +libgamma_gamma_ramps16_initialise(libgamma_gamma_ramps16_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; +	size_t n = this->red_size + this->green_size + this->blue_size;  #ifdef HAVE_LIBGAMMA_METHOD_LINUX_DRM -  /* Valgrind complains about us reading uninitialize memory if we just use malloc. */ -  this->red = calloc(n, sizeof(uint16_t)); +	/* Valgrind complains about us reading uninitialize memory if we just use malloc */ +	this->red = calloc(n, sizeof(uint16_t));  #else -  this->red = malloc(n * sizeof(uint16_t)); +	this->red = malloc(n * sizeof(uint16_t));  #endif -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps16_destroy(libgamma_gamma_ramps16_t* restrict this) +void +libgamma_gamma_ramps16_destroy(libgamma_gamma_ramps16_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -115,48 +104,51 @@ void libgamma_gamma_ramps16_destroy(libgamma_gamma_ramps16_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps16_free(libgamma_gamma_ramps16_t* restrict this) +void +libgamma_gamma_ramps16_free(libgamma_gamma_ramps16_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  }  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps32_initialise(libgamma_gamma_ramps32_t* restrict this) +int +libgamma_gamma_ramps32_initialise(libgamma_gamma_ramps32_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; -  this->red   = malloc(n * sizeof(uint32_t)); -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	size_t n = this->red_size + this->green_size + this->blue_size; +	this->red   = malloc(n * sizeof(uint32_t)); +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps32_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps32_destroy(libgamma_gamma_ramps32_t* restrict this) +void +libgamma_gamma_ramps32_destroy(libgamma_gamma_ramps32_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -164,48 +156,51 @@ void libgamma_gamma_ramps32_destroy(libgamma_gamma_ramps32_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps32_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps32_free(libgamma_gamma_ramps32_t* restrict this) +void +libgamma_gamma_ramps32_free(libgamma_gamma_ramps32_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  }  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps64_initialise(libgamma_gamma_ramps64_t* restrict this) +int +libgamma_gamma_ramps64_initialise(libgamma_gamma_ramps64_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; -  this->red   = malloc(n * sizeof(uint64_t)); -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	size_t n = this->red_size + this->green_size + this->blue_size; +	this->red   = malloc(n * sizeof(uint64_t)); +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps64_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps64_destroy(libgamma_gamma_ramps64_t* restrict this) +void +libgamma_gamma_ramps64_destroy(libgamma_gamma_ramps64_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -213,48 +208,51 @@ void libgamma_gamma_ramps64_destroy(libgamma_gamma_ramps64_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps64_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps64_free(libgamma_gamma_ramps64_t* restrict this) +void +libgamma_gamma_ramps64_free(libgamma_gamma_ramps64_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  }  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_rampsf_initialise(libgamma_gamma_rampsf_t* restrict this) +int +libgamma_gamma_rampsf_initialise(libgamma_gamma_rampsf_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; -  this->red   = malloc(n * sizeof(float)); -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	size_t n = this->red_size + this->green_size + this->blue_size; +	this->red   = malloc(n * sizeof(float)); +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsf_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsf_destroy(libgamma_gamma_rampsf_t* restrict this) +void +libgamma_gamma_rampsf_destroy(libgamma_gamma_rampsf_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -262,48 +260,51 @@ void libgamma_gamma_rampsf_destroy(libgamma_gamma_rampsf_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsf_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsf_free(libgamma_gamma_rampsf_t* restrict this) +void +libgamma_gamma_rampsf_free(libgamma_gamma_rampsf_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  }  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_rampsd_initialise(libgamma_gamma_rampsd_t* restrict this) +int +libgamma_gamma_rampsd_initialise(libgamma_gamma_rampsd_t *restrict this)  { -  size_t n = this->red_size + this->green_size + this->blue_size; -  this->red   = malloc(n * sizeof(double)); -  this->green = this->  red + this->  red_size; -  this->blue  = this->green + this->green_size; -  return this->red == NULL ? -1 : 0; +	size_t n = this->red_size + this->green_size + this->blue_size; +	this->red   = malloc(n * sizeof(double)); +	this->green = &this->  red[this->  red_size]; +	this->blue  = &this->green[this->green_size]; +	return this->red ? 0 : -1;  }  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsd_initialise` or otherwise - * initialises in the proper manner. + * initialises in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsd_destroy(libgamma_gamma_rampsd_t* restrict this) +void +libgamma_gamma_rampsd_destroy(libgamma_gamma_rampsd_t *restrict this)  { -  free(this->red); +	free(this->red);  } @@ -311,13 +312,13 @@ void libgamma_gamma_rampsd_destroy(libgamma_gamma_rampsd_t* restrict this)   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsd_initialise` or otherwise   * initialises in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsd_free(libgamma_gamma_rampsd_t* restrict this) +void +libgamma_gamma_rampsd_free(libgamma_gamma_rampsd_t *restrict this)  { -  free(this->red); -  free(this); +	free(this->red); +	free(this);  } - diff --git a/src/lib/libgamma-method.h b/src/lib/libgamma-method.h index 7c5ca08..e2a35c6 100644 --- a/src/lib/libgamma-method.h +++ b/src/lib/libgamma-method.h @@ -1,20 +1,4 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_METHOD_H  #define LIBGAMMA_METHOD_H @@ -23,7 +7,7 @@  #endif -#ifndef __GCC__ +#ifndef __GNUC__  # define __attribute__(x)  #endif @@ -33,171 +17,176 @@  /** - * The identifier for the dummy adjustment method. + * The identifier for the dummy adjustment method + *    * This method can be configured and is useful for - * testing your program's ability to handle errors. + * testing your program's ability to handle errors   */ -#define LIBGAMMA_METHOD_DUMMY  0 +#define LIBGAMMA_METHOD_DUMMY 0  /**   * The identifier for the adjustment method with - * uses the RandR protocol under the X display server. + * uses the RandR protocol under the X display server   */ -#define LIBGAMMA_METHOD_X_RANDR  1 +#define LIBGAMMA_METHOD_X_RANDR 1  /**   * The identifier for the adjustment method with - * uses the VidMode protocol under the X display server. + * uses the VidMode protocol under the X display server + *    * This is an older alternative to RandR that can   * work on some drivers that are not supported by RandR,   * however it can only control the primary CRTC per - * screen (partition). + * screen (partition)   */ -#define LIBGAMMA_METHOD_X_VIDMODE  2 +#define LIBGAMMA_METHOD_X_VIDMODE 2  /**   * The identifier for the Direct Rendering Manager   * adjustment method that is available in Linux   * (built in to the Linux kernel with a userland   * library for access) and is a part of the - * Direct Rendering Infrastructure. This adjustment - * method all work when you are in non-graphical - * mode; however a display server cannnot be - * started while this is running, but it can be - * started while a display server is running. + * Direct Rendering Infrastructure. + *  + * This adjustment method will work when you are + * in non-graphical mode; however a display server + * cannot be started while this is running, but it + * can be started while a display server is running   */ -#define LIBGAMMA_METHOD_LINUX_DRM  3 +#define LIBGAMMA_METHOD_LINUX_DRM 3  /**   * The identifier for the Graphics Device Interface - * adjustment method that is available in Windows. + * adjustment method that is available in Windows + *    * This method is not well tested; it can be compiled - * to be available under X.org using a translation layer. + * to be available under X.org using a translation layer   */ -#define LIBGAMMA_METHOD_W32_GDI  4 +#define LIBGAMMA_METHOD_W32_GDI 4  /**   * The identifier for the CoreGraphics adjustment   * method that is available in Mac OS X that can - * adjust gamma ramps under the Quartz display server. + * adjust gamma ramps under the Quartz display server + *    * This method is not well tested; it can be compiled - * to be available under X.org using a translation layer. + * to be available under X.org using a translation layer   */ -#define LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS  5 +#define LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS 5  /**   * The index of the last gamma method, neither it   * nor any index before it may actually be supported - * as it could have been disabled at compile-time. + * as it could have been disabled at compile-time   */ -#define LIBGAMMA_METHOD_MAX  5 +#define LIBGAMMA_METHOD_MAX 5  /**   * The number adjustment methods provided by this library.   * Note however that this includes adjstment methods that - * have been removed at compile-time. + * have been removed at compile-time   */ -#define LIBGAMMA_METHOD_COUNT  (LIBGAMMA_METHOD_MAX + 1) +#define LIBGAMMA_METHOD_COUNT (LIBGAMMA_METHOD_MAX + 1)  /** - * Capabilities of adjustment methods. + * Capabilities of adjustment methods   */ -typedef struct libgamma_method_capabilities -{ -  /** -   * OR of the CRTC information fields in `libgamma_crtc_information_t` -   * that may (but can fail) be read successfully. -   */ -  int32_t crtc_information; -   -  /** -   * Whether the default site is known, if true the site is integrated -   * to the system or can be determined using environment variables. -   */ -  unsigned default_site_known : 1; -   -  /** -   * Whether the adjustment method supports multiple sites rather -   * than just the default site. -   */ -  unsigned multiple_sites : 1; -   -  /** -   * Whether the adjustment method supports multiple partitions -   * per site. -   */ -  unsigned multiple_partitions : 1; -   -  /** -   * Whether the adjustment method supports multiple CRTC:s -   * per partition per site. -   */ -  unsigned multiple_crtcs : 1; -   -  /** -   * Whether the partition to graphics card is a bijection. -   */ -  unsigned partitions_are_graphics_cards : 1; -   -  /** -   * Whether the adjustment method supports `libgamma_site_restore`. -   */ -  unsigned site_restore : 1; -   -  /** -   * Whether the adjustment method supports `libgamma_partition_restore`. -   */ -  unsigned partition_restore : 1; -   -  /** -   * Whether the adjustment method supports `libgamma_crtc_restore`. -   */ -  unsigned crtc_restore : 1; -   -  /** -   * Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` -   * fields in `libgamma_crtc_information_t` will always have the same -   * values as each other for the adjustment method. -   */ -  unsigned identical_gamma_sizes : 1; -   -  /** -   * Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` -   * fields in `libgamma_crtc_information_t` will always be filled with the -   * same value for the adjustment method. -   */ -  unsigned fixed_gamma_size : 1; -   -  /** -   * Whether the `gamma_depth` field in `libgamma_crtc_information_t` -   * will always be filled with the same value for the adjustment method. -   */ -  unsigned fixed_gamma_depth : 1; -   -  /** -   * Whether the adjustment method will actually perform adjustments. -   */ -  unsigned real : 1; -   -  /** -   * Whether the adjustment method is implement using a translation layer. -   */ -  unsigned fake : 1; -   -  /** -   * Whether adjustments are undone when the process disconnects from -   * the display server. -   */ -  unsigned auto_restore : 1; +typedef struct libgamma_method_capabilities { +	/** +	 * OR of the CRTC information fields in `libgamma_crtc_information_t` +	 * that may (but can fail) be read successfully +	 */ +	int32_t crtc_information; + +	/** +	 * Whether the default site is known, if true the site is integrated +	 * to the system or can be determined using environment variables +	 */ +	unsigned default_site_known : 1; + +	/** +	 * Whether the adjustment method supports multiple sites rather +	 * than just the default site +	 */ +	unsigned multiple_sites : 1; + +	/** +	 * Whether the adjustment method supports multiple partitions +	 * per site +	 */ +	unsigned multiple_partitions : 1; + +	/** +	 * Whether the adjustment method supports multiple CRTC:s +	 * per partition per site +	 */ +	unsigned multiple_crtcs : 1; + +	/** +	 * Whether the partition to graphics card is a bijection +	 */ +	unsigned partitions_are_graphics_cards : 1; + +	/** +	 * Whether the adjustment method supports `libgamma_site_restore` +	 */ +	unsigned site_restore : 1; + +	/** +	 * Whether the adjustment method supports `libgamma_partition_restore` +	 */ +	unsigned partition_restore : 1; + +	/** +	 * Whether the adjustment method supports `libgamma_crtc_restore` +	 */ +	unsigned crtc_restore : 1; + +	/** +	 * Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` +	 * fields in `libgamma_crtc_information_t` will always have the same +	 * values as each other for the adjustment method +	 */ +	unsigned identical_gamma_sizes : 1; + +	/** +	 * Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` +	 * fields in `libgamma_crtc_information_t` will always be filled with the +	 * same value for the adjustment method +	 */ +	unsigned fixed_gamma_size : 1; + +	/** +	 * Whether the `gamma_depth` field in `libgamma_crtc_information_t` +	 * will always be filled with the same value for the adjustment method +	 */ +	unsigned fixed_gamma_depth : 1; + +	/** +	 * Whether the adjustment method will actually perform adjustments +	 */ +	unsigned real : 1; + +	/** +	 * Whether the adjustment method is implement using a translation layer +	 */ +	unsigned fake : 1; + +	/** +	 * Whether adjustments are undone when the process disconnects from +	 * the display server +	 */ +	unsigned auto_restore : 1;  } libgamma_method_capabilities_t; +  /** - * Site state. + * Site state   *    * On operating systems that integrate a graphical environment   * there is usually just one site. However, one systems with @@ -205,48 +194,47 @@ typedef struct libgamma_method_capabilities   * and the BSD:s, there can usually be any (feasible) number of   * sites. In X.org parlance they are called displays.   */ -typedef struct libgamma_site_state -{ -  /** -   * Adjustment method implementation specific data. -   * You as a user of this library should not touch this. -   */ -  void* data; -   -  /** -   * This field specifies, for the methods if this library, -   * which adjustment method (display server and protocol) -   * is used to adjust the gamma ramps. -   */ -  int method; -   -  /** -   * The site identifier. It can either be `NULL` or a string. -   * `NULL` indicates the default site. On systems like the -   * Unix-like systems, where the graphics are pluggable, this -   * is usually resolved by an environment variable, such as -   * "DISPLAY" for X.org. -   */ -  char* site; -   -  /** -   * The number of partitions that is available on this site. -   * Probably the majority of display server only one partition -   * per site. However, X.org can, and traditional used to have -   * on multi-headed environments, multiple partitions per site. -   * In X.org partitions are called 'screens'. It is not to be -   * confused with monitor. A screen is a collection of monitors, -   * and the mapping from monitors to screens is a surjection. -   * On hardware-level adjustment methods, such as Direct -   * Rendering Manager, a partition is a graphics card. -   */ -  size_t partitions_available; -   +typedef struct libgamma_site_state { +	/** +	 * Adjustment method implementation specific data. +	 * You as a user of this library should not touch this. +	 */ +	void *data; + +	/** +	 * This field specifies, for the methods if this library, +	 * which adjustment method (display server and protocol) +	 * is used to adjust the gamma ramps +	 */ +	int method; + +	/** +	 * The site identifier. It can either be `NULL` or a string. +	 * `NULL` indicates the default site. On systems like the +	 * Unix-like systems, where the graphics are pluggable, this +	 * is usually resolved by an environment variable, such as +	 * "DISPLAY" for X.org. +	 */ +	char *site; + +	/** +	 * The number of partitions that is available on this site. +	 * Probably the majority of display server only one partition +	 * per site. However, X.org can, and traditional used to have +	 * on multi-headed environments, multiple partitions per site. +	 * In X.org partitions are called 'screens'. It is not to be +	 * confused with monitor. A screen is a collection of monitors, +	 * and the mapping from monitors to screens is a surjection. +	 * On hardware-level adjustment methods, such as Direct +	 * Rendering Manager, a partition is a graphics card. +	 */ +	size_t partitions_available; +  } libgamma_site_state_t;  /** - * Partition state. + * Partition state   *    * Probably the majority of display server only one partition   * per site. However, X.org can, and traditional used to have @@ -257,1069 +245,1079 @@ typedef struct libgamma_site_state   * On hardware-level adjustment methods, such as Direct   * Rendering Manager, a partition is a graphics card.   */ -typedef struct libgamma_partition_state -{ -  /** -   * Adjustment method implementation specific data. -   * You as a user of this library should not touch this. -   */ -  void* data; -   -  /** -   * The site this partition belongs to. -   */ -  libgamma_site_state_t* site; -   -  /** -   * The index of the partition. -   */ -  size_t partition; -   -  /** -   * The number of CRTC:s that are available under this -   * partition. Note that the CRTC:s are not necessarily -   * online. -   */ -  size_t crtcs_available; -   +typedef struct libgamma_partition_state { +	/** +	 * Adjustment method implementation specific data +	 *  +	 * You as a user of this library should not touch this +	 */ +	void *data; + +	/** +	 * The site this partition belongs to +	 */ +	libgamma_site_state_t *site; + +	/** +	 * The index of the partition +	 */ +	size_t partition; + +	/** +	 * The number of CRTC:s that are available +	 * under this partition +	 *  +	 * Note that the CRTC:s are not necessarily +	 * online. +	 */ +	size_t crtcs_available; +  } libgamma_partition_state_t;  /** - * Cathode ray tube controller state. + * Cathode ray tube controller state   *    * The CRTC controls the gamma ramps for the   * monitor that is plugged in to the connector - * that the CRTC belongs to. + * that the CRTC belongs to   */ -typedef struct libgamma_crtc_state -{ -  /** -   * Adjustment method implementation specific data. -   * You as a user of this library should not touch this. -   */ -  void* data; -   -  /** -   * The partition this CRTC belongs to. -   */ -  libgamma_partition_state_t* partition; -   -  /** -   * The index of the CRTC within its partition. -   */ -  size_t crtc; -   +typedef struct libgamma_crtc_state { +	/** +	 * Adjustment method implementation specific data +	 *  +	 * You as a user of this library should not touch this +	 */ +	void *data; + +	/** +	 * The partition this CRTC belongs to +	 */ +	libgamma_partition_state_t *partition; + +	/** +	 * The index of the CRTC within its partition +	 */ +	size_t crtc; +  } libgamma_crtc_state_t;  /** - * Types for connectors. + * Types for connectors   */ -typedef enum libgamma_connector_type -  { -    /** -     * The adjustment method does not know the connector's type -     * (This could be considered an error). -     */ -    LIBGAMMA_CONNECTOR_TYPE_Unknown = 0, -     -    /** -     * Video Graphics Array (VGA). -     */ -    LIBGAMMA_CONNECTOR_TYPE_VGA, -     -    /** -     * Digital Visual Interface, unknown type. -     */ -    LIBGAMMA_CONNECTOR_TYPE_DVI, -     -    /** -     * Digital Visual Interface, integrated (DVI-I). -     */ -    LIBGAMMA_CONNECTOR_TYPE_DVII, -     -    /** -     * Digital Visual Interface, digital only (DVI-D). -     */ -    LIBGAMMA_CONNECTOR_TYPE_DVID, -     -    /** -     * Digital Visual Interface, analogue only (DVI-A). -     */ -    LIBGAMMA_CONNECTOR_TYPE_DVIA, -     -    /** -     * Composite video. -     */ -    LIBGAMMA_CONNECTOR_TYPE_Composite, -     -    /** -     * Separate Video (S-video). -     */ -    LIBGAMMA_CONNECTOR_TYPE_SVIDEO, -     -    /** -     * Low-voltage differential signaling (LVDS). -     */ -    LIBGAMMA_CONNECTOR_TYPE_LVDS, -     -    /** -     * Component video, usually separate cables for each channel. -     */ -    LIBGAMMA_CONNECTOR_TYPE_Component, -     -    /** -     * 9 pin DIN (Deutsches Institut für Normung) connector. -     */ -    LIBGAMMA_CONNECTOR_TYPE_9PinDIN, -     -    /** -     * DisplayPort. -     */ -    LIBGAMMA_CONNECTOR_TYPE_DisplayPort, -     -    /** -     * High-Definition Multimedia Interface (HDMI), unknown type. -     */ -    LIBGAMMA_CONNECTOR_TYPE_HDMI, -     -    /** -     * High-Definition Multimedia Interface, type A (HDMI-A). -     */ -    LIBGAMMA_CONNECTOR_TYPE_HDMIA, -     -    /** -     * High-Definition Multimedia Interface, type B (HDMI-B). -     */ -    LIBGAMMA_CONNECTOR_TYPE_HDMIB, -     -    /** -     * Television, unknown connector. -     */ -    LIBGAMMA_CONNECTOR_TYPE_TV, -     -    /** -     * Embedded DisplayPort (eDP). -     */ -    LIBGAMMA_CONNECTOR_TYPE_eDP, -     -    /** -     * A virtual connector. -     */ -    LIBGAMMA_CONNECTOR_TYPE_VIRTUAL, -     -    /** -     * Display Serial Interface (DSI). -     */ -    LIBGAMMA_CONNECTOR_TYPE_DSI, -     -    /** -     * LFP connector. -     * (If you know what this is add it to Wikipedia.) -     */ -    LIBGAMMA_CONNECTOR_TYPE_LFP -     -  } libgamma_connector_type_t; +typedef enum libgamma_connector_type { +	/** +	 * The adjustment method does not know the connector's type +	 *  +	 * (This could be considered an error) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_Unknown = 0, + +	/** +	 * Video Graphics Array (VGA) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_VGA, + +	/** +	 * Digital Visual Interface, unknown type +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DVI, + +	/** +	 * Digital Visual Interface, integrated (DVI-I) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DVII, + +	/** +	 * Digital Visual Interface, digital only (DVI-D) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DVID, + +	/** +	 * Digital Visual Interface, analogue only (DVI-A) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DVIA, + +	/** +	 * Composite video +	 */ +	LIBGAMMA_CONNECTOR_TYPE_Composite, + +	/** +	 * Separate Video (S-video) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_SVIDEO, + +	/** +	 * Low-voltage differential signaling (LVDS) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_LVDS, + +	/** +	 * Component video, usually separate cables for each channel +	 */ +	LIBGAMMA_CONNECTOR_TYPE_Component, + +	/** +	 * 9 pin DIN (Deutsches Institut für Normung) connector +	 */ +	LIBGAMMA_CONNECTOR_TYPE_9PinDIN, + +	/** +	 * DisplayPort +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DisplayPort, + +	/** +	 * High-Definition Multimedia Interface (HDMI), unknown type +	 */ +	LIBGAMMA_CONNECTOR_TYPE_HDMI, + +	/** +	 * High-Definition Multimedia Interface, type A (HDMI-A) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_HDMIA, + +	/** +	 * High-Definition Multimedia Interface, type B (HDMI-B) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_HDMIB, + +	/** +	 * Television, unknown connector +	 */ +	LIBGAMMA_CONNECTOR_TYPE_TV, + +	/** +	 * Embedded DisplayPort (eDP) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_eDP, + +	/** +	 * A virtual connector +	 */ +	LIBGAMMA_CONNECTOR_TYPE_VIRTUAL, + +	/** +	 * Display Serial Interface (DSI) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_DSI, + +	/** +	 * LFP connector +	 *  +	 * (What is this?) +	 */ +	LIBGAMMA_CONNECTOR_TYPE_LFP + +} libgamma_connector_type_t;  /** - * The number of values defined in `libgamma_connector_type_t`. + * The number of values defined in `libgamma_connector_type_t`   */ -#define LIBGAMMA_CONNECTOR_TYPE_COUNT  20 +#define LIBGAMMA_CONNECTOR_TYPE_COUNT 20  /** - * Orders for subpixels. Currently the possible values are - * very biased to LCD, Plasma and monochrome monitors. + * Orders for subpixels + *  + * Currently the possible values are very biased + * to LCD, Plasma and monochrome monitors   */ -typedef enum libgamma_subpixel_order -  { -    /** -     * The adjustment method does not know the order of the subpixels. -     * (This could be considered an error.) -     */ -    LIBGAMMA_SUBPIXEL_ORDER_UNKNOWN = 0, -     -    /** -     * There are no subpixels in the monitor. -     */ -    LIBGAMMA_SUBPIXEL_ORDER_NONE, -     -    /** -     * The subpixels are ordered red, green and then blue, from left to right. -     */ -    LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_RGB, -     -    /** -     * The subpixels are ordered blue, green and then red, from left to right. -     */ -    LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_BGR, -     -    /** -     * The subpixels are ordered red, green and then blue, from the top down. -     */ -    LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_RGB, -     -    /** -     * The subpixels are ordered blue, green and then red, from the top down. -     */ -    LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_BGR -     -  } libgamma_subpixel_order_t; +typedef enum libgamma_subpixel_order { +	/** +	 * The adjustment method does not know the order of the subpixels +	 *  +	 * (This could be considered an error) +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_UNKNOWN = 0, + +	/** +	 * There are no subpixels in the monitor +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_NONE, + +	/** +	 * The subpixels are ordered red, green and then blue, from left to right +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_RGB, + +	/** +	 * The subpixels are ordered blue, green and then red, from left to right +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_BGR, + +	/** +	 * The subpixels are ordered red, green and then blue, from the top down +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_RGB, + +	/** +	 * The subpixels are ordered blue, green and then red, from the top down +	 */ +	LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_BGR + +} libgamma_subpixel_order_t;  /** - * The number of values defined in `libgamma_subpixel_order_t`. + * The number of values defined in `libgamma_subpixel_order_t`   */ -#define LIBGAMMA_SUBPIXEL_ORDER_COUNT  6 +#define LIBGAMMA_SUBPIXEL_ORDER_COUNT 6  /** - * Answer enum to a decision problem. + * Answer enum to a decision problem   */ -typedef enum libgamma_decision -  { -    /** -     * The answer is negative. -     */ -    LIBGAMMA_NO = 0, -     -    /** -     * The answer is unknown. -     */ -    LIBGAMMA_MAYBE = 1, -     -    /** -     * The answer is positive. -     */ -    LIBGAMMA_YES = 2 -     -  } libgamma_decision_t; +typedef enum libgamma_decision { +	/** +	 * The answer is negative +	 */ +	LIBGAMMA_NO = 0, + +	/** +	 * The answer is unknown +	 */ +	LIBGAMMA_MAYBE = 1, + +	/** +	 * The answer is positive +	 */ +	LIBGAMMA_YES = 2 + +} libgamma_decision_t;  /** - * For a `libgamma_crtc_information_t` fill in the - * values for `edid` and `edid_length` and report errors to `edid_error`. + * For a `libgamma_crtc_information_t` fill in the values for + * `edid` and `edid_length` and report errors to `edid_error`   */ -#define LIBGAMMA_CRTC_INFO_EDID  (1 << 0) +#define LIBGAMMA_CRTC_INFO_EDID (1 << 0)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `width_mm` and report errors to `width_mm_error`. + * For a `libgamma_crtc_information_t` fill in the value + * for `width_mm` and report errors to `width_mm_error`   */ -#define LIBGAMMA_CRTC_INFO_WIDTH_MM  (1 << 1) +#define LIBGAMMA_CRTC_INFO_WIDTH_MM (1 << 1)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `height_mm` and report errors to `height_mm_error`. + * For a `libgamma_crtc_information_t` fill in the value + * for `height_mm` and report errors to `height_mm_error`   */ -#define LIBGAMMA_CRTC_INFO_HEIGHT_MM  (1 << 2) +#define LIBGAMMA_CRTC_INFO_HEIGHT_MM (1 << 2)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `width_mm_edid` and report errors to `width_mm_edid_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `width_mm_edid` and report errors to `width_mm_edid_error`   */ -#define LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID  (1 << 3) +#define LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID (1 << 3)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `height_mm_edid` and report errors to `height_mm_edid_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `height_mm_edid` and report errors to `height_mm_edid_error`   */ -#define LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID  (1 << 4) +#define LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID (1 << 4)  /** - * For a `libgamma_crtc_information_t` fill in the - * values for `red_gamma_size`, `green_gamma_size` and `blue_gamma_size`. - * and report errors to `gamma_size_error`. + * For a `libgamma_crtc_information_t` fill in the values for + * `red_gamma_size`, `green_gamma_size`, and `blue_gamma_size`, + * and report errors to `gamma_size_error`   */ -#define LIBGAMMA_CRTC_INFO_GAMMA_SIZE  (1 << 5) +#define LIBGAMMA_CRTC_INFO_GAMMA_SIZE (1 << 5)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `gamma_depth` and report errors to `gamma_depth_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `gamma_depth` and report errors to `gamma_depth_error`   */ -#define LIBGAMMA_CRTC_INFO_GAMMA_DEPTH  (1 << 6) +#define LIBGAMMA_CRTC_INFO_GAMMA_DEPTH (1 << 6)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `gamma_support` and report errors to `gamma_support_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `gamma_support` and report errors to `gamma_support_error`   */ -#define LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT  (1 << 7) +#define LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT (1 << 7)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `subpixel_order` and report errors to `subpixel_order_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `subpixel_order` and report errors to `subpixel_order_error`   */ -#define LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER  (1 << 8) +#define LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER (1 << 8)  /**   * For a `libgamma_crtc_information_t` fill in the - * value for `active` and report errors to `active_error`. + * value for `active` and report errors to `active_error`   */  #define LIBGAMMA_CRTC_INFO_ACTIVE  (1 << 9)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `connector_name` and report errors to `connector_name_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `connector_name` and report errors to `connector_name_error`   */ -#define LIBGAMMA_CRTC_INFO_CONNECTOR_NAME  (1 << 10) +#define LIBGAMMA_CRTC_INFO_CONNECTOR_NAME (1 << 10)  /** - * For a `libgamma_crtc_information_t` fill in the - * value for `connector_type` and report errors to `connector_type_error`. + * For a `libgamma_crtc_information_t` fill in the value for + * `connector_type` and report errors to `connector_type_error`   */ -#define LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE  (1 << 11) +#define LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE (1 << 11)  /**   * For a `libgamma_crtc_information_t` fill in the - * values for `gamma_red`, `gamma_green` and `gamma_blue` - * and report errors to `gamma_error`. + * values for `gamma_red`, `gamma_green`, and `gamma_blue` + * and report errors to `gamma_error`   */ -#define LIBGAMMA_CRTC_INFO_GAMMA  (1 << 12) +#define LIBGAMMA_CRTC_INFO_GAMMA (1 << 12)  /** - * The number of `LIBGAMMA_CRTC_INFO_*` values defined. + * The number of `LIBGAMMA_CRTC_INFO_*` values defined   */ -#define LIBGAMMA_CRTC_INFO_COUNT  13 +#define LIBGAMMA_CRTC_INFO_COUNT 13  /**   * Macro for both `libgamma_crtc_information_t` fields   * that can specify the size of the monitor's viewport   * as specified in the monitor's Extended Display - * Information Data. + * Information Data   */ -#define LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT  ( LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID   \ -						| LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID  ) +#define LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT (LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID | LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID)  /**   * Macro for all `libgamma_crtc_information_t` fields   * that can be filled if the adjustment method have   * support for reading the monitors' Extended Display - * Information Data. + * Information Data   */ -#define LIBGAMMA_CRTC_INFO_MACRO_EDID  ( LIBGAMMA_CRTC_INFO_EDID                 \ -				       | LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT  \ -				       | LIBGAMMA_CRTC_INFO_GAMMA                ) +#define LIBGAMMA_CRTC_INFO_MACRO_EDID (LIBGAMMA_CRTC_INFO_EDID | LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT | LIBGAMMA_CRTC_INFO_GAMMA)  /**   * Macro for both `libgamma_crtc_information_t` fields   * that can specify the size of the monitor's viewport   * as provided by the adjustment method without this   * library having to parse the monitor's Extended Display - * Information Data. + * Information Data   */ -#define LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT  (LIBGAMMA_CRTC_INFO_WIDTH_MM | LIBGAMMA_CRTC_INFO_HEIGHT_MM) +#define LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT (LIBGAMMA_CRTC_INFO_WIDTH_MM | LIBGAMMA_CRTC_INFO_HEIGHT_MM)  /**   * Macro for the `libgamma_crtc_information_t` fields   * that specifies the CRTC's gamma ramp sizes and gamma - * ramp depth. + * ramp depth   */ -#define LIBGAMMA_CRTC_INFO_MACRO_RAMP  (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH) +#define LIBGAMMA_CRTC_INFO_MACRO_RAMP (LIBGAMMA_CRTC_INFO_GAMMA_SIZE | LIBGAMMA_CRTC_INFO_GAMMA_DEPTH)  /**   * Macro for the `libgamma_crtc_information_t` fields   * that specifies the CRTC's connector type and the - * partition unique name of the connector. + * partition unique name of the connector   */ -#define LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR  ( LIBGAMMA_CRTC_INFO_CONNECTOR_NAME  \ -					    | LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE  ) +#define LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR (LIBGAMMA_CRTC_INFO_CONNECTOR_NAME | LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE)  /**   * Macro for the `libgamma_crtc_information_t` fields - * that required there is a monitor attached to the connector, - * and that status itself. + * that required there is a monitor attached to the + * connector, and that status itself   */ -#define LIBGAMMA_CRTC_INFO_MACRO_ACTIVE  ( LIBGAMMA_CRTC_INFO_MACRO_EDID      \ -					 | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT  \ -					 | LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER  \ -					 | LIBGAMMA_CRTC_INFO_ACTIVE          ) +#define LIBGAMMA_CRTC_INFO_MACRO_ACTIVE  (LIBGAMMA_CRTC_INFO_MACRO_EDID | LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT |\ +                                          LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER | LIBGAMMA_CRTC_INFO_ACTIVE)  /** - * Cathode ray tube controller information data structure. + * Cathode ray tube controller information data structure   */ -typedef struct libgamma_crtc_information -{ -  /** -   * The Extended Display Identification Data associated with -   * the attached monitor. This is raw byte array that is usually -   * 128 bytes long. It is not NUL-terminate, rather its length -   * is stored in `edid_length`. -   */ -  unsigned char* edid; -   -  /** -   * The length of `edid`. -   */ -  size_t edid_length; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int edid_error; -   -   -  /** -   * The phyical width, in millimetres, of the viewport of the -   * attached monitor, as reported by the adjustment method. This -   * value may be incorrect, which is a known issue with the X -   * server where it is the result of the X server attempting -   * the estimate the size on its own. -   * Zero means that its is not applicable, which is the case -   * for projectors. -   */ -  size_t width_mm; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int width_mm_error; -   -   -  /** -   * The phyical height, in millimetres, of the viewport of the -   * attached monitor, as reported by the adjustment method. This -   * value may be incorrect, which is a known issue with the X -   * server where it is the result of the X server attempting -   * the estimate the size on its own. -   * Zero means that its is not applicable, which is the case -   * for projectors. -   */ -  size_t height_mm; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int height_mm_error; -   -   -  /** -   * The phyical width, in millimetres, of the viewport of the -   * attached monitor, as reported by it the monitor's Extended -   * Display Information Data. This value can only contain whole -   * centimetres, which means that the result is always zero -   * modulus ten. However, this could change with revisions of -   * the EDID structure. -   * Zero means that its is not applicable, which is the case -   * for projectors. -   */ -  size_t width_mm_edid; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int width_mm_edid_error; -   -   -  /** -   * The phyical height, in millimetres, of the viewport of the -   * attached monitor, as reported by it the monitor's Extended -   * Display Information Data. This value can only contain whole -   * centimetres, which means that the result is always zero -   * modulus ten. However, this could change with revisions of -   * the EDID structure. -   * Zero means that its is not applicable, which is the case -   * for projectors. -   */ -  size_t height_mm_edid; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int height_mm_edid_error; -   -   -  /** -   * The size of the encoding axis of the red gamma ramp. -   */ -  size_t red_gamma_size; -   -  /** -   * The size of the encoding axis of the green gamma ramp. -   */ -  size_t green_gamma_size; -   -  /** -   * The size of the encoding axis of the blue gamma ramp. -   */ -  size_t blue_gamma_size; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int gamma_size_error; -   -   -  /** -   * The bit-depth of the value axes of gamma ramps, -   * -1 for single precision floating point, and -2 for -   * double precision floating point. -   */ -  signed gamma_depth; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int gamma_depth_error; -   -   -  /** -   * `LIBGAMMA_NO` indicates that the CRTC does not support -   * gamma ramp adjustments. `LIBGAMMA_MAYBE` indicates that -   * the CRTC may or may not support gamma ramp adjustments, -   * meaning that the display server really does not know, but -   * the protocol is available. `LIBGAMMA_NO` indicates that -   * the CRTC does support gamma ramp adjustments. -   */ -  libgamma_decision_t gamma_support; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int gamma_support_error; -   -   -  /** -   * The layout of the subpixels. -   * You cannot count on this value --- especially for CRT:s --- -   * but it is provided anyway as a means of distinguishing monitors. -   */ -  libgamma_subpixel_order_t subpixel_order; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int subpixel_order_error; -   -   -  /** -   * Whether there is a monitor connected to the CRTC. -   */ -  int active; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int active_error; -   -   -  /** -   * The name of the connector as designated by the display -   * server or as give by this library in case the display -   * server lacks this feature. -   */ -  char* connector_name; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int connector_name_error; -   -   -  /** -   * The type of the connector that is associated with the CRTC. -   */ -  libgamma_connector_type_t connector_type; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int connector_type_error; -   -   -  /** -   * The gamma characteristics of the monitor as reported -   * in its Extended Display Information Data. The value -   * holds the value for the red channel. If you do not have -   * and more accurate measurement of the gamma for the -   * monitor this could be used to give a rought gamma -   * correction; simply divide the value with 2.2 and use -   * the result for the red channel in the gamma correction. -   */ -  float gamma_red; -   -  /** -   * The gamma characteristics of the monitor as reported -   * in its Extended Display Information Data. The value -   * holds the value for the green channel. If you do not have -   * and more accurate measurement of the gamma for the -   * monitor this could be used to give a rought gamma -   * correction; simply divide the value with 2.2 and use -   * the result for the green channel in the gamma correction. -   */ -  float gamma_green; -   -  /** -   * The gamma characteristics of the monitor as reported -   * in its Extended Display Information Data. The value -   * holds the value for the blue channel. If you do not have -   * and more accurate measurement of the gamma for the -   * monitor this could be used to give a rought gamma -   * correction; simply divide the value with 2.2 and use -   * the result for the blue channel in the gamma correction. -   */ -  float gamma_blue; -   -  /** -   * Zero on success, positive it holds the value `errno` had -   * when the reading failed, otherwise (negative) the value -   * of an error identifier provided by this library. -   */ -  int gamma_error; -   +typedef struct libgamma_crtc_information { +	/** +	 * The Extended Display Identification Data associated with +	 * the attached monitor. +	 *  +	 * This is raw byte array that is usually 128 bytes long. +	 * It is not NUL-terminate, rather its length is stored in +	 * `edid_length`. +	 */ +	unsigned char *edid; + +	/** +	 * The length of `edid` +	 */ +	size_t edid_length; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int edid_error; + + +	/** +	 * The phyical width, in millimetres, of the viewport of the +	 * attached monitor, as reported by the adjustment method +	 *  +	 * This value may be incorrect, which is a known issue with +	 * the X server where it is the result of the X server +	 * attempting the estimate the size on its own +	 *  +	 * Zero means that its is not applicable, which is the case +	 * for projectors +	 */ +	size_t width_mm; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int width_mm_error; + + +	/** +	 * The phyical height, in millimetres, of the viewport of the +	 * attached monitor, as reported by the adjustment method +	 *  +	 * This value may be incorrect, which is a known issue with +	 * the X server where it is the result of the X server +	 * attempting the estimate the size on its own +	 *  +	 * Zero means that its is not applicable, which is the case +	 * for projectors +	 */ +	size_t height_mm; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int height_mm_error; + + +	/** +	 * The phyical width, in millimetres, of the viewport of the +	 * attached monitor, as reported by it the monitor's Extended +	 * Display Information Data +	 *  +	 * This value can only contain whole centimetres, which means +	 * that the result is always zero modulus ten. However, this +	 * could change with revisions of the EDID structure. +	 *  +	 * Zero means that its is not applicable, which is the case +	 * for projectors. +	 */ +	size_t width_mm_edid; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int width_mm_edid_error; + + +	/** +	 * The phyical height, in millimetres, of the viewport of the +	 * attached monitor, as reported by it the monitor's Extended +	 * Display Information Data +	 *  +	 * This value can only contain whole centimetres, which means +	 * that the result is always zero modulus ten. However, this +	 * could change with revisions of the EDID structure. +	 *  +	 * Zero means that its is not applicable, which is the case +	 * for projectors +	 */ +	size_t height_mm_edid; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int height_mm_edid_error; + + +	/** +	 * The size of the encoding axis of the red gamma ramp +	 */ +	size_t red_gamma_size; + +	/** +	 * The size of the encoding axis of the green gamma ramp +	 */ +	size_t green_gamma_size; + +	/** +	 * The size of the encoding axis of the blue gamma ramp +	 */ +	size_t blue_gamma_size; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int gamma_size_error; + + +	/** +	 * The bit-depth of the value axes of gamma ramps, +	 * -1 for single precision floating point, and -2 for +	 * double precision floating point +	 */ +	signed gamma_depth; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int gamma_depth_error; + + +	/** +	 * `LIBGAMMA_NO` indicates that the CRTC does not support +	 * gamma ramp adjustments. `LIBGAMMA_MAYBE` indicates that +	 * the CRTC may or may not support gamma ramp adjustments, +	 * meaning that the display server really does not know, but +	 * the protocol is available. `LIBGAMMA_NO` indicates that +	 * the CRTC does support gamma ramp adjustments. +	 */ +	libgamma_decision_t gamma_support; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int gamma_support_error; + + +	/** +	 * The layout of the subpixels +	 *  +	 * You cannot count on this value — especially for CRT:s — +	 * but it is provided anyway as a means of distinguishing +	 * monitors +	 */ +	libgamma_subpixel_order_t subpixel_order; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int subpixel_order_error; + + +	/** +	 * Whether there is a monitor connected to the CRTC +	 */ +	int active; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int active_error; +  +  +	/** +	 * The name of the connector as designated by the display +	 * server or as give by this library in case the display +	 * server lacks this feature. +	 */ +	char *connector_name; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library. +	 */ +	int connector_name_error; + + +	/** +	 * The type of the connector that is associated with the CRTC. +	 */ +	libgamma_connector_type_t connector_type; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library. +	 */ +	int connector_type_error; + + +	/** +	 * The gamma characteristics of the monitor as reported +	 * in its Extended Display Information Data. The value +	 * holds the value for the red channel. +	 *  +	 * If you do not have and more accurate measurement of the +	 * gamma for the monitor this could be used to give a rought +	 * gamma correction; simply divide the value with 2.2 and use +	 * the result for the red channel in the gamma correction. +	 */ +	float gamma_red; + +	/** +	 * The gamma characteristics of the monitor as reported +	 * in its Extended Display Information Data. The value +	 * holds the value for the green channel. +	 *  +	 * If you do not have and more accurate measurement of the +	 * gamma for the monitor this could be used to give a rought +	 * gamma correction; simply divide the value with 2.2 and use +	 * the result for the green channel in the gamma correction. +	 */ +	float gamma_green; + +	/** +	 * The gamma characteristics of the monitor as reported +	 * in its Extended Display Information Data. The value +	 * holds the value for the blue channel. +	 *  +	 * If you do not have and more accurate measurement of the +	 * gamma for the monitor this could be used to give a rought +	 * gamma correction; simply divide the value with 2.2 and use +	 * the result for the blue channel in the gamma correction. +	 */ +	float gamma_blue; + +	/** +	 * Zero on success, positive it holds the value `errno` had +	 * when the reading failed, otherwise (negative) the value +	 * of an error identifier provided by this library +	 */ +	int gamma_error; +  } libgamma_crtc_information_t;  /** - * Gamma ramp structure for 8-bit gamma ramps. + * Gamma ramp structure for 8-bit gamma ramps   */ -typedef struct libgamma_gamma_ramps8 -{ -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  uint8_t* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  uint8_t* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  uint8_t* blue; -   +typedef struct libgamma_gamma_ramps8 { +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	uint8_t *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	uint8_t *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	uint8_t *blue; +  } libgamma_gamma_ramps8_t;  /** - * Gamma ramp structure for 16-bit gamma ramps. + * Gamma ramp structure for 16-bit gamma ramps   */  typedef struct libgamma_gamma_ramps16  { -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  uint16_t* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  uint16_t* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  uint16_t* blue; -   +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	uint16_t *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	uint16_t *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	uint16_t *blue; +  } libgamma_gamma_ramps16_t;  /** - * Gamma ramp structure for 32-bit gamma ramps. + * Gamma ramp structure for 32-bit gamma ramps   */  typedef struct libgamma_gamma_ramps32  { -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  uint32_t* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  uint32_t* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  uint32_t* blue; -   +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	uint32_t *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	uint32_t *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	uint32_t *blue; +  } libgamma_gamma_ramps32_t;  /** - * Gamma ramp structure for 64-bit gamma ramps. + * Gamma ramp structure for 64-bit gamma ramps   */  typedef struct libgamma_gamma_ramps64  { -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  uint64_t* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  uint64_t* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  uint64_t* blue; -   +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	uint64_t *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	uint64_t *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	uint64_t *blue; +  } libgamma_gamma_ramps64_t;  /** - * Gamma ramp structure for `float` gamma ramps. + * Gamma ramp structure for `float` gamma ramps   */  typedef struct libgamma_gamma_rampsf  { -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  float* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  float* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  float* blue; -   +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	float *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	float *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	float *blue; +  } libgamma_gamma_rampsf_t;  /** - * Gamma ramp structure for `double` gamma ramps. + * Gamma ramp structure for `double` gamma ramps   */  typedef struct libgamma_gamma_rampsd  { -  /** -   * The size of `red`. -   */ -  size_t red_size; -   -  /** -   * The size of `green`. -   */ -  size_t green_size; -   -  /** -   * The size of `blue`. -   */ -  size_t blue_size; -   -  /** -   * The gamma ramp for the red channel. -   */ -  double* red; -   -  /** -   * The gamma ramp for the green channel. -   */ -  double* green; -   -  /** -   * The gamma ramp for the blue channel. -   */ -  double* blue; -   +	/** +	 * The size of `red` +	 */ +	size_t red_size; + +	/** +	 * The size of `green` +	 */ +	size_t green_size; + +	/** +	 * The size of `blue` +	 */ +	size_t blue_size; + +	/** +	 * The gamma ramp for the red channel +	 */ +	double *red; + +	/** +	 * The gamma ramp for the green channel +	 */ +	double *green; + +	/** +	 * The gamma ramp for the blue channel +	 */ +	double *blue; +  } libgamma_gamma_rampsd_t;  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps8_initialise(libgamma_gamma_ramps8_t* restrict this); +int libgamma_gamma_ramps8_initialise(libgamma_gamma_ramps8_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps8_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps8_destroy(libgamma_gamma_ramps8_t* restrict this); +void libgamma_gamma_ramps8_destroy(libgamma_gamma_ramps8_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps8_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps8_free(libgamma_gamma_ramps8_t* restrict this); +void libgamma_gamma_ramps8_free(libgamma_gamma_ramps8_t *restrict);  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps16_initialise(libgamma_gamma_ramps16_t* restrict this); +int libgamma_gamma_ramps16_initialise(libgamma_gamma_ramps16_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps16_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps16_destroy(libgamma_gamma_ramps16_t* restrict this); +void libgamma_gamma_ramps16_destroy(libgamma_gamma_ramps16_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps16_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps16_free(libgamma_gamma_ramps16_t* restrict this); +void libgamma_gamma_ramps16_free(libgamma_gamma_ramps16_t *restrict);  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the + * The input must have `red_size`, `green_size`, and `blue_size` set to the   * sizes of the gamma ramps that should be allocated.   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps32_initialise(libgamma_gamma_ramps32_t* restrict this); +int libgamma_gamma_ramps32_initialise(libgamma_gamma_ramps32_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps32_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps32_destroy(libgamma_gamma_ramps32_t* restrict this); +void libgamma_gamma_ramps32_destroy(libgamma_gamma_ramps32_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps32_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps32_free(libgamma_gamma_ramps32_t* restrict this); +void libgamma_gamma_ramps32_free(libgamma_gamma_ramps32_t *restrict);  /**   * Initialise a gamma ramp in the proper way that allows all adjustment   * methods to read from and write to it without causing segmentation violation.   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the + * The input must have `red_size`, `green_size`, and `blue_size` set to the   * sizes of the gamma ramps that should be allocated.   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_ramps64_initialise(libgamma_gamma_ramps64_t* restrict this); +int libgamma_gamma_ramps64_initialise(libgamma_gamma_ramps64_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps64_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps64_destroy(libgamma_gamma_ramps64_t* restrict this); +void libgamma_gamma_ramps64_destroy(libgamma_gamma_ramps64_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_ramps64_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_ramps64_free(libgamma_gamma_ramps64_t* restrict this); +void libgamma_gamma_ramps64_free(libgamma_gamma_ramps64_t *restrict);  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *  - * @param   this  The gamma ramps. - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @param   this  The gamma ramps + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_rampsf_initialise(libgamma_gamma_rampsf_t* restrict this); +int libgamma_gamma_rampsf_initialise(libgamma_gamma_rampsf_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsf_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsf_destroy(libgamma_gamma_rampsf_t* restrict this); +void libgamma_gamma_rampsf_destroy(libgamma_gamma_rampsf_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsf_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsf_free(libgamma_gamma_rampsf_t* restrict this); +void libgamma_gamma_rampsf_free(libgamma_gamma_rampsf_t *restrict);  /**   * Initialise a gamma ramp in the proper way that allows all adjustment - * methods to read from and write to it without causing segmentation violation. + * methods to read from and write to it without causing segmentation violation   *  - * The input must have `red_size`, `green_size` and `blue_size` set to the - * sizes of the gamma ramps that should be allocated. + * The input must have `red_size`, `green_size`, and `blue_size` set to the + * sizes of the gamma ramps that should be allocated   *    * @param   this  The gamma ramps - * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly. + * @return        Zero on success, -1 on allocation error, `errno` will be set accordingly   */ -int libgamma_gamma_rampsd_initialise(libgamma_gamma_rampsd_t* restrict this); +int libgamma_gamma_rampsd_initialise(libgamma_gamma_rampsd_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsd_initialise` or otherwise - * initialised in the proper manner. + * initialised in the proper manner   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsd_destroy(libgamma_gamma_rampsd_t* restrict this); +void libgamma_gamma_rampsd_destroy(libgamma_gamma_rampsd_t *restrict);  /**   * Release resources that are held by a gamma ramp strcuture that   * has been allocated by `libgamma_gamma_rampsd_initialise` or otherwise   * initialised in the proper manner, as well as release the pointer - * to the structure. + * to the structure   *  - * @param  this  The gamma ramps. + * @param  this  The gamma ramps   */ -void libgamma_gamma_rampsd_free(libgamma_gamma_rampsd_t* restrict this); +void libgamma_gamma_rampsd_free(libgamma_gamma_rampsd_t *restrict); -#ifndef __GCC__ +#ifndef __GNUC__  # undef __attribute__  #endif  #endif - diff --git a/src/lib/libgamma.h b/src/lib/libgamma.h index 9bec47c..cc63fb8 100644 --- a/src/lib/libgamma.h +++ b/src/lib/libgamma.h @@ -1,30 +1,11 @@ -/** - * libgamma -- Display server abstraction layer for gamma ramp adjustments - * Copyright (C) 2014, 2015  Mattias Andrée (maandree@member.fsf.org) - *  - * 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 <http://www.gnu.org/licenses/>. - */ +/* See LICENSE file for copyright and license details. */  #ifndef LIBGAMMA_H  #define LIBGAMMA_H -  #include "libgamma-config.h" /* Must be first. */  #include "libgamma-method.h"  #include "libgamma-facade.h"  #include "libgamma-error.h" -  #endif -  | 
