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"
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();
136 [[nodiscard]] wLog* getWLog();
138 [[nodiscard]]
bool moveMouseTo(
const SDL_FPoint& pos);
140 [[nodiscard]] SDL_FPoint screenToPixel(SDL_WindowID
id,
const SDL_FPoint& pos);
142 [[nodiscard]] SDL_FPoint pixelToScreen(SDL_WindowID
id,
const SDL_FPoint& pos);
143 [[nodiscard]] SDL_FRect pixelToScreen(SDL_WindowID
id,
const SDL_FRect& pos,
146 [[nodiscard]]
bool handleEvent(
const SDL_Event& ev);
149 [[nodiscard]]
size_t argsCount()
const;
155 [[nodiscard]] std::vector<rdpPointer*>& pointers();
156 [[nodiscard]]
bool contains(
const rdpPointer* ptr)
const;
159 [[nodiscard]]
bool resizeToScale(
SdlWindow* window);
160 [[nodiscard]]
bool useLocalScale()
const;
162 [[nodiscard]]
static BOOL preConnect(freerdp* instance);
163 [[nodiscard]]
static BOOL postConnect(freerdp* instance);
164 static void postDisconnect(freerdp* instance);
165 static void postFinalDisconnect(freerdp* instance);
166 [[nodiscard]]
static BOOL desktopResize(rdpContext* context);
167 [[nodiscard]]
static BOOL playSound(rdpContext* context,
const PLAY_SOUND_UPDATE* play_sound);
168 [[nodiscard]]
static BOOL beginPaint(rdpContext* context);
169 [[nodiscard]]
static BOOL endPaint(rdpContext* context);
170 [[nodiscard]]
static DWORD WINAPI rdpThreadRun(
SdlContext*
sdl);
172 [[nodiscard]]
bool eventToPixelCoordinates(SDL_WindowID
id, SDL_Event& ev);
174 [[nodiscard]] SDL_FPoint applyLocalScaling(
const SDL_FPoint& val)
const;
175 void removeLocalScaling(
float& x,
float& y)
const;
177 [[nodiscard]]
bool handleEvent(
const SDL_WindowEvent& ev);
178 [[nodiscard]]
bool handleEvent(
const SDL_DisplayEvent& ev);
179 [[nodiscard]]
bool handleEvent(
const SDL_MouseButtonEvent& ev);
180 [[nodiscard]]
bool handleEvent(
const SDL_MouseMotionEvent& ev);
181 [[nodiscard]]
bool handleEvent(
const SDL_MouseWheelEvent& ev);
182 [[nodiscard]]
bool handleEvent(
const SDL_TouchFingerEvent& ev);
184 void addOrUpdateDisplay(SDL_DisplayID
id);
185 void deleteDisplay(SDL_DisplayID
id);
187 [[nodiscard]]
bool createPrimary();
188 [[nodiscard]] std::string windowTitle()
const;
189 [[nodiscard]]
bool waitForWindowsCreated();
191 void sdl_client_cleanup(
int exit_code,
const std::string& error_msg);
192 [[nodiscard]]
int sdl_client_thread_connect(std::string& error_msg);
193 [[nodiscard]]
int sdl_client_thread_run(std::string& error_msg);
195 [[nodiscard]]
int error_info_to_error(DWORD* pcode,
char** msg,
size_t* len)
const;
197 void applyMonitorOffset(SDL_WindowID window,
float& x,
float& y)
const;
199 [[nodiscard]] std::vector<SDL_DisplayID>
200 updateDisplayOffsetsForNeighbours(SDL_DisplayID
id,
201 const std::vector<SDL_DisplayID>& ignore = {});
202 void updateMonitorDataFromOffsets();
204 rdpContext* _context =
nullptr;
205 wLog* _log =
nullptr;
207 std::atomic<bool> _connected =
false;
208 bool _cursor_visible =
true;
209 std::unique_ptr<rdpPointer, void (*)(rdpPointer*)> _cursor;
210 CursorType _cursorType = CURSOR_NULL;
211 std::vector<SDL_DisplayID> _monitorIds;
212 std::mutex _queue_mux;
213 std::queue<std::vector<SDL_Rect>> _queue;
215 bool _fullscreen =
false;
216 bool _resizeable =
false;
217 bool _grabMouse =
false;
218 bool _grabKeyboard =
false;
220 std::atomic<bool> _rdpThreadRunning =
false;
221 SDL_PixelFormat _sdlPixelFormat = SDL_PIXELFORMAT_UNKNOWN;
225 using SDLSurfacePtr = std::unique_ptr<SDL_Surface,
decltype(&SDL_DestroySurface)>;
227 SDLSurfacePtr _primary;
228 SDL_FPoint _localScale{ 1.0f, 1.0f };
236 std::map<SDL_DisplayID, rdpMonitor> _displays;
237 std::map<SDL_WindowID, SdlWindow> _windows;
238 std::map<SDL_DisplayID, std::pair<SDL_Rect, SDL_Rect>> _offsets;
240 uint32_t _windowWidth = 0;
241 uint32_t _windowHeigth = 0;
244 std::vector<COMMAND_LINE_ARGUMENT_A> _args;
245 std::vector<rdpPointer*> _valid_pointers;
object that handles clipboard context for the SDL3 client