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) {
119 devmode.dmSize =
sizeof(devmode);
120 devmode.dmDriverExtra = 0;
121 if (!EnumDisplaySettings(deviceName, index, &devmode)) {
139 WIN_UpdateDisplayMode(
_this, deviceName, index, mode);
144 WIN_AddDisplay(
_THIS, HMONITOR hMonitor,
const MONITORINFOEX *info)
155 if (!WIN_GetDisplayMode(
_this, info->szDevice, ENUM_CURRENT_SETTINGS, &mode)) {
168 device.cb =
sizeof(
device);
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)
213 callback_data.video_device =
_this;
215 callback_data.want_primary =
SDL_TRUE;
216 EnumDisplayMonitors(
NULL,
NULL, WIN_AddDisplaysCallback, (LPARAM)&callback_data);
219 EnumDisplayMonitors(
NULL,
NULL, WIN_AddDisplaysCallback, (LPARAM)&callback_data);
225 WIN_AddDisplays(
_this);
241 minfo.cbSize =
sizeof(MONITORINFO);
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);
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;
374 status = ChangeDisplaySettingsEx(displaydata->
DeviceName, &data->DeviceMode,
NULL, CDS_FULLSCREEN,
NULL);
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);
395 WIN_UpdateDisplayMode(
_this, displaydata->
DeviceName, ENUM_CURRENT_SETTINGS, mode);
void WIN_QuitModes(_THIS)
#define SDL_ISPIXELFORMAT_INDEXED(format)
The structure that defines a display mode.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
static SDL_VideoDevice * _this
static SDL_AudioDeviceID device
void WIN_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
int WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
int WIN_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
SDL_DisplayMode current_mode
#define WIN_StringToUTF8(S)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
SDL_DisplayMode desktop_mode
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
int WIN_GetDisplayDPI(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi)
float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
A rectangle, with the origin at the upper left.
int WIN_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)