diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2010-05-04 23:42:10 +0200 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2010-05-04 23:42:10 +0200 |
commit | ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe (patch) | |
tree | 97b02da852f256420a7367b55736b81fe8425363 | |
parent | Update INSTALL (diff) | |
parent | Add support for changing the temperature of a specific CRTC (randr only). (diff) | |
download | redshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.gz redshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.bz2 redshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.xz |
Merge slightly altered patch from Alexandros Frantzis that allows adjusting individual CRTCs.
-rw-r--r-- | AUTHORS | 11 | ||||
-rw-r--r-- | src/randr.c | 93 | ||||
-rw-r--r-- | src/randr.h | 3 | ||||
-rw-r--r-- | src/redshift.c | 18 |
4 files changed, 89 insertions, 36 deletions
@@ -1,8 +1,15 @@ +Maintainer +-------------------- Jon Lund Steffensen <jonlst@gmail.com> -Original gtk-redshift script contributed by Martin Koelewijn. -The redshift icon is based on artwork by the Tango Desktop Project. + +Contributors +-------------------- +Alexandros Frantzis +Martin Koelewijn +Tango Desktop Project provided artwork for the redshift icon. + Translators -------------------- diff --git a/src/randr.c b/src/randr.c index 7c05b26..f401190 100644 --- a/src/randr.c +++ b/src/randr.c @@ -36,7 +36,7 @@ int -randr_init(randr_state_t *state, int screen_num) +randr_init(randr_state_t *state, int screen_num, int crtc_num) { xcb_generic_error_t *error; @@ -108,6 +108,7 @@ randr_init(randr_state_t *state, int screen_num) return -1; } + state->crtc_num = crtc_num; state->crtc_count = res_reply->num_crtcs; state->crtcs = malloc(state->crtc_count * sizeof(randr_crtc_state_t)); if (state->crtcs == NULL) { @@ -248,45 +249,77 @@ randr_free(randr_state_t *state) xcb_disconnect(state->conn); } -int -randr_set_temperature(randr_state_t *state, int temp, float gamma[3]) +static int +randr_set_temperature_for_crtc(randr_state_t *state, int crtc_num, int temp, + float gamma[3]) { xcb_generic_error_t *error; + + if (crtc_num >= state->crtc_count || crtc_num < 0) { + fprintf(stderr, _("CRTC %d does not exist. "), + state->crtc_num); + if (state->crtc_count > 1) { + fprintf(stderr, _("Valid CRTCs are [0-%d].\n"), + state->crtc_count-1); + } else { + fprintf(stderr, _("Only CRTC 0 exists.\n")); + } - /* Set temperature on all CRTCs */ - for (int i = 0; i < state->crtc_count; i++) { - xcb_randr_crtc_t crtc = state->crtcs[i].crtc; - unsigned int ramp_size = state->crtcs[i].ramp_size; + return -1; + } - /* Create new gamma ramps */ - uint16_t *gamma_ramps = malloc(3*ramp_size*sizeof(uint16_t)); - if (gamma_ramps == NULL) { - perror("malloc"); - return -1; - } + xcb_randr_crtc_t crtc = state->crtcs[crtc_num].crtc; + unsigned int ramp_size = state->crtcs[crtc_num].ramp_size; - uint16_t *gamma_r = &gamma_ramps[0*ramp_size]; - uint16_t *gamma_g = &gamma_ramps[1*ramp_size]; - uint16_t *gamma_b = &gamma_ramps[2*ramp_size]; + /* Create new gamma ramps */ + uint16_t *gamma_ramps = malloc(3*ramp_size*sizeof(uint16_t)); + if (gamma_ramps == NULL) { + perror("malloc"); + return -1; + } - colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size, - temp, gamma); + uint16_t *gamma_r = &gamma_ramps[0*ramp_size]; + uint16_t *gamma_g = &gamma_ramps[1*ramp_size]; + uint16_t *gamma_b = &gamma_ramps[2*ramp_size]; - /* Set new gamma ramps */ - xcb_void_cookie_t gamma_set_cookie = - xcb_randr_set_crtc_gamma_checked(state->conn, crtc, - ramp_size, gamma_r, - gamma_g, gamma_b); - error = xcb_request_check(state->conn, gamma_set_cookie); + colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size, + temp, gamma); - if (error) { - fprintf(stderr, _("`%s' returned error %d\n"), - "RANDR Set CRTC Gamma", error->error_code); - free(gamma_ramps); - return -1; - } + /* Set new gamma ramps */ + xcb_void_cookie_t gamma_set_cookie = + xcb_randr_set_crtc_gamma_checked(state->conn, crtc, + ramp_size, gamma_r, + gamma_g, gamma_b); + error = xcb_request_check(state->conn, gamma_set_cookie); + if (error) { + fprintf(stderr, _("`%s' returned error %d\n"), + "RANDR Set CRTC Gamma", error->error_code); free(gamma_ramps); + return -1; + } + + free(gamma_ramps); + + return 0; +} + +int +randr_set_temperature(randr_state_t *state, int temp, float gamma[3]) +{ + int r; + + /* If no CRTC number has been specified, + set temperature on all CRTCs. */ + if (state->crtc_num < 0) { + for (int i = 0; i < state->crtc_count; i++) { + r = randr_set_temperature_for_crtc(state, i, + temp, gamma); + if (r < 0) return -1; + } + } else { + return randr_set_temperature_for_crtc(state, state->crtc_num, + temp, gamma); } return 0; diff --git a/src/randr.h b/src/randr.h index 94d653f..6e11274 100644 --- a/src/randr.h +++ b/src/randr.h @@ -34,12 +34,13 @@ typedef struct { typedef struct { xcb_connection_t *conn; xcb_screen_t *screen; + int crtc_num; unsigned int crtc_count; randr_crtc_state_t *crtcs; } randr_state_t; -int randr_init(randr_state_t *state, int screen_num); +int randr_init(randr_state_t *state, int screen_num, int crtc_num); void randr_free(randr_state_t *state); void randr_restore(randr_state_t *state); int randr_set_temperature(randr_state_t *state, int temp, float gamma[3]); diff --git a/src/redshift.c b/src/redshift.c index 9c3f404..abb0bfd 100644 --- a/src/redshift.c +++ b/src/redshift.c @@ -216,11 +216,12 @@ print_help(const char *program_name) fputs(_(" -g R:G:B\tAdditional gamma correction to apply\n" " -l LAT:LON\tYour current location\n" " -m METHOD\tMethod to use to set color temperature" - " (randr or vidmode)\n" + " (RANDR or VidMode)\n" " -o\t\tOne shot mode (do not continously adjust" " color temperature)\n" " -r\t\tDisable initial temperature transition\n" " -s SCREEN\tX screen to apply adjustments to\n" + " -c CRTC\tCRTC to apply adjustments to (RANDR only)\n" " -t DAY:NIGHT\tColor temperature to set at daytime/night\n"), stdout); fputs("\n", stdout); @@ -253,6 +254,7 @@ main(int argc, char *argv[]) float gamma[3] = { DEFAULT_GAMMA, DEFAULT_GAMMA, DEFAULT_GAMMA }; int use_randr = -1; int screen_num = -1; + int crtc_num = -1; int transition = 1; int one_shot = 0; int verbose = 0; @@ -260,8 +262,11 @@ main(int argc, char *argv[]) /* Parse arguments. */ int opt; - while ((opt = getopt(argc, argv, "g:hl:m:ors:t:v")) != -1) { + while ((opt = getopt(argc, argv, "c:g:hl:m:ors:t:v")) != -1) { switch (opt) { + case 'c': + crtc_num = atoi(optarg); + break; case 'g': s = strchr(optarg, ':'); if (s == NULL) { @@ -426,13 +431,20 @@ main(int argc, char *argv[]) gamma[0], gamma[1], gamma[2]); } + /* CRTC can only be selected for RANDR */ + if (crtc_num > -1 && !use_randr) { + fprintf(stderr, _("CRTC can only be selected" + " with the RANDR method.\n")); + exit(EXIT_FAILURE); + } + /* Initialize gamma adjustment method. If use_randr is negative try all methods until one that works is found. */ gamma_state_t state; #ifdef ENABLE_RANDR if (use_randr < 0 || use_randr == 1) { /* Initialize RANDR state */ - r = randr_init(&state.randr, screen_num); + r = randr_init(&state.randr, screen_num, crtc_num); if (r < 0) { fputs(_("Initialization of RANDR failed.\n"), stderr); if (use_randr < 0) { |