diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2010-01-01 19:40:50 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2010-01-01 19:40:50 +0100 |
commit | 4560aae206483cd2e25110a5ca40c6403c08aa8d (patch) | |
tree | 1e28856201e47be26fa210db37909e5c40af49d6 /src | |
parent | Reuse X connection when adjusting gamma ramps. (diff) | |
download | redshift-ng-4560aae206483cd2e25110a5ca40c6403c08aa8d.tar.gz redshift-ng-4560aae206483cd2e25110a5ca40c6403c08aa8d.tar.bz2 redshift-ng-4560aae206483cd2e25110a5ca40c6403c08aa8d.tar.xz |
Save and restore ramps with VidMode.
Diffstat (limited to 'src')
-rw-r--r-- | src/vidmode.c | 81 | ||||
-rw-r--r-- | src/vidmode.h | 2 |
2 files changed, 62 insertions, 21 deletions
diff --git a/src/vidmode.c b/src/vidmode.c index 7d7dda7..9ce729f 100644 --- a/src/vidmode.c +++ b/src/vidmode.c @@ -52,12 +52,53 @@ vidmode_init(vidmode_state_t *state, int screen_num) return -1; } + /* Request size of gamma ramps */ + r = XF86VidModeGetGammaRampSize(state->display, state->screen_num, + &state->ramp_size); + if (!r) { + fprintf(stderr, "XF86VidModeGetGammaRampSize failed.\n"); + XCloseDisplay(state->display); + return -1; + } + + if (state->ramp_size == 0) { + fprintf(stderr, "Gamma ramp size too small: %i\n", + state->ramp_size); + XCloseDisplay(state->display); + return -1; + } + + /* Allocate space for saved gamma ramps */ + state->saved_ramps = malloc(3*state->ramp_size*sizeof(uint16_t)); + if (state->saved_ramps == NULL) { + perror("malloc"); + XCloseDisplay(state->display); + return -1; + } + + uint16_t *gamma_r = &state->saved_ramps[0*state->ramp_size]; + uint16_t *gamma_g = &state->saved_ramps[1*state->ramp_size]; + uint16_t *gamma_b = &state->saved_ramps[2*state->ramp_size]; + + /* Save current gamma ramps so we can restore them at program exit. */ + r = XF86VidModeGetGammaRamp(state->display, state->screen_num, + state->ramp_size, gamma_r, gamma_g, + gamma_b); + if (!r) { + fprintf(stderr, "XF86VidModeGetGammaRamp failed.\n"); + XCloseDisplay(state->display); + return -1; + } + return 0; } void vidmode_free(vidmode_state_t *state) { + /* Free saved ramps */ + free(state->saved_ramps); + /* Close display connection */ XCloseDisplay(state->display); } @@ -65,6 +106,17 @@ vidmode_free(vidmode_state_t *state) void vidmode_restore(vidmode_state_t *state) { + uint16_t *gamma_r = &state->saved_ramps[0*state->ramp_size]; + uint16_t *gamma_g = &state->saved_ramps[1*state->ramp_size]; + uint16_t *gamma_b = &state->saved_ramps[2*state->ramp_size]; + + /* Restore gamma ramps */ + int r = XF86VidModeSetGammaRamp(state->display, state->screen_num, + state->ramp_size, gamma_r, gamma_g, + gamma_b); + if (!r) { + fprintf(stderr, "XF86VidModeSetGammaRamp failed.\n"); + } } int @@ -72,37 +124,24 @@ vidmode_set_temperature(vidmode_state_t *state, int temp, float gamma[3]) { int r; - /* Request size of gamma ramps */ - int ramp_size; - r = XF86VidModeGetGammaRampSize(state->display, state->screen_num, - &ramp_size); - if (!r) { - fprintf(stderr, "XF86VidModeGetGammaRampSize failed.\n"); - return -1; - } - - if (ramp_size == 0) { - fprintf(stderr, "Gamma ramp size too small: %i\n", - ramp_size); - return -1; - } - /* Create new gamma ramps */ - uint16_t *gamma_ramps = malloc(3*ramp_size*sizeof(uint16_t)); + 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*ramp_size]; - uint16_t *gamma_g = &gamma_ramps[1*ramp_size]; - uint16_t *gamma_b = &gamma_ramps[2*ramp_size]; + 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, ramp_size, temp, gamma); + colorramp_fill(gamma_r, gamma_g, gamma_b, state->ramp_size, + temp, gamma); /* Set new gamma ramps */ r = XF86VidModeSetGammaRamp(state->display, state->screen_num, - ramp_size, gamma_r, gamma_g, gamma_b); + state->ramp_size, gamma_r, gamma_g, + gamma_b); if (!r) { fprintf(stderr, "XF86VidModeSetGammaRamp failed.\n"); free(gamma_ramps); diff --git a/src/vidmode.h b/src/vidmode.h index b342254..2c38183 100644 --- a/src/vidmode.h +++ b/src/vidmode.h @@ -25,6 +25,8 @@ typedef struct { Display *display; int screen_num; + int ramp_size; + uint16_t *saved_ramps; } vidmode_state_t; int vidmode_init(vidmode_state_t *state, int screen_num); |