diff options
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; } |