aboutsummaryrefslogtreecommitdiffstats
path: root/libgamma_w32_gdi_crtc_initialise.c
blob: 20d83ac88be4ffe34e5dce79e7c99d55a495a082 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* See LICENSE file for copyright and license details. */
#define IN_LIBGAMMA_W32_GDI
#include "common.h"


/**
 * Initialise an allocated CRTC state
 * 
 * @param   this       The CRTC state to initialise
 * @param   partition  The partition state for the partition that the CRTC belongs to
 * @param   crtc       The the index of the CRTC within the site
 * @return             Zero on success, otherwise (negative) the value of an
 *                     error identifier provided by this library
 */
int
libgamma_w32_gdi_crtc_initialise(struct libgamma_crtc_state *restrict this,
                                 struct libgamma_partition_state *restrict partition, size_t crtc)
{
	DISPLAY_DEVICE display;
	HDC context;

	(void) partition;

	this->data = NULL;

	/* Windows's API mandates this... */
	display.cb = sizeof(DISPLAY_DEVICE);
	/* Get identifier for selected CRTC */
	if (!EnumDisplayDevices(NULL, (DWORD)crtc, &display, 0))
		return LIBGAMMA_NO_SUCH_CRTC;
	/* Check that the connector is enabled,
	 * newer versions of Windows will always pass.
	 * (According to w32's documentation, but that
	 * that is a load of crap) */
	if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE))
		return LIBGAMMA_CONNECTOR_DISABLED;
	/* Acquire CRTC connection. */
	context = CreateDC(TEXT("DISPLAY"), display.DeviceName, NULL, NULL);
	if (!context)
		return LIBGAMMA_OPEN_CRTC_FAILED;
	this->data = context;
	return 0;
}