aboutsummaryrefslogtreecommitdiffstats
path: root/src/vidmode.c
diff options
context:
space:
mode:
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;
}