int vidmode_set_temperature(vidmode_state_t *state, int temp, float brightness, float gamma[3]) { int r; /* Create new gamma ramps */ uint16_t *gamma_ramps = malloc(3*state->ramp_size*sizeof(uint16_t)); if (gamma_ramps == NULL) { perror("malloc"); return -1; } uint16_t *gamma_r = &gamma_ramps[0*state->ramp_size]; uint16_t *gamma_g = &gamma_ramps[1*state->ramp_size]; uint16_t *gamma_b = &gamma_ramps[2*state->ramp_size]; colorramp_fill(gamma_r, gamma_g, gamma_b, state->ramp_size, temp, brightness, gamma); /* Set new gamma ramps */ r = XF86VidModeSetGammaRamp(state->display, state->screen_num, state->ramp_size, gamma_r, gamma_g, gamma_b); if (!r) { fprintf(stderr, _("X request failed: %s\n"), "XF86VidModeSetGammaRamp"); free(gamma_ramps); return -1; } free(gamma_ramps); return 0; }
static int randr_set_temperature_for_crtc(randr_state_t *state, int crtc_num, int temp, float brightness, 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")); } return -1; } xcb_randr_crtc_t crtc = state->crtcs[crtc_num].crtc; unsigned int ramp_size = state->crtcs[crtc_num].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; } 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]; colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size, temp, brightness, gamma); /* 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 vidmode_set_temperature(vidmode_state_t *state, const color_setting_t *setting) { int r; /* Create new gamma ramps */ uint16_t *gamma_ramps = malloc(3*state->ramp_size*sizeof(uint16_t)); if (gamma_ramps == NULL) { perror("malloc"); return -1; } uint16_t *gamma_r = &gamma_ramps[0*state->ramp_size]; uint16_t *gamma_g = &gamma_ramps[1*state->ramp_size]; uint16_t *gamma_b = &gamma_ramps[2*state->ramp_size]; if (state->preserve) { /* Initialize gamma ramps from saved state */ memcpy(gamma_ramps, state->saved_ramps, 3*state->ramp_size*sizeof(uint16_t)); } else { /* Initialize gamma ramps to pure state */ for (int i = 0; i < state->ramp_size; i++) { uint16_t value = (double)i/state->ramp_size * (UINT16_MAX+1); gamma_r[i] = value; gamma_g[i] = value; gamma_b[i] = value; } } colorramp_fill(gamma_r, gamma_g, gamma_b, state->ramp_size, setting); /* Set new gamma ramps */ r = XF86VidModeSetGammaRamp(state->display, state->screen_num, state->ramp_size, gamma_r, gamma_g, gamma_b); if (!r) { fprintf(stderr, _("X request failed: %s\n"), "XF86VidModeSetGammaRamp"); free(gamma_ramps); return -1; } free(gamma_ramps); return 0; }