blob: c971054ff2e704896502f1a97269ca6a33994b78 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#if defined(WINVER)
# undef WINVER
# define WINVER 0x0602
#endif
#include "Hal.h"
#include "mozilla/WindowsVersion.h"
#include "mozilla/widget/ScreenManager.h"
#include "nsIWindowsUIUtils.h"
#include "WinUtils.h"
#include <windows.h>
namespace mozilla {
namespace hal_impl {
static decltype(SetDisplayAutoRotationPreferences)*
sSetDisplayAutoRotationPreferences = nullptr;
RefPtr<GenericNonExclusivePromise> LockScreenOrientation(
const hal::ScreenOrientation& aOrientation) {
// SetDisplayAutoRotationPreferences requires Win8, tablet mode and device
// support.
if (!IsWin8OrLater()) {
return GenericNonExclusivePromise::CreateAndReject(
NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
}
AR_STATE state;
if (!widget::WinUtils::GetAutoRotationState(&state)) {
return GenericNonExclusivePromise::CreateAndReject(
NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
}
if (state & (AR_DISABLED | AR_REMOTESESSION | AR_MULTIMON | AR_NOSENSOR |
AR_NOT_SUPPORTED | AR_LAPTOP | AR_DOCKED)) {
return GenericNonExclusivePromise::CreateAndReject(
NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
}
if (!sSetDisplayAutoRotationPreferences) {
HMODULE user32dll = GetModuleHandleW(L"user32.dll");
if (user32dll) {
sSetDisplayAutoRotationPreferences =
(decltype(SetDisplayAutoRotationPreferences)*)GetProcAddress(
user32dll, "SetDisplayAutoRotationPreferences");
}
if (!sSetDisplayAutoRotationPreferences) {
return GenericNonExclusivePromise::CreateAndReject(
NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
}
}
ORIENTATION_PREFERENCE orientation = ORIENTATION_PREFERENCE_NONE;
if (aOrientation == hal::ScreenOrientation::Default) {
// Actually, current screen is single and tablet mode according to
// GetAutoRotationState. So get primary screen data for natural orientation.
RefPtr<widget::Screen> screen =
widget::ScreenManager::GetSingleton().GetPrimaryScreen();
hal::ScreenOrientation defaultOrientation =
screen->GetDefaultOrientationType();
if (defaultOrientation == hal::ScreenOrientation::LandscapePrimary) {
orientation = ORIENTATION_PREFERENCE_LANDSCAPE;
} else {
orientation = ORIENTATION_PREFERENCE_PORTRAIT;
}
} else {
if (aOrientation & hal::ScreenOrientation::LandscapePrimary) {
orientation |= ORIENTATION_PREFERENCE_LANDSCAPE;
}
if (aOrientation & hal::ScreenOrientation::LandscapeSecondary) {
orientation |= ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED;
}
if (aOrientation & hal::ScreenOrientation::PortraitPrimary) {
orientation |= ORIENTATION_PREFERENCE_PORTRAIT;
}
if (aOrientation & hal::ScreenOrientation::PortraitSecondary) {
orientation |= ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED;
}
}
if (!sSetDisplayAutoRotationPreferences(orientation)) {
return GenericNonExclusivePromise::CreateAndReject(NS_ERROR_DOM_ABORT_ERR,
__func__);
}
return GenericNonExclusivePromise::CreateAndResolve(true, __func__);
}
void UnlockScreenOrientation() {
if (!sSetDisplayAutoRotationPreferences) {
return;
}
// This does nothing if the device doesn't support orientation lock
sSetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_NONE);
}
} // namespace hal_impl
} // namespace mozilla
|