aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon Lund Steffensen <jonlst@gmail.com>2010-01-01 19:40:50 +0100
committerJon Lund Steffensen <jonlst@gmail.com>2010-01-01 19:40:50 +0100
commit4560aae206483cd2e25110a5ca40c6403c08aa8d (patch)
tree1e28856201e47be26fa210db37909e5c40af49d6 /src
parentReuse X connection when adjusting gamma ramps. (diff)
downloadredshift-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.c81
-rw-r--r--src/vidmode.h2
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);