aboutsummaryrefslogtreecommitdiffstats
path: root/src/vidmode.c
diff options
context:
space:
mode:
authorJon Lund Steffensen <jonlst@gmail.com>2010-01-01 19:24:01 +0100
committerJon Lund Steffensen <jonlst@gmail.com>2010-01-01 19:24:01 +0100
commitb61c9d59d7456dc5a4106e5f1e6b767df290d7be (patch)
tree8ab315b9dac34adbf6ea3aae02c4b2ed43940932 /src/vidmode.c
parentUpdate README, NEWS and ChangeLog for 0.3 release. (diff)
downloadredshift-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.c75
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;
}