diff options
Diffstat (limited to '')
-rw-r--r-- | src/gamma-x-randr.c | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/src/gamma-x-randr.c b/src/gamma-x-randr.c index 8a63d67..105d4fc 100644 --- a/src/gamma-x-randr.c +++ b/src/gamma-x-randr.c @@ -159,16 +159,20 @@ int libgamma_x_randr_site_initialise(libgamma_site_state_t* restrict this, #endif free(reply); xcb_disconnect(connection); - return LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED;; + return LIBGAMMA_PROTOCOL_VERSION_NOT_SUPPORTED; } free(reply); - setup = xcb_get_setup(connection); + if ((setup = xcb_get_setup(connection)) == NULL) + { + xcb_disconnect(connection); + return LIBGAMMA_LIST_PARTITIONS_FAILED; + } iter = xcb_setup_roots_iterator(setup); this->partitions_available = (size_t)(iter.rem); - return 0; + return iter.rem < 0 ? LIBGAMMA_NEGATIVE_PARTITION_COUNT : 0; } @@ -210,7 +214,48 @@ int libgamma_x_randr_site_restore(libgamma_site_state_t* restrict this) int libgamma_x_randr_partition_initialise(libgamma_partition_state_t* restrict this, libgamma_site_state_t* restrict site, size_t partition) { - /* TODO */ + xcb_connection_t* restrict connection = site->data; + const xcb_setup_t* setup = xcb_get_setup(connection); + xcb_screen_t* screen = NULL; + xcb_generic_error_t* error = NULL; + 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; + size_t i; + + if (setup == NULL) + return LIBGAMMA_LIST_PARTITIONS_FAILED; + + for (i = 0; iter.rem > 0; i++, xcb_screen_next(&iter)) + if (i == partition) + { + screen = iter.data; + break; + } + if (iter.rem == 0) + return LIBGAMMA_NO_SUCH_PARTITION; + + if (screen == NULL) + return LIBGAMMA_NULL_PARTITION; + + 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); + + this->crtcs_available = reply->num_crtcs; + crtcs = xcb_randr_get_screen_resources_current_crtcs(reply); + /* Copy the CRTC:s, just so we do not have to keep the reply in memory. */ + this->data = malloc(reply->num_crtcs * sizeof(xcb_randr_crtc_t)); + if (this->data == NULL) + { + free(reply); + return LIBGAMMA_ERRNO_SET; + } + memcpy(this->data, crtcs, reply->num_crtcs * sizeof(xcb_randr_crtc_t)); + free(reply); + return 0; } |