diff options
Diffstat (limited to '')
-rw-r--r-- | src/servers/crtc.c | 80 | ||||
-rw-r--r-- | src/servers/crtc.h | 7 |
2 files changed, 85 insertions, 2 deletions
diff --git a/src/servers/crtc.c b/src/servers/crtc.c index 96e3a84..5facade 100644 --- a/src/servers/crtc.c +++ b/src/servers/crtc.c @@ -17,8 +17,10 @@ */ #include "crtc.h" #include "gamma.h" +#include "coopgamma.h" #include "../state.h" #include "../communication.h" +#include "../util.h" #include <errno.h> #include <string.h> @@ -90,6 +92,33 @@ char* get_crtc_name(const libgamma_crtc_information_t* restrict info, /** + * Initialise the site + * + * @return Zero on success, -1 on error + */ +int initialise_site(void) +{ + char* restrict sitename_dup = NULL; + int gerror, saved_errno; + + if ((sitename != NULL) && !(sitename_dup = memdup(sitename, strlen(sitename) + 1))) + goto fail; + if ((gerror = libgamma_site_initialise(&site, method, sitename_dup))) + goto fail_libgamma; + + return 0; + fail_libgamma: + libgamma_perror(argv0, gerror); + errno = 0; + fail: + saved_errno = errno; + free(sitename_dup); + errno = saved_errno; + return -1; +} + + +/** * Get partitions and CRTC:s * * @return Zero on success, -1 on error @@ -233,11 +262,58 @@ int disconnect(void) */ int reconnect(void) { + struct output* restrict old_outputs = NULL; + size_t i, old_outputs_n = 0; + int saved_errno; + if (connected) return 0; - connected = 1; + + /* Get site */ + if (initialise_site() < 0) + goto fail; + + /* Get partitions and CRTC:s */ + if (initialise_crtcs() < 0) + goto fail; + + /* Get CRTC information */ + if (outputs_n && !(outputs = calloc(outputs_n, sizeof(*outputs)))) + goto fail; + if (initialise_gamma_info() < 0) + goto fail; + + /* Sort outputs */ + qsort(outputs, outputs_n, sizeof(*outputs), output_cmp_by_name); + + /* Load current gamma ramps */ + store_gamma(); + + /* Preserve current gamma ramps at priority=0 if -p */ + if (preserve && (preserve_gamma() < 0)) + goto fail; + + /* Merge state */ + old_outputs = outputs, outputs = NULL; + old_outputs_n = outputs_n, outputs_n = 0; + if (merge_state(old_outputs, old_outputs_n) < 0) + goto fail; + for (i = 0; i < old_outputs_n; i++) + output_destroy(old_outputs + i); + free(old_outputs), old_outputs = NULL, old_outputs_n = 0; + + /* Reapply gamma ramps */ reapply_gamma(); - return 0; /* TODO reconnect() */ + + return 0; + + fail: + saved_errno = errno; + for (i = 0; i < old_outputs_n; i++) + output_destroy(old_outputs + i); + free(old_outputs); + errno = saved_errno; + return -1; } diff --git a/src/servers/crtc.h b/src/servers/crtc.h index 3bf9eed..68239d4 100644 --- a/src/servers/crtc.h +++ b/src/servers/crtc.h @@ -58,6 +58,13 @@ char* get_crtc_name(const libgamma_crtc_information_t* restrict info, const libgamma_crtc_state_t* restrict crtc); /** + * Initialise the site + * + * @return Zero on success, -1 on error + */ +int initialise_site(void); + +/** * Get partitions and CRTC:s * * @return Zero on success, -1 on error |