Windows QPA: Add API for setting the application orientation preference.

Dynamically load the Win32 API functions for setting the rotation
preference and map this to static functions taking a
Qt::ScreenOrientation in QWindowsScreen.

Task-number: QTBUG-49541
Change-Id: I1c81cf6274d79a023a2ee755dd7c085ffd7cc015
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
bb10
Friedemann Kleint 2015-11-23 11:39:20 +01:00
parent 4aedfcc4b9
commit e5ca416e2f
4 changed files with 81 additions and 1 deletions

View File

@ -177,7 +177,8 @@ QWindowsUser32DLL::QWindowsUser32DLL() :
isHungAppWindow(0), isTouchWindow(0),
registerTouchWindow(0), unregisterTouchWindow(0),
getTouchInputInfo(0), closeTouchInputHandle(0), setProcessDPIAware(0),
addClipboardFormatListener(0), removeClipboardFormatListener(0)
addClipboardFormatListener(0), removeClipboardFormatListener(0),
getDisplayAutoRotationPreferences(0), setDisplayAutoRotationPreferences(0)
{
}
@ -198,6 +199,8 @@ void QWindowsUser32DLL::init()
addClipboardFormatListener = (AddClipboardFormatListener)library.resolve("AddClipboardFormatListener");
removeClipboardFormatListener = (RemoveClipboardFormatListener)library.resolve("RemoveClipboardFormatListener");
}
getDisplayAutoRotationPreferences = (GetDisplayAutoRotationPreferences)library.resolve("GetDisplayAutoRotationPreferences");
setDisplayAutoRotationPreferences = (SetDisplayAutoRotationPreferences)library.resolve("SetDisplayAutoRotationPreferences");
}
bool QWindowsUser32DLL::initTouch()

View File

@ -94,6 +94,8 @@ struct QWindowsUser32DLL
typedef BOOL (WINAPI *SetProcessDPIAware)();
typedef BOOL (WINAPI *AddClipboardFormatListener)(HWND);
typedef BOOL (WINAPI *RemoveClipboardFormatListener)(HWND);
typedef BOOL (WINAPI *GetDisplayAutoRotationPreferences)(DWORD *);
typedef BOOL (WINAPI *SetDisplayAutoRotationPreferences)(DWORD);
// Functions missing in Q_CC_GNU stub libraries.
SetLayeredWindowAttributes setLayeredWindowAttributes;
@ -116,6 +118,10 @@ struct QWindowsUser32DLL
// Clipboard listeners, Windows Vista onwards
AddClipboardFormatListener addClipboardFormatListener;
RemoveClipboardFormatListener removeClipboardFormatListener;
// Rotation API
GetDisplayAutoRotationPreferences getDisplayAutoRotationPreferences;
SetDisplayAutoRotationPreferences setDisplayAutoRotationPreferences;
};
struct QWindowsShell32DLL

View File

@ -325,6 +325,74 @@ void QWindowsScreen::handleChanges(const QWindowsScreenData &newData)
}
}
enum OrientationPreference // matching Win32 API ORIENTATION_PREFERENCE
#if defined(Q_COMPILER_CLASS_ENUM) || defined(Q_CC_MSVC)
: DWORD
#endif
{
orientationPreferenceNone = 0,
orientationPreferenceLandscape = 0x1,
orientationPreferencePortrait = 0x2,
orientationPreferenceLandscapeFlipped = 0x4,
orientationPreferencePortraitFlipped = 0x8
};
bool QWindowsScreen::setOrientationPreference(Qt::ScreenOrientation o)
{
bool result = false;
#ifndef Q_OS_WINCE
if (QWindowsContext::user32dll.setDisplayAutoRotationPreferences) {
DWORD orientationPreference = 0;
switch (o) {
case Qt::PrimaryOrientation:
orientationPreference = orientationPreferenceNone;
break;
case Qt::PortraitOrientation:
orientationPreference = orientationPreferencePortrait;
break;
case Qt::LandscapeOrientation:
orientationPreference = orientationPreferenceLandscape;
break;
case Qt::InvertedPortraitOrientation:
orientationPreference = orientationPreferencePortraitFlipped;
break;
case Qt::InvertedLandscapeOrientation:
orientationPreference = orientationPreferenceLandscapeFlipped;
break;
}
result = QWindowsContext::user32dll.setDisplayAutoRotationPreferences(orientationPreference);
}
#endif // !Q_OS_WINCE
return result;
}
Qt::ScreenOrientation QWindowsScreen::orientationPreference()
{
Qt::ScreenOrientation result = Qt::PrimaryOrientation;
#ifndef Q_OS_WINCE
if (QWindowsContext::user32dll.getDisplayAutoRotationPreferences) {
DWORD orientationPreference = 0;
if (QWindowsContext::user32dll.getDisplayAutoRotationPreferences(&orientationPreference)) {
switch (orientationPreference) {
case orientationPreferenceLandscape:
result = Qt::LandscapeOrientation;
break;
case orientationPreferencePortrait:
result = Qt::PortraitOrientation;
break;
case orientationPreferenceLandscapeFlipped:
result = Qt::InvertedLandscapeOrientation;
break;
case orientationPreferencePortraitFlipped:
result = Qt::InvertedPortraitOrientation;
break;
}
}
}
#endif // !Q_OS_WINCE
return result;
}
/*!
\brief Queries ClearType settings to check the pixel layout
*/

View File

@ -97,6 +97,9 @@ public:
QPixmap grabWindow(WId window, int qX, int qY, int qWidth, int qHeight) const Q_DECL_OVERRIDE;
QPlatformScreen::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const Q_DECL_OVERRIDE;
static Qt::ScreenOrientation orientationPreference();
static bool setOrientationPreference(Qt::ScreenOrientation o);
inline void handleChanges(const QWindowsScreenData &newData);
#ifndef QT_NO_CURSOR