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"
40#include "sdl_rail.hpp"
42#include "dialogs/sdl_connection_dialog_wrapper.hpp"
62 [[nodiscard]]
bool redraw(
bool suppress =
false)
const;
64 void setConnected(
bool val);
65 [[nodiscard]]
bool isConnected()
const;
68 [[nodiscard]]
bool resizeable()
const;
69 [[nodiscard]]
bool toggleResizeable();
70 [[nodiscard]]
bool setResizeable(
bool enable);
72 [[nodiscard]]
bool fullscreen()
const;
73 [[nodiscard]]
bool toggleFullscreen();
74 [[nodiscard]]
bool setFullscreen(
bool enter,
bool forceOriginalDisplay =
false);
76 [[nodiscard]]
bool setMinimized();
78 [[nodiscard]]
bool grabMouse()
const;
79 [[nodiscard]]
bool toggleGrabMouse();
80 [[nodiscard]]
bool setGrabMouse(
bool enter);
82 [[nodiscard]]
bool grabKeyboard()
const;
83 [[nodiscard]]
bool toggleGrabKeyboard();
84 [[nodiscard]]
bool setGrabKeyboard(
bool enter);
86 [[nodiscard]] rdpContext* context()
const;
87 [[nodiscard]] rdpClientContext* common()
const;
89 [[nodiscard]]
bool setCursor(CursorType type);
90 [[nodiscard]]
bool setCursor(
const rdpPointer* cursor);
91 [[nodiscard]] rdpPointer* cursor()
const;
92 [[nodiscard]]
bool restoreCursor();
94 void setMonitorIds(
const std::vector<SDL_DisplayID>& ids);
95 [[nodiscard]]
const std::vector<SDL_DisplayID>& monitorIds()
const;
96 [[nodiscard]] int64_t monitorId(uint32_t index)
const;
98 void push(std::vector<SDL_Rect>&& rects);
99 [[nodiscard]] std::vector<SDL_Rect> pop();
101 void setHasCursor(
bool val);
102 [[nodiscard]]
bool hasCursor()
const;
106 [[nodiscard]]
int start();
107 [[nodiscard]]
int join();
108 [[nodiscard]]
bool shallAbort(
bool ignoreDialogs =
false);
110 [[nodiscard]]
bool createWindows();
111 [[nodiscard]]
bool updateWindowList();
112 [[nodiscard]]
bool updateWindow(SDL_WindowID
id);
114 [[nodiscard]]
bool drawToWindows(
const std::vector<SDL_Rect>& rects = {});
115 [[nodiscard]]
bool drawToWindow(
SdlWindow& window,
const std::vector<SDL_Rect>& rects = {});
116 [[nodiscard]]
bool minimizeAllWindows();
117 [[nodiscard]]
int exitCode()
const;
118 [[nodiscard]] SDL_PixelFormat pixelFormat()
const;
120 [[nodiscard]]
const SdlWindow* getWindowForId(SDL_WindowID
id)
const;
121 [[nodiscard]]
SdlWindow* getWindowForId(SDL_WindowID
id);
122 [[nodiscard]]
SdlWindow* getFirstWindow();
124 [[nodiscard]]
bool addDisplayWindow(SDL_DisplayID
id);
125 [[nodiscard]]
bool removeDisplayWindow(SDL_DisplayID
id);
126 [[nodiscard]]
bool detectDisplays();
127 [[nodiscard]]
rdpMonitor getDisplay(SDL_DisplayID
id)
const;
128 [[nodiscard]] std::vector<SDL_DisplayID> getDisplayIds()
const;
131 [[nodiscard]]
sdlInput& getInputChannelContext();
132 [[nodiscard]]
sdlClip& getClipboardChannelContext();
133 [[nodiscard]]
SdlRail& getRailChannelContext();
137 [[nodiscard]] wLog* getWLog();
139 [[nodiscard]]
bool moveMouseTo(
const SDL_FPoint& pos);
141 [[nodiscard]] SDL_FPoint screenToPixel(SDL_WindowID
id,
const SDL_FPoint& pos);
143 [[nodiscard]] SDL_FPoint pixelToScreen(SDL_WindowID
id,
const SDL_FPoint& pos);
144 [[nodiscard]] SDL_FRect pixelToScreen(SDL_WindowID
id,
const SDL_FRect& pos,
147 [[nodiscard]]
bool handleEvent(
const SDL_Event& ev);
150 [[nodiscard]]
size_t argsCount()
const;
156 [[nodiscard]] std::vector<rdpPointer*>& pointers();
157 [[nodiscard]]
bool contains(
const rdpPointer* ptr)
const;
159 [[nodiscard]]
bool credentialsRead()
const;
160 void setCredentialsRead();
163 [[nodiscard]]
bool resizeToScale(
SdlWindow* window);
164 [[nodiscard]]
bool useLocalScale()
const;
166 [[nodiscard]]
static BOOL preConnect(freerdp* instance);
167 [[nodiscard]]
static BOOL postConnect(freerdp* instance);
168 static void postDisconnect(freerdp* instance);
169 static void postFinalDisconnect(freerdp* instance);
170 [[nodiscard]]
static BOOL getAccessToken(freerdp* instance, AccessTokenType tokenType,
171 char** token,
size_t count, ...);
172 [[nodiscard]]
static BOOL desktopResize(rdpContext* context);
173 [[nodiscard]]
static BOOL playSound(rdpContext* context,
const PLAY_SOUND_UPDATE* play_sound);
174 [[nodiscard]]
static BOOL beginPaint(rdpContext* context);
175 [[nodiscard]]
static BOOL endPaint(rdpContext* context);
176 [[nodiscard]]
static DWORD WINAPI rdpThreadRun(
SdlContext*
sdl);
178 [[nodiscard]]
bool eventToPixelCoordinates(SDL_WindowID
id, SDL_Event& ev);
180 [[nodiscard]] SDL_FPoint applyLocalScaling(
const SDL_FPoint& val)
const;
181 void removeLocalScaling(
float& x,
float& y)
const;
183 [[nodiscard]]
bool handleEvent(
const SDL_WindowEvent& ev);
184 [[nodiscard]]
bool handleEvent(
const SDL_DisplayEvent& ev);
185 [[nodiscard]]
bool handleEvent(
const SDL_MouseButtonEvent& ev);
186 [[nodiscard]]
bool handleEvent(
const SDL_MouseMotionEvent& ev);
187 [[nodiscard]]
bool handleEvent(
const SDL_MouseWheelEvent& ev);
188 [[nodiscard]]
bool handleEvent(
const SDL_TouchFingerEvent& ev);
190 void addOrUpdateDisplay(SDL_DisplayID
id);
191 void deleteDisplay(SDL_DisplayID
id);
193 [[nodiscard]]
bool createPrimary();
194 [[nodiscard]] std::string windowTitle()
const;
195 [[nodiscard]]
bool waitForWindowsCreated();
197 void sdl_client_cleanup(
int exit_code,
const std::string& error_msg);
198 [[nodiscard]]
int sdl_client_thread_connect(std::string& error_msg);
199 [[nodiscard]]
int sdl_client_thread_run(std::string& error_msg);
201 [[nodiscard]]
int error_info_to_error(DWORD* pcode,
char** msg,
size_t* len)
const;
203 void applyMonitorOffset(SDL_WindowID window,
float& x,
float& y)
const;
205 [[nodiscard]] std::vector<SDL_DisplayID>
206 updateDisplayOffsetsForNeighbours(SDL_DisplayID
id,
207 const std::vector<SDL_DisplayID>& ignore = {});
208 void updateMonitorDataFromOffsets();
210 rdpContext* _context =
nullptr;
211 wLog* _log =
nullptr;
213 std::atomic<bool> _connected =
false;
214 bool _cursor_visible =
true;
215 std::unique_ptr<rdpPointer, void (*)(rdpPointer*)> _cursor;
216 CursorType _cursorType = CURSOR_NULL;
217 std::vector<SDL_DisplayID> _monitorIds;
218 std::mutex _queue_mux;
219 std::queue<std::vector<SDL_Rect>> _queue;
221 bool _fullscreen =
false;
222 bool _resizeable =
false;
223 bool _grabMouse =
false;
224 bool _grabKeyboard =
false;
226 std::atomic<bool> _rdpThreadRunning =
false;
227 SDL_PixelFormat _sdlPixelFormat = SDL_PIXELFORMAT_UNKNOWN;
231 using SDLSurfacePtr = std::unique_ptr<SDL_Surface,
decltype(&SDL_DestroySurface)>;
233 SDLSurfacePtr _primary;
234 SDL_FPoint _localScale{ 1.0f, 1.0f };
243 std::map<SDL_DisplayID, rdpMonitor> _displays;
244 std::map<SDL_WindowID, SdlWindow> _windows;
245 std::map<SDL_DisplayID, std::pair<SDL_Rect, SDL_Rect>> _offsets;
247 uint32_t _windowWidth = 0;
248 uint32_t _windowHeight = 0;
251 std::vector<COMMAND_LINE_ARGUMENT_A> _args;
252 std::vector<rdpPointer*> _valid_pointers;
253 bool _credentialsRead =
false;
object that handles clipboard context for the SDL3 client