Merge pull request #26350 from jjd-uk/estuary_media_align
[xbmc.git] / xbmc / windowing / windows / WinSystemWin32.h
blobdabc28cb5664691c67e4dcff98343caf09ccfea0
1 /*
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.
7 */
9 #pragma once
11 #include "guilib/DispResource.h"
12 #include "threads/CriticalSection.h"
13 #include "threads/SystemClock.h"
14 #include "windowing/WinSystem.h"
16 #include <shellapi.h>
17 #include <vector>
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. */
26 enum WINDOW_STATE
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[] =
36 "unknown",
37 "true fullscreen",
38 "windowed fullscreen",
39 "windowed",
40 "borderless"
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
59 int ScreenWidth;
60 int ScreenHeight;
61 int RefreshRate;
62 int Bpp;
63 int DisplayId;
64 bool Interlaced;
65 bool IsPrimary;
67 HMONITOR hMonitor;
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
74 class CIRServerSuite;
76 class CWinSystemWin32 : public CWinSystemBase
78 public:
79 CWinSystemWin32();
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;
95 bool Hide() 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;
102 // videosync
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;
109 // CWinSystemWin32
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;
126 protected:
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;
175 HWND m_hWnd;
176 HMONITOR m_hMonitor;
178 std::vector<HWND> m_hBlankWindows;
179 HINSTANCE m_hInstance;
180 HICON m_hIcon;
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
195 bool m_inFocus;
196 bool m_bMinimized;
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};
211 extern HWND g_hWnd;