2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "guilib/DispResource.h"
12 #include "threads/CriticalSection.h"
13 #include "threads/SystemClock.h"
14 #include "windowing/WinSystem.h"
19 static const DWORD WINDOWED_STYLE
= WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
;
20 static const DWORD WINDOWED_EX_STYLE
= NULL
;
21 static const DWORD FULLSCREEN_WINDOW_STYLE
= WS_POPUP
| WS_SYSMENU
| WS_CLIPCHILDREN
;
22 static const DWORD FULLSCREEN_WINDOW_EX_STYLE
= WS_EX_APPWINDOW
;
23 static const UINT ID_TIMER_HDR
= 34U;
25 /* Controls the way the window appears and behaves. */
28 WINDOW_STATE_FULLSCREEN
= 1, // Exclusive fullscreen
29 WINDOW_STATE_FULLSCREEN_WINDOW
, // Non-exclusive fullscreen window
30 WINDOW_STATE_WINDOWED
, //Movable window with border
31 WINDOW_STATE_BORDERLESS
//Non-movable window with no border
34 static const char* window_state_names
[] =
38 "windowed fullscreen",
43 /* WINDOW_STATE restricted to fullscreen modes. */
44 enum WINDOW_FULLSCREEN_STATE
46 WINDOW_FULLSCREEN_STATE_FULLSCREEN
= WINDOW_STATE_FULLSCREEN
,
47 WINDOW_FULLSCREEN_STATE_FULLSCREEN_WINDOW
= WINDOW_STATE_FULLSCREEN_WINDOW
50 /* WINDOW_STATE restricted to windowed modes. */
51 enum WINDOW_WINDOW_STATE
53 WINDOW_WINDOW_STATE_WINDOWED
= WINDOW_STATE_WINDOWED
,
54 WINDOW_WINDOW_STATE_BORDERLESS
= WINDOW_STATE_BORDERLESS
57 struct MONITOR_DETAILS
68 std::wstring MonitorNameW
;
69 std::wstring CardNameW
;
70 std::wstring DeviceNameW
;
71 std::wstring DeviceStringW
; // GDI device, for migration of the monitor setting from Kodi < 21
76 class CWinSystemWin32
: public CWinSystemBase
80 virtual ~CWinSystemWin32();
82 // CWinSystemBase overrides
83 bool InitWindowSystem() override
;
84 bool DestroyWindowSystem() override
;
85 bool ResizeWindow(int newWidth
, int newHeight
, int newLeft
, int newTop
) override
;
86 void FinishWindowResize(int newWidth
, int newHeight
) override
;
87 void ForceFullScreen(const RESOLUTION_INFO
& resInfo
) override
;
88 void UpdateResolutions() override
;
89 bool CenterWindow() override
;
90 virtual void NotifyAppFocusChange(bool bGaining
) override
;
91 void ShowOSMouse(bool show
) override
;
92 bool HasInertialGestures() override
{ return true; }//if win32 has touchscreen - it uses the win32 gesture api for inertial scrolling
93 bool Minimize() override
;
94 bool Restore() override
;
96 bool Show(bool raise
= true) override
;
97 std::string
GetClipboardText() override
;
98 bool UseLimitedColor() override
;
99 float GetGuiSdrPeakLuminance() const override
;
100 bool HasSystemSdrPeakLuminance() override
;
103 std::unique_ptr
<CVideoSync
> GetVideoSync(CVideoReferenceClock
* clock
) override
;
105 bool SetFullScreen(bool fullScreen
, RESOLUTION_INFO
& res
, bool blankOtherDisplays
) override
;
107 std::vector
<std::string
> GetConnectedOutputs() override
;
110 HWND
GetHwnd() const { return m_hWnd
; }
111 bool IsAlteringWindow() const { return m_IsAlteringWindow
; }
112 void SetAlteringWindow(bool altering
) { m_IsAlteringWindow
= altering
; }
113 bool IsTogglingHDR() const { return m_IsTogglingHDR
; }
114 void SetTogglingHDR(bool toggling
);
115 virtual bool DPIChanged(WORD dpi
, RECT windowRect
) const;
116 bool IsMinimized() const { return m_bMinimized
; }
117 void SetMinimized(bool minimized
);
118 void CacheSystemSdrPeakLuminance();
120 void SetSizeMoveMode(bool mode
) { m_bSizeMoveEnabled
= mode
; }
121 bool IsInSizeMoveMode() const { return m_bSizeMoveEnabled
; }
123 // winevents override
124 bool MessagePump() override
;
127 bool CreateNewWindow(const std::string
& name
, bool fullScreen
, RESOLUTION_INFO
& res
) override
= 0;
128 virtual void UpdateStates(bool fullScreen
);
129 WINDOW_STATE
GetState(bool fullScreen
) const;
130 virtual void SetDeviceFullScreen(bool fullScreen
, RESOLUTION_INFO
& res
) = 0;
131 virtual void ReleaseBackBuffer() = 0;
132 virtual void CreateBackBuffer() = 0;
133 virtual void ResizeDeviceBuffers() = 0;
134 virtual bool IsStereoEnabled() = 0;
135 virtual void OnScreenChange(HMONITOR monitor
) = 0;
136 virtual void AdjustWindow(bool forceResize
= false);
137 void CenterCursor() const;
139 virtual void Register(IDispResource
*resource
);
140 virtual void Unregister(IDispResource
*resource
);
142 virtual bool ChangeResolution(const RESOLUTION_INFO
& res
, bool forceChange
= false);
143 virtual bool CreateBlankWindows();
144 virtual bool BlankNonActiveMonitors(bool bBlank
);
145 MONITOR_DETAILS
* GetDisplayDetails(const std::string
& name
);
146 MONITOR_DETAILS
* GetDisplayDetails(HMONITOR handle
);
147 void RestoreDesktopResolution(MONITOR_DETAILS
* details
);
148 RECT
ScreenRect(HMONITOR handle
);
149 void GetConnectedDisplays(std::vector
<MONITOR_DETAILS
>& outputs
);
153 \brief Adds a resolution to the list of resolutions if we don't already have it
154 \param res resolution to add.
156 static bool AddResolution(const RESOLUTION_INFO
&res
);
158 void OnDisplayLost();
159 void OnDisplayReset();
160 void OnDisplayBack();
161 void ResolutionChanged();
162 static void SetForegroundWindowInternal(HWND hWnd
);
163 static RECT
GetVirtualScreenRect();
165 * Retrieve the work area of the screen (exclude task bar and other occlusions)
167 RECT
GetScreenWorkArea(HMONITOR handle
) const;
169 * Retrieve size of the title bar and borders
170 * Add to coordinates to convert client coordinates to window coordinates
171 * Substract from coordinates to convert from window coordinates to client coordinates
173 RECT
GetNcAreaOffsets(DWORD dwStyle
, BOOL bMenu
, DWORD dwExStyle
) const;
178 std::vector
<HWND
> m_hBlankWindows
;
179 HINSTANCE m_hInstance
;
181 bool m_ValidWindowedPosition
;
182 bool m_IsAlteringWindow
;
183 bool m_IsTogglingHDR
{false};
185 CCriticalSection m_resourceSection
;
186 std::vector
<IDispResource
*> m_resources
;
187 bool m_delayDispReset
;
188 XbmcThreads::EndTime
<> m_dispResetTimer
;
190 WINDOW_STATE m_state
; // the state of the window
191 WINDOW_FULLSCREEN_STATE m_fullscreenState
; // the state of the window when in fullscreen
192 WINDOW_WINDOW_STATE m_windowState
; // the state of the window when in windowed
193 DWORD m_windowStyle
; // the style of the window
194 DWORD m_windowExStyle
; // the ex style of the window
197 bool m_bSizeMoveEnabled
= false;
198 bool m_bFirstResChange
= true;
199 std::unique_ptr
<CIRServerSuite
> m_irss
;
200 std::vector
<MONITOR_DETAILS
> m_displays
;
202 NOTIFYICONDATA m_trayIcon
= {};
204 static const char* SETTING_WINDOW_TOP
;
205 static const char* SETTING_WINDOW_LEFT
;
207 bool m_validSystemSdrPeakLuminance
{false};
208 float m_systemSdrPeakLuminance
{.0f
};