Implemented querying the orientation of displays on Windows
parent
3a31a45028
commit
c0f1109bd0
|
@ -108,8 +108,50 @@ WIN_UpdateDisplayMode(_THIS, LPCWSTR deviceName, DWORD index, SDL_DisplayMode *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SDL_DisplayOrientation
|
||||||
|
WIN_GetDisplayOrientation(DEVMODE *mode)
|
||||||
|
{
|
||||||
|
int width = mode->dmPelsWidth;
|
||||||
|
int height = mode->dmPelsHeight;
|
||||||
|
|
||||||
|
/* Use unrotated width/height to guess orientation */
|
||||||
|
if (mode->dmDisplayOrientation == DMDO_90 || mode->dmDisplayOrientation == DMDO_270) {
|
||||||
|
int temp = width;
|
||||||
|
width = height;
|
||||||
|
height = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width >= height) {
|
||||||
|
switch (mode->dmDisplayOrientation) {
|
||||||
|
case DMDO_DEFAULT:
|
||||||
|
return SDL_ORIENTATION_LANDSCAPE;
|
||||||
|
case DMDO_90:
|
||||||
|
return SDL_ORIENTATION_PORTRAIT;
|
||||||
|
case DMDO_180:
|
||||||
|
return SDL_ORIENTATION_LANDSCAPE_FLIPPED;
|
||||||
|
case DMDO_270:
|
||||||
|
return SDL_ORIENTATION_PORTRAIT_FLIPPED;
|
||||||
|
default:
|
||||||
|
return SDL_ORIENTATION_UNKNOWN;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (mode->dmDisplayOrientation) {
|
||||||
|
case DMDO_DEFAULT:
|
||||||
|
return SDL_ORIENTATION_PORTRAIT;
|
||||||
|
case DMDO_90:
|
||||||
|
return SDL_ORIENTATION_LANDSCAPE_FLIPPED;
|
||||||
|
case DMDO_180:
|
||||||
|
return SDL_ORIENTATION_PORTRAIT_FLIPPED;
|
||||||
|
case DMDO_270:
|
||||||
|
return SDL_ORIENTATION_LANDSCAPE;
|
||||||
|
default:
|
||||||
|
return SDL_ORIENTATION_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SDL_bool
|
static SDL_bool
|
||||||
WIN_GetDisplayMode(_THIS, LPCWSTR deviceName, DWORD index, SDL_DisplayMode * mode)
|
WIN_GetDisplayMode(_THIS, LPCWSTR deviceName, DWORD index, SDL_DisplayMode * mode, SDL_DisplayOrientation *orientation)
|
||||||
{
|
{
|
||||||
SDL_DisplayModeData *data;
|
SDL_DisplayModeData *data;
|
||||||
DEVMODE devmode;
|
DEVMODE devmode;
|
||||||
|
@ -135,6 +177,11 @@ WIN_GetDisplayMode(_THIS, LPCWSTR deviceName, DWORD index, SDL_DisplayMode * mod
|
||||||
|
|
||||||
/* Fill in the mode information */
|
/* Fill in the mode information */
|
||||||
WIN_UpdateDisplayMode(_this, deviceName, index, mode);
|
WIN_UpdateDisplayMode(_this, deviceName, index, mode);
|
||||||
|
|
||||||
|
if (orientation) {
|
||||||
|
*orientation = WIN_GetDisplayOrientation(&devmode);
|
||||||
|
}
|
||||||
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,13 +192,14 @@ WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info, SDL_bool se
|
||||||
SDL_VideoDisplay display;
|
SDL_VideoDisplay display;
|
||||||
SDL_DisplayData *displaydata;
|
SDL_DisplayData *displaydata;
|
||||||
SDL_DisplayMode mode;
|
SDL_DisplayMode mode;
|
||||||
|
SDL_DisplayOrientation orientation;
|
||||||
DISPLAY_DEVICEW device;
|
DISPLAY_DEVICEW device;
|
||||||
|
|
||||||
#ifdef DEBUG_MODES
|
#ifdef DEBUG_MODES
|
||||||
SDL_Log("Display: %s\n", WIN_StringToUTF8W(info->szDevice));
|
SDL_Log("Display: %s\n", WIN_StringToUTF8W(info->szDevice));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!WIN_GetDisplayMode(_this, info->szDevice, ENUM_CURRENT_SETTINGS, &mode)) {
|
if (!WIN_GetDisplayMode(_this, info->szDevice, ENUM_CURRENT_SETTINGS, &mode, &orientation)) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,6 +231,7 @@ WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info, SDL_bool se
|
||||||
}
|
}
|
||||||
display.desktop_mode = mode;
|
display.desktop_mode = mode;
|
||||||
display.current_mode = mode;
|
display.current_mode = mode;
|
||||||
|
display.orientation = orientation;
|
||||||
display.driverdata = displaydata;
|
display.driverdata = displaydata;
|
||||||
SDL_AddVideoDisplay(&display, send_event);
|
SDL_AddVideoDisplay(&display, send_event);
|
||||||
SDL_free(display.name);
|
SDL_free(display.name);
|
||||||
|
@ -357,7 +406,7 @@ WIN_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
|
||||||
SDL_DisplayMode mode;
|
SDL_DisplayMode mode;
|
||||||
|
|
||||||
for (i = 0;; ++i) {
|
for (i = 0;; ++i) {
|
||||||
if (!WIN_GetDisplayMode(_this, data->DeviceName, i, &mode)) {
|
if (!WIN_GetDisplayMode(_this, data->DeviceName, i, &mode, NULL)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) {
|
if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) {
|
||||||
|
|
Loading…
Reference in New Issue