aboutsummaryrefslogtreecommitdiff
path: root/xbmc/windowing/osx/WinSystemOSX.h
blob: c431d70cd9b81ba7307825b1d033601e73d72635 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 *  Copyright (C) 2005-2018 Team Kodi
 *  This file is part of Kodi - https://kodi.tv
 *
 *  SPDX-License-Identifier: GPL-2.0-or-later
 *  See LICENSES/README.md for more information.
 */

#pragma once

#include "threads/CriticalSection.h"
#include "threads/SystemClock.h"
#include "threads/Timer.h"
#include "windowing/WinSystem.h"

#include <memory>
#include <optional>
#include <string>
#include <vector>

typedef struct _CGLContextObject* CGLContextObj;
typedef struct CGRect NSRect;
class IDispResource;
class CWinEventsOSX;
#ifdef __OBJC__
@class NSWindowController;
@class NSWindow;
@class OSXGLView;
@class NSEvent;
#else
struct NSWindow;
struct OSXGLView;
struct NSEvent;
struct NSWindowController;

#endif

class CWinSystemOSX : public CWinSystemBase, public ITimerCallback
{
public:
  CWinSystemOSX();
  ~CWinSystemOSX() override;

  struct ScreenResolution
  {
    bool interlaced{false};
    size_t resWidth{0};
    size_t resHeight{0};
    size_t pixelWidth{0};
    size_t pixelHeight{0};
    double refreshrate{0.0};
  };

  // ITimerCallback interface
  void OnTimeout() override;

  // CWinSystemBase
  bool InitWindowSystem() override;
  bool DestroyWindowSystem() override;
  bool CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res) override;
  bool DestroyWindow() override;
  bool ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) override;
  bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) override;
  void UpdateResolutions() override;
  bool Minimize() override;
  bool Restore() override;
  bool Hide() override;
  bool HasCursor() override;
  bool Show(bool raise = true) override;
  unsigned int GetScreenId(const std::string& screen) override;
  void MoveToScreen(unsigned int screenIdx) override;
  void OnMove(int x, int y) override;
  void OnChangeScreen(unsigned int screenIdx) override;
  CGraphicContext& GetGfxContext() const override;
  bool HasValidResolution() const;

  std::string GetClipboardText() override;

  void Register(IDispResource* resource) override;
  void Unregister(IDispResource* resource) override;

  std::unique_ptr<CVideoSync> GetVideoSync(CVideoReferenceClock* clock) override;

  void WindowChangedScreen();

  void AnnounceOnLostDevice();
  void AnnounceOnResetDevice();
  void HandleOnResetDevice();
  void StartLostDeviceTimer();
  void StopLostDeviceTimer();

  int CheckDisplayChanging(uint32_t flags);
  void SetFullscreenWillToggle(bool toggle) { m_fullscreenWillToggle = toggle; }
  bool GetFullscreenWillToggle() { return m_fullscreenWillToggle; }
  void SignalFullScreenStateChanged(bool fullscreenState);

  CGLContextObj GetCGLContextObj();

  std::vector<std::string> GetConnectedOutputs() override;

  // winevents override
  bool MessagePump() override;

  NSRect GetWindowDimensions();
  void enableInputEvents();
  void disableInputEvents();

  void signalMouseEntered();
  void signalMouseExited();
  void SendInputEvent(NSEvent* nsEvent);

protected:
  std::unique_ptr<KODI::WINDOWING::IOSScreenSaver> GetOSScreenSaverImpl() override;

  ScreenResolution GetScreenResolution(unsigned long screenIdx);
  void EnableVSync(bool enable);
  bool SwitchToVideoMode(RESOLUTION_INFO& res);
  void FillInVideoModes();
  bool FlushBuffer();

  bool DestroyWindowInternal();

  std::unique_ptr<CWinEventsOSX> m_winEvents;

  std::string m_name;
  NSWindow* m_appWindow;
  OSXGLView* m_glView;
  unsigned long m_lastDisplayNr;
  double m_refreshRate;

  CCriticalSection m_resourceSection;
  std::vector<IDispResource*> m_resources;
  CTimer m_lostDeviceTimer;
  bool m_delayDispReset;
  XbmcThreads::EndTime<> m_dispResetTimer;
  bool m_fullscreenWillToggle;
  bool m_hasCursor{false};
  //! Set while moving the fullscreen window to another screen. Stores the target screen id.
  std::optional<unsigned long> m_fullScreenMovingToScreen;
  CCriticalSection m_critSection;

private:
  NSWindowController* m_appWindowController;
};