31#include <freerdp/freerdp.h>
35#include <sdl_common_utils.hpp>
37#include "sdl_window.hpp"
38#include "sdl_disp.hpp"
39#include "sdl_clip.hpp"
40#include "sdl_input.hpp"
41#include "sdl_rail.hpp"
43#include "dialogs/sdl_connection_dialog_wrapper.hpp"
63 [[nodiscard]]
bool redraw(
bool suppress =
false)
const;
65 void setConnected(
bool val);
66 [[nodiscard]]
bool isConnected()
const;
69 [[nodiscard]]
bool resizeable()
const;
70 [[nodiscard]]
bool toggleResizeable();
71 [[nodiscard]]
bool setResizeable(
bool enable);
73 [[nodiscard]]
bool fullscreen()
const;
74 [[nodiscard]]
bool toggleFullscreen();
75 [[nodiscard]]
bool setFullscreen(
bool enter,
bool forceOriginalDisplay =
false);
77 [[nodiscard]]
bool setMinimized();
79 [[nodiscard]]
bool grabMouse()
const;
80 [[nodiscard]]
bool toggleGrabMouse();
81 [[nodiscard]]
bool setGrabMouse(
bool enter);
83 [[nodiscard]]
bool grabKeyboard()
const;
84 [[nodiscard]]
bool toggleGrabKeyboard();
85 [[nodiscard]]
bool setGrabKeyboard(
bool enter);
87 [[nodiscard]] rdpContext* context()
const;
88 [[nodiscard]] rdpClientContext* common()
const;
90 [[nodiscard]]
bool setCursor(CursorType type);
91 [[nodiscard]]
bool setCursor(
const rdpPointer* cursor);
92 [[nodiscard]] rdpPointer* cursor()
const;
93 [[nodiscard]]
bool restoreCursor();
95 void setMonitorIds(
const std::vector<SDL_DisplayID>& ids);
96 [[nodiscard]]
const std::vector<SDL_DisplayID>& monitorIds()
const;
97 [[nodiscard]] int64_t monitorId(uint32_t index)
const;
99 void push(std::vector<SDL_Rect>&& rects);
100 [[nodiscard]] std::vector<SDL_Rect> pop();
102 void setHasCursor(
bool val);
103 [[nodiscard]]
bool hasCursor()
const;
107 [[nodiscard]]
int start();
108 [[nodiscard]]
int join();
109 [[nodiscard]]
bool shallAbort(
bool ignoreDialogs =
false);
111 [[nodiscard]]
bool createWindows();
112 [[nodiscard]]
bool updateWindowList();
113 [[nodiscard]]
bool updateWindow(SDL_WindowID
id);
115 [[nodiscard]]
bool drawToWindows(
const std::vector<SDL_Rect>& rects = {});
116 [[nodiscard]]
bool drawToWindow(
SdlWindow& window,
const std::vector<SDL_Rect>& rects = {});
117 [[nodiscard]]
bool minimizeAllWindows();
118 [[nodiscard]]
int exitCode()
const;
119 [[nodiscard]] SDL_PixelFormat pixelFormat()
const;
121 [[nodiscard]]
const SdlWindow* getWindowForId(SDL_WindowID
id)
const;
122 [[nodiscard]]
SdlWindow* getWindowForId(SDL_WindowID
id);
123 [[nodiscard]]
SdlWindow* getFirstWindow();
125 [[nodiscard]]
bool addDisplayWindow(SDL_DisplayID
id);
126 [[nodiscard]]
bool removeDisplayWindow(SDL_DisplayID
id);
127 [[nodiscard]]
bool detectDisplays();
128 [[nodiscard]]
rdpMonitor getDisplay(SDL_DisplayID
id)
const;
129 [[nodiscard]] std::vector<SDL_DisplayID> getDisplayIds()
const;
132 [[nodiscard]]
sdlInput& getInputChannelContext();
133 [[nodiscard]]
sdlClip& getClipboardChannelContext();
134 [[nodiscard]]
SdlRail& getRailChannelContext();
138 [[nodiscard]] wLog* getWLog();
140 [[nodiscard]]
bool moveMouseTo(
const SDL_FPoint& pos);
142 [[nodiscard]] SDL_FPoint screenToPixel(SDL_WindowID
id,
const SDL_FPoint& pos);
144 [[nodiscard]] SDL_FPoint pixelToScreen(SDL_WindowID
id,
const SDL_FPoint& pos);
145 [[nodiscard]] SDL_FRect pixelToScreen(SDL_WindowID
id,
const SDL_FRect& pos,
148 [[nodiscard]]
bool handleEvent(
const SDL_Event& ev);
151 [[nodiscard]]
size_t argsCount()
const;
157 [[nodiscard]] std::vector<rdpPointer*>& pointers();
158 [[nodiscard]]
bool contains(
const rdpPointer* ptr)
const;
160 [[nodiscard]]
bool credentialsRead()
const;
161 void setCredentialsRead();
164 [[nodiscard]]
bool resizeToScale(
SdlWindow* window);
165 [[nodiscard]]
bool useLocalScale()
const;
167 [[nodiscard]]
static BOOL preConnect(freerdp* instance);
168 [[nodiscard]]
static BOOL postConnect(freerdp* instance);
169 static void postDisconnect(freerdp* instance);
170 static void postFinalDisconnect(freerdp* instance);
171 [[nodiscard]]
static BOOL getAccessToken(freerdp* instance, AccessTokenType tokenType,
172 char** token,
size_t count, ...);
173 [[nodiscard]]
static BOOL desktopResize(rdpContext* context);
174 [[nodiscard]]
static BOOL playSound(rdpContext* context,
const PLAY_SOUND_UPDATE* play_sound);
175 [[nodiscard]]
static BOOL beginPaint(rdpContext* context);
176 [[nodiscard]]
static BOOL endPaint(rdpContext* context);
177 [[nodiscard]]
static DWORD WINAPI rdpThreadRun(
SdlContext*
sdl);
179 [[nodiscard]]
bool eventToPixelCoordinates(SDL_WindowID
id, SDL_Event& ev);
181 [[nodiscard]] SDL_FPoint applyLocalScaling(
const SDL_FPoint& val)
const;
182 void removeLocalScaling(
float& x,
float& y)
const;
184 [[nodiscard]]
bool handleEvent(
const SDL_WindowEvent& ev);
185 [[nodiscard]]
bool handleEvent(
const SDL_DisplayEvent& ev);
186 [[nodiscard]]
bool handleEvent(
const SDL_MouseButtonEvent& ev);
187 [[nodiscard]]
bool handleEvent(
const SDL_MouseMotionEvent& ev);
188 [[nodiscard]]
bool handleEvent(
const SDL_MouseWheelEvent& ev);
189 [[nodiscard]]
bool handleEvent(
const SDL_TouchFingerEvent& ev);
191 void addOrUpdateDisplay(SDL_DisplayID
id);
192 void deleteDisplay(SDL_DisplayID
id);
194 [[nodiscard]]
bool createPrimary();
195 [[nodiscard]] std::string windowTitle()
const;
196 [[nodiscard]]
bool waitForWindowsCreated();
198 void sdl_client_cleanup(
int exit_code,
const std::string& error_msg);
199 [[nodiscard]]
int sdl_client_thread_connect(std::string& error_msg);
200 [[nodiscard]]
int sdl_client_thread_run(std::string& error_msg);
202 [[nodiscard]]
int error_info_to_error(DWORD* pcode,
char** msg,
size_t* len)
const;
204 void applyMonitorOffset(SDL_WindowID window,
float& x,
float& y)
const;
206 [[nodiscard]] std::vector<SDL_DisplayID>
207 updateDisplayOffsetsForNeighbours(SDL_DisplayID
id,
208 const std::vector<SDL_DisplayID>& ignore = {});
209 void updateMonitorDataFromOffsets();
211 rdpContext* _context =
nullptr;
212 wLog* _log =
nullptr;
214 std::atomic<bool> _connected =
false;
215 bool _cursor_visible =
true;
216 std::unique_ptr<rdpPointer, void (*)(rdpPointer*)> _cursor;
217 CursorType _cursorType = CURSOR_NULL;
218 std::vector<SDL_DisplayID> _monitorIds;
219 std::mutex _queue_mux;
220 std::queue<std::vector<SDL_Rect>> _queue;
222 bool _fullscreen =
false;
223 bool _resizeable =
false;
224 bool _grabMouse =
false;
225 bool _grabKeyboard =
false;
227 std::atomic<bool> _rdpThreadRunning =
false;
228 SDL_PixelFormat _sdlPixelFormat = SDL_PIXELFORMAT_UNKNOWN;
232 using SDLSurfacePtr = std::unique_ptr<SDL_Surface,
decltype(&SDL_DestroySurface)>;
234 SDLSurfacePtr _primary;
235 SDL_FPoint _localScale{ 1.0f, 1.0f };
244 std::map<SDL_DisplayID, rdpMonitor> _displays;
245 std::map<SDL_WindowID, SdlWindow> _windows;
246 std::map<SDL_DisplayID, std::pair<SDL_Rect, SDL_Rect>> _offsets;
248 uint32_t _windowWidth = 0;
249 uint32_t _windowHeight = 0;
252 std::vector<COMMAND_LINE_ARGUMENT_A> _args;
253 std::optional<bool> _connectionDialog;
254 std::vector<rdpPointer*> _valid_pointers;
255 bool _credentialsRead =
false;
object that handles clipboard context for the SDL3 client