30#include <freerdp/freerdp.h>
34#include <sdl_common_utils.hpp>
36#include "sdl_window.hpp"
37#include "sdl_disp.hpp"
38#include "sdl_clip.hpp"
39#include "sdl_input.hpp"
41#include "dialogs/sdl_connection_dialog_wrapper.hpp"
61 [[nodiscard]]
bool redraw(
bool suppress =
false)
const;
63 void setConnected(
bool val);
64 [[nodiscard]]
bool isConnected()
const;
67 [[nodiscard]]
bool resizeable()
const;
68 [[nodiscard]]
bool toggleResizeable();
69 [[nodiscard]]
bool setResizeable(
bool enable);
71 [[nodiscard]]
bool fullscreen()
const;
72 [[nodiscard]]
bool toggleFullscreen();
73 [[nodiscard]]
bool setFullscreen(
bool enter,
bool forceOriginalDisplay =
false);
75 [[nodiscard]]
bool setMinimized();
77 [[nodiscard]]
bool grabMouse()
const;
78 [[nodiscard]]
bool toggleGrabMouse();
79 [[nodiscard]]
bool setGrabMouse(
bool enter);
81 [[nodiscard]]
bool grabKeyboard()
const;
82 [[nodiscard]]
bool toggleGrabKeyboard();
83 [[nodiscard]]
bool setGrabKeyboard(
bool enter);
85 [[nodiscard]] rdpContext* context()
const;
86 [[nodiscard]] rdpClientContext* common()
const;
88 [[nodiscard]]
bool setCursor(CursorType type);
89 [[nodiscard]]
bool setCursor(rdpPointer* cursor);
90 [[nodiscard]] rdpPointer* cursor()
const;
91 [[nodiscard]]
bool restoreCursor();
93 void setMonitorIds(
const std::vector<SDL_DisplayID>& ids);
94 [[nodiscard]]
const std::vector<SDL_DisplayID>& monitorIds()
const;
95 [[nodiscard]] int64_t monitorId(uint32_t index)
const;
97 void push(std::vector<SDL_Rect>&& rects);
98 [[nodiscard]] std::vector<SDL_Rect> pop();
100 void setHasCursor(
bool val);
101 [[nodiscard]]
bool hasCursor()
const;
105 [[nodiscard]]
int start();
106 [[nodiscard]]
int join();
107 [[nodiscard]]
bool shallAbort(
bool ignoreDialogs =
false);
109 [[nodiscard]]
bool createWindows();
110 [[nodiscard]]
bool updateWindowList();
111 [[nodiscard]]
bool updateWindow(SDL_WindowID
id);
113 [[nodiscard]]
bool drawToWindows(
const std::vector<SDL_Rect>& rects = {});
114 [[nodiscard]]
bool drawToWindow(
SdlWindow& window,
const std::vector<SDL_Rect>& rects = {});
115 [[nodiscard]]
bool minimizeAllWindows();
116 [[nodiscard]]
int exitCode()
const;
117 [[nodiscard]] SDL_PixelFormat pixelFormat()
const;
119 [[nodiscard]]
const SdlWindow* getWindowForId(SDL_WindowID
id)
const;
120 [[nodiscard]]
SdlWindow* getWindowForId(SDL_WindowID
id);
121 [[nodiscard]]
SdlWindow* getFirstWindow();
123 [[nodiscard]]
bool addDisplayWindow(SDL_DisplayID
id);
124 [[nodiscard]]
bool removeDisplayWindow(SDL_DisplayID
id);
125 [[nodiscard]]
bool detectDisplays();
126 [[nodiscard]]
rdpMonitor getDisplay(SDL_DisplayID
id)
const;
127 [[nodiscard]] std::vector<SDL_DisplayID> getDisplayIds()
const;
130 [[nodiscard]]
sdlInput& getInputChannelContext();
131 [[nodiscard]]
sdlClip& getClipboardChannelContext();
135 [[nodiscard]] wLog* getWLog();
137 [[nodiscard]]
bool moveMouseTo(
const SDL_FPoint& pos);
139 [[nodiscard]] SDL_FPoint screenToPixel(SDL_WindowID
id,
const SDL_FPoint& pos);
141 [[nodiscard]] SDL_FPoint pixelToScreen(SDL_WindowID
id,
const SDL_FPoint& pos);
142 [[nodiscard]] SDL_FRect pixelToScreen(SDL_WindowID
id,
const SDL_FRect& pos);
144 [[nodiscard]]
bool handleEvent(
const SDL_Event& ev);
147 [[nodiscard]]
static BOOL preConnect(freerdp* instance);
148 [[nodiscard]]
static BOOL postConnect(freerdp* instance);
149 static void postDisconnect(freerdp* instance);
150 static void postFinalDisconnect(freerdp* instance);
151 [[nodiscard]]
static BOOL desktopResize(rdpContext* context);
152 [[nodiscard]]
static BOOL playSound(rdpContext* context,
const PLAY_SOUND_UPDATE* play_sound);
153 [[nodiscard]]
static BOOL beginPaint(rdpContext* context);
154 [[nodiscard]]
static BOOL endPaint(rdpContext* context);
155 [[nodiscard]]
static DWORD WINAPI rdpThreadRun(
SdlContext* sdl);
157 [[nodiscard]]
bool eventToPixelCoordinates(SDL_WindowID
id, SDL_Event& ev);
159 [[nodiscard]] SDL_FPoint applyLocalScaling(
const SDL_FPoint& val)
const;
160 void removeLocalScaling(
float& x,
float& y)
const;
162 [[nodiscard]]
bool handleEvent(
const SDL_WindowEvent& ev);
163 [[nodiscard]]
bool handleEvent(
const SDL_DisplayEvent& ev);
164 [[nodiscard]]
bool handleEvent(
const SDL_MouseButtonEvent& ev);
165 [[nodiscard]]
bool handleEvent(
const SDL_MouseMotionEvent& ev);
166 [[nodiscard]]
bool handleEvent(
const SDL_MouseWheelEvent& ev);
167 [[nodiscard]]
bool handleEvent(
const SDL_TouchFingerEvent& ev);
169 void addOrUpdateDisplay(SDL_DisplayID
id);
170 void deleteDisplay(SDL_DisplayID
id);
172 [[nodiscard]]
bool createPrimary();
173 [[nodiscard]] std::string windowTitle()
const;
174 [[nodiscard]]
bool waitForWindowsCreated();
176 void sdl_client_cleanup(
int exit_code,
const std::string& error_msg);
177 [[nodiscard]]
int sdl_client_thread_connect(std::string& error_msg);
178 [[nodiscard]]
int sdl_client_thread_run(std::string& error_msg);
180 [[nodiscard]]
int error_info_to_error(DWORD* pcode,
char** msg,
size_t* len)
const;
182 void applyMonitorOffset(SDL_WindowID window,
float& x,
float& y)
const;
184 [[nodiscard]] std::vector<SDL_DisplayID>
185 updateDisplayOffsetsForNeighbours(SDL_DisplayID
id,
186 const std::vector<SDL_DisplayID>& ignore = {});
187 void updateMonitorDataFromOffsets();
189 rdpContext* _context =
nullptr;
190 wLog* _log =
nullptr;
192 std::atomic<bool> _connected =
false;
193 bool _cursor_visible =
true;
194 rdpPointer* _cursor =
nullptr;
195 CursorType _cursorType = CURSOR_NULL;
196 std::vector<SDL_DisplayID> _monitorIds;
197 std::mutex _queue_mux;
198 std::queue<std::vector<SDL_Rect>> _queue;
200 bool _fullscreen =
false;
201 bool _resizeable =
false;
202 bool _grabMouse =
false;
203 bool _grabKeyboard =
false;
205 std::atomic<bool> _rdpThreadRunning =
false;
206 SDL_PixelFormat _sdlPixelFormat = SDL_PIXELFORMAT_UNKNOWN;
210 using SDLSurfacePtr = std::unique_ptr<SDL_Surface,
decltype(&SDL_DestroySurface)>;
212 SDLSurfacePtr _primary;
213 SDL_FPoint _localScale{ 1.0f, 1.0f };
221 std::map<SDL_DisplayID, rdpMonitor> _displays;
222 std::map<SDL_WindowID, SdlWindow> _windows;
223 std::map<SDL_DisplayID, std::pair<SDL_Rect, SDL_Rect>> _offsets;
225 uint32_t _windowWidth = 0;
226 uint32_t _windowHeigth = 0;
object that handles clipboard context for the SDL3 client