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
parent
4aedfcc4b9
commit
e5ca416e2f
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue