win32: implement screen orientation support

This commit is contained in:
Brad Parker 2019-02-21 14:36:56 -05:00
parent 46c557f3a5
commit 99f4203abf
2 changed files with 92 additions and 2 deletions

View File

@ -80,6 +80,11 @@
#define DragQueryFileR DragQueryFileW
#endif
/* For some reason this is missing from mingw winuser.h */
#ifndef EDS_ROTATEDMODE
#define EDS_ROTATEDMODE 4
#endif
const GUID GUID_DEVINTERFACE_HID = { 0x4d1e55b2, 0xf16f, 0x11Cf, { 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } };
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x501
static HDEVNOTIFY notification_handler;
@ -1568,10 +1573,15 @@ bool win32_get_video_output(DEVMODE *dm, int mode, size_t len)
{
memset(dm, 0, len);
dm->dmSize = len;
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 /* 2K */
if (EnumDisplaySettingsEx(NULL,
(mode == -1) ? ENUM_CURRENT_SETTINGS : mode, dm, EDS_ROTATEDMODE) == 0)
return false;
#else
if (EnumDisplaySettings(NULL,
(mode == -1) ? ENUM_CURRENT_SETTINGS : mode, dm) == 0)
return false;
#endif
return true;
}

View File

@ -31,6 +31,10 @@
#undef COBJMACROS
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0601 /* Windows 7 */
#endif
#include "../video_display_server.h"
#include "../common/win32_common.h"
#include "../../verbosity.h"
@ -346,6 +350,78 @@ void *win32_display_server_get_resolution_list(void *data,
return conf;
}
#if _WIN32_WINNT >= 0x0500
void win32_display_server_set_screen_orientation(enum rotation rotation)
{
DEVMODE dm = {0};
win32_get_video_output(&dm, -1, sizeof(dm));
switch (rotation)
{
case ORIENTATION_NORMAL:
default:
{
int width = dm.dmPelsWidth;
if ((dm.dmDisplayOrientation == DMDO_90 || dm.dmDisplayOrientation == DMDO_270) && width != dm.dmPelsHeight)
{
/* device is changing orientations, swap the aspect */
dm.dmPelsWidth = dm.dmPelsHeight;
dm.dmPelsHeight = width;
}
dm.dmDisplayOrientation = DMDO_DEFAULT;
break;
}
case ORIENTATION_VERTICAL:
{
int width = dm.dmPelsWidth;
if ((dm.dmDisplayOrientation == DMDO_DEFAULT || dm.dmDisplayOrientation == DMDO_180) && width != dm.dmPelsHeight)
{
/* device is changing orientations, swap the aspect */
dm.dmPelsWidth = dm.dmPelsHeight;
dm.dmPelsHeight = width;
}
dm.dmDisplayOrientation = DMDO_270;
break;
}
case ORIENTATION_FLIPPED:
{
int width = dm.dmPelsWidth;
if ((dm.dmDisplayOrientation == DMDO_90 || dm.dmDisplayOrientation == DMDO_270) && width != dm.dmPelsHeight)
{
/* device is changing orientations, swap the aspect */
dm.dmPelsWidth = dm.dmPelsHeight;
dm.dmPelsHeight = width;
}
dm.dmDisplayOrientation = DMDO_180;
break;
}
case ORIENTATION_FLIPPED_ROTATED:
{
int width = dm.dmPelsWidth;
if ((dm.dmDisplayOrientation == DMDO_DEFAULT || dm.dmDisplayOrientation == DMDO_180) && width != dm.dmPelsHeight)
{
/* device is changing orientations, swap the aspect */
dm.dmPelsWidth = dm.dmPelsHeight;
dm.dmPelsHeight = width;
}
dm.dmDisplayOrientation = DMDO_90;
break;
}
}
win32_change_display_settings(NULL, &dm, 0);
}
#endif
const video_display_server_t dispserv_win32 = {
win32_display_server_init,
win32_display_server_destroy,
@ -355,6 +431,10 @@ const video_display_server_t dispserv_win32 = {
win32_display_server_set_resolution,
win32_display_server_get_resolution_list,
NULL, /* get_output_options */
NULL, /* set_screen_orientation */
#if _WIN32_WINNT >= 0x0500
win32_display_server_set_screen_orientation,
#else
NULL,
#endif
"win32"
};