diff options
author | Mattias Andrée <maandree@kth.se> | 2021-03-05 18:23:13 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2021-03-05 18:33:49 +0100 |
commit | f52513b09580c1533e6c48a4162d3d5f61f3b081 (patch) | |
tree | 141d0974a777f4ec5b51daed9879a2cb0d781505 /libgamma_quartz_cg_partition_initialise.c | |
parent | Split source files, merge public header files, eliminite use gpp, rewrite makefile (diff) | |
download | libgamma-f52513b09580c1533e6c48a4162d3d5f61f3b081.tar.gz libgamma-f52513b09580c1533e6c48a4162d3d5f61f3b081.tar.bz2 libgamma-f52513b09580c1533e6c48a4162d3d5f61f3b081.tar.xz |
misc
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r-- | libgamma_quartz_cg_partition_initialise.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libgamma_quartz_cg_partition_initialise.c b/libgamma_quartz_cg_partition_initialise.c new file mode 100644 index 0000000..694ecbc --- /dev/null +++ b/libgamma_quartz_cg_partition_initialise.c @@ -0,0 +1,59 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + + +/** + * 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 + * @return Zero on success, otherwise (negative) the value of an + * 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) +{ + 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; +} |