diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2010-01-01 19:24:01 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2010-01-01 19:24:01 +0100 |
commit | b61c9d59d7456dc5a4106e5f1e6b767df290d7be (patch) | |
tree | 8ab315b9dac34adbf6ea3aae02c4b2ed43940932 /src/vidmode.c | |
parent | Update README, NEWS and ChangeLog for 0.3 release. (diff) | |
download | redshift-ng-b61c9d59d7456dc5a4106e5f1e6b767df290d7be.tar.gz redshift-ng-b61c9d59d7456dc5a4106e5f1e6b767df290d7be.tar.bz2 redshift-ng-b61c9d59d7456dc5a4106e5f1e6b767df290d7be.tar.xz |
Reuse X connection when adjusting gamma ramps.
Save gamma ramps when program starts and restore them on exit (only RANDR).
Try both RANDR and VidMode if nothing was specified, otherwise try only the
specified method.
Diffstat (limited to 'src/vidmode.c')
-rw-r--r-- | src/vidmode.c | 75 |
1 files changed, 38 insertions, 37 deletions
diff --git a/src/vidmode.c b/src/vidmode.c index 93f7bdb..7d7dda7 100644 --- a/src/vidmode.c +++ b/src/vidmode.c @@ -24,91 +24,92 @@ #include <X11/Xlib.h> #include <X11/extensions/xf86vmode.h> +#include "vidmode.h" #include "colorramp.h" int -vidmode_check_extension() +vidmode_init(vidmode_state_t *state, int screen_num) { int r; /* Open display */ - Display *dpy = XOpenDisplay(NULL); - if (dpy == NULL) { + state->display = XOpenDisplay(NULL); + if (state->display == NULL) { fprintf(stderr, "XOpenDisplay failed.\n"); return -1; } + if (screen_num < 0) screen_num = DefaultScreen(state->display); + state->screen_num = screen_num; + /* Query extension version */ int major, minor; - r = XF86VidModeQueryVersion(dpy, &major, &minor); + r = XF86VidModeQueryVersion(state->display, &major, &minor); if (!r) { fprintf(stderr, "XF86VidModeQueryVersion failed.\n"); + XCloseDisplay(state->display); return -1; } - /* TODO Check major/minor */ + return 0; +} - /* Close display */ - XCloseDisplay(dpy); +void +vidmode_free(vidmode_state_t *state) +{ + /* Close display connection */ + XCloseDisplay(state->display); +} - return 0; +void +vidmode_restore(vidmode_state_t *state) +{ } int -vidmode_set_temperature(int screen_num, int temp, float gamma[3]) +vidmode_set_temperature(vidmode_state_t *state, int temp, float gamma[3]) { int r; - /* Open display */ - Display *dpy = XOpenDisplay(NULL); - if (dpy == NULL) { - fprintf(stderr, "XOpenDisplay failed.\n"); - return -1; - } - - if (screen_num < 0) screen_num = DefaultScreen(dpy); - /* Request size of gamma ramps */ - int gamma_ramp_size; - r = XF86VidModeGetGammaRampSize(dpy, screen_num, &gamma_ramp_size); + int ramp_size; + r = XF86VidModeGetGammaRampSize(state->display, state->screen_num, + &ramp_size); if (!r) { fprintf(stderr, "XF86VidModeGetGammaRampSize failed.\n"); - XCloseDisplay(dpy); return -1; } - if (gamma_ramp_size == 0) { + if (ramp_size == 0) { fprintf(stderr, "Gamma ramp size too small: %i\n", - gamma_ramp_size); - XCloseDisplay(dpy); + ramp_size); return -1; } /* Create new gamma ramps */ - uint16_t *gamma_ramps = malloc(3*gamma_ramp_size*sizeof(uint16_t)); - if (gamma_ramps == NULL) abort(); + 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*gamma_ramp_size]; - uint16_t *gamma_g = &gamma_ramps[1*gamma_ramp_size]; - uint16_t *gamma_b = &gamma_ramps[2*gamma_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]; - colorramp_fill(gamma_r, gamma_g, gamma_b, gamma_ramp_size, - temp, gamma); + colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size, temp, gamma); /* Set new gamma ramps */ - r = XF86VidModeSetGammaRamp(dpy, screen_num, gamma_ramp_size, - gamma_r, gamma_g, gamma_b); + r = XF86VidModeSetGammaRamp(state->display, state->screen_num, + ramp_size, gamma_r, gamma_g, gamma_b); if (!r) { fprintf(stderr, "XF86VidModeSetGammaRamp failed.\n"); - XCloseDisplay(dpy); + free(gamma_ramps); return -1; } free(gamma_ramps); - /* Close display */ - XCloseDisplay(dpy); - return 0; } |