xbmc
WinSystemWin32.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "guilib/DispResource.h"
12 #include "threads/CriticalSection.h"
13 #include "threads/SystemClock.h"
14 #include "windowing/WinSystem.h"
15 
16 #include <shellapi.h>
17 #include <vector>
18 
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;
24 
25 /* Controls the way the window appears and behaves. */
26 enum WINDOW_STATE
27 {
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
32 };
33 
34 static const char* window_state_names[] =
35 {
36  "unknown",
37  "true fullscreen",
38  "windowed fullscreen",
39  "windowed",
40  "borderless"
41 };
42 
43 /* WINDOW_STATE restricted to fullscreen modes. */
44 enum WINDOW_FULLSCREEN_STATE
45 {
46  WINDOW_FULLSCREEN_STATE_FULLSCREEN = WINDOW_STATE_FULLSCREEN,
47  WINDOW_FULLSCREEN_STATE_FULLSCREEN_WINDOW = WINDOW_STATE_FULLSCREEN_WINDOW
48 };
49 
50 /* WINDOW_STATE restricted to windowed modes. */
51 enum WINDOW_WINDOW_STATE
52 {
53  WINDOW_WINDOW_STATE_WINDOWED = WINDOW_STATE_WINDOWED,
54  WINDOW_WINDOW_STATE_BORDERLESS = WINDOW_STATE_BORDERLESS
55 };
56 
57 struct MONITOR_DETAILS
58 {
59  int ScreenWidth;
60  int ScreenHeight;
61  int RefreshRate;
62  int Bpp;
63  int DisplayId;
64  bool Interlaced;
65  bool IsPrimary;
66 
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
72 };
73 
74 class CIRServerSuite;
75 
77 {
78 public:
80  virtual ~CWinSystemWin32();
81 
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  bool HasSystemSdrPeakLuminance() override;
100 
101  // videosync
102  std::unique_ptr<CVideoSync> GetVideoSync(CVideoReferenceClock* clock) override;
103 
104  bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) override;
105 
106  std::vector<std::string> GetConnectedOutputs() override;
107 
108  // CWinSystemWin32
109  HWND GetHwnd() const { return m_hWnd; }
110  bool IsAlteringWindow() const { return m_IsAlteringWindow; }
111  void SetAlteringWindow(bool altering) { m_IsAlteringWindow = altering; }
112  bool IsTogglingHDR() const { return m_IsTogglingHDR; }
113  void SetTogglingHDR(bool toggling);
114  virtual bool DPIChanged(WORD dpi, RECT windowRect) const;
115  bool IsMinimized() const { return m_bMinimized; }
116  void SetMinimized(bool minimized);
117  float GetGuiSdrPeakLuminance() const;
118  void CacheSystemSdrPeakLuminance();
119 
120  void SetSizeMoveMode(bool mode) { m_bSizeMoveEnabled = mode; }
121  bool IsInSizeMoveMode() const { return m_bSizeMoveEnabled; }
122 
123  // winevents override
124  bool MessagePump() override;
125 
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;
138 
139  virtual void Register(IDispResource *resource);
140  virtual void Unregister(IDispResource *resource);
141 
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);
150 
151 
156  static bool AddResolution(const RESOLUTION_INFO &res);
157 
158  void OnDisplayLost();
159  void OnDisplayReset();
160  void OnDisplayBack();
161  void ResolutionChanged();
162  static void SetForegroundWindowInternal(HWND hWnd);
163  static RECT GetVirtualScreenRect();
167  RECT GetScreenWorkArea(HMONITOR handle) const;
173  RECT GetNcAreaOffsets(DWORD dwStyle, BOOL bMenu, DWORD dwExStyle) const;
174 
175  HWND m_hWnd;
176  HMONITOR m_hMonitor;
177 
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};
184 
185  CCriticalSection m_resourceSection;
186  std::vector<IDispResource*> m_resources;
187  bool m_delayDispReset;
188  XbmcThreads::EndTime<> m_dispResetTimer;
189 
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;
201 
202  NOTIFYICONDATA m_trayIcon = {};
203 
204  static const char* SETTING_WINDOW_TOP;
205  static const char* SETTING_WINDOW_LEFT;
206 
207  bool m_validSystemSdrPeakLuminance{false};
208  float m_systemSdrPeakLuminance{.0f};
209 };
210 
211 extern HWND g_hWnd;
212 
Definition: WinSystemWin10.h:53
Definition: WinSystem.h:49
Definition: SystemClock.h:31
Definition: DispResource.h:14
Provide info of a resolution.
Definition: Resolution.h:66
Definition: WinSystemWin32.h:76
Definition: VideoReferenceClock.h:19
#define U(j)
uj for division
Definition: bigint.c:73
Definition: IRServerSuite.h:20