23 #if SDL_VIDEO_DRIVER_WINDOWS
28 #ifndef CDS_FULLSCREEN
29 #define CDS_FULLSCREEN 0
39 devmode.dmSize =
sizeof(devmode);
40 devmode.dmDriverExtra = 0;
41 if (!EnumDisplaySettings(deviceName, index, &devmode)) {
51 (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY |
56 mode->
w = devmode.dmPelsWidth;
57 mode->
h = devmode.dmPelsHeight;
61 if (index == ENUM_CURRENT_SETTINGS
63 char bmi_data[
sizeof(BITMAPINFOHEADER) + 256 *
sizeof(RGBQUAD)];
68 bmi = (LPBITMAPINFO) bmi_data;
69 bmi->bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
71 hbm = CreateCompatibleBitmap(hdc, 1, 1);
72 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
73 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
77 switch (*(
Uint32 *) bmi->bmiColors) {
91 }
else if (bmi->bmiHeader.biBitCount == 8) {
93 }
else if (bmi->bmiHeader.biBitCount == 4) {
98 if ((devmode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) {
99 switch (devmode.dmBitsPerPel) {
125 WIN_AddDisplay(LPTSTR DeviceName)
130 DISPLAY_DEVICE device;
135 if (!WIN_GetDisplayMode(DeviceName, ENUM_CURRENT_SETTINGS, &mode)) {
147 device.cb =
sizeof(device);
148 if (EnumDisplayDevices(DeviceName, 0, &device, 0)) {
164 DISPLAY_DEVICE device;
166 device.cb =
sizeof(device);
169 for (pass = 0; pass < 2; ++pass) {
171 TCHAR DeviceName[32];
173 if (!EnumDisplayDevices(
NULL, i, &device, 0)) {
176 if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
180 if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
184 if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
188 SDL_memcpy(DeviceName, device.DeviceName,
sizeof(DeviceName));
194 if (!EnumDisplayDevices(DeviceName, j, &device, 0)) {
197 if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
201 if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
205 if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
209 count += WIN_AddDisplay(device.DeviceName);
212 WIN_AddDisplay(DeviceName);
243 if (!WIN_GetDisplayMode(data->
DeviceName, i, &mode)) {
270 ChangeDisplaySettingsEx(displaydata->
DeviceName, &data->DeviceMode,
272 if (status != DISP_CHANGE_SUCCESSFUL) {
273 const char *reason =
"Unknown reason";
275 case DISP_CHANGE_BADFLAGS:
276 reason =
"DISP_CHANGE_BADFLAGS";
278 case DISP_CHANGE_BADMODE:
279 reason =
"DISP_CHANGE_BADMODE";
281 case DISP_CHANGE_BADPARAM:
282 reason =
"DISP_CHANGE_BADPARAM";
284 case DISP_CHANGE_FAILED:
285 reason =
"DISP_CHANGE_FAILED";
288 return SDL_SetError(
"ChangeDisplaySettingsEx() failed: %s", reason);
290 EnumDisplaySettings(displaydata->
DeviceName, ENUM_CURRENT_SETTINGS, &data->DeviceMode);
void WIN_QuitModes(_THIS)
#define SDL_ISPIXELFORMAT_INDEXED(format)
DECLSPEC void SDLCALL SDL_free(void *mem)
The structure that defines a display mode.
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
typedef HDC(WINAPI *PFNWGLGETCURRENTREADDCARBPROC)(VOID)
static SDL_VideoDevice * _this
uint32_t Uint32
An unsigned 32-bit integer type.
void WIN_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
int WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int WIN_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
SDL_DisplayMode current_mode
#define WIN_StringToUTF8(S)
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
DECLSPEC void *SDLCALL SDL_malloc(size_t size)
SDL_DisplayMode desktop_mode
DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len)
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
A rectangle, with the origin at the upper left.