21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_WINDOWS
26 #include "../../../include/SDL_assert.h"
27 #include "../../../include/SDL_log.h"
30 #ifndef CDS_FULLSCREEN
31 #define CDS_FULLSCREEN 0
43 (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY |
46 if (
index == ENUM_CURRENT_SETTINGS
48 char bmi_data[
sizeof(BITMAPINFOHEADER) + 256 *
sizeof(RGBQUAD)];
51 int logical_width = GetDeviceCaps( hdc, HORZRES );
52 int logical_height = GetDeviceCaps( hdc, VERTRES );
54 mode->w = logical_width;
55 mode->h = logical_height;
58 bmi = (LPBITMAPINFO) bmi_data;
59 bmi->bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
61 hbm = CreateCompatibleBitmap(hdc, 1, 1);
62 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
63 GetDIBits(hdc, hbm, 0, 1,
NULL, bmi, DIB_RGB_COLORS);
67 switch (*(
Uint32 *) bmi->bmiColors) {
81 }
else if (bmi->bmiHeader.biBitCount == 8) {
83 }
else if (bmi->bmiHeader.biBitCount == 4) {
88 if ((
data->DeviceMode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) {
89 switch (
data->DeviceMode.dmBitsPerPel) {
119 devmode.dmSize =
sizeof(devmode);
120 devmode.dmDriverExtra = 0;
121 if (!EnumDisplaySettings(deviceName,
index, &devmode)) {
131 data->DeviceMode = devmode;
134 mode->w =
data->DeviceMode.dmPelsWidth;
135 mode->h =
data->DeviceMode.dmPelsHeight;
136 mode->refresh_rate =
data->DeviceMode.dmDisplayFrequency;
144 WIN_AddDisplay(
_THIS, HMONITOR hMonitor,
const MONITORINFOEX *info)
155 if (!WIN_GetDisplayMode(
_this, info->szDevice, ENUM_CURRENT_SETTINGS, &
mode)) {
169 if (EnumDisplayDevices(info->szDevice, 0, &
device, 0)) {
180 typedef struct _WIN_AddDisplaysData {
183 } WIN_AddDisplaysData;
186 WIN_AddDisplaysCallback(HMONITOR hMonitor,
191 WIN_AddDisplaysData *
data = (WIN_AddDisplaysData*)dwData;
195 info.cbSize =
sizeof(info);
197 if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info) != 0) {
198 const SDL_bool is_primary = ((info.dwFlags & MONITORINFOF_PRIMARY) == MONITORINFOF_PRIMARY);
200 if (is_primary ==
data->want_primary) {
201 WIN_AddDisplay(
data->video_device, hMonitor, &info);
210 WIN_AddDisplays(
_THIS)
225 WIN_AddDisplays(
_this);
241 minfo.cbSize =
sizeof(MONITORINFO);
242 rc = GetMonitorInfo(
data->MonitorHandle, &minfo);
248 rect->
x = minfo.rcMonitor.left;
249 rect->
y = minfo.rcMonitor.top;
250 rect->
w = minfo.rcMonitor.right - minfo.rcMonitor.left;
251 rect->
h = minfo.rcMonitor.bottom - minfo.rcMonitor.top;
261 float hdpi = 0, vdpi = 0, ddpi = 0;
263 if (videodata->GetDpiForMonitor) {
264 UINT hdpi_uint, vdpi_uint;
268 hdpi = (float)hdpi_uint;
269 vdpi = (float)hdpi_uint;
270 ddpi = (float)hdpi_uint;
277 int hdpi_int, vdpi_int, hpoints, vpoints, hpix, vpix;
278 float hinches, vinches;
284 hdpi_int = GetDeviceCaps(hdc, LOGPIXELSX);
285 vdpi_int = GetDeviceCaps(hdc, LOGPIXELSY);
286 ReleaseDC(
NULL, hdc);
288 hpoints = GetSystemMetrics(SM_CXVIRTUALSCREEN);
289 vpoints = GetSystemMetrics(SM_CYVIRTUALSCREEN);
291 hpix = MulDiv(hpoints, hdpi_int, 96);
292 vpix = MulDiv(vpoints, vdpi_int, 96);
294 hinches = (float)hpoints / 96.0
f;
295 vinches = (float)vpoints / 96.0
f;
297 hdpi = (float)hdpi_int;
298 vdpi = (float)vdpi_int;
312 return ddpi != 0.0f ? 0 :
SDL_SetError(
"Couldn't get DPI");
323 minfo.cbSize =
sizeof(MONITORINFO);
324 rc = GetMonitorInfo(
data->MonitorHandle, &minfo);
330 rect->
x = minfo.rcWork.left;
331 rect->
y = minfo.rcWork.top;
332 rect->
w = minfo.rcWork.right - minfo.rcWork.left;
333 rect->
h = minfo.rcWork.bottom - minfo.rcWork.top;
376 if (status != DISP_CHANGE_SUCCESSFUL) {
377 const char *reason =
"Unknown reason";
379 case DISP_CHANGE_BADFLAGS:
380 reason =
"DISP_CHANGE_BADFLAGS";
382 case DISP_CHANGE_BADMODE:
383 reason =
"DISP_CHANGE_BADMODE";
385 case DISP_CHANGE_BADPARAM:
386 reason =
"DISP_CHANGE_BADPARAM";
388 case DISP_CHANGE_FAILED:
389 reason =
"DISP_CHANGE_FAILED";
392 return SDL_SetError(
"ChangeDisplaySettingsEx() failed: %s", reason);
394 EnumDisplaySettings(displaydata->
DeviceName, ENUM_CURRENT_SETTINGS, &
data->DeviceMode);