aboutsummaryrefslogtreecommitdiffstats
path: root/src/gamma-w32gdi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gamma-w32gdi.c')
-rw-r--r--src/gamma-w32gdi.c53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/gamma-w32gdi.c b/src/gamma-w32gdi.c
index aa2474d..d23bf72 100644
--- a/src/gamma-w32gdi.c
+++ b/src/gamma-w32gdi.c
@@ -43,7 +43,6 @@ int
w32gdi_init(w32gdi_state_t *state)
{
state->saved_ramps = NULL;
- state->hDC = NULL;
return 0;
}
@@ -54,14 +53,14 @@ w32gdi_start(w32gdi_state_t *state)
BOOL r;
/* Open device context */
- state->hDC = GetDC(NULL);
- if (state->hDC == NULL) {
+ HDC hDC = GetDC(NULL);
+ if (hDC == NULL) {
fputs(_("Unable to open device context.\n"), stderr);
return -1;
}
/* Check support for gamma ramps */
- int cmcap = GetDeviceCaps(state->hDC, COLORMGMTCAPS);
+ int cmcap = GetDeviceCaps(hDC, COLORMGMTCAPS);
if (cmcap != CM_GAMMA_RAMP) {
fputs(_("Display device does not support gamma ramps.\n"),
stderr);
@@ -72,18 +71,21 @@ w32gdi_start(w32gdi_state_t *state)
state->saved_ramps = malloc(3*GAMMA_RAMP_SIZE*sizeof(WORD));
if (state->saved_ramps == NULL) {
perror("malloc");
- ReleaseDC(NULL, state->hDC);
+ ReleaseDC(NULL, hDC);
return -1;
}
/* Save current gamma ramps so we can restore them at program exit */
- r = GetDeviceGammaRamp(state->hDC, state->saved_ramps);
+ r = GetDeviceGammaRamp(hDC, state->saved_ramps);
if (!r) {
fputs(_("Unable to save current gamma ramp.\n"), stderr);
- ReleaseDC(NULL, state->hDC);
+ ReleaseDC(NULL, hDC);
return -1;
}
+ /* Release device context */
+ ReleaseDC(NULL, hDC);
+
return 0;
}
@@ -92,9 +94,6 @@ w32gdi_free(w32gdi_state_t *state)
{
/* Free saved ramps */
free(state->saved_ramps);
-
- /* Release device context */
- if (state->hDC != NULL) ReleaseDC(NULL, state->hDC);
}
@@ -114,20 +113,39 @@ w32gdi_set_option(w32gdi_state_t *state, const char *key, const char *value)
void
w32gdi_restore(w32gdi_state_t *state)
{
+ /* Open device context */
+ HDC hDC = GetDC(NULL);
+ if (hDC == NULL) {
+ fputs(_("Unable to open device context.\n"), stderr);
+ return;
+ }
+
/* Restore gamma ramps */
- BOOL r = SetDeviceGammaRamp(state->hDC, state->saved_ramps);
+ BOOL r = SetDeviceGammaRamp(hDC, state->saved_ramps);
if (!r) fputs(_("Unable to restore gamma ramps.\n"), stderr);
+
+ /* Release device context */
+ ReleaseDC(NULL, hDC);
}
int
-w32gdi_set_temperature(w32gdi_state_t *state, int temp, float gamma[3])
+w32gdi_set_temperature(w32gdi_state_t *state, int temp, float brightness,
+ float gamma[3])
{
BOOL r;
+ /* Open device context */
+ HDC hDC = GetDC(NULL);
+ if (hDC == NULL) {
+ fputs(_("Unable to open device context.\n"), stderr);
+ return -1;
+ }
+
/* Create new gamma ramps */
WORD *gamma_ramps = malloc(3*GAMMA_RAMP_SIZE*sizeof(WORD));
if (gamma_ramps == NULL) {
perror("malloc");
+ ReleaseDC(NULL, hDC);
return -1;
}
@@ -136,17 +154,24 @@ w32gdi_set_temperature(w32gdi_state_t *state, int temp, float gamma[3])
WORD *gamma_b = &gamma_ramps[2*GAMMA_RAMP_SIZE];
colorramp_fill(gamma_r, gamma_g, gamma_b, GAMMA_RAMP_SIZE,
- temp, gamma);
+ temp, brightness, gamma);
/* Set new gamma ramps */
- r = SetDeviceGammaRamp(state->hDC, gamma_ramps);
+ r = SetDeviceGammaRamp(hDC, gamma_ramps);
if (!r) {
+ /* TODO it happens that SetDeviceGammaRamp returns FALSE on
+ occasions where the adjustment seems to be successful.
+ Does this only happen with multiple monitors connected? */
fputs(_("Unable to set gamma ramps.\n"), stderr);
free(gamma_ramps);
+ ReleaseDC(NULL, hDC);
return -1;
}
free(gamma_ramps);
+ /* Release device context */
+ ReleaseDC(NULL, hDC);
+
return 0;
}